注意:如需自定义伤害计算,请先确保你拥有对伤害计算的基础知识,可参考此帖了解伤害计算的组成部分与计算方法。
如需省流请直接查看总结
后文将带你入门插件伤害计算逻辑,只要你需要自定义伤害计算,都建议你完整阅读:
底层已对伤害计算进行了规范化、模块化,只需要填参数就可以实现常见的伤害计算逻辑,即使不懂代码也可以参考模板独立完成。若存在问题、建议,可于插件群内询问,或联系我的邮箱:[email protected]
伤害计算需要明确这几部分:初始属性、局内Buff、技能属性、敌方属性,后文将分别说明
初始属性,即局外时代理人的面板属性(参见上帖完整描述)
在伤害计算逻辑中,此部分数据可直接获取,不作过多说明
局内Buff,即仅在局内生效的所有增益,一个buff只能对单一属性进行增益,但可以同时作用于多个技能。合理管控buff,是做好伤害计算最重要的一步
每个buff由各项buff参数组成,重要参数:
{
/** Buff名称 */
name: string
/** Buff来源 */
source: buffSource
/** Buff增益的类型 */
type: buffType
/**
* Buff增益数值,可为数值、数组、函数、字符串
* @number
* - 一般情况下此值即为提高值
* - 当buff增益类型为攻击力/冲击力/异常精通/异常掌控/防御力/生命值时,若此值<1,则将此值理解为初始属性的百分比提高
* @array
* 根据buff.source自动选择对应等级/星级的值(同上支持百分比提高),支持的source:
* - Weapon:武器星级(进阶)
* - Talent/Addition:天赋(核心技)等级
* @function
* 函数返回值则为提高值
* @string
* 角色自身的buff提高值可能随技能/天赋等级提高而提高,此时可以于data.json的"buff"中添加对应的倍率信息(同上支持百分比提高),此时value即为键名,其首字母必须为对应技能的基类(参考技能类型命名标准)
*/
value: number | number[] | Function | string
/**
* Buff增益技能类型生效范围;参考技能类型命名标准
* - 当技能参数不存在redirect时,range作用范围向后覆盖
* - 当技能参数存在redirect时,range须全匹配,redirect向后覆盖
*/
range?: string[]
/** Buff增益属性类型,无则对全部属性生效 */
element?: element | element[]
}
额外说明:
-
name:Buff名称。可重复
-
source:Buff来源。用于管理buff、简化参数、判断生效条件等。查看buff来源
-
type:Buff增益的类型。查看增益类型
-
value:Buff增益值。具体解释如上述
-
range:Buff增益技能类型范围。该参数用于鉴别不同buff的生效范围(比如只对普攻生效),填写方法会在技能属性中详细说明
-
element:Buff增益属性类型,可为字符串或字符串数组。该参数用于鉴别不同buff的生效属性(比如只对冰属性伤害生效)。查看属性类型
-
buff存在更多的参数用于处理各种情况,详见buff参数
伤害计算模块提供了注册、管理各buff的接口BuffManager,所有buff都需要通过此类的实例buffM进行注册、管理
Buff来源可分为三大类:武器、套装、角色(影画、核心被动、额外能力、技能),buff的注册也分为此三步骤、三部分。具体计算文件分别位于武器 套装 角色
-
自定义方法:复制对应的计算文件,重命名为原名_user.js(如:calc_user.js),修改相应逻辑重启即可
-
buff注册方法:武器、套装、角色每部分buff的注册,我都为你提供了两种方式:
- 一:直接导出:在计算文件中导出buffs数组,数组中保存各buff即可
- 二:函数导出:调用BuffManager实例buffM的new方法,传入你需要注册的buff即可
- 当上述两方式同时存在时,会先注册直接导出的buffs,然后调用导出的函数
- 一般情况下,都更推荐直接导出的方法。如果你需要更灵活的导出方式,可以选择使用函数导出。
-
buff注册原则:应尽可能地将能够吃到的buff都注册上;不考虑失衡易伤和任何需失衡触发的buff
后文将说明武器、套装、角色三部分各自的buff注册细则
注意事项:
注意事项:
-
主词条的提升会自动注册,无需处理
-
二件套效果只有属性伤害提升需要注册,其他已包含于初始属性
-
四件套效果需要自己注册
角色buff分为影画、核心被动、额外能力、技能此四个来源
-
影画·Rank
参数name建议按照模板填写,此时命座检查会自动进行
-
核心被动·Talent
核心被动buff参数中的buff增益值可能随核心技等级提升而提升,此时value的类型对应字符串情况,并且需要于data.json中添加对应的倍率信息,你可参考安东伤害计算的处理
-
额外能力·Addition
额外能力的阵营效果直接视为生效,正常注册即可
-
技能·Skill
部分角色释放技能后会给自己附加增益,正常注册即可
-
BuffManager提供了部分管理buff的函数,可自行查看使用
-
较为推荐的管理buff方式为:在使用直接导出注册相应的buff的基础上,通过导出函数来管理buff,在函数中调整各buff
-
在线调试:将云崽底层的日志类型(根目录/config/config/bot.yaml中的log_level)修改为debug并重启后,插件会自动监听当前各计算文件,实时更新,并会在控制台输出伤害计算的详细过程:初始属性、buff情况、技能数据、buff生效情况、各乘区数据,可据此调试(在未开启在线调试的情况下,每次修改都需要重启才能生效。开启在线调试后,对当前已有计算文件的修改会直接生效,但新增计算文件仍需重启才能生效。)
-
游戏中的buff生效情况错综复杂,但通过自定义敌方属性和对buff的精确管控,插件的计算结果将与游戏实机十分吻合
技能属性,即在代理人技能详情界面对该技能的描述:技能名、伤害倍率、伤害类型等
技能为泛指,任何可以造成伤害的输出手段,此处都可称为技能,包括属性异常、紊乱等
每个技能由各项技能参数组成,必需参数:
{
/** 技能名,唯一 */
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 核心技
- 核心技中的技能各不相同,自行定义即可
- Y 影画(如柏妮思6影额外伤害)
- Y后接数字表示该技能为第n个影画的效果
- 影画中的技能各不相同,自行定义即可
- 属性异常(特殊)
- 强击 畏缩
- 灼烧
- 碎冰 霜寒
- 感电
- 侵蚀
- 紊乱
-
首字母为技能所属基类,不可更改、不可单独作为技能名,后跟字母表示技能分支
-
树状命名,后一位字母代表基于其前一位字母的分支,取技能名发音(倒着读);属性异常较特殊,直接以异常名作为技能类型名
-
后跟数字可表示段数,如AP1表示第一段普攻;为避免混淆,数字仅表示同一技能不同段数,不用于区分不同技能
-
当不需要进一步细分分支时,必须遵守此标准命名,否则可能导致Buff计算错误
-
当需进一步细分多种分支时,应基于此标准已有的命名拓展命名,并确保前后一致
艾莲的冲刺攻击有三种不同的类型,为了区分,需要对其进行拓展
冲刺攻击类型命名标准为CC,故:
- “冲刺攻击:寒潮”可表示为CCP(普通冲刺攻击);
- “冲刺攻击:骇浪”可表示为CCQ(强化冲刺攻击);
- “冲刺攻击:冰渊潜袭”可表示为CCX(巡游冲刺攻击),其又分为普通和蓄力两种,又可分别表示为:
- 普通巡游冲刺攻击:CCXP
- 蓄力巡游冲刺攻击:CCXX
点此查看艾莲实际伤害计算文件
当然,若冲刺攻击不存在变体,则直接使用CC命名即可
技能类型命名将直接决定某buff是否作用于某技能,这也是规定标准命名的原因
buff作用范围将以技能类型命名为依据向后覆盖。以上述艾莲冲刺攻击命名示例为例,在某buff的作用范围数组(即buff的range参数)中:
- 如果包括C,则代表对所有基于C(闪避)的分支都生效(包括CP、CF、CC、CX等)
- 如果包括CC,则代表对所有基于CC(冲刺攻击)的分支都生效
- 如果只包括CCQ(强化冲刺攻击),则代表只对“冲刺攻击:骇浪”生效
- 如果只包括CCX(巡游冲刺攻击),则代表对“冲刺攻击:冰渊潜袭”生效(无论普通或蓄力)
- 如果只包括CCXX(蓄力巡游冲刺攻击),则代表只对“冲刺攻击:冰渊潜袭”的蓄力巡游冲刺攻击生效
点此查看艾莲实际伤害计算文件
注意事项:
-
属性异常中强击和碎冰没有持续时间的概念,总倍率不受持续时间的影响也无法结算紊乱。因此对于作用于异常持续时间的buff,其buff.range应填写异常对应的状态异常(畏缩和霜寒),灼烧等既是伤害异常也是状态异常则无需区分。
-
对于
“X"(造成的伤害)被视为“Y”(伤害)
此类特殊技能,需要指定技能重定向参数,同时上述buff覆盖规则会发生变化,具体请参考源码内描述需要注意的是:即使出现
“X"(造成的伤害)被视为“Y”(伤害)
,对Y类型的增益X不一定能吃到,视具体情况变化
不同等级的技能倍率不同,新增某技能的伤害计算时需要你手动添加对应的倍率信息
技能倍率保存在character/角色名/data.json中,json数据的skill中的各个键即为技能类型type,值即为每个等级对应的倍率数组(长度16)
需要自定义data.json时,同样复制一份重命名为data_user.json即可
角色每个技能各等级对应的倍率建议在米游社官网图鉴中查询。不建议使用第三方图鉴工具(如B站的绝区零wiki),其技能倍率可能存在错误
技能倍率大部分情况下为等差数列,少数情况下增量存在变化,请注意甄别。对于等差数列的技能倍率,我写了一个简易的生成函数,你可复制粘贴直接使用:
点击展开
import { exec } from 'child_process'
const copyToClipboard = (text) => {
exec('clip').stdin.end(text)
}
function counter(first, second, num = 16) {
if (first > 100 && second > 100) {
first = Math.round(first * 100)
second = Math.round(second * 100)
} else {
first = Math.round(first * 10000)
second = Math.round(second * 10000)
}
const step = second - first
const arr = [first / 10000]
let txt = first / 10000 + ''
for (let i = 1; i < num; i++) {
const next = (first + step * i) / 10000
txt += ',' + +next.toFixed(4)
arr.push(next)
}
if (process.platform === 'win32') {
copyToClipboard(txt)
}
console.log(txt)
return arr
}
// 可按照实际数值填写,当倍率大于100%时可忽略百分号填写
// 参数依次为:1级倍率 2级倍率 生成长度
counter(145.7, 159, 16)
伤害计算模块提供了注册各技能的接口Calculator,所有技能都需要通过此类的实例calc进行注册
技能的注册较为简单:
注意事项:
-
若某技能所造成伤害的属性与角色属性不符,应指定该技能的属性element
-
技能的参数有较多可选的拓展,用于处理更复杂的情况,如有需要请自行查看Calculator源码和已有角色的计算案例(较为复杂的计算案例可参考柏妮思的伤害计算)
-
后续会根据需要,新增/调整拓展参数,对于已有的拓展会尽量保持兼容
-
目前只可注册角色的技能,部分武器有独立的造成额外伤害的机制,暂不考虑
影响伤害计算的敌方属性有:防御力、抗性、弱点
- 防御力:影响防御乘区。影响直伤和异常伤害计算
- 抗性、弱点:影响抗性乘区。影响直伤和异常伤害计算
可以用 等级、1级基础防御力、抗性区常量 三个参数来替代防御力、抗性、弱点:
-
等级、1级基础防御力:根据这两个参数可计算出敌方防御力。插件默认敌方等级=角色等级,1级基础防御力=50
-
抗性区常量:敌方存在对应的弱点时,此值为 0.2;敌方存在对应的抗性时,此值为 -0.2;既不抗也不弱,此值为 0。插件默认抗性区常量=0.2
通过在角色伤害计算文件中导出calc函数,调用函数参数中calc的defEnemy方法,你可以对此三个参数进行自定义
敌方基础属性可查看此表
例如将敌人的1级基础防御力设置为36:
export function calc(buffM, calc, avatar) {
calc.defEnemy('basicDEF', 36)
}
目前暂不支持指令自定义,暂不支持直接指定具体敌人
角色伤害计算文件为character/角色名/calc.js,如需自定义,将calc.js复制一份并重命名为calc_user.js后自行修改其中逻辑即可。data.json为技能倍率、天赋加成数据,如需自定义,同理将data.json复制一份并重命名为data_user.json后自行修改即可。套装计算和武器计算同理。
请在对伤害计算有一定了解的基础上再进行伤害计算的修改
新增角色伤害计算的一般步骤为:
-
复制一份模板文件夹,重命名为对应角色名
-
修改其中calc.js,选择你喜欢的导出方式,一般推荐直接导出
-
了解对应角色技能的变体,参考技能类型命名标准为每个需要注册的技能命名(即使有的技能变体你不需要计算,也推荐你按照标准命名进行拓展命名,便于后续拓展)
-
注册对应的技能(只有先明确每个技能参数的type如何命名,你才能知道如何填buff参数的range)
修改现有角色伤害计算的一般步骤为:
-
复制一份该角色对应的calc.js文件重命名为calc_user.js
-
根据需要修改其中的逻辑,可以通过组合使用导出方式进行管理
-
如需新增技能倍率,复制一份该角色对应的data.json文件重命名为data_user.json
建议开启在线调试
感谢紫罗兰打烊啦对伤害计算细则的评测指正