diff --git a/multi.html b/multi.html
index 14613879..d206b06d 100644
--- a/multi.html
+++ b/multi.html
@@ -1246,10 +1246,10 @@ const teamsCount = 2;
-
-
+
@@ -1768,7 +1768,11 @@ const teamsCount = 2;
diff --git a/script-json_data.js b/script-json_data.js
index f40349c1..3d423c57 100644
--- a/script-json_data.js
+++ b/script-json_data.js
@@ -15,6 +15,7 @@
let localTranslating = {
webpage_title: `P&D ${teamsCount}P Formation Maker`,
addition_display: "💬",
+ has_sub_filter: "📁",
title_blank: "Input Formation Title",
detail_blank: "Input Detail",
force_reload_data: `Force refresh data`,
@@ -1551,503 +1552,7 @@ const specialSearchFunctions = (function() {
const functions = [
{name:"No Filter",otLangName:{chs:"不做筛选",cht:"不做篩選"},function:cards=>cards},
- {group:true,name:"======Active Skill======",otLangName:{chs:"======主动技======",cht:"======主動技======"}, functions: [
- ]},
- {group:true,name:"-----Voids Absorption-----",otLangName:{chs:"-----破吸类-----",cht:"-----破吸類-----"}, functions: [
- {name:"Voids attribute absorption",otLangName:{chs:"破属吸 buff",cht:"破屬吸 buff"},
- function:cards=>{
- const attrName = "attr-absorb";
- return cards.filter(card=>{
- const turns = voidsAbsorption_Turns(card);
- return turns[attrName] > 0;
- }).sort((a,b)=>{
- const a_s = voidsAbsorption_Turns(a), b_s = voidsAbsorption_Turns(b);
- let a_pC = a_s[attrName], b_pC = b_s[attrName];
- return a_pC - b_pC;
- });
- },
- addition:voidsAbsorption_Addition
- },
- {name:"Voids damage absorption",otLangName:{chs:"破伤吸 buff",cht:"破傷吸 buff"},
- function:cards=>{
- const attrName = "damage-absorb";
- return cards.filter(card=>{
- const turns = voidsAbsorption_Turns(card);
- return turns[attrName] > 0;
- }).sort((a,b)=>{
- const a_s = voidsAbsorption_Turns(a), b_s = voidsAbsorption_Turns(b);
- let a_pC = a_s[attrName], b_pC = b_s[attrName];
- return a_pC - b_pC;
- });
- },
- addition:voidsAbsorption_Addition
- },
- {name:"Pierce through damage void",otLangName:{chs:"贯穿无效盾 buff",cht:"貫穿無效盾 buff"},
- function:cards=>{
- const attrName = "damage-void";
- return cards.filter(card=>{
- const turns = voidsAbsorption_Turns(card);
- return turns[attrName] > 0;
- }).sort((a,b)=>{
- const a_s = voidsAbsorption_Turns(a), b_s = voidsAbsorption_Turns(b);
- let a_pC = a_s[attrName], b_pC = b_s[attrName];
- return a_pC - b_pC;
- });
- },
- addition:voidsAbsorption_Addition
- },
- {name:"Voids combo absorption",otLangName:{chs:"破C吸 buff",cht:"破C吸 buff"},
- function:cards=>{
- const attrName = "combo-absorb";
- return cards.filter(card=>{
- const turns = voidsAbsorption_Turns(card);
- return turns[attrName] > 0;
- }).sort((a,b)=>{
- const a_s = voidsAbsorption_Turns(a), b_s = voidsAbsorption_Turns(b);
- let a_pC = a_s[attrName], b_pC = b_s[attrName];
- return a_pC - b_pC;
- });
- },
- addition:voidsAbsorption_Addition
- },
- {name:"Voids Triple(except combo)",otLangName:{chs:"三破(不含破C)",cht:"三破(不含破C)"},
- function:cards=>{
- return cards.filter(card=>{
- const turns = voidsAbsorption_Turns(card);
- return turns["attr-absorb"] > 0 && turns["damage-absorb"] > 0 && turns["damage-void"] > 0;
- }).sort((a,b)=>{
- const a_s = voidsAbsorption_Turns(a), b_s = voidsAbsorption_Turns(b);
- let a_pC = a_s["attr-absorb"], b_pC = b_s["attr-absorb"];
- return a_pC - b_pC;
- });
- },
- addition:voidsAbsorption_Addition
- },
- ]},
- {group:true,name:"-----Recovers Bind Status-----",otLangName:{chs:"-----解封类-----",cht:"-----解封類-----"}, functions: [
- {
- name:"Unbind menber bind",otLangName:{chs:"解封角色",cht:"解封角色"},
- function:cards=>{
- return cards.filter(card=>{
- const turns = unbind_Turns(card);
- return turns.normal > 0;
- }).sort((a,b)=>{
- const a_s = unbind_Turns(a), b_s = unbind_Turns(b);
- let a_pC = a_s.normal, b_pC = b_s.normal;
- return a_pC - b_pC;
- });
- },
- addition:unbind_Addition
- },
- {
- name:"Unbind awakenings bind",otLangName:{chs:"解觉醒",cht:"解覺醒"},
- function:cards=>{
- return cards.filter(card=>{
- const turns = unbind_Turns(card);
- return turns.awakenings > 0;
- }).sort((a,b)=>{
- const a_s = unbind_Turns(a), b_s = unbind_Turns(b);
- let a_pC = a_s.awakenings, b_pC = b_s.awakenings;
- return a_pC - b_pC;
- });
- },
- addition:unbind_Addition
- },
- {
- name:"Unbind unmatchable",otLangName:{chs:"解禁消珠",cht:"解禁消珠"},
- function:cards=>{
- return cards.filter(card=>{
- const turns = unbind_Turns(card);
- return turns.matches > 0;
- }).sort((a,b)=>{
- const a_s = unbind_Turns(a), b_s = unbind_Turns(b);
- let a_pC = a_s.matches, b_pC = b_s.matches;
- return a_pC - b_pC;
- });
- },
- addition:unbind_Addition
- },
- {
- name:"Unbind Triple",otLangName:{chs:"三解",cht:"三解"},
- function:cards=>{
- return cards.filter(card=>{
- const turns = unbind_Turns(card);
- return turns.normal > 0 && turns.awakenings > 0 && turns.matches > 0;
- }).sort((a,b)=>{
- const a_s = unbind_Turns(a), b_s = unbind_Turns(b);
- let a_pC = a_s.normal, b_pC = b_s.normal;
- return a_pC - b_pC;
- });
- },
- addition:unbind_Addition
- },
- ]},
- {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 = [146];
- return cards.filter(card=>{
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill;
- }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
- },
- addition:card=>{
- const searchTypeArray = [146];
- const skill = getCardActiveSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- const fragment = document.createDocumentFragment();
- fragment.append(createSkillIcon('skill-boost', 'boost-incr'), sk[0]);
- if (sk[1] !== undefined && sk[0]!=sk[1]) fragment.append(`~${sk[1]}`);
- return fragment;
- }
- },
- {name:"↓Reduce skills charge(sort by turns)",otLangName:{chs:"【坐】增加CD(按回合排序)",cht:"【坐】增加CD(按回合排序)"},
- function:cards=>{
- 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 = [218];
- const skill = getCardActiveSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- const fragment = document.createDocumentFragment();
- fragment.append(createSkillIcon('skill-boost', 'boost-decr'), sk[0]);
- if (sk[1] !== undefined && sk[0]!=sk[1]) fragment.append(`~${sk[1]}`);
- return fragment;
- }
- },
- {name:"Change Leader",otLangName:{chs:"更换队长",cht:"更換隊長"},
- function:cards=>{
- const searchTypeArray = [93, 227];
- 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.type - b_s.type;
- });
- },
- addition:card=>{
- const searchTypeArray = [93, 227];
- const skill = getCardActiveSkill(card, searchTypeArray);
- if (!skill) return;
- const fragment = document.createDocumentFragment();
- fragment.append(createSkillIcon('leader-change'));
- skill.type === 227 && fragment.append('换👉');
- return fragment;
- }
- },
- {name:"Increase Damage Cap",otLangName:{chs:"增加伤害上限 buff",cht:"增加傷害上限 buff"},
- function:cards=>{
- const searchTypeArray = [241, 246, 247, 258];
- 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;
- });
- },
- addition:memberCap_Addition
- },
- {name:"Increase Damage Cap - Self",otLangName:{chs:"增加伤害上限 buff - 自身",cht:"增加傷害上限 buff - 自身"},
- function:cards=>{
- const searchTypeArray = [241, 246, 247, 258];
- return cards.filter(card=>{
- const skill = getCardActiveSkill(card, searchTypeArray);
- if (skill?.type === 258) return Boolean(skill.params[2] & 0b1);
- else 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;
- });
- },
- addition:memberCap_Addition
- },
- {name:"Increase Damage Cap - Leader",otLangName:{chs:"增加伤害上限 buff - 队长",cht:"增加傷害上限 buff - 隊長"},
- function:cards=>{
- const searchTypeArray = [258];
- return cards.filter(card=>{
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill && Boolean(skill.params[2] & (0b10 | 0b100));
- }).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;
- });
- },
- addition:memberCap_Addition
- },
- {name:"Increase Damage Cap - Sub",otLangName:{chs:"增加伤害上限 buff - 队员",cht:"增加傷害上限 buff - 隊員"},
- function:cards=>{
- const searchTypeArray = [258];
- return cards.filter(card=>{
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill && Boolean(skill.params[2] & 0b1000);
- }).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;
- });
- },
- addition:memberCap_Addition
- },
- {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] & 0b1);
- }).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] & (0b10 | 0b100));
- }).sort((a,b)=>sortByParams(a, b, searchTypeArray, 2));
- },
- addition:memberATK_Addition
- },
- {name:"Member ATK rate change - Sub",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] & 0b1000);
- }).sort((a,b)=>sortByParams(a, b, searchTypeArray, 2));
- },
- addition:memberATK_Addition
- },
- {name:"Change self's Attr(sort by turns)",otLangName:{chs:"转换自身属性(按回合数排序)",cht:"轉換自身屬性(按回合數排序)"},
- function:cards=>{
- const searchTypeArray = [142];
- return cards.filter(card=>{
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill;
- }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
- },
- addition:card=>{
- const searchTypeArray = [142];
- 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;
- }
- },
- {name:"Bind self active skill",otLangName:{chs:"自封技能 debuff",cht:"自封技能 debuff"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [214];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill;
- }),
- addition:card=>{
- const searchTypeArray = [214];
- const skill = getCardActiveSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- return document.createTextNode(`自封技${sk[0]}T`);
- }
- },
- {name:"Remove assist",otLangName:{chs:"移除武器",cht:"移除武器"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [250];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill;
- })
- },
- ]},
- {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 = [179];
- return cards.filter(card=>{
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill;
- }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
- },
- addition:card=>{
- const searchTypeArray = [179];
- const skill = getCardActiveSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- const fragment = document.createDocumentFragment();
- fragment.append(createSkillIcon('auto-heal'));
- fragment.append(`${sk[1]? sk[1].bigNumberToString() :`${sk[2]}%`}×${sk[0]}T`);
- return fragment;
- }
- },
- {name:"Heal immediately",otLangName:{chs:"玩家立刻回血",cht:"玩家立刻回血"},
- function:cards=>{
- 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;
- if (!sortNum)
- {
- sortNum = a_vs[a_i] - b_vs[b_i];
- }
- return sortNum;
- });
- },
- addition:card=>{
- const heal = healImmediately_Rate(card);
- const fragment = document.createDocumentFragment();
- fragment.append(createSkillIcon('heal', 'hp-incr'));
- if (heal.scale)
- fragment.append(`${heal.scale}%`);
- if (heal.const)
- fragment.append(`${heal.const.bigNumberToString()}点`);
- if (heal.selfRcv)
- fragment.append(`${heal.selfRcv/100}倍回复力`, );
- if (heal.vampire)
- fragment.append(`${heal.vampire}%伤害`);
- return fragment;
- }
- },
- {name:"Change team maximum HP",otLangName:{chs:"队伍最大 HP 变化",cht:"队伍最大 HP 變化"},
- function:cards=>{
- 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 = [237];
- const skill = getCardActiveSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- const fragment = document.createDocumentFragment();
- fragment.append(createSkillIcon('maxhp-locked'), `${sk[1].bigNumberToString()}%×${sk[0]}T`);
- return fragment;
- }
- },
- {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);
- const fragment = document.createDocumentFragment();
- fragment.append(createSkillIcon('heal', 'hp-decr'));
- if (rate < 100)
- fragment.append(`减少${rate}%`);
- else
- fragment.append(`减少到1`);
- return fragment;
- }
- },
- ]},
- {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);
- return skill;
- })
- },
- {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=>{
- const searchTypeArray = [52,91,140];
- return cards.filter(card=>{
- 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 = Bin.unflags(sk[0]); break;
- }
- }
- const fragment = document.createDocumentFragment();
- fragment.appendChild(document.createTextNode(`强化`));
- fragment.appendChild(createOrbsList(attrs));
- return fragment;
- }
- },
- {name:"Bind self matchable",otLangName:{chs:"自封消珠 debuff",cht:"自封消珠 debuff"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [215];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill;
- }),
- addition:card=>{
- const searchTypeArray = [215];
- const skill = getCardActiveSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- const fragment = document.createDocumentFragment();
- fragment.appendChild(document.createTextNode(`自封`));
- fragment.appendChild(createOrbsList(Bin.unflags(sk[1] || 1)));
- fragment.appendChild(document.createTextNode(`×${sk[0]}T`));
- return fragment;
- }
- },
- ]},
- {group:true,name:"----- Buff -----",otLangName:{chs:"----- buff 类-----",cht:"----- buff 類-----"}, functions: [
+ {group:true,name:"Active Skill",otLangName:{chs:"主动技",cht:"主動技"}, functions: [
{name:"Seamless Buff (Round ≥CD)",otLangName:{chs:"无缝 Buff (回合≥CD)",cht:"無縫 Buff (回合≥CD)"},
function:cards=>cards.filter(card=>{
function isLoopBuff(parsedSkill, cd) {
@@ -2079,1418 +1584,1986 @@ const specialSearchFunctions = (function() {
return false;
})
},
- {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;
- });
+ {group:true,name:"Voids Absorption",otLangName:{chs:"破吸类",cht:"破吸類"}, functions: [
+ {name:"Voids attribute absorption",otLangName:{chs:"破属吸 buff",cht:"破屬吸 buff"},
+ function:cards=>{
+ const attrName = "attr-absorb";
+ return cards.filter(card=>{
+ const turns = voidsAbsorption_Turns(card);
+ return turns[attrName] > 0;
+ }).sort((a,b)=>{
+ const a_s = voidsAbsorption_Turns(a), b_s = voidsAbsorption_Turns(b);
+ let a_pC = a_s[attrName], b_pC = b_s[attrName];
+ return a_pC - b_pC;
+ });
+ },
+ addition:voidsAbsorption_Addition
},
- 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)
+ {name:"Voids combo absorption",otLangName:{chs:"破C吸 buff",cht:"破C吸 buff"},
+ function:cards=>{
+ const attrName = "combo-absorb";
+ return cards.filter(card=>{
+ const turns = voidsAbsorption_Turns(card);
+ return turns[attrName] > 0;
+ }).sort((a,b)=>{
+ const a_s = voidsAbsorption_Turns(a), b_s = voidsAbsorption_Turns(b);
+ let a_pC = a_s[attrName], b_pC = b_s[attrName];
+ return a_pC - b_pC;
+ });
+ },
+ addition:voidsAbsorption_Addition
+ },
+ {name:"Voids damage absorption",otLangName:{chs:"破伤吸 buff",cht:"破傷吸 buff"},
+ function:cards=>{
+ const attrName = "damage-absorb";
+ return cards.filter(card=>{
+ const turns = voidsAbsorption_Turns(card);
+ return turns[attrName] > 0;
+ }).sort((a,b)=>{
+ const a_s = voidsAbsorption_Turns(a), b_s = voidsAbsorption_Turns(b);
+ let a_pC = a_s[attrName], b_pC = b_s[attrName];
+ return a_pC - b_pC;
+ });
+ },
+ addition:voidsAbsorption_Addition
+ },
+ {name:"Pierce through damage void",otLangName:{chs:"贯穿无效盾 buff",cht:"貫穿無效盾 buff"},
+ function:cards=>{
+ const attrName = "damage-void";
+ return cards.filter(card=>{
+ const turns = voidsAbsorption_Turns(card);
+ return turns[attrName] > 0;
+ }).sort((a,b)=>{
+ const a_s = voidsAbsorption_Turns(a), b_s = voidsAbsorption_Turns(b);
+ let a_pC = a_s[attrName], b_pC = b_s[attrName];
+ return a_pC - b_pC;
+ });
+ },
+ addition:voidsAbsorption_Addition
+ },
+ {group:true,name:"Combination",otLangName:{chs:"常用组合",cht:"常用組合"}, functions: [
+ {name:"2 Voids (attr. & damage)",otLangName:{chs:"双破(属+伤)",cht:"双破(属+伤)"},
+ function:cards=>{
+ return cards.filter(card=>{
+ const turns = voidsAbsorption_Turns(card);
+ return turns["attr-absorb"] > 0 && turns["damage-absorb"] > 0;
+ }).sort((a,b)=>{
+ const a_s = voidsAbsorption_Turns(a), b_s = voidsAbsorption_Turns(b);
+ let a_pC = a_s["attr-absorb"], b_pC = b_s["attr-absorb"];
+ return a_pC - b_pC;
+ });
+ },
+ addition:voidsAbsorption_Addition
+ },
+ {name:"3 Voids (attr. & damage & void)",otLangName:{chs:"三破(属+伤+无)",cht:"三破(属+伤+无)"},
+ function:cards=>{
+ return cards.filter(card=>{
+ const turns = voidsAbsorption_Turns(card);
+ return turns["attr-absorb"] > 0 && turns["damage-absorb"] > 0 && turns["damage-void"] > 0;
+ }).sort((a,b)=>{
+ const a_s = voidsAbsorption_Turns(a), b_s = voidsAbsorption_Turns(b);
+ let a_pC = a_s["attr-absorb"], b_pC = b_s["attr-absorb"];
+ return a_pC - b_pC;
+ });
+ },
+ addition:voidsAbsorption_Addition
+ },
+ ]},
+ ]},
+ {group:true,name:"Recovers Bind Status",otLangName:{chs:"解封类",cht:"解封類"}, functions: [
+ {
+ name:"Unbind menber bind",otLangName:{chs:"解封角色",cht:"解封角色"},
+ function:cards=>{
+ return cards.filter(card=>{
+ const turns = unbind_Turns(card);
+ return turns.normal > 0;
+ }).sort((a,b)=>{
+ const a_s = unbind_Turns(a), b_s = unbind_Turns(b);
+ let a_pC = a_s.normal, b_pC = b_s.normal;
+ return a_pC - b_pC;
+ });
+ },
+ addition:unbind_Addition
+ },
+ {
+ name:"Unbind awakenings bind",otLangName:{chs:"解觉醒",cht:"解覺醒"},
+ function:cards=>{
+ return cards.filter(card=>{
+ const turns = unbind_Turns(card);
+ return turns.awakenings > 0;
+ }).sort((a,b)=>{
+ const a_s = unbind_Turns(a), b_s = unbind_Turns(b);
+ let a_pC = a_s.awakenings, b_pC = b_s.awakenings;
+ return a_pC - b_pC;
+ });
+ },
+ addition:unbind_Addition
+ },
+ {
+ name:"Unbind unmatchable",otLangName:{chs:"解禁消珠",cht:"解禁消珠"},
+ function:cards=>{
+ return cards.filter(card=>{
+ const turns = unbind_Turns(card);
+ return turns.matches > 0;
+ }).sort((a,b)=>{
+ const a_s = unbind_Turns(a), b_s = unbind_Turns(b);
+ let a_pC = a_s.matches, b_pC = b_s.matches;
+ return a_pC - b_pC;
+ });
+ },
+ addition:unbind_Addition
+ },
+ {group:true,name:"Combination",otLangName:{chs:"常用组合",cht:"常用組合"}, functions: [
{
- 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`));
+ name:"3 Unbinds",otLangName:{chs:"三解",cht:"三解"},
+ function:cards=>{
+ return cards.filter(card=>{
+ const turns = unbind_Turns(card);
+ return turns.normal > 0 && turns.awakenings > 0 && turns.matches > 0;
+ }).sort((a,b)=>{
+ const a_s = unbind_Turns(a), b_s = unbind_Turns(b);
+ let a_pC = a_s.normal, b_pC = b_s.normal;
+ return a_pC - b_pC;
+ });
+ },
+ addition:unbind_Addition
+ },
+ ]},
+ ]},
+ {group:true,name:"For player team",otLangName:{chs:"对自身队伍生效类",cht:"對自身隊伍生效類"}, functions: [
+ {name:"↑Increase skills charge",otLangName:{chs:"【溜】减少CD",cht:"【溜】減少CD"},
+ function:cards=>{
+ const searchTypeArray = [146];
+ return cards.filter(card=>{
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill;
+ }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
+ },
+ addition:card=>{
+ const searchTypeArray = [146];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+ const fragment = document.createDocumentFragment();
+ fragment.append(createSkillIcon('skill-boost', 'boost-incr'), sk[0]);
+ if (sk[1] !== undefined && sk[0]!=sk[1]) fragment.append(`~${sk[1]}`);
+ return fragment;
}
- 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`));
+ {name:"Change Leader",otLangName:{chs:"更换队长",cht:"更換隊長"},
+ function:cards=>{
+ const searchTypeArray = [93, 227];
+ 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.type - b_s.type;
+ });
+ },
+ addition:card=>{
+ const searchTypeArray = [93, 227];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ if (!skill) return;
+ const fragment = document.createDocumentFragment();
+ fragment.append(createSkillIcon('leader-change'));
+ skill.type === 227 && fragment.append('换👉');
+ return fragment;
}
- return fragment;
- }
- },
- {name:"Move time change",otLangName:{chs:"操作时间 buff(顶手指)",cht:"操作時間 buff(頂手指)"},
- function:cards=>{
- const searchTypeArray = [132];
- 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]);
- });
},
- addition:card=>{
- const searchTypeArray = [132];
- 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;
- }
- },
- {name:"Adds combo(sort by combo)",otLangName:{chs:"加C buff(按C数排列)",cht:"加C buff(按C數排列)"},
- function:cards=>{
- const searchTypeArray = [160];
- return cards.filter(card=>{
+ {group:true,name:"Increase Damage Cap",otLangName:{chs:"增加伤害上限",cht:"增加傷害上限"}, functions: [
+ {name:"Increase Damage Cap - Any",otLangName:{chs:"增加伤害上限 - 任意",cht:"增加傷害上限 - 任意"},
+ function:cards=>{
+ const searchTypeArray = [241, 246, 247, 258];
+ 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;
+ });
+ },
+ addition:memberCap_Addition
+ },
+ {name:"Increase Damage Cap - Self",otLangName:{chs:"增加伤害上限 - 自身",cht:"增加傷害上限 - 自身"},
+ function:cards=>{
+ const searchTypeArray = [241, 246, 247, 258];
+ return cards.filter(card=>{
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ if (skill?.type === 258) return Boolean(skill.params[2] & 0b1);
+ else 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;
+ });
+ },
+ addition:memberCap_Addition
+ },
+ {name:"Increase Damage Cap - Leader",otLangName:{chs:"增加伤害上限 - 队长",cht:"增加傷害上限 - 隊長"},
+ function:cards=>{
+ const searchTypeArray = [258];
+ return cards.filter(card=>{
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill && Boolean(skill.params[2] & (0b10 | 0b100));
+ }).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;
+ });
+ },
+ addition:memberCap_Addition
+ },
+ {name:"Increase Damage Cap - Sub",otLangName:{chs:"增加伤害上限 - 队员",cht:"增加傷害上限 - 隊員"},
+ function:cards=>{
+ const searchTypeArray = [258];
+ return cards.filter(card=>{
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill && Boolean(skill.params[2] & 0b1000);
+ }).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;
+ });
+ },
+ addition:memberCap_Addition
+ },
+ ]},
+ {group:true,name:"Member ATK rate change",otLangName:{chs:"队员攻击力",cht:"隊員攻擊力"}, functions: [
+ {name:"Member ATK rate change - Any",otLangName:{chs:"队员攻击力 - 任意",cht:"隊員攻擊力 - 任意"},
+ 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:"队员攻击力 - 自身",cht:"隊員攻擊力 - 自身"},
+ function:cards=>{
+ const searchTypeArray = [230];
+ return cards.filter(card=>{
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill && Boolean(skill.params[1] & 0b1);
+ }).sort((a,b)=>sortByParams(a, b, searchTypeArray, 2));
+ },
+ addition:memberATK_Addition
+ },
+ {name:"Member ATK rate change - Leader",otLangName:{chs:"队员攻击力 - 队长",cht:"隊員攻擊力 - 隊長"},
+ function:cards=>{
+ const searchTypeArray = [230];
+ return cards.filter(card=>{
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill && Boolean(skill.params[1] & (0b10 | 0b100));
+ }).sort((a,b)=>sortByParams(a, b, searchTypeArray, 2));
+ },
+ addition:memberATK_Addition
+ },
+ {name:"Member ATK rate change - Sub",otLangName:{chs:"队员攻击力 - 队员",cht:"隊員攻擊力 - 隊員"},
+ function:cards=>{
+ const searchTypeArray = [230];
+ return cards.filter(card=>{
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill && Boolean(skill.params[1] & 0b1000);
+ }).sort((a,b)=>sortByParams(a, b, searchTypeArray, 2));
+ },
+ addition:memberATK_Addition
+ },
+ ]},
+ {name:"Change self's Attr",otLangName:{chs:"转换自身属性",cht:"轉換自身屬性"},
+ function:cards=>{
+ const searchTypeArray = [142];
+ return cards.filter(card=>{
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill;
+ }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
+ },
+ addition:card=>{
+ const searchTypeArray = [142];
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];
- });
- },
- addition:card=>{
- const searchTypeArray = [160];
- const skill = getCardActiveSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- return `+${sk[1]}C×${sk[0]}T`;
- }
- },
- {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 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)
- {
- 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 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));
+ 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`));
- }else
- {
- fragment.appendChild(document.createTextNode(`${sk[1]}%×${sk[0]}T`));
+
+ return fragment;
}
- return fragment;
- }
- },
- {name:"Reduce 100% Damage(invincible, sort by turns)",otLangName:{chs:"全属减伤 100%(无敌)",cht:"全屬減傷 100%(無敵)"},
- 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];
- return cards.filter(card=>{
+ {name:"Bind self active skill",otLangName:{chs:"自封技能 debuff",cht:"自封技能 debuff"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [214];
const skill = getCardActiveSkill(card, searchTypeArray);
return skill;
- }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
+ }),
+ addition:card=>{
+ const searchTypeArray = [214];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+ return document.createTextNode(`自封技${sk[0]}T`);
+ }
},
- 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:"Mass Attacks(sort by turns)",otLangName:{chs:"变为全体攻击(按回合数排序)",cht:"變爲全體攻擊(按回合數排序)"},
- function:cards=>{
- const searchTypeArray = [51];
- return cards.filter(card=>{
+ {name:"Remove assist",otLangName:{chs:"移除武器",cht:"移除武器"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [250];
const skill = getCardActiveSkill(card, searchTypeArray);
return skill;
- }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
- },
- addition:card=>{
- const searchTypeArray = [51];
- const skill = getCardActiveSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- return `全体×${sk[0]}T`;
- }
- },
- {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;
- })
- },
- ]},
- {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);
- if (!skill) return;
- const sk = skill.params;
- const fragment = document.createDocumentFragment();
- fragment.appendChild(createSkillIcon('delay'));
- fragment.append(`×${sk[0]}T`);
- return fragment;
- }
- },
- {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,0));
- },
- addition:card=>{
- const searchTypeArray = [19];
- const skill = getCardActiveSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- const fragment = document.createDocumentFragment();
- fragment.appendChild(createSkillIcon('def-break'));
- fragment.append(`${sk[1]}%×${sk[0]}T`);
- return fragment;
- }
- },
- {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];
- const skill = getCardActiveSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- const fragment = document.createDocumentFragment();
- fragment.appendChild(createSkillIcon('poison'));
- fragment.append(`ATK×${sk[0]/100}`);
- return fragment;
- }
- },
- {name:"Change enemies's Attr(sort by attr)",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;
})
},
- 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=>{
+ {name:"↓Reduce skills charge",otLangName:{chs:"【坐】增加CD",cht:"【坐】增加CD"},
+ function:cards=>{
+ 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 = [218];
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(createSkillIcon('counter-attack'));
- fragment.appendChild(createOrbsList(sk[2]));
- fragment.appendChild(document.createTextNode(`×${sk[1]/100}倍`));
- fragment.appendChild(document.createTextNode(`×${sk[0]}T`));
-
- return fragment;
- }
- },
- ]},
- {group:true,name:"-----Board States Change-----",otLangName:{chs:"-----改变板面状态类-----",cht:"-----改變板面狀態類-----"}, functions: [
- {name:"Replaces all Orbs",otLangName:{chs:"刷版",cht:"刷版"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [10];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill;
- })
- },
- {name:"No Skyfall(sort by turns)",otLangName:{chs:"无天降 buff(按回合排序)",cht:"無天降 buff(按回合排序)"},
- function:cards=>{
- 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 = [184];
- const skill = getCardActiveSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- return `无↓×${sk[0]}T`;
- }
- },
- {name:"Creates Roulette Orb",otLangName:{chs:"生成轮盘位 buff(转转)",cht:"生成輪盤位 buff(轉轉)"},
- function:cards=>{
- const searchTypeArray = [207, 249];
- 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.type - b_s.type) || !a_s.params[7] - !b_s.params[7] || a_s.params[0] - b_s.params[0];
- });
- },
- addition:card=>{
- const searchTypeArray = [207, 249];
- const skill = getCardActiveSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- const fragment = document.createDocumentFragment();
- fragment.append(createSkillIcon('board-roulette'));
- if (skill.type == 249) {
- fragment.append(createOrbsList(Bin.unflags(sk[1])));
+ if (!skill) return;
+ const sk = skill.params;
+ const fragment = document.createDocumentFragment();
+ fragment.append(createSkillIcon('skill-boost', 'boost-decr'), sk[0]);
+ if (sk[1] !== undefined && sk[0]!=sk[1]) fragment.append(`~${sk[1]}`);
+ return fragment;
}
- fragment.append(`${sk[7]? sk[7] : '固定'+sk.slice(2,7).flatMap(Bin.unflags).length }`,`×${sk[0]}T`);
- return fragment;
- }
- },
- {name:"Creates Cloud",otLangName:{chs:"生成云 debuff",cht:"生成雲 debuff"},
- function:cards=>{
- const searchTypeArray = [238];
- return cards.filter(card=>{
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill;
- }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
},
- addition:card=>{
- const searchTypeArray = [238];
- const skill = getCardActiveSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- return `${sk[1] * sk[2]}个×${sk[0]}T`;
- }
- },
- {name:"Creates Cloud",otLangName:{chs:"生成封条 debuff",cht:"生成封条 debuff"},
- function:cards=>{
- const searchTypeArray = [239];
- return cards.filter(card=>{
+ ]},
+ {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 = [179];
+ return cards.filter(card=>{
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill;
+ }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
+ },
+ addition:card=>{
+ const searchTypeArray = [179];
const skill = getCardActiveSkill(card, searchTypeArray);
- return skill;
- }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
- },
- addition:card=>{
- const searchTypeArray = [239];
- const skill = getCardActiveSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- const colums = Bin.unflags(sk[1]), rows = Bin.unflags(sk[2]);
- const fragment = document.createDocumentFragment();
- if (colums.length)
- fragment.append(`${colums.length}竖`);
- if (rows.length)
- fragment.append(`${rows.length}横`);
- fragment.append(`×${sk[0]}T`);
- return fragment;
- }
- },
- {name:"Creates Deep Dark Orb",otLangName:{chs:"生成超暗闇 debuff",cht:"生成超暗闇 debuff"},
- function:cards=>{
- const searchTypeArray = [251];
- return cards.filter(card=>{
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill;
- }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
- },
- addition:card=>{
- const searchTypeArray = [251];
- const skill = getCardActiveSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- return `${sk[1] == sk[2] ? sk[1] : sk[1] +"~"+ sk[2]}个×${sk[0]}T`;
- }
- },
- {name:"Change Board Size",otLangName:{chs:"改变板面大小 buff",cht:"改變板面大小 buff"},
- function:cards=>{
- const searchTypeArray = [244];
- return cards.filter(card=>{
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill;
- }).sort((a,b)=>sortByParams(a,b,searchTypeArray,1));
- },
- addition:card=>{
- const searchTypeArray = [244];
- const skill = getCardActiveSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
-
- let width, height;
- switch (sk[1]) {
- case 1: {
- width = 7;
- height = 6;
- break;
- }
- case 2: {
- width = 5;
- height = 3;
- break;
- }
- case 3: {
- width = 6;
- height = 5;
- break;
- }
- default: {
- width = 6;
- height = 5;
- }
+ if (!skill) return;
+ const sk = skill.params;
+ const fragment = document.createDocumentFragment();
+ fragment.append(createSkillIcon('auto-heal'));
+ fragment.append(`${sk[1]? sk[1].bigNumberToString() :`${sk[2]}%`}×${sk[0]}T`);
+ return fragment;
}
- return `[${width}×${height}]×${sk[0]}T`;
- }
- },
- ]},
- {group:true,name:"-----Orbs Drop-----",otLangName:{chs:"----- 珠子掉落 类-----",cht:"----- 珠子掉落 類-----"}, functions: [
- {name:"Drop Enhanced Orbs(sort by turns)",otLangName:{chs:"掉落强化宝珠(按回合排序)buff",cht:"掉落強化寶珠(按回合排序)buff"},
- 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);
- if (!skill) return;
- const sk = skill.params;
- return `${sk[1]}%×${sk[0]}T`;
- }
- },
- {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 rate increases",otLangName:{chs:"掉落率提升 buff",cht:"掉落率提升 buff"},
- 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:"掉落钉珠(按回合排序)buff",cht:"掉落釘珠(按回合排序)buff"},
- 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;
- const fragment = document.createDocumentFragment();
- fragment.append(createSkillIcon('orb-nail'), `${sk[1]}%×${sk[0]}T`);
- return fragment;
- }
- },
- {name:"Drop Thorn Orbs(sort by turns)",otLangName:{chs:"掉落荆棘(按回合排序)debuff",cht:"掉落荊棘(按回合排序)debuff"},
- function:cards=>{
- const searchTypeArray = [243];
- return cards.filter(card=>{
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill;
- }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
- },
- addition:card=>{
- const searchTypeArray = [243];
- const skill = getCardActiveSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- const fragment = document.createDocumentFragment();
- fragment.append(createSkillIcon('orb-thorn'));
- if ((sk[1] & 0b1111111111) != 1023) {
- let attrs = Bin.unflags(sk[1]);
- fragment.append(createOrbsList(attrs));
- }
- fragment.append(`${sk[3]}%×${sk[0]}T`, document.createElement("br"), "/" ,createSkillIcon('maxhp-locked'), `${sk[2]}%`);
- return fragment;
- }
- },
- {name:"Prediction of falling",otLangName:{chs:"预测掉落 buff",cht:"預測掉落 buff"},
- function:cards=>{
- const searchTypeArray = [253];
- return cards.filter(card=>{
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill;
- }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
- },
- addition:card=>{
- const searchTypeArray = [253];
- const skill = getCardActiveSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- const fragment = document.createDocumentFragment();
- fragment.append(createSkillIcon('prediction-falling'));
- fragment.append(`×${sk[0]}T`);
- return fragment;
- }
- },
- ]},
- {group:true,name:"-----Change all Orbs-----",otLangName:{chs:"-----洗板类-----",cht:"-----洗板類-----"}, functions: [
- {name:"Changes all Orbs to any",otLangName:{chs:"洗版-任意色",cht:"洗版-任意色"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [71];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill;
- }),
- addition:boardChange_Addition
- },
- {name:"Changes all Orbs to 1 color(Farm)",otLangName:{chs:"洗版-1色(花火)",cht:"洗版-1色(花火)"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [71];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return boardChange_ColorTypes(skill).length == 1;
- }),
- addition:boardChange_Addition
- },
- {name:"Changes all Orbs to 2 color",otLangName:{chs:"洗版-2色",cht:"洗版-2色"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [71];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return boardChange_ColorTypes(skill).length == 2;
- }),
- addition:boardChange_Addition
- },
- {name:"Changes all Orbs to 3 color",otLangName:{chs:"洗版-3色",cht:"洗版-3色"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [71];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return boardChange_ColorTypes(skill).length == 3;
- }),
- addition:boardChange_Addition
- },
- {name:"Changes all Orbs to 4 color",otLangName:{chs:"洗版-4色",cht:"洗版-4色"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [71];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return boardChange_ColorTypes(skill).length == 4;
- }),
- addition:boardChange_Addition
- },
- {name:"Changes all Orbs to 5 color",otLangName:{chs:"洗版-5色",cht:"洗版-5色"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [71];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return boardChange_ColorTypes(skill).length == 5;
- }),
- addition:boardChange_Addition
- },
- {name:"Changes all Orbs to ≥6 color",otLangName:{chs:"洗版-6色以上",cht:"洗版-6色以上"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [71];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return boardChange_ColorTypes(skill).length >= 6;
- }),
- addition:boardChange_Addition
- },
- {name:"Changes all Orbs - include Fire",otLangName:{chs:"洗版-含火",cht:"洗版-含火"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [71];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return boardChange_ColorTypes(skill).includes(0);
- }),
- addition:boardChange_Addition
- },
- {name:"Changes all Orbs - include Water",otLangName:{chs:"洗版-含水",cht:"洗版-含水"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [71];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return boardChange_ColorTypes(skill).includes(1);
- }),
- addition:boardChange_Addition
- },
- {name:"Changes all Orbs - include Wood",otLangName:{chs:"洗版-含木",cht:"洗版-含木"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [71];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return boardChange_ColorTypes(skill).includes(2);
- }),
- addition:boardChange_Addition
- },
- {name:"Changes all Orbs - include Light",otLangName:{chs:"洗版-含光",cht:"洗版-含光"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [71];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return boardChange_ColorTypes(skill).includes(3);
- }),
- addition:boardChange_Addition
- },
- {name:"Changes all Orbs - include Dark",otLangName:{chs:"洗版-含暗",cht:"洗版-含暗"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [71];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return boardChange_ColorTypes(skill).includes(4);
- }),
- addition:boardChange_Addition
- },
- {name:"Changes all Orbs - include Heart",otLangName:{chs:"洗版-含心",cht:"洗版-含心"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [71];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return boardChange_ColorTypes(skill).includes(5);
- }),
- addition:boardChange_Addition
- },
- {name:"Changes all Orbs - include Jammers/Poison",otLangName:{chs:"洗版-含毒废",cht:"洗版-含毒廢"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [71];
- const skill = getCardActiveSkill(card, searchTypeArray);
- const colors = boardChange_ColorTypes(skill);
- return colors.includes(6)
- || colors.includes(7)
- || colors.includes(8)
- || colors.includes(9);
- }),
- addition:boardChange_Addition
- },
- ]},
- {group:true,name:"-----Orbs Change-----",otLangName:{chs:"-----指定色转珠类-----",cht:"-----指定色轉珠類-----"}, functions: [
- {name:"Orbs Change - to Fire",otLangName:{chs:"转珠-变为-火",cht:"轉珠-變爲-火"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [9,20,154];
- const skills = getCardActiveSkills(card, searchTypeArray);
- if (!skills.length) return false;
- let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
- return parsedSkills.some(p=>p.to.includes(0));
- }),
- addition:changeOrbs_Addition
- },
- {name:"Orbs Change - to Water",otLangName:{chs:"转珠-变为-水",cht:"轉珠-變爲-水"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [9,20,154];
- const skills = getCardActiveSkills(card, searchTypeArray);
- if (!skills.length) return false;
- let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
- return parsedSkills.some(p=>p.to.includes(1));
- }),
- addition:changeOrbs_Addition
- },
- {name:"Orbs Change - to Wood",otLangName:{chs:"转珠-变为-木",cht:"轉珠-變爲-木"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [9,20,154];
- const skills = getCardActiveSkills(card, searchTypeArray);
- if (!skills.length) return false;
- let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
- return parsedSkills.some(p=>p.to.includes(2));
- }),
- addition:changeOrbs_Addition
- },
- {name:"Orbs Change - to Light",otLangName:{chs:"转珠-变为-光",cht:"轉珠-變爲-光"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [9,20,154];
- const skills = getCardActiveSkills(card, searchTypeArray);
- if (!skills.length) return false;
- let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
- return parsedSkills.some(p=>p.to.includes(3));
- }),
- addition:changeOrbs_Addition
- },
- {name:"Orbs Change - to Dark",otLangName:{chs:"转珠-变为-暗",cht:"轉珠-變爲-暗"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [9,20,154];
- const skills = getCardActiveSkills(card, searchTypeArray);
- if (!skills.length) return false;
- let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
- return parsedSkills.some(p=>p.to.includes(4));
- }),
- addition:changeOrbs_Addition
- },
- {name:"Orbs Change - to Heal",otLangName:{chs:"转珠-变为-心",cht:"轉珠-變爲-心"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [9,20,154];
- const skills = getCardActiveSkills(card, searchTypeArray);
- if (!skills.length) return false;
- let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
- return parsedSkills.some(p=>p.to.includes(5));
- }),
- addition:changeOrbs_Addition
- },
- {name:"Orbs Change - to Jammers/Poison",otLangName:{chs:"转珠-变为-毒废",cht:"轉珠-變爲-毒廢"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [9,20,154];
- const skills = getCardActiveSkills(card, searchTypeArray);
- if (!skills.length) return false;
- let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
- return parsedSkills.some(p=>p.to.includes(6) || p.to.includes(7) || p.to.includes(8) || p.to.includes(9));
- }),
- addition:changeOrbs_Addition
- },
- {name:"Orbs Change - from Fire",otLangName:{chs:"转珠-转走-火",cht:"轉珠-轉走-火"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [9,20,154];
- const skills = getCardActiveSkills(card, searchTypeArray);
- if (!skills.length) return false;
- let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
- return parsedSkills.some(p=>p.from.includes(0));
- }),
- addition:changeOrbs_Addition
- },
- {name:"Orbs Change - from Water",otLangName:{chs:"转珠-转走-水",cht:"轉珠-轉走-水"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [9,20,154];
- const skills = getCardActiveSkills(card, searchTypeArray);
- if (!skills.length) return false;
- let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
- return parsedSkills.some(p=>p.from.includes(1));
- }),
- addition:changeOrbs_Addition
- },
- {name:"Orbs Change - from Wood",otLangName:{chs:"转珠-转走-木",cht:"轉珠-轉走-木"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [9,20,154];
- const skills = getCardActiveSkills(card, searchTypeArray);
- if (!skills.length) return false;
- let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
- return parsedSkills.some(p=>p.from.includes(2));
- }),
- addition:changeOrbs_Addition
- },
- {name:"Orbs Change - from Light",otLangName:{chs:"转珠-转走-光",cht:"轉珠-轉走-光"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [9,20,154];
- const skills = getCardActiveSkills(card, searchTypeArray);
- if (!skills.length) return false;
- let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
- return parsedSkills.some(p=>p.from.includes(3));
- }),
- addition:changeOrbs_Addition
- },
- {name:"Orbs Change - from Dark",otLangName:{chs:"转珠-转走-暗",cht:"轉珠-轉走-暗"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [9,20,154];
- const skills = getCardActiveSkills(card, searchTypeArray);
- if (!skills.length) return false;
- let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
- return parsedSkills.some(p=>p.from.includes(4));
- }),
- addition:changeOrbs_Addition
- },
- {name:"Orbs Change - from Heart",otLangName:{chs:"转珠-转走-心",cht:"轉珠-轉走-心"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [9,20,154];
- const skills = getCardActiveSkills(card, searchTypeArray);
- if (!skills.length) return false;
- let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
- return parsedSkills.some(p=>p.from.includes(5));
- }),
- addition:changeOrbs_Addition
- },
- {name:"Orbs Change - from Jammers/Poison",otLangName:{chs:"转珠-转走-毒废",cht:"轉珠-轉走-毒廢"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [9,20,154];
- const skills = getCardActiveSkills(card, searchTypeArray);
- if (!skills.length) return false;
- let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
- return parsedSkills.some(p=>p.from.includes(6) || p.to.includes(7) || p.to.includes(8) || p.to.includes(9));
- }),
- addition:changeOrbs_Addition
- },
- ]},
- {group:true,name:"-----Create Orbs-----",otLangName:{chs:"-----随机产珠类-----",cht:"-----隨機產珠類-----"}, functions: [
- {name:"Create 15×2 color Orbs",otLangName:{chs:"产珠15个×2色",cht:"產珠15個×2色"},
- function:cards=>cards.filter(card=>{
- function is1515(sk)
- {
- return Boolean(Bin.unflags(sk[1]).length == 2 && sk[0] == 15);
- }
- const searchTypeArray = [141];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill && is1515(skill.params);
- }),
- addition:generateOrbs_Addition
- },
- {name:"Create 30 Orbs",otLangName:{chs:"产珠30个",cht:"產珠30個"},
- function:cards=>cards.filter(card=>{
- function is30(sk)
- {
- return Boolean(Bin.unflags(sk[1]).length * sk[0] == 30);
- }
- const searchTypeArray = [141];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill && is30(skill.params);
- }),
- addition:generateOrbs_Addition
- },
- {name:"Create 6 color Orbs",otLangName:{chs:"产珠-生成-6色",cht:"產珠-生成-6色"},
- function:cards=>cards.filter(card=>{
- const gens = generateOrbsParse(card);
- return gens.some(gen=>(gen.to & 0b111111) === 0b111111);
- }),
- addition:generateOrbs_Addition
- },
- {name:"Create Fire Orbs",otLangName:{chs:"产珠-生成-火",cht:"產珠-生成-火"},
- function:cards=>cards.filter(card=>{
- const gens = generateOrbsParse(card);
- return gens.some(gen=>gen.to & 0b000001);
- }),
- addition:generateOrbs_Addition
- },
- {name:"Create Water Orbs",otLangName:{chs:"产珠-生成-水",cht:"產珠-生成-水"},
- function:cards=>cards.filter(card=>{
- const gens = generateOrbsParse(card);
- return gens.some(gen=>gen.to & 0b000010);
- }),
- addition:generateOrbs_Addition
- },
- {name:"Create Wood Orbs",otLangName:{chs:"产珠-生成-木",cht:"產珠-生成-木"},
- function:cards=>cards.filter(card=>{
- const gens = generateOrbsParse(card);
- return gens.some(gen=>gen.to & 0b000100);
- }),
- addition:generateOrbs_Addition
- },
- {name:"Create Light Orbs",otLangName:{chs:"产珠-生成-光",cht:"產珠-生成-光"},
- function:cards=>cards.filter(card=>{
- const gens = generateOrbsParse(card);
- return gens.some(gen=>gen.to & 0b001000);
- }),
- addition:generateOrbs_Addition
- },
- {name:"Create Dark Orbs",otLangName:{chs:"产珠-生成-暗",cht:"產珠-生成-暗"},
- function:cards=>cards.filter(card=>{
- const gens = generateOrbsParse(card);
- return gens.some(gen=>gen.to & 0b010000);
- }),
- addition:generateOrbs_Addition
- },
- {name:"Create Heart Orbs",otLangName:{chs:"产珠-生成-心",cht:"產珠-生成-心"},
- function:cards=>cards.filter(card=>{
- const gens = generateOrbsParse(card);
- return gens.some(gen=>gen.to & 0b100000);
- }),
- addition:generateOrbs_Addition
- },
- {name:"Create Jammers/Poison Orbs",otLangName:{chs:"产珠-生成-毒废",cht:"產珠-生成-毒廢"},
- function:cards=>cards.filter(card=>{
- const gens = generateOrbsParse(card);
- return gens.some(gen=>gen.to & 0b1111000000);
- }),
- addition:generateOrbs_Addition
- },
- ]},
- {group:true,name:"-----Create Fixed Position Orbs-----",otLangName:{chs:"-----固定位置产珠类-----",cht:"-----固定位置產珠類-----"}, functions: [
- {name:"Create designated shape",otLangName:{chs:"生成指定形状的",cht:"生成指定形狀的"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [176];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill;
- }),
- addition:card=>{
- const searchTypeArray = [176];
- const skills = getCardActiveSkills(card, searchTypeArray);
- if (!skills.length) return;
- const fragment = document.createDocumentFragment();
- fragment.appendChild(document.createTextNode(`形状`));
- skills.forEach(skill=>fragment.appendChild(createOrbsList(skill.params[5])));
- return fragment;
- }
- },
- {name:"Create outer edges",otLangName:{chs:"生成四周一圈",cht:"生成四周一圈"},
- function:cards=>cards.filter(card=>{
- function isOuterEdges(sk)
- {
- const baseLineNum1 = 0b111111;
- const baseLineNum2 = 0b100001;
- return shapeThisRowOk(sk[0], baseLineNum1) &&
- shapeThisRowOk(sk[1], baseLineNum2) && //第2行含有这个形状
- shapeThisRowOk(sk[2], baseLineNum2) && //第2行含有这个形状
- shapeThisRowOk(sk[3], baseLineNum2) && //第2行含有这个形状
- shapeThisRowOk(sk[4], baseLineNum1);
- }
- const searchTypeArray = [176];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill && isOuterEdges(skill.params);
- }),
- addition:card=>{
- const searchTypeArray = [176];
- const skill = getCardActiveSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- const fragment = document.createDocumentFragment();
- fragment.appendChild(document.createTextNode(`外圈`));
- fragment.appendChild(createOrbsList(sk[5]));
- return fragment;
- }
- },
- {name:"Create 3×3 block",otLangName:{chs:"生成3×3方块",cht:"生成3×3方塊"},
- function:cards=>cards.filter(card=>{
- function is3x3(sk)
- {
- const baseLineNum = 0b111;
- const lineNumArr = []; //同一行内所有的可能存在 既 0b111, 0b1110, 0b11100, 0b111000
- for (let _lineNum=baseLineNum; _lineNum<0b1000000; _lineNum<<=1)
- {
- lineNumArr.push(_lineNum);
- }
-
- for (let ri=0; ri<3; ri++)
- {
- //搜索所有可能的行存在
- let maybeLineNum = lineNumArr.filter(lineNum=>shapeThisRowOk(sk[ri], lineNum));
- if (maybeLineNum.length < 1) continue;
-
- maybeLineNum = maybeLineNum.filter(lineNum=>
- shapeUpsideDownRowOk(sk[ri-1], lineNum) && //如果上一行存在,并且无交集(and为0)
- shapeUpsideDownRowOk(sk[ri+3], lineNum) && //如果第四行存在,并且无交集(and为0)
- shapeThisRowOk(sk[ri+1], lineNum) && //第2行含有这个形状
- shapeThisRowOk(sk[ri+2], lineNum) //第3行含有这个形状
- );
- if (maybeLineNum.length > 0) return true;
- }
- return false;
- }
- const searchTypeArray = [176];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill && is3x3(skill.params.slice(0,5));
- }),
- addition:card=>{
- const searchTypeArray = [176];
- const skill = getCardActiveSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- const fragment = document.createDocumentFragment();
- fragment.appendChild(document.createTextNode(`3×3`));
- fragment.appendChild(createOrbsList(sk[5]));
- return fragment;
- }
- },
- {name:"Create cross",otLangName:{chs:"生成十字",cht:"生成十字"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [176];
- const skills = getCardActiveSkills(card, searchTypeArray);
- return skills.filter(skill=>shapeIsCross(skill.params.slice(0,5))).length;
- }),
- addition:function(card){
- const searchTypeArray = [176];
- const skills = getCardActiveSkills(card, searchTypeArray).filter(skill=>shapeIsCross(skill.params.slice(0,5)));
- if (!skills.length) return;
- const fragment = document.createDocumentFragment();
- fragment.appendChild(document.createTextNode(`十字`));
- skills.forEach(skill=>fragment.appendChild(createOrbsList(skill.params[5])));
- return fragment;
- },
- },
- {name:"Create L shape",otLangName:{chs:"生成L字",cht:"生成L字"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [176];
- const skills = getCardActiveSkills(card, searchTypeArray);
- return skills.filter(skill=>shapeIsLShape(skill.params.slice(0,5))).length;
- }),
- addition:function(card){
- const searchTypeArray = [176];
- const skills = getCardActiveSkills(card, searchTypeArray).filter(skill=>shapeIsLShape(skill.params.slice(0,5)));
- if (!skills.length) return;
- const fragment = document.createDocumentFragment();
- fragment.appendChild(document.createTextNode(`L字`));
- skills.forEach(skill=>fragment.appendChild(createOrbsList(skill.params[5])));
- return fragment;
- },
- },
- {name:"Create verticals",otLangName:{chs:"产竖",cht:"產豎"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [127];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill;
- }),
- addition:generateColumnOrbs_Addition
- },
- {name:"Create vertical Heart",otLangName:{chs:"产竖心",cht:"產豎心"},
- function:cards=>cards.filter(card=>{
- function isHeart(sk)
- {
- for (let i=1;i{
+ 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;
+ if (!sortNum)
{
+ sortNum = a_vs[a_i] - b_vs[b_i];
+ }
+ return sortNum;
+ });
+ },
+ addition:card=>{
+ const heal = healImmediately_Rate(card);
+ const fragment = document.createDocumentFragment();
+ fragment.append(createSkillIcon('heal', 'hp-incr'));
+ if (heal.scale)
+ fragment.append(`${heal.scale}%`);
+ if (heal.const)
+ fragment.append(`${heal.const.bigNumberToString()}点`);
+ if (heal.selfRcv)
+ fragment.append(`${heal.selfRcv/100}倍回复力`, );
+ if (heal.vampire)
+ fragment.append(`${heal.vampire}%伤害`);
+ return fragment;
+ }
+ },
+ {name:"Change team maximum HP",otLangName:{chs:"队伍最大 HP 变化",cht:"队伍最大 HP 變化"},
+ function:cards=>{
+ 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 = [237];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+ const fragment = document.createDocumentFragment();
+ fragment.append(createSkillIcon('maxhp-locked'), `${sk[1].bigNumberToString()}%×${sk[0]}T`);
+ return fragment;
+ }
+ },
+ {name:"Damage self",otLangName:{chs:"玩家自残",cht:"玩家自殘"},
+ 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);
+ const fragment = document.createDocumentFragment();
+ fragment.append(createSkillIcon('heal', 'hp-decr'));
+ if (rate < 100)
+ fragment.append(`减少${rate}%`);
+ else
+ fragment.append(`减少到1`);
+ return fragment;
+ }
+ },
+ ]},
+ {group:true,name:"Buff",otLangName:{chs:"buff 类",cht:"buff 類"}, functions: [
+ {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"},
+ function:cards=>{
+ const searchTypeArray = [132];
+ 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]);
+ });
+ },
+ addition:card=>{
+ const searchTypeArray = [132];
+ 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;
+ }
+ },
+ {name:"Adds combo",otLangName:{chs:"加C buff",cht:"加C buff"},
+ 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];
+ });
+ },
+ addition:card=>{
+ const searchTypeArray = [160];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+ return `+${sk[1]}C×${sk[0]}T`;
+ }
+ },
+ {name:"Reduce Damage for all Attr",otLangName:{chs:"全属减伤 buff",cht:"全屬減傷 buff"},
+ function:cards=>{
+ const searchTypeArray = [3,156];
+ 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;
+ }).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;
+ });
+ },
+ addition:card=>{
+ 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:"Reduce 100% Damage",otLangName:{chs:"全属减伤 100%",cht:"全屬減傷 100%"},
+ 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",otLangName:{chs:"限属减伤 buff",cht:"限屬減傷 buff"},
+ function:cards=>{
+ const searchTypeArray = [21];
+ return cards.filter(card=>{
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill;
+ }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
+ },
+ 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:"Mass Attacks",otLangName:{chs:"变为全体攻击",cht:"變爲全體攻擊"},
+ function:cards=>{
+ const searchTypeArray = [51];
+ return cards.filter(card=>{
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill;
+ }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
+ },
+ addition:card=>{
+ const searchTypeArray = [51];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+ return `全体×${sk[0]}T`;
+ }
+ },
+ {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;
+ })
+ },
+ ]},
+ {group:true,name:"For Enemy",otLangName:{chs:"对敌 buff 类",cht:"對敵 buff 類"}, functions: [
+ {name:"Menace",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);
+ if (!skill) return;
+ const sk = skill.params;
+ const fragment = document.createDocumentFragment();
+ fragment.appendChild(createSkillIcon('delay'));
+ fragment.append(`×${sk[0]}T`);
+ return fragment;
+ }
+ },
+ {name:"Reduces enemies' DEF",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,0));
+ },
+ addition:card=>{
+ const searchTypeArray = [19];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+ const fragment = document.createDocumentFragment();
+ fragment.appendChild(createSkillIcon('def-break'));
+ fragment.append(`${sk[1]}%×${sk[0]}T`);
+ return fragment;
+ }
+ },
+ {name:"Poisons enemies",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];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+ const fragment = document.createDocumentFragment();
+ fragment.appendChild(createSkillIcon('poison'));
+ fragment.append(`ATK×${sk[0]/100}`);
+ return fragment;
+ }
+ },
+ {name:"Change enemies's Attr",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;
+ })
+ },
+ 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",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(createSkillIcon('counter-attack'));
+ fragment.appendChild(createOrbsList(sk[2]));
+ fragment.appendChild(document.createTextNode(`×${sk[1]/100}倍`));
+ fragment.appendChild(document.createTextNode(`×${sk[0]}T`));
+
+ return fragment;
+ }
+ },
+ ]},
+ {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);
+ return skill;
+ })
+ },
+ {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(≥6 color)",otLangName:{chs:"上锁5色+心或全部",cht:"上鎖5色+心或全部"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [152];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill && (skill.params[0] & 0b11_1111) === 0b11_1111;
+ }),
+ addition:lock_Addition
+ },
+ {name:"Enhanced Orbs",otLangName:{chs:"强化宝珠",cht:"強化寶珠"},
+ function:cards=>{
+ const searchTypeArray = [52,91,140];
+ return cards.filter(card=>{
+ 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 = Bin.unflags(sk[0]); break;
}
}
+ const fragment = document.createDocumentFragment();
+ fragment.appendChild(document.createTextNode(`强化`));
+ fragment.appendChild(createOrbsList(attrs));
+ return fragment;
}
- const searchTypeArray = [127];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill && isHeart(skill.params);
- }),
- addition:generateColumnOrbs_Addition
- },
- {name:"Create horizontals",otLangName:{chs:"产横",cht:"產橫"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [128];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill;
- }),
- addition:generateRowOrbs_Addition
- },
- {name:"Create ≥2 horizontals",otLangName:{chs:"2横或以上",cht:"2橫或以上"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [128];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill && (skill.params.length>=3 || Bin.unflags(skill.params[0]).length>=2);
- }),
- addition:generateRowOrbs_Addition
- },
- {name:"Create 2 color horizontals",otLangName:{chs:"2色横",cht:"2色橫"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [128];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill && skill.params[3]>=0 && (skill.params[1] & skill.params[3]) != skill.params[1];
- }),
- addition:generateRowOrbs_Addition
- },
- {name:"Create horizontal not Top or Bottom",otLangName:{chs:"非顶底横",cht:"非頂底橫"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [128];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill && ((skill.params[0] | skill.params[2]) & 14);
- }),
- addition:generateRowOrbs_Addition
- },
- {name:"Extensive horizontal(include Farm and outer edges)",otLangName:{chs:"泛产横(包含花火与四周一圈等)",cht:"泛產橫(包含花火與四周一圈等)"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [128,71,176];
- function isRow(skill)
- {
+ },
+ {name:"Bind self matchable",otLangName:{chs:"自封消珠 debuff",cht:"自封消珠 debuff"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [215];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill;
+ }),
+ addition:card=>{
+ const searchTypeArray = [215];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ if (!skill) return;
const sk = skill.params;
- if (skill.type === 128) {//普通横
- return true;
- }
- else if (skill.type === 71) {//花火
- return sk.slice(0,sk.includes(-1)?sk.indexOf(-1):undefined).length === 1
- }
- else if (skill.type === 176) {//特殊形状
- return sk.some(n=>(n & 0b111111) === 0b111111)
- }
- return false;
+ const fragment = document.createDocumentFragment();
+ fragment.appendChild(document.createTextNode(`自封`));
+ fragment.appendChild(createOrbsList(Bin.unflags(sk[1] || 1)));
+ fragment.appendChild(document.createTextNode(`×${sk[0]}T`));
+ return fragment;
}
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill && isRow(skill);
- })
- },
- ]},
- {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
- },
- {name:"Breaking Shield",otLangName:{chs:"破白盾",cht:"破白盾"},
- function:cards=>{
- const searchTypeArray = [259];
- return cards.filter(card=>{
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill;
- }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
- },
- addition:card=>{
- const searchTypeArray = [259];
- const skill = getCardActiveSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- const fragment = document.createDocumentFragment();
- fragment.appendChild(createSkillIcon('breaking-shield'));
- fragment.append(`-${sk[0]}%`);
- return fragment;
- }
- },
- ]},
- {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];
+ ]},
+ {group:true,name:"Board States Change",otLangName:{chs:"改变板面状态类",cht:"改變板面狀態類"}, functions: [
+ {name:"Replaces all Orbs",otLangName:{chs:"刷版",cht:"刷版"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [10];
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:"No Skyfall",otLangName:{chs:"无天降 buff",cht:"無天降 buff"},
+ function:cards=>{
+ 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 = [184];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+ return `无↓×${sk[0]}T`;
+ }
+ },
+ {name:"Creates Roulette Orb",otLangName:{chs:"生成轮盘位 buff",cht:"生成輪盤位 buff"},
+ function:cards=>{
+ const searchTypeArray = [207, 249];
+ 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.type - b_s.type) || !a_s.params[7] - !b_s.params[7] || a_s.params[0] - b_s.params[0];
+ });
+ },
+ addition:card=>{
+ const searchTypeArray = [207, 249];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+ const fragment = document.createDocumentFragment();
+ fragment.append(createSkillIcon('board-roulette'));
+ if (skill.type == 249) {
+ fragment.append(createOrbsList(Bin.unflags(sk[1])));
+ }
+ fragment.append(`${sk[7]? sk[7] : '固定'+sk.slice(2,7).flatMap(Bin.unflags).length }`,`×${sk[0]}T`);
+ return fragment;
+ }
+ },
+ {name:"Creates Cloud",otLangName:{chs:"生成云 debuff",cht:"生成雲 debuff"},
+ function:cards=>{
+ const searchTypeArray = [238];
+ return cards.filter(card=>{
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill;
+ }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
+ },
+ addition:card=>{
+ const searchTypeArray = [238];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+ return `${sk[1] * sk[2]}个×${sk[0]}T`;
+ }
+ },
+ {name:"Creates Cloud",otLangName:{chs:"生成封条 debuff",cht:"生成封条 debuff"},
+ function:cards=>{
+ const searchTypeArray = [239];
+ return cards.filter(card=>{
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill;
+ }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
+ },
+ addition:card=>{
+ const searchTypeArray = [239];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+ const colums = Bin.unflags(sk[1]), rows = Bin.unflags(sk[2]);
+ const fragment = document.createDocumentFragment();
+ if (colums.length)
+ fragment.append(`${colums.length}竖`);
+ if (rows.length)
+ fragment.append(`${rows.length}横`);
+ fragment.append(`×${sk[0]}T`);
+ return fragment;
+ }
+ },
+ {name:"Creates Deep Dark Orb",otLangName:{chs:"生成超暗闇 debuff",cht:"生成超暗闇 debuff"},
+ function:cards=>{
+ const searchTypeArray = [251];
+ return cards.filter(card=>{
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill;
+ }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
+ },
+ addition:card=>{
+ const searchTypeArray = [251];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+ return `${sk[1] == sk[2] ? sk[1] : sk[1] +"~"+ sk[2]}个×${sk[0]}T`;
+ }
+ },
+ {name:"Change Board Size",otLangName:{chs:"改变板面大小 buff",cht:"改變板面大小 buff"},
+ function:cards=>{
+ const searchTypeArray = [244];
+ return cards.filter(card=>{
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill;
+ }).sort((a,b)=>sortByParams(a,b,searchTypeArray,1));
+ },
+ addition:card=>{
+ const searchTypeArray = [244];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
- {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 width, height;
+ switch (sk[1]) {
+ case 1: {
+ width = 7;
+ height = 6;
+ break;
+ }
+ case 2: {
+ width = 5;
+ height = 3;
+ break;
+ }
+ case 3: {
+ width = 6;
+ height = 5;
+ break;
+ }
+ default: {
+ width = 6;
+ height = 5;
+ }
}
+ return `[${width}×${height}]×${sk[0]}T`;
}
- 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)
- {
+ },
+ ]},
+ {group:true,name:"Orbs Drop",otLangName:{chs:"珠子掉落 类",cht:"珠子掉落 類"}, functions: [
+ {name:"Drop Enhanced Orbs",otLangName:{chs:"掉落强化宝珠 buff",cht:"掉落強化寶珠 buff"},
+ 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);
+ if (!skill) return;
const sk = skill.params;
- switch(skill.type)
- {
- case 1:
- case 86:
- case 87:
- return sk[1];
- case 42:
- return sk[2];
- default:
- return 0;
- }
+ return `${sk[1]}%×${sk[0]}T`;
}
- 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=>{
+ },
+ {name:"Drop locked orbs(any color)",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(≥6 color)",otLangName:{chs:"掉锁5色+心或全部",cht:"掉鎖5色+心或全部"},
+ function:cards=>{
+ const searchTypeArray = [205];
+ return cards.filter(card=>{
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill && (skill.params[0] & 0b11_1111) === 0b11_1111;
+ }).sort((a,b)=>sortByParams(a,b,searchTypeArray,1));
+ },
+ addition:dropLock_Addition
+ },
+ {group:true,name:"Drop rate increases",otLangName:{chs:"掉落率提升",cht:"掉落率提升"}, functions: [
+ {name:"Drop rate increases",otLangName:{chs:"掉落率提升 buff",cht:"掉落率提升 buff"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [126];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill;
+ }),
+ addition:dropOrb_Addition
+ },
+ {name:"Drop rate - Attr. - Fire",otLangName:{chs:"掉落率提升-属性-火",cht:"掉落率提升-屬性-火"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [126];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill && (skill.params[0] & 0b1);
+ }),
+ addition:dropOrb_Addition
+ },
+ {name:"Drop rate - Attr. - Water",otLangName:{chs:"掉落率提升-属性-水",cht:"掉落率提升-屬性-水"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [126];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill && (skill.params[0] & 0b10);
+ }),
+ addition:dropOrb_Addition
+ },
+ {name:"Drop rate - Attr. - Wood",otLangName:{chs:"掉落率提升-属性-木",cht:"掉落率提升-屬性-木"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [126];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill && (skill.params[0] & 0b100);
+ }),
+ addition:dropOrb_Addition
+ },
+ {name:"Drop rate - Attr. - Light",otLangName:{chs:"掉落率提升-属性-光",cht:"掉落率提升-屬性-光"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [126];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill && (skill.params[0] & 0b1000);
+ }),
+ addition:dropOrb_Addition
+ },
+ {name:"Drop rate - Attr. - Dark",otLangName:{chs:"掉落率提升-属性-暗",cht:"掉落率提升-屬性-暗"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [126];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill && (skill.params[0] & 0b1_0000);
+ }),
+ addition:dropOrb_Addition
+ },
+ {name:"Drop rate - Attr. - Heart",otLangName:{chs:"掉落率提升-属性-心",cht:"掉落率提升-屬性-心"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [126];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill && (skill.params[0] & 0b10_0000);
+ }),
+ 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] & 0b11_1100_0000);
+ }),
+ 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",otLangName:{chs:"掉落钉珠 buff",cht:"掉落釘珠 buff"},
+ 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;
+ const fragment = document.createDocumentFragment();
+ fragment.append(createSkillIcon('orb-nail'), `${sk[1]}%×${sk[0]}T`);
+ return fragment;
+ }
+ },
+ {name:"Drop Thorn Orbs",otLangName:{chs:"掉落荆棘 debuff",cht:"掉落荊棘 debuff"},
+ function:cards=>{
+ const searchTypeArray = [243];
+ return cards.filter(card=>{
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill;
+ }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
+ },
+ addition:card=>{
+ const searchTypeArray = [243];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+ const fragment = document.createDocumentFragment();
+ fragment.append(createSkillIcon('orb-thorn'));
+ if ((sk[1] & 0b1111111111) != 1023) {
+ let attrs = Bin.unflags(sk[1]);
+ fragment.append(createOrbsList(attrs));
+ }
+ fragment.append(`${sk[3]}%×${sk[0]}T`, document.createElement("br"), "/" ,createSkillIcon('maxhp-locked'), `${sk[2]}%`);
+ return fragment;
+ }
+ },
+ {name:"Prediction of falling",otLangName:{chs:"预测掉落 buff",cht:"預測掉落 buff"},
+ function:cards=>{
+ const searchTypeArray = [253];
+ return cards.filter(card=>{
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill;
+ }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
+ },
+ addition:card=>{
+ const searchTypeArray = [253];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+ const fragment = document.createDocumentFragment();
+ fragment.append(createSkillIcon('prediction-falling'));
+ fragment.append(`×${sk[0]}T`);
+ return fragment;
+ }
+ },
+ ]},
+ {group:true,name:"Change all Orbs on Board",otLangName:{chs:"洗板类",cht:"洗板類"}, functions: [
+ {name:"Changes all Orbs to any",otLangName:{chs:"洗版-任意",cht:"洗版-任意"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [71];
const skill = getCardActiveSkill(card, searchTypeArray);
return skill;
- }).sort((a,b)=>sortByParams(a,b,searchTypeArray,3));
+ }),
+ addition:boardChange_Addition
},
- 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=>{
+ {group:true,name:"Colors Count",otLangName:{chs:"颜色数量",cht:"颜色数量"}, functions: [
+ {name:"To 1 color(Farm)",otLangName:{chs:"1色(花火)",cht:"1色(花火)"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [71];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return boardChange_ColorTypes(skill).length == 1;
+ }),
+ addition:boardChange_Addition
+ },
+ {name:"To 2 color",otLangName:{chs:"2色",cht:"2色"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [71];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return boardChange_ColorTypes(skill).length == 2;
+ }),
+ addition:boardChange_Addition
+ },
+ {name:"To 3 color",otLangName:{chs:"3色",cht:"3色"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [71];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return boardChange_ColorTypes(skill).length == 3;
+ }),
+ addition:boardChange_Addition
+ },
+ {name:"To 4 color",otLangName:{chs:"4色",cht:"4色"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [71];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return boardChange_ColorTypes(skill).length == 4;
+ }),
+ addition:boardChange_Addition
+ },
+ {name:"To 5 color",otLangName:{chs:"5色",cht:"5色"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [71];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return boardChange_ColorTypes(skill).length == 5;
+ }),
+ addition:boardChange_Addition
+ },
+ {name:"To ≥6 color",otLangName:{chs:"6色以上",cht:"6色以上"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [71];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return boardChange_ColorTypes(skill).length >= 6;
+ }),
+ addition:boardChange_Addition
+ },
+ ]},
+ {group:true,name:"Include Color",otLangName:{chs:"包含颜色",cht:"包含颜色"}, functions: [
+ {name:"Include Fire",otLangName:{chs:"含火",cht:"含火"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [71];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return boardChange_ColorTypes(skill).includes(0);
+ }),
+ addition:boardChange_Addition
+ },
+ {name:"Include Water",otLangName:{chs:"含水",cht:"含水"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [71];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return boardChange_ColorTypes(skill).includes(1);
+ }),
+ addition:boardChange_Addition
+ },
+ {name:"Include Wood",otLangName:{chs:"含木",cht:"含木"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [71];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return boardChange_ColorTypes(skill).includes(2);
+ }),
+ addition:boardChange_Addition
+ },
+ {name:"Include Light",otLangName:{chs:"含光",cht:"含光"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [71];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return boardChange_ColorTypes(skill).includes(3);
+ }),
+ addition:boardChange_Addition
+ },
+ {name:"Include Dark",otLangName:{chs:"含暗",cht:"含暗"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [71];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return boardChange_ColorTypes(skill).includes(4);
+ }),
+ addition:boardChange_Addition
+ },
+ {name:"Include Heart",otLangName:{chs:"含心",cht:"含心"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [71];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return boardChange_ColorTypes(skill).includes(5);
+ }),
+ addition:boardChange_Addition
+ },
+ {name:"Include Jammers/Poison",otLangName:{chs:"含毒废",cht:"含毒廢"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [71];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ const colors = boardChange_ColorTypes(skill);
+ return colors.includes(6)
+ || colors.includes(7)
+ || colors.includes(8)
+ || colors.includes(9);
+ }),
+ addition:boardChange_Addition
+ },
+ ]},
+ ]},
+ {group:true,name:"Orbs Color Change",otLangName:{chs:"指定色转珠类",cht:"指定色轉珠類"}, functions: [
+ {group:true,name:"To Color",otLangName:{chs:"转为颜色",cht:"转为颜色"}, functions: [
+ {name:"To Fire",otLangName:{chs:"变为-火",cht:"變爲-火"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [9,20,154];
+ const skills = getCardActiveSkills(card, searchTypeArray);
+ if (!skills.length) return false;
+ let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
+ return parsedSkills.some(p=>p.to.includes(0));
+ }),
+ addition:changeOrbs_Addition
+ },
+ {name:"To Water",otLangName:{chs:"变为-水",cht:"變爲-水"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [9,20,154];
+ const skills = getCardActiveSkills(card, searchTypeArray);
+ if (!skills.length) return false;
+ let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
+ return parsedSkills.some(p=>p.to.includes(1));
+ }),
+ addition:changeOrbs_Addition
+ },
+ {name:"To Wood",otLangName:{chs:"变为-木",cht:"變爲-木"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [9,20,154];
+ const skills = getCardActiveSkills(card, searchTypeArray);
+ if (!skills.length) return false;
+ let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
+ return parsedSkills.some(p=>p.to.includes(2));
+ }),
+ addition:changeOrbs_Addition
+ },
+ {name:"To Light",otLangName:{chs:"变为-光",cht:"變爲-光"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [9,20,154];
+ const skills = getCardActiveSkills(card, searchTypeArray);
+ if (!skills.length) return false;
+ let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
+ return parsedSkills.some(p=>p.to.includes(3));
+ }),
+ addition:changeOrbs_Addition
+ },
+ {name:"To Dark",otLangName:{chs:"变为-暗",cht:"變爲-暗"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [9,20,154];
+ const skills = getCardActiveSkills(card, searchTypeArray);
+ if (!skills.length) return false;
+ let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
+ return parsedSkills.some(p=>p.to.includes(4));
+ }),
+ addition:changeOrbs_Addition
+ },
+ {name:"To Heal",otLangName:{chs:"变为-心",cht:"變爲-心"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [9,20,154];
+ const skills = getCardActiveSkills(card, searchTypeArray);
+ if (!skills.length) return false;
+ let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
+ return parsedSkills.some(p=>p.to.includes(5));
+ }),
+ addition:changeOrbs_Addition
+ },
+ {name:"To Jammers/Poison",otLangName:{chs:"变为-毒废",cht:"變爲-毒廢"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [9,20,154];
+ const skills = getCardActiveSkills(card, searchTypeArray);
+ if (!skills.length) return false;
+ let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
+ return parsedSkills.some(p=>p.to.includes(6) || p.to.includes(7) || p.to.includes(8) || p.to.includes(9));
+ }),
+ addition:changeOrbs_Addition
+ },
+ ]},
+ {group:true,name:"From Color",otLangName:{chs:"转走颜色",cht:"转走颜色"}, functions: [
+ {name:"From Fire",otLangName:{chs:"转走-火",cht:"轉走-火"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [9,20,154];
+ const skills = getCardActiveSkills(card, searchTypeArray);
+ if (!skills.length) return false;
+ let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
+ return parsedSkills.some(p=>p.from.includes(0));
+ }),
+ addition:changeOrbs_Addition
+ },
+ {name:"From Water",otLangName:{chs:"转走-水",cht:"轉走-水"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [9,20,154];
+ const skills = getCardActiveSkills(card, searchTypeArray);
+ if (!skills.length) return false;
+ let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
+ return parsedSkills.some(p=>p.from.includes(1));
+ }),
+ addition:changeOrbs_Addition
+ },
+ {name:"From Wood",otLangName:{chs:"转走-木",cht:"轉走-木"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [9,20,154];
+ const skills = getCardActiveSkills(card, searchTypeArray);
+ if (!skills.length) return false;
+ let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
+ return parsedSkills.some(p=>p.from.includes(2));
+ }),
+ addition:changeOrbs_Addition
+ },
+ {name:"From Light",otLangName:{chs:"转走-光",cht:"轉走-光"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [9,20,154];
+ const skills = getCardActiveSkills(card, searchTypeArray);
+ if (!skills.length) return false;
+ let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
+ return parsedSkills.some(p=>p.from.includes(3));
+ }),
+ addition:changeOrbs_Addition
+ },
+ {name:"From Dark",otLangName:{chs:"转走-暗",cht:"轉走-暗"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [9,20,154];
+ const skills = getCardActiveSkills(card, searchTypeArray);
+ if (!skills.length) return false;
+ let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
+ return parsedSkills.some(p=>p.from.includes(4));
+ }),
+ addition:changeOrbs_Addition
+ },
+ {name:"From Heart",otLangName:{chs:"转走-心",cht:"轉走-心"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [9,20,154];
+ const skills = getCardActiveSkills(card, searchTypeArray);
+ if (!skills.length) return false;
+ let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
+ return parsedSkills.some(p=>p.from.includes(5));
+ }),
+ addition:changeOrbs_Addition
+ },
+ {name:"From Jammers/Poison",otLangName:{chs:"转走-毒废",cht:"轉走-毒廢"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [9,20,154];
+ const skills = getCardActiveSkills(card, searchTypeArray);
+ if (!skills.length) return false;
+ let parsedSkills = skills.flatMap(skill=>orbsChangeParse(skill));
+ return parsedSkills.some(p=>p.from.includes(6) || p.to.includes(7) || p.to.includes(8) || p.to.includes(9));
+ }),
+ addition:changeOrbs_Addition
+ },
+ ]},
+
+ ]},
+ {group:true,name:"Random Create Orbs",otLangName:{chs:"随机产珠类",cht:"隨機產珠類"}, functions: [
+ {name:"Create 15×2 color Orbs",otLangName:{chs:"产珠15个×2色",cht:"產珠15個×2色"},
+ function:cards=>cards.filter(card=>{
+ function is1515(sk)
+ {
+ return Boolean(Bin.unflags(sk[1]).length == 2 && sk[0] == 15);
+ }
+ const searchTypeArray = [141];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill && is1515(skill.params);
+ }),
+ addition:generateOrbs_Addition
+ },
+ {name:"Create 30 Orbs",otLangName:{chs:"产珠30个",cht:"產珠30個"},
+ function:cards=>cards.filter(card=>{
+ function is30(sk)
+ {
+ return Boolean(Bin.unflags(sk[1]).length * sk[0] == 30);
+ }
+ const searchTypeArray = [141];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill && is30(skill.params);
+ }),
+ addition:generateOrbs_Addition
+ },
+ {group:true,name:"Orb Color",otLangName:{chs:"生成颜色",cht:"生成颜色"}, functions: [
+ {name:"6 color Orbs",otLangName:{chs:"6色",cht:"6色"},
+ function:cards=>cards.filter(card=>{
+ const gens = generateOrbsParse(card);
+ return gens.some(gen=>(gen.to & 0b111111) === 0b111111);
+ }),
+ addition:generateOrbs_Addition
+ },
+ {name:"Fire Orbs",otLangName:{chs:"火",cht:"火"},
+ function:cards=>cards.filter(card=>{
+ const gens = generateOrbsParse(card);
+ return gens.some(gen=>gen.to & 0b000001);
+ }),
+ addition:generateOrbs_Addition
+ },
+ {name:"Water Orbs",otLangName:{chs:"水",cht:"水"},
+ function:cards=>cards.filter(card=>{
+ const gens = generateOrbsParse(card);
+ return gens.some(gen=>gen.to & 0b000010);
+ }),
+ addition:generateOrbs_Addition
+ },
+ {name:"Wood Orbs",otLangName:{chs:"木",cht:"木"},
+ function:cards=>cards.filter(card=>{
+ const gens = generateOrbsParse(card);
+ return gens.some(gen=>gen.to & 0b000100);
+ }),
+ addition:generateOrbs_Addition
+ },
+ {name:"Light Orbs",otLangName:{chs:"光",cht:"光"},
+ function:cards=>cards.filter(card=>{
+ const gens = generateOrbsParse(card);
+ return gens.some(gen=>gen.to & 0b001000);
+ }),
+ addition:generateOrbs_Addition
+ },
+ {name:"Dark Orbs",otLangName:{chs:"暗",cht:"暗"},
+ function:cards=>cards.filter(card=>{
+ const gens = generateOrbsParse(card);
+ return gens.some(gen=>gen.to & 0b010000);
+ }),
+ addition:generateOrbs_Addition
+ },
+ {name:"Heart Orbs",otLangName:{chs:"心",cht:"心"},
+ function:cards=>cards.filter(card=>{
+ const gens = generateOrbsParse(card);
+ return gens.some(gen=>gen.to & 0b100000);
+ }),
+ addition:generateOrbs_Addition
+ },
+ {name:"Jammers/Poison Orbs",otLangName:{chs:"毒废",cht:"毒廢"},
+ function:cards=>cards.filter(card=>{
+ const gens = generateOrbsParse(card);
+ return gens.some(gen=>gen.to & 0b1111000000);
+ }),
+ addition:generateOrbs_Addition
+ },
+ ]},
+ ]},
+ {group:true,name:"Create Fixed Position Orbs",otLangName:{chs:"固定位置产珠类",cht:"固定位置產珠類"}, functions: [
+ {name:"Create designated shape",otLangName:{chs:"生成指定形状的",cht:"生成指定形狀的"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [176];
const skill = getCardActiveSkill(card, searchTypeArray);
return skill;
- }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
+ }),
+ addition:card=>{
+ const searchTypeArray = [176];
+ const skills = getCardActiveSkills(card, searchTypeArray);
+ if (!skills.length) return;
+ const fragment = document.createDocumentFragment();
+ fragment.appendChild(document.createTextNode(`形状`));
+ skills.forEach(skill=>fragment.appendChild(createOrbsList(skill.params[5])));
+ return fragment;
+ }
},
- 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=>{
+ {name:"Create outer edges",otLangName:{chs:"生成四周一圈",cht:"生成四周一圈"},
+ function:cards=>cards.filter(card=>{
+ function isOuterEdges(sk)
+ {
+ const baseLineNum1 = 0b111111;
+ const baseLineNum2 = 0b100001;
+ return shapeThisRowOk(sk[0], baseLineNum1) &&
+ shapeThisRowOk(sk[1], baseLineNum2) && //第2行含有这个形状
+ shapeThisRowOk(sk[2], baseLineNum2) && //第2行含有这个形状
+ shapeThisRowOk(sk[3], baseLineNum2) && //第2行含有这个形状
+ shapeThisRowOk(sk[4], baseLineNum1);
+ }
+ const searchTypeArray = [176];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill && isOuterEdges(skill.params);
+ }),
+ addition:card=>{
+ const searchTypeArray = [176];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+ const fragment = document.createDocumentFragment();
+ fragment.appendChild(document.createTextNode(`外圈`));
+ fragment.appendChild(createOrbsList(sk[5]));
+ return fragment;
+ }
+ },
+ {name:"Create 3×3 block",otLangName:{chs:"生成3×3方块",cht:"生成3×3方塊"},
+ function:cards=>cards.filter(card=>{
+ function is3x3(sk)
+ {
+ const baseLineNum = 0b111;
+ const lineNumArr = []; //同一行内所有的可能存在 既 0b111, 0b1110, 0b11100, 0b111000
+ for (let _lineNum=baseLineNum; _lineNum<0b1000000; _lineNum<<=1)
+ {
+ lineNumArr.push(_lineNum);
+ }
+
+ for (let ri=0; ri<3; ri++)
+ {
+ //搜索所有可能的行存在
+ let maybeLineNum = lineNumArr.filter(lineNum=>shapeThisRowOk(sk[ri], lineNum));
+ if (maybeLineNum.length < 1) continue;
+
+ maybeLineNum = maybeLineNum.filter(lineNum=>
+ shapeUpsideDownRowOk(sk[ri-1], lineNum) && //如果上一行存在,并且无交集(and为0)
+ shapeUpsideDownRowOk(sk[ri+3], lineNum) && //如果第四行存在,并且无交集(and为0)
+ shapeThisRowOk(sk[ri+1], lineNum) && //第2行含有这个形状
+ shapeThisRowOk(sk[ri+2], lineNum) //第3行含有这个形状
+ );
+ if (maybeLineNum.length > 0) return true;
+ }
+ return false;
+ }
+ const searchTypeArray = [176];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill && is3x3(skill.params.slice(0,5));
+ }),
+ addition:card=>{
+ const searchTypeArray = [176];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+ const fragment = document.createDocumentFragment();
+ fragment.appendChild(document.createTextNode(`3×3`));
+ fragment.appendChild(createOrbsList(sk[5]));
+ return fragment;
+ }
+ },
+ {name:"Create cross",otLangName:{chs:"生成十字",cht:"生成十字"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [176];
+ const skills = getCardActiveSkills(card, searchTypeArray);
+ return skills.filter(skill=>shapeIsCross(skill.params.slice(0,5))).length;
+ }),
+ addition:function(card){
+ const searchTypeArray = [176];
+ const skills = getCardActiveSkills(card, searchTypeArray).filter(skill=>shapeIsCross(skill.params.slice(0,5)));
+ if (!skills.length) return;
+ const fragment = document.createDocumentFragment();
+ fragment.appendChild(document.createTextNode(`十字`));
+ skills.forEach(skill=>fragment.appendChild(createOrbsList(skill.params[5])));
+ return fragment;
+ },
+ },
+ {name:"Create L shape",otLangName:{chs:"生成L字",cht:"生成L字"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [176];
+ const skills = getCardActiveSkills(card, searchTypeArray);
+ return skills.filter(skill=>shapeIsLShape(skill.params.slice(0,5))).length;
+ }),
+ addition:function(card){
+ const searchTypeArray = [176];
+ const skills = getCardActiveSkills(card, searchTypeArray).filter(skill=>shapeIsLShape(skill.params.slice(0,5)));
+ if (!skills.length) return;
+ const fragment = document.createDocumentFragment();
+ fragment.appendChild(document.createTextNode(`L字`));
+ skills.forEach(skill=>fragment.appendChild(createOrbsList(skill.params[5])));
+ return fragment;
+ },
+ },
+ {name:"Create verticals",otLangName:{chs:"产竖",cht:"產豎"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [127];
const skill = getCardActiveSkill(card, searchTypeArray);
return skill;
- }).sort((a,b)=>sortByParams(a,b,searchTypeArray,1));
+ }),
+ addition:generateColumnOrbs_Addition
},
- 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:"Create vertical Heart",otLangName:{chs:"产竖心",cht:"產豎心"},
+ function:cards=>cards.filter(card=>{
+ function isHeart(sk)
+ {
+ for (let i=1;icards.filter(card=>{
+ const searchTypeArray = [128];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill;
+ }),
+ addition:generateRowOrbs_Addition
+ },
+ {name:"Create ≥2 horizontals",otLangName:{chs:"2横或以上",cht:"2橫或以上"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [128];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill && (skill.params.length>=3 || Bin.unflags(skill.params[0]).length>=2);
+ }),
+ addition:generateRowOrbs_Addition
+ },
+ {name:"Create 2 color horizontals",otLangName:{chs:"2色横",cht:"2色橫"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [128];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill && skill.params[3]>=0 && (skill.params[1] & skill.params[3]) != skill.params[1];
+ }),
+ addition:generateRowOrbs_Addition
+ },
+ {name:"Create horizontal not Top or Bottom",otLangName:{chs:"非顶底横",cht:"非頂底橫"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [128];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill && ((skill.params[0] | skill.params[2]) & 0b1110);
+ }),
+ addition:generateRowOrbs_Addition
+ },
+ {name:"Extensive horizontal(Farm and outer edges)",otLangName:{chs:"泛产横(包含花火与四周一圈等)",cht:"泛產橫(包含花火與四周一圈等)"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [128,71,176];
+ function isRow(skill)
+ {
+ const sk = skill.params;
+ if (skill.type === 128) {//普通横
+ return true;
+ }
+ else if (skill.type === 71) {//花火
+ return sk.slice(0,sk.includes(-1)?sk.indexOf(-1):undefined).length === 1
+ }
+ else if (skill.type === 176) {//特殊形状
+ return sk.some(n=>(n & 0b111111) === 0b111111)
+ }
+ return false;
+ }
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill && isRow(skill);
+ })
+ },
+ ]},
+ {group:true,name:"Damage Enemy - Gravity",otLangName:{chs:"对敌直接伤害类-重力",cht:"對敵直接傷害類-重力"}, functions: [
+ {name:"Any",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:"Current HP",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:"Max HP",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
+ },
+ {name:"Breaking Shield",otLangName:{chs:"破白盾",cht:"破白盾"},
+ function:cards=>{
+ const searchTypeArray = [259];
+ return cards.filter(card=>{
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill;
+ }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
+ },
+ addition:card=>{
+ const searchTypeArray = [259];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+ const fragment = document.createDocumentFragment();
+ fragment.appendChild(createSkillIcon('breaking-shield'));
+ fragment.append(`-${sk[0]}%`);
+ return fragment;
+ }
+ },
+ ]},
+ {group:true,name:"Damage Enemy - Fixed damage",otLangName:{chs:"对敌直接伤害类-无视防御固伤",cht:"對敵直接傷害類-無視防禦固傷"}, functions: [
+ {name:"Any",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:"Single",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:"Mass",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: [
+ {group:true,name:"Target",otLangName:{chs:"对象",cht:"對象"}, functions: [
+ {name:"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:"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:"Target - Designate Attr",otLangName:{chs:"对象-指定属性敌人",cht:"對象-指定屬性敵人"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [42];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill;
+ })
+ },
+ ]},
+ {group:true,name:"Attribute",otLangName:{chs:"属性",cht:"屬性"}, functions: [
+ {name:"Actors self attr.",otLangName:{chs:"释放者自身属性",cht:"釋放者自身屬性"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [2,35];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill;
+ })
+ },
+ ]},
+ {group:true,name:"Damage",otLangName:{chs:"伤害",cht:"傷害"}, functions: [
+ {name:"Damage - Rate by Actors self ATK",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:"Damage - Fixed Attr 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:"Damage - By remaining HP",otLangName:{chs:"伤害-根据剩余血量",cht:"傷害-根據剩餘血量"},
+ 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:"Damage - Team total HP",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:"Damage - Team attrs ATK",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;
+ })
+ },
+ ]},
+
+ ]},
{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];
+ let skill = Skills[card.activeSkillId];
+ //如果是单向进化类技能,也获取最后一次技能
+ if (skill.type == 232) skill = Skills[skill.params[skill.params.length-1]];
return skill.initialCooldown - (skill.maxLevel - 1) <= 1;
})
},
- {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 = getCardActiveSkill(card, searchTypeArray);
- if (subSkill)
- {
- realCD -= subSkill.params[0] * 3;
- }
- return minCD > 1 && realCD <= 4;
- })
- },
- {name:"Time pause(sort by time)",otLangName:{chs:"时间暂停(按停止时间排序)",cht:"時間暫停(按停止時間排序)"},
+ {name:"Time pause",otLangName:{chs:"时间暂停",cht:"時間暫停"},
function:cards=>{
const searchTypeArray = [5, 246, 247];
return cards.filter(card=>{
@@ -3506,16 +3579,14 @@ const specialSearchFunctions = (function() {
return `时停${value}s`;
}
},
- {
- name:"Random effect active",otLangName:{chs:"随机效果技能",cht:"隨機效果技能"},
+ {name:"Random effect active",otLangName:{chs:"随机效果技能",cht:"隨機效果技能"},
function:cards=>cards.filter(card=>{
const searchTypeArray = [118];
const skill = getCardActiveSkill(card, searchTypeArray);
return skill;
})
},
- {
- name:"Evolved active",otLangName:{chs:"进化类技能",cht:"進化類技能"},
+ {name:"Evolved active",otLangName:{chs:"进化类技能",cht:"進化類技能"},
function:cards=>cards.filter(card=>{
const searchTypeArray = [232, 233];
const skill = getCardActiveSkill(card, searchTypeArray);
@@ -3597,643 +3668,646 @@ const specialSearchFunctions = (function() {
},
]},
- {group:true,name:"======Leader Skills=====",otLangName:{chs:"======队长技======",cht:"======隊長技======"}, functions: [
- ]},
- {group:true,name:"-----Matching Style-----",otLangName:{chs:"-----匹配模式-----",cht:"-----匹配模式-----"}, functions: [
- {name:"Multiple Att.",otLangName:{chs:"杂色",cht:"雜色"},
- function:cards=>cards.filter(card=>card.leaderSkillTypes.matchMode.multipleAttr)
- },
- {name:"Orb Matching",otLangName:{chs:"长串消除",cht:"長串消除"},
- function:cards=>cards.filter(card=>card.leaderSkillTypes.matchMode.rowMatch)
- },
- {name:"Combo Matching",otLangName:{chs:"连击",cht:"連擊"},
- function:cards=>cards.filter(card=>card.leaderSkillTypes.matchMode.combo)
- },
- {name:"Same Attribute Combo Matching",otLangName:{chs:"同色多串",cht:"同色多串"},
- function:cards=>cards.filter(card=>card.leaderSkillTypes.matchMode.sameColor)
- },
- {name:"L Shape Matching",otLangName:{chs:"L消除",cht:"L消除"},
- function:cards=>cards.filter(card=>card.leaderSkillTypes.matchMode.LShape)
- },
- {name:"5 Orbs including enhanced Matching",otLangName:{chs:"5珠含强化消除",cht:"5珠含強化消除"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [150];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- return skill;
- })
- },
- {name:"Cross(十) of Heal Orbs",otLangName:{chs:"十字心",cht:"十字心"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [151,209];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- return skill;
- })
- },
- {name:"Stacked Magnifications of Cross(十)",otLangName:{chs:"十字叠加倍率",cht:"十字疊加倍率"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [157];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- return skill;
- })
- },
- {name:"Stacked Magnifications of Matching",otLangName:{chs:"指定长度消除叠加倍率",cht:"指定長度消除疊加倍率"},
- function:cards=>{
- const searchTypeArray = [235];
- return cards.filter(card=>{
+ {group:true,name:"Leader Skills",otLangName:{chs:"队长技",cht:"隊長技"}, functions: [
+
+ {group:true,name:"Matching Style",otLangName:{chs:"匹配模式",cht:"匹配模式"}, functions: [
+ {name:"Multiple Att.",otLangName:{chs:"杂色",cht:"雜色"},
+ function:cards=>cards.filter(card=>card.leaderSkillTypes.matchMode.multipleAttr)
+ },
+ {name:"Orb Matching",otLangName:{chs:"长串消除",cht:"長串消除"},
+ function:cards=>cards.filter(card=>card.leaderSkillTypes.matchMode.rowMatch)
+ },
+ {name:"Combo Matching",otLangName:{chs:"连击",cht:"連擊"},
+ function:cards=>cards.filter(card=>card.leaderSkillTypes.matchMode.combo)
+ },
+ {name:"Same Attribute Combo Matching",otLangName:{chs:"同色多串",cht:"同色多串"},
+ function:cards=>cards.filter(card=>card.leaderSkillTypes.matchMode.sameColor)
+ },
+ {name:"L Shape Matching",otLangName:{chs:"L消除",cht:"L消除"},
+ function:cards=>cards.filter(card=>card.leaderSkillTypes.matchMode.LShape)
+ },
+ {name:"5 Orbs including enhanced Matching",otLangName:{chs:"5珠含强化消除",cht:"5珠含強化消除"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [150];
const skill = getCardLeaderSkill(card, searchTypeArray);
- if (!skill) return false;
+ return skill;
+ })
+ },
+ {name:"Cross(十) of Heal Orbs",otLangName:{chs:"十字心",cht:"十字心"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [151,209];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ return skill;
+ })
+ },
+ {name:"Stacked Magnifications of Cross(十)",otLangName:{chs:"十字叠加倍率",cht:"十字疊加倍率"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [157];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ return skill;
+ })
+ },
+ {name:"Stacked Magnifications of Matching",otLangName:{chs:"指定长度消除叠加倍率",cht:"指定長度消除疊加倍率"},
+ function:cards=>{
+ const searchTypeArray = [235];
+ return cards.filter(card=>{
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ if (!skill) return false;
+ const sk = skill.params;
+ if (!sk[3] || sk[3] === 100) return false;
+ return skill;
+ }).sort((a,b)=>sortByParams(a,b,searchTypeArray,2));
+ },
+ addition:card=>{
+ const searchTypeArray = [235];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ if (!skill) return;
const sk = skill.params;
- if (!sk[3] || sk[3] === 100) return false;
+ if (!sk[3] || sk[3] === 100) return;
+ const fragment = document.createDocumentFragment();
+ const sup = document.createElement("sup");
+ sup.textContent = "N";
+ const orbs = createOrbsList(Bin.unflags(sk[0]));
+ fragment.append(`ATK×${sk[3]/100}`,sup,"/",orbs);
+ if (sk[1]) {
+ fragment.append(`×≥${sk[1]}`);
+ } else {
+ fragment.append(`×${sk[2]}`);
+ }
+ return fragment;
+ }
+ },
+ {name:"Less remain on the board",otLangName:{chs:"剩珠倍率",cht:"剩珠倍率"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [177];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ return skill?.params[5];
+ })
+ },
+ ]},
+ {group:true,name:"Restriction/Bind",otLangName:{chs:"限制",cht:"限制"}, functions: [
+ {name:"Attribute Enchantment",otLangName:{chs:"属性增强",cht:"屬性增强"},
+ function:cards=>cards.filter(card=>card.leaderSkillTypes.restriction.attrEnhance)
+ },
+ {name:"Type Enchantment",otLangName:{chs:"类型增强",cht:"類型增强"},
+ function:cards=>cards.filter(card=>card.leaderSkillTypes.restriction.typeEnhance)
+ },
+ {name:"[7×6 board]",otLangName:{chs:"【7×6 板面】",cht:"【7×6 板面】"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [162,186];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
+ })
+ },
+ {name:"[No skyfall]",otLangName:{chs:"【无天降板面】",cht:"【無天降板面】"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [163,177];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ return skill;
+ })
+ },
+ {name:"HP Percentage Activation",otLangName:{chs:"HP 比例激活",cht:"HP 比例激活"},
+ function:cards=>cards.filter(card=>card.leaderSkillTypes.restriction.HpRange)
+ },
+ {name:"Skill Use Activation",otLangName:{chs:"使用技能激活",cht:"使用技能激活"},
+ function:cards=>cards.filter(card=>card.leaderSkillTypes.restriction.useSkill)
+ },
+ {name:"Unable to less match",otLangName:{chs:"要求长串消除",cht:"要求長串消除"},
+ function:cards=>{
+ const searchTypeArray = [158];
+ return cards.filter(card=>{
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ return skill;
+ }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
+ },
+ addition:card=>{
+ const searchTypeArray = [158];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ const value = skill.params[0];
+ return `≥${value}珠`;
+ }
+ },
+ {name:"Designate member ID",otLangName:{chs:"指定队伍队员编号",cht:"指定隊伍隊員編號"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [125];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ return skill;
+ }),
+ addition:card=>{
+ const searchTypeArray = [125];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+
+ return `队员:${sk.slice(0,5).filter(Boolean).join('\n')}`;
+ }
+ },
+ {name:"Designate collab ID",otLangName:{chs:"指定队伍队员合作编号",cht:"指定隊伍隊員合作編號"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [175];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ return skill;
+ }),
+ addition:card=>{
+ const searchTypeArray = [175];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+ return `合作:${sk[0]}`;
+ }
+ },
+ {name:"Designate Evo type",otLangName:{chs:"指定队伍队员进化类型",cht:"指定隊伍隊員進化類型"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [203];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ return skill;
+ })
+ },
+ {name:"Floating rate based on the number of attrs/types",otLangName:{chs:"根据属性/类型个数浮动倍率",cht:"根據屬性/類型個數浮動倍率"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [229];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ return skill;
+ }),
+ addition:card=>{
+ const searchTypeArray = [229];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+ const attrs = Bin.unflags(sk[0]), types = Bin.unflags(sk[1]);
+ const fragment = document.createDocumentFragment();
+ if (attrs.length)
+ fragment.appendChild(createOrbsList(attrs));
+ if (types.length)
+ fragment.appendChild(createTypesList(types));
+ return fragment;
+ }
+ },
+ {name:"Limit the total rarity of the team",otLangName:{chs:"限制队伍总稀有度",cht:"限制隊伍總稀有度"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [217];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ return skill;
+ }),
+ addition:card=>{
+ const searchTypeArray = [217];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+ return `★≤${sk[0]}`;
+ }
+ },
+ {name:"Team's rarity required different",otLangName:{chs:"要求队员稀有度相同/各不相同",cht:"要求隊員稀有度相同/各不相同"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [245];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ return skill;
+ }),
+ addition:card=>{
+ const searchTypeArray = [245];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+ switch (sk[0]) {
+ case -1:
+ return `★各不相同`;
+ case -2:
+ return `★全部相同`;
+ default:
+ return `★全为${sk[0]}`;
+ }
+ }
+ },
+ ]},
+ {group:true,name:"Extra Effects",otLangName:{chs:"附加效果",cht:"附加效果"}, functions: [
+ {name:"Fixed damage inflicts",otLangName:{chs:"队长技固伤追击",cht:"隊長技固傷追擊"},
+ function:cards=>{
+ return cards.filter(card=>{
+ return getSkillFixedDamage(card) > 0;
+ }).sort((a,b)=>{
+ let a_pC = getSkillFixedDamage(a),b_pC = getSkillFixedDamage(b);
+ return a_pC - b_pC;
+ });
+ },
+ addition:card=>{
+ const value = getSkillFixedDamage(card);
+ if (value <= 0 ) return;
+ let nodeArr = [`${value.bigNumberToString()}固伤`];
+ let skill;
+ if (skill = getCardLeaderSkill(card, [235])) {
+ nodeArr.push("/");
+ nodeArr.push(createOrbsList(Bin.unflags(skill.params[0])));
+ nodeArr.push(`×${skill.params[2]}`);
+ }
+ return nodeArr.nodeJoin();
+ }
+ },
+ {name:"Adds combo",otLangName:{chs:"队长技+C",cht:"隊長技+C"},
+ function:cards=>{
+ return cards.filter(card=>{
+ return getSkillAddCombo(card) > 0;
+ }).sort((a,b)=>{
+ let a_pC = getSkillAddCombo(a),b_pC = getSkillAddCombo(b);
+ return a_pC - b_pC;
+ });
+ },
+ addition:card=>{
+ const value = getSkillAddCombo(card);
+ if (value <= 0 ) return;
+ let nodeArr = [`+${value.bigNumberToString()}C`];
+ let skill;
+ if (skill = getCardLeaderSkill(card, [210])) {
+ nodeArr.push("/十字");
+ } else if (skill = getCardLeaderSkill(card, [235])) {
+ nodeArr.push("/");
+ nodeArr.push(createOrbsList(Bin.unflags(skill.params[0])));
+ nodeArr.push(`×${skill.params[2]}`);
+ }
+ return nodeArr.nodeJoin();
+ }
+ },
+ {name:"Move time changes",otLangName:{chs:"队长技加/减秒",cht:"隊長技加/減秒"},
+ function:cards=>{
+ const searchTypeArray = [15,185];
+ return cards.filter(card=>{
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ return skill;
+ }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
+ },
+ addition:card=>{
+ const searchTypeArray = [15,185];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ if (!skill) return;
+ const value = skill.params[0];
+ return `${value > 0 ? "+" : ""}${value/100}s`;
+ }
+ },
+ {name:"Fixed move time",otLangName:{chs:"固定操作时间",cht:"固定操作時間"},
+ function:cards=>{
+ const searchTypeArray = [178];
+ return cards.filter(card=>{
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ return skill;
+ }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
+ },
+ addition:card=>{
+ const searchTypeArray = [178];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ if (!skill) return;
+ const value = skill.params[0];
+ return `固定${value}s`;
+ }
+ },
+ {name:"Impart Awakenings",otLangName:{chs:"赋予觉醒",cht:"賦予覺醒"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [213];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ return skill;
+ }),
+ addition:card=>{
+ const searchTypeArray = [213];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+ let attrs = Bin.unflags(sk[0]), types = Bin.unflags(sk[1]), awakenings = sk.slice(2);
+ const fragment = document.createDocumentFragment();
+ if (attrs.length)
+ fragment.appendChild(createOrbsList(attrs));
+ if (types.length)
+ fragment.appendChild(createTypesList(types));
+ fragment.appendChild(document.createTextNode(`:+`));
+ if (awakenings.length)
+ fragment.appendChild(creatAwokenList(awakenings));
+ return fragment;
+ }
+ },
+ {name:"Bonus attack when matching Orbs",otLangName:{chs:"消除宝珠时计算防御的追打",cht:"消除寶珠時計算防禦的追打"},
+ function:cards=>{
+ const searchTypeArray = [12];
+ return cards.filter(card=>{
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ return skill;
+ }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
+ },
+ addition:card=>{
+ const searchTypeArray = [12];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ if (!skill) return;
+ const value = skill.params[0];
+ return `攻击×${(value/100).bigNumberToString()}倍`;
+ }
+ },
+ {name:"Recovers HP when matching Orbs",otLangName:{chs:"消除宝珠时回血",cht:"消除寶珠時回血"},
+ function:cards=>{
+ const searchTypeArray = [13];
+ return cards.filter(card=>{
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ return skill;
+ }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
+ },
+ addition:card=>{
+ const searchTypeArray = [13];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ if (!skill) return;
+ const value = skill.params[0];
+ return `回复×${(value/100).bigNumberToString()}倍`;
+ }
+ },
+ {name:"Reduce damage when rcv",otLangName:{chs:"回血加盾",cht:"回血加盾"},
+ function:cards=>{
+ const searchTypeArray = [198];
+ return cards.filter(card=>{
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ return skill && skill.params[2];
}).sort((a,b)=>sortByParams(a,b,searchTypeArray,2));
- },
- addition:card=>{
- const searchTypeArray = [235];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- if (!sk[3] || sk[3] === 100) return;
- const fragment = document.createDocumentFragment();
- const sup = document.createElement("sup");
- sup.textContent = "N";
- const orbs = createOrbsList(Bin.unflags(sk[0]));
- fragment.append(`ATK×${sk[3]/100}`,sup,"/",orbs);
- if (sk[1]) {
- fragment.append(`×≥${sk[1]}`);
- } else {
- fragment.append(`×${sk[2]}`);
+ },
+ addition:card=>{
+ const searchTypeArray = [198];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+ return `回复${sk[0].bigNumberToString()},减伤${sk[2]}%`;
}
- return fragment;
- }
- },
- {name:"Less remain on the board",otLangName:{chs:"剩珠倍率",cht:"剩珠倍率"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [177];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- return skill?.params[5];
- })
- },
- ]},
- {group:true,name:"-----Restriction/Bind-----",otLangName:{chs:"-----限制-----",cht:"-----限制-----"}, functions: [
- {name:"Attribute Enchantment",otLangName:{chs:"属性增强",cht:"屬性增强"},
- function:cards=>cards.filter(card=>card.leaderSkillTypes.restriction.attrEnhance)
- },
- {name:"Type Enchantment",otLangName:{chs:"类型增强",cht:"類型增强"},
- function:cards=>cards.filter(card=>card.leaderSkillTypes.restriction.typeEnhance)
- },
- {name:"[7×6 board]",otLangName:{chs:"【7×6 板面】",cht:"【7×6 板面】"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [162,186];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- return skill;
- })
- },
- {name:"[No skyfall]",otLangName:{chs:"【无天降板面】",cht:"【無天降板面】"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [163,177];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- return skill;
- })
- },
- {name:"HP Percentage Activation",otLangName:{chs:"HP 比例激活",cht:"HP 比例激活"},
- function:cards=>cards.filter(card=>card.leaderSkillTypes.restriction.HpRange)
- },
- {name:"Skill Use Activation",otLangName:{chs:"使用技能激活",cht:"使用技能激活"},
- function:cards=>cards.filter(card=>card.leaderSkillTypes.restriction.useSkill)
- },
- {name:"Unable to less match(sort by orbs need)",otLangName:{chs:"要求长串消除(按珠数排序)",cht:"要求長串消除(按珠數排序)"},
- function:cards=>{
- const searchTypeArray = [158];
- return cards.filter(card=>{
- const skill = getCardLeaderSkill(card, searchTypeArray);
- return skill;
- }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
},
- addition:card=>{
- const searchTypeArray = [158];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- const value = skill.params[0];
- return `≥${value}珠`;
- }
- },
- {name:"Designate member ID",otLangName:{chs:"指定队伍队员编号",cht:"指定隊伍隊員編號"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [125];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- return skill;
- }),
- addition:card=>{
- const searchTypeArray = [125];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
-
- return `队员:${sk.slice(0,5).filter(Boolean).join('\n')}`;
- }
- },
- {name:"Designate collab ID",otLangName:{chs:"指定队伍队员合作编号",cht:"指定隊伍隊員合作編號"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [175];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- return skill;
- }),
- addition:card=>{
- const searchTypeArray = [175];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- return `合作:${sk[0]}`;
- }
- },
- {name:"Designate Evo type",otLangName:{chs:"指定队伍队员进化类型",cht:"指定隊伍隊員進化類型"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [203];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- return skill;
- })
- },
- {name:"Floating rate based on the number of attrs/types",otLangName:{chs:"根据属性/类型个数浮动倍率",cht:"根據屬性/類型個數浮動倍率"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [229];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- return skill;
- }),
- addition:card=>{
- const searchTypeArray = [229];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- const attrs = Bin.unflags(sk[0]), types = Bin.unflags(sk[1]);
- const fragment = document.createDocumentFragment();
- if (attrs.length)
- fragment.appendChild(createOrbsList(attrs));
- if (types.length)
- fragment.appendChild(createTypesList(types));
- return fragment;
- }
- },
- {name:"Limit the total rarity of the team",otLangName:{chs:"限制队伍总稀有度",cht:"限制隊伍總稀有度"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [217];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- return skill;
- }),
- addition:card=>{
- const searchTypeArray = [217];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- return `★≤${sk[0]}`;
- }
- },
- {name:"Team's rarity required different",otLangName:{chs:"要求队员稀有度相同/各不相同",cht:"要求隊員稀有度相同/各不相同"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [245];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- return skill;
- }),
- addition:card=>{
- const searchTypeArray = [245];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- switch (sk[0]) {
- case -1:
- return `★各不相同`;
- case -2:
- return `★全部相同`;
- default:
- return `★全为${sk[0]}`;
- }
- }
- },
- ]},
- {group:true,name:"-----Extra Effects-----",otLangName:{chs:"-----附加效果-----",cht:"-----附加效果-----"}, functions: [
- {name:"Fixed damage inflicts(sort by damage)",otLangName:{chs:"队长技固伤追击(按伤害排序)",cht:"隊長技固傷追擊(按傷害排序)"},
- function:cards=>{
- return cards.filter(card=>{
- return getSkillFixedDamage(card) > 0;
- }).sort((a,b)=>{
- let a_pC = getSkillFixedDamage(a),b_pC = getSkillFixedDamage(b);
- return a_pC - b_pC;
- });
- },
- addition:card=>{
- const value = getSkillFixedDamage(card);
- if (value <= 0 ) return;
- let nodeArr = [`${value.bigNumberToString()}固伤`];
- let skill;
- if (skill = getCardLeaderSkill(card, [235])) {
- nodeArr.push("/");
- nodeArr.push(createOrbsList(Bin.unflags(skill.params[0])));
- nodeArr.push(`×${skill.params[2]}`);
- }
- return nodeArr.nodeJoin();
- }
- },
- {name:"Adds combo(sort by combo)",otLangName:{chs:"队长技+C(按+C数排序)",cht:"隊長技+C(按+C數排序)"},
- function:cards=>{
- return cards.filter(card=>{
- return getSkillAddCombo(card) > 0;
- }).sort((a,b)=>{
- let a_pC = getSkillAddCombo(a),b_pC = getSkillAddCombo(b);
- return a_pC - b_pC;
- });
- },
- addition:card=>{
- const value = getSkillAddCombo(card);
- if (value <= 0 ) return;
- let nodeArr = [`+${value.bigNumberToString()}C`];
- let skill;
- if (skill = getCardLeaderSkill(card, [210])) {
- nodeArr.push("/十字");
- } else if (skill = getCardLeaderSkill(card, [235])) {
- nodeArr.push("/");
- nodeArr.push(createOrbsList(Bin.unflags(skill.params[0])));
- nodeArr.push(`×${skill.params[2]}`);
- }
- return nodeArr.nodeJoin();
- }
- },
- {name:"Move time changes(sort by time)",otLangName:{chs:"队长技加/减秒(按秒数排序)",cht:"隊長技加/減秒(按秒數排序)"},
- function:cards=>{
- const searchTypeArray = [15,185];
- return cards.filter(card=>{
- const skill = getCardLeaderSkill(card, searchTypeArray);
- return skill;
- }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
- },
- addition:card=>{
- const searchTypeArray = [15,185];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- if (!skill) return;
- const value = skill.params[0];
- return `${value > 0 ? "+" : ""}${value/100}s`;
- }
- },
- {name:"Fixed move time(sort by time)",otLangName:{chs:"固定操作时间(按时间排序)",cht:"固定操作時間(按時間排序)"},
- function:cards=>{
- const searchTypeArray = [178];
- return cards.filter(card=>{
- const skill = getCardLeaderSkill(card, searchTypeArray);
- return skill;
- }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
- },
- addition:card=>{
- const searchTypeArray = [178];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- if (!skill) return;
- const value = skill.params[0];
- return `固定${value}s`;
- }
- },
- {name:"Impart Awakenings",otLangName:{chs:"赋予觉醒",cht:"賦予覺醒"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [213];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- return skill;
- }),
- addition:card=>{
- const searchTypeArray = [213];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- let attrs = Bin.unflags(sk[0]), types = Bin.unflags(sk[1]), awakenings = sk.slice(2);
- const fragment = document.createDocumentFragment();
- if (attrs.length)
- fragment.appendChild(createOrbsList(attrs));
- if (types.length)
- fragment.appendChild(createTypesList(types));
- fragment.appendChild(document.createTextNode(`:+`));
- if (awakenings.length)
- fragment.appendChild(creatAwokenList(awakenings));
- return fragment;
- }
- },
- {name:"Bonus attack when matching Orbs(sort by rate)",otLangName:{chs:"消除宝珠时计算防御的追打(按追打比率排序)",cht:"消除寶珠時計算防禦的追打(按追打比率排序)"},
- function:cards=>{
- const searchTypeArray = [12];
- return cards.filter(card=>{
- const skill = getCardLeaderSkill(card, searchTypeArray);
- return skill;
- }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
- },
- addition:card=>{
- const searchTypeArray = [12];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- if (!skill) return;
- const value = skill.params[0];
- return `攻击×${(value/100).bigNumberToString()}倍`;
- }
- },
- {name:"Recovers HP when matching Orbs(sort by rate)",otLangName:{chs:"消除宝珠时回血(按回复比率排序)",cht:"消除寶珠時回血(按回複比率排序)"},
- function:cards=>{
- const searchTypeArray = [13];
- return cards.filter(card=>{
- const skill = getCardLeaderSkill(card, searchTypeArray);
- return skill;
- }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
- },
- addition:card=>{
- const searchTypeArray = [13];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- if (!skill) return;
- const value = skill.params[0];
- return `回复×${(value/100).bigNumberToString()}倍`;
- }
- },
- {name:"Reduce damage when rcv(sort by rate)",otLangName:{chs:"回血加盾(以减伤比例排序)",cht:"回血加盾(以減傷比例排序)"},
- function:cards=>{
- const searchTypeArray = [198];
- return cards.filter(card=>{
- const skill = getCardLeaderSkill(card, searchTypeArray);
- return skill && skill.params[2];
- }).sort((a,b)=>sortByParams(a,b,searchTypeArray,2));
- },
- addition:card=>{
+ {name:"Recover Awkn Skill bind when rcv",otLangName:{chs:"回血解觉",cht:"回血解覺"},
+ function:cards=>{
const searchTypeArray = [198];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- return `回复${sk[0].bigNumberToString()},减伤${sk[2]}%`;
- }
- },
- {name:"Recover Awkn Skill bind when rcv(sort by turns)",otLangName:{chs:"回血解觉(以解觉数排序)",cht:"回血解覺(以解覺數排序)"},
- function:cards=>{
- const searchTypeArray = [198];
- return cards.filter(card=>{
- const skill = getCardLeaderSkill(card, searchTypeArray);
- return skill && skill.params[3];
- }).sort((a,b)=>sortByParams(a,b,searchTypeArray,3));
- },
- addition:card=>{
- const searchTypeArray = [198];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- return `回复${sk[0].bigNumberToString()},解觉${sk[3]}T`;
- }
- },
- {name:"Counterattack(sort by rate)",otLangName:{chs:"队长技受伤反击",cht:"隊長技受傷反擊"},
- function:cards=>{
- const searchTypeArray = [41];
return cards.filter(card=>{
const skill = getCardLeaderSkill(card, searchTypeArray);
- return skill;
- }).sort((a,b)=>sortByParams(a,b,searchTypeArray,1));
+ return skill && skill.params[3];
+ }).sort((a,b)=>sortByParams(a,b,searchTypeArray,3));
+ },
+ addition:card=>{
+ const searchTypeArray = [198];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+ return `回复${sk[0].bigNumberToString()},解觉${sk[3]}T`;
+ }
},
- addition:card=>{
- const searchTypeArray = [41];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- const fragment = document.createDocumentFragment();
- fragment.appendChild(createOrbsList(sk[2] || 0));
- fragment.appendChild(document.createTextNode(`×${(sk[1]/100).bigNumberToString()}倍`));
- if (sk[0] < 100) fragment.appendChild(document.createTextNode(`(${sk[0]}%)`));
- return fragment;
- }
- },
- {name:"Voids Poison dmg",otLangName:{chs:"毒无效",cht:"毒無效"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [197];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- return skill;
- })
- },
- {name:"Resolve",otLangName:{chs:"根性",cht:"根性"},
- function:cards=>{
- const searchTypeArray = [14];
- return cards.filter(card=>{
+ {name:"Counterattack",otLangName:{chs:"队长技受伤反击",cht:"隊長技受傷反擊"},
+ function:cards=>{
+ const searchTypeArray = [41];
+ return cards.filter(card=>{
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ return skill;
+ }).sort((a,b)=>sortByParams(a,b,searchTypeArray,1));
+ },
+ addition:card=>{
+ const searchTypeArray = [41];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+ const fragment = document.createDocumentFragment();
+ fragment.appendChild(createOrbsList(sk[2] || 0));
+ fragment.appendChild(document.createTextNode(`×${(sk[1]/100).bigNumberToString()}倍`));
+ if (sk[0] < 100) fragment.appendChild(document.createTextNode(`(${sk[0]}%)`));
+ return fragment;
+ }
+ },
+ {name:"Voids Poison dmg",otLangName:{chs:"毒无效",cht:"毒無效"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [197];
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
- }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
+ })
},
- addition:card=>{
- const searchTypeArray = [14];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- if (!skill) return;
- const value = skill.params[0];
- return `HP≥${value}%`;
- }
- },
- {name:"Prediction of falling (LS)",otLangName:{chs:"预测掉落 队长技",cht:"預測掉落 队长技"},
- function:cards=>{
- const searchTypeArray = [254];
- return cards.filter(card=>{
+ {name:"Resolve",otLangName:{chs:"根性",cht:"根性"},
+ function:cards=>{
+ const searchTypeArray = [14];
+ return cards.filter(card=>{
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ return skill;
+ }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
+ },
+ addition:card=>{
+ const searchTypeArray = [14];
const skill = getCardLeaderSkill(card, searchTypeArray);
- return skill;
- }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
- }
- },
- {name:"Increase item drop rate(sort by rate)",otLangName:{chs:"增加道具掉落率(按增加倍率排序)",cht:"增加道具掉落率(按增加倍率排序)"},
- function:cards=>{
- const searchTypeArray = [53];
- return cards.filter(card=>{
+ if (!skill) return;
+ const value = skill.params[0];
+ return `HP≥${value}%`;
+ }
+ },
+ {name:"Prediction of falling (LS)",otLangName:{chs:"预测掉落 队长技",cht:"預測掉落 队长技"},
+ function:cards=>{
+ const searchTypeArray = [254];
+ return cards.filter(card=>{
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ return skill;
+ }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
+ }
+ },
+ {name:"Increase item drop rate",otLangName:{chs:"增加道具掉落率",cht:"增加道具掉落率"},
+ function:cards=>{
+ const searchTypeArray = [53];
+ return cards.filter(card=>{
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ return skill;
+ }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
+ },
+ addition:card=>{
+ const searchTypeArray = [53];
const skill = getCardLeaderSkill(card, searchTypeArray);
- return skill;
- }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
+ if (!skill) return;
+ const sk = skill.params;
+ return `掉率x${sk[0]/100}`;
+ }
},
- addition:card=>{
- const searchTypeArray = [53];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- return `掉率x${sk[0]/100}`;
- }
- },
- {name:"Increase coin rate(sort by rate)",otLangName:{chs:"增加金币掉落倍数(按增加倍率排序)",cht:"增加金幣掉落倍數(按增加倍率排序)"},
- function:cards=>{
- const searchTypeArray = [54];
- return cards.filter(card=>{
- const skill = getCardLeaderSkill(card, searchTypeArray);
- return skill;
- }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
- },
- addition:card=>{
+ {name:"Increase coin rate",otLangName:{chs:"增加金币掉落倍数",cht:"增加金幣掉落倍數"},
+ function:cards=>{
const searchTypeArray = [54];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- return `金币x${sk[0]/100}`;
- }
- },
- {name:"Increase Exp rate(sort by rate)",otLangName:{chs:"增加经验获取倍数(按增加倍率排序)",cht:"增加經驗獲取倍數(按增加倍率排序)"},
- function:cards=>{
- const searchTypeArray = [148];
return cards.filter(card=>{
const skill = getCardLeaderSkill(card, searchTypeArray);
return skill;
}).sort((a,b)=>sortByParams(a,b,searchTypeArray));
+ },
+ addition:card=>{
+ const searchTypeArray = [54];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+ return `金币x${sk[0]/100}`;
+ }
},
- addition:card=>{
- const searchTypeArray = [148];
- const skill = getCardLeaderSkill(card, searchTypeArray);
- if (!skill) return;
- const sk = skill.params;
- return `经验x${sk[0]/100}`;
- }
- },
- ]},
- {group:true,name:"-----HP Scale-----",otLangName:{chs:"-----血倍率-----",cht:"-----血倍率-----"}, functions: [
- {name:"HP Scale [3, ∞) (sort by rate)",otLangName:{chs:"队长血倍率[2, ∞)(按倍率排序)",cht:"隊長血倍率[2, ∞)(按倍率排序)"},
- function:cards=>cards.filter(card=>{
- const skill = Skills[card.leaderSkillId];
- const HPscale = getHPScale(skill);
- return HPscale >= 3;
- }).sort(sortByHPScal),
- addition: HPScal_Addition
- },
- {name:"HP Scale [2, 3) (sort by rate)",otLangName:{chs:"队长血倍率[2, ∞)(按倍率排序)",cht:"隊長血倍率[2, ∞)(按倍率排序)"},
- function:cards=>cards.filter(card=>{
- const skill = Skills[card.leaderSkillId];
- const HPscale = getHPScale(skill);
- return HPscale >= 2 && HPscale < 3;
- }).sort(sortByHPScal),
- addition: HPScal_Addition
- },
- {name:"HP Scale [1.5, 2) (sort by rate)",otLangName:{chs:"队长血倍率[1.5, 2)(按倍率排序)",cht:"隊長血倍率[1.5, 2)(按倍率排序)"},
- function:cards=>cards.filter(card=>{
- const skill = Skills[card.leaderSkillId];
- const HPscale = getHPScale(skill);
- return HPscale >= 1.5 && HPscale < 2;
- }).sort(sortByHPScal),
- addition: HPScal_Addition
- },
- {name:"HP Scale (1, 1.5) (sort by rate)",otLangName:{chs:"队长血倍率(1, 1.5)(按倍率排序)",cht:"隊長血倍率(1, 1.5)(按倍率排序)"},
- function:cards=>cards.filter(card=>{
- const skill = Skills[card.leaderSkillId];
- const HPscale = getHPScale(skill);
- return HPscale > 1 && HPscale < 1.5;
- }).sort(sortByHPScal),
- addition: HPScal_Addition
- },
- {name:"HP Scale == 1 (sort by rate)",otLangName:{chs:"队长血倍率 == 1",cht:"隊長血倍率 == 1"},
- function:cards=>cards.filter(card=>{
- const skill = Skills[card.leaderSkillId];
- const HPscale = getHPScale(skill);
- return HPscale === 1;
- }),
- addition: HPScal_Addition
- },
- {name:"HP Scale [0, 1) (sort by rate)",otLangName:{chs:"队长血倍率[0, 1)(按倍率排序)",cht:"隊長血倍率[0, 1)(按倍率排序)"},
- function:cards=>cards.filter(card=>{
- const skill = Skills[card.leaderSkillId];
- const HPscale = getHPScale(skill);
- return HPscale < 1;
- }).sort(sortByHPScal),
- addition: HPScal_Addition
- },
- ]},
- {group:true,name:"-----Reduce Shield-----",otLangName:{chs:"-----减伤盾-----",cht:"-----減傷盾-----"}, functions: [
- {name:"Reduce Damage [75%, 100%] (sort by rate)",otLangName:{chs:"队长盾减伤[75%, 100%](按倍率排序)",cht:"隊長盾減傷[75%, 100%](按倍率排序)"},
- function:cards=>cards.filter(card=>{
- const skill = Skills[card.leaderSkillId];
- const reduceScale = getReduceScale(skill);
- return reduceScale >= 0.75;
- }).sort(sortByReduceScale),
- addition: ReduceScale_Addition
- },
- {name:"Reduce Damage [50%, 75%) (sort by rate)",otLangName:{chs:"队长盾减伤[50%, 75%)(按倍率排序)",cht:"隊長盾減傷[50%, 75%)(按倍率排序)"},
- function:cards=>cards.filter(card=>{
- const skill = Skills[card.leaderSkillId];
- const reduceScale = getReduceScale(skill);
- return reduceScale >= 0.5 && reduceScale < 0.75;
- }).sort(sortByReduceScale),
- addition: ReduceScale_Addition
- },
- {name:"Reduce Damage [25%, 50%) (sort by rate)",otLangName:{chs:"队长盾减伤[25%, 50%)(按倍率排序)",cht:"隊長盾減傷[25%, 50%)(按倍率排序)"},
- function:cards=>cards.filter(card=>{
- const skill = Skills[card.leaderSkillId];
- const reduceScale = getReduceScale(skill);
- return reduceScale >= 0.25 && reduceScale < 0.5;
- }).sort(sortByReduceScale),
- addition: ReduceScale_Addition
- },
- {name:"Reduce Damage (0%, 25%) (sort by rate)",otLangName:{chs:"队长盾减伤(0%, 25%)(按倍率排序)",cht:"隊長盾減傷(0%, 25%)(按倍率排序)"},
- function:cards=>cards.filter(card=>{
- const skill = Skills[card.leaderSkillId];
- const reduceScale = getReduceScale(skill);
- return reduceScale > 0 && reduceScale < 0.25;
- }).sort(sortByReduceScale),
- addition: ReduceScale_Addition
- },
- {name:"Reduce Damage == 0",otLangName:{chs:"队长盾减伤 == 0",cht:"隊長盾減傷 == 0"},
- function:cards=>cards.filter(card=>{
- const skill = Skills[card.leaderSkillId];
- const reduceScale = getReduceScale(skill);
- return reduceScale === 0;
- })
- },
- {name:"Reduce Damage - Must all Att.",otLangName:{chs:"队长盾减伤-必须全属性减伤",cht:"隊長盾減傷-必須全屬性減傷"},
- function:cards=>cards.filter(card=>{
- const skill = Skills[card.leaderSkillId];
- return getReduceScale(skill, true) > 0;
- })
- },
- {name:"Reduce Damage - Exclude HP-line",otLangName:{chs:"队长盾减伤-排除血线盾",cht:"隊長盾減傷-排除血線盾"},
- function:cards=>cards.filter(card=>{
- const skill = Skills[card.leaderSkillId];
- return getReduceScale(skill, undefined, true) > 0;
- })
- },
- {name:"Reduce Damage - Exclude chance",otLangName:{chs:"队长盾减伤-排除几率盾",cht:"隊長盾減傷-排除幾率盾"},
- function:cards=>cards.filter(card=>{
- const skill = Skills[card.leaderSkillId];
- return getReduceScale(skill, undefined, undefined, true) > 0;
- })
- },
- /*{name:"More than half with 99% gravity[29%, 100%)",otLangName:{chs:"满血99重力不下半血-队长盾减伤[29%, 100%)",cht:"滿血99重力不下半血-隊長盾減傷[29%, 100%)"},
- function:cards=>cards.filter(card=>{
- const skill = Skills[card.leaderSkillId];
- const reduceScale = getReduceScale(skill);
- return reduceScale>=0.29;
- }).sort(sortByReduceScale)
- },*/
- {name:"Reduce Damage - Unconditional",otLangName:{chs:"队长盾减伤-无条件盾",cht:"隊長盾減傷-無條件盾"},
- function:cards=>{
- return cards.filter(card=>{
+ {name:"Increase Exp rate",otLangName:{chs:"增加经验获取倍数",cht:"增加經驗獲取倍數"},
+ function:cards=>{
+ const searchTypeArray = [148];
+ return cards.filter(card=>{
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ return skill;
+ }).sort((a,b)=>sortByParams(a,b,searchTypeArray));
+ },
+ addition:card=>{
+ const searchTypeArray = [148];
+ const skill = getCardLeaderSkill(card, searchTypeArray);
+ if (!skill) return;
+ const sk = skill.params;
+ return `经验x${sk[0]/100}`;
+ }
+ },
+ ]},
+ {group:true,name:"HP Scale",otLangName:{chs:"血倍率",cht:"血倍率"}, functions: [
+ {name:"HP Scale [3, ∞)",otLangName:{chs:"队长血倍率[2, ∞)",cht:"隊長血倍率[2, ∞)"},
+ function:cards=>cards.filter(card=>{
const skill = Skills[card.leaderSkillId];
- return getReduceScale_unconditional(skill) > 0;
- }).sort((a,b)=>{
- const a_s = Skills[a.leaderSkillId], b_s = Skills[b.leaderSkillId];
- return getReduceScale_unconditional(a_s) - getReduceScale_unconditional(b_s);
- });
+ const HPscale = getHPScale(skill);
+ return HPscale >= 3;
+ }).sort(sortByHPScal),
+ addition: HPScal_Addition
},
- addition:card=>{
- const skill = Skills[card.leaderSkillId];
- const scale = getReduceScale_unconditional(skill)
- return scale > 0 && `无条件${Math.round(getReduceScale_unconditional(skill) * 100)}%`;
- }
- },
+ {name:"HP Scale [2, 3)",otLangName:{chs:"队长血倍率[2, ∞)",cht:"隊長血倍率[2, ∞)"},
+ function:cards=>cards.filter(card=>{
+ const skill = Skills[card.leaderSkillId];
+ const HPscale = getHPScale(skill);
+ return HPscale >= 2 && HPscale < 3;
+ }).sort(sortByHPScal),
+ addition: HPScal_Addition
+ },
+ {name:"HP Scale [1.5, 2)",otLangName:{chs:"队长血倍率[1.5, 2)",cht:"隊長血倍率[1.5, 2)"},
+ function:cards=>cards.filter(card=>{
+ const skill = Skills[card.leaderSkillId];
+ const HPscale = getHPScale(skill);
+ return HPscale >= 1.5 && HPscale < 2;
+ }).sort(sortByHPScal),
+ addition: HPScal_Addition
+ },
+ {name:"HP Scale (1, 1.5)",otLangName:{chs:"队长血倍率(1, 1.5)",cht:"隊長血倍率(1, 1.5)"},
+ function:cards=>cards.filter(card=>{
+ const skill = Skills[card.leaderSkillId];
+ const HPscale = getHPScale(skill);
+ return HPscale > 1 && HPscale < 1.5;
+ }).sort(sortByHPScal),
+ addition: HPScal_Addition
+ },
+ {name:"HP Scale == 1",otLangName:{chs:"队长血倍率 == 1",cht:"隊長血倍率 == 1"},
+ function:cards=>cards.filter(card=>{
+ const skill = Skills[card.leaderSkillId];
+ const HPscale = getHPScale(skill);
+ return HPscale === 1;
+ }),
+ addition: HPScal_Addition
+ },
+ {name:"HP Scale [0, 1)",otLangName:{chs:"队长血倍率[0, 1)",cht:"隊長血倍率[0, 1)"},
+ function:cards=>cards.filter(card=>{
+ const skill = Skills[card.leaderSkillId];
+ const HPscale = getHPScale(skill);
+ return HPscale < 1;
+ }).sort(sortByHPScal),
+ addition: HPScal_Addition
+ },
+ ]},
+ {group:true,name:"Reduce Shield",otLangName:{chs:"减伤盾",cht:"減傷盾"}, functions: [
+ {name:"Reduce Damage [75%, 100%]",otLangName:{chs:"队长盾减伤[75%, 100%]",cht:"隊長盾減傷[75%, 100%]"},
+ function:cards=>cards.filter(card=>{
+ const skill = Skills[card.leaderSkillId];
+ const reduceScale = getReduceScale(skill);
+ return reduceScale >= 0.75;
+ }).sort(sortByReduceScale),
+ addition: ReduceScale_Addition
+ },
+ {name:"Reduce Damage [50%, 75%)",otLangName:{chs:"队长盾减伤[50%, 75%)",cht:"隊長盾減傷[50%, 75%)"},
+ function:cards=>cards.filter(card=>{
+ const skill = Skills[card.leaderSkillId];
+ const reduceScale = getReduceScale(skill);
+ return reduceScale >= 0.5 && reduceScale < 0.75;
+ }).sort(sortByReduceScale),
+ addition: ReduceScale_Addition
+ },
+ {name:"Reduce Damage [25%, 50%)",otLangName:{chs:"队长盾减伤[25%, 50%)",cht:"隊長盾減傷[25%, 50%)"},
+ function:cards=>cards.filter(card=>{
+ const skill = Skills[card.leaderSkillId];
+ const reduceScale = getReduceScale(skill);
+ return reduceScale >= 0.25 && reduceScale < 0.5;
+ }).sort(sortByReduceScale),
+ addition: ReduceScale_Addition
+ },
+ {name:"Reduce Damage (0%, 25%)",otLangName:{chs:"队长盾减伤(0%, 25%)",cht:"隊長盾減傷(0%, 25%)"},
+ function:cards=>cards.filter(card=>{
+ const skill = Skills[card.leaderSkillId];
+ const reduceScale = getReduceScale(skill);
+ return reduceScale > 0 && reduceScale < 0.25;
+ }).sort(sortByReduceScale),
+ addition: ReduceScale_Addition
+ },
+ {name:"Reduce Damage == 0",otLangName:{chs:"队长盾减伤 == 0",cht:"隊長盾減傷 == 0"},
+ function:cards=>cards.filter(card=>{
+ const skill = Skills[card.leaderSkillId];
+ const reduceScale = getReduceScale(skill);
+ return reduceScale === 0;
+ })
+ },
+ {name:"Reduce Damage - Must all Att.",otLangName:{chs:"队长盾减伤-必须全属性减伤",cht:"隊長盾減傷-必須全屬性減傷"},
+ function:cards=>cards.filter(card=>{
+ const skill = Skills[card.leaderSkillId];
+ return getReduceScale(skill, true) > 0;
+ })
+ },
+ {name:"Reduce Damage - Exclude HP-line",otLangName:{chs:"队长盾减伤-排除血线盾",cht:"隊長盾減傷-排除血線盾"},
+ function:cards=>cards.filter(card=>{
+ const skill = Skills[card.leaderSkillId];
+ return getReduceScale(skill, undefined, true) > 0;
+ })
+ },
+ {name:"Reduce Damage - Exclude chance",otLangName:{chs:"队长盾减伤-排除几率盾",cht:"隊長盾減傷-排除幾率盾"},
+ function:cards=>cards.filter(card=>{
+ const skill = Skills[card.leaderSkillId];
+ return getReduceScale(skill, undefined, undefined, true) > 0;
+ })
+ },
+ /*{name:"More than half with 99% gravity[29%, 100%)",otLangName:{chs:"满血99重力不下半血-队长盾减伤[29%, 100%)",cht:"滿血99重力不下半血-隊長盾減傷[29%, 100%)"},
+ function:cards=>cards.filter(card=>{
+ const skill = Skills[card.leaderSkillId];
+ const reduceScale = getReduceScale(skill);
+ return reduceScale>=0.29;
+ }).sort(sortByReduceScale)
+ },*/
+ {name:"Reduce Damage - Unconditional",otLangName:{chs:"队长盾减伤-无条件盾",cht:"隊長盾減傷-無條件盾"},
+ function:cards=>{
+ return cards.filter(card=>{
+ const skill = Skills[card.leaderSkillId];
+ return getReduceScale_unconditional(skill) > 0;
+ }).sort((a,b)=>{
+ const a_s = Skills[a.leaderSkillId], b_s = Skills[b.leaderSkillId];
+ return getReduceScale_unconditional(a_s) - getReduceScale_unconditional(b_s);
+ });
+ },
+ addition:card=>{
+ const skill = Skills[card.leaderSkillId];
+ const scale = getReduceScale_unconditional(skill)
+ return scale > 0 && `无条件${Math.round(getReduceScale_unconditional(skill) * 100)}%`;
+ }
+ },
+ ]},
]},
- {group:true,name:"======Evo type======",otLangName:{chs:"======进化类型======",cht:"======進化類型======"}, functions: [
- {name:"No Henshin",otLangName:{chs:"非变身",cht:"非變身"},
- function:cards=>cards.filter(card=>
- !Array.isArray(card.henshinFrom) &&
- !Array.isArray(card.henshinTo))
- },
- {name:"Before Henshin",otLangName:{chs:"变身前",cht:"變身前"},
- function:cards=>cards.filter(card=>Array.isArray(card.henshinTo))
- },
- {name:"After Henshin",otLangName:{chs:"变身后",cht:"變身後"},
- function:cards=>cards.filter(card=>Array.isArray(card.henshinFrom))
- },
- {name:"Random Henshin",otLangName:{chs:"随机变身",cht:"隨機變身"},
- function:cards=>cards.filter(card=>{
- const searchTypeArray = [236];
- const skill = getCardActiveSkill(card, searchTypeArray);
- return skill;
- })
- },
- {name:"Except Before Henshin(No Henshin+After Henshin)",otLangName:{chs:"除了变身前(非变身+变身后)",cht:"除了變身前(非變身+變身后)"},
- function:cards=>cards.filter(card=>!Array.isArray(card.henshinTo))
- },
+ {group:true,name:"Evo type",otLangName:{chs:"进化类型",cht:"進化類型"}, functions: [
+ {group:true,name:"Transform",otLangName:{chs:"变身相关",cht:"變身相關"}, functions: [
+ {name:"No Transform",otLangName:{chs:"非变身",cht:"非變身"},
+ function:cards=>cards.filter(card=>
+ !Array.isArray(card.henshinFrom) &&
+ !Array.isArray(card.henshinTo))
+ },
+ {name:"After Transform",otLangName:{chs:"变身后",cht:"變身後"},
+ function:cards=>cards.filter(card=>Array.isArray(card.henshinFrom))
+ },
+ {name:"Before Transform",otLangName:{chs:"变身前",cht:"變身前"},
+ function:cards=>cards.filter(card=>Array.isArray(card.henshinTo))
+ },
+ {name:"Not Before Transform",otLangName:{chs:"除了变身前",cht:"除了變身前"},
+ function:cards=>cards.filter(card=>!Array.isArray(card.henshinTo))
+ },
+ {name:"Random Transform",otLangName:{chs:"随机变身",cht:"隨機變身"},
+ function:cards=>cards.filter(card=>{
+ const searchTypeArray = [236];
+ const skill = getCardActiveSkill(card, searchTypeArray);
+ return skill;
+ })
+ },
+ ]},
{name:"Pixel Evo",otLangName:{chs:"像素进化",cht:"像素進化"},
function:cards=>cards.filter(card=>card.evoMaterials.includes(3826))
},
//{name:"",otLangName:{chs:"非8格潜觉",cht:"非8格潛覺"},function:cards=>cards.filter(card=>!card.is8Latent)},
- {name:"Reincarnation/Super Re..",otLangName:{chs:"转生、超转生进化",cht:"轉生、超轉生進化"},
+ {name:"Reincarnation/Super Rein..",otLangName:{chs:"转生、超转生进化",cht:"轉生、超轉生進化"},
function:cards=>cards.filter(isReincarnated)
}, //evoBaseId可能为0
//{name:"",otLangName:{chs:"仅超转生进化",cht:"僅超轉生進化"},function:cards=>cards.filter(card=>isReincarnated(card) && !Cards[card.evoBaseId].isUltEvo)},
@@ -4248,7 +4322,7 @@ const specialSearchFunctions = (function() {
addition:card=>card.evoMaterials[0] === 0xFFFF && `地下城ID:${card.evoMaterials[1]}`
},
]},
- {group:true,name:"====== Awakenings ======",otLangName:{chs:"======觉醒类======",cht:"======覺醒類======"}, functions: [
+ {group:true,name:"Awakenings",otLangName:{chs:"觉醒类",cht:"覺醒類"}, functions: [
{name:"Have Sync Awoken",otLangName:{chs:"有同步觉醒",cht:"有同步覺醒"},
function:cards=>cards.filter(card=>card.syncAwakening),
addition:card=>{if (card.syncAwakeningConditions) {
@@ -4261,7 +4335,7 @@ const specialSearchFunctions = (function() {
{name:"Has, but not full Awakening",otLangName:{chs:"有,但觉醒未满",cht:"有,覺醒未滿"},
function:cards=>cards.filter(card=>card.awakenings.length > 0 && card.awakenings.length < ( card.awakenings.includes(49) ? 8 : 9))
},
- {name:"3 same Killer (include super Awoken), or 2 with same latent",otLangName:{chs:"3个相同杀觉醒(含超觉),或相同潜觉",cht:"3個相同殺覺醒(含超覺),或相同潛覺"},
+ {name:"3 same Killer, or 2 with latent",otLangName:{chs:"3个相同杀觉醒,或2+潜觉",cht:"3個相同殺覺醒,或2+潛覺"},
function:cards=>cards.filter(card=>{
const hasAwokenKiller = typekiller_for_type.find(type=>card.awakenings.filter(ak=>ak===type.awoken).length+(card.superAwakenings.includes(type.awoken)?1:0)>=2);
if (hasAwokenKiller)
@@ -4286,34 +4360,34 @@ const specialSearchFunctions = (function() {
}
})
},
+ {group:true,name:"Kind of Awakening (No Super Awoken)",otLangName:{chs:"某类觉醒(无超觉)",cht:"某類覺醒(无超觉)"}, functions: [
+ {name:"Any Reduce Attr. Damage Awakening",otLangName:{chs:"任意颜色盾觉醒",cht:"任意顏色盾覺醒"},
+ function:cards=>cards.filter(card=>card.awakenings.some(ak=>ak>=4 && ak<=8))
+ },
+ {name:"Any Killer Awakening",otLangName:{chs:"任意杀手觉醒",cht:"任意殺手覺醒"},
+ function:cards=>cards.filter(card=>card.awakenings.some(ak=>ak>=31 && ak<=42))
+ },
+ {name:"Any Enhanced Orbs Awakening",otLangName:{chs:"任意+珠觉醒",cht:"任意+珠覺醒"},
+ function:cards=>cards.filter(card=>card.awakenings.some(ak=>ak>=14 && ak<=18 || ak === 29 || ak>=99 && ak<=104))
+ },
+ {name:"Any Enhanced Rows Awakening",otLangName:{chs:"任意横行强化觉醒",cht:"任意横行強化覺醒"},
+ function:cards=>cards.filter(card=>card.awakenings.some(ak=>ak>=22 && ak<=26 || ak>=116 && ak<=120))
+ },
+ {name:"Any Enhanced Combos Awakening",otLangName:{chs:"任意连击强化(章鱼烧)觉醒",cht:"任意連擊強化(章魚燒)覺醒"},
+ function:cards=>cards.filter(card=>card.awakenings.some(ak=>ak>=73 && ak<=77 || ak>=121 && ak<=125))
+ },
+ {name:"Any Multi Attr. Enhanced Awakening",otLangName:{chs:"任意杂色强化觉醒",cht:"任意雜色強化覺醒"},
+ function:cards=>cards.filter(card=>card.awakenings.some(ak=>ak === 44 || ak === 51 || ak>=79 && ak<=81 || ak === 97 || ak>=112 && ak<=114))
+ },
+ {name:"Any Add Type Awakening",otLangName:{chs:"任意附加类型觉醒",cht:"任意附加類型覺醒"},
+ function:cards=>cards.filter(card=>card.awakenings.some(ak=>ak>=83 && ak<=90))
+ },
+ {name:"Any Change Sub Attr. Awakening",otLangName:{chs:"任意更改副属性觉醒",cht:"任意更改副屬性覺醒"},
+ function:cards=>cards.filter(card=>card.awakenings.some(ak=>ak>=91 && ak<=95))
+ },
+ ]},
]},
- {group:true,name:"----- Kind of Awakening (No Super Awoken) -----",otLangName:{chs:"-----某类觉醒(无超觉)-----",cht:"-----某類覺醒(无超觉)-----"}, functions: [
- {name:"Any Reduce Attr. Damage Awakening",otLangName:{chs:"任意颜色盾觉醒",cht:"任意顏色盾覺醒"},
- function:cards=>cards.filter(card=>card.awakenings.some(ak=>ak>=4 && ak<=8))
- },
- {name:"Any Killer Awakening",otLangName:{chs:"任意杀手觉醒",cht:"任意殺手覺醒"},
- function:cards=>cards.filter(card=>card.awakenings.some(ak=>ak>=31 && ak<=42))
- },
- {name:"Any Enhanced Orbs Awakening",otLangName:{chs:"任意+珠觉醒",cht:"任意+珠覺醒"},
- function:cards=>cards.filter(card=>card.awakenings.some(ak=>ak>=14 && ak<=18 || ak === 29 || ak>=99 && ak<=104))
- },
- {name:"Any Enhanced Rows Awakening",otLangName:{chs:"任意横行强化觉醒",cht:"任意横行強化覺醒"},
- function:cards=>cards.filter(card=>card.awakenings.some(ak=>ak>=22 && ak<=26 || ak>=116 && ak<=120))
- },
- {name:"Any Enhanced Combos Awakening",otLangName:{chs:"任意连击强化(章鱼烧)觉醒",cht:"任意連擊強化(章魚燒)覺醒"},
- function:cards=>cards.filter(card=>card.awakenings.some(ak=>ak>=73 && ak<=77 || ak>=121 && ak<=125))
- },
- {name:"Any Multi Attr. Enhanced Awakening",otLangName:{chs:"任意杂色强化觉醒",cht:"任意雜色強化覺醒"},
- function:cards=>cards.filter(card=>card.awakenings.some(ak=>ak === 44 || ak === 51 || ak>=79 && ak<=81 || ak === 97 || ak>=112 && ak<=114))
- },
- {name:"Any Add Type Awakening",otLangName:{chs:"任意附加类型觉醒",cht:"任意附加類型覺醒"},
- function:cards=>cards.filter(card=>card.awakenings.some(ak=>ak>=83 && ak<=90))
- },
- {name:"Any Change Sub Attr. Awakening",otLangName:{chs:"任意更改副属性觉醒",cht:"任意更改副屬性覺醒"},
- function:cards=>cards.filter(card=>card.awakenings.some(ak=>ak>=91 && ak<=95))
- },
- ]},
- {group:true,name:"======Others Search======",otLangName:{chs:"======其他搜索======",cht:"======其他搜索======"}, functions: [
+ {group:true,name:"Others Search",otLangName:{chs:"其他搜索",cht:"其他搜索"}, functions: [
{name:"Water Att. & Attacker Type(Tanjiro)",otLangName:{chs:"攻击型或水属性(炭治郎队员)",cht:"攻擊型或水屬性(炭治郎隊員)"},
function:cards=>cards.filter(card=>card.attrs.includes(1) || card.types.includes(6))
},
@@ -4323,7 +4397,7 @@ const specialSearchFunctions = (function() {
{name:"Able to lv110, but no Super Awoken",otLangName:{chs:"能突破等级限制但没有超觉醒",cht:"能突破等級限制但沒有超覺醒"},
function:cards=>cards.filter(card=>card.limitBreakIncr > 0 && card.superAwakenings.length == 0)
},
- {name:"Raise ≥50% at lv110(sort by scale)",otLangName:{chs:"110级三维成长≥50%(按比例排序)",cht:"110級三維成長≥50%(按比例排序)"},
+ {name:"Raise ≥50% at lv110",otLangName:{chs:"110级三维成长≥50%",cht:"110級三維成長≥50%"},
function:cards=>cards.filter(card=>card.limitBreakIncr>=50).sort((a,b)=>a.limitBreakIncr - b.limitBreakIncr),
addition:card=>`成长${card.limitBreakIncr}%`
},
@@ -4342,30 +4416,6 @@ const specialSearchFunctions = (function() {
{name:"3 attrs are different",otLangName:{chs:"3属性不一致",cht:"3屬性不一致"},
function:cards=>cards.filter(({attrs})=>(new Set(attrs.filter(a=>a>=0 && a<6))).size >= 3)
},
- {name:"Will get Orbs skin",otLangName:{chs:"能获得宝珠皮肤",cht:"能獲得寶珠皮膚"},
- function:cards=>cards.filter(({orbSkinOrBgmId})=>orbSkinOrBgmId>0 && orbSkinOrBgmId<1e4),
- addition:({orbSkinOrBgmId})=>Boolean(orbSkinOrBgmId) && `ID.${orbSkinOrBgmId}`
- },
- {name:"Will get BGM",otLangName:{chs:"能获得背景音乐",cht:"能獲得背景音樂"},
- function:cards=>cards.filter(({orbSkinOrBgmId})=>orbSkinOrBgmId>=1e4),
- addition:({orbSkinOrBgmId})=>Boolean(orbSkinOrBgmId) && `ID.${orbSkinOrBgmId}`
- },
- {name:"Will get Team Badge",otLangName:{chs:"能获得队伍徽章",cht:"能獲得隊伍徽章"},
- function:cards=>cards.filter(({badgeId})=>badgeId),
- addition:({badgeId})=>{
- if (!badgeId) return;
- const fragment = document.createDocumentFragment();
- fragment.append(`ID.${badgeId}`);
- const icon = document.createElement("icon");
- icon.className = "badge";
- icon.setAttribute("data-badge-icon", badgeId);
- fragment.append(icon);
- return fragment;
- }
- },
- {name:"Hava banner when use skill",otLangName:{chs:"使用技能时有横幅",cht:"使用技能時有橫幅"},
- function:cards=>cards.filter(card=>card.skillBanner)
- },
{name:"All Latent TAMADRA",otLangName:{chs:"所有潜觉蛋龙",cht:"所有潛覺蛋龍"},
function:cards=>cards.filter(card=>card.latentAwakeningId>0).sort((a,b)=>a.latentAwakeningId-b.latentAwakeningId)
},
@@ -4375,56 +4425,85 @@ const specialSearchFunctions = (function() {
{name:"Not stacked material",otLangName:{chs:"不堆叠的素材",cht:"不堆疊的素材"},
function:cards=>cards.filter(card=>!card.stackable && card.types.some(t=>[0,12,14,15].includes(t))),
},
- ]},
- {group:true,name:"----- Additional display -----",otLangName:{chs:"----- 附加显示 -----",cht:"----- 附加显示 -----"}, functions: [
- {name:"Show Original Name",otLangName:{chs:"显示怪物原始名称",cht:"显示怪物原始名稱"},
- function:cards=>cards,
- addition:card=>card.name
- },
- {name:"Show Feed EXP",otLangName:{chs:"显示合成经验值",cht:"显示合成經驗值"},
- function:cards=>cards.filter(card=>card.feedExp > 0).sort((a,b)=>a.feedExp * a.maxLevel - b.feedExp * b.maxLevel),
- addition:card=>`EXP ${Math.round(card.feedExp * card.maxLevel / 4).bigNumberToString()}`
- },
- {name:"Show Sell Price",otLangName:{chs:"显示售卖金钱",cht:"显示售賣金錢"},
- function:cards=>cards.filter(card=>card.sellPrice > 0).sort((a,b)=>a.sellPrice * a.maxLevel - b.sellPrice * b.maxLevel),
- addition:card=>`Coin ${Math.round(card.sellPrice * card.maxLevel / 10).bigNumberToString()}`
- },
- {name:"Show Sell Monster Point(MP)",otLangName:{chs:"显示售卖怪物点数(MP)",cht:"显示售賣怪物點數(MP)"},
- function:cards=>cards,
- addition:card=>`MP ${card.sellMP.bigNumberToString()}`
- },
- {name:"Show Card Types",otLangName:{chs:"显示角色类型",cht:"显示角色類型"},
- function:cards=>cards,
- addition:card=>createTypesList(card.types)
- },
- {name:"Show Card Cost",otLangName:{chs:"显示角色消耗",cht:"显示角色消耗"},
- function:cards=>cards,
- addition:card=>`COST ${card.cost}`
- },
- {name:"Show Card Group ID",otLangName:{chs:"显示角色分组ID",cht:"顯示角色分組ID"},
- function:cards=>cards,
- addition:card=>{
- const ul = document.createElement("ul");
- ul.className = "monsterinfo-groupId";
- const mSeriesId = ul.appendChild(document.createElement("li"));
- mSeriesId.className = "monster-seriesId";
- mSeriesId.textContent = card.seriesId;
- mSeriesId.setAttribute(dataAttrName, card.seriesId);
- mSeriesId.classList.toggle(className_displayNone, !card.seriesId);
- const mCollabId = ul.appendChild(document.createElement("li"));
- mCollabId.className = "monster-collabId";
- mCollabId.textContent = card.collabId;
- mCollabId.setAttribute(dataAttrName, card.collabId);
- mCollabId.classList.toggle(className_displayNone, !card.collabId);
- const mGachaId = ul.appendChild(document.createElement("li"));
- mGachaId.className = "monster-gachaId";
- mGachaId.textContent = card.gachaIds.join();
- mGachaId.setAttribute(dataAttrName, card.gachaIds.join());
- mGachaId.classList.toggle(className_displayNone, !card.gachaIds.length);
- return ul;
- }
+ {group:true,name:"Sold in stores",otLangName:{chs:"直接售卖",cht:"直接售賣"}, functions: [
+ {name:"Will get Orbs skin",otLangName:{chs:"能获得宝珠皮肤",cht:"能獲得寶珠皮膚"},
+ function:cards=>cards.filter(({orbSkinOrBgmId})=>orbSkinOrBgmId>0 && orbSkinOrBgmId<1e4),
+ addition:({orbSkinOrBgmId})=>Boolean(orbSkinOrBgmId) && `ID.${orbSkinOrBgmId}`
+ },
+ {name:"Will get BGM",otLangName:{chs:"能获得背景音乐",cht:"能獲得背景音樂"},
+ function:cards=>cards.filter(({orbSkinOrBgmId})=>orbSkinOrBgmId>=1e4),
+ addition:({orbSkinOrBgmId})=>Boolean(orbSkinOrBgmId) && `ID.${orbSkinOrBgmId}`
+ },
+ {name:"Will get Team Badge",otLangName:{chs:"能获得队伍徽章",cht:"能獲得隊伍徽章"},
+ function:cards=>cards.filter(({badgeId})=>badgeId),
+ addition:({badgeId})=>{
+ if (!badgeId) return;
+ const fragment = document.createDocumentFragment();
+ fragment.append(`ID.${badgeId}`);
+ const icon = document.createElement("icon");
+ icon.className = "badge";
+ icon.setAttribute("data-badge-icon", badgeId);
+ fragment.append(icon);
+ return fragment;
+ }
+ },
+ ]},
+ {name:"Hava banner when use skill",otLangName:{chs:"使用技能时有横幅",cht:"使用技能時有橫幅"},
+ function:cards=>cards.filter(card=>card.skillBanner)
},
+ {group:true,name:"Only Additional display",otLangName:{chs:"附加显示",cht:"附加显示"}, functions: [
+ {name:"Show Original Name",otLangName:{chs:"显示怪物原始名称",cht:"显示怪物原始名稱"},
+ function:cards=>cards,
+ addition:card=>card.name
+ },
+ {name:"Show Feed EXP",otLangName:{chs:"显示合成经验值",cht:"显示合成經驗值"},
+ function:cards=>cards.filter(card=>card.feedExp > 0).sort((a,b)=>a.feedExp * a.maxLevel - b.feedExp * b.maxLevel),
+ addition:card=>`EXP ${Math.round(card.feedExp * card.maxLevel / 4).bigNumberToString()}`
+ },
+ {name:"Show Sell Price",otLangName:{chs:"显示售卖金钱",cht:"显示售賣金錢"},
+ function:cards=>cards.filter(card=>card.sellPrice > 0).sort((a,b)=>a.sellPrice * a.maxLevel - b.sellPrice * b.maxLevel),
+ addition:card=>`Coin ${Math.round(card.sellPrice * card.maxLevel / 10).bigNumberToString()}`
+ },
+ {name:"Show Sell Monster Point(MP)",otLangName:{chs:"显示售卖怪物点数(MP)",cht:"显示售賣怪物點數(MP)"},
+ function:cards=>cards,
+ addition:card=>`MP ${card.sellMP.bigNumberToString()}`
+ },
+ {name:"Show Card Types",otLangName:{chs:"显示角色类型",cht:"显示角色類型"},
+ function:cards=>cards,
+ addition:card=>createTypesList(card.types)
+ },
+ {name:"Show Card Cost",otLangName:{chs:"显示角色消耗",cht:"显示角色消耗"},
+ function:cards=>cards,
+ addition:card=>`COST ${card.cost}`
+ },
+ {name:"Show Card Group ID",otLangName:{chs:"显示角色分组ID",cht:"顯示角色分組ID"},
+ function:cards=>cards,
+ addition:card=>{
+ const ul = document.createElement("ul");
+ ul.className = "monsterinfo-groupId";
+ const mSeriesId = ul.appendChild(document.createElement("li"));
+ mSeriesId.className = "monster-seriesId";
+ mSeriesId.textContent = card.seriesId;
+ mSeriesId.setAttribute(dataAttrName, card.seriesId);
+ mSeriesId.classList.toggle(className_displayNone, !card.seriesId);
+ const mCollabId = ul.appendChild(document.createElement("li"));
+ mCollabId.className = "monster-collabId";
+ mCollabId.textContent = card.collabId;
+ mCollabId.setAttribute(dataAttrName, card.collabId);
+ mCollabId.classList.toggle(className_displayNone, !card.collabId);
+ const mGachaId = ul.appendChild(document.createElement("li"));
+ mGachaId.className = "monster-gachaId";
+ mGachaId.textContent = card.gachaIds.join();
+ mGachaId.setAttribute(dataAttrName, card.gachaIds.join());
+ mGachaId.classList.toggle(className_displayNone, !card.gachaIds.length);
+ return ul;
+ }
+ },
+ ]},
]},
];
- return functions;
+ return {
+ name:"All Functions",
+ functions: functions
+ };
})();
\ No newline at end of file
diff --git a/script-universal_function.js b/script-universal_function.js
index 9e3be819..afddc237 100644
--- a/script-universal_function.js
+++ b/script-universal_function.js
@@ -704,7 +704,7 @@ function awokenCountInTeam(team, awokenIndex, solo, teamsCount) {
return teamAwokenCount;
}
//返回可用的怪物名称
-function returnMonsterNameArr(card, lsList, defaultCode) {
+function returnMonsterNameArr(card, lsList = currentLanguage.searchlist, defaultCode = currentDataSource.code) {
const monNameArr = lsList.map(lc => { //取出每种语言
if (lc == defaultCode)
return card.name;
diff --git a/script.js b/script.js
index 2ab4604b..5d9605bc 100644
--- a/script.js
+++ b/script.js
@@ -4716,18 +4716,20 @@ function initialize() {
const s_specialDiv = searchBox.querySelector(".special-div");
const specialAdd = s_specialDiv.querySelector(".special-add");
const specialClear = s_specialDiv.querySelector(".special-clear");
- const specialStar = s_specialDiv.querySelector(".special-star");
const specialFilterUl = s_specialDiv.querySelector(".special-filter-list");
const specialFilterFirstLi = specialFilterUl.querySelector("li");
- const specialFirstSelect = specialFilterFirstLi.querySelector(".special-filter");
+ const specialFirstKind = specialFilterFirstLi.querySelector(".filter-kind");
function filterCopy() {
const target = this.parentElement;
const newFilter = target.cloneNode(true);
- const newSelect = newFilter.querySelector(".special-filter");
- newSelect.selectedIndex = target.querySelector(".special-filter").selectedIndex;
+ const newSelects = newFilter.querySelectorAll("select");
+ const oldSelects = target.querySelectorAll("select");
+ for (let i = 0; i < oldSelects.length; i++) {
+ newSelects[i].selectedIndex = oldSelects[i].selectedIndex;
+ }
filterBindOnclick(newFilter);
target.insertAdjacentElement('afterend', newFilter);
- return newSelect;
+ return newFilter;
}
function filterShiftUp() {
const parent = this.parentElement;
@@ -4755,14 +4757,6 @@ function initialize() {
}
filterBindOnclick(specialFilterFirstLi);
- function newSpecialSearchOption(func, idx1, idx2)
- {
- const funcName = returnMonsterNameArr(func, currentLanguage.searchlist, currentDataSource.code)[0];
- return new Option(
- funcName + (func.addition ? " " + localTranslating.addition_display : ""), //有附加显示的,名称增加一个附加显示图标
- idx1 + (idx2 != null ? "|" + idx2 : "") //值为 组序号|组内序号
- );
- }
//读取储存的筛选收藏列表
const strMakedConfig = JSON.parse(localStorage.getItem(cfgPrefix + "marked-filter"));
if (Array.isArray(strMakedConfig)) {
@@ -4778,81 +4772,81 @@ function initialize() {
}
});
}
- specialFirstSelect.refreshList = function() {
- const _this = specialFirstSelect;
- function addNewOption(sfunc, groudIndex){
- if (sfunc.group)
- {
- const groupName = returnMonsterNameArr(sfunc, currentLanguage.searchlist, currentDataSource.code)[0];
- const optgroup = _this.appendChild(document.createElement("optgroup"));
- optgroup.label = groupName;
- if (sfunc.functions)
- {
- sfunc.functions.forEach((_sfunc, filterIndex)=>{
- optgroup.appendChild(newSpecialSearchOption(_sfunc, groudIndex, filterIndex));
- });
- }
- }else
- {
- _this.options.add(newSpecialSearchOption(sfunc, groudIndex));
- }
- }
- _this.innerHTML = '';
- addNewOption(specialSearchFunctions[0], 0);
- if (markedFilter.length > 0) {
- const groupName = "=====★=====";
- const optgroup = _this.appendChild(document.createElement("optgroup"));
+
+ function newSpecialSearchOption(func, indexs)
+ {
+ let funcName = returnMonsterNameArr(func)[0];
+ //是组的,显示箭头
+ if (Array.isArray(func.functions)) funcName += " " + localTranslating.has_sub_filter;
+ //有附加显示的,名称增加一个附加显示图标
+ if (func.addition) funcName += " " + localTranslating.addition_display;
+ return new Option(
+ funcName,
+ indexs.join("|") //值为 组序号|组内序号
+ );
+ }
+ function addNewOption(sfunc, indexs){
+ if (!Array.isArray(indexs)) indexs = [indexs];
+ if (Array.isArray(sfunc.functions)) {
+ //增加组
+ const groupName = returnMonsterNameArr(sfunc)[0];
+ const optgroup = this.appendChild(document.createElement("optgroup"));
optgroup.label = groupName;
- markedFilter.forEach(([groudIndex, filterIndex])=>{
- const funcObj = filterIndex !== undefined ? specialSearchFunctions[groudIndex].functions[filterIndex] : specialSearchFunctions[groudIndex];
- optgroup.appendChild(newSpecialSearchOption(funcObj, groudIndex, filterIndex));
- });
- }
- for (let idx = 1; idx < specialSearchFunctions.length; idx++) {
- addNewOption(specialSearchFunctions[idx], idx);
- }
- }
- specialFirstSelect.onchange = function() {
- const [selectGroudIndex, selectFilterIndex] = specialFirstSelect.value.split("|").map(Number);
- let markIdx = markedFilter.findIndex(([groudIndex, filterIndex])=>groudIndex === selectGroudIndex && filterIndex === selectFilterIndex);
- if (markIdx >= 0) {//已经存在的收藏
- specialStar.classList.add("marked");
+ const newOptions = sfunc.functions.map((_sfunc, filterIndex)=>
+ newSpecialSearchOption(_sfunc, indexs.concat(filterIndex))
+ );
+ optgroup.append(...newOptions);
} else {
- specialStar.classList.remove("marked");
+ //增加单条
+ this.options.add(newSpecialSearchOption(sfunc, indexs));
}
}
+ function specialFilterRefreshKind() {
+ const kindSelect = this.querySelector(".filter-kind");
+ kindSelect.innerHTML = '';
+ kindSelect.onchange = specialFilterRefreshSubFilters;
+ for (let idx = 0; idx < specialSearchFunctions.functions.length; idx++) {
+ addNewOption.call(kindSelect, specialSearchFunctions.functions[idx], idx);
+ }
+ kindSelect.onchange();
+ }
+ specialFilterRefreshKind.call(specialFilterFirstLi);
+
+ function getSpecialSearchFunctionsFromIndex(indexs) {
+ return indexs.reduce((p,v)=>p.functions[v],specialSearchFunctions);
+ }
+ function specialFilterRefreshSubFilters() {
+ const filterSelect = this.parentElement.querySelector(".special-filter");
+ filterSelect.innerHTML = '';
+ const indexs = this.value.split("|").map(Number);
+ const group = getSpecialSearchFunctionsFromIndex(indexs);
+ if (Array.isArray(group.functions)) {
+ for (let idx = 0; idx < group.functions.length; idx++) {
+ addNewOption.call(filterSelect, group.functions[idx], indexs.concat(idx));
+ }
+ filterSelect.disabled = false;
+ } else {
+ filterSelect.disabled = true;
+ }
+ }
+
//只添加第一个列表,后面的全部通过克隆的方式复现
- specialFirstSelect.refreshList();
+ //specialFirstSelect.refreshList();
specialAdd.onclick = function(event) {
- const specialFilterLi = specialFilterFirstLi.cloneNode(true);
- const specialFilterSelection = specialFilterLi.querySelector(".special-filter");
- specialFilterUl.appendChild(specialFilterLi);
- return specialFilterSelection;
+ const newFilterLi = specialFilterFirstLi.cloneNode(true);
+ filterBindOnclick(newFilterLi);
+ const kindSelect = newFilterLi.querySelector(".filter-kind");
+ kindSelect.onchange = specialFilterRefreshSubFilters;
+ kindSelect.onchange();
+ specialFilterUl.appendChild(newFilterLi);
+ return newFilterLi;
}
specialClear.onclick = function() {
searchMonList.customAddition = null;
specialFilterUl.innerHTML = "";
specialFilterUl.appendChild(specialFilterFirstLi);
- specialFirstSelect.selectedIndex = 0;
- }
- specialStar.onclick = function() {
- const indexs = specialFirstSelect.value.split("|").map(Number);
- if (indexs[0] === 0 && indexs.length === 1) return;
-
- let markIdx = markedFilter.findIndex(arr=>arr[0] === indexs[0] && arr[1] === indexs[1]);
- if (markIdx >= 0) {//已经存在的收藏
- markedFilter.splice(markIdx,1);
- } else {
- markedFilter.push(indexs);
- }
- specialFirstSelect.refreshList(); //刷新列表
- specialStar.classList.remove("marked"); //去掉自身的收藏标记
- //储存设置
- let strMakedConfig = markedFilter.map(indexs=>{
- let arr = [specialSearchFunctions[indexs[0]].name];
- if (indexs.length > 1) arr.push(specialSearchFunctions[indexs[0]].functions[indexs[1]].name);
- return arr;})
- localStorage.setItem(cfgPrefix + "marked-filter", JSON.stringify(strMakedConfig));
+ specialFirstKind.selectedIndex = 0;
+ specialFirstKind.onchange();
}
const s_controlDiv = searchBox.querySelector(".control-div");
@@ -5018,16 +5012,25 @@ function initialize() {
s_notWeapon.checked = notWeapon;
//保留之前的特殊搜索,不需要完全新增
- const specialFilterSelections = Array.from(specialFilterUl.querySelectorAll(".special-filter"));
+ const specialFilterLis = [...specialFilterUl.querySelectorAll("li")];
//将筛选个数增加到需要的个数
- for (let i = specialFilterSelections.length; i < specialFilters.length; i++) {
- specialFilterSelections.push(specialAdd.onclick.onclick());
+ for (let i = specialFilterLis.length; i < specialFilters.length; i++) {
+ specialFilterLis.push(specialAdd.onclick());
}
+
//将每一个搜索都设置好
for (let i = 0; i < specialFilters.length; i++) {
- const filterSelection = specialFilterSelections[i];
- const filter = specialFilters[i];
- filterSelection.value = filter.join("|");
+ const indexs = specialFilters[i];
+ const filterLi = specialFilterLis[i];
+ const filterSelects = [...filterLi.querySelectorAll("select")];
+
+ for (let j = 0; j * 2 < indexs.length; j++) {
+ const indexs_ = indexs.slice(0, (j+1)*2);
+ const filterSelect = filterSelects[j];
+ if (!filterSelect) continue;
+ filterSelect.value = indexs_.join("|");
+ filterSelect.onchange && filterSelect.onchange();
+ }
}
}
//导出当前的搜索状态
@@ -5051,9 +5054,11 @@ function initialize() {
};
});
//储存设置用于页面刷新的状态恢复
- const specialFilters = Array.from(specialFilterUl.querySelectorAll(".special-filter"))
- .map(select=>select.value.split("|").map(Number)) //将字符串"1|2"转换成数组[1,2]
- .filter(([f1, f2])=>!(f1===0&&f2===undefined)); //去掉0号筛选
+ const specialFilters = [...specialFilterUl.querySelectorAll("li")].map(li=>{
+ const values = [...li.querySelectorAll("select")].map(select=>select.value.split("|").map(Number));
+ values.sort((a,b)=>b.length-a.length); //长的在前
+ return values[0];
+ });
const options = {
attrs,
@@ -5081,12 +5086,10 @@ function initialize() {
let searchResult = searchCards(Cards, options);
//进行特殊附加搜索
- const specialFilters = options.specialFilters.map(([name1, name2])=>
- name2 !== undefined ? specialSearchFunctions[name1].functions[name2] : specialSearchFunctions[name1]
- );
- searchResult = specialFilters.reduce((pre,funcObj)=>
+ const specialFilters = options.specialFilters.map(getSpecialSearchFunctionsFromIndex);
+ searchResult = specialFilters.reduce((pre, funcObj)=>
{
- if (!funcObj) return pre;
+ if (!funcObj.function) return pre;
if (funcObj.addition && !customAdditionalFunction.includes(funcObj.addition)) customAdditionalFunction.push(funcObj.addition); //如果有附加显示,则添加到列表
return funcObj.function(pre); //结果进一步筛选
}, searchResult);
diff --git a/solo.html b/solo.html
index e3ae5147..c76add26 100644
--- a/solo.html
+++ b/solo.html
@@ -984,10 +984,10 @@ const teamsCount = 1;
-
-
+
@@ -1506,7 +1506,11 @@ const teamsCount = 1;
diff --git a/style-fix-html2canvas.css b/style-fix-html2canvas.css
new file mode 100644
index 00000000..2a0f986e
--- /dev/null
+++ b/style-fix-html2canvas.css
@@ -0,0 +1,18 @@
+@charset "utf-8";
+.team-awoken-effect>ul>li {
+ display: flex;
+ gap: 3px;
+}
+.awoken-ul .awoken-count {
+ display: flex;
+}
+.member-types .types-ul>li {
+ display: flex;
+}
+.member-awoken .awoken-ul>li {
+ display: flex;
+}
+.team-total-info-count>ul>li {
+ display: flex;
+ flex-direction: row;
+}
\ No newline at end of file
diff --git a/style.css b/style.css
index dc471ea5..3a95c82c 100644
--- a/style.css
+++ b/style.css
@@ -490,6 +490,11 @@ ul{
#dialog-show-any-string {
width: 100%;
}
+#dialog-show-any-string .dialog-content ul li {
+ display: grid;
+ gap: 5px;
+ grid-template-columns: auto 45px;
+}
#dialog-search-string
{
width: 350px;
@@ -2325,7 +2330,9 @@ input[disabled]+.awoken-icon:active,
.special-filter-list button {
font-family: var(--icon-font-family);
}
-.special-div .button-div .brown-button,
+.special-div .button-div .brown-button{
+ padding: 0 15px;
+}
.special-filter-list .brown-button {
padding: 0 5px;
}
@@ -2348,7 +2355,7 @@ input[disabled]+.awoken-icon:active,
margin-right: 3px;
display: grid;
gap: 2px;
- grid-template-columns: auto max-content max-content max-content max-content;
+ grid-template-columns: max-content auto max-content max-content max-content max-content;
}
.special-filter-list :where(select, button) {
font-size: 1.25em;
diff --git a/triple.html b/triple.html
index b57fad28..a3591334 100644
--- a/triple.html
+++ b/triple.html
@@ -1929,10 +1929,10 @@ const teamsCount = 3;
-
-
+
@@ -2451,7 +2451,11 @@ const teamsCount = 3;