diff --git a/tier2/games/shanhai-xunyilu/README.md b/tier2/games/shanhai-xunyilu/README.md index 17751da4..45a91862 100644 --- a/tier2/games/shanhai-xunyilu/README.md +++ b/tier2/games/shanhai-xunyilu/README.md @@ -1,45 +1,73 @@ -# 《山海巡异录》 —— 北极星顶级线③ · M0(战斗核心可玩) +# 《山海巡异录》 —— 北极星顶级线③ · M1(单局闭环) 卡牌构筑肉鸽(尖塔骨架 × Balatro 式乘法爽感,原创轴 = 五行相生序列链)。规格 SoT = [开发设计书](../../../docs/agent-specs/2026-07-06-北极星顶级线-卡牌构筑-开发设计书.md)(创始人 2026-07-06 已批, 定名《山海巡异录》,统一山海 IP 宇宙);本目录只承载实现,规则数值一律以 `src/data/tables.js` 表为准、代码零魔法数。 -## M0 范围(书 §11) +## M1 范围(书 §11:一局通关闭环) -一场完整教学战:出牌 / 能量经济 / 敌意图公开且诚实 / 序列链(每环 +0.25,周天一次性 ×2,上限 ×8, -动作数护栏 200→invalid)/ 胜负 latch。首批 20 卡(五行各 4)+ 首战敌「涸泽鲛」。 -渲染层 = 竖屏三段布局(§7.1)+ 手牌点选出牌 + 结算演出 v0(漂字/链轨点亮/周天金闪/受击屏震/终局遮罩)。 -零素材:全程序绘制,卡面插画位留空待风格版(§9.1);地图/遗物/商店/局外系统随 M1+。 +M0 的单场战斗之上,这一档把「一局」立起来:三幕地图 DAG(战/精英/憩/宝匣/Boss 节点流, +静态可达自检)、HP 跨战斗携带、战斗奖励三选一加卡(可跳过)、金币账本(M1 只挣不花,商店=M2 S11)、 +遗物 3 枚(全规则级:玉衡符首回合+2 抽/归墟镜每回合首次破序不断链/应龙鳞护甲跨回合)、 +敌 8 种(普通 3/精英 2/Boss 3;多段攻击、甲攻复合、烛阴双相位、饕餮增势竞速;意图回合开始钉住, +展示=执行的诚实铁律在相位切换下仍成立)、卡池 30(五行各 6)、card driver v1+play-spec。 +局外系统(进阶/图鉴/每日)随 M3;演出 v2/音频随 M4。 + +## host 集成(M0 事故修复,红线) + +M0 版曾在 `boot()` 里自建第二个 Phaser.Game 且未挂宿主 parent → 宿主画布全黑、真画面渲到视口外、 +真指针失效(mini-desktop CDP 取证)。M1 修法:**工厂永不自建引擎实例**(`src/main.js` 零 Phaser import), +场景经 `ctx.game.scene.add` 挂进宿主唯一实例(`tier2/engine/boot-phaser-host.js` 契约);输入单一路径—— +真指针(场景级 pointerdown)与 `injectInput('tap')`(driver/CDP)都走 `readState().tapTargets` 命中序 +(`src/ui/layout.js` 是唯一坐标事实)。`scripts/run-smoke.mjs` S0 静态自查钉住此红线防回潮。 +浏览器端复验(画面可见/真指针点卡)排 mini-desktop 窗口批。 ## 怎么跑 ```bash -# 纯逻辑单测(40 断言:链语义/意图诚实/守恒/护栏/latch) -node scripts/battle-core.test.mjs -# 端到端冒烟(贪心 win / 挂机 lose / 100 场墙钟) -node scripts/logic-smoke.mjs +# M0 回归:战斗核单测(40 断言)+ 单场双路冒烟 +node scripts/battle-core.test.mjs && node scripts/logic-smoke.mjs +# M1 单测:地图/一局状态机/遗物钩子/意图扩展/确定性(12 组) +node scripts/run-core.test.mjs +# M1 冒烟:host 契约静态自查 + 地图×150 + 首局门 + 完整 run×40 + 墙钟锚(产 dist/m1-walltime.json) +node scripts/run-smoke.mjs # 构建(esbuild 在 game-runtime/node_modules;external phaser) cd /game-runtime && node ../tier2/engine/build-phaser.mjs ../tier2/games/shanhai-xunyilu -# 真玩:静态起服后开 index.html(?seed= 注入种子);交互真玩窗口在 mini-desktop(本机禁 chrome) +# 真玩:静态起服后开 index.html(?seed= 注入种子);交互真玩/九门 driven 在 mini-desktop(本机禁 chrome) ``` ## 结构 -- `src/battle-core.js` —— 回合战斗解算核(纯函数、受控随机注入、事件流、latch;测试通道 opts 仅测试/仿真用) -- `src/data/tables.js` —— 20 卡 / 1 敌 / 链与回合曲线常量(schemaVersion=1;数值锚全〔草案·首轮仿真回填后锁〕) -- `src/scenes/battle-scene.js` —— 战斗场景(布局/交互/演出 v0;只消费 readState+takeEvents) -- `src/main.js` —— PhaserGameFactory(boot/readState/injectInput/destroy;canvas 渲染器) +- `src/battle-core.js` —— 回合战斗解算核(纯函数;M1 增列:敌注入/相位钉意图/遗物钩子/handCards 语义卡面) +- `src/map-core.js` —— 三幕地图 DAG 生成与静态可达校验(纯函数) +- `src/run-core.js` —— 一局核(地图推进×战斗桥接×奖励遗物×跨战斗资源×run 级 latch;tapTargets 出自布局层) +- `src/ui/layout.js` —— 布局与可点靶唯一坐标事实(场景绘制/driver 打点/injectInput 命中三方同源) +- `src/scenes/run-scene.js` —— 一局场景(地图/战斗/奖励/终局四视图;真指针=场景级路由;M0 battle-scene 已退役) +- `src/data/tables.js` —— 30 卡/8 敌/3 遗物/链与地图与经济曲线(schemaVersion=1;数值锚全〔草案〕) - `scripts/` —— 单测与冒烟(node 直跑,无浏览器) +- `play-spec.json` —— 九门 driven 接线(driver.type=card-battle;CDP driver=`tier2/harness/card-battle.driver.js`) -## M0 包体两本账实测(书 §9.3 的 M0 确认项;2026-07-06 本机) +## M1 门与实测(2026-07-06 本机;浏览器面=窗口批) -- 游戏代码+数据表(bundle.iife.js,未 minify):**35,835 B ≈ 0.034MB**(账 A 预算件 0.35MB 的 10%) -- Phaser 3.80.1 引擎(jsdelivr):**raw 1,181,917 B ≈ 1.13MB;gzip 传输 313,864 B ≈ 0.30MB** - ——账 B「引擎冷载 0.95MB」预算按 raw 口径超 0.18MB、按 gzip 传输口径富余 0.65MB; - **传输口径(gzip)下冷载显著优于预算**,账 B 的字节口径应钉「传输字节(含压缩)」,随 M0 真机计时一并定案 -- 字体子集 / UI 图集 / 首战卡面 / manifest+cover:M0 未产,按书预算挂账,随 M1+ 逐件实测 -- engineBundle 契约口径缺口(书 §9.3 已登记):`contracts/game-package.schema.json` 的 `engineBundle` - 语义是「引擎+包装+游戏代码 iife 内嵌、全局名 __GameBundle」(LittleJS 线形态),`bundleSize`=「包总字节」; - 本工程 Phaser external(bundle 不含引擎、全局名 __Tier2GameBundle)两字段计法均对不上——**问题在册、 - 不在本工程自改契约**,待契约侧确认(M0 报告项) -- 真机冷/暖启「到首战可交互」计时断言:本机无真机通道,**排 mini-desktop 窗口**(M0 报告项) +- 首局门(headless 代理):教学首战 5 seed 全 win、3–4 回合、演出估算 6.6–8.8s(≤60s;表 `FIRST_BATTLE` 口径,真机计时归窗口批) +- **完整 run 单局墙钟锚(§6.4 M1 出口)**:40 seed 贪心 driver,**中位 1.46ms/局、p95 2.32ms、max 3.18ms** + (headless、darwin/arm64 开发机,`dist/m1-walltime.json` 再生成)——书「秒–分钟级/格〔外推待实测〕」口径的首个实测, + 外推 M2 全矩阵 96,000 局 ≈ 2.4 分钟单线程量级,数值 CI 可行性坐实(以 M2 S12 实测为准) +- 通关可达:win 2/40、零 invalid、全部自然终局;通关局样本=15 胜战/3 Boss/得卡 14/遗物 3(§11「一局通关」兑现) +- 九门 driven:**接线已落**(play-spec + card-battle driver + runDriver 分发),全量真跑在 mini-desktop 窗口批 + +## 数值首轮回填记录(全部〔草案·M2 S12 调参轮为权威校准〕) + +贪心 driver v1 ×20–60 seed 迭代六轮,从 0/20 到 2/40 通关可达。改动全在表内: +相柳 155→130·甲 12→8·增益 2→1(多段吃力斜率最陡);烛阴 210→150;饕餮 280→195;赤犼 96→85;九尾 112→100; +幕缩放改逐幕表 HP[1,1.25,1.45]/攻[1,1.1,1.2](幂次复利是团灭主凶;书 ×2.2 锚以 M2 升级面为前提,届时回评); +憩点 30%→50%、幕间整备 50%、职业基线战胜回复 6(M1 无药水/商店,恢复面就这三件); +起始卡组攻 5/御 2/术 3;地图 1–4 层保底 1 中途憩点(M2 商店/事件落地后回评收回)。 +贪心 v1 胜率 5% 是**下界不是标定对象**——把敌线削到让最弱策略赢 45% 等于对真人放水,A0 带校准等 M2 三档 driver。 + +## 已知边界(如实) + +- 浏览器面(画面可见/真指针/九门 driven/CDP 三门)本机不可验,排 mini-desktop 窗口批 +- engineBundle/bundleSize 契约口径对 Phaser external 形态不适配:M0 已在册,待契约侧,本工程不自改 +- 富游戏三门 archetype 未接:卡牌品类门(构筑联动/曲线/latch 双终态)按书 §6.5 走验收门品类适配单另出 +- run 存档/商店删卡/仿真外壳 S12=M2(W-SAVE-CAP 已入库,M2 入口门的存档面就位) diff --git a/tier2/games/shanhai-xunyilu/index.html b/tier2/games/shanhai-xunyilu/index.html index a50b485a..c647cfcd 100644 --- a/tier2/games/shanhai-xunyilu/index.html +++ b/tier2/games/shanhai-xunyilu/index.html @@ -14,7 +14,7 @@ - 山海巡异录 · 北极星顶级线③ M0 + 山海巡异录 · 北极星顶级线③ M1