@almadar/std 16.178.0 → 16.180.0

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 (80) hide show
  1. package/behaviors/lolo/ui/core/atoms/std-detail-layout.lolo +82 -0
  2. package/behaviors/lolo/ui/core/molecules/ui-breadcrumb.lolo +20 -2
  3. package/behaviors/lolo/ui/core/molecules/ui-fx-overlay.lolo +63 -0
  4. package/behaviors/lolo/ui/core/molecules/ui-page-header.lolo +1 -1
  5. package/behaviors/lolo/ui/core/organisms/ui-detail-panel.lolo +6 -0
  6. package/behaviors/lolo/ui/core/organisms/ui-form-section.lolo +2 -2
  7. package/behaviors/lolo/ui/core/organisms/ui-form.lolo +2 -2
  8. package/behaviors/lolo/ui/core/templates/ui-dashboard-layout.lolo +2 -2
  9. package/behaviors/lolo/ui/game/atoms/std-fx-particles.lolo +23 -4
  10. package/behaviors/lolo/ui/game/atoms/std-platformer-body.lolo +251 -0
  11. package/behaviors/lolo/ui/game/atoms/ui-draw-fx-layer.lolo +109 -0
  12. package/behaviors/lolo/ui/game/organisms/std-arcade-board-3d.lolo +32 -2
  13. package/behaviors/lolo/ui/game/organisms/std-crew-board-2d.lolo +32 -2
  14. package/behaviors/lolo/ui/game/organisms/std-dungeon-board-2d.lolo +32 -2
  15. package/behaviors/lolo/ui/game/organisms/std-market-board-3d.lolo +32 -2
  16. package/behaviors/lolo/ui/game/organisms/std-objective-board-3d.lolo +32 -2
  17. package/behaviors/lolo/ui/game/organisms/std-platformer-board-2d.lolo +391 -0
  18. package/behaviors/lolo/ui/game/organisms/std-survival-board-3d.lolo +32 -2
  19. package/behaviors/lolo/ui/game/organisms/std-tactics-board-2d.lolo +34 -6
  20. package/behaviors/lolo/ui/game/organisms/std-tactics-board-3d.lolo +34 -4
  21. package/behaviors/lolo/ui/learning/atoms/std-learn-arrangement.lolo +8 -0
  22. package/behaviors/lolo/ui/learning/atoms/std-learn-classify.lolo +8 -0
  23. package/behaviors/lolo/ui/learning/atoms/std-learn-derivation.lolo +8 -0
  24. package/behaviors/lolo/ui/learning/atoms/std-learn-doser.lolo +9 -0
  25. package/behaviors/lolo/ui/learning/atoms/std-learn-estimate.lolo +8 -0
  26. package/behaviors/lolo/ui/learning/atoms/std-learn-fx-cues.lolo +147 -0
  27. package/behaviors/lolo/ui/learning/atoms/std-learn-goal-seek.lolo +8 -0
  28. package/behaviors/lolo/ui/learning/atoms/std-learn-hotspot.lolo +8 -0
  29. package/behaviors/lolo/ui/learning/atoms/std-learn-predict.lolo +8 -0
  30. package/behaviors/lolo/ui/learning/atoms/std-learn-scatter-fit.lolo +9 -0
  31. package/behaviors/lolo/ui/learning/atoms/std-learn-speed-drill.lolo +8 -0
  32. package/behaviors/lolo/ui/learning/atoms/std-learn-tour-3d.lolo +9 -0
  33. package/behaviors/registry/ui/core/atoms/std-detail-layout.orb +265 -0
  34. package/behaviors/registry/ui/core/molecules/ui-breadcrumb.orb +55 -17
  35. package/behaviors/registry/ui/core/molecules/ui-fx-overlay.orb +281 -0
  36. package/behaviors/registry/ui/core/molecules/ui-page-header.orb +1 -1
  37. package/behaviors/registry/ui/core/organisms/ui-detail-panel.orb +8 -0
  38. package/behaviors/registry/ui/core/organisms/ui-form-section.orb +6 -0
  39. package/behaviors/registry/ui/core/organisms/ui-form.orb +6 -0
  40. package/behaviors/registry/ui/core/templates/ui-dashboard-layout.orb +2 -2
  41. package/behaviors/registry/ui/game/atoms/std-fx-particles.orb +265 -4
  42. package/behaviors/registry/ui/game/atoms/std-platformer-body.orb +2136 -0
  43. package/behaviors/registry/ui/game/atoms/ui-draw-fx-layer.orb +523 -0
  44. package/behaviors/registry/ui/game/organisms/std-arcade-board-3d.orb +159 -70
  45. package/behaviors/registry/ui/game/organisms/std-crew-board-2d.orb +148 -58
  46. package/behaviors/registry/ui/game/organisms/std-dungeon-board-2d.orb +169 -58
  47. package/behaviors/registry/ui/game/organisms/std-market-board-3d.orb +160 -70
  48. package/behaviors/registry/ui/game/organisms/std-objective-board-3d.orb +151 -60
  49. package/behaviors/registry/ui/game/organisms/std-platformer-board-2d.orb +2981 -0
  50. package/behaviors/registry/ui/game/organisms/std-survival-board-3d.orb +150 -60
  51. package/behaviors/registry/ui/game/organisms/std-tactics-board-2d.orb +163 -316
  52. package/behaviors/registry/ui/game/organisms/std-tactics-board-3d.orb +156 -184
  53. package/behaviors/registry/ui/learning/atoms/std-learn-arrangement.orb +62 -0
  54. package/behaviors/registry/ui/learning/atoms/std-learn-classify.orb +73 -0
  55. package/behaviors/registry/ui/learning/atoms/std-learn-derivation.orb +66 -0
  56. package/behaviors/registry/ui/learning/atoms/std-learn-doser.orb +71 -0
  57. package/behaviors/registry/ui/learning/atoms/std-learn-estimate.orb +72 -0
  58. package/behaviors/registry/ui/learning/atoms/std-learn-fx-cues.orb +1546 -0
  59. package/behaviors/registry/ui/learning/atoms/std-learn-goal-seek.orb +58 -0
  60. package/behaviors/registry/ui/learning/atoms/std-learn-hotspot.orb +72 -0
  61. package/behaviors/registry/ui/learning/atoms/std-learn-predict.orb +72 -0
  62. package/behaviors/registry/ui/learning/atoms/std-learn-scatter-fit.orb +71 -0
  63. package/behaviors/registry/ui/learning/atoms/std-learn-speed-drill.orb +72 -0
  64. package/behaviors/registry/ui/learning/atoms/std-learn-tour-3d.orb +176 -0
  65. package/canonical-operators.json +14 -2
  66. package/dist/behaviors/exports-reader.js +8655 -5239
  67. package/dist/behaviors/functions/index.d.ts +686 -16
  68. package/dist/behaviors/functions/index.js +8637 -5240
  69. package/dist/behaviors/index.d.ts +1 -1
  70. package/dist/behaviors/index.js +8656 -5240
  71. package/dist/behaviors/query.js +8655 -5239
  72. package/dist/behaviors-embeddings.hash.json +3 -3
  73. package/dist/behaviors-embeddings.json +381 -353
  74. package/dist/behaviors-registry.json +2415 -443
  75. package/dist/index.d.ts +1 -1
  76. package/dist/index.js +8656 -5240
  77. package/dist/knob-embeddings.hash.json +3 -3
  78. package/dist/knob-embeddings.json +1 -1
  79. package/dist/registry/factory-signatures.json +1 -1
  80. package/package.json +2 -2
