From 67a62e3390c432b43eceefb2cd21a9fe82a4d00b Mon Sep 17 00:00:00 2001 From: shenlei Date: Tue, 22 Sep 2026 18:28:41 +0900 Subject: [PATCH] docs(port-plan): data-source switch from m2dev assets to 40250 (batch 2D) Records the root/uiscript/locale comparison: npclist, msm contents and motion/combo registration match; msm location differs; item_proto and mob_proto use a different record layout and TEA instead of XChaCha20, so proto.cpp cannot read them; pack contents not yet compared. Co-Authored-By: Claude Opus 5 --- audit/remediation-roadmap.md | 1 + docs/PORT-PLAN.md | 34 ++++++++++++++++++++++++++++++---- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/audit/remediation-roadmap.md b/audit/remediation-roadmap.md index d1cd80ad..6a1125a7 100644 --- a/audit/remediation-roadmap.md +++ b/audit/remediation-roadmap.md @@ -18,6 +18,7 @@ python3 .agents/skills/metin2-40250-parity-audit/scripts/port_map.py queue --lim | 1 | 删除只被自身测试引用的 `project/*_system.gd` 与其 `test_*_parity.gd`,清除 manifest 中对应证据 | 完成 2026-09-22(106+106 个文件) | | 2 | P0 角色/移动单元,移植到 `extension/src/port//`(并行 worktree) | 未开始 | | 2P | CPython 2.7.18 静态编入 libmtgodot(macOS → Android APK → iOS),见 `docs/PYTHON-EMBED-EVAL.md` | 未开始(Android 独立程序已验证 b02c49bb) | +| 2D | 数据源切到 40250:msm 路径、proto(TEA + `TItemTable`)、EPK 解包比对、切资源根,见 `docs/PORT-PLAN.md` 第 5 节 | 未开始 | | 3 | P1 战斗/技能 → P2 游戏阶段封包 → P3 物品;Python 层按 2P 的结论进行 | 未开始 | | 4 | `NEEDS_LIVE` 真服验证批 | 未开始 | diff --git a/docs/PORT-PLAN.md b/docs/PORT-PLAN.md index 6fa40ee0..55713038 100644 --- a/docs/PORT-PLAN.md +++ b/docs/PORT-PLAN.md @@ -24,7 +24,7 @@ metin2-client 是 40250 Windows 客户端的跨平台版本(macOS / Windows / | --- | --- | --- | | 2026-09-22 | **逻辑层按 40250 结构移植**:C++ → C++,文件名、类名、方法名、成员名、语句顺序都保持一致 | 能逐文件机械核对,不再"找差异" | | 2026-09-22 | **UI 走内嵌 CPython 2.7.18**(方案 A),原样运行 40250 的 `root/*.py` 和 `uiscript/`,只移植 C++ 模块 | 脚本无需改动;macOS 和 Android 真机均已验证,见 `docs/PYTHON-EMBED-EVAL.md` | -| 2026-09-22 | UI 参考源是 40250 的 `Client/Eternexus/root`,**不是**仓库里的 `assets/root`(m2dev 版本) | 两者有实质差异 | +| 2026-09-22 | 数据源统一改为 40250(`Client/Eternexus` 的 root/uiscript/locale,以及 `Client/pack` 的资源),**不再用**仓库里 m2dev 版本的 `assets/root`、`assets/uiscript`、`assets/locale` | 两者有实质差异,见第 5 节 | | 2026-09-22 | 现有 `project/ui/*.gd`(60 个文件,依据的是错误版本的脚本)不再维护,由 Python 层取代 | — | ## 3. 三个层和代码位置 @@ -63,6 +63,7 @@ extension/third_party/cpython-2.7.18/ # 静态库(2P 批次 | — | 内嵌 Python Android 真机验证 | 完成(b02c49bb) | | 2 | P0 角色/移动单元照抄到镜像文件;第一个单元负责建立 `port/`、`platform/` 和 CMake 目标 | **下一步,未开始** | | 2P | CPython 2.7.18 编进 libmtgodot:macOS → Android APK → iOS | **下一步,未开始**,可与 2 并行 | +| 2D | 数据源切到 40250(第 5 节的 4 步) | **下一步,未开始**,可与 2、2P 并行;2P 跑 40250 脚本前必须完成 | | 3 | P1 战斗/技能 → P2 游戏阶段封包 → P3 物品;Python 层(`PythonLauncher` → 窗口系统 → `*Module.cpp`) | 未开始 | | 4 | `NEEDS_LIVE` 真服验证 | 未开始 | @@ -88,7 +89,32 @@ extension/third_party/cpython-2.7.18/ # 静态库(2P 批次 4. 先用桩 C++ 模块在 APK 进程里跑通 `system.py` → `prototype.RunApp()`(对照结果:74 个模块中 66 个加载成功,引导期调用 33 个 C++ 函数) 5. 同样的流程在 iOS 上跑一遍 -## 5. 当前进度 +## 5. 数据源切换:m2dev assets → 40250 + +现在的渲染和逻辑读的是 `assets/`,这是从 m2dev 的包解出来的。2026-09-22 与 40250 `Client/Eternexus` 逐项对比的结果: + +| 数据 | 读取方 | 与 40250 的差异 | 处理 | +| --- | --- | --- | --- | +| `root/npclist.txt` | `mob_view.gd`、`m2_client.cpp` | 相同 | 无 | +| 8 个 `*.msm`(种族模型、挂点、染色) | `equip_model.gd`、`player_view.gd` | 内容相同,位置不同:m2dev 在 `root/msm/_.msm`,40250 在 `root/_.msm`(`LoadLocalRaceData("warrior_m.msm")`) | 查找列表加上 40250 的位置 | +| `playersettingmodule.py` 的动作注册(`SetGeneralMotions`、`__LoadGame*Ex`)和连击表 | `motion_registry.gd`、`net_play.gd` | 相同 | 40250 的文件是 CP949 + CRLF,切换后跑一遍解析测试 | +| `playersettingmodule.py` 的特效注册 | 暂无 | 40250 多了 `EFFECT_LEVELUP_*_FOR_GERMANY`、`EFFECT_EMPIRE+1..3`,少了 `EFFECT_AGGREGATE_MONSTER` | 移植特效时按 40250 | +| `atlasinfo.txt`、`grpblk.txt` | — | 相同 | 无 | +| `uiscript/uiscript` | 现有 `project/ui/*.gd` | 40250 有 94 个,m2dev 有 80 个;共有的 71 个中,去掉空白差异后有 11 个不同(建角/选角/密码/信使/公会等) | 由 2P 直接运行 40250 的 uiscript,不单独处理 | +| `item_proto` | `proto.cpp` | **读不了**:40250 每条 156 字节(`TItemTable`),m2dev 236 字节;40250 用经典 TEA(32 轮,`0x9E3779B9`),m2dev 用 XChaCha20 | 按 40250 移植 | +| `mob_proto` | `proto.cpp` | **读不了**:每条 255 字节 vs 335 字节,加密同上 | 按 40250 移植 | +| `item_list.txt` | `item_list.gd` | 177 行不同(m2dev 有 dummy 条目等);40250 放在 `locale/en/`,m2dev 在 `locale/common/` | 按 40250 路径读取 | +| `locale_interface.txt`、`itemdesc.txt`、`skilldesc.txt`、`skilltable.txt` | UI、技能表 | 20 行 / 2 行 / 2 行 / 位置不同 | 按 40250 路径读取 | +| 模型、贴图、地图(PC、Monster、Outdoor 等) | 渲染 | **未核对**:40250 是经典 `.eix/.epk` 包 | 见第 3 步 | + +切换步骤(批次 2D): + +1. msm 查找路径加上 `root/_.msm`。 +2. proto 读取按 40250 移植:`EterBase/tea.cpp`、`GameLib/ItemData.h` 的 `TItemTable`、`CPythonNonPlayer` 的 mob 表,放进镜像文件,替换 `extension/src/proto/proto.cpp` 里的 m2dev 格式。 +3. 移植 40250 的 EPK 读取(`EterPack/EterPack.cpp`),解出 `Client/pack`,与 `assets/` 抽样比对模型/贴图/地图;有差异的以 40250 为准。 +4. 资源根切到 40250 数据(`MT_ASSETS` 指向解出的目录),跑渲染和解析测试,更新本节状态。 + +## 6. 当前进度 实时数字用 `port_map.py status` 查看。2026-09-22 的状态: @@ -98,7 +124,7 @@ extension/third_party/cpython-2.7.18/ # 静态库(2P 批次 | python | 4890 | 0(其中 `Client/root` 的 3350 个在 2P 完成后记为 `N_A`,属于原样运行) | | platform | 2229 | 0 | -## 6. 换机器后的环境准备 +## 7. 换机器后的环境准备 目录布局(路径都相对 `~/Work/mt/`,工具按相对路径查找): @@ -129,4 +155,4 @@ python2.7 .agents/skills/metin2-40250-parity-audit/scripts/py_embed_spike.py --o tools/py_embed_android/build-and-run.sh # 可选:连接 Android 真机复核 ``` -然后按第 4 节的"下一步"继续,一个单元完成后在第 4、5 节更新状态并提交。 +然后按第 4 节的"下一步"继续,一个单元完成后在第 4、6 节更新状态并提交。