@almadar/std 16.108.0 → 16.109.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 (90) hide show
  1. package/behaviors/registry/ui/game/2d/organisms/ui-battle-board.orb +213 -125
  2. package/behaviors/registry/ui/game/2d/organisms/ui-fishing-board.orb +2302 -705
  3. package/behaviors/registry/ui/game/2d/organisms/ui-minigolf-board.orb +7872 -1934
  4. package/behaviors/registry/ui/game/2d/organisms/ui-pinball-board.orb +2739 -3050
  5. package/behaviors/registry/ui/game/2d/organisms/ui-roguelike-board.orb +5204 -2967
  6. package/behaviors/registry/ui/game/2d/organisms/ui-sokoban-board.orb +3330 -1619
  7. package/behaviors/registry/ui/game/2d/organisms/ui-space-shmup-board.orb +4637 -4059
  8. package/behaviors/registry/ui/game/2d/organisms/ui-tanks-board.orb +76 -103
  9. package/behaviors/registry/ui/game/2d/organisms/ui-topdown-dungeon-board.orb +4579 -4356
  10. package/behaviors/registry/ui/game/2d/organisms/ui-uncontrolled-battle-board.orb +1164 -2247
  11. package/behaviors/registry/ui/game/2d/organisms/ui-winter-ski-board.orb +4573 -4553
  12. package/behaviors/registry/ui/game/3d/organisms/ui-arcade-board-3d.orb +379 -2
  13. package/behaviors/registry/ui/game/3d/organisms/ui-brick-sandbox-board-3d.orb +168 -1
  14. package/behaviors/registry/ui/game/3d/organisms/ui-city-board-3d.orb +801 -169
  15. package/behaviors/registry/ui/game/3d/organisms/ui-fantasy-town-board-3d.orb +1666 -702
  16. package/behaviors/registry/ui/game/3d/organisms/ui-game-board-3d.orb +1323 -514
  17. package/behaviors/registry/ui/game/3d/organisms/ui-graveyard-board-3d.orb +1186 -384
  18. package/behaviors/registry/ui/game/3d/organisms/ui-hex-strategy-board-3d.orb +342 -170
  19. package/behaviors/registry/ui/game/3d/organisms/ui-holiday-board-3d.orb +509 -3
  20. package/behaviors/registry/ui/game/3d/organisms/ui-market-board-3d.orb +632 -419
  21. package/behaviors/registry/ui/game/3d/organisms/ui-minigolf-board-3d.orb +503 -145
  22. package/behaviors/registry/ui/game/3d/organisms/ui-nature-survival-board-3d.orb +1157 -134
  23. package/behaviors/registry/ui/game/3d/organisms/ui-pirate-board-3d.orb +1203 -383
  24. package/behaviors/registry/ui/game/3d/organisms/ui-platformer-board-3d.orb +1157 -205
  25. package/behaviors/registry/ui/game/3d/organisms/ui-racing-board-3d.orb +656 -565
  26. package/behaviors/registry/ui/game/3d/organisms/ui-skatepark-board-3d.orb +1205 -137
  27. package/behaviors/registry/ui/game/3d/organisms/ui-space-board-3d.orb +1333 -513
  28. package/behaviors/registry/ui/game/3d/organisms/ui-tower-defense-board-3d.orb +332 -7
  29. package/behaviors/registry/ui/game/3d/organisms/ui-toy-track-board-3d.orb +1202 -287
  30. package/dist/behaviors/behaviors-registry.json +282 -273
  31. package/dist/behaviors/registry/ui/game/2d/organisms/ui-battle-board.orb +213 -125
  32. package/dist/behaviors/registry/ui/game/2d/organisms/ui-fishing-board.orb +2302 -705
  33. package/dist/behaviors/registry/ui/game/2d/organisms/ui-minigolf-board.orb +7872 -1934
  34. package/dist/behaviors/registry/ui/game/2d/organisms/ui-pinball-board.orb +2739 -3050
  35. package/dist/behaviors/registry/ui/game/2d/organisms/ui-roguelike-board.orb +5204 -2967
  36. package/dist/behaviors/registry/ui/game/2d/organisms/ui-sokoban-board.orb +3330 -1619
  37. package/dist/behaviors/registry/ui/game/2d/organisms/ui-space-shmup-board.orb +4637 -4059
  38. package/dist/behaviors/registry/ui/game/2d/organisms/ui-tanks-board.orb +76 -103
  39. package/dist/behaviors/registry/ui/game/2d/organisms/ui-topdown-dungeon-board.orb +4579 -4356
  40. package/dist/behaviors/registry/ui/game/2d/organisms/ui-uncontrolled-battle-board.orb +1164 -2247
  41. package/dist/behaviors/registry/ui/game/2d/organisms/ui-winter-ski-board.orb +4573 -4553
  42. package/dist/behaviors/registry/ui/game/3d/organisms/ui-arcade-board-3d.orb +379 -2
  43. package/dist/behaviors/registry/ui/game/3d/organisms/ui-brick-sandbox-board-3d.orb +168 -1
  44. package/dist/behaviors/registry/ui/game/3d/organisms/ui-city-board-3d.orb +801 -169
  45. package/dist/behaviors/registry/ui/game/3d/organisms/ui-fantasy-town-board-3d.orb +1666 -702
  46. package/dist/behaviors/registry/ui/game/3d/organisms/ui-game-board-3d.orb +1323 -514
  47. package/dist/behaviors/registry/ui/game/3d/organisms/ui-graveyard-board-3d.orb +1186 -384
  48. package/dist/behaviors/registry/ui/game/3d/organisms/ui-hex-strategy-board-3d.orb +342 -170
  49. package/dist/behaviors/registry/ui/game/3d/organisms/ui-holiday-board-3d.orb +509 -3
  50. package/dist/behaviors/registry/ui/game/3d/organisms/ui-market-board-3d.orb +632 -419
  51. package/dist/behaviors/registry/ui/game/3d/organisms/ui-minigolf-board-3d.orb +503 -145
  52. package/dist/behaviors/registry/ui/game/3d/organisms/ui-nature-survival-board-3d.orb +1157 -134
  53. package/dist/behaviors/registry/ui/game/3d/organisms/ui-pirate-board-3d.orb +1203 -383
  54. package/dist/behaviors/registry/ui/game/3d/organisms/ui-platformer-board-3d.orb +1157 -205
  55. package/dist/behaviors/registry/ui/game/3d/organisms/ui-racing-board-3d.orb +656 -565
  56. package/dist/behaviors/registry/ui/game/3d/organisms/ui-skatepark-board-3d.orb +1205 -137
  57. package/dist/behaviors/registry/ui/game/3d/organisms/ui-space-board-3d.orb +1333 -513
  58. package/dist/behaviors/registry/ui/game/3d/organisms/ui-tower-defense-board-3d.orb +332 -7
  59. package/dist/behaviors/registry/ui/game/3d/organisms/ui-toy-track-board-3d.orb +1202 -287
  60. package/dist/behaviors-registry.json +282 -273
  61. package/dist/registry/ui/game/2d/organisms/ui-battle-board.orb +213 -125
  62. package/dist/registry/ui/game/2d/organisms/ui-fishing-board.orb +2302 -705
  63. package/dist/registry/ui/game/2d/organisms/ui-minigolf-board.orb +7872 -1934
  64. package/dist/registry/ui/game/2d/organisms/ui-pinball-board.orb +2739 -3050
  65. package/dist/registry/ui/game/2d/organisms/ui-roguelike-board.orb +5204 -2967
  66. package/dist/registry/ui/game/2d/organisms/ui-sokoban-board.orb +3330 -1619
  67. package/dist/registry/ui/game/2d/organisms/ui-space-shmup-board.orb +4637 -4059
  68. package/dist/registry/ui/game/2d/organisms/ui-tanks-board.orb +76 -103
  69. package/dist/registry/ui/game/2d/organisms/ui-topdown-dungeon-board.orb +4579 -4356
  70. package/dist/registry/ui/game/2d/organisms/ui-uncontrolled-battle-board.orb +1164 -2247
  71. package/dist/registry/ui/game/2d/organisms/ui-winter-ski-board.orb +4573 -4553
  72. package/dist/registry/ui/game/3d/organisms/ui-arcade-board-3d.orb +379 -2
  73. package/dist/registry/ui/game/3d/organisms/ui-brick-sandbox-board-3d.orb +168 -1
  74. package/dist/registry/ui/game/3d/organisms/ui-city-board-3d.orb +801 -169
  75. package/dist/registry/ui/game/3d/organisms/ui-fantasy-town-board-3d.orb +1666 -702
  76. package/dist/registry/ui/game/3d/organisms/ui-game-board-3d.orb +1323 -514
  77. package/dist/registry/ui/game/3d/organisms/ui-graveyard-board-3d.orb +1186 -384
  78. package/dist/registry/ui/game/3d/organisms/ui-hex-strategy-board-3d.orb +342 -170
  79. package/dist/registry/ui/game/3d/organisms/ui-holiday-board-3d.orb +509 -3
  80. package/dist/registry/ui/game/3d/organisms/ui-market-board-3d.orb +632 -419
  81. package/dist/registry/ui/game/3d/organisms/ui-minigolf-board-3d.orb +503 -145
  82. package/dist/registry/ui/game/3d/organisms/ui-nature-survival-board-3d.orb +1157 -134
  83. package/dist/registry/ui/game/3d/organisms/ui-pirate-board-3d.orb +1203 -383
  84. package/dist/registry/ui/game/3d/organisms/ui-platformer-board-3d.orb +1157 -205
  85. package/dist/registry/ui/game/3d/organisms/ui-racing-board-3d.orb +656 -565
  86. package/dist/registry/ui/game/3d/organisms/ui-skatepark-board-3d.orb +1205 -137
  87. package/dist/registry/ui/game/3d/organisms/ui-space-board-3d.orb +1333 -513
  88. package/dist/registry/ui/game/3d/organisms/ui-tower-defense-board-3d.orb +332 -7
  89. package/dist/registry/ui/game/3d/organisms/ui-toy-track-board-3d.orb +1202 -287
  90. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  {
2
- "description": "ToyTrackBoard3D — toy car race on a 6x6 track loop; click to advance, rival ticks, lap completion wins.",
2
+ "description": "ToyTrackBoard3D — throttled keyboard/d-pad toy race on a multi-lap 6x6 loop; collect coins, follow camera, ticking rival.",
3
3
  "name": "ui-toy-track-board-3d",
4
4
  "orbitals": [
5
5
  {
@@ -144,43 +144,104 @@
144
144
  {
145
145
  "items": {
146
146
  "properties": {
147
- "x": {
148
- "name": "x",
149
- "required": true,
150
- "type": "number"
147
+ "assetUrl": {
148
+ "name": "assetUrl",
149
+ "properties": {
150
+ "animations": {
151
+ "items": {
152
+ "type": "string"
153
+ },
154
+ "name": "animations",
155
+ "required": false,
156
+ "type": "array"
157
+ },
158
+ "aspect": {
159
+ "name": "aspect",
160
+ "required": false,
161
+ "type": "string"
162
+ },
163
+ "atlas": {
164
+ "name": "atlas",
165
+ "required": false,
166
+ "type": "string"
167
+ },
168
+ "category": {
169
+ "name": "category",
170
+ "required": false,
171
+ "type": "string"
172
+ },
173
+ "dimension": {
174
+ "name": "dimension",
175
+ "required": false,
176
+ "type": "string"
177
+ },
178
+ "name": {
179
+ "name": "name",
180
+ "required": false,
181
+ "type": "string"
182
+ },
183
+ "role": {
184
+ "name": "role",
185
+ "required": false,
186
+ "type": "string"
187
+ },
188
+ "sprite": {
189
+ "name": "sprite",
190
+ "required": false,
191
+ "type": "string"
192
+ },
193
+ "style": {
194
+ "name": "style",
195
+ "required": false,
196
+ "type": "string"
197
+ },
198
+ "thumbnailUrl": {
199
+ "name": "thumbnailUrl",
200
+ "required": false,
201
+ "type": "string"
202
+ },
203
+ "url": {
204
+ "name": "url",
205
+ "required": false,
206
+ "type": "string"
207
+ },
208
+ "variant": {
209
+ "name": "variant",
210
+ "required": false,
211
+ "type": "string"
212
+ }
213
+ },
214
+ "required": false,
215
+ "type": "object"
151
216
  },
152
- "z": {
153
- "name": "z",
217
+ "id": {
218
+ "name": "id",
219
+ "required": false,
220
+ "type": "string"
221
+ },
222
+ "type": {
223
+ "name": "type",
154
224
  "required": true,
155
- "type": "number"
156
- }
157
- },
158
- "type": "object"
159
- },
160
- "name": "validMoves",
161
- "type": "array"
162
- },
163
- {
164
- "items": {
165
- "properties": {
225
+ "type": "string"
226
+ },
166
227
  "x": {
167
228
  "name": "x",
168
229
  "required": true,
169
230
  "type": "number"
170
231
  },
171
- "z": {
172
- "name": "z",
232
+ "y": {
233
+ "name": "y",
173
234
  "required": true,
174
235
  "type": "number"
175
236
  }
176
237
  },
177
238
  "type": "object"
178
239
  },
179
- "name": "attackTargets",
240
+ "name": "features",
180
241
  "type": "array"
181
242
  },
182
243
  {
183
- "default": "",
244
+ "default": "player-car",
184
245
  "name": "selectedUnitId",
185
246
  "type": "string"
186
247
  },
@@ -199,6 +260,21 @@
199
260
  "name": "trackLength",
200
261
  "type": "number"
201
262
  },
263
+ {
264
+ "default": 1.0,
265
+ "name": "lap",
266
+ "type": "number"
267
+ },
268
+ {
269
+ "default": 0.0,
270
+ "name": "score",
271
+ "type": "number"
272
+ },
273
+ {
274
+ "default": true,
275
+ "name": "canAdvance",
276
+ "type": "boolean"
277
+ },
202
278
  {
203
279
  "default": "none",
204
280
  "name": "result",
@@ -218,6 +294,51 @@
218
294
  "default": 6.0,
219
295
  "name": "gridHeight",
220
296
  "type": "number"
297
+ },
298
+ {
299
+ "default": [],
300
+ "items": {
301
+ "properties": {
302
+ "id": {
303
+ "name": "id",
304
+ "required": true,
305
+ "type": "string"
306
+ },
307
+ "message": {
308
+ "name": "message",
309
+ "required": false,
310
+ "type": "string"
311
+ },
312
+ "ttl": {
313
+ "name": "ttl",
314
+ "required": true,
315
+ "type": "number"
316
+ },
317
+ "type": {
318
+ "name": "type",
319
+ "required": true,
320
+ "type": "string"
321
+ },
322
+ "x": {
323
+ "name": "x",
324
+ "required": true,
325
+ "type": "number"
326
+ },
327
+ "y": {
328
+ "name": "y",
329
+ "required": false,
330
+ "type": "number"
331
+ },
332
+ "z": {
333
+ "name": "z",
334
+ "required": false,
335
+ "type": "number"
336
+ }
337
+ },
338
+ "type": "object"
339
+ },
340
+ "name": "fx",
341
+ "type": "array"
221
342
  }
222
343
  ],
223
344
  "name": "ToyTrackBoard3DItem",
@@ -425,8 +546,8 @@
425
546
  },
426
547
  "id": "f-coin1",
427
548
  "type": "coin",
428
- "x": 2.0,
429
- "y": 3.0
549
+ "x": 5.0,
550
+ "y": 2.0
430
551
  },
431
552
  {
432
553
  "assetUrl": {
@@ -501,11 +622,11 @@
501
622
  },
502
623
  "id": "f-coin2",
503
624
  "type": "coin",
504
- "x": 4.0,
505
- "y": 4.0
625
+ "x": 0.0,
626
+ "y": 3.0
506
627
  }
507
628
  ],
