diff --git a/model/damage/BuffManager.js b/model/damage/BuffManager.js index df7f27f..d063545 100644 --- a/model/damage/BuffManager.js +++ b/model/damage/BuffManager.js @@ -114,15 +114,26 @@ export class BuffManager { if (buff.status === false) return false; for (const key in param) { + if (key === 'redirect') + continue; if (key === 'range') { const buffRange = buff.range; - if (!buffRange || !param.range) + const skillRange = param.range?.filter(r => typeof r === 'string'); + if (!buffRange || !skillRange) continue; // 对任意类型生效 - param.range = param.range.filter(r => typeof r === 'string'); - if (!param.range.length) + if (!skillRange.length) continue; - // buff作用范围向后覆盖,满足伤害类型range中任意一个即可 - else if (!param.range.some(ST => buffRange.some(BT => ST.startsWith(BT)))) + // buff作用范围向后覆盖 + // 存在重定向时,range须全匹配,redirect向后覆盖 + else if (param.redirect) { + if (skillRange.some(ST => buffRange.some(BT => BT === ST))) + continue; + if (buffRange.some(BT => param.redirect.startsWith(BT))) + continue; + return false; + } + // 不存在重定向时,range向后覆盖 + else if (!skillRange.some(ST => buffRange.some(BT => ST.startsWith(BT)))) return false; else continue; diff --git a/model/damage/BuffManager.ts b/model/damage/BuffManager.ts index 55c795c..0f37716 100644 --- a/model/damage/BuffManager.ts +++ b/model/damage/BuffManager.ts @@ -1,5 +1,5 @@ import type { ZZZAvatarInfo } from '../avatar.js' -import type { Calculator } from './Calculator.ts' +import type { Calculator, skill } from './Calculator.ts' import { weaponIDToProfession } from '../../lib/convert/weapon.js' import _ from 'lodash' @@ -63,7 +63,7 @@ export interface buff { * - 一般情况下此值即为提高值 * - 当buff增益类型为**攻击力/冲击力/异常精通/异常掌控/防御力/生命值**时,若此值 **<1**,则将此值理解为**初始属性**的**百分比提高** * @array - * 根据buff.source自动选择对应等级/星级的值,支持: + * 根据buff.source自动选择对应等级/星级的值(同上支持百分比提高),支持的source: * - Weapon:武器星级(进阶) * - Talent/Addition:天赋(核心技)等级 * @function @@ -152,13 +152,13 @@ export class BuffManager { } _filter(buffs: buff[], type: T, value: buff[T]): buff[] - _filter(buffs: buff[], obj: { [key in Exclude]?: buff[key] } & { element: element }, calc?: Calculator): buff[] + _filter(buffs: buff[], obj: { [key in Exclude]?: buff[key] } & { element: element, redirect?: skill['type'] }, calc?: Calculator): buff[] _filter(buffs: buff[], fnc: (buff: buff, index: number) => boolean): buff[] _filter( buffs: buff[], param: | T - | ({ [key in Exclude]?: buff[key] } & { element: element }) + | ({ [key in Exclude]?: buff[key] } & { element: element, redirect?: skill['type'] }) | ((buff: buff, index: number) => boolean), valueOcalc?: buff[T] | Calculator ) { @@ -170,13 +170,21 @@ export class BuffManager { buffs = buffs.filter(buff => { if (buff.status === false) return false for (const key in param) { + if (key === 'redirect') continue if (key === 'range') { const buffRange = buff.range - if (!buffRange || !param.range) continue // 对任意类型生效 - param.range = param.range.filter(r => typeof r === 'string') - if (!param.range.length) continue - // buff作用范围向后覆盖,满足伤害类型range中任意一个即可 - else if (!param.range.some(ST => buffRange.some(BT => ST.startsWith(BT)))) return false + const skillRange = param.range?.filter(r => typeof r === 'string') + if (!buffRange || !skillRange) continue // 对任意类型生效 + if (!skillRange.length) continue + // buff作用范围向后覆盖 + // 存在重定向时,range须全匹配,redirect向后覆盖 + else if (param.redirect) { + if (skillRange.some(ST => buffRange.some(BT => BT === ST))) continue + if (buffRange.some(BT => param.redirect!.startsWith(BT))) continue + return false + } + // 不存在重定向时,range向后覆盖 + else if (!skillRange.some(ST => buffRange.some(BT => ST.startsWith(BT)))) return false else continue } else if (key === 'element') { if (!buff.element || !param.element) continue // 对任意属性生效 @@ -232,8 +240,10 @@ export class BuffManager { /** * 根据多个指定属性筛选 **启用状态** 的buff * - 对伤害类型range数组的筛选,只要其中有一个符合即认为满足 + * - 存在重定向时,range须全匹配,redirect向后覆盖 + * - 不存在重定向时,range向后覆盖 */ - filter(obj: { [key in Exclude]?: buff[key] } & { element: element }, calc?: Calculator): buff[] + filter(obj: { [key in Exclude]?: buff[key] } & { element: element, redirect?: skill['type'] }, calc?: Calculator): buff[] /** * 根据指定函数筛选buff */ @@ -241,7 +251,7 @@ export class BuffManager { filter( param: | T - | ({ [key in Exclude]?: buff[key] } & { element: element }) + | ({ [key in Exclude]?: buff[key] } & { element: element, redirect?: skill['type'] }) | ((buff: buff, index: number) => boolean), valueOcalc?: buff[T] | Calculator ) { diff --git a/model/damage/Calculator.js b/model/damage/Calculator.js index 20b9fd3..f4670af 100644 --- a/model/damage/Calculator.js +++ b/model/damage/Calculator.js @@ -68,7 +68,8 @@ export class Calculator { /** 缩小筛选范围 */ const usefulBuffs = this.buffM.filter({ element: skill.element, - range: skill.redirect ? [skill.type, skill.redirect] : [skill.type] + range: [skill.type], + redirect: skill.redirect }, this); const areas = {}; if (skill.before) @@ -165,7 +166,7 @@ export class Calculator { logger.error('伤害计算错误:', e); return; } - }).filter(v => v && !v.skill?.isHide); + }).filter(v => v && v.result?.expectDMG && !v.skill?.isHide); } default(param, value) { if (typeof param === 'object') { @@ -264,7 +265,8 @@ export class Calculator { get(type, initial, skill, usefulBuffs = this.buffM.buffs, isRatio = false) { return this.props[type] ??= this.buffM._filter(usefulBuffs, { element: skill?.element, - range: skill?.redirect ? [skill.type, skill.redirect] : [skill?.type], + range: [skill?.type], + redirect: skill?.redirect, type }, this).reduce((previousValue, buff) => { const { value } = buff; diff --git a/model/damage/Calculator.ts b/model/damage/Calculator.ts index b77a97c..d1ef691 100644 --- a/model/damage/Calculator.ts +++ b/model/damage/Calculator.ts @@ -22,8 +22,9 @@ export interface skill { /** * 重定向技能伤害类型 * - * 当出现“X"造成的伤害被视为“Y”伤害时,可使用该参数指定Y的类型 - * 参考技能类型命名标准 + * 当出现“X"(造成的伤害)被视为“Y”(伤害)时,可使用该参数指定Y的类型。 + * - 存在重定向时,range须全匹配,redirect向后覆盖 + * - 不存在重定向时,range向后覆盖 */ redirect?: string /** 角色面板伤害统计中是否隐藏显示 */ @@ -202,7 +203,8 @@ export class Calculator { /** 缩小筛选范围 */ const usefulBuffs = this.buffM.filter({ element: skill.element, - range: skill.redirect ? [skill.type, skill.redirect] : [skill.type] + range: [skill.type], + redirect: skill.redirect }, this) const areas = {} as damage['areas'] if (skill.before) skill.before({ avatar: this.avatar, calc: this, usefulBuffs, skill, props, areas }) @@ -294,7 +296,7 @@ export class Calculator { logger.error('伤害计算错误:', e) return } - }).filter(v => v && !v.skill?.isHide) + }).filter(v => v && v.result?.expectDMG && !v.skill?.isHide) } /** @@ -401,7 +403,8 @@ export class Calculator { get(type: buff['type'], initial: number, skill: skill, usefulBuffs: buff[] = this.buffM.buffs, isRatio = false): number { return this.props![type] ??= this.buffM._filter(usefulBuffs, { element: skill?.element, - range: skill?.redirect ? [skill.type, skill.redirect] : [skill?.type], + range: [skill?.type], + redirect: skill?.redirect, type }, this).reduce((previousValue, buff) => { const { value } = buff diff --git a/model/damage/README.md b/model/damage/README.md index 3895682..1aa4723 100644 --- a/model/damage/README.md +++ b/model/damage/README.md @@ -39,7 +39,7 @@ * - 一般情况下此值即为提高值 * - 当buff增益类型为攻击力/冲击力/异常精通/异常掌控/防御力/生命值时,若此值<1,则将此值理解为初始属性的百分比提高 * @array - * 根据buff.source自动选择对应等级/星级的值,支持: + * 根据buff.source自动选择对应等级/星级的值(同上支持百分比提高),支持的source: * - Weapon:武器星级(进阶) * - Talent/Addition:天赋(核心技)等级 * @function @@ -265,7 +265,11 @@ buff作用范围将以技能类型命名为依据向后覆盖。以上述[艾莲 [点此查看](./character/艾莲/calc.js#L24)艾莲实际伤害计算文件 -注意事项:属性异常中**强击**和**碎冰**没有持续时间的概念,总倍率不受持续时间的影响也无法结算紊乱。因此对于作用于**异常持续时间**的buff,其buff.range应填写异常对应的**状态异常**(**畏缩**和**霜寒**),灼烧等既是伤害异常也是状态异常则无需区分。 +注意事项: + +- 属性异常中**强击**和**碎冰**没有持续时间的概念,总倍率不受持续时间的影响也无法结算紊乱。因此对于作用于**异常持续时间**的buff,其buff.range应填写异常对应的**状态异常**(**畏缩**和**霜寒**),灼烧等既是伤害异常也是状态异常则无需区分。 + +- 对于`“X"(造成的伤害)被视为“Y”(伤害)`此类特殊技能,需要指定技能**重定向参数**,同时上述buff覆盖规则会发生变化,具体请参考[源码内描述](./Calculator.ts#L22),此处不作过多说明 ### 技能倍率 diff --git a/resources/map/SkillData.json b/resources/map/SkillData.json deleted file mode 100644 index 6dee097..0000000 --- a/resources/map/SkillData.json +++ /dev/null @@ -1,160 +0,0 @@ -{ - "1191": { - "A": [ - 4.962,5.414,5.866,6.318,6.77,7.22,7.674,8.126,8.578,9.03,9.482,9.934,10.386,10.838,11.29,11.742 - ], - "C": [ - 1.582,1.726,1.87,2.014,2.158,2.302,2.446,2.59,2.734,2.878,3.022,3.166,3.31,3.454,3.598,3.742 - ], - "ES": [ - 5.533,6.036,6.539,7.042,7.545,8.048,8.551,9.054,9.557,10.06,10.56,11.066,11.569,12.072,12.575,13.078 - ], - "EH": [ - 3.772,4.115,4.458,4.801,5.144,5.487,5.83,6.173,6.516,6.859,7.202,7.545,7.888,8.231,8.574,8.917 - ], - "R": [ - 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.899,16.622,17.345,18.068,18.791 - ], - "T": [ - 0.5, 0.583, 0.666, 0.75, 0.833, 0.916, 1 - ] - }, - "1241": { - "A": [ - 4.077,4.448,4.819,5.19,5.561,5.932,6.303,6.674,7.045,7.416,7.787,8.158,8.529,8.9,9.271,9.642 - ], - "C": [ - 1.359,1.483,1.607,1.731,1.855,1.979,2.103,2.227,2.351,2.475,2.599,2.723,2.847,2.971,3.095,3.219 - ], - "EUP": [ - 5.874,6.408,6.942,7.476,8.01,8.544,9.078,9.612,10.146,10.68,11.214,11.748,12.282,12.816,13.35,13.88 - ], - "R": [ - 19.776,21.574,23.372,25.17,26.968,28.766,30.564,32.362,34.16,35.958,37.756,39.554,41.352,43.15,44.948,46.746 - ], - "RL": [ - 5.875,6.41,6.945,7.48,8.015,8.55,9.085,9.62,10.155,10.69,11.225,11.76,12.295,12.83,13.35,13.9 - ], - "T": [ - 0.4, 0.466, 0.532, 0.6, 0.666, 0.732, 0.8 - ] - }, - "1041": { - "A": [ - 3.407, 3.717, 4.027, 4.337, 4.647, 4.957, 5.267, 5.577, 5.887, 6.197, 6.507, 6.817, 7.127, 7.437, 7.747, 8.057 - ], - "C": [ - 2.62, 2.859, 3.098, 3.337, 3.576, 3.815, 4.054, 4.293, 4.532, 4.771, 5.01, 5.249, 5.488, 5.727, 5.966, 6.205 - ], - "E": [ - 6.75, 7.364, 7.978, 8.592, 9.206, 9.82, 10.434, 11.048, 11.662, 12.276, 12.89, 13.504, 14.118, 14.732, 15.346, 15.96 - ], - "RL": [ - 6.325, 6.9, 7.475, 8.05, 8.625, 9.2, 9.775, 10.35, 10.925, 11.5, 12.075, 12.65, 13.225, 13.8, 14.375, 14.95 - ], - "R": [ - 21.03, 22.942, 24.854, 26.766, 28.678, 30.59, 32.502, 34.414, 36.326, 38.238, 40.15, 42.062, 43.974, 45.886, 47.798, 49.71 - ], - "T": [ - 0.35,0.408,0.466,0.525,0.583,0.641,0.7 - ] - }, - "1251": { - "A": [ - 4.487, 4.895, 5.303, 5.711, 6.119, 6.527, 6.935, 7.343, 7.751, 8.159, 8.567, 8.975, 9.383, 9.791, 10.199, 10.607 - ], - "C": [ - 2.84, 3.099, 3.358, 3.617, 3.876, 4.135, 4.394, 4.653, 4.912, 5.171, 5.43, 5.689, 5.948, 6.207, 6.466, 6.725 - ], - "E": [ - 6.028,6.577,7.126,7.675,8.224,8.773,9.322,9.871,10.42,10.969,11.518,12.067,12.616,13.165,13.714,14.263 - ], - "RL": [ - 6.479, 7.068, 7.657, 8.246, 8.835, 9.424, 10.013, 10.602, 11.191, 11.78, 12.369, 12.958, 13.547, 14.136, 14.725, 15.314 - ], - "R": [ - 16.707, 18.226, 19.745, 21.264, 22.783, 24.302, 25.821, 27.34, 28.859, 30.378, 31.897, 33.416, 34.935, 36.454, 37.973, 39.492 - ], - "T": [ - 0.02, 0.024, 0.027, 0.03, 0.034, 0.037, 0.04 - ] - }, - "1021": { - "A": [ - 1.702, 1.857, 2.012, 2.167, 2.322, 2.477, 2.632, 2.787, 2.942, 3.097, 3.252, 3.407, 3.562, 3.717, 3.872, 4.027 - ], - "C": [ - 2.279, 2.487, 2.695, 2.903, 3.111, 3.319, 3.527, 3.735, 3.943, 4.151, 4.359, 4.567, 4.775, 4.983, 5.191, 5.399 - ], - "E": [ - 5.397, 5.888, 6.379, 6.87, 7.361, 7.852, 8.343, 8.834, 9.325, 9.816, 10.307, 10.798, 11.289, 11.78, 12.271, 12.762 - ], - "RL": [ - 5.362, 5.85, 6.338, 6.826, 7.314, 7.802, 8.29, 8.778, 9.266, 9.754, 10.242, 10.73, 11.218, 11.706, 12.194, 12.682 - ], - "R": [ - 15.711, 17.14, 18.569, 19.998, 21.427, 22.856, 24.285, 25.714, 27.143, 28.572, 30.001, 31.43, 32.859, 34.288, 35.717, 37.146 - ], - "T": [ - 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6 - ] - }, - "1111": { - "A": [ - 4.692, 5.119, 5.546, 5.973, 6.4, 6.827, 7.254, 7.681, 8.108, 8.535, 8.962, 9.389, 9.816, 10.243, 10.67, 11.097 - ], - "C": [ - 4.654, 5.078, 5.502, 5.926, 6.35, 6.774, 7.198, 7.622, 8.046, 8.47, 8.894, 9.318, 9.742, 10.166, 10.59, 11.014 - ], - "E": [ - 2.314, 2.525, 2.736, 2.947, 3.158, 3.369, 3.58, 3.791, 4.002, 4.213, 4.424, 4.635, 4.846, 5.057, 5.268, 5.479 - ], - "RL": [ - 6.407, 6.99, 7.573, 8.156, 8.739, 9.322, 9.905, 10.488, 11.071, 11.654, 12.237, 12.82, 13.403, 13.986, 14.569, 15.152 - ], - "R": [ - 18.164, 19.816, 21.468, 23.12, 24.772, 26.424, 28.076, 29.728, 31.38, 33.032, 34.684, 36.336, 37.988, 39.64, 41.292, 42.944 - ], - "T": [ - 0.12, 0.14, 0.16, 0.18, 0.2, 0.22, 0.24 - ], - "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 - ] - } -}