lili 34923812c3 fix(gen): 模板起局鲁棒性 menuStartBtn 解耦 render + targets 键/起局约定进 prompt v1.6.1 + gen.mjs 入口守卫 (W-S1 修复单②)
T1 六款模板(_template + feiyi/puzzle/shop/story/trpg)起局/重开按钮命中矩形:
从 render 副作用回写(menuStartBtn = renderMenu(...).startBtn)改为抽纯几何
menuStartRect/overRestartRect + 在场景进入点 onEnter 确定性赋值、render 只画;
治并发 rAF 饥饿下 render 未跑过=命中矩形恒 null=卡 menu(归因案4)。
no-render 探针坐实:修复前六款均卡 menu、修复后均按坐标起局进 play。

T2 cheap-system.md 升 v1.6.1,红线段增两条硬约束:①点 target 玩法 state 键名
固定为 targets(不得改成 items 等,C5 驱动器族选择依赖)②起局命中矩形须在状态
进入点建立、不依赖渲染帧;各模板 _forensicsView 加同义契约注释。cheap_roles.py
_SYSTEM_PROMPT 与 md 正文逐字节 parity 同步,registry.yaml 版本 bump 对齐。

T3 gen.mjs 顶层裸调 main() 加入口守卫(import.meta.url === pathToFileURL(argv[1])),
被 import 时不再触发真生成(footgun,曾 ~116s)、直接执行行为不变。

T4 puzzle-game-design.md §9 死链经核实在本 commit 不存在(唯一 play-spec 引用已
正确指向存在的 puzzle.play-spec.json),未伪造改动;littlejs-game-dev.md 补一条
起局 onEnter 指导闭合 doc-code。

验证:test_roles 12/12 + check_registry 17 对齐 + md↔_SYSTEM_PROMPT parity True
+ 6 模板 esbuild build 全绿 + amodel-gen tests 15+11 + 模板 node --test 除
_template-shop/headless-boot(既存红,与基线同)外全绿。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 14:17:53 -07:00
..

_template-feiyi — A-model「非遗工序节拍」品类骨架(3 层架构)

一个可玩的完整工序游戏:一件作品 = 一条有先后的工序链,工序依次「就绪」→ 在火候窗口内点击就绪工位完成该道 → 整条链走完出一件成品 → 错过窗口回炉重做 → 60 秒限时开工结算(menu→play→over)。这份骨架已经把整套工序循环接好了(含让自动验收能跑通的取证契约)——你的活是按 brief 换手艺,不是重写循环。

怎么改 = 给这间工坊换一门手艺,循环结构别动:

  • 换手艺/工序/作品/难度 → 改 src/core.js 顶部的「多样性参数空间」(CRAFT_CHAIN 工序链、WORKS 作品表、就绪间隔/窗口/回炉常量)。制陶写选料/塑形/上彩,织造写纺线/上机/织纹,灯彩写扎骨/糊面/点灯——同骨架做出不雷同的手艺就靠这里。工序名用该门手艺的通识工序词,别编造具体非遗项目的失实细节(设计手册 §9 红线)。
  • 换观感(案台布景/工位长相/配色)→ 改 src/render.js。
  • 想加机制(正窗暴击 combo/解锁新作品/图鉴)→ 在 src/game-logic.js 循环里加,但别破坏 _forensicsView 的 targets/score 契约(改坏=九门 H 进展门直接挂)。
  • 别推倒重写整个循环:工序就绪/火候窗口/回炉/出成品/限时结算都接好了,从它起步只补身份,远比从零写省。
  • 玩法设计先读 .agents/skills/heritage-game-design.md(这个品类什么好玩:玩法化范式/节奏目标值/双层奖励/文化表述红线)。

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/gamefeel 等 onFrame 不推进、timer 永不到期、一局不结束。dt 是秒:游戏内毫秒计时要 elapsedMs += dt*1000;timerScheduler.after(ms) 收毫秒(60s 写 60000)。
  • 零引擎 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 列每工位一项、「当前就绪且窗口内可点」的工位 occupied:true(自动验收只点这些工位驱动工序);score 随完成工序单调上升(自动验收据它判真有进展)。换手艺加机制都别动这两个键的语义。

你写什么 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 速查 + ❌→✅ 易犯错)。