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:

  1. 对象必须是Room Piece。
  2. 字符串精确等于大写RANDOM时返回0xFFFFFFFF。
  3. 否则用685EF0的wcstol(base=0)解析。
  4. 转为无符号索引后与当前视觉数量比较,越界则返回随机哨兵。

因此:

输入原整数解析
0x22
0108
080
2tail2
random0
21474836482147483647
-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正常模式刷新:

  1. 先解析视觉变体,可能消耗同步随机数。
  2. 复制定义的render order/render shadow;FIXEDVARIATION为true才保存选中索引。
  3. 若override非空,先请求override视觉。
  4. 再把COLLISION ENABLED置false。
  5. 调用622C20刷新碰撞状态。
  6. 请求按原列表规则选择的碰撞资源。
  7. 有视觉模型时应用定义+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