@pix3/cli 1.6.0 → 1.6.2

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 (126) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +788 -754
  3. package/dist/index.js +208 -203
  4. package/dist/runtime-types.json +1 -1
  5. package/dist/smoke/prebuilt/{chunk-J2SJVMDO.mjs → chunk-7MZGPAUK.mjs} +1 -1
  6. package/dist/smoke/prebuilt/chunk-7WOFGLW3.mjs +239 -0
  7. package/dist/smoke/prebuilt/runtime.mjs +1 -1
  8. package/dist/smoke/prebuilt/smoke-worker.mjs +1 -1
  9. package/dist/smoke/prebuilt/tree-defaults.mjs +1 -1
  10. package/dist/validate/prebuilt/bundle-main.js +13 -13
  11. package/dist/validate/prebuilt/chunk-HKG6YI6Y.js +239 -0
  12. package/dist/validate/prebuilt/runtime.js +1 -1
  13. package/kit/files/.claude/skills/pix3-nodes/SKILL.md +210 -210
  14. package/kit/files/.claude/skills/pix3-nodes/reference.md +32 -24
  15. package/kit/files/.claude/skills/pix3-scene-format/SKILL.md +238 -235
  16. package/kit/files/.claude/skills/pix3-scene-format/reference.md +28 -28
  17. package/kit/files/.claude/skills/pix3-scripts/SKILL.md +285 -281
  18. package/kit/files/.claude/skills/pix3-scripts/reference.md +69 -52
  19. package/kit/files/.claude/skills/pix3-verify/SKILL.md +298 -256
  20. package/kit/files/.claude/skills/pix3-verify/reference.md +21 -21
  21. package/kit/files/AGENTS.md +203 -203
  22. package/kit/files/CLAUDE.md +1 -1
  23. package/kit/kit.json +2 -2
  24. package/package.json +54 -54
  25. package/templates/empty-2d/files/README.md +20 -20
  26. package/templates/empty-2d/files/scenes/main.pix3scene +68 -68
  27. package/templates/empty-2d/template.yaml +7 -7
  28. package/templates/empty-3d/files/README.md +20 -20
  29. package/templates/empty-3d/files/scenes/main.pix3scene +108 -108
  30. package/templates/empty-3d/template.yaml +7 -7
  31. package/templates/idea-blank/files/README.md +22 -22
  32. package/templates/idea-blank/files/scenes/main.pix3scene +37 -37
  33. package/templates/idea-blank/template.yaml +10 -10
  34. package/templates/minigame-2d/files/README.md +44 -44
  35. package/templates/minigame-2d/files/design/tests/reachability.json +1 -1
  36. package/templates/minigame-2d/files/design/tests/routines/mute-music.json +44 -44
  37. package/templates/minigame-2d/files/scenes/main.pix3scene +84 -84
  38. package/templates/minigame-2d/files/scenes/menu.pix3scene +118 -118
  39. package/templates/minigame-2d/files/scenes/ui/settings-window.pix3scene +138 -138
  40. package/templates/minigame-2d/files/scripts/GameFlow.ts +133 -133
  41. package/templates/minigame-2d/files/scripts/MenuFlow.ts +217 -217
  42. package/templates/minigame-2d/files/scripts/SettingsWindow.ts +198 -198
  43. package/templates/minigame-2d/template.yaml +10 -10
  44. package/templates/playable-2d/files/README.md +30 -30
  45. package/templates/playable-2d/files/design/recipe.md +83 -83
  46. package/templates/playable-2d/files/design/tests/reachability.json +4 -4
  47. package/templates/playable-2d/files/design/tests/routines/intro-to-cta.json +32 -32
  48. package/templates/playable-2d/files/scenes/main.pix3scene +111 -111
  49. package/templates/playable-2d/files/scenes/ui/end-screen.pix3scene +91 -91
  50. package/templates/playable-2d/files/scenes/ui/intro.pix3scene +65 -65
  51. package/templates/playable-2d/files/scripts/GameFlow.ts +256 -256
  52. package/templates/playable-2d/template.yaml +9 -9
  53. package/templates/playable-3d/files/README.md +32 -32
  54. package/templates/playable-3d/files/design/recipe.md +127 -127
  55. package/templates/playable-3d/files/design/tests/reachability.json +4 -4
  56. package/templates/playable-3d/files/design/tests/routines/intro-to-cta.json +32 -32
  57. package/templates/playable-3d/files/scenes/main.pix3scene +230 -230
  58. package/templates/playable-3d/files/scenes/ui/end-screen.pix3scene +91 -91
  59. package/templates/playable-3d/files/scenes/ui/intro.pix3scene +65 -65
  60. package/templates/playable-3d/files/scripts/GameFlow.ts +309 -309
  61. package/templates/playable-3d/files/scripts/GameRules.ts +290 -290
  62. package/templates/playable-3d/files/scripts/ScoreHud.ts +113 -113
  63. package/templates/playable-3d/template.yaml +9 -9
  64. package/templates/recipe-arena-2d/files/README.md +48 -48
  65. package/templates/recipe-arena-2d/files/design/recipe.md +127 -127
  66. package/templates/recipe-arena-2d/files/scenes/main.pix3scene +292 -292
  67. package/templates/recipe-arena-2d/files/scenes/menu.pix3scene +100 -100
  68. package/templates/recipe-arena-2d/files/scenes/prefabs/hazard.pix3scene +42 -42
  69. package/templates/recipe-arena-2d/files/scenes/prefabs/pickup.pix3scene +45 -45
  70. package/templates/recipe-arena-2d/files/scenes/ui/result.pix3scene +85 -85
  71. package/templates/recipe-arena-2d/files/scripts/GameRules.ts +368 -368
  72. package/templates/recipe-arena-2d/files/scripts/MenuFlow.ts +106 -106
  73. package/templates/recipe-arena-2d/files/scripts/PlayerController.ts +151 -151
  74. package/templates/recipe-arena-2d/files/scripts/ScoreHud.ts +94 -94
  75. package/templates/recipe-arena-2d/files/scripts/Spawner.ts +214 -214
  76. package/templates/recipe-arena-2d/files/scripts/TouchRules.ts +174 -174
  77. package/templates/recipe-arena-2d/template.yaml +10 -10
  78. package/templates/recipe-blank-2d/files/README.md +61 -61
  79. package/templates/recipe-blank-2d/files/design/recipe.md +148 -148
  80. package/templates/recipe-blank-2d/files/design/tests/reachability.json +4 -4
  81. package/templates/recipe-blank-2d/files/design/tests/routines/restart.json +27 -27
  82. package/templates/recipe-blank-2d/files/scenes/main.pix3scene +224 -224
  83. package/templates/recipe-blank-2d/files/scenes/ui/result.pix3scene +85 -85
  84. package/templates/recipe-blank-2d/files/scripts/GameRules.ts +350 -350
  85. package/templates/recipe-blank-2d/files/scripts/ScoreHud.ts +110 -110
  86. package/templates/recipe-blank-2d/template.yaml +10 -10
  87. package/templates/recipe-bouncer-2d/files/README.md +81 -81
  88. package/templates/recipe-bouncer-2d/files/design/recipe.md +146 -146
  89. package/templates/recipe-bouncer-2d/files/scenes/main.pix3scene +615 -615
  90. package/templates/recipe-bouncer-2d/files/scenes/menu.pix3scene +191 -191
  91. package/templates/recipe-bouncer-2d/files/scenes/ui/result.pix3scene +87 -87
  92. package/templates/recipe-bouncer-2d/files/scripts/BallBody.ts +298 -298
  93. package/templates/recipe-bouncer-2d/files/scripts/GameRules.ts +377 -377
  94. package/templates/recipe-bouncer-2d/files/scripts/MenuFlow.ts +109 -109
  95. package/templates/recipe-bouncer-2d/files/scripts/PaddleController.ts +112 -112
  96. package/templates/recipe-bouncer-2d/files/scripts/ScoreHud.ts +94 -94
  97. package/templates/recipe-bouncer-2d/files/scripts/TouchRules.ts +263 -263
  98. package/templates/recipe-bouncer-2d/files/scripts/ball-collision.ts +307 -307
  99. package/templates/recipe-bouncer-2d/template.yaml +10 -10
  100. package/templates/recipe-grid-3d/files/README.md +22 -22
  101. package/templates/recipe-grid-3d/files/design/recipe.md +110 -110
  102. package/templates/recipe-grid-3d/files/scenes/main.pix3scene +169 -169
  103. package/templates/recipe-grid-3d/files/scenes/menu.pix3scene +100 -100
  104. package/templates/recipe-grid-3d/files/scenes/ui/result.pix3scene +105 -105
  105. package/templates/recipe-grid-3d/files/scripts/GridBoard.ts +319 -319
  106. package/templates/recipe-grid-3d/files/scripts/GridRules.ts +278 -278
  107. package/templates/recipe-grid-3d/files/scripts/MenuFlow.ts +106 -106
  108. package/templates/recipe-grid-3d/files/scripts/ScoreHud.ts +94 -94
  109. package/templates/recipe-grid-3d/template.yaml +10 -10
  110. package/templates/recipe-tapper-2d/files/README.md +39 -39
  111. package/templates/recipe-tapper-2d/files/design/recipe.md +132 -132
  112. package/templates/recipe-tapper-2d/files/design/tests/reachability.json +4 -4
  113. package/templates/recipe-tapper-2d/files/design/tests/routines/terminal-retry.json +23 -23
  114. package/templates/recipe-tapper-2d/files/scenes/main.pix3scene +269 -269
  115. package/templates/recipe-tapper-2d/files/scenes/menu.pix3scene +100 -100
  116. package/templates/recipe-tapper-2d/files/scenes/prefabs/hazard.pix3scene +42 -42
  117. package/templates/recipe-tapper-2d/files/scenes/prefabs/target.pix3scene +45 -45
  118. package/templates/recipe-tapper-2d/files/scenes/ui/result.pix3scene +85 -85
  119. package/templates/recipe-tapper-2d/files/scripts/GameRules.ts +368 -368
  120. package/templates/recipe-tapper-2d/files/scripts/MenuFlow.ts +106 -106
  121. package/templates/recipe-tapper-2d/files/scripts/ScoreHud.ts +94 -94
  122. package/templates/recipe-tapper-2d/files/scripts/Spawner.ts +214 -214
  123. package/templates/recipe-tapper-2d/files/scripts/TouchRules.ts +192 -192
  124. package/templates/recipe-tapper-2d/template.yaml +10 -10
  125. package/dist/smoke/prebuilt/chunk-OJXQXIIQ.mjs +0 -239
  126. package/dist/validate/prebuilt/chunk-BS2OZM7U.js +0 -239
