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 <noreply@anthropic.com>
This commit is contained in:
shenlei
2026-09-22 18:28:41 +09:00
co-authored by Claude Opus 5
parent 184b631ce8
commit 67a62e3390
2 changed files with 31 additions and 4 deletions
+1
View File
@@ -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-22106+106 个文件) |
| 2 | P0 角色/移动单元,移植到 `extension/src/port/<Lib>/<File>`(并行 worktree | 未开始 |
| 2P | CPython 2.7.18 静态编入 libmtgodotmacOS → Android APK → iOS),见 `docs/PYTHON-EMBED-EVAL.md` | 未开始(Android 独立程序已验证 b02c49bb |
| 2D | 数据源切到 40250msm 路径、protoTEA + `TItemTable`)、EPK 解包比对、切资源根,见 `docs/PORT-PLAN.md` 第 5 节 | 未开始 |
| 3 | P1 战斗/技能 → P2 游戏阶段封包 → P3 物品;Python 层按 2P 的结论进行 | 未开始 |
| 4 | `NEEDS_LIVE` 真服验证批 | 未开始 |
+30 -4
View File
@@ -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 编进 libmtgodotmacOS → 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/<cls>_<m/w>.msm`40250 在 `root/<cls>_<m/w>.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 用经典 TEA32 轮,`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/<cls>_<m/w>.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 节更新状态并提交。