@@ -0,0 +1,2981 @@
1
+ {
2
+ "description": "2D run/jump platformer board FRAME: composes platformer-body (run/jump physics, one-way AABB collision, hazard/goal/fall signals) + fx-particles + objective-flow (win/lose gate) onto one shared GameState with a side-view canvas render. The intent trait owns only game RULES — input forwarding (LEFT/RIGHT/STOP/JUMP → STEER/JUMP intents), goal scoring, hazard/pit lives with respawn, PLAY_AGAIN reset — physics, particles, and the win gate belong to the atoms. Games consume this organism and supply level geometry (platforms, in both BodyAuthority.platforms for collision and the render-side platforms knob), theme/assets, and physics feel via config/traitOverrides.",
3
+ "ledger": {
4
+ "entries": {
5
+ "ent_01M0H2T3N3MA9SBPMT6E3P1G9T": {
6
+ "bakedName": "GameState",
7
+ "curName": "GameState",
8
+ "id": "ent_01M0H2T3N3MA9SBPMT6E3P1G9T",
9
+ "kind": "entity",
10
+ "owner": "workspace",
11
+ "renames": []
12
+ },
13
+ "evt_01M0H2T3N32XKD82R2F65GG7Z1": {
14
+ "bakedName": "PLAT_JUMP",
15
+ "curName": "PLAT_JUMP",
16
+ "id": "evt_01M0H2T3N32XKD82R2F65GG7Z1",
17
+ "kind": "event",
18
+ "owner": "workspace",
19
+ "parent": "trt_01M0H2T3N3XRT25QHQ8X9T2RXQ",
20
+ "renames": []
21
+ },
22
+ "evt_01M0H2T3N350892H1162B1XNWH": {
23
+ "bakedName": "BURST",
24
+ "curName": "BURST",
25
+ "id": "evt_01M0H2T3N350892H1162B1XNWH",
26
+ "kind": "event",
27
+ "owner": "workspace",
28
+ "parent": "trt_01M0H2T3N3XRT25QHQ8X9T2RXQ",
29
+ "renames": []
30
+ },
31
+ "evt_01M0H2T3N357RAZYHQ14G3NSVX": {
32
+ "bakedName": "STOP",
33
+ "curName": "STOP",
34
+ "id": "evt_01M0H2T3N357RAZYHQ14G3NSVX",
35
+ "kind": "event",
36
+ "owner": "workspace",
37
+ "parent": "trt_01M0H2T3N3XRT25QHQ8X9T2RXQ",
38
+ "renames": []
39
+ },
40
+ "evt_01M0H2T3N35WQGCGWB08FSKZMX": {
41
+ "bakedName": "INIT",
42
+ "curName": "INIT",
43
+ "id": "evt_01M0H2T3N35WQGCGWB08FSKZMX",
44
+ "kind": "event",
45
+ "owner": "workspace",
46
+ "parent": "trt_01M0H2T3N3XRT25QHQ8X9T2RXQ",
47
+ "renames": []
48
+ },
49
+ "evt_01M0H2T3N37KB0PPF7P5GSCDH7": {
50
+ "bakedName": "RIGHT",
51
+ "curName": "RIGHT",
52
+ "id": "evt_01M0H2T3N37KB0PPF7P5GSCDH7",
53
+ "kind": "event",
54
+ "owner": "workspace",
55
+ "parent": "trt_01M0H2T3N3XRT25QHQ8X9T2RXQ",
56
+ "renames": []
57
+ },
58
+ "evt_01M0H2T3N383RH1ZW70N6NDBN2": {
59
+ "bakedName": "GAME_END",
60
+ "curName": "GAME_END",
61
+ "id": "evt_01M0H2T3N383RH1ZW70N6NDBN2",
62
+ "kind": "event",
63
+ "owner": "workspace",
64
+ "parent": "trt_01M0H2T3N3XRT25QHQ8X9T2RXQ",
65
+ "renames": []
66
+ },
67
+ "evt_01M0H2T3N39MHVHB1XPWSEQHME": {
68
+ "bakedName": "PLAT_PLACE",
69
+ "curName": "PLAT_PLACE",
70
+ "id": "evt_01M0H2T3N39MHVHB1XPWSEQHME",
71
+ "kind": "event",
72
+ "owner": "workspace",
73
+ "parent": "trt_01M0H2T3N3XRT25QHQ8X9T2RXQ",
74
+ "renames": []
75
+ },
76
+ "evt_01M0H2T3N3FNG6B5DWTEVX37AE": {
77
+ "bakedName": "PLAT_STEER",
78
+ "curName": "PLAT_STEER",
79
+ "id": "evt_01M0H2T3N3FNG6B5DWTEVX37AE",
80
+ "kind": "event",
81
+ "owner": "workspace",
82
+ "parent": "trt_01M0H2T3N3XRT25QHQ8X9T2RXQ",
83
+ "renames": []
84
+ },
85
+ "evt_01M0H2T3N3FV92BZD70AGMW6HQ": {
86
+ "bakedName": "RESTART",
87
+ "curName": "RESTART",
88
+ "id": "evt_01M0H2T3N3FV92BZD70AGMW6HQ",
89
+ "kind": "event",
90
+ "owner": "workspace",
91
+ "parent": "trt_01M0H2T3N3XRT25QHQ8X9T2RXQ",
92
+ "renames": []
93
+ },
94
+ "evt_01M0H2T3N3HNRAWXHBSWEV52CY": {
95
+ "bakedName": "LEFT",
96
+ "curName": "LEFT",
97
+ "id": "evt_01M0H2T3N3HNRAWXHBSWEV52CY",
98
+ "kind": "event",
99
+ "owner": "workspace",
100
+ "parent": "trt_01M0H2T3N3XRT25QHQ8X9T2RXQ",
101
+ "renames": []
102
+ },
103
+ "evt_01M0H2T3N3J4Q0Y8CVECMS15F7": {
104
+ "bakedName": "PLAT_FELL",
105
+ "curName": "PLAT_FELL",
106
+ "id": "evt_01M0H2T3N3J4Q0Y8CVECMS15F7",
107
+ "kind": "event",
108
+ "owner": "workspace",
109
+ "parent": "trt_01M0H2T3N3XRT25QHQ8X9T2RXQ",
110
+ "renames": []
111
+ },
112
+ "evt_01M0H2T3N3Q94EVFACFK9HS163": {
113
+ "bakedName": "PLAT_GOAL",
114
+ "curName": "PLAT_GOAL",
115
+ "id": "evt_01M0H2T3N3Q94EVFACFK9HS163",
116
+ "kind": "event",
117
+ "owner": "workspace",
118
+ "parent": "trt_01M0H2T3N3XRT25QHQ8X9T2RXQ",
119
+ "renames": []
120
+ },
121
+ "evt_01M0H2T3N3RYAEFY55899894FC": {
122
+ "bakedName": "PLAY_AGAIN",
123
+ "curName": "PLAY_AGAIN",
124
+ "id": "evt_01M0H2T3N3RYAEFY55899894FC",
125
+ "kind": "event",
126
+ "owner": "workspace",
127
+ "parent": "trt_01M0H2T3N3XRT25QHQ8X9T2RXQ",
128
+ "renames": []
129
+ },
130
+ "evt_01M0H2T3N3VBRGNCRS0ZNYBFHR": {
131
+ "bakedName": "PLAT_HAZARD",
132
+ "curName": "PLAT_HAZARD",
133
+ "id": "evt_01M0H2T3N3VBRGNCRS0ZNYBFHR",
134
+ "kind": "event",
135
+ "owner": "workspace",
136
+ "parent": "trt_01M0H2T3N3XRT25QHQ8X9T2RXQ",
137
+ "renames": []
138
+ },
139
+ "evt_01M0H2T3N3WSCKCXRC5BA77FRP": {
140
+ "bakedName": "JUMP",
141
+ "curName": "JUMP",
142
+ "id": "evt_01M0H2T3N3WSCKCXRC5BA77FRP",
143
+ "kind": "event",
144
+ "owner": "workspace",
145
+ "parent": "trt_01M0H2T3N3XRT25QHQ8X9T2RXQ",
146
+ "renames": []
147
+ },
148
+ "evt_01M0H2T3N3XDGAZ296T4NM7Y7G": {
149
+ "bakedName": "PROGRESS",
150
+ "curName": "PROGRESS",
151
+ "id": "evt_01M0H2T3N3XDGAZ296T4NM7Y7G",
152
+ "kind": "event",
153
+ "owner": "workspace",
154
+ "parent": "trt_01M0H2T3N3XRT25QHQ8X9T2RXQ",
155
+ "renames": []
156
+ },
157
+ "orb_01M0H2T3N368T2N8705GREG62G": {
158
+ "bakedName": "PlatformerBoard2DOrbital",
159
+ "curName": "PlatformerBoard2DOrbital",
160
+ "id": "orb_01M0H2T3N368T2N8705GREG62G",
161
+ "kind": "orbital",
162
+ "owner": "workspace",
163
+ "renames": []
164
+ },
165
+ "pag_01M0H2T3N47AV4BS2VP35Z4KKV": {
166
+ "bakedName": "PlatformerBoard2DPage",
167
+ "curName": "PlatformerBoard2DPage",
168
+ "id": "pag_01M0H2T3N47AV4BS2VP35Z4KKV",
169
+ "kind": "page",
170
+ "owner": "workspace",
171
+ "renames": []
172
+ },
173
+ "trt_01M0H2T3N3PMTENYKAHC0VFFAQ": {
174
+ "bakedName": "FxDecay",
175
+ "curName": "FxDecay",
176
+ "id": "trt_01M0H2T3N3PMTENYKAHC0VFFAQ",
177
+ "kind": "trait",
178
+ "owner": "workspace",
179
+ "renames": []
180
+ },
181
+ "trt_01M0H2T3N3TAPA3PRFY85MEM16": {
182
+ "bakedName": "RoundGate",
183
+ "curName": "RoundGate",
184
+ "id": "trt_01M0H2T3N3TAPA3PRFY85MEM16",
185
+ "kind": "trait",
186
+ "owner": "workspace",
187
+ "renames": []
188
+ },
189
+ "trt_01M0H2T3N3XRT25QHQ8X9T2RXQ": {
190
+ "bakedName": "PlatformerIntent",
191
+ "curName": "PlatformerIntent",
192
+ "id": "trt_01M0H2T3N3XRT25QHQ8X9T2RXQ",
193
+ "kind": "trait",
194
+ "owner": "workspace",
195
+ "renames": []
196
+ },
197
+ "trt_01M0H2T3N3XSXBMK13MKGN1E4M": {
198
+ "bakedName": "BodyAuthority",
199
+ "curName": "BodyAuthority",
200
+ "id": "trt_01M0H2T3N3XSXBMK13MKGN1E4M",
201
+ "kind": "trait",
202
+ "owner": "workspace",
203
+ "renames": []
204
+ }
205
+ },
206
+ "schemaVersion": 1
207
+ },
208
+ "name": "std-platformer-board-2d",
209
+ "orbitals": [
210
+ {
211
+ "entity": {
212
+ "fields": [
213
+ {
214
+ "name": "id",
215
+ "required": true,
216
+ "type": "string"
217
+ },
218
+ {
219
+ "default": {
220
+ "facingRight": true,
221
+ "grounded": false,
222
+ "height": 48.0,
223
+ "vx": 0.0,
224
+ "vy": 0.0,
225
+ "width": 32.0,
226
+ "x": 80.0,
227
+ "y": 320.0
228
+ },
229
+ "name": "body",
230
+ "properties": {
231
+ "facingRight": {
232
+ "name": "facingRight",
233
+ "required": false,
234
+ "type": "boolean"
235
+ },
236
+ "grounded": {
237
+ "name": "grounded",
238
+ "required": false,
239
+ "type": "boolean"
240
+ },
241
+ "height": {
242
+ "name": "height",
243
+ "required": true,
244
+ "type": "number"
245
+ },
246
+ "vx": {
247
+ "name": "vx",
248
+ "required": false,
249
+ "type": "number"
250
+ },
251
+ "vy": {
252
+ "name": "vy",
253
+ "required": false,
254
+ "type": "number"
255
+ },
256
+ "width": {
257
+ "name": "width",
258
+ "required": true,
259
+ "type": "number"
260
+ },
261
+ "x": {
262
+ "name": "x",
263
+ "required": true,
264
+ "type": "number"
265
+ },
266
+ "y": {
267
+ "name": "y",
268
+ "required": true,
269
+ "type": "number"
270
+ }
271
+ },
272
+ "type": "object"
273
+ },
274
+ {
275
+ "default": false,
276
+ "name": "fell",
277
+ "type": "boolean"
278
+ },
279
+ {
280
+ "default": "",
281
+ "name": "hazardId",
282
+ "type": "string"
283
+ },
284
+ {
285
+ "default": "",
286
+ "name": "goalId",
287
+ "type": "string"
288
+ },
289
+ {
290
+ "default": false,
291
+ "name": "skating",
292
+ "type": "boolean"
293
+ },
294
+ {
295
+ "default": [],
296
+ "items": {
297
+ "properties": {
298
+ "bornAt": {
299
+ "name": "bornAt",
300
+ "required": false,
301
+ "type": "number"
302
+ },
303
+ "color": {
304
+ "name": "color",
305
+ "required": false,
306
+ "type": "string"
307
+ },
308
+ "effect": {
309
+ "name": "effect",
310
+ "required": false,
311
+ "type": "string"
312
+ },
313
+ "id": {
314
+ "name": "id",
315
+ "required": true,
316
+ "type": "string"
317
+ },
318
+ "maxTtl": {
319
+ "name": "maxTtl",
320
+ "required": false,
321
+ "type": "number"
322
+ },
323
+ "message": {
324
+ "name": "message",
325
+ "required": false,
326
+ "type": "string"
327
+ },
328
+ "particleCount": {
329
+ "name": "particleCount",
330
+ "required": false,
331
+ "type": "number"
332
+ },
333
+ "size": {
334
+ "name": "size",
335
+ "required": false,
336
+ "type": "number"
337
+ },
338
+ "space": {
339
+ "name": "space",
340
+ "required": false,
341
+ "type": "string"
342
+ },
343
+ "ttl": {
344
+ "name": "ttl",
345
+ "required": true,
346
+ "type": "number"
347
+ },
348
+ "type": {
349
+ "name": "type",
350
+ "required": true,
351
+ "type": "string"
352
+ },
353
+ "vx": {
354
+ "name": "vx",
355
+ "required": false,
356
+ "type": "number"
357
+ },
358
+ "vy": {
359
+ "name": "vy",
360
+ "required": false,
361
+ "type": "number"
362
+ },
363
+ "vz": {
364
+ "name": "vz",
365
+ "required": false,
366
+ "type": "number"
367
+ },
368
+ "x": {
369
+ "name": "x",
370
+ "required": true,
371
+ "type": "number"
372
+ },
373
+ "y": {
374
+ "name": "y",
375
+ "required": false,
376
+ "type": "number"
377
+ },
378
+ "z": {
379
+ "name": "z",
380
+ "required": false,
381
+ "type": "number"
382
+ }
383
+ },
384
+ "type": "object"
385
+ },
386
+ "name": "fx",
387
+ "type": "array"
388
+ },
389
+ {
390
+ "default": "none",
391
+ "name": "result",
392
+ "type": "string"
393
+ },
394
+ {
395
+ "default": 0.0,
396
+ "name": "score",
397
+ "type": "number"
398
+ },
399
+ {
400
+ "default": 3.0,
401
+ "name": "lives",
402
+ "type": "number"
403
+ },
404
+ {
405
+ "default": 1.0,
406
+ "name": "objectivesLeft",
407
+ "type": "number"
408
+ },
409
+ {
410
+ "default": 0.0,
411
+ "name": "frame",
412
+ "type": "number"
413
+ },
414
+ {
415
+ "default": false,
416
+ "name": "celebrated",
417
+ "type": "boolean"
418
+ }
419
+ ],
420
+ "id": "ent_01M0H2T3N3MA9SBPMT6E3P1G9T",
421
+ "name": "GameState",
422
+ "persistence": "runtime",
423
+ "shared": true
424
+ },
425
+ "id": "orb_01M0H2T3N368T2N8705GREG62G",
426
+ "name": "PlatformerBoard2DOrbital",
427
+ "pages": [
428
+ {
429
+ "id": "pag_01M0H2T3N47AV4BS2VP35Z4KKV",
430
+ "name": "PlatformerBoard2DPage",
431
+ "path": "/platformer-board-2d",
432
+ "traits": [
433
+ {
434
+ "ref": "BodyAuthority",
435
+ "refId": "trt_01M0H2T3N3XSXBMK13MKGN1E4M"
436
+ },
437
+ {
438
+ "ref": "FxDecay",
439
+ "refId": "trt_01M0H2T3N3PMTENYKAHC0VFFAQ"
440
+ },
441
+ {
442
+ "ref": "RoundGate",
443
+ "refId": "trt_01M0H2T3N3TAPA3PRFY85MEM16"
444
+ },
445
+ {
446
+ "ref": "PlatformerIntent",
447
+ "refId": "trt_01M0H2T3N3XRT25QHQ8X9T2RXQ"
448
+ }
449
+ ]
450
+ }
451
+ ],
452
+ "traits": [
453
+ {
454
+ "config": {
455
+ "gravity": {
456
+ "default": 550.0,
457
+ "type": "unknown"
458
+ },
459
+ "jumpStrength": {
460
+ "default": 365.0,
461
+ "type": "unknown"
462
+ },
463
+ "killY": {
464
+ "default": 460.0,
465
+ "type": "unknown"
466
+ },
467
+ "maxFallSpeed": {
468
+ "default": 600.0,
469
+ "type": "unknown"
470
+ },
471
+ "moveSpeed": {
472
+ "default": 120.0,
473
+ "type": "unknown"
474
+ },
475
+ "platforms": {
476
+ "default": [
477
+ {
478
+ "height": 32.0,
479
+ "id": "g0",
480
+ "type": "ground",
481
+ "width": 800.0,
482
+ "x": 0.0,
483
+ "y": 368.0
484
+ },
485
+ {
486
+ "height": 16.0,
487
+ "id": "p1",
488
+ "type": "platform",
489
+ "width": 160.0,
490
+ "x": 150.0,
491
+ "y": 280.0
492
+ },
493
+ {
494
+ "height": 16.0,
495
+ "id": "p2",
496
+ "type": "platform",
497
+ "width": 160.0,
498
+ "x": 420.0,
499
+ "y": 220.0
500
+ },
501
+ {
502
+ "height": 16.0,
503
+ "id": "h1",
504
+ "type": "hazard",
505
+ "width": 80.0,
506
+ "x": 580.0,
507
+ "y": 300.0
508
+ },
509
+ {
510
+ "height": 28.0,
511
+ "id": "goal",
512
+ "type": "goal",
513
+ "width": 64.0,
514
+ "x": 700.0,
515
+ "y": 340.0
516
+ }
517
+ ],
518
+ "type": "unknown"
519
+ },
520
+ "running": {
521
+ "default": true,
522
+ "type": "unknown"
523
+ },
524
+ "spawn": {
525
+ "default": {
526
+ "facingRight": true,
527
+ "grounded": false,
528
+ "height": 48.0,
529
+ "vx": 0.0,
530
+ "vy": 0.0,
531
+ "width": 32.0,
532
+ "x": 80.0,
533
+ "y": 320.0
534
+ },
535
+ "type": "unknown"
536
+ },
537
+ "xMax": {
538
+ "default": 768.0,
539
+ "type": "unknown"
540
+ },
541
+ "xMin": {
542
+ "default": 0.0,
543
+ "type": "unknown"
544
+ }
545
+ },
546
+ "events": {
547
+ "BODY_FELL": "PLAT_FELL",
548
+ "BODY_GOAL": "PLAT_GOAL",
549
+ "BODY_HAZARD": "PLAT_HAZARD",
550
+ "BODY_JUMPED": "PLAT_JUMPED",
551
+ "BODY_LANDED": "PLAT_LANDED",
552
+ "BODY_MOVED": "PLAT_MOVED",
553
+ "JUMP": "PLAT_JUMP",
554
+ "PLACE": "PLAT_PLACE",
555
+ "STEER": "PLAT_STEER"
556
+ },
557
+ "id": "trt_01M0H2T3N3XSXBMK13MKGN1E4M",
558
+ "linkedEntity": "GameState",
559
+ "linkedEntityId": "ent_01M0H2T3N3MA9SBPMT6E3P1G9T",
560
+ "name": "BodyAuthority",
561
+ "ref": "Body.traits.PlatformerBody"
562
+ },
563
+ {
564
+ "config": {
565
+ "running": {
566
+ "default": true,
567
+ "type": "unknown"
568
+ }
569
+ },
570
+ "id": "trt_01M0H2T3N3PMTENYKAHC0VFFAQ",
571
+ "linkedEntity": "GameState",
572
+ "linkedEntityId": "ent_01M0H2T3N3MA9SBPMT6E3P1G9T",
573
+ "name": "FxDecay",
574
+ "ref": "Particles.traits.FxParticles"
575
+ },
576
+ {
577
+ "config": {
578
+ "running": {
579
+ "default": true,
580
+ "type": "unknown"
581
+ }
582
+ },
583
+ "id": "trt_01M0H2T3N3TAPA3PRFY85MEM16",
584
+ "linkedEntity": "GameState",
585
+ "linkedEntityId": "ent_01M0H2T3N3MA9SBPMT6E3P1G9T",
586
+ "name": "RoundGate",
587
+ "ref": "Gate.traits.ObjectiveFlow"
588
+ },
589
+ {
590
+ "category": "interaction",
591
+ "config": {
592
+ "backgroundAsset": {
593
+ "default": {},
594
+ "description": "Game-shell background panel sprite (theme chrome)",
595
+ "label": "Background Asset",
596
+ "properties": {
597
+ "animations": {
598
+ "items": {
599
+ "type": "string"
600
+ },
601
+ "name": "animations",
602
+ "required": false,
603
+ "type": "array"
604
+ },
605
+ "aspect": {
606
+ "name": "aspect",
607
+ "required": false,
608
+ "type": "string"
609
+ },
610
+ "atlas": {
611
+ "name": "atlas",
612
+ "required": false,
613
+ "type": "string"
614
+ },
615
+ "category": {
616
+ "name": "category",
617
+ "required": false,
618
+ "type": "string"
619
+ },
620
+ "dimension": {
621
+ "name": "dimension",
622
+ "required": false,
623
+ "type": "string"
624
+ },
625
+ "name": {
626
+ "name": "name",
627
+ "required": false,
628
+ "type": "string"
629
+ },
630
+ "role": {
631
+ "name": "role",
632
+ "required": false,
633
+ "type": "string"
634
+ },
635
+ "sprite": {
636
+ "name": "sprite",
637
+ "required": false,
638
+ "type": "string"
639
+ },
640
+ "style": {
641
+ "name": "style",
642
+ "required": false,
643
+ "type": "string"
644
+ },
645
+ "thumbnailUrl": {
646
+ "name": "thumbnailUrl",
647
+ "required": false,
648
+ "type": "string"
649
+ },
650
+ "url": {
651
+ "name": "url",
652
+ "required": false,
653
+ "type": "string"
654
+ },
655
+ "variant": {
656
+ "name": "variant",
657
+ "required": false,
658
+ "type": "string"
659
+ }
660
+ },
661
+ "tier": "presentation",
662
+ "type": "Asset"
663
+ },
664
+ "backgroundImage": {
665
+ "default": {},
666
+ "description": "Canvas background image Asset",
667
+ "label": "Background Image",
668
+ "properties": {
669
+ "animations": {
670
+ "items": {
671
+ "type": "string"
672
+ },
673
+ "name": "animations",
674
+ "required": false,
675
+ "type": "array"
676
+ },
677
+ "aspect": {
678
+ "name": "aspect",
679
+ "required": false,
680
+ "type": "string"
681
+ },
682
+ "atlas": {
683
+ "name": "atlas",
684
+ "required": false,
685
+ "type": "string"
686
+ },
687
+ "category": {
688
+ "name": "category",
689
+ "required": false,
690
+ "type": "string"
691
+ },
692
+ "dimension": {
693
+ "name": "dimension",
694
+ "required": false,
695
+ "type": "string"
696
+ },
697
+ "name": {
698
+ "name": "name",
699
+ "required": false,
700
+ "type": "string"
701
+ },
702
+ "role": {
703
+ "name": "role",
704
+ "required": false,
705
+ "type": "string"
706
+ },
707
+ "sprite": {
708
+ "name": "sprite",
709
+ "required": false,
710
+ "type": "string"
711
+ },
712
+ "style": {
713
+ "name": "style",
714
+ "required": false,
715
+ "type": "string"
716
+ },
717
+ "thumbnailUrl": {
718
+ "name": "thumbnailUrl",
719
+ "required": false,
720
+ "type": "string"
721
+ },
722
+ "url": {
723
+ "name": "url",
724
+ "required": false,
725
+ "type": "string"
726
+ },
727
+ "variant": {
728
+ "name": "variant",
729
+ "required": false,
730
+ "type": "string"
731
+ }
732
+ },
733
+ "tier": "presentation",
734
+ "type": "Asset"
735
+ },
736
+ "bgColor": {
737
+ "default": "#5c94fc",
738
+ "description": "Canvas background color",
739
+ "label": "Bg Color",
740
+ "tier": "presentation",
741
+ "type": "string"
742
+ },
743
+ "clearTitle": {
744
+ "default": "YOU WIN!",
745
+ "description": "Overlay title when the goal tile is reached",
746
+ "label": "Clear Title",
747
+ "tier": "presentation",
748
+ "type": "string"
749
+ },
750
+ "directionAssets": {
751
+ "default": {},
752
+ "description": "D-pad direction icon sprites",
753
+ "label": "Direction Assets",
754
+ "properties": {
755
+ "down": {
756
+ "name": "down",
757
+ "properties": {
758
+ "animations": {
759
+ "items": {
760
+ "type": "string"
761
+ },
762
+ "name": "animations",
763
+ "required": false,
764
+ "type": "array"
765
+ },
766
+ "aspect": {
767
+ "name": "aspect",
768
+ "required": false,
769
+ "type": "string"
770
+ },
771
+ "atlas": {
772
+ "name": "atlas",
773
+ "required": false,
774
+ "type": "string"
775
+ },
776
+ "category": {
777
+ "name": "category",
778
+ "required": false,
779
+ "type": "string"
780
+ },
781
+ "dimension": {
782
+ "name": "dimension",
783
+ "required": false,
784
+ "type": "string"
785
+ },
786
+ "name": {
787
+ "name": "name",
788
+ "required": false,
789
+ "type": "string"
790
+ },
791
+ "role": {
792
+ "name": "role",
793
+ "required": false,
794
+ "type": "string"
795
+ },
796
+ "sprite": {
797
+ "name": "sprite",
798
+ "required": false,
799
+ "type": "string"
800
+ },
801
+ "style": {
802
+ "name": "style",
803
+ "required": false,
804
+ "type": "string"
805
+ },
806
+ "thumbnailUrl": {
807
+ "name": "thumbnailUrl",
808
+ "required": false,
809
+ "type": "string"
810
+ },
811
+ "url": {
812
+ "name": "url",
813
+ "required": false,
814
+ "type": "string"
815
+ },
816
+ "variant": {
817
+ "name": "variant",
818
+ "required": false,
819
+ "type": "string"
820
+ }
821
+ },
822
+ "required": false,
823
+ "type": "object"
824
+ },
825
+ "left": {
826
+ "name": "left",
827
+ "properties": {
828
+ "animations": {
829
+ "items": {
830
+ "type": "string"
831
+ },
832
+ "name": "animations",
833
+ "required": false,
834
+ "type": "array"
835
+ },
836
+ "aspect": {
837
+ "name": "aspect",
838
+ "required": false,
839
+ "type": "string"
840
+ },
841
+ "atlas": {
842
+ "name": "atlas",
843
+ "required": false,
844
+ "type": "string"
845
+ },
846
+ "category": {
847
+ "name": "category",
848
+ "required": false,
849
+ "type": "string"
850
+ },
851
+ "dimension": {
852
+ "name": "dimension",
853
+ "required": false,
854
+ "type": "string"
855
+ },
856
+ "name": {
857
+ "name": "name",
858
+ "required": false,
859
+ "type": "string"
860
+ },
861
+ "role": {
862
+ "name": "role",
863
+ "required": false,
864
+ "type": "string"
865
+ },
866
+ "sprite": {
867
+ "name": "sprite",
868
+ "required": false,
869
+ "type": "string"
870
+ },
871
+ "style": {
872
+ "name": "style",
873
+ "required": false,
874
+ "type": "string"
875
+ },
876
+ "thumbnailUrl": {
877
+ "name": "thumbnailUrl",
878
+ "required": false,
879
+ "type": "string"
880
+ },
881
+ "url": {
882
+ "name": "url",
883
+ "required": false,
884
+ "type": "string"
885
+ },
886
+ "variant": {
887
+ "name": "variant",
888
+ "required": false,
889
+ "type": "string"
890
+ }
891
+ },
892
+ "required": false,
893
+ "type": "object"
894
+ },
895
+ "right": {
896
+ "name": "right",
897
+ "properties": {
898
+ "animations": {
899
+ "items": {
900
+ "type": "string"
901
+ },
902
+ "name": "animations",
903
+ "required": false,
904
+ "type": "array"
905
+ },
906
+ "aspect": {
907
+ "name": "aspect",
908
+ "required": false,
909
+ "type": "string"
910
+ },
911
+ "atlas": {
912
+ "name": "atlas",
913
+ "required": false,
914
+ "type": "string"
915
+ },
916
+ "category": {
917
+ "name": "category",
918
+ "required": false,
919
+ "type": "string"
920
+ },
921
+ "dimension": {
922
+ "name": "dimension",
923
+ "required": false,
924
+ "type": "string"
925
+ },
926
+ "name": {
927
+ "name": "name",
928
+ "required": false,
929
+ "type": "string"
930
+ },
931
+ "role": {
932
+ "name": "role",
933
+ "required": false,
934
+ "type": "string"
935
+ },
936
+ "sprite": {
937
+ "name": "sprite",
938
+ "required": false,
939
+ "type": "string"
940
+ },
941
+ "style": {
942
+ "name": "style",
943
+ "required": false,
944
+ "type": "string"
945
+ },
946
+ "thumbnailUrl": {
947
+ "name": "thumbnailUrl",
948
+ "required": false,
949
+ "type": "string"
950
+ },
951
+ "url": {
952
+ "name": "url",
953
+ "required": false,
954
+ "type": "string"
955
+ },
956
+ "variant": {
957
+ "name": "variant",
958
+ "required": false,
959
+ "type": "string"
960
+ }
961
+ },
962
+ "required": false,
963
+ "type": "object"
964
+ },
965
+ "up": {
966
+ "name": "up",
967
+ "properties": {
968
+ "animations": {
969
+ "items": {
970
+ "type": "string"
971
+ },
972
+ "name": "animations",
973
+ "required": false,
974
+ "type": "array"
975
+ },
976
+ "aspect": {
977
+ "name": "aspect",
978
+ "required": false,
979
+ "type": "string"
980
+ },
981
+ "atlas": {
982
+ "name": "atlas",
983
+ "required": false,
984
+ "type": "string"
985
+ },
986
+ "category": {
987
+ "name": "category",
988
+ "required": false,
989
+ "type": "string"
990
+ },
991
+ "dimension": {
992
+ "name": "dimension",
993
+ "required": false,
994
+ "type": "string"
995
+ },
996
+ "name": {
997
+ "name": "name",
998
+ "required": false,
999
+ "type": "string"
1000
+ },
1001
+ "role": {
1002
+ "name": "role",
1003
+ "required": false,
1004
+ "type": "string"
1005
+ },
1006
+ "sprite": {
1007
+ "name": "sprite",
1008
+ "required": false,
1009
+ "type": "string"
1010
+ },
1011
+ "style": {
1012
+ "name": "style",
1013
+ "required": false,
1014
+ "type": "string"
1015
+ },
1016
+ "thumbnailUrl": {
1017
+ "name": "thumbnailUrl",
1018
+ "required": false,
1019
+ "type": "string"
1020
+ },
1021
+ "url": {
1022
+ "name": "url",
1023
+ "required": false,
1024
+ "type": "string"
1025
+ },
1026
+ "variant": {
1027
+ "name": "variant",
1028
+ "required": false,
1029
+ "type": "string"
1030
+ }
1031
+ },
1032
+ "required": false,
1033
+ "type": "object"
1034
+ }
1035
+ },
1036
+ "tier": "presentation",
1037
+ "type": "DirectionAssets"
1038
+ },
1039
+ "fxPresets": {
1040
+ "default": [
1041
+ {
1042
+ "color": "#ffe066",
1043
+ "color2": "#fff4cc",
1044
+ "count": 6.0,
1045
+ "glow": 0.15,
1046
+ "shape": "spark",
1047
+ "size": 22.0,
1048
+ "type": "score",
1049
+ "vy": -35.0
1050
+ },
1051
+ {
1052
+ "color": "#ef4444",
1053
+ "color2": "#7f1d1d",
1054
+ "count": 5.0,
1055
+ "glow": 0.12,
1056
+ "gravity": 40.0,
1057
+ "shape": "spark",
1058
+ "size": 20.0,
1059
+ "type": "damage"
1060
+ }
1061
+ ],
1062
+ "description": "This board's effect vocabulary — one look/recipe row per fx type its intent trait emits (goal score, hazard/fell damage).",
1063
+ "items": {
1064
+ "properties": {
1065
+ "color": {
1066
+ "name": "color",
1067
+ "required": false,
1068
+ "type": "string"
1069
+ },
1070
+ "color2": {
1071
+ "name": "color2",
1072
+ "required": false,
1073
+ "type": "string"
1074
+ },
1075
+ "count": {
1076
+ "name": "count",
1077
+ "required": false,
1078
+ "type": "number"
1079
+ },
1080
+ "effect": {
1081
+ "name": "effect",
1082
+ "required": false,
1083
+ "type": "string"
1084
+ },
1085
+ "glow": {
1086
+ "name": "glow",
1087
+ "required": false,
1088
+ "type": "number"
1089
+ },
1090
+ "gravity": {
1091
+ "name": "gravity",
1092
+ "required": false,
1093
+ "type": "number"
1094
+ },
1095
+ "particleCount": {
1096
+ "name": "particleCount",
1097
+ "required": false,
1098
+ "type": "number"
1099
+ },
1100
+ "shape": {
1101
+ "name": "shape",
1102
+ "required": false,
1103
+ "type": "string"
1104
+ },
1105
+ "size": {
1106
+ "name": "size",
1107
+ "required": false,
1108
+ "type": "number"
1109
+ },
1110
+ "space": {
1111
+ "name": "space",
1112
+ "required": false,
1113
+ "type": "string"
1114
+ },
1115
+ "type": {
1116
+ "name": "type",
1117
+ "required": true,
1118
+ "type": "string"
1119
+ },
1120
+ "vx": {
1121
+ "name": "vx",
1122
+ "required": false,
1123
+ "type": "number"
1124
+ },
1125
+ "vy": {
1126
+ "name": "vy",
1127
+ "required": false,
1128
+ "type": "number"
1129
+ },
1130
+ "vz": {
1131
+ "name": "vz",
1132
+ "required": false,
1133
+ "type": "number"
1134
+ }
1135
+ },
1136
+ "type": "object"
1137
+ },
1138
+ "label": "Fx Presets",
1139
+ "tier": "presentation",
1140
+ "type": "[FxPreset]"
1141
+ },
1142
+ "goalScore": {
1143
+ "default": 100.0,
1144
+ "description": "Points awarded when the body touches the goal tile",
1145
+ "label": "Goal Score",
1146
+ "tier": "domain",
1147
+ "type": "number"
1148
+ },
1149
+ "hudBackgroundAsset": {
1150
+ "default": {},
1151
+ "description": "HUD panel background sprite (theme chrome)",
1152
+ "label": "HUD Background Asset",
1153
+ "properties": {
1154
+ "animations": {
1155
+ "items": {
1156
+ "type": "string"
1157
+ },
1158
+ "name": "animations",
1159
+ "required": false,
1160
+ "type": "array"
1161
+ },
1162
+ "aspect": {
1163
+ "name": "aspect",
1164
+ "required": false,
1165
+ "type": "string"
1166
+ },
1167
+ "atlas": {
1168
+ "name": "atlas",
1169
+ "required": false,
1170
+ "type": "string"
1171
+ },
1172
+ "category": {
1173
+ "name": "category",
1174
+ "required": false,
1175
+ "type": "string"
1176
+ },
1177
+ "dimension": {
1178
+ "name": "dimension",
1179
+ "required": false,
1180
+ "type": "string"
1181
+ },
1182
+ "name": {
1183
+ "name": "name",
1184
+ "required": false,
1185
+ "type": "string"
1186
+ },
1187
+ "role": {
1188
+ "name": "role",
1189
+ "required": false,
1190
+ "type": "string"
1191
+ },
1192
+ "sprite": {
1193
+ "name": "sprite",
1194
+ "required": false,
1195
+ "type": "string"
1196
+ },
1197
+ "style": {
1198
+ "name": "style",
1199
+ "required": false,
1200
+ "type": "string"
1201
+ },
1202
+ "thumbnailUrl": {
1203
+ "name": "thumbnailUrl",
1204
+ "required": false,
1205
+ "type": "string"
1206
+ },
1207
+ "url": {
1208
+ "name": "url",
1209
+ "required": false,
1210
+ "type": "string"
1211
+ },
1212
+ "variant": {
1213
+ "name": "variant",
1214
+ "required": false,
1215
+ "type": "string"
1216
+ }
1217
+ },
1218
+ "tier": "presentation",
1219
+ "type": "Asset"
1220
+ },
1221
+ "lostTitle": {
1222
+ "default": "GAME OVER",
1223
+ "description": "Overlay title when lives run out",
1224
+ "label": "Lost Title",
1225
+ "tier": "presentation",
1226
+ "type": "string"
1227
+ },
1228
+ "platforms": {
1229
+ "default": [
1230
+ {
1231
+ "height": 32.0,
1232
+ "id": "g0",
1233
+ "type": "ground",
1234
+ "width": 800.0,
1235
+ "x": 0.0,
1236
+ "y": 368.0
1237
+ },
1238
+ {
1239
+ "height": 16.0,
1240
+ "id": "p1",
1241
+ "type": "platform",
1242
+ "width": 160.0,
1243
+ "x": 150.0,
1244
+ "y": 280.0
1245
+ },
1246
+ {
1247
+ "height": 16.0,
1248
+ "id": "p2",
1249
+ "type": "platform",
1250
+ "width": 160.0,
1251
+ "x": 420.0,
1252
+ "y": 220.0
1253
+ },
1254
+ {
1255
+ "height": 16.0,
1256
+ "id": "h1",
1257
+ "type": "hazard",
1258
+ "width": 80.0,
1259
+ "x": 580.0,
1260
+ "y": 300.0
1261
+ },
1262
+ {
1263
+ "height": 28.0,
1264
+ "id": "goal",
1265
+ "type": "goal",
1266
+ "width": 64.0,
1267
+ "x": 700.0,
1268
+ "y": 340.0
1269
+ }
1270
+ ],
1271
+ "description": "Level geometry rendered by the canvas (must match BodyAuthority.platforms, which owns collision — override both together)",
1272
+ "items": {
1273
+ "properties": {
1274
+ "height": {
1275
+ "name": "height",
1276
+ "required": true,
1277
+ "type": "number"
1278
+ },
1279
+ "id": {
1280
+ "name": "id",
1281
+ "required": false,
1282
+ "type": "string"
1283
+ },
1284
+ "type": {
1285
+ "name": "type",
1286
+ "required": false,
1287
+ "type": "string",
1288
+ "values": [
1289
+ "ground",
1290
+ "platform",
1291
+ "hazard",
1292
+ "goal"
1293
+ ]
1294
+ },
1295
+ "width": {
1296
+ "name": "width",
1297
+ "required": true,
1298
+ "type": "number"
1299
+ },
1300
+ "x": {
1301
+ "name": "x",
1302
+ "required": true,
1303
+ "type": "number"
1304
+ },
1305
+ "y": {
1306
+ "name": "y",
1307
+ "required": true,
1308
+ "type": "number"
1309
+ }
1310
+ },
1311
+ "type": "object"
1312
+ },
1313
+ "label": "Platforms",
1314
+ "tier": "domain",
1315
+ "type": "[PlatformerPlatform]"
1316
+ },
1317
+ "playerSprite": {
1318
+ "default": {},
1319
+ "description": "Player sprite Asset; its atlas must expose adventurer_idle/walk1/walk2/jump frames (or override the sprite-selection expression)",
1320
+ "label": "Player Sprite",
1321
+ "properties": {
1322
+ "animations": {
1323
+ "items": {
1324
+ "type": "string"
1325
+ },
1326
+ "name": "animations",
1327
+ "required": false,
1328
+ "type": "array"
1329
+ },
1330
+ "aspect": {
1331
+ "name": "aspect",
1332
+ "required": false,
1333
+ "type": "string"
1334
+ },
1335
+ "atlas": {
1336
+ "name": "atlas",
1337
+ "required": false,
1338
+ "type": "string"
1339
+ },
1340
+ "category": {
1341
+ "name": "category",
1342
+ "required": false,
1343
+ "type": "string"
1344
+ },
1345
+ "dimension": {
1346
+ "name": "dimension",
1347
+ "required": false,
1348
+ "type": "string"
1349
+ },
1350
+ "name": {
1351
+ "name": "name",
1352
+ "required": false,
1353
+ "type": "string"
1354
+ },
1355
+ "role": {
1356
+ "name": "role",
1357
+ "required": false,
1358
+ "type": "string"
1359
+ },
1360
+ "sprite": {
1361
+ "name": "sprite",
1362
+ "required": false,
1363
+ "type": "string"
1364
+ },
1365
+ "style": {
1366
+ "name": "style",
1367
+ "required": false,
1368
+ "type": "string"
1369
+ },
1370
+ "thumbnailUrl": {
1371
+ "name": "thumbnailUrl",
1372
+ "required": false,
1373
+ "type": "string"
1374
+ },
1375
+ "url": {
1376
+ "name": "url",
1377
+ "required": false,
1378
+ "type": "string"
1379
+ },
1380
+ "variant": {
1381
+ "name": "variant",
1382
+ "required": false,
1383
+ "type": "string"
1384
+ }
1385
+ },
1386
+ "tier": "presentation",
1387
+ "type": "Asset"
1388
+ },
1389
+ "respawnX": {
1390
+ "default": 80.0,
1391
+ "description": "X the body teleports to after hazard/pit damage (matches BodyAuthority spawn.x)",
1392
+ "label": "Respawn X",
1393
+ "tier": "domain",
1394
+ "type": "number"
1395
+ },
1396
+ "respawnY": {
1397
+ "default": 320.0,
1398
+ "description": "Y the body teleports to after hazard/pit damage (matches BodyAuthority spawn.y)",
1399
+ "label": "Respawn Y",
1400
+ "tier": "domain",
1401
+ "type": "number"
1402
+ },
1403
+ "startLives": {
1404
+ "default": 3.0,
1405
+ "description": "Lives seeded on INIT/PLAY_AGAIN; hazard or pit contact costs one, zero loses the round",
1406
+ "label": "Start Lives",
1407
+ "tier": "domain",
1408
+ "type": "number"
1409
+ },
1410
+ "tileSprites": {
1411
+ "default": {},
1412
+ "description": "Map of platform type (ground/platform/hazard/goal) to tile sprite Asset",
1413
+ "items": {
1414
+ "properties": {
1415
+ "animations": {
1416
+ "items": {
1417
+ "type": "string"
1418
+ },
1419
+ "name": "animations",
1420
+ "required": false,
1421
+ "type": "array"
1422
+ },
1423
+ "aspect": {
1424
+ "name": "aspect",
1425
+ "required": false,
1426
+ "type": "string"
1427
+ },
1428
+ "atlas": {
1429
+ "name": "atlas",
1430
+ "required": false,
1431
+ "type": "string"
1432
+ },
1433
+ "category": {
1434
+ "name": "category",
1435
+ "required": false,
1436
+ "type": "string"
1437
+ },
1438
+ "dimension": {
1439
+ "name": "dimension",
1440
+ "required": false,
1441
+ "type": "string"
1442
+ },
1443
+ "name": {
1444
+ "name": "name",
1445
+ "required": false,
1446
+ "type": "string"
1447
+ },
1448
+ "role": {
1449
+ "name": "role",
1450
+ "required": false,
1451
+ "type": "string"
1452
+ },
1453
+ "sprite": {
1454
+ "name": "sprite",
1455
+ "required": false,
1456
+ "type": "string"
1457
+ },
1458
+ "style": {
1459
+ "name": "style",
1460
+ "required": false,
1461
+ "type": "string"
1462
+ },
1463
+ "thumbnailUrl": {
1464
+ "name": "thumbnailUrl",
1465
+ "required": false,
1466
+ "type": "string"
1467
+ },
1468
+ "url": {
1469
+ "name": "url",
1470
+ "required": false,
1471
+ "type": "string"
1472
+ },
1473
+ "variant": {
1474
+ "name": "variant",
1475
+ "required": false,
1476
+ "type": "string"
1477
+ }
1478
+ },
1479
+ "type": "object"
1480
+ },
1481
+ "label": "Tile Sprites",
1482
+ "tier": "presentation",
1483
+ "type": "Map<string,Asset>"
1484
+ },
1485
+ "worldHeight": {
1486
+ "default": 400.0,
1487
+ "description": "World pixel height (camera + canvas bounds)",
1488
+ "label": "World Height",
1489
+ "tier": "presentation",
1490
+ "type": "number"
1491
+ },
1492
+ "worldWidth": {
1493
+ "default": 800.0,
1494
+ "description": "World pixel width (camera + canvas bounds)",
1495
+ "label": "World Width",
1496
+ "tier": "presentation",
1497
+ "type": "number"
1498
+ }
1499
+ },
1500
+ "emits": [
1501
+ {
1502
+ "description": "Move-left intent from ArrowLeft/KeyA keydown or d-pad (forwarded to the body authority as STEER dir −1)",
1503
+ "event": "LEFT",
1504
+ "eventId": "evt_01M0H2T3N3HNRAWXHBSWEV52CY",
1505
+ "payloadSchema": [
1506
+ {
1507
+ "name": "id",
1508
+ "type": "string"
1509
+ }
1510
+ ],
1511
+ "scope": "external",
1512
+ "tier": "domain"
1513
+ },
1514
+ {
1515
+ "description": "Move-right intent from ArrowRight/KeyD keydown or d-pad (forwarded to the body authority as STEER dir +1)",
1516
+ "event": "RIGHT",
1517
+ "eventId": "evt_01M0H2T3N37KB0PPF7P5GSCDH7",
1518
+ "payloadSchema": [
1519
+ {
1520
+ "name": "id",
1521
+ "type": "string"
1522
+ }
1523
+ ],
1524
+ "scope": "external",
1525
+ "tier": "domain"
1526
+ },
1527
+ {
1528
+ "description": "Horizontal key release (keyUpMap or d-pad directionReleaseEvents); forwarded as STEER dir 0 so the body stops",
1529
+ "event": "STOP",
1530
+ "eventId": "evt_01M0H2T3N357RAZYHQ14G3NSVX",
1531
+ "payloadSchema": [
1532
+ {
1533
+ "name": "id",
1534
+ "type": "string"
1535
+ }
1536
+ ],
1537
+ "scope": "external",
1538
+ "tier": "domain"
1539
+ },
1540
+ {
1541
+ "description": "Jump intent from Space/ArrowUp/KeyW or d-pad up; forwarded to the body authority, which accepts it only while grounded",
1542
+ "event": "JUMP",
1543
+ "eventId": "evt_01M0H2T3N3WSCKCXRC5BA77FRP",
1544
+ "payloadSchema": [
1545
+ {
1546
+ "name": "id",
1547
+ "type": "string"
1548
+ }
1549
+ ],
1550
+ "scope": "external",
1551
+ "tier": "domain"
1552
+ },
1553
+ {
1554
+ "description": "Renamed STEER consumed by the platformer-body authority: −1/0/+1 × moveSpeed horizontal velocity",
1555
+ "event": "PLAT_STEER",
1556
+ "eventId": "evt_01M0H2T3N3FNG6B5DWTEVX37AE",
1557
+ "payloadSchema": [
1558
+ {
1559
+ "name": "dir",
1560
+ "required": true,
1561
+ "type": "number"
1562
+ }
1563
+ ],
1564
+ "scope": "external",
1565
+ "tier": "domain"
1566
+ },
1567
+ {
1568
+ "description": "Renamed JUMP consumed by the platformer-body authority (grounded-gated vertical kick)",
1569
+ "event": "PLAT_JUMP",
1570
+ "eventId": "evt_01M0H2T3N32XKD82R2F65GG7Z1",
1571
+ "payloadSchema": [
1572
+ {
1573
+ "name": "id",
1574
+ "type": "string"
1575
+ }
1576
+ ],
1577
+ "scope": "external",
1578
+ "tier": "domain"
1579
+ },
1580
+ {
1581
+ "description": "Renamed PLACE consumed by the platformer-body authority; hazard/pit respawn teleport",
1582
+ "event": "PLAT_PLACE",
1583
+ "eventId": "evt_01M0H2T3N39MHVHB1XPWSEQHME",
1584
+ "payloadSchema": [
1585
+ {
1586
+ "name": "x",
1587
+ "required": true,
1588
+ "type": "number"
1589
+ },
1590
+ {
1591
+ "name": "y",
1592
+ "required": true,
1593
+ "type": "number"
1594
+ }
1595
+ ],
1596
+ "scope": "external",
1597
+ "tier": "domain"
1598
+ },
1599
+ {
1600
+ "description": "Goal-tile contact signal from the platformer-body authority (renamed BODY_GOAL); scores and trips the win gate",
1601
+ "event": "PLAT_GOAL",
1602
+ "eventId": "evt_01M0H2T3N3Q94EVFACFK9HS163",
1603
+ "payloadSchema": [
1604
+ {
1605
+ "name": "id",
1606
+ "required": true,
1607
+ "type": "string"
1608
+ },
1609
+ {
1610
+ "name": "x",
1611
+ "required": true,
1612
+ "type": "number"
1613
+ },
1614
+ {
1615
+ "name": "y",
1616
+ "required": true,
1617
+ "type": "number"
1618
+ }
1619
+ ],
1620
+ "scope": "external",
1621
+ "tier": "domain"
1622
+ },
1623
+ {
1624
+ "description": "Hazard-tile contact signal from the platformer-body authority (renamed BODY_HAZARD); costs a life and respawns",
1625
+ "event": "PLAT_HAZARD",
1626
+ "eventId": "evt_01M0H2T3N3VBRGNCRS0ZNYBFHR",
1627
+ "payloadSchema": [
1628
+ {
1629
+ "name": "id",
1630
+ "required": true,
1631
+ "type": "string"
1632
+ },
1633
+ {
1634
+ "name": "x",
1635
+ "required": true,
1636
+ "type": "number"
1637
+ },
1638
+ {
1639
+ "name": "y",
1640
+ "required": true,
1641
+ "type": "number"
1642
+ }
1643
+ ],
1644
+ "scope": "external",
1645
+ "tier": "domain"
1646
+ },
1647
+ {
1648
+ "description": "Pit-fall signal from the platformer-body authority (renamed BODY_FELL); costs a life and respawns",
1649
+ "event": "PLAT_FELL",
1650
+ "eventId": "evt_01M0H2T3N3J4Q0Y8CVECMS15F7",
1651
+ "payloadSchema": [
1652
+ {
1653
+ "name": "x",
1654
+ "required": true,
1655
+ "type": "number"
1656
+ },
1657
+ {
1658
+ "name": "y",
1659
+ "required": true,
1660
+ "type": "number"
1661
+ }
1662
+ ],
1663
+ "scope": "external",
1664
+ "tier": "domain"
1665
+ },
1666
+ {
1667
+ "description": "Floating-text particle batch spawned on score/damage; fx-particles fades it",
1668
+ "event": "BURST",
1669
+ "eventId": "evt_01M0H2T3N350892H1162B1XNWH",
1670
+ "payloadSchema": [
1671
+ {
1672
+ "name": "particles",
1673
+ "type": "[Fx]"
1674
+ }
1675
+ ],
1676
+ "scope": "external",
1677
+ "tier": "domain"
1678
+ },
1679
+ {
1680
+ "description": "Sparse win/lose signal consumed by the objective-flow gate: objectivesLeft 0 = won, movesLeft 0 = lost",
1681
+ "event": "PROGRESS",
1682
+ "eventId": "evt_01M0H2T3N3XDGAZ296T4NM7Y7G",
1683
+ "payloadSchema": [
1684
+ {
1685
+ "name": "objectivesLeft",
1686
+ "required": true,
1687
+ "type": "number"
1688
+ },
1689
+ {
1690
+ "name": "movesLeft",
1691
+ "required": true,
1692
+ "type": "number"
1693
+ }
1694
+ ],
1695
+ "scope": "external",
1696
+ "tier": "domain"
1697
+ },
1698
+ {
1699
+ "description": "Win/lose resolution from the objective-flow gate; guarded by celebrated so it lands once",
1700
+ "event": "GAME_END",
1701
+ "eventId": "evt_01M0H2T3N383RH1ZW70N6NDBN2",
1702
+ "payloadSchema": [
1703
+ {
1704
+ "name": "result",
1705
+ "required": true,
1706
+ "type": "string"
1707
+ }
1708
+ ],
1709
+ "scope": "external",
1710
+ "tier": "domain"
1711
+ },
1712
+ {
1713
+ "description": "Broadcast reset consumed by the platformer-body and objective-flow authorities on INIT/PLAY_AGAIN",
1714
+ "event": "RESTART",
1715
+ "eventId": "evt_01M0H2T3N3FV92BZD70AGMW6HQ",
1716
+ "payloadSchema": [
1717
+ {
1718
+ "name": "id",
1719
+ "type": "string"
1720
+ }
1721
+ ],
1722
+ "scope": "external",
1723
+ "tier": "domain"
1724
+ },
1725
+ {
1726
+ "description": "End-overlay restart button; reseeds score/lives/objectives and broadcasts RESTART",
1727
+ "event": "PLAY_AGAIN",
1728
+ "eventId": "evt_01M0H2T3N3RYAEFY55899894FC",
1729
+ "payloadSchema": [
1730
+ {
1731
+ "name": "id",
1732
+ "type": "string"
1733
+ }
1734
+ ],
1735
+ "scope": "external",
1736
+ "tier": "domain"
1737
+ }
1738
+ ],
1739
+ "entityRefIds": {
1740
+ "GameState": "ent_01M0H2T3N3MA9SBPMT6E3P1G9T"
1741
+ },
1742
+ "id": "trt_01M0H2T3N3XRT25QHQ8X9T2RXQ",
1743
+ "linkedEntity": "GameState",
1744
+ "linkedEntityId": "ent_01M0H2T3N3MA9SBPMT6E3P1G9T",
1745
+ "name": "PlatformerIntent",
1746
+ "scope": "instance",
1747
+ "stateMachine": {
1748
+ "events": [
1749
+ {
1750
+ "id": "evt_01M0H2T3N35WQGCGWB08FSKZMX",
1751
+ "key": "INIT",
1752
+ "name": "Initialize"
1753
+ },
1754
+ {
1755
+ "description": "Move-left intent from ArrowLeft/KeyA keydown or d-pad (forwarded to the body authority as STEER dir −1)",
1756
+ "id": "evt_01M0H2T3N3HNRAWXHBSWEV52CY",
1757
+ "key": "LEFT",
1758
+ "name": "Left",
1759
+ "payloadSchema": [
1760
+ {
1761
+ "name": "id",
1762
+ "type": "string"
1763
+ }
1764
+ ],
1765
+ "tier": "domain"
1766
+ },
1767
+ {
1768
+ "description": "Move-right intent from ArrowRight/KeyD keydown or d-pad (forwarded to the body authority as STEER dir +1)",
1769
+ "id": "evt_01M0H2T3N37KB0PPF7P5GSCDH7",
1770
+ "key": "RIGHT",
1771
+ "name": "Right",
1772
+ "payloadSchema": [
1773
+ {
1774
+ "name": "id",
1775
+ "type": "string"
1776
+ }
1777
+ ],
1778
+ "tier": "domain"
1779
+ },
1780
+ {
1781
+ "description": "Horizontal key release (keyUpMap or d-pad directionReleaseEvents); forwarded as STEER dir 0 so the body stops",
1782
+ "id": "evt_01M0H2T3N357RAZYHQ14G3NSVX",
1783
+ "key": "STOP",
1784
+ "name": "Stop",
1785
+ "payloadSchema": [
1786
+ {
1787
+ "name": "id",
1788
+ "type": "string"
1789
+ }
1790
+ ],
1791
+ "tier": "domain"
1792
+ },
1793
+ {
1794
+ "description": "Jump intent from Space/ArrowUp/KeyW or d-pad up; forwarded to the body authority, which accepts it only while grounded",
1795
+ "id": "evt_01M0H2T3N3WSCKCXRC5BA77FRP",
1796
+ "key": "JUMP",
1797
+ "name": "Jump",
1798
+ "payloadSchema": [
1799
+ {
1800
+ "name": "id",
1801
+ "type": "string"
1802
+ }
1803
+ ],
1804
+ "tier": "domain"
1805
+ },
1806
+ {
1807
+ "description": "Goal-tile contact signal from the platformer-body authority (renamed BODY_GOAL); scores and trips the win gate",
1808
+ "id": "evt_01M0H2T3N3Q94EVFACFK9HS163",
1809
+ "key": "PLAT_GOAL",
1810
+ "name": "Plat Goal",
1811
+ "payloadSchema": [
1812
+ {
1813
+ "name": "id",
1814
+ "required": true,
1815
+ "type": "string"
1816
+ },
1817
+ {
1818
+ "name": "x",
1819
+ "required": true,
1820
+ "type": "number"
1821
+ },
1822
+ {
1823
+ "name": "y",
1824
+ "required": true,
1825
+ "type": "number"
1826
+ }
1827
+ ],
1828
+ "tier": "domain"
1829
+ },
1830
+ {
1831
+ "description": "Hazard-tile contact signal from the platformer-body authority (renamed BODY_HAZARD); costs a life and respawns",
1832
+ "id": "evt_01M0H2T3N3VBRGNCRS0ZNYBFHR",
1833
+ "key": "PLAT_HAZARD",
1834
+ "name": "Plat Hazard",
1835
+ "payloadSchema": [
1836
+ {
1837
+ "name": "id",
1838
+ "required": true,
1839
+ "type": "string"
1840
+ },
1841
+ {
1842
+ "name": "x",
1843
+ "required": true,
1844
+ "type": "number"
1845
+ },
1846
+ {
1847
+ "name": "y",
1848
+ "required": true,
1849
+ "type": "number"
1850
+ }
1851
+ ],
1852
+ "tier": "domain"
1853
+ },
1854
+ {
1855
+ "description": "Pit-fall signal from the platformer-body authority (renamed BODY_FELL); costs a life and respawns",
1856
+ "id": "evt_01M0H2T3N3J4Q0Y8CVECMS15F7",
1857
+ "key": "PLAT_FELL",
1858
+ "name": "Plat Fell",
1859
+ "payloadSchema": [
1860
+ {
1861
+ "name": "x",
1862
+ "required": true,
1863
+ "type": "number"
1864
+ },
1865
+ {
1866
+ "name": "y",
1867
+ "required": true,
1868
+ "type": "number"
1869
+ }
1870
+ ],
1871
+ "tier": "domain"
1872
+ },
1873
+ {
1874
+ "description": "Win/lose resolution from the objective-flow gate; guarded by celebrated so it lands once",
1875
+ "id": "evt_01M0H2T3N383RH1ZW70N6NDBN2",
1876
+ "key": "GAME_END",
1877
+ "name": "Game End",
1878
+ "payloadSchema": [
1879
+ {
1880
+ "name": "result",
1881
+ "required": true,
1882
+ "type": "string"
1883
+ }
1884
+ ],
1885
+ "tier": "domain"
1886
+ },
1887
+ {
1888
+ "description": "End-overlay restart button; reseeds score/lives/objectives and broadcasts RESTART",
1889
+ "id": "evt_01M0H2T3N3RYAEFY55899894FC",
1890
+ "key": "PLAY_AGAIN",
1891
+ "name": "Play Again",
1892
+ "payloadSchema": [
1893
+ {
1894
+ "name": "id",
1895
+ "type": "string"
1896
+ }
1897
+ ],
1898
+ "tier": "domain"
1899
+ },
1900
+ {
1901
+ "description": "Renamed STEER consumed by the platformer-body authority: −1/0/+1 × moveSpeed horizontal velocity",
1902
+ "id": "evt_01M0H2T3N3FNG6B5DWTEVX37AE",
1903
+ "key": "PLAT_STEER",
1904
+ "name": "Plat Steer",
1905
+ "payloadSchema": [
1906
+ {
1907
+ "name": "dir",
1908
+ "required": true,
1909
+ "type": "number"
1910
+ }
1911
+ ],
1912
+ "tier": "domain"
1913
+ },
1914
+ {
1915
+ "description": "Renamed JUMP consumed by the platformer-body authority (grounded-gated vertical kick)",
1916
+ "id": "evt_01M0H2T3N32XKD82R2F65GG7Z1",
1917
+ "key": "PLAT_JUMP",
1918
+ "name": "Plat Jump",
1919
+ "payloadSchema": [
1920
+ {
1921
+ "name": "id",
1922
+ "type": "string"
1923
+ }
1924
+ ],
1925
+ "tier": "domain"
1926
+ },
1927
+ {
1928
+ "description": "Renamed PLACE consumed by the platformer-body authority; hazard/pit respawn teleport",
1929
+ "id": "evt_01M0H2T3N39MHVHB1XPWSEQHME",
1930
+ "key": "PLAT_PLACE",
1931
+ "name": "Plat Place",
1932
+ "payloadSchema": [
1933
+ {
1934
+ "name": "x",
1935
+ "required": true,
1936
+ "type": "number"
1937
+ },
1938
+ {
1939
+ "name": "y",
1940
+ "required": true,
1941
+ "type": "number"
1942
+ }
1943
+ ],
1944
+ "tier": "domain"
1945
+ },
1946
+ {
1947
+ "description": "Floating-text particle batch spawned on score/damage; fx-particles fades it",
1948
+ "id": "evt_01M0H2T3N350892H1162B1XNWH",
1949
+ "key": "BURST",
1950
+ "name": "Burst",
1951
+ "payloadSchema": [
1952
+ {
1953
+ "name": "particles",
1954
+ "type": "[Fx]"
1955
+ }
1956
+ ],
1957
+ "tier": "domain"
1958
+ },
1959
+ {
1960
+ "description": "Sparse win/lose signal consumed by the objective-flow gate: objectivesLeft 0 = won, movesLeft 0 = lost",
1961
+ "id": "evt_01M0H2T3N3XDGAZ296T4NM7Y7G",
1962
+ "key": "PROGRESS",
1963
+ "name": "Progress",
1964
+ "payloadSchema": [
1965
+ {
1966
+ "name": "objectivesLeft",
1967
+ "required": true,
1968
+ "type": "number"
1969
+ },
1970
+ {
1971
+ "name": "movesLeft",
1972
+ "required": true,
1973
+ "type": "number"
1974
+ }
1975
+ ],
1976
+ "tier": "domain"
1977
+ },
1978
+ {
1979
+ "description": "Broadcast reset consumed by the platformer-body and objective-flow authorities on INIT/PLAY_AGAIN",
1980
+ "id": "evt_01M0H2T3N3FV92BZD70AGMW6HQ",
1981
+ "key": "RESTART",
1982
+ "name": "Restart",
1983
+ "payloadSchema": [
1984
+ {
1985
+ "name": "id",
1986
+ "type": "string"
1987
+ }
1988
+ ],
1989
+ "tier": "domain"
1990
+ }
1991
+ ],
1992
+ "states": [
1993
+ {
1994
+ "isInitial": true,
1995
+ "name": "playing"
1996
+ }
1997
+ ],
1998
+ "transitions": [
1999
+ {
2000
+ "effects": [
2001
+ [
2002
+ "set",
2003
+ "@entity.score",
2004
+ 0.0
2005
+ ],
2006
+ [
2007
+ "set",
2008
+ "@entity.lives",
2009
+ "@config.startLives"
2010
+ ],
2011
+ [
2012
+ "set",
2013
+ "@entity.objectivesLeft",
2014
+ 1.0
2015
+ ],
2016
+ [
2017
+ "set",
2018
+ "@entity.celebrated",
2019
+ false
2020
+ ],
2021
+ [
2022
+ "emit",
2023
+ "RESTART",
2024
+ {
2025
+ "id": "board"
2026
+ }
2027
+ ],
2028
+ [
2029
+ "render-ui",
2030
+ "main",
2031
+ {
2032
+ "backgroundAsset": "@config.backgroundAsset",
2033
+ "children": [
2034
+ {
2035
+ "backgroundColor": "@config.bgColor",
2036
+ "backgroundImage": "@config.backgroundImage",
2037
+ "camera": {
2038
+ "mode": "follow",
2039
+ "pos": {
2040
+ "x": [
2041
+ "/",
2042
+ "@config.worldWidth",
2043
+ 2.0
2044
+ ],
2045
+ "y": [
2046
+ "/",
2047
+ "@config.worldHeight",
2048
+ 2.0
2049
+ ]
2050
+ },
2051
+ "target": {
2052
+ "x": "@entity.body.x",
2053
+ "y": "@entity.body.y"
2054
+ },
2055
+ "zoom": 1.0
2056
+ },
2057
+ "drawables": [
2058
+ {
2059
+ "items": [
2060
+ "array/map",
2061
+ "@config.platforms",
2062
+ [
2063
+ "fn",
2064
+ "p",
2065
+ {
2066
+ "asset": [
2067
+ "object/get",
2068
+ "@config.tileSprites",
2069
+ [
2070
+ "object/get",
2071
+ "@p",
2072
+ "type"
2073
+ ]
2074
+ ],
2075
+ "height": [
2076
+ "object/get",
2077
+ "@p",
2078
+ "height"
2079
+ ],
2080
+ "position": {
2081
+ "x": [
2082
+ "object/get",
2083
+ "@p",
2084
+ "x"
2085
+ ],
2086
+ "y": [
2087
+ "object/get",
2088
+ "@p",
2089
+ "y"
2090
+ ]
2091
+ },
2092
+ "type": "draw-sprite",
2093
+ "width": [
2094
+ "object/get",
2095
+ "@p",
2096
+ "width"
2097
+ ]
2098
+ }
2099
+ ]
2100
+ ],
2101
+ "type": "draw-sprite-layer"
2102
+ },
2103
+ {
2104
+ "items": [
2105
+ [
2106
+ "object/merge",
2107
+ {
2108
+ "flipX": [
2109
+ "not",
2110
+ "@entity.body.facingRight"
2111
+ ],
2112
+ "frame": "@entity.frame",
2113
+ "height": "@entity.body.height",
2114
+ "position": {
2115
+ "x": "@entity.body.x",
2116
+ "y": "@entity.body.y"
2117
+ },
2118
+ "type": "draw-sprite",
2119
+ "width": "@entity.body.width"
2120
+ },
2121
+ {
2122
+ "asset": [
2123
+ "object/merge",
2124
+ "@config.playerSprite",
2125
+ {
2126
+ "sprite": [
2127
+ "if",
2128
+ "@entity.body.grounded",
2129
+ [
2130
+ "if",
2131
+ [
2132
+ "!=",
2133
+ "@entity.body.vx",
2134
+ 0.0
2135
+ ],
2136
+ [
2137
+ "if",
2138
+ [
2139
+ "==",
2140
+ [
2141
+ "%",
2142
+ "@entity.frame",
2143
+ 2.0
2144
+ ],
2145
+ 0.0
2146
+ ],
2147
+ "adventurer_walk1.png",
2148
+ "adventurer_walk2.png"
2149
+ ],
2150
+ "adventurer_idle.png"
2151
+ ],
2152
+ "adventurer_jump.png"
2153
+ ]
2154
+ }
2155
+ ]
2156
+ }
2157
+ ]
2158
+ ],
2159
+ "type": "draw-sprite-layer"
2160
+ },
2161
+ {
2162
+ "items": "@entity.fx",
2163
+ "presets": "@config.fxPresets",
2164
+ "tickMs": 500.0,
2165
+ "type": "draw-fx-layer"
2166
+ }
2167
+ ],
2168
+ "keyMap": {
2169
+ "ArrowLeft": "LEFT",
2170
+ "ArrowRight": "RIGHT",
2171
+ "ArrowUp": "JUMP",
2172
+ "KeyA": "LEFT",
2173
+ "KeyD": "RIGHT",
2174
+ "KeyW": "JUMP",
2175
+ "Space": "JUMP"
2176
+ },
2177
+ "keyUpMap": {
2178
+ "ArrowLeft": "STOP",
2179
+ "ArrowRight": "STOP",
2180
+ "KeyA": "STOP",
2181
+ "KeyD": "STOP"
2182
+ },
2183
+ "projection": "side",
2184
+ "type": "canvas",
2185
+ "worldHeight": "@config.worldHeight",
2186
+ "worldWidth": "@config.worldWidth"
2187
+ }
2188
+ ],
2189
+ "hud": {
2190
+ "children": [
2191
+ {
2192
+ "stats": [
2193
+ {
2194
+ "label": "Score",
2195
+ "value": "@entity.score"
2196
+ },
2197
+ {
2198
+ "label": "Lives",
2199
+ "value": "@entity.lives"
2200
+ }
2201
+ ],
2202
+ "type": "game-hud"
2203
+ },
2204
+ {
2205
+ "directionAssets": "@config.directionAssets",
2206
+ "directionEvents": {
2207
+ "left": "LEFT",
2208
+ "right": "RIGHT",
2209
+ "up": "JUMP"
2210
+ },
2211
+ "directionReleaseEvents": {
2212
+ "left": "STOP",
2213
+ "right": "STOP"
2214
+ },
2215
+ "kind": "dpad",
2216
+ "type": "control-grid"
2217
+ }
2218
+ ],
2219
+ "direction": "horizontal",
2220
+ "gap": "md",
2221
+ "justify": "between",
2222
+ "type": "stack"
2223
+ },
2224
+ "hudBackgroundAsset": "@config.hudBackgroundAsset",
2225
+ "overlay": [
2226
+ "if",
2227
+ [
2228
+ "==",
2229
+ "@entity.result",
2230
+ "won"
2231
+ ],
2232
+ {
2233
+ "options": [
2234
+ {
2235
+ "event": "PLAY_AGAIN",
2236
+ "id": "again",
2237
+ "label": "Play Again",
2238
+ "variant": "primary"
2239
+ }
2240
+ ],
2241
+ "subtitle": [
2242
+ "str/concat",
2243
+ "Score: ",
2244
+ "@entity.score"
2245
+ ],
2246
+ "title": "@config.clearTitle",
2247
+ "type": "game-menu"
2248
+ },
2249
+ [
2250
+ "if",
2251
+ [
2252
+ "==",
2253
+ "@entity.result",
2254
+ "lost"
2255
+ ],
2256
+ {
2257
+ "options": [
2258
+ {
2259
+ "event": "PLAY_AGAIN",
2260
+ "id": "again",
2261
+ "label": "Play Again",
2262
+ "variant": "primary"
2263
+ }
2264
+ ],
2265
+ "subtitle": [
2266
+ "str/concat",
2267
+ "Score: ",
2268
+ "@entity.score"
2269
+ ],
2270
+ "title": "@config.lostTitle",
2271
+ "type": "game-menu"
2272
+ },
2273
+ null
2274
+ ]
2275
+ ],
2276
+ "type": "game-shell"
2277
+ }
2278
+ ]
2279
+ ],
2280
+ "event": "INIT",
2281
+ "eventId": "evt_01M0H2T3N35WQGCGWB08FSKZMX",
2282
+ "from": "playing",
2283
+ "to": "playing"
2284
+ },
2285
+ {
2286
+ "effects": [
2287
+ [
2288
+ "emit",
2289
+ "PLAT_STEER",
2290
+ {
2291
+ "dir": -1.0
2292
+ }
2293
+ ]
2294
+ ],
2295
+ "event": "LEFT",
2296
+ "eventId": "evt_01M0H2T3N3HNRAWXHBSWEV52CY",
2297
+ "from": "playing",
2298
+ "guard": [
2299
+ "==",
2300
+ "@entity.result",
2301
+ "none"
2302
+ ],
2303
+ "to": "playing"
2304
+ },
2305
+ {
2306
+ "effects": [
2307
+ [
2308
+ "emit",
2309
+ "PLAT_STEER",
2310
+ {
2311
+ "dir": 1.0
2312
+ }
2313
+ ]
2314
+ ],
2315
+ "event": "RIGHT",
2316
+ "eventId": "evt_01M0H2T3N37KB0PPF7P5GSCDH7",
2317
+ "from": "playing",
2318
+ "guard": [
2319
+ "==",
2320
+ "@entity.result",
2321
+ "none"
2322
+ ],
2323
+ "to": "playing"
2324
+ },
2325
+ {
2326
+ "effects": [
2327
+ [
2328
+ "emit",
2329
+ "PLAT_STEER",
2330
+ {
2331
+ "dir": 0.0
2332
+ }
2333
+ ]
2334
+ ],
2335
+ "event": "STOP",
2336
+ "eventId": "evt_01M0H2T3N357RAZYHQ14G3NSVX",
2337
+ "from": "playing",
2338
+ "guard": [
2339
+ "==",
2340
+ "@entity.result",
2341
+ "none"
2342
+ ],
2343
+ "to": "playing"
2344
+ },
2345
+ {
2346
+ "effects": [
2347
+ [
2348
+ "emit",
2349
+ "PLAT_JUMP",
2350
+ {}
2351
+ ]
2352
+ ],
2353
+ "event": "JUMP",
2354
+ "eventId": "evt_01M0H2T3N3WSCKCXRC5BA77FRP",
2355
+ "from": "playing",
2356
+ "guard": [
2357
+ "==",
2358
+ "@entity.result",
2359
+ "none"
2360
+ ],
2361
+ "to": "playing"
2362
+ },
2363
+ {
2364
+ "effects": [
2365
+ [
2366
+ "set",
2367
+ "@entity.score",
2368
+ [
2369
+ "+",
2370
+ "@entity.score",
2371
+ "@config.goalScore"
2372
+ ]
2373
+ ],
2374
+ [
2375
+ "set",
2376
+ "@entity.objectivesLeft",
2377
+ 0.0
2378
+ ],
2379
+ [
2380
+ "emit",
2381
+ "BURST",
2382
+ {
2383
+ "particles": [
2384
+ "array/map",
2385
+ [
2386
+ "array/filter",
2387
+ "@config.platforms",
2388
+ [
2389
+ "fn",
2390
+ "p",
2391
+ [
2392
+ "==",
2393
+ [
2394
+ "object/get",
2395
+ "@p",
2396
+ "id",
2397
+ ""
2398
+ ],
2399
+ "@payload.id"
2400
+ ]
2401
+ ]
2402
+ ],
2403
+ [
2404
+ "fn",
2405
+ "p",
2406
+ {
2407
+ "id": [
2408
+ "str/concat",
2409
+ "fx-goal-",
2410
+ "@payload.id"
2411
+ ],
2412
+ "message": [
2413
+ "str/concat",
2414
+ "+",
2415
+ "@config.goalScore"
2416
+ ],
2417
+ "ttl": 3.0,
2418
+ "type": "score",
2419
+ "x": "@payload.x",
2420
+ "z": "@payload.y"
2421
+ }
2422
+ ]
2423
+ ]
2424
+ }
2425
+ ],
2426
+ [
2427
+ "emit",
2428
+ "PROGRESS",
2429
+ {
2430
+ "movesLeft": "@entity.lives",
2431
+ "objectivesLeft": 0.0
2432
+ }
2433
+ ]
2434
+ ],
2435
+ "event": "PLAT_GOAL",
2436
+ "eventId": "evt_01M0H2T3N3Q94EVFACFK9HS163",
2437
+ "from": "playing",
2438
+ "guard": [
2439
+ "==",
2440
+ "@entity.result",
2441
+ "none"
2442
+ ],
2443
+ "to": "playing"
2444
+ },
2445
+ {
2446
+ "effects": [
2447
+ [
2448
+ "if",
2449
+ [
2450
+ "<=",
2451
+ [
2452
+ "-",
2453
+ "@entity.lives",
2454
+ 1.0
2455
+ ],
2456
+ 0.0
2457
+ ],
2458
+ [
2459
+ "do",
2460
+ [
2461
+ "set",
2462
+ "@entity.lives",
2463
+ 0.0
2464
+ ],
2465
+ [
2466
+ "emit",
2467
+ "PROGRESS",
2468
+ {
2469
+ "movesLeft": 0.0,
2470
+ "objectivesLeft": 1.0
2471
+ }
2472
+ ]
2473
+ ],
2474
+ [
2475
+ "do",
2476
+ [
2477
+ "set",
2478
+ "@entity.lives",
2479
+ [
2480
+ "-",
2481
+ "@entity.lives",
2482
+ 1.0
2483
+ ]
2484
+ ],
2485
+ [
2486
+ "emit",
2487
+ "BURST",
2488
+ {
2489
+ "particles": [
2490
+ "array/map",
2491
+ [
2492
+ "array/filter",
2493
+ "@config.platforms",
2494
+ [
2495
+ "fn",
2496
+ "p",
2497
+ [
2498
+ "==",
2499
+ [
2500
+ "object/get",
2501
+ "@p",
2502
+ "id",
2503
+ ""
2504
+ ],
2505
+ "@payload.id"
2506
+ ]
2507
+ ]
2508
+ ],
2509
+ [
2510
+ "fn",
2511
+ "p",
2512
+ {
2513
+ "id": [
2514
+ "str/concat",
2515
+ "fx-hazard-",
2516
+ "@payload.id"
2517
+ ],
2518
+ "message": "-1",
2519
+ "ttl": 3.0,
2520
+ "type": "damage",
2521
+ "x": "@payload.x",
2522
+ "z": "@payload.y"
2523
+ }
2524
+ ]
2525
+ ]
2526
+ }
2527
+ ],
2528
+ [
2529
+ "emit",
2530
+ "PLAT_PLACE",
2531
+ {
2532
+ "x": "@config.respawnX",
2533
+ "y": "@config.respawnY"
2534
+ }
2535
+ ]
2536
+ ]
2537
+ ]
2538
+ ],
2539
+ "event": "PLAT_HAZARD",
2540
+ "eventId": "evt_01M0H2T3N3VBRGNCRS0ZNYBFHR",
2541
+ "from": "playing",
2542
+ "guard": [
2543
+ "==",
2544
+ "@entity.result",
2545
+ "none"
2546
+ ],
2547
+ "to": "playing"
2548
+ },
2549
+ {
2550
+ "effects": [
2551
+ [
2552
+ "if",
2553
+ [
2554
+ "<=",
2555
+ [
2556
+ "-",
2557
+ "@entity.lives",
2558
+ 1.0
2559
+ ],
2560
+ 0.0
2561
+ ],
2562
+ [
2563
+ "do",
2564
+ [
2565
+ "set",
2566
+ "@entity.lives",
2567
+ 0.0
2568
+ ],
2569
+ [
2570
+ "emit",
2571
+ "PROGRESS",
2572
+ {
2573
+ "movesLeft": 0.0,
2574
+ "objectivesLeft": 1.0
2575
+ }
2576
+ ]
2577
+ ],
2578
+ [
2579
+ "do",
2580
+ [
2581
+ "set",
2582
+ "@entity.lives",
2583
+ [
2584
+ "-",
2585
+ "@entity.lives",
2586
+ 1.0
2587
+ ]
2588
+ ],
2589
+ [
2590
+ "emit",
2591
+ "BURST",
2592
+ {
2593
+ "particles": [
2594
+ "array/map",
2595
+ [
2596
+ "fx-fell"
2597
+ ],
2598
+ [
2599
+ "fn",
2600
+ "fid",
2601
+ {
2602
+ "id": "@fid",
2603
+ "message": "-1",
2604
+ "ttl": 3.0,
2605
+ "type": "damage",
2606
+ "x": "@payload.x",
2607
+ "z": "@config.worldHeight"
2608
+ }
2609
+ ]
2610
+ ]
2611
+ }
2612
+ ],
2613
+ [
2614
+ "emit",
2615
+ "PLAT_PLACE",
2616
+ {
2617
+ "x": "@config.respawnX",
2618
+ "y": "@config.respawnY"
2619
+ }
2620
+ ]
2621
+ ]
2622
+ ]
2623
+ ],
2624
+ "event": "PLAT_FELL",
2625
+ "eventId": "evt_01M0H2T3N3J4Q0Y8CVECMS15F7",
2626
+ "from": "playing",
2627
+ "guard": [
2628
+ "==",
2629
+ "@entity.result",
2630
+ "none"
2631
+ ],
2632
+ "to": "playing"
2633
+ },
2634
+ {
2635
+ "effects": [
2636
+ [
2637
+ "set",
2638
+ "@entity.celebrated",
2639
+ true
2640
+ ]
2641
+ ],
2642
+ "event": "GAME_END",
2643
+ "eventId": "evt_01M0H2T3N383RH1ZW70N6NDBN2",
2644
+ "from": "playing",
2645
+ "guard": [
2646
+ "==",
2647
+ "@entity.celebrated",
2648
+ false
2649
+ ],
2650
+ "to": "playing"
2651
+ },
2652
+ {
2653
+ "effects": [
2654
+ [
2655
+ "set",
2656
+ "@entity.score",
2657
+ 0.0
2658
+ ],
2659
+ [
2660
+ "set",
2661
+ "@entity.lives",
2662
+ "@config.startLives"
2663
+ ],
2664
+ [
2665
+ "set",
2666
+ "@entity.objectivesLeft",
2667
+ 1.0
2668
+ ],
2669
+ [
2670
+ "set",
2671
+ "@entity.celebrated",
2672
+ false
2673
+ ],
2674
+ [
2675
+ "emit",
2676
+ "RESTART",
2677
+ {
2678
+ "id": "board"
2679
+ }
2680
+ ]
2681
+ ],
2682
+ "event": "PLAY_AGAIN",
2683
+ "eventId": "evt_01M0H2T3N3RYAEFY55899894FC",
2684
+ "from": "playing",
2685
+ "to": "playing"
2686
+ }
2687
+ ]
2688
+ },
2689
+ "ticks": [
2690
+ {
2691
+ "effects": [
2692
+ [
2693
+ "set",
2694
+ "@entity.frame",
2695
+ [
2696
+ "%",
2697
+ [
2698
+ "+",
2699
+ "@entity.frame",
2700
+ 1.0
2701
+ ],
2702
+ 8.0
2703
+ ]
2704
+ ],
2705
+ [
2706
+ "render-ui",
2707
+ "main",
2708
+ {
2709
+ "backgroundAsset": "@config.backgroundAsset",
2710
+ "children": [
2711
+ {
2712
+ "backgroundColor": "@config.bgColor",
2713
+ "backgroundImage": "@config.backgroundImage",
2714
+ "camera": {
2715
+ "mode": "follow",
2716
+ "pos": {
2717
+ "x": [
2718
+ "/",
2719
+ "@config.worldWidth",
2720
+ 2.0
2721
+ ],
2722
+ "y": [
2723
+ "/",
2724
+ "@config.worldHeight",
2725
+ 2.0
2726
+ ]
2727
+ },
2728
+ "target": {
2729
+ "x": "@entity.body.x",
2730
+ "y": "@entity.body.y"
2731
+ },
2732
+ "zoom": 1.0
2733
+ },
2734
+ "drawables": [
2735
+ {
2736
+ "items": [
2737
+ "array/map",
2738
+ "@config.platforms",
2739
+ [
2740
+ "fn",
2741
+ "p",
2742
+ {
2743
+ "asset": [
2744
+ "object/get",
2745
+ "@config.tileSprites",
2746
+ [
2747
+ "object/get",
2748
+ "@p",
2749
+ "type"
2750
+ ]
2751
+ ],
2752
+ "height": [
2753
+ "object/get",
2754
+ "@p",
2755
+ "height"
2756
+ ],
2757
+ "position": {
2758
+ "x": [
2759
+ "object/get",
2760
+ "@p",
2761
+ "x"
2762
+ ],
2763
+ "y": [
2764
+ "object/get",
2765
+ "@p",
2766
+ "y"
2767
+ ]
2768
+ },
2769
+ "type": "draw-sprite",
2770
+ "width": [
2771
+ "object/get",
2772
+ "@p",
2773
+ "width"
2774
+ ]
2775
+ }
2776
+ ]
2777
+ ],
2778
+ "type": "draw-sprite-layer"
2779
+ },
2780
+ {
2781
+ "items": [
2782
+ [
2783
+ "object/merge",
2784
+ {
2785
+ "flipX": [
2786
+ "not",
2787
+ "@entity.body.facingRight"
2788
+ ],
2789
+ "frame": "@entity.frame",
2790
+ "height": "@entity.body.height",
2791
+ "position": {
2792
+ "x": "@entity.body.x",
2793
+ "y": "@entity.body.y"
2794
+ },
2795
+ "type": "draw-sprite",
2796
+ "width": "@entity.body.width"
2797
+ },
2798
+ {
2799
+ "asset": [
2800
+ "object/merge",
2801
+ "@config.playerSprite",
2802
+ {
2803
+ "sprite": [
2804
+ "if",
2805
+ "@entity.body.grounded",
2806
+ [
2807
+ "if",
2808
+ [
2809
+ "!=",
2810
+ "@entity.body.vx",
2811
+ 0.0
2812
+ ],
2813
+ [
2814
+ "if",
2815
+ [
2816
+ "==",
2817
+ [
2818
+ "%",
2819
+ "@entity.frame",
2820
+ 2.0
2821
+ ],
2822
+ 0.0
2823
+ ],
2824
+ "adventurer_walk1.png",
2825
+ "adventurer_walk2.png"
2826
+ ],
2827
+ "adventurer_idle.png"
2828
+ ],
2829
+ "adventurer_jump.png"
2830
+ ]
2831
+ }
2832
+ ]
2833
+ }
2834
+ ]
2835
+ ],
2836
+ "type": "draw-sprite-layer"
2837
+ },
2838
+ {
2839
+ "items": "@entity.fx",
2840
+ "presets": "@config.fxPresets",
2841
+ "tickMs": 500.0,
2842
+ "type": "draw-fx-layer"
2843
+ }
2844
+ ],
2845
+ "keyMap": {
2846
+ "ArrowLeft": "LEFT",
2847
+ "ArrowRight": "RIGHT",
2848
+ "ArrowUp": "JUMP",
2849
+ "KeyA": "LEFT",
2850
+ "KeyD": "RIGHT",
2851
+ "KeyW": "JUMP",
2852
+ "Space": "JUMP"
2853
+ },
2854
+ "keyUpMap": {
2855
+ "ArrowLeft": "STOP",
2856
+ "ArrowRight": "STOP",
2857
+ "KeyA": "STOP",
2858
+ "KeyD": "STOP"
2859
+ },
2860
+ "projection": "side",
2861
+ "type": "canvas",
2862
+ "worldHeight": "@config.worldHeight",
2863
+ "worldWidth": "@config.worldWidth"
2864
+ }
2865
+ ],
2866
+ "hud": {
2867
+ "children": [
2868
+ {
2869
+ "stats": [
2870
+ {
2871
+ "label": "Score",
2872
+ "value": "@entity.score"
2873
+ },
2874
+ {
2875
+ "label": "Lives",
2876
+ "value": "@entity.lives"
2877
+ }
2878
+ ],
2879
+ "type": "game-hud"
2880
+ },
2881
+ {
2882
+ "directionAssets": "@config.directionAssets",
2883
+ "directionEvents": {
2884
+ "left": "LEFT",
2885
+ "right": "RIGHT",
2886
+ "up": "JUMP"
2887
+ },
2888
+ "directionReleaseEvents": {
2889
+ "left": "STOP",
2890
+ "right": "STOP"
2891
+ },
2892
+ "kind": "dpad",
2893
+ "type": "control-grid"
2894
+ }
2895
+ ],
2896
+ "direction": "horizontal",
2897
+ "gap": "md",
2898
+ "justify": "between",
2899
+ "type": "stack"
2900
+ },
2901
+ "hudBackgroundAsset": "@config.hudBackgroundAsset",
2902
+ "overlay": [
2903
+ "if",
2904
+ [
2905
+ "==",
2906
+ "@entity.result",
2907
+ "won"
2908
+ ],
2909
+ {
2910
+ "options": [
2911
+ {
2912
+ "event": "PLAY_AGAIN",
2913
+ "id": "again",
2914
+ "label": "Play Again",
2915
+ "variant": "primary"
2916
+ }
2917
+ ],
2918
+ "subtitle": [
2919
+ "str/concat",
2920
+ "Score: ",
2921
+ "@entity.score"
2922
+ ],
2923
+ "title": "@config.clearTitle",
2924
+ "type": "game-menu"
2925
+ },
2926
+ [
2927
+ "if",
2928
+ [
2929
+ "==",
2930
+ "@entity.result",
2931
+ "lost"
2932
+ ],
2933
+ {
2934
+ "options": [
2935
+ {
2936
+ "event": "PLAY_AGAIN",
2937
+ "id": "again",
2938
+ "label": "Play Again",
2939
+ "variant": "primary"
2940
+ }
2941
+ ],
2942
+ "subtitle": [
2943
+ "str/concat",
2944
+ "Score: ",
2945
+ "@entity.score"
2946
+ ],
2947
+ "title": "@config.lostTitle",
2948
+ "type": "game-menu"
2949
+ },
2950
+ null
2951
+ ]
2952
+ ],
2953
+ "type": "game-shell"
2954
+ }
2955
+ ]
2956
+ ],
2957
+ "interval": 100.0,
2958
+ "name": "renderTick"
2959
+ }
2960
+ ]
2961
+ }
2962
+ ],
2963
+ "uses": [
2964
+ {
2965
+ "as": "Body",
2966
+ "from": "std/behaviors/std-platformer-body"
2967
+ },
2968
+ {
2969
+ "as": "Particles",
2970
+ "from": "std/behaviors/std-fx-particles"
2971
+ },
2972
+ {
2973
+ "as": "Gate",
2974
+ "from": "std/behaviors/std-objective-flow"
2975
+ }
2976
+ ]
2977
+ }
2978
+ ],
2979
+ "schemaVersion": 1,
2980
+ "version": "1.0.0"
2981
+ }