From ca295802863b4f1722aa77ffb60a1028149a13b2 Mon Sep 17 00:00:00 2001 From: UCPr <2032385471@qq.com> Date: Fri, 14 Mar 2025 22:07:25 +0800 Subject: [PATCH] =?UTF-8?q?Upd=EF=BC=9A=E9=9B=B6=E5=8F=B7=C2=B7=E5=AE=89?= =?UTF-8?q?=E6=AF=94=E3=80=81=E6=B3=A2=E5=8F=AF=E5=A8=9C=E7=AD=89=E4=BC=A4?= =?UTF-8?q?=E5=AE=B3=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- model/damage/BuffManager.js | 5 ++ model/damage/BuffManager.ts | 35 +++++++---- model/damage/Calculator.js | 13 +++- model/damage/Calculator.ts | 17 ++++-- model/damage/README.md | 3 + model/damage/character/波可娜/calc.js | 52 ++++++++++++++++ model/damage/character/波可娜/data.json | 28 +++++++++ model/damage/character/零号·安比/calc.js | 69 ++++++++++++++++++++++ model/damage/character/零号·安比/data.json | 36 +++++++++++ model/damage/set/如影相随.js | 20 +++++++ model/damage/set/法厄同之歌.js | 14 +++++ model/damage/weapon/牺牲洁纯.js | 17 ++++++ model/damage/weapon/裁纸刀.js | 8 +++ 13 files changed, 302 insertions(+), 15 deletions(-) create mode 100644 model/damage/character/波可娜/calc.js create mode 100644 model/damage/character/波可娜/data.json create mode 100644 model/damage/character/零号·安比/calc.js create mode 100644 model/damage/character/零号·安比/data.json create mode 100644 model/damage/set/如影相随.js create mode 100644 model/damage/set/法厄同之歌.js create mode 100644 model/damage/weapon/牺牲洁纯.js create mode 100644 model/damage/weapon/裁纸刀.js diff --git a/model/damage/BuffManager.js b/model/damage/BuffManager.js index 076b052..78ac01a 100644 --- a/model/damage/BuffManager.js +++ b/model/damage/BuffManager.js @@ -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'; diff --git a/model/damage/BuffManager.ts b/model/damage/BuffManager.ts index 3cf9d57..5b8f52d 100644 --- a/model/damage/BuffManager.ts +++ b/model/damage/BuffManager.ts @@ -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管理器 @@ -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(buffs: buff[], type: T, value: buff[T]): buff[] - _filter(buffs: buff[], obj: { [key in Exclude]?: buff[key] } & { element: element, redirect?: skill['type'] }, calc?: Calculator): buff[] + _filter(buffs: buff[], type: T, value: buff[T]): buff[] + _filter(buffs: buff[], obj: Partial> & { element: element, redirect?: skill['type'] }, calc?: Calculator): buff[] _filter(buffs: buff[], fnc: (buff: buff, index: number) => boolean): buff[] - _filter( + _filter( buffs: buff[], param: | T - | ({ [key in Exclude]?: buff[key] } & { element: element, redirect?: skill['type'] }) + | (Partial> & { element: element, redirect?: skill['type'] }) | ((buff: buff, index: number) => boolean), valueOcalc?: buff[T] | Calculator ) { @@ -268,22 +283,22 @@ export class BuffManager { /** * 根据单个指定属性筛选buff,不作进一步判断 */ - filter(type: T, value: buff[T]): buff[] + filter(type: T, value: buff[T]): buff[] /** * 根据多个指定属性筛选 **启用状态** 的buff * - 对伤害类型range数组的筛选,只要其中有一个符合即认为满足 * - 存在重定向时,range须全匹配,redirect向后覆盖 * - 不存在重定向时,range向后覆盖 */ - filter(obj: { [key in Exclude]?: buff[key] } & { element: element, redirect?: skill['type'] }, calc?: Calculator): buff[] + filter(obj: Partial> & { element: element, redirect?: skill['type'] }, calc?: Calculator): buff[] /** * 根据指定函数筛选buff */ filter(fnc: (buff: buff, index: number) => boolean): buff[] - filter( + filter( param: | T - | ({ [key in Exclude]?: buff[key] } & { element: element, redirect?: skill['type'] }) + | (Partial> & { 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 686629b..907d6ee 100644 --- a/model/damage/Calculator.js +++ b/model/damage/Calculator.js @@ -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) diff --git a/model/damage/Calculator.ts b/model/damage/Calculator.ts index bf57d83..6d3c553 100644 --- a/model/damage/Calculator.ts +++ b/model/damage/Calculator.ts @@ -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 = {} /** 当前正在计算的技能 */ 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, diff --git a/model/damage/README.md b/model/damage/README.md index ff4d78f..2cdea48 100644 --- a/model/damage/README.md +++ b/model/damage/README.md @@ -229,6 +229,9 @@ Buff来源可分为三大类:武器、套装、角色(影画、核心被动 > - 侵蚀 > - 紊乱 +> - 追加攻击 +> - 直接以“追加攻击”命名 + #### 技能类型命名解释说明 1. 首字母为技能所属**基类**,不可更改、不可单独作为技能名,后跟字母表示技能分支 diff --git a/model/damage/character/波可娜/calc.js b/model/damage/character/波可娜/calc.js new file mode 100644 index 0000000..eba6f42 --- /dev/null +++ b/model/damage/character/波可娜/calc.js @@ -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' } +] \ No newline at end of file diff --git a/model/damage/character/波可娜/data.json b/model/damage/character/波可娜/data.json new file mode 100644 index 0000000..0b3abe1 --- /dev/null +++ b/model/damage/character/波可娜/data.json @@ -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 + ] + } +} \ No newline at end of file diff --git a/model/damage/character/零号·安比/calc.js b/model/damage/character/零号·安比/calc.js new file mode 100644 index 0000000..7758440 --- /dev/null +++ b/model/damage/character/零号·安比/calc.js @@ -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: '追加攻击' + } +] \ No newline at end of file diff --git a/model/damage/character/零号·安比/data.json b/model/damage/character/零号·安比/data.json new file mode 100644 index 0000000..5394fb5 --- /dev/null +++ b/model/damage/character/零号·安比/data.json @@ -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 + ] + } +} \ No newline at end of file diff --git a/model/damage/set/如影相随.js b/model/damage/set/如影相随.js new file mode 100644 index 0000000..5477406 --- /dev/null +++ b/model/damage/set/如影相随.js @@ -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 + } +] \ No newline at end of file diff --git a/model/damage/set/法厄同之歌.js b/model/damage/set/法厄同之歌.js new file mode 100644 index 0000000..abe2152 --- /dev/null +++ b/model/damage/set/法厄同之歌.js @@ -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 + } +] \ No newline at end of file diff --git a/model/damage/weapon/牺牲洁纯.js b/model/damage/weapon/牺牲洁纯.js new file mode 100644 index 0000000..ab8b2c4 --- /dev/null +++ b/model/damage/weapon/牺牲洁纯.js @@ -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' + } +] \ No newline at end of file diff --git a/model/damage/weapon/裁纸刀.js b/model/damage/weapon/裁纸刀.js new file mode 100644 index 0000000..6cda77c --- /dev/null +++ b/model/damage/weapon/裁纸刀.js @@ -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' + } +] \ No newline at end of file