From 2df7179266c24a6ce33bb902a692d4b5f9c61115 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Thu, 27 Aug 2026 17:16:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=8C=E4=B8=83=E7=8E=8B=EF=BC=9A=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E5=AD=90=E9=A1=B9=E7=9B=AE=20B=20=E5=AE=9E=E6=96=BD?= =?UTF-8?q?=E8=AE=A1=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 13 个任务,每个自带 TDD 循环与提交:GameState 骨架与事件契约、roomtype 解析、 语义化发包、分发器与失败回包、五组 handler、重连与开局、服务端真包夹具、 增量 vs 全量一致性、平台接线。 自检修掉两处:Task 8 一条拿自己跟自己比的恒真断言;Task 12 引用的 fx.roomtype / snapPoint.packetIndex 在 Task 11 的夹具结构里没定义 ——packetIndex 是两条路径的对齐锚点,缺了一致性测试无从比对。 Co-Authored-By: Claude Opus 5 (1M context) --- .../2026-08-27-二七王前端B-网络与数据镜像.md | 2636 +++++++++++++++++ 1 file changed, 2636 insertions(+) create mode 100644 docs/superpowers/plans/2026-08-27-二七王前端B-网络与数据镜像.md diff --git a/docs/superpowers/plans/2026-08-27-二七王前端B-网络与数据镜像.md b/docs/superpowers/plans/2026-08-27-二七王前端B-网络与数据镜像.md new file mode 100644 index 0000000..30b6e2f --- /dev/null +++ b/docs/superpowers/plans/2026-08-27-二七王前端B-网络与数据镜像.md @@ -0,0 +1,2636 @@ +# 二七王前端 · 子项目 B:网络与数据镜像 · 实施计划 + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** 把二七王前端接上服务端——语义化发包、唯一收包分发、把服务端快照镜像成 `GameState`、重连即重画,全部用单测覆盖。 + +**Architecture:** 点击 → `Rpc.sendXxx(意图)` → `RpcHelper.sendRpc('youle','erqiwang',…)`;推送 → `SubGameHooks._ReceiveData` → `Dispatcher`(纯路由表)→ 一 rpc 一 handler → 写 `GameState` → emit 语义事件。handler **不引用任何 UI 组件**,故 B 可脱离 C 独立完成与测试。 + +**Tech Stack:** 纯静态 ES5 JavaScript(浏览器 ` + + + + + + + + + + + + + + + +``` + +- [ ] **Step 6: 验证加载顺序** + +写一个临时脚本(放 `/tmp`,**不提交**),按 `index.html` 里 script 标签的实际顺序用 `vm.runInThisContext` 依次加载 `codes/` 下全部文件(框架依赖 `EventBus.js`、`AlignmentUtils.js`、`SpriteEventController.js` 也要按其在 index.html 中的位置先加载),确认: + +- 加载过程无异常抛出(顺序错了会因引用未定义的全局而报错) +- 这些全局全部就绪:`EQW_Events`、`EQW_GameState`、`EQW_RoomOptions_Parse`、`EQW_Dispatcher`、`EQW_Rpc`、以及 10 个 handler +- `EQW_Dispatcher.hasHandler('chupai1')` 为 `true`(证明注册确实跑了) + +把输出贴进报告。 + +- [ ] **Step 7: 跑两套测试** + +Run: `node client/tests/run.js && node server/games/erqiwang/test/run.js` +Expected: 两边全绿。 + +- [ ] **Step 8: 提交** + +```bash +git add client/js/01_SubGame/codes/SubGameHooks.js client/index.html client/tests/test_hooks.js +git commit -F - <<'EOF' +二七王:平台接线与加载段 + +SubGameHooks 只解包转交、不写业务:_ReceiveData 收到的是完整包, +按 rpc 分发;Free 的参数是平台已取出的 deskfree、可能为 null; +appStart 只记座位与房间选项,UI 初始化留给 C 阶段。 + +index.html 里 handler 排在 Dispatcher 之前——后者注册时要引用全部 handler。 + +Co-Authored-By: Claude Opus 5 (1M context) +EOF +``` + +--- + +## 完成检查 + +全部任务做完后逐条核对: + +- [ ] `node client/tests/run.js` 全绿(新增 10 个测试文件) +- [ ] `node server/games/erqiwang/test/run.js` 全绿(B 不该动服务端) +- [ ] **增量 vs 全量一致性测试通过**,`EXCLUDE` 里每条都有书面理由 +- [ ] 发包测试确认字段集合不含任何结论字段 +- [ ] 路由表覆盖协议里全部 12 个服务端推送 rpc +- [ ] `handlers/` 下无任何一处引用 UI 组件(`grep -rn "View\|Sprite" codes/net/` 应只命中注释) +- [ ] 三个平台契约转发壳一字未动(`git diff --name-only` 无 `01_SubGame/0*.js`) +- [ ] 提交全部通过 `.githooks/pre-commit` 的红线闸(严格 ES5、可编辑范围) +- [ ] 浏览器打开 `client/index.html` 控制台无报错(人工执行)