gamekit777 0.1.8 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -167,13 +167,14 @@ mount(host: Host<Config>, el: HTMLElement): Promise<GameInstance<Outcome>>
|
|
|
167
167
|
→ probe_table 能不能打表、modes 该写哪些键、book 怎么选
|
|
168
168
|
→ preview_play { rounds, seed?, simId? } 在预览里演几局(本地表模型:就地建表 → 抽行 → restore)
|
|
169
169
|
→ preview_set { layout: 'mobile' } 切到手机机台看一眼:安全区对不对、画面有没有被 HUD 盖住;preview_state 报回 stage.safe
|
|
170
|
-
→ case_add 把值得盯的局面存进 studio/cases.jsonl
|
|
170
|
+
→ case_add 把值得盯的局面存进 studio/cases.jsonl(seed / simId 取自 preview_play 的结果表)
|
|
171
171
|
→ build_table 采样 → 求解 → 编码 → 本地终验 → .studio/build/<指纹>/
|
|
172
172
|
→ publish_dry_run → publish 一键:vite build → 传包 → 传表 → 发布,不用人确认,不可逆。身份是作者在 studio 页面连过的站点身份;报「没有身份」就让作者打开页面连一次
|
|
173
173
|
```
|
|
174
174
|
|
|
175
175
|
- `game_info` 是第一跳:清单、schema、指纹、已建的表、预览连没连。
|
|
176
176
|
- 长任务返回 `jobId` 就用 `job_status` 轮询。
|
|
177
|
+
- **case 要早存、常跑。** 规则刚能跑就给每个 mode 存赢 / 输 / 边界 / 最大赔付各一条;改规则前先 `case_run` 一遍留底,改完再跑一遍看漂移。遇到演出异常、restore 对不上、某局赔付可疑,先用 `case_add` 把那一局固定住再改代码,修完用同一条 case 验证。
|
|
177
178
|
- `case_run` 任何结果变化都是 `fail`。是有意改的规则且这个 mode 没发布过,`case_bless` 接受。**已发布过的 mode,发牌逻辑、book 编解码、取整方式都不能再改**——历史局靠它们回放,要改就换 slug。
|
|
178
179
|
- `preview_set` 被否决会在 `rejected` 里说明——那是平台的否决权在起作用,不是 bug。
|
|
179
180
|
- 手动:`bun run dev` 起 studio(地址看终端输出,默认 `http://127.0.0.1:4301/`,被占会换;左边是预览机台,上方可切桌面 / 手机并选设备,右边是状态 / 调参 / 建表 / Case / 发布 / 日志);`bun run verify`、`bun run test`、`bun run build`。
|
package/package.json
CHANGED
package/studio/src/mcp.ts
CHANGED
|
@@ -135,7 +135,8 @@ export function createMcpServer(engine: Engine): McpServer {
|
|
|
135
135
|
const tail = ['', '### 下一步',
|
|
136
136
|
guide ? `- 先读 ${join(i.gameDir, 'CLAUDE.md')}:清单字段、round() 的硬约束、modes/book/restore 怎么选、演出侧约定`
|
|
137
137
|
: '- 这个目录没有 CLAUDE.md(写给 AI 的开发指南)。读 game.ts 和 src/rules/ 之前先记住:round() 纯函数只用注入 rng,payout 整数分,restore 的 payout 必须等于 (bet/100)×payoutCenti',
|
|
138
|
-
'- 改了规则先 run_task verify,再 probe_table 看 modes / book 该怎么写,然后 preview_play'
|
|
138
|
+
'- 改了规则先 run_task verify,再 probe_table 看 modes / book 该怎么写,然后 preview_play',
|
|
139
|
+
...(i.cases === 0 ? ['- 还没有 case:先 preview_play 几局,把每个 mode 的赢 / 输 / 边界局面用 case_add 存下来,之后改规则靠 case_run 抓漂移、复现问题靠它定位'] : [])];
|
|
139
140
|
for (const [k, f] of Object.entries(sn.schema)) {
|
|
140
141
|
const range = f.kind === 'int' || f.kind === 'number' ? `${f.min}..${f.max}` : f.kind === 'enum' ? f.options.map((o) => o.value).join('/') : f.kind === 'pick' ? `从 ${f.of.length} 选 ${f.count}` : '';
|
|
141
142
|
lines.push(`| ${k} | ${f.kind} ${range} | ${JSON.stringify(f.default)} | ${f.affectsOutcome ? '是' : '否'} | ${f.ui} | ${f.devOnly ? '是' : ''} |`);
|
|
@@ -315,7 +316,7 @@ export function createMcpServer(engine: Engine): McpServer {
|
|
|
315
316
|
});
|
|
316
317
|
|
|
317
318
|
s.registerTool('preview_play', {
|
|
318
|
-
description: '在预览里演几局并拿回每局结果(本地表模型:就地建表、按权重抽行、restore 还原)。给 seed 就复现那一局,给 simId 就直接演表里第 N 行。animate=false
|
|
319
|
+
description: '在预览里演几局并拿回每局结果(本地表模型:就地建表、按权重抽行、restore 还原)。给 seed 就复现那一局,给 simId 就直接演表里第 N 行。animate=false 跳过动画。结果表里的 seed / simId 可直接喂给 case_add 固定住那一局。',
|
|
319
320
|
inputSchema: {
|
|
320
321
|
rounds: z.number().int().min(1).max(50).default(1),
|
|
321
322
|
bet: z.number().int().optional(),
|
|
@@ -339,7 +340,7 @@ export function createMcpServer(engine: Engine): McpServer {
|
|
|
339
340
|
});
|
|
340
341
|
|
|
341
342
|
s.registerTool('case_add', {
|
|
342
|
-
description: '记一条 case:给 config + (seed 或 table:{mode,simId}),studio 跑一遍算出期望值存进 cases.jsonl。作者点播、AI
|
|
343
|
+
description: '记一条 case:给 config + (seed 或 table:{mode,simId}),studio 跑一遍算出期望值存进 cases.jsonl。作者点播、AI 单测、结果漂移护栏三用。开发早期就该存几条(每个 mode 的赢 / 输 / 边界 / 最大赔付各一条),遇到演出异常或 restore 对不上先把那局存成 case 再改代码——seed / simId 从 preview_play 的结果表里取。',
|
|
343
344
|
inputSchema: {
|
|
344
345
|
title: z.string(), tags: z.array(z.string()).optional(), note: z.string().optional(),
|
|
345
346
|
config: z.record(z.string(), z.unknown()), bet: z.number().int().default(100),
|