From acb3e77c809c110fa3d2947422cb116ebf6b5f84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=AB=E8=B0=B7=E5=89=91=E4=BB=99?= Date: Sat, 4 Feb 2023 23:31:24 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E8=AE=A2=E4=BD=BF=E7=94=A8=E8=AF=B4?= =?UTF-8?q?=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/index.html | 11 +- script-json_data.js | 1573 +++++++++++++++++++++---------------------- 2 files changed, 781 insertions(+), 803 deletions(-) diff --git a/doc/index.html b/doc/index.html index a7cc18f4..1e374cdb 100644 --- a/doc/index.html +++ b/doc/index.html @@ -91,9 +91,11 @@ 安装脚本

导入 PADDB 队伍 | Import PADDB team

- 上传自己的队伍,或者在队伍模板里搜索其他人的队伍
- Upload your own team or search for someone else's party in the Team Templates
+ 上传自己的队伍
+ Upload your own team
上传自身的脚本
+ 或者在队伍模板里搜索其他人的队伍
+ Or search for someone else's party in the Team Templates
搜索别人的脚本
复制上传后的队伍链接
Copy the uploaded Team URL
@@ -112,6 +114,11 @@ PADDB 数据上传区
没有输入队伍链接时,将会上传队伍,并获得一个可被你的账号密码编辑的新的队伍链接。如果有,则会更新当前连接的队伍数据到你的链接。
If you do not enter a team link, the team will be uploaded and a new team link will be obtained that can be edited by your account password. If so, the currently team data is updated to the link.
+ 你可以在队伍模板里看到你的队伍
+ You can see your team in the team template
+ 搜索别人的脚本
+ 或者通过浏览器打开队伍链接,也可以跳转到 PADDB 内(部分浏览器可能不支持)
+ Or open the team link in your phone browser, which will jump to PADDB (some browsers may not support it)

