| @@ -78,6 +78,7 @@ const _localTranslating = { | |||
| unbind_awakenings: tp`${'icon'}觉醒无效`, | |||
| unbind_matches: tp`${'icon'}无法消除宝珠`, | |||
| bind_skill: tp`${'icon'}自身无法使用技能`, | |||
| bind_card: tp`卡片自身${'icon'}变为封锁状态`, | |||
| defense_break: tp`${'icon'}敌方的防御力减少${'value'}`, | |||
| poison: tp`${'icon'}使${'target'}中毒,每回合损失${'belong_to'} ${'value'} 的 ${'stats'}`, | |||
| time_extend: tp`${'icon'}宝珠移动时间 ${'value'}`, | |||
| @@ -136,7 +137,7 @@ const _localTranslating = { | |||
| obstruct_opponent_before_me: tp`排名比自身高的对手`, | |||
| obstruct_opponent_designated_position: tp`第${'positions'}排位的对手`, | |||
| slot_power_up: tp`${'targets'}的${'icon'}${'value'}`, | |||
| increase_damage_cap: tp`${'targets'}的${'icon'}伤害上限变为${'cap'}`, | |||
| increase_damage_cap: tp`${'targets'}${'icon'}伤害上限变为${'cap'}`, | |||
| board_jamming_state: tp`在${'position'}生成${'icon'}${'state'}${'size'}${'count'}${'comment'}`, | |||
| board_size_change: tp`板面大小改变为${'icon'}${'size'}`, | |||
| remove_assist: tp`${'icon'}移除自身的辅助宠物(直到地下城结束)`, | |||
| @@ -221,6 +222,8 @@ const _localTranslating = { | |||
| sub_members: tp`队员`, | |||
| leader_self: tp`左边队长`, | |||
| leader_helper: tp`右边队长`, | |||
| left_neighbor: tp`左邻角色`, | |||
| right_neighbor: tp`右邻角色`, | |||
| collab_id: tp`合作ID为${'id'}的角色`, | |||
| gacha_id: tp`抽蛋ID为${'id'}的角色`, | |||
| enemy: tp`敌人`, | |||
| @@ -77,7 +77,7 @@ const _localTranslating = { | |||
| unbind_normal: tp`${'icon'}封鎖`, | |||
| unbind_awakenings: tp`${'icon'}覺醒無效`, | |||
| unbind_matches: tp`${'icon'}無法消除寶珠`, | |||
| bind_skill: tp`${'icon'}自身無法使用技能`, | |||
| bind_skill: tp`卡片自身${'icon'}變為封鎖狀態`, | |||
| defense_break: tp`${'icon'}敵方的防禦力減少${'value'}`, | |||
| poison: tp`${'icon'}使${'target'}中毒,每回合損失${'belong_to'} ${'value'} 的 ${'stats'}`, | |||
| time_extend: tp`${'icon'}寶珠移動時間 ${'value'}`, | |||
| @@ -136,7 +136,7 @@ const _localTranslating = { | |||
| obstruct_opponent_before_me: tp`排名比自身高的對手`, | |||
| obstruct_opponent_designated_position: tp`第${'positions'}排位的對手`, | |||
| slot_power_up: tp`${'targets'}的${'icon'}${'value'}`, | |||
| increase_damage_cap: tp`${'targets'}的${'icon'}傷害上限變為${'cap'}`, | |||
| increase_damage_cap: tp`${'targets'}${'icon'}傷害上限變為${'cap'}`, | |||
| board_jamming_state: tp`在${'position'}生成${'icon'}${'state'}${'size'}${'count'}${'comment'}`, | |||
| board_size_change: tp`板面大小改變為${'icon'}${'size'}`, | |||
| remove_assist: tp`${'icon'}移除自身的輔助寵物(直到地下城結束)`, | |||
| @@ -221,6 +221,8 @@ const _localTranslating = { | |||
| sub_members: tp`隊員`, | |||
| leader_self: tp`左邊隊長`, | |||
| leader_helper: tp`右邊隊長`, | |||
| left_neighbor: tp`左鄰角色`, | |||
| right_neighbor: tp`右鄰角色`, | |||
| collab_id: tp`合作ID為${'id'}的角色`, | |||
| gacha_id: tp`抽蛋ID為${'id'}的角色`, | |||
| enemy: tp`敵人`, | |||
| @@ -93,6 +93,7 @@ let localTranslating = { | |||
| unbind_awakenings: tp`${'icon'}Awoken bind`, | |||
| unbind_matches: tp`${'icon'}Unmatchable orb`, | |||
| bind_skill: tp`${'icon'}Unable to use skills`, | |||
| bind_card: tp`${'icon'}Bind the card itself`, | |||
| defense_break: tp`${'icon'}Reduce enemy defense by ${'value'}`, | |||
| poison: tp`${'icon'}Poisons ${'target'}, reduce ${'stats'} with ${'belong_to'} ${'value'} per turns`, | |||
| time_extend: tp`${'icon'}Orb move time ${'value'}`, | |||
| @@ -150,7 +151,7 @@ let localTranslating = { | |||
| obstruct_opponent_after_me: tp`The opponent ranked lower than me`, | |||
| obstruct_opponent_before_me: tp`The opponent ranked higher than me`, | |||
| obstruct_opponent_designated_position: tp`No.${'positions'} ranked opponents`, | |||
| slot_power_up: tp`The slot of ${'targets'} ${'icon'}${'value'}`, | |||
| slot_power_up: tp`The slot of [${'targets'}]'s ${'icon'}${'value'}`, | |||
| increase_damage_cap: tp`The ${'icon'}damage cap of ${'targets'} is change to ${'cap'}`, | |||
| board_jamming_state: tp`Creates ${'count'} ${'icon'}${'state'} ${'size'} at ${'position'}${'comment'}`, | |||
| board_size_change: tp`Board size changed to ${'icon'}${'size'}`, | |||
| @@ -236,6 +237,8 @@ let localTranslating = { | |||
| sub_members: tp`sub-members`, | |||
| leader_self: tp`left leader`, | |||
| leader_helper: tp`right leader`, | |||
| left_neighbor: tp`left neighbor`, | |||
| right_neighbor: tp`left neighbor`, | |||
| collab_id: tp`Cards with Collaboration ID of ${'id'} `, | |||
| gacha_id: tp`Cards with Egg Machine ID of ${'id'} `, | |||
| enemy: tp`Enemy`, | |||
| @@ -1222,22 +1225,21 @@ const specialSearchFunctions = (function() { | |||
| } | |||
| function memberATK_Addition(card) | |||
| { | |||
| const searchTypeArray = [230]; | |||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||
| if (!skill) return; | |||
| const sk = skill.params; | |||
| const fragment = document.createDocumentFragment(); | |||
| fragment.appendChild(createTeamFlags(sk[1])); | |||
| let str = ''; | |||
| str +=`${sk[2] / 100}倍×${sk[0]}T`; | |||
| fragment.appendChild(document.createTextNode(str)); | |||
| return fragment; | |||
| const searchTypeArray = [230, 269]; | |||
| const skills = getCardActiveSkills(card, searchTypeArray); | |||
| return skills.map(skill=>{ | |||
| const sk = skill.params; | |||
| const fragment = document.createDocumentFragment(); | |||
| fragment.appendChild(createTeamFlags(sk[1], skill.type == 269 ? 2 : 1)); | |||
| fragment.append(`${sk[2] / 100}倍×${sk[0]}T`); | |||
| return fragment; | |||
| }).nodeJoin(document.createElement("br")); | |||
| } | |||
| function getIncreaseDamageCap(skill) | |||
| { | |||
| let cap = 0; | |||
| switch (skill.type) { | |||
| case 241:case 258:case 263: | |||
| case 241:case 258:case 263:case 266: | |||
| cap = skill.params[1]; | |||
| break; | |||
| case 246: | |||
| @@ -1251,56 +1253,58 @@ const specialSearchFunctions = (function() { | |||
| } | |||
| function memberCap_Addition(card) | |||
| { | |||
| const searchTypeArray = [241, 246, 247, 258, 263]; | |||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||
| if (!skill) return; | |||
| const sk = skill.params; | |||
| let cap = getIncreaseDamageCap(skill); | |||
| const fragment = document.createDocumentFragment(); | |||
| switch (skill.type) { | |||
| case 258: { | |||
| fragment.appendChild(createTeamFlags(sk[2])); | |||
| break; | |||
| } | |||
| case 241: | |||
| case 246: | |||
| case 247: { | |||
| fragment.appendChild(createTeamFlags(1)); | |||
| break; | |||
| } | |||
| case 263: { | |||
| const attrs = Bin.unflags(sk[2]); | |||
| if (attrs?.length) | |||
| { | |||
| fragment.appendChild(createOrbsList(attrs)); | |||
| const searchTypeArray = [241, 246, 247, 258, 263, 266]; | |||
| const skills = getCardActiveSkills(card, searchTypeArray); | |||
| return skills.map(skill=>{ | |||
| const sk = skill.params; | |||
| let cap = getIncreaseDamageCap(skill); | |||
| const fragment = document.createDocumentFragment(); | |||
| switch (skill.type) { | |||
| case 258: | |||
| case 266: { | |||
| fragment.appendChild(createTeamFlags(sk[2], skill.type == 266 ? 2 : 1)); | |||
| break; | |||
| } | |||
| const types = Bin.unflags(sk[3]); | |||
| if (types?.length) | |||
| { | |||
| fragment.appendChild(createTypesList(types)); | |||
| case 241: | |||
| case 246: | |||
| case 247: { | |||
| fragment.appendChild(createTeamFlags(1)); | |||
| break; | |||
| } | |||
| case 263: { | |||
| const attrs = Bin.unflags(sk[2]); | |||
| if (attrs?.length) | |||
| { | |||
| fragment.appendChild(createOrbsList(attrs)); | |||
| } | |||
| const types = Bin.unflags(sk[3]); | |||
| if (types?.length) | |||
| { | |||
| fragment.appendChild(createTypesList(types)); | |||
| } | |||
| break; | |||
| } | |||
| break; | |||
| } | |||
| } | |||
| //fragment.append(createSkillIcon(SkillKinds.IncreaseDamageCapacity, cap > 21 ? "cap-incr" : "cap-decr")); | |||
| switch (skill.type) { | |||
| case 258: | |||
| case 241: | |||
| case 263: { | |||
| fragment.append(`${(cap*1e8).bigNumberToString()}×${sk[0]}T`); | |||
| break; | |||
| } | |||
| case 246: { | |||
| fragment.append(`${(cap*1e8).bigNumberToString()}←${sk[1]}C in ${sk[0]}S`); | |||
| break; | |||
| } | |||
| case 247: { | |||
| fragment.append(`${(cap*1e8).bigNumberToString()}←${sk[2]} of `, createOrbsList(Bin.unflags(sk[1])), ` in ${sk[0]}S`); | |||
| break; | |||
| //fragment.append(createSkillIcon(SkillKinds.IncreaseDamageCapacity, cap > 21 ? "cap-incr" : "cap-decr")); | |||
| switch (skill.type) { | |||
| case 258: | |||
| case 241: | |||
| case 263: | |||
| case 266: { | |||
| fragment.append(`${(cap*1e8).bigNumberToString()}×${sk[0]}T`); | |||
| break; | |||
| } | |||
| case 246: { | |||
| fragment.append(`${(cap*1e8).bigNumberToString()}←${sk[1]}C in ${sk[0]}S`); | |||
| break; | |||
| } | |||
| case 247: { | |||
| fragment.append(`${(cap*1e8).bigNumberToString()}←${sk[2]} of `, createOrbsList(Bin.unflags(sk[1])), ` in ${sk[0]}S`); | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| return fragment; | |||
| return fragment; | |||
| }).nodeJoin(document.createElement("br")); | |||
| } | |||
| function dixedDamage_Addition(card) | |||
| { | |||
| @@ -1848,7 +1852,7 @@ const specialSearchFunctions = (function() { | |||
| {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, 263]; | |||
| const searchTypeArray = [241, 246, 247, 258, 263, 266]; | |||
| return cards.filter(card=>{ | |||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||
| return skill; | |||
| @@ -1862,11 +1866,20 @@ const specialSearchFunctions = (function() { | |||
| }, | |||
| {name:"Increase Damage Cap - Self",otLangName:{chs:"增加伤害上限 - 自身",cht:"增加傷害上限 - 自身"}, | |||
| function:cards=>{ | |||
| const searchTypeArray = [241, 246, 247, 258]; | |||
| const searchTypeArray = [241, 246, 247, 258, 266]; | |||
| return cards.filter(card=>{ | |||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||
| if (skill?.type === 258) return Boolean(skill.params[2] & 0b1); | |||
| else return skill; | |||
| switch (skill?.type) { | |||
| case 258: { | |||
| return Boolean(skill.params[2] & 0b1); | |||
| } | |||
| case 266: { | |||
| return Boolean(skill.params[2] & 0b100); | |||
| } | |||
| default: { | |||
| 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); | |||
| @@ -1880,7 +1893,7 @@ const specialSearchFunctions = (function() { | |||
| const searchTypeArray = [258]; | |||
| return cards.filter(card=>{ | |||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||
| return skill && Boolean(skill.params[2] & (0b10 | 0b100)); | |||
| return skill && Boolean(skill.params[2] & 0b110); | |||
| }).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); | |||
| @@ -1903,6 +1916,20 @@ const specialSearchFunctions = (function() { | |||
| }, | |||
| addition:memberCap_Addition | |||
| }, | |||
| {name:"Increase Damage Cap - Neighbor",otLangName:{chs:"增加伤害上限 - 相邻",cht:"增加傷害上限 - 相鄰"}, | |||
| function:cards=>{ | |||
| const searchTypeArray = [266]; | |||
| return cards.filter(card=>{ | |||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||
| return skill && Boolean(skill.params[2] & 0b11); | |||
| }).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 - Attr./Types",otLangName:{chs:"增加伤害上限 - 属性/类型",cht:"增加傷害上限 - 屬性/類型"}, | |||
| function:cards=>{ | |||
| const searchTypeArray = [263]; | |||
| @@ -1918,10 +1945,10 @@ const specialSearchFunctions = (function() { | |||
| addition:memberCap_Addition | |||
| }, | |||
| ]}, | |||
| {group:true,name:"Member ATK rate change",otLangName:{chs:"队员攻击力",cht:"隊員攻擊力"}, functions: [ | |||
| {name:"Member ATK rate change - Any",otLangName:{chs:"队员攻击力 - 任意",cht:"隊員攻擊力 - 任意"}, | |||
| {group:true,name:"Card slot ATK rate change",otLangName:{chs:"卡片位置攻击力",cht:"卡片位置攻擊力"}, functions: [ | |||
| {name:"Card slot ATK rate change - Any",otLangName:{chs:"卡片位置攻击力 - 任意",cht:"卡片位置攻擊力 - 任意"}, | |||
| function:cards=>{ | |||
| const searchTypeArray = [230]; | |||
| const searchTypeArray = [230, 269]; | |||
| return cards.filter(card=>{ | |||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||
| return skill; | |||
| @@ -1929,27 +1956,37 @@ const specialSearchFunctions = (function() { | |||
| }, | |||
| addition:memberATK_Addition | |||
| }, | |||
| {name:"Member ATK rate change - Self",otLangName:{chs:"队员攻击力 - 自身",cht:"隊員攻擊力 - 自身"}, | |||
| {name:"Card slot ATK rate change - Self",otLangName:{chs:"卡片位置攻击力 - 自身",cht:"卡片位置攻擊力 - 自身"}, | |||
| function:cards=>{ | |||
| const searchTypeArray = [230]; | |||
| const searchTypeArray = [230, 269]; | |||
| return cards.filter(card=>{ | |||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||
| return skill && Boolean(skill.params[1] & 0b1); | |||
| switch (skill?.type) { | |||
| case 230: { | |||
| return Boolean(skill.params[1] & 0b1); | |||
| } | |||
| case 269: { | |||
| return Boolean(skill.params[1] & 0b100); | |||
| } | |||
| default: { | |||
| return skill; | |||
| } | |||
| } | |||
| }).sort((a,b)=>sortByParams(a, b, searchTypeArray, 2)); | |||
| }, | |||
| addition:memberATK_Addition | |||
| }, | |||
| {name:"Member ATK rate change - Leader",otLangName:{chs:"队员攻击力 - 队长",cht:"隊員攻擊力 - 隊長"}, | |||
| {name:"Card slot 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)); | |||
| return skill && Boolean(skill.params[1] & 0b110); | |||
| }).sort((a,b)=>sortByParams(a, b, searchTypeArray, 2)); | |||
| }, | |||
| addition:memberATK_Addition | |||
| }, | |||
| {name:"Member ATK rate change - Sub",otLangName:{chs:"队员攻击力 - 队员",cht:"隊員攻擊力 - 隊員"}, | |||
| {name:"Card slot ATK rate change - Sub",otLangName:{chs:"卡片位置攻击力 - 队员",cht:"卡片位置攻擊力 - 隊員"}, | |||
| function:cards=>{ | |||
| const searchTypeArray = [230]; | |||
| return cards.filter(card=>{ | |||
| @@ -1959,8 +1996,18 @@ const specialSearchFunctions = (function() { | |||
| }, | |||
| addition:memberATK_Addition | |||
| }, | |||
| {name:"Card slot ATK rate change - Neighbor",otLangName:{chs:"卡片位置攻击力 - 相邻",cht:"卡片位置攻擊力 - 相鄰"}, | |||
| function:cards=>{ | |||
| const searchTypeArray = [269]; | |||
| return cards.filter(card=>{ | |||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||
| return skill && Boolean(skill.params[1] & 0b11); | |||
| }).sort((a,b)=>sortByParams(a, b, searchTypeArray, 2)); | |||
| }, | |||
| addition:memberATK_Addition | |||
| }, | |||
| ]}, | |||
| {name:"Change self's Attr",otLangName:{chs:"转换自身属性",cht:"轉換自身屬性"}, | |||
| {name:"Change card self's Attr",otLangName:{chs:"转换自身属性",cht:"轉換自身屬性"}, | |||
| function:cards=>{ | |||
| const searchTypeArray = [142]; | |||
| return cards.filter(card=>{ | |||
| @@ -1982,7 +2029,26 @@ const specialSearchFunctions = (function() { | |||
| return fragment; | |||
| } | |||
| }, | |||
| {name:"Bind self active skill",otLangName:{chs:"自封技能 debuff",cht:"自封技能 debuff"}, | |||
| {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); | |||
| 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:"Bind team active skill",otLangName:{chs:"自封队伍技能 debuff",cht:"自封队伍技能 debuff"}, | |||
| function:cards=>cards.filter(card=>{ | |||
| const searchTypeArray = [214]; | |||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||
| @@ -1996,32 +2062,27 @@ const specialSearchFunctions = (function() { | |||
| return document.createTextNode(`自封技${sk[0]}T`); | |||
| } | |||
| }, | |||
| {name:"Remove assist",otLangName:{chs:"移除武器",cht:"移除武器"}, | |||
| {name:"Bind card self",otLangName:{chs:"角色自身被绑定",cht:"角色自身被綁定"}, | |||
| function:cards=>cards.filter(card=>{ | |||
| const searchTypeArray = [250]; | |||
| const searchTypeArray = [267]; | |||
| const skill = getCardActiveSkill(card, searchTypeArray); | |||
| return skill; | |||
| }) | |||
| }, | |||
| {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 searchTypeArray = [267]; | |||
| 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; | |||
| return document.createTextNode(`自绑定${sk[0]}T`); | |||
| } | |||
| }, | |||
| {name:"Remove card self's 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"}, | |||
| @@ -386,6 +386,11 @@ class Board | |||
| } | |||
| } | |||
| const SkillTarget = { | |||
| type1: ["self","leader-self","leader-helper","sub-members"], | |||
| type2: ["right-neighbor","left-neighbor","self"], | |||
| }; | |||
| const SkillValue = { | |||
| isLess: function (value) { | |||
| if (value.kind === SkillValueKind.Percent) return value.value < 1; | |||
| @@ -449,6 +454,7 @@ const SkillKinds = { | |||
| BoardChange: "board-change", | |||
| Unbind: "unbind", | |||
| BindSkill: "bind-skill", | |||
| BindCard: "bind-card", | |||
| RandomSkills: "random-skills", | |||
| EvolvedSkills: "evolved-skills", | |||
| SkillProviso: "skill-proviso", | |||
| @@ -1008,6 +1014,7 @@ function unbind(normal, awakenings, matches) { | |||
| return { kind: SkillKinds.Unbind, normal: normal, awakenings: awakenings , matches: matches}; | |||
| } | |||
| function bindSkill() { return { kind: SkillKinds.BindSkill}; } | |||
| function bindCard() { return { kind: SkillKinds.BindCard}; } | |||
| function boardChange(attrs) { | |||
| return { kind: SkillKinds.BoardChange, attrs: attrs }; | |||
| } | |||
| @@ -1592,8 +1599,9 @@ const skillObjectParsers = { | |||
| [229](attrs, types, hp, atk, rcv) { | |||
| return powerUp(null, null, p.scaleStateKind(null, Bin.unflags(attrs), Bin.unflags(types), p.mul({hp: hp || 0, atk: atk || 0, rcv: rcv || 0}))); | |||
| }, | |||
| //按位置增伤主动技1 | |||
| [230](turns, target, mul) { | |||
| const targetTypes = ["self","leader-self","leader-helper","sub-members"]; | |||
| const targetTypes = SkillTarget.type1; | |||
| const typeArr = Bin.unflags(target).map(n => targetTypes[n]); | |||
| return activeTurns(turns, | |||
| slotPowerUp(p.mul({ atk: mul }), typeArr) | |||
| @@ -1641,7 +1649,7 @@ const skillObjectParsers = { | |||
| ); | |||
| }, | |||
| [241](turns, cap) { //改变伤害上限主动技 | |||
| // const targetTypes = ["self","leader-self","leader-helper","sub-members"]; | |||
| // const targetTypes = SkillTarget.type1; | |||
| // const typeArr = Bin.unflags(target).map(n => targetTypes[n]); | |||
| return activeTurns(turns, | |||
| increaseDamageCapacity(cap * 1e8, ["self"]) | |||
| @@ -1726,9 +1734,9 @@ const skillObjectParsers = { | |||
| autoPath(5), | |||
| ]; | |||
| }, | |||
| //按位置改变伤害上限主动技1 | |||
| [258](turns, cap, target) { //改变伤害上限主动技 | |||
| const targetTypes = ["self","leader-self","leader-helper","sub-members"]; | |||
| const targetTypes = SkillTarget.type1; | |||
| const typeArr = Bin.unflags(target).map(n => targetTypes[n]); | |||
| return activeTurns(turns, | |||
| increaseDamageCapacity(cap * 1e8, typeArr) | |||
| @@ -1745,9 +1753,26 @@ const skillObjectParsers = { | |||
| }, | |||
| [264](mul) { return rateMultiply(v.percent(mul), 'plus_point'); }, | |||
| [265](mul) { return rateMultiply(v.percent(mul), 'part_break'); }, | |||
| //按位置改变伤害上限主动技2 | |||
| [266](turns, cap, target) { | |||
| const targetTypes = SkillTarget.type2; | |||
| const typeArr = Bin.unflags(target).map(n => targetTypes[n]); | |||
| return activeTurns(turns, | |||
| increaseDamageCapacity(cap * 1e8, typeArr) | |||
| ); | |||
| }, | |||
| //卡片自绑定 | |||
| [267](turns) {return activeTurns(turns, bindCard()); }, | |||
| //限制技能使用次数 | |||
| [268](turns) { return timesLimit(turns); }, | |||
| //按位置增伤主动技2 | |||
| [269](turns, target, mul) { | |||
| const targetTypes = SkillTarget.type2; | |||
| const typeArr = Bin.unflags(target).map(n => targetTypes[n]); | |||
| return activeTurns(turns, | |||
| slotPowerUp(p.mul({ atk: mul }), typeArr) | |||
| ); | |||
| }, | |||
| //一回合内使用几次技能才有倍率的队长技。 | |||
| [270](times, atk, rcv) { { return powerUp(Bin.unflags(31), null, p.mul({ atk: atk || 100, rcv: rcv || 100 }), c.useSkill(times)); } }, | |||
| @@ -2255,6 +2280,13 @@ function renderSkill(skill, option = {}) | |||
| frg.ap(tsp.skill.bind_skill(dict)); | |||
| break; | |||
| } | |||
| case SkillKinds.BindCard: { | |||
| let dict = { | |||
| icon: createIcon(skill.kind) | |||
| }; | |||
| frg.ap(tsp.skill.bind_card(dict)); | |||
| break; | |||
| } | |||
| case SkillKinds.BoardChange: { //洗版 | |||
| const attrs = skill.attrs; | |||
| let dict = { | |||
| @@ -2569,7 +2601,7 @@ function renderSkill(skill, option = {}) | |||
| targetDict.target = document.createDocumentFragment(); | |||
| //增加队员伤害的技能的目标,删选出来,其他的目标则不显示 | |||
| const targetTypes = ["self","leader-self","leader-helper","sub-members"]; | |||
| const targetTypes = SkillTarget.type1.concat(SkillTarget.type2); | |||
| let atkUpTarget = targets.filter(n=>targetTypes.includes(n)); | |||
| if (atkUpTarget.length) { | |||
| targetDict.target.appendChild(createTeamFlags(atkUpTarget)); | |||
| @@ -2745,11 +2777,11 @@ function renderSkill(skill, option = {}) | |||
| targetDict.target = document.createDocumentFragment(); | |||
| //增加队员伤害的技能的目标,删选出来,其他的目标则不显示 | |||
| const targetTypes = ["self","leader-self","leader-helper","sub-members"]; | |||
| let atkUpTarget = targets.filter(n=>targetTypes.includes(n)); | |||
| if (atkUpTarget.length) { | |||
| targetDict.target.appendChild(createTeamFlags(atkUpTarget)); | |||
| } | |||
| // const targetTypes = SkillTarget.type1; | |||
| // let atkUpTarget = targets.filter(n=>targetTypes.includes(n)); | |||
| // if (atkUpTarget.length) { | |||
| targetDict.target.appendChild(createTeamFlags(targets)); | |||
| // } | |||
| targetDict.target.appendChild(targets.map(target=> | |||
| tsp?.target[target.replaceAll("-","_")]?.()) | |||
| @@ -1189,7 +1189,7 @@ function cardN(id) { | |||
| } | |||
| //产生队伍目标类型 | |||
| function createTeamFlags(target) | |||
| function createTeamFlags(target, type) | |||
| { | |||
| const ul = document.createElement("ul"); | |||
| ul.className = "team-flags"; | |||
| @@ -1197,7 +1197,7 @@ function createTeamFlags(target) | |||
| const li = ul.appendChild(document.createElement("li")); | |||
| li.className = "team-member-icon"; | |||
| } | |||
| const targetTypes = ["self","leader-self","leader-helper","sub-members"]; | |||
| const targetTypes = type == 2 ? SkillTarget.type2 : SkillTarget.type1; | |||
| let _target = []; | |||
| if (Number.isInteger(target)) { | |||
| @@ -565,15 +565,15 @@ class LeaderSkillType_MatchingStyle { | |||
| this.#flags = arg; | |||
| } | |||
| } | |||
| get multipleAttr(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 0)} | |||
| get rowMatch(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 1)} | |||
| get combo(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 2)} | |||
| get sameColor(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 3)} | |||
| get LShape(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 4)} | |||
| get crossMatch(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 5)} | |||
| get heartCrossMatch(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 6)} | |||
| get remainOrbs(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 7)} | |||
| get enhanced5Orbs(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 8)} | |||
| get multipleAttr(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 0)} | |||
| get rowMatch(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 1)} | |||
| get combo(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 2)} | |||
| get sameColor(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 3)} | |||
| get LShape(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 4)} | |||
| get crossMatch(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 5)} | |||
| get heartCrossMatch(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 6)} | |||
| get remainOrbs(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 7)} | |||
| get enhanced5Orbs(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 8)} | |||
| } | |||
| class LeaderSkillType_Restriction_Bind { | |||
| #card = null; | |||
| @@ -585,16 +585,16 @@ class LeaderSkillType_Restriction_Bind { | |||
| this.#flags = arg; | |||
| } | |||
| } | |||
| get attrEnhance(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 9)} | |||
| get typeEnhance(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 10)} | |||
| get board7x6(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 11)} | |||
| get noSkyfall(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 12)} | |||
| get HpRange(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 13)} | |||
| get useSkill(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 14)} | |||
| get moveTimeDecrease_Fixed(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 15)} | |||
| get minMatchLen(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 16)} | |||
| get specialTeam(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 17)} | |||
| get effectWhenRecover(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 18)} | |||
| get attrEnhance(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 9)} | |||
| get typeEnhance(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 10)} | |||
| get board7x6(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 11)} | |||
| get noSkyfall(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 12)} | |||
| get HpRange(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 13)} | |||
| get useSkill(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 14)} | |||
| get moveTimeDecrease_Fixed(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 15)} | |||
| get minMatchLen(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 16)} | |||
| get specialTeam(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 17)} | |||
| get effectWhenRecover(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 18)} | |||
| } | |||
| class LeaderSkillType_ExtraEffects { | |||
| #card = null; | |||
| @@ -606,21 +606,21 @@ class LeaderSkillType_ExtraEffects { | |||
| this.#flags = arg; | |||
| } | |||
| } | |||
| get addCombo(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 21)} | |||
| get fixedFollowAttack(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 22)} | |||
| get scaleFollowAttack(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 23)} | |||
| get reduce49down(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 24)} | |||
| get reduce50(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 25)} | |||
| get reduce51up(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 26)} | |||
| get moveTimeIncrease(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 20)} | |||
| get rateMultiplyExp_Coin(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 27)} | |||
| get rateMultiplyDrop(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 28)} | |||
| get voidPoison(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 29)} | |||
| get counterAttack(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 30)} | |||
| get autoHeal(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 31)} | |||
| get unbindAwokenBind(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 19)} | |||
| get resolve(){return Boolean(this.#card?.searchFlags?.[1] ?? this.#flags[1] & 1 << 0)} | |||
| get predictionFalling(){return Boolean(this.#card?.searchFlags?.[1] ?? this.#flags[1] & 1 << 1)} | |||
| get addCombo(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 21)} | |||
| get fixedFollowAttack(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 22)} | |||
| get scaleFollowAttack(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 23)} | |||
| get reduce49down(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 24)} | |||
| get reduce50(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 25)} | |||
| get reduce51up(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 26)} | |||
| get moveTimeIncrease(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 20)} | |||
| get rateMultiplyExp_Coin(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 27)} | |||
| get rateMultiplyDrop(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 28)} | |||
| get voidPoison(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 29)} | |||
| get counterAttack(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 30)} | |||
| get autoHeal(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 31)} | |||
| get unbindAwokenBind(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 19)} | |||
| get resolve(){return Boolean((this.#card?.searchFlags?.[1] ?? this.#flags[1]) & 1 << 0)} | |||
| get predictionFalling(){return Boolean((this.#card?.searchFlags?.[1] ?? this.#flags[1]) & 1 << 1)} | |||
| } | |||
| class Team extends Array { | |||
| badge = 0; | |||
| @@ -44207,19 +44207,19 @@ const cachesMap = new Map([ | |||
| ], | |||
| [ | |||
| "script-json_data.js", | |||
| "8538e25e7f6f4e8e08b14282db6ea654" | |||
| "37e68450ecb7140ba93515f30fca6dc1" | |||
| ], | |||
| [ | |||
| "script-skill-parser.js", | |||
| "78597abdac6c0bfccc19919c5312ece1" | |||
| "228086552199fc6bb7eea0fe64f5feea" | |||
| ], | |||
| [ | |||
| "script-universal_function.js", | |||
| "b86853117fb96211b6b1da2996cdb81e" | |||
| "0bdc4d583774cd51cf302f7709cc3fb7" | |||
| ], | |||
| [ | |||
| "script.js", | |||
| "2e05c86aea3bb9b54e22dd07b9723c4b" | |||
| "270447ead17c33194fb0525cab9744f7" | |||
| ], | |||
| [ | |||
| "solo.html", | |||
| @@ -44235,7 +44235,7 @@ const cachesMap = new Map([ | |||
| ], | |||
| [ | |||
| "style.css", | |||
| "1b21675a9c3b07e2913c03d42b7fa65e" | |||
| "f634fa900250a1e745b551a9302e8856" | |||
| ], | |||
| [ | |||
| "temp.js", | |||
| @@ -44279,7 +44279,7 @@ const cachesMap = new Map([ | |||
| ], | |||
| [ | |||
| "languages/zh-hans.js", | |||
| "7b62458760e344526b07c586302333aa" | |||
| "92cc36747ac4440bdc45a1eba6ab4be7" | |||
| ], | |||
| [ | |||
| "languages/zh-hant.css", | |||
| @@ -44287,7 +44287,7 @@ const cachesMap = new Map([ | |||
| ], | |||
| [ | |||
| "languages/zh-hant.js", | |||
| "846cbeec8fc7202ae889f93cdcb089cf" | |||
| "04f96537a27ece89005f42da68735431" | |||
| ], | |||
| [ | |||
| "images/attrs.png", | |||
| @@ -44439,7 +44439,7 @@ const cachesMap = new Map([ | |||
| ], | |||
| [ | |||
| "images/icon-skills.png", | |||
| "f3fa5e8803e7b9f0adbb9b89e45a5b17" | |||
| "df43e89a902a603d16cc6cc4f77d25d2" | |||
| ], | |||
| [ | |||
| "images/icon-switch-leader.png", | |||
| @@ -3837,9 +3837,13 @@ table .orb-icon | |||
| .team-flags.sub-members .team-member-icon:not(:first-of-type):not(:last-of-type) { | |||
| background-color: lightgreen; | |||
| } | |||
| .team-flags.self .team-member-icon:nth-of-type(4) { | |||
| .team-flags.self .team-member-icon:nth-of-type(4) { | |||
| background-color: lightblue !important; | |||
| } | |||
| .team-flags.right-neighbor .team-member-icon:nth-of-type(5), | |||
| .team-flags.left-neighbor .team-member-icon:nth-of-type(3) { | |||
| background-color: violet !important; | |||
| } | |||
| /*.open-evolutionary-tree::before | |||
| { | |||
| @@ -4725,7 +4729,8 @@ body.external-link-support #external-support{ | |||
| .icon-skill[data-icon-type="ctw"]::after, | |||
| .icon-skill[data-icon-type="add-combo"]::after, | |||
| .icon-skill[data-icon-type="fixed-time"]::after, | |||
| .icon-skill[data-icon-type="increase-damage-cap"]::after | |||
| .icon-skill[data-icon-type="increase-damage-cap"]::after, | |||
| .icon-skill[data-icon-type="bind-card"]::after | |||
| { | |||
| content: ""; | |||
| position: absolute; | |||
| @@ -5011,6 +5016,17 @@ body.external-link-support #external-support{ | |||
| { | |||
| background-position-x: -36px; | |||
| } | |||
| .icon-skill[data-icon-type="bind-card"] | |||
| { | |||
| background-position-y: calc(-36px * 39); | |||
| } | |||
| .icon-skill[data-icon-type="bind-card"]::after | |||
| { | |||
| transform: scale(0.75); | |||
| background-position-y: calc(-36px * 47); | |||
| } | |||
| .icon-skill[data-icon-type="orb-thorn"] | |||
| { | |||
| background-position-y:calc(-36px * 37); | |||