508
- "description": "Finish gate, halfway gate, and infield scenery.",
629
+ "description": "Finish gate, halfway gate, on-track coins (collectible), and infield scenery.",
509
630
  "items": {
510
631
  "properties": {
511
632
  "assetUrl": {
@@ -1280,6 +1401,13 @@
1280
1401
  "tier": "presentation",
1281
1402
  "type": "[ToyTrackBoard3DTilesItem]"
1282
1403
  },
1404
+ "totalLaps": {
1405
+ "default": 2.0,
1406
+ "description": "Laps around the loop required to win",
1407
+ "label": "Total Laps",
1408
+ "tier": "presentation",
1409
+ "type": "number"
1410
+ },
1283
1411
  "unitScale": {
1284
1412
  "default": 1.0,
1285
1413
  "description": "Unit draw-size multiplier",
@@ -1475,21 +1603,35 @@
1475
1603
  },
1476
1604
  "emits": [
1477
1605
  {
1478
- "description": "Player advances to the next track cell along the loop",
1479
- "event": "TILE_CLICK",
1606
+ "description": "Accelerate intent (keyboard keyMap or d-pad directionEvents) — advances one track cell when paced, collecting a coin if present",
1607
+ "event": "ACCELERATE",
1480
1608
  "payloadSchema": [
1481
1609
  {
1482
- "name": "x",
1483
- "required": true,
1484
- "type": "number"
1485
- },
1610
+ "name": "id",
1611
+ "type": "string"
1612
+ }
1613
+ ],
1614
+ "scope": "external",
1615
+ "tier": "domain"
1616
+ },
1617
+ {
1618
+ "description": "Called when the lap race ends",
1619
+ "event": "GAME_END",
1620
+ "payloadSchema": [
1486
1621
  {
1487
- "name": "z",
1488
- "required": true,
1489
- "type": "number"
1490
- },
1622
+ "name": "result",
1623
+ "type": "string"
1624
+ }
1625
+ ],
1626
+ "scope": "external",
1627
+ "tier": "domain"
1628
+ },
1629
+ {
1630
+ "description": "Emits UI:{playAgainEvent} with {} on play again / reset",
1631
+ "event": "PLAY_AGAIN",
1632
+ "payloadSchema": [
1491
1633
  {
1492
- "name": "tileId",
1634
+ "name": "id",
1493
1635
  "type": "string"
1494
1636
  }
1495
1637
  ],
@@ -1499,16 +1641,19 @@
1499
1641
  ],
1500
1642
  "entityContract": {
1501
1643
  "provides": [
1502
- "attackTargets",
1644
+ "canAdvance",
1645
+ "features",
1646
+ "fx",
1503
1647
  "gridHeight",
1504
1648
  "gridWidth",
1649
+ "lap",
1505
1650
  "playerProgress",
1506
1651
  "result",
1507
1652
  "rivalProgress",
1653
+ "score",
1508
1654
  "selectedUnitId",
1509
1655
  "trackLength",
1510
- "units",
1511
- "validMoves"
1656
+ "units"
1512
1657
  ],
1513
1658
  "requires": []
1514
1659
  },
@@ -1523,22 +1668,36 @@
1523
1668
  "name": "Initialize"
1524
1669
  },
