完善伤害计算重定向

This commit is contained in:
UCPr 2025-01-20 18:17:45 +08:00
parent 8022384cf9
commit 2620deb95b
6 changed files with 56 additions and 186 deletions

View file

@ -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;

View file

@ -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<T extends keyof buff>(buffs: buff[], type: T, value: buff[T]): buff[]
_filter(buffs: buff[], obj: { [key in Exclude<keyof buff, 'status' | 'check' | 'element'>]?: buff[key] } & { element: element }, calc?: Calculator): buff[]
_filter(buffs: buff[], obj: { [key in Exclude<keyof buff, 'status' | 'check' | 'element'>]?: buff[key] } & { element: element, redirect?: skill['type'] }, calc?: Calculator): buff[]
_filter(buffs: buff[], fnc: (buff: buff, index: number) => boolean): buff[]
_filter<T extends keyof buff>(
buffs: buff[],
param:
| T
| ({ [key in Exclude<keyof buff, 'status' | 'check' | 'element'>]?: buff[key] } & { element: element })
| ({ [key in Exclude<keyof buff, 'status' | 'check' | 'element'>]?: 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<keyof buff, 'status' | 'check' | 'element'>]?: buff[key] } & { element: element }, calc?: Calculator): buff[]
filter(obj: { [key in Exclude<keyof buff, 'status' | 'check' | 'element'>]?: buff[key] } & { element: element, redirect?: skill['type'] }, calc?: Calculator): buff[]
/**
* buff
*/
@ -241,7 +251,7 @@ export class BuffManager {
filter<T extends keyof buff>(
param:
| T
| ({ [key in Exclude<keyof buff, 'status' | 'check' | 'element'>]?: buff[key] } & { element: element })
| ({ [key in Exclude<keyof buff, 'status' | 'check' | 'element'>]?: buff[key] } & { element: element, redirect?: skill['type'] })
| ((buff: buff, index: number) => boolean),
valueOcalc?: buff[T] | Calculator
) {

View file

@ -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;

View file

@ -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

View file

@ -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),此处不作过多说明
### 技能倍率

View file

@ -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
]
}
}