@origingame/engine 0.0.0-stage → 0.1.1

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.
Files changed (159) hide show
  1. package/bin/og.mjs +25 -0
  2. package/dist/web/origin-engine.d.ts +1233 -0
  3. package/dist/web/origin-engine.js +8628 -0
  4. package/dist/web/origin-engine_bg.wasm +0 -0
  5. package/dist/web/origin-engine_bg.wasm.d.ts +366 -0
  6. package/dist/web-publish/origin-engine-lanes.js +8509 -0
  7. package/dist/web-publish/origin-engine-lanes_bg.wasm +0 -0
  8. package/dist/web-publish/origin-engine.d.ts +1176 -0
  9. package/dist/web-publish/origin-engine.js +8313 -0
  10. package/dist/web-publish/origin-engine_bg.wasm +0 -0
  11. package/dist/web-publish/origin-engine_bg.wasm.d.ts +347 -0
  12. package/dist/web-publish/snippets/wasm-bindgen-rayon-38edf6e439f6d70d/src/workerHelpers.no-bundler.js +77 -0
  13. package/dist/web-publish-2d/origin-engine-lanes.js +8509 -0
  14. package/dist/web-publish-2d/origin-engine-lanes_bg.wasm +0 -0
  15. package/dist/web-publish-2d/origin-engine.d.ts +1176 -0
  16. package/dist/web-publish-2d/origin-engine.js +8313 -0
  17. package/dist/web-publish-2d/origin-engine_bg.wasm +0 -0
  18. package/dist/web-publish-2d/origin-engine_bg.wasm.d.ts +347 -0
  19. package/dist/web-publish-2d/snippets/wasm-bindgen-rayon-38edf6e439f6d70d/src/workerHelpers.no-bundler.js +77 -0
  20. package/knowledge/README.md +31 -0
  21. package/knowledge/knowledge.json +13 -0
  22. package/knowledge/looks/catalogue.json +1871 -0
  23. package/knowledge/package.json +33 -0
  24. package/knowledge/rules/platform.json +329 -0
  25. package/knowledge/scaffold/README.md +27 -0
  26. package/knowledge/scaffold/distribution.json +48 -0
  27. package/knowledge/scaffold/origin-engine.json +19 -0
  28. package/knowledge/scaffold/template/.origin/setup +14 -0
  29. package/knowledge/scaffold/template/LICENSES.md +23 -0
  30. package/knowledge/scaffold/template/README.md +37 -0
  31. package/knowledge/scaffold/template/assets/ai/guard.ogt +48 -0
  32. package/knowledge/scaffold/template/assets/audio/click.ogt +9 -0
  33. package/knowledge/scaffold/template/assets/fonts/NotoSansSC-Regular-subset.ttf.ogt +12 -0
  34. package/knowledge/scaffold/template/assets/fonts/OFL.txt +93 -0
  35. package/knowledge/scaffold/template/assets/looks/origin-game.ogt +12 -0
  36. package/knowledge/scaffold/template/assets/nav/yard.ogt +27 -0
  37. package/knowledge/scaffold/template/assets/scenes/main.ogt +34 -0
  38. package/knowledge/scaffold/template/assets/strings/en.ogt +14 -0
  39. package/knowledge/scaffold/template/assets/textures/stone_n.png.ogt +7 -0
  40. package/knowledge/scaffold/template/gitattributes +22 -0
  41. package/knowledge/scaffold/template/gitignore +8 -0
  42. package/knowledge/scaffold/template/package.json +18 -0
  43. package/knowledge/scaffold/template/project.ogt +25 -0
  44. package/knowledge/scaffold/template/src/main.ts +246 -0
  45. package/knowledge/scaffold/template/tests/guard.og.ts +67 -0
  46. package/knowledge/scaffold/template/tests/smoke.og.ts +43 -0
  47. package/knowledge/scaffold/template/tsconfig.json +17 -0
  48. package/knowledge/scripts/lib.ts +207 -0
  49. package/knowledge/scripts/mount.ts +210 -0
  50. package/knowledge/scripts/pack.ts +25 -0
  51. package/knowledge/scripts/scaffold.ts +72 -0
  52. package/knowledge/scripts/validate.ts +749 -0
  53. package/knowledge/skills/og-ai/SKILL.md +386 -0
  54. package/knowledge/skills/og-audio/SKILL.md +191 -0
  55. package/knowledge/skills/og-build/SKILL.md +330 -0
  56. package/knowledge/skills/og-core/SKILL.md +285 -0
  57. package/knowledge/skills/og-feel/SKILL.md +385 -0
  58. package/knowledge/skills/og-game/SKILL.md +1479 -0
  59. package/knowledge/skills/og-i18n/SKILL.md +220 -0
  60. package/knowledge/skills/og-platform-sdk/SKILL.md +199 -0
  61. package/knowledge/skills/og-taste/SKILL.md +537 -0
  62. package/knowledge/skills/og-ui/SKILL.md +444 -0
  63. package/knowledge/wiki/ai.md +627 -0
  64. package/knowledge/wiki/anim.md +1187 -0
  65. package/knowledge/wiki/atmosphere.md +636 -0
  66. package/knowledge/wiki/audio.md +732 -0
  67. package/knowledge/wiki/camera.md +711 -0
  68. package/knowledge/wiki/commands.md +357 -0
  69. package/knowledge/wiki/game.md +220 -0
  70. package/knowledge/wiki/i18n.md +213 -0
  71. package/knowledge/wiki/index.md +1027 -0
  72. package/knowledge/wiki/input.md +1714 -0
  73. package/knowledge/wiki/load.md +1280 -0
  74. package/knowledge/wiki/math.md +166 -0
  75. package/knowledge/wiki/nav.md +1154 -0
  76. package/knowledge/wiki/physics.md +3142 -0
  77. package/knowledge/wiki/platform.md +857 -0
  78. package/knowledge/wiki/probe.md +1692 -0
  79. package/knowledge/wiki/reflect.md +285 -0
  80. package/knowledge/wiki/render.md +3511 -0
  81. package/knowledge/wiki/rng.md +393 -0
  82. package/knowledge/wiki/stream.md +376 -0
  83. package/knowledge/wiki/system.md +197 -0
  84. package/knowledge/wiki/systems.md +43 -0
  85. package/knowledge/wiki/terrain.md +727 -0
  86. package/knowledge/wiki/tilemap.md +422 -0
  87. package/knowledge/wiki/time.md +150 -0
  88. package/knowledge/wiki/transform.md +230 -0
  89. package/knowledge/wiki/tween.md +580 -0
  90. package/knowledge/wiki/ui.md +8000 -0
  91. package/knowledge/wiki/world.md +909 -0
  92. package/package.json +68 -4
  93. package/schema/api.schema.json +29675 -0
  94. package/shell/README.md +22 -0
  95. package/shell/brand/README.md +23 -0
  96. package/shell/brand/icon-192.png +0 -0
  97. package/shell/brand/icon-512.png +0 -0
  98. package/shell/brand/mark-on-paper.svg +6 -0
  99. package/shell/brand/origin-mark.svg +5 -0
  100. package/shell/brand/origin-motion.css +251 -0
  101. package/shell/brand/tokens.css +20 -0
  102. package/shell/brand.ts +132 -0
  103. package/shell/page.ts +715 -0
  104. package/shell/platform.ts +203 -0
  105. package/shell/player.ts +238 -0
  106. package/shell/shell.css +185 -0
  107. package/shell/sw.ts +177 -0
  108. package/shell/transport.ts +515 -0
  109. package/shell/wire.ts +369 -0
  110. package/src/e6.ts +69 -0
  111. package/src/env.d.ts +100 -0
  112. package/src/generated/abi.ts +980 -0
  113. package/src/index.ts +193 -0
  114. package/src/node/audio.ts +86 -0
  115. package/src/node/build.ts +109 -0
  116. package/src/node/device.ts +981 -0
  117. package/src/node/doctor.ts +60 -0
  118. package/src/node/index.ts +102 -0
  119. package/src/node/platform.ts +24 -0
  120. package/src/node/playtest-run.ts +249 -0
  121. package/src/node/png.ts +130 -0
  122. package/src/node/polish.ts +976 -0
  123. package/src/node/run.ts +373 -0
  124. package/src/node/web-build.ts +808 -0
  125. package/src/p2.ts +35 -0
  126. package/src/platform-local.ts +211 -0
  127. package/src/playtest.ts +131 -0
  128. package/src/runtime.ts +1509 -0
  129. package/src/systems/cameras.ts +247 -0
  130. package/src/ui-kit/bind.ts +141 -0
  131. package/src/ui-kit/huds.ts +303 -0
  132. package/src/ui-kit/index.ts +36 -0
  133. package/src/ui-kit/menus.ts +187 -0
  134. package/src/ui-kit/settings.ts +131 -0
  135. package/src/ui-kit/store.ts +222 -0
  136. package/src/ui-kit/story.ts +89 -0
  137. package/src/ui-kit/util.ts +106 -0
  138. package/src/web/a11y.ts +429 -0
  139. package/src/web/audio-worklet.ts +193 -0
  140. package/src/web/audio.ts +307 -0
  141. package/src/web/basis.ts +239 -0
  142. package/src/web/gamepad.ts +123 -0
  143. package/src/web/host.ts +166 -0
  144. package/src/web/input.ts +237 -0
  145. package/src/web/lanes.ts +21 -0
  146. package/src/web/play.ts +20 -0
  147. package/src/web/rpc-ring.ts +110 -0
  148. package/src/web/settle.ts +122 -0
  149. package/src/web/shell.ts +643 -0
  150. package/src/web/text-input.ts +248 -0
  151. package/src/web/worker.ts +1002 -0
  152. package/types/bindings.json +13654 -0
  153. package/types/index.d.ts +20090 -0
  154. package/vendor/basis/LICENSE +201 -0
  155. package/vendor/basis/NOTICE +15 -0
  156. package/vendor/basis/README.md +18 -0
  157. package/vendor/basis/basis_transcoder.js +19 -0
  158. package/vendor/basis/basis_transcoder.wasm +0 -0
  159. package/README.md +0 -3
