layout: restructure into src/ tests/ android/ scripts/ tools/

- extension/src/{port,platform,codepage} -> src/; native_render -> src/host
  (+ dxt, shaders/); libgr2 -> src/gr2; extension/third_party -> third_party
- extension/tests -> tests/port, libgr2/tests -> tests/gr2
- android-native -> android (build.sh, push-client.sh moved in)
- script -> scripts; tools/40250 -> tools/server; oracle -> tools/granny-oracle;
  perf tools -> tools/perf
- all build trees under build/ (native, release, android, port-gate)
- xrender:: CMake aliases -> mt::; port-map ledger impl paths rewritten

No code changes. ctest 15/15, port_gate macos+android PASS, port_map check 0 errors.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
shenlei
2026-09-29 19:08:19 +09:00
co-authored by Claude Opus 5.5
parent 70710477cf
commit a46093104c
2817 changed files with 13728 additions and 13744 deletions
@@ -65,7 +65,7 @@
- `project/combat_fx_test.gd`:攻击锁定、连击段、hit window、命中去重、击退、抗击倒、弓箭 target/shoot 时序。
- `project/combat_parity_test.gd`:攻击锁、伤害数字和受击反馈。
- `project/gamescene_test.gd`:world reset 清理旧弓箭 FLY/CG_SHOOT 队列。
- `extension/tests/net_state_queue_test.cpp`:远端 `FUNC_ATTACK`、`FUNC_COMBO`、`FUNC_SKILL` 到达/动作状态。
- `tests/port/net_state_queue_test.cpp`:远端 `FUNC_ATTACK`、`FUNC_COMBO`、`FUNC_SKILL` 到达/动作状态。
### Active GameLib weapon-trace review
+1 -1
View File
@@ -85,7 +85,7 @@
## Regression evidence
- `extension/tests/net_state_queue_test`:`POINT_EXP.amount` 累计和一次性消费、死亡状态和网络状态队列。
- `tests/port/net_state_queue_test`:`POINT_EXP.amount` 累计和一次性消费、死亡状态和网络状态队列。
- `project/mob_death_drop_test.gd`:怪物死亡目标/HP/名字/影子清理、掉落坐标贴地、owner/拾取/删除。
- `project/combat_parity_test.gd`:防御球、击退阻挡、攻击锁、伤害表现和死亡抗击退相关分支。
- `project/playable_combat_test.gd`:无目标、超距、死亡目标/自身、冷却和断线时不发送错误战斗请求。
+2 -2
View File
@@ -16,7 +16,7 @@
- `../40250/Server Client TMP4/ClientVS22/source/EterPack`
- `../40250/Server Client TMP4/ClientVS22/source/EterLocale`
当前范围:`project/`、`extension/`、`formats/`、`assets/`、`libgr2/` 和 `oracle/` 中会影响运行时行为的代码、资源读取和测试。第三方库、禁用代码、仅构建工具不作为独立 40250 行为合同;如果当前客户端存在没有 40250 对应物的扩展功能,则登记到 `extension.current_only_features`,不能静默算作已兼容。
当前范围:`project/`、`extension/`、`formats/`、`assets/`、`src/gr2/` 和 `tools/granny-oracle/` 中会影响运行时行为的代码、资源读取和测试。第三方库、禁用代码、仅构建工具不作为独立 40250 行为合同;如果当前客户端存在没有 40250 对应物的扩展功能,则登记到 `extension.current_only_features`,不能静默算作已兼容。
`MAPPED` 只表示两边入口已经定位,`UNMAPPED` 表示尚未找到当前实现或参考映射,`PARTIAL` 表示已经发现差异。任何新合同都必须先进入 `audit/manifest.json`,再开始实现或验证。
@@ -67,7 +67,7 @@
| `ui.hud_target_minimap_status` | 角色状态、血条、目标框、小地图、文本尾标和快捷栏 | `PythonTextTail.cpp/.h`, `PythonMiniMap.cpp/.h`, `PythonPlayer.cpp/.h`, `PythonApplication.cpp/.h`, `PythonPlayerEventHandler.cpp`, `InstanceBase*.cpp`, `PythonNetworkStreamPhaseGame.cpp`, `uitaskbar.py`, `uicharacter.py`, `uitarget.py` | `hud.gd`, `net_play.gd`, `net_world.gd`, `ui/char_status_ui.gd`, `ui/target_ui.gd`, `target_board.gd`, `ui/minimap.gd`, `text_tail.gd`, `text_tail_arrange.gd`, `chat_tail.gd`, `ui/ground_items.gd`, `ui/quickbar.gd` | PARTIAL |
| `resource.pack_locale_proto` | EterPack、资源解析、locale、proto、MSA/MSM 和格式转换 | `EterPack/*.cpp`, `EterLocale/*.cpp`, `PythonPackModule.cpp`, `ItemData.cpp`, `RaceDataFile.cpp` | `pack_mount.cpp`, `asset_io.cpp`, `locale.gd`, `proto.cpp`, `formats/*.cpp` | MAPPED |
| `audio.bgm_ambience_3d` | BGM、区域环境音、角色音效、3D 监听器和前后台恢复 | `MilesLib/SoundManager*.cpp`, `PythonSoundManagerModule.cpp`, `GameLib/Area.cpp`, `MapOutdoor.cpp` | `audio.gd`, `bgm_director.gd`, `app_lifecycle.gd`, `formats/area_data.cpp`, `extension/src/metin2_world.cpp` | PARTIAL |
| `lifecycle.platform_release` | Windows/桌面窗口、导出、资源自包含、崩溃和发布门禁 | `MSApplication.cpp`, `MSWindow.cpp`, `PythonApplication.cpp`, `PythonApplicationProcedure.cpp`, `CheckLatestFiles.cpp`, `EterPack/EterPackManager.cpp` | `build.sh`, `build-macos-client.sh`, `build-android.sh`, `export-android.sh`, `project/export_presets.cfg`, `project/client_main.gd`, `project/app_flow.gd`, `project/app_lifecycle.gd`, `project/asset_root.gd`, `project/asset_pack.gd`, `oracle/*` | PARTIAL |
| `lifecycle.platform_release` | Windows/桌面窗口、导出、资源自包含、崩溃和发布门禁 | `MSApplication.cpp`, `MSWindow.cpp`, `PythonApplication.cpp`, `PythonApplicationProcedure.cpp`, `CheckLatestFiles.cpp`, `EterPack/EterPackManager.cpp` | `build.sh`, `build-macos-client.sh`, `build-android.sh`, `export-android.sh`, `project/export_presets.cfg`, `project/client_main.gd`, `project/app_flow.gd`, `project/app_lifecycle.gd`, `project/asset_root.gd`, `project/asset_pack.gd`, `tools/granny-oracle/*` | PARTIAL |
| `extension.current_only_features` | 没有 40250 参考实现的新增玩法和平台扩展 | 无对应 40250 运行时链路 | `*_system.gd` 中的新版副本、离线集市、邮件等 | EXCLUDED |
## 初始审计规则
+1 -1
View File
@@ -73,7 +73,7 @@
- `project/mob_death_drop_test.gd`:掉落坐标/地形高度、Yang 名称、拾取调用和死亡清理通过。
- `project/p2b_test.gd`:掉落节点、proto 名称、多条名条去重、owner 独立名条和颜色通过,但退出仍有 2 个 ObjectDB 泄漏。
- `project/text_tail_arrange_test.gd`:尾标 AABB 和 owner 排布通过。
- `extension/tests/net_entity_test.cpp`、`extension/tests/net_classic_session_test.cpp`:ground add/del/owner 与经典物品包基础布局通过。
- `tests/port/net_entity_test.cpp`、`tests/port/net_classic_session_test.cpp`:ground add/del/owner 与经典物品包基础布局通过。
- 未覆盖:未知 vnum、真实 drop model/effect/sound、模型相交拾取、party + anti-flag 权限矩阵、observer/native action gate、CG_ITEM_PICKUP 后 GC_DEL→ITEM_GET/ITEM_SET 顺序、失败/重复/断线/换图竞态。
## Deep audit round 2026-09-20
@@ -79,9 +79,9 @@
## Regression evidence
- `extension/tests/net_bounds_test.cpp`:验证 inventory/equipment/dragon-soul/belt 有效范围及非法窗口拒绝。
- `extension/tests/net_entity_test.cpp`:验证 Set、Update、Del、socket/attribute、旧装备、扩展 belt,以及空槽 Update 不被错误丢弃。
- `extension/tests/net_classic_session_test.cpp`:验证经典 40250 物品包固定长度、20 号 deprecated 清槽/设物品和 25 号 Update。
- `tests/port/net_bounds_test.cpp`:验证 inventory/equipment/dragon-soul/belt 有效范围及非法窗口拒绝。
- `tests/port/net_entity_test.cpp`:验证 Set、Update、Del、socket/attribute、旧装备、扩展 belt,以及空槽 Update 不被错误丢弃。
- `tests/port/net_classic_session_test.cpp`:验证经典 40250 物品包固定长度、20 号 deprecated 清槽/设物品和 25 号 Update。
- `project/inventory_ui_test.gd`、`project/equip_model_test.gd`:验证 UI 槽位映射、数量显示、拖放和装备模型刷新。
本轮实际执行的自动测试全部退出码通过:`net_bounds_test`、`net_entity_test`、`net_classic_session_test`、`inventory_ui_test.gd`、`equip_model_test.gd`、`item_tooltip_test.gd`、`view_equipment_ui_test.gd`。其中 `view_equipment_ui_test.gd` 仍报告 5 个 ObjectDB 泄漏;这些测试没有覆盖未知 vnum、交易/商店/攻击中门、物品音效、Set2 highlight、Update 双刷新、空槽 Update 的 API 可见性和换图/断线重建。
@@ -29,7 +29,7 @@
- `project/asset_root.gd` / `asset_pack.gd` / `build-macos-client.sh` / `build-android.sh` / `project/export_presets.cfg`
- macOS 脚本将 assets/bgm 复制到 app Resources,Android 使用 `assets.zip`/`asset_index.txt`,AssetRoot 支持环境变量、散文件、包内资源和可执行文件旁资源。
- 当前没有 Windows 导出预设或 Windows GDExtension 构建脚本;资源链也不是 EterPack 的原生 eix/epk/CRC/更新流程,移动端还依赖外部 zip。
- `oracle/*`
- `tools/granny-oracle/*`
- 有 Windows/Wine Granny 对拍工具和文档,但它是测试 oracle,不是客户端发布/崩溃/版本链。
## 分支等价矩阵
@@ -42,7 +42,7 @@
- 节点位置直接读取 C++ 实体坐标;按 `func`、`moving`、`walk_mode`、`dead` 更新远端动作。
- `extension/src/net/classic/classic_session.cpp`
- 将 classic 握手推导出的 `server_frame_ms()` 每帧喂给 `EntityStore`。
- `extension/tests/net_state_queue_test.cpp`
- `tests/port/net_state_queue_test.cpp`
- 覆盖帧门、阈值、技能位、死亡/击倒挂起、顺序、时钟防呆、根运动和 duration fallback。
## Audit findings (2026-09-20)
@@ -86,12 +86,12 @@
## Regression evidence
- `extension/tests/net_state_queue_test.cpp`:服务器帧释放、WAIT 1.0、攻击/技能 50.0、FUNC_EMOTION 100.0、死亡/击倒挂队、FIFO、时钟防呆、根运动和 duration fallback。
- `extension/tests/net_entity_test.cpp`:远端移动命令的 near/far 行为、到达后动作和未知 VID 忽略。
- `tests/port/net_state_queue_test.cpp`:服务器帧释放、WAIT 1.0、攻击/技能 50.0、FUNC_EMOTION 100.0、死亡/击倒挂队、FIFO、时钟防呆、根运动和 duration fallback。
- `tests/port/net_entity_test.cpp`:远端移动命令的 near/far 行为、到达后动作和未知 VID 忽略。
- `project/netplay_test.gd`、`project/movement_parity_test.gd`:上行状态节流和移动预测不回归。
- `project/net_world_remote_action_test.gd`:远端 `FUNC_ATTACK` 使用普通攻击索引 13,`FUNC_COMBO` 保留 `bArg` 连击段,并传递武器动作模式与攻速比例。
- `extension/tests/net_state_queue_test.cpp`:不可取消技能、活动表情、TCP 状态禁用和恢复后的队列释放边界。
- `extension/tests/net_entity_test.cpp`:`GC_SYNC_POSITION` 记录源点、单调 serial、150cm 大位移和技能抑制状态。
- `tests/port/net_state_queue_test.cpp`:不可取消技能、活动表情、TCP 状态禁用和恢复后的队列释放边界。
- `tests/port/net_entity_test.cpp`:`GC_SYNC_POSITION` 记录源点、单调 serial、150cm 大位移和技能抑制状态。
- `project/net_world_remote_action_test.gd`:TEMP_Push 大位移动作、击倒网络门、旧位置起始偏移和动作尾释放。
## Implementation fix round 2026-09-20
+2 -2
View File
@@ -85,9 +85,9 @@
通过的现有回归:
- `extension/tests/net_classic_session_test.cpp` / `build/extension/net_classic_session_test`:4 槽成功列表、强制改名成功、创建失败包兼容、删除码 7 字节边界、普通选人、槽地址连接。
- `tests/port/net_classic_session_test.cpp` / `build/extension/net_classic_session_test`:4 槽成功列表、强制改名成功、创建失败包兼容、删除码 7 字节边界、普通选人、槽地址连接。
- 同一测试还覆盖 legacy 3 槽保持第 4 个空槽、DirectEnter SelectPhase 不发送普通选择包、未知改名 PID 的 `CreateFail(100)`,以及 Select phase 外角色回包被拒绝。
- `extension/tests/net_loopback_test.cpp` / `build/extension/net_loopback_test`:创建/删除/改名的经典 loopback 主路径。
- `tests/port/net_loopback_test.cpp` / `build/extension/net_loopback_test`:创建/删除/改名的经典 loopback 主路径。
- `project/char_create_delete_test.gd`:Godot 选人页 UI 创建、删除、改名和帝国按钮流程。
- `project/test_intro_select_parity.gd`:选人页及删除码 UI 的既有测试。
@@ -66,7 +66,7 @@
- `godot --headless --path project --script channel_status_test.gd`:PASS。
- `MT_PROTOCOL=classic godot --headless --path project --script channel_status_test.gd`:PASS,覆盖 40250 classic 的 206 请求和 210 响应夹具。
- 认证 loopback 成功路径、密码清除、挂起连接 deadline 已在 `extension/tests/net_loopback_test.cpp` 覆盖;classic transport 的同等 deadline/可写门禁在 `extension/tests/net_classic_stream_test.cpp` 覆盖。
- 认证 loopback 成功路径、密码清除、挂起连接 deadline 已在 `tests/port/net_loopback_test.cpp` 覆盖;classic transport 的同等 deadline/可写门禁在 `tests/port/net_classic_stream_test.cpp` 覆盖。
- 当前合同继续 `PARTIAL`:通过的状态包解析测试不能替代 40250 的认证失败、远端关闭、失败通知顺序、count 边界和完整恢复链证据。
## Active UserInterface server-state checker review
+6 -6
View File
@@ -276,7 +276,7 @@ FAIL: in-game peer close keeps the LoginWindow retry owner on the same session
- `extension/src/net/classic/classic_session.h/.cpp`:统一静态 Matrix/Passpod/Panama/HS/XTrap 和动态 HybridCrypt 的 unsupported guard,保留当前 phase owner。
- `extension/src/net/classic/classic_parser.h`:允许 session 记录未处理 header,保持现有诊断队列。
- `extension/src/net/m2_client.cpp`:增加 `optional_security_required` 信号,供 Godot 部署层显示或阻断不兼容服务配置。
- `extension/tests/net_classic_session_test.cpp`:增加动态 HybridCrypt 分帧、显式通知、owner 保留和后续包对齐回归。
- `tests/port/net_classic_session_test.cpp`:增加动态 HybridCrypt 分帧、显式通知、owner 保留和后续包对齐回归。
修复后验证:`net_classic_session_test` PASS。完整 HybridCrypt key/SDB 注入、Panama IV、Matrix/Passpod UI、HS/XTrap response 仍未实现,
因此本分支只关闭“不可见/误断线”的部署前置差异,合同继续保持 `PARTIAL`。
@@ -773,7 +773,7 @@ peer close、旧新 socket 竞态和完整 UI retry 包序仍没有 fixture,
- `extension/src/net/classic/classic_stream.h/.cpp`:增加可选 `on_unknown_header` phase-owner hook;hook 接受时清空 receive burst 并保留连接,未设置或拒绝时保留严格默认行为。
- `extension/src/net/classic/classic_session.cpp/.h`:为 active session 安装统一 unknown-header owner,并增加析构前解绑所有 stream 回调,避免 stream 最终 `Offline` 通知写入已析构的 session 字段。
- `extension/tests/net_classic_session_test.cpp`:加入真实 loopback socket 上的 Loading 未知包回归。
- `tests/port/net_classic_session_test.cpp`:加入真实 loopback socket 上的 Loading 未知包回归。
修复后验证:
@@ -811,7 +811,7 @@ peer close、旧新 socket 竞态和完整 UI retry 包序仍没有 fixture,
修复内容:
- `extension/src/net/classic/classic_session.cpp`:增加 auth stream connect-failure 回调,清理 auth/game transition 标志、记录连接错误并回到 Offline owner。
- `extension/tests/net_classic_session_test.cpp`:加入死端口连接失败、旧 stream 清理、同 session 重试和重新发送单个 `CG_LOGIN3` 的回归。
- `tests/port/net_classic_session_test.cpp`:加入死端口连接失败、旧 stream 清理、同 session 重试和重新发送单个 `CG_LOGIN3` 的回归。
修复后验证:
@@ -846,7 +846,7 @@ peer close、旧新 socket 竞态和完整 UI retry 包序仍没有 fixture,
修复内容:
- `extension/src/net/classic/classic_session.cpp`:抽取统一 active phase-owner unknown-header 回调,并同时安装到游戏/认证 stream;不是针对 header 200 的单包特判。
- `extension/tests/net_classic_session_test.cpp`:加入 `PHASE_AUTH -> unknown application header` 的 live loopback 回归。
- `tests/port/net_classic_session_test.cpp`:加入 `PHASE_AUTH -> unknown application header` 的 live loopback 回归。
修复后验证:
@@ -1176,7 +1176,7 @@ DirectEnter/GC_WARP live 包序和可选安全 runtime 仍未取证,合同继
修改文件:
- `extension/src/net/classic/classic_session.cpp`
- `extension/tests/net_classic_session_test.cpp`
- `tests/port/net_classic_session_test.cpp`
修复后验证:
@@ -1884,7 +1884,7 @@ FAIL: auth success starts game transport before clearing auth transport like 402
- `ClassicSession::pump()` 在认证成功交接中先调用 `m_stream.connect()`,再调用
`m_auth_stream.disconnect()`;共享的 transition guard 仍覆盖两个清理/连接回调,未改变
游戏连接失败、peer close 或登录重试 owner。
- `extension/tests/net_classic_session_test.cpp` 增加真实 loopback 双 transport fixture,
- `tests/port/net_classic_session_test.cpp` 增加真实 loopback 双 transport fixture,
验证 `game:connecting -> auth:offline` 的顺序,并继续接受替换后的游戏连接,覆盖连接成功、
认证清理和旧 transport 边界。
+4 -4
View File
@@ -80,10 +80,10 @@
## Evidence already available
- `extension/tests/net_classic_cipher_test.cpp`:client/server polarity 的 DH2 round-trip、CTR 连续性和新会话密钥差异。
- `extension/tests/net_classic_encstream_test.cpp`:handshake、key agreement、completed、已缓冲密文和 sequence 的 stream happy path。
- `extension/tests/net_text_codec_test.cpp`:12 个中文字符在 24 个 GB2312 字节内 round-trip、13 个字符被拒绝、真实中文名称和 32 字节商店招牌边界。
- `extension/tests/net_classic_session_test.cpp`:角色创建/改名包验证实际写入 GB2312 字节、NUL 结尾和 24 字节边界。
- `tests/port/net_classic_cipher_test.cpp`:client/server polarity 的 DH2 round-trip、CTR 连续性和新会话密钥差异。
- `tests/port/net_classic_encstream_test.cpp`:handshake、key agreement、completed、已缓冲密文和 sequence 的 stream happy path。
- `tests/port/net_text_codec_test.cpp`:12 个中文字符在 24 个 GB2312 字节内 round-trip、13 个字符被拒绝、真实中文名称和 32 字节商店招牌边界。
- `tests/port/net_classic_session_test.cpp`:角色创建/改名包验证实际写入 GB2312 字节、NUL 结尾和 24 字节边界。
- `extension/src/net/classic/sequence_table.h`:32768 项静态表和编译期长度断言;`audit_sequence_table.py` 已逐字节比对 40250 数组,SHA-256 为 `3f6f31964896e712f1f54cb813c7b488b656f700f6ca948ece3313419f876279`。
## Deep audit round 2026-09-20
@@ -74,8 +74,8 @@
## Regression evidence
- `extension/tests/pack_roundtrip_test.cpp`:当前自定义 `.epk` 的加密/压缩、路径归一化、ymir suffix 和 patch 覆盖。
- `extension/tests/proto_test.cpp`、`extension/tests/proto_item_layout_test.cpp`:真实/合成 item_proto、mob_proto、stride 和字段偏移。
- `tests/port/pack_roundtrip_test.cpp`:当前自定义 `.epk` 的加密/压缩、路径归一化、ymir suffix 和 patch 覆盖。
- `tests/port/proto_test.cpp`、`tests/port/proto_item_layout_test.cpp`:真实/合成 item_proto、mob_proto、stride 和字段偏移。
- `formats/tests/msm_test.cpp`、`formats/tests/msa_test.cpp`、`formats/tests/combo_table_test.cpp`、`formats/tests/map_formats_test.cpp`:格式解析与真实资源样本。
- `project/test_chinese_locale.gd`、`project/skill_test.gd`:locale 和技能文本 smoke test。
+1 -1
View File
@@ -24,7 +24,7 @@
- `project/fx/skill_fx.gd`
- `project/fx/effect_player.gd`
- `extension/src/net/entity_store.cpp`
- `extension/tests/net_state_queue_test.cpp`
- `tests/port/net_state_queue_test.cpp`
- `project/combat_fx_test.gd`
- `project/skill_test.gd`
@@ -116,7 +116,7 @@
新增回归:
- `project/net_world_respawn_test.gd`:普通同 VID 重建坐标/朝向、上下马重建保留旧位置但使用新朝向。
- `extension/tests/net_entity_test.cpp`:首次主角注册和重复主角包的 `MainSet` 次数。
- `tests/port/net_entity_test.cpp`:首次主角注册和重复主角包的 `MainSet` 次数。
修复前上述测试分别能够复现普通重建位置/朝向错误、上下马朝向错误以及 `MainSet` 缺失/重复;修复后
`build/extension/net_entity_test` 和 `net_world_respawn_test.gd` 通过。Add2 隐身种族、AdditionalInfo 未命中、旧 Add 字段完整性已在后续修复轮补齐;淡出期间同 VID 重用和主 VID 切换清理当时仍保持 `PARTIAL`。
@@ -134,8 +134,8 @@
新增/扩展回归:
- `extension/tests/net_entity_test.cpp`:Add/Add2/Update 全字段、隐身 Add2、未知 AdditionalInfo、单次 Spawn/Info。
- `extension/tests/net_classic_session_test.cpp`:40250 Add2 全字段、三种隐身 race、未知 AdditionalInfo 和清理。
- `tests/port/net_entity_test.cpp`:Add/Add2/Update 全字段、隐身 Add2、未知 AdditionalInfo、单次 Spawn/Info。
- `tests/port/net_classic_session_test.cpp`:40250 Add2 全字段、三种隐身 race、未知 AdditionalInfo 和清理。
修复前新增回归可复现 state/affect 丢失、Add2 元数据丢失、隐身实体错误出现、unknown AdditionalInfo 半实体和事件计数差异;修复后两个 native 测试均通过。淡出期间同 VID 重用、pending 交错清理、主 VID 切换清理和 Godot 可见性时序仍保持 `PARTIAL`。
+1 -1
View File
@@ -52,7 +52,7 @@
- `project/skybox_test.gd`:通过;CapeDragonHead/DawnMistWood texture-mode 六面天空、云层、scale 和 UV speed 断言通过。
- `project/p9_test.gd`:通过;通用 weather snow/rain/none 粒子开关路径通过,但不是参考雪环境池测试。
- `project/test_weather_daynight_parity.gd`:22 passed、0 failed;仅覆盖 `WeatherDayNightSystem` helper 的默认时相、时间推进、天气预设和信号,不覆盖正式 GameScene 接入或 40250 `.msenv` 渲染。
- `extension/tests/net_entity_test.cpp` / `build/extension/net_entity_test`:通过;覆盖 `GC_CHAT/COMMAND` 的 `xmas_snow 1/0` typed event 顺序。
- `tests/port/net_entity_test.cpp` / `build/extension/net_entity_test`:通过;覆盖 `GC_CHAT/COMMAND` 的 `xmas_snow 1/0` typed event 顺序。
- `project/gamescene_test.gd`:通过;覆盖正式 GameScene 对 eligible map、四张 40250 排除地图和关闭命令的雪开关处理。
- `project/netbridge_test.gd`:通过;确认 `M2Client.weather_changed` 信号已注册。
+1 -1
View File
@@ -87,7 +87,7 @@
- `project/gamescene_test.gd`:通过,验证缺图 fallback、GameScene 装配、主角定位、world reset 和实体镜像;它不证明 40250 的 Leave/Enter 顺序。
- `project/p9_test.gd`:通过,验证小地图、昼夜、天气和 warp signal 接收;它不创建真实 world transition。
- `project/forest_map_render_test.gd`:这是由 `script/forest_map_render_test.sh`/客户端主循环启动的 Node 脚本,不能用 `godot --headless --script` 直接当 SceneTree 测试;本轮直接启动会被 Godot 拒绝,故不得计为通过。
- `project/forest_map_render_test.gd`:这是由 `scripts/forest_map_render_test.sh`/客户端主循环启动的 Node 脚本,不能用 `godot --headless --script` 直接当 SceneTree 测试;本轮直接启动会被 Godot 拒绝,故不得计为通过。
## Deep audit round 2026-09-20
+1 -1
View File
@@ -119,7 +119,7 @@
## Regression evidence
- `extension/tests/net_entity_test.cpp`:map reset 丢弃实体、地面、目标、飞行、飞行目标和特效队列。
- `tests/port/net_entity_test.cpp`:map reset 丢弃实体、地面、目标、飞行、飞行目标和特效队列。
- `project/fly_reset_test.gd`:活动弹道、弹道视觉和爆点视觉在 map reset 后全部消失。
- `project/screen_hp_bar_test.gd`:实体/HP 条的 map reset 清理。
- `project/net_world_reset_test.gd`:模型升级队列、聊天尾标、target/hover 引用和 live actor 的 Loading 清理;修复前失败 3 项,修复后通过。