原版定义、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:
GUID = -5317514312154082850
FILE = media/models/box/box.mesh
COLLISIONFILE = media/models/box/box.mesh代码仍沿用ModelParameter48命名,不进一步猜它在所有Ogre实体路径中的用途。
别名规则
原路径:6530A0 → 652AB0装载,654C60 → 6528D0查询。
- 读取TILESETALIAS的NAME,装载时转大写。
- PIECE的REPLACEGUID为键,TARGETGUID为替换值。
- 重复替换键记录问题但保留第一条,不覆盖。
- 查询仅在CAN ALIAS允许且上下文非空时进行。
- 上下文查找是wstring有序树比较,不在该入口自行转大写。
- 仅替换一次,不递归追踪替换目标的别名。
当前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个场景变体的全局随机上下文仍未补齐。