@@ -1,269 +1,269 @@
1
- # Pix3 Scene File (YAML)
2
- # Tapper 2D — the GAME scene, and the editor's startup scene: iterate here.
3
- # A full build boots the MENU (menu.pix3scene), whose PLAY transitions here.
4
- #
5
- # Objects fall into the board; tapping them is the whole game. A tap is
6
- # hit-tested (scripts/TouchRules.ts) against the `core:Hitbox2D` group each
7
- # prefab carries: `target` scores, `hazard` costs a life.
8
- #
9
- # Stable node ids (design/recipe.md is the contract — do not rename these):
10
- # game-root, game-background, board, spawner-targets, spawner-hazards,
11
- # hud, score-label, time-label, lives-bar, menu-button,
12
- # result-overlay, result-label, retry-button (scenes/ui/result.pix3scene)
13
- #
14
- # Full-screen UI lives in its own file under scenes/ui/ and is instanced here
15
- # hidden (`visible: false` = editor only), so opening this scene shows the game
16
- # rather than a GAME OVER card.
17
- #
18
- # 2D coordinates: origin at the canvas centre, X right, Y UP. Node order in the
19
- # tree is paint order (later/deeper draws on top).
20
- version: 1.0.0
21
- metadata:
22
- author: Pix3 Recipe
23
- description: Tapper gameplay — falling objects, tap the good ones, avoid the bad
24
- root:
25
- - id: game-root
26
- type: Group2D
27
- name: Game Root
28
- properties:
29
- width: 1080
30
- height: 1920
31
- layout:
32
- enabled: true
33
- horizontalAlign: stretch
34
- verticalAlign: stretch
35
- components:
36
- - id: game-rules
37
- type: user:GameRules
38
- enabled: true
39
- config:
40
- winMode: time
41
- targetScore: 18
42
- timeLimitSec: 30
43
- startingLives: 3
44
- resultNode: result-overlay
45
- resultLabel: result-label
46
- winText: "YOU WIN!"
47
- loseText: "GAME OVER"
48
- retryButton: retry-button
49
- menuButton: menu-button
50
- menuScene: res://scenes/menu.pix3scene
51
- gameScene: res://scenes/main.pix3scene
52
- freezeNodes: spawner-targets,spawner-hazards
53
- - id: touch-rules
54
- type: user:TouchRules
55
- enabled: true
56
- config:
57
- rules: "target:score:1;hazard:damage:1"
58
- tapRadius: 40
59
- missPenalty: 0
60
- consume: true
61
- scoreSound: ""
62
- damageSound: ""
63
- children:
64
- - id: game-background
65
- type: ColorRect2D
66
- name: Game Background
67
- properties:
68
- width: 1080
69
- height: 1920
70
- color: "#141a2e"
71
- transform:
72
- position: [0, 0]
73
- scale: [1, 1]
74
- rotation: 0
75
- layout:
76
- enabled: true
77
- horizontalAlign: stretch
78
- verticalAlign: stretch
79
- children: []
80
- - id: board
81
- type: Group2D
82
- name: Board
83
- properties:
84
- width: 980
85
- height: 1480
86
- transform:
87
- position: [0, -80]
88
- scale: [1, 1]
89
- rotation: 0
90
- children:
91
- - id: board-floor
92
- type: ColorRect2D
93
- name: Board Floor
94
- properties:
95
- width: 980
96
- height: 1480
97
- color: "#1d2743"
98
- transform:
99
- position: [0, 0]
100
- scale: [1, 1]
101
- rotation: 0
102
- children: []
103
- - id: spawner-targets
104
- type: Group2D
105
- name: Spawner Targets
106
- properties:
107
- width: 900
108
- height: 60
109
- transform:
110
- position: [0, 690]
111
- scale: [1, 1]
112
- rotation: 0
113
- components:
114
- - id: target-spawner
115
- type: user:Spawner
116
- enabled: true
117
- config:
118
- prefab: res://scenes/prefabs/target.pix3scene
119
- parentNode: ""
120
- intervalSec: 0.85
121
- intervalJitter: 0.3
122
- maxAlive: 8
123
- spawnWidth: 820
124
- spawnHeight: 60
125
- gridSnap: 0
126
- driftX: 0
127
- driftY: -230
128
- lifetimeSec: 8
129
- despawnRadius: 1450
130
- startDelaySec: 0.3
131
- children: []
132
- - id: spawner-hazards
133
- type: Group2D
134
- name: Spawner Hazards
135
- properties:
136
- width: 900
137
- height: 60
138
- transform:
139
- position: [0, 690]
140
- scale: [1, 1]
141
- rotation: 0
142
- components:
143
- - id: hazard-spawner
144
- type: user:Spawner
145
- enabled: true
146
- config:
147
- prefab: res://scenes/prefabs/hazard.pix3scene
148
- parentNode: ""
149
- intervalSec: 2.2
150
- intervalJitter: 0.8
151
- maxAlive: 5
152
- spawnWidth: 820
153
- spawnHeight: 60
154
- gridSnap: 0
155
- driftX: 0
156
- driftY: -260
157
- lifetimeSec: 8
158
- despawnRadius: 1450
159
- startDelaySec: 1.5
160
- children: []
161
- - id: hud
162
- type: CanvasLayer2D
163
- name: HUD
164
- properties:
165
- width: 1080
166
- height: 1920
167
- layout:
168
- enabled: true
169
- horizontalAlign: stretch
170
- verticalAlign: stretch
171
- components:
172
- - id: score-hud
173
- type: user:ScoreHud
174
- enabled: true
175
- config:
176
- sourceNode: game-root
177
- scoreLabel: score-label
178
- scoreFormat: "SCORE {value}"
179
- timeLabel: time-label
180
- timeFormat: "{value}"
181
- livesBar: lives-bar
182
- children:
183
- - id: score-label
184
- type: Label2D
185
- name: Score Label
186
- properties:
187
- label: "SCORE 0"
188
- labelFontSize: 44
189
- labelColor: "#ffffff"
190
- labelAlign: left
191
- transform:
192
- position: [-340, 850]
193
- scale: [1, 1]
194
- rotation: 0
195
- layout:
196
- enabled: true
197
- horizontalAlign: left
198
- verticalAlign: top
199
- children: []
200
- - id: time-label
201
- type: Label2D
202
- name: Time Label
203
- properties:
204
- label: "30"
205
- labelFontSize: 44
206
- labelColor: "#f5ae39"
207
- labelAlign: center
208
- transform:
209
- position: [0, 850]
210
- scale: [1, 1]
211
- rotation: 0
212
- layout:
213
- enabled: true
214
- horizontalAlign: center
215
- verticalAlign: top
216
- children: []
217
- - id: lives-bar
218
- type: Bar2D
219
- name: Lives Bar
220
- properties:
221
- width: 240
222
- height: 28
223
- minValue: 0
224
- maxValue: 3
225
- value: 3
226
- barColor: "#ff4d6d"
227
- backBackgroundColor: "#2a3352"
228
- showBorder: false
229
- transform:
230
- position: [340, 855]
231
- scale: [1, 1]
232
- rotation: 0
233
- layout:
234
- enabled: true
235
- horizontalAlign: right
236
- verticalAlign: top
237
- children: []
238
- - id: menu-button
239
- type: Button2D
240
- name: Menu Button
241
- properties:
242
- width: 200
243
- height: 72
244
- label: "MENU"
245
- labelFontSize: 30
246
- labelColor: "#ffffff"
247
- backgroundColor: "#2a3352"
248
- hoverColor: "#3a446b"
249
- pressedColor: "#1d2743"
250
- buttonAction: back-to-menu
251
- transform:
252
- position: [-400, -880]
253
- scale: [1, 1]
254
- rotation: 0
255
- layout:
256
- enabled: true
257
- horizontalAlign: left
258
- verticalAlign: bottom
259
- children: []
260
- # Win/lose screen — authored in scenes/ui/result.pix3scene so this
261
- # scene opens on the GAME, not on a GAME OVER card. `visible: false`
262
- # hides it in the EDITOR only; `initiallyVisible` (in the overlay
263
- # file) is what play mode reads, and GameRules reveals it on the
264
- # win/lose transition. Tick the eye to preview it over the field.
265
- - id: result-overlay
266
- name: Result Overlay
267
- instance: res://scenes/ui/result.pix3scene
268
- properties:
269
- visible: false
1
+ # Pix3 Scene File (YAML)
2
+ # Tapper 2D — the GAME scene, and the editor's startup scene: iterate here.
3
+ # A full build boots the MENU (menu.pix3scene), whose PLAY transitions here.
4
+ #
5
+ # Objects fall into the board; tapping them is the whole game. A tap is
6
+ # hit-tested (scripts/TouchRules.ts) against the `core:Hitbox2D` group each
7
+ # prefab carries: `target` scores, `hazard` costs a life.
8
+ #
9
+ # Stable node ids (design/recipe.md is the contract — do not rename these):
10
+ # game-root, game-background, board, spawner-targets, spawner-hazards,
11
+ # hud, score-label, time-label, lives-bar, menu-button,
12
+ # result-overlay, result-label, retry-button (scenes/ui/result.pix3scene)
13
+ #
14
+ # Full-screen UI lives in its own file under scenes/ui/ and is instanced here
15
+ # hidden (`visible: false` = editor only), so opening this scene shows the game
16
+ # rather than a GAME OVER card.
17
+ #
18
+ # 2D coordinates: origin at the canvas centre, X right, Y UP. Node order in the
19
+ # tree is paint order (later/deeper draws on top).
20
+ version: 1.0.0
21
+ metadata:
22
+ author: Pix3 Recipe
23
+ description: Tapper gameplay — falling objects, tap the good ones, avoid the bad
24
+ root:
25
+ - id: game-root
26
+ type: Group2D
27
+ name: Game Root
28
+ properties:
29
+ width: 1080
30
+ height: 1920
31
+ layout:
32
+ enabled: true
33
+ horizontalAlign: stretch
34
+ verticalAlign: stretch
35
+ components:
36
+ - id: game-rules
37
+ type: user:GameRules
38
+ enabled: true
39
+ config:
40
+ winMode: time
41
+ targetScore: 18
42
+ timeLimitSec: 30
43
+ startingLives: 3
44
+ resultNode: result-overlay
45
+ resultLabel: result-label
46
+ winText: "YOU WIN!"
47
+ loseText: "GAME OVER"
48
+ retryButton: retry-button
49
+ menuButton: menu-button
50
+ menuScene: res://scenes/menu.pix3scene
51
+ gameScene: res://scenes/main.pix3scene
52
+ freezeNodes: spawner-targets,spawner-hazards
53
+ - id: touch-rules
54
+ type: user:TouchRules
55
+ enabled: true
56
+ config:
57
+ rules: "target:score:1;hazard:damage:1"
58
+ tapRadius: 40
59
+ missPenalty: 0
60
+ consume: true
61
+ scoreSound: ""
62
+ damageSound: ""
63
+ children:
64
+ - id: game-background
65
+ type: ColorRect2D
66
+ name: Game Background
67
+ properties:
68
+ width: 1080
69
+ height: 1920
70
+ color: "#141a2e"
71
+ transform:
72
+ position: [0, 0]
73
+ scale: [1, 1]
74
+ rotation: 0
75
+ layout:
76
+ enabled: true
77
+ horizontalAlign: stretch
78
+ verticalAlign: stretch
79
+ children: []
80
+ - id: board
81
+ type: Group2D
82
+ name: Board
83
+ properties:
84
+ width: 980
85
+ height: 1480
86
+ transform:
87
+ position: [0, -80]
88
+ scale: [1, 1]
89
+ rotation: 0
90
+ children:
91
+ - id: board-floor
92
+ type: ColorRect2D
93
+ name: Board Floor
94
+ properties:
95
+ width: 980
96
+ height: 1480
97
+ color: "#1d2743"
98
+ transform:
99
+ position: [0, 0]
100
+ scale: [1, 1]
101
+ rotation: 0
102
+ children: []
103
+ - id: spawner-targets
104
+ type: Group2D
105
+ name: Spawner Targets
106
+ properties:
107
+ width: 900
108
+ height: 60
109
+ transform:
110
+ position: [0, 690]
111
+ scale: [1, 1]
112
+ rotation: 0
113
+ components:
114
+ - id: target-spawner
115
+ type: user:Spawner
116
+ enabled: true
117
+ config:
118
+ prefab: res://scenes/prefabs/target.pix3scene
119
+ parentNode: ""
120
+ intervalSec: 0.85
121
+ intervalJitter: 0.3
122
+ maxAlive: 8
123
+ spawnWidth: 820
124
+ spawnHeight: 60
125
+ gridSnap: 0
126
+ driftX: 0
127
+ driftY: -230
128
+ lifetimeSec: 8
129
+ despawnRadius: 1450
130
+ startDelaySec: 0.3
131
+ children: []
132
+ - id: spawner-hazards
133
+ type: Group2D
134
+ name: Spawner Hazards
135
+ properties:
136
+ width: 900
137
+ height: 60
138
+ transform:
139
+ position: [0, 690]
140
+ scale: [1, 1]
141
+ rotation: 0
142
+ components:
143
+ - id: hazard-spawner
144
+ type: user:Spawner
145
+ enabled: true
146
+ config:
147
+ prefab: res://scenes/prefabs/hazard.pix3scene
148
+ parentNode: ""
149
+ intervalSec: 2.2
150
+ intervalJitter: 0.8
151
+ maxAlive: 5
152
+ spawnWidth: 820
153
+ spawnHeight: 60
154
+ gridSnap: 0
155
+ driftX: 0
156
+ driftY: -260
157
+ lifetimeSec: 8
158
+ despawnRadius: 1450
159
+ startDelaySec: 1.5
160
+ children: []
161
+ - id: hud
162
+ type: CanvasLayer2D
163
+ name: HUD
164
+ properties:
165
+ width: 1080
166
+ height: 1920
167
+ layout:
168
+ enabled: true
169
+ horizontalAlign: stretch
170
+ verticalAlign: stretch
171
+ components:
172
+ - id: score-hud
173
+ type: user:ScoreHud
174
+ enabled: true
175
+ config:
176
+ sourceNode: game-root
177
+ scoreLabel: score-label
178
+ scoreFormat: "SCORE {value}"
179
+ timeLabel: time-label
180
+ timeFormat: "{value}"
181
+ livesBar: lives-bar
182
+ children:
183
+ - id: score-label
184
+ type: Label2D
185
+ name: Score Label
186
+ properties:
187
+ label: "SCORE 0"
188
+ labelFontSize: 44
189
+ labelColor: "#ffffff"
190
+ labelAlign: left
191
+ transform:
192
+ position: [-340, 850]
193
+ scale: [1, 1]
194
+ rotation: 0
195
+ layout:
196
+ enabled: true
197
+ horizontalAlign: left
198
+ verticalAlign: top
199
+ children: []
200
+ - id: time-label
201
+ type: Label2D
202
+ name: Time Label
203
+ properties:
204
+ label: "30"
205
+ labelFontSize: 44
206
+ labelColor: "#f5ae39"
207
+ labelAlign: center
208
+ transform:
209
+ position: [0, 850]
210
+ scale: [1, 1]
211
+ rotation: 0
212
+ layout:
213
+ enabled: true
214
+ horizontalAlign: center
215
+ verticalAlign: top
216
+ children: []
217
+ - id: lives-bar
218
+ type: Bar2D
219
+ name: Lives Bar
220
+ properties:
221
+ width: 240
222
+ height: 28
223
+ minValue: 0
224
+ maxValue: 3
225
+ value: 3
226
+ barColor: "#ff4d6d"
227
+ backBackgroundColor: "#2a3352"
228
+ showBorder: false
229
+ transform:
230
+ position: [340, 855]
231
+ scale: [1, 1]
232
+ rotation: 0
233
+ layout:
234
+ enabled: true
235
+ horizontalAlign: right
236
+ verticalAlign: top
237
+ children: []
238
+ - id: menu-button
239
+ type: Button2D
240
+ name: Menu Button
241
+ properties:
242
+ width: 200
243
+ height: 72
244
+ label: "MENU"
245
+ labelFontSize: 30
246
+ labelColor: "#ffffff"
247
+ backgroundColor: "#2a3352"
248
+ hoverColor: "#3a446b"
249
+ pressedColor: "#1d2743"
250
+ buttonAction: back-to-menu
251
+ transform:
252
+ position: [-400, -880]
253
+ scale: [1, 1]
254
+ rotation: 0
255
+ layout:
256
+ enabled: true
257
+ horizontalAlign: left
258
+ verticalAlign: bottom
259
+ children: []
260
+ # Win/lose screen — authored in scenes/ui/result.pix3scene so this
261
+ # scene opens on the GAME, not on a GAME OVER card. `visible: false`
262
+ # hides it in the EDITOR only; `initiallyVisible` (in the overlay
263
+ # file) is what play mode reads, and GameRules reveals it on the
264
+ # win/lose transition. Tick the eye to preview it over the field.
265
+ - id: result-overlay
266
+ name: Result Overlay
267
+ instance: res://scenes/ui/result.pix3scene
268
+ properties:
269
+ visible: false