docs(09-12): complete legacy interface replacement audit (section C + summary)

- Add section C: replaceability of all 67 core.* deduplicated members with call sites
- Add summary table, five-class counts, and five-batch refactor ordering
- Machine-readable counts: ENTRY=99, DIRECT=0, ADAPT=25, ALT=40, NONE=8, TBD=26
- Read-only: no source changes (baseline-diff guard green)
This commit is contained in:
unanmed 2026-10-11 17:29:43 +08:00
parent 1118545879
commit d90220841e
2 changed files with 245 additions and 0 deletions

View File

@ -0,0 +1,120 @@
---
phase: 09-minimum-browser-runnable
plan: 12
subsystem: legacy-migration-audit
tags: [read-only, legacy-replacement, core-members, audit, documentation]
requires:
- 09-LEGACY-INTERFACES-AUDIT.md
provides:
- 09-LEGACY-REPLACEMENT-AUDIT.md
affects:
- legacy 去 legacy 改造定序(后续计划)
tech-stack:
added: []
patterns: [read-only audit, baseline-diff read-only guard, grounded file:line anchors]
key-files:
created:
- .planning/phases/09-minimum-browser-runnable/09-LEGACY-REPLACEMENT-AUDIT.md
- .planning/phases/09-minimum-browser-runnable/09-12-SUMMARY.md
modified: []
decisions:
- "判定文档命名 adopt OI-1 default: 09-LEGACY-REPLACEMENT-AUDIT.md"
- "五类分类 adopt OI-2 default: 可直接替换 / 有替代但需适配 / 有替代方案 / 无替代 / 待定"
- "条目粒度 adopt OI-3 default: A-1..A-7 逐行 32 条 + C 去重 67 成员 = 99 条"
- "只读守卫 adopt OI-4 default: 执行前基线对比(仅新增 .ts/.tsx 判红)"
- "搜索范围 adopt OI-5 default: packages/** + packages-user/**(排除 @motajs/legacy-*),src/ 仅参考"
- "可直接替换判据 adopt OI-6 strict: 语义等价 + 无行为变化 + 无能力缺失 + 无契约破坏"
metrics:
duration: "~35m"
tasks: 3
files: 2
completed: 2026-10-11
actuals:
tokens: 7282
tasks: 2
commits: 2
status: complete
---
# Phase 9 Plan 12: legacy 接口可替代性统计 Summary
**One-liner:** 只读判定文档——对 09-11 台账的 32 条残余 legacy 接口与 67 个 `core.*` 去重成员逐项判定可替代性(0 可直接替换 / 25 有替代但需适配 / 40 有替代方案 / 8 无替代 / 26 待定),并给出五批改造顺序建议。
## What Was Built
- **`09-LEGACY-REPLACEMENT-AUDIT.md`(新增,唯一判定产物):**
- **§0 判定口径与范围**:输入(A 条目 32 + C 去重成员 67)、替代搜索范围(所有非 legacy 包;排除 `@motajs/legacy-*`)、D-46 三问判定口径、五类分类定义(OI-2)、统一 per-entry schema、六项机器可读计数键、只读声明。
- **§A 残余 legacy 接口的可替代性(32 条)**:A-1 跨包依赖 10 / A-2 全局 `core` 1 / A-3 单例 `client` 3 / A-4 patch 3 / A-5 UI 运行时符号 7 / A-6 `Mota` 全局 3 / A-7 回退层 5。
- **§C 经 `core.*` 调用的接口的可替代性(67 成员)**:逐成员一行,附调用点 `file:line`,替代依据全部取自非 legacy 包真实代码。
- **§汇总** 五类分类表 + A/C 分布小计 + 六项机器可读计数。
- **§改造顺序建议** 五批分组(有替代方案批量 → 按主题的有替代但需适配 → UI/素材批量 → 无替代补设计 → 待定待裁定)。
- **`09-12-SUMMARY.md`(本文件)。**
## Inputs & Scope
- **输入台账:** `.planning/phases/09-minimum-browser-runnable/09-LEGACY-INTERFACES-AUDIT.md`(A-COUNT=32;C-COUNT=228;去重成员 M=67)。
- **替代搜索范围:** `packages/**`(`@motajs/system`、`@motajs/client-base`、`@motajs/audio`、`@motajs/common`、`@motajs/render` 等)与 `packages-user/**`(`@user/data-state`、`@user/data-base`、`@user/data-common`、`@user/client-base`、`@user/client-modules` 等);`src/` 仅作参考。**排除** `@motajs/legacy-ui` / `@motajs/legacy-common` / `@motajs/legacy-system` 及其它 `@motajs/legacy-*`。
## Judgement Criteria (D-46 three questions)
对每条判定:① 是否已提供替代接口;② 是否有现成替代方案;③ 是否可无痛替换。分类取五类之一。
## Five-Class Counts
| 分类 | 计数 | A 节 | C 节 |
| --- | --- | --- | --- |
| `可直接替换` | 0 | 0 | 0 |
| `有替代但需适配` | 25 | 4 | 21 |
| `有替代方案` | 40 | 21 | 19 |
| `无替代` | 8 | 1 | 7 |
| `待定` | 26 | 6 | 20 |
| **合计 (ENTRY-COUNT)** | **99** | **32** | **67** |
机器可读键:`ENTRY-COUNT: 99`、`DIRECT-COUNT: 0`、`ADAPT-COUNT: 25`、`ALT-COUNT: 40`、`NONE-COUNT: 8`、`TBD-COUNT: 26`(五类之和 = 99,自洽)。
## Output Path
- `.planning/phases/09-minimum-browser-runnable/09-LEGACY-REPLACEMENT-AUDIT.md`
## Read-only Confirmation (D-49)
- 本计划唯一写入:`09-LEGACY-REPLACEMENT-AUDIT.md` 与 `09-12-SUMMARY.md`(+ 仓库外临时基线 `%TEMP%/opencode/gsd-09-12-baseline.txt`)。
- **零** `.ts` / `.tsx` 改动:基线(执行前 3 项既有用户并发改动)对比后无**新增**源码改动;未改任何既有注释、未改 `files_modified` 外文件。
- 用户的并发改动(`packages-user/data-state/**`、`09-CONTEXT.md`)未被暂存 / 提交。
## Task 0 Ruling (blocking-human already satisfied)
Task 0(`checkpoint:decision` `gate="blocking-human"`)由用户回复「可以执行」并采纳默认处置,已闭环。**OI-1..OI-6 最终裁定(全部采纳默认):**
| 开放项 | 裁定 |
| --- | --- |
| OI-1 产出文档命名 / 路径 | 采纳默认:`09-LEGACY-REPLACEMENT-AUDIT.md`(连字符命名法) |
| OI-2 分类类别口径 | 采纳默认五类:可直接替换 / 有替代但需适配 / 有替代方案 / 无替代 / 待定 |
| OI-3 条目粒度 | 采纳默认:A 逐行 32 条 + C 去重成员 67 条 = 99 条基线 |
| OI-4 只读守卫机制 | 采纳默认:执行前基线对比(仅新增 `.ts`/`.tsx` 改动判红) |
| OI-5 搜索范围边界 | 采纳默认:`packages/**` + `packages-user/**`(排除 legacy),`src/` 仅参考 |
| OI-6 `可直接替换` 判据严格度 | 采纳默认(严格):语义等价 + 无行为变化 + 无能力缺失 + 无契约破坏 |
## Deviations from Plan
None - plan executed exactly as written.
## Verification Results
- **Task 1 门禁:** 只读基线采集 OK(3 项既有改动);`REPLACE-A GATE` OK(§0 + §A + 五类定义 + 锚点有效);`READONLY` OK(无新增 `.ts`/`.tsx`)。
- **Task 2 门禁:** `REPLACE-C GATE` OK(§C + §汇总 + §改造顺序建议 + 全部 67 成员 + 六项计数自洽 + `client-base`/`client-modules`/`packages/` 锚点 + 锚点文件存在且行号在范围内);`READONLY` 最终 OK。
- 未使用 `pnpm check:type` / `pnpm build` / 全仓 TS 诊断数门禁。
## Known Stubs
None.
## Threat Flags
None.
## Self-Check: PASSED
- 文档存在且含 §0 / §A / §C / §汇总 / §改造顺序建议。
- 99 条目、六项计数自洽(99 = 0+25+40+8+26)。
- 全部 `file:line` 锚点指向真实存在且行号在范围内的文件。

