- item_tooltip_view.gd: 新增 avoid_rect 属性,tooltip 与装备窗口重叠时自动推到左侧 - inventory_ui.gd: 悬停装备时传入窗口矩形作为避让区域 - 包含其他累积的功能开发和测试文件
17 KiB
17 KiB
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 |
初始审计规则
- 先完成
UNMAPPED/MAPPED合同的静态调用链,再对照现有docs/CLIENT-GAP.md的历史结论;历史文档不能直接把合同提升为已验证。 - 每个合同都要建立完整分支表,至少覆盖成功、拒绝、空数据、重复触发、异步乱序、断线/切图、死亡/中断和清理路径。
- 现有
project/test_*_parity.gd只能作为候选证据;测试通过不等于 40250 算法、资源来源和时序一致。 extension.current_only_features只用于记录没有 40250 对应行为的当前端扩展,不能把它们混入 40250 等价率,也不能因为有测试就标记为 40250 兼容。- 本清单建立后,每次审计只允许改变对应合同的状态、矩阵、证据和历史;不得删除未完成合同来提高覆盖率。
活跃源码覆盖门
- 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。