完全重构伤害计算;支持异常伤害计算;支持所有武器、套装计算;新增悠真计算等

This commit is contained in:
UCPr 2025-01-14 02:18:42 +08:00
parent f7e1066773
commit 3f8e64af66
99 changed files with 4243 additions and 1615 deletions

View file

@ -1,806 +1,149 @@
import _ from 'lodash';
import { getMapData } from '../../utils/file.js';
import { calculate_damage } from './role.js';
import { ZZZAvatarInfo } from '../avatar.js';
const skilldict = getMapData('SkillData');
/**
* 角色加成
* @param {ZZZAvatarInfo} data 角色信息
* @param {ZZZAvatarInfo['damage_basic_properties']['base_detail']} base_detail 基础属性
* @param {ZZZAvatarInfo['damage_basic_properties']['bonus_detail']} bonus_detail 套装加成
* @returns {{
* title: string,
* value: {name: string, value: number}[]
* }[]} 伤害列表
*/
export const avatar_ability = (data, base_detail, bonus_detail) => {
const damagelist = [];
switch (data.id) {
// 艾莲
case 1191: {
/** 处理命座加成 */
if (data.rank >= 1) {
const CriticalChanceBase = _.get(bonus_detail, 'CriticalChanceBase', 0);
bonus_detail['CriticalChanceBase'] = CriticalChanceBase + 0.12;
}
if (data.rank >= 2) {
const ES_CriticalDamageBase = _.get(
bonus_detail,
'ES_CriticalDamageBase',
0
);
bonus_detail['ES_CriticalDamageBase'] = ES_CriticalDamageBase + 0.6;
const EH_CriticalDamageBase = _.get(
bonus_detail,
'EH_CriticalDamageBase',
0
);
bonus_detail['EH_CriticalDamageBase'] = EH_CriticalDamageBase + 0.6;
}
if (data.rank >= 6) {
const PenRatio = _.get(bonus_detail, 'PenRatioBase', 0);
bonus_detail['PenRatioBase'] = PenRatio + 0.2;
const C_DmgAdd = _.get(bonus_detail, 'C_DmgAdd', 0);
bonus_detail['C_DmgAdd'] = C_DmgAdd + 2.5;
}
/** 处理天赋加成 */
/** 获取天赋等级与加成倍率 */
const CDB = getskilllevelnum(data.id, data.skills, 'T', 'T');
const C_CriticalDamageBase = _.get(
bonus_detail,
'C_CriticalDamageBase',
0
);
bonus_detail['C_CriticalDamageBase'] = C_CriticalDamageBase + CDB;
const A_CriticalDamageBase = _.get(
bonus_detail,
'A_CriticalDamageBase',
0
);
bonus_detail['A_CriticalDamageBase'] = A_CriticalDamageBase + CDB;
const IceDmgAdd = _.get(bonus_detail, 'Ice_DmgAdd', 0);
bonus_detail['Ice_DmgAdd'] = IceDmgAdd + 0.3;
/** 计算伤害 */
/** 计算普攻伤害 */
const skill_multiplier1 = getskilllevelnum(
data.id,
data.skills,
'A',
'A'
);
const damagelist1 = calculate_damage(
base_detail,
bonus_detail,
'A',
'A',
'Ice',
skill_multiplier1,
data.level
);
const damage1 = {
title: '普通攻击:急冻修剪法',
value: damagelist1,
};
damagelist.push(damage1);
/** 计算冲刺伤害 */
const skill_multiplier2 = getskilllevelnum(
data.id,
data.skills,
'C',
'C'
);
const damagelist2 = calculate_damage(
base_detail,
bonus_detail,
'C',
'C',
'Ice',
skill_multiplier2,
data.level
);
const damage2 = {
title: '冲刺攻击:冰渊潜袭',
value: damagelist2,
};
damagelist.push(damage2);
/** 计算特殊技伤害 */
const skill_multiplier3 = getskilllevelnum(
data.id,
data.skills,
'E',
'EH'
);
const damagelist3 = calculate_damage(
base_detail,
bonus_detail,
'EUP',
'EH',
'Ice',
skill_multiplier3,
data.level
);
const damage3 = {
title: '强化特殊技:横扫',
value: damagelist3,
};
damagelist.push(damage3);
const skill_multiplier4 = getskilllevelnum(
data.id,
data.skills,
'E',
'ES'
);
const damagelist4 = calculate_damage(
base_detail,
bonus_detail,
'EUP',
'ES',
'Ice',
skill_multiplier4,
data.level
);
const damage4 = {
title: '强化特殊技:鲨卷风',
value: damagelist4,
};
damagelist.push(damage4);
/** 计算连携技伤害 */
const skill_multiplier5 = getskilllevelnum(
data.id,
data.skills,
'R',
'RL'
);
const damagelist5 = calculate_damage(
base_detail,
bonus_detail,
'RL',
'RL',
'Ice',
skill_multiplier5,
data.level
);
const damage5 = {
title: '连携技:雪崩',
value: damagelist5,
};
damagelist.push(damage5);
/** 计算终结技伤害 */
const skill_multiplier6 = getskilllevelnum(
data.id,
data.skills,
'R',
'R'
);
const damagelist6 = calculate_damage(
base_detail,
bonus_detail,
'R',
'R',
'Ice',
skill_multiplier6,
data.level
);
const damage6 = {
title: '终结技:永冬狂宴',
value: damagelist6,
};
damagelist.push(damage6);
break;
}
// 朱鸢
case 1241: {
/** 处理命座加成 */
if (data.rank >= 2) {
let A_DmgAdd = _.get(bonus_detail, 'A_DmgAdd', 0);
bonus_detail['A_DmgAdd'] = A_DmgAdd + 0.5;
let C_DmgAdd = _.get(bonus_detail, 'C_DmgAdd', 0);
bonus_detail['C_DmgAdd'] = C_DmgAdd + 0.5;
}
if (data.rank >= 4) {
let A_ResistancePenetration = _.get(
bonus_detail,
'A_ResistancePenetration',
0
);
bonus_detail['A_ResistancePenetration'] = A_ResistancePenetration + 0.25;
let C_ResistancePenetration = _.get(
bonus_detail,
'C_ResistancePenetration',
0
);
bonus_detail['C_ResistancePenetration'] = C_ResistancePenetration + 0.25;
}
/** 处理天赋加成 */
/** 获取天赋等级与加成倍率 */
const DMG_ADD = getskilllevelnum(data.id, data.skills, 'T', 'T');
let A_DmgAdd = _.get(bonus_detail, 'A_DmgAdd', 0);
bonus_detail['A_DmgAdd'] = A_DmgAdd + DMG_ADD;
let C_DmgAdd = _.get(bonus_detail, 'C_DmgAdd', 0);
bonus_detail['C_DmgAdd'] = C_DmgAdd + DMG_ADD;
let CriticalChanceBase = _.get(bonus_detail, 'CriticalChanceBase', 0);
bonus_detail['CriticalChanceBase'] = CriticalChanceBase + 0.3;
/** 计算伤害 */
/** 计算普攻伤害 */
const skill_multiplier1 = getskilllevelnum(
data.id,
data.skills,
'A',
'A'
);
const damagelist1 = calculate_damage(
base_detail,
bonus_detail,
'A',
'A',
'Ether',
skill_multiplier1,
data.level
);
const damage1 = {
title: '普通攻击:请勿抵抗',
value: damagelist1,
};
damagelist.push(damage1);
/** 计算冲刺伤害 */
const skill_multiplier2 = getskilllevelnum(
data.id,
data.skills,
'C',
'C'
);
const damagelist2 = calculate_damage(
base_detail,
bonus_detail,
'C',
'C',
'Ether',
skill_multiplier2,
data.level
);
const damage2 = {
title: '冲刺攻击:火力压制',
value: damagelist2,
};
damagelist.push(damage2);
/** 计算强化特殊技伤害 */
const skill_multiplier3 = getskilllevelnum(
data.id,
data.skills,
'E',
'EUP'
);
let damagelist3 = calculate_damage(
base_detail,
bonus_detail,
'EUP',
'EUP',
'Ether',
skill_multiplier3,
data.level
);
if (data.rank >= 6) {
let damagelist_add = calculate_damage(
base_detail,
bonus_detail,
'EUP',
'EUP',
'Ether',
2.2,
data.level
);
damagelist3['cd'] = damagelist3['cd'] + damagelist_add['cd'] * 4;
damagelist3['qw'] = damagelist3['qw'] + damagelist_add['qw'] * 4;
}
const damage3 = {
title: '强化特殊技:全弹连射',
value: damagelist3,
};
damagelist.push(damage3);
/** 计算连携技伤害 */
const skill_multiplier4 = getskilllevelnum(
data.id,
data.skills,
'R',
'RL'
);
const damagelist4 = calculate_damage(
base_detail,
bonus_detail,
'RL',
'RL',
'Ether',
skill_multiplier4,
data.level
);
const damage4 = {
title: '连携技:歼灭模式',
value: damagelist4,
};
damagelist.push(damage4);
/** 计算终结技伤害 */
const skill_multiplier5 = getskilllevelnum(
data.id,
data.skills,
'R',
'R'
);
const damagelist5 = calculate_damage(
base_detail,
bonus_detail,
'R',
'R',
'Ether',
skill_multiplier5,
data.level
);
const damage5 = {
title: '终结技歼灭模式MAX',
value: damagelist5,
};
damagelist.push(damage5);
break;
}
// 11号
case 1041: {
/** 处理命座加成 */
if (data.rank >= 2) {
let A_DmgAdd = _.get(bonus_detail, 'A_DmgAdd', 0);
bonus_detail['A_DmgAdd'] = A_DmgAdd + 0.36;
let C_DmgAdd = _.get(bonus_detail, 'C_DmgAdd', 0);
bonus_detail['C_DmgAdd'] = C_DmgAdd + 0.36;
}
if (data.rank >= 6) {
let A_ResistancePenetration = _.get(bonus_detail, 'A_ResistancePenetration', 0);
bonus_detail['A_ResistancePenetration'] = A_ResistancePenetration + 0.25;
let C_ResistancePenetration = _.get(bonus_detail, 'C_ResistancePenetration', 0);
bonus_detail['C_ResistancePenetration'] = C_ResistancePenetration + 0.25;
}
/** 处理天赋加成 */
/** 获取天赋等级与加成倍率 */
const DMG_ADD = getskilllevelnum(data.id, data.skills, 'T', 'T');
let A_DmgAdd = _.get(bonus_detail, 'A_DmgAdd', 0);
bonus_detail['A_DmgAdd'] = A_DmgAdd + DMG_ADD;
let Fire_DmgAdd = _.get(bonus_detail, 'Fire_DmgAdd', 0);
bonus_detail['Fire_DmgAdd'] = Fire_DmgAdd + 0.1;
/** 计算伤害 */
/** 计算普攻伤害 */
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,
};
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 damage2 = {
title: '闪避反击:逆火',
value: damagelist2,
};
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 damage3 = {
title: '强化特殊技:盛燃烈火',
value: damagelist3,
};
damagelist.push(damage3);
/** 计算连携技伤害 */
const skill_multiplier4 = getskilllevelnum(data.id, data.skills, 'R', 'RL');
const damagelist4 = calculate_damage(base_detail, bonus_detail, 'RL', 'RL', 'Fire', skill_multiplier4, data.level);
const damage4 = {
title: '连携技:昂扬烈焰',
value: damagelist4,
};
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 damage5 = {
title: '终结技:轰鸣烈焰',
value: damagelist5,
};
damagelist.push(damage5);
break;
}
// 青衣
case 1251: {
/** 处理命座加成 */
if (data.rank >= 1) {
let ignore_defence = _.get(bonus_detail, 'ignore_defence', 0);
bonus_detail['ignore_defence'] = ignore_defence + 0.15;
let CriticalChanceBase = _.get(bonus_detail, 'CriticalChanceBase', 0);
bonus_detail['CriticalChanceBase'] = CriticalChanceBase + 0.2;
}
if (data.rank >= 2) {
let T_stundmgmultiplier = _.get(bonus_detail, 'T_stundmgmultiplier', 0);
bonus_detail['T_stundmgmultiplier'] = T_stundmgmultiplier * 1.35;
}
if (data.rank >= 6) {
let All_ResistancePenetration = _.get(bonus_detail, 'All_ResistancePenetration', 0);
bonus_detail['All_ResistancePenetration'] = All_ResistancePenetration + 0.20;
let A_CriticalDamageBase = _.get(bonus_detail, 'A_CriticalDamageBase', 0);
bonus_detail['A_CriticalDamageBase'] = A_CriticalDamageBase + 1;
}
/** 处理天赋加成 */
/** 获取天赋等级与加成倍率 */
const TF = getskilllevelnum(data.id, data.skills, 'T', 'T');
let stundmgmultiplier = _.get(bonus_detail, 'stundmgmultiplier', 0);
bonus_detail['stundmgmultiplier'] = stundmgmultiplier + TF * 20;
let ImpactRatio = _.get(bonus_detail, 'ImpactRatio', 0);
if (ImpactRatio > 120) {
if (ImpactRatio >= 220) {
let AttackDelta = _.get(bonus_detail, 'AttackDelta', 0);
bonus_detail['AttackDelta'] = AttackDelta + 600;
} else {
let AttackDelta = _.get(bonus_detail, 'AttackDelta', 0);
bonus_detail['AttackDelta'] = (AttackDelta - 120) * 6;
}
}
/** 计算伤害 */
/** 计算普攻伤害 */
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,
};
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 damage2 = {
title: '闪避反击:意不尽',
value: damagelist2,
};
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 damage3 = {
title: '强化特殊技:月上海棠',
value: damagelist3,
};
damagelist.push(damage3);
/** 计算连携技伤害 */
const skill_multiplier4 = getskilllevelnum(data.id, data.skills, 'R', 'RL');
const damagelist4 = calculate_damage(base_detail, bonus_detail, 'RL', 'RL', 'Electric', skill_multiplier4, data.level);
const damage4 = {
title: '连携技:太平令',
value: damagelist4,
};
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 damage5 = {
title: '终结技:八声甘州',
value: damagelist5,
};
damagelist.push(damage5);
break;
}
// 猫又
case 1021: {
/** 处理命座加成 */
if (data.rank >= 1) {
let Physical_ResistancePenetration = _.get(bonus_detail, 'Physical_ResistancePenetration', 0);
bonus_detail['Physical_ResistancePenetration'] = Physical_ResistancePenetration + 0.16;
}
if (data.rank >= 4) {
let CriticalChanceBase = _.get(bonus_detail, 'CriticalChanceBase', 0);
bonus_detail['CriticalChanceBase'] = CriticalChanceBase * 0.14;
}
if (data.rank >= 6) {
let CriticalDamageBase = _.get(bonus_detail, 'CriticalDamageBase', 0);
bonus_detail['CriticalDamageBase'] = CriticalDamageBase + 0.54;
}
/** 处理天赋加成 */
/** 获取天赋等级与加成倍率 */
const TF = getskilllevelnum(data.id, data.skills, 'T', 'T');
let All_DmgAdd = _.get(bonus_detail, 'All_DmgAdd', 0);
bonus_detail['All_DmgAdd'] = All_DmgAdd + TF;
let E_DmgAdd = _.get(bonus_detail, 'E_DmgAdd', 0);
bonus_detail['E_DmgAdd'] = E_DmgAdd + 0.7;
/** 计算伤害 */
/** 计算普攻伤害 */
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,
};
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 damage2 = {
title: '闪避反击:虚影双刺',
value: damagelist2,
};
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 damage3 = {
title: '强化特殊技:超~凶奇袭!',
value: damagelist3,
};
damagelist.push(damage3);
/** 计算连携技伤害 */
const skill_multiplier4 = getskilllevelnum(data.id, data.skills, 'R', 'RL');
const damagelist4 = calculate_damage(base_detail, bonus_detail, 'RL', 'RL', 'Physical', skill_multiplier4, data.level);
const damage4 = {
title: '连携技:刃爪挥击',
value: damagelist4,
};
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 damage5 = {
title: '终结技:刃爪强袭',
value: damagelist5,
};
damagelist.push(damage5);
break;
}
// 安东
case 1111: {
/** 处理命座加成 */
if (data.rank >= 4) {
let CriticalChanceBase = _.get(bonus_detail, 'CriticalChanceBase', 0);
bonus_detail['CriticalChanceBase'] = CriticalChanceBase + 0.1;
}
if (data.rank >= 6) {
let A_DmgAdd = _.get(bonus_detail, 'A_DmgAdd', 0);
bonus_detail['A_DmgAdd'] = A_DmgAdd + 0.24;
let C_DmgAdd = _.get(bonus_detail, 'C_DmgAdd', 0);
bonus_detail['C_DmgAdd'] = C_DmgAdd + 0.24;
}
/** 处理天赋加成 */
/** 获取天赋等级与加成倍率 */
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 RL_DmgAdd = _.get(bonus_detail, 'RL_DmgAdd', 0);
bonus_detail['RL_DmgAdd'] = RL_DmgAdd + TF;
let R_DmgAdd = _.get(bonus_detail, 'R_DmgAdd', 0);
bonus_detail['R_DmgAdd'] = R_DmgAdd + TF;
/** 计算伤害 */
/** 计算普攻伤害 */
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,
};
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 damage2 = {
title: '闪避反击:过载钻击',
value: damagelist2,
};
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 damage3 = {
title: '特殊技:爆发钻击',
value: damagelist3,
};
damagelist.push(damage3);
/** 计算连携技伤害 */
const skill_multiplier4 = getskilllevelnum(data.id, data.skills, 'R', 'RL');
const damagelist4 = calculate_damage(base_detail, bonus_detail, 'RL', 'RL', 'Electric', skill_multiplier4, data.level);
const damage4 = {
title: '连携技:转转转!',
value: damagelist4,
};
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 damage5 = {
title: '终结技:转转转转转!',
value: damagelist5,
};
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
}
}
logger.debug(logger.green(data.name_mi18n + '伤害:'), damagelist)
return damagelist
};
export const getskilllevelnum = (avatarId, skills, skilltype, skillname) => {
let skill_typeid = 0;
if (skilltype == 'A') skill_typeid = 0;
else if (skilltype == 'C') skill_typeid = 2;
else if (skilltype == 'E') skill_typeid = 1;
else if (skilltype == 'R') skill_typeid = 3;
else if (skilltype == 'L') skill_typeid = 6;
else if (skilltype == 'T') skill_typeid = 5;
let skilllevel =
Number(
skills.find(property => property.skill_type === skill_typeid)?.level || 1
) - 1;
return skilldict[avatarId][skillname][skilllevel];
};
export const has_calculation = avatarId => {
return Object.keys(skilldict).includes(avatarId.toString());
import { aliasToID } from '../../lib/convert/char.js';
import config from '../../../../lib/config/config.js';
import { BuffManager } from './BuffManager.js';
import { pluginPath } from '../../lib/path.js';
import { elementEnum } from './BuffManager.js';
import { Calculator } from './Calculator.js';
import chokidar from 'chokidar';
import path from 'path';
import fs from 'fs';
const damagePath = path.join(pluginPath, 'model', 'damage');
export const charData = {};
const calcFnc = {
character: {},
weapon: {},
set: {}
};
async function init() {
const isWatch = config.bot.log_level === 'debug'; // debug模式下监听文件变化
await Promise.all(fs.readdirSync(path.join(damagePath, 'character')).filter(v => v !== '模板').map(v => importChar(v, isWatch)));
for (const type of ['weapon', 'set']) {
await Promise.all(fs.readdirSync(path.join(damagePath, type)).filter(v => v !== '模板.js' && !v.endsWith('_user.js') && v.endsWith('.js'))
.map(v => importFile(type, v.replace('.js', ''), isWatch)));
}
}
function watchFile(path, fnc) {
if (!fs.existsSync(path))
return;
const watcher = chokidar.watch(path, {
awaitWriteFinish: {
stabilityThreshold: 50
}
});
watcher.on('change', (path) => {
logger.debug('重载' + path);
fnc();
});
}
async function importChar(charName, isWatch = false) {
const id = aliasToID(charName);
if (!id)
return logger.warn(`未找到角色${charName}的ID`);
const dir = path.join(damagePath, 'character', charName);
const calcFile = fs.existsSync(path.join(dir, 'calc_user.js')) ? 'calc_user.js' : 'calc.js';
const dataPath = path.join(dir, (fs.existsSync(path.join(dir, 'data_user.json')) ? 'data_user.json' : 'data.json'));
try {
if (isWatch) {
watchFile(path.join(dir, calcFile), () => importChar(charName));
watchFile(dataPath, () => charData[id] = JSON.parse(fs.readFileSync(dataPath, 'utf8')));
}
charData[id] = JSON.parse(fs.readFileSync(dataPath, 'utf8'));
const m = await import(`./character/${charName}/${calcFile}?${Date.now()}`);
if (!m.calc && (!m.buffs || !m.skills))
throw new Error('伤害计算文件格式错误');
calcFnc.character[id] = m;
}
catch (e) {
logger.error(`导入角色${charName}伤害计算错误:`, e);
}
}
async function importFile(type, name, isWatch = false) {
const defaultFilePath = path.join(damagePath, type, `${name}.js`);
const userFilePath = path.join(damagePath, type, `${name}_user.js`);
const isUser = fs.existsSync(userFilePath);
const filePath = isUser ? userFilePath : defaultFilePath;
try {
if (isWatch) {
watchFile(filePath, () => importFile(type, name));
}
const m = await import(`./${type}/${name}${isUser ? '_user' : ''}.js?${Date.now()}`);
if (!m.calc && !m.buffs)
throw new Error(type + ' Buff计算文件格式错误');
calcFnc[type][name] = m;
}
catch (e) {
logger.error(`导入${type}/${name}.js错误`, e);
}
}
await init();
/** 角色计算 */
export function avatar_ability(avatar) {
const m = calcFnc.character[avatar.id];
if (!m)
return [];
const buffM = new BuffManager(avatar);
const calc = new Calculator(buffM);
logger.debug('initial_properties', avatar.initial_properties);
weapon_buff(avatar.weapon, buffM);
set_buff(avatar.equip, buffM);
if (m.buffs)
buffM.new(m.buffs);
if (m.skills)
calc.new(m.skills);
if (m.calc)
m.calc(buffM, calc, avatar);
logger.debug(`Buff*${buffM.buffs.length}`, buffM.buffs);
return calc.calc();
}
/** 武器加成 */
export function weapon_buff(equipment, buffM) {
const name = equipment.name;
logger.debug('武器:' + name);
const m = calcFnc.weapon[name];
if (!m)
return;
buffM.default({ name, source: 'Weapon' });
if (m.buffs)
buffM.new(m.buffs);
if (m.calc)
m.calc(buffM, equipment.star);
buffM.default({});
}
/** 套装加成 */
export function set_buff(equip, buffM) {
buffM.default({ name: '', source: 'Set' });
const setCount = {};
for (const equip_detail of equip) {
if (equip_detail.equipment_type == 5) {
// 属伤加成
const index = [31503, 31603, 31703, 31803, 31903].indexOf(equip_detail.main_properties[0].property_id);
if (index > -1 && elementEnum[index]) {
// @ts-ignore
buffM.new({
name: '驱动盘5号位',
type: '增伤',
value: Number(equip_detail.main_properties[0].base.replace('%', '')) / 100,
isForever: true,
element: elementEnum[index]
});
}
}
const suit_name = String(equip_detail.equip_suit.name);
setCount[suit_name] = (setCount[suit_name] || 0) + 1;
}
buffM.setCount = setCount;
for (const [name, count] of Object.entries(setCount)) {
if (count < 2)
continue;
logger.debug(`套装:${name}*${count}`);
const m = calcFnc.set[name];
if (!m)
continue;
buffM.default('name', name);
if (m.buffs)
buffM.new(m.buffs);
if (m.calc)
m.calc(buffM, count);
}
buffM.default({});
}