@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": "RacingBoard3D — 3D lap race on a 6x6 ring track; player clicks forward, rival advances on ticks, first to lap wins.",
2
+ "description": "RacingBoard3D — throttled keyboard/d-pad racing on a multi-lap 6x6 ring track with a follow camera and a ticking rival.",
3
3
  "name": "ui-racing-board-3d",
4
4
  "orbitals": [
5
5
  {
@@ -131,44 +131,6 @@
131
131
  "name": "selectedUnitId",
132
132
  "type": "string"
133
133
  },
134
- {
135
- "items": {
136
- "properties": {
137
- "x": {
138
- "name": "x",
139
- "required": true,
140
- "type": "number"
141
- },
142
- "z": {
143
- "name": "z",
144
- "required": true,
145
- "type": "number"
146
- }
147
- },
148
- "type": "object"
149
- },
150
- "name": "validMoves",
151
- "type": "array"
152
- },
153
- {
154
- "items": {
155
- "properties": {
156
- "x": {
157
- "name": "x",
158
- "required": true,
159
- "type": "number"
160
- },
161
- "z": {
162
- "name": "z",
163
- "required": true,
164
- "type": "number"
165
- }
166
- },
167
- "type": "object"
168
- },
169
- "name": "attackTargets",
170
- "type": "array"
171
- },
172
134
  {
173
135
  "default": "racing",
174
136
  "name": "phase",
@@ -188,6 +150,11 @@
188
150
  "name": "rivalProgress",
189
151
  "type": "number"
190
152
  },
153
+ {
154
+ "default": 1.0,
155
+ "name": "lap",
156
+ "type": "number"
157
+ },
191
158
  {
192
159
  "default": "none",
193
160
  "name": "result",
@@ -198,6 +165,11 @@
198
165
  "lost"
199
166
  ]
200
167
  },
168
+ {
169
+ "default": true,
170
+ "name": "canAdvance",
171
+ "type": "boolean"
172
+ },
201
173
  {
202
174
  "default": 6.0,
203
175
  "name": "gridWidth",
@@ -207,6 +179,51 @@
207
179
  "default": 6.0,
208
180
  "name": "gridHeight",
209
181
  "type": "number"
182
+ },
183
+ {
184
+ "default": [],
185
+ "items": {
186
+ "properties": {
187
+ "id": {
188
+ "name": "id",
189
+ "required": true,
190
+ "type": "string"
191
+ },
192
+ "message": {
193
+ "name": "message",
194
+ "required": false,
195
+ "type": "string"
196
+ },
197
+ "ttl": {
198
+ "name": "ttl",
199
+ "required": true,
200
+ "type": "number"
201
+ },
202
+ "type": {
203
+ "name": "type",
204
+ "required": true,
205
+ "type": "string"
206
+ },
207
+ "x": {
208
+ "name": "x",
209
+ "required": true,
210
+ "type": "number"
211
+ },
212
+ "y": {
213
+ "name": "y",
214
+ "required": false,
215
+ "type": "number"
216
+ },
217
+ "z": {
218
+ "name": "z",
219
+ "required": false,
220
+ "type": "number"
221
+ }
222
+ },
223
+ "type": "object"
224
+ },
225
+ "name": "fx",
226
+ "type": "array"
210
227
  }
211
228
  ],
212
229
  "name": "RacingBoard3DItem",
@@ -1273,6 +1290,13 @@
1273
1290
  "tier": "presentation",
1274
1291
  "type": "[RacingBoard3DTilesItem]"
1275
1292
  },
