lili 8d851ea716
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
feat(cheap-gen): W-AXIS-V2 波2——取证契约退役+提示全加载链清洗,四门∧测试员为唯一验收链
opus 执行位交付、主会话四步验收过(三套测试亲跑/红线 diff 亲读/冒烟截图亲眼):

- 验收消费:check 新增源码级插件调用存在断言(_pluginCallPresenceErrors 词法层,
  接替 F_wiring 真接线护栏);_forensicsView「必须实现」拦截摘除,降级为可选调试
  接口(handleTap 输入契约与 ctx.log 日志纪律保留);gate_judge 放行措辞对齐四门
- play-spec/驱动器退役(逐件裁定 10 件):gen.mjs done 门自动产 play-spec 摘除、
  cheap_gates/cheap_studio/cheap_modify/service_driver 调用摘除、_read_driver_type
  改读 evidence/playtest/playtest.json;golden-spec 三工具(auto_vs_golden/bake_off/
  compare_node)显式封存;ensure_play_spec 两实现保留一个版本窗口(只摘调用不删码)
- prompt 全加载链清洗:cheap-system.md v1.6.3→1.7.0(删 _forensicsView 自动验收
  契约红线与全部 targets/occupied 语义,五法句/品类指路同步),cheap_roles 内置
  回退逐字节同步(test_roles 12/12 证 parity),modify 切片经运行时切块自动同步;
  5 品类 skills+littlejs 手册+recipes×2+模板 8 件+README 6 件教学清洗,真设计
  价值(单击 casual/可解性质/双层反馈/latch)保留
- 批账:hard_genre_batch/xtheme 行加 playtest 段,_row_total_cost 修 shadow 下
  测试员成本漏算(v2 取 max 防双计)

验收(主会话亲验):pytest cheap-worker 512 绿 + tier2 141 绿 + node 49/49;
25 局基线新旧口径重放对照——真坏 5 局全拦(floor 拦 2/测试员拦 3)、无一例旧拦
新放,翻案 2 局均为破案坐实的仪器误杀;n=3 冒烟(mode=v2)全链绿:w2v2-sim
harness verdict.pass=True 而测试员 reject(机械放行测试员逮住,盘上双证)、
w2v2-sim-fix 现象反馈两轮回喂→fix2 收敛(配方显示修成,局内截图亲眼);
rg 零残留(模板残留均为「验收不读它」的降级调试接口合规形态);真跑 ¥8.4。

已知余项:repairFeedback 有产地、Service 续修环消费者未接(测试员 reject 不入
RepairMiddleware,续修判据仍四门)——是否接入随波3 校准数据一并裁;v1 配置级
回退窗口关闭为创始人知悉项,genconfig 默认 mode 仍 shadow、切 v2 归创始人。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 09:21:04 -07:00

2.3 KiB
Raw Blame History

recipe: 结算演出(爽感反馈 + 结算页驻留)

要做:成单/暴击/大额那一下有「打击感」,一局结束进结算页并停住不动

两个病根

  1. 结算态不驻留(自动重开) → 瞬时终态被漏读 → 宿主 500ms 轮询 phase 代发 game_end 时已经不在 over 态 → 结算闭环静默断裂。phaseover/gameover必须恒驻留(禁自动重开,等玩家点「再来」才回 menu
  2. juice.render(g) 忘了每帧手调 → 粒子/屏震/闪白全不显示juice 的 render 不是自动的,要在你的 render 里每帧调)。

抄这段形态(结算时刻的爽感)

// 成单/暴击那一下:一次 hitStop + 轻 shake + 音效(单行调用,不是系统,好手感标配)
onServeSuccess(x, y, isCrit) {
  juice.spawnEmitter('burst', x, y);          // 粒子迸发
  juice.hitStop(isCrit ? 90 : 40);            // 顿帧(毫秒)
  juice.shakeScreen(isCrit ? 6 : 3);          // 轻震屏
  audioMusic.playSfx(isCrit ? 'win' : 'coin'); // 语义音效名,自动映射
  sessionScore.addScore(isCrit ? 8 : 5);
}

render(g) {
  sceneFsm.render(g);
  juice.render(g);   // ★每帧手调,否则粒子/打击感看不见
}

抄这段形态(结算页 latch 驻留)

.define('over', {
  onEnter() {
    if (!sessionScore.isOver()) sessionScore.lose();  // 终态一次性落定
    this.overRestartRect = overRestartRect(viewport); // 「再来」命中区在 onEnter 建
    audioMusic.playSfx('fail');
  },
  render(g) {
    hudUi.drawText(g, `本局 ${sessionScore.getScore()} 分`, { x: viewport.w/2, y: 300 });
    hudUi.drawButton(g, this.overRestartRect, { label: '再来' });
  },
  // ★没有 update 里的自动 transition('menu')——驻留,等 handleTap 命中「再来」才回 menu
})

别踩

  • 音效名用语义名(coin/win/hit/jump/fail/click)或预设(blip/thud/chime),未知名自动兜底 blipaudioMusic.play(intensity) 入参是情绪强度 0..1、不是曲目名。
  • juice.spawnEmitter('burst', x, y) 也可写 juice.burst(x, y)(母语别名);hitStop/shakeScreen 收毫秒/像素。
  • 结算屏必须驻留(latch):到终态后停在结算不自动重开——玩家要看清战绩,测试员与调试观测也才能确认终态可达。