完全重构伤害计算;支持异常伤害计算;支持所有武器、套装计算;新增悠真计算等

This commit is contained in:
UCPr 2025-01-14 02:18:42 +08:00
parent f7e1066773
commit 3f8e64af66
99 changed files with 4243 additions and 1615 deletions

314
model/damage/README.md Normal file
View file

@ -0,0 +1,314 @@
# 伤害计算自定义
> 注意:如需自定义伤害计算,请先确保你拥有对伤害计算的基础知识,可参考[此帖][伤害计算]了解伤害计算的组成部分与计算方法。
角色伤害计算文件为[character/角色名/calc.js](./character/),如需自定义,将**calc.js**复制一份并重命名为**calc_user.js**后自行修改其中逻辑即可。**data.json**为技能倍率、天赋加成数据,如需自定义,同理将**data.json**复制一份并重命名为**data_user.json**后自行修改即可。[套装计算](./set/)和[武器计算](./weapon/)同理。
如需新增角色伤害计算,可复制[模板](./character/模板/)并重命名后修改相应逻辑。
后文将带你入门插件伤害计算逻辑,只要你需要自定义伤害计算,都建议你完整阅读:
> 开发者已对伤害计算进行了规范化、模块化只需要填参数就可以实现常见的伤害计算逻辑即使不懂代码也可以参考模板独立完成。若存在问题可于插件群内提问或联系我的邮箱UCPr251@gmail.com
伤害计算需要明确这几部分:**初始属性**、**局内Buff**、**技能属性**、**敌方属性**,后文将分别说明
## 初始属性
初始属性,即**局外**时代理人的面板属性(参见[上帖][伤害计算]完整描述)
在伤害计算逻辑中,此部分数据可直接获取,不作过多说明
## 局内Buff
局内Buff即仅在局内生效的所有增益一个buff只能对单一属性进行增益但可以同时作用于多个技能。合理管控buff是做好伤害计算最重要的一步
### 认识buff
每个buff由各项[buff参数](./BuffManager.ts#L46)组成,重要参数:
```JS
{
/** Buff名称 */
name: string
/** Buff来源 */
source: buffSource
/** Buff增益的类型 */
type: buffType
/**
* Buff增益数值可为数值、数组、函数、字符串
* @number
* - 一般情况下此值即为提高值
* - 当buff增益类型为攻击力/冲击力/异常精通/异常掌控/防御力/生命值时,若此值<1则将此值理解为初始属性的百分比提高
* @array
* 根据buff.source自动选择对应等级/星级的值,支持:
* - Weapon武器星级进阶
* - Talent/Addition天赋核心技等级
* @function
* 函数返回值则为提高值
* @string
* 角色自身的buff提高值可能随技能/天赋等级提高而提高此时可以于data.json的"buff"中添加对应的倍率信息此时value即为键名其首字母必须为对应技能的基类参考技能类型命名标准
*/
value: number | Function | string
/** Buff增益技能类型范围无则对全部生效参考技能类型命名标准 */
range?: string[]
/** Buff增益属性类型无则对全部属性生效 */
element?: element | element[]
}
```
额外说明:
- **name**Buff名称。可重复
- **source**Buff来源。用于管理buff、简化参数、判断生效条件等。查看[buff来源](./BuffManager.ts#L30)
- **type**Buff增益的类型。查看[增益类型](./BuffManager.ts#L32)
- **value**Buff增益值。具体解释如上述
- **range**Buff增益技能类型范围。该参数用于鉴别不同buff的[生效范围](#技能类型命名对buff作用的影响)(比如只对普攻生效),[填写方法](#技能类型命名标准)会在技能属性中详细说明
- **element**Buff增益属性类型。该参数用于鉴别不同buff的生效属性比如只对冰属性伤害生效。查看[属性类型](./BuffManager.ts#L6)
### 注册buff
伤害计算模块提供了注册、管理各buff的接口[BuffManager](./BuffManager.ts)所有buff都需要通过此类的实例**buffM**进行注册、管理
Buff来源可分为三大类武器、套装、角色影画、核心被动、额外能力、技能buff的注册也分为此三步骤、三部分。具体计算文件分别位于[武器](./weapon/) [套装](./set/) [角色](./character/)
- 自定义方法:复制对应的计算文件,重命名为**原名_user.js**星见雅_user.js修改相应逻辑重启即可
- buff注册方法武器、套装、角色每部分buff的注册我都为你提供了两种方式
- 一:[直接导出](./character/模板/calc.js#L66)在计算文件中导出buffs数组数组中保存各buff即可
- 二:[函数导出](./character/模板/calc.js#L1):调用[BuffManager](./BuffManager.ts)实例**buffM**的**new**方法传入你需要注册的buff即可
- 当上述两方式同时存在时,会**先**注册**直接导出**的buffs**然后**调用**导出的函数**
- 一般情况下,都更推荐**直接导出**的方法。如果你需要更灵活的导出方式,可以选择使用函数导出。
- buff注册原则应尽可能地将能够吃到的buff都注册上不考虑失衡易伤和任何需失衡触发的buff
后文将说明武器、套装、角色三部分各自的buff注册细则
### 武器Buff
[武器buff计算文件模板](./weapon/模板.js)
[武器buff两种导出方式实例](./weapon/霰落星殿.js)
注意事项:
- 武器的**基础属性**和**高级属性**皆已计入[**初始属性**](#初始属性),无需处理
- 武器的**音擎效果**需要自己注册
- 武器buff的**value**值一般为数组类型,具体参考[认识buff](#认识buff)部分
- 武器与角色的职业检查会自动进行
### 套装Buff
[套装buff计算文件模板](./set/模板.js)
[套装buff两种导出方式实例](./set/折枝剑歌.js)
注意事项:
- 主词条的提升会自动注册,无需处理
- 二件套效果只有**属性伤害提升**需要注册,其他已包含于初始属性
- 四件套效果需要自己注册
### 角色Buff
[角色buff计算文件模板](./character/模板/calc.js)
[角色buff两种导出方式实例](./character/星见雅/calc.js)
角色buff分为影画、核心被动、额外能力、技能此四个来源
- **影画·Rank**
**name**建议按照模板填写,此时命座检查会自动进行
- **核心被动·Talent**
核心被动中的**buff增益值**可能随核心技等级提升而提升,此时**value**的类型对应字符串情况并且需要于data.json中添加对应的倍率信息你可参考[安东伤害计算](./character/安东/calc.js#L17)的处理
- **额外能力·Addition**
额外能力的阵营效果直接视为生效,正常注册即可
- **技能·Skill**
部分角色释放技能后会给自己附加增益,正常注册即可
### 管理buff
- [BuffManager](./BuffManager.ts)提供了部分管理buff的函数可自行查看使用
- 较为推荐的管理buff方式为在使用**直接导出**注册相应的buff的基础上通过**导出函数**来管理buff在函数中调整各buff
- **在线调试**:将云崽底层的日志类型(根目录/config/config/bot.yaml中的log_level)修改为**debug**并重启后插件会自动监听当前各计算文件实时更新并会在控制台输出伤害计算的详细过程初始属性、buff情况、技能数据、buff生效情况、各乘区数据可据此调试
- 游戏中的buff生效情况难以确定但通过[自定义敌方属性](#自定义敌方属性)和对buff的精确管控插件的计算结果将与游戏实机十分吻合
<p align="center">
<img width="251" src="https://s2.loli.net/2025/01/14/o6mi3LKdgGtT2RP.jpg" title="她真好看">
<img width="251" src="https://s2.loli.net/2025/01/14/Ue5kLpha7N621Px.jpg" title="她真好看">
</p>
## 技能属性
技能属性,即在代理人技能详情界面对该技能的描述:技能名、伤害倍率、伤害类型等
### 认识技能
技能为泛指,任何可以造成伤害的输出手段,此处都可称为技能,包括属性异常、紊乱等
每个技能由各项[技能参数](./Calculator.ts#L9)组成,必需参数:
```JS
{
/** 技能名,唯一 */
name: string
/** 技能类型,唯一,参考技能类型命名标准 */
type: string
/** 属性类型,不指定时,默认取角色属性 */
element: element
}
```
### 技能类型
由于不同Buff作用的技能类型不同为了统一判断某Buff是否对某技能生效规定**技能类型命名标准**
#### 技能类型命名标准
> - A 攻击
> - AP 普通攻击
> - AX 重击/蓄力攻击
> - AQ 强化普攻
> - C 闪避
> - CP 普通闪避
> - CF 闪避反击
> - CC 冲刺攻击
> - CX 蓄力闪避
> - L 支援技
> - LK 快速支援
> - LZ 招架支援
> - LT 突击支援
> - E 特殊技
> - EP 普通特殊技
> - EQ 强化特殊技
> - R
> - RZ 终结技
> - RL 连携技
> - T 核心技
> - 核心技中的技能各不相同,自行定义即可
> - 属性异常(特殊)
> - 强击
> - 灼烧
> - 碎冰
> - 感电
> - 侵蚀
> - 紊乱
#### 技能类型命名解释说明
1. 首字母为技能所属基类,不可更改、不可单独作为技能名,后跟字母表示技能分支
2. 树状命名,后一位字母代表基于其前一位字母的分支,取技能名发音(倒着读);属性异常较特殊,直接以异常名作为技能类型名
3. 后跟数字可表示段数如AP1表示第一段普攻为避免混淆数字仅表示同一技能不同段数不用于区分不同技能
4. 当不需要进一步细分分支时必须遵守此标准命名否则可能导致Buff计算错误
5. 当需进一步细分多种分支时,应基于此标准已有的命名拓展命名,并确保前后一致
#### 技能类型命名示例
艾莲的冲刺攻击有三种不同的类型,为了区分,需要对其进行拓展
冲刺攻击类型命名标准为**CC**,故:
- “冲刺攻击:寒潮”可表示为**CCP**(普通冲刺攻击);
- “冲刺攻击:骇浪”可表示为**CCQ**(强化冲刺攻击);
- “冲刺攻击:冰渊潜袭”可表示为**CCX**(巡游冲刺攻击),其又分为普通和蓄力两种,又可分别表示为:
- 普通巡游冲刺攻击:**CCXP**
- 蓄力巡游冲刺攻击:**CCXX**
[点此查看](./character/艾莲/calc.js#L40)艾莲实际伤害计算文件
当然,若冲刺攻击不存在变体,则直接使用**CC**命名即可
#### 技能类型命名对Buff作用的影响
技能类型命名将直接决定某buff是否作用于某技能这也是规定标准命名的原因
buff作用范围将以技能类型命名为依据向后覆盖。以上述[艾莲冲刺攻击命名示例](#技能类型命名示例)为例在某buff的作用范围数组即buff的**range**参数)中:
- 如果包括**C**则代表对所有基于C闪避的分支都生效包括CP、CF、CC、CX等
- 如果包括**CC**则代表对所有基于CC冲刺攻击的分支都生效
- 如果只包括**CCQ**(强化冲刺攻击),则代表只对“冲刺攻击:骇浪”生效
- 如果只包括**CCX**(巡游冲刺攻击),则代表对“冲刺攻击:冰渊潜袭”生效(无论普通或蓄力)
- 如果只包括**CCXX**(蓄力巡游冲刺攻击),则代表只对“冲刺攻击:冰渊潜袭”的蓄力巡游冲刺攻击生效
### 技能倍率
[点此查看模板技能倍率](./character/模板/data.json)
不同等级的技能倍率不同,新增某技能的伤害计算时需要你手动添加对应的倍率信息
技能倍率保存在character/角色名/**data.json**中json数据的skill中的各个**键**即为技能类型**type****值**即为每个等级对应的倍率数组长度16
需要自定义data.json时同样复制一份重命名为**data_user.json**即可
### 注册技能
伤害计算模块提供了注册各技能的接口[Calculator](./Calculator.ts),所有技能都需要通过此类的实例**calc**进行注册
技能的注册较为简单:
1. 参考[模板](./character/模板/calc.js#L115)填入各技能相应参数一般只需要填name、type参数
2. 于[data.json](./character/模板/data.json)中为每个技能填写倍率(异常伤害无需填写)
注意事项:
- 若某技能所造成伤害的属性与角色属性不符,应指定该技能的属性**element**
- 技能的参数有较多可选的拓展,用于处理更复杂的情况,请自行查看[源码](./Calculator.ts)和已有角色的计算案例
- 目前只可注册角色的技能,部分武器有独立的造成额外伤害的机制,暂不考虑
## 敌方属性
影响伤害计算的敌方属性有:防御力、抗性、弱点
### 敌方属性的影响
- **防御力**:影响防御乘区。影响直伤和异常伤害计算
- **抗性、弱点**:影响抗性乘区。影响直伤和异常伤害计算
敌方属性可查看[此表](https://img.nga.178.com/attachments/mon_202407/16/axvkQq44x-2xpiZyT3cSwm-1hf.png)
### 自定义敌方属性
可以用 **等级、1级基础防御力、抗性区常量** 三个参数来替代**防御力、抗性、弱点**
- **等级、1级基础防御力**:根据这两个参数可计算出敌方防御力。插件默认敌方等级=角色等级1级基础防御力=50
- **抗性区常量**:敌方存在对应的弱点时,此值为 **0.2**;敌方存在对应的抗性时,此值为 **-0.2**;既不抗也不弱,此值为 **0**。插件默认抗性区常量=0.2
通过在角色伤害计算文件中导出**calc**函数调用Calculator的[defEnemy](./Calculator.ts)方法,你可以对此三个参数进行自定义
目前暂不支持指令自定义,暂不支持直接指定具体敌人
---
[伤害计算]:https://www.miyoushe.com/zzz/article/55265618