Runner v2 全弧第一相(HJ-RUNNER-ARC-001 / P1):用王蓝莓把"上层游戏宿主装载契约"
从零 spike 到"引擎真掌帧 + 游戏美术与引擎粒子同屏可玩",解锁 P2 泛化 / P3 生成。
契约与共享件
- 新增装载契约 game-runtime/src/core/game-host.d.ts(第9类 additive·暂名):
GameHostBootContext / GameInstance / GameHostFactory;游戏=纯模块工厂,零引擎 import,
能力经下层 ctx.getEngine()(受控面 6 项零改),绘制面 render(g) 的 g=引擎 mainContext
- makeEngineCaps 闭包提升为可 import 模块 host-dev/engine-caps.js(createEngineCaps):
host-dev/ref/未来生成游戏共用;engineMode 短路 / __engineCalls 探针 / null-engine 语义逐行不变
王蓝莓 real 通道(games/wanglanmei-ref)
- 增 ?engine=real:主循环从浏览器 RAF 改挂 engineInit 五回调(掌帧唯一源=引擎);
游戏美术绘制面从 #game 改引擎 mainContext(同屏合并);bundle 延后到 setupReal 内以
mainContext 建(getContext2d 闭包快照修);保 ?engine=stub 逐像素确定性回滚
- game-shop.js 抽为独立 GameHostFactory(零引擎 import,P3 生成 agent 可复制范本)
- entry.js 动态 import('littlejsengine')=node-import-safe ∧ esbuild iife 入包两全
- 驱动 e2e-input.cdp.cjs real 改造:禁 stepFrames 手摇(防双掌帧),真触摸+轮询;
门②同屏像素判据(暖色 warmHits ∧ 引擎粒子 brightHits 同张 #game-engine)
真机验收(mini-desktop real 引擎,5 门)
引擎掌帧 dFrame=31∈[20,45] / 同屏 warmHits=682∧brightHits=13028 同张 #game-engine /
particles.spawnEmitter+synthSfx call-ID 运行时真调引擎 / CDP 517 真触摸跑通整局
(第1天接待18·营收¥79.9·连击9) / console 零错;本机 88 单测全绿(含修复 4 红+补回归)
证据:games/wanglanmei-ref/evidence/p1-real/(e2e-evidence.json pass=true + 5 截图肉眼复核)
诚实 caveat:门② brightHits 在结算屏混入亮 UI,同屏合并由 warmHits(美术落引擎画布)+
call-ID(粒子真调引擎)+ 引擎架构(粒子渲同一 mainContext)三证成立,非阻断。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
358 lines
7.5 KiB
JSON
358 lines
7.5 KiB
JSON
{
|
|
"meta": {
|
|
"url": "http://127.0.0.1:4320/?engine=real&seed=305441741",
|
|
"seed": 305441741,
|
|
"startedAt": "2026-06-13T17:53:05.383Z",
|
|
"harness": "e2e-input.cdp.cjs(主会话)",
|
|
"engineMode": "real",
|
|
"coordMap": {
|
|
"rect": {
|
|
"l": 0,
|
|
"t": 0,
|
|
"w": 390,
|
|
"h": 844,
|
|
"vw": 390,
|
|
"vh": 844
|
|
},
|
|
"map": {
|
|
"l": 0,
|
|
"t": 0,
|
|
"sx": 1,
|
|
"sy": 1
|
|
},
|
|
"canvas": "#game-engine"
|
|
},
|
|
"endedAt": "2026-06-13T17:54:49.277Z"
|
|
},
|
|
"gates": {
|
|
"engineFrameDrive": {
|
|
"dFrame": 31,
|
|
"range": [
|
|
20,
|
|
45
|
|
],
|
|
"s0": {
|
|
"frame": 41,
|
|
"time": 0.6666666666666666,
|
|
"timeReal": 0.7665380000000002,
|
|
"paused": false,
|
|
"timeScale": 1
|
|
},
|
|
"s1": {
|
|
"frame": 72,
|
|
"time": 1.1833333333333333,
|
|
"timeReal": 1.2832379999999994,
|
|
"paused": false,
|
|
"timeScale": 1
|
|
}
|
|
},
|
|
"engineWiringCallId": {
|
|
"hasSpawn": true,
|
|
"sample": [
|
|
"audio.synth.synthSfx",
|
|
"audio.synth.synthSfx",
|
|
"audio.synth.synthSfx",
|
|
"audio.synth.synthSfx",
|
|
"audio.synth.synthSfx",
|
|
"audio.synth.synthSfx",
|
|
"audio.synth.synthSfx",
|
|
"audio.synth.synthSfx",
|
|
"audio.synth.synthSfx",
|
|
"audio.synth.synthSfx",
|
|
"particles.spawnEmitter",
|
|
"audio.synth.synthSfx",
|
|
"particles.spawnEmitter",
|
|
"audio.synth.synthSfx",
|
|
"particles.spawnEmitter",
|
|
"audio.synth.synthSfx",
|
|
"particles.spawnEmitter",
|
|
"audio.synth.synthSfx",
|
|
"particles.spawnEmitter",
|
|
"audio.synth.synthSfx"
|
|
]
|
|
},
|
|
"sameScreenPixels": {
|
|
"nonEmpty": true,
|
|
"width": 780,
|
|
"height": 1688,
|
|
"warmHits": 682,
|
|
"brightHits": 13028,
|
|
"maxCh": 254
|
|
},
|
|
"closedLoopRealInput": true,
|
|
"engineTakeover": true
|
|
},
|
|
"failures": [],
|
|
"zonesSeenByPhase": {
|
|
"real-prep-day1": [
|
|
"dec-soda",
|
|
"inc-soda",
|
|
"dec-snack",
|
|
"inc-snack",
|
|
"dec-bread",
|
|
"inc-bread",
|
|
"price-slider",
|
|
"up-speed1",
|
|
"up-shelf1",
|
|
"up-unlock_ice",
|
|
"up-decor1",
|
|
"up-unlock_toy",
|
|
"up-speed2",
|
|
"up-shelf2",
|
|
"up-decor2",
|
|
"openShop"
|
|
],
|
|
"real-day2-prep": [
|
|
"dec-soda",
|
|
"inc-soda",
|
|
"dec-snack",
|
|
"inc-snack",
|
|
"dec-bread",
|
|
"inc-bread",
|
|
"price-slider",
|
|
"up-speed1",
|
|
"up-shelf1",
|
|
"up-unlock_ice",
|
|
"up-decor1",
|
|
"up-unlock_toy",
|
|
"up-speed2",
|
|
"up-shelf2",
|
|
"up-decor2",
|
|
"openShop"
|
|
]
|
|
},
|
|
"stateSnapshots": [
|
|
{
|
|
"tag": "real-menu",
|
|
"state": {
|
|
"phase": "title",
|
|
"day": 1,
|
|
"cash": 1200,
|
|
"reputation": 62,
|
|
"priceMul": 1,
|
|
"stock": {},
|
|
"unlocked": [
|
|
"soda",
|
|
"snack",
|
|
"bread"
|
|
],
|
|
"upgrades": {},
|
|
"customers": 0,
|
|
"combo": 0,
|
|
"today": {
|
|
"revenueJiao": 0,
|
|
"soldCostJiao": 0,
|
|
"served": 0,
|
|
"angry": 0,
|
|
"stockout": 0,
|
|
"walkaway": 0,
|
|
"rescued": 0,
|
|
"bigSales": 0,
|
|
"maxCombo": 0
|
|
},
|
|
"lifetime": {
|
|
"days": 0,
|
|
"served": 0,
|
|
"angry": 0,
|
|
"netJiao": 0,
|
|
"upgradesBought": 0
|
|
},
|
|
"gameoverReason": null
|
|
}
|
|
},
|
|
{
|
|
"tag": "real-after-stock-day1",
|
|
"state": {
|
|
"phase": "prep",
|
|
"day": 1,
|
|
"cash": 840,
|
|
"reputation": 62,
|
|
"priceMul": 1,
|
|
"stock": {
|
|
"soda": 6,
|
|
"snack": 6,
|
|
"bread": 6
|
|
},
|
|
"unlocked": [
|
|
"soda",
|
|
"snack",
|
|
"bread"
|
|
],
|
|
"upgrades": {},
|
|
"customers": 0,
|
|
"combo": 0,
|
|
"today": {
|
|
"revenueJiao": 0,
|
|
"soldCostJiao": 0,
|
|
"served": 0,
|
|
"angry": 0,
|
|
"stockout": 0,
|
|
"walkaway": 0,
|
|
"rescued": 0,
|
|
"bigSales": 0,
|
|
"maxCombo": 0
|
|
},
|
|
"lifetime": {
|
|
"days": 0,
|
|
"served": 0,
|
|
"angry": 0,
|
|
"netJiao": 0,
|
|
"upgradesBought": 0
|
|
},
|
|
"gameoverReason": null
|
|
}
|
|
},
|
|
{
|
|
"tag": "real-after-serving-day1",
|
|
"state": {
|
|
"phase": "settle",
|
|
"day": 1,
|
|
"cash": 1239,
|
|
"reputation": 41.8,
|
|
"priceMul": 1,
|
|
"stock": {
|
|
"soda": 0,
|
|
"snack": 0,
|
|
"bread": 0
|
|
},
|
|
"unlocked": [
|
|
"soda",
|
|
"snack",
|
|
"bread"
|
|
],
|
|
"upgrades": {},
|
|
"customers": 0,
|
|
"combo": 0,
|
|
"today": {
|
|
"revenueJiao": 799,
|
|
"soldCostJiao": 360,
|
|
"served": 18,
|
|
"angry": 0,
|
|
"stockout": 13,
|
|
"walkaway": 0,
|
|
"rescued": 0,
|
|
"bigSales": 0,
|
|
"maxCombo": 9
|
|
},
|
|
"lifetime": {
|
|
"days": 1,
|
|
"served": 18,
|
|
"angry": 0,
|
|
"netJiao": 39,
|
|
"upgradesBought": 0
|
|
},
|
|
"gameoverReason": null
|
|
}
|
|
}
|
|
],
|
|
"hashes": {},
|
|
"screenshots": [
|
|
"real-menu.png",
|
|
"real-prep-day1.png",
|
|
"real-sameScreen.png",
|
|
"real-settle-day1.png",
|
|
"real-day2-upgraded.png"
|
|
],
|
|
"boot": {
|
|
"anchors": [
|
|
"t_boot",
|
|
"t_plugins_ready",
|
|
"t_game_init",
|
|
"t_first_paint",
|
|
"t_input_bound",
|
|
"t_game_start"
|
|
],
|
|
"initOk": true,
|
|
"registeredPlugins": [
|
|
"collision",
|
|
"physics-lite",
|
|
"gamefeel",
|
|
"particles-juice",
|
|
"palette-post",
|
|
"save-progress",
|
|
"audio-music",
|
|
"runtime-probe"
|
|
]
|
|
},
|
|
"checklist": {
|
|
"shougan": {
|
|
"tapFeedbackMaxFrames": 0,
|
|
"tapFeedbackWithin3": true,
|
|
"everyTapScalePulse": true,
|
|
"comboUiShown": false,
|
|
"flightEasingUsed": true,
|
|
"hitStopTriggered": false,
|
|
"bufferedServeReplays": 0
|
|
},
|
|
"meishu": {
|
|
"allDrawsViaPalette": true,
|
|
"vignetteEnabled": true,
|
|
"rushPaletteSeen": false,
|
|
"assetsLoaded": "13/13",
|
|
"noPrimaryPlaceholderRects": true
|
|
},
|
|
"yinyue": {
|
|
"audioUnlocked": false,
|
|
"bgmReady": false,
|
|
"bgmCrossfadeSeen": false,
|
|
"sfxKindCount": 0,
|
|
"sfxKinds": []
|
|
},
|
|
"shendu": {
|
|
"loopReachable": true,
|
|
"loopOps": 25,
|
|
"failureReachable": true,
|
|
"failureReason": "reputation",
|
|
"priceTwoSidedLoss": true,
|
|
"upgradeTreeSize": 8,
|
|
"firstUpgradeDay": 2
|
|
},
|
|
"juese": {
|
|
"keeperSpriteResident": true,
|
|
"lineGroups": 14,
|
|
"lineTotal": 30,
|
|
"linesShownLive": 0
|
|
}
|
|
},
|
|
"measures": {
|
|
"particle": {
|
|
"gold": 0,
|
|
"cream": 0,
|
|
"smoke": 0
|
|
},
|
|
"audio": {
|
|
"sfxKinds": [
|
|
"tick",
|
|
"shelve",
|
|
"arrive",
|
|
"coin",
|
|
"empty",
|
|
"upgrade"
|
|
],
|
|
"bgm": {
|
|
"ready": true,
|
|
"failed": false,
|
|
"idleLevel": 0.23916264021400713,
|
|
"rushLevel": 5.689900643400063e-12
|
|
}
|
|
},
|
|
"assetsMissing": [],
|
|
"frames": 6152,
|
|
"taps": 517,
|
|
"tapFeedbackMaxFrames": 1,
|
|
"comboUiShown": 1,
|
|
"hitStopCount": 0,
|
|
"rushPaletteSeen": true,
|
|
"bgmCrossfadeSeen": true,
|
|
"linesShown": 20,
|
|
"bufferedServeReplays": 0
|
|
},
|
|
"softLive": {
|
|
"rushPaletteSeen": true,
|
|
"bgmCrossfadeSeen": true,
|
|
"sfxKindCount": 0,
|
|
"hitStopTriggered": false,
|
|
"audioUnlocked": false
|
|
},
|
|
"pass": true
|
|
} |