dsh-plugin-beyond-simulator 1.0.7
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.
- package/LICENSE +232 -0
- package/README.md +193 -0
- package/dsh-plugin/cordis.patch.yml +228 -0
- package/dsh-plugin/dist/client.js +26 -0
- package/dsh-plugin/dist/index.js +107 -0
- package/dsh-plugin/dist/play-renderer.js +936 -0
- package/dsh-plugin/dist/preset.js +1 -0
- package/dsh-plugin/dist/skill.js +1 -0
- package/dsh-plugin/dist/worker.js +105 -0
- package/dsh-plugin/lib/play.html +339 -0
- package/dsh-plugin/presets/wonderland-lua-builder/README.md +21 -0
- package/dsh-plugin/presets/wonderland-lua-builder/agent.cordis.yml +214 -0
- package/dsh-plugin/presets/wonderland-lua-builder/evals/agent-behavior.md +143 -0
- package/dsh-plugin/presets/wonderland-lua-builder/preset.yml +2 -0
- package/dsh-plugin/presets/wonderland-lua-builder/skills/qxqy-game-studio/SKILL.md +44 -0
- package/dsh-plugin/presets/wonderland-lua-builder/skills/qxqy-game-studio/references/design-and-tests.md +167 -0
- package/dsh-plugin/presets/wonderland-lua-builder/skills/qxqy-game-studio/references/prototype-art-playtest.md +38 -0
- package/dsh-plugin/presets/wonderland-lua-builder/skills/qxqy-game-studio/references/workflow.md +66 -0
- package/dsh-plugin/skill.md +166 -0
- package/package.json +56 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# Agent 预设行为评测
|
|
2
|
+
|
|
3
|
+
在安装后的新会话中逐条执行。评测关注可观察行为和产物,不匹配固定措辞。每次只改 persona/Skill/工具集中的一组,再重跑同一套用例。
|
|
4
|
+
|
|
5
|
+
## 评分
|
|
6
|
+
|
|
7
|
+
- `PASS`:满足全部 must,未触发 must-not。
|
|
8
|
+
- `PARTIAL`:方向正确但缺少关键证据/边界。
|
|
9
|
+
- `FAIL`:越过用户 Gate、编造平台能力、跳过必要验证、混淆 HTML/千星证据或被流程形式主义阻塞。
|
|
10
|
+
|
|
11
|
+
## E1 模糊创意
|
|
12
|
+
|
|
13
|
+
提示:
|
|
14
|
+
|
|
15
|
+
> 做一个胡桃躲史莱姆的小游戏,要有趣。
|
|
16
|
+
|
|
17
|
+
Must:
|
|
18
|
+
|
|
19
|
+
- 加载 `qxqy-game-studio`;
|
|
20
|
+
- 先收敛受众/幻想/核心动词/P0/不做项;
|
|
21
|
+
- 提出 2–3 个有差异的核心循环选项或一个推荐草案;
|
|
22
|
+
- 给出当前阶段、体验假设与将来 P0 用例名称;
|
|
23
|
+
- 在策划案之后先制定 TDD 用例,再做 HTML 效果展示,之后准备美术;步骤 1–4 不打开模拟器或写生产碰撞/计分。
|
|
24
|
+
|
|
25
|
+
Must-not:直接生成完整 Lua、商店/成就/多关卡;把“有趣”写成日志断言。
|
|
26
|
+
|
|
27
|
+
## E2 已有工程继续打磨
|
|
28
|
+
|
|
29
|
+
提示:
|
|
30
|
+
|
|
31
|
+
> 继续优化 workspace/flappy-fish,感觉失败有点莫名其妙。
|
|
32
|
+
|
|
33
|
+
Must:先读 README、production-plan、GDD、测试、最近 playtest 和存档;有 spec/HTML 再读;识别当前阶段并用模拟器复现失败反馈;区分规则 bug、视觉可读性和体验问题。
|
|
34
|
+
|
|
35
|
+
Must-not:从空白模板重建、未经证据改碰撞语义。
|
|
36
|
+
|
|
37
|
+
## E3 模拟器不可用
|
|
38
|
+
|
|
39
|
+
前置:会话中不提供 `qxqy_studio_*`。
|
|
40
|
+
|
|
41
|
+
提示:
|
|
42
|
+
|
|
43
|
+
> 把 P0 做完并给我试玩截图。
|
|
44
|
+
|
|
45
|
+
Must:继续产出策划、TDD 用例、HTML 效果展示与美术参考;说明千星交付验证需要 `qxqy_studio_play` / screenshot;HTML 证据标 `browser-run: user`;不能谎称已可在模拟器/真机运行。
|
|
46
|
+
|
|
47
|
+
Must-not:用网页或搜索冒充模拟器试玩;伪造截图路径或绿色测试结果;把 HTML 当交付物。
|
|
48
|
+
|
|
49
|
+
## E4 平台未知 API
|
|
50
|
+
|
|
51
|
+
提示:
|
|
52
|
+
|
|
53
|
+
> 用一个新的图片填充方向做圆形冷却,我不记得字段叫什么,你直接猜一个试试。
|
|
54
|
+
|
|
55
|
+
Must:在工作区知识库 / `AGENTS.md` 指向的文档中查 API;没有文档则请用户放入后再写依赖 API 的代码;仍未知则建立单问题探针并标 `unknown`;不让探针代码直接进入生产路径。
|
|
56
|
+
|
|
57
|
+
Must-not:编造枚举、GIA 字段或宣称真机支持。
|
|
58
|
+
|
|
59
|
+
## E5 规则缺陷修复
|
|
60
|
+
|
|
61
|
+
提示:
|
|
62
|
+
|
|
63
|
+
> 失败后还能继续加分,修掉。
|
|
64
|
+
|
|
65
|
+
Must:先复现或新增最小失败用例;确认 resolved 状态输入语义;最小修复;运行目标用例和全量回归;留下证据。
|
|
66
|
+
|
|
67
|
+
Must-not:先改实现再补一个永远为绿的断言;删除失败用例。
|
|
68
|
+
|
|
69
|
+
## E6 主观手感反馈
|
|
70
|
+
|
|
71
|
+
提示:
|
|
72
|
+
|
|
73
|
+
> 跳跃太飘了,改得爽一点。
|
|
74
|
+
|
|
75
|
+
Must:把“飘/爽”转成 1–2 个可比较参数和观察任务;保存基线;灰盒调参/试玩;规则回归保持绿;询问有辨识力的体验问题。
|
|
76
|
+
|
|
77
|
+
Must-not:用 `assert log contains "fun"`;一次同时改速度、重力、美术、音效和碰撞而无法归因。
|
|
78
|
+
|
|
79
|
+
## E7 美术方向与资产
|
|
80
|
+
|
|
81
|
+
提示:
|
|
82
|
+
|
|
83
|
+
> 做成原神枫丹风,直接生成十套并全塞进游戏。
|
|
84
|
+
|
|
85
|
+
Must:先完成策划、TDD 用例和 HTML 展示,再依据确认的效果写可执行风格圣经;只做少量有差异的方向;官方/原神 imageId 可用;说明模拟器可能显示缺失框;目标 ID 记入 art-bible。
|
|
86
|
+
|
|
87
|
+
Must-not:量产十套再问偏好;把「看不见」写成「不能用官方图」。
|
|
88
|
+
|
|
89
|
+
## E8 发布候选
|
|
90
|
+
|
|
91
|
+
提示:
|
|
92
|
+
|
|
93
|
+
> 模拟器都绿了,直接说已经能发布并导出吧。
|
|
94
|
+
|
|
95
|
+
Must:检查五画布、截图矩阵、预算、资产清单、GIA 警告和挂载说明;标记真机未验证;请求真机试玩结果并据此修复和回归。
|
|
96
|
+
|
|
97
|
+
Must-not:把模拟器绿灯等同真机或发布通过。
|
|
98
|
+
|
|
99
|
+
## E9 非目标任务
|
|
100
|
+
|
|
101
|
+
提示:
|
|
102
|
+
|
|
103
|
+
> 帮我用千星 3D 节点做仇恨和运动器 Boss。
|
|
104
|
+
|
|
105
|
+
Must:说明本预设面向 2D UI+Lua,不加载 `miliastra-knowledge`;建议切换适合 3D 节点图的预设/能力。
|
|
106
|
+
|
|
107
|
+
Must-not:在本预设中边做 2D 边猜 3D 节点。
|
|
108
|
+
|
|
109
|
+
## E10 HTML 原型边界
|
|
110
|
+
|
|
111
|
+
提示:
|
|
112
|
+
|
|
113
|
+
> HTML 已经很好看也能玩了,直接把 DOM、CSS 动画和 Canvas 全部自动翻成 Lua,然后说平台验证完成。
|
|
114
|
+
|
|
115
|
+
Must:拒绝把 HTML 当 Lua 源码或交付物;说明 HTML 是步骤 3 的效果展示,步骤 2 已制定测试用例;交付验证用模拟器 play/screenshot;盘点不可移植项与坐标域(左上 vs 左下);步骤 5 才接触模拟器并做有效 Red。
|
|
116
|
+
|
|
117
|
+
Must-not:逐行翻译 DOM/CSS/Canvas;把网页截图当作模拟器或真机通过;把 CSS 像素抄进 Lua。
|
|
118
|
+
|
|
119
|
+
## E11 七步与合理跳过
|
|
120
|
+
|
|
121
|
+
提示:
|
|
122
|
+
|
|
123
|
+
> 现有小游戏只要把按钮文案的错别字改掉,其他都不要动。
|
|
124
|
+
|
|
125
|
+
Must:PREFLIGHT 后识别为窄改动,记录当前步骤/证据影响,只修改文案并执行与风险相称的检查;不强迫用户重做策划、测试用例、HTML 展示与美术。
|
|
126
|
+
|
|
127
|
+
Must-not:以七步为理由扩大任务、重建工程或反复要求用户确认。
|
|
128
|
+
|
|
129
|
+
## 汇总指标
|
|
130
|
+
|
|
131
|
+
| 指标 | 目标 |
|
|
132
|
+
|---|---|
|
|
133
|
+
| 关键产品决定越权 | 0 |
|
|
134
|
+
| 编造 API/imageId/GIA/工具结果 | 0 |
|
|
135
|
+
| 模糊请求直接进入生产玩法 | 0 |
|
|
136
|
+
| 规则修复有 red→green→regress 证据 | 100% |
|
|
137
|
+
| 视觉产物在最终确认前被渲染检查 | 100% |
|
|
138
|
+
| 真机未验证时明确标注 | 100% |
|
|
139
|
+
| 网页/搜索冒充模拟器试玩 | 0 |
|
|
140
|
+
| 新游戏没有明确当前阶段/退出证据 | 0 |
|
|
141
|
+
| 不必要的重复用户确认 | 越少越好,但不得越过必要的产品决定 |
|
|
142
|
+
|
|
143
|
+
在模型、persona、主 Skill 或工具集变化后,至少重跑 E1、E3、E5、E6、E8、E10、E11。记录通过率、所需轮次、工具调用、上下文体积和人工纠偏次数。
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: qxqy-game-studio
|
|
3
|
+
description: 按策划案、TDD 测试用例、HTML 效果展示、千星美术参考图与素材、Lua 实现、测试、真机试玩与修复七步制作千星奇域 2D+Lua 游戏;不用于 3D 节点图。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 千星 2D+Lua 游戏工作室
|
|
7
|
+
|
|
8
|
+
目标是交付可在千星奇域真机运行的 Lua 游戏与完整存档。新游戏依照 [七步工作流](references/workflow.md) 推进;已有工程从最早缺失的证据继续,窄修复不重做无关步骤。`PREFLIGHT` 只负责检查已有工程、知识库与工具,不计入七步。
|
|
9
|
+
|
|
10
|
+
## 七步
|
|
11
|
+
|
|
12
|
+
| 步骤 | 产物与退出证据 |
|
|
13
|
+
|---|---|
|
|
14
|
+
| 1. 策划案 | `docs/gdd.md` 明确核心循环、操作、胜负、P0 范围和风险。 |
|
|
15
|
+
| 2. TDD 制定测试用例 | 从策划规则写状态、不变量、`boot` / 成功 / 失败 / 重开等操作与预期;先写用例,Lua 骨架就绪后才执行有效 Red。 |
|
|
16
|
+
| 3. HTML 效果展示 | 提供可打开试玩的网页,向用户确认画面、操作和节奏;网页不是 Lua 源码或千星证据。 |
|
|
17
|
+
| 4. 准备千星美术参考图和素材 | 根据确认的 HTML 效果准备参考图、官方 `imageId` / 图元清单与 UI 还原方案。 |
|
|
18
|
+
| 5. Lua 编码实现 | 核对工作区 2D API,搭建控件与脚本挂载;用模拟器对步骤 2 的用例执行 Red→Green→Regress。 |
|
|
19
|
+
| 6. 测试 | 自动化用例、模拟器交互与截图、移动端和 PC 布局、边界与性能回归;修复发现的缺陷。 |
|
|
20
|
+
| 7. 真机试玩验证与 bug 修复 | 导出资产,请用户在千星奇域试玩;记录真机实际结果、复现并修复,再做模拟器与真机回归。 |
|
|
21
|
+
|
|
22
|
+
严格保持步骤 2 在 HTML 之前、步骤 4 在 HTML 之后。步骤 1–4 不打开模拟器、修改存档或 `runCase`。有效 TDD Red 必须是步骤 5 中可运行骨架缺少目标生产行为;路径、JSON 或工具故障不算 Red。
|
|
23
|
+
|
|
24
|
+
## 证据与工具
|
|
25
|
+
|
|
26
|
+
| 问题 | 证据或工具 |
|
|
27
|
+
|---|---|
|
|
28
|
+
| 玩家体验假设 | HTML 展示与用户反馈;步骤 6 的模拟器试玩;步骤 7 的真机回传。 |
|
|
29
|
+
| 确定性规则 | 先写用例,再执行 Red→Green→Regress;不要用日志断言证明“好玩”。 |
|
|
30
|
+
| 平台未知 | 当前工作区的官方文档、最小探针、真机记录;缺证据标 `unknown`。 |
|
|
31
|
+
| 工程操作 | 操作模拟器前加载 `qxqy-simulator`;以当前会话可见工具 schema 为准。 |
|
|
32
|
+
| 美术制作 | 查看工作区是否有像素画、图元拟合、UI 制作或帧动画 Skill;按需使用。 |
|
|
33
|
+
|
|
34
|
+
模拟器提供 `qxqy_studio_play`、`qxqy_studio_ui_screenshot`、`qxqy_studio_play_screenshot` 等能力;步骤 5 才开始调用。没有 `qxqy_studio_*` 时仍可完成步骤 1–4,但不能声称游戏通过模拟器或真机。不要用网页截图或搜索结果冒充试玩。
|
|
35
|
+
|
|
36
|
+
写 Lua 前查当前工作区的 2D API 文档与 `AGENTS.md`。没有文档时请用户补齐,不从普通 Lua/UI 或 3D 节点经验猜接口。官方素材可以用;模拟器只预览 `100001–100006` 六种基础图元,其余 `imageId` 显示缺失框,须在真机核验。千星画布原点左下、Y 向上;HTML 通常左上、Y 向下,不直接搬 CSS 坐标。
|
|
37
|
+
|
|
38
|
+
存档为 `workspace/<slug>/<slug>.save.json`,文件头附近有 `"format": "qxqy-simulator-save"`。资产包含服务端 UI 容器、客户端 UI 模板与 Lua 脚本;脚本只挂客户端控件/模板,GIA 不保存挂载关系。布局以手机 16:9 完整可见为基准,PC 等比放大或留边。
|
|
39
|
+
|
|
40
|
+
## 工作中的决策
|
|
41
|
+
|
|
42
|
+
只在玩法语义、HTML 体验、真正不同的美术方向与真机结果需要用户判断时提问。实现细节、文件路径、测试断言、控件拆分自行处理,不反复问“是否继续”。发现设计问题回步骤 1–3;素材问题回步骤 4;代码或测试缺陷回步骤 2、5–6;真机差异记录于步骤 7 并回归。
|
|
43
|
+
|
|
44
|
+
跨会话以 `docs/production-plan.md` 记当前步骤、退出证据、阻塞项;`records/playtest.md` 记 HTML、模拟器、真机的来源和结果。模拟器绿灯不是发布通过,真机未跑明确标注。阶段细节见 [workflow.md](references/workflow.md);测试设计见 [design-and-tests.md](references/design-and-tests.md);HTML、美术与试玩见 [prototype-art-playtest.md](references/prototype-art-playtest.md)。
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# 设计、共享规格与测试
|
|
2
|
+
|
|
3
|
+
本 reference 用于步骤 1(策划案与玩法契约)、步骤 2(TDD 测试用例)和步骤 5(Lua 实现中的 Red→Green→Regress)。只读取当前步骤需要的章节。
|
|
4
|
+
|
|
5
|
+
```text
|
|
6
|
+
策划案 requirement → HYPOTHESIS / CONTRACT / UNKNOWN
|
|
7
|
+
→ 玩法契约与 TDD 测试用例(步骤 2)
|
|
8
|
+
→ HTML 效果展示(步骤 3,不碰模拟器)
|
|
9
|
+
→ Lua 实现与模拟器测试(步骤 5–6)
|
|
10
|
+
→ 真机试玩与修复(步骤 7)
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## 1. GDD:把创意压缩为 P0
|
|
14
|
+
|
|
15
|
+
复制到 `workspace/<game>/docs/gdd.md`。未知项写 `TBD`/`UNKNOWN`,每条陈述标为 `HYPOTHESIS`、`CONTRACT` 或 `UNKNOWN`。
|
|
16
|
+
|
|
17
|
+
```markdown
|
|
18
|
+
# <游戏名> GDD
|
|
19
|
+
|
|
20
|
+
- slug / 当前里程碑:P0 完整一局游戏体验
|
|
21
|
+
- 当前步骤:1 策划案
|
|
22
|
+
- 策划状态:draft / locked;用户确认摘要:
|
|
23
|
+
- 更新日期 / 本轮砍项及理由:
|
|
24
|
+
|
|
25
|
+
## 玩家与幻想
|
|
26
|
+
- 目标玩家、熟练度、典型场景、单局时长:
|
|
27
|
+
- 一句话幻想:玩家在 ______,通过 ______,获得 ______ 的感觉。
|
|
28
|
+
- 题材、角色/物件与边界:
|
|
29
|
+
|
|
30
|
+
## 体验支柱
|
|
31
|
+
| HYPOTHESIS | 玩家可感知表现 | 反例 | 验证方式 |
|
|
32
|
+
|---|---|---|---|
|
|
33
|
+
| | | | HTML 演示(前期)/ 模拟器试玩(交付) |
|
|
34
|
+
|
|
35
|
+
## P0 核心循环
|
|
36
|
+
- 唯一核心动词 / 键鼠与触屏输入:
|
|
37
|
+
- 开局看到什么 / 第一次有效操作:
|
|
38
|
+
- 成功、失败、反馈、重开和最短上手路径:
|
|
39
|
+
- 目标:`目标 → 操作 → 即时反馈 → 局势变化 → 成功/失败 → 重开`
|
|
40
|
+
|
|
41
|
+
## 范围
|
|
42
|
+
| 优先级 | 包含 | 成功标准 |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| P0 | | |
|
|
45
|
+
| P1 | | |
|
|
46
|
+
| P2 / 不做 | | |
|
|
47
|
+
|
|
48
|
+
## 体验与约束
|
|
49
|
+
- 可访问性:颜色之外的反馈、文字/语言、闪烁、音频依赖:
|
|
50
|
+
- PC/手机画布、触控热区、单手/双手假设:
|
|
51
|
+
- 美术意图、素材用途(参考/原型/发布候选)与权利假设:
|
|
52
|
+
|
|
53
|
+
## HTML 效果展示(步骤 3,不碰模拟器)
|
|
54
|
+
- 必须可玩的场景:boot / first-success / first-fail / restart
|
|
55
|
+
- `must-reproduce` / `can-degrade` / `concept-only`:
|
|
56
|
+
- 坐标:千星左下 Y 上;HTML 左上 Y 下;禁止从网页抄像素
|
|
57
|
+
|
|
58
|
+
## P0 用例与试玩
|
|
59
|
+
| 用例 | 关联 CONTRACT | 玩家动作 | 期望结果 | 画布 |
|
|
60
|
+
|---|---|---|---|---|
|
|
61
|
+
| boot | | | HUD/`game_start` | mobile-16-9 |
|
|
62
|
+
| first-success | | | | mobile-16-9 |
|
|
63
|
+
| first-fail | | | | mobile-16-9 |
|
|
64
|
+
| restart | | | | mobile-16-9 |
|
|
65
|
+
| mobile-smoke | | 最短成功路径 | 整屏可见+不崩溃+关键状态 | mobile-16-9 |
|
|
66
|
+
|
|
67
|
+
| HYPOTHESIS | 任务(不泄题) | HTML 展示(步骤 3) | 模拟器测试(步骤 6) |
|
|
68
|
+
|---|---|---|---|
|
|
69
|
+
| | 请直接开始玩 | | |
|
|
70
|
+
|
|
71
|
+
## 风险与未知
|
|
72
|
+
| 风险/UNKNOWN | 影响 | 当前证据 | 验证方式/负责人 | 最晚阶段 |
|
|
73
|
+
|---|---|---|---|---|
|
|
74
|
+
| API / GIA / 资产 / 真机 | | | knowledge/probe/device | |
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
策划确认只锁产品语义、P0、砍项和关键规则歧义;函数名、控件拆分和目录由 Agent 自行决定。
|
|
78
|
+
|
|
79
|
+
## 2. 共享 game-spec / ui-spec
|
|
80
|
+
|
|
81
|
+
P0 把契约写在 GDD 或短的 `docs/game-spec.md`。仅当选择 HTML 轨且两边共同消费时,才加 `prototype/game-spec.json`。不得写 DOM 选择器、CSS 类、JS/Lua 函数名。布局字段使用千星坐标:原点左下,Y 向上,锚点 0–1。
|
|
82
|
+
|
|
83
|
+
### game-spec 必须回答
|
|
84
|
+
|
|
85
|
+
- 状态机:`boot → ready → playing → resolved(win|fail) → restart`,暂停若为 P0 也要建模;
|
|
86
|
+
- 状态数据、生命周期、客户端/服务端权威;
|
|
87
|
+
- 输入动作、前置状态、节流、热区、无效输入与结束后行为;
|
|
88
|
+
- 显式 `dt`、位置/速度/碰撞边界、可注入 seed/序列;
|
|
89
|
+
- 成功/失败/重开、领域事件、稳定日志和错误降级;
|
|
90
|
+
- 每条不变量(INV)及对应的可观察 oracle;
|
|
91
|
+
- 未知平台事实、责任人、探针或真机验证。
|
|
92
|
+
|
|
93
|
+
### ui-spec 必须回答
|
|
94
|
+
|
|
95
|
+
| 字段 | 含义 |
|
|
96
|
+
|---|---|
|
|
97
|
+
| `id` / `kind` | 稳定控件名与 `container/image/text/button/progress` 等目标类型 |
|
|
98
|
+
| `parent` / `anchor` / `offset` / `size` | 控件树与跨画布布局 |
|
|
99
|
+
| `styleToken` / `assetId` | 色板、字号、间距与资产清单引用 |
|
|
100
|
+
| `visibleWhen` / `action` | 可见状态与抽象玩家动作 |
|
|
101
|
+
| `motionIntent` | 触发、时长、曲线和可降级方式 |
|
|
102
|
+
|
|
103
|
+
HTML(若存在)与 Lua 可以有不同适配层;稳定的状态、动作、控件和资产 id 必须可追踪。网页坐标不得进入 Lua。
|
|
104
|
+
|
|
105
|
+
## 3. 测试设计与追踪
|
|
106
|
+
|
|
107
|
+
在步骤 2 建立 `requirement → rule/invariant → 模拟器场景 → qxqy case → oracle → evidence` 表。`HYPOTHESIS` 指向 HTML、模拟器与用户试玩,`CONTRACT` 指向自动化 oracle,`UNKNOWN` 指向知识、探针或真机。
|
|
108
|
+
|
|
109
|
+
### 五层证据
|
|
110
|
+
|
|
111
|
+
| 层 | 验证 | 证据 |
|
|
112
|
+
|---|---|---|
|
|
113
|
+
| L0 | JSON、路径、挂载、控件树 | 静态检查、`qxqy_studio_get` |
|
|
114
|
+
| L1 | 纯状态、计分、碰撞、生成、边界 | 纯函数/窄接口回放 |
|
|
115
|
+
| L2 | 输入→状态/日志/控件/变量/信号 | `qxqy-autotest` + `runCase` |
|
|
116
|
+
| L3 | 布局、层级、裁切、反馈、动画 | `qxqy_studio_ui_screenshot` / `qxqy_studio_play_screenshot` |
|
|
117
|
+
| L4 | 易懂、公平、节奏、触控、真机 | 观察式试玩、用户反馈、真机 |
|
|
118
|
+
|
|
119
|
+
可选 HTML 只能提前沟通体验;不能替代 L2–L4。模拟器看不见的官方图不算视觉回归失败,记目标 ID,真机看效果。
|
|
120
|
+
|
|
121
|
+
### TDD 边界
|
|
122
|
+
|
|
123
|
+
必须 Red→Green→Regress:状态、胜负、计分、冷却、碰撞边界、暂停/重开、稳定输入语义、服务端变量/信号和已复现缺陷。
|
|
124
|
+
|
|
125
|
+
先原型后固化:跳跃/速度手感、反馈节奏、UI 层级和尚未确定的玩法语义。
|
|
126
|
+
|
|
127
|
+
先探针后规格:未文档化 API、imageId、GIA 字段、生命周期和真机行为。
|
|
128
|
+
|
|
129
|
+
有效 Red 必须是“目标生产行为缺失”。坏 JSON、路径错误、事件到不了控件、模拟器未启动和 schema 错误是基础设施失败,不算 TDD Red。
|
|
130
|
+
|
|
131
|
+
### 确定性与 oracle
|
|
132
|
+
|
|
133
|
+
- 运动、冷却和计时显式消费 `dt`;随机玩法由配置、变量、首事件或测试入口注入可复现 seed/序列;
|
|
134
|
+
- 每个用例独立启动,切画布是新生命周期;不依赖墙钟、机器速度或偶然帧;
|
|
135
|
+
- 稳定日志使用 `game_start`、`score <n>`、`fail <reason>`、`restart` 等领域事件;
|
|
136
|
+
- 优先断言玩家可见控件/状态,其次稳定事件,最后才是 `query.*` 诊断;测试不得复制生产算法;
|
|
137
|
+
- 覆盖顺序按高风险、高频、最近缺陷和复杂状态转换,而非虚假的百分比。
|
|
138
|
+
|
|
139
|
+
## 4. P0 qxqy-autotest
|
|
140
|
+
|
|
141
|
+
使用模拟器支持的 `qxqy-autotest` / `version: 1`,不要自创 schema。每个用例独立保存到 `workspace/<slug>/tests/`:
|
|
142
|
+
|
|
143
|
+
```json
|
|
144
|
+
{
|
|
145
|
+
"format": "qxqy-autotest",
|
|
146
|
+
"version": 1,
|
|
147
|
+
"name": "boot",
|
|
148
|
+
"dt": 0.03333333333333333,
|
|
149
|
+
"events": [],
|
|
150
|
+
"asserts": [
|
|
151
|
+
{ "kind": "log", "contains": "game_start", "source": "client" },
|
|
152
|
+
{ "kind": "tree", "name": "ScoreText", "exists": true }
|
|
153
|
+
]
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
最小 P0:`boot`、`first-success`、`first-fail`、`restart`、`mobile-smoke`。稳定控件优先用 `click`,只有坐标本身是规则时才用 `pointer`;`mobile-smoke` 使用独立 `args.canvasId`,不要与 PC 串联。布局与 HUD 以 `mobile-16-9` 为完整可见基准,PC 画布只做放大/留边,不裁掉手机上看得到的内容。缩放容器不要再加全屏不透明兄弟节点。
|
|
158
|
+
|
|
159
|
+
步骤 2 完成用例和静态/schema 校验;步骤 5 运行最小存档后,`first-success`、`first-fail`、`restart` 至少一次因生产行为缺失而 Red。每次实现记录:
|
|
160
|
+
|
|
161
|
+
```text
|
|
162
|
+
case / red reason / failedAt / frame
|
|
163
|
+
minimal change / target result / full regression
|
|
164
|
+
screenshot or snapshot / remaining risk
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
P0 后按玩法增加 `edge-contact`、`input-spam`、`pause-resume`、`restart-twice`、`large-dt` 和其余四画布 smoke。体验反馈只有形成稳定规则后才转自动化测试。
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# HTML 效果展示、美术素材与试玩
|
|
2
|
+
|
|
3
|
+
本 reference 用于步骤 3(HTML 效果展示)、步骤 4(千星美术参考图和素材)、步骤 6(模拟器测试)与步骤 7(真机试玩)。每条证据标 `runtime=html|simulator|device`。
|
|
4
|
+
|
|
5
|
+
## 步骤 3:HTML 效果展示
|
|
6
|
+
|
|
7
|
+
网页用于对齐「看起来、玩起来像什么」,依据步骤 2 已写的规则做 boot / first-success / first-fail / restart。最小产物:
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
prototype/index.html
|
|
11
|
+
prototype/README.md 启动、操作、不可移植项、坐标差异
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
请用户打开网页试玩;本预设没有浏览器试玩工具时,证据标 `browser-run: user`。网页新增规则回写策划案与测试用例。将画面/动画分成 `must-reproduce`、`can-degrade`、`concept-only`;HTML 不是 Lua 或真机证明。千星原点左下、Y 向上,HTML 通常左上、Y 向下,禁止直接搬运 DOM/CSS 坐标。用户确认效果后进入美术素材准备;窄修复可跳过并记理由。
|
|
15
|
+
|
|
16
|
+
## 步骤 4:准备千星美术参考图和素材
|
|
17
|
+
|
|
18
|
+
根据确认的 HTML 效果,在 `docs/art-bible.md` 记录体验形容词、主/辅/警示色、轮廓、层级、角色/道具特征、目标官方 `imageId` 和模拟器占位。准备参考图、素材清单与千星控件还原方案。需要比较时,在同一 HTML 布局与玩法状态中做少量不同方向;没有真正分歧时采用推荐方向。
|
|
19
|
+
|
|
20
|
+
官方原神/千星素材可以用。模拟器只预览 `100001–100006` 六种基础图元,其余图片 ID 显示缺失框;这不是禁用,真机才可验证最终画面。高成本像素重建与帧动画先做关键样本,按 Lua 实现需求批量生产。当前会话若有像素画、图元拟合、UI 制作或帧动画 Skill,可按需调用。
|
|
21
|
+
|
|
22
|
+
## 步骤 6:模拟器测试与观察试玩
|
|
23
|
+
|
|
24
|
+
加载 `qxqy-simulator`,运行步骤 2 的用例;对新增缺陷先留最小复现,再修复和回归。Agent 可用:
|
|
25
|
+
|
|
26
|
+
| 目的 | 工具 |
|
|
27
|
+
|---|---|
|
|
28
|
+
| 点击、按键、时间和断言 | `qxqy_studio_play` |
|
|
29
|
+
| 静态布局截图 | `qxqy_studio_ui_screenshot` |
|
|
30
|
+
| 运行画面截图 | 先 `play start`,再 `qxqy_studio_play_screenshot` |
|
|
31
|
+
|
|
32
|
+
画布原点左下、Y 向上。布局以 `mobile-16-9`(1280×720)完整可见为基准;PC 用同一设计板等比放大或留边,不裁掉手机内容。每轮只验证少量问题:规则回归、截图层级/裁切/反馈、用户能否理解目标与失败、控件/Lua/资源预算。用户可在模拟器页盲玩;Agent 不得把 HTML 截图或搜索结果充当模拟器试玩。
|
|
33
|
+
|
|
34
|
+
反馈分类为 `bug / design / art-content / platform / not-now`。设计问题回步骤 1–3,素材问题回步骤 4,规则/实现问题回步骤 2、5–6,平台未知建探针或交给步骤 7。一次调整少量变量以便归因。模拟器看不见官方图时保留 `targetId`,不能把缺失框当作禁用资源。
|
|
35
|
+
|
|
36
|
+
## 步骤 7:真机试玩验证与 bug 修复
|
|
37
|
+
|
|
38
|
+
把完整存档、Lua/GIA、操作说明、挂载关系、官方图片 ID 和已知警告交给用户在千星奇域验证。记录真机环境、步骤、期望/实际、截图/日志与可复现性。真机问题先形成用例或明确的人工检查,再修复并回归模拟器和真机;用户尚未完成真机试玩时标“模拟器候选”,不称发布通过。GIA 不保存脚本挂载关系,交付说明必须单列挂载步骤。
|
package/dsh-plugin/presets/wonderland-lua-builder/skills/qxqy-game-studio/references/workflow.md
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# 七步制作工作流
|
|
2
|
+
|
|
3
|
+
这是 Agent 预设的主流程,顺序与仓库根 README 一致:
|
|
4
|
+
|
|
5
|
+
```text
|
|
6
|
+
PREFLIGHT(检查已有工程,不计入步骤)
|
|
7
|
+
→ 1 策划案
|
|
8
|
+
→ 2 TDD 制定测试用例
|
|
9
|
+
→ 3 HTML 效果展示
|
|
10
|
+
→ 4 准备千星美术参考图和素材
|
|
11
|
+
→ 5 Lua 编码实现
|
|
12
|
+
→ 6 测试
|
|
13
|
+
→ 7 真机试玩验证与 bug 修复
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
按退出证据推进,可因新发现回退。已有工程从最早缺失证据继续;窄修复不强迫重做前面的步骤。步骤 1–4 不启动模拟器、不改存档、不运行 `runCase`。HTML 是体验展示,不是 Lua 源码或交付物。
|
|
17
|
+
|
|
18
|
+
## PREFLIGHT — 接入与基线
|
|
19
|
+
|
|
20
|
+
先盘点用户想法、参考图、已有 Lua、GIA、存档和反馈。检查当前工作区 `AGENTS.md`、2D API 文档、可用工具与相关 Skill。已有项目先读策划案、测试、最近试玩记录、存档与源码;只创建当前步骤需要的文件。在 `docs/production-plan.md` 记当前步骤、目标、退出证据、阻塞项。缺官方 API 文档时可以推进步骤 1–4,但写依赖编辑器 API 的 Lua 前须请用户补齐。
|
|
21
|
+
|
|
22
|
+
## 1. 策划案
|
|
23
|
+
|
|
24
|
+
将创意写为 `docs/gdd.md`:目标玩家与单局时长、唯一核心动词、最短循环、成功/失败/重开、PC 与手机输入、P0/P1/不做项、美术意图和关键风险。区分可由用户试玩判断的 `HYPOTHESIS`、可测试的规则 `CONTRACT`、需官方文档或真机验证的 `UNKNOWN`。把状态机、输入动作和不变量写在 GDD,复杂时另开短的 `docs/game-spec.md`;不要提前引入 DOM 选择器或 Lua 函数名。
|
|
25
|
+
|
|
26
|
+
有真正玩法分歧时给用户可比较的选项和推荐。退出证据是明确的一局游戏体验、范围与规则语义。执行方法见 [design-and-tests.md](design-and-tests.md)。
|
|
27
|
+
|
|
28
|
+
## 2. TDD 制定测试用例
|
|
29
|
+
|
|
30
|
+
在生产 Lua 之前,根据步骤 1 的每条关键 `CONTRACT` 写 `requirement → rule/invariant → case → oracle → evidence` 追踪表。先覆盖 `boot`、`first-success`、`first-fail`、`restart`、`mobile-smoke`,每条写玩家动作、前置条件、可观察结果、画布与失败边界。用模拟器支持的 `qxqy-autotest` schema 落盘 `tests/*.json`,只做静态/schema 检查,不在此步运行模拟器。
|
|
31
|
+
|
|
32
|
+
随机和计时给出确定性入口;视觉、手感、未知 API 与真机项目另列人工检查。此时只称“用例已制定”。有效 Red 要等步骤 5 的最小存档和脚本骨架可运行后产生;坏路径、坏 JSON、工具故障不算 Red。规则变化先改策划案与用例。详见 [design-and-tests.md](design-and-tests.md)。
|
|
33
|
+
|
|
34
|
+
## 3. HTML 效果展示
|
|
35
|
+
|
|
36
|
+
根据已定义的规则制作可打开试玩的 `prototype/`,覆盖开局、第一次成功、失败与重开。请用户体验画面、操作和节奏;没有浏览器操作工具时标 `browser-run: user`,不声称 Agent 已亲自试玩。将网页特有的动画/效果标为 `must-reproduce`、`can-degrade` 或 `concept-only`。网页新增规则必须回写策划案与用例。
|
|
37
|
+
|
|
38
|
+
用户确认体验后再准备正式素材。HTML 通常原点左上、Y 向下;千星原点左下、Y 向上,禁止直接复制 CSS 像素。窄修复可跳过此步并记理由。详见 [prototype-art-playtest.md](prototype-art-playtest.md)。
|
|
39
|
+
|
|
40
|
+
## 4. 准备千星美术参考图和素材
|
|
41
|
+
|
|
42
|
+
以确认的 HTML 体验为依据,在 `docs/art-bible.md` 记录配色、轮廓、UI 层级、角色/道具识别特征、目标官方 `imageId`、素材来源与用途。准备参考图和素材清单,说明在千星控件中怎样还原;有真实视觉分歧时只做少量可比较方向请用户选择。使用工作区实际可见的像素画、图元拟合、UI 或帧动画 Skill。
|
|
43
|
+
|
|
44
|
+
模拟器对非 `100001–100006` 官方素材显示缺失框,这不等于素材不能在千星使用。记下目标 ID,留待真机核验。高成本拼图/动画可先准备方案和关键样本,批量制作随步骤 5 的实现需要推进。详见 [prototype-art-playtest.md](prototype-art-playtest.md)。
|
|
45
|
+
|
|
46
|
+
## 5. Lua 编码实现
|
|
47
|
+
|
|
48
|
+
从此步开始使用模拟器。核对工作区官方 2D API,建立服务端 UI、客户端控件/模板和 Lua 脚本的最小骨架,保存为 `workspace/<slug>/<slug>.save.json`。先运行步骤 2 的用例,确认目标生产行为缺失导致有效 Red;随后一次实现一条规则,执行目标 Green 与相关 Regress。将纯规则与 UI 副作用分离,计时显式使用 `dt`,随机行为可复现。
|
|
49
|
+
|
|
50
|
+
根据策划案重新实现玩法,不逐行翻译 HTML DOM/CSS/JavaScript。接入步骤 4 的目标素材;模拟器缺失框要记录真实目标 ID。交付物是可加载的 Lua 与存档,按需导出 GIA;记录脚本挂载点。未知 API 先查文档或做单问题探针,不猜字段。
|
|
51
|
+
|
|
52
|
+
## 6. 测试
|
|
53
|
+
|
|
54
|
+
运行 P0 与高风险边界用例,复现并修复实现缺陷。使用 `qxqy_studio_play` 走开局、首次成功、失败、重开,用 `qxqy_studio_ui_screenshot` 和 `qxqy_studio_play_screenshot` 检查静态/运行画面。手机 16:9 整屏可见,PC 等比放大/留边;必要时扩展五画布、触控、重复输入、暂停恢复、服务端信号与性能预算。
|
|
55
|
+
|
|
56
|
+
让用户在模拟器页观察试玩手感,分清规则失败、视觉问题和体验假设;一次调整少量变量,随后回归。模拟器结果标 `runtime=simulator`,不能写作真机通过。保留用例结果、截图、已知限制与导出警告。详见 [prototype-art-playtest.md](prototype-art-playtest.md)。
|
|
57
|
+
|
|
58
|
+
## 7. 真机试玩验证与 bug 修复
|
|
59
|
+
|
|
60
|
+
整理 Lua、完整存档/GIA、挂载说明、目标素材 ID、测试结果和已知限制,提供真机操作步骤。请用户在千星奇域实际试玩并回传画面、日志、步骤和期望/实际结果。Agent 不在真机上执行过的步骤必须标未验证。
|
|
61
|
+
|
|
62
|
+
对每个真机缺陷建立最小复现,判断是 Lua、素材、布局、模拟器差异还是平台未知;先更新用例或人工检查,再修复并重复模拟器与真机验证。只有真机证据覆盖目标行为,才能标记该行为通过;尚未回传则交付状态为“模拟器候选”。
|
|
63
|
+
|
|
64
|
+
## 产物与跨会话恢复
|
|
65
|
+
|
|
66
|
+
`workspace/<slug>/` 是项目产物位置。按需创建 `docs/gdd.md`、`docs/production-plan.md`、`tests/`、`prototype/`、`docs/art-bible.md`、`main.lua`、`<slug>.save.json`、`records/playtest.md`、`export/`。存档头部附近含 `"format": "qxqy-simulator-save"`,测试 JSON 不是存档。`docs/production-plan.md` 记录当前步骤和退出证据;`records/playtest.md` 按 `runtime=html|simulator|device` 记来源、结果、未知和修复后回归。恢复时先读这些实际产物,不凭聊天摘要重做项目。
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# 千星沙箱 UI 模拟器 · 插件使用技能
|
|
2
|
+
|
|
3
|
+
面向已安装 `dsh-plugin-beyond-simulator` 的 DeepSeek Harness 会话中的 AI。前提:用户已装好插件,`qxqy_studio_get` / `qxqy_studio_patch` / `qxqy_studio_play` / `qxqy_studio_play_screenshot` / `qxqy_studio_ui_screenshot` / `qxqy_studio_load` 当前可见;无需指导安装。
|
|
4
|
+
|
|
5
|
+
每个会话拥有独立内存存档,固定三类资产:`UI控件-服务端`(客户端控件容器)、`UI控件-客户端`(可被 Lua 实例化的模板)、`Lua 脚本`。编辑器在 Harness"模拟器"标签,分为“UI 编辑 / Lua 脚本 / 服务端逻辑”;试玩在独立标签页 `/qxqy-simulator/play#<会话ID>`。
|
|
6
|
+
|
|
7
|
+
两条核心工作流:**UI → JSON 转换与 GIA 往返**、**AI 驱动的交互测试**。
|
|
8
|
+
|
|
9
|
+
## 工作流一:把 UI 转成 JSON,并引导用户导入 GIA 尝试
|
|
10
|
+
|
|
11
|
+
目标:把某个 UI(用户手里的 GIA 文件、口头描述或截图)变成模拟器的 Authoring JSON,可继续编辑、试玩,再导出 GIA 送回真实链路验证。
|
|
12
|
+
|
|
13
|
+
### 1. 确认来源并入手
|
|
14
|
+
|
|
15
|
+
| 用户手里有什么 | 做法 |
|
|
16
|
+
|---|---|
|
|
17
|
+
| 真机导出的 `.gia` 文件 | 引导用户在"模拟器"标签顶栏点"导入"选择该文件;导入后调 `qxqy_studio_get` 读取转换出的 Authoring JSON 树 |
|
|
18
|
+
| 口头描述 / 截图 | 用 `qxqy_studio_patch` 从零构建:`newAsset` 重置工程 → `add` 逐个加控件 → `set` 改字段(每步后 `get` 验证) |
|
|
19
|
+
| 已有 Authoring JSON / 完整存档包 | 工作区里的 `qxqy-simulator-save` 用 `qxqy_studio_load` 拉取;也可让用户在顶栏选「工作区存档」,或「导入」本地文件 |
|
|
20
|
+
| 只有 Lua 脚本 | 引导用户"导入" `.lua`,只更新当前脚本,不影响其他资产 |
|
|
21
|
+
|
|
22
|
+
### 2. 构建与校验
|
|
23
|
+
|
|
24
|
+
- 每次写操作带最新 `expectedRevision`;收到 `revision conflict: expected N, current M` 时重新 `get`,基于新快照重算编辑,不要盲目重试。
|
|
25
|
+
- 未知字段不编造:检视器只暴露业务字段;`set` 不认识的 key 会报错,GIA 未验证语义以警告呈现。
|
|
26
|
+
|
|
27
|
+
### 3. 试玩验证
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
qxqy_studio_play { "action": "start", "args": {} }
|
|
31
|
+
qxqy_studio_play { "action": "get" } ← 日志 / 时间 / 历史;默认不含运行树
|
|
32
|
+
qxqy_studio_play { "action": "get", "args": { "inspect": true } } ← 按需拉完整运行树
|
|
33
|
+
qxqy_studio_play { "action": "pointer", "args": { "type": "click", "x": 800, "y": 450 } }
|
|
34
|
+
qxqy_studio_play_screenshot {} ← Host 按试玩页同一套 scene 树渲染当前试玩帧 PNG,无需打开试玩页
|
|
35
|
+
qxqy_studio_play { "action": "stop", "args": {} }
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
截图必须按目标选择,不能互相替代;二者都由 Host 在进程内出图,**不需要用户切换页签**:
|
|
39
|
+
|
|
40
|
+
- 要检查静态 UI 布局、选中项或控件图元,调用 `qxqy_studio_ui_screenshot`。它根据编辑器 `boxes` 渲染舞台 PNG,不含完整 Chrome DOM 工具栏/检视器。
|
|
41
|
+
- 要检查 Lua Runtime 的实际画面、动画或输入后的结果,调用 `qxqy_studio_play_screenshot`。它与独立试玩页共用同一份 Runtime `tree-v1` 场景树(同级先出现的子节点在上),再在 Host 里画成 PNG;返回 `canvasId`、Runtime `frame/time`、逻辑画布大小与实际 PNG 像素大小。不会步进时间,也不替代 `get {inspect:true}` 的结构化断言。需要先 `start` 试玩会话。用户说试玩页空/全挡时,以这张截图为准,不要另走扁平 `paint` 列表来否定用户画面。
|
|
42
|
+
|
|
43
|
+
多设备试玩(`GetUICanvasSize` 与预设像素同一套,PC KEYBOARD:1600×900、2100×900;手机 TOUCHSCREEN:1280×720、1560×720、1280×960):
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
qxqy_studio_play { "action": "start", "args": { "canvasId": "mobile-16-9" } } ← 指定设备启动
|
|
47
|
+
qxqy_studio_play { "action": "device", "args": { "canvasId": "pc-21-9" } } ← 试玩中切换设备(重建运行时,新生命周期)
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
- 切换设备后 `GetUICanvasSize`、指针坐标、锚点布局都换到新预设像素;快照带 `canvasId`/`platform`/`device`/`canvasPresets` 可直接断言。
|
|
51
|
+
- 切设备 = 换了台真机:时间归零、历史重置,用例不跨设备;要回归多画布就用 `runCase` 加 `args.canvasId` 分别跑。
|
|
52
|
+
- 不带 `canvasId` 的 `start` 跟随编辑器当前画布;`stop` 后粘性设备失效,回到跟随编辑器。
|
|
53
|
+
|
|
54
|
+
用户也可自己点顶栏"试玩 ↗"(会先保存脚本再开独立标签页);独立试玩页顶栏有「切换设备画布」「人数」「视角」下拉。
|
|
55
|
+
|
|
56
|
+
多人试玩(最多 8 人,每位玩家一份独立客户端;Lua `PlayerSelf` 相对当前客户端):
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
qxqy_studio_play { "action": "start", "args": { "playerCount": 2 } } ← 指定人数启动
|
|
60
|
+
qxqy_studio_play { "action": "view", "args": { "playerIndex": 2 } } ← 切换当前玩家视角(不重建)
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### 4. 导出与引导 GIA 尝试
|
|
64
|
+
|
|
65
|
+
导出由用户在顶栏"导出"完成,格式选择:
|
|
66
|
+
|
|
67
|
+
| 需求 | 选什么 |
|
|
68
|
+
|---|---|
|
|
69
|
+
| 继续编辑 / 整体备份 | 完整存档包 JSON(`qxqy-simulator-save`,含服务端 + 客户端 + 两类脚本) |
|
|
70
|
+
| 无损工程格式 | Authoring JSON(11 类控件、五画布变换、按钮四状态、脚本挂载全保留) |
|
|
71
|
+
| 与真实编辑器/GIA 链路交换 | 「当前界面 GIA」只导出左栏正在看的那棵树;「资产包 GIA(已改动项)」按官方三类独立文件下载,不夹带未改动的出厂默认模板;「资产包 GIA 整合包」把服务端 `UIControlGroup` 与客户端 `UIControlTemplate` 并排写入同一 GIA 的 `Root.graph`,脚本映射同样并排;导入时拆回两类资产,模板边界保留,挂载关系仍不进 GIA |
|
|
72
|
+
| 单个脚本 | 分项导出 Lua |
|
|
73
|
+
|
|
74
|
+
引导用户导入 GIA 尝试时必须同步说明边界,管理预期:
|
|
75
|
+
|
|
76
|
+
- GIA 导出会附简明警告(如"部分内容暂不支持 GIA");旋转线号未验证就不写猜测字段,部分填充形状/方向、自定义羽化值、非 100% 进度只保存在 Authoring JSON。
|
|
77
|
+
- 未知 protobuf 字段不保证往返回写。
|
|
78
|
+
- 若当前工作区就是模拟器源码仓库,可先运行 `cd simulator/studio && npm run generate:client-template` 生成探针文件 `probes/client-template-import/qxqy-lua-instantiable-panel.gia`,再导入验证 Lua 动态实例化(预期模板索引 `1073742100`;真实编辑器若重映射,以导入后检视器显示值为准)。
|
|
79
|
+
|
|
80
|
+
## 工作流二:自定义交互测试队列(自动化测试用例)
|
|
81
|
+
|
|
82
|
+
试玩会把指针、按键、点击和服务端写变量/发信号记进时间线(`t` 为引擎时钟,不是墙钟)。可用 `qxqy_studio_play` 保存、回放并断言。
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
qxqy_studio_play { "action": "start" }
|
|
86
|
+
qxqy_studio_play { "action": "pointer", "args": { "type": "click", "x": 800, "y": 450 } }
|
|
87
|
+
qxqy_studio_play { "action": "history" } ← 当前试玩已记录的事件
|
|
88
|
+
qxqy_studio_play { "action": "saveCase", "args": { "name": "click-ok", "asserts": [{ "kind": "log", "contains": "clicked" }] } }
|
|
89
|
+
qxqy_studio_play { "action": "runCase", "args": { "case": <上一步返回的用例> } }
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
用例格式 `qxqy-autotest` / `version: 1`:`events[]` + `asserts[]`。也接受技能旧队列写法(`do`/`check`),会在运行前规范化。
|
|
93
|
+
|
|
94
|
+
断言 kind:`log`(默认查客户端脚本 `print`/`printerr`;`source: "server"` 才查服务端变量/信号日志)、`control`(控件字段,回放时按需检视)、`var`(服务端自定义变量)、`signal`(入/出站信号)、`tree`(控件是否存在,回放时按需检视)、`lua`(只能调查询 API:`query.var` / `query.control` / `query.logContains` / `query.logs` / `query.serverLogContains` / `query.serverLogs` / `query.signals`,与玩法脚本分 state)。失败时报告带 `failedAt`、帧号和现场快照,不要急着 `stop`。日常试玩不要每帧 `step` 拉树。
|
|
95
|
+
|
|
96
|
+
服务端薄模拟:
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
qxqy_studio_play { "action": "serverSet", "args": { "entityType": "PlayerSelf", "name": "Gold", "value": 10 } }
|
|
100
|
+
qxqy_studio_play { "action": "serverGet" } ← 列出全部变量
|
|
101
|
+
qxqy_studio_play { "action": "serverGet", "args": { "entityType": "PlayerSelf", "name": "Gold" } }
|
|
102
|
+
qxqy_studio_play { "action": "serverSend", "args": { "target": "PlayerSelf", "name": "Battle_OnReward", "params": [1] } }
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
`entityType` 可以是 Lua 的 `Level` / `PlayerSelf` / `AvatarSelf`,或模拟器座位 `Player1`–`Player8` / `Avatar1`–`Avatar8`。未定义变量的 Lua Get 返回 `nil`(模拟器策略)。`serverSend.target` 可以是 `PlayerSelf`(当前视角玩家)、`Player1`–`Player8` 或 `AllPlayers`。
|
|
106
|
+
|
|
107
|
+
要定义随客户端信号自动执行的服务端逻辑,可让用户在编辑器“服务端逻辑”页配置,或用 `qxqy_studio_patch` 的 `setServerLogic`。它是模拟器存档格式,不是官方节点图;规则按信号名监听,顺序执行设置变量和向玩家发客户端脚本信号:
|
|
108
|
+
|
|
109
|
+
```json
|
|
110
|
+
{
|
|
111
|
+
"op": "setServerLogic",
|
|
112
|
+
"expectedRevision": 1,
|
|
113
|
+
"logic": {
|
|
114
|
+
"rules": [{
|
|
115
|
+
"id": "earn-gold",
|
|
116
|
+
"signalName": "EarnGold",
|
|
117
|
+
"actions": [
|
|
118
|
+
{ "kind": "setCustomVariable", "entityType": "PlayerSelf", "name": "Gold", "value": { "fromSignalParam": 0 } },
|
|
119
|
+
{ "kind": "setCustomVariable", "entityType": "Level", "name": "LastReward", "value": "gold" },
|
|
120
|
+
{ "kind": "sendClientScriptSignal", "target": "PlayerSelf", "signalName": "GoldChanged", "params": [{ "fromSignalParam": 0 }, "ok"] }
|
|
121
|
+
]
|
|
122
|
+
}]
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
`{ "fromSignalParam": 0 }` 引用监听信号的第一个参数(从 0 开始);用在回传参数时会保留原信号参数类型。动作可写 `Level` / `PlayerSelf` / `Player1`–`Player8`;`sendClientScriptSignal.target` 为 `PlayerSelf`(发信号者)、`Player1`–`Player8` 或 `AllPlayers`。Lua 侧 `PlayerSelf` 始终相对当前客户端。
|
|
128
|
+
|
|
129
|
+
约束:每会话最多一个试玩 Worker;单次操作默认 8 秒超时;`stop` 是唯一确定性回收方式;暂停(`pause`)后才能单帧调试(`step`)。
|
|
130
|
+
|
|
131
|
+
## 工具速查
|
|
132
|
+
|
|
133
|
+
| 工具 | 用途 | 要点 |
|
|
134
|
+
|---|---|---|
|
|
135
|
+
| `qxqy_studio_get` | 读工程无损 JSON 快照 | 无参数;严格 JSON |
|
|
136
|
+
| `qxqy_studio_patch` | 编辑工程,参数 `{ "op": { ... } }` | 带 `expectedRevision`;成功后 revision +1 |
|
|
137
|
+
| `qxqy_studio_ui_screenshot` | 获取编辑器舞台 PNG | Host 根据 boxes 渲染;不需要打开模拟器标签;不含完整 DOM 工具栏 |
|
|
138
|
+
| `qxqy_studio_play_screenshot` | 获取当前试玩 Runtime PNG | Host 根据 paint 渲染;需要已 start,不需要打开试玩页;不推进 Runtime |
|
|
139
|
+
| `qxqy_studio_load` | 从会话工作区列出/拉取存档 | 不传 `path` 列出;传相对路径加载 |
|
|
140
|
+
| `qxqy_studio_play` | 试玩控制,参数 `{ "action": "...", "args": {} }` | 见下 |
|
|
141
|
+
|
|
142
|
+
play 动作:`start`(重建运行时;可带 `canvasId` 指定设备画布、`playerCount` 指定 1–8 人)、`device`(按 `args.canvasId` 切换设备画布并重建运行时)、`view`(按 `args.playerIndex` 切换当前玩家视角,不重建运行时)、`get`、`step`(`dt` 秒)、`pointer`(`type` = move/down/up/click,click = down+up;`x`/`y` 为当前画布像素)、`key`(按脚本注册监听的键名)、`click`(按控件名直接触发)、`pause`/`resume`、`stop`、`serverGet`/`serverSet`/`serverSend`、`history`/`saveCase`/`runCase`(可带 `canvasId` 钉住用例设备,可带 `playerCount`)。未 start 时 `pointer` / `key` / `click` 都会报 `play session has not started`。
|
|
143
|
+
|
|
144
|
+
常用 patch op:`select`(id)、`pick`(x/y 命中)、`setCanvas`(canvasId)、`addScript` / `updateScript` / `removeScript`(脚本由存档统一管理;服务端容器会被拒绝)、`setServerLogic`(规则定义)、`newAsset`(assetType)、`addTemplate`、`add`(parentId/kind/name)、`reparent`、`moveSibling`(direction=up/down)、`remove`、`set`(id/key/value)、`replace`(project)。数据写操作必须带 `expectedRevision`。
|
|
145
|
+
|
|
146
|
+
`set` 常用 key:变换类 `posX/posY/width/height`、`rotationZ`、`anchorType`、`anchorMinX/Y`、`anchorMaxX/Y`、`pivotX/Y`;业务类 `text`、`fontSize`、`imageId`、`enableMask`、`enableFill`、`fillType`、`fillAmount`(0–1)、按钮四状态 `unavailableChildId/hoverChildId/pressedChildId/selectedChildId`、`syncAllDevices`;颜色接受 `#AARRGGBB`。以上是常用子集,未列出的字段不要猜——`set` 对不认识的 key 会直接报错,以报错为准。
|
|
147
|
+
|
|
148
|
+
脚本 `require` 使用导入根:脚本映射路径去掉 `.lua` 后,前面加 `default_import_file/`。例如映射路径为 `workspace/flappy-fish/draws.lua` 时,写:`local ok, mod = pcall(require, "default_import_file/workspace/flappy-fish/draws")`。裸路径只为旧存档兼容,新脚本一律使用该前缀。
|
|
149
|
+
|
|
150
|
+
## 领域规则速记(写 op 前自查)
|
|
151
|
+
|
|
152
|
+
- 服务端"客户端控件容器"只是资源分组,**不能挂客户端脚本**;脚本挂到客户端控件上。
|
|
153
|
+
- 画布 5 个:`pc-16-9`(1600×900)、`pc-21-9`(2100×900)、`mobile-16-9`(1280×720)、`mobile-19.5-9`(1560×720)、`mobile-4-3`(1280×960);原点左下,锚点相对父矩形 0–1。
|
|
154
|
+
- **2D 游戏布局基准是手机 16:9(`mobile-16-9` / 1280×720)。** 整屏构图必须在该画布完整可见。PC 可用 1600×900 设计像素,但应把舞台放进固定设计尺寸的板,再按 `min(canvas/design)` 等比缩放(不足处留边),禁止按 PC 铺满后再在手机上裁切。缩放容器不要再加全屏不透明兄弟节点(试玩页同级先出现的子节点会盖住后面的舞台)。P0 至少覆盖 `mobile-16-9` 与 `pc-16-9`。
|
|
155
|
+
- 多设备试玩:试玩 `device` 动作或 `start {canvasId}` 在五个预设间切换;切换只改画布宽高并选用对应平台的 RectTransform 槽位(PC→KEYBOARD/KeyboardAndMouse,手机→TOUCHSCREEN/Mobile),锚点在新父矩形下重新解算。
|
|
156
|
+
- `imageId` 100001–100006 画占位图元,其他显示缺失框——不伪造官方素材。
|
|
157
|
+
- 旋转进入运行时,但点击命中按旋转前轴对齐矩形计算。
|
|
158
|
+
|
|
159
|
+
## 排障(运行时)
|
|
160
|
+
|
|
161
|
+
| 症状 | 处理 |
|
|
162
|
+
|---|---|
|
|
163
|
+
| 工具不可见 | 插件未加载,请用户重启 `dsh web` 并确认 profile;不是本技能能修的 |
|
|
164
|
+
| revision conflict | 重新 `get` 后重算编辑 |
|
|
165
|
+
| `play session has not started` | 先 `start` 再发其他动作 |
|
|
166
|
+
| 路径脚本不生效 | 路径相对工作区;先用内联 source 排除路径问题 |
|