完善伤害计算重定向

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