From e73c0178c36c264459a092a2b10e71bff33edd5b Mon Sep 17 00:00:00 2001 From: UCPr <2032385471@qq.com> Date: Wed, 1 Jan 2025 21:50:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=98=9F=E8=A7=81=E9=9B=85?= =?UTF-8?q?=E4=BC=A4=E5=AE=B3=E8=AE=A1=E7=AE=97=E7=AD=89=201=E3=80=81?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=98=9F=E8=A7=81=E9=9B=85=E9=9D=A2=E6=9D=BF?= =?UTF-8?q?=E4=BC=A4=E5=AE=B3=E8=AE=A1=E7=AE=97=202=E3=80=81=E8=A1=A5?= =?UTF-8?q?=E5=85=85=E6=98=9F=E8=A7=81=E9=9B=85=E6=8A=80=E8=83=BD=E5=80=8D?= =?UTF-8?q?=E7=8E=87=E3=80=81=E4=B8=93=E5=B1=9E=E9=9F=B3=E6=93=8E=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E5=8F=82=E6=95=B0=203=E3=80=81=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E6=8A=98=E6=9E=9D=E5=89=91=E6=AD=8C=E5=A5=97=E8=A3=85=E6=95=88?= =?UTF-8?q?=E6=9E=9C=E8=AE=A1=E7=AE=97=204=E3=80=81=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E9=9C=9E=E8=90=BD=E6=98=9F=E6=AE=BF=E9=9F=B3=E6=93=8E=E6=95=88?= =?UTF-8?q?=E6=9E=9C=E8=AE=A1=E7=AE=97=205=E3=80=81=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E4=BC=A4=E5=AE=B3=E8=AE=A1=E7=AE=97=E6=8A=97=E6=80=A7=E5=8C=BA?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E7=BC=BA=E5=A4=B1=206=E3=80=81=E5=AE=8C?= =?UTF-8?q?=E5=96=84=E4=BC=A4=E5=AE=B3=E8=AE=A1=E7=AE=97=E9=98=B2=E5=BE=A1?= =?UTF-8?q?=E5=8C=BA=E9=92=88=E5=AF=B9=E6=8A=80=E8=83=BD=E7=94=9F=E6=95=88?= =?UTF-8?q?=E5=87=8F=E6=8A=97=207=E3=80=81=E4=BF=AE=E6=94=B9=E4=BC=A4?= =?UTF-8?q?=E5=AE=B3=E8=AE=A1=E7=AE=97=E5=A4=B1=E8=A1=A1=E6=98=93=E4=BC=A4?= =?UTF-8?q?=E5=8C=BA=E4=B8=BA1.0=208=E3=80=81=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E9=87=8D=E5=A4=8D=E8=AE=A1=E7=AE=97=209=E3=80=81?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E8=89=BE=E8=8E=B2=E8=BF=9E=E6=90=BA=E6=8A=80?= =?UTF-8?q?=E5=80=8D=E7=8E=87=E5=8F=82=E6=95=B0=E9=94=99=E8=AF=AF=2010?= =?UTF-8?q?=E3=80=81=E8=A1=A5=E5=85=85=E8=A7=92=E8=89=B2=E5=B1=9E=E6=80=A7?= =?UTF-8?q?map?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + model/avatar.js | 29 ++-- model/damage/avatar.js | 215 ++++++++++++++++++++++------ model/damage/relice.js | 10 ++ model/damage/role.js | 73 ++++++++-- model/damage/weapon.js | 8 ++ resources/map/Avatarid2Element.json | 3 + resources/map/SkillData.json | 34 ++++- resources/map/weapon_effect.json | 18 +++ resources/panel/card.html | 5 +- 10 files changed, 325 insertions(+), 71 deletions(-) diff --git a/.gitignore b/.gitignore index 5b4f4af..c6079e4 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ data/**/*.* resources/images/**/*.* resources/data/**/*.* +resources/map/*.js diff --git a/model/avatar.js b/model/avatar.js index 7f421df..98fb3b0 100644 --- a/model/avatar.js +++ b/model/avatar.js @@ -315,22 +315,23 @@ export class ZZZAvatarInfo { * set_detail: Record; * }} */ get damage_basic_properties() { + const basic_properties = this.basic_properties; const base_detail = { - hp: Number(this.basic_properties.hpmax.final), - attack: Number(this.basic_properties.attack.final), - defence: Number(this.basic_properties.def.final), - ImpactRatio: Number(this.basic_properties.breakstun.final), + hp: Number(basic_properties.hpmax.final), + attack: Number(basic_properties.attack.final), + defence: Number(basic_properties.def.final), + ImpactRatio: Number(basic_properties.breakstun.final), CriticalChanceBase: - Number(this.basic_properties.crit.final.replace('%', '')) / 100, + Number(basic_properties.crit.final.replace('%', '')) / 100, CriticalDamageBase: - Number(this.basic_properties.critdam.final.replace('%', '')) / 100, + Number(basic_properties.critdam.final.replace('%', '')) / 100, ElementAbnormalPower: Number( - this.basic_properties.elementabnormalpower.final + basic_properties.elementabnormalpower.final ), - ElementMystery: Number(this.basic_properties.elementmystery.final), + ElementMystery: Number(basic_properties.elementmystery.final), PenRatioBase: - Number(this.basic_properties.penratio.final.replace('%', '')) / 100, - SpGetRatio: Number(this.basic_properties.sprecover.final), + Number(basic_properties.penratio.final.replace('%', '')) / 100, + SpGetRatio: Number(basic_properties.sprecover.final), }; /** 计算伤害加成与穿透值 * 穿透值23203 @@ -378,9 +379,7 @@ export class ZZZAvatarInfo { return []; } /** 处理基础数据 */ - let base_detail = this.damage_basic_properties.base_detail; - let bonus_detail = this.damage_basic_properties.bonus_detail; - let set_detail = this.damage_basic_properties.set_detail; + let { base_detail, bonus_detail, set_detail } = this.damage_basic_properties; /** 处理驱动盘套装加成 */ let set_detailkeys = Object.keys(set_detail); @@ -394,12 +393,12 @@ export class ZZZAvatarInfo { bonus_detail ); } - logger.debug('bonus_detail', bonus_detail); + logger.debug('+套装bonus_detail', bonus_detail); /** 处理音频加成 */ if (this.weapon) bonus_detail = weapon_ability(this.weapon, base_detail, bonus_detail); - logger.debug('bonus_detail', bonus_detail); + logger.debug('+音频bonus_detail', bonus_detail); /** 处理角色加成 */ const damagelist = avatar_ability(this, base_detail, bonus_detail); diff --git a/model/damage/avatar.js b/model/damage/avatar.js index 4975d2e..c1117af 100644 --- a/model/damage/avatar.js +++ b/model/damage/avatar.js @@ -16,6 +16,7 @@ const skilldict = getMapData('SkillData'); export const avatar_ability = (data, base_detail, bonus_detail) => { const damagelist = []; switch (data.id) { + // 艾莲 case 1191: { /** 处理命座加成 */ if (data.rank >= 1) { @@ -194,9 +195,9 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { value: damagelist6, }; damagelist.push(damage6); - logger.debug('伤害', damagelist); break; } + // 朱鸢 case 1241: { /** 处理命座加成 */ if (data.rank >= 2) { @@ -352,6 +353,7 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { damagelist.push(damage5); break; } + // 11号 case 1041: { /** 处理命座加成 */ if (data.rank >= 2) { @@ -380,8 +382,8 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { /** 计算伤害 */ /** 计算普攻伤害 */ - const skill_multiplier1 = getskilllevelnum(data.id,data.skills,'A','A'); - const damagelist1 = calculate_damage(base_detail,bonus_detail,'A','A','Fire',skill_multiplier1,data.level); + const skill_multiplier1 = getskilllevelnum(data.id, data.skills, 'A', 'A'); + const damagelist1 = calculate_damage(base_detail, bonus_detail, 'A', 'A', 'Fire', skill_multiplier1, data.level); const damage1 = { title: '普通攻击:火力镇压', value: damagelist1, @@ -389,8 +391,8 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { damagelist.push(damage1); /** 计算冲刺伤害 */ - const skill_multiplier2 = getskilllevelnum(data.id,data.skills,'C','C'); - const damagelist2 = calculate_damage(base_detail,bonus_detail,'C','C','Fire',skill_multiplier2,data.level); + const skill_multiplier2 = getskilllevelnum(data.id, data.skills, 'C', 'C'); + const damagelist2 = calculate_damage(base_detail, bonus_detail, 'C', 'C', 'Fire', skill_multiplier2, data.level); const damage2 = { title: '闪避反击:逆火', value: damagelist2, @@ -398,8 +400,8 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { damagelist.push(damage2); /** 计算强化特殊技伤害 */ - const skill_multiplier3 = getskilllevelnum(data.id,data.skills,'E','E'); - let damagelist3 = calculate_damage(base_detail,bonus_detail,'E','E','Fire',skill_multiplier3,data.level); + const skill_multiplier3 = getskilllevelnum(data.id, data.skills, 'E', 'E'); + let damagelist3 = calculate_damage(base_detail, bonus_detail, 'E', 'E', 'Fire', skill_multiplier3, data.level); const damage3 = { title: '强化特殊技:盛燃烈火', value: damagelist3, @@ -407,8 +409,8 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { damagelist.push(damage3); /** 计算连携技伤害 */ - const skill_multiplier4 = getskilllevelnum(data.id,data.skills,'L','L'); - const damagelist4 = calculate_damage(base_detail,bonus_detail,'L','L','Fire',skill_multiplier4,data.level); + const skill_multiplier4 = getskilllevelnum(data.id, data.skills, 'L', 'L'); + const damagelist4 = calculate_damage(base_detail, bonus_detail, 'L', 'L', 'Fire', skill_multiplier4, data.level); const damage4 = { title: '连携技:昂扬烈焰', value: damagelist4, @@ -416,8 +418,8 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { damagelist.push(damage4); /** 计算终结技伤害 */ - const skill_multiplier5 = getskilllevelnum(data.id,data.skills,'R','R'); - const damagelist5 = calculate_damage(base_detail,bonus_detail,'R','R','Fire',skill_multiplier5,data.level); + const skill_multiplier5 = getskilllevelnum(data.id, data.skills, 'R', 'R'); + const damagelist5 = calculate_damage(base_detail, bonus_detail, 'R', 'R', 'Fire', skill_multiplier5, data.level); const damage5 = { title: '终结技:轰鸣烈焰', value: damagelist5, @@ -425,6 +427,7 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { damagelist.push(damage5); break; } + // 青衣 case 1251: { /** 处理命座加成 */ if (data.rank >= 1) { @@ -454,7 +457,7 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { if (ImpactRatio >= 220) { let AttackDelta = _.get(bonus_detail, 'AttackDelta', 0); bonus_detail['AttackDelta'] = AttackDelta + 600; - }else{ + } else { let AttackDelta = _.get(bonus_detail, 'AttackDelta', 0); bonus_detail['AttackDelta'] = (AttackDelta - 120) * 6; } @@ -462,8 +465,8 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { /** 计算伤害 */ /** 计算普攻伤害 */ - const skill_multiplier1 = getskilllevelnum(data.id,data.skills,'A','A'); - const damagelist1 = calculate_damage(base_detail,bonus_detail,'A','A','Electric',skill_multiplier1,data.level); + const skill_multiplier1 = getskilllevelnum(data.id, data.skills, 'A', 'A'); + const damagelist1 = calculate_damage(base_detail, bonus_detail, 'A', 'A', 'Electric', skill_multiplier1, data.level); const damage1 = { title: '普通攻击:醉花月云转', value: damagelist1, @@ -471,8 +474,8 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { damagelist.push(damage1); /** 计算冲刺伤害 */ - const skill_multiplier2 = getskilllevelnum(data.id,data.skills,'C','C'); - const damagelist2 = calculate_damage(base_detail,bonus_detail,'C','C','Electric',skill_multiplier2,data.level); + const skill_multiplier2 = getskilllevelnum(data.id, data.skills, 'C', 'C'); + const damagelist2 = calculate_damage(base_detail, bonus_detail, 'C', 'C', 'Electric', skill_multiplier2, data.level); const damage2 = { title: '闪避反击:意不尽', value: damagelist2, @@ -480,8 +483,8 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { damagelist.push(damage2); /** 计算强化特殊技伤害 */ - const skill_multiplier3 = getskilllevelnum(data.id,data.skills,'E','E'); - let damagelist3 = calculate_damage(base_detail,bonus_detail,'E','E','Ether',skill_multiplier3,data.level); + const skill_multiplier3 = getskilllevelnum(data.id, data.skills, 'E', 'E'); + let damagelist3 = calculate_damage(base_detail, bonus_detail, 'E', 'E', 'Ether', skill_multiplier3, data.level); const damage3 = { title: '强化特殊技:月上海棠', value: damagelist3, @@ -489,8 +492,8 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { damagelist.push(damage3); /** 计算连携技伤害 */ - const skill_multiplier4 = getskilllevelnum(data.id,data.skills,'L','L'); - const damagelist4 = calculate_damage(base_detail,bonus_detail,'L','L','Electric',skill_multiplier4,data.level); + const skill_multiplier4 = getskilllevelnum(data.id, data.skills, 'L', 'L'); + const damagelist4 = calculate_damage(base_detail, bonus_detail, 'L', 'L', 'Electric', skill_multiplier4, data.level); const damage4 = { title: '连携技:太平令', value: damagelist4, @@ -498,8 +501,8 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { damagelist.push(damage4); /** 计算终结技伤害 */ - const skill_multiplier5 = getskilllevelnum(data.id,data.skills,'R','R'); - const damagelist5 = calculate_damage(base_detail,bonus_detail,'R','R','Electric',skill_multiplier5,data.level); + const skill_multiplier5 = getskilllevelnum(data.id, data.skills, 'R', 'R'); + const damagelist5 = calculate_damage(base_detail, bonus_detail, 'R', 'R', 'Electric', skill_multiplier5, data.level); const damage5 = { title: '终结技:八声甘州', value: damagelist5, @@ -507,6 +510,7 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { damagelist.push(damage5); break; } + // 猫又 case 1021: { /** 处理命座加成 */ if (data.rank >= 1) { @@ -532,8 +536,8 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { /** 计算伤害 */ /** 计算普攻伤害 */ - const skill_multiplier1 = getskilllevelnum(data.id,data.skills,'A','A'); - const damagelist1 = calculate_damage(base_detail,bonus_detail,'A','A','Physical',skill_multiplier1,data.level); + const skill_multiplier1 = getskilllevelnum(data.id, data.skills, 'A', 'A'); + const damagelist1 = calculate_damage(base_detail, bonus_detail, 'A', 'A', 'Physical', skill_multiplier1, data.level); const damage1 = { title: '普通攻击:猫猫爪刺', value: damagelist1, @@ -541,8 +545,8 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { damagelist.push(damage1); /** 计算冲刺伤害 */ - const skill_multiplier2 = getskilllevelnum(data.id,data.skills,'C','C'); - const damagelist2 = calculate_damage(base_detail,bonus_detail,'C','C','Physical',skill_multiplier2,data.level); + const skill_multiplier2 = getskilllevelnum(data.id, data.skills, 'C', 'C'); + const damagelist2 = calculate_damage(base_detail, bonus_detail, 'C', 'C', 'Physical', skill_multiplier2, data.level); const damage2 = { title: '闪避反击:虚影双刺', value: damagelist2, @@ -550,8 +554,8 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { damagelist.push(damage2); /** 计算强化特殊技伤害 */ - const skill_multiplier3 = getskilllevelnum(data.id,data.skills,'E','E'); - let damagelist3 = calculate_damage(base_detail,bonus_detail,'E','E','Physical',skill_multiplier3,data.level); + const skill_multiplier3 = getskilllevelnum(data.id, data.skills, 'E', 'E'); + let damagelist3 = calculate_damage(base_detail, bonus_detail, 'E', 'E', 'Physical', skill_multiplier3, data.level); const damage3 = { title: '强化特殊技:超~凶奇袭!', value: damagelist3, @@ -559,8 +563,8 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { damagelist.push(damage3); /** 计算连携技伤害 */ - const skill_multiplier4 = getskilllevelnum(data.id,data.skills,'L','L'); - const damagelist4 = calculate_damage(base_detail,bonus_detail,'L','L','Physical',skill_multiplier4,data.level); + const skill_multiplier4 = getskilllevelnum(data.id, data.skills, 'L', 'L'); + const damagelist4 = calculate_damage(base_detail, bonus_detail, 'L', 'L', 'Physical', skill_multiplier4, data.level); const damage4 = { title: '连携技:刃爪挥击', value: damagelist4, @@ -568,8 +572,8 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { damagelist.push(damage4); /** 计算终结技伤害 */ - const skill_multiplier5 = getskilllevelnum(data.id,data.skills,'R','R'); - const damagelist5 = calculate_damage(base_detail,bonus_detail,'R','R','Physical',skill_multiplier5,data.level); + const skill_multiplier5 = getskilllevelnum(data.id, data.skills, 'R', 'R'); + const damagelist5 = calculate_damage(base_detail, bonus_detail, 'R', 'R', 'Physical', skill_multiplier5, data.level); const damage5 = { title: '终结技:刃爪强袭', value: damagelist5, @@ -577,6 +581,7 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { damagelist.push(damage5); break; } + // 安东 case 1111: { /** 处理命座加成 */ if (data.rank >= 4) { @@ -594,12 +599,12 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { /** 获取天赋等级与加成倍率 */ const TF = getskilllevelnum(data.id, data.skills, 'T', 'T'); const TF2 = getskilllevelnum(data.id, data.skills, 'T', 'T2'); - + let A_DmgAdd = _.get(bonus_detail, 'A_DmgAdd', 0); bonus_detail['A_DmgAdd'] = A_DmgAdd + TF2; let C_DmgAdd = _.get(bonus_detail, 'C_DmgAdd', 0); bonus_detail['C_DmgAdd'] = C_DmgAdd + TF2; - + let E_DmgAdd = _.get(bonus_detail, 'E_DmgAdd', 0); bonus_detail['E_DmgAdd'] = E_DmgAdd + TF; let L_DmgAdd = _.get(bonus_detail, 'L_DmgAdd', 0); @@ -609,8 +614,8 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { /** 计算伤害 */ /** 计算普攻伤害 */ - const skill_multiplier1 = getskilllevelnum(data.id,data.skills,'A','A'); - const damagelist1 = calculate_damage(base_detail,bonus_detail,'A','A','Electric',skill_multiplier1,data.level); + const skill_multiplier1 = getskilllevelnum(data.id, data.skills, 'A', 'A'); + const damagelist1 = calculate_damage(base_detail, bonus_detail, 'A', 'A', 'Electric', skill_multiplier1, data.level); const damage1 = { title: '普通攻击:热血上工操', value: damagelist1, @@ -618,8 +623,8 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { damagelist.push(damage1); /** 计算冲刺伤害 */ - const skill_multiplier2 = getskilllevelnum(data.id,data.skills,'C','C'); - const damagelist2 = calculate_damage(base_detail,bonus_detail,'C','C','Electric',skill_multiplier2,data.level); + const skill_multiplier2 = getskilllevelnum(data.id, data.skills, 'C', 'C'); + const damagelist2 = calculate_damage(base_detail, bonus_detail, 'C', 'C', 'Electric', skill_multiplier2, data.level); const damage2 = { title: '闪避反击:过载钻击', value: damagelist2, @@ -627,8 +632,8 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { damagelist.push(damage2); /** 计算强化特殊技伤害 */ - const skill_multiplier3 = getskilllevelnum(data.id,data.skills,'E','E'); - let damagelist3 = calculate_damage(base_detail,bonus_detail,'E','E','Electric',skill_multiplier3,data.level); + const skill_multiplier3 = getskilllevelnum(data.id, data.skills, 'E', 'E'); + let damagelist3 = calculate_damage(base_detail, bonus_detail, 'E', 'E', 'Electric', skill_multiplier3, data.level); const damage3 = { title: '特殊技:爆发钻击', value: damagelist3, @@ -636,8 +641,8 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { damagelist.push(damage3); /** 计算连携技伤害 */ - const skill_multiplier4 = getskilllevelnum(data.id,data.skills,'L','L'); - const damagelist4 = calculate_damage(base_detail,bonus_detail,'L','L','Electric',skill_multiplier4,data.level); + const skill_multiplier4 = getskilllevelnum(data.id, data.skills, 'L', 'L'); + const damagelist4 = calculate_damage(base_detail, bonus_detail, 'L', 'L', 'Electric', skill_multiplier4, data.level); const damage4 = { title: '连携技:转转转!', value: damagelist4, @@ -645,8 +650,8 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { damagelist.push(damage4); /** 计算终结技伤害 */ - const skill_multiplier5 = getskilllevelnum(data.id,data.skills,'R','R'); - const damagelist5 = calculate_damage(base_detail,bonus_detail,'R','R','Electric',skill_multiplier5,data.level); + const skill_multiplier5 = getskilllevelnum(data.id, data.skills, 'R', 'R'); + const damagelist5 = calculate_damage(base_detail, bonus_detail, 'R', 'R', 'Electric', skill_multiplier5, data.level); const damage5 = { title: '终结技:转转转转转!', value: damagelist5, @@ -654,8 +659,128 @@ export const avatar_ability = (data, base_detail, bonus_detail) => { damagelist.push(damage5); break; } + // 星见雅 + case 1091: { + /** 处理命座加成 */ + if (data.rank >= 1) { + const AUP_IgnoreDefence = _.get(bonus_detail, 'AUP_IgnoreDefence', 0) + bonus_detail['AUP_IgnoreDefence'] = AUP_IgnoreDefence + 0.36 + } + if (data.rank >= 2) { + const A_DmgAdd = _.get(bonus_detail, 'A_DmgAdd', 0) + bonus_detail['A_DmgAdd'] = A_DmgAdd + 0.30 + const C_DmgAdd = _.get(bonus_detail, 'C_DmgAdd', 0) + bonus_detail['C_DmgAdd'] = C_DmgAdd + 0.30 + const CriticalChanceBase = _.get(bonus_detail, 'CriticalChanceBase', 0) + bonus_detail['CriticalChanceBase'] = CriticalChanceBase + 0.15 + } + if (data.rank >= 4) { + const TP_DmgAdd = _.get(bonus_detail, 'TP_DmgAdd', 0) + bonus_detail['TP_DmgAdd'] = TP_DmgAdd + 0.3 + } + if (data.rank >= 6) { + const AUP_DmgAdd = _.get(bonus_detail, 'AUP_DmgAdd', 0) + bonus_detail['AUP_DmgAdd'] = AUP_DmgAdd + 0.3 + } + + /** 处理天赋加成 */ + /** 获取天赋等级与加成倍率 */ + const AUP_DmgAdd = _.get(bonus_detail, 'AUP_DmgAdd', 0) + bonus_detail['AUP_DmgAdd'] = AUP_DmgAdd + 0.6 + const AUP_ResistancePenetration = _.get(bonus_detail, 'AUP_ResistancePenetration', 0) + bonus_detail['AUP_ResistancePenetration'] = AUP_ResistancePenetration + 0.3 // 紊乱无视冰抗 + const R_DmgAdd = _.get(bonus_detail, 'R_DmgAdd', 0) // 终结技30%冰伤加成 + bonus_detail['R_DmgAdd'] = R_DmgAdd + 0.3 + + logger.debug('最终bonus_detail', bonus_detail) + /** 计算伤害 */ + /** 计算普攻伤害 */ + const A_multiplier = getskilllevelnum(data.id, data.skills, 'A', 'A') + const A_damage = calculate_damage(base_detail, bonus_detail, 'A', 'A', 'Ice', A_multiplier, data.level) + damagelist.push({ + title: '普通攻击:风花五段', + value: A_damage, + }) + + /** 计算闪避反击伤害 */ + const C_multiplier = getskilllevelnum(data.id, data.skills, 'C', 'C') + const C_damage = calculate_damage(base_detail, bonus_detail, 'C', 'C', 'Ice', C_multiplier, data.level) + damagelist.push({ + title: '闪避反击:寒雀', + value: C_damage, + }) + + /** 计算霜灼·破伤害 */ + const TP_multiplier = getskilllevelnum(data.id, data.skills, 'T', 'TP') + const TP_damage = calculate_damage(base_detail, bonus_detail, 'TP', 'TP', 'Ice', TP_multiplier, data.level) + damagelist.push({ + title: '霜灼·破', + value: TP_damage, + }) + + /** 计算蓄力攻击伤害 */ + const AUP1_multiplier = getskilllevelnum(data.id, data.skills, 'A', 'AUP1') + const AUP1_damage = calculate_damage(base_detail, bonus_detail, 'AUP', 'AUP1', 'Ice', AUP1_multiplier, data.level) + damagelist.push({ + title: '蓄力攻击:一段蓄', + value: AUP1_damage, + }) + const AUP2_multiplier = getskilllevelnum(data.id, data.skills, 'A', 'AUP2') + const AUP2_damage = calculate_damage(base_detail, bonus_detail, 'AUP', 'AUP2', 'Ice', AUP2_multiplier, data.level) + if (data.rank >= 6) { // 6命累加蓄力伤害 + AUP2_damage['cd'] += AUP1_damage['cd'] + AUP2_damage['qw'] += AUP1_damage['qw'] + } + damagelist.push({ + title: '蓄力攻击:二段蓄', + value: AUP2_damage, + }) + const AUP3_multiplier = getskilllevelnum(data.id, data.skills, 'A', 'AUP3') + const AUP3_damage = calculate_damage(base_detail, bonus_detail, 'AUP', 'AUP3', 'Ice', AUP3_multiplier, data.level) + if (data.rank >= 6) { + AUP3_damage['cd'] += AUP2_damage['cd'] + AUP3_damage['qw'] += AUP2_damage['qw'] + } + damagelist.push({ + title: '蓄力攻击:三段蓄', + value: AUP3_damage, + }) + + /** 计算特殊技伤害 */ + const E_multiplier = getskilllevelnum(data.id, data.skills, 'E', 'EF') + const E_damage = calculate_damage(base_detail, bonus_detail, 'EUP', 'EF', 'Ice', E_multiplier, data.level) + damagelist.push({ + title: '强化特殊技:飞雪', + value: E_damage, + }) + + const EZ_multiplier = getskilllevelnum(data.id, data.skills, 'E', 'EF2') + const EZ_damage = calculate_damage(base_detail, bonus_detail, 'EUP', 'EF2', 'Ice', EZ_multiplier, data.level) + damagelist.push({ + title: '强化特殊技:飞雪(二段)', + value: EZ_damage, + }) + + /** 计算连携技伤害 */ + const RL_multiplier = getskilllevelnum(data.id, data.skills, 'R', 'RL') + const RL_damage = calculate_damage(base_detail, bonus_detail, 'RL', 'RL', 'Ice', RL_multiplier, data.level) + damagelist.push({ + title: '连携技:春临', + value: RL_damage, + }) + + /** 计算终结技伤害 */ + const R_multiplier = getskilllevelnum(data.id, data.skills, 'R', 'R') + const R_damage = calculate_damage(base_detail, bonus_detail, 'R', 'R', 'Ice', R_multiplier, data.level) + damagelist.push({ + title: '终结技:名残雪', + value: R_damage, + }) + break + } } - return damagelist; + logger.debug(logger.green(data.name_mi18n + '伤害:'), damagelist) + return damagelist }; export const getskilllevelnum = (avatarId, skills, skilltype, skillname) => { diff --git a/model/damage/relice.js b/model/damage/relice.js index 897fe68..36bfbda 100644 --- a/model/damage/relice.js +++ b/model/damage/relice.js @@ -11,6 +11,16 @@ import { ZZZAvatarInfo } from '../avatar.js'; */ export const relice_ability = (set_id, set_num, base_detail, bonus_detail) => { switch (set_id) { + case '32700': + if (set_num >= 4) { + let CriticalDamageBase = _.get(bonus_detail, 'CriticalDamageBase', 0); + bonus_detail['CriticalDamageBase'] = CriticalDamageBase + 0.3; + let CriticalChanceBase = _.get(bonus_detail, 'CriticalChanceBase', 0); + bonus_detail['CriticalChanceBase'] = CriticalChanceBase + 0.12; + logger.debug('32700,4,CriticalDamageBase'); + logger.debug('32700,4,CriticalChanceBase'); + } + break; case '31100': if (set_num >= 4) { let R_DmgAdd = _.get(bonus_detail, 'R_DmgAdd', 0); diff --git a/model/damage/role.js b/model/damage/role.js index adf4f9d..5caf36d 100644 --- a/model/damage/role.js +++ b/model/damage/role.js @@ -12,12 +12,28 @@ export const calculate_damage = ( const merged_attr = merge_attribute(base_detail, bonus_detail); logger.debug('merged_attr', merged_attr); + logger.debug(logger.green(skill_type + `(${add_skill_type})伤害乘区计算:`)); const attack = merged_attr.attack; logger.debug('攻击区', attack); - const defence_multiplier = get_defence_multiplier(merged_attr, level); + logger.debug('技能倍率', skill_multiplier); + + const defence_multiplier = get_defence_multiplier( + merged_attr, + level, + skill_type, + add_skill_type, + ); logger.debug('防御区', defence_multiplier); + const resistance_area = get_resistance_area( + merged_attr, + skill_type, + add_skill_type, + avatar_element + ); + logger.debug('抗性区', resistance_area); + const injury_area = get_injury_area( merged_attr, skill_type, @@ -57,25 +73,26 @@ export const calculate_damage = ( attack * skill_multiplier * defence_multiplier * + resistance_area * injury_area * damage_ratio * critical_damage_base * - 1.2 * - 1.5; + 1.0; // 失衡易伤不计 const damage_qw = attack * skill_multiplier * defence_multiplier * + resistance_area * injury_area * damage_ratio * qiwang_damage * - 1.2 * - 1.5; + 1.0; const damagelist = { cd: damage_cd, qw: damage_qw, }; + logger.debug('最终伤害', damagelist); return damagelist; }; @@ -152,6 +169,27 @@ export const get_damage_ratio = ( return damage_ratio + 1; }; +export const get_resistance_area = ( + merged_attr, + skill_type, + add_skill_type, + avatar_element +) => { + let resistance_area = 1.2 + for (const attr in merged_attr) { + if (attr.search('_ResistancePenetration') != -1) { + const attr_name = attr.split('_ResistancePenetration')[0] + if ( + [skill_type, add_skill_type, 'All', avatar_element].includes(attr_name) + ) { + logger.debug(attr + '对' + attr_name + '有' + merged_attr[attr] + '减抗') + resistance_area += merged_attr[attr] + } + } + } + return resistance_area +} + export const get_injury_area = ( merged_attr, skill_type, @@ -185,13 +223,32 @@ export const get_injury_area = ( return injury_area; }; -export const get_defence_multiplier = (merged_attr, level) => { +export const get_defence_multiplier = ( + merged_attr, + level, + skill_type, + add_skill_type +) => { /** 计算防御基础值 */ const defadd = 0.155 * (level * level) + 3.12 * level + 46.95; /** 计算降防 */ let ignore_defence = 1.0; + const merged_attrkey = Object.keys(merged_attr); + for (const attr of merged_attrkey) { + if (attr.search('_IgnoreDefence') != -1) { + const attr_name = attr.split('_IgnoreDefence')[0]; + if ( + [skill_type, add_skill_type, 'All'].includes(attr_name) + ) { + logger.debug( + attr + '对' + attr_name + '有' + merged_attr[attr] + '无视防御' + ); + ignore_defence -= merged_attr[attr]; + } + } + } if (merged_attr.ignore_defence) { - ignore_defence = 1 - merged_attr.ignore_defence; + ignore_defence -= merged_attr.ignore_defence; } /** 计算穿透率 */ let penratio = 1.0; @@ -212,7 +269,7 @@ export const merge_attribute = (base_detail, bonus_detail) => { for (const merged of bonus_detailkey) { if ( merged.search('Attack') != -1 || - merged.search('Defence') != -1 || + (merged.search('Defence') != -1 && merged.search('IgnoreDefence') === -1) || merged.search('HP') != -1 ) { continue; diff --git a/model/damage/weapon.js b/model/damage/weapon.js index 805ec73..a4ada72 100644 --- a/model/damage/weapon.js +++ b/model/damage/weapon.js @@ -13,6 +13,14 @@ const weapon_effect = getMapData('weapon_effect'); export const weapon_ability = (equipment, base_detail, bonus_detail) => { let equipid = equipment.id switch (equipid) { + case 14109:{ + let CriticalDamageBase = _.get(bonus_detail, 'CriticalDamageBase', 0); + bonus_detail['CriticalDamageBase'] = CriticalDamageBase + weapon_effect[equipment.id]['Param']['CriticalDamageBase'][equipment.star - 1]; + + let IceDmgAdd = _.get(bonus_detail, 'Ice_DmgAdd', 0); + bonus_detail['Ice_DmgAdd'] = IceDmgAdd + weapon_effect[equipment.id]['Param']['IceDmgAdd'][equipment.star - 1]; + break; + } case 14119:{ let IceDmgAdd = _.get(bonus_detail, 'Ice_DmgAdd', 0); bonus_detail['Ice_DmgAdd'] = IceDmgAdd + weapon_effect[equipment.id]['Param']['IceDmgAdd'][equipment.star - 1]; diff --git a/resources/map/Avatarid2Element.json b/resources/map/Avatarid2Element.json index a871a7f..f4b516a 100644 --- a/resources/map/Avatarid2Element.json +++ b/resources/map/Avatarid2Element.json @@ -4,6 +4,7 @@ "1031": "Ether", "1041": "Fire", "1061": "Physical", + "1071": "Physical", "1081": "Physical", "1091": "Ice", "1101": "Fire", @@ -13,6 +14,7 @@ "1141": "Ice", "1151": "Fire", "1161": "Electric", + "1171": "Fire", "1181": "Electric", "1191": "Ice", "1201": "Ether", @@ -20,6 +22,7 @@ "1221": "Ether", "1241": "Ether", "1251": "Electric", + "1261": "Physical", "1271": "Electric", "1281": "Physical" } diff --git a/resources/map/SkillData.json b/resources/map/SkillData.json index 972160f..765ddf5 100644 --- a/resources/map/SkillData.json +++ b/resources/map/SkillData.json @@ -16,7 +16,7 @@ 18.908,20.627,22.346,24.065,25.784,27.503,29.222,30.941,32.66,34.379,36.098,37.817,39.536,41.255,42.974,44.693 ], "RL": [ - 7.946,8.669,9.392,10.115,10.838,11.561,12.284,13.007,13.73,14.453,15.176,15.898,16.622,17.345,18.068,18.791 + 7.946,8.669,9.392,10.115,10.838,11.561,12.284,13.007,13.73,14.453,15.176,15.899,16.622,17.345,18.068,18.791 ], "T": [ 0.5, 0.583, 0.666, 0.75, 0.833, 0.916, 1 @@ -124,5 +124,37 @@ "T2": [ 0.2, 0.233, 0.266, 0.3, 0.333, 0.366, 0.4 ] + }, + "1091": { + "A": [ + 1.29,1.408,1.526,1.644,1.762,1.88,1.998,2.116,2.234,2.352,2.47,2.588,2.706,2.824,2.942,3.06 + ], + "C": [ + 2.459,2.683,2.907,3.131,3.355,3.579,3.803,4.027,4.251,4.475,4.699,4.923,5.147,5.371,5.595,5.819 + ], + "AUP1": [ + 4.547,4.961,5.375,5.789,6.203,6.617,7.031,7.445,7.859,8.273,8.687,9.101,9.515,9.929,10.343,10.757 + ], + "AUP2": [ + 8.581,9.362,10.143,10.924,11.705,12.486,13.267,14.048,14.829,15.61,16.391,17.172,17.953,18.734,19.515,20.296 + ], + "AUP3": [ + 21.411,23.358,25.305,27.252,29.199,31.146,33.093,35.04,36.987,38.934,40.881,42.828,44.775,46.722,48.669,50.616 + ], + "EF": [ + 3.934,4.293,4.652,5.011,5.37,5.729,6.088,6.447,6.806,7.165,7.524,7.883,8.242,8.601,8.96,9.319 + ], + "EF2": [ + 4.83,5.272,5.712,6.152,6.592,7.032,7.472,7.912,8.352,8.792,9.232,9.672,10.112,10.552,10.992,11.432 + ], + "R": [ + 23.88,26.051,28.222,30.393,32.564,34.735,36.906,39.077,41.248,43.419,45.59,47.761,49.932,52.103,54.274,56.445 + ], + "RL": [ + 6.28,6.853,7.426,7.999,8.572,9.145,9.718,10.291,10.864,11.437,12.01,12.583,13.156,13.729,14.302,14.875 + ], + "TP": [ + 7.5,8.75,10,11.25,12.5,13.75,15 + ] } } diff --git a/resources/map/weapon_effect.json b/resources/map/weapon_effect.json index 8c729be..f0c995f 100644 --- a/resources/map/weapon_effect.json +++ b/resources/map/weapon_effect.json @@ -1,4 +1,22 @@ { + "14109": { + "Param": { + "CriticalDamageBase": [ + 0.5, + 0.57, + 0.65, + 0.72, + 0.8 + ], + "IceDmgAdd": [ + 0.2, + 0.23, + 0.26, + 0.29, + 0.32 + ] + } + }, "14119": { "Param": { "IceDmgAdd": [ diff --git a/resources/panel/card.html b/resources/panel/card.html index 9946048..c169542 100644 --- a/resources/panel/card.html +++ b/resources/panel/card.html @@ -210,7 +210,8 @@ {{/each}} - {{if charData?.damages && charData?.damages?.length}} + {{set damages = charData?.damages}} + {{if damages && damages?.length}}
<% include(sys.specialTitle, {en: 'DAMAGE' , cn: '伤害统计' }) %>
@@ -220,7 +221,7 @@
暴击伤害
期望伤害
- {{each charData.damages damage}} + {{each damages damage}}
{{damage.title}}
{{damage.value.cd.toFixed(0)}}