Room Piece 碰撞相关属性:原 setter 到实时实例

2026-09-20。将 COLLISION ENABLED、BAKE、NOPATH、CAN ALIAS 四个属性接入已验证的 NativePropertyDispatch,再用于实时碰撞实例。保留原字节值、getter 长度及回调顺序,不把四个属性当成普通 Godot bool 赋值。

本批仍是完整地图初始化链的一部分,不代表所有描述符、默认值、视觉资源加载和世界注册已完成。全武器构造覆盖保持 1099 / 1419,273 阻塞、47 缺基础定义 / 创建等级,目标未完成。

IDA 核对

本批重新读取原数据库 E:/Torchlight 2/Torchlight2.exe.i64。EXE SHA256 为 186472c3057b38f4cdff4696959a943c396ae6166995f7418997b5ea853e8a5e。

4B9AF0 按下列顺序注册四个属性,均为 kind=6、flags=0:

索引属性SetterGetter行为
97COLLISION ENABLED4B9290 → 622DC04B92B0 → 622BE0写 piece+184 字节;随后调用导航贡献刷新 622C20
98BAKE4B92E04B9320先写 +190 / +191,再检查模型动画;getter 只读 +190
110NOPATH4B93504B9370只写 +192 字节
111CAN ALIAS4B93A04B93C0只写 +193 字节

偏移为十六进制。四个 getter 报告的长度均为 1 字节;通用属性分发器负责规范化后的填充。

注意三处非直觉行为:

  • setter 使用输入内存的最低一个字节。DWORD 0x100 写入 false,而 0xFE 保持原字节 254,并在条件分支中被视为 true。
  • 碰撞开关即使值没变,也会执行 refresh=true 的调用;不能增加“值相同就直接返回”的优化。
  • NOPATH 和 CAN ALIAS 本身没有导航刷新、资源重载或 GUID 元数据刷新副作用。CAN ALIAS 的新值影响之后真正发生的定义解析。

622C20 是导航贡献更新,不是射线世界成员注册;本批没有再次混淆这两条链。

BAKE 与模型动画

4B92E0 的操作顺序:

text
VisualBakeRaw = input_byte
CollisionBakeRaw = input_byte
if actual_model_has_animations:
    if VisualBakeRaw != 0: CollisionBakeRaw = 1
    VisualBakeRaw = 0

622220 先检查实际视觉模型槽,再由 593720 检查模型动画数据指针与其中的计数。不能凭同目录有无 ANIMATION 文件、显示网格名字或文件存在性替代这个谓词。

NativeRoomProperties 接收必须明确提供的模型动画查询。查询抛出缺输入异常时,保留原前缀写入,但整个 staging load 必须失败 / 丢弃;不会把异常解释为“没有动画”。

该所有者也提供 BeforeVisualLoad / AfterVisualLoad 事件入口,以保留 NEVERBAKE、加载抑制和加载后动画影响两个烘焙位的既有规则。完整视觉加载器向这些入口自动投递所有原事件仍需继续接入;本批不将它们的存在宣称为完整初始化完成。

代码与接线

  • core_sim/NativeRoomResources.cs:增加 Raw 字节存储,现有 bool API 作为非零投影;SetCollisionEnabled 保留写入后可选刷新顺序,不加载 / 释放碰撞模型。
  • core_sim/NativeRoomProperties.cs:两个烘焙位的实例所有者与四项原属性 binding。
  • NativeRoomPropertyBindings.TryApply 接受真实 BINLAYOUT 属性 payload;要求已验证的 4 字节 wire 形状。其他属性明确返回未处理,由调用方继续分发,不静默宣称整个 Room 已加载。
  • 这些 binding 使用原注册顺序、kind=6 和 flags=0;getter 返回一个字节,由通用分发器处理长度和副本。
  • Godot 实时碰撞探针已改用属性分发器驱动碰撞开关、BAKE、NOPATH 和 CAN ALIAS,不再直接写 bool 来绕开回调。

本批实例数据仍归 scene-loading owner 管理。未把它作为玩家 / 怪物持久状态塞进现有快照;完整动态地图状态的保存 / 重建属于后续接线,快照仍为 v41。