1525
1670
  {
1526
- "description": "Player advances to the next track cell along the loop",
1527
- "key": "TILE_CLICK",
1528
- "name": "Tile Click",
1671
+ "description": "Accelerate intent (keyboard keyMap or d-pad directionEvents) — advances one track cell when paced, collecting a coin if present",
1672
+ "key": "ACCELERATE",
1673
+ "name": "Accelerate",
1529
1674
  "payloadSchema": [
1530
1675
  {
1531
- "name": "x",
1532
- "required": true,
1533
- "type": "number"
1534
- },
1676
+ "name": "id",
1677
+ "type": "string"
1678
+ }
1679
+ ],
1680
+ "tier": "domain"
1681
+ },
1682
+ {
1683
+ "description": "Emits UI:{playAgainEvent} with {} on play again / reset",
1684
+ "key": "PLAY_AGAIN",
1685
+ "name": "Play Again",
1686
+ "payloadSchema": [
1535
1687
  {
1536
- "name": "z",
1537
- "required": true,
1538
- "type": "number"
1539
- },
1688
+ "name": "id",
1689
+ "type": "string"
1690
+ }
1691
+ ],
1692
+ "tier": "domain"
1693
+ },
1694
+ {
1695
+ "description": "Called when the lap race ends",
1696
+ "key": "GAME_END",
1697
+ "name": "Game End",
1698
+ "payloadSchema": [
1540
1699
  {
1541
- "name": "tileId",
1700
+ "name": "result",
1542
1701
  "type": "string"
1543
1702
  }
1544
1703
  ],
@@ -1559,6 +1718,11 @@
1559
1718
  "@entity.units",
1560
1719
  "@config.units"
1561
1720
  ],
1721
+ [
1722
+ "set",
1723
+ "@entity.features",
1724
+ "@config.features"
1725
+ ],
1562
1726
  [
1563
1727
  "set",
1564
1728
  "@entity.playerProgress",
@@ -1574,6 +1738,21 @@
1574
1738
  "@entity.trackLength",
1575
1739
  20.0
1576
1740
  ],
