持续伤害致死事务、实时装备归属与 v35
2026-09-20。本批将已验证的 53C2F0 致死分派接入实际周期更新,不再只保留一个独立控制算法。当前已表达的角色/装备来源 DoT 能驱动真实 XP、声望、技能点、成长、击杀 proc,以及 Godot 现有怪物死亡通知。TYPE52 正式构造准入仍关闭,不能把本批称为全部持续效果或全部武器完成。
两种死亡顺序继续分开
普通命中:DIE/成长/击杀 proc → XP → fame → 清池。
持续伤害:选择来源/清来源重求值 → XP → fame → 清池 → 单位事件(4,0) → DIE/成长/击杀 proc。
SimPeriodicDeath 调用 NativePeriodicDeath,并让最后的 DIE 复用已有成长/proc 实现,但关闭直接奖励步骤,避免重复结算。测试专门覆盖同次死亡获得经验加成的成长夹具:持续死亡本次 XP 不吃随后获得的加成,下一次击杀才吃到;这与普通命中已验证的顺序不同。
奖励接收者、fame接收者、死亡来源是三个独立字段。最后玩家来源回落不能覆盖实际死亡来源。
实时装备主人,不是施加时的持有者
只读原版 IDA,核对:
| 地址 | 原行为 |
|---|---|
| 577BF0 | +280 controller存在时,直接返回其+40;即使结果为null也不走容器 |
| 7D0240 → 7CADF0 | 没有直接controller时,沿装备+48C → 容器+2C → inventory+14 → controller+40 |
| 585950 | 新装备+280初始化为0 |
| 5800C0 | 设置容器联系时,从容器取controller写入+280 |
| 582CB0/582DE0/57E3C0 | 主人变更及落地/清联系路径 |
| 51BB40 | 从自己开始沿+71C找玩家,不限制为两层 |
新增 NativeEquipmentOwnerSnapshot,将“controller不存在”与“controller存在但character为空”分开保存。普通拾取/移动、角色持有与丢到地面更新这份联系;直接发入背包的持久效果物品也取得实例ID。查询使用当前物品身份及实时容器/持有者,忽略已拾起地面记录的历史别名。
通过原始 EXE 三个完整 getter 的144组机器码实验核对所有空/非空组合,没有用重写的 getter 回调替代原算法。核心另测了装备已在背包、丢弃、转给玩家的从属角色、直接controller空角色,以及旧存档缺失联系的拒绝与回滚。
最后玩家 DoT 来源
563DBC的CCharacter分支才在563E59..563E72更新target+204;装备来源不会借用其bearer写该字段。
实际 HIT 挂载事务现在只在角色来源成功附着、并真实解析到owning player时写 LastPlayerDotSource。已有玩家来源不会被无玩家的来源抹掉。新单位0表示已知空引用,旧存档缺字段保持null未知;致死过程仅在真正需要回落时读取它。
清来源后的缓存间隔
7A8CA0调用7A85C0重求效果值;7A85C0写effect+D4/D8,没有在这里重算所属manager的stat52。
因此清来源后可能出现“效果值已变、manager缓存仍是旧值”的合法间隔。PeriodicSourceCachePending保存这个已知间隔;下一周期按原列表重算并清标志,不以无条件忽略属性不一致代替它。死亡后保存/恢复,再推进尸体周期,已验证缓存和RNG逐字节重放。
当前ClearSource只覆盖没有owner-skill弱引用的已表达TRANSFER路径。effect+48是owner skill,不是effect manager;7A85C0在来源为空且owner skill存在时,会从skill+14重新绑定来源,并可能走技能RNG。这条技能所有者/modifier分支仍需单独接入,不能从“调用了setSource(null)”推出所有效果最终都保持null。
周期事务和存档
非致死周期保留原有工作数组。检测到致死后,在隔离的完整核心状态副本中按单位更新顺序继续,允许奖励、成长、proc影响后续单位。所有接收器和回调成功后才发布:
- HP、周期计时、伤害/自然回复记账和清来源后的缓存;
- 当前奖励池、XP/声望统计、技能书;
- 装备成长、proc技能状态及其回复实例;
- volatile RNG和成长时钟。
提交保留原单位/物品对象身份。第二个目标在fame升阶处失败时,第一个目标已准备的死亡、奖励、随机数和时钟也会回滚。没有失败后倒扣经验的补偿逻辑。
v35新增controller联系、最后玩家DoT来源、待刷新缓存标志;回复效果还保存原始MIN,用来执行原死亡来源候选的slot0条件。旧存档缺失来源不从当前装备栏或初始奖励反推补齐。
致死帧使用较宽的状态副本;本批不宣称已做高密度死亡场景的性能验收。
Godot消费链
AdvanceGrowthClock现在返回已提交的周期死亡事件,技能点修订后通知已有技能树UI。
普通命中和持续死亡共同调用_report_monster_death,先标记DYING,再发已有monster_died、object/LAYOUT逻辑通知和播放原死亡动画。重复事件不能再增加击杀或重复进入掉落通知。持续死亡不会伪装成一个额外的玩家即时命中VFX。
tl2_periodic_reward_world_probe.gd在真实ECHO PASS主场景使用正式装备的2HMACE/GREATHAMMER_U03及原2%击杀回血proc。DoT、HP、等级和种子是明确隔离夹具,没有声称正式武器已自动挂上TYPE52。
实际结果:经验4、击杀1、死亡通知1、原击杀回血proc成功;下一周期继续回血,重复投递死亡事件仍只有一次通知。固定值DoT前无普通HIT抽签,原概率首次合适的小种子为153,未修改概率。原普通HIT/回血/重放场景回归也通过。这些是headless数值/节点/通知验证,不是像素对拍或全地图任务验收。
验证与仍缺内容
1610条核心断言、313项相关Python回归及5项场景契约检查通过;Godot构建零警告零错误,core-sim lint和diff检查通过。原getter144组、此前持续死亡388组及数值核对照均保留。
仍需继续:
- DoT与控制、其他dynamic效果的统一顺序,消除当前混排保护。
- 正式Godot挂载条件、MIMIC/免疫/来源上下文生产者与UNITTHEME表现。
- 尚未表达的passive来源、负回复来源清理、TYPE80来源改写、skill-owned效果及modifier重求值。
- 完整原54E3F0的其余死亡分支,以及XP触发角色升级等独立路径。
因此逐定义审计仍为1419:1053可构造、319处理/上下文阻塞、47基础缺口、0意外构造失败。没有通过放宽准入来提高比例。
主要产物:build/periodic_source_core.log、periodic_source_build.log、periodic_source_python.log、periodic_source_scene_contracts.log、periodic_source_audit.log、periodic_reward_world/run.log、native_equipment_owner_oracle/results.json。
main原地修改,未提交。默认warp_autosave.json未改,SHA256仍为9840fe858b6e311c73f8c2d4ed49912d59d71365f6278392811730e012d32a7f。