@@ -0,0 +1,1871 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "about": "Origin Engine's style catalogue: 37 art styles in the engine's own words, each with what a critic checks on a rendered frame, the premises it fits, the look preset it maps to (an .ogt of type look; `extends \"<slug>\"` in a game's own look builds on it), the UI skin pack, palette and asset specs, and an art-bible direction the agent expands per project. `look.support` says how faithfully the engine renders the style today: full (every primitive draws), partial or planned (the primitives in `missing` are still to land), content (the look lives in authored art; the engine frames it). og-taste §12 explains how to use it. The descriptions are original; no game or studio is the reference for a style.",
4
+ "categories": {
5
+ "pixel": "Pixel and retro",
6
+ "paint": "Paint and line",
7
+ "shape": "Shape and material",
8
+ "render": "3D rendering"
9
+ },
10
+ "skins": [
11
+ "pixel",
12
+ "cartoon",
13
+ "fantasy",
14
+ "scifi",
15
+ "paper",
16
+ "neon"
17
+ ],
18
+ "artBibleTemplate": "Art bible for {title}. Premise: {premise}. Camera: {camera}; platform and display size: {platform}. Style: {name} ({descriptor}) Direction: {direction} Palette: {palette}. Asset specs: {assets}. UI: the {skin} skin pack, re-coloured to this palette (og-taste §1). Avoid: {avoid}. Proof: the game's look is assets/looks/{game}.ogt, extending \"{slug}\"; capture the title, play and results screens with og run and check each against: {checks}. Every later asset is made inside this bible; a request for one asset never redesigns the style.",
19
+ "styles": [
20
+ {
21
+ "slug": "expressionist-painting",
22
+ "name": "Expressionist paint",
23
+ "category": "paint",
24
+ "descriptor": "Visible brush marks, clashing colour masses and distorted faces turn every frame into an emotional painting.",
25
+ "checks": [
26
+ "Large areas show brush-stroke texture rather than flat fills or gradients.",
27
+ "Colours are non-naturalistic: shadows carry saturated hues (greens, violets) instead of grey.",
28
+ "Edges between colour masses are broken and uneven, never clean vector curves."
29
+ ],
30
+ "premise": {
31
+ "genre": "narrative RPG, detective, dialogue-heavy adventure",
32
+ "mood": "melancholy, feverish, introspective",
33
+ "era": "modern literary",
34
+ "audience": "adult story-led players"
35
+ },
36
+ "look": {
37
+ "preset": "templates/looks/expressionist-painting.ogt",
38
+ "presetReady": true,
39
+ "support": "content",
40
+ "primitives": [
41
+ "Stylise.paintRadius",
42
+ "Stylise.paintCanvas",
43
+ "PostEffects.lut"
44
+ ],
45
+ "missing": [
46
+ "the painting is content: painted portraits and backdrops",
47
+ "Stylise.paint* for 3D parts to match the painted art"
48
+ ]
49
+ },
50
+ "skin": "paper",
51
+ "palette": {
52
+ "size": "free, but 3 to 5 dominant masses per scene",
53
+ "rules": "Complementary clashes in shadows; one dominant temperature per scene; avoid neutral greys."
54
+ },
55
+ "assets": {
56
+ "logicalResolution": "native output",
57
+ "spriteScale": "portraits 512 to 1024 px",
58
+ "faceBudget": "low-poly blockouts under the paint",
59
+ "outlinePx": "0 (edges are paint)",
60
+ "textureDensity": "painted at 1.5x the displayed size"
61
+ },
62
+ "artBible": {
63
+ "direction": "Paint first: masses before detail, colour for emotion rather than light, faces allowed to distort, every surface carrying the hand.",
64
+ "avoid": [
65
+ "photographic textures",
66
+ "clean digital gradients",
67
+ "uniform brush size everywhere"
68
+ ]
69
+ }
70
+ },
71
+ {
72
+ "slug": "bold-comic-illustration",
73
+ "name": "Bold comic illustration",
74
+ "category": "paint",
75
+ "descriptor": "Strong contours, sharply grouped values and saturated accents against deep shadow, for instant readability in motion.",
76
+ "checks": [
77
+ "Every character has a continuous dark contour at least 2 px wide at 1080p.",
78
+ "Shadows are hard-edged shapes, two or three values per material.",
79
+ "Saturated accents cover under 15 % of the frame and sit on the characters or pickups."
80
+ ],
81
+ "premise": {
82
+ "genre": "action roguelike, brawler, hero shooter",
83
+ "mood": "intense, mythic, confident",
84
+ "era": "contemporary comics",
85
+ "audience": "core action players"
86
+ },
87
+ "look": {
88
+ "preset": "templates/looks/bold-comic-illustration.ogt",
89
+ "presetReady": true,
90
+ "support": "full",
91
+ "primitives": [
92
+ "StandardMaterialDesc.toon",
93
+ "PostEffects.outline",
94
+ "Stylise.ink",
95
+ "MaterialStyle.shadowTint"
96
+ ],
97
+ "missing": []
98
+ },
99
+ "skin": "fantasy",
100
+ "palette": {
101
+ "size": "20 to 40 colours",
102
+ "rules": "Deep warm or cool shadow colour shared by all materials; accents in one hue family per faction."
103
+ },
104
+ "assets": {
105
+ "logicalResolution": "native output",
106
+ "spriteScale": "characters 120 to 200 px tall on screen",
107
+ "faceBudget": "5k to 20k triangles per character",
108
+ "outlinePx": "2 to 4",
109
+ "textureDensity": "hand-painted textures, 1 texel per screen pixel"
110
+ },
111
+ "artBible": {
112
+ "direction": "Graphic shapes, hard shadows, thick confident lines, colour reserved for what matters, poses pushed for silhouette.",
113
+ "avoid": [
114
+ "soft gradients across forms",
115
+ "thin uniform lines",
116
+ "saturated backgrounds competing with characters"
117
+ ]
118
+ }
119
+ },
120
+ {
121
+ "slug": "watercolor-wash",
122
+ "name": "Watercolour wash",
123
+ "category": "paint",
124
+ "descriptor": "Transparent layers, pooled pigment at the edges and open paper space give scenes a soft, breathing quality.",
125
+ "checks": [
126
+ "Colour regions show darker rims where they meet other colours (pigment pooling).",
127
+ "A paper grain is visible in flat areas at 100 %.",
128
+ "At least a quarter of the frame is light, unpainted or nearly unpainted space."
129
+ ],
130
+ "premise": {
131
+ "genre": "exploration platformer, narrative puzzle, relaxing adventure",
132
+ "mood": "gentle, sad, hopeful",
133
+ "era": "timeless",
134
+ "audience": "casual and story-led players"
135
+ },
136
+ "look": {
137
+ "preset": "templates/looks/watercolor-wash.ogt",
138
+ "presetReady": true,
139
+ "support": "full",
140
+ "primitives": [
141
+ "Stylise.paintEdgeDarkening",
142
+ "Stylise.paintBleed",
143
+ "Stylise.paintCanvas",
144
+ "Stylise.paintCanvasStrength"
145
+ ],
146
+ "missing": []
147
+ },
148
+ "skin": "paper",
149
+ "palette": {
150
+ "size": "12 to 24 colours",
151
+ "rules": "Light values dominate; two or three pigments mixed into the rest; no pure black."
152
+ },
153
+ "assets": {
154
+ "logicalResolution": "native output",
155
+ "spriteScale": "characters 80 to 160 px",
156
+ "faceBudget": "low (soft shapes)",
157
+ "outlinePx": "0 (pigment rims instead)",
158
+ "textureDensity": "textures 0.5 to 1 texel per screen pixel, wash-painted"
159
+ },
160
+ "artBible": {
161
+ "direction": "Layered translucent washes, edges that pool and bloom, white paper as light, depth by overlapping washes and haze.",
162
+ "avoid": [
163
+ "opaque paint",
164
+ "hard black outlines",
165
+ "everything equally soft (the player must stay crisp)"
166
+ ]
167
+ }
168
+ },
169
+ {
170
+ "slug": "pixel-3d-hybrid",
171
+ "name": "Pixel sprites in 3D sets",
172
+ "category": "pixel",
173
+ "descriptor": "Pixel-art characters and props stand in lit 3D sets with depth of field, shadows and reflections, while their own edges stay crisp.",
174
+ "checks": [
175
+ "Sprite edges stay on their own pixel grid while the 3D set is smoothly shaded behind them.",
176
+ "Foreground and background blur by depth (depth of field visible at the frame's top and bottom).",
177
+ "Sprites cast or receive shadows that agree with the set's sun."
178
+ ],
179
+ "premise": {
180
+ "genre": "JRPG, tactics, adventure",
181
+ "mood": "nostalgic, grand, warm",
182
+ "era": "modern remasters of 16-bit RPGs",
183
+ "audience": "RPG players"
184
+ },
185
+ "look": {
186
+ "preset": "templates/looks/pixel-3d-hybrid.ogt",
187
+ "presetReady": true,
188
+ "support": "full",
189
+ "primitives": [
190
+ "PostEffects.depthOfField",
191
+ "PostEffects.ao",
192
+ "RenderSettings.bloom",
193
+ "Stylise.pixelSnap",
194
+ "billboard sprites",
195
+ "SpriteDesc.dropShadow"
196
+ ],
197
+ "missing": []
198
+ },
199
+ "skin": "fantasy",
200
+ "palette": {
201
+ "size": "sprites 32 to 64 colours; the set is unconstrained but graded to match",
202
+ "rules": "Grade the 3D set with a LUT towards the sprites' palette so the two read as one world."
203
+ },
204
+ "assets": {
205
+ "logicalResolution": "native output, sprites authored at 1/4 to 1/6 scale",
206
+ "spriteScale": "48 to 64 px characters",
207
+ "faceBudget": "2k to 20k triangles per set piece",
208
+ "outlinePx": "0",
209
+ "textureDensity": "textures 1 to 2 texels per screen pixel; sprites nearest-filtered"
210
+ },
211
+ "artBible": {
212
+ "direction": "Crisp pixel figures in miniature lit sets: tilt-shift depth of field, warm light shafts, soft bloom, everything framed by a slightly high camera.",
213
+ "avoid": [
214
+ "filtered (blurry) sprite textures",
215
+ "sprites at mixed pixel sizes",
216
+ "photoreal sets that out-detail the characters"
217
+ ]
218
+ }
219
+ },
220
+ {
221
+ "slug": "faceted-low-poly",
222
+ "name": "Faceted low poly",
223
+ "category": "render",
224
+ "descriptor": "Visible polygon facets and simplified meshes, broad colour fields in place of textures, depth from silhouettes and layers.",
225
+ "checks": [
226
+ "Facets are visible: each triangle shades flat with a hard edge to its neighbour.",
227
+ "Surfaces carry flat colour, not detailed textures.",
228
+ "Distant layers separate by value or fog, not by detail."
229
+ ],
230
+ "premise": {
231
+ "genre": "exploration, flight, puzzle, survival",
232
+ "mood": "serene, airy, contemplative",
233
+ "era": "modern indie",
234
+ "audience": "all ages"
235
+ },
236
+ "look": {
237
+ "preset": "templates/looks/faceted-low-poly.ogt",
238
+ "presetReady": true,
239
+ "support": "full",
240
+ "primitives": [
241
+ "StandardMaterialDesc.flatShading",
242
+ "Fog",
243
+ "Sky"
244
+ ],
245
+ "missing": []
246
+ },
247
+ "skin": "paper",
248
+ "palette": {
249
+ "size": "16 to 32 colours",
250
+ "rules": "Colour per material, gradients only from lighting and fog."
251
+ },
252
+ "assets": {
253
+ "logicalResolution": "native output",
254
+ "spriteScale": "characters 300 to 1500 triangles",
255
+ "faceBudget": "props 50 to 500 triangles",
256
+ "outlinePx": "0",
257
+ "textureDensity": "no textures or 1 palette texture"
258
+ },
259
+ "artBible": {
260
+ "direction": "Planar facets, flat material colours, soft fog for distance, silhouettes designed from few polygons.",
261
+ "avoid": [
262
+ "smooth normals",
263
+ "detailed textures",
264
+ "high polygon counts that hide the facets"
265
+ ]
266
+ }
267
+ },
268
+ {
269
+ "slug": "sculpted-clay",
270
+ "name": "Sculpted clay",
271
+ "category": "render",
272
+ "descriptor": "Tactile, slightly lumpy surfaces with blunt edges and fingerprint irregularity, often moving with the stutter of stop motion.",
273
+ "checks": [
274
+ "Surfaces show soft bumps and irregularities (normal or displacement detail) at close range.",
275
+ "Edges are rounded and blunt; no sharp machined corners.",
276
+ "Animation holds poses for 2 or more ticks (stepped, not interpolated)."
277
+ ],
278
+ "premise": {
279
+ "genre": "adventure, platformer, comedy",
280
+ "mood": "warm, odd, handmade",
281
+ "era": "stop-motion film",
282
+ "audience": "all ages, art-house"
283
+ },
284
+ "look": {
285
+ "preset": "templates/looks/sculpted-clay.ogt",
286
+ "presetReady": true,
287
+ "support": "full",
288
+ "primitives": [
289
+ "StandardMaterialDesc.roughness",
290
+ "StandardMaterialDesc.sheen",
291
+ "StandardMaterialDesc.normalMap",
292
+ "PostEffects.ao",
293
+ "PostEffects.depthOfField",
294
+ "AnimationPlayer.stepFps"
295
+ ],
296
+ "missing": []
297
+ },
298
+ "skin": "cartoon",
299
+ "palette": {
300
+ "size": "warm, slightly desaturated plasticine colours",
301
+ "rules": "Matte surfaces; saturation from the clay, not the light."
302
+ },
303
+ "assets": {
304
+ "logicalResolution": "native output",
305
+ "spriteScale": "characters 3k to 15k triangles",
306
+ "faceBudget": "props 500 to 5k",
307
+ "outlinePx": "0",
308
+ "textureDensity": "normal maps with thumb-print detail, 1 texel per screen pixel"
309
+ },
310
+ "artBible": {
311
+ "direction": "Matte modelling clay, blunt forms, visible handling marks, miniature depth of field, poses held like stop motion.",
312
+ "avoid": [
313
+ "glossy plastic",
314
+ "perfect smooth surfaces",
315
+ "fluid interpolated animation"
316
+ ]
317
+ }
318
+ },
319
+ {
320
+ "slug": "8bit-pixel",
321
+ "name": "Early console pixels",
322
+ "category": "pixel",
323
+ "descriptor": "Tiny sprites, a handful of hard colour steps per ramp and tiles that repeat on a strict grid, read at a glance like the first home consoles.",
324
+ "checks": [
325
+ "Zoomed to 400 %, every edge in the play area sits on one logical pixel grid: no half pixels, no smoothing.",
326
+ "A capture holds at most 16 distinct colours outside the UI, and each sprite uses at most 4.",
327
+ "Characters are 16 to 24 logical pixels tall and readable as silhouettes when filled black."
328
+ ],
329
+ "premise": {
330
+ "genre": "platformers, arcade action, short roguelikes",
331
+ "mood": "brisk, cheerful or tense",
332
+ "era": "1980s home consoles, jam games",
333
+ "audience": "nostalgic core players, game-jam audiences"
334
+ },
335
+ "look": {
336
+ "preset": "templates/looks/8bit-pixel.ogt",
337
+ "presetReady": true,
338
+ "support": "full",
339
+ "primitives": [
340
+ "Stylise.pixelHeight",
341
+ "Stylise.palette",
342
+ "Stylise.pixelSnap",
343
+ "Antialias off"
344
+ ],
345
+ "missing": []
346
+ },
347
+ "skin": "pixel",
348
+ "palette": {
349
+ "size": "8 to 16 colours",
350
+ "rules": "Ramps of 3 or 4 steps per material; one shared black; no gradients; background colours darker or desaturated against sprites."
351
+ },
352
+ "assets": {
353
+ "logicalResolution": "256 x 144 or 256 x 240",
354
+ "spriteScale": "16 x 16 to 16 x 24 characters, 8 x 8 or 16 x 16 tiles",
355
+ "faceBudget": "none (2D)",
356
+ "outlinePx": "0 or 1 dark pixel",
357
+ "textureDensity": "1 texel per logical pixel"
358
+ },
359
+ "artBible": {
360
+ "direction": "Flat colour blocks with hard edges, readable shapes before surface detail, sprites drawn on an exact grid, tiles that repeat honestly, animation in few frames with strong key poses.",
361
+ "avoid": [
362
+ "smoothed or rotated sprites",
363
+ "sub-pixel movement",
364
+ "gradient skies",
365
+ "colour counts that drift between assets"
366
+ ]
367
+ }
368
+ },
369
+ {
370
+ "slug": "voxel-worlds",
371
+ "name": "Voxel worlds",
372
+ "category": "render",
373
+ "descriptor": "Cubes build characters, architecture and terrain, visible in stepped silhouettes and broken edges, under any lighting.",
374
+ "checks": [
375
+ "Silhouettes are stepped: every edge is made of axis-aligned cubes.",
376
+ "The cube size is consistent across characters and environment (or in clear multiples).",
377
+ "Faces shade flat; light changes per face, not per pixel gradient on a face."
378
+ ],
379
+ "premise": {
380
+ "genre": "sandbox, building, destruction, survival",
381
+ "mood": "playful, creative, chunky",
382
+ "era": "modern indie",
383
+ "audience": "all ages"
384
+ },
385
+ "look": {
386
+ "preset": "templates/looks/voxel-worlds.ogt",
387
+ "presetReady": true,
388
+ "support": "full",
389
+ "primitives": [
390
+ "StandardMaterialDesc.flatShading",
391
+ "PostEffects.ao",
392
+ "box instancing"
393
+ ],
394
+ "missing": []
395
+ },
396
+ "skin": "pixel",
397
+ "palette": {
398
+ "size": "32 to 64 colours (a voxel palette)",
399
+ "rules": "One palette for the whole world; shade by light, not by palette steps."
400
+ },
401
+ "assets": {
402
+ "logicalResolution": "native output",
403
+ "spriteScale": "characters 16 to 32 voxels tall",
404
+ "faceBudget": "greedy-meshed, under 5k triangles per model",
405
+ "outlinePx": "0",
406
+ "textureDensity": "palette colour per voxel"
407
+ },
408
+ "artBible": {
409
+ "direction": "Everything from cubes of one size, palette-coloured faces, strong ambient occlusion in corners, destruction that reveals the grid.",
410
+ "avoid": [
411
+ "mixed voxel sizes",
412
+ "smooth shading",
413
+ "textures inside voxels"
414
+ ]
415
+ }
416
+ },
417
+ {
418
+ "slug": "illuminated-manuscript",
419
+ "name": "Manuscript page",
420
+ "category": "paint",
421
+ "descriptor": "Scenes composed like a decorated page: flat figures, ink lines, ornamental borders and lettering woven into the image.",
422
+ "checks": [
423
+ "The frame has an ornamental border or margin occupying at least 5 % of its area.",
424
+ "Figures are flat (no cast shadows or form shading beyond line).",
425
+ "Text in the UI uses a calligraphic or book face and sits inside the composition, not in floating boxes."
426
+ ],
427
+ "premise": {
428
+ "genre": "narrative mystery, historical adventure, card games",
429
+ "mood": "scholarly, wry, devout",
430
+ "era": "medieval and early modern",
431
+ "audience": "story-led adults"
432
+ },
433
+ "look": {
434
+ "preset": "templates/looks/illuminated-manuscript.ogt",
435
+ "presetReady": true,
436
+ "support": "content",
437
+ "primitives": [
438
+ "Stylise.paintCanvas",
439
+ "Stylise.ink",
440
+ "RenderSettings.toneMapping none"
441
+ ],
442
+ "missing": [
443
+ "the page is content: figures, borders and lettering",
444
+ "Stylise.paintCanvas for the vellum grain"
445
+ ]
446
+ },
447
+ "skin": "paper",
448
+ "palette": {
449
+ "size": "10 to 16 colours",
450
+ "rules": "Parchment ground, iron-gall ink, a few mineral pigments (ultramarine, vermilion, verdigris) and gold."
451
+ },
452
+ "assets": {
453
+ "logicalResolution": "native output",
454
+ "spriteScale": "figures 100 to 200 px",
455
+ "faceBudget": "none (2D)",
456
+ "outlinePx": "1 to 2 ink lines",
457
+ "textureDensity": "illustrations at 2x display size"
458
+ },
459
+ "artBible": {
460
+ "direction": "Flat drawn figures in ink and mineral colour, borders and initials as structure, text as part of the picture.",
461
+ "avoid": [
462
+ "perspective-correct 3D",
463
+ "glossy materials",
464
+ "modern sans UI"
465
+ ]
466
+ }
467
+ },
468
+ {
469
+ "slug": "rubber-hose-animation",
470
+ "name": "Rubber-hose cartoon",
471
+ "category": "paint",
472
+ "descriptor": "Round-headed characters with bendy tube limbs, pie-cut eyes and constant squash and stretch, inked like early theatrical cartoons.",
473
+ "checks": [
474
+ "Limbs bend in smooth curves without elbows or knees.",
475
+ "Animation shows squash and stretch on every anticipation and landing.",
476
+ "Film grain or gate weave is visible on the full frame."
477
+ ],
478
+ "premise": {
479
+ "genre": "boss-rush shooters, platformers, party games",
480
+ "mood": "manic, playful, grotesque",
481
+ "era": "1930s cartoons",
482
+ "audience": "core and nostalgic players"
483
+ },
484
+ "look": {
485
+ "preset": "templates/looks/rubber-hose-animation.ogt",
486
+ "presetReady": true,
487
+ "support": "content",
488
+ "primitives": [
489
+ "PostEffects.filmGrain",
490
+ "PostEffects.vignette",
491
+ "PostEffects.lut",
492
+ "flipbooks"
493
+ ],
494
+ "missing": [
495
+ "the look is in frame-by-frame animation (flipbooks); the engine supplies the film treatment"
496
+ ]
497
+ },
498
+ "skin": "cartoon",
499
+ "palette": {
500
+ "size": "sepia or muted primaries, 12 to 24 colours",
501
+ "rules": "Inked black lines, flat fills, a warm faded grade over everything."
502
+ },
503
+ "assets": {
504
+ "logicalResolution": "native output",
505
+ "spriteScale": "characters 150 to 300 px",
506
+ "faceBudget": "none (2D)",
507
+ "outlinePx": "3 to 5, tapered",
508
+ "textureDensity": "frames drawn at 24 fps, played on twos"
509
+ },
510
+ "artBible": {
511
+ "direction": "Bouncy hand animation, tapered ink, flat fills, a faded film print over the whole frame, every idle pose alive.",
512
+ "avoid": [
513
+ "skeletal tweening that looks rigid",
514
+ "clean digital colour",
515
+ "thin uniform lines"
516
+ ]
517
+ }
518
+ },
519
+ {
520
+ "slug": "pencil-hatching",
521
+ "name": "Pencil and hatching",
522
+ "category": "paint",
523
+ "descriptor": "Shadow built from line density and direction over paper, in greys or sepia, whether drawn flat or wrapped around 3D forms.",
524
+ "checks": [
525
+ "Shadows are made of parallel lines whose density increases with darkness; no smooth gradients.",
526
+ "Paper grain is visible in light areas.",
527
+ "The capture is greyscale or within one hue (sepia) except for at most one accent."
528
+ ],
529
+ "premise": {
530
+ "genre": "horror, mystery, folk tales, exploration",
531
+ "mood": "uneasy, intimate, old",
532
+ "era": "hand-drawn",
533
+ "audience": "adult story-led players"
534
+ },
535
+ "look": {
536
+ "preset": "templates/looks/pencil-hatching.ogt",
537
+ "presetReady": true,
538
+ "support": "full",
539
+ "primitives": [
540
+ "Stylise.hatching",
541
+ "Stylise.hatchingLevels",
542
+ "Stylise.paintCanvas",
543
+ "Stylise.ink"
544
+ ],
545
+ "missing": []
546
+ },
547
+ "skin": "paper",
548
+ "palette": {
549
+ "size": "graphite or sepia ramp plus paper, optional single accent",
550
+ "rules": "Value from line density only; the accent marks danger or the goal."
551
+ },
552
+ "assets": {
553
+ "logicalResolution": "native output",
554
+ "spriteScale": "characters 120 to 200 px",
555
+ "faceBudget": "2k to 10k triangles (lines carry detail)",
556
+ "outlinePx": "1 to 2 pencil",
557
+ "textureDensity": "paper texture 1 texel per screen pixel"
558
+ },
559
+ "artBible": {
560
+ "direction": "Graphite on paper: hatch direction follows form, darkness from density, edges wobble slightly, paper shows through.",
561
+ "avoid": [
562
+ "gradients",
563
+ "digital clean lines",
564
+ "colour fills"
565
+ ]
566
+ }
567
+ },
568
+ {
569
+ "slug": "gothic-contour",
570
+ "name": "Gothic ornament",
571
+ "category": "paint",
572
+ "descriptor": "Clean-contoured simple characters inside intricate, curling architecture and misty depth, dark but delicate.",
573
+ "checks": [
574
+ "Characters are simple shapes with minimal facial detail and clean outlines.",
575
+ "Backgrounds contain dense curling ornament or pointed arches in at least two depth layers.",
576
+ "Depth layers fade into haze or glow towards the back."
577
+ ],
578
+ "premise": {
579
+ "genre": "interconnected exploration platformer, challenging 2D action",
580
+ "mood": "melancholy, ominous, beautiful",
581
+ "era": "dark fantasy",
582
+ "audience": "core players"
583
+ },
584
+ "look": {
585
+ "preset": "templates/looks/gothic-contour.ogt",
586
+ "presetReady": true,
587
+ "support": "content",
588
+ "primitives": [
589
+ "Fog",
590
+ "PostEffects.glow",
591
+ "RenderSettings.bloom",
592
+ "Stylise.depthBands",
593
+ "sprite layers"
594
+ ],
595
+ "missing": [
596
+ "ornament is content; Stylise.depthBands for layered haze"
597
+ ]
598
+ },
599
+ "skin": "fantasy",
600
+ "palette": {
601
+ "size": "cool desaturated base with 1 or 2 glowing accents",
602
+ "rules": "Dark blue-grey grounds, pale characters, glows in one hue."
603
+ },
604
+ "assets": {
605
+ "logicalResolution": "native output",
606
+ "spriteScale": "characters 60 to 120 px",
607
+ "faceBudget": "none (2D)",
608
+ "outlinePx": "1 to 2 clean",
609
+ "textureDensity": "illustrated layers at 1x"
610
+ },
611
+ "artBible": {
612
+ "direction": "Simple bright characters against intricate dark architecture, layered haze, soft halos on light sources.",
613
+ "avoid": [
614
+ "detailed characters competing with backgrounds",
615
+ "flat single-layer scenes",
616
+ "saturated palettes"
617
+ ]
618
+ }
619
+ },
620
+ {
621
+ "slug": "lush-painted-worlds",
622
+ "name": "Lush opaque painting",
623
+ "category": "paint",
624
+ "descriptor": "Opaque, weighty colour masses with selective brushwork and rich warm-cool contrast build dense painted environments.",
625
+ "checks": [
626
+ "Large areas are opaque painted masses with visible but selective brushwork.",
627
+ "Lit surfaces are warm and shadows cool (or the reverse) across the whole frame.",
628
+ "The environment is dense but layered: foreground, play plane and background separate by value."
629
+ ],
630
+ "premise": {
631
+ "genre": "action RPG, isometric adventure, story platformer",
632
+ "mood": "rich, nostalgic, elegiac",
633
+ "era": "painted illustration",
634
+ "audience": "core and story players"
635
+ },
636
+ "look": {
637
+ "preset": "templates/looks/lush-painted-worlds.ogt",
638
+ "presetReady": true,
639
+ "support": "content",
640
+ "primitives": [
641
+ "Stylise.paintRadius",
642
+ "Stylise.paintCanvas",
643
+ "PostEffects.lut",
644
+ "RenderSettings.bloom"
645
+ ],
646
+ "missing": [
647
+ "painted backdrops are content; Stylise.paint* for 3D props"
648
+ ]
649
+ },
650
+ "skin": "fantasy",
651
+ "palette": {
652
+ "size": "free, organised by warm light and cool shadow",
653
+ "rules": "Saturation highest at the light's edge; value grouping in three planes."
654
+ },
655
+ "assets": {
656
+ "logicalResolution": "native output",
657
+ "spriteScale": "characters 100 to 180 px",
658
+ "faceBudget": "props 1k to 8k triangles, hand-painted",
659
+ "outlinePx": "0 to 1",
660
+ "textureDensity": "hand-painted at 1 texel per screen pixel"
661
+ },
662
+ "artBible": {
663
+ "direction": "Opaque painting with weight, warm light and cool shadow, brushwork saved for focal areas, rich layered detail.",
664
+ "avoid": [
665
+ "transparent washes",
666
+ "photo textures",
667
+ "noise-like detail everywhere"
668
+ ]
669
+ }
670
+ },
671
+ {
672
+ "slug": "decorative-storybook",
673
+ "name": "Storybook ornament",
674
+ "category": "paint",
675
+ "descriptor": "Gentle contours, patterned plants and soft colour shapes make explorable picture-book worlds.",
676
+ "checks": [
677
+ "Contours are thin and gentle, slightly darker than the fill rather than black.",
678
+ "Vegetation and props carry repeating decorative patterns.",
679
+ "Depth comes from overlapping flat planes, not from perspective shading."
680
+ ],
681
+ "premise": {
682
+ "genre": "cosy adventure, crafting, puzzle, children's games",
683
+ "mood": "whimsical, cosy, curious",
684
+ "era": "folk illustration",
685
+ "audience": "children and casual players"
686
+ },
687
+ "look": {
688
+ "preset": "templates/looks/decorative-storybook.ogt",
689
+ "presetReady": true,
690
+ "support": "content",
691
+ "primitives": [
692
+ "Stylise.ink",
693
+ "Stylise.paintCanvas",
694
+ "sprite layers"
695
+ ],
696
+ "missing": [
697
+ "illustration is content; Stylise.ink and paintCanvas"
698
+ ]
699
+ },
700
+ "skin": "cartoon",
701
+ "palette": {
702
+ "size": "16 to 32 colours",
703
+ "rules": "Soft saturated hues, coloured line work, patterns from the same palette."
704
+ },
705
+ "assets": {
706
+ "logicalResolution": "native output",
707
+ "spriteScale": "characters 80 to 160 px",
708
+ "faceBudget": "none or flat-shaded low poly",
709
+ "outlinePx": "1 to 2 coloured",
710
+ "textureDensity": "illustrations at 1x"
711
+ },
712
+ "artBible": {
713
+ "direction": "Flat illustrated planes, ornamental plants and patterns, gentle coloured lines, overlapping layers for space.",
714
+ "avoid": [
715
+ "black outlines",
716
+ "realistic lighting",
717
+ "empty unpatterned fills"
718
+ ]
719
+ }
720
+ },
721
+ {
722
+ "slug": "classical-painting-collage",
723
+ "name": "Old-master collage",
724
+ "category": "paint",
725
+ "descriptor": "Figures and landscapes from classical painting recombined into moving scenes, oil surfaces meeting visible cut seams.",
726
+ "checks": [
727
+ "Surfaces show oil-painting texture (craquelure, glazing, brushwork).",
728
+ "Cut edges between elements are visible and deliberate.",
729
+ "Characters move as cut-out pieces (rotating parts), not as smooth deformation."
730
+ ],
731
+ "premise": {
732
+ "genre": "point-and-click adventure, absurdist comedy",
733
+ "mood": "irreverent, solemn, surreal",
734
+ "era": "renaissance to baroque painting",
735
+ "audience": "adults, art lovers"
736
+ },
737
+ "look": {
738
+ "preset": "templates/looks/classical-painting-collage.ogt",
739
+ "presetReady": true,
740
+ "support": "content",
741
+ "primitives": [
742
+ "sprites with transforms",
743
+ "PostEffects.vignette",
744
+ "PostEffects.filmGrain"
745
+ ],
746
+ "missing": [
747
+ "the source paintings and cut-outs are content (public-domain scans or original painting); no engine primitive is missing"
748
+ ]
749
+ },
750
+ "skin": "paper",
751
+ "palette": {
752
+ "size": "the source paintings' own",
753
+ "rules": "Grade all sources to a common varnish tone with a LUT."
754
+ },
755
+ "assets": {
756
+ "logicalResolution": "native output",
757
+ "spriteScale": "cut-outs at 1x their display size",
758
+ "faceBudget": "none (2D)",
759
+ "outlinePx": "0 (cut edges)",
760
+ "textureDensity": "scans at 1 texel per screen pixel"
761
+ },
762
+ "artBible": {
763
+ "direction": "Painted fragments reassembled with visible seams, puppet-like movement, a common varnish grade.",
764
+ "avoid": [
765
+ "sources with mismatched lighting left ungraded",
766
+ "smooth vector animation",
767
+ "copyrighted reproductions"
768
+ ]
769
+ }
770
+ },
771
+ {
772
+ "slug": "detailed-doodle",
773
+ "name": "Fine-line doodle worlds",
774
+ "category": "paint",
775
+ "descriptor": "Countless tiny people and objects drawn with simple, slightly irregular lines, like a giant hand-drawn map.",
776
+ "checks": [
777
+ "Lines are thin (1 to 2 px) and slightly irregular.",
778
+ "A capture shows at least 30 separate small figures or objects.",
779
+ "Shading is minimal: forms read by line, not by light."
780
+ ],
781
+ "premise": {
782
+ "genre": "hidden object, sandbox toys, puzzle",
783
+ "mood": "playful, busy, curious",
784
+ "era": "timeless doodles",
785
+ "audience": "all ages"
786
+ },
787
+ "look": {
788
+ "preset": "templates/looks/detailed-doodle.ogt",
789
+ "presetReady": true,
790
+ "support": "content",
791
+ "primitives": [
792
+ "Stylise.ink",
793
+ "unlit materials",
794
+ "sprites"
795
+ ],
796
+ "missing": [
797
+ "the drawing is content; Stylise.ink can outline 3D props to match"
798
+ ]
799
+ },
800
+ "skin": "paper",
801
+ "palette": {
802
+ "size": "monochrome ink or 4 to 8 light colours",
803
+ "rules": "White or off-white ground; colour never hides line."
804
+ },
805
+ "assets": {
806
+ "logicalResolution": "native output",
807
+ "spriteScale": "figures 20 to 60 px",
808
+ "faceBudget": "none (2D)",
809
+ "outlinePx": "1 to 2",
810
+ "textureDensity": "drawings at 2x display size"
811
+ },
812
+ "artBible": {
813
+ "direction": "Hand-drawn line everywhere, dense miniature scenes side by side, very little shading, humour in the details.",
814
+ "avoid": [
815
+ "thick outlines",
816
+ "realistic shading",
817
+ "empty areas"
818
+ ]
819
+ }
820
+ },
821
+ {
822
+ "slug": "black-figure-pottery",
823
+ "name": "Black-figure pottery",
824
+ "category": "paint",
825
+ "descriptor": "Flat dark silhouettes with fine incised detail on ochre grounds, framed by meanders and horizontal bands.",
826
+ "checks": [
827
+ "The capture is within an ochre-and-black palette plus at most one extra colour.",
828
+ "Figures are solid silhouettes with thin lighter detail lines inside.",
829
+ "The composition is organised in horizontal bands with patterned borders."
830
+ ],
831
+ "premise": {
832
+ "genre": "action platformer, myth adventure, fighting",
833
+ "mood": "heroic, mythic, stylised",
834
+ "era": "ancient Mediterranean",
835
+ "audience": "core players"
836
+ },
837
+ "look": {
838
+ "preset": "templates/looks/black-figure-pottery.ogt",
839
+ "presetReady": true,
840
+ "support": "content",
841
+ "primitives": [
842
+ "Stylise.palette",
843
+ "Stylise.posterize",
844
+ "unlit materials"
845
+ ],
846
+ "missing": [
847
+ "silhouettes are content; Stylise.palette locks the colours"
848
+ ]
849
+ },
850
+ "skin": "fantasy",
851
+ "palette": {
852
+ "size": "2 to 4 colours",
853
+ "rules": "Ochre ground, black figures, a lighter line colour, optional red-brown."
854
+ },
855
+ "assets": {
856
+ "logicalResolution": "native output",
857
+ "spriteScale": "figures 100 to 200 px",
858
+ "faceBudget": "none (2D) or unlit low poly",
859
+ "outlinePx": "incised 1 px lines",
860
+ "textureDensity": "flat fills"
861
+ },
862
+ "artBible": {
863
+ "direction": "Silhouette action, incised details, banded friezes and meanders, a fixed two-tone palette.",
864
+ "avoid": [
865
+ "shading on figures",
866
+ "extra colours",
867
+ "perspective depth"
868
+ ]
869
+ }
870
+ },
871
+ {
872
+ "slug": "heavy-ink-shadows",
873
+ "name": "Heavy ink and shadow",
874
+ "category": "paint",
875
+ "descriptor": "Solid black shadows, rough hatching and muted colour shape distorted figures, with highlights saved for danger.",
876
+ "checks": [
877
+ "At least 30 % of a capture is solid black or near-black.",
878
+ "Transitions from light to shadow use rough hatching, not gradients.",
879
+ "Bright highlights appear only on characters, threats or interactables."
880
+ ],
881
+ "premise": {
882
+ "genre": "roguelike, gothic RPG, horror",
883
+ "mood": "grim, oppressive, desperate",
884
+ "era": "comic noir, gothic",
885
+ "audience": "adult core players"
886
+ },
887
+ "look": {
888
+ "preset": "templates/looks/heavy-ink-shadows.ogt",
889
+ "presetReady": true,
890
+ "support": "full",
891
+ "primitives": [
892
+ "Stylise.posterize",
893
+ "Stylise.hatching",
894
+ "Stylise.ink",
895
+ "PostEffects.vignette"
896
+ ],
897
+ "missing": []
898
+ },
899
+ "skin": "fantasy",
900
+ "palette": {
901
+ "size": "muted 12 to 24 colours plus black",
902
+ "rules": "Desaturated mid-tones, black for every shadow, one blood or fire accent."
903
+ },
904
+ "assets": {
905
+ "logicalResolution": "native output",
906
+ "spriteScale": "characters 150 to 300 px",
907
+ "faceBudget": "2k to 10k triangles",
908
+ "outlinePx": "3 to 6, rough",
909
+ "textureDensity": "painted textures with ink overlays"
910
+ },
911
+ "artBible": {
912
+ "direction": "Black masses carry the mood, rough ink hatching shapes form, proportions distorted, light is rare and meaningful.",
913
+ "avoid": [
914
+ "grey soft shadows",
915
+ "clean thin lines",
916
+ "bright saturated scenes"
917
+ ]
918
+ }
919
+ },
920
+ {
921
+ "slug": "monochrome-pixel",
922
+ "name": "One-ink pixels",
923
+ "category": "pixel",
924
+ "descriptor": "Black and white (or one ink on one paper) pixels where silhouette and negative space do the work, with at most one accent for signals.",
925
+ "checks": [
926
+ "A capture contains 2 main colours covering at least 95 % of pixels; any third colour marks an interactable or danger.",
927
+ "Every sprite reads as a silhouette on the ground: no mid-tones inside shapes.",
928
+ "Text and HUD use the same two colours."
929
+ ],
930
+ "premise": {
931
+ "genre": "exploration platformer, puzzle, short narrative",
932
+ "mood": "stark, quiet, playful or eerie",
933
+ "era": "handheld LCD, 1-bit computers",
934
+ "audience": "jam and core players"
935
+ },
936
+ "look": {
937
+ "preset": "templates/looks/monochrome-pixel.ogt",
938
+ "presetReady": true,
939
+ "support": "full",
940
+ "primitives": [
941
+ "Stylise.pixelHeight",
942
+ "Stylise.palette",
943
+ "Stylise.posterize",
944
+ "Stylise.dither"
945
+ ],
946
+ "missing": []
947
+ },
948
+ "skin": "pixel",
949
+ "palette": {
950
+ "size": "2 colours plus at most 1 accent",
951
+ "rules": "Pick ink and paper first; shading only through dither or pattern; the accent means one thing."
952
+ },
953
+ "assets": {
954
+ "logicalResolution": "160 x 144 or 256 x 192",
955
+ "spriteScale": "12 to 24 px characters",
956
+ "faceBudget": "none (2D)",
957
+ "outlinePx": "the silhouette is the outline",
958
+ "textureDensity": "1 texel per logical pixel"
959
+ },
960
+ "artBible": {
961
+ "direction": "Two values, crisp silhouettes, patterns in place of shading, negative space as composition, one accent with one meaning.",
962
+ "avoid": [
963
+ "grey anti-aliasing",
964
+ "decorative accent colours",
965
+ "dense textures that break silhouettes"
966
+ ]
967
+ }
968
+ },
969
+ {
970
+ "slug": "16bit-pixel",
971
+ "name": "Late console pixels",
972
+ "category": "pixel",
973
+ "descriptor": "Fuller sprites with ramped shading, parallax layers behind the action and saturated colour, the richer pixel language of the following hardware generation.",
974
+ "checks": [
975
+ "Background layers scroll at visibly different rates and never at the playfield's speed.",
976
+ "Shading on sprites steps through 4 to 6 tones per material with no smooth gradients.",
977
+ "Edges stay on the logical pixel grid when the camera moves (compare two captures 1 s apart at 400 %)."
978
+ ],
979
+ "premise": {
980
+ "genre": "platformers, action adventure, racing, fighting",
981
+ "mood": "energetic, bright, heroic",
982
+ "era": "early 1990s consoles",
983
+ "audience": "nostalgic and general players"
984
+ },
985
+ "look": {
986
+ "preset": "templates/looks/16bit-pixel.ogt",
987
+ "presetReady": true,
988
+ "support": "full",
989
+ "primitives": [
990
+ "Stylise.pixelHeight",
991
+ "Stylise.pixelSnap",
992
+ "Antialias off",
993
+ "sprite layers for parallax"
994
+ ],
995
+ "missing": []
996
+ },
997
+ "skin": "pixel",
998
+ "palette": {
999
+ "size": "32 to 64 colours",
1000
+ "rules": "Ramps of 4 to 6 steps; hue-shifted shadows (cooler) and highlights (warmer); saturated accents on characters, calmer backgrounds."
1001
+ },
1002
+ "assets": {
1003
+ "logicalResolution": "320 x 180 or 384 x 216",
1004
+ "spriteScale": "32 to 48 px characters, 16 x 16 tiles",
1005
+ "faceBudget": "none (2D)",
1006
+ "outlinePx": "1 dark pixel, selectively broken by light",
1007
+ "textureDensity": "1 texel per logical pixel"
1008
+ },
1009
+ "artBible": {
1010
+ "direction": "Volume from stepped shading, layered parallax for depth, lively multi-frame animation, saturated colour kept to the characters and pickups so the playfield reads.",
1011
+ "avoid": [
1012
+ "anti-aliased or mixed-resolution sprites",
1013
+ "parallax layers that match the playfield speed",
1014
+ "blur"
1015
+ ]
1016
+ }
1017
+ },
1018
+ {
1019
+ "slug": "detailed-pixel",
1020
+ "name": "Dense illustrative pixels",
1021
+ "category": "pixel",
1022
+ "descriptor": "Pixel art pushed towards illustration: rich clusters, subtle hue shifts and detailed scenery, with the pixel grid still visible on close look.",
1023
+ "checks": [
1024
+ "At 400 %, single-pixel clusters form textures (bark, stone, cloth) rather than flat fills.",
1025
+ "Each material shows at least 6 tones with visible hue shifts between them.",
1026
+ "Characters still read against the scenery: a greyscale capture separates them by value."
1027
+ ],
1028
+ "premise": {
1029
+ "genre": "exploration, adventure, interconnected platformers, narrative platformers",
1030
+ "mood": "warm, wondrous, melancholy",
1031
+ "era": "modern pixel art",
1032
+ "audience": "core and story-driven players"
1033
+ },
1034
+ "look": {
1035
+ "preset": "templates/looks/detailed-pixel.ogt",
1036
+ "presetReady": true,
1037
+ "support": "full",
1038
+ "primitives": [
1039
+ "Stylise.pixelHeight",
1040
+ "Stylise.pixelSnap",
1041
+ "Lighting2D",
1042
+ "PostEffects.glow",
1043
+ "RenderSettings.bloom"
1044
+ ],
1045
+ "missing": []
1046
+ },
1047
+ "skin": "fantasy",
1048
+ "palette": {
1049
+ "size": "48 to 128 colours",
1050
+ "rules": "Long hue-shifted ramps; a value plan per scene that keeps the play area mid-value and the foreground darkest."
1051
+ },
1052
+ "assets": {
1053
+ "logicalResolution": "480 x 270 or 640 x 360",
1054
+ "spriteScale": "32 to 64 px characters",
1055
+ "faceBudget": "none (2D)",
1056
+ "outlinePx": "selective, coloured rather than black",
1057
+ "textureDensity": "1 texel per logical pixel"
1058
+ },
1059
+ "artBible": {
1060
+ "direction": "Hand-placed pixel clusters that describe material, light that pools and glows, scenery as rich as the characters but quieter in value.",
1061
+ "avoid": [
1062
+ "noise textures standing in for clusters",
1063
+ "pillow shading",
1064
+ "detail in the play path that hides hazards"
1065
+ ]
1066
+ }
1067
+ },
1068
+ {
1069
+ "slug": "luminous-pixel",
1070
+ "name": "Glowing pixels on dark ground",
1071
+ "category": "pixel",
1072
+ "descriptor": "Pixel scenes built on dark bases where saturated light sources, rim highlights and glow carry the composition.",
1073
+ "checks": [
1074
+ "Mean luminance of a play capture is below 0.25 while the brightest 2 % of pixels are above 0.8.",
1075
+ "Light sources show a halo (bloom or glow) wider than the source itself.",
1076
+ "The player character is lit from at least one local light, not only ambient."
1077
+ ],
1078
+ "premise": {
1079
+ "genre": "action adventure, twin-stick, cyber and sci-fi exploration",
1080
+ "mood": "mysterious, intense, lonely",
1081
+ "era": "neo-retro",
1082
+ "audience": "core players"
1083
+ },
1084
+ "look": {
1085
+ "preset": "templates/looks/luminous-pixel.ogt",
1086
+ "presetReady": true,
1087
+ "support": "full",
1088
+ "primitives": [
1089
+ "Stylise.pixelHeight",
1090
+ "Lighting2D",
1091
+ "Light2D",
1092
+ "PostEffects.glow",
1093
+ "RenderSettings.bloom"
1094
+ ],
1095
+ "missing": []
1096
+ },
1097
+ "skin": "neon",
1098
+ "palette": {
1099
+ "size": "24 to 48 colours",
1100
+ "rules": "A near-black ground with two or three saturated light hues; no mid-grey fills; accents reserved for interactables."
1101
+ },
1102
+ "assets": {
1103
+ "logicalResolution": "480 x 270",
1104
+ "spriteScale": "24 to 40 px characters",
1105
+ "faceBudget": "none (2D)",
1106
+ "outlinePx": "rim light instead of outline",
1107
+ "textureDensity": "1 texel per logical pixel"
1108
+ },
1109
+ "artBible": {
1110
+ "direction": "Dark masses and bright accents; light defines form, glow marks what matters, colour leads the eye through the level.",
1111
+ "avoid": [
1112
+ "flat ambient lighting",
1113
+ "glow on everything",
1114
+ "bright backgrounds that drown the accents"
1115
+ ]
1116
+ }
1117
+ },
1118
+ {
1119
+ "slug": "topdown-tile-pixel",
1120
+ "name": "Top-down tile worlds",
1121
+ "category": "pixel",
1122
+ "descriptor": "Overhead or three-quarter tile maps with upright sprites, where steps, cliffs and overlap make height and paths readable.",
1123
+ "checks": [
1124
+ "Walkable floor, walls and drops are distinguishable in a greyscale capture.",
1125
+ "Characters are drawn upright and are occluded by tall tiles in front of them (y-sorting works).",
1126
+ "Tile seams are invisible: no gaps or bleeding lines between tiles at any camera position."
1127
+ ],
1128
+ "premise": {
1129
+ "genre": "action RPG, tactics, farming and life sims, overhead adventure",
1130
+ "mood": "adventurous, cosy, curious",
1131
+ "era": "16-bit era RPGs",
1132
+ "audience": "general and RPG players"
1133
+ },
1134
+ "look": {
1135
+ "preset": "templates/looks/topdown-tile-pixel.ogt",
1136
+ "presetReady": true,
1137
+ "support": "full",
1138
+ "primitives": [
1139
+ "tilemap layers",
1140
+ "Sprite.sortY",
1141
+ "Stylise.pixelHeight",
1142
+ "Stylise.pixelSnap"
1143
+ ],
1144
+ "missing": []
1145
+ },
1146
+ "skin": "fantasy",
1147
+ "palette": {
1148
+ "size": "32 to 64 colours",
1149
+ "rules": "Floors desaturated and mid-value; walls darker on their faces; characters most saturated."
1150
+ },
1151
+ "assets": {
1152
+ "logicalResolution": "384 x 216 or 480 x 270",
1153
+ "spriteScale": "16 x 16 tiles, 16 x 24 to 24 x 32 characters",
1154
+ "faceBudget": "none (2D)",
1155
+ "outlinePx": "1 dark pixel on characters only",
1156
+ "textureDensity": "1 texel per logical pixel"
1157
+ },
1158
+ "artBible": {
1159
+ "direction": "A strict tile grid, height told by wall faces and drop shadows, upright characters sorted by their feet, paths readable before decoration.",
1160
+ "avoid": [
1161
+ "perspective mixed between tiles",
1162
+ "decoration on walkable paths that hides edges",
1163
+ "shadows that disagree in direction"
1164
+ ]
1165
+ }
1166
+ },
1167
+ {
1168
+ "slug": "low-resolution-3d",
1169
+ "name": "Low-resolution 3D",
1170
+ "category": "render",
1171
+ "descriptor": "Simplified models, small textures and pixelated output recall early 3D consoles, often with modern lighting on top.",
1172
+ "checks": [
1173
+ "The frame is rendered at 240 to 360 logical lines and scaled up with nearest filtering.",
1174
+ "Textures show large visible texels (64 to 256 px textures on whole characters).",
1175
+ "Vertices wobble or snap as the camera moves (compare two captures)."
1176
+ ],
1177
+ "premise": {
1178
+ "genre": "survival horror, exploration, retro shooter",
1179
+ "mood": "uncanny, nostalgic, lonely",
1180
+ "era": "late 1990s consoles",
1181
+ "audience": "core and horror players"
1182
+ },
1183
+ "look": {
1184
+ "preset": "templates/looks/low-resolution-3d.ogt",
1185
+ "presetReady": true,
1186
+ "support": "full",
1187
+ "primitives": [
1188
+ "Stylise.pixelHeight",
1189
+ "Stylise.vertexSnap",
1190
+ "Stylise.affineTexturing",
1191
+ "Stylise.depthBits",
1192
+ "Stylise.dither",
1193
+ "Fog"
1194
+ ],
1195
+ "missing": []
1196
+ },
1197
+ "skin": "scifi",
1198
+ "palette": {
1199
+ "size": "free, but posterised to 32 levels per channel",
1200
+ "rules": "Fog colour equals the clear colour; dithered gradients."
1201
+ },
1202
+ "assets": {
1203
+ "logicalResolution": "320 x 240 or 480 x 270",
1204
+ "spriteScale": "characters 300 to 1000 triangles",
1205
+ "faceBudget": "props under 300 triangles",
1206
+ "outlinePx": "0",
1207
+ "textureDensity": "64 to 256 px textures, nearest-filtered"
1208
+ },
1209
+ "artBible": {
1210
+ "direction": "A low-resolution frame with nearest upscaling, wobbling vertices and warped textures, short fog, modern light where it helps mood.",
1211
+ "avoid": [
1212
+ "high-resolution textures",
1213
+ "smooth anti-aliased edges",
1214
+ "long draw distance"
1215
+ ]
1216
+ }
1217
+ },
1218
+ {
1219
+ "slug": "coarse-pixel",
1220
+ "name": "Minimal low-count pixels",
1221
+ "category": "pixel",
1222
+ "descriptor": "Very few pixels per figure, no faces and almost no texture: silhouettes, empty space and a few colour masses carry mood and story.",
1223
+ "checks": [
1224
+ "Characters are at most 12 logical pixels tall and have no facial features.",
1225
+ "At least 40 % of a capture is a flat background mass.",
1226
+ "Large colour masses (sky, floor, walls) each use a single colour."
1227
+ ],
1228
+ "premise": {
1229
+ "genre": "point-and-click horror, narrative, minimalist puzzle",
1230
+ "mood": "eerie, contemplative, unsettling",
1231
+ "era": "early 1980s computers",
1232
+ "audience": "story-led and jam players"
1233
+ },
1234
+ "look": {
1235
+ "preset": "templates/looks/coarse-pixel.ogt",
1236
+ "presetReady": true,
1237
+ "support": "full",
1238
+ "primitives": [
1239
+ "Stylise.pixelHeight",
1240
+ "Stylise.palette",
1241
+ "Antialias off"
1242
+ ],
1243
+ "missing": []
1244
+ },
1245
+ "skin": "pixel",
1246
+ "palette": {
1247
+ "size": "6 to 16 colours",
1248
+ "rules": "Each scene has one dominant mass colour; detail colour only where the eye should go."
1249
+ },
1250
+ "assets": {
1251
+ "logicalResolution": "160 x 90 or 192 x 108",
1252
+ "spriteScale": "6 to 12 px characters",
1253
+ "faceBudget": "none (2D)",
1254
+ "outlinePx": "0",
1255
+ "textureDensity": "1 texel per logical pixel"
1256
+ },
1257
+ "artBible": {
1258
+ "direction": "Reduction as a choice: suggest, never render; leave space empty; let sound and timing do what detail would.",
1259
+ "avoid": [
1260
+ "added texture to fill space",
1261
+ "faces",
1262
+ "high logical resolutions that soften the reduction"
1263
+ ]
1264
+ }
1265
+ },
1266
+ {
1267
+ "slug": "anime-cel-3d",
1268
+ "name": "Anime cel-shaded 3D",
1269
+ "category": "render",
1270
+ "descriptor": "3D models drawn with the hard shadow shapes and contour lines of 2D animation, framed and timed like an anime cut.",
1271
+ "checks": [
1272
+ "Shadows on characters are one or two hard-edged bands, no smooth gradients.",
1273
+ "Characters have a dark contour whose width is consistent at the same distance.",
1274
+ "Shadow colour is tinted (cool or warm), not black or grey."
1275
+ ],
1276
+ "premise": {
1277
+ "genre": "fighting, action RPG, character action",
1278
+ "mood": "dramatic, energetic, youthful",
1279
+ "era": "contemporary anime",
1280
+ "audience": "anime fans, core players"
1281
+ },
1282
+ "look": {
1283
+ "preset": "templates/looks/anime-cel-3d.ogt",
1284
+ "presetReady": true,
1285
+ "support": "full",
1286
+ "primitives": [
1287
+ "StandardMaterialDesc.toon",
1288
+ "StandardMaterialDesc.gradientMap",
1289
+ "StandardMaterialDesc.outlineWidth",
1290
+ "PostEffects.outline",
1291
+ "MaterialStyle.shadowTint",
1292
+ "MaterialStyle.outlineDistance"
1293
+ ],
1294
+ "missing": []
1295
+ },
1296
+ "skin": "neon",
1297
+ "palette": {
1298
+ "size": "24 to 48 colours",
1299
+ "rules": "Two tones per material (lit, shadow) with hue-shifted shadows; highlights as shapes."
1300
+ },
1301
+ "assets": {
1302
+ "logicalResolution": "native output",
1303
+ "spriteScale": "characters 120 to 300 px tall on screen",
1304
+ "faceBudget": "15k to 40k triangles per character",
1305
+ "outlinePx": "1 to 3, by distance",
1306
+ "textureDensity": "flat or lightly painted, 1 texel per screen pixel"
1307
+ },
1308
+ "artBible": {
1309
+ "direction": "Cel shadows as designed shapes, lines that thin with distance, tinted shadows, dynamic camera and impact frames.",
1310
+ "avoid": [
1311
+ "physically based specular",
1312
+ "soft shadows on characters",
1313
+ "outlines of uniform screen width at every distance"
1314
+ ]
1315
+ }
1316
+ },
1317
+ {
1318
+ "slug": "inked-comic-3d",
1319
+ "name": "Inked comic 3D",
1320
+ "category": "render",
1321
+ "descriptor": "Volumetric models keep bold outlines, drawn surface marks and exaggerated colour: a comic page given depth.",
1322
+ "checks": [
1323
+ "Thick black outlines on silhouettes and major creases.",
1324
+ "Ink marks (hatching or strokes) are painted onto surfaces.",
1325
+ "Proportions are exaggerated (oversized hands, heads or weapons)."
1326
+ ],
1327
+ "premise": {
1328
+ "genre": "looter shooter, action, brawler",
1329
+ "mood": "irreverent, loud, gritty",
1330
+ "era": "contemporary comics",
1331
+ "audience": "core players"
1332
+ },
1333
+ "look": {
1334
+ "preset": "templates/looks/inked-comic-3d.ogt",
1335
+ "presetReady": true,
1336
+ "support": "full",
1337
+ "primitives": [
1338
+ "PostEffects.outline",
1339
+ "StandardMaterialDesc.toon",
1340
+ "Stylise.ink",
1341
+ "Stylise.hatching",
1342
+ "Stylise.hatchingSpace",
1343
+ "Stylise.hatchingDepth"
1344
+ ],
1345
+ "missing": []
1346
+ },
1347
+ "skin": "scifi",
1348
+ "palette": {
1349
+ "size": "free, saturated",
1350
+ "rules": "Bold local colours, black ink for all shadow edges."
1351
+ },
1352
+ "assets": {
1353
+ "logicalResolution": "native output",
1354
+ "spriteScale": "characters 150 to 300 px",
1355
+ "faceBudget": "10k to 30k triangles",
1356
+ "outlinePx": "2 to 4",
1357
+ "textureDensity": "hand-inked textures, 1 texel per screen pixel"
1358
+ },
1359
+ "artBible": {
1360
+ "direction": "Comic ink over 3D: heavy outlines, hatched shading painted in, punchy colour, exaggerated shapes.",
1361
+ "avoid": [
1362
+ "photoreal textures",
1363
+ "thin outlines",
1364
+ "muted colour"
1365
+ ]
1366
+ }
1367
+ },
1368
+ {
1369
+ "slug": "paper-craft",
1370
+ "name": "Paper craft",
1371
+ "category": "shape",
1372
+ "descriptor": "Folded planes, visible sheet thickness and layered cut paper become the world's construction.",
1373
+ "checks": [
1374
+ "Surfaces are flat planes with crisp folds; no smooth organic curvature.",
1375
+ "Paper grain or fibre is visible on lit surfaces.",
1376
+ "Layered sheets cast soft contact shadows on the layer behind."
1377
+ ],
1378
+ "premise": {
1379
+ "genre": "puzzle, cosy adventure, platformer",
1380
+ "mood": "calm, delicate, handmade",
1381
+ "era": "handmade crafts",
1382
+ "audience": "casual and all ages"
1383
+ },
1384
+ "look": {
1385
+ "preset": "templates/looks/paper-craft.ogt",
1386
+ "presetReady": true,
1387
+ "support": "full",
1388
+ "primitives": [
1389
+ "StandardMaterialDesc.flatShading",
1390
+ "MaterialStyle.flatShading",
1391
+ "PostEffects.ao",
1392
+ "Stylise.paintCanvas",
1393
+ "soft shadows"
1394
+ ],
1395
+ "missing": []
1396
+ },
1397
+ "skin": "paper",
1398
+ "palette": {
1399
+ "size": "8 to 16 colours",
1400
+ "rules": "Colours of real paper stock: muted, slightly warm; white is off-white."
1401
+ },
1402
+ "assets": {
1403
+ "logicalResolution": "native output",
1404
+ "spriteScale": "characters as 200 to 600 triangle folded shapes",
1405
+ "faceBudget": "under 2k triangles per prop",
1406
+ "outlinePx": "0 (folds and shadows)",
1407
+ "textureDensity": "paper texture 1 texel per screen pixel"
1408
+ },
1409
+ "artBible": {
1410
+ "direction": "Everything is cut, folded or stacked paper: planar facets, thin edges, soft contact shadows, paper grain.",
1411
+ "avoid": [
1412
+ "smooth shading",
1413
+ "glossy materials",
1414
+ "saturated digital colours"
1415
+ ]
1416
+ }
1417
+ },
1418
+ {
1419
+ "slug": "miniature-diorama",
1420
+ "name": "Miniature diorama",
1421
+ "category": "render",
1422
+ "descriptor": "High, often isometric framing, small rounded architecture and soft shadows make the world look like a tabletop model.",
1423
+ "checks": [
1424
+ "Depth of field blurs the frame's top and bottom bands (tilt-shift).",
1425
+ "Shadows are soft with strong ambient occlusion in corners.",
1426
+ "The camera looks down at 30 to 60 degrees."
1427
+ ],
1428
+ "premise": {
1429
+ "genre": "city builder, cosy building, puzzle, tactics",
1430
+ "mood": "calm, charming, cosy",
1431
+ "era": "contemporary",
1432
+ "audience": "casual and all ages"
1433
+ },
1434
+ "look": {
1435
+ "preset": "templates/looks/miniature-diorama.ogt",
1436
+ "presetReady": true,
1437
+ "support": "full",
1438
+ "primitives": [
1439
+ "PostEffects.depthOfField",
1440
+ "PostEffects.ao",
1441
+ "RenderSettings.bloom",
1442
+ "Sky",
1443
+ "soft shadows"
1444
+ ],
1445
+ "missing": []
1446
+ },
1447
+ "skin": "cartoon",
1448
+ "palette": {
1449
+ "size": "soft pastel 24 to 48 colours",
1450
+ "rules": "Bright but slightly desaturated; warm sunlight, cool shadows."
1451
+ },
1452
+ "assets": {
1453
+ "logicalResolution": "native output",
1454
+ "spriteScale": "buildings 500 to 3k triangles, bevelled",
1455
+ "faceBudget": "rounded props",
1456
+ "outlinePx": "0",
1457
+ "textureDensity": "simple colour textures or vertex colour"
1458
+ },
1459
+ "artBible": {
1460
+ "direction": "Toy-scale world: rounded bevels, tilt-shift focus, soft sun and occlusion, high camera.",
1461
+ "avoid": [
1462
+ "eye-level cameras",
1463
+ "sharp machined edges",
1464
+ "grim lighting"
1465
+ ]
1466
+ }
1467
+ },
1468
+ {
1469
+ "slug": "painterly-3d",
1470
+ "name": "Painterly 3D",
1471
+ "category": "render",
1472
+ "descriptor": "3D spaces whose simplified materials, shaped forms and painterly colour step away from the photographic.",
1473
+ "checks": [
1474
+ "Surfaces show brushy, broad colour regions rather than photo detail.",
1475
+ "Forms are deliberately shaped and exaggerated (architecture leans, props chunky).",
1476
+ "Colour is harmonised across the frame (a coherent palette, not natural variety)."
1477
+ ],
1478
+ "premise": {
1479
+ "genre": "immersive sim, action adventure, RPG",
1480
+ "mood": "atmospheric, stylised, moody",
1481
+ "era": "illustrated",
1482
+ "audience": "core players"
1483
+ },
1484
+ "look": {
1485
+ "preset": "templates/looks/painterly-3d.ogt",
1486
+ "presetReady": true,
1487
+ "support": "full",
1488
+ "primitives": [
1489
+ "Stylise.paintRadius",
1490
+ "Stylise.paintAnisotropy",
1491
+ "Stylise.paintCanvas",
1492
+ "PostEffects.lut",
1493
+ "Fog"
1494
+ ],
1495
+ "missing": []
1496
+ },
1497
+ "skin": "fantasy",
1498
+ "palette": {
1499
+ "size": "free, harmonised by a LUT",
1500
+ "rules": "Two or three dominant hues per area; graded towards them."
1501
+ },
1502
+ "assets": {
1503
+ "logicalResolution": "native output",
1504
+ "spriteScale": "characters 120 to 250 px",
1505
+ "faceBudget": "10k to 30k triangles",
1506
+ "outlinePx": "0 to 1",
1507
+ "textureDensity": "hand-painted, 0.5 to 1 texel per screen pixel"
1508
+ },
1509
+ "artBible": {
1510
+ "direction": "Hand-painted textures, shaped forms, a painterly filter over the frame, a coherent graded palette.",
1511
+ "avoid": [
1512
+ "photo textures",
1513
+ "realistic proportions",
1514
+ "noisy high-frequency detail"
1515
+ ]
1516
+ }
1517
+ },
1518
+ {
1519
+ "slug": "cinematic-realism",
1520
+ "name": "Cinematic realism",
1521
+ "category": "render",
1522
+ "descriptor": "Believable materials, human proportions and natural light, organised by cinematic framing, depth and colour control.",
1523
+ "checks": [
1524
+ "Materials respond physically: metals reflect the environment, rough surfaces scatter.",
1525
+ "Lighting is naturalistic with soft shadows and indirect fill (ambient occlusion visible).",
1526
+ "The frame is graded (a LUT or colour cast) and uses depth of field or atmosphere for focus."
1527
+ ],
1528
+ "premise": {
1529
+ "genre": "action adventure, open world, narrative drama",
1530
+ "mood": "grounded, epic, intimate",
1531
+ "era": "any period",
1532
+ "audience": "core and mainstream players"
1533
+ },
1534
+ "look": {
1535
+ "preset": "templates/looks/cinematic-realism.ogt",
1536
+ "presetReady": true,
1537
+ "support": "full",
1538
+ "primitives": [
1539
+ "StandardMaterial (PBR)",
1540
+ "Environment",
1541
+ "PostEffects.ao",
1542
+ "PostEffects.depthOfField",
1543
+ "PostEffects.lut",
1544
+ "RenderSettings.toneMapping agx",
1545
+ "Antialias taa"
1546
+ ],
1547
+ "missing": []
1548
+ },
1549
+ "skin": "scifi",
1550
+ "palette": {
1551
+ "size": "free, graded",
1552
+ "rules": "One grade per area; avoid oversaturation; skin tones protected."
1553
+ },
1554
+ "assets": {
1555
+ "logicalResolution": "native output",
1556
+ "spriteScale": "characters 150 to 400 px",
1557
+ "faceBudget": "30k to 100k triangles per hero character",
1558
+ "outlinePx": "0",
1559
+ "textureDensity": "PBR textures 1 to 2 texels per screen pixel"
1560
+ },
1561
+ "artBible": {
1562
+ "direction": "Physically based materials, natural light, film-like grading and lenses, composition from cinema.",
1563
+ "avoid": [
1564
+ "flat ambient light",
1565
+ "saturated game-y colours",
1566
+ "stylised outlines"
1567
+ ]
1568
+ }
1569
+ },
1570
+ {
1571
+ "slug": "muted-cinematic-3d",
1572
+ "name": "Muted theatrical light",
1573
+ "category": "render",
1574
+ "descriptor": "Simplified 3D forms in restrained colour, lit by local beams and haze like a stage, where tonal layers tell the story.",
1575
+ "checks": [
1576
+ "A capture's average saturation is low (below 0.25) with at most one saturated accent.",
1577
+ "Light arrives in local beams or pools (god rays or spot lights) with haze between layers.",
1578
+ "Forms are simplified but keep volume (soft shading, no outlines)."
1579
+ ],
1580
+ "premise": {
1581
+ "genre": "puzzle platformer, horror, cinematic adventure",
1582
+ "mood": "bleak, tense, haunting",
1583
+ "era": "contemporary art-house",
1584
+ "audience": "adult story-led players"
1585
+ },
1586
+ "look": {
1587
+ "preset": "templates/looks/muted-cinematic-3d.ogt",
1588
+ "presetReady": true,
1589
+ "support": "full",
1590
+ "primitives": [
1591
+ "PostEffects.godRays",
1592
+ "Fog",
1593
+ "SpotLight",
1594
+ "PostEffects.lut",
1595
+ "PostEffects.vignette",
1596
+ "PostEffects.filmGrain"
1597
+ ],
1598
+ "missing": []
1599
+ },
1600
+ "skin": "scifi",
1601
+ "palette": {
1602
+ "size": "greys and one accent",
1603
+ "rules": "Desaturated everything; the accent is red or warm light only where the story points."
1604
+ },
1605
+ "assets": {
1606
+ "logicalResolution": "native output",
1607
+ "spriteScale": "characters 60 to 120 px",
1608
+ "faceBudget": "simplified 2k to 10k triangles",
1609
+ "outlinePx": "0",
1610
+ "textureDensity": "plain materials, little texture"
1611
+ },
1612
+ "artBible": {
1613
+ "direction": "Stage lighting: dark grounds, beams through haze, simplified forms with soft volume, a single accent.",
1614
+ "avoid": [
1615
+ "bright even light",
1616
+ "busy textures",
1617
+ "saturated palettes"
1618
+ ]
1619
+ }
1620
+ },
1621
+ {
1622
+ "slug": "layered-silhouette",
1623
+ "name": "Layered silhouettes",
1624
+ "category": "shape",
1625
+ "descriptor": "Foregrounds as solid contours against lighter, hazier layers behind, so shape and value carry the depth.",
1626
+ "checks": [
1627
+ "The nearest layer is a near-uniform dark silhouette with no visible surface detail.",
1628
+ "At least three depth layers are visible, each lighter than the one in front.",
1629
+ "The player is identifiable by silhouette alone."
1630
+ ],
1631
+ "premise": {
1632
+ "genre": "puzzle platformer, cinematic platformer, exploration",
1633
+ "mood": "lonely, tense, dreamlike",
1634
+ "era": "timeless",
1635
+ "audience": "story and puzzle players"
1636
+ },
1637
+ "look": {
1638
+ "preset": "templates/looks/layered-silhouette.ogt",
1639
+ "presetReady": true,
1640
+ "support": "full",
1641
+ "primitives": [
1642
+ "Stylise.depthBands",
1643
+ "Fog",
1644
+ "unlit materials",
1645
+ "PostEffects.godRays"
1646
+ ],
1647
+ "missing": []
1648
+ },
1649
+ "skin": "neon",
1650
+ "palette": {
1651
+ "size": "1 hue in 4 to 6 values, or black plus a gradient sky",
1652
+ "rules": "Value steps per layer; colour only in the far layers or a single accent."
1653
+ },
1654
+ "assets": {
1655
+ "logicalResolution": "native output",
1656
+ "spriteScale": "characters as silhouettes 60 to 120 px",
1657
+ "faceBudget": "silhouette-only, low poly",
1658
+ "outlinePx": "0",
1659
+ "textureDensity": "none needed in the foreground"
1660
+ },
1661
+ "artBible": {
1662
+ "direction": "Black shapes in front, haze and light behind, readability by contour, depth by value steps.",
1663
+ "avoid": [
1664
+ "detail on silhouettes",
1665
+ "rim lights everywhere",
1666
+ "foreground layers lighter than background"
1667
+ ]
1668
+ }
1669
+ },
1670
+ {
1671
+ "slug": "minimal-geometric",
1672
+ "name": "Minimal geometry",
1673
+ "category": "shape",
1674
+ "descriptor": "Rectangles, circles and triangles in a small set of colours, ordered by proportion, rhythm and empty space.",
1675
+ "checks": [
1676
+ "Every element in a capture is a basic geometric shape or a simple composition of them.",
1677
+ "A capture uses at most 6 colours.",
1678
+ "At least 30 % of the frame is empty background."
1679
+ ],
1680
+ "premise": {
1681
+ "genre": "puzzle, rhythm, abstract arcade",
1682
+ "mood": "calm, precise, playful",
1683
+ "era": "modernist design",
1684
+ "audience": "all ages, casual"
1685
+ },
1686
+ "look": {
1687
+ "preset": "templates/looks/minimal-geometric.ogt",
1688
+ "presetReady": true,
1689
+ "support": "full",
1690
+ "primitives": [
1691
+ "unlit materials",
1692
+ "boxGeometry/sphereGeometry/planeGeometry",
1693
+ "RenderSettings.toneMapping none",
1694
+ "Antialias msaa4"
1695
+ ],
1696
+ "missing": []
1697
+ },
1698
+ "skin": "neon",
1699
+ "palette": {
1700
+ "size": "3 to 6 colours",
1701
+ "rules": "One ground, one figure colour, one accent; contrast by hue and value."
1702
+ },
1703
+ "assets": {
1704
+ "logicalResolution": "native output",
1705
+ "spriteScale": "shapes sized to a grid",
1706
+ "faceBudget": "primitives",
1707
+ "outlinePx": "0",
1708
+ "textureDensity": "none (flat colour)"
1709
+ },
1710
+ "artBible": {
1711
+ "direction": "Geometric primitives, flat colour, deliberate proportion, movement and spacing as the expression.",
1712
+ "avoid": [
1713
+ "texture and noise",
1714
+ "gradients",
1715
+ "ornament"
1716
+ ]
1717
+ }
1718
+ },
1719
+ {
1720
+ "slug": "neon-vector",
1721
+ "name": "Neon vector lines",
1722
+ "category": "shape",
1723
+ "descriptor": "Thin glowing lines, grids and bright particles on dark fields, like a vector display.",
1724
+ "checks": [
1725
+ "Mean luminance of a capture is below 0.15 and line pixels are near full brightness.",
1726
+ "Lines glow: a halo wider than the line itself (bloom).",
1727
+ "Geometry is drawn as lines or wireframes, not filled surfaces."
1728
+ ],
1729
+ "premise": {
1730
+ "genre": "arcade shooter, rhythm, racing",
1731
+ "mood": "electric, hypnotic, intense",
1732
+ "era": "1980s vector arcade, synthwave",
1733
+ "audience": "arcade and rhythm players"
1734
+ },
1735
+ "look": {
1736
+ "preset": "templates/looks/neon-vector.ogt",
1737
+ "presetReady": true,
1738
+ "support": "full",
1739
+ "primitives": [
1740
+ "RenderSettings.bloom",
1741
+ "emissive unlit materials",
1742
+ "Trail",
1743
+ "Beam",
1744
+ "particles",
1745
+ "PostEffects.chromaticAberration"
1746
+ ],
1747
+ "missing": []
1748
+ },
1749
+ "skin": "neon",
1750
+ "palette": {
1751
+ "size": "black plus 2 to 4 saturated hues",
1752
+ "rules": "Each hue one meaning (player, enemy, pickup); white only for the hottest centres."
1753
+ },
1754
+ "assets": {
1755
+ "logicalResolution": "native output",
1756
+ "spriteScale": "line widths 1 to 3 px",
1757
+ "faceBudget": "line geometry",
1758
+ "outlinePx": "the line is the shape",
1759
+ "textureDensity": "none (emissive colour)"
1760
+ },
1761
+ "artBible": {
1762
+ "direction": "Luminous lines on black, grids for space, particle bursts, bloom as the material.",
1763
+ "avoid": [
1764
+ "filled shaded surfaces",
1765
+ "grey backgrounds",
1766
+ "too many hues"
1767
+ ]
1768
+ }
1769
+ },
1770
+ {
1771
+ "slug": "monochrome-dither-3d",
1772
+ "name": "Monochrome dithered 3D",
1773
+ "category": "render",
1774
+ "descriptor": "3D scenes reduced to one or two colours where dot patterns carry every tonal transition while perspective stays real.",
1775
+ "checks": [
1776
+ "A capture contains at most 2 to 4 colours.",
1777
+ "Gradients are rendered as a visible ordered or noise dither pattern.",
1778
+ "The scene keeps real 3D perspective and depth cues."
1779
+ ],
1780
+ "premise": {
1781
+ "genre": "mystery, exploration, horror, puzzle",
1782
+ "mood": "eerie, nostalgic, dreamlike",
1783
+ "era": "early 1-bit home computers",
1784
+ "audience": "core and art-house players"
1785
+ },
1786
+ "look": {
1787
+ "preset": "templates/looks/monochrome-dither-3d.ogt",
1788
+ "presetReady": true,
1789
+ "support": "full",
1790
+ "primitives": [
1791
+ "Stylise.posterize",
1792
+ "Stylise.palette",
1793
+ "Stylise.dither",
1794
+ "Stylise.pixelHeight"
1795
+ ],
1796
+ "missing": []
1797
+ },
1798
+ "skin": "pixel",
1799
+ "palette": {
1800
+ "size": "2 to 4 colours",
1801
+ "rules": "Ink and paper, optionally one mid-tone and one accent."
1802
+ },
1803
+ "assets": {
1804
+ "logicalResolution": "320 x 240 to 640 x 400",
1805
+ "spriteScale": "characters 80 to 200 px",
1806
+ "faceBudget": "2k to 10k triangles",
1807
+ "outlinePx": "0",
1808
+ "textureDensity": "textures nearly irrelevant: light carries value"
1809
+ },
1810
+ "artBible": {
1811
+ "direction": "Real 3D lighting quantised to one bit, dither as the only shading, a low-resolution grid that keeps the pattern crisp.",
1812
+ "avoid": [
1813
+ "grey anti-aliasing",
1814
+ "colour",
1815
+ "dither that crawls when still (use a stable pattern)"
1816
+ ]
1817
+ }
1818
+ },
1819
+ {
1820
+ "slug": "luminous-layered-painting",
1821
+ "name": "Luminous layered depths",
1822
+ "category": "render",
1823
+ "descriptor": "Painterly side-on scenery in many foreground and background layers with strong luminous focal points against dark masses.",
1824
+ "checks": [
1825
+ "At least four parallax layers are visible, foreground darkest.",
1826
+ "Luminous focal points (glows, light shafts) stand against dark masses.",
1827
+ "Distant layers fade by atmospheric perspective (lighter and cooler)."
1828
+ ],
1829
+ "premise": {
1830
+ "genre": "exploration platformer, adventure",
1831
+ "mood": "wondrous, mysterious, emotional",
1832
+ "era": "illustrated fantasy",
1833
+ "audience": "core and story players"
1834
+ },
1835
+ "look": {
1836
+ "preset": "templates/looks/luminous-layered-painting.ogt",
1837
+ "presetReady": true,
1838
+ "support": "full",
1839
+ "primitives": [
1840
+ "sprite layers",
1841
+ "Fog",
1842
+ "PostEffects.godRays",
1843
+ "RenderSettings.bloom",
1844
+ "PostEffects.glow",
1845
+ "Stylise.paintRadius"
1846
+ ],
1847
+ "missing": []
1848
+ },
1849
+ "skin": "fantasy",
1850
+ "palette": {
1851
+ "size": "dark cool masses plus warm luminous accents",
1852
+ "rules": "Value structure first: dark foreground, mid play plane, glowing background."
1853
+ },
1854
+ "assets": {
1855
+ "logicalResolution": "native output",
1856
+ "spriteScale": "characters 60 to 150 px",
1857
+ "faceBudget": "3D props 2k to 10k triangles",
1858
+ "outlinePx": "0 to 1",
1859
+ "textureDensity": "painted layers at 1x"
1860
+ },
1861
+ "artBible": {
1862
+ "direction": "Deep side-on layers, glowing focal points, light shafts and bloom, atmospheric fade into the distance.",
1863
+ "avoid": [
1864
+ "flat single-layer backgrounds",
1865
+ "bright overall exposure",
1866
+ "no focal light"
1867
+ ]
1868
+ }
1869
+ }
1870
+ ]
1871
+ }