1741
+ [
1742
+ "set",
1743
+ "@entity.lap",
1744
+ 1.0
1745
+ ],
1746
+ [
1747
+ "set",
1748
+ "@entity.score",
1749
+ 0.0
1750
+ ],
1751
+ [
1752
+ "set",
1753
+ "@entity.canAdvance",
1754
+ true
1755
+ ],
1577
1756
  [
1578
1757
  "set",
1579
1758
  "@entity.gridWidth",
@@ -1592,65 +1771,30 @@
1592
1771
  [
1593
1772
  "set",
1594
1773
  "@entity.selectedUnitId",
1595
- ""
1774
+ "player-car"
1596
1775
  ],
1597
1776
  [
1598
1777
  "set",
1599
- "@entity.attackTargets",
1778
+ "@entity.fx",
1600
1779
  []
1601
1780
  ],
1602
- [
1603
- "set",
1604
- "@entity.validMoves",
1605
- [
1606
- "array/map",
1607
- [
1608
- "array/filter",
1609
- "@config.tiles",
1610
- [
1611
- "fn",
1612
- "t",
1613
- [
1614
- "==",
1615
- [
1616
- "object/get",
1617
- "@t",
1618
- "order"
1619
- ],
1620
- [
1621
- "%",
1622
- [
1623
- "+",
1624
- "@entity.playerProgress",
1625
- 1.0
1626
- ],
1627
- "@entity.trackLength"
1628
- ]
1629
- ]
1630
- ]
1631
- ],
1632
- [
1633
- "fn",
1634
- "t",
1635
- {
1636
- "x": [
1637
- "object/get",
1638
- "@t",
1639
- "x"
1640
- ],
1641
- "z": [
1642
- "object/get",
1643
- "@t",
1644
- "y"
1645
- ]
1646
- }
1647
- ]
1648
- ]
1649
- ],
1650
1781
  [
1651
1782
  "render-ui",
1652
1783
  "main",
1653
1784
  {
1785
+ "addons": {
1786
+ "children": [
1787
+ {
1788
+ "action": "PLAY_AGAIN",
1789
+ "label": "Restart",
1790
+ "type": "button",
1791
+ "variant": "secondary"
1792
+ }
1793
+ ],
1794
+ "direction": "vertical",
1795
+ "gap": "sm",
1796
+ "type": "stack"
1797
+ },
1654
1798
  "backgroundAsset": {
1655
1799
  "animations": [],
1656
1800
  "aspect": "1:1",
@@ -1667,30 +1811,59 @@
1667
1811
  },
1668
1812
  "children": [
1669
1813
  {
1670
- "attackTargets": "@entity.attackTargets",
1671
- "features": "@config.features",
1814
+ "cameraMode": "follow",
1815
+ "events": "@entity.fx",
1816
+ "features": "@entity.features",
1817
+ "interpolateUnits": true,
1818
+ "keyMap": {
1819
+ "ArrowUp": "ACCELERATE",
1820
+ "KeyW": "ACCELERATE",
1821
+ "Space": "ACCELERATE"
1822
+ },
1672
1823
  "scale": "@config.scale",
1673
1824
  "selectedUnitId": "@entity.selectedUnitId",
1674
- "tileClickEvent": "TILE_CLICK",
1675
1825
  "tiles": "@config.tiles",
1676
1826
  "type": "game-canvas-3d",
1677
1827
  "unitScale": "@config.unitScale",
1678
- "units": "@entity.units",
1679
- "validMoves": "@entity.validMoves"
1828
+ "units": "@entity.units"
1680
1829
  }
1681
1830
  ],
1682
1831
  "hud": {
1683
- "stats": [
1832
+ "children": [
1684
1833
  {
1685
- "label": "Progress",
1686
- "value": "@entity.playerProgress"
1834
+ "stats": [
1835
+ {
1836
+ "label": "Lap",
1837
+ "value": [
1838
+ "str/concat",
1839
+ "@entity.lap",
1840
+ "/",
1841
+ "@config.totalLaps"
1842
+ ]
1843
+ },
1844
+ {
1845
+ "label": "Score",
1846
+ "value": "@entity.score"
1847
+ },
1848
+ {
1849
+ "label": "Result",
1850
+ "value": "@entity.result"
1851
+ }
1852
+ ],
1853
+ "type": "game-hud"
1687
1854
  },
1688
1855
  {
1689
- "label": "Result",
1690
- "value": "@entity.result"
1856
+ "directionEvents": {
1857
+ "up": "ACCELERATE"
1858
+ },
1859
+ "kind": "dpad",
1860
+ "type": "control-grid"
1691
1861
  }
1692
1862
  ],
1693
- "type": "game-hud"
1863
+ "direction": "horizontal",
1864
+ "gap": "md",
1865
+ "justify": "between",
1866
+ "type": "stack"
1694
1867
  },
1695
1868
  "hudBackgroundAsset": {
1696
1869
  "animations": [],
@@ -1706,122 +1879,463 @@
1706
1879
  "url": "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-adventure-pack/ui/uipack_rpg_sheet.png",
1707
1880
  "variant": ""
1708
1881
  },
1709
- "type": "game-shell"
1710
- }
1711
- ]
1712
- ],
1713
- "event": "INIT",
1714
- "from": "playing",
1715
- "to": "playing"
1716
- },
1717
- {
1718
- "effects": [
1719
- [
1720
- "set",
1721
- "@entity.playerProgress",
1722
- [
1723
- "+",
1724
- "@entity.playerProgress",
1725
- 1.0
1726
- ]
1727
- ],
1882
+ "overlay": [
1883
+ "if",
1884
+ [
1885
+ "!=",
1886
+ "@entity.result",
1887
+ "none"
1888
+ ],
1889
+ {
1890
+ "align": "center",
1891
+ "children": [
1892
+ {
1893
+ "stats": [
1894
+ {
1895
+ "label": "Result",
1896
+ "value": "@entity.result"
1897
+ }
1898
+ ],
1899
+ "type": "game-hud"
1900
+ },
1901
+ {
1902
+ "action": "PLAY_AGAIN",
1903
+ "label": "Play Again",
1904
+ "type": "button",
1905
+ "variant": "primary"
1906
+ }
1907
+ ],
1908
+ "direction": "vertical",
1909
+ "gap": "md",
1910
+ "type": "stack"
1911
+ },
1912
+ null
1913
+ ],
1914
+ "type": "game-shell"
1915
+ }
1916
+ ]
1917
+ ],
1918
+ "event": "INIT",
1919
+ "from": "playing",
1920
+ "to": "playing"
1921
+ },
1922
+ {
1923
+ "effects": [
1728
1924
  [
1729
- "set",
1730
- "@entity.units",
1925
+ "let",
1731
1926
  [
1732
- "array/map",
1733
- "@entity.units",
1734
1927
  [
1735
- "fn",
1736
- "u",
1928
+ "nextOrder",
1737
1929
  [
1738
- "if",
1930
+ "%",
1739
1931
  [
1740
- "==",
1741
- "@u.id",
1742
- "player-car"
1932
+ "+",
1933
+ "@entity.playerProgress",
1934
+ 1.0
1743
1935
  ],
1744
- [
1745
- "object/merge",
1746
- "@u",
1747
- {
1748
- "position": {
1749
- "x": "@payload.x",
1750
- "y": "@payload.z"
1751
- }
1752
- }
1753
- ],
1754
- "@u"
1936
+ "@entity.trackLength"
1755
1937
  ]
1756
1938
  ]
1757
- ]
1758
- ],
1759
- [
1760
- "set",
1761
- "@entity.result",
1939
+ ],
1762
1940
  [
1763
- "if",
1941
+ "let",
1764
1942
  [
1765
- ">=",
1766
- "@entity.playerProgress",
1767
- "@entity.trackLength"
1943
+ [
1944
+ "target",
1945
+ [
1946
+ "array/find",
1947
+ "@config.tiles",
1948
+ [
1949
+ "fn",
1950
+ "t",
1951
+ [
1952
+ "==",
1953
+ [
1954
+ "object/get",
1955
+ "@t",
1956
+ "order"
1957
+ ],
1958
+ "@nextOrder"
1959
+ ]
1960
+ ]
1961
+ ]
1962
+ ]
1768
1963
  ],
1769
- "victory",
1770
- "@entity.result"
1771
- ]
1772
- ],
1773
- [
1774
- "set",
1775
- "@entity.validMoves",
1776
- [
1777
- "array/map",
1778
1964
  [
1779
- "array/filter",
1780
- "@config.tiles",
1965
+ "let",
1781
1966
  [
1782
- "fn",
1783
- "t",
1784
1967
  [
1785
- "==",
1968
+ "coinHit",
1786
1969
  [
1787
- "object/get",
1788
- "@t",
1789
- "order"
1790
- ],
1970
+ "array/find",
1971
+ "@entity.features",
1972
+ [
1973
+ "fn",
1974
+ "f",
1975
+ [
1976
+ "and",
1977
+ [
1978
+ "==",
1979
+ [
1980
+ "object/get",
1981
+ "@f",
1982
+ "type"
1983
+ ],
1984
+ "coin"
1985
+ ],
1986
+ [
1987
+ "and",
1988
+ [
1989
+ "==",
1990
+ [
1991
+ "object/get",
1992
+ "@f",
1993
+ "x"
1994
+ ],
1995
+ [
1996
+ "object/get",
1997
+ "@target",
1998
+ "x"
1999
+ ]
2000
+ ],
2001
+ [
2002
+ "==",
2003
+ [
2004
+ "object/get",
2005
+ "@f",
2006
+ "y"
2007
+ ],
2008
+ [
2009
+ "object/get",
2010
+ "@target",
2011
+ "y"
2012
+ ]
2013
+ ]
2014
+ ]
2015
+ ]
2016
+ ]
2017
+ ]
2018
+ ]
2019
+ ],
2020
+ [
2021
+ "do",
2022
+ [
2023
+ "set",
2024
+ "@entity.units",
1791
2025
  [
1792
- "%",
2026
+ "array/map",
2027
+ "@entity.units",
2028
+ [
2029
+ "fn",
2030
+ "u",
2031
+ [
2032
+ "if",
2033
+ [
2034
+ "==",
2035
+ "@u.id",
2036
+ "player-car"
2037
+ ],
2038
+ [
2039
+ "object/merge",
2040
+ "@u",
2041
+ {
2042
+ "position": {
2043
+ "x": [
2044
+ "object/get",
2045
+ "@target",
2046
+ "x"
2047
+ ],
2048
+ "y": [
2049
+ "object/get",
2050
+ "@target",
2051
+ "y"
2052
+ ]
2053
+ }
2054
+ }
2055
+ ],
2056
+ "@u"
2057
+ ]
2058
+ ]
2059
+ ]
2060
+ ],
2061
+ [
2062
+ "set",
2063
+ "@entity.features",
2064
+ [
2065
+ "if",
2066
+ [
2067
+ "!=",
2068
+ "@coinHit",
2069
+ null
2070
+ ],
2071
+ [
2072
+ "array/filter",
2073
+ "@entity.features",
2074
+ [
2075
+ "fn",
2076
+ "f",
2077
+ [
2078
+ "or",
2079
+ [
2080
+ "!=",
2081
+ [
2082
+ "object/get",
2083
+ "@f",
2084
+ "type"
2085
+ ],
2086
+ "coin"
2087
+ ],
2088
+ [
2089
+ "or",
2090
+ [
2091
+ "!=",
2092
+ [
2093
+ "object/get",
2094
+ "@f",
2095
+ "x"
2096
+ ],
2097
+ [
2098
+ "object/get",
2099
+ "@target",
2100
+ "x"
2101
+ ]
2102
+ ],
2103
+ [
2104
+ "!=",
2105
+ [
2106
+ "object/get",
2107
+ "@f",
2108
+ "y"
2109
+ ],
2110
+ [
2111
+ "object/get",
2112
+ "@target",
2113
+ "y"
2114
+ ]
2115
+ ]
2116
+ ]
2117
+ ]
2118
+ ]
2119
+ ],
2120
+ "@entity.features"
2121
+ ]
2122
+ ],
2123
+ [
2124
+ "set",
2125
+ "@entity.score",
2126
+ [
2127
+ "if",
2128
+ [
2129
+ "!=",
2130
+ "@coinHit",
2131
+ null
2132
+ ],
1793
2133
  [
1794
2134
  "+",
2135
+ "@entity.score",
2136
+ 5.0
2137
+ ],
2138
+ "@entity.score"
2139
+ ]
2140
+ ],
2141
+ [
2142
+ "set",
2143
+ "@entity.playerProgress",
2144
+ [
2145
+ "+",
2146
+ "@entity.playerProgress",
2147
+ 1.0
2148
+ ]
2149
+ ],
2150
+ [
2151
+ "set",
2152
+ "@entity.canAdvance",
2153
+ false
2154
+ ],
2155
+ [
2156
+ "set",
2157
+ "@entity.lap",
2158
+ [
2159
+ "+",
2160
+ [
2161
+ "math/floor",
2162
+ [
2163
+ "/",
2164
+ "@entity.playerProgress",
2165
+ "@entity.trackLength"
2166
+ ]
2167
+ ],
2168
+ 1.0
2169
+ ]
2170
+ ],
2171
+ [
2172
+ "set",
2173
+ "@entity.fx",
2174
+ [
2175
+ "if",
2176
+ [
2177
+ "!=",
2178
+ "@coinHit",
2179
+ null
2180
+ ],
2181
+ [
2182
+ "array/append",
2183
+ "@entity.fx",
2184
+ {
2185
+ "id": [
2186
+ "str/concat",
2187
+ "pickup-",
2188
+ "@entity.playerProgress"
2189
+ ],
2190
+ "message": "+5",
2191
+ "ttl": 5.0,
2192
+ "type": "pickup",
2193
+ "x": [
2194
+ "object/get",
2195
+ "@target",
2196
+ "x"
2197
+ ],
2198
+ "z": [
2199
+ "object/get",
2200
+ "@target",
2201
+ "y"
2202
+ ]
2203
+ }
2204
+ ],
2205
+ "@entity.fx"
2206
+ ]
2207
+ ],
2208
+ [
2209
+ "set",
2210
+ "@entity.fx",
2211
+ [
2212
+ "if",
2213
+ [
2214
+ "==",
2215
+ [
2216
+ "%",
2217
+ "@entity.playerProgress",
2218
+ "@entity.trackLength"
2219
+ ],
2220
+ 0.0
2221
+ ],
2222
+ [
2223
+ "array/append",
2224
+ "@entity.fx",
2225
+ {
2226
+ "id": [
2227
+ "str/concat",
2228
+ "lap-",
2229
+ "@entity.playerProgress"
2230
+ ],
2231
+ "message": "Lap!",
2232
+ "ttl": 5.0,
2233
+ "type": "score",
2234
+ "x": 0.0,
2235
+ "z": 0.0
2236
+ }
2237
+ ],
2238
+ "@entity.fx"
2239
+ ]
2240
+ ],
2241
+ [
2242
+ "set",
2243
+ "@entity.result",
2244
+ [
2245
+ "if",
2246
+ [
2247
+ ">=",
1795
2248
  "@entity.playerProgress",
1796
- 1.0
2249
+ [
2250
+ "*",
2251
+ "@config.totalLaps",
2252
+ "@entity.trackLength"
2253
+ ]
1797
2254
  ],
1798
- "@entity.trackLength"
2255
+ "victory",
2256
+ "@entity.result"
1799
2257
  ]
1800
- ]
1801
- ]
1802
- ],
1803
- [
1804
- "fn",
1805
- "t",
1806
- {
1807
- "x": [
1808
- "object/get",
1809
- "@t",
1810
- "x"
1811
2258
  ],
1812
- "z": [
1813
- "object/get",
1814
- "@t",
1815
- "y"
2259
+ [
2260
+ "set",
2261
+ "@entity.fx",
2262
+ [
2263
+ "if",
2264
+ [
2265
+ "!=",
2266
+ "@entity.result",
2267
+ "none"
2268
+ ],
2269
+ [
2270
+ "array/append",
2271
+ "@entity.fx",
2272
+ {
2273
+ "id": "result-fx",
2274
+ "message": [
2275
+ "if",
2276
+ [
2277
+ "==",
2278
+ "@entity.result",
2279
+ "victory"
2280
+ ],
2281
+ "You Win!",
2282
+ "You Lose!"
2283
+ ],
2284
+ "ttl": 999.0,
2285
+ "type": [
2286
+ "if",
2287
+ [
2288
+ "==",
2289
+ "@entity.result",
2290
+ "victory"
2291
+ ],
2292
+ "win",
2293
+ "lose"
2294
+ ],
2295
+ "x": 0.0,
2296
+ "z": 0.0
2297
+ }
2298
+ ],
2299
+ "@entity.fx"
2300
+ ]
1816
2301
  ]
1817
- }
2302
+ ]
1818
2303
  ]
1819
2304
  ]
1820
2305
  ],
