Upd:零号·安比、波可娜等伤害计算

This commit is contained in:
UCPr 2025-03-14 22:07:25 +08:00
parent c293eba2d7
commit ca29580286
13 changed files with 302 additions and 15 deletions

View file

@ -72,8 +72,13 @@ export class BuffManager {
buff = _.merge({
status: true,
isForever: false,
is: {},
...this.defaultBuff
}, buff);
if (buff.isForever)
buff.is.forever = true;
if (buff.range && !Array.isArray(buff.range))
buff.range = [buff.range];
if (!buff.source) {
if (buff.name.includes('核心') || buff.name.includes('天赋'))
buff.source = 'Talent';

View file

@ -49,7 +49,7 @@ export interface buff {
/** Buff状态true生效false无效 */
status: boolean
/** Buff是否常驻 */
isForever: boolean
isForever?: boolean
/** Buff名称 */
name: string
/** Buff来源 */
@ -80,7 +80,7 @@ export interface buff {
* - **redirect****range**
* - **redirect****range****redirect**
*/
range?: string[] | anomaly[]
range?: string[] | anomaly[] | "追加攻击"[]
/**
* Buff增益技能类型****
* - **range**
@ -110,8 +110,18 @@ export interface buff {
buffM: BuffManager
calc: Calculator
}) => boolean) | number
/** Buff描述符 */
is: {
/** 是否常驻 @default false*/
forever?: boolean
/** 是否团队增益 @default false */
team?: boolean
/** buff为团队增益时同类效果是否可叠加 @default false */
stack?: boolean
}
}
type filterable = 'name' | 'element' | 'type' | 'range' | 'source'
let depth = 0, weakMapCheck = new WeakMap<buff, boolean>()
/**
* Buff管理器
@ -143,8 +153,13 @@ export class BuffManager {
buff = _.merge({
status: true,
isForever: false,
is: {},
...this.defaultBuff
}, buff)
if (buff.isForever)
buff.is.forever = true
if (buff.range && !Array.isArray(buff.range))
buff.range = [buff.range]
if (!buff.source) {
if (buff.name.includes('核心') || buff.name.includes('天赋')) buff.source = 'Talent'
else if (buff.name.includes('额外能力')) buff.source = 'Addition'
@ -169,14 +184,14 @@ export class BuffManager {
return this.buffs
}
_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' | 'include' | 'exclude'>]?: buff[key] } & { element: element, redirect?: skill['type'] }, calc?: Calculator): buff[]
_filter<T extends filterable>(buffs: buff[], type: T, value: buff[T]): buff[]
_filter(buffs: buff[], obj: Partial<Pick<buff, filterable>> & { element: element, redirect?: skill['type'] }, calc?: Calculator): buff[]
_filter(buffs: buff[], fnc: (buff: buff, index: number) => boolean): buff[]
_filter<T extends keyof buff>(
_filter<T extends filterable>(
buffs: buff[],
param:
| T
| ({ [key in Exclude<keyof buff, 'status' | 'check' | 'element' | 'include' | 'exclude'>]?: buff[key] } & { element: element, redirect?: skill['type'] })
| (Partial<Pick<buff, filterable>> & { element: element, redirect?: skill['type'] })
| ((buff: buff, index: number) => boolean),
valueOcalc?: buff[T] | Calculator
) {
@ -268,22 +283,22 @@ export class BuffManager {
/**
* buff
*/
filter<T extends keyof buff>(type: T, value: buff[T]): buff[]
filter<T extends filterable>(type: T, value: buff[T]): buff[]
/**
* **** buff
* - range数组的筛选
* - range须全匹配redirect向后覆盖
* - range向后覆盖
*/
filter(obj: { [key in Exclude<keyof buff, 'status' | 'check' | 'element' | 'include' | 'exclude'>]?: buff[key] } & { element: element, redirect?: skill['type'] }, calc?: Calculator): buff[]
filter(obj: Partial<Pick<buff, filterable>> & { element: element, redirect?: skill['type'] }, calc?: Calculator): buff[]
/**
* buff
*/
filter(fnc: (buff: buff, index: number) => boolean): buff[]
filter<T extends keyof buff>(
filter<T extends filterable>(
param:
| T
| ({ [key in Exclude<keyof buff, 'status' | 'check' | 'element' | 'include' | 'exclude'>]?: buff[key] } & { element: element, redirect?: skill['type'] })
| (Partial<Pick<buff, filterable>> & { element: element, redirect?: skill['type'] })
| ((buff: buff, index: number) => boolean),
valueOcalc?: buff[T] | Calculator
) {

View file

@ -46,6 +46,10 @@ export class Calculator {
skill.element = elementType2element(this.avatar.element_type);
if (!skill.name || !skill.type)
return logger.warn('无效skill', skill);
if (skill.check && +skill.check) {
const num = skill.check;
skill.check = ({ avatar }) => avatar.rank >= num;
}
this.skills.push(skill);
return this.skills;
}
@ -249,7 +253,14 @@ export class Calculator {
calc_value(value, buff) {
switch (typeof value) {
case 'number': return value;
case 'function': return +value({ avatar: this.avatar, buffM: this.buffM, calc: this }) || 0;
case 'function': {
if (buff)
buff.status = false;
const v = +value({ avatar: this.avatar, buffM: this.buffM, calc: this }) || 0;
if (buff)
buff.status = true;
return v;
}
case 'string': return charData[this.avatar.id].buff?.[value]?.[this.get_SkillLevel(value[0]) - 1] || 0;
case 'object': {
if (!Array.isArray(value) || !buff)

View file

@ -128,7 +128,7 @@ export class Calculator {
readonly avatar: ZZZAvatarInfo
readonly skills: skill[] = []
private cache: { [type: string]: damage } = {}
private props: damage['props'] = {}
private props: Exclude<damage['props'], undefined> = {}
/** 当前正在计算的技能 */
skill: skill
defaultSkill: { [key in keyof skill]?: skill[key] } = {}
@ -173,6 +173,10 @@ export class Calculator {
}, skill)
if (!skill.element) skill.element = elementType2element(this.avatar.element_type)
if (!skill.name || !skill.type) return logger.warn('无效skill', skill)
if (skill.check && +skill.check) {
const num = skill.check as unknown as number
skill.check = ({ avatar }) => avatar.rank >= num
}
this.skills.push(skill)
return this.skills
}
@ -300,7 +304,7 @@ export class Calculator {
logger.error('伤害计算错误:', e)
return
}
}).filter(v => v && v.result?.expectDMG && !v.skill?.isHide)
}).filter(v => v && v.result?.expectDMG && !v.skill?.isHide) as damage[]
}
/**
@ -386,7 +390,12 @@ export class Calculator {
calc_value(value: buff['value'], buff?: buff) {
switch (typeof value) {
case 'number': return value
case 'function': return +value({ avatar: this.avatar, buffM: this.buffM, calc: this }) || 0
case 'function': {
if (buff) buff.status = false
const v = +value({ avatar: this.avatar, buffM: this.buffM, calc: this }) || 0
if (buff) buff.status = true
return v
}
case 'string': return charData[this.avatar.id].buff?.[value]?.[this.get_SkillLevel(value[0]) - 1] || 0
case 'object': {
if (!Array.isArray(value) || !buff) return 0
@ -405,7 +414,7 @@ export class Calculator {
* @param isRatio buff.value为数值类型且<1时按初始数值百分比提高处理
*/
get(type: buff['type'], initial: number, skill: skill, usefulBuffs: buff[] = this.buffM.buffs, isRatio = false): number {
return this.props![type] ??= this.buffM._filter(usefulBuffs, {
return this.props[type] ??= this.buffM._filter(usefulBuffs, {
element: skill?.element,
range: [skill?.type],
redirect: skill?.redirect,

View file

@ -229,6 +229,9 @@ Buff来源可分为三大类武器、套装、角色影画、核心被动
> - 侵蚀
> - 紊乱
> - 追加攻击
> - 直接以“追加攻击”命名
#### 技能类型命名解释说明
1. 首字母为技能所属**基类**,不可更改、不可单独作为技能名,后跟字母表示技能分支

View file

@ -0,0 +1,52 @@
/** @type {import('../../BuffManager.ts').BuffManager['buffs']} */
export const buffs = [
{
name: '1影',
type: '暴击率',
value: 0.1
},
{
name: '2影',
type: '攻击力',
value: 0.1
},
{
name: '6影',
type: '增伤',
value: 0.15,
range: ['EPLP', 'EPLZ']
},
{
name: '6影额外能力业务搭档',
type: '增伤',
value: 0.3,
check: 6
},
{
name: '额外能力:业务搭档',
type: '增伤',
value: 0.3,
check: ({ avatar }) => avatar.rank < 6,
range: ['追加攻击']
}
]
/** @type {import('../../Calculator.ts').Calculator['skills']} */
export const skills = [
{ name: '普攻:捷击三段', type: 'AP3' },
{ name: '长按普攻:跃击', type: 'AX' },
{ name: '闪避反击:睚眦必报', type: 'CF' },
{
name: '特殊技:噬爪·噩梦袭影',
type: 'EPLP',
redirect: '追加攻击'
},
{
name: '噬爪·噩梦袭影终结一击',
type: 'EPLZ',
redirect: '追加攻击'
},
{ name: '强化特殊技:噬爪·瞬步', type: 'EQ' },
{ name: '连携技:嗨,想不到吧', type: 'RL' },
{ name: '终结技:噢,游戏时间', type: 'RZ' }
]

View file

@ -0,0 +1,28 @@
{
"skill": {
"AP3": [
1.676,1.829,1.982,2.135,2.288,2.441,2.594,2.747,2.9,3.053,3.206,3.359,3.512,3.665,3.818,3.971
],
"AX": [
1.35,1.473,1.596,1.719,1.842,1.965,2.088,2.211,2.334,2.457,2.58,2.703,2.826,2.949,3.072,3.195
],
"CF": [
2.017,2.202,2.386,2.57,2.754,2.938,3.122,3.306,3.49,3.674,3.858,4.041,4.226,4.41,4.594,4.778
],
"EPLP": [
0.463,0.505,0.549,0.592,0.635,0.678,0.721,0.764,0.807,0.85,0.893,0.936,0.979,1.021,1.065,1.108
],
"EPLZ": [
0.535,0.584,0.633,0.682,0.731,0.78,0.829,0.878,0.927,0.976,1.025,1.074,1.123,1.172,1.221,1.27
],
"EQ": [
3.477,3.794,4.111,4.428,4.745,5.062,5.379,5.696,6.013,6.33,6.647,6.964,7.281,7.598,7.915,8.232
],
"RL": [
5.341,5.827,6.313,6.799,7.285,7.771,8.257,8.743,9.229,9.715,10.201,10.687,11.173,11.659,12.145,12.631
],
"RZ": [
13.938,15.206,16.474,17.742,19.01,20.278,21.546,22.814,24.082,25.35,26.618,27.886,29.154,30.422,31.69,32.958
]
}
}

View file

@ -0,0 +1,69 @@
/** @type {import('../../BuffManager.ts').BuffManager['buffs']} */
export const buffs = [
{
name: '2影',
type: '暴击率',
value: 0.12,
isForever: true
},
{
name: '4影',
type: '无视抗性',
value: 0.12,
element: 'Electric'
},
{
name: '核心被动:电位差',
type: '增伤',
value: 'T1'
},
{
name: '核心被动:电位差',
type: '暴击伤害',
value: ({ calc }) => calc.get_CRITDMG() * calc.calc_value('T2'),
range: ['追加攻击']
},
{
name: '额外能力:超频',
type: '暴击率',
value: 0.1
},
{
name: '额外能力:超频',
type: '增伤',
value: 0.25,
range: ['追加攻击'],
is: {
team: true
}
}
]
/** @type {import('../../Calculator.ts').Calculator['skills']} */
export const skills = [
{ name: '感电每次', type: '感电' },
{ name: '普攻:电击穿五段', type: 'AP5' },
{ name: '闪避反击:地闪回击', type: 'CF' },
{ name: '特殊技苍光0', type: 'EPC0', isHide: true },
{
name: '特殊技:苍光',
type: 'EPC',
redirect: '追加攻击',
after: ({ damage }) => damage.add('EPC0')
},
{
name: '特殊技:雷殛',
type: 'EPL',
redirect: '追加攻击'
},
{ name: '强化特殊技:极雷断空', type: 'EQ' },
{ name: '连携技:疾跃落雷', type: 'RL' },
{ name: '终结技:斩空掠电', type: 'RZ' },
{
name: '6影电磁涡流',
type: 'Y6',
check: 6,
fixedMultiplier: 10,
redirect: '追加攻击'
}
]

View file

@ -0,0 +1,36 @@
{
"skill": {
"AP5": [
1.485,1.62,1.755,1.89,2.025,2.16,2.295,2.43,2.565,2.7,2.835,2.97,3.105,3.24,3.375,3.51
],
"CF": [
2.506,2.734,2.962,3.19,3.418,3.646,3.874,4.102,4.33,4.558,4.786,5.014,5.242,5.47,5.698,5.926
],
"EPC0": [
0.43,0.47,0.51,0.55,0.59,0.63,0.67,0.71,0.75,0.79,0.83,0.87,0.91,0.95,0.99,1.03
],
"EPC": [
1.672,1.824,1.976,2.128,2.28,2.432,2.584,2.736,2.888,3.04,3.192,3.344,3.496,3.648,3.8,3.952
],
"EPL": [
1.881,2.052,2.223,2.394,2.565,2.736,2.907,3.078,3.249,3.42,3.591,3.762,3.933,4.104,4.275,4.446
],
"EQ": [
3.796,4.142,4.488,4.834,5.18,5.526,5.872,6.218,6.564,6.91,7.256,7.602,7.948,8.294,8.64,8.986
],
"RL": [
5.638,6.151,6.664,7.177,7.69,8.203,8.716,9.229,9.742,10.255,10.768,11.281,11.794,12.307,12.82,13.333
],
"RZ": [
17.349,18.927,20.505,22.083,23.661,25.239,26.817,28.395,29.973,31.551,33.129,34.707,36.285,37.863,39.441,41.019
]
},
"buff": {
"T1": [
0.125,0.145,0.165,0.188,0.208,0.23,0.25
],
"T2": [
0.15,0.175,0.2,0.225,0.25,0.275,0.3
]
}
}

View file

@ -0,0 +1,20 @@
/** @type {import('../BuffManager.ts').BuffManager['buffs']} */
export const buffs = [
{
type: '增伤',
value: 0.15,
check: 2,
range: ['CC', '追加攻击'],
isForever: true
},
{
type: '攻击力',
value: 0.04 * 3,
check: 4
},
{
type: '暴击率',
value: 0.04 * 3,
check: 4
}
]

View file

@ -0,0 +1,14 @@
/** @type {import('../BuffManager.ts').BuffManager['buffs']} */
export const buffs = [
{
type: '异常精通',
value: 45,
check: 4
},
{
type: '增伤',
value: 0.25,
element: 'Ether',
check: 4
}
]

View file

@ -0,0 +1,17 @@
/** @type {import('../BuffManager.ts').BuffManager['buffs']} */
export const buffs = [
{
type: '暴击伤害',
value: [0.3, 0.345, 0.39, 0.435, 0.48],
isForever: true
},
{
type: '暴击伤害',
value: [0.1, 0.115, 0.13, 0.145, 0.16].map(v => v * 3),
},
{
type: '增伤',
value: [0.2, 0.23, 0.26, 0.29, 0.32],
element: 'Electric'
}
]

View file

@ -0,0 +1,8 @@
/** @type {import('../BuffManager.ts').BuffManager['buffs']} */
export const buffs = [
{
type: '增伤',
value: [0.15, 0.173, 0.195, 0.218, 0.24],
element: 'Physical'
}
]