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

智龙迷城队伍图制作工具