2306
+ [
2307
+ "if",
2308
+ [
2309
+ "!=",
2310
+ "@entity.result",
2311
+ "none"
2312
+ ],
2313
+ [
2314
+ "emit",
2315
+ "GAME_END",
2316
+ {
2317
+ "result": "@entity.result"
2318
+ }
2319
+ ],
2320
+ null
2321
+ ],
1821
2322
  [
1822
2323
  "render-ui",
1823
2324
  "main",
1824
2325
  {
2326
+ "addons": {
2327
+ "children": [
2328
+ {
2329
+ "action": "PLAY_AGAIN",
2330
+ "label": "Restart",
2331
+ "type": "button",
2332
+ "variant": "secondary"
2333
+ }
2334
+ ],
2335
+ "direction": "vertical",
2336
+ "gap": "sm",
2337
+ "type": "stack"
2338
+ },
1825
2339
  "backgroundAsset": {
1826
2340
  "animations": [],
1827
2341
  "aspect": "1:1",
@@ -1838,30 +2352,59 @@
1838
2352
  },
1839
2353
  "children": [
1840
2354
  {
1841
- "attackTargets": "@entity.attackTargets",
1842
- "features": "@config.features",
2355
+ "cameraMode": "follow",
2356
+ "events": "@entity.fx",
2357
+ "features": "@entity.features",
2358
+ "interpolateUnits": true,
2359
+ "keyMap": {
2360
+ "ArrowUp": "ACCELERATE",
2361
+ "KeyW": "ACCELERATE",
2362
+ "Space": "ACCELERATE"
2363
+ },
1843
2364
  "scale": "@config.scale",
1844
2365
  "selectedUnitId": "@entity.selectedUnitId",
1845
- "tileClickEvent": "TILE_CLICK",
1846
2366
  "tiles": "@config.tiles",
1847
2367
  "type": "game-canvas-3d",
1848
2368
  "unitScale": "@config.unitScale",
1849
- "units": "@entity.units",
1850
- "validMoves": "@entity.validMoves"
2369
+ "units": "@entity.units"
1851
2370
  }
1852
2371
  ],
1853
2372
  "hud": {
1854
- "stats": [
2373
+ "children": [
1855
2374
  {
1856
- "label": "Progress",
1857
- "value": "@entity.playerProgress"
2375
+ "stats": [
2376
+ {
2377
+ "label": "Lap",
2378
+ "value": [
2379
+ "str/concat",
2380
+ "@entity.lap",
2381
+ "/",
2382
+ "@config.totalLaps"
2383
+ ]
2384
+ },
2385
+ {
2386
+ "label": "Score",
2387
+ "value": "@entity.score"
2388
+ },
2389
+ {
2390
+ "label": "Result",
2391
+ "value": "@entity.result"
2392
+ }
2393
+ ],
2394
+ "type": "game-hud"
1858
2395
  },
1859
2396
  {
1860
- "label": "Result",
1861
- "value": "@entity.result"
2397
+ "directionEvents": {
2398
+ "up": "ACCELERATE"
2399
+ },
2400
+ "kind": "dpad",
2401
+ "type": "control-grid"
1862
2402
  }
1863
2403
  ],
1864
- "type": "game-hud"
2404
+ "direction": "horizontal",
2405
+ "gap": "md",
2406
+ "justify": "between",
2407
+ "type": "stack"
1865
2408
  },
1866
2409
  "hudBackgroundAsset": {
1867
2410
  "animations": [],
@@ -1877,99 +2420,334 @@
1877
2420
  "url": "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-adventure-pack/ui/uipack_rpg_sheet.png",
1878
2421
  "variant": ""
1879
2422
  },
2423
+ "overlay": [
2424
+ "if",
2425
+ [
2426
+ "!=",
2427
+ "@entity.result",
2428
+ "none"
2429
+ ],
2430
+ {
2431
+ "align": "center",
2432
+ "children": [
2433
+ {
2434
+ "stats": [
2435
+ {
2436
+ "label": "Result",
2437
+ "value": "@entity.result"
2438
+ }
2439
+ ],
2440
+ "type": "game-hud"
2441
+ },
2442
+ {
2443
+ "action": "PLAY_AGAIN",
2444
+ "label": "Play Again",
2445
+ "type": "button",
2446
+ "variant": "primary"
2447
+ }
2448
+ ],
2449
+ "direction": "vertical",
2450
+ "gap": "md",
2451
+ "type": "stack"
2452
+ },
2453
+ null
2454
+ ],
1880
2455
  "type": "game-shell"
1881
2456
  }
1882
2457
  ]
1883
2458
  ],
