神器 数值 从 哪里 来
等级、品阶、公式字符串,以及描述与战斗中的两条取值路径。
约 2 分钟
神器等级与品阶会代入以文本保存的算术表达式。这些表达式通过不同路径提供描述与运行时数值。理解这种区别,既能解释普通成长,也能解释一些意外脆弱的行为。
等级 与 品 阶 是 独立 输入
公式变量 level 是神器等级,stage 是培养品阶,不是当前世界、波次或无尽关卡数。
全部 38 件神器引用同一培养表。等级升级行从 1 到 29,得到最高等级 30。品阶升级分别要求等级 10、20、30。购买品阶 4 后,这张表没有进一步的等级可解锁。11品阶、等级与无尽共享计数ArtifactInfo 的 rank 对应 stage 变量,level 独立。共享培养表包含等级 1–29 的升级行,以及分别要求等级 10、20、30 的品阶升级。战场保存一个 ArtifactData。无尽的 GetArtifactLeftTimes 读取管理器上的一个 int32,没有神器键;本地化规则描述跨关保留与关间切换。单件神器公共数据中的次数与这个无尽共享池是两个不同量。0x1002736fc0x10026f7ac0x100f9c4a0
品阶要求限制了正常成长能够产生的等级/品阶组合。在任意较低等级计算某个被动,可能得到负数,而该组合并不属于被动解锁时的成长路径。
一个 小数点 改变 算术 方式
公式引擎支持加、减、乘、除与括号。它把整数值替换进 level 和 stage,然后计算表达式。
数值域由文本决定:没有小数点的表达式使用有符号整数算术,有小数点则使用浮点算术。因此,同一等级下,2+level/ 与 2.0+level/ 可以产生不同结果。22描述与运行时共享算术引擎描述读取经过带边界检查的字段辅助函数 0x10026fb5c,并对 MainField 最后一项应用近零保护。运行时辅助函数 0x100272790 经 0x1002728a8 选择字段,由 0x1002736fc 替换变量,再调用同一算术引擎 0x10026e73c。第二个数组选择器缺少描述辅助函数的元素边界检查。转换后表达式没有小数点时使用有符号整数,否则使用 float32。框架报告较宽泛的“仅用于描述”说法,应由这条运行时调用链修正。0x10026ec9c0x10026e73c0x10026fb5c0x1002727900x1002728a8
保龄球神器的 2+level/,在等级 1–9 得到 2,10–19 得到 3,20–29 得到 4,30 得到 5。阶梯行为来自整数除法。对公式标点的一次小改动,就可以改变它的数值含义。
2+level/10,绿色为 2.0+level/10,品阶为 1。每个数值保持到下一级。2+level/10 → 有符号整数运算 · 2.0+level/10 → float32 运算变量替换辅助函数只替换每个变量第一次出现的位置。重复变量会给解析器留下不支持的文本。现有表达式避开了这种情况,但求值器没有结构化方式向调用方报告格式错误。
描述 与 运行 时 走 不同 路径
显示辅助函数在选择表达式时检查元素边界,计算字符串后,对 Main 最后一项进行特殊调整:足够接近零的值变为 1。
运行时辅助函数通过另一个函数选择表达式,替换神器变量,然后到达同一算术引擎。这个选择器没有显示辅助函数的元素边界检查。共享算术,并不意味着共享周围所有验证。
Main 最后两项按约定放置冷却与次数。运行时公共数据设置读取这两个位置,转换次数,应用自身的最小值处理,再经过进一步调整。冷却与次数词条在之后生效。33两处保护与后续修正对 stage*1.0-1.0,品阶 1 的原始结果为零。描述辅助函数把 MainField 最后一项的近零值改为 1;运行时公共数据路径单独转换,并在后续缩放和次数加成前把 0、1 都置为 1。因此仅凭原始公式不能断言显示零次。MainField 的前一项提供运行时冷却,之后还会应用冷却加成。0x10026fde00x100272b180x100972c20
对 stage*1.,品阶 1 的原始值为零。显示调整把它变为 1;运行时公共数据路径也会在后续修正前把零变为 1。因此,仅凭原始公式无法支持“描述显示零次”的说法。
查阅参考资料时,这一区别很关键:公式值、显示值与最终运行时值,是计算过程中的不同步骤。
无 尽 还有 另 一个 次数 计数 器
战场保存一个当前神器记录。普通无尽还有位于自身管理器上的次数计数器。读取函数只取一个整数,不带神器 id。
模式规则把主动次数描述为所有神器共享的总量,允许关间切换,主动总量耗尽后被动继续工作。这个共享总量与单件神器公共数据中的次数是不同的量。
名为 capacity 的字段可以描述词条配置,而非战场上的神器数量。字段名有助于定位,但类型与读取方才确定一个值的含义。
沿 字 段 找到 使用 它的 代码
进化神器提供了一个例子。它的 Targetable 名单由被动倍率读取函数使用,plant 则筛选生成结果。仅凭名称都无法说明作用。
一个条目也可能被解析后再未使用。进化保存了两个名称带有持续时间含义的被动字段,其类内之后却不读取它们。品阶 4 的行为转而使用固定品阶检查与空格扫描。修改一个未使用的数值,不会改变该行为。44三条独立被动路径两个 2 阶倍率读取函数查询含 26 项的 TargetablePlantTypes 白名单。3 阶计时器每次到期更新只推进一个间隔,并在行 0–4 中抽取。4 阶在延后移除之前扫描空格,选择 Cost <= 100 的植物。其等级归约从 1 开始取最小值,因此普通正值卡包等级无法将它提高。报告追踪的是倍率读取函数;通向最终植物数值的调用方需要另行对应。0x1009a77280x1009a78c00x1009a75d00x1009a6d1c0x1009a90b0
注释
每条论断的依据:代码路径,以及追踪到它的原生地址。
- 1
品阶、等级与无尽共享计数
ArtifactInfo 的 rank 对应 stage 变量,level 独立。共享培养表包含等级 1–29 的升级行,以及分别要求等级 10、20、30 的品阶升级。战场保存一个 ArtifactData。无尽的 GetArtifactLeftTimes 读取管理器上的一个 int32,没有神器键;本地化规则描述跨关保留与关间切换。单件神器公共数据中的次数与这个无尽共享池是两个不同量。
0x1002736fc0x10026f7ac0x100f9c4a0 - 2
描述与运行时共享算术引擎
描述读取经过带边界检查的字段辅助函数 0x10026fb5c,并对 MainField 最后一项应用近零保护。运行时辅助函数 0x100272790 经 0x1002728a8 选择字段,由 0x1002736fc 替换变量,再调用同一算术引擎 0x10026e73c。第二个数组选择器缺少描述辅助函数的元素边界检查。转换后表达式没有小数点时使用有符号整数,否则使用 float32。框架报告较宽泛的“仅用于描述”说法,应由这条运行时调用链修正。
0x10026ec9c0x10026e73c0x10026fb5c0x1002727900x1002728a8 - 3
两处保护与后续修正
对 stage*1.0-1.0,品阶 1 的原始结果为零。描述辅助函数把 MainField 最后一项的近零值改为 1;运行时公共数据路径单独转换,并在后续缩放和次数加成前把 0、1 都置为 1。因此仅凭原始公式不能断言显示零次。MainField 的前一项提供运行时冷却,之后还会应用冷却加成。
0x10026fde00x100272b180x100972c20 - 4
三条独立被动路径
两个 2 阶倍率读取函数查询含 26 项的 TargetablePlantTypes 白名单。3 阶计时器每次到期更新只推进一个间隔,并在行 0–4 中抽取。4 阶在延后移除之前扫描空格,选择 Cost <= 100 的植物。其等级归约从 1 开始取最小值,因此普通正值卡包等级无法将它提高。报告追踪的是倍率读取函数;通向最终植物数值的调用方需要另行对应。
0x1009a77280x1009a78c00x1009a75d00x1009a6d1c0x1009a90b0