效果帧执行顺序、清理前缓存与 v36

2026-09-20。沿全武器目标继续。本批不是控制/DoT混排全链完成:确认了原版共享执行帧的顺序,增加原始机器码对照,修正已在运行的控制更新和HP效果缓存;跨池全顺序记录与统一命令仍需下一段接入,periodic_control_order_pending尚未移除。

原版调用顺序

只读原版E:/Torchlight 2/Torchlight2.exe.i64,并核实EXE SHA256仍为186472c3057b38f4cdff4696959a943c396ae6166995f7418997b5ea853e8a5e。

56A420中的实际顺序:

  1. 56B0F5调用566DD0:访问passive与dynamic两个列表,推进elapsed并执行具体处理器。
  2. 56B118调用7AFE00:重算239槽缓存。
  3. 56B12B调用7AF2A0:通知移除、末项补位并重查当前位置。
  4. 56B151调用53C2F0:结算回复/DoT/死亡。

这纠正了此前“先清理,再从清理后的列表重算”的运行时行为。566DD0对每张列表保存进入时的长度;后续通用处理器也不能随便改为遍历新追加的全部条目。

原机器码对照

新增build_native_mixed_effect_tick_oracle.py/native_mixed_effect_tick_oracle.c,执行完整566DD0函数体的所选类型路径,随后调用原7AFE00和7AF2A0。

  • 129组输入,三种x87精度,共387组。
  • 类型7、124、52、43、64、128、196;覆盖零delta、到期边界、退休标志、多个控制、阻止激活、原状态5/6/16/40/41和浮点抵消。
  • 387组生命周期、状态和存活/移除顺序一致。
  • 生产PC53下129组power、force与缓存逐位一致。没有声称另两种精度的所有CRT/向量数学都完成数值验证。

明确边界:单位查询、命名状态转移、常量无owner-skill效果求值、向量库/pow、字符串、移除通知和分配器。不是完整角色主循环、装备效果遍历或渲染验收。

生成器会根据ASM里的flt/dbl引用加载原数据页,另有回归确认2143F68的0.016f来自EXE,而不是未载入页面的零内存。

控制运行时的实际修复

ControlEffects.Tick已使用NativeEffectFrame:

  • 零delta仍执行处理器:可建立STUNNED,并生成当前击退力;没有时间消耗和power衰减,不等于无操作。
  • 新眩晕激活遵守原状态5、6、16、41的阻止门。
  • TYPE43没有isExpired前置门;到期的最后一帧乃至已退休实例仍执行当前处理器,再统一清理。
  • 到期控制使用末项补位,不再稳定过滤;多个效果后续次序正确保留。
  • EXCLUSIVE定身/沉默使旧项退休,新项追加;不在挂载时立即抹掉旧项。

纯控制池API因此已获得实际行为修复,但不能把它的局部顺序冒充恢复/DoT/控制三个池的完整交错顺序。

HP缓存不能从清理后列表反推

例如原顺序:

[到期回复, DoT 1e20, DoT -1e20, DoT 3]

原预清理cache52是3。移除回复后,末项3填到前面;新列表[3,1e20,-1e20]的float求和可能是0。

反向夹具中,预清理cache为0、清理后列表求和为3。原类型查询先走缓存零门,因此本帧不重新扫描出3;下一帧才重算新顺序。这会真实影响本帧HP,不只是存档排版不同。

新增NativePeriodicCache保存7、124、52的原unit-manager缓存,配合当前来源数值/顺序的校验记录:

  • 计算使用清理前已推进时钟的效果。
  • 类型扫描仍使用清理后的当前列表。
  • 来源变化使旧校验记录失效,不把旧缓存硬套到新来源。
  • 上批clear-source重求值之后,保持旧缓存并更新校验记录,直到下一次manager重算。
  • 旧的Stats组合表仍作兼容与来源一致性检查,不把装备原始合计当成原unit-manager缓存。

v36保存缓存、来源校验记录;数组深复制。旧v35缺缓存时保持null,不声称能恢复从未保存的清理前总和。

原modifier路径还存在一个差异:7AFF79先丢掉寄存器值,7AFF86重载先前float存储。倍率为1并不能证明modifier指针不存在。若两种可能在时长属性求和上产生不同结果,当前明确报periodic_unity_modifier_cache_pending,不猜一条分支。

验证和边界

1623条核心断言通过,含真正HP变化、缓存零门、下一帧重算、v36逐字节重放、缓存数组不别名、来源替换失效、零delta眩晕、阻止激活、最后帧击退和控制末项补位。

Godot构建零警告零错误;三个headless实际主场景回归通过:

  • BOW_N01/RIFLE_N01/CANNON_N01:真实装备、HIT、控制、正墙阻挡和斜墙切向运动。
  • GREATHAMMER_U03持续死亡夹具:一次经验/死亡通知、原击杀回血proc。
  • 原普通HIT/回血/重放路径。

这些不是像素对拍。DoT主场景继续使用显式安装效果夹具,不证明正式武器挂载已开放。

相关Python回归327项通过,结果见build/mixed_effect_frame_python.log。扩大检查时修正了一条仍使用1415旧清单的断言;当前导出与独立构造审计均为1419,并增加逐件键集合比较。538条直接EFFECT、333条已支持控制定义、205条未降低效果的统计没有放宽。

主要产物还有mixed_effect_frame_core.log、mixed_effect_frame_build.log、mixed_effect_frame_audit.log、native_mixed_effect_tick_oracle/results.json,以及mixed_control_world/mixed_periodic_world/mixed_direct_world各自的run.log。

必须继续的接线

  1. 保存并维护三个池的共同顺序;在HIT中精确追加各类实例,在EXCLUSIVE及到期时保留原位置/补位。
  2. 将控制处理、预清理缓存、清理、HP/死亡和力输出放进统一事务,替换Godot目前分开的控制/周期命令。不能只把两个函数调换顺序。
  3. 对旧混合快照保留顺序未知,不能按TYPE排序猜回去。
  4. 正式TYPE52挂载条件、owner-skill/modifier、其他dynamic及UNITTHEME等后续内容继续。

构造审计仍为1053/1419;319处理/上下文阻塞、47基础缺口、0意外构造失败。没有放宽TYPE52准入。main原地工作,未提交,默认warp_autosave.json哈希仍为9840fe858b6e311c73f8c2d4ed49912d59d71365f6278392811730e012d32a7f。