1884
- "event": "TILE_CLICK",
2459
+ "event": "ACCELERATE",
1885
2460
  "from": "playing",
1886
2461
  "guard": [
1887
2462
  "and",
2463
+ [
2464
+ "==",
2465
+ "@entity.canAdvance",
2466
+ true
2467
+ ],
1888
2468
  [
1889
2469
  "==",
1890
2470
  "@entity.result",
1891
2471
  "none"
2472
+ ]
2473
+ ],
2474
+ "to": "playing"
2475
+ },
2476
+ {
2477
+ "effects": [
2478
+ [
2479
+ "set",
2480
+ "@entity.units",
2481
+ "@config.units"
1892
2482
  ],
1893
2483
  [
1894
- "let",
2484
+ "set",
2485
+ "@entity.features",
2486
+ "@config.features"
2487
+ ],
2488
+ [
2489
+ "set",
2490
+ "@entity.playerProgress",
2491
+ 0.0
2492
+ ],
2493
+ [
2494
+ "set",
2495
+ "@entity.rivalProgress",
2496
+ 0.0
2497
+ ],
2498
+ [
2499
+ "set",
2500
+ "@entity.trackLength",
2501
+ 20.0
2502
+ ],
2503
+ [
2504
+ "set",
2505
+ "@entity.lap",
2506
+ 1.0
2507
+ ],
2508
+ [
2509
+ "set",
2510
+ "@entity.score",
2511
+ 0.0
2512
+ ],
2513
+ [
2514
+ "set",
2515
+ "@entity.canAdvance",
2516
+ true
2517
+ ],
2518
+ [
2519
+ "set",
2520
+ "@entity.gridWidth",
2521
+ 6.0
2522
+ ],
2523
+ [
2524
+ "set",
2525
+ "@entity.gridHeight",
2526
+ 6.0
2527
+ ],
2528
+ [
2529
+ "set",
2530
+ "@entity.result",
2531
+ "none"
2532
+ ],
2533
+ [
2534
+ "set",
2535
+ "@entity.selectedUnitId",
2536
+ "player-car"
2537
+ ],
2538
+ [
2539
+ "set",
2540
+ "@entity.fx",
2541
+ []
2542
+ ],
2543
+ [
2544
+ "render-ui",
2545
+ "main",
2546
+ {
2547
+ "addons": {
2548
+ "children": [
2549
+ {
2550
+ "action": "PLAY_AGAIN",
2551
+ "label": "Restart",
2552
+ "type": "button",
2553
+ "variant": "secondary"
2554
+ }
2555
+ ],
2556
+ "direction": "vertical",
2557
+ "gap": "sm",
2558
+ "type": "stack"
2559
+ },
2560
+ "backgroundAsset": {
2561
+ "animations": [],
2562
+ "aspect": "1:1",
2563
+ "atlas": "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-adventure-pack/ui/uipack_rpg_sheet.json",
2564
+ "category": "ui",
2565
+ "dimension": "2d",
2566
+ "name": "panel",
2567
+ "role": "ui",
2568
+ "sprite": "panelInset_beige.png",
2569
+ "style": "vector-flat",
2570
+ "thumbnailUrl": "",
2571
+ "url": "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-adventure-pack/ui/uipack_rpg_sheet.png",
2572
+ "variant": ""
2573
+ },
2574
+ "children": [
2575
+ {
2576
+ "cameraMode": "follow",
2577
+ "events": "@entity.fx",
2578
+ "features": "@entity.features",
2579
+ "interpolateUnits": true,
2580
+ "keyMap": {
2581
+ "ArrowUp": "ACCELERATE",
2582
+ "KeyW": "ACCELERATE",
2583
+ "Space": "ACCELERATE"
2584
+ },
2585
+ "scale": "@config.scale",
2586
+ "selectedUnitId": "@entity.selectedUnitId",
2587
+ "tiles": "@config.tiles",
2588
+ "type": "game-canvas-3d",
2589
+ "unitScale": "@config.unitScale",
2590
+ "units": "@entity.units"
2591
+ }
2592
+ ],
2593
+ "hud": {
2594
+ "children": [
2595
+ {
2596
+ "stats": [
2597
+ {
2598
+ "label": "Lap",
2599
+ "value": [
2600
+ "str/concat",
2601
+ "@entity.lap",
2602
+ "/",
2603
+ "@config.totalLaps"
2604
+ ]
2605
+ },
2606
+ {
2607
+ "label": "Score",
2608
+ "value": "@entity.score"
2609
+ },
2610
+ {
2611
+ "label": "Result",
2612
+ "value": "@entity.result"
2613
+ }
2614
+ ],
2615
+ "type": "game-hud"
2616
+ },
2617
+ {
2618
+ "directionEvents": {
2619
+ "up": "ACCELERATE"
2620
+ },
2621
+ "kind": "dpad",
2622
+ "type": "control-grid"
2623
+ }
2624
+ ],
2625
+ "direction": "horizontal",
2626
+ "gap": "md",
2627
+ "justify": "between",
2628
+ "type": "stack"
2629
+ },
2630
+ "hudBackgroundAsset": {
2631
+ "animations": [],
2632
+ "aspect": "1:1",
2633
+ "atlas": "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-adventure-pack/ui/uipack_rpg_sheet.json",
2634
+ "category": "ui",
2635
+ "dimension": "2d",
2636
+ "name": "hud-panel",
2637
+ "role": "ui",
2638
+ "sprite": "panelInset_beigeLight.png",
2639
+ "style": "vector-flat",
2640
+ "thumbnailUrl": "",
2641
+ "url": "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-adventure-pack/ui/uipack_rpg_sheet.png",
2642
+ "variant": ""
2643
+ },
2644
+ "overlay": [
2645
+ "if",
2646
+ [
2647
+ "!=",
2648
+ "@entity.result",
2649
+ "none"
2650
+ ],
2651
+ {
2652
+ "align": "center",
2653
+ "children": [
2654
+ {
2655
+ "stats": [
2656
+ {
2657
+ "label": "Result",
2658
+ "value": "@entity.result"
2659
+ }
2660
+ ],
2661
+ "type": "game-hud"
2662
+ },
2663
+ {
2664
+ "action": "PLAY_AGAIN",
2665
+ "label": "Play Again",
2666
+ "type": "button",
2667
+ "variant": "primary"
2668
+ }
2669
+ ],
2670
+ "direction": "vertical",
2671
+ "gap": "md",
2672
+ "type": "stack"
2673
+ },
2674
+ null
2675
+ ],
2676
+ "type": "game-shell"
2677
+ }
2678
+ ]
2679
+ ],
2680
+ "event": "PLAY_AGAIN",
2681
+ "from": "playing",
2682
+ "guard": [
2683
+ "!=",
2684
+ "@entity.result",
2685
+ "none"
2686
+ ],
2687
+ "to": "playing"
2688
+ }
2689
+ ]
2690
+ },
2691
+ "ticks": [
2692
+ {
2693
+ "effects": [
2694
+ [
2695
+ "set",
2696
+ "@entity.canAdvance",
2697
+ true
2698
+ ],
2699
+ [
2700
+ "set",
2701
+ "@entity.fx",
2702
+ [
2703
+ "array/filter",
1895
2704
  [
2705
+ "array/map",
2706
+ "@entity.fx",
1896
2707
  [
1897
- "target",
2708
+ "fn",
2709
+ "e",
1898
2710
  [
1899
- "array/find",
1900
- "@config.tiles",
1901
- [
1902
- "fn",
1903
- "t",
1904
- [
1905
- "and",
2711
+ "object/merge",
2712
+ "@e",
2713
+ {
2714
+ "ttl": [
2715
+ "-",
1906
2716
  [
1907
- "==",
1908
- [
1909
- "object/get",
1910
- "@t",
1911
- "x"
1912
- ],
1913
- "@payload.x"
2717
+ "object/get",
2718
+ "@e",
2719
+ "ttl"
1914
2720
  ],
1915
- [
1916
- "==",
1917
- [
1918
- "object/get",
1919
- "@t",
1920
- "y"
1921
- ],
1922
- "@payload.z"
1923
- ]
2721
+ 1.0
1924
2722
  ]
1925
- ]
2723
+ }
1926
2724
  ]
1927
2725
  ]
1928
2726
  ],
1929
2727
  [
1930
- "and",
1931
- [
1932
- "!=",
1933
- "@target",
1934
- null
1935
- ],
2728
+ "fn",
2729
+ "e",
1936
2730
  [
1937
- "and",
2731
+ ">",
1938
2732
  [
1939
- "==",
1940
- [
1941
- "object/get",
1942
- "@target",
1943
- "passable"
1944
- ],
1945
- true
2733
+ "object/get",
2734
+ "@e",
2735
+ "ttl"
1946
2736
  ],
1947
- [
1948
- "==",
1949
- [
1950
- "object/get",
1951
- "@target",
1952
- "order"
1953
- ],
1954
- [
1955
- "%",
1956
- [
1957
- "+",
1958
- "@entity.playerProgress",
1959
- 1.0
1960
- ],
1961
- "@entity.trackLength"
1962
- ]
1963
- ]
2737
+ 0.0
1964
2738
  ]
1965
2739
  ]
1966
2740
  ]
1967
- ],
1968
- "to": "playing"
1969
- }
1970
- ]
1971
- },
1972
- "ticks": [
2741
+ ]
2742
+ ],
2743
+ "guard": [
2744
+ "==",
2745
+ "@entity.result",
2746
+ "none"
2747
+ ],
2748
+ "interval": 400.0,
2749
+ "name": "paceTick"
2750
+ },
1973
2751
  {
1974
2752
  "effects": [
1975
2753
  [
@@ -2070,19 +2848,95 @@
2070
2848
  [
2071
2849
  ">=",
2072
2850
  "@entity.rivalProgress",
2073
- "@entity.trackLength"
2851
+ [
2852
+ "*",
2853
+ "@config.totalLaps",
2854
+ "@entity.trackLength"
2855
+ ]
2074
2856
  ],
2075
2857
  "defeat",
2076
2858
  "@entity.result"
2077
2859
  ]
2860
+ ],
2861
+ [
2862
+ "set",
2863
+ "@entity.fx",
2864
+ [
2865
+ "if",
2866
+ [
2867
+ "!=",
2868
+ "@entity.result",
2869
+ "none"
2870
+ ],
2871
+ [
2872
+ "array/append",
2873
+ "@entity.fx",
2874
+ {
2875
+ "id": "result-fx",
2876
+ "message": [
2877
+ "if",
2878
+ [
2879
+ "==",
2880
+ "@entity.result",
2881
+ "victory"
2882
+ ],
2883
+ "You Win!",
2884
+ "You Lose!"
2885
+ ],
2886
+ "ttl": 999.0,
2887
+ "type": [
2888
+ "if",
2889
+ [
2890
+ "==",
2891
+ "@entity.result",
2892
+ "victory"
2893
+ ],
2894
+ "win",
2895
+ "lose"
2896
+ ],
2897
+ "x": 0.0,
2898
+ "z": 0.0
2899
+ }
2900
+ ],
2901
+ "@entity.fx"
2902
+ ]
2078
2903
  ]
2079
2904
  ]
