完善伤害计算重定向

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

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