evomeme-dev 0.1.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/README.md +247 -0
- package/bin/evomeme +28 -0
- package/dist/canvas-public/app.js +5857 -0
- package/dist/canvas-public/cycle-detect.js +166 -0
- package/dist/canvas-public/index.html +395 -0
- package/dist/canvas-public/sequence-sheet.js +59 -0
- package/dist/canvas-public/smart-split.js +185 -0
- package/dist/canvas-public/styles.css +2276 -0
- package/dist/canvas-public/vendor/painterro.min.js +3 -0
- package/dist/index.js +25586 -0
- package/package.json +69 -0
- package/skills/evomeme-cloud-fs/SKILL.md +176 -0
- package/skills/evomeme-cloud-fs/agents/openai.yaml +7 -0
- package/skills/evomeme-cover/SKILL.md +132 -0
- package/skills/evomeme-cover/agents/openai.yaml +7 -0
- package/skills/evomeme-game-maker/SKILL.md +214 -0
- package/skills/evomeme-game-maker/agents/openai.yaml +4 -0
- package/skills/evomeme-login/SKILL.md +92 -0
- package/skills/evomeme-login/agents/openai.yaml +7 -0
- package/skills/evomeme-native-bridge-sdk/SKILL.md +286 -0
- package/skills/evomeme-native-bridge-sdk/agents/openai.yaml +7 -0
- package/skills/evomeme-tos-upload/SKILL.md +46 -0
- package/skills/evomeme-tos-upload/agents/openai.yaml +4 -0
- package/skills/game-art/SKILL.md +121 -0
- package/skills/game-art/agents/openai.yaml +7 -0
- package/skills/game-asset-image-generator/SKILL.md +104 -0
- package/skills/game-asset-image-generator/agents/openai.yaml +7 -0
- package/skills/game-asset-image-generator/references/background.md +32 -0
- package/skills/game-asset-image-generator/references/static-game-assets.md +38 -0
- package/skills/game-audio/SKILL.md +82 -0
- package/skills/game-audio/agents/openai.yaml +4 -0
- package/skills/game-audio/references/bgm-cdn.md +127 -0
- package/skills/game-audio/references/sfx-cdn.md +77 -0
- package/skills/game-demo/SKILL.md +103 -0
- package/skills/game-demo/agents/openai.yaml +7 -0
- package/skills/game-maker/SKILL.md +111 -0
- package/skills/game-maker/agents/openai.yaml +4 -0
- package/skills/game-test/SKILL.md +58 -0
- package/skills/game-test/agents/openai.yaml +7 -0
- package/skills/game-test/references/checklists/playtest-qa.md +12 -0
- package/skills/game-ui/SKILL.md +169 -0
- package/skills/game-ui/agents/openai.yaml +4 -0
- package/skills/game-ui/references/checklists/game-ui-quality.md +14 -0
- package/skills/game-ui/references/checklists/hud-readability.md +12 -0
- package/skills/game-ui/references/checklists/mobile-input.md +12 -0
- package/skills/game-ui/references/checklists/responsive-ui-fit.md +12 -0
- package/skills/game-ui/references/ui-patterns.md +140 -0
- package/skills/game-ui/references/ui-prompt-templates.md +63 -0
- package/skills/phaser-2d-game/SKILL.md +127 -0
- package/skills/phaser-2d-game/agents/openai.yaml +7 -0
- package/skills/phaser-2d-game/references/engine-performance.md +64 -0
- package/skills/phaser-2d-game/references/engine-physics.md +139 -0
- package/skills/phaser-2d-game/references/engine-runtime.md +129 -0
- package/skills/phaser-2d-game/references/engine-spritesheets.md +99 -0
- package/skills/phaser-2d-game/references/engine-tilemaps.md +80 -0
- package/skills/phaser-2d-game/references/file-structure.md +94 -0
- package/skills/phaser-2d-graphics-builder/SKILL.md +68 -0
- package/skills/phaser-2d-graphics-builder/agents/openai.yaml +7 -0
- package/skills/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-1.jpeg +0 -0
- package/skills/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-2.jpeg +0 -0
- package/skills/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
- package/skills/phaser-2d-graphics-builder/references/checklists/compose-quality.md +10 -0
- package/skills/phaser-2d-graphics-builder/references/checklists/performance-safe-visual-detail.md +9 -0
- package/skills/phaser-2d-graphics-builder/references/checklists/premium-game-quality-gate.md +15 -0
- package/skills/phaser-2d-graphics-builder/references/checklists/sprite-quality.md +10 -0
- package/skills/phaser-2d-graphics-builder/references/checklists/technical-art-quality.md +9 -0
- package/skills/phaser-2d-graphics-builder/references/checklists/visual-scorecard.md +9 -0
- package/skills/phaser-2d-graphics-builder/references/compose-recipes.md +71 -0
- package/skills/phaser-2d-graphics-builder/references/graphics-prompt-templates.md +33 -0
- package/skills/phaser-2d-graphics-builder/references/implementation-blueprint.md +82 -0
- package/skills/phaser-2d-graphics-builder/references/sprite-recipes.md +90 -0
- package/skills/phaser-2d-graphics-builder/references/technical-art.md +67 -0
- package/skills/phaser-2d-graphics-builder/references/vfx-recipes.md +67 -0
- package/skills/phaser-2d-graphics-builder/references/visual-scorecard.md +129 -0
- package/skills/threejs-3d-game/SKILL.md +113 -0
- package/skills/threejs-3d-game/agents/openai.yaml +7 -0
- package/skills/threejs-3d-game/references/engine-asset-pipeline.md +116 -0
- package/skills/threejs-3d-game/references/engine-audio.md +70 -0
- package/skills/threejs-3d-game/references/engine-input-camera.md +84 -0
- package/skills/threejs-3d-game/references/engine-performance.md +96 -0
- package/skills/threejs-3d-game/references/engine-physics.md +142 -0
- package/skills/threejs-3d-game/references/engine-runtime.md +199 -0
- package/skills/threejs-3d-game/references/file-structure.md +353 -0
- package/skills/threejs-aaa-graphics-builder/SKILL.md +62 -0
- package/skills/threejs-aaa-graphics-builder/agents/openai.yaml +7 -0
- package/skills/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-1.jpg +0 -0
- package/skills/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-2.jpg +0 -0
- package/skills/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
- package/skills/threejs-aaa-graphics-builder/references/checklists/aaa-game-quality-gate.md +23 -0
- package/skills/threejs-aaa-graphics-builder/references/checklists/aaa-visual-scorecard.md +19 -0
- package/skills/threejs-aaa-graphics-builder/references/checklists/material-lighting-quality.md +14 -0
- package/skills/threejs-aaa-graphics-builder/references/checklists/performance-safe-visual-detail.md +14 -0
- package/skills/threejs-aaa-graphics-builder/references/checklists/procedural-model-quality.md +15 -0
- package/skills/threejs-aaa-graphics-builder/references/checklists/technical-art-quality.md +17 -0
- package/skills/threejs-aaa-graphics-builder/references/graphics-prompt-templates.md +236 -0
- package/skills/threejs-aaa-graphics-builder/references/implementation-blueprint.md +161 -0
- package/skills/threejs-aaa-graphics-builder/references/model-recipes.md +146 -0
- package/skills/threejs-aaa-graphics-builder/references/render-recipes.md +90 -0
- package/skills/threejs-aaa-graphics-builder/references/shader-cookbook.md +292 -0
- package/skills/threejs-aaa-graphics-builder/references/technical-art.md +167 -0
- package/skills/threejs-aaa-graphics-builder/references/visual-scorecard.md +147 -0
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
# 3D 游戏文件结构规范
|
|
2
|
+
|
|
3
|
+
本文档定义浏览器 3D 游戏的标准文件结构。项目是 Vite + React + React Three Fiber 应用:3D 画面由 R3F / Three.js 管理,DOM UI 由 React 管理。**这是本插件所有 3D 代码结构和配置文件的唯一规范来源**,`game-director`、`game-designer`、`game-art`、`threejs-aaa-graphics-builder`、`game-test` 在涉及 3D 项目的 config 或目录结构时必须遵循本文件。
|
|
4
|
+
|
|
5
|
+
**核心原则:** React Three Fiber(`<Canvas>`)拥有 3D / WebGL 世界;React DOM(`src/ui`)拥有所有正式 HUD、菜单、对话框、设置、背包、任务与叙事面板。禁止用 R3F `<Html>` 替代正式 HUD。跨层通信走 **事件总线**、**输入动作** 与显式 **模拟状态**。
|
|
6
|
+
|
|
7
|
+
## `/public/config.json` 规则
|
|
8
|
+
|
|
9
|
+
`/public/config.json` 是游戏运行时外置配置文件,构建后原样输出为 `/dist/config.json`。
|
|
10
|
+
|
|
11
|
+
### 存储规则
|
|
12
|
+
|
|
13
|
+
1. 所有用户可调颜色、玩法参数、平衡数值和资源 URL 必须写入 `/public/config.json`,禁止硬编码在业务代码中。
|
|
14
|
+
2. 游戏代码必须通过 `fetch("./config.json")`(相对路径)读取配置;禁止使用绝对路径 `/config.json`;禁止从 `src` 目录直接 `import config.json`。
|
|
15
|
+
3. 不得在 React、R3F、Three、CSS 中重复硬编码同一份用户可调值。
|
|
16
|
+
|
|
17
|
+
### 结构要求:必须严格扁平
|
|
18
|
+
|
|
19
|
+
config **必须是扁平顶层对象**,每个参数都是直接顶层 key,**禁止**按 `assets`、`images`、`gameplay`、`colors`、`params` 等分组:
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
// 正确 —— 扁平
|
|
23
|
+
{ "image_background": { ... }, "player_move_speed": { ... } }
|
|
24
|
+
|
|
25
|
+
// 错误 —— 禁止嵌套分组
|
|
26
|
+
{ "assets": { "background": { ... } }, "gameplay": { "speed": { ... } } }
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
每个 key 分两类:
|
|
30
|
+
|
|
31
|
+
- **可见参数**(key 不以 `_` 开头):暴露给用户编辑,必须使用下方标准 schema。
|
|
32
|
+
- **不可见参数**(key 以 `_` 开头):内部字段(如 `_game_name`、`_config_version`),原始值即可,不使用 schema。
|
|
33
|
+
|
|
34
|
+
### 可见参数 schema
|
|
35
|
+
|
|
36
|
+
```json
|
|
37
|
+
"key_name": {
|
|
38
|
+
"value": <实际值>,
|
|
39
|
+
"type": "int" | "float" | "color" | "bool" | "string" | "audio" | "image" | "video",
|
|
40
|
+
"label": "<用户语言标签,≤10字>",
|
|
41
|
+
"min": <数字>,
|
|
42
|
+
"max": <数字>
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
规则:
|
|
47
|
+
|
|
48
|
+
- `type` 只能是 `int`、`float`、`color`、`bool`、`string`、`audio`、`image`、`video`。
|
|
49
|
+
- `label` 使用用户语言,长度不超过 10 个字符。
|
|
50
|
+
- `min`/`max` 只在 `int`/`float` 时出现,且必须同时给出。
|
|
51
|
+
- `type: "color"` 使用十六进制颜色字符串。
|
|
52
|
+
- `type: "image"` 必须额外声明 `"image_type": "Asset"` 和 `"size": "宽x高"`(如 `"1440x2560"`),供无法读取真实图片尺寸时判断显示尺寸。
|
|
53
|
+
- `audio`/`image`/`video` 的 `value` 必须是真实可访问的外部 `http(s)` URL;禁止本地相对路径。图片/网格由上游异步生成,URL 短暂 404 不代表素材失效,不得因此改写、替换或删除素材。
|
|
54
|
+
|
|
55
|
+
### 示例
|
|
56
|
+
|
|
57
|
+
```json
|
|
58
|
+
{
|
|
59
|
+
"_game_name": "示例 3D 游戏",
|
|
60
|
+
"_config_version": 1,
|
|
61
|
+
"player_move_speed": { "value": 4.5, "type": "float", "label": "移动速度", "min": 1, "max": 12 },
|
|
62
|
+
"camera_follow_lag": { "value": 0.12, "type": "float", "label": "镜头滞后", "min": 0.01, "max": 0.5 },
|
|
63
|
+
"theme_background_color": { "value": "#0b1020", "type": "color", "label": "背景色" },
|
|
64
|
+
"enable_shake": { "value": true, "type": "bool", "label": "震屏开关" },
|
|
65
|
+
"start_button_text": { "value": "开始游戏", "type": "string", "label": "开始文案" },
|
|
66
|
+
"bgm_main": { "value": "https://example.com/bgm.mp3", "type": "audio", "label": "背景音乐" },
|
|
67
|
+
"model_player": {
|
|
68
|
+
"value": "https://example.com/player.glb",
|
|
69
|
+
"type": "string",
|
|
70
|
+
"label": "玩家模型"
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
代码侧读取方式:
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
await loadConfig()
|
|
79
|
+
const speed = getSetting<number>('player_move_speed', 4.5)
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## `/user_upload` 目录规则
|
|
83
|
+
|
|
84
|
+
`/user_upload` 是用户上传素材的虚拟目录,其下文件不是真实素材文件,只保存素材链接或元数据。
|
|
85
|
+
|
|
86
|
+
1. 需要使用用户上传素材时,先读取 `/user_upload` 下对应文件,提取真实 URL。
|
|
87
|
+
2. 不要把 `/user_upload/...` 当成本地素材路径;最终代码必须引用提取出的真实 URL。
|
|
88
|
+
|
|
89
|
+
## 部署与路径规则
|
|
90
|
+
|
|
91
|
+
1. 最终部署产物固定为 `/dist`,以静态站点形式部署,运行时资源必须能通过浏览器直接访问。
|
|
92
|
+
2. `/dist` 必须能脱离源码目录独立运行:所有运行时代码、资源、chunk、CSS、音频、图片、模型与配置只能引用 `/dist` 内文件或外部 `http(s)` 链接,必须使用相对路径或构建产物内部路径,严禁指向源码目录的运行时引用。
|
|
93
|
+
3. `vite.config.ts` 必须设置 `base: './'`,使构建产物使用相对路径(`./assets/...`),保证在任意子路径部署都能运行。
|
|
94
|
+
4. 所有运行时字符串路径(`fetch`、`Audio`、动态 `import`、CSS `url()`、GLTFLoader)必须使用 `./` 相对路径或外部 `http(s)` URL,禁止以 `/` 开头的绝对路径(站点根路径)。
|
|
95
|
+
|
|
96
|
+
## 项目根目录必需文件
|
|
97
|
+
|
|
98
|
+
- `/project.md`:唯一游戏需求来源(策划案),后续所有开发依据此文件。
|
|
99
|
+
- `/public/config.json`:运行时配置与素材绑定契约。
|
|
100
|
+
- `/src`:Vite + React + R3F 源码。
|
|
101
|
+
- `/dist`:构建产物,交付物。
|
|
102
|
+
|
|
103
|
+
## Tech Stack
|
|
104
|
+
|
|
105
|
+
| Tech | Role |
|
|
106
|
+
| --- | --- |
|
|
107
|
+
| Vite | 构建与开发服务器 |
|
|
108
|
+
| React | App 壳与 DOM UI |
|
|
109
|
+
| React Three Fiber (R3F) | 挂载 Three.js `Canvas`、生命周期、`useFrame` 编排 |
|
|
110
|
+
| Three.js | WebGL 渲染、相机、灯光、网格、`AnimationMixer`、GLB 等 |
|
|
111
|
+
| Tailwind CSS v4 | DOM UI 样式 |
|
|
112
|
+
| mitt | React UI 与游戏运行时之间的事件总线 |
|
|
113
|
+
| `public/config.json` | 运行时外置配置 |
|
|
114
|
+
| pnpm | 包管理器(`pnpm install` / `pnpm build`) |
|
|
115
|
+
|
|
116
|
+
## 必需顶层结构
|
|
117
|
+
|
|
118
|
+
```text
|
|
119
|
+
.
|
|
120
|
+
├── index.html
|
|
121
|
+
├── package.json
|
|
122
|
+
├── public/
|
|
123
|
+
│ ├── config.json
|
|
124
|
+
│ └── assets/ # 可选静态资源目录
|
|
125
|
+
└── src/
|
|
126
|
+
└── main.tsx
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
完整推荐树:
|
|
130
|
+
|
|
131
|
+
```text
|
|
132
|
+
.
|
|
133
|
+
├── index.html
|
|
134
|
+
├── package.json
|
|
135
|
+
├── pnpm-lock.yaml
|
|
136
|
+
├── tsconfig.json
|
|
137
|
+
├── vite.config.ts
|
|
138
|
+
├── public/
|
|
139
|
+
│ ├── config.json
|
|
140
|
+
│ └── assets/
|
|
141
|
+
└── src/
|
|
142
|
+
├── main.tsx
|
|
143
|
+
├── App.tsx
|
|
144
|
+
├── index.css
|
|
145
|
+
├── config/
|
|
146
|
+
│ ├── config.ts # fetch public/config.json → loadConfig() / getSetting()
|
|
147
|
+
│ └── types.ts # 配置类型(可选)
|
|
148
|
+
├── game/
|
|
149
|
+
│ ├── bridge/
|
|
150
|
+
│ │ ├── gameBus.ts # mitt 事件总线
|
|
151
|
+
│ │ ├── gameCommands.ts
|
|
152
|
+
│ │ └── gameEvents.ts
|
|
153
|
+
│ ├── simulation/
|
|
154
|
+
│ │ ├── state.ts # 可序列化、可测试的游戏状态
|
|
155
|
+
│ │ ├── systems/ # 确定性玩法系统
|
|
156
|
+
│ │ └── rules.ts # 无 Three / React 依赖的规则
|
|
157
|
+
│ ├── content/
|
|
158
|
+
│ │ ├── encounters/
|
|
159
|
+
│ │ ├── items/
|
|
160
|
+
│ │ └── maps/
|
|
161
|
+
│ ├── input/
|
|
162
|
+
│ │ ├── actions.ts
|
|
163
|
+
│ │ ├── bindings.ts
|
|
164
|
+
│ │ └── inputState.ts
|
|
165
|
+
│ ├── assets/
|
|
166
|
+
│ │ └── manifest.ts # 稳定资产键、URL、元数据
|
|
167
|
+
│ ├── audio/
|
|
168
|
+
│ │ ├── audioManager.ts
|
|
169
|
+
│ │ ├── audioHooks.ts
|
|
170
|
+
│ │ └── audioPrefs.ts
|
|
171
|
+
│ └── three/ # 无 React import;可单测的 Three 模块
|
|
172
|
+
│ ├── buildWorld.ts
|
|
173
|
+
│ ├── orbitCameraRig.ts
|
|
174
|
+
│ ├── character/
|
|
175
|
+
│ └── creatures/
|
|
176
|
+
├── ui/
|
|
177
|
+
│ ├── components/
|
|
178
|
+
│ │ └── GameCanvas.tsx # R3F <Canvas>、useFrame、世界挂载
|
|
179
|
+
│ ├── hud/
|
|
180
|
+
│ ├── menus/
|
|
181
|
+
│ ├── overlays/
|
|
182
|
+
│ └── store/
|
|
183
|
+
│ └── useGameUiStore.ts
|
|
184
|
+
├── components/ # 共享 DOM UI 原语(非游戏业务 UI)
|
|
185
|
+
└── lib/
|
|
186
|
+
└── utils.ts
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## 文件职责
|
|
190
|
+
|
|
191
|
+
| Path | Owner | Role |
|
|
192
|
+
| --- | --- | --- |
|
|
193
|
+
| `index.html` | tech | 壳页面;挂载 `#root` / `#app`,加载 `/src/main.tsx`。 |
|
|
194
|
+
| `package.json` | tech | 脚本与依赖;必须暴露 `build`(通常还有 `dev`)。 |
|
|
195
|
+
| `public/config.json` | product / ops | 运行时可调参数与内容指针;优先改这里而非源码。 |
|
|
196
|
+
| `src/main.tsx` | tech | 启动:`loadConfig()` 后 `createRoot(...).render(<App />)`。 |
|
|
197
|
+
|
|
198
|
+
## 交付物
|
|
199
|
+
|
|
200
|
+
游戏未完成,除非 **两者都存在**:
|
|
201
|
+
|
|
202
|
+
| Artifact | When | Why |
|
|
203
|
+
| --- | --- | --- |
|
|
204
|
+
| `public/config.json` | 始终在源码树 | 运维/运行时配置源;Vite 构建时复制进 `dist/`。 |
|
|
205
|
+
| `dist/index.html` | `pnpm build` 之后 | 可交付静态入口。 |
|
|
206
|
+
|
|
207
|
+
成功构建后还应有 `dist/config.json`(`public/config.json` 的运行时副本)。
|
|
208
|
+
|
|
209
|
+
## 包管理与脚本
|
|
210
|
+
|
|
211
|
+
- 包管理器:**pnpm**(默认;不用 npm/yarn)。
|
|
212
|
+
- 安装:`pnpm install`
|
|
213
|
+
- 生产构建:`pnpm build`
|
|
214
|
+
- 本地开发:`pnpm dev`
|
|
215
|
+
|
|
216
|
+
最小脚本约定:
|
|
217
|
+
|
|
218
|
+
```json
|
|
219
|
+
{
|
|
220
|
+
"scripts": {
|
|
221
|
+
"dev": "vite --host 127.0.0.1",
|
|
222
|
+
"build": "tsc && vite build",
|
|
223
|
+
"preview": "vite preview --host 127.0.0.1"
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
新项目就绪前验证:
|
|
229
|
+
|
|
230
|
+
1. `public/config.json` 存在。
|
|
231
|
+
2. `pnpm install` 成功。
|
|
232
|
+
3. `pnpm build` 成功并产出 **`dist/index.html`**(及 `dist/config.json`)。
|
|
233
|
+
4. 入口链正常:`index.html` → `src/main.tsx` → `loadConfig()` → `<App />`(`GameCanvas` + DOM HUD)。
|
|
234
|
+
|
|
235
|
+
## 启动流
|
|
236
|
+
|
|
237
|
+
```text
|
|
238
|
+
main.tsx
|
|
239
|
+
-> loadConfig()
|
|
240
|
+
-> createRoot(...).render(<App />)
|
|
241
|
+
App.tsx
|
|
242
|
+
-> GameCanvas (R3F <Canvas>, World + useFrame)
|
|
243
|
+
-> Hud / MobileHud
|
|
244
|
+
-> PauseMenu, overlays(按需)
|
|
245
|
+
|
|
246
|
+
GameCanvas.tsx
|
|
247
|
+
-> buildWorldInto / GLTFLoader(via game/three)
|
|
248
|
+
-> useFrame: simulation step + scene sync + camera
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
`GameCanvas.tsx` 是 **WebGL ↔ React DOM 边界**。DOM UI 叠在 Canvas 之上(在 `App` 中组合)。卸载时 dispose Three 资源与总线订阅。
|
|
252
|
+
|
|
253
|
+
## 分层规则
|
|
254
|
+
|
|
255
|
+
### R3F / 3D 运行时(`src/ui/components/GameCanvas.tsx` + `src/game/three/`)
|
|
256
|
+
|
|
257
|
+
**`GameCanvas.tsx`(挂载边界)负责:**
|
|
258
|
+
|
|
259
|
+
- 创建 R3F `<Canvas>`(阴影、`gl`、`dpr` 等默认见 `engine-runtime.md`)
|
|
260
|
+
- `useFrame` 编排:读输入/模拟 → 更新 `Object3D` 或状态 → `mixer.update` → 相机(交给 R3F 渲染;除非离屏否则不要手调 `renderer.render`)
|
|
261
|
+
- 组装场景根:`buildWorldInto(group)`、异步 GLB 加载
|
|
262
|
+
- StrictMode 重挂载 / 卸载时 dispose 几何、材质、`AnimationMixer` 与总线订阅
|
|
263
|
+
|
|
264
|
+
**`game/three/*`(纯 Three 模块)负责:**
|
|
265
|
+
|
|
266
|
+
- 无 React import 的场景构建、数学与加载助手
|
|
267
|
+
- 不在 React ref 之外偷偷改 DOM
|
|
268
|
+
|
|
269
|
+
用 `gameBus.emit()` 发出玩法事实;通过 `gameBus` / 命令类型接受 UI 命令(暂停、重置、使用道具等)。
|
|
270
|
+
|
|
271
|
+
**禁止:**
|
|
272
|
+
|
|
273
|
+
- 在 `game/three` 内 `import` React 组件或 hooks
|
|
274
|
+
- 用 R3F `<Html>` 堆正式 HUD/菜单
|
|
275
|
+
- 把触控摇杆 / 手势映射散落在 `useFrame` 或随机组件里(集中到 `game/input` 或 UI → 统一动作)
|
|
276
|
+
|
|
277
|
+
### React DOM UI(`src/ui` + `src/components`)
|
|
278
|
+
|
|
279
|
+
**负责:** HUD、条、按钮、主/暂停/设置菜单、背包、任务、对话框、结算、toast;经 `gameBus` 发 `command:*`;经 `useGameUiStore()`(或等价物)读运行时状态。
|
|
280
|
+
|
|
281
|
+
**禁止:** 在 HUD 里直接拿 `Mesh` / `Object3D` 每帧改 `position`;在 UI 组件里写核心规则;把每局业务 UI 塞进 `src/components`;在多个组件里复制摇杆绑定而不走 `game/input`。
|
|
282
|
+
|
|
283
|
+
### Simulation(`src/game/simulation`)
|
|
284
|
+
|
|
285
|
+
负责玩家/敌人状态、背包、任务、战斗数值、纯规则、可序列化存档。要求无 Three.js / R3F / React 依赖。
|
|
286
|
+
|
|
287
|
+
### Content(`src/game/content`)
|
|
288
|
+
|
|
289
|
+
负责关卡、地图、遭遇、波次、道具、奖励等静态设计数据。禁止 React 组件与 `Object3D` 生命周期耦合。
|
|
290
|
+
|
|
291
|
+
### Input(`src/game/input`)
|
|
292
|
+
|
|
293
|
+
负责统一动作、键鼠/虚拟摇杆/触控绑定,以及 UI 与 `GameCanvas` 共用的语义输入面。禁止未文档化的散落硬编码绑定;禁止直接改写持久模拟根状态。
|
|
294
|
+
|
|
295
|
+
### Assets(`src/game/assets`)
|
|
296
|
+
|
|
297
|
+
负责 glTF / 贴图 / 音频 / VFX 的稳定键、URL、类型与元数据。禁止在玩法、UI、场景模块中到处硬编码 `"/foo/bar.glb"`。
|
|
298
|
+
|
|
299
|
+
### Audio(`src/game/audio`)
|
|
300
|
+
|
|
301
|
+
负责从 config 读 BGM/SFX 路径与开关、Web Audio / HTMLAudio 播放与 dispose、监听 `gameBus` 映射玩法事实到声音、应用 HUD 发来的 `command:audio-prefs`。禁止在 HUD 里 `new Audio()` 播局内音效;禁止每帧 `useFrame` 新建音源或脚步循环;退出/结算/失败/重开后不得残留局内 BGM。解锁、事件钩子与清理细则见 `engine-audio.md`。
|
|
302
|
+
|
|
303
|
+
## 事件桥规则
|
|
304
|
+
|
|
305
|
+
文件:`src/game/bridge/gameBus.ts`、`gameEvents.ts`、`gameCommands.ts`。
|
|
306
|
+
|
|
307
|
+
命名:
|
|
308
|
+
|
|
309
|
+
- `command:*` — React → 游戏运行时
|
|
310
|
+
- `game:*` — 全局会话 / 世界事件
|
|
311
|
+
- `player:*` — 玩家状态
|
|
312
|
+
- `enemy:*` — 敌人状态
|
|
313
|
+
- `ui:*` — 面向 UI 的事件
|
|
314
|
+
- `game:feedback` / `player:movement` — 局内反馈线索(SFX + VFX);payload 为普通数据
|
|
315
|
+
|
|
316
|
+
新增事件时,同一次改动更新 `gameCommands.ts` / `gameEvents.ts` 类型。
|
|
317
|
+
|
|
318
|
+
## 诊断与测试钩子
|
|
319
|
+
|
|
320
|
+
在 `GameCanvas` 挂载时安装,卸载时清理;类型声明放在 `src/vite-env.d.ts`。
|
|
321
|
+
|
|
322
|
+
- `window.__THREE_GAME_DIAGNOSTICS__`:渲染器 info、模拟快照、输入状态、实体计数等(供 canvas inspector / AAA scorecard)。
|
|
323
|
+
- `window.__THREE_GAME_TEST_HOOKS__`:`seed` / `setState` / `setPausedForScreenshot` / `setReducedMotion` / `hideDebugUi`(供视觉回归与 bot playtest)。
|
|
324
|
+
|
|
325
|
+
确定性随机放在 `src/lib/random.ts` 或 `src/game/simulation/random.ts`,禁止业务路径使用 `Math.random`。
|
|
326
|
+
|
|
327
|
+
## 硬性方法论
|
|
328
|
+
|
|
329
|
+
- **保持分层:** `game/three` 不得 import React;DOM UI 不得直接驱动 `Object3D`。优先 `gameBus` 或单一输入/模拟门面。
|
|
330
|
+
- **模拟优先:** 规则在 `game/simulation`,不在 `useFrame` 或 `Hud.tsx`。
|
|
331
|
+
- **输入集中:** 物理 → 语义映射在 `game/input`。
|
|
332
|
+
- **内容是数据:** 关卡/地图/道具在 `game/content`。
|
|
333
|
+
- **资产目录:** glTF / 贴图 / 音频经 `manifest.ts` 或 config key。
|
|
334
|
+
- **局内音频集中:** 仅 `game/audio`;偏好经总线。
|
|
335
|
+
- **配置集中:** 可调参数在 `public/config.json`。
|
|
336
|
+
- **UI 放置:** 业务 DOM UI 在 `src/ui`;共享原语在 `src/components`;正式 HUD 永不当 R3F 子节点。
|
|
337
|
+
- **验证:** 有意义改动后跑 `pnpm build`。
|
|
338
|
+
|
|
339
|
+
## 反模式
|
|
340
|
+
|
|
341
|
+
- 在 `useFrame` 里搭完整菜单 / 背包 / 设置
|
|
342
|
+
- 从任意 React 组件抓场景内部 ref 到处改 mesh
|
|
343
|
+
- 把战斗规则放进 `Hud.tsx`
|
|
344
|
+
- 用 `Mesh.userData` 当 UI/存档的持久数据库
|
|
345
|
+
- 输入与状态多源漂移
|
|
346
|
+
- 多文件复制同一触控动作映射
|
|
347
|
+
- 多处硬编码同一 glTF/贴图 URL 字符串
|
|
348
|
+
- 按本规范却用 `src/main.ts` 代替 `src/main.tsx`
|
|
349
|
+
- 用 CRA、Next.js 或仅 npm 脚手架替换本布局(除非用户要求)
|
|
350
|
+
|
|
351
|
+
## 输出期望
|
|
352
|
+
|
|
353
|
+
新增功能时说明所属层(R3F/Three 编排 / React UI / Simulation / Content / Input / Assets / Audio)及原因。跨层行为经 `gameBus`(或约定的单一门面)路由,并更新事件类型。以 `pnpm build` 确认。
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: threejs-aaa-graphics-builder
|
|
3
|
+
description: 用高品质美术方向、材质、灯光、着色器、VFX、素材获取与渲染预算升级 Three.js 场景。在 3D 浏览器游戏需要超越原型画面的可度量视觉提质时使用。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Three.js AAA Graphics Builder
|
|
7
|
+
|
|
8
|
+
## Purpose
|
|
9
|
+
|
|
10
|
+
Own the production graphics pass. Convert basic screenshots into authored, high-density, performance-aware visual experiences.
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
## Use When
|
|
14
|
+
|
|
15
|
+
Screenshots still look basic, models look primitive, worlds are sparse, UI/world art feels generic, or the user asks for premium, AAA, high-fidelity, showcase, or less-basic graphics.
|
|
16
|
+
|
|
17
|
+
## Required References
|
|
18
|
+
|
|
19
|
+
These references are required phase-entry gates, not optional reading:
|
|
20
|
+
|
|
21
|
+
- Load `../game-art/references/scene-profiles.md` and select a `scene_profile_id` before world kit, lighting polish, or any claim that World/environment is authored. Read only the **World + 3D · Lighting + Entities + Reject** sections for that profile; this skill executes the production pass against it.
|
|
22
|
+
- Load `references/visual-scorecard.md` before scoring, judging completion, or making any premium/AAA/showcase claim.
|
|
23
|
+
- Load `references/implementation-blueprint.md` before changing graphics architecture, materials, VFX, rendering, diagnostics, or broad visual systems.
|
|
24
|
+
- Load `references/model-recipes.md` before building or upgrading hero/player, obstacle, enemy, pickup, world-kit, material, or prop models.
|
|
25
|
+
- Load `references/render-recipes.md` before changing lighting, tone mapping, shadows, fog, post-processing, materials, or render composition.
|
|
26
|
+
- Load `references/technical-art.md` before premium/AAA/showcase graphics work, shaders/material systems, VFX systems, generated/imported asset cleanup, LOD/instancing work, or visual changes that could affect browser performance.
|
|
27
|
+
- Load `references/shader-cookbook.md` before writing any custom shader, `onBeforeCompile` injection, material recipe, sky, or post-processing chain; use its proven values and GLSL patterns instead of improvising.
|
|
28
|
+
- Load `references/checklists/aaa-game-quality-gate.md` and `references/checklists/aaa-visual-scorecard.md` before declaring a game premium, AAA, showcase, complete, release-ready, or less basic.
|
|
29
|
+
- Load the relevant checklist before focused work: `references/checklists/procedural-model-quality.md`, `references/checklists/material-lighting-quality.md`, `references/checklists/performance-safe-visual-detail.md`, or `references/checklists/technical-art-quality.md`.
|
|
30
|
+
- Load `references/graphics-prompt-templates.md` only when the user asks for reusable prompts, a graphics-pass prompt, or a task template.
|
|
31
|
+
|
|
32
|
+
For broad "still looks basic", premium, AAA, high-fidelity, showcase, or less-basic graphics work, load the scene-profiles paradigm (3D Lighting rail) plus all five core references (`visual-scorecard`, `implementation-blueprint`, `model-recipes`, `render-recipes`, `technical-art`) as the first action in the phase. Track them in a reference ledger with yes/no, path, and failure reason. Do not mark the graphics phase complete while any required reference is skipped.
|
|
33
|
+
|
|
34
|
+
External asset sourcing gate:
|
|
35
|
+
|
|
36
|
+
- For premium/AAA/showcase/high-fidelity/less-basic graphics with a hero/player, character, creature, boss, vehicle, ship, building, weapon, signature prop, complex pickup, or hero environment piece, prefer authored procedural factories from `references/model-recipes.md` before settling for placeholders. Remote mesh generation is offline in the current release.
|
|
37
|
+
- For concept needs, texture/material references, decals, logos, faction marks, icons, GUI art, skies, backgrounds, or title/menu art: prefer procedural/CSS/canvas UI art; use user-supplied local images via `evomeme_upload_game_asset`.
|
|
38
|
+
- Create an asset sourcing ledger for each high-value surface: procedural / hybrid / user-provided, plus outputs or skip reason.
|
|
39
|
+
- `not-needed` is valid only after the relevant path was considered and the ledger explains why external assets would not improve a non-hero support surface, or why an attempted MCP/CDN call shows a real blocker.
|
|
40
|
+
- For premium hero surfaces, procedural-only is allowed; document that constraint and still meet silhouette/material/lighting quality via procedural authorship or user-provided GLB/FBX.
|
|
41
|
+
|
|
42
|
+
## Workflow
|
|
43
|
+
|
|
44
|
+
1. Capture or inspect active desktop/mobile screenshots.
|
|
45
|
+
2. Confirm or select a `scene_profile_id` from `../game-art/references/scene-profiles.md` (World / 3D · Lighting / Entities). If missing, write it before upgrading surfaces.
|
|
46
|
+
3. Score visuals across art direction, hero/player, obstacles, rewards, world, materials, render, VFX, UI, and performance evidence.
|
|
47
|
+
4. Add missing graphics architecture: material library, procedural textures/decals, model factories, world prop kit, technical-art budget, VFX system, render pipeline, diagnostics.
|
|
48
|
+
5. Fill the external asset sourcing ledger per surface: procedural Three.js factory, user-provided model/2D reference, or a hybrid.
|
|
49
|
+
6. Upgrade every weak visible surface, not only one hero object. World layers must match the chosen scene-profiles paradigm (Play / Near / Mid / Far / Motion).
|
|
50
|
+
7. Add lighting/render/material polish after authored forms exist, following the paradigm's Lighting stack intent and `references/render-recipes.md`.
|
|
51
|
+
8. Add event-driven VFX tied to gameplay state.
|
|
52
|
+
9. Re-score screenshots against the calibration anchors, citing the inspector's measured metrics. Continue until every premium category is at least 2/3 or report exact blockers.
|
|
53
|
+
10. Run the fresh-eyes review per `references/visual-scorecard.md` before finalizing premium/AAA/showcase claims.
|
|
54
|
+
11. Verify renderer diagnostics against the render budget table, technical-art budget, desktop/mobile screenshots, console/page errors, canvas pixels, imported asset budgets, and playability.
|
|
55
|
+
|
|
56
|
+
## Core Rule
|
|
57
|
+
|
|
58
|
+
Do not make primitives look AAA by adding glow. First build authored forms, then materials, then lighting, then effects.
|
|
59
|
+
|
|
60
|
+
## Final Response
|
|
61
|
+
|
|
62
|
+
Report the reference ledger, external asset sourcing ledger, technical art brief, score before/after, production surfaces upgraded, files changed, screenshots/artifacts, renderer diagnostics, imported asset diagnostics when relevant, VFX readability and render-budget tradeoffs, and remaining blockers. For premium/AAA/showcase claims, include the filled visual scorecard exactly as defined in `references/visual-scorecard.md`, including average and automatic failures remaining.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# AAA Browser Game Quality Gate
|
|
2
|
+
|
|
3
|
+
- The game is immediately playable and not presented as a landing page.
|
|
4
|
+
- The core loop has objective, scoring/progress, fail/retry, pacing, and feedback.
|
|
5
|
+
- Screenshots do not read as a collection of default primitives, debug HUDs, or generic placeholder panels.
|
|
6
|
+
- Unadorned boxes, cones, spheres, flat planes, and stretched buildings are not the dominant art language unless explicitly intentional.
|
|
7
|
+
- UI is genre-specific, compact, readable during motion, responsive, and includes needed modal states.
|
|
8
|
+
- Player, threats, rewards, and objectives have distinct silhouettes and material/feedback language.
|
|
9
|
+
- Player/hero asset has primary silhouette, secondary structure, tertiary detail, material contrast, and state feedback.
|
|
10
|
+
- Obstacle/enemy set includes at least three authored variants with unique telegraphs.
|
|
11
|
+
- Reward/interactable set includes at least two authored variants with collection/interaction feedback.
|
|
12
|
+
- World kit includes reusable modules and does not rely on one repeated skyline/block/road primitive.
|
|
13
|
+
- The scene has foreground, midground, and background depth instead of one flat play lane.
|
|
14
|
+
- Lighting, shadows, fog, and post-processing clarify depth and mood without hiding gameplay.
|
|
15
|
+
- Procedural models use the authored factories, shared material kit, reusable prop kits, and collision proxies from `../implementation-blueprint.md` and `../technical-art.md`.
|
|
16
|
+
- Movement, camera, speed, impact, and restart loop feel tuned through play, not just configured.
|
|
17
|
+
- Audio/visual feedback exists for core actions and state transitions.
|
|
18
|
+
- Mobile viewport preserves framing, safe areas, touch targets, and text fit.
|
|
19
|
+
- Renderer diagnostics from `../technical-art.md` are reviewed when visual fidelity changes.
|
|
20
|
+
- Visual scorecard in `../visual-scorecard.md` passes: every category at least 2 and average at least 2.3.
|
|
21
|
+
- Build, browser run, console/page errors, screenshots, nonblank canvas, interaction, and responsive checks all pass.
|
|
22
|
+
- A screenshot critique identifies no unresolved high-impact placeholder-quality blockers.
|
|
23
|
+
- If any premium surface was intentionally deferred, the final report says which one and why.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# AAA Visual Scorecard Checklist
|
|
2
|
+
|
|
3
|
+
Use with `../visual-scorecard.md`.
|
|
4
|
+
|
|
5
|
+
- Current desktop and mobile active-play screenshots are available.
|
|
6
|
+
- Art direction category scored 0-3.
|
|
7
|
+
- Hero/player asset category scored 0-3.
|
|
8
|
+
- Obstacles/enemies category scored 0-3.
|
|
9
|
+
- Rewards/interactables category scored 0-3.
|
|
10
|
+
- World/environment category scored 0-3.
|
|
11
|
+
- Materials/textures category scored 0-3.
|
|
12
|
+
- Lighting/render category scored 0-3.
|
|
13
|
+
- VFX/motion category scored 0-3.
|
|
14
|
+
- UI/HUD category scored 0-3.
|
|
15
|
+
- Performance evidence category scored 0-3.
|
|
16
|
+
- No automatic failure is present: check every item in the canonical Automatic Failures list in `../visual-scorecard.md` (do not rely on a from-memory summary of it).
|
|
17
|
+
- Technical-art evidence includes material kit, VFX readability, instancing/LOD/culling decision, DPR/post/shadow tradeoffs, and imported asset diagnostics when generated/imported assets are used.
|
|
18
|
+
- Premium gate passes only when every category is at least 2 and average score is at least 2.3.
|
|
19
|
+
- Showcase gate passes only when at least six categories are 3, no category is below 2, and average score is at least 2.7.
|
package/skills/threejs-aaa-graphics-builder/references/checklists/material-lighting-quality.md
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Material and Lighting Quality Checklist
|
|
2
|
+
|
|
3
|
+
Gate the lighting/material recipes in `../render-recipes.md` and the material kit in `../technical-art.md`.
|
|
4
|
+
|
|
5
|
+
- Renderer color space, tone mapping, exposure, and shadow settings are intentional.
|
|
6
|
+
- Key, fill, rim, ambient, and environment lighting follow the lighting stack in `../render-recipes.md` and clarify depth and gameplay roles.
|
|
7
|
+
- Materials avoid flat default looks through roughness/metalness/emissive/vertex-color variation.
|
|
8
|
+
- Important objects have readable silhouettes against background, fog, and effects.
|
|
9
|
+
- Shadows help ground assets without obscuring navigation or collision boundaries.
|
|
10
|
+
- Fog, bloom, particles, and post-processing support readability instead of hiding it.
|
|
11
|
+
- Procedural textures or decals are scaled, stable, and not visually noisy during movement.
|
|
12
|
+
- Materials reuse the shared kit in `../technical-art.md` where possible and are disposed when obsolete.
|
|
13
|
+
- Desktop and mobile screenshots are checked after lighting/material changes.
|
|
14
|
+
- Renderer info or frame-time evidence is gathered when render cost changes.
|
package/skills/threejs-aaa-graphics-builder/references/checklists/performance-safe-visual-detail.md
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Performance-Safe Visual Detail Checklist
|
|
2
|
+
|
|
3
|
+
Gate the render budget and instancing/LOD guidance in `../technical-art.md`.
|
|
4
|
+
|
|
5
|
+
- Baseline renderer info is captured when increasing fidelity.
|
|
6
|
+
- Draw calls, triangles, geometries, materials, textures, and frame time are reviewed against the render budget in `../technical-art.md` after changes.
|
|
7
|
+
- Repeated details use the instancing/LOD approach in `../technical-art.md`: instancing, shared resources, atlases, or generated texture reuse where practical.
|
|
8
|
+
- High segment counts are limited to silhouette-critical forms.
|
|
9
|
+
- Shadows are scoped by light count, shadow map size, casters/receivers, and camera distance.
|
|
10
|
+
- Post-processing is justified by gameplay readability or strong art direction.
|
|
11
|
+
- DPR caps or adaptive quality are considered for mobile.
|
|
12
|
+
- Generated resources have a disposal/reuse strategy.
|
|
13
|
+
- The worst-case gameplay scene, not only idle view, is inspected.
|
|
14
|
+
- Visual detail remains readable at mobile resolution without excessive GPU cost.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Procedural Model Quality Checklist
|
|
2
|
+
|
|
3
|
+
Gate the procedural modeling guidance in `../model-recipes.md` and the material kit in `../technical-art.md`.
|
|
4
|
+
|
|
5
|
+
- The model has a recognizable silhouette from the gameplay camera.
|
|
6
|
+
- Primary forms read clearly before material or post-processing detail.
|
|
7
|
+
- Secondary detail supports the asset role: panels, trims, ridges, tubes, fins, sockets, decals, or emissive accents.
|
|
8
|
+
- Tertiary detail is visible at intended camera distance and does not create noise.
|
|
9
|
+
- Materials use the kit in `../technical-art.md` with purposeful contrast in roughness, metalness, color, emissive, or texture.
|
|
10
|
+
- Bevels, curves, and segment counts improve silhouette or highlight behavior.
|
|
11
|
+
- Repeated props use shared geometries/materials, instancing, or pools when practical.
|
|
12
|
+
- Visual mesh and gameplay collision/proxy are intentionally separated when needed.
|
|
13
|
+
- The factory returns named groups/meshes and keeps ownership/disposal clear.
|
|
14
|
+
- Renderer diagnostics from `../technical-art.md` are checked when triangles, materials, textures, or draw calls increase.
|
|
15
|
+
- Mobile screenshot still shows the asset as more than a primitive placeholder.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Technical Art Quality Checklist
|
|
2
|
+
|
|
3
|
+
Use before claiming premium, AAA, showcase, high-fidelity, or less-basic visual quality after graphics changes. Each item gates the guidance in `../technical-art.md`.
|
|
4
|
+
|
|
5
|
+
- Technical art brief converts art direction into shapes, material roles, lighting, VFX, camera, UI/world motifs, and budgets.
|
|
6
|
+
- Hero surfaces and support surfaces are identified separately.
|
|
7
|
+
- Material kit uses the named shared roles from `../technical-art.md`, not scattered one-off colors/materials.
|
|
8
|
+
- Shader/post-processing choices have player-facing purpose and measured or bounded cost.
|
|
9
|
+
- VFX follow the event-driven language in `../technical-art.md`: readable, short-lived, and not hiding collision, threats, rewards, or UI.
|
|
10
|
+
- Instancing is used for large repeated same-geometry/same-material detail where appropriate.
|
|
11
|
+
- LOD, culling, or simplified far variants are planned for heavy background/imported assets.
|
|
12
|
+
- Imported/generated models have scale, pivot/orientation, bounds, file size, triangle/material/texture counts when available, and collision proxies checked.
|
|
13
|
+
- Decals/trim/detail systems reinforce function, route, faction, scale, or state.
|
|
14
|
+
- Threats, rewards, interactables, and player state are not communicated by color alone.
|
|
15
|
+
- DPR cap, shadow settings, post-processing passes, and mobile tradeoffs are reported.
|
|
16
|
+
- Renderer diagnostics match the render budget reporting in `../technical-art.md`: calls, triangles, geometries, textures, and material count when available.
|
|
17
|
+
- Final visual scorecard performance evidence category includes budget and technical-art evidence, not only screenshots.
|