@almadar/std 16.203.0 → 16.205.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 (43) hide show
  1. package/behaviors/lolo/ui/game/atoms/std-choice-gate.lolo +1 -1
  2. package/behaviors/lolo/ui/game/atoms/std-fx-narrative.lolo +1 -1
  3. package/behaviors/lolo/ui/game/atoms/std-fx-particles.lolo +1 -1
  4. package/behaviors/lolo/ui/game/atoms/std-gate-lock.lolo +1 -1
  5. package/behaviors/lolo/ui/game/atoms/std-lives.lolo +1 -1
  6. package/behaviors/lolo/ui/game/atoms/std-loop-lock.lolo +1 -1
  7. package/behaviors/lolo/ui/game/atoms/std-objective-flow.lolo +1 -1
  8. package/behaviors/lolo/ui/game/atoms/std-pad-lock.lolo +1 -1
  9. package/behaviors/lolo/ui/game/atoms/std-patrol-hazard.lolo +1 -1
  10. package/behaviors/lolo/ui/game/atoms/std-pickup.lolo +1 -1
  11. package/behaviors/lolo/ui/game/atoms/std-platformer-body.lolo +1 -1
  12. package/behaviors/lolo/ui/game/atoms/std-tutorial-overlay.lolo +1 -1
  13. package/behaviors/lolo/ui/game/atoms/std-velocity-gate.lolo +1 -1
  14. package/behaviors/lolo/ui/game/organisms/std-platformer-puzzle.lolo +302 -0
  15. package/behaviors/registry/ui/game/atoms/std-choice-gate.orb +82 -2
  16. package/behaviors/registry/ui/game/atoms/std-fx-narrative.orb +1 -1
  17. package/behaviors/registry/ui/game/atoms/std-fx-particles.orb +82 -2
  18. package/behaviors/registry/ui/game/atoms/std-gate-lock.orb +48 -2
  19. package/behaviors/registry/ui/game/atoms/std-lives.orb +26 -2
  20. package/behaviors/registry/ui/game/atoms/std-loop-lock.orb +56 -2
  21. package/behaviors/registry/ui/game/atoms/std-objective-flow.orb +1 -1
  22. package/behaviors/registry/ui/game/atoms/std-pad-lock.orb +30 -2
  23. package/behaviors/registry/ui/game/atoms/std-patrol-hazard.orb +63 -2
  24. package/behaviors/registry/ui/game/atoms/std-pickup.orb +1 -1
  25. package/behaviors/registry/ui/game/atoms/std-platformer-body.orb +1 -1
  26. package/behaviors/registry/ui/game/atoms/std-tutorial-overlay.orb +24 -2
  27. package/behaviors/registry/ui/game/atoms/std-velocity-gate.orb +75 -2
  28. package/behaviors/registry/ui/game/organisms/std-platformer-puzzle.orb +2063 -0
  29. package/dist/behaviors/exports-reader.js +1235 -0
  30. package/dist/behaviors/functions/index.d.ts +115 -14
  31. package/dist/behaviors/functions/index.js +1232 -1
  32. package/dist/behaviors/index.d.ts +1 -1
  33. package/dist/behaviors/index.js +1236 -1
  34. package/dist/behaviors/query.js +1235 -0
  35. package/dist/behaviors-embeddings.hash.json +3 -3
  36. package/dist/behaviors-embeddings.json +29 -25
  37. package/dist/behaviors-registry.json +1805 -17
  38. package/dist/index.d.ts +1 -1
  39. package/dist/index.js +1236 -1
  40. package/dist/knob-embeddings.hash.json +3 -3
  41. package/dist/knob-embeddings.json +1 -1
  42. package/dist/registry/factory-signatures.json +1 -1
  43. package/package.json +2 -2
