Files
mtgodot-poc/audit/contracts/function-inventory.md
T
shenleiandClaude Opus 5 a989b8f19b chore: delete 106 unreachable *_system.gd and their parity tests
These files were loaded only by their own test_*_parity.gd and never by
the runtime (transitively checked, incl. client_phase_integration_system).
Removes 76 manifest implementation/evidence references across 18
contracts; contract docs get a note that conclusions based on them are
void. Live systems kept: chest, consumable, item_attr, metin_socket,
whisper_chat.

Full headless suite: no new failures (7 failing + 5 headless-hanging
render tests are identical before the deletion).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 17:51:52 +09:00

91 lines
18 KiB
Markdown

# 40250 全功能审计合同清单
## 目的与范围
本文件把 `ClientVS22/source` 中可达的客户端行为,按“外部可观察功能”而不是按源文件拆成稳定合同。每个合同都必须继续追踪完整调用链:触发条件、前置检查、分支、算法/单位、状态写入顺序、动作或资源事件、协议副作用、失败/中断/清理。
参考范围:
- `../40250/Server Client TMP4/ClientVS22/source/UserInterface`
- `../40250/Server Client TMP4/ClientVS22/source/GameLib`
- `../40250/Server Client TMP4/ClientVS22/source/EffectLib`
- `../40250/Server Client TMP4/ClientVS22/source/EterLib`
- `../40250/Server Client TMP4/ClientVS22/source/EterGrnLib`
- `../40250/Server Client TMP4/ClientVS22/source/PRTerrainLib`
- `../40250/Server Client TMP4/ClientVS22/source/MilesLib`
- `../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`,不能静默算作已兼容。
`MAPPED` 只表示两边入口已经定位,`UNMAPPED` 表示尚未找到当前实现或参考映射,`PARTIAL` 表示已经发现差异。任何新合同都必须先进入 `audit/manifest.json`,再开始实现或验证。
## 合同总表
| ID | 功能 | 参考入口 | 当前入口 | 初始状态 |
|---|---|---|---|---|
| `lifecycle.bootstrap_phase_host` | 启动、阶段属主、窗口和应用生命周期 | `PythonApplication*`, `UserInterface.cpp`, `PythonApplicationProcedure.cpp` | `client_main.gd`, `app_flow.gd`, `app_lifecycle.gd`, `intro_*_phase.gd` | MAPPED |
| `network.login.phase_flow` | 登录、握手、选人、加载、进入游戏阶段 | `PythonNetworkStreamPhaseLogin/HandShake/Select/Loading/Game.cpp` | `classic_session.cpp`, `m2_client.cpp`, `app_flow.gd`, `net_play.gd` | MAPPED |
| `network.character_select.create_delete` | 角色列表、创建、删除、改名、选人 | `PythonNetworkStreamPhaseSelect.cpp`, `PythonNetworkStreamPhaseLoading.cpp`, `PythonCharacterManager.cpp` | `classic_parser.cpp`, `classic_session.cpp`, `char_select_screen.gd`, `intro_create_phase.gd` | MAPPED |
| `network.packet_dispatch_protocol` | 包头、分帧、阶段分派、未知包和发送顺序 | `Packet.h`, `PythonNetworkStream.cpp`, `NetPacketHeaderMap.cpp`, `EterLib/NetStream.cpp` | `classic_stream.cpp`, `classic_parser.cpp`, `wire_classic.h`, `net_stream.cpp` | MAPPED |
| `network.security_encoding` | 握手、序列号、加密、编码和定长字符串 | `EterBase/cipher.cpp`, `PythonNetworkStreamPhaseHandShake.cpp`, `EterLocale/StringCodec.cpp` | `secure_cipher.cpp`, `classic_cipher.cpp`, `text_codec.h`, `net_stream.cpp` | MAPPED |
| `network.reconnect_warp` | 断线、换图、跨服重连和旧会话清理 | `PythonNetworkStreamPhaseGame.cpp`, `PythonNetworkStreamPhaseLoading.cpp`, `NetworkActorManager.cpp` | `m2_client.cpp`, `classic_session.cpp`, `game_scene.gd`, `net_play.gd` | MAPPED |
| `network.error_timeout_server_state` | 登录错误、超时、频道/服务器状态和恢复 | `AccountConnector.cpp`, `ServerStateChecker.cpp`, `PythonNetworkStreamPhaseLogin.cpp` | `auth_client.h`, `channel_status.gd`, `serverinfo.gd`, `app_flow.gd` | MAPPED |
| `world.entity_spawn_state_sync` | Actor 创建、追加信息、VID 重用、状态同步 | `NetworkActorManager.cpp`, `PythonNetworkStreamPhaseGameActor.cpp`, `InstanceBase.cpp` | `entity_store.cpp`, `net_world.gd`, `remote_player_view.gd`, `mob_view.gd` | MAPPED |
| `world.map_load_transition` | 地图、区域、地形、加载阶段和场景重建 | `PythonBackground.cpp`, `MapManager.cpp`, `MapOutdoorLoad.cpp`, `AreaLoaderThread.cpp` | `metin2_world.cpp`, `game_scene.gd`, `environment_builder.cpp`, `atlas_ui.gd` | MAPPED |
| `world.npc_drop_actor_spawn` | NPC、怪物、建筑、掉落物和招牌实体 | `PythonNonPlayer.cpp`, `PythonNetworkStreamPhaseGameActor.cpp`, `InstanceBase.cpp` | `entity_store.cpp`, `net_world.gd`, `mob_view.gd`, `ground_items.gd` | MAPPED |
| `world.reset_cleanup` | 换图、死亡、退出和 UI/实体/特效清理 | `PythonApplicationProcedure.cpp`, `PythonEventManager.cpp`, `MapManager.cpp`, `NetworkActorManager.cpp` | `app_flow.gd`, `game_scene.gd`, `net_play.gd`, `entity_store.cpp` | MAPPED |
| `movement.keyboard.motion` | WASD、方向键、停止、转向和移动动作 | `PythonPlayerInputKeyboard.cpp`, `PythonPlayerInput.cpp`, `InstanceBaseMovement.cpp` | `player_controller.gd`, `net_play.gd`, `net_world.gd` | MAPPED |
| `movement.click_collision` | 点地、路径目标、地形/Actor 碰撞和阻挡恢复 | `PythonPlayerInputMouse.cpp`, `InstanceBaseMovement.cpp`, `ActorInstanceCollisionDetection.cpp`, `MapOutdoor.cpp` | `player_controller.gd`, `mouse_controller.gd`, `hit_collision.gd`, `metin2_world.cpp` | MAPPED |
| `movement.remote_sync_state` | 远端移动命令队列、服务器时钟和状态释放 | `InstanceBaseSync.cpp`, `InstanceBase.cpp`, `PythonPlayerEventHandler.cpp` | `entity_store.cpp`, `net_play.gd`, `classic_parser.cpp` | MAPPED |
| `movement.motion_resource_events` | `.msa`/`.msm` 动作、连击窗口、动作事件和速度 | `InstanceBaseMotion.cpp`, `ActorInstanceMotion.cpp`, `ActorInstanceMotionEvent.cpp`, `RaceMotionData.cpp` | `player_view.gd`, `remote_player_view.gd`, `mob_view.gd`, `msa_motion.gd`, `formats/msa.cpp`, `formats/msm.cpp` | MAPPED |
| `combat.attack_combo_damage` | 普攻、连击、命中窗口、伤害和受击 | `PythonPlayer.cpp`, `InstanceBaseBattle.cpp`, `ActorInstanceBattle.cpp`, `ActorInstanceWeaponTrace.cpp` | `net_play.gd`, `player_controller.gd`, `hit_collision.gd`, `damage_effect.gd` | MAPPED |
| `combat.target_selection_rules` | 目标选择、可攻击判定、目标框和安全区 | `PythonPlayerInputMouse.cpp`, `PythonNetworkStreamPhaseGame.cpp`, `InstanceBase.cpp` | `mouse_controller.gd`, `entity_rules.gd`, `target_board.gd`, `target_ui.gd`, `net_play.gd` | MAPPED |
| `combat.death.exp_drop` | 死亡、经验、掉落归属和拾取链路 | `PythonNetworkStreamPhaseGameActor.cpp`, `InstanceBaseBattle.cpp`, `InstanceBaseMotion.cpp` | `net_play.gd`, `net_world.gd`, `entity_store.cpp`, `ground_items.gd` | PARTIAL |
| `combat.flying_projectile` | 飞行物、目标、地形碰撞、命中和回收 | `PythonFlyModule.cpp`, `ActorInstanceFly.cpp`, `FlyingInstance.cpp`, `FlyTarget.cpp` | `fly_object.gd`, `world_shot.gd`, `skill_fx.gd`, `net_play.gd` | MAPPED |
| `combat.affect_status` | 受击、眩晕、击倒、状态旗标和状态图标 | `AffectFlagContainer.cpp`, `PythonNetworkStreamPhaseGameActor.cpp`, `InstanceBaseEffect.cpp` | `combat_status_effect_system.gd`, `hit_reaction.gd`, `entity_store.cpp`, `char_status_ui.gd` | MAPPED |
| `skill.cast.effect_timing` | 技能施法、动作事件、结果和特效时序 | `PythonSkill.cpp`, `PythonPlayerSkill.cpp`, `InstanceBaseEffect.cpp`, `ActorInstanceMotionEvent.cpp` | `player_skill.gd`, `net_play.gd`, `net_world.gd`, `skill_fx.gd`, `fx/effect_player.gd` | PARTIAL |
| `skill.player_ui_cooldown` | 技能栏、快捷键、等级、冷却和禁止条件 | `PythonSkill.cpp`, `PythonPlayerSkill.cpp`, `PythonPlayer.cpp` | `player_skill.gd`, `skill_table.gd`, `ui/skill_ui.gd`, `ui/quickbar.gd` | MAPPED |
| `item.inventory_equipment_state` | 背包、装备栏、物品状态、槽位和穿脱装备 | `PythonItem.cpp`, `ItemData.cpp`, `ItemManager.cpp`, `PythonNetworkStreamPhaseGameItem.cpp` | `inventory_ui.gd`, `item_list.gd`, `equip_model.gd`, `entity_store.cpp` | MAPPED |
| `ui.equipment.tooltip` | 装备查看、属性面板和普通提示框 | `PythonNetworkStreamPhaseGameItem.cpp`, `PythonItem.cpp`, `PythonItemModule.cpp`, `PythonTextTail.cpp` | `view_equipment_ui.gd`, `item_tooltip_view.gd`, `ui_manager.gd`, `inventory_ui.gd`, `shop_ui.gd` | PARTIAL |
| `item.consumable_action` | 使用、堆叠、拆分、快捷使用和消耗品反馈 | `PythonNetworkStreamPhaseGameItem.cpp`, `PythonPlayer.cpp`, `PythonItem.cpp`, `Packet.h` | `consumable_system.gd`, `item_split_system.gd`, `ui/quickbar.gd`, `net_play.gd` | MAPPED |
| `item.drop_pickup` | 地面掉落、拾取、光标、归属和掉落名条 | `PythonNetworkStreamPhaseGameItem.cpp`, `PythonTextTail.cpp`, `PythonPlayerInputMouse.cpp` | `mob_drop_scatter.gd`, `ground_items.gd`, `mouse_controller.gd`, `net_play.gd` | MAPPED |
| `item.refine_socket_costume` | 强化、镶嵌、属性、时装和外观换装 | `PythonItem.cpp`, `ItemData.cpp`, `PythonNetworkStreamPhaseGameItem.cpp` | `item_attr_system.gd`, `item_enchant_system.gd`, `jewelry_socket_system.gd`, `costume_system.gd`, `wardrobe_transmog_system.gd` | MAPPED |
| `npc.dialog_shop` | NPC 交互、普通商店、个人商店和购买流程 | `PythonNonPlayer.cpp`, `PythonShop.cpp`, `PythonNetworkStreamPhaseGame.cpp`, `Packet.h` | `npc_shop_system.gd`, `private_shop_system.gd`, `ui/shop_ui.gd`, `ui/private_shop_ui.gd` | MAPPED |
| `social.chat_text_tail` | 公聊、私聊、聊天气泡、名字尾标和文本布局 | `PythonChat.cpp`, `PythonTextTail.cpp`, `PythonMessenger.cpp` | `chat_tail.gd`, `text_tail.gd`, `text_tail_arrange.gd`, `ui/chat_ui.gd`, `whisper_chat_system.gd` | MAPPED |
| `social.party_guild_messenger` | 组队、公会、好友、Messenger 和徽章 | `PythonGuild.cpp`, `PythonMessenger.cpp`, `PythonCharacterManager.cpp`, `GuildMarkDownloader.cpp` | `party_management_system.gd`, `guild_war_system.gd`, `guild_mark_uploader_system.gd`, `messenger_system.gd`, `ui/party_ui.gd`, `ui/guild_ui.gd`, `ui/friend_ui.gd` | MAPPED |
| `social.exchange_safebox` | 玩家交易、仓库、安全箱和金币确认 | `PythonExchange.cpp`, `PythonSafeBox.cpp`, `PythonNetworkStreamPhaseGameItem.cpp` | `player_trade_exchange_system.gd`, `safebox_storage_keeper_system.gd`, `ui/exchange_ui.gd`, `ui/safebox_ui.gd` | MAPPED |
| `quest.quest_event_navigation` | 任务状态、事件、对话、HUD 和导航提示 | `PythonQuest.cpp`, `PythonEventManager.cpp`, `PythonNetworkStreamPhaseGame.cpp` | `quest_log.gd`, `quest_dialog.gd`, `quest_curtain.gd`, `quest_event_system.gd` | MAPPED |
| `world.dungeon_activity` | 地下城、地图事件、Boss、结果和排行 | `MapManager.cpp`, `GameEventManager.cpp`, `PythonNetworkStreamPhaseGame.cpp`, `PythonQuest.cpp` | `dungeon_state.gd`, `dungeon_result_ui.gd`, `world_boss_system.gd`, `dungeon_ranking_system.gd` | MAPPED |
| `world.fishing_mining` | 钓鱼、采矿、资源采集和水域条件 | `PythonPlayerInput.cpp`, `PythonNetworkStreamPhaseGame.cpp`, `MapOutdoorWater.cpp`, `AreaTerrain.cpp` | `fishing_mining_system.gd`, `fishing_cooking_camp_system.gd`, `mining_refinery_smelt_system.gd` | MAPPED |
| `world.mount_pet_polymorph` | 马匹、宠物、变身和骑乘战斗 | `PythonPlayer.cpp`, `InstanceBaseMotion.cpp`, `ActorInstance.cpp`, `PythonNetworkStreamPhaseGameActor.cpp` | `horse_system.gd`, `horse_combat_system.gd`, `pet_companion_system.gd`, `polymorph_system.gd`, `mounted_combat_skill_system.gd` | MAPPED |
| `render.model_attachment` | Granny 模型、LOD、骨骼、武器、盾牌和发型挂点 | `EterGrnLib/ThingInstance.cpp/.h`, `EterGrnLib/LODController.cpp/.h`, `EterGrnLib/ModelInstance*.cpp`, `GameLib/ActorInstanceAttach.cpp`, `RaceData.cpp/.h`, `ItemData.cpp` | `metin2_model.h/.cpp`, `metin2_anim.cpp`, `gr2_bridge.cpp`, `player_view.gd`, `remote_player_view.gd`, `mob_view.gd`, `equip_model.gd`, `race_spec.gd` | PARTIAL |
| `render.effect_particle_motion` | MDE/MSE、粒子、动作事件挂点和回收 | `RaceMotionData.cpp`, `RaceMotionDataEvent.h`, `ActorInstanceMotionEvent.cpp`, `EffectLib/EffectManager.cpp`, `EffectInstance.cpp`, `ParticleInstance.cpp`, `PythonEffectModule.cpp` | `formats/msa.cpp`, `extension/src/metin2_anim.cpp`, `fx/effect_player.gd`, `fx/mde.gd`, `fx/mse.gd`, `fx/skill_fx.gd`, `fx/effect_registry.gd`, `fx/motion_effect_anchor.gd`, `fx/target_effect_anchor.gd`, `game_scene.gd`, `ui/player_view.gd`, `ui/remote_player_view.gd`, `ui/mob_view.gd`, `net_world.gd` | PARTIAL |
| `world.terrain_water_collision` | 高度、属性阻挡、水面、桥梁、拾取射线和地面贴合 | `MapOutdoor.cpp`, `AreaTerrain.cpp`, `MapOutdoorWater.cpp`, `TerrainDecal.cpp`, `EterLib/AttributeInstance.cpp` | `metin2_world.cpp`, `formats/area_data.cpp`, `formats/attribute_data.cpp`, `water_builder.cpp`, `hit_collision.gd` | MAPPED |
| `world.environment_weather` | 天空、环境、光照、昼夜、雪和天气 | `MapOutdoorRender.cpp`, `MapOutdoorRenderHTP.cpp`, `MapOutdoorRenderSTP.cpp`, `SnowEnvironment.cpp`, `SnowParticle.cpp`, `EterLib/EnvironmentMap.cpp` | `environment_builder.cpp`, `formats/environment.cpp`, `metin2_world.cpp`, `game_scene.gd`, `weather_daynight_system.gd`, `fx/weather.gd` | PARTIAL |
| `ui.input_camera_mobile` | 鼠标、相机、光标、IME、触屏和移动端窗口 | `PythonApplicationCamera.cpp`, `PythonApplicationCursor.cpp`, `PythonPlayerInputMouse.cpp`, `PythonPlayerInputKeyboard.cpp`, `PythonIME.cpp`, `EterLib/Input.cpp` | `game_camera.gd`, `player_controller.gd`, `mouse_controller.gd`, `ui/cursor_manager.gd`, `ui/mobile/*`, `ui/mobile/mobile_window_host.gd` | PARTIAL |
| `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 |
| `extension.current_only_features` | 没有 40250 参考实现的新增玩法和平台扩展 | 无对应 40250 运行时链路 | `*_system.gd` 中的新版副本、离线集市、邮件等 | EXCLUDED |
## 初始审计规则
1. 先完成 `UNMAPPED`/`MAPPED` 合同的静态调用链,再对照现有 `docs/CLIENT-GAP.md` 的历史结论;历史文档不能直接把合同提升为已验证。
2. 每个合同都要建立完整分支表,至少覆盖成功、拒绝、空数据、重复触发、异步乱序、断线/切图、死亡/中断和清理路径。
3. 现有 `project/test_*_parity.gd` 只能作为候选证据;测试通过不等于 40250 算法、资源来源和时序一致。
4. `extension.current_only_features` 只用于记录没有 40250 对应行为的当前端扩展,不能把它们混入 40250 等价率,也不能因为有测试就标记为 40250 兼容。
5. 本清单建立后,每次审计只允许改变对应合同的状态、矩阵、证据和历史;不得删除未完成合同来提高覆盖率。
## 活跃源码覆盖门
- Visual Studio 活跃项目的源码/头文件覆盖由 `.agents/skills/metin2-40250-parity-audit/scripts/audit_source_coverage.py` 生成,结果保存在 `audit/source-coverage.json``audit/reports/source-coverage.md`
- 本轮扫描到 524 个活跃源码/头文件:18 个 StdAfx 构建支持,142 个已在合同 manifest 中逐文件列出,364 个进入按行为合同归属的静态复核队列;当前未归属行为文件为 0。
- `EffectLib``EterGrnLib``MilesLib` 已完成本轮活跃符号和生命周期链静态复核,但仍按实现差异保持 `PARTIAL`;其余 inferred queue 不得因为自动归属而视为已审计。
- 下次审计必须先运行源码覆盖扫描,再从 `inferred_review_queue` 取下一组,补充对应合同的参考文件、符号、分支矩阵和测试证据;只有完成语义核对后才能转为 `reviewed_static_group`
### 2026-09-22 死代码删除
以下文件只被自身测试引用、运行时从不加载,已删除;本文中以它们为实现或证据的结论作废,相关行为需按 40250 源码单元重新移植:`combat_status_effect_system.gd`, `costume_system.gd`, `dungeon_ranking_system.gd`, `fishing_cooking_camp_system.gd`, `fishing_mining_system.gd`, `guild_mark_uploader_system.gd`, `guild_war_system.gd`, `horse_combat_system.gd`, `horse_system.gd`, `item_enchant_system.gd`, `item_split_system.gd`, `jewelry_socket_system.gd`, `messenger_system.gd`, `mining_refinery_smelt_system.gd`, `mounted_combat_skill_system.gd`, `npc_shop_system.gd`, `party_management_system.gd`, `pet_companion_system.gd`, `player_trade_exchange_system.gd`, `polymorph_system.gd`, `private_shop_system.gd`, `safebox_storage_keeper_system.gd`, `wardrobe_transmog_system.gd`, `weather_daynight_system.gd`, `world_boss_system.gd`