port: 2A step 6, port-map re-baseline

Fix the per-function inventory against the clang-derived platform skeleton:
strip comments, accept indented qualified definitions in namespace blocks,
long parameter/initializer lists and all-caps qualified ctors, and skip
constructor initializer entries. Split EterBase by unit: tea/lzo/cipher/
Random/Stl/Timer/Poly become logic, the file/OS units stay platform; drop
the 8 obsolete platform stubs and regenerate audit/slices.

Baseline: logic 3343, python 5175, platform 2091 (10609), 0 done.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
shenlei
2026-09-22 23:21:24 +09:00
co-authored by Claude Opus 5
parent 9a8e11f3dd
commit 220f15b404
16 changed files with 122 additions and 532 deletions
+34 -10
View File
@@ -33,9 +33,9 @@ metin2-client 是 40250 Windows 客户端的跨平台版本(macOS / Windows /
| 层 | 40250 单元 | 做法 | 位置 |
| --- | --- | --- | --- |
| `logic` | `UserInterface/``GameLib/``EterLib` 的网络/计时/文本解析、`EterPack``EterLocale` | 逐文件照抄 C++ | `extension/src/port/<Lib>/<File>.{h,cpp}` |
| `logic` | `UserInterface/``GameLib/``EterLib` 的网络/计时/文本解析、`EterPack``EterLocale``EterBase` 的纯逻辑单元(`tea``lzo``cipher``Random``Stl``Timer``Poly/` | 逐文件照抄 C++ | `extension/src/port/<Lib>/<File>.{h,cpp}` |
| `python` | `root/*.py``uiscript/``UserInterface/*Module.cpp``EterPythonLib/``ScriptLib/` | 脚本原样运行;`*Module.cpp`、窗口系统、`CPythonLauncher` 照抄 | `extension/src/port/<Lib>/` + `extension/third_party/cpython-2.7.18/` |
| `platform` | Direct3D/`Grp*`、Granny、Miles、SpeedTree、特效/地形渲染、Win32 窗口/输入/IME、线程、反作弊 | 适配层,接口与 40250 调用方看到的一致,按可观察输出核对 | `extension/src/platform/` + 现有渲染代码 |
| `platform` | Direct3D/`Grp*`、Granny、Miles、SpeedTree、特效/地形渲染、Win32 窗口/输入/IME、线程、反作弊`EterBase` 的文件/OS 单元(`CPostIt``CRC32``Debug``FileBase``FileDir``FileLoader``MappedFile``TempFile``Utils``error``CRC32``Utils` 里的纯函数在 platform 实现里照抄) | 适配层,接口与 40250 调用方看到的一致,按可观察输出核对 | `extension/src/platform/` + 现有渲染代码 |
```
extension/src/port/UserInterface/InstanceBase.cpp # 40250 同名文件的照抄
@@ -80,7 +80,7 @@ extension/third_party/cpython-2.7.18/ # 静态库(2P 批次
| 0 | 工具:参考根解析、`port_map.py`、构建/测试入口 | 完成(55f733fd、5afd5a4f |
| 1 | 删除运行时不加载的 106 个 `*_system.gd` 及其测试 | 完成(a989b8f1 |
| — | 定下目录结构,评估内嵌 Python;Android 独立程序验证 | 完成(9d0e50de、b02c49bb |
| **2A** | 基础:Win32 类型层、参考公共头的最小闭包、`port_logic` CMake 目标、platform 接口骨架、头文件可编译门禁、port-map 重新基线 | **进行中**(剩 Python 库闭包头、port-map 基线 |
| **2A** | 基础:Win32 类型层、参考公共头的最小闭包、`port_logic` CMake 目标、platform 接口骨架、头文件可编译门禁、port-map 重新基线 | **进行中**(剩 Python 库闭包头,等 2P |
| **2R** | 资源包能力盘点:EPK 类型/密钥/覆盖顺序/路径大小写/移动端交付 | **下一步**,可与 2A 并行(只读分析 + 独立工具) |
| 2P | CPython 2.7.18 编进 libmtgodot,五个平台分别配置和验证 | 2A 之后 |
| 2D | 数据源切到 40250msm 路径、proto、资源根、严格资源测试) | proto 部分在 2A 之后;资源根在 2R 之后 |
@@ -119,11 +119,11 @@ extension/third_party/cpython-2.7.18/ # 静态库(2P 批次
4. `extension/src/platform/` 接口骨架:闭包里出现的平台类(`CGraphicThingInstance``CSoundManager` 等)只声明
40250 调用方用到的方法,先给空实现。
5. 门禁:`port/**` 下每个头文件单独编译通过(header self-containment),序列化结构的 `static_assert` 全部通过。
6. port-map 重新基线(见第 6 节)。
6. port-map 重新基线(见第 6 节)。**已完成**2026-09-22)。
7.`#include` 依赖图生成批次 2 的移植顺序(拓扑序),替换原来"互不共享实现文件即可并行"的假设:共享头文件的单元,
头文件由先做的那个单元负责,后面的单元只能在它合入后开始。
**已完成**`port_deps.py`(显式 `#include` + 按符号解析的 StdAfx 隐式依赖)生成 `audit/slices/2V02V3.json`
`audit/slices/batch2-order.json`。结论:每个切片的头文件闭包约 210 个(其中平台层约 110 个,来自
`audit/slices/batch2-order.json`。结论:每个切片的头文件闭包约 210220 个(其中平台层约 100 个,来自
`ThingInstance.h`/`GrpBase.h` 等);P0 单元里 `InstanceBase``PythonCharacterManager``PythonPlayer`
`PythonPlayerEventHandler` 的头文件互相包含,必须作为一组串行移植,`ActorInstance.cpp` 排在最前。
@@ -175,8 +175,11 @@ extension/third_party/cpython-2.7.18/ # 静态库(2P 批次
- ScriptLib、EterPythonLib、UserInterface 的 StdAfx 会 include Python 头,要等 2P 把 CPython 加进来之后再照抄。
- 已完成(步骤 4):platform 骨架 `extension/src/platform/`,目标 `port_platform`(静态库,链接 `port_logic`
libmtgodot 改为链接它;从 `port/CMakeLists.txt` 加入以共用每个库的编译宏;`port_gate.sh` 构建它)。
- 平台层头文件(同名 40250 `.cpp` 属于 platform 层,见 `port_map.py``LAYER_PATTERNS`共 118 个,对应
`platform/<Lib>/<File>.cpp` 103 个(其余 15 个没有需要定义的东西),1917 个函数桩、146 个静态成员。
- 平台层头文件(同名 40250 `.cpp` 属于 platform 层,见 `port_map.py``LAYER_PATTERNS`)对应
`platform/<Lib>/<File>.cpp` 95 个,1843 个函数桩(步骤 6 把 EterBase 的纯逻辑单元改为 logic 层后,删掉了
`Random``Stl``cipher``lzo``tea``Timer``Poly/Poly``Poly/SymTable` 的 8 个桩文件)。
- 其中 22 个桩对应 40250 只声明、从未定义的函数(如 `CEffectManager::GetRenderingEffectCount``Mutex::Trylock`),
40250 里没有调用方,不算待移植函数。
-`platform_stub.py gen` 生成:用 clang 对门禁编译单元按类名/函数名 `-ast-dump-filter` 导出声明,定义头文件里
声明了但没有定义的成员函数、构造/析构、自由函数和静态成员;返回类型写成尾置形式,使类内嵌套类型在类作用域里解析,
静态成员写成 `decltype(C::x) C::x{};`。已存在的文件不覆盖(除非 `--force`)。
@@ -185,7 +188,8 @@ extension/third_party/cpython-2.7.18/ # 静态库(2P 批次
- 6 个构造函数手工补了与 40250 相同的初始化列表(基类 `CResource(c_szFileName)``CDecal` 的 const 成员)。
- 未覆盖:platform 层 `.cpp` 定义的**逻辑层头文件**成员(`GameLib/MapOutdoorRender*.cpp``MapOutdoorWater.cpp` 定义
`MapOutdoor.h` 的方法等)。这些在对应逻辑单元移植时手工补桩。
- 完成:依赖 Python 的三个库的闭包头(等 2P);port-map 重新基线(步骤 6
- 完成(步骤 6):port-map 重新基线,见第 6 节
- 未完成:依赖 Python 的三个库的闭包头(等 2P)。
| 平台 | port_gate |
| --- | --- |
@@ -290,7 +294,7 @@ extension/third_party/cpython-2.7.18/ # 静态库(2P 批次
实时数字用 `port_map.py status` 查看。
本次方案修订已经重置旧的 6 个完成状态;2A 完成工具和基础目标后再次确认基线:
本次方案修订重置旧的 6 个完成状态;2A 完成工具和基础目标后2026-09-22 重新确认基线:
- 之前"完成"的 6 个函数(`PythonPlayerEventHandler.cpp`)已作废并回退为 `TODO`OnMove/OnMoving/OnStop 的实现在
`net_play.gd`,属于迁移来源;3 个 `N_A`(单例、构造、析构)与"单例归扩展所有"冲突。
@@ -298,7 +302,27 @@ extension/third_party/cpython-2.7.18/ # 静态库(2P 批次
`impl` 指向随包运行的原脚本,`evidence` 要求目标平台的导入/运行证据;单元的 reference hash 与资源来源清单共同证明
运行的是完全相同的字节。`port_map.py`、SKILL 和 schema 已同步支持并把它计入 done。
2026-09-22 基线前的数字(仅供参考):logic 3285 个函数、python 4890、platform 2229,完成数视为 0。
基线(2026-09-22`port_map.py status`):
| 层 | 函数 | 完成 | 备注 |
| --- | --- | --- | --- |
| logic | 3343 | 0 | 1 个 `DIVERGENT``CPythonPlayerEventHandler::OnWaiting` |
| python | 5175 | 0 | 其中 `root/*.py` 3350 |
| platform | 2091 | 0 | |
| 合计 | 10609 | 0 | |
与基线前的数字(logic 3285、python 4890、platform 2229,共 10404)相比的变化:
- 函数清单(`port_map.cpp_functions`)用 platform 骨架的 clang 声明逐个对照后修正:
- 新增 namespace 块内缩进的定义(`EterPythonLib``UI::CWindow` 等窗口类、`CWindowManager``NEffectUpdateDecorator`),
这是 python 层 +285 的主要来源;
- 新增初始化列表或参数表超过 8 行的定义、类名全大写的构造/析构(`CLZO::CLZO``CIME::CIME`);
- 去掉 `/* */` 里注释掉的旧代码(如 `PythonNetworkDatagram.cpp` 整个文件、`GameUtil.cpp` 的碰撞函数)和被误当成函数的
构造函数初始化项(`m_hFM(NULL),`)。
- 核对结果:platform 骨架里的每个函数桩都在清单里,只有 22 个 40250 未定义的声明,以及 namespace/typedef 写法不同的
同一函数(`NEffectUpdateDecorator::CAirResistanceDecorator::__Excute``CSkyObject::TSkyObjectFace``CSkyBox`)除外。
- EterBase 按单元分层(见第 3 节),不再整个库算 platform。`audit/slices/*.json` 已重新生成(`EterLib/Dimm.h` 同时改为
platform)。
## 7. 换机器后的环境准备