Files
youle_cocos/docs/superpowers/plans/2026-08-30-platform-logic-migration.md
joywayerandClaude Opus 5 02dc5d51ca chore(spec): 综合清理 + legacy-layer 迁移 spec/plan/data
主要改动:
- 切到 funplay-cocos-mcp v0.5.1 (用户级配置, 项目级 .mcp.json 删除)
- 仓库文档/CLAUDE.md/.gitignore 等清理过时 cocos-mcp-server 引用
- memory 文件同步: cocos-mcp-setup/path/blocker/spriteframe-uuid/prefab-persist 等加 funplay 实测警告
- memory 新建 funplay-cocos-mcp-pending-verification.md (后已被实测覆盖)
- spec/plan/data:
  - docs/superpowers/specs/2026-09-02-legacy-layer-migration-design.md
  - docs/superpowers/plans/2026-09-02-legacy-layer-migration.md
  - docs/superpowers/data/layer-spirit-summary.json
- YouleNexus: profiles.ts / defaults.ts / PlayerInfoView.prefab / scene 改动

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-02 07:36:54 +08:00

143 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 平台逻辑移植(子系统 C)开发计划 —— 从当前进度到「逻辑流程一致」验收
> **For agentic workers:** 执行时使用 `superpowers:subagent-driven-development`(推荐)或 `superpowers:executing-plans`,任务用 `- [ ]` checkbox 跟踪。
> 顶层路线图:本计划定义阶段边界、依赖、验收;阶段 1 直接续用 `2026-06-28-platform-store.md`,阶段 4/5 复用 `2026-08-27-ui-asset-and-skin.md`、`2026-08-28-legacy-ui-migration.md`,阶段 2/3 为新增(执行时各自展开为 TDD 任务)。
**Goal:** 把子系统 C 规范(`docs/superpowers/specs/2026-08-30-legacy-platform-logic-migration.md`)的 §3 落点全部落地,使 §8 的 10 条「逻辑流程一致性检查点」全部通过。
**策略假设(可纠正点)**:**端到端逻辑主线优先,UI 大面积落地收尾**——先打通「启动 → 建连 → 登录 → 进房/大厅 → 对局分发」这条纯逻辑主线(Store/session/protocol/sdk),UI 用最小占位(已有 `Login_Layer.prefab`);最后再批量落地 55 界面。理由:C 规范的目标是「逻辑流程一致」而非「像素一致」,逻辑主线是协议契约与业务正确性的承重墙,UI 是响应式 Store 的下游视图、可后置。
**基线(已完成,勿重复)**:`core`(含 `reactive.ts`)、`net`(transport/net-client/envelope-codec/heartbeat/reconnect)、`protocol`(login + 4 rpc)、`config`(完整)、`platform`(player-store + types + readonly)、`ui/theme`。真机联调 `player_login` 往返已通过。
---
## 阶段总览(依赖图)
```
阶段1 三态机+session ──┐
├─► 阶段2 协议+收包路由 ──► 阶段3 sdk+重连 ──► 阶段5 真机联调
阶段4 UI落地(并行) ────┘ (可与4并行) (依赖2)
阶段5 原生桥(并行) ───────────────────────────────────────────────┘
```
| 阶段 | 内容 | 依赖 | 产出 | 复用现有 plan |
|---|---|---|---|---|
| **1** | platform 三态机 + session | 无(reactive/types/player 已就绪) | AppStore/RoomStore/PlatformSession | ✅ `2026-06-28-platform-store.md` Task 4/5/6 |
| **2** | 启动接线 + protocol 补全 + 收包路由 + 房间事件 | 阶段 1 | rpc 常量、Router、房间 handler、PlayerStore 补全 | 新写 |
| **3** | sdk(IGameModule/GameContext)+ 断线重连 | 阶段 2 | GameContext、IGameModule、deskinfo 透传 | 新写(= 原「Plan 5」主体) |
| **4** | UI 界面落地(55 界面 + FrameSet) | 阶段 1(响应式 Store) | FrameSet 组件、界面控制器、批量 prefab | ✅ `2026-08-28-legacy-ui-migration.md` + 新写控制器 |
| **5** | 原生桥(WVJB)+ 真机端到端联调 | 阶段 3/4 | 完整 WVJB 桥、端到端验收 | 新写(= 原「Plan 5」收尾) |
---
## 阶段 1:platform 三态机 + session(续现有 plan)
**目标**:`AppStore`(=GameData) / `RoomStore`(=Desk) / `PlatformSession`(=12_Logic 登录接入),使 login 事件 → 三 Store 正确填充 + 相位流转。
**直接续用** `docs/superpowers/plans/2026-06-28-platform-store.md` 的 **Task 4(AppStore)、Task 5(RoomStore)、Task 6(PlatformSession)**——该 plan 已含完整代码与测试,此处不重写,按原 TDD 流程执行。
- [ ] Task 4:`platform/stores/app-store.ts`(AppStore:setIdentity/setServers/setPhase/applyLogin)
- [ ] Task 5:`platform/stores/room-store.ts`(RoomStore:applyRecovery/clear,`players` 座位数组 + `deskinfo` opaque 透传)
- [ ] Task 6:`platform/session.ts`(PlatformSession 订阅 NetClient 事件总线 → 填充三 Store,相位流转)
**验收**:`npm run test:framework` 全绿(含 app-store 3 + room-store 3 + session 4 用例);`typecheck:framework` exit 0;login 含 `roomcode` 时 `RoomStore.inRoom=true` + `deskinfo` 原样透传。
---
## 阶段 2:启动接线 + protocol 补全 + 收包路由 + 房间事件
**目标**:把「收包 → 路由分界 → Store 更新」这条主线打通,覆盖 C 规范 §4.1(路由分界)与 §6.2(登录分支)。
### Task 2.1 — protocol 补全 rpc 常量(对应 C §3 `02_Const` 落点)
- [ ] 从旧 `02_Const.js` 的 `RpcList`(:13–109,~100 个)提取平台层 rpc,落 `protocol/routes.ts`(扩展 `Rpc`,保持函数名==rpc 字符串的同构映射)。
- [ ] 至少覆盖房间类 rpc(`create_room`/`self_join_room`/`self_exit_room`/`other_exit_room`/`self_makewar`/`player_prepare`/`self_apply_free_room`/`change_seat`/`update_bean`/`connect_roomserver`…)与玩家类(`update_bean`/`set_sign`/`set_tel`…)。
- **验收**:`Rpc` 常量与 `docs/protocol/` 的 rpc 字符串逐字节一致;typecheck 通过。
### Task 2.2 — 收包路由分界(C §4.1 的红线)
- [ ] 在 `net-client.ts`(或新建 `protocol/router.ts`)实现 Router:`route ∈ {platform,agent,room}` → 平台 handler;`route = <game route>` → sdk 钩子(阶段 3 接上,本阶段先留 `onGameRoute` 空钩子 + 未注册时显式报错,不静默吞包)。
- [ ] `connect_roomserver`/`connect_agentserver` 换服逻辑已存在(`net-client.ts:129-133`),补「换服后重发登录」的触发。
- **验收**:单测:platform 包 → 平台 handler 被调;对局 route 未注册 → 显式报错(第二准则:不兜底)。
### Task 2.3 — 房间事件 handler → RoomStore/PlayerStore 更新(C §6.4)
- [ ] 新建 `protocol/room.ts`(或 `platform/room-handlers.ts`):`self_join_room`/`other_join_room`/`self_exit_room`/`other_exit_room`/`self_makewar`/`player_prepare`/`self/other_apply/agree/refuse_free_room`/`other_offline/online`/`change_seat` → 更新 `RoomStore`(座位、`stage`、`state`、`AgreeList`)。
- [ ] `PlayerStore` 补全 `update_bean`/`update_roomcard`/`setCharm`/`setSign`/`setTel`(对应 C §3.1 消除双镜像:bean/roomcard 只写 `PlayerStore`,`RoomStore.players[seat]` 是同一响应式来源的投影)。
- **验收**:单测:每个房间 rpc 收包 → RoomStore/PlayerStore 字段正确变化;解散投票 `AgreeList` 累积正确。
### Task 2.4 — 启动接线(C §6.1 启动流程)
- [ ] 把 `config/bootstrap` 的 `resolveBootstrap` 结果接 `AppStore.setIdentity/setServers`;`new PlatformSession(net.bus)` + `net.start()`。
- [ ] 首屏门控四条件(资源/WS onopen/配置/加载计时器)合成一个「就绪信号」→ 登录页(UI 阶段 4 接,本阶段先暴露 `AppStore.phase` 状态)。
- **验收**:启动编排单测:bootstrap → AppStore 身份/服务器就绪 → net.start 建连。
---
## 阶段 3:sdk(IGameModule/GameContext)+ 断线重连
**目标**:建立子游戏对接边界,收包路由对局分支接上 sdk,`deskinfo` 透传 + 断线重连恢复(C §4.1/§5 边界判据、§6.3)。
### Task 3.1 — `sdk/GameContext` facade(C §3 `08_Utl_Output` 落点)
- [ ] 只读暴露:`room`/`player`(只读 Store)、`net.send(route,rpc,data)`、`seat.toView(mySeat,target)`(替代旧 `ChangeToStatus`)、`ui` 占位(toast/dialog)。
- [ ] 旧 `08_Utl_Output.js` 的只读 getter(`getMyInfo`/`getRoomcode`/`getPlayerList`/`getMySeat`…)→ facade 方法或直接只读 Store。
- **验收**:单测:facade 只读、不可逆改 Store;`seat.toView` 与旧 `ChangeToStatus` 同结果。
### Task 3.2 — `IGameModule` 接口 + 注册(框架 spec §4)
- [ ] 定义 `IGameModule`(`route`/`onEnter`/`onExit`/`onReceive`/`onReconnect`/`serialize`/平台钩子默认空实现)。
- [ ] 注册机制:子游戏注册自己,Router 据 `route` 分发对局包 → `activeGame.onReceive`。
- **验收**:单测:注册 mock 子游戏 → 对局 route 包 → `onReceive` 被调;未注册 → 显式报错。
### Task 3.3 — `deskinfo` 透传 + 断线重连(C §6.3)
- [ ] login 回包含 `deskinfo`(`isbattle==1`)→ `RoomStore` 只透传不解析 → `activeGame.onReconnect(deskinfo)`。
- [ ] 断线重连完整链路:`net/reconnect` 重连 → 重发登录 → `deskinfo` 恢复对局。
- **验收**:集成测试:login(deskinfo) → `onReconnect` 收到原样快照;断线 → 重连 → 重发登录。
---
## 阶段 4(并行):UI 界面落地
**目标**:从 55 界面中间描述批量落地 Cocos 界面,响应式订阅 Store,界面切换走 `node.active` + `AppStore.currentScene`(C §6.5)。
- [ ] **Task 4.1 FrameSet 组件**(B §3.4):多帧图切帧的运行时载体(`setFrame(n)`,1 基帧号)。
- [ ] **Task 4.2 界面控制器**:登录/大厅/房间 + 各弹窗,`subscribe` 三 Store 自动刷新;`Login_Layer.prefab` 接入真实登录数据。
- [ ] **Task 4.3 批量落地**:复用 `2026-08-28-legacy-ui-migration.md` 的 convert 管线,把 55 个 layer JSON → prefab(当前仅 Login_Layer 已落)。
- [ ] **Task 4.4 界面切换**:`AppStore.currentScene` 状态替代 `get_self(149,37)` 哨兵。
**验收**:登录→大厅→房间 界面切换正确;帧动画走 FrameSet;UI 由 Store 响应式驱动(无手工刷新)。
---
## 阶段 5(并行收尾):原生桥 + 真机端到端联调
- [ ] **Task 5.1 WVJB 完整异步桥**(原「Plan 5」):`window.settings` 同步取值 + `setupWebViewJavascriptBridge` 异步注册,接口名/数据格式/URL 构造与旧逐字一致(`native-bridge-contract` 技能)。
- [ ] **Task 5.2 真机端到端**:登录 → 大厅 → 进房 → 对局(mock/seed 子游戏)→ 结算,联调本地服。
- [ ] **Task 5.3 断线重连真机验证**:`isbattle==1` 时 `deskinfo` 恢复对局。
---
## 验收标准(映射 C 规范 §8 检查点)
- [ ] 信封 `{app,route,rpc,data}` 逐字节对齐(✅ 已有,回归不破坏)
- [ ] 收包分界:`platform/agent/room` → 平台 handler;对局 route → `onReceive`;未注册显式报错(阶段 2/3)
- [ ] 发包 HTTP 兜底(`netType==1`)+ `player_login` 的 `putMsg="playerLogin"`(阶段 2)
- [ ] 启动门控四条件合成就绪信号(阶段 2)
- [ ] 登录分支:`roomcode`/`deskinfo` 有无 → 大厅 or 房间 or `onReconnect`(阶段 1/3)
- [ ] 断线重连 + `deskinfo` 恢复(阶段 3/5)
- [ ] 三态机单一来源,无双镜像(阶段 1/2)
- [ ] 对局态 `deskinfo` 平台层不解析、原样透传(阶段 3)
- [ ] 界面切换 `node.active` + `currentScene`,不搬 `set_level`(阶段 4)
- [ ] 原生接口逐字一致(阶段 5)
---
## 风险与依赖
1. **UI 落地量大**(55 界面、旧 9862 行)——通过「逻辑主线先行 + 响应式 Store 后置 UI」隔离,UI 延迟不阻塞阶段 2/3 的协议正确性验证。
2. **对局 route 的 sdk 分界是红线**——阶段 2.2 先留「未注册显式报错」,避免静默吞包(第二准则)。
3. **`set_windows`/`players` 完整建模**等次要项——按 C §9.3 待验证清单在对应阶段落地时回填,不阻塞主线。
4. **换肤/打包(ui-asset-skin plan)**——独立于本计划,需在阶段 4 UI 落地时同步执行(散图 → Auto Atlas 打包),避免 UI 落地后返工。