原版定义、Levelset别名与碰撞数据宿主

本批结果

本批把已验证的资源生命周期接口接到真实定义/别名/碰撞数据:

  • 导出4492个定义的render order、render shadow和模型参数。
  • 读取17套Levelset别名表,1065条PIECE记录按原顺序保留;3条重复键不覆盖首条,得到1062条有效映射。
  • 使用实际Error定义作为缺定义回落。
  • F2NativeRoomResourceHost能解析别名目标并加载其已验证碰撞缓存。
  • 1224条核心断言、145项相关Python检查通过;Godot C#构建和coresimlint通过。

视觉模型构建和实时碰撞注册仍需真正的后端;本批没有用测试后端冒充实际Godot模型加载。全武器构造覆盖保持1053/1419。

定义参数+48的来源

此前保留为ModelParameter48的字段已确定来源:

654A40读取Levelset根的COLLISIONTYPE,缺省为ROOM。与ROOM精确相等时传16,否则传32;654220将该值存入定义+48。 当前解包的34份Levelset DAT都走ROOM分支。

同时:

  • RENDERSHADOW缺省false,存定义+52。
  • RENDERORDER缺省-1,存定义+56。
  • 名称转大写后为ERROR的定义保存为管理器错误回落项。

实际Error位于MEDIA/LEVELSETS/ERROR.DAT:

text
GUID = -5317514312154082850
FILE = media/models/box/box.mesh
COLLISIONFILE = media/models/box/box.mesh

代码仍沿用ModelParameter48命名,不进一步猜它在所有Ogre实体路径中的用途。

别名规则

原路径:6530A0 → 652AB0装载,654C60 → 6528D0查询。

  1. 读取TILESETALIAS的NAME,装载时转大写。
  2. PIECE的REPLACEGUID为键,TARGETGUID为替换值。
  3. 重复替换键记录问题但保留第一条,不覆盖。
  4. 查询仅在CAN ALIAS允许且上下文非空时进行。
  5. 上下文查找是wstring有序树比较,不在该入口自行转大写。
  6. 仅替换一次,不递归追踪替换目标的别名。

当前3条重复记录位于INFECTED_ESTHSHRINE和TUNDRA_SNOW,后续目标恰好与首条相同;导出仍保留重复记录及first-wins结果。

测试遍历全部1062条映射,并验证关闭CAN ALIAS时不替换、不同大小写上下文不会被移植端自动合并。

预载数据与原按需读取的边界

F2RoomMetadata使用当前已解包定义的预载集合。 原654C60先查已加载定义,再查GUID到包文件的索引,可能按需加载Levelset,最后返回错误定义。

因此本宿主的错误回落只相对于这个明确的预载集合成立。未复原PAK按需读取时机,也没有据此证明“文本目录缺少的定义在PAK中必然不存在”。

每条元数据保留源DAT和SHA256,与前批碰撞定义catalog的来源hash核对后才组合为NativeRoomResourceDefinition。

碰撞请求缓存

622360的请求名称规则不能按直觉重写:

  • 先比较新请求与缓存名称,相等立即返回,发生在COLLISION ENABLED检查之前。
  • 不同请求会释放旧碰撞模型引用。
  • 请求为空时,缓存名称仍保持旧值。
  • 不同的非空请求若碰撞禁用,缓存名称被设为空,不加载。
  • 不同的非空请求且启用时,使用该请求的碰撞几何。

因此“清空后再次请求原名称”可能被旧名称比较挡住;“同名请求时碰撞已经禁用”也不会在这个函数里自动清掉原模型引用。实际碰撞启用和空间注册仍由其他路径控制。

F2NativeRoomResourceHost保留这些名称/引用规则,读取F2RoomPieceCollision.LoadCollisionPath的真实几何。 未知或不支持的解包资源在提交本次数据宿主变化前抛缺输入错误,不被当作已证明的原版缺包失败。这是明确的未支持路径,不是模拟原包错误日志的结果。

共享CCollisionModel引用计数、可变过滤状态和PAK加载失败过程未在本批完整迁移。

视觉与场景后端仍是显式依赖

INativeRoomVisualBackend是必需接口,没有默认“文件存在就成功”的实现:

  • SetVisual的实际结果决定HasVisualModel。
  • RefreshCollision负责实时注册/撤销。
  • 调试材质与模型参数操作交给实际后端。

本批测试使用明示的视觉后端夹具,只验证数据宿主与真实碰撞文件的连接,不作为视觉模型或地图画面的验收。

每个F2NativeRoomResourceHost对应一个Room Piece;定义和元数据目录可以共享。后续场景宿主必须管理模型引用、动画事实、双烘焙状态和实际注册顺序。

文件与验证

  • tools/build_native_room_metadata.py。
  • build/f2/native_room_metadata.json。
  • core_sim.io/F2RoomMetadata.cs。
  • core_sim.io/F2RoomPieceCollision.cs新增按原路径读取碰撞缓存入口。
  • build/native_room_metadata_core.log:1224断言。
  • build/native_room_metadata_python.log:145检查。

原版取证:6528D0、652AB0、6530A0、6532E0、654A40、654C60、654220和622360。 源EXE SHA256: 186472c3057b38f4cdff4696959a943c396ae6166995f7418997b5ea853e8a5e

按godot-master的数据/表现分层,本批不改现有画面;main原地工作、未提交、未attach原游戏。默认存档hash保持: 9840fe858b6e311c73f8c2d4ed49912d59d71365f6278392811730e012d32a7f

下一步继续真实视觉模型后端、对象工厂/父节点关联及初始化,再接世界分区与完整攻击型触发技能。289个场景变体的全局随机上下文仍未补齐。