Room Piece资源设置与初始化刷新顺序
本批结果
新增NativeRoomResourceLifecycle,区分属性设置阶段和统一初始化阶段:
- 2400组原6234B0正常模式对照一致:资源请求顺序、碰撞启用位、存储变体、同步随机状态及模型参数。
- 24组系统MSVCR100 wcstol参考案例一致:VISUAL数字前缀、截断与溢出处理。
- 1218条核心断言、142项相关Python检查通过;Godot C#构建零warning/error,coresimlint通过。
验证的是给定定义和加载结果下的资源刷新控制流。实际模型加载、别名/错误定义回落、碰撞缓存和场景工厂仍由待接入的宿主提供。 武器构造覆盖维持1053/1419,全武器未完成。
GUID/VISUAL不是立即刷新资源
原路径:
- GUID:4B95C0 → 4B91C0 → 6243E0。
- VISUAL数值setter:4B94D0先写piece+0x170,再调用6243E0。
- 统一初始化:CRoomPieceDescriptor的+0x4C入口4B9A00 → 6234B0。
6243E0更新GUID与定义引用,但末尾调用6234B0的分支受到直接6A4650调用控制。该函数原字节为32 C0 C3,恒返回false。 所以在本发行EXE路径中,设置GUID或VISUAL不会在这里立即抽取视觉变体/重新加载视觉资源。
设置GUID=-1时,旧定义holder不被清空;但有效GUID检查会阻止初始化使用它。EffectiveVisualCount也回到原622BF0的缺定义语义。
GUID定义解析仍有真实的别名和错误资源回落: 6243E0根据关卡上下文调用4DAF30/654C60,后者可能经过别名映射和按需Levelset加载,找不到时返回管理器的错误定义。 本批不拿“字典查不到就返回null”冒充这些行为,INativeRoomResourceHost.ResolveDefinition必须由后续宿主落实。
VISUAL字符串语义
4B9A10:
- 对象必须是Room Piece。
- 字符串精确等于大写RANDOM时返回0xFFFFFFFF。
- 否则用685EF0的wcstol(base=0)解析。
- 转为无符号索引后与当前视觉数量比较,越界则返回随机哨兵。
因此:
| 输入 | 原整数解析 |
|---|---|
| 0x2 | 2 |
| 010 | 8 |
| 08 | 0 |
| 2tail | 2 |
| random | 0 |
| 2147483648 | 2147483647 |
| -2147483649 | -2147483648 |
小写random不是大写RANDOM特判;在视觉数量大于0时,它会走无数字前缀返回0的路径。
NativeRoomVisualCodec目前复现并测试ASCII域,非ASCII的locale行为明确报待补。GUID字符串的685F20使用64位十进制wtoi64,不能套用这条32位VISUAL解析;本批生命周期接口接收已解析long GUID。
整数参考使用C:/Windows/SysWOW64/msvcr100.dll的wcstol,路径与hash保存在报告。未attach当前游戏核对其实际已加载CRT模块,不能把这个范围外事实写成已验证。
MESH OVERRIDE的两个时机
4B98F0 → 6243B0:
- 保存override字符串。
- 非空时立即调用622FB0换视觉。
- 这一步不直接禁用碰撞。
- 清空字符串时没有立即恢复旧视觉,也没有重新启用碰撞。
后续6234B0正常模式刷新:
- 先解析视觉变体,可能消耗同步随机数。
- 复制定义的render order/render shadow;FIXEDVARIATION为true才保存选中索引。
- 若override非空,先请求override视觉。
- 再把COLLISION ENABLED置false。
- 调用622C20刷新碰撞状态。
- 请求按原列表规则选择的碰撞资源。
- 有视觉模型时应用定义+48参数。
对照保留了视觉请求时碰撞位仍为true、后续刷新及碰撞请求时为false的顺序。 不能提前把所有请求都视为禁用碰撞后的状态。
没有override时,视觉路径来自本次选中的FILE;碰撞路径按前批确认的COLLISIONFILE数量规则选择。视觉与碰撞仍共用同一次变体结果。
宿主边界
后续:真实定义/别名/碰撞数据宿主已接预载数据及请求名称缓存规则;PAK按需加载、引用计数和实际视觉后端仍未完成。
INativeRoomResourceHost负责:
- 定义/别名/错误回落解析。
- 视觉与碰撞模型的真实缓存、释放和加载结果。
- 碰撞状态刷新。
- 调试碰撞材质和模型参数处理。
HasVisualModel由真实加载结果更新,不能仅用“文件存在”代替。 ModelParameter48沿用原字段偏移命名:5936F0保存它并转发给Ogre实体,不臆测成伤害属性或其他游戏数值。
代码还保留了碰撞显示模式的分支,但本批原生oracle仅验证正常模式;调试材质和实体子网格行为不能据此宣称验收完成。
原生对照范围
tools/native_room_resource_oracle.c运行原6234B0、622DF0和同步MWC随机路径。 在以下边界放置可观察适配:
- 622FB0视觉请求。
- 622360碰撞请求。
- 622C20碰撞状态刷新。
- 5936F0模型参数。
- 设置读取入口。
这不是完整模型I/O探针。适配器提供明确的加载成功/失败结果,以覆盖后续分支;原文件和运行中的游戏未被改动。
2400组覆盖视觉/碰撞列表数量0..4、有效/无效GUID、指定/随机/越界存储索引、FIXEDVARIATION、override、碰撞开关和模型加载结果。
EXE SHA256: 186472c3057b38f4cdff4696959a943c396ae6166995f7418997b5ea853e8a5e。
文件与下一步
- core_sim/NativeRoomResources.cs。
- build/native_room_resource_oracle/results.json。
- build/native_room_resource_core.log:1218断言。
- build/native_room_resource_python.log:142检查。
NativeRoomResourceState目前是阶段性加载事实,尚未交给持久场景注册表,不新增存档字段。 下一步把上述宿主接到真实定义/模型/碰撞数据,再接对象工厂、父节点关联和全局初始化顺序。289个场景变体仍需完整加载前随机状态和调用顺序,未标为解决。
按godot-master分层,本批未改地图画面和默认存档;main原地工作,未提交。默认存档hash保持: 9840fe858b6e311c73f8c2d4ed49912d59d71365f6278392811730e012d32a7f。