注意:| Note:

    diff --git a/script-json_data.js b/script-json_data.js index 55b80504..1b2cb0ee 100644 --- a/script-json_data.js +++ b/script-json_data.js @@ -738,56 +738,12 @@ const specialSearchFunctions = (function() { //返回卡片的队长技能 function getCardLeaderSkill(card, skillTypes, searchRandom = true) { - return getActuallySkill(Skills[card.leaderSkillId], skillTypes, searchRandom); + return getActuallySkills(Skills[card.leaderSkillId], skillTypes, searchRandom)?.[0]; } //返回卡片的技能 function getCardActiveSkill(card, skillTypes, searchRandom = true) { - return getActuallySkill(Skills[card.activeSkillId], skillTypes, searchRandom); - } - //返回卡片的技能 - function getCardSkill(card, skillTypes, searchRandom = true, skillGreatType = 0) - { - switch(skillGreatType) - { - case 1: - case "leader": - return getCardLeaderSkill(card, skillTypes, searchRandom); - case 2: - case "active": - return getCardActiveSkill(card, skillTypes, searchRandom); - default: - return getCardLeaderSkill(card, skillTypes, searchRandom) || getCardActiveSkill(card, skillTypes, searchRandom); - } - } - //查找到真正起作用的那一个技能 - function getActuallySkill(skill, skillTypes, searchRandom = true) - { - if (skillTypes.includes(skill.type)) - { - return skill; - }else if (skill.type == 116 || //多个主动技 - (searchRandom && skill.type == 118) || //随机主动技 - skill.type == 138 || //多个队长技 - skill.type == 232 || //进化技能不循环 - skill.type == 233 || //进化技能循环 - skill.type == 248 //延迟生效技能 - ){ - let params = skill.type == 248 ? skill.params.slice(1) : skill.params; - const subSkills = params.map(id=>Skills[id]); - for(let i = 0;i < subSkills.length; i++) - { //因为可能有多层调用,特别是随机118再调用组合116的,所以需要递归 - let foundSubSkill = getActuallySkill(subSkills[i], skillTypes, searchRandom); - if (foundSubSkill) - { - return foundSubSkill; - } - } - return null; - }else - { - return null; - } + return getActuallySkills(Skills[card.activeSkillId], skillTypes, searchRandom)?.[0]; } //获取血倍率 function getHPScale(ls) @@ -958,7 +914,8 @@ const specialSearchFunctions = (function() { function sortByParams(a,b,searchTypeArray,pidx = 0) { - const a_s = getCardSkill(a, searchTypeArray), b_s = getCardSkill(b, searchTypeArray); + const a_s = getCardLeaderSkill(a, searchTypeArray) || getCardActiveSkill(a, searchTypeArray), + b_s = getCardLeaderSkill(b, searchTypeArray) || getCardActiveSkill(b, searchTypeArray); let a_pC = a_s.params[pidx],b_pC = b_s.params[pidx]; return a_pC - b_pC; } @@ -1517,12 +1474,14 @@ const specialSearchFunctions = (function() { {group:true,name:"-----Voids Absorption-----",otLangName:{chs:"-----破吸类-----",cht:"-----破吸類-----"}, functions: [ {name:"Voids attribute absorption(sort by turns)",otLangName:{chs:"破属吸 buff(按破吸回合排序)",cht:"破屬吸 buff(按破吸回合排序)"}, function:cards=>{ - const searchTypeArray = [173]; - return cards.filter(card=>{ - const skill = getCardActiveSkill(card, searchTypeArray); - return skill && skill.params[1]; - }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); - },addition:voidsAbsorption_Addition}, + const searchTypeArray = [173]; + return cards.filter(card=>{ + const skill = getCardActiveSkill(card, searchTypeArray); + return skill && skill.params[1]; + }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); + }, + addition:voidsAbsorption_Addition + }, /*{name:"Voids combo absorption(sort by turns)",otLangName:{chs:"破C吸 buff(按破吸回合排序)",cht:"破C吸 buff(按破吸回合排序)"}, function:cards=>{ const searchTypeArray = [173]; @@ -1533,20 +1492,24 @@ const specialSearchFunctions = (function() { },addition:voidsAbsorption_Addition},*/ {name:"Voids damage absorption(sort by turns)",otLangName:{chs:"破伤吸 buff(按破吸回合排序)",cht:"破傷吸 buff(按破吸回合排序)"}, function:cards=>{ - const searchTypeArray = [173]; - return cards.filter(card=>{ - const skill = getCardActiveSkill(card, searchTypeArray); - return skill && skill.params[3]; - }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); - },addition:voidsAbsorption_Addition}, + const searchTypeArray = [173]; + return cards.filter(card=>{ + const skill = getCardActiveSkill(card, searchTypeArray); + return skill && skill.params[3]; + }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); + }, + addition:voidsAbsorption_Addition + }, {name:"Voids both absorption(sort by turns)",otLangName:{chs:"双破吸 buff(按破吸回合排序)",cht:"雙破吸 buff(按破吸回合排序)"}, function:cards=>{ - const searchTypeArray = [173]; - return cards.filter(card=>{ - const skill = getCardActiveSkill(card, searchTypeArray); - return skill && skill.params[1] && skill.params[3]; - }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); - },addition:voidsAbsorption_Addition}, + const searchTypeArray = [173]; + return cards.filter(card=>{ + const skill = getCardActiveSkill(card, searchTypeArray); + return skill && skill.params[1] && skill.params[3]; + }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); + }, + addition:voidsAbsorption_Addition + }, {name:"Pierce through damage void(sort by turns)",otLangName:{chs:"贯穿无效盾 buff(按破吸回合排序)",cht:"貫穿無效盾 buff(按破吸回合排序)"}, function:cards=>{ const searchTypeArray = [191]; @@ -1663,906 +1626,656 @@ const specialSearchFunctions = (function() { } }, ]}, - {group:true,name:"----- Buff -----",otLangName:{chs:"----- buff 类-----",cht:"----- buff 類-----"}, functions: [ - {name:"Rate by state count(Jewel Princess)",otLangName:{chs:"以状态数量为倍率类技能(宝石姬)",cht:"以狀態數量爲倍率類技能(寶石姬)"}, - function:cards=>cards.filter(card=>{ - const searchTypeArray = [156,168,228,231]; - const skill = getCardActiveSkill(card, searchTypeArray); - return skill; - }) - }, - {name:"RCV rate change",otLangName:{chs:"回复力 buff(顶回复)",cht:"回覆力 buff(頂回復)"}, - function:cards=>{ - return cards.filter(card=>{ - const atkbuff = rcvBuff_Rate(card); - return atkbuff.skilltype > 0; - }).sort((a,b)=>{ - let a_pC = rcvBuff_Rate(a), b_pC = rcvBuff_Rate(b); - let sortNum = a_pC.skilltype - b_pC.skilltype; - if (sortNum == 0) - sortNum = a_pC.rate - b_pC.rate; - if (sortNum == 0) - sortNum = a_pC.turns - b_pC.turns; - return sortNum; - }); - }, - addition:card=>{ - const atkbuff = rcvBuff_Rate(card); - const fragment = document.createDocumentFragment(); - fragment.appendChild(createOrbsList([5])); - if (atkbuff.skilltype == 0) return fragment; - if (atkbuff.skilltype == 1) - { - fragment.appendChild(document.createTextNode(`+${atkbuff.rate}%/`)); - if (atkbuff.awoken.length) - fragment.appendChild(creatAwokenList(atkbuff.awoken)); - if (atkbuff.attrs.length) - fragment.appendChild(createOrbsList(atkbuff.attrs)); - if (atkbuff.types.length) - fragment.appendChild(createTypesList(atkbuff.types)); - fragment.appendChild(document.createTextNode(`×${atkbuff.turns}T`)); - }else if (atkbuff.skilltype == 2) - { - if (atkbuff.attrs.length) - fragment.appendChild(createOrbsList(atkbuff.attrs)); - if (atkbuff.types.length) - fragment.appendChild(createTypesList(atkbuff.types)); - fragment.appendChild(document.createTextNode(`×${atkbuff.rate / 100}`)); - fragment.appendChild(document.createTextNode(`×${atkbuff.turns}T`)); - } - return fragment; - } - }, - {name:"Team ATK rate change",otLangName:{chs:"全队攻击力 buff",cht:"全隊攻擊力 buff"}, - function:cards=>{ - return cards.filter(card=>{ - const atkbuff = atkBuff_Rate(card); - return atkbuff.skilltype > 0; - }).sort((a,b)=>{ - let a_pC = atkBuff_Rate(a), b_pC = atkBuff_Rate(b); - let sortNum = a_pC.skilltype - b_pC.skilltype; - if (sortNum == 0) - sortNum = a_pC.rate - b_pC.rate; - if (sortNum == 0) - sortNum = a_pC.turns - b_pC.turns; - return sortNum; - }); - }, - addition:card=>{ - const atkbuff = atkBuff_Rate(card); - const fragment = document.createDocumentFragment(); - if (atkbuff.skilltype == 0) return fragment; - if (atkbuff.skilltype == 1) - { - fragment.appendChild(document.createTextNode(`+${atkbuff.rate}%/`)); - if (atkbuff.awoken.length) - fragment.appendChild(creatAwokenList(atkbuff.awoken)); - if (atkbuff.attrs.length) - fragment.appendChild(createOrbsList(atkbuff.attrs)); - if (atkbuff.types.length) - fragment.appendChild(createTypesList(atkbuff.types)); - fragment.appendChild(document.createTextNode(`×${atkbuff.turns}T`)); - }else if (atkbuff.skilltype == 2) - { - if (atkbuff.attrs.length) - fragment.appendChild(createOrbsList(atkbuff.attrs)); - if (atkbuff.types.length) - fragment.appendChild(createTypesList(atkbuff.types)); - fragment.appendChild(document.createTextNode(`×${atkbuff.rate / 100}`)); - fragment.appendChild(document.createTextNode(`×${atkbuff.turns}T`)); - } - return fragment; - } - }, - {name:"Move time change",otLangName:{chs:"操作时间 buff(顶手指)",cht:"操作時間 buff(頂手指)"}, + {group:true,name:"-----For player team-----",otLangName:{chs:"-----对自身队伍生效类-----",cht:"-----對自身隊伍生效類-----"}, functions: [ + {name:"↑Increase skills charge(sort by turns)",otLangName:{chs:"【溜】减少CD(按回合排序)",cht:"【溜】減少CD(按回合排序)"}, function:cards=>{ - const searchTypeArray = [132]; + const searchTypeArray = [146]; return cards.filter(card=>{ const skill = getCardActiveSkill(card, searchTypeArray); return skill; - }).sort((a,b)=>{ - const a_s = getCardActiveSkill(a, searchTypeArray), b_s = getCardActiveSkill(b, searchTypeArray); - //将技能的手指类型转换为二进制01、10、11等形式,低位表示加固定秒,高位表示手指加倍 - const a_t = Boolean(a_s.params[1]) | Boolean(a_s.params[2])<<1, b_t = Boolean(b_s.params[1]) | Boolean(b_s.params[2])<<1; - return (a_t - b_t) || ((a_t & b_t & 1) ? a_s.params[1] - b_s.params[1] : a_s.params[2] - b_s.params[2]); - }); + }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); }, addition:card=>{ - const searchTypeArray = [132]; + const searchTypeArray = [146]; const skill = getCardActiveSkill(card, searchTypeArray); if (!skill) return; const sk = skill.params; - let str = "👆"; - if (sk[1]) str += `${sk[1]>0?`+`:``}${sk[1]/10}S`; - if (sk[2]) str += `x${sk[2]/100}`; - str += `x${sk[0]}T`; - return str; + return document.createTextNode(`${sk[0]}${sk[0]!=sk[1]?`~${sk[1]}`:""}溜`); } }, - {name:"No Skyfall(sort by turns)",otLangName:{chs:"无天降 buff(按回合排序)",cht:"無天降 buff(按回合排序)"}, + {name:"↓Reduce skills charge(sort by turns)",otLangName:{chs:"【坐】增加CD(按回合排序)",cht:"【坐】增加CD(按回合排序)"}, function:cards=>{ - const searchTypeArray = [184]; + const searchTypeArray = [218]; return cards.filter(card=>{ const skill = getCardActiveSkill(card, searchTypeArray); return skill; }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); }, addition:card=>{ - const searchTypeArray = [184]; + const searchTypeArray = [218]; const skill = getCardActiveSkill(card, searchTypeArray); if (!skill) return; const sk = skill.params; - return `无↓×${sk[0]}T`; + return document.createTextNode(`坐下${sk[0]}${sk[1] && sk[0]!=sk[1]?`~${sk[1]}`:""}`); } }, - {name:"Adds combo(sort by combo)",otLangName:{chs:"加C buff(按C数排列)",cht:"加C buff(按C數排列)"}, - function:cards=>{ - const searchTypeArray = [160]; - return cards.filter(card=>{ - const skill = getCardActiveSkill(card, searchTypeArray); - return skill; - }).sort((a,b)=>{ - const a_s = getCardActiveSkill(a, searchTypeArray), b_s = getCardActiveSkill(b, searchTypeArray); - return a_s.params[1] - b_s.params[1]; - }); - }, + {name:"Change Leader",otLangName:{chs:"更换队长",cht:"更換隊長"}, + function:cards=>cards.filter(card=>{ + const searchTypeArray = [93, 227]; + const skill = getCardActiveSkill(card, searchTypeArray); + return skill; + }), addition:card=>{ - const searchTypeArray = [160]; + const searchTypeArray = [93, 227]; const skill = getCardActiveSkill(card, searchTypeArray); if (!skill) return; - const sk = skill.params; - return `+${sk[1]}C×${sk[0]}T`; + return skill.type == 93 ? '换自身' : '换最后队员'; } }, - {name:"Reduce Damage for all Attr(sort by rate)",otLangName:{chs:"全属减伤 buff(按减伤比率排序)",cht:"全屬減傷 buff(按減傷比率排序)"}, + {name:"Increase Damage Cap",otLangName:{chs:"增加伤害上限 buff",cht:"增加傷害上限 buff"}, function:cards=>{ - const searchTypeArray = [3,156]; + function getIncreaseDamageCap(skill) + { + let cap = 0; + switch (skill.type) { + case 241: + cap = skill.params[1]; + break; + case 246: + cap = skill.params[2]; + break; + case 247: + cap = skill.params[3]; + break; + } + return cap; + } + const searchTypeArray = [241, 246, 247]; return cards.filter(card=>{ const skill = getCardActiveSkill(card, searchTypeArray); - if (!skill) return false; - if (skill.type == 156) - return skill.params[4]==3; - else - return true; + return skill; }).sort((a,b)=>{ - const a_s = getCardActiveSkill(a, searchTypeArray), b_s = getCardActiveSkill(b, searchTypeArray); - let sortNum = b_s.type - a_s.type; //先分开宝石姬与非宝石姬 - if (!sortNum) - { - let a_pC = a_s.params[a_s.type == 3 ? 1 : 5],b_pC = b_s.params[b_s.type == 3 ? 1 : 5]; - sortNum = a_pC - b_pC; - } - return sortNum; + const a_ss = getCardActiveSkill(a, searchTypeArray), b_ss = getCardActiveSkill(b, searchTypeArray); + let a_pC = getIncreaseDamageCap(a_ss), b_pC = getIncreaseDamageCap(b_ss); + return a_pC - b_pC; }); }, addition:card=>{ - const searchTypeArray = [3,156]; + const searchTypeArray = [241, 246, 247]; const skill = getCardActiveSkill(card, searchTypeArray); if (!skill) return; const sk = skill.params; - - const fragment = document.createDocumentFragment(); - if (skill.type == 156) - { - fragment.appendChild(document.createTextNode(`${sk[5]}%/`)); - const awokenArr = sk.slice(1,4).filter(s=>s>0); - fragment.appendChild(creatAwokenList(awokenArr)); - fragment.appendChild(document.createTextNode(`×${sk[0]}T`)); - }else - { - fragment.appendChild(document.createTextNode(`${sk[1]}%×${sk[0]}T`)); + let cap; + switch (skill.type) { + case 241: + cap = sk[1]; + break; + case 246: + cap = sk[2]; + break; + case 247: + cap = sk[3]; + break; + } + if (skill.type == 241) { + return `${(cap*1e8).bigNumberToString()}×${sk[0]}T`; + } else { + return `${(cap*1e8).bigNumberToString()} in ${sk[0]}S`; } - return fragment; } }, - {name:"Reduce 100% Damage(invincible, sort by turns)",otLangName:{chs:"全属减伤 100%(无敌)",cht:"全屬減傷 100%(無敵)"}, + {name:"Member ATK rate change",otLangName:{chs:"队员攻击力 buff",cht:"隊員攻擊力 buff"}, function:cards=>{ - const searchTypeArray = [3]; - return cards.filter(card=>{ - const skill = getCardActiveSkill(card, searchTypeArray); - return skill && skill.params[1]>=100; - }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); - }, - addition:card=>{ - const searchTypeArray = [3]; - const skill = getCardActiveSkill(card, searchTypeArray); - if (!skill) return; - const sk = skill.params; - return `无敌×${sk[0]}T`; - } - }, - {name:"Reduce all Damage for designated Attr(sort by turns)",otLangName:{chs:"限属减伤 buff(按回合排序排序)",cht:"限屬減傷 buff(按回合排序排序)"}, - function:cards=>{ - const searchTypeArray = [21]; + const searchTypeArray = [230]; return cards.filter(card=>{ const skill = getCardActiveSkill(card, searchTypeArray); return skill; - }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); + }).sort((a,b)=>sortByParams(a, b, searchTypeArray, 2)); }, - addition:card=>{ - const searchTypeArray = [21]; - const skill = getCardActiveSkill(card, searchTypeArray); - if (!skill) return; - const sk = skill.params; - - const colors = [sk[1]]; - const fragment = document.createDocumentFragment(); - fragment.appendChild(document.createTextNode(`-`)); - fragment.appendChild(createOrbsList(colors)); - fragment.appendChild(document.createTextNode(`×${sk[0]}T`)); - - return fragment; - } + addition:memberATK_Addition }, - {name:"Mass Attacks(sort by turns)",otLangName:{chs:"变为全体攻击(按回合数排序)",cht:"變爲全體攻擊(按回合數排序)"}, + {name:"Member ATK rate change - Self",otLangName:{chs:"队员攻击力 buff - 自身",cht:"隊員攻擊力 buff - 自身"}, function:cards=>{ - const searchTypeArray = [51]; + const searchTypeArray = [230]; return cards.filter(card=>{ const skill = getCardActiveSkill(card, searchTypeArray); - return skill; - }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); + return skill && Boolean(skill.params[1] & 1<<0); + }).sort((a,b)=>sortByParams(a, b, searchTypeArray, 2)); }, - addition:card=>{ - const searchTypeArray = [51]; - const skill = getCardActiveSkill(card, searchTypeArray); - if (!skill) return; - const sk = skill.params; - return `全体×${sk[0]}T`; - } + addition:memberATK_Addition }, - ]}, - {group:true,name:"-----Orbs Drop-----",otLangName:{chs:"----- 珠子掉落 类-----",cht:"----- 珠子掉落 類-----"}, functions: [ - {name:"Drop locked orbs(any color, sort by turns)",otLangName:{chs:"掉锁(不限色,按回合排序)",cht:"掉鎖(不限色,按回合排序)"}, + {name:"Member ATK rate change - Leader",otLangName:{chs:"队员攻击力 buff - 队长",cht:"隊員攻擊力 buff - 隊長"}, function:cards=>{ - const searchTypeArray = [205]; + const searchTypeArray = [230]; return cards.filter(card=>{ const skill = getCardActiveSkill(card, searchTypeArray); - return skill; - }).sort((a,b)=>sortByParams(a,b,searchTypeArray,1)); + return skill && Boolean(skill.params[1] & (1<<1 | 1<<2)); + }).sort((a,b)=>sortByParams(a, b, searchTypeArray, 2)); }, - addition:dropLock_Addition + addition:memberATK_Addition }, - {name:"Drop locked orbs(≥5 color, sort by turns)",otLangName:{chs:"掉锁5色+心或全部(按回合排序)",cht:"掉鎖5色+心或全部(按回合排序)"}, + {name:"Member ATK rate change - Member",otLangName:{chs:"队员攻击力 buff - 队员",cht:"隊員攻擊力 buff - 隊員"}, function:cards=>{ - const searchTypeArray = [205]; + const searchTypeArray = [230]; return cards.filter(card=>{ const skill = getCardActiveSkill(card, searchTypeArray); - return skill && (skill.params[0] & 63) === 63; - }).sort((a,b)=>sortByParams(a,b,searchTypeArray,1)); + return skill && Boolean(skill.params[1] & 1<<3); + }).sort((a,b)=>sortByParams(a, b, searchTypeArray, 2)); }, - addition:dropLock_Addition + addition:memberATK_Addition }, - {name:"Drop Enhanced Orbs(sort by turns)",otLangName:{chs:"掉落强化宝珠(按回合排序)",cht:"掉落強化寶珠(按回合排序)"}, + {name:"Change self's Attr(sort by turns)",otLangName:{chs:"转换自身属性(按回合数排序)",cht:"轉換自身屬性(按回合數排序)"}, function:cards=>{ - const searchTypeArray = [180]; + const searchTypeArray = [142]; return cards.filter(card=>{ const skill = getCardActiveSkill(card, searchTypeArray); return skill; - }).sort((a,b)=>sortByParams(a,b,searchTypeArray,1)); + }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); }, addition:card=>{ - const searchTypeArray = [180]; + const searchTypeArray = [142]; const skill = getCardActiveSkill(card, searchTypeArray); if (!skill) return; const sk = skill.params; - return `${sk[1]}%×${sk[0]}T`; + + const fragment = document.createDocumentFragment(); + fragment.appendChild(document.createTextNode(`自→`)); + fragment.appendChild(createOrbsList(sk[1])); + fragment.appendChild(document.createTextNode(`×${sk[0]}T`)); + + return fragment; } }, - {name:"Drop rate increases",otLangName:{chs:"掉落率提升",cht:"掉落率提升"}, - function:cards=>cards.filter(card=>{ - const searchTypeArray = [126]; - const skill = getCardActiveSkill(card, searchTypeArray); - return skill; - }), - addition:dropOrb_Addition - }, - {name:"Drop rate - Attr. - Jammers/Poison",otLangName:{chs:"掉落率提升-属性-毒、废(顶毒)",cht:"掉落率提升-屬性-毒、廢(頂毒)"}, - function:cards=>cards.filter(card=>{ - const searchTypeArray = [126]; - const skill = getCardActiveSkill(card, searchTypeArray); - return skill && (skill.params[0] & 960); // 960 = 二进制 1111000000 - }), - addition:dropOrb_Addition - }, - {name:"Drop rate - 99 turns",otLangName:{chs:"掉落率提升-持续99回合",cht:"掉落率提升-持續99回合"}, - function:cards=>cards.filter(card=>{ - const searchTypeArray = [126]; - const skill = getCardActiveSkill(card, searchTypeArray); - return skill && skill.params[1] >= 99; - }), - addition:dropOrb_Addition - }, - {name:"Drop rate - 100% rate",otLangName:{chs:"掉落率提升-100%几率",cht:"掉落率提升-100%幾率"}, - function:cards=>cards.filter(card=>{ - const searchTypeArray = [126]; - const skill = getCardActiveSkill(card, searchTypeArray); - return skill && skill.params[3] == 100; - }), - addition:dropOrb_Addition - }, - {name:"Drop Nail Orbs(sort by turns)",otLangName:{chs:"掉落钉珠(按回合排序)",cht:"掉落釘珠(按回合排序)"}, + ]}, + {group:true,name:"-----Player's HP change-----",otLangName:{chs:"-----玩家HP操纵类-----",cht:"-----玩家HP操縱類-----"}, functions: [ + {name:"Heal after turn",otLangName:{chs:"回合结束回血 buff",cht:"回合結束回血 buff"}, function:cards=>{ - const searchTypeArray = [226]; + const searchTypeArray = [179]; return cards.filter(card=>{ const skill = getCardActiveSkill(card, searchTypeArray); return skill; }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); }, addition:card=>{ - const searchTypeArray = [226]; + const searchTypeArray = [179]; const skill = getCardActiveSkill(card, searchTypeArray); if (!skill) return; const sk = skill.params; - return `📌${sk[1]}%×${sk[0]}T`; + return `回复${sk[1]?`${sk[1].bigNumberToString()}`:`${sk[2]}%`}×${sk[0]}T`; } }, - ]}, - {group:true,name:"-----For Enemy-----",otLangName:{chs:"-----对敌 buff 类-----",cht:"-----對敵 buff 類-----"}, functions: [ - {name:"Menace(sort by turns)",otLangName:{chs:"威吓(按推迟回合排序)",cht:"威嚇(按推遲迴合排序)"}, + {name:"Heal immediately",otLangName:{chs:"玩家立刻回血",cht:"玩家立刻回血"}, function:cards=>{ - const searchTypeArray = [18]; return cards.filter(card=>{ - const skill = getCardActiveSkill(card, searchTypeArray); - return skill; - }).sort((a,b)=>sortByParams(a,b,searchTypeArray,0)); + const heal = healImmediately_Rate(card); + return Object.values(heal).some(v=>v); + }) + .sort((a,b)=>{ + const a_h = healImmediately_Rate(a), b_h = healImmediately_Rate(b); + const a_vs = Object.values(a_h), b_vs = Object.values(b_h); + const a_i = a_vs.findIndex(v=>v), b_i = b_vs.findIndex(v=>v); + let sortNum = a_i - b_i; + if (!sortNum) + { + sortNum = a_vs[a_i] - b_vs[b_i]; + } + return sortNum; + }); }, addition:card=>{ - const searchTypeArray = [18]; - const skill = getCardActiveSkill(card, searchTypeArray); - if (!skill) return; - const sk = skill.params; - return document.createTextNode(`威吓×${sk[0]}T`); + const heal = healImmediately_Rate(card); + let strArr = []; + if (heal.scale) + strArr.push(`${heal.scale}%最大HP`); + if (heal.const) + strArr.push(`${heal.const.bigNumberToString()}点HP`); + if (heal.selfRcv) + strArr.push(`${heal.selfRcv/100}倍回复力`); + if (heal.vampire) + strArr.push(`${heal.vampire}%伤害`); + return strArr.join(','); } }, - {name:"Reduces enemies' DEF(sort by rate)",otLangName:{chs:"破防(按防御减少比例排序)",cht:"破防(按防禦減少比例排序)"}, + {name:"Change team maximum HP",otLangName:{chs:"队伍最大 HP 变化",cht:"队伍最大 HP 變化"}, function:cards=>{ - const searchTypeArray = [19]; + const searchTypeArray = [237]; return cards.filter(card=>{ const skill = getCardActiveSkill(card, searchTypeArray); return skill; }).sort((a,b)=>sortByParams(a,b,searchTypeArray,1)); }, addition:card=>{ - const searchTypeArray = [19]; + const searchTypeArray = [237]; const skill = getCardActiveSkill(card, searchTypeArray); if (!skill) return; const sk = skill.params; - return `破防${sk[1]}%`; + return `最大HP ${sk[1].bigNumberToString()}%×${sk[0]}T`; } }, - {name:"Voids enemies' DEF(sort by turns)",otLangName:{chs:"100% 破防(按回合排序)",cht:"100% 破防(按回合排序)"}, + {name:"Damage self(sort by rate)",otLangName:{chs:"玩家自残(HP 减少,按减少比率排序)",cht:"玩家自殘(HP 減少,按減少比率排序)"}, function:cards=>{ - const searchTypeArray = [19]; - return cards.filter(card=>{ - const skill = getCardActiveSkill(card, searchTypeArray); - return skill && skill.params[1]>=100; - }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); + return cards.filter(card=>damageSelf_Rate(card)>0) + .sort((a,b)=>damageSelf_Rate(a) - damageSelf_Rate(b)); }, addition:card=>{ - const searchTypeArray = [19]; - const skill = getCardActiveSkill(card, searchTypeArray); - if (!skill) return; - const sk = skill.params; - return `全破×${sk[0]}T`; + let rate = damageSelf_Rate(card); + if (rate < 100) + return `减少${rate}%`; + else + return `减少到1`; } }, - {name:"Poisons enemies(sort by rate)",otLangName:{chs:"中毒(按毒伤比率排序)",cht:"中毒(按毒傷比率排序)"}, - function:cards=>{ - const searchTypeArray = [4]; - return cards.filter(card=>{ - const skill = getCardActiveSkill(card, searchTypeArray); - return skill; - }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); - }, - addition:card=>{ - const searchTypeArray = [4]; + ]}, + {group:true,name:"-----Orbs States Change-----",otLangName:{chs:"-----改变宝珠状态类-----",cht:"-----改變寶珠狀態類-----"}, functions: [ + {name:"Unlock",otLangName:{chs:"解锁",cht:"解鎖"}, + function:cards=>cards.filter(card=>{ + const searchTypeArray = [172]; const skill = getCardActiveSkill(card, searchTypeArray); - if (!skill) return; - const sk = skill.params; - return `攻击力×${sk[0]/100}倍`; - } + return skill; + }) }, - {name:"Change enemies's Attr(sort by attr)",otLangName:{chs:"改变敌人属性(按属性排序)",cht:"改變敵人屬性(按屬性排序)"}, + {name:"Lock(Any color)",otLangName:{chs:"上锁(不限色)",cht:"上鎖(不限色)"}, + function:cards=>cards.filter(card=>{ + const searchTypeArray = [152]; + const skill = getCardActiveSkill(card, searchTypeArray); + return skill; + }), + addition:lock_Addition + }, + {name:"Lock(≥5 color)",otLangName:{chs:"上锁5色+心或全部",cht:"上鎖5色+心或全部"}, + function:cards=>cards.filter(card=>{ + const searchTypeArray = [152]; + const skill = getCardActiveSkill(card, searchTypeArray); + return skill && (skill.params[0] & 63) === 63; + }), + addition:lock_Addition + }, + {name:"Enhanced Orbs",otLangName:{chs:"强化宝珠",cht:"強化寶珠"}, function:cards=>{ - return cards.filter(card=>{ - return changeEnemiesAttr_Attr(card).attr != null; - }).sort((a,b)=>{ - let a_pC = changeEnemiesAttr_Attr(a),b_pC = changeEnemiesAttr_Attr(b); - return a_pC.attr - b_pC.attr; - }) + const searchTypeArray = [52,91,140]; + return cards.filter(card=>{ + const skill = getCardActiveSkill(card, searchTypeArray); + return skill; + }); }, addition:card=>{ - let change = changeEnemiesAttr_Attr(card); - const fragment = document.createDocumentFragment(); - fragment.appendChild(document.createTextNode(`敌→`)); - fragment.appendChild(createOrbsList(change.attr)); - if (change.turns > 0) - fragment.appendChild(document.createTextNode(`×${change.turns}T`)); - return fragment; - } - }, - {name:"Counterattack buff(sort by rate)",otLangName:{chs:"受伤反击 buff(按倍率排序)",cht:"受傷反擊 buff(按倍率排序)"}, - function:cards=>{ - const searchTypeArray = [60]; - return cards.filter(card=>{ - const skill = getCardActiveSkill(card, searchTypeArray); - return skill; - }).sort((a,b)=>sortByParams(a,b,searchTypeArray,1)); - }, - addition:card=>{ - const searchTypeArray = [60]; - const skill = getCardActiveSkill(card, searchTypeArray); - if (!skill) return; - const sk = skill.params; - - const fragment = document.createDocumentFragment(); - fragment.appendChild(document.createTextNode(`${sk[1]/100}倍`)); - fragment.appendChild(createOrbsList(sk[2])); - fragment.appendChild(document.createTextNode(`×${sk[0]}T`)); - - return fragment; + const searchTypeArray = [52,91,140]; + const skill = getCardActiveSkill(card, searchTypeArray); + if (!skill) return; + const sk = skill.params; + let attrs = []; + switch (skill.type) + { + case 52:{ + attrs.push(sk[0]); break; + } + case 91:{ + attrs = sk.slice(0,-1); break; + } + case 140:{ + attrs = flags(sk[0]); break; + } + } + const fragment = document.createDocumentFragment(); + fragment.appendChild(document.createTextNode(`强化`)); + fragment.appendChild(createOrbsList(attrs)); + return fragment; } }, ]}, - {group:true,name:"-----For player team-----",otLangName:{chs:"-----对自身队伍生效类-----",cht:"-----對自身隊伍生效類-----"}, functions: [ - {name:"↑Increase skills charge(sort by turns)",otLangName:{chs:"【溜】减少CD(按回合排序)",cht:"【溜】減少CD(按回合排序)"}, + {group:true,name:"----- Buff -----",otLangName:{chs:"----- buff 类-----",cht:"----- buff 類-----"}, functions: [ + {name:"Rate by state count(Jewel Princess)",otLangName:{chs:"以状态数量为倍率类技能(宝石姬)",cht:"以狀態數量爲倍率類技能(寶石姬)"}, + function:cards=>cards.filter(card=>{ + const searchTypeArray = [156,168,228,231]; + const skill = getCardActiveSkill(card, searchTypeArray); + return skill; + }) + }, + {name:"RCV rate change",otLangName:{chs:"回复力 buff(顶回复)",cht:"回覆力 buff(頂回復)"}, function:cards=>{ - const searchTypeArray = [146]; return cards.filter(card=>{ - const skill = getCardActiveSkill(card, searchTypeArray); - return skill; - }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); + const atkbuff = rcvBuff_Rate(card); + return atkbuff.skilltype > 0; + }).sort((a,b)=>{ + let a_pC = rcvBuff_Rate(a), b_pC = rcvBuff_Rate(b); + let sortNum = a_pC.skilltype - b_pC.skilltype; + if (sortNum == 0) + sortNum = a_pC.rate - b_pC.rate; + if (sortNum == 0) + sortNum = a_pC.turns - b_pC.turns; + return sortNum; + }); }, addition:card=>{ - const searchTypeArray = [146]; - const skill = getCardActiveSkill(card, searchTypeArray); - if (!skill) return; - const sk = skill.params; - return document.createTextNode(`${sk[0]}${sk[0]!=sk[1]?`~${sk[1]}`:""}溜`); + const atkbuff = rcvBuff_Rate(card); + const fragment = document.createDocumentFragment(); + fragment.appendChild(createOrbsList([5])); + if (atkbuff.skilltype == 0) return fragment; + if (atkbuff.skilltype == 1) + { + fragment.appendChild(document.createTextNode(`+${atkbuff.rate}%/`)); + if (atkbuff.awoken.length) + fragment.appendChild(creatAwokenList(atkbuff.awoken)); + if (atkbuff.attrs.length) + fragment.appendChild(createOrbsList(atkbuff.attrs)); + if (atkbuff.types.length) + fragment.appendChild(createTypesList(atkbuff.types)); + fragment.appendChild(document.createTextNode(`×${atkbuff.turns}T`)); + }else if (atkbuff.skilltype == 2) + { + if (atkbuff.attrs.length) + fragment.appendChild(createOrbsList(atkbuff.attrs)); + if (atkbuff.types.length) + fragment.appendChild(createTypesList(atkbuff.types)); + fragment.appendChild(document.createTextNode(`×${atkbuff.rate / 100}`)); + fragment.appendChild(document.createTextNode(`×${atkbuff.turns}T`)); + } + return fragment; } }, - {name:"↓Reduce skills charge(sort by turns)",otLangName:{chs:"【坐】增加CD(按回合排序)",cht:"【坐】增加CD(按回合排序)"}, + {name:"Team ATK rate change",otLangName:{chs:"全队攻击力 buff",cht:"全隊攻擊力 buff"}, function:cards=>{ - const searchTypeArray = [218]; return cards.filter(card=>{ - const skill = getCardActiveSkill(card, searchTypeArray); - return skill; - }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); + const atkbuff = atkBuff_Rate(card); + return atkbuff.skilltype > 0; + }).sort((a,b)=>{ + let a_pC = atkBuff_Rate(a), b_pC = atkBuff_Rate(b); + let sortNum = a_pC.skilltype - b_pC.skilltype; + if (sortNum == 0) + sortNum = a_pC.rate - b_pC.rate; + if (sortNum == 0) + sortNum = a_pC.turns - b_pC.turns; + return sortNum; + }); }, addition:card=>{ - const searchTypeArray = [218]; - const skill = getCardActiveSkill(card, searchTypeArray); - if (!skill) return; - const sk = skill.params; - return document.createTextNode(`坐下${sk[0]}${sk[1] && sk[0]!=sk[1]?`~${sk[1]}`:""}`); - } - }, - {name:"Change Leader",otLangName:{chs:"更换队长",cht:"更換隊長"}, - function:cards=>cards.filter(card=>{ - const searchTypeArray = [93, 227]; - const skill = getCardActiveSkill(card, searchTypeArray); - return skill; - }), - addition:card=>{ - const searchTypeArray = [93, 227]; - const skill = getCardActiveSkill(card, searchTypeArray); - if (!skill) return; - return skill.type == 93 ? '换自身' : '换最后队员'; + const atkbuff = atkBuff_Rate(card); + const fragment = document.createDocumentFragment(); + if (atkbuff.skilltype == 0) return fragment; + if (atkbuff.skilltype == 1) + { + fragment.appendChild(document.createTextNode(`+${atkbuff.rate}%/`)); + if (atkbuff.awoken.length) + fragment.appendChild(creatAwokenList(atkbuff.awoken)); + if (atkbuff.attrs.length) + fragment.appendChild(createOrbsList(atkbuff.attrs)); + if (atkbuff.types.length) + fragment.appendChild(createTypesList(atkbuff.types)); + fragment.appendChild(document.createTextNode(`×${atkbuff.turns}T`)); + }else if (atkbuff.skilltype == 2) + { + if (atkbuff.attrs.length) + fragment.appendChild(createOrbsList(atkbuff.attrs)); + if (atkbuff.types.length) + fragment.appendChild(createTypesList(atkbuff.types)); + fragment.appendChild(document.createTextNode(`×${atkbuff.rate / 100}`)); + fragment.appendChild(document.createTextNode(`×${atkbuff.turns}T`)); + } + return fragment; } }, - {name:"Increase Damage Cap",otLangName:{chs:"增加伤害上限 buff",cht:"增加傷害上限 buff"}, + {name:"Move time change",otLangName:{chs:"操作时间 buff(顶手指)",cht:"操作時間 buff(頂手指)"}, function:cards=>{ - function getIncreaseDamageCap(skill) - { - let cap = 0; - switch (skill.type) { - case 241: - cap = skill.params[1]; - break; - case 246: - cap = skill.params[2]; - break; - case 247: - cap = skill.params[3]; - break; - } - return cap; - } - const searchTypeArray = [241, 246, 247]; + const searchTypeArray = [132]; return cards.filter(card=>{ const skill = getCardActiveSkill(card, searchTypeArray); return skill; }).sort((a,b)=>{ - const a_ss = getCardActiveSkill(a, searchTypeArray), b_ss = getCardActiveSkill(b, searchTypeArray); - let a_pC = getIncreaseDamageCap(a_ss), b_pC = getIncreaseDamageCap(b_ss); - return a_pC - b_pC; + const a_s = getCardActiveSkill(a, searchTypeArray), b_s = getCardActiveSkill(b, searchTypeArray); + //将技能的手指类型转换为二进制01、10、11等形式,低位表示加固定秒,高位表示手指加倍 + const a_t = Boolean(a_s.params[1]) | Boolean(a_s.params[2])<<1, b_t = Boolean(b_s.params[1]) | Boolean(b_s.params[2])<<1; + return (a_t - b_t) || ((a_t & b_t & 1) ? a_s.params[1] - b_s.params[1] : a_s.params[2] - b_s.params[2]); }); }, addition:card=>{ - const searchTypeArray = [241, 246, 247]; + const searchTypeArray = [132]; const skill = getCardActiveSkill(card, searchTypeArray); if (!skill) return; const sk = skill.params; - let cap; - switch (skill.type) { - case 241: - cap = sk[1]; - break; - case 246: - cap = sk[2]; - break; - case 247: - cap = sk[3]; - break; - } - if (skill.type == 241) { - return `${(cap*1e8).bigNumberToString()}×${sk[0]}T`; - } else { - return `${(cap*1e8).bigNumberToString()} in ${sk[0]}S`; - } + let str = "👆"; + if (sk[1]) str += `${sk[1]>0?`+`:``}${sk[1]/10}S`; + if (sk[2]) str += `x${sk[2]/100}`; + str += `x${sk[0]}T`; + return str; } }, - {name:"Member ATK rate change",otLangName:{chs:"队员攻击力 buff",cht:"隊員攻擊力 buff"}, - function:cards=>{ - const searchTypeArray = [230]; - return cards.filter(card=>{ - const skill = getCardActiveSkill(card, searchTypeArray); - return skill; - }).sort((a,b)=>sortByParams(a, b, searchTypeArray, 2)); - }, - addition:memberATK_Addition - }, - {name:"Member ATK rate change - Self",otLangName:{chs:"队员攻击力 buff - 自身",cht:"隊員攻擊力 buff - 自身"}, - function:cards=>{ - const searchTypeArray = [230]; - return cards.filter(card=>{ - const skill = getCardActiveSkill(card, searchTypeArray); - return skill && Boolean(skill.params[1] & 1<<0); - }).sort((a,b)=>sortByParams(a, b, searchTypeArray, 2)); - }, - addition:memberATK_Addition - }, - {name:"Member ATK rate change - Leader",otLangName:{chs:"队员攻击力 buff - 队长",cht:"隊員攻擊力 buff - 隊長"}, - function:cards=>{ - const searchTypeArray = [230]; - return cards.filter(card=>{ - const skill = getCardActiveSkill(card, searchTypeArray); - return skill && Boolean(skill.params[1] & (1<<1 | 1<<2)); - }).sort((a,b)=>sortByParams(a, b, searchTypeArray, 2)); - }, - addition:memberATK_Addition - }, - {name:"Member ATK rate change - Member",otLangName:{chs:"队员攻击力 buff - 队员",cht:"隊員攻擊力 buff - 隊員"}, - function:cards=>{ - const searchTypeArray = [230]; - return cards.filter(card=>{ - const skill = getCardActiveSkill(card, searchTypeArray); - return skill && Boolean(skill.params[1] & 1<<3); - }).sort((a,b)=>sortByParams(a, b, searchTypeArray, 2)); - }, - addition:memberATK_Addition - }, - {name:"Change self's Attr(sort by turns)",otLangName:{chs:"转换自身属性(按回合数排序)",cht:"轉換自身屬性(按回合數排序)"}, + {name:"No Skyfall(sort by turns)",otLangName:{chs:"无天降 buff(按回合排序)",cht:"無天降 buff(按回合排序)"}, function:cards=>{ - const searchTypeArray = [142]; + const searchTypeArray = [184]; return cards.filter(card=>{ const skill = getCardActiveSkill(card, searchTypeArray); return skill; }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); }, addition:card=>{ - const searchTypeArray = [142]; + const searchTypeArray = [184]; const skill = getCardActiveSkill(card, searchTypeArray); if (!skill) return; const sk = skill.params; - - const fragment = document.createDocumentFragment(); - fragment.appendChild(document.createTextNode(`自→`)); - fragment.appendChild(createOrbsList(sk[1])); - fragment.appendChild(document.createTextNode(`×${sk[0]}T`)); - - return fragment; + return `无↓×${sk[0]}T`; } }, - ]}, - {group:true,name:"-----Player's HP change-----",otLangName:{chs:"-----玩家HP操纵类-----",cht:"-----玩家HP操縱類-----"}, functions: [ - {name:"Heal after turn",otLangName:{chs:"回合结束回血 buff",cht:"回合結束回血 buff"}, + {name:"Adds combo(sort by combo)",otLangName:{chs:"加C buff(按C数排列)",cht:"加C buff(按C數排列)"}, function:cards=>{ - const searchTypeArray = [179]; + const searchTypeArray = [160]; return cards.filter(card=>{ const skill = getCardActiveSkill(card, searchTypeArray); return skill; - }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); + }).sort((a,b)=>{ + const a_s = getCardActiveSkill(a, searchTypeArray), b_s = getCardActiveSkill(b, searchTypeArray); + return a_s.params[1] - b_s.params[1]; + }); }, addition:card=>{ - const searchTypeArray = [179]; + const searchTypeArray = [160]; const skill = getCardActiveSkill(card, searchTypeArray); if (!skill) return; const sk = skill.params; - return `回复${sk[1]?`${sk[1].bigNumberToString()}`:`${sk[2]}%`}×${sk[0]}T`; + return `+${sk[1]}C×${sk[0]}T`; } }, - {name:"Heal immediately",otLangName:{chs:"玩家立刻回血",cht:"玩家立刻回血"}, + {name:"Reduce Damage for all Attr(sort by rate)",otLangName:{chs:"全属减伤 buff(按减伤比率排序)",cht:"全屬減傷 buff(按減傷比率排序)"}, function:cards=>{ + const searchTypeArray = [3,156]; return cards.filter(card=>{ - const heal = healImmediately_Rate(card); - return Object.values(heal).some(v=>v); - }) - .sort((a,b)=>{ - const a_h = healImmediately_Rate(a), b_h = healImmediately_Rate(b); - const a_vs = Object.values(a_h), b_vs = Object.values(b_h); - const a_i = a_vs.findIndex(v=>v), b_i = b_vs.findIndex(v=>v); - let sortNum = a_i - b_i; + const skill = getCardActiveSkill(card, searchTypeArray); + if (!skill) return false; + if (skill.type == 156) + return skill.params[4]==3; + else + return true; + }).sort((a,b)=>{ + const a_s = getCardActiveSkill(a, searchTypeArray), b_s = getCardActiveSkill(b, searchTypeArray); + let sortNum = b_s.type - a_s.type; //先分开宝石姬与非宝石姬 if (!sortNum) { - sortNum = a_vs[a_i] - b_vs[b_i]; + let a_pC = a_s.params[a_s.type == 3 ? 1 : 5],b_pC = b_s.params[b_s.type == 3 ? 1 : 5]; + sortNum = a_pC - b_pC; } return sortNum; }); }, addition:card=>{ - const heal = healImmediately_Rate(card); - let strArr = []; - if (heal.scale) - strArr.push(`${heal.scale}%最大HP`); - if (heal.const) - strArr.push(`${heal.const.bigNumberToString()}点HP`); - if (heal.selfRcv) - strArr.push(`${heal.selfRcv/100}倍回复力`); - if (heal.vampire) - strArr.push(`${heal.vampire}%伤害`); - return strArr.join(','); + const searchTypeArray = [3,156]; + const skill = getCardActiveSkill(card, searchTypeArray); + if (!skill) return; + const sk = skill.params; + + const fragment = document.createDocumentFragment(); + if (skill.type == 156) + { + fragment.appendChild(document.createTextNode(`${sk[5]}%/`)); + const awokenArr = sk.slice(1,4).filter(s=>s>0); + fragment.appendChild(creatAwokenList(awokenArr)); + fragment.appendChild(document.createTextNode(`×${sk[0]}T`)); + }else + { + fragment.appendChild(document.createTextNode(`${sk[1]}%×${sk[0]}T`)); + } + return fragment; } }, - {name:"Change team maximum HP",otLangName:{chs:"队伍最大 HP 变化",cht:"队伍最大 HP 變化"}, + {name:"Reduce 100% Damage(invincible, sort by turns)",otLangName:{chs:"全属减伤 100%(无敌)",cht:"全屬減傷 100%(無敵)"}, function:cards=>{ - const searchTypeArray = [237]; + const searchTypeArray = [3]; return cards.filter(card=>{ const skill = getCardActiveSkill(card, searchTypeArray); - return skill; - }).sort((a,b)=>sortByParams(a,b,searchTypeArray,1)); + return skill && skill.params[1]>=100; + }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); }, addition:card=>{ - const searchTypeArray = [237]; + const searchTypeArray = [3]; const skill = getCardActiveSkill(card, searchTypeArray); if (!skill) return; const sk = skill.params; - return `最大HP ${sk[1].bigNumberToString()}%×${sk[0]}T`; - } - }, - {name:"Damage self(sort by rate)",otLangName:{chs:"玩家自残(HP 减少,按减少比率排序)",cht:"玩家自殘(HP 減少,按減少比率排序)"}, - function:cards=>{ - return cards.filter(card=>damageSelf_Rate(card)>0) - .sort((a,b)=>damageSelf_Rate(a) - damageSelf_Rate(b)); - }, - addition:card=>{ - let rate = damageSelf_Rate(card); - if (rate < 100) - return `减少${rate}%`; - else - return `减少到1`; + return `无敌×${sk[0]}T`; } }, - ]}, - {group:true,name:"-----Damage Enemy - Gravity-----",otLangName:{chs:"-----对敌直接伤害类-重力-----",cht:"-----對敵直接傷害類-重力-----"}, functions: [ - {name:"Gravity - Any(sort by rate)",otLangName:{chs:"重力-任意(按比例排序)",cht:"重力-任意(按比例排序)"}, - function:cards=>{ - const searchTypeArray = [6, 161]; - return cards.filter(card=>{ - const skill = getCardActiveSkill(card, searchTypeArray); - return skill; - }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); - }, - addition: gravity_Addition - }, - {name:"Gravity - Current HP(sort by rate)",otLangName:{chs:"重力-敌人当前血量(按比例排序)",cht:"重力-敵人當前血量(按比例排序)"}, - function:cards=>{ - const searchTypeArray = [6]; - return cards.filter(card=>{ - const skill = getCardActiveSkill(card, searchTypeArray); - return skill; - }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); - }, - addition: gravity_Addition - }, - {name:"Gravity - Max HP(sort by rate)",otLangName:{chs:"重力-敌人最大血量(按比例排序)",cht:"重力-敵人最大血量(按比例排序)"}, + {name:"Reduce all Damage for designated Attr(sort by turns)",otLangName:{chs:"限属减伤 buff(按回合排序排序)",cht:"限屬減傷 buff(按回合排序排序)"}, function:cards=>{ - const searchTypeArray = [161]; + const searchTypeArray = [21]; return cards.filter(card=>{ const skill = getCardActiveSkill(card, searchTypeArray); return skill; }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); }, - addition: gravity_Addition - }, - ]}, - {group:true,name:"-----Damage Enemy - Fixed damage-----",otLangName:{chs:"-----对敌直接伤害类-无视防御固伤-----",cht:"-----對敵直接傷害類-無視防禦固傷-----"}, functions: [ - {name:"Fixed damage - Any(sort by damage)",otLangName:{chs:"无视防御固伤-任意(按总伤害排序)",cht:"無視防禦固傷-任意(按總傷害排序)"}, - function:cards=>{ - const searchTypeArray = [55,188,56]; - return cards.filter(card=>{ - const skill = getCardActiveSkill(card, searchTypeArray); - return skill; - }).sort((a,b)=>{ - const a_ss = getCardActiveSkills(a, searchTypeArray), b_ss = getCardActiveSkills(b, searchTypeArray); - let a_pC = a_ss.reduce((p,v)=>p+v.params[0],0), b_pC = b_ss.reduce((p,v)=>p+v.params[0],0); - return a_pC - b_pC; - }); - }, - addition:dixedDamage_Addition - }, - {name:"Fixed damage - Single(sort by damage)",otLangName:{chs:"无视防御固伤-单体(按总伤害排序)",cht:"無視防禦固傷-單體(按總傷害排序)"}, - function:cards=>{ - const searchTypeArray = [55,188]; - return cards.filter(card=>{ - const skill = getCardActiveSkill(card, searchTypeArray); - return skill; - }).sort((a,b)=>{ - const a_ss = getCardActiveSkills(a, searchTypeArray), b_ss = getCardActiveSkills(b, searchTypeArray); - let a_pC = a_ss.reduce((p,v)=>p+v.params[0],0), b_pC = b_ss.reduce((p,v)=>p+v.params[0],0); - return a_pC - b_pC; - }); - }, - addition:dixedDamage_Addition + addition:card=>{ + const searchTypeArray = [21]; + const skill = getCardActiveSkill(card, searchTypeArray); + if (!skill) return; + const sk = skill.params; + + const colors = [sk[1]]; + const fragment = document.createDocumentFragment(); + fragment.appendChild(document.createTextNode(`-`)); + fragment.appendChild(createOrbsList(colors)); + fragment.appendChild(document.createTextNode(`×${sk[0]}T`)); + + return fragment; + } }, - {name:"Fixed damage - Mass(sort by damage)",otLangName:{chs:"无视防御固伤-全体(按伤害数排序)",cht:"無視防禦固傷-全體(按傷害數排序)"}, + {name:"Mass Attacks(sort by turns)",otLangName:{chs:"变为全体攻击(按回合数排序)",cht:"變爲全體攻擊(按回合數排序)"}, function:cards=>{ - const searchTypeArray = [56]; + const searchTypeArray = [51]; return cards.filter(card=>{ const skill = getCardActiveSkill(card, searchTypeArray); return skill; }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); }, - addition:dixedDamage_Addition - }, - ]}, - {group:true,name:"-----Damage Enemy - Numerical damage-----",otLangName:{chs:"-----对敌直接伤害类-大炮-----",cht:"-----對敵直接傷害類-大炮-----"}, functions: [ - {name:"Numerical ATK - Target - Single",otLangName:{chs:"大炮-对象-敌方单体",cht:"大炮-對象-敵方單體"}, - function:cards=>cards.filter(card=>{ - const searchTypeArray = [2,35,37,59,84,86,110,115,144]; - function isSingle(skill) - { - if (skill.type == 110) - return Boolean(skill.params[0]); - else if (skill.type == 144) - return Boolean(skill.params[2]); - else - return true; - } - const skill = getCardActiveSkill(card, searchTypeArray); - return skill && isSingle(skill); - }), - addition: numericalATK_Addition - }, - {name:"Numerical ATK - Target - Mass",otLangName:{chs:"大炮-对象-敌方全体",cht:"大炮-對象-敵方全體"}, - function:cards=>cards.filter(card=>{ - const searchTypeArray = [0,1,58,85,87,110,143,144]; - function isAll(skill) - { - if (skill.type == 110) - return !Boolean(skill.params[0]); - else if (skill.type == 144) - return !Boolean(skill.params[2]); - else - return true; - } - const skill = getCardActiveSkill(card, searchTypeArray); - return skill && skill.id!=0 && isAll(skill); - }), - addition: numericalATK_Addition - }, - {name:"Numerical ATK - Target - Designate Attr",otLangName:{chs:"大炮-对象-指定属性敌人",cht:"大炮-對象-指定屬性敵人"}, - function:cards=>cards.filter(card=>{ - const searchTypeArray = [42]; - const skill = getCardActiveSkill(card, searchTypeArray); - return skill; - }) - }, - {name:"Numerical ATK - Attr - Actors self",otLangName:{chs:"大炮-属性-释放者自身",cht:"大炮-屬性-釋放者自身"}, - function:cards=>cards.filter(card=>{ - const searchTypeArray = [2,35]; + addition:card=>{ + const searchTypeArray = [51]; const skill = getCardActiveSkill(card, searchTypeArray); - return skill; - }) + if (!skill) return; + const sk = skill.params; + return `全体×${sk[0]}T`; + } }, - - {name:"Numerical ATK - Damage - Rate by Actors self ATK(sort by rate)",otLangName:{chs:"大炮-伤害-自身攻击倍率(按倍率排序,范围取小)",cht:"大炮-傷害-自身攻擊倍率(按倍率排序,範圍取小)"}, - function:cards=>cards.filter(card=>{ - const searchTypeArray = [0,2,35,37,58,59,84,85,115]; + ]}, + {group:true,name:"-----For Enemy-----",otLangName:{chs:"-----对敌 buff 类-----",cht:"-----對敵 buff 類-----"}, functions: [ + {name:"Menace(sort by turns)",otLangName:{chs:"威吓(按推迟回合排序)",cht:"威嚇(按推遲迴合排序)"}, + function:cards=>{ + const searchTypeArray = [18]; + return cards.filter(card=>{ + const skill = getCardActiveSkill(card, searchTypeArray); + return skill; + }).sort((a,b)=>sortByParams(a,b,searchTypeArray,0)); + }, + addition:card=>{ + const searchTypeArray = [18]; const skill = getCardActiveSkill(card, searchTypeArray); - return skill && skill.id!=0; - }).sort((a,b)=>{ - const searchTypeArray = [0,2,35,37,58,59,84,85,115]; - const a_s = getCardActiveSkill(a, searchTypeArray), b_s = getCardActiveSkill(b, searchTypeArray); - function getNumber(skill) - { - const sk = skill.params; - switch(skill.type) - { - case 0: - case 37: - case 58: - case 59: - case 84: - case 85: - case 115: - return sk[1]; - case 2: - case 35: - return sk[0]; - default: - return 0; - } - } - let a_pC = getNumber(a_s),b_pC = getNumber(b_s); - return a_pC - b_pC; - }), - addition: numericalATK_Addition + if (!skill) return; + const sk = skill.params; + return document.createTextNode(`威吓×${sk[0]}T`); + } }, - {name:"Numerical ATK - Damage - Fixed Attr Number (sort by number)",otLangName:{chs:"大炮-伤害-指定属性数值(按数值排序)",cht:"大炮-傷害-指定屬性數值(按數值排序)"}, - function:cards=>cards.filter(card=>{ - const searchTypeArray = [1,42,86,87]; + {name:"Reduces enemies' DEF(sort by rate)",otLangName:{chs:"破防(按防御减少比例排序)",cht:"破防(按防禦減少比例排序)"}, + function:cards=>{ + const searchTypeArray = [19]; + return cards.filter(card=>{ + const skill = getCardActiveSkill(card, searchTypeArray); + return skill; + }).sort((a,b)=>sortByParams(a,b,searchTypeArray,1)); + }, + addition:card=>{ + const searchTypeArray = [19]; const skill = getCardActiveSkill(card, searchTypeArray); - return skill; - }).sort((a,b)=>{ - const searchTypeArray = [1,42,86,87]; - const a_s = getCardActiveSkill(a, searchTypeArray), b_s = getCardActiveSkill(b, searchTypeArray); - function getNumber(skill) - { - const sk = skill.params; - switch(skill.type) - { - case 1: - case 86: - case 87: - return sk[1]; - case 42: - return sk[2]; - default: - return 0; - } - } - let a_pC = getNumber(a_s),b_pC = getNumber(b_s); - return a_pC - b_pC; - }), - addition: numericalATK_Addition + if (!skill) return; + const sk = skill.params; + return `破防${sk[1]}%`; + } }, - {name:"Numerical ATK - Damage - By remaining HP (sort by rate at HP 1)",otLangName:{chs:"大炮-伤害-根据剩余血量(按 1 HP 时倍率排序)",cht:"大炮-傷害-根據剩餘血量(按 1 HP 時倍率排序)"}, + {name:"Voids enemies' DEF(sort by turns)",otLangName:{chs:"100% 破防(按回合排序)",cht:"100% 破防(按回合排序)"}, function:cards=>{ - const searchTypeArray = [110]; + const searchTypeArray = [19]; return cards.filter(card=>{ const skill = getCardActiveSkill(card, searchTypeArray); - return skill; - }).sort((a,b)=>sortByParams(a,b,searchTypeArray,3)); + return skill && skill.params[1]>=100; + }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); }, - addition: numericalATK_Addition + addition:card=>{ + const searchTypeArray = [19]; + const skill = getCardActiveSkill(card, searchTypeArray); + if (!skill) return; + const sk = skill.params; + return `全破×${sk[0]}T`; + } }, - {name:"Numerical ATK - Damage - Team total HP (sort by rate)",otLangName:{chs:"大炮-伤害-队伍总 HP(按倍率排序)",cht:"大炮-傷害-隊伍總 HP(按倍率排序)"}, + {name:"Poisons enemies(sort by rate)",otLangName:{chs:"中毒(按毒伤比率排序)",cht:"中毒(按毒傷比率排序)"}, function:cards=>{ - const searchTypeArray = [143]; + const searchTypeArray = [4]; return cards.filter(card=>{ const skill = getCardActiveSkill(card, searchTypeArray); return skill; }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); }, - addition: numericalATK_Addition + addition:card=>{ + const searchTypeArray = [4]; + const skill = getCardActiveSkill(card, searchTypeArray); + if (!skill) return; + const sk = skill.params; + return `攻击力×${sk[0]/100}倍`; + } }, - {name:"Numerical ATK - Damage - Team attrs ATK (sort by rate)",otLangName:{chs:"大炮-伤害-队伍某属性总攻击(按倍率排序)",cht:"大炮-傷害-隊伍某屬性總攻擊(按倍率排序)"}, + {name:"Change enemies's Attr(sort by attr)",otLangName:{chs:"改变敌人属性(按属性排序)",cht:"改變敵人屬性(按屬性排序)"}, function:cards=>{ - const searchTypeArray = [144]; + return cards.filter(card=>{ + return changeEnemiesAttr_Attr(card).attr != null; + }).sort((a,b)=>{ + let a_pC = changeEnemiesAttr_Attr(a),b_pC = changeEnemiesAttr_Attr(b); + return a_pC.attr - b_pC.attr; + }) + }, + addition:card=>{ + let change = changeEnemiesAttr_Attr(card); + const fragment = document.createDocumentFragment(); + fragment.appendChild(document.createTextNode(`敌→`)); + fragment.appendChild(createOrbsList(change.attr)); + if (change.turns > 0) + fragment.appendChild(document.createTextNode(`×${change.turns}T`)); + return fragment; + } + }, + {name:"Counterattack buff(sort by rate)",otLangName:{chs:"受伤反击 buff(按倍率排序)",cht:"受傷反擊 buff(按倍率排序)"}, + function:cards=>{ + const searchTypeArray = [60]; return cards.filter(card=>{ const skill = getCardActiveSkill(card, searchTypeArray); return skill; }).sort((a,b)=>sortByParams(a,b,searchTypeArray,1)); }, - addition: numericalATK_Addition - }, - {name:"Numerical ATK - Special - Vampire",otLangName:{chs:"大炮-特殊-吸血",cht:"大炮-特殊-吸血"}, - function:cards=>cards.filter(card=>{ - const searchTypeArray = [35,115]; + addition:card=>{ + const searchTypeArray = [60]; const skill = getCardActiveSkill(card, searchTypeArray); - return skill; - }) + if (!skill) return; + const sk = skill.params; + + const fragment = document.createDocumentFragment(); + fragment.appendChild(document.createTextNode(`${sk[1]/100}倍`)); + fragment.appendChild(createOrbsList(sk[2])); + fragment.appendChild(document.createTextNode(`×${sk[0]}T`)); + + return fragment; + } }, ]}, {group:true,name:"-----Board States Change-----",otLangName:{chs:"-----改变板面状态类-----",cht:"-----改變板面狀態類-----"}, functions: [ @@ -2671,60 +2384,89 @@ const specialSearchFunctions = (function() { } }, ]}, - {group:true,name:"-----Orbs States Change-----",otLangName:{chs:"-----改变宝珠状态类-----",cht:"-----改變寶珠狀態類-----"}, functions: [ - {name:"Unlock",otLangName:{chs:"解锁",cht:"解鎖"}, - function:cards=>cards.filter(card=>{ - const searchTypeArray = [172]; + {group:true,name:"-----Orbs Drop-----",otLangName:{chs:"----- 珠子掉落 类-----",cht:"----- 珠子掉落 類-----"}, functions: [ + {name:"Drop locked orbs(any color, sort by turns)",otLangName:{chs:"掉锁(不限色,按回合排序)",cht:"掉鎖(不限色,按回合排序)"}, + function:cards=>{ + const searchTypeArray = [205]; + return cards.filter(card=>{ + const skill = getCardActiveSkill(card, searchTypeArray); + return skill; + }).sort((a,b)=>sortByParams(a,b,searchTypeArray,1)); + }, + addition:dropLock_Addition + }, + {name:"Drop locked orbs(≥5 color, sort by turns)",otLangName:{chs:"掉锁5色+心或全部(按回合排序)",cht:"掉鎖5色+心或全部(按回合排序)"}, + function:cards=>{ + const searchTypeArray = [205]; + return cards.filter(card=>{ + const skill = getCardActiveSkill(card, searchTypeArray); + return skill && (skill.params[0] & 63) === 63; + }).sort((a,b)=>sortByParams(a,b,searchTypeArray,1)); + }, + addition:dropLock_Addition + }, + {name:"Drop Enhanced Orbs(sort by turns)",otLangName:{chs:"掉落强化宝珠(按回合排序)",cht:"掉落強化寶珠(按回合排序)"}, + function:cards=>{ + const searchTypeArray = [180]; + return cards.filter(card=>{ + const skill = getCardActiveSkill(card, searchTypeArray); + return skill; + }).sort((a,b)=>sortByParams(a,b,searchTypeArray,1)); + }, + addition:card=>{ + const searchTypeArray = [180]; const skill = getCardActiveSkill(card, searchTypeArray); - return skill; - }) + if (!skill) return; + const sk = skill.params; + return `${sk[1]}%×${sk[0]}T`; + } }, - {name:"Lock(Any color)",otLangName:{chs:"上锁(不限色)",cht:"上鎖(不限色)"}, + {name:"Drop rate increases",otLangName:{chs:"掉落率提升",cht:"掉落率提升"}, function:cards=>cards.filter(card=>{ - const searchTypeArray = [152]; + const searchTypeArray = [126]; const skill = getCardActiveSkill(card, searchTypeArray); return skill; }), - addition:lock_Addition + addition:dropOrb_Addition }, - {name:"Lock(≥5 color)",otLangName:{chs:"上锁5色+心或全部",cht:"上鎖5色+心或全部"}, + {name:"Drop rate - Attr. - Jammers/Poison",otLangName:{chs:"掉落率提升-属性-毒、废(顶毒)",cht:"掉落率提升-屬性-毒、廢(頂毒)"}, function:cards=>cards.filter(card=>{ - const searchTypeArray = [152]; - const skill = getCardActiveSkill(card, searchTypeArray); - return skill && (skill.params[0] & 63) === 63; + const searchTypeArray = [126]; + const skill = getCardActiveSkill(card, searchTypeArray); + return skill && (skill.params[0] & 960); // 960 = 二进制 1111000000 }), - addition:lock_Addition + addition:dropOrb_Addition }, - {name:"Enhanced Orbs",otLangName:{chs:"强化宝珠",cht:"強化寶珠"}, - function:cards=>{ - const searchTypeArray = [52,91,140]; - return cards.filter(card=>{ + {name:"Drop rate - 99 turns",otLangName:{chs:"掉落率提升-持续99回合",cht:"掉落率提升-持續99回合"}, + function:cards=>cards.filter(card=>{ + const searchTypeArray = [126]; const skill = getCardActiveSkill(card, searchTypeArray); - return skill; - }); - }, - addition:card=>{ - const searchTypeArray = [52,91,140]; - const skill = getCardActiveSkill(card, searchTypeArray); - if (!skill) return; - const sk = skill.params; - let attrs = []; - switch (skill.type) - { - case 52:{ - attrs.push(sk[0]); break; - } - case 91:{ - attrs = sk.slice(0,-1); break; - } - case 140:{ - attrs = flags(sk[0]); break; - } - } - const fragment = document.createDocumentFragment(); - fragment.appendChild(document.createTextNode(`强化`)); - fragment.appendChild(createOrbsList(attrs)); - return fragment; + return skill && skill.params[1] >= 99; + }), + addition:dropOrb_Addition + }, + {name:"Drop rate - 100% rate",otLangName:{chs:"掉落率提升-100%几率",cht:"掉落率提升-100%幾率"}, + function:cards=>cards.filter(card=>{ + const searchTypeArray = [126]; + const skill = getCardActiveSkill(card, searchTypeArray); + return skill && skill.params[3] == 100; + }), + addition:dropOrb_Addition + }, + {name:"Drop Nail Orbs(sort by turns)",otLangName:{chs:"掉落钉珠(按回合排序)",cht:"掉落釘珠(按回合排序)"}, + function:cards=>{ + const searchTypeArray = [226]; + return cards.filter(card=>{ + const skill = getCardActiveSkill(card, searchTypeArray); + return skill; + }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); + }, + addition:card=>{ + const searchTypeArray = [226]; + const skill = getCardActiveSkill(card, searchTypeArray); + if (!skill) return; + const sk = skill.params; + return `📌${sk[1]}%×${sk[0]}T`; } }, ]}, @@ -3184,28 +2926,257 @@ const specialSearchFunctions = (function() { }) }, ]}, + {group:true,name:"-----Damage Enemy - Gravity-----",otLangName:{chs:"-----对敌直接伤害类-重力-----",cht:"-----對敵直接傷害類-重力-----"}, functions: [ + {name:"Gravity - Any(sort by rate)",otLangName:{chs:"重力-任意(按比例排序)",cht:"重力-任意(按比例排序)"}, + function:cards=>{ + const searchTypeArray = [6, 161]; + return cards.filter(card=>{ + const skill = getCardActiveSkill(card, searchTypeArray); + return skill; + }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); + }, + addition: gravity_Addition + }, + {name:"Gravity - Current HP(sort by rate)",otLangName:{chs:"重力-敌人当前血量(按比例排序)",cht:"重力-敵人當前血量(按比例排序)"}, + function:cards=>{ + const searchTypeArray = [6]; + return cards.filter(card=>{ + const skill = getCardActiveSkill(card, searchTypeArray); + return skill; + }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); + }, + addition: gravity_Addition + }, + {name:"Gravity - Max HP(sort by rate)",otLangName:{chs:"重力-敌人最大血量(按比例排序)",cht:"重力-敵人最大血量(按比例排序)"}, + function:cards=>{ + const searchTypeArray = [161]; + return cards.filter(card=>{ + const skill = getCardActiveSkill(card, searchTypeArray); + return skill; + }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); + }, + addition: gravity_Addition + }, + ]}, + {group:true,name:"-----Damage Enemy - Fixed damage-----",otLangName:{chs:"-----对敌直接伤害类-无视防御固伤-----",cht:"-----對敵直接傷害類-無視防禦固傷-----"}, functions: [ + {name:"Fixed damage - Any(sort by damage)",otLangName:{chs:"无视防御固伤-任意(按总伤害排序)",cht:"無視防禦固傷-任意(按總傷害排序)"}, + function:cards=>{ + const searchTypeArray = [55,188,56]; + return cards.filter(card=>{ + const skill = getCardActiveSkill(card, searchTypeArray); + return skill; + }).sort((a,b)=>{ + const a_ss = getCardActiveSkills(a, searchTypeArray), b_ss = getCardActiveSkills(b, searchTypeArray); + let a_pC = a_ss.reduce((p,v)=>p+v.params[0],0), b_pC = b_ss.reduce((p,v)=>p+v.params[0],0); + return a_pC - b_pC; + }); + }, + addition:dixedDamage_Addition + }, + {name:"Fixed damage - Single(sort by damage)",otLangName:{chs:"无视防御固伤-单体(按总伤害排序)",cht:"無視防禦固傷-單體(按總傷害排序)"}, + function:cards=>{ + const searchTypeArray = [55,188]; + return cards.filter(card=>{ + const skill = getCardActiveSkill(card, searchTypeArray); + return skill; + }).sort((a,b)=>{ + const a_ss = getCardActiveSkills(a, searchTypeArray), b_ss = getCardActiveSkills(b, searchTypeArray); + let a_pC = a_ss.reduce((p,v)=>p+v.params[0],0), b_pC = b_ss.reduce((p,v)=>p+v.params[0],0); + return a_pC - b_pC; + }); + }, + addition:dixedDamage_Addition + }, + {name:"Fixed damage - Mass(sort by damage)",otLangName:{chs:"无视防御固伤-全体(按伤害数排序)",cht:"無視防禦固傷-全體(按傷害數排序)"}, + function:cards=>{ + const searchTypeArray = [56]; + return cards.filter(card=>{ + const skill = getCardActiveSkill(card, searchTypeArray); + return skill; + }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); + }, + addition:dixedDamage_Addition + }, + ]}, + {group:true,name:"-----Damage Enemy - Numerical damage-----",otLangName:{chs:"-----对敌直接伤害类-大炮-----",cht:"-----對敵直接傷害類-大炮-----"}, functions: [ + {name:"Numerical ATK - Target - Single",otLangName:{chs:"大炮-对象-敌方单体",cht:"大炮-對象-敵方單體"}, + function:cards=>cards.filter(card=>{ + const searchTypeArray = [2,35,37,59,84,86,110,115,144]; + function isSingle(skill) + { + if (skill.type == 110) + return Boolean(skill.params[0]); + else if (skill.type == 144) + return Boolean(skill.params[2]); + else + return true; + } + const skill = getCardActiveSkill(card, searchTypeArray); + return skill && isSingle(skill); + }), + addition: numericalATK_Addition + }, + {name:"Numerical ATK - Target - Mass",otLangName:{chs:"大炮-对象-敌方全体",cht:"大炮-對象-敵方全體"}, + function:cards=>cards.filter(card=>{ + const searchTypeArray = [0,1,58,85,87,110,143,144]; + function isAll(skill) + { + if (skill.type == 110) + return !Boolean(skill.params[0]); + else if (skill.type == 144) + return !Boolean(skill.params[2]); + else + return true; + } + const skill = getCardActiveSkill(card, searchTypeArray); + return skill && skill.id!=0 && isAll(skill); + }), + addition: numericalATK_Addition + }, + {name:"Numerical ATK - Target - Designate Attr",otLangName:{chs:"大炮-对象-指定属性敌人",cht:"大炮-對象-指定屬性敵人"}, + function:cards=>cards.filter(card=>{ + const searchTypeArray = [42]; + const skill = getCardActiveSkill(card, searchTypeArray); + return skill; + }) + }, + {name:"Numerical ATK - Attr - Actors self",otLangName:{chs:"大炮-属性-释放者自身",cht:"大炮-屬性-釋放者自身"}, + function:cards=>cards.filter(card=>{ + const searchTypeArray = [2,35]; + const skill = getCardActiveSkill(card, searchTypeArray); + return skill; + }) + }, + + {name:"Numerical ATK - Damage - Rate by Actors self ATK(sort by rate)",otLangName:{chs:"大炮-伤害-自身攻击倍率(按倍率排序,范围取小)",cht:"大炮-傷害-自身攻擊倍率(按倍率排序,範圍取小)"}, + function:cards=>cards.filter(card=>{ + const searchTypeArray = [0,2,35,37,58,59,84,85,115]; + const skill = getCardActiveSkill(card, searchTypeArray); + return skill && skill.id!=0; + }).sort((a,b)=>{ + const searchTypeArray = [0,2,35,37,58,59,84,85,115]; + const a_s = getCardActiveSkill(a, searchTypeArray), b_s = getCardActiveSkill(b, searchTypeArray); + function getNumber(skill) + { + const sk = skill.params; + switch(skill.type) + { + case 0: + case 37: + case 58: + case 59: + case 84: + case 85: + case 115: + return sk[1]; + case 2: + case 35: + return sk[0]; + default: + return 0; + } + } + let a_pC = getNumber(a_s),b_pC = getNumber(b_s); + return a_pC - b_pC; + }), + addition: numericalATK_Addition + }, + {name:"Numerical ATK - Damage - Fixed Attr Number (sort by number)",otLangName:{chs:"大炮-伤害-指定属性数值(按数值排序)",cht:"大炮-傷害-指定屬性數值(按數值排序)"}, + function:cards=>cards.filter(card=>{ + const searchTypeArray = [1,42,86,87]; + const skill = getCardActiveSkill(card, searchTypeArray); + return skill; + }).sort((a,b)=>{ + const searchTypeArray = [1,42,86,87]; + const a_s = getCardActiveSkill(a, searchTypeArray), b_s = getCardActiveSkill(b, searchTypeArray); + function getNumber(skill) + { + const sk = skill.params; + switch(skill.type) + { + case 1: + case 86: + case 87: + return sk[1]; + case 42: + return sk[2]; + default: + return 0; + } + } + let a_pC = getNumber(a_s),b_pC = getNumber(b_s); + return a_pC - b_pC; + }), + addition: numericalATK_Addition + }, + {name:"Numerical ATK - Damage - By remaining HP (sort by rate at HP 1)",otLangName:{chs:"大炮-伤害-根据剩余血量(按 1 HP 时倍率排序)",cht:"大炮-傷害-根據剩餘血量(按 1 HP 時倍率排序)"}, + function:cards=>{ + const searchTypeArray = [110]; + return cards.filter(card=>{ + const skill = getCardActiveSkill(card, searchTypeArray); + return skill; + }).sort((a,b)=>sortByParams(a,b,searchTypeArray,3)); + }, + addition: numericalATK_Addition + }, + {name:"Numerical ATK - Damage - Team total HP (sort by rate)",otLangName:{chs:"大炮-伤害-队伍总 HP(按倍率排序)",cht:"大炮-傷害-隊伍總 HP(按倍率排序)"}, + function:cards=>{ + const searchTypeArray = [143]; + return cards.filter(card=>{ + const skill = getCardActiveSkill(card, searchTypeArray); + return skill; + }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); + }, + addition: numericalATK_Addition + }, + {name:"Numerical ATK - Damage - Team attrs ATK (sort by rate)",otLangName:{chs:"大炮-伤害-队伍某属性总攻击(按倍率排序)",cht:"大炮-傷害-隊伍某屬性總攻擊(按倍率排序)"}, + function:cards=>{ + const searchTypeArray = [144]; + return cards.filter(card=>{ + const skill = getCardActiveSkill(card, searchTypeArray); + return skill; + }).sort((a,b)=>sortByParams(a,b,searchTypeArray,1)); + }, + addition: numericalATK_Addition + }, + {name:"Numerical ATK - Special - Vampire",otLangName:{chs:"大炮-特殊-吸血",cht:"大炮-特殊-吸血"}, + function:cards=>cards.filter(card=>{ + const searchTypeArray = [35,115]; + const skill = getCardActiveSkill(card, searchTypeArray); + return skill; + }) + }, + ]}, {group:true,name:"-----Others Active Skills-----",otLangName:{chs:"-----其他主动技-----",cht:"-----其他主動技-----"}, functions: [ {name:"1 CD",otLangName:{chs:"1 CD",cht:"1 CD"}, function:cards=>cards.filter(card=>{ - if (card.activeSkillId == 0) return false; - const skill = Skills[card.activeSkillId]; - return skill.initialCooldown - (skill.maxLevel - 1) <= 1; + if (card.activeSkillId == 0) return false; + const skill = Skills[card.activeSkillId]; + return skill.initialCooldown - (skill.maxLevel - 1) <= 1; }) }, - {name:"Less than 4 can be cycled use(Inaccurate)",otLangName:{chs:"除 1 CD 外,4 个以下能永动开(可能不精确)",cht:"除 1 CD 外,4 個以下能永動開(可能不精確)"}, + {name:"Less than 4 card can be loop use(Inaccurate)",otLangName:{chs:"除 1 CD 外,4 个队员以下能循环开(可能不精确)",cht:"除 1 CD 外,4 個隊員以下能循環開(可能不精確)"}, function:cards=>cards.filter(card=>{ - if (card.activeSkillId == 0) return false; - const skill = Skills[card.activeSkillId]; - const minCD = skill.initialCooldown - (skill.maxLevel - 1); //主动技最小的CD - let realCD = minCD; - - const searchTypeArray = [14]; - const subSkill = getCardLeaderSkill(card, searchTypeArray); - if (subSkill) - { - realCD -= subSkill.params[0] * 3; - } - return minCD > 1 && realCD <= 4; + if (card.activeSkillId == 0) return false; + const skill = Skills[card.activeSkillId]; + const minCD = skill.initialCooldown - (skill.maxLevel - 1); //主动技最小的CD + let realCD = minCD; + + const searchTypeArray = [14]; + const subSkill = getCardActiveSkill(card, searchTypeArray); + if (subSkill) + { + realCD -= subSkill.params[0] * 3; + } + return minCD > 1 && realCD <= 4; + }) + }, + {name:"Buff rounds equal to card's CD, being able to keep looping",otLangName:{chs:"Buff 回合等于自身 CD,能保持循环",cht:"Buff 回合等於自身 CD,能保持循環"}, + function:cards=>cards.filter(card=>{ + if (card.activeSkillId == 0) return false; + const skill = Skills[card.activeSkillId]; + const cd = skill.initialCooldown - (skill.maxLevel - 1); //最短CD + return false; }) }, {name:"Time pause(sort by time)",otLangName:{chs:"时间暂停(按停止时间排序)",cht:"時間暫停(按停止時間排序)"},