添加新技能解析

This commit is contained in:
枫谷剑仙 2025-03-20 20:12:13 +08:00
parent 29a745e4bb
commit dc01d105cb
10 changed files with 268 additions and 154 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 210 KiB

After

Width:  |  Height:  |  Size: 211 KiB

View File

@ -78,6 +78,7 @@ const _localTranslating = {
unbind_awakenings: tp`${'icon'}觉醒无效`, unbind_awakenings: tp`${'icon'}觉醒无效`,
unbind_matches: tp`${'icon'}无法消除宝珠`, unbind_matches: tp`${'icon'}无法消除宝珠`,
bind_skill: tp`${'icon'}自身无法使用技能`, bind_skill: tp`${'icon'}自身无法使用技能`,
bind_card: tp`卡片自身${'icon'}变为封锁状态`,
defense_break: tp`${'icon'}敌方的防御力减少${'value'}`, defense_break: tp`${'icon'}敌方的防御力减少${'value'}`,
poison: tp`${'icon'}使${'target'}中毒,每回合损失${'belong_to'} ${'value'}${'stats'}`, poison: tp`${'icon'}使${'target'}中毒,每回合损失${'belong_to'} ${'value'}${'stats'}`,
time_extend: tp`${'icon'}宝珠移动时间 ${'value'}`, time_extend: tp`${'icon'}宝珠移动时间 ${'value'}`,
@ -136,7 +137,7 @@ const _localTranslating = {
obstruct_opponent_before_me: tp`排名比自身高的对手`, obstruct_opponent_before_me: tp`排名比自身高的对手`,
obstruct_opponent_designated_position: tp`${'positions'}排位的对手`, obstruct_opponent_designated_position: tp`${'positions'}排位的对手`,
slot_power_up: tp`${'targets'}${'icon'}${'value'}`, 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_jamming_state: tp`${'position'}生成${'icon'}${'state'}${'size'}${'count'}${'comment'}`,
board_size_change: tp`板面大小改变为${'icon'}${'size'}`, board_size_change: tp`板面大小改变为${'icon'}${'size'}`,
remove_assist: tp`${'icon'}移除自身的辅助宠物(直到地下城结束)`, remove_assist: tp`${'icon'}移除自身的辅助宠物(直到地下城结束)`,
@ -221,6 +222,8 @@ const _localTranslating = {
sub_members: tp`队员`, sub_members: tp`队员`,
leader_self: tp`左边队长`, leader_self: tp`左边队长`,
leader_helper: tp`右边队长`, leader_helper: tp`右边队长`,
left_neighbor: tp`左邻角色`,
right_neighbor: tp`右邻角色`,
collab_id: tp`合作ID为${'id'}的角色`, collab_id: tp`合作ID为${'id'}的角色`,
gacha_id: tp`抽蛋ID为${'id'}的角色`, gacha_id: tp`抽蛋ID为${'id'}的角色`,
enemy: tp`敌人`, enemy: tp`敌人`,

View File

@ -77,7 +77,7 @@ const _localTranslating = {
unbind_normal: tp`${'icon'}封鎖`, unbind_normal: tp`${'icon'}封鎖`,
unbind_awakenings: tp`${'icon'}覺醒無效`, unbind_awakenings: tp`${'icon'}覺醒無效`,
unbind_matches: tp`${'icon'}無法消除寶珠`, unbind_matches: tp`${'icon'}無法消除寶珠`,
bind_skill: tp`${'icon'}自身無法使用技能`, bind_skill: tp`卡片自身${'icon'}變為封鎖狀態`,
defense_break: tp`${'icon'}敵方的防禦力減少${'value'}`, defense_break: tp`${'icon'}敵方的防禦力減少${'value'}`,
poison: tp`${'icon'}使${'target'}中毒,每回合損失${'belong_to'} ${'value'}${'stats'}`, poison: tp`${'icon'}使${'target'}中毒,每回合損失${'belong_to'} ${'value'}${'stats'}`,
time_extend: tp`${'icon'}寶珠移動時間 ${'value'}`, time_extend: tp`${'icon'}寶珠移動時間 ${'value'}`,
@ -136,7 +136,7 @@ const _localTranslating = {
obstruct_opponent_before_me: tp`排名比自身高的對手`, obstruct_opponent_before_me: tp`排名比自身高的對手`,
obstruct_opponent_designated_position: tp`${'positions'}排位的對手`, obstruct_opponent_designated_position: tp`${'positions'}排位的對手`,
slot_power_up: tp`${'targets'}${'icon'}${'value'}`, 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_jamming_state: tp`${'position'}生成${'icon'}${'state'}${'size'}${'count'}${'comment'}`,
board_size_change: tp`板面大小改變為${'icon'}${'size'}`, board_size_change: tp`板面大小改變為${'icon'}${'size'}`,
remove_assist: tp`${'icon'}移除自身的輔助寵物(直到地下城結束)`, remove_assist: tp`${'icon'}移除自身的輔助寵物(直到地下城結束)`,
@ -221,6 +221,8 @@ const _localTranslating = {
sub_members: tp`隊員`, sub_members: tp`隊員`,
leader_self: tp`左邊隊長`, leader_self: tp`左邊隊長`,
leader_helper: tp`右邊隊長`, leader_helper: tp`右邊隊長`,
left_neighbor: tp`左鄰角色`,
right_neighbor: tp`右鄰角色`,
collab_id: tp`合作ID為${'id'}的角色`, collab_id: tp`合作ID為${'id'}的角色`,
gacha_id: tp`抽蛋ID為${'id'}的角色`, gacha_id: tp`抽蛋ID為${'id'}的角色`,
enemy: tp`敵人`, enemy: tp`敵人`,

View File

@ -93,6 +93,7 @@ let localTranslating = {
unbind_awakenings: tp`${'icon'}Awoken bind`, unbind_awakenings: tp`${'icon'}Awoken bind`,
unbind_matches: tp`${'icon'}Unmatchable orb`, unbind_matches: tp`${'icon'}Unmatchable orb`,
bind_skill: tp`${'icon'}Unable to use skills`, 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'}`, defense_break: tp`${'icon'}Reduce enemy defense by ${'value'}`,
poison: tp`${'icon'}Poisons ${'target'}, reduce ${'stats'} with ${'belong_to'} ${'value'} per turns`, poison: tp`${'icon'}Poisons ${'target'}, reduce ${'stats'} with ${'belong_to'} ${'value'} per turns`,
time_extend: tp`${'icon'}Orb move time ${'value'}`, 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_after_me: tp`The opponent ranked lower than me`,
obstruct_opponent_before_me: tp`The opponent ranked higher than me`, obstruct_opponent_before_me: tp`The opponent ranked higher than me`,
obstruct_opponent_designated_position: tp`No.${'positions'} ranked opponents`, 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'}`, 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_jamming_state: tp`Creates ${'count'} ${'icon'}${'state'} ${'size'} at ${'position'}${'comment'}`,
board_size_change: tp`Board size changed to ${'icon'}${'size'}`, board_size_change: tp`Board size changed to ${'icon'}${'size'}`,
@ -236,6 +237,8 @@ let localTranslating = {
sub_members: tp`sub-members`, sub_members: tp`sub-members`,
leader_self: tp`left leader`, leader_self: tp`left leader`,
leader_helper: tp`right 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'} `, collab_id: tp`Cards with Collaboration ID of ${'id'} `,
gacha_id: tp`Cards with Egg Machine ID of ${'id'} `, gacha_id: tp`Cards with Egg Machine ID of ${'id'} `,
enemy: tp`Enemy`, enemy: tp`Enemy`,
@ -1222,22 +1225,21 @@ const specialSearchFunctions = (function() {
} }
function memberATK_Addition(card) function memberATK_Addition(card)
{ {
const searchTypeArray = [230]; const searchTypeArray = [230, 269];
const skill = getCardActiveSkill(card, searchTypeArray); const skills = getCardActiveSkills(card, searchTypeArray);
if (!skill) return; return skills.map(skill=>{
const sk = skill.params; const sk = skill.params;
const fragment = document.createDocumentFragment(); const fragment = document.createDocumentFragment();
fragment.appendChild(createTeamFlags(sk[1])); fragment.appendChild(createTeamFlags(sk[1], skill.type == 269 ? 2 : 1));
let str = ''; fragment.append(`${sk[2] / 100}倍×${sk[0]}T`);
str +=`${sk[2] / 100}倍×${sk[0]}T`; return fragment;
fragment.appendChild(document.createTextNode(str)); }).nodeJoin(document.createElement("br"));
return fragment;
} }
function getIncreaseDamageCap(skill) function getIncreaseDamageCap(skill)
{ {
let cap = 0; let cap = 0;
switch (skill.type) { switch (skill.type) {
case 241:case 258:case 263: case 241:case 258:case 263:case 266:
cap = skill.params[1]; cap = skill.params[1];
break; break;
case 246: case 246:
@ -1251,56 +1253,58 @@ const specialSearchFunctions = (function() {
} }
function memberCap_Addition(card) function memberCap_Addition(card)
{ {
const searchTypeArray = [241, 246, 247, 258, 263]; const searchTypeArray = [241, 246, 247, 258, 263, 266];
const skill = getCardActiveSkill(card, searchTypeArray); const skills = getCardActiveSkills(card, searchTypeArray);
if (!skill) return; return skills.map(skill=>{
const sk = skill.params; const sk = skill.params;
let cap = getIncreaseDamageCap(skill); let cap = getIncreaseDamageCap(skill);
const fragment = document.createDocumentFragment();
const fragment = document.createDocumentFragment(); switch (skill.type) {
switch (skill.type) { case 258:
case 258: { case 266: {
fragment.appendChild(createTeamFlags(sk[2])); fragment.appendChild(createTeamFlags(sk[2], skill.type == 266 ? 2 : 1));
break; 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 types = Bin.unflags(sk[3]); case 241:
if (types?.length) case 246:
{ case 247: {
fragment.appendChild(createTypesList(types)); 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"));
//fragment.append(createSkillIcon(SkillKinds.IncreaseDamageCapacity, cap > 21 ? "cap-incr" : "cap-decr")); switch (skill.type) {
switch (skill.type) { case 258:
case 258: case 241:
case 241: case 263:
case 263: { case 266: {
fragment.append(`${(cap*1e8).bigNumberToString()}×${sk[0]}T`); fragment.append(`${(cap*1e8).bigNumberToString()}×${sk[0]}T`);
break; 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;
}
} }
case 246: { return fragment;
fragment.append(`${(cap*1e8).bigNumberToString()}${sk[1]}C in ${sk[0]}S`); }).nodeJoin(document.createElement("br"));
break;
}
case 247: {
fragment.append(`${(cap*1e8).bigNumberToString()}${sk[2]} of `, createOrbsList(Bin.unflags(sk[1])), ` in ${sk[0]}S`);
break;
}
}
return fragment;
} }
function dixedDamage_Addition(card) function dixedDamage_Addition(card)
{ {
@ -1848,7 +1852,7 @@ const specialSearchFunctions = (function() {
{group:true,name:"Increase Damage Cap",otLangName:{chs:"增加伤害上限",cht:"增加傷害上限"}, functions: [ {group:true,name:"Increase Damage Cap",otLangName:{chs:"增加伤害上限",cht:"增加傷害上限"}, functions: [
{name:"Increase Damage Cap - Any",otLangName:{chs:"增加伤害上限 - 任意",cht:"增加傷害上限 - 任意"}, {name:"Increase Damage Cap - Any",otLangName:{chs:"增加伤害上限 - 任意",cht:"增加傷害上限 - 任意"},
function:cards=>{ function:cards=>{
const searchTypeArray = [241, 246, 247, 258, 263]; const searchTypeArray = [241, 246, 247, 258, 263, 266];
return cards.filter(card=>{ return cards.filter(card=>{
const skill = getCardActiveSkill(card, searchTypeArray); const skill = getCardActiveSkill(card, searchTypeArray);
return skill; return skill;
@ -1862,11 +1866,20 @@ const specialSearchFunctions = (function() {
}, },
{name:"Increase Damage Cap - Self",otLangName:{chs:"增加伤害上限 - 自身",cht:"增加傷害上限 - 自身"}, {name:"Increase Damage Cap - Self",otLangName:{chs:"增加伤害上限 - 自身",cht:"增加傷害上限 - 自身"},
function:cards=>{ function:cards=>{
const searchTypeArray = [241, 246, 247, 258]; const searchTypeArray = [241, 246, 247, 258, 266];
return cards.filter(card=>{ return cards.filter(card=>{
const skill = getCardActiveSkill(card, searchTypeArray); const skill = getCardActiveSkill(card, searchTypeArray);
if (skill?.type === 258) return Boolean(skill.params[2] & 0b1); switch (skill?.type) {
else return skill; case 258: {
return Boolean(skill.params[2] & 0b1);
}
case 266: {
return Boolean(skill.params[2] & 0b100);
}
default: {
return skill;
}
}
}).sort((a,b)=>{ }).sort((a,b)=>{
const a_ss = getCardActiveSkill(a, searchTypeArray), b_ss = getCardActiveSkill(b, searchTypeArray); const a_ss = getCardActiveSkill(a, searchTypeArray), b_ss = getCardActiveSkill(b, searchTypeArray);
let a_pC = getIncreaseDamageCap(a_ss), b_pC = getIncreaseDamageCap(b_ss); let a_pC = getIncreaseDamageCap(a_ss), b_pC = getIncreaseDamageCap(b_ss);
@ -1880,7 +1893,7 @@ const specialSearchFunctions = (function() {
const searchTypeArray = [258]; const searchTypeArray = [258];
return cards.filter(card=>{ return cards.filter(card=>{
const skill = getCardActiveSkill(card, searchTypeArray); const skill = getCardActiveSkill(card, searchTypeArray);
return skill && Boolean(skill.params[2] & (0b10 | 0b100)); return skill && Boolean(skill.params[2] & 0b110);
}).sort((a,b)=>{ }).sort((a,b)=>{
const a_ss = getCardActiveSkill(a, searchTypeArray), b_ss = getCardActiveSkill(b, searchTypeArray); const a_ss = getCardActiveSkill(a, searchTypeArray), b_ss = getCardActiveSkill(b, searchTypeArray);
let a_pC = getIncreaseDamageCap(a_ss), b_pC = getIncreaseDamageCap(b_ss); let a_pC = getIncreaseDamageCap(a_ss), b_pC = getIncreaseDamageCap(b_ss);
@ -1903,6 +1916,20 @@ const specialSearchFunctions = (function() {
}, },
addition:memberCap_Addition 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:"增加傷害上限 - 屬性/類型"}, {name:"Increase Damage Cap - Attr./Types",otLangName:{chs:"增加伤害上限 - 属性/类型",cht:"增加傷害上限 - 屬性/類型"},
function:cards=>{ function:cards=>{
const searchTypeArray = [263]; const searchTypeArray = [263];
@ -1918,10 +1945,10 @@ const specialSearchFunctions = (function() {
addition:memberCap_Addition addition:memberCap_Addition
}, },
]}, ]},
{group:true,name:"Member ATK rate change",otLangName:{chs:"队员攻击力",cht:"隊員攻擊力"}, functions: [ {group:true,name:"Card slot ATK rate change",otLangName:{chs:"卡片位置攻击力",cht:"卡片位置攻擊力"}, functions: [
{name:"Member ATK rate change - Any",otLangName:{chs:"队员攻击力 - 任意",cht:"隊員攻擊力 - 任意"}, {name:"Card slot ATK rate change - Any",otLangName:{chs:"卡片位置攻击力 - 任意",cht:"卡片位置攻擊力 - 任意"},
function:cards=>{ function:cards=>{
const searchTypeArray = [230]; const searchTypeArray = [230, 269];
return cards.filter(card=>{ return cards.filter(card=>{
const skill = getCardActiveSkill(card, searchTypeArray); const skill = getCardActiveSkill(card, searchTypeArray);
return skill; return skill;
@ -1929,27 +1956,37 @@ const specialSearchFunctions = (function() {
}, },
addition:memberATK_Addition addition:memberATK_Addition
}, },
{name:"Member ATK rate change - Self",otLangName:{chs:"队员攻击力 - 自身",cht:"隊員攻擊力 - 自身"}, {name:"Card slot ATK rate change - Self",otLangName:{chs:"卡片位置攻击力 - 自身",cht:"卡片位置攻擊力 - 自身"},
function:cards=>{ function:cards=>{
const searchTypeArray = [230]; const searchTypeArray = [230, 269];
return cards.filter(card=>{ return cards.filter(card=>{
const skill = getCardActiveSkill(card, searchTypeArray); 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)); }).sort((a,b)=>sortByParams(a, b, searchTypeArray, 2));
}, },
addition:memberATK_Addition addition:memberATK_Addition
}, },
{name:"Member ATK rate change - Leader",otLangName:{chs:"队员攻击力 - 队长",cht:"隊員攻擊力 - 隊長"}, {name:"Card slot ATK rate change - Leader",otLangName:{chs:"卡片位置攻击力 - 队长",cht:"卡片位置攻擊力 - 隊長"},
function:cards=>{ function:cards=>{
const searchTypeArray = [230]; const searchTypeArray = [230];
return cards.filter(card=>{ return cards.filter(card=>{
const skill = getCardActiveSkill(card, searchTypeArray); 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)); }).sort((a,b)=>sortByParams(a, b, searchTypeArray, 2));
}, },
addition:memberATK_Addition addition:memberATK_Addition
}, },
{name:"Member ATK rate change - Sub",otLangName:{chs:"队员攻击力 - 队员",cht:"隊員攻擊力 - 隊員"}, {name:"Card slot ATK rate change - Sub",otLangName:{chs:"卡片位置攻击力 - 队员",cht:"卡片位置攻擊力 - 隊員"},
function:cards=>{ function:cards=>{
const searchTypeArray = [230]; const searchTypeArray = [230];
return cards.filter(card=>{ return cards.filter(card=>{
@ -1959,8 +1996,18 @@ const specialSearchFunctions = (function() {
}, },
addition:memberATK_Addition 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=>{ function:cards=>{
const searchTypeArray = [142]; const searchTypeArray = [142];
return cards.filter(card=>{ return cards.filter(card=>{
@ -1982,27 +2029,6 @@ const specialSearchFunctions = (function() {
return fragment; 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;
})
},
{name:"↓Reduce skills charge",otLangName:{chs:"【坐】增加CD",cht:"【坐】增加CD"}, {name:"↓Reduce skills charge",otLangName:{chs:"【坐】增加CD",cht:"【坐】增加CD"},
function:cards=>{ function:cards=>{
const searchTypeArray = [218]; const searchTypeArray = [218];
@ -2022,6 +2048,41 @@ const specialSearchFunctions = (function() {
return fragment; 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);
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:"Bind card self",otLangName:{chs:"角色自身被绑定",cht:"角色自身被綁定"},
function:cards=>cards.filter(card=>{
const searchTypeArray = [267];
const skill = getCardActiveSkill(card, searchTypeArray);
return skill;
}),
addition:card=>{
const searchTypeArray = [267];
const skill = getCardActiveSkill(card, searchTypeArray);
if (!skill) return;
const sk = skill.params;
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: [ {group:true,name:"Player's HP change",otLangName:{chs:"玩家HP操纵类",cht:"玩家HP操縱類"}, functions: [
{name:"Heal after turn",otLangName:{chs:"回合结束回血 buff",cht:"回合結束回血 buff"}, {name:"Heal after turn",otLangName:{chs:"回合结束回血 buff",cht:"回合結束回血 buff"},

View File

@ -386,6 +386,11 @@ class Board
} }
} }
const SkillTarget = {
type1: ["self","leader-self","leader-helper","sub-members"],
type2: ["right-neighbor","left-neighbor","self"],
};
const SkillValue = { const SkillValue = {
isLess: function (value) { isLess: function (value) {
if (value.kind === SkillValueKind.Percent) return value.value < 1; if (value.kind === SkillValueKind.Percent) return value.value < 1;
@ -449,6 +454,7 @@ const SkillKinds = {
BoardChange: "board-change", BoardChange: "board-change",
Unbind: "unbind", Unbind: "unbind",
BindSkill: "bind-skill", BindSkill: "bind-skill",
BindCard: "bind-card",
RandomSkills: "random-skills", RandomSkills: "random-skills",
EvolvedSkills: "evolved-skills", EvolvedSkills: "evolved-skills",
SkillProviso: "skill-proviso", SkillProviso: "skill-proviso",
@ -1008,6 +1014,7 @@ function unbind(normal, awakenings, matches) {
return { kind: SkillKinds.Unbind, normal: normal, awakenings: awakenings , matches: matches}; return { kind: SkillKinds.Unbind, normal: normal, awakenings: awakenings , matches: matches};
} }
function bindSkill() { return { kind: SkillKinds.BindSkill}; } function bindSkill() { return { kind: SkillKinds.BindSkill}; }
function bindCard() { return { kind: SkillKinds.BindCard}; }
function boardChange(attrs) { function boardChange(attrs) {
return { kind: SkillKinds.BoardChange, attrs: attrs }; return { kind: SkillKinds.BoardChange, attrs: attrs };
} }
@ -1592,8 +1599,9 @@ const skillObjectParsers = {
[229](attrs, types, hp, atk, rcv) { [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}))); 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) { [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]); const typeArr = Bin.unflags(target).map(n => targetTypes[n]);
return activeTurns(turns, return activeTurns(turns,
slotPowerUp(p.mul({ atk: mul }), typeArr) slotPowerUp(p.mul({ atk: mul }), typeArr)
@ -1641,7 +1649,7 @@ const skillObjectParsers = {
); );
}, },
[241](turns, cap) { //改变伤害上限主动技 [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]); // const typeArr = Bin.unflags(target).map(n => targetTypes[n]);
return activeTurns(turns, return activeTurns(turns,
increaseDamageCapacity(cap * 1e8, ["self"]) increaseDamageCapacity(cap * 1e8, ["self"])
@ -1726,9 +1734,9 @@ const skillObjectParsers = {
autoPath(5), autoPath(5),
]; ];
}, },
//按位置改变伤害上限主动技1
[258](turns, cap, target) { //改变伤害上限主动技 [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]); const typeArr = Bin.unflags(target).map(n => targetTypes[n]);
return activeTurns(turns, return activeTurns(turns,
increaseDamageCapacity(cap * 1e8, typeArr) increaseDamageCapacity(cap * 1e8, typeArr)
@ -1745,9 +1753,26 @@ const skillObjectParsers = {
}, },
[264](mul) { return rateMultiply(v.percent(mul), 'plus_point'); }, [264](mul) { return rateMultiply(v.percent(mul), 'plus_point'); },
[265](mul) { return rateMultiply(v.percent(mul), 'part_break'); }, [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); }, [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)); } }, [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)); frg.ap(tsp.skill.bind_skill(dict));
break; break;
} }
case SkillKinds.BindCard: {
let dict = {
icon: createIcon(skill.kind)
};
frg.ap(tsp.skill.bind_card(dict));
break;
}
case SkillKinds.BoardChange: { //洗版 case SkillKinds.BoardChange: { //洗版
const attrs = skill.attrs; const attrs = skill.attrs;
let dict = { let dict = {
@ -2569,7 +2601,7 @@ function renderSkill(skill, option = {})
targetDict.target = document.createDocumentFragment(); 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)); let atkUpTarget = targets.filter(n=>targetTypes.includes(n));
if (atkUpTarget.length) { if (atkUpTarget.length) {
targetDict.target.appendChild(createTeamFlags(atkUpTarget)); targetDict.target.appendChild(createTeamFlags(atkUpTarget));
@ -2745,11 +2777,11 @@ function renderSkill(skill, option = {})
targetDict.target = document.createDocumentFragment(); targetDict.target = document.createDocumentFragment();
//增加队员伤害的技能的目标,删选出来,其他的目标则不显示 //增加队员伤害的技能的目标,删选出来,其他的目标则不显示
const targetTypes = ["self","leader-self","leader-helper","sub-members"]; // const targetTypes = SkillTarget.type1;
let atkUpTarget = targets.filter(n=>targetTypes.includes(n)); // let atkUpTarget = targets.filter(n=>targetTypes.includes(n));
if (atkUpTarget.length) { // if (atkUpTarget.length) {
targetDict.target.appendChild(createTeamFlags(atkUpTarget)); targetDict.target.appendChild(createTeamFlags(targets));
} // }
targetDict.target.appendChild(targets.map(target=> targetDict.target.appendChild(targets.map(target=>
tsp?.target[target.replaceAll("-","_")]?.()) tsp?.target[target.replaceAll("-","_")]?.())

View File

@ -1189,7 +1189,7 @@ function cardN(id) {
} }
//产生队伍目标类型 //产生队伍目标类型
function createTeamFlags(target) function createTeamFlags(target, type)
{ {
const ul = document.createElement("ul"); const ul = document.createElement("ul");
ul.className = "team-flags"; ul.className = "team-flags";
@ -1197,7 +1197,7 @@ function createTeamFlags(target)
const li = ul.appendChild(document.createElement("li")); const li = ul.appendChild(document.createElement("li"));
li.className = "team-member-icon"; li.className = "team-member-icon";
} }
const targetTypes = ["self","leader-self","leader-helper","sub-members"]; const targetTypes = type == 2 ? SkillTarget.type2 : SkillTarget.type1;
let _target = []; let _target = [];
if (Number.isInteger(target)) { if (Number.isInteger(target)) {

View File

@ -565,15 +565,15 @@ class LeaderSkillType_MatchingStyle {
this.#flags = arg; this.#flags = arg;
} }
} }
get multipleAttr(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 0)} 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 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 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 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 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 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 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 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 enhanced5Orbs(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 8)}
} }
class LeaderSkillType_Restriction_Bind { class LeaderSkillType_Restriction_Bind {
#card = null; #card = null;
@ -585,16 +585,16 @@ class LeaderSkillType_Restriction_Bind {
this.#flags = arg; this.#flags = arg;
} }
} }
get attrEnhance(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 9)} 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 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 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 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 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 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 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 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 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 effectWhenRecover(){return Boolean((this.#card?.searchFlags?.[0] ?? this.#flags[0]) & 1 << 18)}
} }
class LeaderSkillType_ExtraEffects { class LeaderSkillType_ExtraEffects {
#card = null; #card = null;
@ -606,21 +606,21 @@ class LeaderSkillType_ExtraEffects {
this.#flags = arg; this.#flags = arg;
} }
} }
get addCombo(){return Boolean(this.#card?.searchFlags?.[0] ?? this.#flags[0] & 1 << 21)} 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 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 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 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 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 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 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 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 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 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 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 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 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 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 predictionFalling(){return Boolean((this.#card?.searchFlags?.[1] ?? this.#flags[1]) & 1 << 1)}
} }
class Team extends Array { class Team extends Array {
badge = 0; badge = 0;

View File

@ -44207,19 +44207,19 @@ const cachesMap = new Map([
], ],
[ [
"script-json_data.js", "script-json_data.js",
"8538e25e7f6f4e8e08b14282db6ea654" "37e68450ecb7140ba93515f30fca6dc1"
], ],
[ [
"script-skill-parser.js", "script-skill-parser.js",
"78597abdac6c0bfccc19919c5312ece1" "228086552199fc6bb7eea0fe64f5feea"
], ],
[ [
"script-universal_function.js", "script-universal_function.js",
"b86853117fb96211b6b1da2996cdb81e" "0bdc4d583774cd51cf302f7709cc3fb7"
], ],
[ [
"script.js", "script.js",
"2e05c86aea3bb9b54e22dd07b9723c4b" "270447ead17c33194fb0525cab9744f7"
], ],
[ [
"solo.html", "solo.html",
@ -44235,7 +44235,7 @@ const cachesMap = new Map([
], ],
[ [
"style.css", "style.css",
"1b21675a9c3b07e2913c03d42b7fa65e" "f634fa900250a1e745b551a9302e8856"
], ],
[ [
"temp.js", "temp.js",
@ -44279,7 +44279,7 @@ const cachesMap = new Map([
], ],
[ [
"languages/zh-hans.js", "languages/zh-hans.js",
"7b62458760e344526b07c586302333aa" "92cc36747ac4440bdc45a1eba6ab4be7"
], ],
[ [
"languages/zh-hant.css", "languages/zh-hant.css",
@ -44287,7 +44287,7 @@ const cachesMap = new Map([
], ],
[ [
"languages/zh-hant.js", "languages/zh-hant.js",
"846cbeec8fc7202ae889f93cdcb089cf" "04f96537a27ece89005f42da68735431"
], ],
[ [
"images/attrs.png", "images/attrs.png",
@ -44439,7 +44439,7 @@ const cachesMap = new Map([
], ],
[ [
"images/icon-skills.png", "images/icon-skills.png",
"f3fa5e8803e7b9f0adbb9b89e45a5b17" "df43e89a902a603d16cc6cc4f77d25d2"
], ],
[ [
"images/icon-switch-leader.png", "images/icon-switch-leader.png",

View File

@ -3837,9 +3837,13 @@ table .orb-icon
.team-flags.sub-members .team-member-icon:not(:first-of-type):not(:last-of-type) { .team-flags.sub-members .team-member-icon:not(:first-of-type):not(:last-of-type) {
background-color: lightgreen; 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; 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 /*.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="ctw"]::after,
.icon-skill[data-icon-type="add-combo"]::after, .icon-skill[data-icon-type="add-combo"]::after,
.icon-skill[data-icon-type="fixed-time"]::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: ""; content: "";
position: absolute; position: absolute;
@ -5011,6 +5016,17 @@ body.external-link-support #external-support{
{ {
background-position-x: -36px; 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"] .icon-skill[data-icon-type="orb-thorn"]
{ {
background-position-y:calc(-36px * 37); background-position-y:calc(-36px * 37);