2080
2905
  ]
2081
2906
  ],
2907
+ [
2908
+ "if",
2909
+ [
2910
+ "!=",
2911
+ "@entity.result",
2912
+ "none"
2913
+ ],
2914
+ [
2915
+ "emit",
2916
+ "GAME_END",
2917
+ {
2918
+ "result": "@entity.result"
2919
+ }
2920
+ ],
2921
+ null
2922
+ ],
2082
2923
  [
2083
2924
  "render-ui",
2084
2925
  "main",
2085
2926
  {
2927
+ "addons": {
2928
+ "children": [
2929
+ {
2930
+ "action": "PLAY_AGAIN",
2931
+ "label": "Restart",
2932
+ "type": "button",
2933
+ "variant": "secondary"
2934
+ }
2935
+ ],
2936
+ "direction": "vertical",
2937
+ "gap": "sm",
2938
+ "type": "stack"
2939
+ },
2086
2940
  "backgroundAsset": {
2087
2941
  "animations": [],
2088
2942
  "aspect": "1:1",
@@ -2099,30 +2953,59 @@
2099
2953
  },
2100
2954
  "children": [
2101
2955
  {
2102
- "attackTargets": "@entity.attackTargets",
2103
- "features": "@config.features",
2956
+ "cameraMode": "follow",
2957
+ "events": "@entity.fx",
2958
+ "features": "@entity.features",
2959
+ "interpolateUnits": true,
2960
+ "keyMap": {
2961
+ "ArrowUp": "ACCELERATE",
2962
+ "KeyW": "ACCELERATE",
2963
+ "Space": "ACCELERATE"
2964
+ },
2104
2965
  "scale": "@config.scale",
2105
2966
  "selectedUnitId": "@entity.selectedUnitId",
2106
- "tileClickEvent": "TILE_CLICK",
2107
2967
  "tiles": "@config.tiles",
2108
2968
  "type": "game-canvas-3d",
2109
2969
  "unitScale": "@config.unitScale",
2110
- "units": "@entity.units",
2111
- "validMoves": "@entity.validMoves"
2970
+ "units": "@entity.units"
2112
2971
  }
2113
2972
  ],
2114
2973
  "hud": {
2115
- "stats": [
2974
+ "children": [
2116
2975
  {
2117
- "label": "Progress",
2118
- "value": "@entity.playerProgress"
2976
+ "stats": [
2977
+ {
2978
+ "label": "Lap",
2979
+ "value": [
2980
+ "str/concat",
2981
+ "@entity.lap",
2982
+ "/",
2983
+ "@config.totalLaps"
2984
+ ]
2985
+ },
2986
+ {
2987
+ "label": "Score",
2988
+ "value": "@entity.score"
2989
+ },
2990
+ {
2991
+ "label": "Result",
2992
+ "value": "@entity.result"
2993
+ }
2994
+ ],
2995
+ "type": "game-hud"
2119
2996
  },
2120
2997
  {
2121
- "label": "Result",
2122
- "value": "@entity.result"
2998
+ "directionEvents": {
2999
+ "up": "ACCELERATE"
3000
+ },
3001
+ "kind": "dpad",
3002
+ "type": "control-grid"
2123
3003
  }
2124
3004
  ],
2125
- "type": "game-hud"
3005
+ "direction": "horizontal",
3006
+ "gap": "md",
3007
+ "justify": "between",
3008
+ "type": "stack"
2126
3009
  },
2127
3010
  "hudBackgroundAsset": {
2128
3011
  "animations": [],
@@ -2138,6 +3021,38 @@
2138
3021
  "url": "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-adventure-pack/ui/uipack_rpg_sheet.png",
2139
3022
  "variant": ""
2140
3023
  },
3024
+ "overlay": [
3025
+ "if",
3026
+ [
3027
+ "!=",
3028
+ "@entity.result",
3029
+ "none"
3030
+ ],
3031
+ {
3032
+ "align": "center",
3033
+ "children": [
3034
+ {
3035
+ "stats": [
3036
+ {
3037
+ "label": "Result",
3038
+ "value": "@entity.result"
3039
+ }
3040
+ ],
3041
+ "type": "game-hud"
3042
+ },
3043
+ {
3044
+ "action": "PLAY_AGAIN",
3045
+ "label": "Play Again",
3046
+ "type": "button",
3047
+ "variant": "primary"
3048
+ }
3049
+ ],
3050
+ "direction": "vertical",
3051
+ "gap": "md",
3052
+ "type": "stack"
3053
+ },
3054
+ null
3055
+ ],
2141
3056
  "type": "game-shell"
2142
3057
  }
2143
3058
  ]