原版流血武器与 UNITTHEME 运行时(v39)
2026-09-20。接入有限持续时间、TRANSFER、TYPE52、UNITTHEME=BLEEDING 的原版武器效果。继续使用已验证的接收门、原生复制/RNG、共享动态列表、周期 HP 与死亡事务;本批没有另写一套流血伤害公式。
结果与真实覆盖
- 构造审计:1419 个定义中,1099 可构造、273 被明确阻塞、47 缺基础定义/创建等级、0 构造异常。上批为 1053/319/47/0,本批实际新增 46 把。
- 上批以 TYPE52 为首阻塞的 53 把,46 把完成构造,其余 7 把继续被后续处理器拦截(TYPE204 增加 6,TYPE80 增加 1)。不是删除检查后宣布全部完成。
- 当前首阻塞:TYPE201=88、204=29、107=25、108=22、NG+上下文=22、109=21、79=18、106=16、152=11、74=9、80=6、60=4、177=1、183=1。
- 47 个缺项仍含 46 个非生成 BASE/模板,以及已索引但缺创建等级的 STAVES/STAFF_N00。
- 构造覆盖不等于逐定义装备资源、全角色、全特效和完整战斗表现均已验收。
原版静态证据
来源:Torchlight2.exe,SHA256 186472c3057b38f4cdff4696959a943c396ae6166995f7418997b5ea853e8a5e。读取现有 IDA 数据库;本批未 attach 游戏、修改 EXE/PAK 或运行原版控制台。
| 入口 | 本批使用的事实 |
|---|---|
| 661630 / 661A70 | THEME 与 PARTICLE 定义加载;FILE、COUNT、UNITTYPE、NOT_UNITTYPE、ATTACHES、FOLLOWS、BONE |
| 7AFE00 / 5150E0 | 活动效果的主题指针去重,再与角色已应用主题同步;武器上的 TRANSFER 模板不因此显示在持有者身上 |
| 53F1D0 | 先做包含/排除类型检查;COUNT=0 实际产生 1 个实例;同主题不重复创建 |
| 51C030 | 固定名称骨骼绑定;没有该骨骼时回退根节点,而不是选择随机骨骼 |
| 5520F0 | 附着/跟随更新与 UNITTHEMEOFFSET;死亡主题移除还有其他标志条件,不是单看 HP=0 |
| 53C2F0 | 周期致死清除候选效果的来源引用,不等于清除所有动态效果 |
对应 .c/.asm 保存在 build/research_weapon_families/。反编译中的错误参数名不作为字段语义依据。
原 MEDIA/UNITTHEMES/BLEEDING.DAT:CHARACTER,排除 NOBLEED,Bip01 Neck,COUNT=0,ATTACHES=true,FOLLOWS=false。NEEDSTOSAVE 虽在 DAT 中出现,本批所查主题加载入口未见读取,不据此另造存档规则。
数值与表现的边界
- 数值继续由 NativeDotEffects/NativeDynamicEffects/NativePeriodicHealth 执行;NOBLEED 仅阻止 PARTICLE,不让受击者免疫 TYPE52。
- StatEffect.UnitTheme 贯穿词缀生成、物品复制、效果源替换、两次 transfer copy、动态实例和快照。schema 升到 39;旧档缺失字段保持 null,不从物理伤害推断为 BLEEDING。
- 每个受击者每个主题只保留一套粒子。两个流血伤害实例独立;第一层到期不重建主题,最后一层到期才停发。
- 清除来源不会删除主题。普通尸体上的仍存活主题可继续到效果到期。碎尸、模型销毁、移除主题/后继主题等全套原版分支尚未宣称完成。
- 显示层只读 DotThemeFrame,以核心 ClockMs 识别回退。不能使用所有实例中最大的 elapsed 识别回退,因为最老叠层到期会自然导致它下降。
- ATTACHES 读取实际 Skeleton3D 的同名骨骼变换;缺固定骨骼回退根变换。已导出怪物继承后的非零 UNITTHEMEOFFSET。普通显隐随实际节点;节点消失/地图替换/时间回退会清理引用。
- 停止循环 GPU 发射后显式按最大粒子寿命排空;不依赖循环系统不会发出的 finished 信号。
原版资源转换
tools/build_unit_theme_visuals.py 调用现有 vanilla_parser.build_arbiter.emit_effect。产物为 vanilla/unit_theme_visuals.json 与 effects/UNITTHEME_BLEEDING.tscn,包含主题和 LAYOUT 源文件 SHA256。
本批使用当前解析器的 blood_on 配置:Splashes 与 Blood 两层,均 Alpha。保留原纹理、寿命、速率、尺寸、力和方向配置;不人为放大、不改成 additive、不同时发射绿色 censor 变体。
这是已有 blood_on 配置的接入,不是完整血液开关、所有主题或所有粒子行为逐帧对拍。导出后需 Godot 资源 import,首次运行曾因新 PNG 尚未 import 而被测试捕获,完成导入后通过。
验证
- core_sim.tests:1671 条断言通过;新增原版物品 materialize、两次复制、主题去重、到期、source clear、类型继承过滤与快照恢复测试。
- C# 构建 0 warning / 0 error;coresimlint 通过。
- 338 项相关 Python 回归通过,包含新主题资源/运行时测试与全部原有 334 项。
- 实际 Vulkan/Forward+ ECHO PASS 探针:原 2HAXE/GREATAXE_U02 经 Drop → PickUp → UiMoveItem → 原动作 HIT。没有注入 DoT。
- HIT 造成 211 伤害;之后 0.1 秒 HP 从 99789 到 99788.1875。实际动态实例的来源/主题进入正式共享更新,存档恢复后继续运行逐字节一致。
- 实际导入模型骨骼索引 13 的名称为 Bip01 Neck。两次 HIT 产生两层伤害、一套主题;移动、旧层到期、末层到期和排空检查通过。
- 隔离 NOBLEED 类型夹具验证不显示粒子但仍扣血;低 HP 夹具验证致死来源清除、普通尸体存活主题与自然到期;独立显示夹具验证缺骨回退、节点删除与时间回退。
探针:torchlight-2-poc/tl2_bleeding_world_probe.gd。日志:build/unit_theme_visual/run.log、unit_theme_core_tests.log、unit_theme_regression.log;审计:build/weapon_readiness.json。
局部 GPU 视觉核验
按 godot-master 要求查看三张短边 512 的 WebP:bleeding_start、bleeding_moved、bleeding_expired。第一次摄影裁切了角色上部,因此调整了仅测试使用的镜头中心/尺寸后重新截图。正式镜头与美术不改。
最终可见红色血滴/血雾,移动后跟随;排空后消失,没有黑色矩形或屏幕级背景层。夜雨仍会干扰细小血滴辨识。本检查是挂接与透明度局部核验,不是原版逐帧一致性评分。
适用局部 receptors:COMP-SIL-ACTION=2、COMP-SAFE-EDGE=2、LIGHT-PART-READ=1(夜雨干扰)、LIGHT-PART-OVER=2、LIGHT-BLOOM-ABUSE=2、MOT-TRAIL-SOUP=2、MOT-GHOST=2。13/14=92.9%,局部 A;零分项无。HUD/文字已在测试中隐藏,相关 typography/UI 项 N/A。未触发适用 hard gate。
安全与继续项
在 main 工作,未提交,保留已有工作树改动。默认 warp_autosave.json SHA256 仍为 9840fe858b6e311c73f8c2d4ed49912d59d71365f6278392811730e012d32a7f;测试只写 user://tests。
下一批优先追踪 TYPE201(88 把)与 TYPE204(29 把)的原版宿主注册/触发链;仍保留 LINK_NAME、STATMODIFY、不支持的主题和非本批 TYPE52 形态的拒绝。所有武器目标未完成。