固化 Match-3 生产者、视觉、音频与双 Judge 证据闭包。 将《山海行纪》r1.1 绑定新的不可变 release,并以生产预检现场核验 bundle、Registry/2 和 25 项 Writer 快照。 同步地图1平衡锁值、跨游戏回归修复、验收契约与 SoT 证据。
_template-puzzle — A-model「规则谜盘」解谜品类轻脚手架(3 层架构)
一个可玩的完整解谜游戏:每关一条线索(找出所有【红色】/【星形】/【两颗】…)→ 观察盘面 → 点中所有符合的格子过关 → 关卡逐关引入新规则维度 → 通全关提前胜利 / 限时到点结算(menu→play→over)。这份骨架已经把整套谜盘循环接好了(含可选的调试视图)——你的活是按 brief 换主题、加深度,不是重写循环。
怎么改 = 给这款解谜换身份,循环结构别动:
- 换主题/元素/文案 → 改
src/core.js的THEME(shapes/colors/countNames/标题)。宝石写圆/菱/星,水果写苹果/香蕉/葡萄,海洋写鱼/贝/星——同骨架做出不雷同的解谜就靠这里。 - 调难度/关卡阶梯 → 改
src/core.js的LEVELS(盘面大小/解数/规则维度逐关递进)与节奏常量(观察窗/锁定/连击窗)。 - 换观感(底景/元素画法/配色)→ 改
src/render.js(drawGlyph把圆/菱/星换成你的元素)。 - 想加机制(星级/图鉴/新规则维度/每日谜题)→ 在
src/game-logic.js循环里加。 - 别推倒重写整个循环:出题/观察窗/点解判定/连击/过关递进/限时结算/卡壳提示都接好了,从它起步只补身份与深度,远比从零写省。
- 「设计什么才好玩」读
.agents/skills/puzzle-game-design.md(顿悟距离/规则递进/卡壳兜底/成绩炫耀);完整过门正例参照game-runtime/games/_fewshot-puzzle/src/。
3 层 + 你只碰 L3
| 层 | 文件 | 你 |
|---|---|---|
| L1 固定 plumbing(write 会被拒) | index.html · entry-bundle.js · src/host-config.js(已注入全 11 插件 + viewport 390×844 + wiring) · src/game.js(薄 wrapper:摊平 opts.runtime → 交 game-logic) |
不碰 |
| L3 游戏本体(已是完整解谜游戏) | src/game-logic.js(谜盘循环 + 五法 + 取证契约) · src/core.js(纯逻辑 + 多样性参数空间) · src/render.js(观感) · src/assets.js(资产装载) |
在这上面换身份加深度 |
入口契约(钉死)
// src/game-logic.js —— 谜盘循环已写好,你换身份
export function createGame({ plugins, bundle, viewport }) {
// 插件已扁平注入(全 11 件,用到才解构);本骨架解谜档用 6 件:
const { sceneFsm, sessionScore, hudUi, timerScheduler, audioMusic, juice } = plugins;
// 全部可用键:sceneFsm sessionScore hudUi timerScheduler save gamefeel juice palettePost audioMusic collision physics
return {
async init(boot) { const ctx = boot.ctx; /* 装资产→定义场景→start;输入不订阅(L1 派发到 handleTap) */ },
update(dt) { bundle.tick(dt); /* ★必调;再推进玩法 */ },
render(g) { /* 画在 g;读 viewport.w/h */ },
handleTap(x, y) { /* ★输入入口:各 phase 点击逻辑;L1 在 pointerdown 时直达调用(别自己订阅输入) */ },
destroy() {},
_forensicsView() { return { state(){ /* phase/score/targets 实时算 */ }, measures(){} }; }, // 可选调试接口(验收不读)
};
}
铁律(check 会拦)
- 入参扁平
{plugins, bundle, viewport}—— 没有 opts、没有 opts.runtime、没有 ctx(L1 已摊平)。受控面 ctx 只在init(boot).boot.ctx(时间/随机/输入/引擎)。 - 插件直接
const {…} = plugins—— 别写opts.runtime.plugins(L1 内部的,你见不到)。游戏只用、不 new、不 register。 update(dt)必调bundle.tick(dt)—— 否则 timer-scheduler 等 onFrame 不推进、限时永不到点、一局不结束。dt是秒:游戏内毫秒计时要elapsedMs += dt*1000;timerScheduler.after(ms)收毫秒(75s 写 75000)。- 零引擎 import(引擎经
boot.ctx.getEngine());游戏源零裸 Math.random/Date.now/setTimeout/new AudioContext/addEventListener —— 时间随机经 boot.ctx,定时经 timer-scheduler,音效经 plugins.audioMusic;输入不调 ctx.getInput——写实例方法handleTap(x,y)(点击)/handleKey(key)(键盘),L1 在 pointerdown/keydown 时直达调用。 - 插件方法名一律以
src/plugins/<name>/api.d.ts为准,别臆测(scene-fsm 是define不是 defineScenes)。本骨架已用对的母语写法:sessionScore.add(n)计分、juice.burst(x,y)爆点、hudUi.drawButton(g,rect,opts)返回命中矩形可直接接住判命中。 - 画面读
viewport.w/h,别硬编码 390×844。 _forensicsView()是可选调试接口:state() 实时导出盘面/得分/关卡等(targets 标当前正确解,调试时一眼看出解算对没对);W-AXIS-V2 起验收不再读它(验收 = 四门投影 ∧ 测试 agent 真玩)。
你写什么 vs 调什么
- 你写(玩法身份):主题/元素/文案与关卡曲线(core 顶部参数空间)、观感与元素画法(render)、把身份接到已写好的谜盘循环(game-logic 一般只微调/加机制)。
- 你调(通用机制):计分
sessionScore· 场景机sceneFsm· UI 原语hudUi· 受控定时timerScheduler· 持久save· 手感gamefeel· 粒子juice· 后处理palettePost· 音频audioMusic· 碰撞/物理collision/physics(全已注入,用到才取)。
详见 .agents/skills/littlejs-game-dev.md(11 插件 API 速查 + ❌→✅ 易犯错)与 .agents/skills/puzzle-game-design.md(解谜设计手册)。