1293
+ "totalLaps": {
1294
+ "default": 2.0,
1295
+ "description": "Laps around the loop required to win",
1296
+ "label": "Total Laps",
1297
+ "tier": "presentation",
1298
+ "type": "number"
1299
+ },
1276
1300
  "trackOrder": {
1277
1301
  "default": [
1278
1302
  {
@@ -1606,21 +1630,11 @@
1606
1630
  },
1607
1631
  "emits": [
1608
1632
  {
1609
- "description": "Player advances to the clicked next track cell",
1610
- "event": "TILE_CLICK",
1633
+ "description": "Accelerate intent (keyboard keyMap or d-pad directionEvents) — advances one track cell when paced",
1634
+ "event": "ACCELERATE",
1611
1635
  "payloadSchema": [
1612
1636
  {
1613
- "name": "x",
1614
- "required": true,
1615
- "type": "number"
1616
- },
1617
- {
1618
- "name": "z",
1619
- "required": true,
1620
- "type": "number"
1621
- },
1622
- {
1623
- "name": "tileId",
1637
+ "name": "id",
1624
1638
  "type": "string"
1625
1639
  }
1626
1640
  ],
@@ -1654,16 +1668,17 @@
1654
1668
  ],
1655
1669
  "entityContract": {
1656
1670
  "provides": [
1657
- "attackTargets",
1671
+ "canAdvance",
1672
+ "fx",
1658
1673
  "gridHeight",
1659
1674
  "gridWidth",
1675
+ "lap",
1660
1676
  "phase",
1661
1677
  "playerProgress",
1662
1678
  "result",
1663
1679
  "rivalProgress",
1664
1680
  "selectedUnitId",
1665
- "units",
1666
- "validMoves"
1681
+ "units"
1667
1682
  ],
1668
1683
  "requires": []
1669
1684
  },
@@ -1678,22 +1693,12 @@
1678
1693
  "name": "Initialize"
1679
1694
  },
1680
1695
  {
1681
- "description": "Player advances to the clicked next track cell",
1682
- "key": "TILE_CLICK",
1683
- "name": "Tile Click",
1696
+ "description": "Accelerate intent (keyboard keyMap or d-pad directionEvents) — advances one track cell when paced",
1697
+ "key": "ACCELERATE",
1698
+ "name": "Accelerate",
1684
1699
  "payloadSchema": [
1685
1700
  {
1686
- "name": "x",
1687
- "required": true,
1688
- "type": "number"
1689
- },
1690
- {
1691
- "name": "z",
1692
- "required": true,
1693
- "type": "number"
1694
- },
1695
- {
1696
- "name": "tileId",
1701
+ "name": "id",
1697
1702
  "type": "string"
1698
1703
  }
1699
1704
  ],
@@ -1748,115 +1753,23 @@
1748
1753
  ],
1749
1754
  [
1750
1755
  "set",
1751
- "@entity.validMoves",
1752
- [
1753
- "let",
1754
- [
1755
- [
1756
- "playerUnit",
1757
- [
1758
- "array/find",
1759
- "@config.units",
1760
- [
1761
- "fn",
1762
- "u",
1763
- [
1764
- "==",
1765
- "@u.id",
1766
- "player"
1767
- ]
1768
- ]
1769
- ]
1770
- ]
1771
- ],
1772
- [
1773
- "let",
1774
- [
1775
- [
1776
- "pos",
1777
- [
1778
- "object/get",
1779
- "@playerUnit",
1780
- "position"
1781
- ]
1782
- ]
1783
- ],
1784
- [
1785
- "let",
1786
- [
1787
- [
1788
- "cur",
1789
- [
1790
- "array/find",
1791
- "@config.trackOrder",
1792
- [
1793
- "fn",
1794
- "t",
1795
- [
1796
- "and",
1797
- [
1798
- "==",
1799
- [
1800
- "object/get",
1801
- "@t",
1802
- "x"
1803
- ],
1804
- [
1805
- "object/get",
1806
- "@pos",
1807
- "x"
1808
- ]
1809
- ],
1810
- [
1811
- "==",
1812
- [
1813
- "object/get",
1814
- "@t",
1815
- "y"
1816
- ],
1817
- [
1818
- "object/get",
1819
- "@pos",
1820
- "y"
1821
- ]
1822
- ]
1823
- ]
1824
- ]
1825
- ]
1826
- ]
1827
- ],
1828
- [
1829
- {
1830
- "x": [
1831
- "object/get",
1832
- "@cur",
1833
- "nextX"
1834
- ],
1835
- "z": [
1836
- "object/get",
1837
- "@cur",
1838
- "nextY"
1839
- ]
1840
- }
1841
- ]
1842
- ]
1843
- ]
1844
- ]
1756
+ "@entity.playerProgress",
1757
+ 0.0
1845
1758
  ],
1846
1759
  [
1847
1760
  "set",
1848
- "@entity.attackTargets",
1849
- []
1761
+ "@entity.rivalProgress",
1762
+ 0.0
1850
1763
  ],
1851
1764
  [
1852
1765
  "set",
1853
- "@entity.playerProgress",
1854
- 0.0
1766
+ "@entity.lap",
1767
+ 1.0
1855
1768
  ],
1856
1769
  [
1857
1770
  "set",
1858
- "@entity.rivalProgress",
1859
- 0.0
1771
+ "@entity.canAdvance",
1772
+ true
1860
1773
  ],
1861
1774
  [
1862
1775
  "set",
@@ -1878,37 +1791,79 @@
1878
1791
  "@entity.gridHeight",
1879
1792
  6.0
1880
1793
  ],
1794
+ [
1795
+ "set",
1796
+ "@entity.fx",
1797
+ []
1798
+ ],
1881
1799
  [
1882
1800
  "render-ui",
1883
1801
  "main",
1884
1802
  {
1803
+ "addons": {
1804
+ "children": [
1805
+ {
1806
+ "action": "PLAY_AGAIN",
1807
+ "label": "Restart",
1808
+ "type": "button",
1809
+ "variant": "secondary"
1810
+ }
1811
+ ],
1812
+ "direction": "vertical",
1813
+ "gap": "sm",
1814
+ "type": "stack"
1815
+ },
1885
1816
  "children": [
1886
1817
  {
1887
- "attackTargets": "@entity.attackTargets",
1818
+ "cameraMode": "follow",
1819
+ "events": "@entity.fx",
1888
1820
  "features": "@config.features",
1889
1821
  "interpolateUnits": true,
1822
+ "keyMap": {
1823
+ "ArrowUp": "ACCELERATE",
1824
+ "KeyW": "ACCELERATE",
1825
+ "Space": "ACCELERATE"
1826
+ },
1890
1827
  "scale": "@config.scale",
1891
1828
  "selectedUnitId": "@entity.selectedUnitId",
1892
- "tileClickEvent": "TILE_CLICK",
1893
1829
  "tiles": "@config.tiles",
1894
1830
  "type": "game-canvas-3d",
1895
1831
  "unitScale": "@config.unitScale",
1896
- "units": "@entity.units",
1897
- "validMoves": "@entity.validMoves"
1832
+ "units": "@entity.units"
1898
1833
  }
1899
1834
  ],
1900
1835
  "hud": {
1901
- "stats": [
1836
+ "children": [
1902
1837
  {
1903
- "label": "Lap",
1904
- "value": "@entity.playerProgress"
1838
+ "stats": [
1839
+ {
1840
+ "label": "Lap",
1841
+ "value": [
1842
+ "str/concat",
1843
+ "@entity.lap",
1844
+ "/",
1845
+ "@config.totalLaps"
1846
+ ]
1847
+ },
1848
+ {
1849
+ "label": "Result",
1850
+ "value": "@entity.result"
1851
+ }
1852
+ ],
1853
+ "type": "game-hud"
1905
1854
  },
1906
1855
  {
1907
- "label": "Result",
1908
- "value": "@entity.result"
1856
+ "directionEvents": {
1857
+ "up": "ACCELERATE"
1858
+ },
1859
+ "kind": "dpad",
1860
+ "type": "control-grid"
1909
1861
  }
1910
1862
  ],
1911
- "type": "game-hud"
1863
+ "direction": "horizontal",
1864
+ "gap": "md",
1865
+ "justify": "between",
1866
+ "type": "stack"
1912
1867
  },
1913
1868
  "type": "game-shell"
1914
1869
  }
@@ -1937,93 +1892,158 @@
1937
1892
  "player"
1938
1893
  ],
1939
1894
  [
1940
- "object/merge",
1941
- "@u",
1942
- {
1943
- "position": {
1944
- "x": "@payload.x",
1945
- "y": "@payload.z"
1946
- }
1947
- }
1948
- ],
1949
- "@u"
1950
- ]
1951
- ]
1952
- ]
1953
- ],
1954
- [
1955
- "set",
1956
- "@entity.playerProgress",
1957
- [
1958
- "+",
1959
- "@entity.playerProgress",
1960
- 1.0
1961
- ]
1962
- ],
1963
- [
1964
- "set",
1965
- "@entity.validMoves",
1966
- [
1967
- "let",
1968
- [
1969
- [
1970
- "cur",
1971
- [
1972
- "array/find",
1973
- "@config.trackOrder",
1895
+ "let",
1974
1896
  [
1975
- "fn",
1976
- "t",
1977
1897
  [
1978
- "and",
1979
- [
1980
- "==",
1981
- [
1982
- "object/get",
1983
- "@t",
1984
- "x"
1985
- ],
1986
- "@payload.x"
1987
- ],
1898
+ "cur",
1988
1899
  [
1989
- "==",
1900
+ "array/find",
1901
+ "@config.trackOrder",
1990
1902
  [
1991
- "object/get",
1992
- "@t",
1993
- "y"
1994
- ],
1995
- "@payload.z"
1996
- ]
1997
- ]
1998
- ]
1999
- ]
2000
- ]
2001
- ],
2002
- [
2003
- {
2004
- "x": [
2005
- "object/get",
2006
- "@cur",
2007
- "nextX"
2008
- ],
2009
- "z": [
2010
- "object/get",
2011
- "@cur",
2012
- "nextY"
2013
- ]
2014
- }
2015
- ]
2016
- ]
2017
- ],
2018
- [
2019
- "set",
2020
- "@entity.result",
2021
- [
2022
- "if",
2023
- [
2024
- ">=",
1903
+ "fn",
1904
+ "t",
1905
+ [
1906
+ "and",
1907
+ [
1908
+ "==",
1909
+ [
1910
+ "object/get",
1911
+ "@t",
1912
+ "x"
1913
+ ],
1914
+ [
1915
+ "object/get",
1916
+ "@u.position",
1917
+ "x"
1918
+ ]
1919
+ ],
1920
+ [
1921
+ "==",
1922
+ [
1923
+ "object/get",
1924
+ "@t",
1925
+ "y"
1926
+ ],
1927
+ [
1928
+ "object/get",
1929
+ "@u.position",
1930
+ "y"
1931
+ ]
1932
+ ]
1933
+ ]
1934
+ ]
1935
+ ]
1936
+ ]
1937
+ ],
1938
+ [
1939
+ "object/merge",
1940
+ "@u",
1941
+ {
1942
+ "position": {
1943
+ "x": [
1944
+ "object/get",
1945
+ "@cur",
1946
+ "nextX"
1947
+ ],
1948
+ "y": [
1949
+ "object/get",
1950
+ "@cur",
1951
+ "nextY"
1952
+ ]
1953
+ }
1954
+ }
1955
+ ]
1956
+ ],
1957
+ "@u"
1958
+ ]
1959
+ ]
1960
+ ]
1961
+ ],
1962
+ [
1963
+ "set",
1964
+ "@entity.playerProgress",
1965
+ [
1966
+ "+",
1967
+ "@entity.playerProgress",
1968
+ 1.0
1969
+ ]
1970
+ ],
1971
+ [
1972
+ "set",
1973
+ "@entity.canAdvance",
1974
+ false
1975
+ ],
1976
+ [
1977
+ "set",
1978
+ "@entity.lap",
1979
+ [
1980
+ "+",
1981
+ [
1982
+ "math/floor",
1983
+ [
1984
+ "/",
1985
+ "@entity.playerProgress",
1986
+ [
1987
+ "array/len",
1988
+ "@config.trackOrder"
1989
+ ]
1990
+ ]
1991
+ ],
1992
+ 1.0
1993
+ ]
1994
+ ],
1995
+ [
1996
+ "set",
1997
+ "@entity.fx",
1998
+ [
1999
+ "if",
2000
+ [
2001
+ "==",
2002
+ [
2003
+ "%",
2004
+ "@entity.playerProgress",
2005
+ [
2006
+ "array/len",
2007
+ "@config.trackOrder"
2008
+ ]
2009
+ ],
2010
+ 0.0
2011
+ ],
2012
+ [
2013
+ "array/append",
2014
+ "@entity.fx",
2015
+ {
2016
+ "id": [
2017
+ "str/concat",
2018
+ "lap-",
2019
+ "@entity.playerProgress"
2020
+ ],
2021
+ "message": "Lap!",
2022
+ "ttl": 5.0,
2023
+ "type": "score",
2024
+ "x": 0.0,
2025
+ "z": 0.0
2026
+ }
2027
+ ],
2028
+ "@entity.fx"
2029
+ ]
2030
+ ],
2031
+ [
2032
+ "set",
2033
+ "@entity.result",
2034
+ [
2035
+ "if",
2036
+ [
2037
+ ">=",
2025
2038
  "@entity.playerProgress",
2026
- 20.0
2039
+ [
2040
+ "*",
2041
+ "@config.totalLaps",
2042
+ [
2043
+ "array/len",
2044
+ "@config.trackOrder"
2045
+ ]
2046
+ ]
2027
2047
  ],
2028
2048
  "won",
2029
2049
  "@entity.result"
@@ -2049,151 +2069,88 @@
2049
2069
  "render-ui",
2050
2070
  "main",
2051
2071
  {
2072
+ "addons": {
2073
+ "children": [
2074
+ {
2075
+ "action": "PLAY_AGAIN",
2076
+ "label": "Restart",
2077
+ "type": "button",
2078
+ "variant": "secondary"
2079
+ }
2080
+ ],
2081
+ "direction": "vertical",
2082
+ "gap": "sm",
2083
+ "type": "stack"
2084
+ },
2052
2085
  "children": [
2053
2086
  {
2054
- "attackTargets": "@entity.attackTargets",
2087
+ "cameraMode": "follow",
2088
+ "events": "@entity.fx",
2055
2089
  "features": "@config.features",
2056
2090
  "interpolateUnits": true,
2091
+ "keyMap": {
2092
+ "ArrowUp": "ACCELERATE",
2093
+ "KeyW": "ACCELERATE",
2094
+ "Space": "ACCELERATE"
2095
+ },
2057
2096
  "scale": "@config.scale",
2058
2097
  "selectedUnitId": "@entity.selectedUnitId",
2059
- "tileClickEvent": "TILE_CLICK",
2060
2098
  "tiles": "@config.tiles",
2061
2099
  "type": "game-canvas-3d",
2062
2100
  "unitScale": "@config.unitScale",
2063
- "units": "@entity.units",
2064
- "validMoves": "@entity.validMoves"
2101
+ "units": "@entity.units"
2065
2102
  }
2066
2103
  ],
2067
2104
  "hud": {
2068
- "stats": [
2105
+ "children": [
2069
2106
  {
2070
- "label": "Lap",
2071
- "value": "@entity.playerProgress"
2107
+ "stats": [
2108
+ {
2109
+ "label": "Lap",
2110
+ "value": [
2111
+ "str/concat",
2112
+ "@entity.lap",
2113
+ "/",
2114
+ "@config.totalLaps"
2115
+ ]
2116
+ },
2117
+ {
2118
+ "label": "Result",
2119
+ "value": "@entity.result"
2120
+ }
2121
+ ],
2122
+ "type": "game-hud"
2072
2123
  },
2073
2124
  {
2074
- "label": "Result",
2075
- "value": "@entity.result"
2125
+ "directionEvents": {
2126
+ "up": "ACCELERATE"
2127
+ },
2128
+ "kind": "dpad",
2129
+ "type": "control-grid"
2076
2130
  }
2077
2131
  ],
2078
- "type": "game-hud"
2132
+ "direction": "horizontal",
2133
+ "gap": "md",
2134
+ "justify": "between",
2135
+ "type": "stack"
2079
2136
  },
2080
2137
  "type": "game-shell"
2081
2138
  }
2082
2139
  ]
2083
2140
  ],
2084
- "event": "TILE_CLICK",
2141
+ "event": "ACCELERATE",
2085
2142
  "from": "racing",
2086
2143
  "guard": [
2087
2144
  "and",
2088
2145
  [
2089
2146
  "==",
2090
- "@entity.result",
2091
- "none"
2147
+ "@entity.canAdvance",
2148
+ true
2092
2149
  ],
2093
2150
  [
2094
- "let",
2095
- [
2096
- [
2097
- "playerUnit",
2098
- [
2099
- "array/find",
2100
- "@entity.units",
2101
- [
2102
- "fn",
2103
- "u",
2104
- [
2105
- "==",
2106
- "@u.id",
2107
- "player"
2108
- ]
2109
- ]
2110
- ]
2111
- ]
2112
- ],
2113
- [
2114
- "let",
2115
- [
2116
- [
2117
- "pos",
2118
- [
2119
- "object/get",
2120
- "@playerUnit",
2121
- "position"
2122
- ]
2123
- ]
2124
- ],
2125
- [
2126
- "let",
2127
- [
2128
- [
2129
- "cur",
2130
- [
2131
- "array/find",
2132
- "@config.trackOrder",
2133
- [
2134
- "fn",
2135
- "t",
2136
- [
2137
- "and",
2138
- [
2139
- "==",
2140
- [
2141
- "object/get",
2142
- "@t",
2143
- "x"
2144
- ],
2145
- [
2146
- "object/get",
2147
- "@pos",
2148
- "x"
2149
- ]
2150
- ],
2151
- [
2152
- "==",
2153
- [
2154
- "object/get",
2155
- "@t",
2156
- "y"
2157
- ],
2158
- [
2159
- "object/get",
2160
- "@pos",
2161
- "y"
2162
- ]
2163
- ]
2164
- ]
2165
- ]
2166
- ]
2167
- ]
2168
- ],
2169
- [
2170
- "and",
2171
- [
2172
- "!=",
2173
- "@cur",
2174
- null
2175
- ],
2176
- [
2177
- "==",
2178
- [
2179
- "object/get",
2180
- "@cur",
2181
- "nextX"
2182
- ],
2183
- "@payload.x"
2184
- ],
2185
- [
2186
- "==",
2187
- [
2188
- "object/get",
2189
- "@cur",
2190
- "nextY"
2191
- ],
2192
- "@payload.z"
2193
- ]
2194
- ]
2195
- ]
2196
- ]
2151
+ "==",
2152
+ "@entity.result",
2153
+ "none"
2197
2154
  ]
2198
2155
  ],
2199
2156
  "to": "racing"
@@ -2205,37 +2162,131 @@
2205
2162
  "@entity.phase",
2206
2163
  "finished"
2207
2164
  ],
