| @@ -973,6 +973,19 @@ const specialSearchFunctions = (function() { | |||||
| fragment.appendChild(createOrbsList(colors.flat())); | fragment.appendChild(createOrbsList(colors.flat())); | ||||
| return fragment; | return fragment; | ||||
| } | } | ||||
| function numericalATK_Addition(card) | |||||
| { | |||||
| const searchTypeArray = [0,1,2,35,37,42,58,59,84,85,86,87,110,115,143,144]; | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| //const sk = skill.params; | |||||
| const colors = [getCannonAttr(skill)]; | |||||
| const fragment = document.createDocumentFragment(); | |||||
| fragment.appendChild(document.createTextNode(`射`)); | |||||
| fragment.appendChild(createOrbsList(colors)); | |||||
| return fragment; | |||||
| } | |||||
| function healImmediately_Rate(card) | function healImmediately_Rate(card) | ||||
| { | { | ||||
| const searchTypeArray = [7, //宠物回复力 | const searchTypeArray = [7, //宠物回复力 | ||||
| @@ -1197,21 +1210,7 @@ const specialSearchFunctions = (function() { | |||||
| const functions = [ | const functions = [ | ||||
| {name:"No Filter",otLangName:{chs:"不做筛选",cht:"不做篩選"},function:cards=>cards}, | {name:"No Filter",otLangName:{chs:"不做筛选",cht:"不做篩選"},function:cards=>cards}, | ||||
| {group:true,name:"======Very commonly used=====",otLangName:{chs:"======非常常用======",cht:"======非常常用======"}, functions: [ | {group:true,name:"======Very commonly used=====",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); | |||||
| const sk = skill.params; | |||||
| return document.createTextNode(`${sk[0]}${sk[0]!=sk[1]?`~${sk[1]}`:""}溜`); | |||||
| } | |||||
| }, | |||||
| /* | |||||
| {name:"Voids both absorption(sort by turns)",otLangName:{chs:"双破吸 buff(按破吸回合排序)",cht:"雙破吸 buff(按破吸回合排序)"}, | {name:"Voids both absorption(sort by turns)",otLangName:{chs:"双破吸 buff(按破吸回合排序)",cht:"雙破吸 buff(按破吸回合排序)"}, | ||||
| function:cards=>{ | function:cards=>{ | ||||
| const searchTypeArray = [173]; | const searchTypeArray = [173]; | ||||
| @@ -1272,136 +1271,11 @@ const specialSearchFunctions = (function() { | |||||
| return document.createTextNode(`${value == 9999 ? "全" : value + "T"}解禁消`); | return document.createTextNode(`${value == 9999 ? "全" : value + "T"}解禁消`); | ||||
| } | } | ||||
| }, | }, | ||||
| {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); | |||||
| let nodeArr = [`${value.bigNumberToString()}固伤`]; | |||||
| let skill; | |||||
| if (skill = getCardLeaderSkill(card, [235])) { | |||||
| nodeArr.push("/"); | |||||
| nodeArr.push(createOrbsList(flags(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); | |||||
| 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(flags(skill.params[0]))); | |||||
| nodeArr.push(`×${skill.params[2]}`); | |||||
| } | |||||
| return nodeArr.nodeJoin(); | |||||
| } | |||||
| }, | |||||
| {name:"8 latent grids",otLangName:{chs:"8格潜觉",cht:"8格潛覺"}, | {name:"8 latent grids",otLangName:{chs:"8格潜觉",cht:"8格潛覺"}, | ||||
| function:cards=>cards.filter(card=>card.is8Latent) | function:cards=>cards.filter(card=>card.is8Latent) | ||||
| }, | |||||
| },*/ | |||||
| ]}, | ]}, | ||||
| {group:true,name:"======Active Skill======",otLangName:{chs:"======主动技======",cht:"======主動技======"}, functions: [ | {group:true,name:"======Active Skill======",otLangName:{chs:"======主动技======",cht:"======主動技======"}, functions: [ | ||||
| {name:"1 CD",otLangName:{chs:"1 CD",cht:"1 CD"}, | |||||
| function:cards=>cards.filter(card=>{ | |||||
| if (card.activeSkillId == 0) return false; | |||||
| const skill = Skills[card.activeSkillId]; | |||||
| return skill.initialCooldown - (skill.maxLevel - 1) <= 1; | |||||
| }) | |||||
| }, | |||||
| {name:"Less than 4 can be cycled use(Inaccurate)",otLangName:{chs:"除 1 CD 外,4 个以下能永动开(可能不精确)",cht:"除 1 CD 外,4 個以下能永動開(可能不精確)"}, | |||||
| function:cards=>cards.filter(card=>{ | |||||
| if (card.activeSkillId == 0) return false; | |||||
| const skill = Skills[card.activeSkillId]; | |||||
| const minCD = skill.initialCooldown - (skill.maxLevel - 1); //主动技最小的CD | |||||
| let realCD = minCD; | |||||
| const searchTypeArray = [14]; | |||||
| const subSkill = getCardLeaderSkill(card, searchTypeArray); | |||||
| if (subSkill) | |||||
| { | |||||
| realCD -= subSkill.params[0] * 3; | |||||
| } | |||||
| return minCD > 1 && realCD <= 4; | |||||
| }) | |||||
| }, | |||||
| {name:"Time pause(sort by time)",otLangName:{chs:"时间暂停(按停止时间排序)",cht:"時間暫停(按停止時間排序)"}, | |||||
| function:cards=>{ | |||||
| const searchTypeArray = [5]; | |||||
| return cards.filter(card=>{ | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| return skill; | |||||
| }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); | |||||
| }, | |||||
| addition:card=>{ | |||||
| const searchTypeArray = [5]; | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| const value = skill.params[0]; | |||||
| return `时停${value}s`; | |||||
| } | |||||
| }, | |||||
| { | |||||
| name:"Random effect active",otLangName:{chs:"随机效果技能",cht:"隨機效果技能"}, | |||||
| function:cards=>cards.filter(card=>Skills[card.activeSkillId].type == 118) | |||||
| }, | |||||
| { | |||||
| name:"Evolved active",otLangName:{chs:"进化类技能",cht:"進化類技能"}, | |||||
| function:cards=>cards.filter(card=>{ | |||||
| let skType = Skills[card.activeSkillId].type; | |||||
| return skType == 232 || skType == 233; | |||||
| }) | |||||
| }, | |||||
| {name:"Enable require HP range",otLangName:{chs:"技能使用血线要求",cht:"技能使用血線要求"}, | |||||
| function:cards=>cards.filter(card=>{ | |||||
| const searchTypeArray = [225]; | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| return skill; | |||||
| }), | |||||
| addition:card=>{ | |||||
| const searchTypeArray = [225]; | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| const sk = skill.params; | |||||
| let strArr = []; | |||||
| if (sk[0]) strArr.push(`≥${sk[0]}%`); | |||||
| if (sk[1]) strArr.push(`≤${sk[1]}%`); | |||||
| return `HP ${strArr.join(" ")}`; | |||||
| } | |||||
| }, | |||||
| {name:"Enable require Dungeon Stage",otLangName:{chs:"技能使用地下城层数要求",cht:"技能使用地下城層數要求"}, | |||||
| function:cards=>cards.filter(card=>{ | |||||
| const searchTypeArray = [234]; | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| return skill; | |||||
| }), | |||||
| addition:card=>{ | |||||
| const searchTypeArray = [234]; | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| const sk = skill.params; | |||||
| let strArr = []; | |||||
| if (sk[0]) strArr.push(`≥${sk[0]}`); | |||||
| if (sk[1]) strArr.push(`≤${sk[1]}`); | |||||
| return `层 ${strArr.join(" ")}`; | |||||
| } | |||||
| }, | |||||
| ]}, | ]}, | ||||
| {group:true,name:"-----Voids Absorption-----",otLangName:{chs:"-----破吸类-----",cht:"-----破吸類-----"}, functions: [ | {group:true,name:"-----Voids Absorption-----",otLangName:{chs:"-----破吸类-----",cht:"-----破吸類-----"}, functions: [ | ||||
| {name:"Voids attribute absorption(sort by turns)",otLangName:{chs:"破属吸 buff(按破吸回合排序)",cht:"破屬吸 buff(按破吸回合排序)"}, | {name:"Voids attribute absorption(sort by turns)",otLangName:{chs:"破属吸 buff(按破吸回合排序)",cht:"破屬吸 buff(按破吸回合排序)"}, | ||||
| @@ -1700,24 +1574,6 @@ const specialSearchFunctions = (function() { | |||||
| return `无↓×${sk[0]}T`; | return `无↓×${sk[0]}T`; | ||||
| } | } | ||||
| }, | }, | ||||
| {name:"Creates Roulette Orb",otLangName:{chs:"生成变换位(转转珠)",cht:"生成變換位(轉轉珠)"}, | |||||
| function:cards=>{ | |||||
| const searchTypeArray = [207]; | |||||
| return cards.filter(card=>{ | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| return skill; | |||||
| }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); | |||||
| }, | |||||
| addition:card=>{ | |||||
| const searchTypeArray = [207]; | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| const sk = skill.params; | |||||
| if (sk[7]) | |||||
| return `${sk[7]}个×${sk[0]}T`; | |||||
| else | |||||
| return `特殊形状×${sk[0]}T`; | |||||
| } | |||||
| }, | |||||
| {name:"Adds combo(sort by combo)",otLangName:{chs:"加C buff(按C数排列)",cht:"加C buff(按C數排列)"}, | {name:"Adds combo(sort by combo)",otLangName:{chs:"加C buff(按C数排列)",cht:"加C buff(按C數排列)"}, | ||||
| function:cards=>{ | function:cards=>{ | ||||
| const searchTypeArray = [160]; | const searchTypeArray = [160]; | ||||
| @@ -1828,6 +1684,24 @@ const specialSearchFunctions = (function() { | |||||
| return `全体×${sk[0]}T`; | return `全体×${sk[0]}T`; | ||||
| } | } | ||||
| }, | }, | ||||
| {name:"Creates Roulette Orb",otLangName:{chs:"生成变换位(转转珠)",cht:"生成變換位(轉轉珠)"}, | |||||
| function:cards=>{ | |||||
| const searchTypeArray = [207]; | |||||
| return cards.filter(card=>{ | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| return skill; | |||||
| }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); | |||||
| }, | |||||
| addition:card=>{ | |||||
| const searchTypeArray = [207]; | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| const sk = skill.params; | |||||
| if (sk[7]) | |||||
| return `${sk[7]}个×${sk[0]}T`; | |||||
| else | |||||
| return `特殊形状×${sk[0]}T`; | |||||
| } | |||||
| }, | |||||
| ]}, | ]}, | ||||
| {group:true,name:"-----For Enemy-----",otLangName:{chs:"-----对敌 buff 类-----",cht:"-----對敵 buff 類-----"}, functions: [ | {group:true,name:"-----For Enemy-----",otLangName:{chs:"-----对敌 buff 类-----",cht:"-----對敵 buff 類-----"}, functions: [ | ||||
| {name:"Menace(sort by turns)",otLangName:{chs:"威吓(按推迟回合排序)",cht:"威嚇(按推遲迴合排序)"}, | {name:"Menace(sort by turns)",otLangName:{chs:"威吓(按推迟回合排序)",cht:"威嚇(按推遲迴合排序)"}, | ||||
| @@ -2246,19 +2120,20 @@ const specialSearchFunctions = (function() { | |||||
| {group:true,name:"-----Damage Enemy - Numerical damage-----",otLangName:{chs:"-----对敌直接伤害类-大炮-----",cht:"-----對敵直接傷害類-大炮-----"}, functions: [ | {group:true,name:"-----Damage Enemy - Numerical damage-----",otLangName:{chs:"-----对敌直接伤害类-大炮-----",cht:"-----對敵直接傷害類-大炮-----"}, functions: [ | ||||
| {name:"Numerical ATK - Target - Single",otLangName:{chs:"大炮-对象-敌方单体",cht:"大炮-對象-敵方單體"}, | {name:"Numerical ATK - Target - Single",otLangName:{chs:"大炮-对象-敌方单体",cht:"大炮-對象-敵方單體"}, | ||||
| function:cards=>cards.filter(card=>{ | 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); | |||||
| }) | |||||
| 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:"大炮-對象-敵方全體"}, | {name:"Numerical ATK - Target - Mass",otLangName:{chs:"大炮-对象-敌方全体",cht:"大炮-對象-敵方全體"}, | ||||
| function:cards=>cards.filter(card=>{ | function:cards=>cards.filter(card=>{ | ||||
| @@ -2274,7 +2149,8 @@ const specialSearchFunctions = (function() { | |||||
| } | } | ||||
| const skill = getCardActiveSkill(card, searchTypeArray); | const skill = getCardActiveSkill(card, searchTypeArray); | ||||
| return skill && skill.id!=0 && isAll(skill); | return skill && skill.id!=0 && isAll(skill); | ||||
| }) | |||||
| }), | |||||
| addition: numericalATK_Addition | |||||
| }, | }, | ||||
| {name:"Numerical ATK - Target - Designate Attr",otLangName:{chs:"大炮-对象-指定属性敌人",cht:"大炮-對象-指定屬性敵人"}, | {name:"Numerical ATK - Target - Designate Attr",otLangName:{chs:"大炮-对象-指定属性敌人",cht:"大炮-對象-指定屬性敵人"}, | ||||
| function:cards=>cards.filter(card=>{ | function:cards=>cards.filter(card=>{ | ||||
| @@ -2283,125 +2159,110 @@ const specialSearchFunctions = (function() { | |||||
| return skill; | return skill; | ||||
| }) | }) | ||||
| }, | }, | ||||
| {name:"Numerical ATK - Attr - Any",otLangName:{chs:"大炮-属性-不限",cht:"大炮-屬性-不限"}, | |||||
| function:cards=>cards.filter(card=>{ | |||||
| const searchTypeArray = [0,1,2,35,37,42,58,59,84,85,86,87,110,115,143,144]; | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| return skill && skill.id!=0; | |||||
| }), | |||||
| addition:card=>{ | |||||
| const searchTypeArray = [0,1,2,35,37,42,58,59,84,85,86,87,110,115,143,144]; | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| //const sk = skill.params; | |||||
| const colors = [getCannonAttr(skill)]; | |||||
| const fragment = document.createDocumentFragment(); | |||||
| fragment.appendChild(document.createTextNode(`射`)); | |||||
| fragment.appendChild(createOrbsList(colors)); | |||||
| return fragment; | |||||
| } | |||||
| }, | |||||
| {name:"Numerical ATK - Attr - Actors self",otLangName:{chs:"大炮-属性-释放者自身",cht:"大炮-屬性-釋放者自身"}, | {name:"Numerical ATK - Attr - Actors self",otLangName:{chs:"大炮-属性-释放者自身",cht:"大炮-屬性-釋放者自身"}, | ||||
| function:cards=>cards.filter(card=>{ | function:cards=>cards.filter(card=>{ | ||||
| const searchTypeArray = [2,35]; | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| return skill; | |||||
| const searchTypeArray = [2,35]; | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| return skill; | |||||
| }) | }) | ||||
| }, | }, | ||||
| {name:"Numerical ATK - Damage - Rate by Actors self ATK(sort by rate)",otLangName:{chs:"大炮-伤害-自身攻击倍率(按倍率排序,范围取小)",cht:"大炮-傷害-自身攻擊倍率(按倍率排序,範圍取小)"}, | {name:"Numerical ATK - Damage - Rate by Actors self ATK(sort by rate)",otLangName:{chs:"大炮-伤害-自身攻击倍率(按倍率排序,范围取小)",cht:"大炮-傷害-自身攻擊倍率(按倍率排序,範圍取小)"}, | ||||
| function:cards=>cards.filter(card=>{ | 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) | |||||
| 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) | |||||
| { | { | ||||
| 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; | |||||
| 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; | |||||
| }) | |||||
| 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:"大炮-傷害-指定屬性數值(按數值排序)"}, | {name:"Numerical ATK - Damage - Fixed Attr Number (sort by number)",otLangName:{chs:"大炮-伤害-指定属性数值(按数值排序)",cht:"大炮-傷害-指定屬性數值(按數值排序)"}, | ||||
| function:cards=>cards.filter(card=>{ | 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) | |||||
| 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) | |||||
| { | { | ||||
| case 1: | |||||
| case 86: | |||||
| case 87: | |||||
| return sk[1]; | |||||
| case 42: | |||||
| return sk[2]; | |||||
| default: | |||||
| return 0; | |||||
| 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; | |||||
| }) | |||||
| 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 時倍率排序)"}, | {name:"Numerical ATK - Damage - By remaining HP (sort by rate at HP 1)",otLangName:{chs:"大炮-伤害-根据剩余血量(按 1 HP 时倍率排序)",cht:"大炮-傷害-根據剩餘血量(按 1 HP 時倍率排序)"}, | ||||
| function:cards=>{ | function:cards=>{ | ||||
| const searchTypeArray = [110]; | |||||
| return cards.filter(card=>{ | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| return skill; | |||||
| }).sort((a,b)=>sortByParams(a,b,searchTypeArray,3)); | |||||
| } | |||||
| const searchTypeArray = [110]; | |||||
| return cards.filter(card=>{ | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| return skill; | |||||
| }).sort((a,b)=>sortByParams(a,b,searchTypeArray,3)); | |||||
| }, | |||||
| addition: numericalATK_Addition | |||||
| }, | }, | ||||
| {name:"Numerical ATK - Damage - Team total HP (sort by rate)",otLangName:{chs:"大炮-伤害-队伍总 HP(按倍率排序)",cht:"大炮-傷害-隊伍總 HP(按倍率排序)"}, | {name:"Numerical ATK - Damage - Team total HP (sort by rate)",otLangName:{chs:"大炮-伤害-队伍总 HP(按倍率排序)",cht:"大炮-傷害-隊伍總 HP(按倍率排序)"}, | ||||
| function:cards=>{ | function:cards=>{ | ||||
| const searchTypeArray = [143]; | |||||
| return cards.filter(card=>{ | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| return skill; | |||||
| }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); | |||||
| } | |||||
| const searchTypeArray = [143]; | |||||
| return cards.filter(card=>{ | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| return skill; | |||||
| }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); | |||||
| }, | |||||
| addition: numericalATK_Addition | |||||
| }, | }, | ||||
| {name:"Numerical ATK - Damage - Team attrs ATK (sort by rate)",otLangName:{chs:"大炮-伤害-队伍某属性总攻击(按倍率排序)",cht:"大炮-傷害-隊伍某屬性總攻擊(按倍率排序)"}, | {name:"Numerical ATK - Damage - Team attrs ATK (sort by rate)",otLangName:{chs:"大炮-伤害-队伍某属性总攻击(按倍率排序)",cht:"大炮-傷害-隊伍某屬性總攻擊(按倍率排序)"}, | ||||
| function:cards=>{ | function:cards=>{ | ||||
| const searchTypeArray = [144]; | |||||
| return cards.filter(card=>{ | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| return skill; | |||||
| }).sort((a,b)=>sortByParams(a,b,searchTypeArray,1)); | |||||
| } | |||||
| 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:"大炮-特殊-吸血"}, | {name:"Numerical ATK - Special - Vampire",otLangName:{chs:"大炮-特殊-吸血",cht:"大炮-特殊-吸血"}, | ||||
| function:cards=>cards.filter(card=>{ | function:cards=>cards.filter(card=>{ | ||||
| const searchTypeArray = [35,115]; | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| return skill; | |||||
| const searchTypeArray = [35,115]; | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| return skill; | |||||
| }) | }) | ||||
| }, | }, | ||||
| ]}, | ]}, | ||||
| @@ -2890,6 +2751,89 @@ const specialSearchFunctions = (function() { | |||||
| }) | }) | ||||
| }, | }, | ||||
| ]}, | ]}, | ||||
| {group:true,name:"-----Others Active Skills-----",otLangName:{chs:"-----其他主动技-----",cht:"-----其他主動技-----"}, functions: [ | |||||
| {name:"1 CD",otLangName:{chs:"1 CD",cht:"1 CD"}, | |||||
| function:cards=>cards.filter(card=>{ | |||||
| if (card.activeSkillId == 0) return false; | |||||
| const skill = Skills[card.activeSkillId]; | |||||
| return skill.initialCooldown - (skill.maxLevel - 1) <= 1; | |||||
| }) | |||||
| }, | |||||
| {name:"Less than 4 can be cycled use(Inaccurate)",otLangName:{chs:"除 1 CD 外,4 个以下能永动开(可能不精确)",cht:"除 1 CD 外,4 個以下能永動開(可能不精確)"}, | |||||
| function:cards=>cards.filter(card=>{ | |||||
| if (card.activeSkillId == 0) return false; | |||||
| const skill = Skills[card.activeSkillId]; | |||||
| const minCD = skill.initialCooldown - (skill.maxLevel - 1); //主动技最小的CD | |||||
| let realCD = minCD; | |||||
| const searchTypeArray = [14]; | |||||
| const subSkill = getCardLeaderSkill(card, searchTypeArray); | |||||
| if (subSkill) | |||||
| { | |||||
| realCD -= subSkill.params[0] * 3; | |||||
| } | |||||
| return minCD > 1 && realCD <= 4; | |||||
| }) | |||||
| }, | |||||
| {name:"Time pause(sort by time)",otLangName:{chs:"时间暂停(按停止时间排序)",cht:"時間暫停(按停止時間排序)"}, | |||||
| function:cards=>{ | |||||
| const searchTypeArray = [5]; | |||||
| return cards.filter(card=>{ | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| return skill; | |||||
| }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); | |||||
| }, | |||||
| addition:card=>{ | |||||
| const searchTypeArray = [5]; | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| const value = skill.params[0]; | |||||
| return `时停${value}s`; | |||||
| } | |||||
| }, | |||||
| { | |||||
| name:"Random effect active",otLangName:{chs:"随机效果技能",cht:"隨機效果技能"}, | |||||
| function:cards=>cards.filter(card=>Skills[card.activeSkillId].type == 118) | |||||
| }, | |||||
| { | |||||
| name:"Evolved active",otLangName:{chs:"进化类技能",cht:"進化類技能"}, | |||||
| function:cards=>cards.filter(card=>{ | |||||
| let skType = Skills[card.activeSkillId].type; | |||||
| return skType == 232 || skType == 233; | |||||
| }) | |||||
| }, | |||||
| {name:"Enable require HP range",otLangName:{chs:"技能使用血线要求",cht:"技能使用血線要求"}, | |||||
| function:cards=>cards.filter(card=>{ | |||||
| const searchTypeArray = [225]; | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| return skill; | |||||
| }), | |||||
| addition:card=>{ | |||||
| const searchTypeArray = [225]; | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| const sk = skill.params; | |||||
| let strArr = []; | |||||
| if (sk[0]) strArr.push(`≥${sk[0]}%`); | |||||
| if (sk[1]) strArr.push(`≤${sk[1]}%`); | |||||
| return `HP ${strArr.join(" ")}`; | |||||
| } | |||||
| }, | |||||
| {name:"Enable require Dungeon Stage",otLangName:{chs:"技能使用地下城层数要求",cht:"技能使用地下城層數要求"}, | |||||
| function:cards=>cards.filter(card=>{ | |||||
| const searchTypeArray = [234]; | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| return skill; | |||||
| }), | |||||
| addition:card=>{ | |||||
| const searchTypeArray = [234]; | |||||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||||
| const sk = skill.params; | |||||
| let strArr = []; | |||||
| if (sk[0]) strArr.push(`≥${sk[0]}`); | |||||
| if (sk[1]) strArr.push(`≤${sk[1]}`); | |||||
| return `层 ${strArr.join(" ")}`; | |||||
| } | |||||
| }, | |||||
| ]}, | |||||
| {group:true,name:"======Leader Skills=====",otLangName:{chs:"======队长技======",cht:"======隊長技======"}, functions: [ | {group:true,name:"======Leader Skills=====",otLangName:{chs:"======队长技======",cht:"======隊長技======"}, functions: [ | ||||
| {name:"Fixed damage inflicts(sort by damage)",otLangName:{chs:"队长技固伤追击(按伤害排序)",cht:"隊長技固傷追擊(按傷害排序)"}, | {name:"Fixed damage inflicts(sort by damage)",otLangName:{chs:"队长技固伤追击(按伤害排序)",cht:"隊長技固傷追擊(按傷害排序)"}, | ||||
| @@ -3360,9 +3304,6 @@ const specialSearchFunctions = (function() { | |||||
| {name:"Pixel Evo",otLangName:{chs:"像素进化",cht:"像素進化"}, | {name:"Pixel Evo",otLangName:{chs:"像素进化",cht:"像素進化"}, | ||||
| function:cards=>cards.filter(card=>card.evoMaterials.includes(3826)) | function:cards=>cards.filter(card=>card.evoMaterials.includes(3826)) | ||||
| }, | }, | ||||
| {name:"8 latent grids",otLangName:{chs:"8格潜觉",cht:"8格潛覺"}, | |||||
| function:cards=>cards.filter(card=>card.is8Latent) | |||||
| }, | |||||
| //{name:"",otLangName:{chs:"非8格潜觉",cht:"非8格潛覺"},function:cards=>cards.filter(card=>!card.is8Latent)}, | //{name:"",otLangName:{chs:"非8格潜觉",cht:"非8格潛覺"},function:cards=>cards.filter(card=>!card.is8Latent)}, | ||||
| {name:"Reincarnation/Super Re..",otLangName:{chs:"转生、超转生进化",cht:"轉生、超轉生進化"}, | {name:"Reincarnation/Super Re..",otLangName:{chs:"转生、超转生进化",cht:"轉生、超轉生進化"}, | ||||
| function:cards=>cards.filter(card=>isReincarnated(card)) | function:cards=>cards.filter(card=>isReincarnated(card)) | ||||
| @@ -3412,6 +3353,9 @@ const specialSearchFunctions = (function() { | |||||
| }, | }, | ||||
| ]}, | ]}, | ||||
| {group:true,name:"----- Awoken -----",otLangName:{chs:"-----觉醒类-----",cht:"-----覺醒類-----"}, functions: [ | {group:true,name:"----- Awoken -----",otLangName:{chs:"-----觉醒类-----",cht:"-----覺醒類-----"}, functions: [ | ||||
| {name:"8 latent grids",otLangName:{chs:"8格潜觉",cht:"8格潛覺"}, | |||||
| function:cards=>cards.filter(card=>card.is8Latent) | |||||
| }, | |||||
| {name:"Have 9 awokens",otLangName:{chs:"有9个觉醒",cht:"有9個覺醒"}, | {name:"Have 9 awokens",otLangName:{chs:"有9个觉醒",cht:"有9個覺醒"}, | ||||
| function:cards=>cards.filter(card=>card.awakenings.length>=9) | function:cards=>cards.filter(card=>card.awakenings.length>=9) | ||||
| }, | }, | ||||
| @@ -3505,5 +3449,18 @@ const specialSearchFunctions = (function() { | |||||
| },*/ | },*/ | ||||
| ]}, | ]}, | ||||
| ]; | ]; | ||||
| //非常常用 | |||||
| let commonlyUsed = functions.find(g=>g.group && g.name.includes("commonly used")); | |||||
| if (commonlyUsed) { | |||||
| let list = [ | |||||
| functions.find(g=>g.group && g.name.includes("player team"))?.functions.find(f=>f.name.includes("skills charge")), | |||||
| functions.find(g=>g.group && g.name.includes("For Enemy"))?.functions.find(f=>f.name.includes("Menace")), | |||||
| functions.find(g=>g.group && g.name.includes("Awoken"))?.functions.find(f=>f.name.includes("8 latent")), | |||||
| functions.find(g=>g.group && g.name.includes("Leader Skills"))?.functions.find(f=>f.name.includes("Fixed damage inflicts")), | |||||
| functions.find(g=>g.group && g.name.includes("Leader Skills"))?.functions.find(f=>f.name.includes("Adds combo")), | |||||
| ].filter(Boolean); | |||||
| commonlyUsed.functions.push(...list); | |||||
| } | |||||
| return functions; | return functions; | ||||
| })(); | })(); | ||||