地图碰撞输入与原版烘焙绑定

2026-09-20。把 ECHO PASS、ACT1 TOWN 的当前转换器实例集合导出为带来源的输入,新增 C# 加载器与原版烘焙输入绑定。不修改正式场景、玩家存档或武器准入条件。

这不是“完整地图 LOS 已接通”:地图选择仍来自当前 Python 转换器,完整原版创建顺序、RNG、属性回放和运行态列表尚未绑定。native_world_ready 与 scene_match_verified 均保持 false。

实际资源核对

地图Room Piece 实例未出现在渲染列表已确定碰撞资源需解析随机外观无 COLLISIONFILE 定义
ECHO PASS3201451273361892
ACT1 TOWN14182352920869

C# 消费者已逐实例加载全部已确定资源,分别对应 103218 / 27745 个源碰撞三角形(重复实例重复计数)。这个统计尚未施加烘焙资格筛选,不能当作最终世界三角形数量。

45 / 23 个未渲染对象不能直接删除:原 5F6250 可以临时显示对象后取得几何,并恢复可见性。相反,CHOICE / THEME / FEATURE 明确丢弃的祖先分支应排除。导出器保留其他隐藏对象及完整祖先属性,不给缺省 BAKE、VISUAL 等字段补假值。

Python 输入导出

代码:tools/build_native_map_collision_inputs.py。

  • 使用与固定场景重建相同的地图条目、逐地图环境主题、区域主题和 manifest RULES.TEMPLATE;本工具采用默认布局 seed,不继承调用进程的临时地图覆盖。
  • 保留展开后的实例 ID、转换器枚举序号、原始属性、祖先链及是否在渲染列表。枚举序号不是原版注册顺序。
  • 记录根 LAYOUT、展开链接、规则模板、转换器、构建器和碰撞目录哈希。记录现有 TSCN 哈希只用于来源追踪,不证明重新展开结果与它相同。
  • FILE 与 COLLISIONFILE 是独立有序列表。碰撞列表长度与视觉列表不同,或视觉只有一项时,可确定碰撞索引 0;长度相等且多项时,只接受明确、有效的规范十进制 VISUAL。
  • 缺省 / RANDOM / 越界 / 非规范 VISUAL 保留待解析;不取转换器显示网格的首项替代原随机选择。
  • MESH OVERRIDE 留给资源生命周期处理;缺失资源、重复 GUID、损坏祖先链和链接读取失败不消失为“无碰撞”。

运行:

powershell
python -m tools.build_native_map_collision_inputs

输出在 build/f2/native_map_collision_inputs/,包含两份 JSON 和解析日志。

C# 绑定与边界

代码:core_sim.io/F2MapCollisionInputs.cs。

加载器检查目录哈希、实例身份、顺序、完整房间覆盖、父节点 / 环和丢弃分支;保存只读属性副本。LoadKnownCollision 是资源预检,不证明运行时实例已成功持有模型。它重新通过目录及原版 VISUAL / 碰撞索引规则验证路径和源哈希,无 COLLISIONFILE 时不回退到视觉网格。

BindBakeInputs 要求调用方完整提供每个实例,并按实际注册顺序传入以下已解析事实:

  • 经过真实 alias 上下文解析的定义 GUID,以及已选定的视觉变体;
  • 实际模型存在性与当前碰撞开关,二者独立;
  • 两个烘焙位、原条件分组分类、NOPATH;
  • 派生旋转、物件自身 stored scale、原碰撞位置 getter 的结果。

不接收一个渲染全局 Transform 来推断所有碰撞参数;尤其 stored scale 不可被父级派生缩放替代。资源几何交给现有 NativeRoomBakeInput / BakeRoomBatch,保留原基础先、条件后两遍及实例内面顺序。绑定过程不消耗 RNG,不私选未决变体。

缺少、重复或外来实例在加载几何前拒绝;绑定失败不发布一份部分完成的输入。已加载但碰撞关闭的模型仍保留几何,烘焙资格由原内核判断。

当前绑定面向已解析的选定资源。动态资源替换中的旧缓存模型、实时装备 BLOCK 列表、独立 Room Piece 列表和完整静态分区仍需通过实际生命周期消费者接入;不能从这份静态报告推断。

验证范围

新增测试 NativeMapCollisionInputChecks 与 tests/test_native_map_collision_inputs.py:

  • 两张图全部已确定资源能实际加载;
  • 隐藏实例保留、丢弃祖先排除、未决变体拒绝;
  • 缺失 / 重复绑定、哈希漂移、读取失败、父链错误被拒绝;
  • 用真实地图实例 ID / 源几何,加上明确标注的运行状态夹具,验证烘焙变换、NOPATH、已加载但关闭碰撞、显式变体和调用方顺序。

最后一组是绑定集成测试,不是原版现场烘焙状态采样或整图遮挡验收。本批不改画面,不以 headless 测试声称视觉一致。

1758 条核心断言、371 项相关 Python 回归通过;Godot C# 构建零警告零错误,coresimlint 通过。Python 回归结果见 build/native_map_collision_regression.log。其他日志为 native_map_collision_core.log、native_map_collision_build.log、native_map_collision_audit.log。

武器构造覆盖仍为 1099 / 1419:273 阻塞,47 缺基础定义 / 创建等级。完整全武器目标未完成,TYPE201 / 204 没有提前放行。

下一项是把原版初始化 / 属性生命周期产生的真实状态填入这些绑定,再组成静态分区、动态碰撞与装备遮挡上下文,接到已验证的世界射线和 proc 查询。

main 原地工作,未提交。默认 warp_autosave.json 的 SHA256 保持 9840fe858b6e311c73f8c2d4ed49912d59d71365f6278392811730e012d32a7f。按 godot-master 将冻结输入、实例状态与数值核心分开,没有以 Godot 物理近似替换原版查询。