@@ -1,13 +1,13 @@
1
1
  {
2
- "$generated": "2026-09-04T04:56:15.851Z",
2
+ "$generated": "2026-09-04T12:00:35.866Z",
3
3
  "$source": "tools/almadar-pattern-sync/behaviors",
4
4
  "$package": "@almadar/std",
5
- "totalBehaviors": 461,
5
+ "totalBehaviors": 462,
6
6
  "atoms": 298,
7
7
  "molecules": 111,
8
- "organisms": 52,
8
+ "organisms": 53,
9
9
  "layers": {
10
- "UI Patterns": 448,
10
+ "UI Patterns": 449,
11
11
  "ML": 13
12
12
  },
13
13
  "behaviors": {
@@ -145237,6 +145237,7 @@
145237
145237
  "std-pickup",
145238
145238
  "std-platformer-board-2d",
145239
145239
  "std-platformer-body",
145240
+ "std-platformer-puzzle",
145240
145241
  "std-pong",
145241
145242
  "std-pong-rally",
145242
145243
  "std-production",
@@ -145555,6 +145556,7 @@
145555
145556
  "std-pickup",
145556
145557
  "std-platformer-board-2d",
145557
145558
  "std-platformer-body",
145559
+ "std-platformer-puzzle",
145558
145560
  "std-pong",
145559
145561
  "std-pong-rally",
145560
145562
  "std-production",
@@ -145904,6 +145906,7 @@
145904
145906
  "std-pickup",
145905
145907
  "std-platformer-board-2d",
145906
145908
  "std-platformer-body",
145909
+ "std-platformer-puzzle",
145907
145910
  "std-pong",
145908
145911
  "std-pong-rally",
145909
145912
  "std-production",
@@ -146271,6 +146274,7 @@
146271
146274
  "std-pickup",
146272
146275
  "std-platformer-board-2d",
146273
146276
  "std-platformer-body",
146277
+ "std-platformer-puzzle",
146274
146278
  "std-pong",
146275
146279
  "std-pong-rally",
146276
146280
  "std-production",
@@ -146698,6 +146702,7 @@
146698
146702
  "std-pickup",
146699
146703
  "std-platformer-board-2d",
146700
146704
  "std-platformer-body",
146705
+ "std-platformer-puzzle",
146701
146706
  "std-pong",
146702
146707
  "std-pong-rally",
146703
146708
  "std-production",
@@ -147107,6 +147112,7 @@
147107
147112
  "std-pickup",
147108
147113
  "std-platformer-board-2d",
147109
147114
  "std-platformer-body",
147115
+ "std-platformer-puzzle",
147110
147116
  "std-pong-rally",
147111
147117
  "std-production",
147112
147118
  "std-round-flow",
@@ -147398,7 +147404,7 @@
147398
147404
  "topic": "ui/game",
147399
147405
  "family": "ui/game",
147400
147406
  "layer": "UI Patterns",
147401
- "description": "Headless choice-gate mechanic for side-view boards: a gate of N labeled option platforms where progress stops until the player commits to an answer. Listens BODY_MOVED and judges a gate when the player stands grounded on one of its option platforms (|dx| <= reachX of the option center, |dy| <= reachY of the gate's option plane — the pad-lock touch pattern): the correct option stamps the gate solved + chosen on the shared entity and emits CHOICE_CORRECT once (a solved gate never judges again, so the path stays open); a wrong option emits CHOICE_WRONG carrying the gate id, the chosen optionId, and the option's world position, so the board can bounce the player back and float the gate's hint (the board owns the bounce — the atom only reports). RESTART unsolves every gate. Renders nothing; boards draw the option platforms and labels from the shared entity (the render authority).",
147407
+ "description": "Headless choice-gate mechanic for side-view boards: a gate of N labeled option platforms where progress stops until the player commits to an answer. Listens BODY_MOVED and judges a gate when the player stands grounded on one of its option platforms (|dx| <= reachX of the option center, |dy| <= reachY of the gate's option plane — the pad-lock touch pattern): the correct option stamps the gate solved + chosen on the shared entity and emits CHOICE_CORRECT once (a solved gate never judges again, so the path stays open); a wrong option emits CHOICE_WRONG carrying the gate id, the chosen optionId, and the option's world position, so the board can bounce the player back and float the gate's hint (the board owns the bounce — the atom only reports). RESTART unsolves every gate. Renders nothing; boards draw the option platforms and labels from the shared entity (the render authority). Corresponds to the design-sheet field(s): challenge, agency.",
147402
147408
  "defaultOrbitalName": "ChoiceGateOrbital",
147403
147409
  "statePattern": "active",
147404
147410
  "complexity": {
@@ -147486,6 +147492,7 @@
147486
147492
  "std-pickup",
147487
147493
  "std-platformer-board-2d",
147488
147494
  "std-platformer-body",
147495
+ "std-platformer-puzzle",
147489
147496
  "std-pong",
147490
147497
  "std-pong-rally",
147491
147498
  "std-production",
@@ -147851,6 +147858,7 @@
147851
147858
  "std-pickup",
147852
147859
  "std-platformer-board-2d",
147853
147860
  "std-platformer-body",
147861
+ "std-platformer-puzzle",
147854
147862
  "std-pong",
147855
147863
  "std-pong-rally",
147856
147864
  "std-production",
@@ -148244,6 +148252,7 @@
148244
148252
  "std-pickup",
148245
148253
  "std-platformer-board-2d",
148246
148254
  "std-platformer-body",
148255
+ "std-platformer-puzzle",
148247
148256
  "std-pong",
148248
148257
  "std-pong-rally",
148249
148258
  "std-production",
@@ -148549,6 +148558,7 @@
148549
148558
  "std-pickup",
148550
148559
  "std-platformer-board-2d",
148551
148560
  "std-platformer-body",
148561
+ "std-platformer-puzzle",
148552
148562
  "std-pong",
148553
148563
  "std-pong-rally",
148554
148564
  "std-production",
@@ -148913,7 +148923,7 @@
148913
148923
  "topic": "ui/game",
148914
148924
  "family": "ui/game",
148915
148925
  "layer": "UI Patterns",
148916
- "description": "Headless pedagogy→fx translator for game boards and learning shells: turns high-level narrative events into big transient screen-space or world-space text effects consumed by std-fx-particles / fx-overlay. Levels emit NARRATE { text, style } and get a correctly styled, centered (or positioned) floating text burst without hand-rolling particle structs. Tutorials emit TUTORIAL_SHOW and the atom forwards SHOW to a composed std-tutorial-overlay trait. Renders nothing; centralizes the FX vocabulary so every level's teaching text looks and behaves the same.",
148926
+ "description": "Headless pedagogy→fx translator for game boards and learning shells: turns high-level narrative events into big transient screen-space or world-space text effects consumed by std-fx-particles / fx-overlay. Levels emit NARRATE { text, style } and get a correctly styled, centered (or positioned) floating text burst without hand-rolling particle structs. Tutorials emit TUTORIAL_SHOW and the atom forwards SHOW to a composed std-tutorial-overlay trait. Renders nothing; centralizes the FX vocabulary so every level's teaching text looks and behaves the same. Corresponds to the design-sheet field(s): feedback.",
148917
148927
  "defaultOrbitalName": "FxNarrativeOrbital",
148918
148928
  "statePattern": "active",
148919
148929
  "complexity": {
@@ -148989,6 +148999,7 @@
148989
148999
  "std-pickup",
148990
149000
  "std-platformer-board-2d",
148991
149001
  "std-platformer-body",
149002
+ "std-platformer-puzzle",
148992
149003
  "std-pong-rally",
148993
149004
  "std-production",
148994
149005
  "std-round-flow",
@@ -149227,7 +149238,7 @@
149227
149238
  "topic": "ui/game",
149228
149239
  "family": "ui/game",
149229
149240
  "layer": "UI Patterns",
149230
- "description": "Headless transient-fx mechanic serving BOTH game boards and learning shells: appends spawned particles on BURST — stamping maxTtl (fade envelope) and bornAt (epoch ms, smooth render interpolation) when absent — decays each entry's ttl every tick, drops the dead ones, and clears on RESTART. Name-blind mechanism: the effect-kind vocabulary is consumer-declared (FxPreset tables at the render call sites). Composed onto a [runtime, shared] entity; renders nothing — the board/shell owns the single render authority (draw-fx-layer for space \"world\", fx-overlay for space \"screen\").",
149241
+ "description": "Headless transient-fx mechanic serving BOTH game boards and learning shells: appends spawned particles on BURST — stamping maxTtl (fade envelope) and bornAt (epoch ms, smooth render interpolation) when absent — decays each entry's ttl every tick, drops the dead ones, and clears on RESTART. Name-blind mechanism: the effect-kind vocabulary is consumer-declared (FxPreset tables at the render call sites). Composed onto a [runtime, shared] entity; renders nothing — the board/shell owns the single render authority (draw-fx-layer for space \"world\", fx-overlay for space \"screen\"). Corresponds to the design-sheet field(s): feedback, rewards.",
149231
149242
  "defaultOrbitalName": "FxParticlesOrbital",
149232
149243
  "statePattern": "active",
149233
149244
  "complexity": {
@@ -149317,6 +149328,7 @@
149317
149328
  "std-pickup",
149318
149329
  "std-platformer-board-2d",
149319
149330
  "std-platformer-body",
149331
+ "std-platformer-puzzle",
149320
149332
  "std-pong",
149321
149333
  "std-pong-rally",
149322
149334
  "std-production",
@@ -149704,6 +149716,7 @@
149704
149716
  "std-pickup",
149705
149717
  "std-platformer-board-2d",
149706
149718
  "std-platformer-body",
149719
+ "std-platformer-puzzle",
149707
149720
  "std-pong",
149708
149721
  "std-pong-rally",
149709
149722
  "std-production",
@@ -149887,7 +149900,7 @@
149887
149900
  "topic": "ui/game",
149888
149901
  "family": "ui/game",
149889
149902
  "layer": "UI Patterns",
149890
- "description": "Headless collectible-gate mechanic: doors that stay shut until the player's collected total reaches their cost. Listens COLLECT (the board's running total — stars, coins, keys) and flips every door whose cost is met, stamping open on the shared door rows and emitting GATE_OPENED for the first newly opened door (the shared entity is the render authority for the rest). While a closed door's rect contains the player it emits GATE_BLOCKED once per approach — re-arming only after the player steps out — so the board can answer with a PLACE back and a locked fx. RESTART re-locks every door and zeroes the total. Renders nothing; boards draw closed doors as bars/walls and open ones as gaps.",
149903
+ "description": "Headless collectible-gate mechanic: doors that stay shut until the player's collected total reaches their cost. Listens COLLECT (the board's running total — stars, coins, keys) and flips every door whose cost is met, stamping open on the shared door rows and emitting GATE_OPENED for the first newly opened door (the shared entity is the render authority for the rest). While a closed door's rect contains the player it emits GATE_BLOCKED once per approach — re-arming only after the player steps out — so the board can answer with a PLACE back and a locked fx. RESTART re-locks every door and zeroes the total. Renders nothing; boards draw closed doors as bars/walls and open ones as gaps. Corresponds to the design-sheet field(s): challenge, rewards.",
149891
149904
  "defaultOrbitalName": "GateLockOrbital",
149892
149905
  "statePattern": "active",
149893
149906
  "complexity": {
@@ -149981,6 +149994,7 @@
149981
149994
  "std-pickup",
149982
149995
  "std-platformer-board-2d",
149983
149996
  "std-platformer-body",
149997
+ "std-platformer-puzzle",
149984
149998
  "std-pong",
149985
149999
  "std-pong-rally",
149986
150000
  "std-production",
@@ -150336,6 +150350,7 @@
150336
150350
  "std-pickup",
150337
150351
  "std-platformer-board-2d",
150338
150352
  "std-platformer-body",
150353
+ "std-platformer-puzzle",
150339
150354
  "std-pong",
150340
150355
  "std-pong-rally",
150341
150356
  "std-production",
@@ -150769,6 +150784,7 @@
150769
150784
  "std-pickup",
150770
150785
  "std-platformer-board-2d",
150771
150786
  "std-platformer-body",
150787
+ "std-platformer-puzzle",
150772
150788
  "std-pong",
150773
150789
  "std-pong-rally",
150774
150790
  "std-production",
@@ -151040,6 +151056,7 @@
151040
151056
  "std-pickup",
151041
151057
  "std-platformer-board-2d",
151042
151058
  "std-platformer-body",
151059
+ "std-platformer-puzzle",
151043
151060
  "std-pong-rally",
151044
151061
  "std-production",
151045
151062
  "std-round-flow",
@@ -151479,6 +151496,7 @@
151479
151496
  "std-pickup",
151480
151497
  "std-platformer-board-2d",
151481
151498
  "std-platformer-body",
151499
+ "std-platformer-puzzle",
151482
151500
  "std-pong",
151483
151501
  "std-pong-rally",
151484
151502
  "std-production",
@@ -151802,7 +151820,7 @@
151802
151820
  "topic": "ui/game",
151803
151821
  "family": "ui/game",
151804
151822
  "layer": "UI Patterns",
151805
- "description": "Headless lives + checkpoint authority for boards with stakes: owns lives, the current respawn point, and nothing else. DAMAGE (call sites rename their hazard sources — BODY_HAZARD, BODY_FELL, PATROL_HIT — onto it) costs one life, respecting an invulnerability window so overlapping hazards can't chain-drain; losing a life emits LIFE_LOST plus RESPAWN with the current checkpoint (boards route RESPAWN to the body authority's PLACE), and losing the last emits GAME_OVER instead. Checkpoints advance automatically: BODY_MOVED crossing a configured checkpoint's atX moves the respawn point forward and emits CHECKPOINT_REACHED once per checkpoint (tracked by furthest atX reached, so checkpoints are ordered along the run). RESTART reseeds lives and respawn to the spawn. Renders nothing — HUDs read lives off the shared entity.",
151823
+ "description": "Headless lives + checkpoint authority for boards with stakes: owns lives, the current respawn point, and nothing else. DAMAGE (call sites rename their hazard sources — BODY_HAZARD, BODY_FELL, PATROL_HIT — onto it) costs one life, respecting an invulnerability window so overlapping hazards can't chain-drain; losing a life emits LIFE_LOST plus RESPAWN with the current checkpoint (boards route RESPAWN to the body authority's PLACE), and losing the last emits GAME_OVER instead. Checkpoints advance automatically: BODY_MOVED crossing a configured checkpoint's atX moves the respawn point forward and emits CHECKPOINT_REACHED once per checkpoint (tracked by furthest atX reached, so checkpoints are ordered along the run). RESTART reseeds lives and respawn to the spawn. Renders nothing — HUDs read lives off the shared entity. Corresponds to the design-sheet field(s): challenge, feedback.",
151806
151824
  "defaultOrbitalName": "LivesOrbital",
151807
151825
  "statePattern": "active",
151808
151826
  "complexity": {
@@ -151910,6 +151928,7 @@
151910
151928
  "std-pickup",
151911
151929
  "std-platformer-board-2d",
151912
151930
  "std-platformer-body",
151931
+ "std-platformer-puzzle",
151913
151932
  "std-pong",
151914
151933
  "std-pong-rally",
151915
151934
  "std-production",
@@ -152184,7 +152203,7 @@
152184
152203
  "topic": "ui/game",
152185
152204
  "family": "ui/game",
152186
152205
  "layer": "UI Patterns",
152187
- "description": "Headless winding-lock mechanic: locks that open only after the player travels a full revolution around their anchor. Listens BODY_MOVED and, while the player stays within a radial band of a lock's ring, accumulates the wrapped angular delta of their position into swept (radians, signed — either direction counts); when |swept| reaches turns × 2π the lock flips unlocked and emits LOOP_UNLOCKED once. Entering the band reseeds the angle so leaving and returning never jumps the sweep; progress is kept across exits, so a revolution can be completed in stages. RESTART re-locks every lock. Renders nothing; boards draw the ring/chest and read swept from the shared entity (the render authority).",
152206
+ "description": "Headless winding-lock mechanic: locks that open only after the player travels a full revolution around their anchor. Listens BODY_MOVED and, while the player stays within a radial band of a lock's ring, accumulates the wrapped angular delta of their position into swept (radians, signed — either direction counts); when |swept| reaches turns × 2π the lock flips unlocked and emits LOOP_UNLOCKED once. Entering the band reseeds the angle so leaving and returning never jumps the sweep; progress is kept across exits, so a revolution can be completed in stages. RESTART re-locks every lock. Renders nothing; boards draw the ring/chest and read swept from the shared entity (the render authority). Corresponds to the design-sheet field(s): challenge, rewards.",
152188
152207
  "defaultOrbitalName": "LoopLockOrbital",
152189
152208
  "statePattern": "active",
152190
152209
  "complexity": {
@@ -152272,6 +152291,7 @@
152272
152291
  "std-pickup",
152273
152292
  "std-platformer-board-2d",
152274
152293
  "std-platformer-body",
152294
+ "std-platformer-puzzle",
152275
152295
  "std-pong",
152276
152296
  "std-pong-rally",
152277
152297
  "std-production",
@@ -152603,6 +152623,7 @@
152603
152623
  "std-pickup",
152604
152624
  "std-platformer-board-2d",
152605
152625
  "std-platformer-body",
152626
+ "std-platformer-puzzle",
152606
152627
  "std-pong",
152607
152628
  "std-pong-rally",
152608
152629
  "std-production",
@@ -152887,6 +152908,7 @@
152887
152908
  "std-pickup",
152888
152909
  "std-platformer-board-2d",
152889
152910
  "std-platformer-body",
152911
+ "std-platformer-puzzle",
152890
152912
  "std-production",
152891
152913
  "std-round-flow",
152892
152914
  "std-score",
@@ -153143,6 +153165,7 @@
153143
153165
  "std-pickup",
153144
153166
  "std-platformer-board-2d",
153145
153167
  "std-platformer-body",
153168
+ "std-platformer-puzzle",
153146
153169
  "std-pong",
153147
153170
  "std-pong-rally",
153148
153171
  "std-production",
@@ -153455,7 +153478,7 @@
153455
153478
  "topic": "ui/game",
153456
153479
  "family": "ui/game",
153457
153480
  "layer": "UI Patterns",
153458
- "description": "Headless win/lose authority for objective boards: owns only result. Listens PROGRESS (objectivesLeft + movesLeft) and sets result to won when every objective is reached, lost when the move budget runs out first, else none. Renders nothing.",
153481
+ "description": "Headless win/lose authority for objective boards: owns only result. Listens PROGRESS (objectivesLeft + movesLeft) and sets result to won when every objective is reached, lost when the move budget runs out first, else none. Renders nothing. Corresponds to the design-sheet field(s): goals, feedback.",
153459
153482
  "defaultOrbitalName": "ObjectiveFlowOrbital",
153460
153483
  "statePattern": "active",
153461
153484
  "complexity": {
@@ -153543,6 +153566,7 @@
153543
153566
  "std-pickup",
153544
153567
  "std-platformer-board-2d",
153545
153568
  "std-platformer-body",
153569
+ "std-platformer-puzzle",
153546
153570
  "std-pong",
153547
153571
  "std-pong-rally",
153548
153572
  "std-production",
@@ -153842,6 +153866,7 @@
153842
153866
  "std-pickup",
153843
153867
  "std-platformer-board-2d",
153844
153868
  "std-platformer-body",
153869
+ "std-platformer-puzzle",
153845
153870
  "std-pong",
153846
153871
  "std-pong-rally",
153847
153872
  "std-production",
@@ -154192,7 +154217,7 @@
154192
154217
  "topic": "ui/game",
154193
154218
  "family": "ui/game",
154194
154219
  "layer": "UI Patterns",
154195
- "description": "Headless pad-lock mechanic: floor pads that light when the player steps on them, completing a set when every pad is lit. Listens BODY_MOVED and lights any unlit live pad the player's rect touches (|dx| <= reachX, |dy| <= reachY of the pad center); a lit pad stays lit. Pads may carry a group number (grp 0 = ungrouped, always live): when groups are used, only pads of the lowest uncompleted group are live — pads of later groups refuse to light until the current group finishes, so one sum must be finished before the next. When a group completes the trait emits PAD_GROUP_COMPLETED once for it (first newly completed group reports; the shared entity carries the rest); when every pad in the set is lit it stamps completed and emits PAD_SET_COMPLETED once. The lowest uncompleted group is stamped on the shared entity as currentGrp so boards can pulse exactly the live pads (0 = no group open / ungrouped pads). RESTART unlights every pad and resets the set. Renders nothing; boards draw the pads and read lit from the shared entity (the render authority).",
154220
+ "description": "Headless pad-lock mechanic: floor pads that light when the player steps on them, completing a set when every pad is lit. Listens BODY_MOVED and lights any unlit live pad the player's rect touches (|dx| <= reachX, |dy| <= reachY of the pad center); a lit pad stays lit. Pads may carry a group number (grp 0 = ungrouped, always live): when groups are used, only pads of the lowest uncompleted group are live — pads of later groups refuse to light until the current group finishes, so one sum must be finished before the next. When a group completes the trait emits PAD_GROUP_COMPLETED once for it (first newly completed group reports; the shared entity carries the rest); when every pad in the set is lit it stamps completed and emits PAD_SET_COMPLETED once. The lowest uncompleted group is stamped on the shared entity as currentGrp so boards can pulse exactly the live pads (0 = no group open / ungrouped pads). RESTART unlights every pad and resets the set. Renders nothing; boards draw the pads and read lit from the shared entity (the render authority). Corresponds to the design-sheet field(s): challenge, mechanics.",
154196
154221
  "defaultOrbitalName": "PadLockOrbital",
154197
154222
  "statePattern": "active",
154198
154223
  "complexity": {
@@ -154295,6 +154320,7 @@
154295
154320
  "std-pickup",
154296
154321
  "std-platformer-board-2d",
154297
154322
  "std-platformer-body",
154323
+ "std-platformer-puzzle",
154298
154324
  "std-pong",
154299
154325
  "std-pong-rally",
154300
154326
  "std-production",
@@ -154639,6 +154665,7 @@
154639
154665
  "std-pickup",
154640
154666
  "std-platformer-board-2d",
154641
154667
  "std-platformer-body",
154668
+ "std-platformer-puzzle",
154642
154669
  "std-pong",
154643
154670
  "std-pong-rally",
154644
154671
  "std-production",
@@ -154973,7 +155000,7 @@
154973
155000
  "topic": "ui/game",
154974
155001
  "family": "ui/game",
154975
155002
  "layer": "UI Patterns",
154976
- "description": "Headless patrol-hazard mechanic for side-view boards: moves each configured patrol back and forth along its [x0, x1] beat at its own speed (33ms tick, ping-pong with clamped turnarounds; a patrol declaring waveAmp/wavePeriod also bobs vertically — cy = y + waveAmp·sin(2πt/wavePeriod from a per-row time accumulator — and the hit test and render read cy, so a waveAmp of 0 keeps the flat beat), tracks the player position off the body authority's BODY_MOVED, and emits PATROL_HIT once per contact — a per-patrol hit flag re-arms only after the player separates, so damage rules stay sparse (when two patrols connect on the same tick the first reports; the other reports on the next tick). Patrols live on a [runtime, shared] entity for the render layer (boards draw them as markers/sprites); damage, lives, and respawn stay downstream (std-lives) — this atom simulates, it never judges. Renders nothing.",
155003
+ "description": "Headless patrol-hazard mechanic for side-view boards: moves each configured patrol back and forth along its [x0, x1] beat at its own speed (33ms tick, ping-pong with clamped turnarounds; a patrol declaring waveAmp/wavePeriod also bobs vertically — cy = y + waveAmp·sin(2πt/wavePeriod from a per-row time accumulator — and the hit test and render read cy, so a waveAmp of 0 keeps the flat beat), tracks the player position off the body authority's BODY_MOVED, and emits PATROL_HIT once per contact — a per-patrol hit flag re-arms only after the player separates, so damage rules stay sparse (when two patrols connect on the same tick the first reports; the other reports on the next tick). Patrols live on a [runtime, shared] entity for the render layer (boards draw them as markers/sprites); damage, lives, and respawn stay downstream (std-lives) — this atom simulates, it never judges. Renders nothing. Corresponds to the design-sheet field(s): challenge, dynamics.",
154977
155004
  "defaultOrbitalName": "PatrolHazardOrbital",
154978
155005
  "statePattern": "active",
154979
155006
  "complexity": {
@@ -155071,6 +155098,7 @@
155071
155098
  "std-pickup",
155072
155099
  "std-platformer-board-2d",
155073
155100
  "std-platformer-body",
155101
+ "std-platformer-puzzle",
155074
155102
  "std-pong",
155075
155103
  "std-pong-rally",
155076
155104
  "std-production",
@@ -155355,7 +155383,7 @@
155355
155383
  "topic": "ui/game",
155356
155384
  "family": "ui/game",
155357
155385
  "layer": "UI Patterns",
155358
- "description": "Headless side-view collectible authority — the platformer twin of grid std-gather. Listens BODY_MOVED and, when the player touches an uncollected feature (|dx| <= reachX, |dy| <= reachY of the feature center — the coef-pad touch idiom minus the grounded requirement, so airborne pickups work), stamps it collected on the shared entity and emits PICKED once per item (id, kind, position, glyph, message) plus COLLECT{total} with the running count (the event std-gate-lock already consumes). When every feature is collected it emits PICKUP_SET_COMPLETED once. RESTART re-arms every feature and zeroes the count. kind is board-defined vocabulary (star, boost, …) — this atom reports, boards judge. Renders nothing; boards draw the features and read collected from the shared entity.",
155386
+ "description": "Headless side-view collectible authority — the platformer twin of grid std-gather. Listens BODY_MOVED and, when the player touches an uncollected feature (|dx| <= reachX, |dy| <= reachY of the feature center — the coef-pad touch idiom minus the grounded requirement, so airborne pickups work), stamps it collected on the shared entity and emits PICKED once per item (id, kind, position, glyph, message) plus COLLECT{total} with the running count (the event std-gate-lock already consumes). When every feature is collected it emits PICKUP_SET_COMPLETED once. RESTART re-arms every feature and zeroes the count. kind is board-defined vocabulary (star, boost, …) — this atom reports, boards judge. Renders nothing; boards draw the features and read collected from the shared entity. Corresponds to the design-sheet field(s): rewards.",
155359
155387
  "defaultOrbitalName": "PickupOrbital",
155360
155388
  "statePattern": "active",
155361
155389
  "complexity": {
@@ -155454,6 +155482,7 @@
155454
155482
  "std-patrol-hazard",
155455
155483
  "std-platformer-board-2d",
155456
155484
  "std-platformer-body",
155485
+ "std-platformer-puzzle",
155457
155486
  "std-pong",
155458
155487
  "std-pong-rally",
155459
155488
  "std-production",
@@ -155711,7 +155740,7 @@
155711
155740
  "topic": "ui/game",
155712
155741
  "family": "ui/game",
155713
155742
  "layer": "UI Patterns",
155714
- "description": "Headless run/jump platformer-physics authority: the SOLE writer of body + fell + hazardId + goalId on side-view boards. Where std-motion-body owns free 2D drift (no collision), this atom owns the platformer contract: every 33ms physics tick it integrates gravity into the body's vertical velocity, steps position in per-second units, and collides the body rect against the config platforms with one-way semantics — a body moving in the gravity direction that overlaps a ground/platform tile lands on its anti-gravity face (vy zeroed, grounded set), while a body moving against gravity passes through, so jumping up through a platform and walking up a staircase both just work. The sign of gravity IS the vertical convention: positive pulls toward +y (screen boards, y down — sprite canvases), negative toward −y (math canvases, y up); jumps always fire against it. Intents: STEER sets horizontal velocity (dir −1/0/1 × moveSpeed, hold-to-run: keydown steers, keyup steers 0), JUMP kicks vertical velocity when grounded, PLACE teleports (spawns, hazard respawns), RESTART reseeds. Emits BODY_MOVED every tick for the render layer (boards that don't subscribe pay nothing), plus the sparse rule signals a board needs to score: BODY_JUMPED, BODY_LANDED (with impact speed), BODY_HAZARD (once per hazard entry, re-arms on exit), BODY_GOAL (same arming), BODY_FELL (once per fall past killY, re-armed by PLACE/RESTART). Drift regions: config.driftRegions lists axis-aligned rects each carrying a constant acceleration (ax, ay) applied with the same 0.033s dt whenever the body's center is inside (empty list = zero behavior change). Curve skating: when config.skate is on and the grounded body comes within skateSnap of the config.skateCurve surface, the body rides the curve — y snaps to the interpolated surface and tangential gravity (g·slope/(1+slope²)) accelerates vx, and the vertical velocity is the tangential projection (s = vx·cos θ, vy = s·sin θ — no discontinuous jumps at sample boundaries), so the body slides downhill along the graph itself and launches ballistically off its ends; jumping kicks free. Sparse BODY_SKATE_START/BODY_SKATE_END signals fire on engage/disengage so boards can layer fx. Lives, score, and win/lose stay downstream — this atom simulates, it never judges. Renders nothing.",
155743
+ "description": "Headless run/jump platformer-physics authority: the SOLE writer of body + fell + hazardId + goalId on side-view boards. Where std-motion-body owns free 2D drift (no collision), this atom owns the platformer contract: every 33ms physics tick it integrates gravity into the body's vertical velocity, steps position in per-second units, and collides the body rect against the config platforms with one-way semantics — a body moving in the gravity direction that overlaps a ground/platform tile lands on its anti-gravity face (vy zeroed, grounded set), while a body moving against gravity passes through, so jumping up through a platform and walking up a staircase both just work. The sign of gravity IS the vertical convention: positive pulls toward +y (screen boards, y down — sprite canvases), negative toward −y (math canvases, y up); jumps always fire against it. Intents: STEER sets horizontal velocity (dir −1/0/1 × moveSpeed, hold-to-run: keydown steers, keyup steers 0), JUMP kicks vertical velocity when grounded, PLACE teleports (spawns, hazard respawns), RESTART reseeds. Emits BODY_MOVED every tick for the render layer (boards that don't subscribe pay nothing), plus the sparse rule signals a board needs to score: BODY_JUMPED, BODY_LANDED (with impact speed), BODY_HAZARD (once per hazard entry, re-arms on exit), BODY_GOAL (same arming), BODY_FELL (once per fall past killY, re-armed by PLACE/RESTART). Drift regions: config.driftRegions lists axis-aligned rects each carrying a constant acceleration (ax, ay) applied with the same 0.033s dt whenever the body's center is inside (empty list = zero behavior change). Curve skating: when config.skate is on and the grounded body comes within skateSnap of the config.skateCurve surface, the body rides the curve — y snaps to the interpolated surface and tangential gravity (g·slope/(1+slope²)) accelerates vx, and the vertical velocity is the tangential projection (s = vx·cos θ, vy = s·sin θ — no discontinuous jumps at sample boundaries), so the body slides downhill along the graph itself and launches ballistically off its ends; jumping kicks free. Sparse BODY_SKATE_START/BODY_SKATE_END signals fire on engage/disengage so boards can layer fx. Lives, score, and win/lose stay downstream — this atom simulates, it never judges. Renders nothing. Corresponds to the design-sheet field(s): mechanics, dynamics.",
155715
155744
  "defaultOrbitalName": "PlatformerBodyOrbital",
155716
155745
  "statePattern": "active",
155717
155746
  "complexity": {
@@ -155839,6 +155868,7 @@
155839
155868
  "std-patrol-hazard",
155840
155869
  "std-pickup",
155841
155870
  "std-platformer-board-2d",
155871
+ "std-platformer-puzzle",
155842
155872
  "std-pong",
155843
155873
  "std-pong-rally",
155844
155874
  "std-production",
@@ -156461,6 +156491,7 @@
156461
156491
  "std-pickup",
156462
156492
  "std-platformer-board-2d",
156463
156493
  "std-platformer-body",
156494
+ "std-platformer-puzzle",
156464
156495
  "std-round-flow",
156465
156496
  "std-score",
156466
156497
  "std-service-accounting",
@@ -156769,6 +156800,7 @@
156769
156800
  "std-pickup",
156770
156801
  "std-platformer-board-2d",
156771
156802
  "std-platformer-body",
156803
+ "std-platformer-puzzle",
156772
156804
  "std-pong-rally",
156773
156805
  "std-production",
156774
156806
  "std-score",
@@ -157032,6 +157064,7 @@
157032
157064
  "std-pickup",
157033
157065
  "std-platformer-board-2d",
157034
157066
  "std-platformer-body",
157067
+ "std-platformer-puzzle",
157035
157068
  "std-production",
157036
157069
  "std-round-flow",
157037
157070
  "std-service-accounting",
@@ -157299,6 +157332,7 @@
157299
157332
  "std-pickup",
157300
157333
  "std-platformer-board-2d",
157301
157334
  "std-platformer-body",
157335
+ "std-platformer-puzzle",
157302
157336
  "std-pong",
157303
157337
  "std-pong-rally",
157304
157338
  "std-production",
@@ -157572,6 +157606,7 @@
157572
157606
  "std-pickup",
157573
157607
  "std-platformer-board-2d",
157574
157608
  "std-platformer-body",
157609
+ "std-platformer-puzzle",
157575
157610
  "std-production",
157576
157611
  "std-round-flow",
157577
157612
  "std-score",
@@ -157808,6 +157843,7 @@
157808
157843
  "std-pickup",
157809
157844
  "std-platformer-board-2d",
157810
157845
  "std-platformer-body",
157846
+ "std-platformer-puzzle",
157811
157847
  "std-production",
157812
157848
  "std-round-flow",
157813
157849
  "std-score",
@@ -158043,7 +158079,7 @@
158043
158079
  "topic": "ui/game",
158044
158080
  "family": "ui/game",
158045
158081
  "layer": "UI Patterns",
158046
- "description": "Tutorial modal with live-demo steps for game boards and learning shells: a paged overlay — title, a live previewTrait frame playing the mechanic via std-tutorial-autodemo (a bare game canvas, no shell chrome), one line of body copy, a step counter, and Back / Next / Skip — composed entirely from registered render types (stack + text + button + trait frame) into the overlay slot, so no new UI component is needed. autoShow opens it on INIT for first-time players; a board's help button re-opens it any time via SHOW (which rewinds to step one). DISMISS (or finishing the last step) marks the run done, clears the overlay, and emits TUTORIAL_DONE so the board can unpause or log. Steps are pure config — a board teaches a new mechanic by adding one { id, title, body, demoId } row plus a previewTrait binding.",
158082
+ "description": "Tutorial modal with live-demo steps for game boards and learning shells: a paged overlay — title, a live previewTrait frame playing the mechanic via std-tutorial-autodemo (a bare game canvas, no shell chrome), one line of body copy, a step counter, and Back / Next / Skip — composed entirely from registered render types (stack + text + button + trait frame) into the overlay slot, so no new UI component is needed. autoShow opens it on INIT for first-time players; a board's help button re-opens it any time via SHOW (which rewinds to step one). DISMISS (or finishing the last step) marks the run done, clears the overlay, and emits TUTORIAL_DONE so the board can unpause or log. Steps are pure config — a board teaches a new mechanic by adding one { id, title, body, demoId } row plus a previewTrait binding. Corresponds to the design-sheet field(s): feedback, agency.",
158047
158083
  "defaultOrbitalName": "TutorialOverlayOrbital",
158048
158084
  "statePattern": "idle",
158049
158085
  "complexity": {
@@ -158116,6 +158152,7 @@
158116
158152
  "std-pickup",
158117
158153
  "std-platformer-board-2d",
158118
158154
  "std-platformer-body",
158155
+ "std-platformer-puzzle",
158119
158156
  "std-production",
158120
158157
  "std-round-flow",
158121
158158
  "std-score",
@@ -158378,7 +158415,7 @@
158378
158415
  "topic": "ui/game",
158379
158416
  "family": "ui/game",
158380
158417
  "layer": "UI Patterns",
158381
- "description": "Headless velocity-gate mechanic: gates that open only when the player crosses them inside a speed band, optionally in a required direction, optionally sustained for a dwell. Listens BODY_MOVED and, per closed gate, tests the player's rect (padded by reachMargin), their speed against [minSpeed, maxSpeed], and their horizontal direction against dir (0 = either). Instant gates (dwellMs 0) open on the first passing cross; dwell gates (dwellMs > 0) accumulate ~33ms per passing move and open once held reaches dwellMs — a failing move resets the hold. The first newly opened gate emits VELOCITY_GATE_OPENED (the shared entity carries the rest). Entering a closed INSTANT gate while NOT passing emits VELOCITY_GATE_DENIED once per approach — re-arming only after the player steps out — so the board can answer with a PLACE back and a hint fx; dwell gates never deny (a hot entry is fine — coming to rest inside is the point), a failed hold simply resets. RESTART re-closes every gate. Renders nothing; boards draw the gate band/chest and read open/held from the shared entity (the render authority).",
158418
+ "description": "Headless velocity-gate mechanic: gates that open only when the player crosses them inside a speed band, optionally in a required direction, optionally sustained for a dwell. Listens BODY_MOVED and, per closed gate, tests the player's rect (padded by reachMargin), their speed against [minSpeed, maxSpeed], and their horizontal direction against dir (0 = either). Instant gates (dwellMs 0) open on the first passing cross; dwell gates (dwellMs > 0) accumulate ~33ms per passing move and open once held reaches dwellMs — a failing move resets the hold. The first newly opened gate emits VELOCITY_GATE_OPENED (the shared entity carries the rest). Entering a closed INSTANT gate while NOT passing emits VELOCITY_GATE_DENIED once per approach — re-arming only after the player steps out — so the board can answer with a PLACE back and a hint fx; dwell gates never deny (a hot entry is fine — coming to rest inside is the point), a failed hold simply resets. RESTART re-closes every gate. Renders nothing; boards draw the gate band/chest and read open/held from the shared entity (the render authority). Corresponds to the design-sheet field(s): challenge, mechanics.",
158382
158419
  "defaultOrbitalName": "VelocityGateOrbital",
158383
158420
  "statePattern": "active",
158384
158421
  "complexity": {
@@ -158467,6 +158504,7 @@
158467
158504
  "std-pickup",
158468
158505
  "std-platformer-board-2d",
158469
158506
  "std-platformer-body",
158507
+ "std-platformer-puzzle",
158470
158508
  "std-pong",
158471
158509
  "std-pong-rally",
158472
158510
  "std-production",
@@ -158829,6 +158867,7 @@
158829
158867
  "std-pickup",
158830
158868
  "std-platformer-board-2d",
158831
158869
  "std-platformer-body",
158870
+ "std-platformer-puzzle",
158832
158871
  "std-production",
158833
158872
  "std-round-flow",
158834
158873
  "std-score",
@@ -159153,6 +159192,7 @@
159153
159192
  "std-pickup",
159154
159193
  "std-platformer-board-2d",
159155
159194
  "std-platformer-body",
159195
+ "std-platformer-puzzle",
159156
159196
  "std-pong",
159157
159197
  "std-pong-rally",
159158
159198
  "std-production",
@@ -159450,6 +159490,7 @@
159450
159490
  "std-pickup",
159451
159491
  "std-platformer-board-2d",
159452
159492
  "std-platformer-body",
159493
+ "std-platformer-puzzle",
159453
159494
  "std-production",
159454
159495
  "std-round-flow",
159455
159496
  "std-score",
@@ -159978,6 +160019,7 @@
159978
160019
  "std-pickup",
159979
160020
  "std-platformer-board-2d",
159980
160021
  "std-platformer-body",
160022
+ "std-platformer-puzzle",
159981
160023
  "std-production",
159982
160024
  "std-round-flow",
159983
160025
  "std-score",
@@ -160546,6 +160588,7 @@
160546
160588
  "std-pickup",
160547
160589
  "std-platformer-board-2d",
160548
160590
  "std-platformer-body",
160591
+ "std-platformer-puzzle",
160549
160592
  "std-production",
160550
160593
  "std-round-flow",
160551
160594
  "std-score",
@@ -161082,6 +161125,7 @@
161082
161125
  "std-pickup",
161083
161126
  "std-platformer-board-2d",
161084
161127
  "std-platformer-body",
161128
+ "std-platformer-puzzle",
161085
161129
  "std-production",
161086
161130
  "std-round-flow",
161087
161131
  "std-score",
@@ -161886,6 +161930,7 @@
161886
161930
  "std-pickup",
161887
161931
  "std-platformer-board-2d",
161888
161932
  "std-platformer-body",
161933
+ "std-platformer-puzzle",
161889
161934
  "std-production",
161890
161935
  "std-round-flow",
161891
161936
  "std-score",
@@ -162281,6 +162326,7 @@
162281
162326
  "std-pickup",
162282
162327
  "std-platformer-board-2d",
162283
162328
  "std-platformer-body",
162329
+ "std-platformer-puzzle",
162284
162330
  "std-production",
162285
162331
  "std-round-flow",
162286
162332
  "std-score",
@@ -162669,6 +162715,7 @@
162669
162715
  "std-pickup",
162670
162716
  "std-platformer-board-2d",
162671
162717
  "std-platformer-body",
162718
+ "std-platformer-puzzle",
162672
162719
  "std-production",
162673
162720
  "std-round-flow",
162674
162721
  "std-score",
@@ -163236,6 +163283,7 @@
163236
163283
  "std-pickup",
163237
163284
  "std-platformer-board-2d",
163238
163285
  "std-platformer-body",
163286
+ "std-platformer-puzzle",
163239
163287
  "std-production",
163240
163288
  "std-round-flow",
163241
163289
  "std-score",
@@ -163568,6 +163616,7 @@
163568
163616
  "std-pickup",
163569
163617
  "std-platformer-board-2d",
163570
163618
  "std-platformer-body",
163619
+ "std-platformer-puzzle",
163571
163620
  "std-production",
163572
163621
  "std-round-flow",
163573
163622
  "std-score",
@@ -164155,6 +164204,7 @@
164155
164204
  "std-pickup",
164156
164205
  "std-platformer-board-2d",
164157
164206
  "std-platformer-body",
164207
+ "std-platformer-puzzle",
164158
164208
  "std-production",
164159
164209
  "std-round-flow",
164160
164210
  "std-score",
@@ -164524,6 +164574,7 @@
164524
164574
  "std-pickup",
164525
164575
  "std-platformer-board-2d",
164526
164576
  "std-platformer-body",
164577
+ "std-platformer-puzzle",
164527
164578
  "std-production",
164528
164579
  "std-round-flow",
164529
164580
  "std-score",
@@ -165139,6 +165190,7 @@
165139
165190
  "std-pickup",
165140
165191
  "std-platformer-board-2d",
165141
165192
  "std-platformer-body",
165193
+ "std-platformer-puzzle",
165142
165194
  "std-production",
165143
165195
  "std-round-flow",
165144
165196
  "std-score",
@@ -166206,6 +166258,7 @@
166206
166258
  "std-pickup",
166207
166259
  "std-platformer-board-2d",
166208
166260
  "std-platformer-body",
166261
+ "std-platformer-puzzle",
166209
166262
  "std-production",
166210
166263
  "std-round-flow",
166211
166264
  "std-score",
@@ -167005,6 +167058,7 @@
167005
167058
  "std-pickup",
167006
167059
  "std-platformer-board-2d",
167007
167060
  "std-platformer-body",
167061
+ "std-platformer-puzzle",
167008
167062
  "std-production",
167009
167063
  "std-round-flow",
167010
167064
  "std-score",
@@ -167505,6 +167559,7 @@
167505
167559
  "std-pickup",
167506
167560
  "std-platformer-board-2d",
167507
167561
  "std-platformer-body",
167562
+ "std-platformer-puzzle",
167508
167563
  "std-production",
167509
167564
  "std-round-flow",
167510
167565
  "std-score",
@@ -167927,6 +167982,7 @@
167927
167982
  "std-pickup",
167928
167983
  "std-platformer-board-2d",
167929
167984
  "std-platformer-body",
167985
+ "std-platformer-puzzle",
167930
167986
  "std-production",
167931
167987
  "std-round-flow",
167932
167988
  "std-score",
@@ -168257,6 +168313,7 @@
168257
168313
  "std-pickup",
168258
168314
  "std-platformer-board-2d",
168259
168315
  "std-platformer-body",
168316
+ "std-platformer-puzzle",
168260
168317
  "std-production",
168261
168318
  "std-round-flow",
168262
168319
  "std-score",
@@ -168561,6 +168618,7 @@
168561
168618
  "std-pickup",
168562
168619
  "std-platformer-board-2d",
168563
168620
  "std-platformer-body",
168621
+ "std-platformer-puzzle",
168564
168622
  "std-production",
168565
168623
  "std-round-flow",
168566
168624
  "std-score",
@@ -168838,6 +168896,7 @@
168838
168896
  "std-pickup",
168839
168897
  "std-platformer-board-2d",
168840
168898
  "std-platformer-body",
168899
+ "std-platformer-puzzle",
168841
168900
  "std-production",
168842
168901
  "std-round-flow",
168843
168902
  "std-score",
@@ -169280,6 +169339,7 @@
169280
169339
  "std-pickup",
169281
169340
  "std-platformer-board-2d",
169282
169341
  "std-platformer-body",
169342
+ "std-platformer-puzzle",
169283
169343
  "std-production",
169284
169344
  "std-round-flow",
169285
169345
  "std-score",
@@ -169700,6 +169760,7 @@
169700
169760
  "std-pickup",
169701
169761
  "std-platformer-board-2d",
169702
169762
  "std-platformer-body",
169763
+ "std-platformer-puzzle",
169703
169764
  "std-production",
169704
169765
  "std-round-flow",
169705
169766
  "std-score",
@@ -170125,6 +170186,7 @@
170125
170186
  "std-pickup",
170126
170187
  "std-platformer-board-2d",
170127
170188
  "std-platformer-body",
170189
+ "std-platformer-puzzle",
170128
170190
  "std-production",
170129
170191
  "std-round-flow",
170130
170192
  "std-score",
@@ -170570,6 +170632,7 @@
170570
170632
  "std-pickup",
170571
170633
  "std-platformer-board-2d",
170572
170634
  "std-platformer-body",
170635
+ "std-platformer-puzzle",
170573
170636
  "std-production",
170574
170637
  "std-round-flow",
170575
170638
  "std-score",
@@ -170904,6 +170967,7 @@
170904
170967
  "std-pickup",
170905
170968
  "std-platformer-board-2d",
170906
170969
  "std-platformer-body",
170970
+ "std-platformer-puzzle",
170907
170971
  "std-production",
170908
170972
  "std-round-flow",
170909
170973
  "std-score",
@@ -171498,6 +171562,7 @@
171498
171562
  "std-pickup",
171499
171563
  "std-platformer-board-2d",
171500
171564
  "std-platformer-body",
171565
+ "std-platformer-puzzle",
171501
171566
  "std-production",
171502
171567
  "std-round-flow",
171503
171568
  "std-score",
@@ -171937,6 +172002,7 @@
171937
172002
  "std-pickup",
171938
172003
  "std-platformer-board-2d",
171939
172004
  "std-platformer-body",
172005
+ "std-platformer-puzzle",
171940
172006
  "std-production",
171941
172007
  "std-round-flow",
171942
172008
  "std-score",
@@ -172242,6 +172308,7 @@
172242
172308
  "std-pickup",
172243
172309
  "std-platformer-board-2d",
172244
172310
  "std-platformer-body",
172311
+ "std-platformer-puzzle",
172245
172312
  "std-production",
172246
172313
  "std-round-flow",
172247
172314
  "std-score",
@@ -172530,6 +172597,7 @@
172530
172597
  "std-pickup",
172531
172598
  "std-platformer-board-2d",
172532
172599
  "std-platformer-body",
172600
+ "std-platformer-puzzle",
172533
172601
  "std-production",
172534
172602
  "std-round-flow",
172535
172603
  "std-score",
@@ -172877,6 +172945,7 @@
172877
172945
  "std-pickup",
172878
172946
  "std-platformer-board-2d",
172879
172947
  "std-platformer-body",
172948
+ "std-platformer-puzzle",
172880
172949
  "std-production",
172881
172950
  "std-round-flow",
172882
172951
  "std-score",
@@ -173805,6 +173874,7 @@
173805
173874
  "std-pickup",
173806
173875
  "std-platformer-board-2d",
173807
173876
  "std-platformer-body",
173877
+ "std-platformer-puzzle",
173808
173878
  "std-pong",
173809
173879
  "std-pong-rally",
173810
173880
  "std-production",
@@ -175546,6 +175616,7 @@
175546
175616
  "std-pickup",
175547
175617
  "std-platformer-board-2d",
175548
175618
  "std-platformer-body",
175619
+ "std-platformer-puzzle",
175549
175620
  "std-production",
175550
175621
  "std-purchase-order",
175551
175622
  "std-round-flow",
@@ -177712,6 +177783,7 @@
177712
177783
  "std-pickup",
177713
177784
  "std-platformer-board-2d",
177714
177785
  "std-platformer-body",
177786
+ "std-platformer-puzzle",
177715
177787
  "std-pong",
177716
177788
  "std-pong-rally",
177717
177789
  "std-production",
@@ -180612,6 +180684,7 @@
180612
180684
  "std-pickup",
180613
180685
  "std-platformer-board-2d",
180614
180686
  "std-platformer-body",
180687
+ "std-platformer-puzzle",
180615
180688
  "std-pong",
180616
180689
  "std-pong-rally",
180617
180690
  "std-production",
@@ -182964,6 +183037,7 @@
182964
183037
  "std-pickup",
182965
183038
  "std-platformer-board-2d",
182966
183039
  "std-platformer-body",
183040
+ "std-platformer-puzzle",
182967
183041
  "std-pong",
182968
183042
  "std-pong-rally",
182969
183043
  "std-production",
@@ -184837,6 +184911,7 @@
184837
184911
  "std-patrol-hazard",
184838
184912
  "std-pickup",
184839
184913
  "std-platformer-body",
184914
+ "std-platformer-puzzle",
184840
184915
  "std-pong",
184841
184916
  "std-pong-rally",
184842
184917
  "std-production",
@@ -186621,6 +186696,1714 @@
186621
186696
  ],
186622
186697
  "sourceValid": true
186623
186698
  },
186699
+ "std-platformer-puzzle": {
186700
+ "name": "std-platformer-puzzle",
186701
+ "level": "organism",
186702
+ "topic": "ui/game",
186703
+ "family": "ui/game",
186704
+ "layer": "UI Patterns",
186705
+ "description": "Platformer + puzzle genre substrate organism. Composes the standard authorities — platformer-body, pickup, objective-flow, choice-gate, fx-particles, fx-narrative, tutorial-overlay — and enforces five trait-typed pillar slots: agency, challenge, goal, reward, feedback. Levels consume this organism, fill every slot with a local rebinding trait, and add their own geometry, render, and math rules. Math targets and grade levels stay downstream in the domain package; this substrate is domain-agnostic.",
186706
+ "defaultOrbitalName": "PlatformerPuzzleOrbital",
186707
+ "statePattern": "idle",
186708
+ "complexity": {
186709
+ "states": 1,
186710
+ "events": 1,
186711
+ "transitions": 1
186712
+ },
186713
+ "defaultEntity": {
186714
+ "name": "PlatformerPuzzleData",
186715
+ "persistence": "runtime",
186716
+ "fields": [
186717
+ {
186718
+ "name": "id",
186719
+ "type": "string",
186720
+ "required": true
186721
+ },
186722
+ {
186723
+ "name": "body",
186724
+ "type": "object",
186725
+ "default": {
186726
+ "facingRight": true,
186727
+ "grounded": false,
186728
+ "height": 1,
186729
+ "vx": 0,
186730
+ "vy": 0,
186731
+ "width": 1,
186732
+ "x": 0,
186733
+ "y": 0
186734
+ }
186735
+ },
186736
+ {
186737
+ "name": "fell",
186738
+ "type": "boolean",
186739
+ "default": false
186740
+ },
186741
+ {
186742
+ "name": "hazardId",
186743
+ "type": "string",
186744
+ "default": ""
186745
+ },
186746
+ {
186747
+ "name": "goalId",
186748
+ "type": "string",
186749
+ "default": ""
186750
+ },
186751
+ {
186752
+ "name": "skating",
186753
+ "type": "boolean",
186754
+ "default": false
186755
+ },
186756
+ {
186757
+ "name": "curveMods",
186758
+ "type": "array",
186759
+ "default": []
186760
+ },
186761
+ {
186762
+ "name": "tuning",
186763
+ "type": "object",
186764
+ "default": {}
186765
+ },
186766
+ {
186767
+ "name": "pickups",
186768
+ "type": "array",
186769
+ "default": []
186770
+ },
186771
+ {
186772
+ "name": "pickupCompleted",
186773
+ "type": "boolean",
186774
+ "default": false
186775
+ },
186776
+ {
186777
+ "name": "total",
186778
+ "type": "number",
186779
+ "default": 0
186780
+ },
186781
+ {
186782
+ "name": "choices",
186783
+ "type": "array",
186784
+ "default": []
186785
+ },
186786
+ {
186787
+ "name": "result",
186788
+ "type": "string",
186789
+ "default": "none"
186790
+ },
186791
+ {
186792
+ "name": "fx",
186793
+ "type": "array",
186794
+ "default": []
186795
+ },
186796
+ {
186797
+ "name": "narrativeSeq",
186798
+ "type": "number",
186799
+ "default": 0
186800
+ },
186801
+ {
186802
+ "name": "lastNarrative",
186803
+ "type": "string",
186804
+ "default": ""
186805
+ },
186806
+ {
186807
+ "name": "step",
186808
+ "type": "number",
186809
+ "default": 0
186810
+ },
186811
+ {
186812
+ "name": "done",
186813
+ "type": "boolean",
186814
+ "default": false
186815
+ },
186816
+ {
186817
+ "name": "score",
186818
+ "type": "number",
186819
+ "default": 0
186820
+ },
186821
+ {
186822
+ "name": "lives",
186823
+ "type": "number",
186824
+ "default": 3
186825
+ },
186826
+ {
186827
+ "name": "objectivesLeft",
186828
+ "type": "number",
186829
+ "default": 1
186830
+ },
186831
+ {
186832
+ "name": "celebrated",
186833
+ "type": "boolean",
186834
+ "default": false
186835
+ }
186836
+ ]
186837
+ },
186838
+ "defaultLabels": {
186839
+ "title": "PlatformerPuzzleDatas",
186840
+ "entitySingular": "PlatformerPuzzleData",
186841
+ "entityPlural": "PlatformerPuzzleDatas"
186842
+ },
186843
+ "defaultIcons": [],
186844
+ "composableWith": [
186845
+ "std-arcade-board-3d",
186846
+ "std-arcade-flow",
186847
+ "std-arcade-play",
186848
+ "std-area-fill",
186849
+ "std-audio-cue",
186850
+ "std-camera-rig",
186851
+ "std-chase-ai",
186852
+ "std-choice-gate",
186853
+ "std-coef-pad",
186854
+ "std-crew-board-2d",
186855
+ "std-curve-fog",
186856
+ "std-dungeon-board-2d",
186857
+ "std-dungeon-combat",
186858
+ "std-fx-narrative",
186859
+ "std-fx-particles",
186860
+ "std-fx-trail",
186861
+ "std-gate-lock",
186862
+ "std-gather",
186863
+ "std-gold",
186864
+ "std-grid-tactics",
186865
+ "std-hero-nav",
186866
+ "std-integration-settings",
186867
+ "std-lives",
186868
+ "std-loop-lock",
186869
+ "std-market-board-3d",
186870
+ "std-market-flow",
186871
+ "std-mesh-asset-art",
186872
+ "std-motion-body",
186873
+ "std-objective-board-3d",
186874
+ "std-objective-flow",
186875
+ "std-objective-reach",
186876
+ "std-pad-lock",
186877
+ "std-patience",
186878
+ "std-patrol-hazard",
186879
+ "std-pickup",
186880
+ "std-platformer-board-2d",
186881
+ "std-platformer-body",
186882
+ "std-production",
186883
+ "std-round-flow",
186884
+ "std-score",
186885
+ "std-service-accounting",
186886
+ "std-service-arxiv",
186887
+ "std-service-banking",
186888
+ "std-service-calendar",
186889
+ "std-service-calendar-ical",
186890
+ "std-service-cli",
186891
+ "std-service-custom-bearer",
186892
+ "std-service-database",
186893
+ "std-service-deepagent",
186894
+ "std-service-docker",
186895
+ "std-service-drive",
186896
+ "std-service-email",
186897
+ "std-service-esign",
186898
+ "std-service-github",
186899
+ "std-service-iconify",
186900
+ "std-service-llm",
186901
+ "std-service-maps",
186902
+ "std-service-marketplace",
186903
+ "std-service-meta-ads",
186904
+ "std-service-ml",
186905
+ "std-service-oauth",
186906
+ "std-service-otel",
186907
+ "std-service-print",
186908
+ "std-service-push",
186909
+ "std-service-queue",
186910
+ "std-service-redis",
186911
+ "std-service-research-assistant",
186912
+ "std-service-storage",
186913
+ "std-service-stripe",
186914
+ "std-service-twilio",
186915
+ "std-service-webhook",
186916
+ "std-service-wikimedia",
186917
+ "std-service-youtube",
186918
+ "std-survival-board-3d",
186919
+ "std-survival-flow",
186920
+ "std-svg-asset-art",
186921
+ "std-tactics-board-2d",
186922
+ "std-tactics-board-3d",
186923
+ "std-tutorial-autodemo",
186924
+ "std-tutorial-overlay",
186925
+ "std-velocity-gate",
186926
+ "std-worldmap-board-2d",
186927
+ "std-xp",
186928
+ "std-zone-card",
186929
+ "ui-action-palette",
186930
+ "ui-action-tile",
186931
+ "ui-canvas",
186932
+ "ui-canvas-2d",
186933
+ "ui-choice-button",
186934
+ "ui-control-button",
186935
+ "ui-control-grid",
186936
+ "ui-dialogue-bubble",
186937
+ "ui-draw-fx-layer",
186938
+ "ui-draw-group",
186939
+ "ui-draw-mesh",
186940
+ "ui-draw-shape",
186941
+ "ui-draw-shape-layer",
186942
+ "ui-draw-sprite",
186943
+ "ui-draw-sprite-layer",
186944
+ "ui-draw-text",
186945
+ "ui-draw-text-layer",
186946
+ "ui-game-audio-cue",
186947
+ "ui-game-audio-toggle",
186948
+ "ui-game-hud",
186949
+ "ui-game-menu",
186950
+ "ui-game-shell",
186951
+ "ui-health-bar",
186952
+ "ui-score-display",
186953
+ "ui-sequence-bar",
186954
+ "ui-stat-badge",
186955
+ "ui-state-graph",
186956
+ "ui-state-json-view",
186957
+ "ui-timer-display",
186958
+ "ui-trait-slot"
186959
+ ],
186960
+ "connectableEvents": [],
186961
+ "eventPayloads": {},
186962
+ "exposure": "palette",
186963
+ "provenance": "generated",
186964
+ "traits": [
186965
+ {
186966
+ "name": "PlatformerPuzzleBody",
186967
+ "orbital": "PlatformerPuzzleOrbital",
186968
+ "role": "authority",
186969
+ "emittedEvents": [],
186970
+ "listenedEvents": [],
186971
+ "overridableConfigKeys": [
186972
+ {
186973
+ "key": "curveModsEnabled",
186974
+ "type": "boolean",
186975
+ "default": false,
186976
+ "label": "Curve Mods Enabled",
186977
+ "description": "When true, entity.curveMods reshape the skate surface inside each mod's x-range: the road samples the base curve at b·(x − h) and applies a·y + k (slope scales by a·b) — coefficient pads lift/tilt/compress the segment the player is riding. Multiple overlapping mods stack by summing each mod's delta from the base surface; a mod whose shifted sample leaves the curve range is skipped. Default off: boards without coef pads pay nothing.",
186978
+ "tier": "domain"
186979
+ },
186980
+ {
186981
+ "key": "driftRegions",
186982
+ "type": "[BodyDriftRegion]",
186983
+ "default": [],
186984
+ "label": "Drift Regions",
186985
+ "description": "Axis-aligned rects (x0..x1, y0..y1 in world units) each carrying a constant acceleration (ax, ay in units/s²) applied with the physics dt whenever the body's center is inside — winds, currents, gradient pushes. Empty list = zero behavior change.",
186986
+ "tier": "domain",
186987
+ "items": {
186988
+ "properties": {
186989
+ "ax": {
186990
+ "name": "ax",
186991
+ "required": true,
186992
+ "type": "number"
186993
+ },
186994
+ "ay": {
186995
+ "name": "ay",
186996
+ "required": true,
186997
+ "type": "number"
186998
+ },
186999
+ "id": {
187000
+ "name": "id",
187001
+ "required": true,
187002
+ "type": "string"
187003
+ },
187004
+ "x0": {
187005
+ "name": "x0",
187006
+ "required": true,
187007
+ "type": "number"
187008
+ },
187009
+ "x1": {
187010
+ "name": "x1",
187011
+ "required": true,
187012
+ "type": "number"
187013
+ },
187014
+ "y0": {
187015
+ "name": "y0",
187016
+ "required": true,
187017
+ "type": "number"
187018
+ },
187019
+ "y1": {
187020
+ "name": "y1",
187021
+ "required": true,
187022
+ "type": "number"
187023
+ }
187024
+ },
187025
+ "type": "object"
187026
+ }
187027
+ },
187028
+ {
187029
+ "key": "gravity",
187030
+ "type": "number",
187031
+ "default": 24,
187032
+ "label": "Gravity",
187033
+ "description": "Units/s² added to vertical velocity; the SIGN is the vertical convention — positive pulls toward +y (screen boards, y down), negative toward −y (math canvases, y up) — and jumps always fire against it",
187034
+ "tier": "domain"
187035
+ },
187036
+ {
187037
+ "key": "jumpStrength",
187038
+ "type": "number",
187039
+ "default": 11,
187040
+ "label": "Jump Strength",
187041
+ "description": "Vertical speed in units/s imparted by JUMP, directed against gravity; apex height ≈ jumpStrength² / (2·|gravity|)",
187042
+ "tier": "domain"
187043
+ },
187044
+ {
187045
+ "key": "killY",
187046
+ "type": "number",
187047
+ "default": 1000000,
187048
+ "label": "Kill Y",
187049
+ "description": "Fall line: crossing it in the gravity direction fires BODY_FELL once (past it downward on y-down boards, below it on y-up canvases); y-up consumers must set a value below their world floor",
187050
+ "tier": "domain"
187051
+ },
187052
+ {
187053
+ "key": "maxFallSpeed",
187054
+ "type": "number",
187055
+ "default": 14,
187056
+ "label": "Max Fall Speed",
187057
+ "description": "Terminal velocity cap in units/s applied to vertical speed each tick",
187058
+ "tier": "presentation"
187059
+ },
187060
+ {
187061
+ "key": "moveSpeed",
187062
+ "type": "number",
187063
+ "default": 5,
187064
+ "label": "Move Speed",
187065
+ "description": "Horizontal run speed in units/s applied by STEER dir ±1",
187066
+ "tier": "domain"
187067
+ },
187068
+ {
187069
+ "key": "platforms",
187070
+ "type": "[PlatformerPlatform]",
187071
+ "default": [],
187072
+ "label": "Platforms",
187073
+ "description": "Level geometry as min-corner rects: ground/platform tiles are solid one-way landing surfaces, hazard tiles emit BODY_HAZARD on touch, goal tiles emit BODY_GOAL",
187074
+ "tier": "domain",
187075
+ "items": {
187076
+ "properties": {
187077
+ "height": {
187078
+ "name": "height",
187079
+ "required": true,
187080
+ "type": "number"
187081
+ },
187082
+ "id": {
187083
+ "name": "id",
187084
+ "required": false,
187085
+ "type": "string"
187086
+ },
187087
+ "type": {
187088
+ "name": "type",
187089
+ "required": false,
187090
+ "type": "string",
187091
+ "values": [
187092
+ "ground",
187093
+ "platform",
187094
+ "hazard",
187095
+ "goal"
187096
+ ]
187097
+ },
187098
+ "width": {
187099
+ "name": "width",
187100
+ "required": true,
187101
+ "type": "number"
187102
+ },
187103
+ "x": {
187104
+ "name": "x",
187105
+ "required": true,
187106
+ "type": "number"
187107
+ },
187108
+ "y": {
187109
+ "name": "y",
187110
+ "required": true,
187111
+ "type": "number"
187112
+ }
187113
+ },
187114
+ "type": "object"
187115
+ }
187116
+ },
187117
+ {
187118
+ "key": "running",
187119
+ "type": "boolean",
187120
+ "default": true,
187121
+ "label": "Running",
187122
+ "description": "When true the 33ms physics tick integrates and collides; toggle to freeze the body",
187123
+ "tier": "domain"
187124
+ },
187125
+ {
187126
+ "key": "skate",
187127
+ "type": "boolean",
187128
+ "default": false,
187129
+ "label": "Curve Skating",
187130
+ "description": "When true, a grounded body within skateSnap of the skateCurve surface rides the curve: y snaps to the interpolated surface and tangential gravity (g·slope/(1+slope²)) accelerates vx, so the body slides downhill along the graph and launches off its ends; JUMP kicks free. Engages when grounded, when landing on a tile, or when a falling (not rising) body passes within skateSnap above the surface.",
187131
+ "tier": "domain"
187132
+ },
187133
+ {
187134
+ "key": "skateCurve",
187135
+ "type": "[PlatformerCurveSample]",
187136
+ "default": [],
187137
+ "label": "Skate Curve",
187138
+ "description": "Surface samples (x strictly increasing) the body skates when skate is on; y is the surface height for the body's MIN corner, linearly interpolated between bracketing samples — mirror the render-side curve so what you see is what you ride",
187139
+ "tier": "domain",
187140
+ "items": {
187141
+ "properties": {
187142
+ "x": {
187143
+ "name": "x",
187144
+ "required": true,
187145
+ "type": "number"
187146
+ },
187147
+ "y": {
187148
+ "name": "y",
187149
+ "required": true,
187150
+ "type": "number"
187151
+ }
187152
+ },
187153
+ "type": "object"
187154
+ }
187155
+ },
187156
+ {
187157
+ "key": "skateMaxGap",
187158
+ "type": "number",
187159
+ "default": 0,
187160
+ "label": "Skate Max Gap",
187161
+ "description": "Largest x-gap between consecutive skateCurve samples that still counts as surface. 0 = unlimited (sparse two-sample lines skate fine). Dense resampled curves with real gaps between segments (stitched worlds) MUST set this — otherwise the sampler invents a skatable chord across every gap (an invisible line above the bridge/terrain that the body snaps to and glides along).",
187162
+ "tier": "domain"
187163
+ },
187164
+ {
187165
+ "key": "skateSnap",
187166
+ "type": "number",
187167
+ "default": 0.75,
187168
+ "label": "Skate Snap",
187169
+ "description": "Max vertical gap (world units) between the body's min corner and the curve surface for skating to engage or stay engaged; larger values grab earlier on landing, smaller values release sooner on bumps",
187170
+ "tier": "domain"
187171
+ },
187172
+ {
187173
+ "key": "spawn",
187174
+ "type": "PlatformerBody",
187175
+ "default": {
187176
+ "facingRight": true,
187177
+ "grounded": false,
187178
+ "height": 0.6,
187179
+ "vx": 0,
187180
+ "vy": 0,
187181
+ "width": 0.6,
187182
+ "x": 2,
187183
+ "y": 8
187184
+ },
187185
+ "label": "Spawn Body",
187186
+ "description": "Initial body rect (min-corner x/y plus width/height) seeded on INIT/RESTART; width/height also define the collision box",
187187
+ "tier": "domain",
187188
+ "properties": {
187189
+ "facingRight": {
187190
+ "name": "facingRight",
187191
+ "required": false,
187192
+ "type": "boolean"
187193
+ },
187194
+ "grounded": {
187195
+ "name": "grounded",
187196
+ "required": false,
187197
+ "type": "boolean"
187198
+ },
187199
+ "height": {
187200
+ "name": "height",
187201
+ "required": true,
187202
+ "type": "number"
187203
+ },
187204
+ "vx": {
187205
+ "name": "vx",
187206
+ "required": false,
187207
+ "type": "number"
187208
+ },
187209
+ "vy": {
187210
+ "name": "vy",
187211
+ "required": false,
187212
+ "type": "number"
187213
+ },
187214
+ "width": {
187215
+ "name": "width",
187216
+ "required": true,
187217
+ "type": "number"
187218
+ },
187219
+ "x": {
187220
+ "name": "x",
187221
+ "required": true,
187222
+ "type": "number"
187223
+ },
187224
+ "y": {
187225
+ "name": "y",
187226
+ "required": true,
187227
+ "type": "number"
187228
+ }
187229
+ }
187230
+ },
187231
+ {
187232
+ "key": "xMax",
187233
+ "type": "number",
187234
+ "default": 1000000,
187235
+ "label": "Right Wall",
187236
+ "description": "Largest x the body's min corner may hold (world bounds, not level geometry)",
187237
+ "tier": "presentation"
187238
+ },
187239
+ {
187240
+ "key": "xMin",
187241
+ "type": "number",
187242
+ "default": -1000000,
187243
+ "label": "Left Wall",
187244
+ "description": "Smallest x the body's min corner may hold (world bounds, not level geometry)",
187245
+ "tier": "presentation"
187246
+ }
187247
+ ],
187248
+ "capabilities": [],
187249
+ "ticks": [
187250
+ {
187251
+ "name": "physicsTick",
187252
+ "interval": 33
187253
+ }
187254
+ ],
187255
+ "rendersUi": false,
187256
+ "ref": "Body.traits.PlatformerBody",
187257
+ "category": "lifecycle",
187258
+ "entityRebindable": true,
187259
+ "linkedEntity": "PlatformerPuzzleData",
187260
+ "entityContract": {
187261
+ "requires": [],
187262
+ "provides": [
187263
+ "body",
187264
+ "curveMods",
187265
+ "fell",
187266
+ "goalId",
187267
+ "hazardId",
187268
+ "skating",
187269
+ "tuning"
187270
+ ]
187271
+ },
187272
+ "transitionEvents": [
187273
+ "CURVE_MOD_ADD",
187274
+ "CURVE_MOD_CLEAR",
187275
+ "INIT",
187276
+ "JUMP",
187277
+ "PLACE",
187278
+ "RESTART",
187279
+ "SET_TUNING",
187280
+ "STEER"
187281
+ ],
187282
+ "definerKnobs": []
187283
+ },
187284
+ {
187285
+ "name": "PlatformerPuzzlePickup",
187286
+ "orbital": "PlatformerPuzzleOrbital",
187287
+ "role": "reactor",
187288
+ "emittedEvents": [],
187289
+ "listenedEvents": [],
187290
+ "overridableConfigKeys": [
187291
+ {
187292
+ "key": "features",
187293
+ "type": "[PickupFeature]",
187294
+ "default": [],
187295
+ "label": "Features",
187296
+ "description": "One row per collectible: id, center (x, y in world units), board-defined kind (star, boost, …), display glyph and message floated on pickup. collected is stamped at runtime.",
187297
+ "tier": "domain",
187298
+ "items": {
187299
+ "properties": {
187300
+ "collected": {
187301
+ "name": "collected",
187302
+ "required": false,
187303
+ "type": "boolean"
187304
+ },
187305
+ "glyph": {
187306
+ "name": "glyph",
187307
+ "required": false,
187308
+ "type": "string"
187309
+ },
187310
+ "id": {
187311
+ "name": "id",
187312
+ "required": true,
187313
+ "type": "string"
187314
+ },
187315
+ "kind": {
187316
+ "name": "kind",
187317
+ "required": true,
187318
+ "type": "string"
187319
+ },
187320
+ "message": {
187321
+ "name": "message",
187322
+ "required": false,
187323
+ "type": "string"
187324
+ },
187325
+ "x": {
187326
+ "name": "x",
187327
+ "required": true,
187328
+ "type": "number"
187329
+ },
187330
+ "y": {
187331
+ "name": "y",
187332
+ "required": true,
187333
+ "type": "number"
187334
+ }
187335
+ },
187336
+ "type": "object"
187337
+ }
187338
+ },
187339
+ {
187340
+ "key": "reachX",
187341
+ "type": "number",
187342
+ "default": 0.7,
187343
+ "label": "Reach X",
187344
+ "description": "Horizontal tolerance (world units) around a feature's center when testing player contact.",
187345
+ "tier": "domain"
187346
+ },
187347
+ {
187348
+ "key": "reachY",
187349
+ "type": "number",
187350
+ "default": 1.2,
187351
+ "label": "Reach Y",
187352
+ "description": "Vertical tolerance (world units) around a feature's center when testing player contact; generous values catch fly-through pickups.",
187353
+ "tier": "domain"
187354
+ },
187355
+ {
187356
+ "key": "running",
187357
+ "type": "boolean",
187358
+ "default": true,
187359
+ "label": "Running",
187360
+ "description": "When true, BODY_MOVED collects touched features; toggle to freeze the set as-is.",
187361
+ "tier": "domain"
187362
+ }
187363
+ ],
187364
+ "capabilities": [],
187365
+ "ticks": [],
187366
+ "rendersUi": false,
187367
+ "ref": "Pickup.traits.Pickup",
187368
+ "category": "lifecycle",
187369
+ "entityRebindable": true,
187370
+ "linkedEntity": "PlatformerPuzzleData",
187371
+ "entityContract": {
187372
+ "requires": [],
187373
+ "provides": [
187374
+ "pickupCompleted",
187375
+ "pickups",
187376
+ "total"
187377
+ ]
187378
+ },
187379
+ "transitionEvents": [
187380
+ "BODY_MOVED",
187381
+ "INIT",
187382
+ "RESTART"
187383
+ ],
187384
+ "definerKnobs": []
187385
+ },
187386
+ {
187387
+ "name": "PlatformerPuzzleObjective",
187388
+ "orbital": "PlatformerPuzzleOrbital",
187389
+ "role": "reactor",
187390
+ "emittedEvents": [],
187391
+ "listenedEvents": [],
187392
+ "overridableConfigKeys": [
187393
+ {
187394
+ "key": "running",
187395
+ "type": "boolean",
187396
+ "default": true,
187397
+ "label": "Running",
187398
+ "description": "When true, PROGRESS signals resolve win/lose; toggle to freeze",
187399
+ "tier": "domain"
187400
+ }
187401
+ ],
187402
+ "capabilities": [],
187403
+ "ticks": [],
187404
+ "rendersUi": false,
187405
+ "ref": "Gate.traits.ObjectiveFlow",
187406
+ "category": "lifecycle",
187407
+ "entityRebindable": true,
187408
+ "linkedEntity": "PlatformerPuzzleData",
187409
+ "entityContract": {
187410
+ "requires": [],
187411
+ "provides": [
187412
+ "result"
187413
+ ]
187414
+ },
187415
+ "transitionEvents": [
187416
+ "INIT",
187417
+ "PROGRESS",
187418
+ "RESTART"
187419
+ ],
187420
+ "definerKnobs": []
187421
+ },
187422
+ {
187423
+ "name": "PlatformerPuzzleChoice",
187424
+ "orbital": "PlatformerPuzzleOrbital",
187425
+ "role": "reactor",
187426
+ "emittedEvents": [],
187427
+ "listenedEvents": [],
187428
+ "overridableConfigKeys": [
187429
+ {
187430
+ "key": "gates",
187431
+ "type": "[ChoiceGate]",
187432
+ "default": [],
187433
+ "label": "Choice Gates",
187434
+ "description": "One row per gate: id, gate center (x, y — y is the option-platform surface the judge tests against), the hint floated on a wrong answer, and the options: id, dx offset from the gate center, the label drawn above the platform, and correct. solved/chosen are stamped at runtime.",
187435
+ "tier": "domain",
187436
+ "items": {
187437
+ "properties": {
187438
+ "chosen": {
187439
+ "name": "chosen",
187440
+ "required": false,
187441
+ "type": "string"
187442
+ },
187443
+ "hint": {
187444
+ "name": "hint",
187445
+ "required": false,
187446
+ "type": "string"
187447
+ },
187448
+ "id": {
187449
+ "name": "id",
187450
+ "required": true,
187451
+ "type": "string"
187452
+ },
187453
+ "options": {
187454
+ "name": "options",
187455
+ "required": true,
187456
+ "type": "array",
187457
+ "items": {
187458
+ "properties": {
187459
+ "correct": {
187460
+ "name": "correct",
187461
+ "required": true,
187462
+ "type": "boolean"
187463
+ },
187464
+ "dx": {
187465
+ "name": "dx",
187466
+ "required": true,
187467
+ "type": "number"
187468
+ },
187469
+ "id": {
187470
+ "name": "id",
187471
+ "required": true,
187472
+ "type": "string"
187473
+ },
187474
+ "label": {
187475
+ "name": "label",
187476
+ "required": true,
187477
+ "type": "string"
187478
+ }
187479
+ },
187480
+ "type": "object"
187481
+ }
187482
+ },
187483
+ "solved": {
187484
+ "name": "solved",
187485
+ "required": false,
187486
+ "type": "boolean"
187487
+ },
187488
+ "x": {
187489
+ "name": "x",
187490
+ "required": true,
187491
+ "type": "number"
187492
+ },
187493
+ "y": {
187494
+ "name": "y",
187495
+ "required": true,
187496
+ "type": "number"
187497
+ }
187498
+ },
187499
+ "type": "object"
187500
+ }
187501
+ },
187502
+ {
187503
+ "key": "reachX",
187504
+ "type": "number",
187505
+ "default": 0.7,
187506
+ "label": "Reach X",
187507
+ "description": "Horizontal tolerance (world units) around an option platform's center when testing a landing (approximates the body's half-width plus a step).",
187508
+ "tier": "domain"
187509
+ },
187510
+ {
187511
+ "key": "reachY",
187512
+ "type": "number",
187513
+ "default": 1.2,
187514
+ "label": "Reach Y",
187515
+ "description": "Vertical tolerance (world units) around the gate's option plane when testing a landing (covers small hops onto the platform surface).",
187516
+ "tier": "domain"
187517
+ },
187518
+ {
187519
+ "key": "running",
187520
+ "type": "boolean",
187521
+ "default": true,
187522
+ "label": "Running",
187523
+ "description": "When true, BODY_MOVED judges option landings; toggle to freeze every gate as-is.",
187524
+ "tier": "domain"
187525
+ }
187526
+ ],
187527
+ "capabilities": [],
187528
+ "ticks": [],
187529
+ "rendersUi": false,
187530
+ "ref": "Choice.traits.ChoiceGate",
187531
+ "category": "lifecycle",
187532
+ "entityRebindable": true,
187533
+ "linkedEntity": "PlatformerPuzzleData",
187534
+ "entityContract": {
187535
+ "requires": [],
187536
+ "provides": [
187537
+ "choices"
187538
+ ]
187539
+ },
187540
+ "transitionEvents": [
187541
+ "BODY_MOVED",
187542
+ "INIT",
187543
+ "RESTART"
187544
+ ],
187545
+ "definerKnobs": []
187546
+ },
187547
+ {
187548
+ "name": "PlatformerPuzzleFx",
187549
+ "orbital": "PlatformerPuzzleOrbital",
187550
+ "role": "authority",
187551
+ "emittedEvents": [],
187552
+ "listenedEvents": [],
187553
+ "overridableConfigKeys": [
187554
+ {
187555
+ "key": "decayRate",
187556
+ "type": "number",
187557
+ "default": 1,
187558
+ "label": "Decay Rate",
187559
+ "description": "Ttl units removed from every fx entry each tick; higher fades particles faster.",
187560
+ "tier": "domain"
187561
+ },
187562
+ {
187563
+ "key": "fx",
187564
+ "type": "[Fx]",
187565
+ "default": [],
187566
+ "label": "Initial Fx",
187567
+ "description": "Seed particles rendered before the first BURST; usually empty.",
187568
+ "tier": "domain",
187569
+ "items": {
187570
+ "properties": {
187571
+ "animation": {
187572
+ "name": "animation",
187573
+ "required": false,
187574
+ "type": "string"
187575
+ },
187576
+ "bornAt": {
187577
+ "name": "bornAt",
187578
+ "required": false,
187579
+ "type": "number"
187580
+ },
187581
+ "color": {
187582
+ "name": "color",
187583
+ "required": false,
187584
+ "type": "string"
187585
+ },
187586
+ "effect": {
187587
+ "name": "effect",
187588
+ "required": false,
187589
+ "type": "string"
187590
+ },
187591
+ "id": {
187592
+ "name": "id",
187593
+ "required": true,
187594
+ "type": "string"
187595
+ },
187596
+ "maxTtl": {
187597
+ "name": "maxTtl",
187598
+ "required": false,
187599
+ "type": "number"
187600
+ },
187601
+ "message": {
187602
+ "name": "message",
187603
+ "required": false,
187604
+ "type": "string"
187605
+ },
187606
+ "particleCount": {
187607
+ "name": "particleCount",
187608
+ "required": false,
187609
+ "type": "number"
187610
+ },
187611
+ "size": {
187612
+ "name": "size",
187613
+ "required": false,
187614
+ "type": "number"
187615
+ },
187616
+ "space": {
187617
+ "name": "space",
187618
+ "required": false,
187619
+ "type": "string"
187620
+ },
187621
+ "ttl": {
187622
+ "name": "ttl",
187623
+ "required": true,
187624
+ "type": "number"
187625
+ },
187626
+ "type": {
187627
+ "name": "type",
187628
+ "required": true,
187629
+ "type": "string"
187630
+ },
187631
+ "vx": {
187632
+ "name": "vx",
187633
+ "required": false,
187634
+ "type": "number"
187635
+ },
187636
+ "vy": {
187637
+ "name": "vy",
187638
+ "required": false,
187639
+ "type": "number"
187640
+ },
187641
+ "vz": {
187642
+ "name": "vz",
187643
+ "required": false,
187644
+ "type": "number"
187645
+ },
187646
+ "x": {
187647
+ "name": "x",
187648
+ "required": true,
187649
+ "type": "number"
187650
+ },
187651
+ "y": {
187652
+ "name": "y",
187653
+ "required": false,
187654
+ "type": "number"
187655
+ },
187656
+ "z": {
187657
+ "name": "z",
187658
+ "required": false,
187659
+ "type": "number"
187660
+ }
187661
+ },
187662
+ "type": "object"
187663
+ }
187664
+ },
187665
+ {
187666
+ "key": "running",
187667
+ "type": "boolean",
187668
+ "default": true,
187669
+ "label": "Running",
187670
+ "description": "When true the decay tick runs; toggle to freeze effects.",
187671
+ "tier": "domain"
187672
+ }
187673
+ ],
187674
+ "capabilities": [],
187675
+ "ticks": [
187676
+ {
187677
+ "name": "fxTick",
187678
+ "interval": 500
187679
+ }
187680
+ ],
187681
+ "rendersUi": false,
187682
+ "ref": "Particles.traits.FxParticles",
187683
+ "category": "lifecycle",
187684
+ "entityRebindable": true,
187685
+ "linkedEntity": "PlatformerPuzzleData",
187686
+ "entityContract": {
187687
+ "requires": [],
187688
+ "provides": [
187689
+ "fx"
187690
+ ]
187691
+ },
187692
+ "transitionEvents": [
187693
+ "BURST",
187694
+ "INIT",
187695
+ "RESTART"
187696
+ ],
187697
+ "definerKnobs": []
187698
+ },
187699
+ {
187700
+ "name": "PlatformerPuzzleNarrative",
187701
+ "orbital": "PlatformerPuzzleOrbital",
187702
+ "role": "reactor",
187703
+ "emittedEvents": [],
187704
+ "listenedEvents": [],
187705
+ "overridableConfigKeys": [
187706
+ {
187707
+ "key": "running",
187708
+ "type": "boolean",
187709
+ "default": true,
187710
+ "label": "Running",
187711
+ "description": "When false all narrative events are ignored.",
187712
+ "tier": "domain"
187713
+ },
187714
+ {
187715
+ "key": "styles",
187716
+ "type": "Map<string,StyleDef>",
187717
+ "default": {
187718
+ "celebrate": {
187719
+ "color": "#facc15",
187720
+ "effect": "sparkle",
187721
+ "size": 0.9,
187722
+ "ttl": 3
187723
+ },
187724
+ "fact": {
187725
+ "color": "#38bdf8",
187726
+ "effect": "float-text",
187727
+ "size": 0.7,
187728
+ "ttl": 3
187729
+ },
187730
+ "hint": {
187731
+ "color": "#a78bfa",
187732
+ "effect": "float-text",
187733
+ "size": 0.6,
187734
+ "ttl": 2
187735
+ },
187736
+ "warn": {
187737
+ "color": "#f87171",
187738
+ "effect": "shake",
187739
+ "size": 0.6,
187740
+ "ttl": 1.5
187741
+ }
187742
+ },
187743
+ "label": "Styles",
187744
+ "description": "Map of narrative style to color, size, ttl, and effect. Override per game theme.",
187745
+ "tier": "presentation",
187746
+ "items": {
187747
+ "properties": {
187748
+ "color": {
187749
+ "name": "color",
187750
+ "required": true,
187751
+ "type": "string"
187752
+ },
187753
+ "effect": {
187754
+ "name": "effect",
187755
+ "required": true,
187756
+ "type": "string"
187757
+ },
187758
+ "size": {
187759
+ "name": "size",
187760
+ "required": true,
187761
+ "type": "number"
187762
+ },
187763
+ "ttl": {
187764
+ "name": "ttl",
187765
+ "required": true,
187766
+ "type": "number"
187767
+ }
187768
+ },
187769
+ "type": "object"
187770
+ }
187771
+ }
187772
+ ],
187773
+ "capabilities": [],
187774
+ "ticks": [],
187775
+ "rendersUi": false,
187776
+ "ref": "Narrative.traits.FxNarrative",
187777
+ "category": "lifecycle",
187778
+ "entityRebindable": true,
187779
+ "linkedEntity": "PlatformerPuzzleData",
187780
+ "entityContract": {
187781
+ "requires": [],
187782
+ "provides": [
187783
+ "lastText",
187784
+ "seq"
187785
+ ]
187786
+ },
187787
+ "transitionEvents": [
187788
+ "INIT",
187789
+ "NARRATE",
187790
+ "TUTORIAL_SHOW"
187791
+ ],
187792
+ "definerKnobs": []
187793
+ },
187794
+ {
187795
+ "name": "PlatformerPuzzleTutorial",
187796
+ "orbital": "PlatformerPuzzleOrbital",
187797
+ "role": "renderer",
187798
+ "emittedEvents": [],
187799
+ "listenedEvents": [],
187800
+ "overridableConfigKeys": [
187801
+ {
187802
+ "key": "autoShow",
187803
+ "type": "boolean",
187804
+ "default": false,
187805
+ "label": "Auto Show",
187806
+ "description": "When true the tutorial opens on INIT for this run; when false it stays hidden until SHOW.",
187807
+ "tier": "domain"
187808
+ },
187809
+ {
187810
+ "key": "previewTrait",
187811
+ "type": "trait",
187812
+ "default": "@trait.PlatformerPuzzleNoopPreview",
187813
+ "label": "Preview trait",
187814
+ "description": "Trait rendered in the media position of the modal — the live, demo-driven preview of the mechanic (a bare game canvas, no shell chrome). '@trait.TutorialEmptyPreview' leaves the slot blank. Override with '@trait.<TraitName>' to show a board's live frame.",
187815
+ "tier": "presentation"
187816
+ },
187817
+ {
187818
+ "key": "steps",
187819
+ "type": "[TutorialStep]",
187820
+ "default": [],
187821
+ "label": "Steps",
187822
+ "description": "One row per tutorial page: title, one line of body copy, and an optional demoId that plays a scripted live demo (std-tutorial-autodemo) for the mechanic being taught.",
187823
+ "tier": "presentation",
187824
+ "items": {
187825
+ "properties": {
187826
+ "body": {
187827
+ "name": "body",
187828
+ "required": false,
187829
+ "type": "string"
187830
+ },
187831
+ "demoId": {
187832
+ "name": "demoId",
187833
+ "required": false,
187834
+ "type": "string"
187835
+ },
187836
+ "id": {
187837
+ "name": "id",
187838
+ "required": true,
187839
+ "type": "string"
187840
+ },
187841
+ "title": {
187842
+ "name": "title",
187843
+ "required": true,
187844
+ "type": "string"
187845
+ }
187846
+ },
187847
+ "type": "object"
187848
+ }
187849
+ }
187850
+ ],
187851
+ "capabilities": [],
187852
+ "ticks": [],
187853
+ "rendersUi": true,
187854
+ "ref": "Tutorial.traits.TutorialOverlay",
187855
+ "category": "interaction",
187856
+ "entityRebindable": true,
187857
+ "linkedEntity": "PlatformerPuzzleData",
187858
+ "entityContract": {
187859
+ "requires": [],
187860
+ "provides": [
187861
+ "done",
187862
+ "step"
187863
+ ]
187864
+ },
187865
+ "transitionEvents": [
187866
+ "INIT",
187867
+ "SHOW",
187868
+ "TUT_AUTO",
187869
+ "TUT_BACK",
187870
+ "TUT_DISMISS",
187871
+ "TUT_NEXT"
187872
+ ],
187873
+ "definerKnobs": []
187874
+ },
187875
+ {
187876
+ "name": "PlatformerPuzzleNoopPreview",
187877
+ "orbital": "PlatformerPuzzleOrbital",
187878
+ "role": "reactor",
187879
+ "emittedEvents": [],
187880
+ "listenedEvents": [],
187881
+ "overridableConfigKeys": [],
187882
+ "capabilities": [],
187883
+ "ticks": [],
187884
+ "rendersUi": false,
187885
+ "category": "interaction",
187886
+ "linkedEntity": "PlatformerPuzzleData",
187887
+ "transitionEvents": [
187888
+ "INIT"
187889
+ ],
187890
+ "events": [
187891
+ {
187892
+ "name": "INIT",
187893
+ "direction": "listen"
187894
+ }
187895
+ ],
187896
+ "definerKnobs": []
187897
+ },
187898
+ {
187899
+ "name": "PlatformerPuzzle",
187900
+ "orbital": "PlatformerPuzzleOrbital",
187901
+ "role": "reactor",
187902
+ "emittedEvents": [],
187903
+ "listenedEvents": [],
187904
+ "overridableConfigKeys": [
187905
+ {
187906
+ "key": "agencyTrait",
187907
+ "type": "trait",
187908
+ "label": "Agency trait",
187909
+ "description": "Trait that provides player verbs and immediate response. Usually a rebinding of std-platformer-body, std-motion-body, or std-hero-nav.",
187910
+ "tier": "domain"
187911
+ },
187912
+ {
187913
+ "key": "backgroundAsset",
187914
+ "type": "Asset",
187915
+ "default": {},
187916
+ "label": "Background Asset",
187917
+ "description": "Game-shell background panel sprite (theme chrome).",
187918
+ "tier": "presentation",
187919
+ "properties": {
187920
+ "animations": {
187921
+ "name": "animations",
187922
+ "required": false,
187923
+ "type": "array",
187924
+ "items": {
187925
+ "type": "string"
187926
+ }
187927
+ },
187928
+ "aspect": {
187929
+ "name": "aspect",
187930
+ "required": false,
187931
+ "type": "string"
187932
+ },
187933
+ "atlas": {
187934
+ "name": "atlas",
187935
+ "required": false,
187936
+ "type": "string"
187937
+ },
187938
+ "category": {
187939
+ "name": "category",
187940
+ "required": false,
187941
+ "type": "string"
187942
+ },
187943
+ "dimension": {
187944
+ "name": "dimension",
187945
+ "required": false,
187946
+ "type": "string"
187947
+ },
187948
+ "name": {
187949
+ "name": "name",
187950
+ "required": false,
187951
+ "type": "string"
187952
+ },
187953
+ "role": {
187954
+ "name": "role",
187955
+ "required": false,
187956
+ "type": "string"
187957
+ },
187958
+ "sprite": {
187959
+ "name": "sprite",
187960
+ "required": false,
187961
+ "type": "string"
187962
+ },
187963
+ "style": {
187964
+ "name": "style",
187965
+ "required": false,
187966
+ "type": "string"
187967
+ },
187968
+ "thumbnailUrl": {
187969
+ "name": "thumbnailUrl",
187970
+ "required": false,
187971
+ "type": "string"
187972
+ },
187973
+ "url": {
187974
+ "name": "url",
187975
+ "required": false,
187976
+ "type": "string"
187977
+ },
187978
+ "variant": {
187979
+ "name": "variant",
187980
+ "required": false,
187981
+ "type": "string"
187982
+ }
187983
+ }
187984
+ },
187985
+ {
187986
+ "key": "challengeTrait",
187987
+ "type": "trait",
187988
+ "label": "Challenge trait",
187989
+ "description": "Trait that provides the obstacle, decision, or opposition. Usually a rebinding of std-choice-gate, std-gate-lock, std-patrol-hazard, std-velocity-gate, std-loop-lock, or std-pad-lock.",
187990
+ "tier": "domain"
187991
+ },
187992
+ {
187993
+ "key": "directionAssets",
187994
+ "type": "DirectionAssets",
187995
+ "default": {},
187996
+ "label": "Direction Assets",
187997
+ "description": "D-pad direction icon sprites.",
187998
+ "tier": "presentation",
187999
+ "properties": {
188000
+ "down": {
188001
+ "name": "down",
188002
+ "required": false,
188003
+ "properties": {
188004
+ "animations": {
188005
+ "name": "animations",
188006
+ "required": false,
188007
+ "type": "array",
188008
+ "items": {
188009
+ "type": "string"
188010
+ }
188011
+ },
188012
+ "aspect": {
188013
+ "name": "aspect",
188014
+ "required": false,
188015
+ "type": "string"
188016
+ },
188017
+ "atlas": {
188018
+ "name": "atlas",
188019
+ "required": false,
188020
+ "type": "string"
188021
+ },
188022
+ "category": {
188023
+ "name": "category",
188024
+ "required": false,
188025
+ "type": "string"
188026
+ },
188027
+ "dimension": {
188028
+ "name": "dimension",
188029
+ "required": false,
188030
+ "type": "string"
188031
+ },
188032
+ "name": {
188033
+ "name": "name",
188034
+ "required": false,
188035
+ "type": "string"
188036
+ },
188037
+ "role": {
188038
+ "name": "role",
188039
+ "required": false,
188040
+ "type": "string"
188041
+ },
188042
+ "sprite": {
188043
+ "name": "sprite",
188044
+ "required": false,
188045
+ "type": "string"
188046
+ },
188047
+ "style": {
188048
+ "name": "style",
188049
+ "required": false,
188050
+ "type": "string"
188051
+ },
188052
+ "thumbnailUrl": {
188053
+ "name": "thumbnailUrl",
188054
+ "required": false,
188055
+ "type": "string"
188056
+ },
188057
+ "url": {
188058
+ "name": "url",
188059
+ "required": false,
188060
+ "type": "string"
188061
+ },
188062
+ "variant": {
188063
+ "name": "variant",
188064
+ "required": false,
188065
+ "type": "string"
188066
+ }
188067
+ },
188068
+ "type": "object"
188069
+ },
188070
+ "left": {
188071
+ "name": "left",
188072
+ "required": false,
188073
+ "properties": {
188074
+ "animations": {
188075
+ "name": "animations",
188076
+ "required": false,
188077
+ "type": "array",
188078
+ "items": {
188079
+ "type": "string"
188080
+ }
188081
+ },
188082
+ "aspect": {
188083
+ "name": "aspect",
188084
+ "required": false,
188085
+ "type": "string"
188086
+ },
188087
+ "atlas": {
188088
+ "name": "atlas",
188089
+ "required": false,
188090
+ "type": "string"
188091
+ },
188092
+ "category": {
188093
+ "name": "category",
188094
+ "required": false,
188095
+ "type": "string"
188096
+ },
188097
+ "dimension": {
188098
+ "name": "dimension",
188099
+ "required": false,
188100
+ "type": "string"
188101
+ },
188102
+ "name": {
188103
+ "name": "name",
188104
+ "required": false,
188105
+ "type": "string"
188106
+ },
188107
+ "role": {
188108
+ "name": "role",
188109
+ "required": false,
188110
+ "type": "string"
188111
+ },
188112
+ "sprite": {
188113
+ "name": "sprite",
188114
+ "required": false,
188115
+ "type": "string"
188116
+ },
188117
+ "style": {
188118
+ "name": "style",
188119
+ "required": false,
188120
+ "type": "string"
188121
+ },
188122
+ "thumbnailUrl": {
188123
+ "name": "thumbnailUrl",
188124
+ "required": false,
188125
+ "type": "string"
188126
+ },
188127
+ "url": {
188128
+ "name": "url",
188129
+ "required": false,
188130
+ "type": "string"
188131
+ },
188132
+ "variant": {
188133
+ "name": "variant",
188134
+ "required": false,
188135
+ "type": "string"
188136
+ }
188137
+ },
188138
+ "type": "object"
188139
+ },
188140
+ "right": {
188141
+ "name": "right",
188142
+ "required": false,
188143
+ "properties": {
188144
+ "animations": {
188145
+ "name": "animations",
188146
+ "required": false,
188147
+ "type": "array",
188148
+ "items": {
188149
+ "type": "string"
188150
+ }
188151
+ },
188152
+ "aspect": {
188153
+ "name": "aspect",
188154
+ "required": false,
188155
+ "type": "string"
188156
+ },
188157
+ "atlas": {
188158
+ "name": "atlas",
188159
+ "required": false,
188160
+ "type": "string"
188161
+ },
188162
+ "category": {
188163
+ "name": "category",
188164
+ "required": false,
188165
+ "type": "string"
188166
+ },
188167
+ "dimension": {
188168
+ "name": "dimension",
188169
+ "required": false,
188170
+ "type": "string"
188171
+ },
188172
+ "name": {
188173
+ "name": "name",
188174
+ "required": false,
188175
+ "type": "string"
188176
+ },
188177
+ "role": {
188178
+ "name": "role",
188179
+ "required": false,
188180
+ "type": "string"
188181
+ },
188182
+ "sprite": {
188183
+ "name": "sprite",
188184
+ "required": false,
188185
+ "type": "string"
188186
+ },
188187
+ "style": {
188188
+ "name": "style",
188189
+ "required": false,
188190
+ "type": "string"
188191
+ },
188192
+ "thumbnailUrl": {
188193
+ "name": "thumbnailUrl",
188194
+ "required": false,
188195
+ "type": "string"
188196
+ },
188197
+ "url": {
188198
+ "name": "url",
188199
+ "required": false,
188200
+ "type": "string"
188201
+ },
188202
+ "variant": {
188203
+ "name": "variant",
188204
+ "required": false,
188205
+ "type": "string"
188206
+ }
188207
+ },
188208
+ "type": "object"
188209
+ },
188210
+ "up": {
188211
+ "name": "up",
188212
+ "required": false,
188213
+ "properties": {
188214
+ "animations": {
188215
+ "name": "animations",
188216
+ "required": false,
188217
+ "type": "array",
188218
+ "items": {
188219
+ "type": "string"
188220
+ }
188221
+ },
188222
+ "aspect": {
188223
+ "name": "aspect",
188224
+ "required": false,
188225
+ "type": "string"
188226
+ },
188227
+ "atlas": {
188228
+ "name": "atlas",
188229
+ "required": false,
188230
+ "type": "string"
188231
+ },
188232
+ "category": {
188233
+ "name": "category",
188234
+ "required": false,
188235
+ "type": "string"
188236
+ },
188237
+ "dimension": {
188238
+ "name": "dimension",
188239
+ "required": false,
188240
+ "type": "string"
188241
+ },
188242
+ "name": {
188243
+ "name": "name",
188244
+ "required": false,
188245
+ "type": "string"
188246
+ },
188247
+ "role": {
188248
+ "name": "role",
188249
+ "required": false,
188250
+ "type": "string"
188251
+ },
188252
+ "sprite": {
188253
+ "name": "sprite",
188254
+ "required": false,
188255
+ "type": "string"
188256
+ },
188257
+ "style": {
188258
+ "name": "style",
188259
+ "required": false,
188260
+ "type": "string"
188261
+ },
188262
+ "thumbnailUrl": {
188263
+ "name": "thumbnailUrl",
188264
+ "required": false,
188265
+ "type": "string"
188266
+ },
188267
+ "url": {
188268
+ "name": "url",
188269
+ "required": false,
188270
+ "type": "string"
188271
+ },
188272
+ "variant": {
188273
+ "name": "variant",
188274
+ "required": false,
188275
+ "type": "string"
188276
+ }
188277
+ },
188278
+ "type": "object"
188279
+ }
188280
+ }
188281
+ },
188282
+ {
188283
+ "key": "feedbackTrait",
188284
+ "type": "trait",
188285
+ "label": "Feedback trait",
188286
+ "description": "Trait that provides visual, audio, or narrative feedback. Usually a rebinding of std-fx-particles, std-fx-narrative, std-tutorial-overlay, std-audio-cue, or std-zone-card.",
188287
+ "tier": "domain"
188288
+ },
188289
+ {
188290
+ "key": "goalTrait",
188291
+ "type": "trait",
188292
+ "label": "Goal trait",
188293
+ "description": "Trait that resolves the win condition. Usually a rebinding of std-objective-flow or std-objective-reach.",
188294
+ "tier": "domain"
188295
+ },
188296
+ {
188297
+ "key": "hudBackgroundAsset",
188298
+ "type": "Asset",
188299
+ "default": {},
188300
+ "label": "HUD Background Asset",
188301
+ "description": "HUD panel background sprite (theme chrome).",
188302
+ "tier": "presentation",
188303
+ "properties": {
188304
+ "animations": {
188305
+ "name": "animations",
188306
+ "required": false,
188307
+ "type": "array",
188308
+ "items": {
188309
+ "type": "string"
188310
+ }
188311
+ },
188312
+ "aspect": {
188313
+ "name": "aspect",
188314
+ "required": false,
188315
+ "type": "string"
188316
+ },
188317
+ "atlas": {
188318
+ "name": "atlas",
188319
+ "required": false,
188320
+ "type": "string"
188321
+ },
188322
+ "category": {
188323
+ "name": "category",
188324
+ "required": false,
188325
+ "type": "string"
188326
+ },
188327
+ "dimension": {
188328
+ "name": "dimension",
188329
+ "required": false,
188330
+ "type": "string"
188331
+ },
188332
+ "name": {
188333
+ "name": "name",
188334
+ "required": false,
188335
+ "type": "string"
188336
+ },
188337
+ "role": {
188338
+ "name": "role",
188339
+ "required": false,
188340
+ "type": "string"
188341
+ },
188342
+ "sprite": {
188343
+ "name": "sprite",
188344
+ "required": false,
188345
+ "type": "string"
188346
+ },
188347
+ "style": {
188348
+ "name": "style",
188349
+ "required": false,
188350
+ "type": "string"
188351
+ },
188352
+ "thumbnailUrl": {
188353
+ "name": "thumbnailUrl",
188354
+ "required": false,
188355
+ "type": "string"
188356
+ },
188357
+ "url": {
188358
+ "name": "url",
188359
+ "required": false,
188360
+ "type": "string"
188361
+ },
188362
+ "variant": {
188363
+ "name": "variant",
188364
+ "required": false,
188365
+ "type": "string"
188366
+ }
188367
+ }
188368
+ },
188369
+ {
188370
+ "key": "rewardTrait",
188371
+ "type": "trait",
188372
+ "label": "Reward trait",
188373
+ "description": "Trait that provides collectibles or scoring. Usually a rebinding of std-pickup, std-score, std-xp, or std-gold.",
188374
+ "tier": "domain"
188375
+ }
188376
+ ],
188377
+ "capabilities": [],
188378
+ "ticks": [],
188379
+ "rendersUi": false,
188380
+ "category": "interaction",
188381
+ "entityRebindable": true,
188382
+ "linkedEntity": "PlatformerPuzzleData",
188383
+ "entityContract": {
188384
+ "requires": [],
188385
+ "provides": []
188386
+ },
188387
+ "transitionEvents": [
188388
+ "INIT"
188389
+ ],
188390
+ "events": [
188391
+ {
188392
+ "name": "INIT",
188393
+ "direction": "listen"
188394
+ }
188395
+ ],
188396
+ "definerKnobs": []
188397
+ }
188398
+ ],
188399
+ "factoryPath": "behaviors/functions/ui/game/organisms/std-platformer-puzzle.ts",
188400
+ "roles": [
188401
+ "authority",
188402
+ "reactor",
188403
+ "renderer"
188404
+ ],
188405
+ "sourceValid": true
188406
+ },
186624
188407
  "std-survival-board-3d": {
186625
188408
  "name": "std-survival-board-3d",
186626
188409
  "level": "organism",
@@ -186899,6 +188682,7 @@
186899
188682
  "std-pickup",
186900
188683
  "std-platformer-board-2d",
186901
188684
  "std-platformer-body",
188685
+ "std-platformer-puzzle",
186902
188686
  "std-pong",
186903
188687
  "std-pong-rally",
186904
188688
  "std-production",
@@ -188660,6 +190444,7 @@
188660
190444
  "std-pickup",
188661
190445
  "std-platformer-board-2d",
188662
190446
  "std-platformer-body",
190447
+ "std-platformer-puzzle",
188663
190448
  "std-production",
188664
190449
  "std-purchase-order",
188665
190450
  "std-round-flow",
@@ -190663,6 +192448,7 @@
190663
192448
  "std-pickup",
190664
192449
  "std-platformer-board-2d",
190665
192450
  "std-platformer-body",
192451
+ "std-platformer-puzzle",
190666
192452
  "std-production",
190667
192453
  "std-purchase-order",
190668
192454
  "std-round-flow",
@@ -192742,6 +194528,7 @@
192742
194528
  "std-pickup",
192743
194529
  "std-platformer-board-2d",
192744
194530
  "std-platformer-body",
194531
+ "std-platformer-puzzle",
192745
194532
  "std-production",
192746
194533
  "std-round-flow",
192747
194534
  "std-score",
@@ -194353,6 +196140,7 @@
194353
196140
  "std-pickup",
194354
196141
  "std-platformer-board-2d",
194355
196142
  "std-platformer-body",
196143
+ "std-platformer-puzzle",
194356
196144
  "std-production",
194357
196145
  "std-round-flow",
194358
196146
  "std-score",