diff --git a/model/damage/BuffManager.js b/model/damage/BuffManager.js index d063545..25ad2c5 100644 --- a/model/damage/BuffManager.js +++ b/model/damage/BuffManager.js @@ -89,13 +89,12 @@ export class BuffManager { return logger.warn('无效buff:', buff); // 武器buff职业检查 if (buff.source === 'Weapon') { - if (typeof buff.check === 'function') { - const oriCheck = buff.check; - buff.check = ({ avatar, buffM, calc }) => avatar.avatar_profession === weaponIDToProfession(avatar.weapon.id) && oriCheck({ avatar, buffM, calc }); - } - else { - buff.check = ({ avatar }) => avatar.avatar_profession === weaponIDToProfession(avatar.weapon.id); - } + const professionCheck = (avatar) => { + const weapon_profession = weaponIDToProfession(avatar.weapon.id); + return !weapon_profession || avatar.avatar_profession === weapon_profession; + }; + const oriCheck = typeof buff.check === 'function' && buff.check; + buff.check = ({ avatar, buffM, calc }) => professionCheck(avatar) && (!oriCheck || oriCheck({ avatar, buffM, calc })); } else if (buff.source === 'Rank') { buff.check ??= +buff.name.match(/\d/)?.[0]; diff --git a/model/damage/BuffManager.ts b/model/damage/BuffManager.ts index 0f37716..971c8fb 100644 --- a/model/damage/BuffManager.ts +++ b/model/damage/BuffManager.ts @@ -138,12 +138,12 @@ export class BuffManager { return logger.warn('无效buff:', buff) // 武器buff职业检查 if (buff.source === 'Weapon') { - if (typeof buff.check === 'function') { - const oriCheck = buff.check - buff.check = ({ avatar, buffM, calc }) => avatar.avatar_profession === weaponIDToProfession(avatar.weapon.id) && oriCheck({ avatar, buffM, calc }) - } else { - buff.check = ({ avatar }) => avatar.avatar_profession === weaponIDToProfession(avatar.weapon.id) + const professionCheck = (avatar: ZZZAvatarInfo) => { + const weapon_profession = weaponIDToProfession(avatar.weapon.id) + return !weapon_profession || avatar.avatar_profession === weapon_profession } + const oriCheck = typeof buff.check === 'function' && buff.check + buff.check = ({ avatar, buffM, calc }) => professionCheck(avatar) && (!oriCheck || oriCheck({ avatar, buffM, calc })) } else if (buff.source === 'Rank') { buff.check ??= +buff.name.match(/\d/)!?.[0] } diff --git a/model/damage/character/耀嘉音/calc.js b/model/damage/character/耀嘉音/calc.js new file mode 100644 index 0000000..5e8a670 --- /dev/null +++ b/model/damage/character/耀嘉音/calc.js @@ -0,0 +1,69 @@ +/** @type {import('../../BuffManager.ts').BuffManager['buffs']} */ +export const buffs = [ + { + name: '1影', + type: '无视抗性', + value: 0.06 * 3 + }, + { + name: '2影', + type: '攻击力', + value: ({ avatar }) => Math.min(400, avatar.initial_properties.ATK * 0.19) + }, + { + name: '6影', + type: '暴击率', + value: 0.8, + range: ['AQ', 'EP', 'EQZ', 'EZ', 'EY'] + }, + { + name: '核心被动:《如歌的行板》', + type: '攻击力', + value: ({ avatar, calc }) => Math.min(1200, avatar.initial_properties.ATK * calc.calc_value('T')), + }, + { + name: '技能:咏叹华彩', + type: '增伤', + value: 'E1', + range: ['AQ', 'E', 'R'] // 排除正常普攻 + }, + { + name: '技能:咏叹华彩', + type: '暴击伤害', + value: 'E2', + range: ['AQ', 'E', 'R'] + } +] + +/** @type {import('../../Calculator.ts').skill['before']} */ +const before = ({ avatar, calc, props, skill }) => { + if (avatar.rank >= 6) props.倍率 = calc.get_SkillMultiplier(skill.type) * 2 +} + +/** @type {import('../../Calculator.ts').Calculator['skills']} */ +export const skills = [ + { name: '普攻:《随想曲》三段', type: 'AP3' }, + { + name: '6影追加蓄力普攻三段', + type: 'AP3', + banCache: true, + check: ({ avatar }) => avatar.rank >= 6, + before: ({ usefulBuffs }) => usefulBuffs.push({ + name: '6影', + type: '暴击率', + value: 0.8 + }) + }, + { name: '普攻:间奏/终曲每[震音]', type: 'AQ', before }, + { name: '特殊技:《风铃与旧约》', type: 'EP', before }, + { name: '和弦追加[震音]', type: 'EQZ', before }, + { name: '天赋追加[震音]', type: 'EZ', before }, + { + name: '追加[音簇]*3', + type: 'EY', + before, + after: ({ damage }) => damage.x(3) + }, + { name: '连携技:《微醺协奏》', type: 'RL' }, + { name: '终结技:《幻想式奏鸣》', type: 'RZ' } +] \ No newline at end of file diff --git a/model/damage/character/耀嘉音/data.json b/model/damage/character/耀嘉音/data.json new file mode 100644 index 0000000..d359442 --- /dev/null +++ b/model/damage/character/耀嘉音/data.json @@ -0,0 +1,39 @@ +{ + "skill": { + "AP3": [ + 2.707,2.954,3.201,3.448,3.695,3.942,4.189,4.436,4.683,4.93,5.177,5.424,5.671,5.918,6.165,6.412 + ], + "AQ": [ + 0.55,0.6,0.65,0.7,0.75,0.8,0.85,0.9,0.95,1,1.05,1.1,1.15,1.2,1.25,1.3 + ], + "EP": [ + 0.55,0.6,0.65,0.7,0.75,0.8,0.85,0.9,0.95,1,1.05,1.1,1.15,1.2,1.25,1.3 + ], + "EQZ": [ + 0.46,0.501,0.544,0.586,0.628,0.67,0.712,0.754,0.796,0.838,0.88,0.922,0.964,1.006,1.048,1.09 + ], + "EZ": [ + 0.46,0.501,0.544,0.586,0.628,0.67,0.712,0.754,0.796,0.838,0.88,0.922,0.964,1.006,1.048,1.09 + ], + "EY": [ + 0.24,0.262,0.284,0.306,0.328,0.35,0.372,0.394,0.416,0.438,0.46,0.482,0.504,0.526,0.548,0.57 + ], + "RL": [ + 6.718,7.329,7.94,8.551,9.162,9.773,10.384,10.995,11.606,12.217,12.828,13.439,14.05,14.661,15.272,15.883 + ], + "RZ": [ + 19.598,21.38,23.162,24.944,26.726,28.508,30.29,32.072,33.854,35.636,37.418,39.2,40.982,42.764,44.546,46.328 + ] + }, + "buff": { + "T": [ + 0.22,0.24,0.26,0.28,0.3,0.32,0.35 + ], + "E1": [ + 0.09,0.1,0.11,0.12,0.13,0.14,0.15,0.16,0.17,0.18,0.19,0.2,0.21,0.22,0.23,0.25 + ], + "E2": [ + 0.085,0.1,0.115,0.13,0.145,0.16,0.175,0.19,0.205,0.22,0.235,0.25,0.265,0.28,0.295,0.31 + ] + } +} \ No newline at end of file diff --git a/model/damage/weapon/玲珑妆匣.js b/model/damage/weapon/玲珑妆匣.js new file mode 100644 index 0000000..66139d4 --- /dev/null +++ b/model/damage/weapon/玲珑妆匣.js @@ -0,0 +1,7 @@ +/** @type {import('../BuffManager.ts').BuffManager['buffs']} */ +export const buffs = [ + { + type: '增伤', + value: [0.1, 0.115, 0.13, 0.145, 0.16].map(v => v * 2) + } +] \ No newline at end of file