原代码与实际输入验证

tools/build_native_room_property_oracle.py / native_room_property_oracle.c 在独立 32 位进程执行原 setter、getter、622DC0 和真实模型动画谓词。

  • 4 属性 × 8 种模型 / 动画指针与计数组合 × 256 个低字节 = 8192 组
  • 验证全部五个相关状态字节、getter 值 / 长度、刷新次数与回调所见的已写入字节。
  • 输入 DWORD 带非零高位,明确检测“整个 DWORD 非零就转换 true”的错误。
  • 仅 622C20 用刷新次数 / 可见字节的边界 spy;其导航算法属于已有独立原生对照,本批不重复声称执行了实际地图网格更新。
  • C# 全部匹配,mismatches=0。所有原文件、harness 和构建器来源哈希已记录。

另从两张图的实际冻结 BINLAYOUT 读取属性,按 wire 原顺序投递:

  • 根文件含 2818 个原始 Room Piece 记录,应用了 970 次本批四类属性写入。
  • 数量与另一独立二进制报告读取器一致。
  • 这是视觉初始化之前的属性切面测试,不执行其他属性 / 对象;根文件记录数不等于展开所有 Layout Link 后的 4619 个转换器实例。

独立 Godot 实例检查扩展为 24 项,包括非规范原字节、相同开关值再次刷新、NOPATH 的真实命中 surface,以及 CAN ALIAS 不立即刷新定义。探针实例的 owner 不是 CLevel,所以真实 NativeRoomNavigation.Refresh 在无 level 门退出;没有将正式地图网格更新替换为空操作。

GPU 生命周期证据更新与局部视觉核验

全量回归曾因 NativeRoomResources.cs 的来源哈希变化拦下旧 GPU 证据。已实际重跑 tools/run_native_visual_backend_probe.py:26 项资源加载 / 替换 / 材质 / 碰撞缓存 / 销毁检查通过,无 Godot 错误或泄漏,生成了本轮截图与来源哈希。未通过手改哈希认可旧结果。

查看本轮 build/native_visual_backend/rock.webp、foliage.webp,均为短边 512、quality 80 的预算图像。岩石有实际纹理,灌木叶片裁切后可见背景,未见实心矩形底板。本批没有调整这些资产或光照。

局部 Taste Receptor Atlas 核验(仅单资产预览):

Receptor分数观察
COMP-FOCAL-SINGLE2单一资产焦点明确
COMP-SAFE-EDGE2未裁掉资产边缘
COMP-NEG-SPACE2四周留白足以辨认轮廓
COMP-VALUE-GROUP1灌木下部与暗背景的明度分离偏弱
LIGHT-KEY-FILL1预览背光叶片偏暗,形体仍可辨
LIGHT-BLOOM-ABUSE2没有泛光抹平边缘

10 / 12,83.3%,B;无 0 分项 / 硬门触发。TYPE、HUD、动效不在这些帧中,不评分。没有本批必须修改的画面问题;用于正式美术验收时,应在实际场景光照下另核对背光细节,不把这里的受控预览光照替换到正式地图。

结果、产物与继续项

1788 条核心断言、378 项相关 Python 回归通过;Godot C# 构建零警告 / 零错误;coresimlint 通过。完整回归见 build/native_room_properties_regression.log。

产物:

  • build/native_room_property_oracle/results.json
  • build/native_room_properties_core.log
  • build/native_room_properties_build.log
  • build/native_room_properties_audit.log
  • build/native_live_room_result.json / native_live_room_godot.log

下一项仍是组合剩余属性、资源加载事件、条件分组分类与原注册顺序,供实际地图的静态分区、动态房间和装备遮挡使用。尚未把整张地图标为完整,也没有提前放行依赖世界查询的攻击型 proc。

按 godot-master 将属性状态与显示层分离。main 原地工作、未提交;未 attach / 修改原游戏进程。默认 warp_autosave.json SHA256 保持 9840fe858b6e311c73f8c2d4ed49912d59d71365f6278392811730e012d32a7f。