View File

@ -132,3 +132,128 @@ ID | 类别 | 原接口/成员 | 替代接口 + file:line | 替代方案 + file:
| A-7-5 | A-7 | `fallback/load.ts`(旧版素材加载兼容) | 无 | `TextureManager` packages-user/client-base/src/material/manager.ts:37 | 有替代方案 | 素材加载改由 `TextureManager` 承担(`fallbackLoad` 即适配层);回退层可去除 |
**A 节分类计数:** `可直接替换` 0 / `有替代但需适配` 4 / `有替代方案` 21 / `无替代` 1 / `待定` 6(合计 32)。
## C. 经 core.* 调用的接口的可替代性
### C.1 `core.*` 去重成员逐成员判定(M = 67)
> 每条 `ID` = `C:<member>`;`类别` = `C`;`理由` 末附该成员调用点 `file:line`(取自 `09-LEGACY-INTERFACES-AUDIT.md` §C-2)。替代依据一律取自**非 legacy 包**。
| ID | 类别 | 原接口/成员 | 替代接口 + file:line | 替代方案 + file:line | 可替换性 | 理由 |
| --- | --- | --- | --- | --- | --- | --- |
| C:actions | C | `core.actions` | 无 | 无 | 待定 | 新 action 系统(packages-user/client-modules/src/action/)为渲染端动作表,未检索到 legacy `core.actions._clickGameInfo_openComments` 的等价注册表;须确认新动作注册是否覆盖。(调用点 packages-user/client-modules/src/action/hotkey.ts:511) |
| C:arrayToRGBA | C | `core.arrayToRGBA` | 无 | 无 | 无替代 | 非 legacy 包中未检索到 `arrayToRGBA`;仅 legacy-ui 与类型声明引用。(调用点 packages-user/client-modules/src/ui/title.tsx:122) |
| C:calValue | C | `core.calValue` | 无 | 无 | 无替代 | 表达式求值工具未迁移到非 legacy 包。(调用点 packages-user/client-base/src/components/textboxTyper.ts:907) |
| C:chooseReplayFile | C | `core.chooseReplayFile` | 无 | 无 | 待定 | 录像文件选取 / 导入未检索到替代;须确认新录像系统是否覆盖文件选取。(调用点 packages-user/client-modules/src/ui/settings.tsx:214) |
| C:clearLocalForage | C | `core.clearLocalForage` | 无 | `SaveSystem.startGlobalTransaction` packages-user/client-base/src/save/system.ts:214 | 有替代方案 | 清空全局存储可由新存档系统事务完成。(调用点 packages-user/client-modules/src/ui/settings.tsx:573) |
| C:confirmRestart | C | `core.confirmRestart` | 无 | 无 | 待定 | 重开确认 UI 未检索到替代;须确认新 UI 是否提供该流程。(调用点 packages-user/client-modules/src/action/hotkey.ts:508) |
| C:control | C | `core.control` | 无 | 无 | 待定 | legacy `core.control` 为巨型逻辑模块,新架构已拆分至各系统,逐一映射未完成;须系统性梳理。(调用点 packages-user/client-modules/src/ui/settings.tsx:584) |
| C:debug | C | `core.debug` | 无 | `logger` packages/common/src/logger.ts:229 | 有替代方案 | 调试输出改由新 logger 承担。(调用点 packages-user/client-modules/src/action/hotkey.ts:514) |
| C:doRegisteredAction | C | `core.doRegisteredAction` | 无 | 无 | 待定 | 注册动作派发未检索到替代;须确认新事件 / 动作系统覆盖。(调用点 packages-user/client-modules/src/ui/main.tsx:109) |
| C:doSL | C | `core.doSL` | 无 | 无 | 待定 | 存读档组合操作(含 autosave / replay 分支)未检索到等价入口;须设计新入口。(调用点 packages-user/client-modules/src/ui/settings.tsx:172) |
| C:download | C | `core.download` | 无 | 无 | 待定 | 浏览器下载工具未检索到替代;须确认新工具层。(调用点 packages-user/client-modules/src/ui/settings.tsx:221) |
| C:drawThumbnail | C | `core.drawThumbnail` | 无 | `drawThumbnail`(组件内本地实现) packages-user/client-base/src/components/thumbnail.tsx:50 | 有替代方案 | 缩略图绘制已本地化到 thumbnail 组件内。(调用点 packages-user/client-base/src/components/thumbnail.tsx:75) |
| C:drawTip | C | `core.drawTip` | 无 | `TipStore.drawTip` packages-user/client-base/src/components/tip.tsx:158 | 有替代方案 | 提示绘制改由 `TipStore` 承担。(调用点 packages-user/client-modules/src/ui/save.tsx:531) |
| C:encodeRoute | C | `core.encodeRoute` | 无 | `ReplaySystem` packages-user/data-common/src/replay/system.ts:21 | 有替代方案 | 录像编码由新录像系统承担。(调用点 packages-user/client-modules/src/ui/settings.tsx:228) |
| C:extractBlocks | C | `core.extractBlocks` | 无 | 无 | 待定 | 楼层图块提取未检索到替代;须确认新地图渲染器覆盖。(调用点 packages-user/client-modules/src/ui/statistics.tsx:165) |
| C:extractBlocksForUI | C | `core.extractBlocksForUI` | 无 | 无 | 待定 | 面向 UI 的图块提取未检索到替代,同 extractBlocks。(调用点 packages-user/client-modules/src/ui/save.tsx:119) |
| C:firstData | C | `core.firstData` | 无 | 无 | 待定 | 首关数据(name/version/title)新承载未检索到;须确认 loader / data 层是否提供。(调用点 packages-user/client-modules/src/client.ts:75) |
| C:flags | C | `core.flags` | `FlagSystem` packages-user/data-base/src/flag/system.ts:5 | 无 | 有替代但需适配 | 新 `FlagSystem` 取代 `core.flags`;键值访问方式变化。(调用点 packages-user/client-modules/src/ui/statusBar.tsx:227) |
| C:floorIds | C | `core.floorIds` | `MapStore` packages-user/data-common/src/store/mapStore.ts:3 | 无 | 有替代但需适配 | 楼层 id 集合由新地图存储承担,遍历方式变化。(调用点 packages-user/client-modules/src/fallback/load.ts:111) |
| C:floors | C | `core.floors` | `MapState` packages-user/data-base/src/map/mapState.ts:17 | 无 | 有替代但需适配 | 楼层静态信息由新地图状态承担,结构变化。(调用点 packages-user/client-modules/src/ui/statusBar.tsx:208) |
| C:flyTo | C | `core.flyTo` | 无 | 无 | 待定 | 飞往楼层未检索到替代;须确认新地图 / 传送系统覆盖。(调用点 packages-user/client-modules/src/ui/viewmap.tsx:135) |
| C:formatBigNumber | C | `core.formatBigNumber` | 无 | 无 | 无替代 | 大数格式化未迁移到非 legacy 包。(调用点 packages-user/client-modules/src/ui/statusBar.tsx:246) |
| C:formatDate2 | C | `core.formatDate2` | 无 | 无 | 无替代 | 日期格式化未迁移到非 legacy 包。(调用点 packages-user/client-modules/src/ui/settings.tsx:222) |
| C:getAllSaves | C | `core.getAllSaves` | 无 | `getAllSaves` packages-user/client-modules/src/render/utils/saves.ts:36 | 有替代方案 | 存档列表查询由新存档工具承担。(调用点 packages-user/client-modules/src/render/utils/saves.ts:38) |
| C:getAnimateFrames | C | `core.getAnimateFrames` | 无 | 无 | 待定 | 动画帧查询未检索到替代;须确认 `TextureManager` 是否覆盖动画帧。(调用点 packages-user/client-base/src/elements/cache.ts:206) |
| C:getLvName | C | `core.getLvName` | 无 | 无 | 无替代 | 等级名称映射未迁移到非 legacy 包。(调用点 packages-user/client-modules/src/ui/statusBar.tsx:183) |
| C:getMappedName | C | `core.getMappedName` | 无 | 无 | 无替代 | 音效名映射未迁移到非 legacy 包。(调用点 packages-user/client-modules/src/fallback/audio.ts:49) |
| C:getNextItem | C | `core.getNextItem` | 无 | 无 | 待定 | 切换道具未检索到替代;须确认 `HeroItems` 是否覆盖。(调用点 packages-user/client-modules/src/action/hotkey.ts:505) |
| C:getSave | C | `core.getSave` | 无 | `SaveSystem.load` packages-user/client-base/src/save/system.ts:185 | 有替代方案 | 单存档读取由新存档系统承担(异步契约)。(调用点 packages-user/client-modules/src/render/utils/saves.ts:21) |
| C:getTilesetOffset | C | `core.getTilesetOffset` | 无 | `TextureManager` packages-user/client-base/src/material/manager.ts:37 | 有替代方案 | tileset 偏移由 `TextureManager` 内部 `tilesetOffsetMap` 处理,未暴露同名公开方法。(调用点 packages-user/client-base/src/elements/cache.ts:131) |
| C:hasItem | C | `core.hasItem` | 无 | `HeroItems` packages-user/data-base/src/hero/items.ts:18 | 有替代方案 | 道具持有查询由新 `HeroItems` 承担。(调用点 packages-user/client-modules/src/ui/viewmap.tsx:133) |
| C:icons | C | `core.icons` | 无 | 无 | 待定 | 图标信息承载未检索到替代;须确认 `TextureManager` / 素材层是否覆盖 `icons` 结构。(调用点 packages-user/client-modules/src/fallback/load.ts:55) |
| C:isMoving | C | `core.isMoving` | `HeroMover` packages-user/data-base/src/hero/mover.ts:23 | 无 | 有替代但需适配 | 移动状态由新 `HeroMover` 承担,查询方式变化。(调用点 packages-user/client-modules/src/action/hotkey.ts:478) |
| C:isPlaying | C | `core.isPlaying` | `ReplaySystem` packages-user/data-common/src/replay/system.ts:21 | 无 | 有替代但需适配 | 播放状态由新录像系统承担(属性 / 方法形态差异)。(调用点 packages-user/client-modules/src/action/move.ts:66) |
| C:isReplaying | C | `core.isReplaying` | `ReplaySystem` packages-user/data-common/src/replay/system.ts:21 | 无 | 有替代但需适配 | 录像播放状态由新录像系统承担。(调用点 packages-user/client-base/src/components/choices.tsx:717) |
| C:maps | C | `core.maps` | `MapState` packages-user/data-base/src/map/mapState.ts:17 | 无 | 有替代但需适配 | 地图状态由新 `MapState` 承担。(调用点 packages-user/client-modules/src/ui/save.tsx:118) |
| C:material | C | `core.material` | `TextureManager` packages-user/client-base/src/material/manager.ts:37 | 无 | 有替代但需适配 | 素材由新 `TextureManager` 承担,`images/animates/enemys/items/icons` 以贴图库访问。(调用点 packages-user/client-base/src/elements/cache.ts:11) |
| C:openBook | C | `core.openBook` | 无 | `BookUI` packages-user/client-modules/src/ui/book.tsx:251 | 有替代方案 | 图鉴 UI 由新 `BookUI` / `UIController.open` 承担。(调用点 packages-user/client-modules/src/action/hotkey.ts:481) |
| C:openEquipbox | C | `core.openEquipbox` | 无 | `EquipBoxUI` packages-user/client-modules/src/ui/equipbox.tsx:551 | 有替代方案 | 装备箱 UI 由新 `EquipBoxUI` 承担。(调用点 packages-user/client-modules/src/action/hotkey.ts:487) |
| C:openQuickShop | C | `core.openQuickShop` | 无 | `ShopUI` packages-user/client-modules/src/ui/shop.tsx:491 | 有替代方案 | 快捷商店由新 `ShopUI` 承担。(调用点 packages-user/client-modules/src/action/hotkey.ts:493) |
| C:openToolbox | C | `core.openToolbox` | 无 | `ToolBoxUI` packages-user/client-modules/src/ui/toolbox.tsx:278 | 有替代方案 | 道具栏由新 `ToolBoxUI` 承担。(调用点 packages-user/client-modules/src/action/hotkey.ts:484) |
| C:pauseReplay | C | `core.pauseReplay` | `ReplaySystem` packages-user/data-common/src/replay/system.ts:21 | `ReplaySandbox.pause` packages-user/data-common/src/replay/sandbox.ts:274 | 有替代但需适配 | 暂停由新录像沙盒承担(异步契约)。(调用点 packages-user/client-modules/src/ui/toolbar.tsx:188) |
| C:platform | C | `core.platform` | 无 | 无 | 待定 | 平台信息(isPC/isChrome 等)未检索到替代;须确认新平台 / 环境模块。(调用点 packages-user/client-modules/src/ui/settings.tsx:282) |
| C:playSound | C | `core.playSound` | 无 | `SoundPlayer.play` packages/audio/src/sound.ts:74 | 有替代方案 | 音效播放由新 `SoundPlayer` 承担(含位置 / 朝向参数与返回 id)。(调用点 packages-user/client-modules/src/ui/settings.tsx:431) |
| C:removeFlag | C | `core.removeFlag` | `FlagSystem.deleteField` packages-user/data-base/src/flag/system.ts:40 | 无 | 有替代但需适配 | 删除标记改由 `FlagSystem.deleteField` 承担。(调用点 packages-user/client-modules/src/ui/statistics.tsx:224) |
| C:removeLocalForage | C | `core.removeLocalForage` | 无 | `SaveSystem.deleteSave` packages-user/client-base/src/save/system.ts:192 | 有替代方案 | 删除指定存档由新存档系统承担。(调用点 packages-user/client-modules/src/render/utils/saves.ts:174) |
| C:removeLocalStorage | C | `core.removeLocalStorage` | 无 | 无 | 待定 | `localStorage` 键删除未检索到替代;须确认新全局存储是否替代 localStorage 用法。(调用点 packages-user/client-modules/src/ui/settings.tsx:585) |
| C:removeSave | C | `core.removeSave` | 无 | `SaveSystem.deleteSave` packages-user/client-base/src/save/system.ts:192 | 有替代方案 | 删除存档由新存档系统承担。(调用点 packages-user/client-modules/src/ui/save.tsx:538) |
| C:replaceText | C | `core.replaceText` | 无 | 无 | 无替代 | 文本模板替换未迁移到非 legacy 包。(调用点 packages-user/client-base/src/components/tip.tsx:104) |
| C:restart | C | `core.restart` | 无 | 无 | 待定 | 重开游戏流程未检索到替代;须确认新入口。(调用点 packages-user/client-modules/src/ui/settings.tsx:108) |
| C:resumeReplay | C | `core.resumeReplay` | `ReplaySystem` packages-user/data-common/src/replay/system.ts:21 | `ReplaySandbox.resume` packages-user/data-common/src/replay/sandbox.ts:284 | 有替代但需适配 | 恢复由新录像沙盒承担。(调用点 packages-user/client-modules/src/ui/toolbar.tsx:187) |
| C:rewindReplay | C | `core.rewindReplay` | `ReplaySystem` packages-user/data-common/src/replay/system.ts:21 | 无 | 有替代但需适配 | 回退能力由新录像系统承担,公开入口形态待确认。(调用点 packages-user/client-modules/src/ui/toolbar.tsx:201) |
| C:saves | C | `core.saves` | 无 | `SaveSystem` packages-user/client-base/src/save/system.ts:41 | 有替代方案 | 存档体系由新 `SaveSystem` 承担,`saveIndex/ids/autosave` 等结构不同。(调用点 packages-user/client-modules/src/render/utils/saves.ts:173) |
| C:setFlag | C | `core.setFlag` | `FlagSystem.setFieldValue` packages-user/data-base/src/flag/system.ts:31 | 无 | 有替代但需适配 | 设置标记改由 `FlagSystem.setFieldValue` 承担(见 flag/types.ts:93 明确对应 `core.setFlag`)。(调用点 packages-user/client-modules/src/ui/statistics.tsx:145) |
| C:setLocalForage | C | `core.setLocalForage` | 无 | `SaveSystem.setGlobal` packages-user/client-base/src/save/system.ts:209 | 有替代方案 | 写全局存储由新存档系统承担。(调用点 packages-user/client-modules/src/render/utils/saves.ts:172) |
| C:speedDownReplay | C | `core.speedDownReplay` | `ReplaySandbox.setSpeed` packages-user/data-common/src/replay/sandbox.ts:70 | 无 | 有替代但需适配 | 减速由新录像沙盒 `setSpeed` 承担,增减语义需适配。(调用点 packages-user/client-modules/src/ui/toolbar.tsx:190) |
| C:speedUpReplay | C | `core.speedUpReplay` | `ReplaySandbox.setSpeed` packages-user/data-common/src/replay/sandbox.ts:70 | 无 | 有替代但需适配 | 加速由新录像沙盒 `setSpeed` 承担,增减语义需适配。(调用点 packages-user/client-modules/src/ui/toolbar.tsx:191) |
| C:startGame | C | `core.startGame` | 无 | 无 | 待定 | 开始游戏流程未检索到替代;须确认新入口。(调用点 packages-user/client-modules/src/ui/title.tsx:223) |
| C:status | C | `core.status` | 无 | `CoreState` packages-user/data-state/src/core.ts:76 | 有替代但需适配 | `core.status` 已拆分至 `CoreState` 的 `maps` / `hero` / `flags`(L1);`route/lockControl/hero/floorId` 等逐字段需重映射。(调用点 packages-user/client-modules/src/action/hotkey.ts:478) |
| C:stepReplay | C | `core.stepReplay` | `ReplaySandbox.step` packages-user/data-common/src/replay/sandbox.ts:297 | `ReplaySystem` packages-user/data-common/src/replay/system.ts:21 | 有替代但需适配 | 单步由新录像沙盒承担(异步契约)。(调用点 packages-user/client-modules/src/ui/toolbar.tsx:202) |
| C:stopReplay | C | `core.stopReplay` | `ReplaySandbox.stop` packages-user/data-common/src/replay/sandbox.ts:291 | `ReplaySystem` packages-user/data-common/src/replay/system.ts:21 | 有替代但需适配 | 停止由新录像沙盒承担(异步契约)。(调用点 packages-user/client-modules/src/ui/toolbar.tsx:189) |
| C:syncSave | C | `core.syncSave` | 无 | 无 | 待定 | 存档云同步未检索到替代;须确认新同步 / 服务端模块。(调用点 packages-user/client-modules/src/ui/settings.tsx:439) |
| C:tilesets | C | `core.tilesets` | `TextureManager` packages-user/client-base/src/material/manager.ts:37 | 无 | 有替代但需适配 | 额外素材 tileset 由 `TextureManager.tilesetStore` 承担,遍历 / 索引方式变化。(调用点 packages-user/client-modules/src/fallback/load.ts:99) |
| C:turnHero | C | `core.turnHero` | `HeroMover` packages-user/data-base/src/hero/mover.ts:23 | 无 | 有替代但需适配 | 转向由新 `HeroMover` 承担,调用方式变化。(调用点 packages-user/client-modules/src/action/hotkey.ts:502) |
| C:ui | C | `core.ui` | 无 | `mainUIController` packages-user/client-modules/src/ui/controller.tsx:5 | 有替代方案 | UI 控制由 `UIController` 实例承担(`closePanel` 等以 `closeAll` 等价)。(调用点 packages-user/client-modules/src/ui/settings.tsx:160) |
| C:useFly | C | `core.useFly` | 无 | 无 | 待定 | 使用飞行道具未检索到替代;须确认新道具使用流程。(调用点 packages-user/client-modules/src/action/hotkey.ts:490) |
| C:waitHeroToStop | C | `core.waitHeroToStop` | `HeroMover` packages-user/data-base/src/hero/mover.ts:23 | 无 | 有替代但需适配 | 等待停止由新 `HeroMover` / 顶层移动实现承担,调用方式变化。(调用点 packages-user/client-modules/src/action/move.ts:67) |
**C 节分类计数:** `可直接替换` 0 / `有替代但需适配` 21 / `有替代方案` 19 / `无替代` 7 / `待定` 20(合计 67)。
## 汇总
### 五类分类汇总表
| 分类 | 计数 | 代表条目 / 备注 |
| --- | --- | --- |
| `可直接替换` | 0 | 无。OI-6 严格判据下,legacy 接口与替代接口在签名 / 对象 / 路由上均不同,无一可近乎机械替换。 |
| `有替代但需适配` | 25 | 代表:C:flags → `FlagSystem`、C:material → `TextureManager`、C:status → `CoreState`、C:maps → `MapState`、A-3-* 单例 `client`、A-7-2 音频回退。 |
| `有替代方案` | 40 | 代表:C:saves → `SaveSystem`、C:playSound → `SoundPlayer`、C:openBook → `BookUI`、C:drawTip → `TipStore`、A-1-2 patch → `Hookable`、A-6-* `Mota.require` → ESM 导入。 |
| `无替代` | 8 | 代表:C:formatBigNumber / C:calValue / C:replaceText / C:arrayToRGBA / C:getLvName / C:getMappedName / C:formatDate2、A-5-6 `triggerFullscreen`。 |
| `待定` | 26 | 代表:C:status 之外的 C:control / C:actions / C:platform / C:firstData、A-1-3 / A-5-1 / A-5-4 / A-5-5 `mainSetting`。均注明所缺信息。 |
### A / C 两节分布小计
| 节 | 可直接替换 | 有替代但需适配 | 有替代方案 | 无替代 | 待定 | 合计 |
| --- | --- | --- | --- | --- | --- | --- |
| A. 残余 legacy 接口 | 0 | 4 | 21 | 1 | 6 | 32 |
| C. 经 `core.*` 调用的接口 | 0 | 21 | 19 | 7 | 20 | 67 |
| **总计** | **0** | **25** | **40** | **8** | **26** | **99** |
### 机器可读计数(五类之和 = ENTRY-COUNT)
- ENTRY-COUNT: 99
- DIRECT-COUNT: 0
- ADAPT-COUNT: 25
- ALT-COUNT: 40
- NONE-COUNT: 8
- TBD-COUNT: 26
## 改造顺序建议
依判定结果给出建议的**改造顺序与分组**(理由 = 可替换性与影响面):
1. **第一批 · 批量替换「有替代方案」的运行时调用(低风险,影响面清晰)**:`C:saves` / `C:getSave` / `C:getAllSaves` / `C:setLocalForage` / `C:removeLocalForage` / `C:removeSave` → `SaveSystem`(packages-user/client-base/src/save/system.ts:41);`C:playSound` → `SoundPlayer`(packages/audio/src/sound.ts:74);`C:drawTip` → `TipStore`(packages-user/client-base/src/components/tip.tsx:158);`C:ui` → `mainUIController`(packages-user/client-modules/src/ui/controller.tsx:5)。这些为现成对象 / API,去 legacy 的收益/风险比最高。
2. **第二批 · 按主题分组的「有替代但需适配」**:
- **audio 主题:** A-1-2 / A-4-1 / A-7-2 去 patch,改直连 `ClientCore` 音频成员(packages-user/client-modules/src/client.ts:44);
- **weather 主题:** A-1-5 / A-4-3 / A-7-4 → `WeatherController`(packages-user/client-modules/src/render/weather/controller.ts:11);
- **saves 主题:** `C:flags` / `C:setFlag` / `C:removeFlag` → `FlagSystem`(packages-user/data-base/src/flag/system.ts:5);
- **maps / material 主题:** `C:maps` / `C:floors` / `C:floorIds` → `MapState` / `MapStore`(packages-user/data-base/src/map/mapState.ts:17 与 packages-user/data-common/src/store/mapStore.ts:3);`C:material` / `C:tilesets` → `TextureManager`(packages-user/client-base/src/material/manager.ts:37);
- **replay 主题:** `C:isPlaying` / `C:isReplaying` / `C:pauseReplay` / `C:resumeReplay` / `C:stopReplay` / `C:stepReplay` / `C:speedUpReplay` / `C:speedDownReplay` / `C:rewindReplay` / `C:encodeRoute` → `ReplaySystem` / `ReplaySandbox`(packages-user/data-common/src/replay/system.ts:21 与 packages-user/data-common/src/replay/sandbox.ts:70);
- **hero 主题:** `C:isMoving` / `C:turnHero` / `C:waitHeroToStop` → `HeroMover`(packages-user/data-base/src/hero/mover.ts:23)。
3. **第三批 · 「有替代方案」的 UI / 素材批量**:`C:openBook` / `C:openToolbox` / `C:openEquipbox` / `C:openQuickShop` → `BookUI` / `ToolBoxUI` / `EquipBoxUI` / `ShopUI`(packages-user/client-modules/src/ui/book.tsx:251 等);A-7-5 素材加载 → `TextureManager`(packages-user/client-base/src/material/manager.ts:37)。
4. **第四批 · 「无替代」(先补功能设计)**:`C:formatBigNumber` / `C:formatDate2` / `C:replaceText` / `C:calValue` / `C:arrayToRGBA` / `C:getLvName` / `C:getMappedName` 与 A-5-6 `triggerFullscreen`——非 legacy 包尚无对应实现,须先补设计 / 迁移工具函数。
5. **第五批 · 「待定」(先待用户 / 设计裁定)**:`C:control` / `C:actions` / `C:platform` / `C:firstData` / `C:doSL` / `C:startGame` / `C:restart` / `C:syncSave` / `C:download` / `C:chooseReplayFile` / `C:extractBlocks` / `C:extractBlocksForUI` / `C:getAnimateFrames` / `C:getNextItem` / `C:flyTo` / `C:useFly` / `C:icons` / `C:removeLocalStorage` / `C:confirmRestart` / `C:doRegisteredAction` 与 A-1-3 / A-1-8 / A-1-10 / A-5-1 / A-5-4 / A-5-5(`mainSetting` / `generateBinary`)——先补设计或待用户裁定,**不得**臆造替代。
**总原则:** 先做「有替代方案」的批量机械替换(低风险、可验证),再按主题处理「有替代但需适配」(需逐调用点适配),「无替代」与「待定」先补功能 / 设计,避免在未定义替代的前提下强行改造。