2165
+ [
2166
+ "set",
2167
+ "@entity.fx",
2168
+ [
2169
+ "array/append",
2170
+ "@entity.fx",
2171
+ {
2172
+ "id": "result-fx",
2173
+ "message": [
2174
+ "if",
2175
+ [
2176
+ "==",
2177
+ "@entity.result",
2178
+ "won"
2179
+ ],
2180
+ "You Win!",
2181
+ "You Lose!"
2182
+ ],
2183
+ "ttl": 999.0,
2184
+ "type": [
2185
+ "if",
2186
+ [
2187
+ "==",
2188
+ "@entity.result",
2189
+ "won"
2190
+ ],
2191
+ "win",
2192
+ "lose"
2193
+ ],
2194
+ "x": 0.0,
2195
+ "z": 0.0
2196
+ }
2197
+ ]
2198
+ ],
2208
2199
  [
2209
2200
  "render-ui",
2210
2201
  "main",
2211
2202
  {
2203
+ "addons": {
2204
+ "children": [
2205
+ {
2206
+ "action": "PLAY_AGAIN",
2207
+ "label": "Restart",
2208
+ "type": "button",
2209
+ "variant": "secondary"
2210
+ }
2211
+ ],
2212
+ "direction": "vertical",
2213
+ "gap": "sm",
2214
+ "type": "stack"
2215
+ },
2212
2216
  "children": [
2213
2217
  {
2214
- "attackTargets": "@entity.attackTargets",
2218
+ "cameraMode": "follow",
2219
+ "events": "@entity.fx",
2215
2220
  "features": "@config.features",
2216
2221
  "interpolateUnits": true,
2222
+ "keyMap": {
2223
+ "ArrowUp": "ACCELERATE",
2224
+ "KeyW": "ACCELERATE",
2225
+ "Space": "ACCELERATE"
2226
+ },
2217
2227
  "scale": "@config.scale",
2218
2228
  "selectedUnitId": "@entity.selectedUnitId",
2219
- "tileClickEvent": "TILE_CLICK",
2220
2229
  "tiles": "@config.tiles",
2221
2230
  "type": "game-canvas-3d",
2222
2231
  "unitScale": "@config.unitScale",
2223
- "units": "@entity.units",
2224
- "validMoves": "@entity.validMoves"
2232
+ "units": "@entity.units"
2225
2233
  }
2226
2234
  ],
2227
2235
  "hud": {
2228
- "stats": [
2236
+ "children": [
2237
+ {
2238
+ "stats": [
2239
+ {
2240
+ "label": "Lap",
2241
+ "value": [
2242
+ "str/concat",
2243
+ "@entity.lap",
2244
+ "/",
2245
+ "@config.totalLaps"
2246
+ ]
2247
+ },
2248
+ {
2249
+ "label": "Result",
2250
+ "value": "@entity.result"
2251
+ }
2252
+ ],
2253
+ "type": "game-hud"
2254
+ },
2255
+ {
2256
+ "directionEvents": {
2257
+ "up": "ACCELERATE"
2258
+ },
2259
+ "kind": "dpad",
2260
+ "type": "control-grid"
2261
+ }
2262
+ ],
2263
+ "direction": "horizontal",
2264
+ "gap": "md",
2265
+ "justify": "between",
2266
+ "type": "stack"
2267
+ },
2268
+ "overlay": {
2269
+ "align": "center",
2270
+ "children": [
2229
2271
  {
2230
- "label": "Lap",
2231
- "value": "@entity.playerProgress"
2272
+ "stats": [
2273
+ {
2274
+ "label": "Result",
2275
+ "value": "@entity.result"
2276
+ }
2277
+ ],
2278
+ "type": "game-hud"
2232
2279
  },
2233
2280
  {
2234
- "label": "Result",
2235
- "value": "@entity.result"
2281
+ "action": "PLAY_AGAIN",
2282
+ "label": "Play Again",
2283
+ "type": "button",
2284
+ "variant": "primary"
2236
2285
  }
2237
2286
  ],
2238
- "type": "game-hud"
2287
+ "direction": "vertical",
2288
+ "gap": "md",
2289
+ "type": "stack"
2239
2290
  },
2240
2291
  "type": "game-shell"
2241
2292
  }
@@ -2272,115 +2323,23 @@
2272
2323
  ],
2273
2324
  [
2274
2325
  "set",
2275
- "@entity.validMoves",
2276
- [
2277
- "let",
2278
- [
2279
- [
2280
- "playerUnit",
2281
- [
2282
- "array/find",
2283
- "@config.units",
2284
- [
2285
- "fn",
2286
- "u",
2287
- [
2288
- "==",
2289
- "@u.id",
2290
- "player"
2291
- ]
2292
- ]
2293
- ]
2294
- ]
2295
- ],
2296
- [
2297
- "let",
2298
- [
2299
- [
2300
- "pos",
2301
- [
2302
- "object/get",
2303
- "@playerUnit",
2304
- "position"
2305
- ]
2306
- ]
2307
- ],
2308
- [
2309
- "let",
2310
- [
2311
- [
2312
- "cur",
2313
- [
2314
- "array/find",
2315
- "@config.trackOrder",
2316
- [
2317
- "fn",
2318
- "t",
2319
- [
2320
- "and",
2321
- [
2322
- "==",
2323
- [
2324
- "object/get",
2325
- "@t",
2326
- "x"
2327
- ],
2328
- [
2329
- "object/get",
2330
- "@pos",
2331
- "x"
2332
- ]
2333
- ],
2334
- [
2335
- "==",
2336
- [
2337
- "object/get",
2338
- "@t",
2339
- "y"
2340
- ],
2341
- [
2342
- "object/get",
2343
- "@pos",
2344
- "y"
2345
- ]
2346
- ]
2347
- ]
2348
- ]
2349
- ]
2350
- ]
2351
- ],
2352
- [
2353
- {
2354
- "x": [
2355
- "object/get",
2356
- "@cur",
2357
- "nextX"
2358
- ],
2359
- "z": [
2360
- "object/get",
2361
- "@cur",
2362
- "nextY"
2363
- ]
2364
- }
2365
- ]
2366
- ]
2367
- ]
2368
- ]
2326
+ "@entity.playerProgress",
2327
+ 0.0
2369
2328
  ],
2370
2329
  [
2371
2330
  "set",
2372
- "@entity.attackTargets",
2373
- []
2331
+ "@entity.rivalProgress",
2332
+ 0.0
2374
2333
  ],
2375
2334
  [
2376
2335
  "set",
2377
- "@entity.playerProgress",
2378
- 0.0
2336
+ "@entity.lap",
2337
+ 1.0
2379
2338
  ],
2380
2339
  [
2381
2340
  "set",
2382
- "@entity.rivalProgress",
2383
- 0.0
2341
+ "@entity.canAdvance",
2342
+ true
2384
2343
  ],
2385
2344
  [
2386
2345
  "set",
@@ -2392,37 +2351,79 @@
2392
2351
  "@entity.result",
2393
2352
  "none"
2394
2353
  ],
2354
+ [
2355
+ "set",
2356
+ "@entity.fx",
2357
+ []
2358
+ ],
2395
2359
  [
2396
2360
  "render-ui",
2397
2361
  "main",
2398
2362
  {
2363
+ "addons": {
2364
+ "children": [
2365
+ {
2366
+ "action": "PLAY_AGAIN",
2367
+ "label": "Restart",
2368
+ "type": "button",
2369
+ "variant": "secondary"
2370
+ }
2371
+ ],
2372
+ "direction": "vertical",
2373
+ "gap": "sm",
2374
+ "type": "stack"
2375
+ },
2399
2376
  "children": [
2400
2377
  {
2401
- "attackTargets": "@entity.attackTargets",
2378
+ "cameraMode": "follow",
2379
+ "events": "@entity.fx",
2402
2380
  "features": "@config.features",
2403
2381
  "interpolateUnits": true,
2382
+ "keyMap": {
2383
+ "ArrowUp": "ACCELERATE",
2384
+ "KeyW": "ACCELERATE",
2385
+ "Space": "ACCELERATE"
2386
+ },
2404
2387
  "scale": "@config.scale",
2405
2388
  "selectedUnitId": "@entity.selectedUnitId",
2406
- "tileClickEvent": "TILE_CLICK",
2407
2389
  "tiles": "@config.tiles",
2408
2390
  "type": "game-canvas-3d",
2409
2391
  "unitScale": "@config.unitScale",
2410
- "units": "@entity.units",
2411
- "validMoves": "@entity.validMoves"
2392
+ "units": "@entity.units"
2412
2393
  }
2413
2394
  ],
2414
2395
  "hud": {
2415
- "stats": [
2396
+ "children": [
2416
2397
  {
2417
- "label": "Lap",
2418
- "value": "@entity.playerProgress"
2398
+ "stats": [
2399
+ {
2400
+ "label": "Lap",
2401
+ "value": [
2402
+ "str/concat",
2403
+ "@entity.lap",
2404
+ "/",
2405
+ "@config.totalLaps"
2406
+ ]
2407
+ },
2408
+ {
2409
+ "label": "Result",
2410
+ "value": "@entity.result"
2411
+ }
2412
+ ],
2413
+ "type": "game-hud"
2419
2414
  },
2420
2415
  {
2421
- "label": "Result",
2422
- "value": "@entity.result"
2416
+ "directionEvents": {
2417
+ "up": "ACCELERATE"
2418
+ },
2419
+ "kind": "dpad",
2420
+ "type": "control-grid"
2423
2421
  }
2424
2422
  ],
2425
- "type": "game-hud"
2423
+ "direction": "horizontal",
2424
+ "gap": "md",
2425
+ "justify": "between",
2426
+ "type": "stack"
2426
2427
  },
2427
2428
  "type": "game-shell"
2428
2429
  }
@@ -2435,6 +2436,65 @@
2435
2436
  ]
2436
2437
  },
2437
2438
  "ticks": [
2439
+ {
2440
+ "effects": [
2441
+ [
2442
+ "set",
2443
+ "@entity.canAdvance",
2444
+ true
2445
+ ],
2446
+ [
2447
+ "set",
2448
+ "@entity.fx",
2449
+ [
2450
+ "array/filter",
2451
+ [
2452
+ "array/map",
2453
+ "@entity.fx",
2454
+ [
2455
+ "fn",
2456
+ "e",
2457
+ [
2458
+ "object/merge",
2459
+ "@e",
2460
+ {
2461
+ "ttl": [
2462
+ "-",
2463
+ [
2464
+ "object/get",
2465
+ "@e",
2466
+ "ttl"
2467
+ ],
2468
+ 1.0
2469
+ ]
2470
+ }
2471
+ ]
2472
+ ]
2473
+ ],
2474
+ [
2475
+ "fn",
2476
+ "e",
2477
+ [
2478
+ ">",
2479
+ [
2480
+ "object/get",
2481
+ "@e",
2482
+ "ttl"
2483
+ ],
2484
+ 0.0
2485
+ ]
2486
+ ]
2487
+ ]
2488
+ ]
2489
+ ],
2490
+ "guard": [
2491
+ "==",
2492
+ "@entity.result",
2493
+ "none"
2494
+ ],
2495
+ "interval": 400.0,
2496
+ "name": "paceTick"
2497
+ },
2438
2498
  {
2439
2499
  "effects": [
2440
2500
  [
@@ -2457,76 +2517,63 @@
2457
2517
  "let",
2458
2518
  [
2459
2519
  [
2460
- "pos",
2461
- [
2462
- "object/get",
2463
- "@u",
2464
- "position"
2465
- ]
2466
- ]
2467
- ],
2468
- [
2469
- "let",
2470
- [
2520
+ "cur",
2471
2521
  [
2472
- "cur",
2522
+ "array/find",
2523
+ "@config.trackOrder",
2473
2524
  [
2474
- "array/find",
2475
- "@config.trackOrder",
2525
+ "fn",
2526
+ "t",
2476
2527
  [
2477
- "fn",
2478
- "t",
2528
+ "and",
2479
2529
  [
2480
- "and",
2530
+ "==",
2481
2531
  [
2482
- "==",
2483
- [
2484
- "object/get",
2485
- "@t",
2486
- "x"
2487
- ],
2488
- [
2489
- "object/get",
2490
- "@pos",
2491
- "x"
2492
- ]
2532
+ "object/get",
2533
+ "@t",
2534
+ "x"
2493
2535
  ],
2494
2536
  [
2495
- "==",
2496
- [
2497
- "object/get",
2498
- "@t",
2499
- "y"
2500
- ],
2501
- [
2502
- "object/get",
2503
- "@pos",
2504
- "y"
2505
- ]
2537
+ "object/get",
2538
+ "@u.position",
2539
+ "x"
2540
+ ]
2541
+ ],
2542
+ [
2543
+ "==",
2544
+ [
2545
+ "object/get",
2546
+ "@t",
2547
+ "y"
2548
+ ],
2549
+ [
2550
+ "object/get",
2551
+ "@u.position",
2552
+ "y"
2506
2553
  ]
2507
2554
  ]
2508
2555
  ]
2509
2556
  ]
2510
2557
  ]
2511
- ],
2512
- [
2513
- "object/merge",
2514
- "@u",
2515
- {
2516
- "position": {
2517
- "x": [
2518
- "object/get",
2519
- "@cur",
2520
- "nextX"
2521
- ],
2522
- "y": [
2523
- "object/get",
2524
- "@cur",
2525
- "nextY"
2526
- ]
2527
- }
2528
- }
2529
2558
  ]
2559
+ ],
2560
+ [
2561
+ "object/merge",
2562
+ "@u",
2563
+ {
2564
+ "position": {
2565
+ "x": [
2566
+ "object/get",
2567
+ "@cur",
2568
+ "nextX"
2569
+ ],
2570
+ "y": [
2571
+ "object/get",
2572
+ "@cur",
2573
+ "nextY"
2574
+ ]
2575
+ }
2576
+ }
2530
2577
  ]
2531
2578
  ],
2532
2579
  "@u"
@@ -2551,7 +2598,14 @@
2551
2598
  [
2552
2599
  ">=",
2553
2600
  "@entity.rivalProgress",
2554
- 20.0
2601
+ [
2602
+ "*",
2603
+ "@config.totalLaps",
2604
+ [
2605
+ "array/len",
2606
+ "@config.trackOrder"
2607
+ ]
2608
+ ]
2555
2609
  ],
2556
2610
  "lost",
2557
2611
  "@entity.result"
@@ -2577,33 +2631,70 @@
2577
2631
  "render-ui",
2578
2632
  "main",
2579
2633
  {
2634
+ "addons": {
2635
+ "children": [
2636
+ {
2637
+ "action": "PLAY_AGAIN",
2638
+ "label": "Restart",
2639
+ "type": "button",
2640
+ "variant": "secondary"
2641
+ }
2642
+ ],
2643
+ "direction": "vertical",
2644
+ "gap": "sm",
2645
+ "type": "stack"
2646
+ },
2580
2647
  "children": [
2581
2648
  {
2582
- "attackTargets": "@entity.attackTargets",
2649
+ "cameraMode": "follow",
2650
+ "events": "@entity.fx",
2583
2651
  "features": "@config.features",
2584
2652
  "interpolateUnits": true,
2653
+ "keyMap": {
2654
+ "ArrowUp": "ACCELERATE",
2655
+ "KeyW": "ACCELERATE",
2656
+ "Space": "ACCELERATE"
2657
+ },
2585
2658
  "scale": "@config.scale",
2586
2659
  "selectedUnitId": "@entity.selectedUnitId",
2587
- "tileClickEvent": "TILE_CLICK",
2588
2660
  "tiles": "@config.tiles",
2589
2661
  "type": "game-canvas-3d",
2590
2662
  "unitScale": "@config.unitScale",
2591
- "units": "@entity.units",
2592
- "validMoves": "@entity.validMoves"
2663
+ "units": "@entity.units"
2593
2664
  }
2594
2665
  ],
2595
2666
  "hud": {
2596
- "stats": [
2667
+ "children": [
2597
2668
  {
2598
- "label": "Lap",
2599
- "value": "@entity.playerProgress"
2669
+ "stats": [
2670
+ {
2671
+ "label": "Lap",
2672
+ "value": [
2673
+ "str/concat",
2674
+ "@entity.lap",
2675
+ "/",
2676
+ "@config.totalLaps"
2677
+ ]
2678
+ },
2679
+ {
2680
+ "label": "Result",
2681
+ "value": "@entity.result"
2682
+ }
2683
+ ],
2684
+ "type": "game-hud"
2600
2685
  },
2601
2686
  {
2602
- "label": "Result",
2603
- "value": "@entity.result"
2687
+ "directionEvents": {
2688
+ "up": "ACCELERATE"
2689
+ },
2690
+ "kind": "dpad",
2691
+ "type": "control-grid"
2604
2692
  }
2605
2693
  ],
2606
- "type": "game-hud"
2694
+ "direction": "horizontal",
2695
+ "gap": "md",
2696
+ "justify": "between",
2697
+ "type": "stack"
2607
2698
  },
2608
2699
  "type": "game-shell"
2609
2700
  }