You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

script.js 33 kB

7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037
  1. var ms = null;
  2. var language = null;
  3. //队员基本的留空
  4. var Member = function(){
  5. this.id=0;
  6. }
  7. Member.prototype.outObj = function(){
  8. var m = this;
  9. var obj = [
  10. m.id
  11. ];
  12. if (m.level != undefined) obj.push(m.level);
  13. if (m.awoken != undefined) obj.push(m.awoken);
  14. if (m.plus != undefined) obj.push(m.plus);
  15. if (m.latent != undefined) obj.push(m.latent);
  16. if (m.sawoken != undefined) obj.push(m.sawoken);
  17. return obj;
  18. }
  19. Member.prototype.loadObj = function(m,dataVersion){
  20. if (m == undefined) //如果没有提供数据,直接返回默认
  21. {
  22. return;
  23. }
  24. if (dataVersion == undefined) dataVersion = 1;
  25. this.id = dataVersion>1 ? m[0] : m.id;
  26. this.level = dataVersion>1 ? m[1] : m.level;
  27. this.awoken = dataVersion>1 ? m[2] : m.awoken;
  28. this.plus = dataVersion>1 ? m[3] : m.plus;
  29. if (!(this.plus instanceof Array)) this.plus = [0,0,0]; //如果潜觉不是数组,则改变
  30. this.latent = dataVersion>1 ? m[4] : m.latent;
  31. if (!(this.latent instanceof Array)) this.latent = []; //如果潜觉不是数组,则改变
  32. this.sawoken = dataVersion>1 ? m[5] : m.sawoken;
  33. }
  34. //只用来防坐的任何队员
  35. var MemberDelay = function(){
  36. this.id=-1;
  37. }
  38. MemberDelay.prototype = Object.create(Member.prototype);
  39. MemberDelay.prototype.constructor = MemberDelay;
  40. //辅助队员
  41. var MemberAssist = function(){
  42. this.level = 0;
  43. this.awoken = 0;
  44. this.plus = [0,0,0];
  45. Member.call(this);
  46. }
  47. MemberAssist.prototype = Object.create(Member.prototype);
  48. MemberAssist.prototype.constructor = MemberAssist
  49. //正式队伍
  50. var MemberTeam = function(){
  51. this.latent = [];
  52. MemberAssist.call(this);
  53. //sawoken作为可选项目,默认不在内
  54. }
  55. MemberTeam.prototype = Object.create(MemberAssist.prototype);
  56. MemberTeam.prototype.constructor = MemberTeam;
  57. var Formation = function(teamCount,memberCount){
  58. this.title = "",
  59. this.detail = "",
  60. this.team = [];
  61. this.badge = 0;
  62. for (var ti=0;ti<teamCount;ti++)
  63. {
  64. var team = [[],[]];
  65. for (var mi=0;mi<memberCount;mi++)
  66. {
  67. team[0].push(new Member());
  68. team[1].push(new Member());
  69. }
  70. this.team.push(team);
  71. }
  72. }
  73. Formation.prototype.outObj= function(){
  74. var obj = {
  75. t:this.title,
  76. d:this.detail,
  77. f:this.team.map(function(t){
  78. return t.map(function(st){
  79. return st.map(function(m){
  80. return m.outObj();
  81. })
  82. })
  83. })
  84. }
  85. if (this.badge>0) obj.b = this.badge; //徽章
  86. return obj;
  87. }
  88. Formation.prototype.loadObj= function(f){
  89. var dataVeision = f.f?2:1; //是第几版格式
  90. this.title = dataVeision>1 ? f.t : f.title;
  91. this.detail = dataVeision>1 ? f.d : f.detail;
  92. this.badge = f.b ? f.b : 0; //徽章
  93. var teamArr = dataVeision>1 ? f.f : f.team;
  94. this.team.forEach(function(t,ti){
  95. var tf = teamArr[ti] || [];
  96. t.forEach(function(st,sti){
  97. var fst = tf[sti] || [];
  98. st.forEach(function(m,mi){
  99. var fm = fst[mi];
  100. m.loadObj(fm,dataVeision);
  101. })
  102. })
  103. });
  104. }
  105. window.onload = function()
  106. {
  107. //添加语言列表
  108. var controlBox = document.body.querySelector(".control-box");
  109. var langList = controlBox.querySelector(".languages");
  110. languageList.forEach(function(l){
  111. var langOpt = new Option(l.name,l.i18n);
  112. langList.options.add(langOpt);
  113. })
  114. var language_i18n = getQueryString("l") || getQueryString("lang"); //获取参数指定的语言
  115. var browser_i18n = (navigator.language||navigator.userLanguage); //获取浏览器语言
  116. var hasLanguage = languageList.filter(function(l){
  117. if (language_i18n) //如果已指定就用指定的语言
  118. return language_i18n.indexOf(l.i18n)>=0;
  119. else
  120. return browser_i18n.indexOf(l.i18n)>=0;
  121. });
  122. language = hasLanguage.length?hasLanguage[hasLanguage.length-1]:languageList[0];
  123. document.head.querySelector("#language-css").href = "languages/"+language.i18n+".css";
  124. Array.prototype.slice.call(langList.options).some(function(lOpt){
  125. if (lOpt.value == language.i18n)
  126. {
  127. lOpt.selected = true;
  128. return true;
  129. }
  130. });
  131. GM_xmlhttpRequest({
  132. method: "GET",
  133. url:"monsters-info/mon.json",
  134. onload: function(response) {
  135. ms = JSON.parse(response.response);
  136. initialize();//初始化
  137. var idata;
  138. try
  139. {
  140. var idataQer = getQueryString("d") || getQueryString("data");
  141. if (idataQer)
  142. {
  143. idata = JSON.parse(idataQer);
  144. }
  145. }catch(e)
  146. {
  147. console.log("初始数据JSON解码出错",e);
  148. return;
  149. }
  150. if (idata)
  151. {
  152. //formation = idata;
  153. formation.loadObj(idata);
  154. refreshAll(formation);
  155. }
  156. },
  157. onerror: function(response) {
  158. console.error("怪物数据获取错误",response);
  159. var idata;
  160. try
  161. {
  162. ms = JSON.parse(response.response);
  163. initialize();//初始化
  164. var idataQer = getQueryString("d") || getQueryString("data");
  165. if (idataQer)
  166. {
  167. idata = JSON.parse(idataQer);
  168. }
  169. }catch(e)
  170. {
  171. console.log("网络请求返回错误,尝试解码仍错误。",e);
  172. return;
  173. }
  174. if (idata)
  175. {
  176. //formation = idata;
  177. formation.loadObj(idata);
  178. refreshAll(formation);
  179. }
  180. }
  181. });
  182. }
  183. window.onpopstate = function()
  184. { //前进后退时修改页面
  185. var idata;
  186. try
  187. {
  188. var idataQer = getQueryString("d") || getQueryString("data");
  189. if (idataQer)
  190. {
  191. idata = JSON.parse(idataQer);
  192. }
  193. }catch(e)
  194. {
  195. console.log("初始数据JSON解码出错",e);
  196. return;
  197. }
  198. if (idata)
  199. {
  200. //formation = idata;
  201. formation.loadObj(idata);
  202. refreshAll(formation);
  203. }
  204. }
  205. //创建新的分享地址
  206. function creatNewUrl(lang){
  207. if (!!(window.history && history.pushState)) {
  208. // 支持History API
  209. var language_i18n = lang || getQueryString("l") || getQueryString("lang"); //获取参数指定的语言
  210. var outObj = formation.outObj();
  211. history.pushState(null, null, '?'
  212. + (language_i18n?'l=' + language_i18n + '&':'')
  213. + 'd=' + encodeURIComponent(JSON.stringify(outObj)));
  214. }
  215. }
  216. //初始化
  217. function initialize()
  218. {
  219. var monstersList = document.querySelector("#monsters-list");
  220. ms.forEach(function(m){
  221. var opt = monstersList.appendChild(document.createElement("option"));
  222. opt.value = m.id;
  223. opt.label = m.id + " - " + returnMonsterNameArr(m,language.searchlist).join(" | ");
  224. });
  225. //控制框
  226. var controlBox = document.querySelector(".control-box");
  227. //标题和介绍文本框
  228. var txtTitle = document.querySelector(".title-box .title");
  229. var txtDetail = document.querySelector(".detail-box .detail");
  230. txtTitle.onchange = function(){
  231. formation.title = this.value;
  232. creatNewUrl();
  233. }
  234. txtDetail.onchange = function(){
  235. formation.detail = this.value;
  236. creatNewUrl();
  237. }
  238. txtDetail.onblur = function(){
  239. this.style.height=this.scrollHeight+"px";
  240. }
  241. //队伍框
  242. var formationBox = document.querySelector(".formation-box");
  243. formationBox.formation = formation;
  244. //徽章
  245. var badges = Array.prototype.slice.call(formationBox.querySelectorAll(".formation-badge .badge-bg"));
  246. badges.forEach(function(badge,bidx){
  247. badge.onclick = function(){
  248. if (badges.some(function(b){return b.classList.contains("display-none");}))
  249. { //未展开时
  250. badges.forEach(function(b,idx){if (idx!=bidx)b.classList.remove("display-none");})
  251. }else
  252. { //展开时
  253. badges.forEach(function(b,idx){if (idx!=bidx)b.classList.add("display-none");})
  254. formation.badge = bidx;
  255. creatNewUrl();
  256. }
  257. }
  258. })
  259. //编辑框
  260. var editBox = document.querySelector(".edit-box");
  261. editBox.mid = 0; //储存怪物id
  262. editBox.awokenCount = 0; //储存怪物潜觉数量
  263. editBox.latent = []; //储存潜在觉醒
  264. editBox.assist = false; //储存是否为辅助宠物
  265. editBox.monsterBox = null;
  266. editBox.latentBox = null;
  267. editBox.memberIdx = []; //储存队伍数组下标
  268. editBox.show = function(){
  269. editBox.classList.remove("display-none");
  270. formationBox.classList.add("blur-bg");
  271. controlBox.classList.add("blur-bg");
  272. }
  273. editBox.hide = function(){
  274. editBox.classList.add("display-none");
  275. formationBox.classList.remove("blur-bg");
  276. controlBox.classList.remove("blur-bg");
  277. }
  278. var settingBox = editBox.querySelector(".setting-box")
  279. //id搜索
  280. var monstersID = editBox.querySelector(".edit-box .m-id");
  281. monstersID.onchange = function(){
  282. if (/^\d+$/.test(this.value))
  283. {
  284. editBox.mid = parseInt(this.value);
  285. editBoxChangeMonId(editBox.mid);
  286. }
  287. }
  288. monstersID.oninput = monstersID.onchange;
  289. //觉醒
  290. var monEditAwokens = Array.prototype.slice.call(settingBox.querySelectorAll(".row-mon-awoken .awoken-ul .awoken-icon"));
  291. monEditAwokens.forEach(function(akDom,idx,domArr){
  292. akDom.onclick = function(){
  293. editBox.awokenCount = idx;
  294. editBox.reCalculateAbility();
  295. editBox.refreshAwokens();
  296. };
  297. });
  298. //刷新觉醒
  299. editBox.refreshAwokens = function(){
  300. monEditAwokens[0].innerHTML = editBox.awokenCount;
  301. if (editBox.awokenCount>0 && editBox.awokenCount==(ms[editBox.mid].awoken.length))
  302. monEditAwokens[0].classList.add("full-awoken");
  303. else
  304. monEditAwokens[0].classList.remove("full-awoken");
  305. for(var ai=1;ai<monEditAwokens.length;ai++)
  306. {
  307. if(ai<=editBox.awokenCount)
  308. {
  309. monEditAwokens[ai].classList.remove("unselected-awoken");
  310. }
  311. else
  312. {
  313. monEditAwokens[ai].classList.add("unselected-awoken");
  314. }
  315. }
  316. }
  317. //超觉醒
  318. var monEditSAwokens = Array.prototype.slice.call(settingBox.querySelectorAll(".row-mon-super-awoken .awoken-ul .awoken-icon"));
  319. monEditSAwokens.forEach(function(akDom,idx,domArr){
  320. akDom.onclick = function(){
  321. for(var ai=0;ai<domArr.length;ai++)
  322. {
  323. if(ai==idx)
  324. {
  325. domArr[ai].classList.toggle("unselected-awoken");
  326. }
  327. else
  328. {
  329. domArr[ai].classList.add("unselected-awoken");
  330. }
  331. }
  332. }
  333. })
  334. //等级
  335. var monEditLv = settingBox.querySelector(".m-level");
  336. monEditLv.onchange = function(){editBox.reCalculateAbility();};
  337. var monEditLvMax = settingBox.querySelector(".m-level-btn-max");
  338. monEditLvMax.onclick = function(){
  339. var ipt = monEditLv;
  340. if (ipt.value != this.value)
  341. {
  342. ipt.value = this.value;
  343. ipt.onchange();
  344. }
  345. };
  346. //加蛋
  347. var monEditAddHpLi = settingBox.querySelector(".row-mon-plus .m-plus-hp-li");
  348. var monEditAddAtkLi = settingBox.querySelector(".row-mon-plus .m-plus-atk-li");
  349. var monEditAddRcvLi = settingBox.querySelector(".row-mon-plus .m-plus-rcv-li");
  350. var monEditAddHp = monEditAddHpLi.querySelector(".m-plus-hp");
  351. monEditAddHp.onchange = function(){editBox.reCalculateAbility();};
  352. var monEditAddAtk = monEditAddAtkLi.querySelector(".m-plus-atk");
  353. monEditAddAtk.onchange = function(){editBox.reCalculateAbility();};
  354. var monEditAddRcv = monEditAddRcvLi.querySelector(".m-plus-rcv");
  355. monEditAddRcv.onchange = function(){editBox.reCalculateAbility();};
  356. //3个快速设置按钮
  357. var monEditAddHpBtn = monEditAddHpLi.querySelector(".m-plus-btn");
  358. monEditAddHpBtn.onclick = function(){
  359. var ipt = monEditAddHp;
  360. if (ipt.value != this.value)
  361. {
  362. ipt.value = this.value;
  363. ipt.onchange();
  364. }
  365. };
  366. var monEditAddAtkBtn = monEditAddAtkLi.querySelector(".m-plus-btn");
  367. monEditAddAtkBtn.onclick = function(){
  368. var ipt = monEditAddAtk;
  369. if (ipt.value != this.value)
  370. {
  371. ipt.value = this.value;
  372. ipt.onchange();
  373. }
  374. };
  375. var monEditAddRcvBtn = monEditAddRcvLi.querySelector(".m-plus-btn");
  376. monEditAddRcvBtn.onclick = function(){
  377. var ipt = monEditAddRcv;
  378. if (ipt.value != this.value)
  379. {
  380. ipt.value = this.value;
  381. ipt.onchange();
  382. }
  383. };
  384. //297按钮
  385. var monEditAdd297 = settingBox.querySelector(".row-mon-plus .m-plus-btn-297");
  386. monEditAdd297.onclick = function(){monEditAddHp.value = monEditAddAtk.value = monEditAddRcv.value = 99;editBox.reCalculateAbility();}
  387. //三维的计算值
  388. var monEditHpValue = monEditAddHpLi.querySelector(".ability-value");
  389. var monEditAtkValue = monEditAddAtkLi.querySelector(".ability-value");
  390. var monEditRcvValue = monEditAddRcvLi.querySelector(".ability-value");
  391. //潜觉
  392. var monEditLatentUl = settingBox.querySelector(".m-latent-ul");
  393. var monEditLatents = Array.prototype.slice.call(monEditLatentUl.querySelectorAll("li"));
  394. var monEditLatentAllowableUl = settingBox.querySelector(".m-latent-allowable-ul");
  395. var monEditLatentsAllowable = Array.prototype.slice.call(monEditLatentAllowableUl.querySelectorAll("li"));
  396. editBox.refreshLatent = function(latent) //刷新潜觉
  397. {
  398. if (this.value<0) return;
  399. var usedHoleN = usedHole(latent);
  400. for (var ai=0;ai<6;ai++)
  401. {
  402. if (latent[ai])
  403. {
  404. monEditLatents[ai].className = "latent-icon latent-icon-" + latent[ai];
  405. monEditLatents[ai].value = ai;
  406. }
  407. else if(ai<(6-usedHoleN+latent.length))
  408. {
  409. monEditLatents[ai].className = "latent-icon";
  410. monEditLatents[ai].value = -1;
  411. }
  412. else
  413. {
  414. monEditLatents[ai].className = "display-none";
  415. monEditLatents[ai].value = -1;
  416. }
  417. }
  418. }
  419. //已有觉醒的去除
  420. monEditLatents.forEach(function(l){
  421. l.onclick = function(){
  422. var aIdx = parseInt(this.value);
  423. editBox.latent.splice(aIdx,1);
  424. editBox.reCalculateAbility();
  425. editBox.refreshLatent(editBox.latent);
  426. }
  427. })
  428. //可选觉醒的添加
  429. monEditLatentsAllowable.forEach(function(la){
  430. la.onclick = function(){
  431. if (this.classList.contains("unselected-latent")) return;
  432. var lIdx = parseInt(this.value);
  433. var usedHoleN = usedHole(editBox.latent);
  434. if (lIdx >= 12 && usedHoleN<=4)
  435. editBox.latent.push(lIdx);
  436. else if (lIdx < 12 && usedHoleN<=5)
  437. editBox.latent.push(lIdx);
  438. editBox.reCalculateAbility();
  439. editBox.refreshLatent(editBox.latent);
  440. }
  441. })
  442. //重新计算怪物的能力
  443. editBox.reCalculateAbility = function(){
  444. var monid = parseInt(monstersID.value || 0);
  445. var level = parseInt(monEditLv.value || 0);
  446. var awoken = editBox.awokenCount;
  447. var plus = [
  448. parseInt(monEditAddHp.value || 0),
  449. parseInt(monEditAddAtk.value || 0),
  450. parseInt(monEditAddRcv.value || 0)
  451. ];
  452. var latent = editBox.latent;
  453. var abilitys = calculateAbility(monid,level,plus,awoken,latent);
  454. [monEditHpValue,monEditAtkValue,monEditRcvValue].forEach(function(div,idx){
  455. if (abilitys)
  456. div.innerHTML = abilitys[idx];
  457. else
  458. div.innerHTML = 0;
  459. })
  460. }
  461. var btnCancel = editBox.querySelector(".button-cancel");
  462. var btnDone = editBox.querySelector(".button-done");
  463. var btnNull = editBox.querySelector(".button-null");
  464. var btnDelay = editBox.querySelector(".button-delay");
  465. btnCancel.onclick = function(){
  466. btnDone.classList.remove("cant-assist");
  467. btnDone.disabled = false;
  468. editBox.memberIdx = [];
  469. editBox.hide();
  470. }
  471. btnDone.onclick = function(){
  472. if (parseInt(monEditLv.value) == 0)
  473. {
  474. btnNull.onclick();
  475. return;
  476. }
  477. var mD = formation.team[editBox.memberIdx[0]][editBox.memberIdx[1]][editBox.memberIdx[2]] = editBox.assist?new MemberAssist():new MemberTeam();
  478. mD.id = parseInt(monstersID.value);
  479. mD.level = parseInt(monEditLv.value);
  480. mD.awoken = editBox.awokenCount;
  481. if (ms[mD.id].sAwoken) //如果支持超觉醒
  482. {
  483. mD.sawoken = -1;
  484. for (var sai = 0;sai<monEditSAwokens.length;sai++)
  485. {
  486. if (
  487. !monEditSAwokens[sai].classList.contains("unselected-awoken") &&
  488. !monEditSAwokens[sai].classList.contains("display-none")
  489. )
  490. {
  491. mD.sawoken = sai;
  492. break;
  493. }
  494. }
  495. }
  496. if (ms[mD.id].type.some(function(t){return t == 0 || t == 12 || t == 14 || t == 15;}) && [303,305,307,600,602].indexOf(mD.id)<0)
  497. { //当4种特殊type的时候是无法297和打觉醒的,但是5种小企鹅可以
  498. mD.plus = [0,0,0];
  499. }else
  500. {
  501. mD.plus[0] = parseInt(monEditAddHp.value) || 0;
  502. mD.plus[1] = parseInt(monEditAddAtk.value) || 0;
  503. mD.plus[2] = parseInt(monEditAddRcv.value) || 0;
  504. if (!editBox.assist)
  505. { //如果不是辅助,则可以设定潜觉
  506. mD.latent = editBox.latent.concat();
  507. }
  508. }
  509. changeid(mD,editBox.monsterBox,editBox.latentBox);
  510. var formationAbilityDom = document.querySelector(".formation-box .formation-ability");
  511. if (formationAbilityDom)
  512. {
  513. refreshAbility(
  514. formationAbilityDom,
  515. formation.team[editBox.memberIdx[0]],
  516. editBox.memberIdx[2]);
  517. }
  518. refreshAwokenCount(formation.team);
  519. creatNewUrl();
  520. editBox.hide();
  521. }
  522. window.onkeydown = function(e){
  523. if (!editBox.classList.contains("display-none"))
  524. {
  525. if (e.keyCode == 27)
  526. { //按下ESC时,自动关闭编辑窗
  527. btnCancel.onclick();
  528. }
  529. }
  530. }
  531. btnNull.onclick = function(){
  532. var mD = formation.team[editBox.memberIdx[0]][editBox.memberIdx[1]][editBox.memberIdx[2]] = new Member();
  533. changeid(mD,editBox.monsterBox,editBox.latentBox);
  534. var formationAbilityDom = document.querySelector(".formation-box .formation-ability");
  535. if (formationAbilityDom)
  536. {
  537. refreshAbility(
  538. formationAbilityDom,
  539. formation.team[editBox.memberIdx[0]],
  540. editBox.memberIdx[2]);
  541. }
  542. refreshAwokenCount(formation.team);
  543. creatNewUrl();
  544. editBox.hide();
  545. }
  546. btnDelay.onclick = function(){ //应对威吓
  547. var mD = formation.team[editBox.memberIdx[0]][editBox.memberIdx[1]][editBox.memberIdx[2]] = new MemberDelay();
  548. changeid(mD,editBox.monsterBox,editBox.latentBox);
  549. var formationAbilityDom = document.querySelector(".formation-box .formation-ability");
  550. if (formationAbilityDom)
  551. {
  552. refreshAbility(
  553. formationAbilityDom,
  554. formation.team[editBox.memberIdx[0]],
  555. editBox.memberIdx[2]);
  556. }
  557. refreshAwokenCount(formation.team);
  558. creatNewUrl();
  559. editBox.hide();
  560. }
  561. var controlBox = document.body.querySelector(".control-box");
  562. var langList = controlBox.querySelector(".languages");
  563. langList.onchange = function(){
  564. creatNewUrl(this.value);
  565. history.go();
  566. }
  567. /*添对应语言执行的JS*/
  568. var languageJS = document.head.appendChild(document.createElement("script"));
  569. languageJS.id = "language-js";
  570. languageJS.type = "text/javascript";
  571. languageJS.src = "languages/"+language.i18n+".js";
  572. }
  573. //改变一个怪物头像
  574. function changeid(mon,monDom,latentDom)
  575. {
  576. var md = ms[mon.id]; //怪物固定数据
  577. if (mon.id<0) //如果是延迟
  578. {
  579. monDom.parentNode.classList.add("delay");
  580. monDom.parentNode.classList.remove("null");
  581. return;
  582. }else if (mon.id==0) //如果是空
  583. {
  584. monDom.parentNode.classList.add("null");
  585. monDom.parentNode.classList.remove("delay");
  586. return;
  587. }else (mon.id>-1) //如果提供了id
  588. {
  589. monDom.parentNode.classList.remove("null");
  590. monDom.parentNode.classList.remove("delay");
  591. monDom.className = "monster";
  592. monDom.classList.add("pet-cards-" + Math.ceil(mon.id/100)); //添加图片编号
  593. if (md.name["ja"] == undefined || /^\?+/.test(md.name["ja"])) //如果没日文或日文是问号,就改为英文的图片
  594. monDom.classList.add("en-only");
  595. else
  596. monDom.classList.remove("en-only");
  597. var idxInPage = (mon.id-1) % 100; //获取当前页面的总序号
  598. monDom.classList.add("pet-cards-index-x-" + idxInPage % 10); //添加X方向序号
  599. monDom.classList.add("pet-cards-index-y-" + parseInt(idxInPage / 10)); //添加Y方向序号
  600. monDom.querySelector(".property").className = "property property-" + md.ppt[0]; //主属性
  601. monDom.querySelector(".subproperty").className = "subproperty subproperty-" + md.ppt[1]; //副属性
  602. monDom.title = "No." + mon.id + " " + md.name[language.searchlist[0]] || md.name["ja"];
  603. monDom.href = mon.id.toString().replace(/^(\d+)$/ig,language.guideURL);
  604. }
  605. var level = mon.level || 1;
  606. var levelDom = monDom.querySelector(".level");
  607. if (levelDom) //如果提供了等级
  608. {
  609. levelDom.innerHTML = level;
  610. if (level == md.maxLv)
  611. { //如果等级刚好等于最大等级,则修改为“最大”的字
  612. levelDom.classList.add("max");
  613. }else
  614. {
  615. levelDom.classList.remove("max");
  616. }
  617. if (md.a110 && level >= md.maxLv)
  618. { //如果支持超觉,并且等级超过99,就添加支持超觉的蓝色
  619. levelDom.classList.add("_110");
  620. }else
  621. {
  622. levelDom.classList.remove("_110");
  623. }
  624. }
  625. if (mon.awoken>-1) //如果提供了觉醒
  626. {
  627. var awokenIcon = monDom.querySelector(".awoken-count");
  628. if (mon.awoken == 0 || md.awoken.length < 1) //没觉醒
  629. {
  630. awokenIcon.classList.add("display-none");
  631. awokenIcon.innerHTML = "";
  632. }else
  633. {
  634. awokenIcon.classList.remove("display-none");
  635. awokenIcon.innerHTML = mon.awoken;
  636. if (mon.awoken == md.awoken.length)
  637. {
  638. awokenIcon.classList.add("full-awoken");
  639. if (md.assist)
  640. {//可以辅助的满觉醒打黄色星星
  641. awokenIcon.classList.add("allowable-assist");
  642. }else
  643. {
  644. awokenIcon.classList.remove("allowable-assist");
  645. }
  646. }else
  647. {
  648. awokenIcon.classList.remove("full-awoken");
  649. awokenIcon.classList.remove("allowable-assist");
  650. }
  651. }
  652. }
  653. var sawoken = monDom.querySelector(".super-awoken");
  654. if (sawoken) //如果存在超觉醒的DOM且提供了超觉醒
  655. {
  656. if (mon.sawoken != undefined && mon.sawoken>=0)
  657. {
  658. var awokenIcon = sawoken.querySelector(".awoken-icon");
  659. sawoken.classList.remove("display-none");
  660. awokenIcon.className = "awoken-icon awoken-" + md.sAwoken[mon.sawoken];
  661. }else
  662. {
  663. sawoken.classList.add("display-none");
  664. }
  665. }
  666. var m_id = monDom.querySelector(".id");
  667. if (m_id) //怪物ID
  668. {
  669. m_id.innerHTML = mon.id;
  670. }
  671. var plusArr = mon.plus || [0,0,0];
  672. var plusDom = monDom.querySelector(".plus");
  673. if (plusArr && plusDom) //如果提供了加值,且怪物头像内有加值
  674. {
  675. plusDom.querySelector(".hp").innerHTML = plusArr[0];
  676. plusDom.querySelector(".atk").innerHTML = plusArr[1];
  677. plusDom.querySelector(".rcv").innerHTML = plusArr[2];
  678. var plusCount = plusArr[0]+plusArr[1]+plusArr[2];
  679. if (plusCount >= 297)
  680. {
  681. plusDom.classList.add("has297");
  682. plusDom.classList.remove("zero");
  683. }else if (plusCount <= 0)
  684. {
  685. plusDom.classList.add("zero");
  686. plusDom.classList.remove("has297");
  687. }else
  688. {
  689. plusDom.classList.remove("zero");
  690. plusDom.classList.remove("has297");
  691. }
  692. }
  693. if (latentDom && mon.latent) //如果提供了潜觉
  694. {
  695. var latent = mon.latent.sort(function(a,b){return b-a;});
  696. if (latent.length < 1)
  697. latentDom.classList.add("display-none");
  698. else
  699. latentDom.classList.remove("display-none");
  700. var latentDoms = Array.prototype.slice.call(latentDom.querySelectorAll("li"));
  701. var usedHoleN = usedHole(latent);
  702. for (var ai=0;ai<6;ai++)
  703. {
  704. if (latent[ai])
  705. {
  706. latentDoms[ai].className = "latent-icon latent-icon-" + latent[ai];
  707. }
  708. else if(ai<(6-usedHoleN+latent.length))
  709. {
  710. latentDoms[ai].className = "latent-icon";
  711. }
  712. else
  713. {
  714. latentDoms[ai].className = "display-none";
  715. }
  716. }
  717. }
  718. }
  719. //点击怪物头像,出现编辑窗
  720. function editMon(AorB,isAssist,tempIdx)
  721. {
  722. //数据
  723. var mD = formation.team[AorB][isAssist][tempIdx];
  724. //对应的Dom
  725. var formationBox = AorB?document.querySelector(".formation-box .formation-B-box"):document.querySelector(".formation-box .formation-A-box");
  726. var teamBox = isAssist?formationBox.querySelector(".formation-assist"):formationBox.querySelector(".formation-team");
  727. var memberBox = teamBox.querySelector(".member-" + (tempIdx+1));
  728. var editBox = document.querySelector(".edit-box");
  729. var monsterBox = memberBox.querySelector(".monster");
  730. editBox.show();
  731. editBox.assist = isAssist;
  732. editBox.monsterBox = monsterBox;
  733. editBox.memberIdx = [AorB,isAssist,tempIdx]; //储存队伍数组下标
  734. editBox.assist = isAssist;
  735. if (!isAssist)
  736. {
  737. var latentBox = formationBox.querySelector(".formation-latents .latents-"+(tempIdx+1)+" .latent-ul");
  738. editBox.latentBox = latentBox;
  739. }
  740. var monstersID = editBox.querySelector(".search-box .m-id");
  741. monstersID.value = mD.id>0?mD.id:0;
  742. monstersID.onchange();
  743. var settingBox = editBox.querySelector(".setting-box");
  744. //觉醒
  745. var monEditAwokens = settingBox.querySelectorAll(".row-mon-awoken .awoken-ul .awoken-icon");
  746. if (mD.awoken>0) monEditAwokens[mD.awoken].onclick();
  747. //超觉醒
  748. var monEditSAwokens = settingBox.querySelectorAll(".row-mon-super-awoken .awoken-ul .awoken-icon");
  749. if (mD.sawoken>=0) monEditSAwokens[mD.sawoken].onclick();
  750. var monEditLv = settingBox.querySelector(".m-level");
  751. monEditLv.value = mD.level || 1;
  752. var monEditAddHp = settingBox.querySelector(".m-plus-hp");
  753. var monEditAddAtk = settingBox.querySelector(".m-plus-atk");
  754. var monEditAddRcv = settingBox.querySelector(".m-plus-rcv");
  755. if (mD.plus)
  756. {
  757. monEditAddHp.value = mD.plus[0];
  758. monEditAddAtk.value = mD.plus[1];
  759. monEditAddRcv.value = mD.plus[2];
  760. }
  761. var btnDelay = editBox.querySelector(".button-delay");
  762. if (!isAssist)
  763. {
  764. editBox.latent = mD.latent?mD.latent.concat():[];
  765. editBox.refreshLatent(editBox.latent);
  766. btnDelay.classList.add("display-none");
  767. settingBox.querySelector(".row-mon-latent").classList.remove("display-none");
  768. if (ms[mD.id].sAwoken)settingBox.querySelector(".row-mon-super-awoken").classList.remove("display-none");
  769. editBox.querySelector(".edit-box-title").classList.remove("edit-box-title-assist");
  770. }else
  771. {
  772. btnDelay.classList.remove("display-none");
  773. settingBox.querySelector(".row-mon-latent").classList.add("display-none");
  774. settingBox.querySelector(".row-mon-super-awoken").classList.add("display-none");
  775. editBox.querySelector(".edit-box-title").classList.add("edit-box-title-assist");
  776. }
  777. editBox.reCalculateAbility();
  778. }
  779. //编辑窗,修改怪物ID
  780. function editBoxChangeMonId(id)
  781. {
  782. var md = ms[id]; //怪物固定数据
  783. if (!md){
  784. id = 0;
  785. md = ms[0]
  786. }
  787. var editBox = document.querySelector(".edit-box");
  788. var monInfoBox = editBox.querySelector(".monsterinfo-box");
  789. var me = monInfoBox.querySelector(".monster");
  790. changeid({id:id,},me); //改变图像
  791. var mId = monInfoBox.querySelector(".monster-id");
  792. mId.innerHTML = id;
  793. var mRare = monInfoBox.querySelector(".monster-rare");
  794. mRare.className = "monster-rare rare-" + md.rare;
  795. var mName = monInfoBox.querySelector(".monster-name");
  796. mName.innerHTML = returnMonsterNameArr(md,language.searchlist)[0];
  797. var mType = monInfoBox.querySelectorAll(".monster-type li");
  798. for (var ti=0;ti<mType.length;ti++)
  799. {
  800. if (md.type[ti]>=0)
  801. {
  802. mType[ti].className = "type-name type-name-" + md.type[ti];
  803. mType[ti].firstChild.className = "type-icon type-icon-" + md.type[ti];
  804. }else
  805. {
  806. mType[ti].className = "display-none";
  807. }
  808. }
  809. var settingBox = editBox.querySelector(".setting-box");
  810. var mAwoken = settingBox.querySelectorAll(".row-mon-awoken .awoken-ul li");
  811. editBox.awokenCount = md.awoken.length;
  812. mAwoken[0].innerHTML = editBox.awokenCount?"★":"0";
  813. for (var ai=1;ai<mAwoken.length;ai++)
  814. {
  815. if (md.awoken[ai-1])
  816. {
  817. mAwoken[ai].className = "awoken-icon awoken-" + md.awoken[ai-1];
  818. }else
  819. {
  820. mAwoken[ai].className = "display-none";
  821. }
  822. }
  823. //超觉醒
  824. var mSAwokenRow = settingBox.querySelector(".row-mon-super-awoken");
  825. var mSAwoken = mSAwokenRow.querySelectorAll(".awoken-ul li");
  826. if (!editBox.assist && md.sAwoken && md.sAwoken.length>0)
  827. {
  828. mSAwokenRow.classList.remove("display-none");
  829. for (var ai=0;ai<mSAwoken.length;ai++)
  830. {
  831. if (ai < md.sAwoken.length)
  832. mSAwoken[ai].className = "awoken-icon unselected-awoken awoken-" + md.sAwoken[ai];
  833. else
  834. mSAwoken[ai].className = "display-none";
  835. }
  836. }else
  837. {
  838. mSAwokenRow.classList.add("display-none");
  839. }
  840. var monEditLvMax = settingBox.querySelector(".m-level-btn-max");
  841. monEditLvMax.innerHTML = monEditLvMax.value = md.a110?110:md.maxLv; //最大等级按钮
  842. var monEditLv = settingBox.querySelector(".m-level");
  843. monEditLv.value = md.maxLv; //默认等级为最大等级而不是110
  844. var rowPlus = settingBox.querySelector(".row-mon-plus");
  845. var rowLatent = settingBox.querySelector(".row-mon-latent");
  846. if (ms[id].type.some(function(t){return t == 0 || t == 12 || t == 14 || t == 15;}) && [303,305,307,600,602].indexOf(id)<0)
  847. { //当4种特殊type的时候是无法297和打觉醒的,但是5种小企鹅可以
  848. rowPlus.classList.add("disabled");
  849. rowLatent.classList.add("disabled");
  850. }else
  851. {
  852. rowPlus.classList.remove("disabled");
  853. rowLatent.classList.remove("disabled");
  854. }
  855. var monLatentAllowUl = rowLatent.querySelector(".m-latent-allowable-ul");
  856. //该宠Type允许的杀
  857. var allowLatent = uniq(md.type.reduce(function (previous, t, index, array) {
  858. return previous.concat(type_allowable_latent[t]);
  859. },[]));
  860. for(var li=17;li<=24;li++)
  861. {
  862. var latentDom = monLatentAllowUl.querySelector(".latent-icon-" + li);
  863. if (allowLatent.indexOf(li)>=0)
  864. {
  865. if(latentDom.classList.contains("unselected-latent"))
  866. latentDom.classList.remove("unselected-latent");
  867. }else
  868. {
  869. if(!latentDom.classList.contains("unselected-latent"))
  870. latentDom.classList.add("unselected-latent");
  871. }
  872. }
  873. if (editBox.assist)
  874. {
  875. var btnDone = editBox.querySelector(".button-done");
  876. if (!md.assist)
  877. {
  878. btnDone.classList.add("cant-assist");
  879. btnDone.disabled = true;
  880. }else
  881. {
  882. btnDone.classList.remove("cant-assist");
  883. btnDone.disabled = false;
  884. }
  885. }
  886. editBox.latent.length = 0;
  887. editBox.refreshLatent(editBox.latent);
  888. editBox.reCalculateAbility();
  889. }
  890. //刷新整个队伍
  891. function refreshAll(fmt){
  892. var txtTitle = document.querySelector(".title-box .title");
  893. var txtDetail = document.querySelector(".detail-box .detail");
  894. txtTitle.value = fmt.title || "";
  895. txtDetail.value = fmt.detail || "";
  896. txtDetail.onblur();
  897. var badges = Array.prototype.slice.call(document.querySelectorAll(".formation-box .formation-badge .badge-bg"));
  898. badges.forEach(function(b,idx){if (idx==fmt.badge) b.classList.remove("display-none"); else b.classList.add("display-none");})
  899. var formationA = document.querySelector(".formation-box .formation-A-box");
  900. var formationB = document.querySelector(".formation-box .formation-B-box");
  901. var fATeam = formationA.querySelectorAll(".formation-team .monster");
  902. var fALatents = formationA.querySelectorAll(".formation-latents .latent-ul");
  903. var fAAssist = formationA.querySelectorAll(".formation-assist .monster");
  904. if (formationB)
  905. {
  906. var fBTeam = formationB.querySelectorAll(".formation-team .monster");
  907. var fBLatents = formationB.querySelectorAll(".formation-latents .latent-ul");
  908. var fBAssist = formationB.querySelectorAll(".formation-assist .monster");
  909. }
  910. var formationAbilityDom = document.querySelector(".formation-box .formation-ability");
  911. for (var ti=0;ti<(formationB?5:6);ti++)
  912. {
  913. changeid(fmt.team[0][0][ti],fATeam[ti],fALatents[ti]);
  914. changeid(fmt.team[0][1][ti],fAAssist[ti]);
  915. if (formationAbilityDom)
  916. {
  917. refreshAbility(
  918. formationAbilityDom,
  919. fmt.team[0],
  920. ti);
  921. }
  922. if (formationB)
  923. {
  924. changeid(fmt.team[1][0][ti],fBTeam[ti],fBLatents[ti]);
  925. changeid(fmt.team[1][1][ti],fBAssist[ti]);
  926. }
  927. }
  928. refreshAwokenCount(fmt.team);
  929. }
  930. //刷新觉醒总计
  931. function refreshAwokenCount(teams){
  932. var awokenUL = document.querySelector(".awoken-total-box .awoken-ul");
  933. function setCount(idx,number){
  934. var aicon = awokenUL.querySelector(".awoken-" + idx);
  935. if (!aicon) return; //没有这个觉醒就撤回
  936. var ali = aicon.parentNode;
  937. var countDom = ali.querySelector(".count");
  938. countDom.innerHTML = number;
  939. if (number)
  940. ali.classList.remove("display-none");
  941. else
  942. ali.classList.add("display-none");
  943. }
  944. var bigAwoken = [52,53,56,68,69,70]; //等于几个小觉醒的大觉醒
  945. for (var ai=1;ai<=72;ai++)
  946. {
  947. if (ai == 10) //防封
  948. {
  949. setCount(ai,awokenCountInTeam(teams,ai,solo)+awokenCountInTeam(teams,52,solo)*2);
  950. }else if (ai == 11) //防暗
  951. {
  952. setCount(ai,awokenCountInTeam(teams,ai,solo)+awokenCountInTeam(teams,68,solo)*5);
  953. }else if (ai == 12) //防废
  954. {
  955. setCount(ai,awokenCountInTeam(teams,ai,solo)+awokenCountInTeam(teams,69,solo)*5);
  956. }else if (ai == 13) //防毒
  957. {
  958. setCount(ai,awokenCountInTeam(teams,ai,solo)+awokenCountInTeam(teams,70,solo)*5);
  959. }else if (ai == 19) //手指
  960. {
  961. setCount(ai,awokenCountInTeam(teams,ai,solo)+awokenCountInTeam(teams,53,solo)*2);
  962. }else if (ai == 21) //SB
  963. {
  964. setCount(ai,awokenCountInTeam(teams,ai,solo)+awokenCountInTeam(teams,56,solo)*2);
  965. }else if (bigAwoken.indexOf(ai)>=0) //属于大觉醒
  966. {
  967. continue;
  968. }else
  969. {
  970. setCount(ai,awokenCountInTeam(teams,ai,solo));
  971. }
  972. }
  973. }
  974. //刷新能力值
  975. function refreshAbility(dom,team,idx){
  976. var ali = dom.querySelector(".abilitys-" + (idx+1));
  977. var mainMD = team[0][idx];
  978. var assistMD = team[1][idx];
  979. var bonusScale = [0.1,0.05,0.15]; //辅助宠物附加的属性
  980. //如果辅助是武器,还要加上辅助的觉醒
  981. var mainAbility = calculateAbility(mainMD.id,mainMD.level,mainMD.plus,mainMD.awoken,mainMD.latent,assistMD.id,assistMD.awoken);
  982. //如果辅助的主属性相等,辅助宠物只计算等级和加值,不计算觉醒
  983. var assistAbility = (assistMD.id > 0 && ms[mainMD.id].ppt[0]==ms[assistMD.id].ppt[0])
  984. ?calculateAbility(assistMD.id,assistMD.level,assistMD.plus,null,null)
  985. :[0,0,0];
  986. var hpDom = ali.querySelector(".hp");
  987. var atkDom = ali.querySelector(".atk");
  988. var rcvDom = ali.querySelector(".rcv");
  989. [hpDom,atkDom,rcvDom].forEach(function(div,ai){
  990. if (mainAbility)
  991. {
  992. div.classList.remove("display-none");
  993. div.innerHTML = mainAbility[ai] + Math.round(assistAbility[ai]*bonusScale[ai]);
  994. }else
  995. {
  996. div.classList.add("display-none");
  997. div.innerHTML = 0;
  998. }
  999. })
  1000. }

智龙迷城队伍图制作工具