@almadar/std 16.153.0 → 16.155.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 (93) hide show
  1. package/behaviors/lolo/ui/game/molecules/std-crew-board-2d.lolo +4 -4
  2. package/behaviors/lolo/ui/game/molecules/std-dungeon-board-2d.lolo +6 -6
  3. package/behaviors/lolo/ui/game/molecules/std-tactics-board-2d.lolo +74 -28
  4. package/behaviors/lolo/ui/game/molecules/std-worldmap-board-2d.lolo +2 -2
  5. package/behaviors/lolo/ui/game/molecules/ui-canvas.lolo +5 -0
  6. package/behaviors/lolo/ui/game/organisms/ui-arena-board.lolo +2 -2
  7. package/behaviors/lolo/ui/game/organisms/ui-battle-board.lolo +159 -8
  8. package/behaviors/lolo/ui/game/organisms/ui-builder-board.lolo +5 -20
  9. package/behaviors/lolo/ui/game/organisms/ui-card-battler-board.lolo +2 -0
  10. package/behaviors/lolo/ui/game/organisms/ui-castle-board.lolo +3 -3
  11. package/behaviors/lolo/ui/game/organisms/ui-city-builder-board.lolo +9 -7
  12. package/behaviors/lolo/ui/game/organisms/ui-grid-tactics-demo-board.lolo +2 -2
  13. package/behaviors/lolo/ui/game/organisms/ui-hex-strategy-board.lolo +158 -10
  14. package/behaviors/lolo/ui/game/organisms/ui-holiday-runner-board.lolo +1 -1
  15. package/behaviors/lolo/ui/game/organisms/ui-minigolf-board.lolo +22 -22
  16. package/behaviors/lolo/ui/game/organisms/ui-pinball-board.lolo +7 -7
  17. package/behaviors/lolo/ui/game/organisms/ui-pirate-board.lolo +14 -14
  18. package/behaviors/lolo/ui/game/organisms/ui-platformer-board.lolo +4 -0
  19. package/behaviors/lolo/ui/game/organisms/ui-sports-board.lolo +10 -7
  20. package/behaviors/lolo/ui/game/organisms/ui-tactics-demo-2d.lolo +135 -9
  21. package/behaviors/lolo/ui/game/organisms/ui-tanks-board.lolo +152 -8
  22. package/behaviors/lolo/ui/game/organisms/ui-topdown-rts-board.lolo +293 -17
  23. package/behaviors/lolo/ui/game/organisms/ui-tower-defense-board.lolo +8 -8
  24. package/behaviors/lolo/ui/game/organisms/ui-uncontrolled-battle-board.lolo +5 -5
  25. package/behaviors/lolo/ui/game/organisms/ui-world-map-board.lolo +3 -3
  26. package/behaviors/registry/factory-signatures.json +1893 -2294
  27. package/behaviors/registry/ui/game/molecules/std-crew-board-2d.orb +10 -12
  28. package/behaviors/registry/ui/game/molecules/std-dungeon-board-2d.orb +15 -18
  29. package/behaviors/registry/ui/game/molecules/std-tactics-board-2d.orb +1726 -395
  30. package/behaviors/registry/ui/game/molecules/std-worldmap-board-2d.orb +7 -60
  31. package/behaviors/registry/ui/game/molecules/ui-canvas.orb +7 -0
  32. package/behaviors/registry/ui/game/organisms/ui-arena-board.orb +5 -6
  33. package/behaviors/registry/ui/game/organisms/ui-battle-board.orb +103 -100
  34. package/behaviors/registry/ui/game/organisms/ui-builder-board.orb +21 -226
  35. package/behaviors/registry/ui/game/organisms/ui-card-battler-board.orb +42 -0
  36. package/behaviors/registry/ui/game/organisms/ui-castle-board.orb +30 -9
  37. package/behaviors/registry/ui/game/organisms/ui-city-builder-board.orb +49 -0
  38. package/behaviors/registry/ui/game/organisms/ui-grid-tactics-demo-board.orb +5 -6
  39. package/behaviors/registry/ui/game/organisms/ui-hex-strategy-board.orb +95 -1187
  40. package/behaviors/registry/ui/game/organisms/ui-holiday-runner-board.orb +2 -3
  41. package/behaviors/registry/ui/game/organisms/ui-minigolf-board.orb +55 -11
  42. package/behaviors/registry/ui/game/organisms/ui-pinball-board.orb +8 -8
  43. package/behaviors/registry/ui/game/organisms/ui-pirate-board.orb +14 -0
  44. package/behaviors/registry/ui/game/organisms/ui-platformer-board.orb +72 -0
  45. package/behaviors/registry/ui/game/organisms/ui-sports-board.orb +60 -0
  46. package/behaviors/registry/ui/game/organisms/ui-tactics-demo-2d.orb +222 -332
  47. package/behaviors/registry/ui/game/organisms/ui-tanks-board.orb +127 -95
  48. package/behaviors/registry/ui/game/organisms/ui-topdown-rts-board.orb +1501 -264
  49. package/behaviors/registry/ui/game/organisms/ui-tower-defense-board.orb +8 -0
  50. package/behaviors/registry/ui/game/organisms/ui-uncontrolled-battle-board.orb +5 -0
  51. package/behaviors/registry/ui/game/organisms/ui-world-map-board.orb +8 -12
  52. package/dist/behaviors/behaviors-embeddings.json +244 -236
  53. package/dist/behaviors/behaviors-registry.json +193 -812
  54. package/dist/behaviors/exports-reader.js +1099 -2090
  55. package/dist/behaviors/functions/index.d.ts +33 -26
  56. package/dist/behaviors/functions/index.js +1099 -2091
  57. package/dist/behaviors/index.d.ts +1 -1
  58. package/dist/behaviors/index.js +1100 -2091
  59. package/dist/behaviors/knob-embeddings.json +1 -1
  60. package/dist/behaviors/query.js +1099 -2090
  61. package/dist/behaviors/registry/factory-signatures.json +1893 -2294
  62. package/dist/behaviors/registry/ui/game/molecules/std-crew-board-2d.orb +10 -12
  63. package/dist/behaviors/registry/ui/game/molecules/std-dungeon-board-2d.orb +15 -18
  64. package/dist/behaviors/registry/ui/game/molecules/std-tactics-board-2d.orb +1726 -395
  65. package/dist/behaviors/registry/ui/game/molecules/std-worldmap-board-2d.orb +7 -60
  66. package/dist/behaviors/registry/ui/game/molecules/ui-canvas.orb +7 -0
  67. package/dist/behaviors/registry/ui/game/organisms/ui-arena-board.orb +5 -6
  68. package/dist/behaviors/registry/ui/game/organisms/ui-battle-board.orb +103 -100
  69. package/dist/behaviors/registry/ui/game/organisms/ui-builder-board.orb +21 -226
  70. package/dist/behaviors/registry/ui/game/organisms/ui-card-battler-board.orb +42 -0
  71. package/dist/behaviors/registry/ui/game/organisms/ui-castle-board.orb +30 -9
  72. package/dist/behaviors/registry/ui/game/organisms/ui-city-builder-board.orb +49 -0
  73. package/dist/behaviors/registry/ui/game/organisms/ui-grid-tactics-demo-board.orb +5 -6
  74. package/dist/behaviors/registry/ui/game/organisms/ui-hex-strategy-board.orb +95 -1187
  75. package/dist/behaviors/registry/ui/game/organisms/ui-holiday-runner-board.orb +2 -3
  76. package/dist/behaviors/registry/ui/game/organisms/ui-minigolf-board.orb +55 -11
  77. package/dist/behaviors/registry/ui/game/organisms/ui-pinball-board.orb +8 -8
  78. package/dist/behaviors/registry/ui/game/organisms/ui-pirate-board.orb +14 -0
  79. package/dist/behaviors/registry/ui/game/organisms/ui-platformer-board.orb +72 -0
  80. package/dist/behaviors/registry/ui/game/organisms/ui-sports-board.orb +60 -0
  81. package/dist/behaviors/registry/ui/game/organisms/ui-tactics-demo-2d.orb +222 -332
  82. package/dist/behaviors/registry/ui/game/organisms/ui-tanks-board.orb +127 -95
  83. package/dist/behaviors/registry/ui/game/organisms/ui-topdown-rts-board.orb +1501 -264
  84. package/dist/behaviors/registry/ui/game/organisms/ui-tower-defense-board.orb +8 -0
  85. package/dist/behaviors/registry/ui/game/organisms/ui-uncontrolled-battle-board.orb +5 -0
  86. package/dist/behaviors/registry/ui/game/organisms/ui-world-map-board.orb +8 -12
  87. package/dist/behaviors-embeddings.json +244 -236
  88. package/dist/behaviors-registry.json +193 -812
  89. package/dist/index.d.ts +1 -1
  90. package/dist/index.js +1100 -2091
  91. package/dist/knob-embeddings.json +1 -1
  92. package/dist/registry/factory-signatures.json +1893 -2294
  93. package/package.json +2 -2
@@ -107,7 +107,7 @@ orbital CityBuilderBoardOrbital {
107
107
  backgroundAsset: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.json", sprite: "grey_panel.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "panel-frame", thumbnailUrl: "" }
108
108
  hudBackgroundAsset: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.json", sprite: "grey_panel.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "panel-frame", thumbnailUrl: "" }
109
109
  hud: { type: stack, direction: horizontal, gap: md, justify: between, children: [ { type: game-hud, stats: [ { label: "Population", value: @entity.population, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.json", sprite: "icon_hand", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-population", thumbnailUrl: "" } }, { label: "Gold", value: @entity.gold, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.json", sprite: "icon_money", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-gold", thumbnailUrl: "" } }, { label: "Wood", value: @entity.wood, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.json", sprite: "wood046.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-wood", thumbnailUrl: "" } }, { label: "Build", value: @entity.pendingBuildType } ] }, { type: stat-badge, label: "Gold", value: @entity.gold, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.json", sprite: "icon_money", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-gold", thumbnailUrl: "" } }, { type: stat-badge, label: "Wood", value: @entity.wood, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.json", sprite: "wood046.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-wood", thumbnailUrl: "" } }, { type: control-grid, items: @config.buildTypes, action: SELECT_BUILD_TYPE, labelKey: "label", valueKey: "type", selected: @entity.pendingBuildType } ] }
110
- children: [ { type: canvas, camera: { zoom: @config.scale }, projection: "isometric", showMinimap: true, tileClickEvent: PLACE_BUILDING, children: [
110
+ children: [ { type: canvas, fit: true, camera: { zoom: @config.scale }, projection: "isometric", showMinimap: true, tileClickEvent: PLACE_BUILDING, children: [
111
111
  { type: draw-sprite-layer, items: (array/map @config.tiles (fn t { type: draw-sprite, position: { x: (object/get @t x), y: (object/get @t y) }, asset: (object/get @t terrainSprite) })) }
112
112
  { type: draw-sprite-layer, items: (array/map @entity.features (fn f { type: draw-sprite, position: { x: (object/get @f x), y: (object/get @f y) }, asset: (object/get @f sprite) })) }
113
113
  { type: draw-shape-layer, items: (array/map @entity.validMoves (fn m { type: draw-shape, shape: "cell", position: { x: (object/get @m x), y: (object/get @m y) }, fill: "rgba(74,222,128,0.4)" })) }
@@ -124,7 +124,7 @@ orbital CityBuilderBoardOrbital {
124
124
  backgroundAsset: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.json", sprite: "grey_panel.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "panel-frame", thumbnailUrl: "" }
125
125
  hudBackgroundAsset: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.json", sprite: "grey_panel.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "panel-frame", thumbnailUrl: "" }
126
126
  hud: { type: stack, direction: horizontal, gap: md, justify: between, children: [ { type: game-hud, stats: [ { label: "Population", value: @entity.population, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.json", sprite: "icon_hand", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-population", thumbnailUrl: "" } }, { label: "Gold", value: @entity.gold, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.json", sprite: "icon_money", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-gold", thumbnailUrl: "" } }, { label: "Wood", value: @entity.wood, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.json", sprite: "wood046.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-wood", thumbnailUrl: "" } }, { label: "Build", value: @entity.pendingBuildType } ] }, { type: stat-badge, label: "Gold", value: @entity.gold, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.json", sprite: "icon_money", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-gold", thumbnailUrl: "" } }, { type: stat-badge, label: "Wood", value: @entity.wood, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.json", sprite: "wood046.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-wood", thumbnailUrl: "" } }, { type: control-grid, items: @config.buildTypes, action: SELECT_BUILD_TYPE, labelKey: "label", valueKey: "type", selected: @entity.pendingBuildType } ] }
127
- children: [ { type: canvas, camera: { zoom: @config.scale }, projection: "isometric", showMinimap: true, tileClickEvent: PLACE_BUILDING, children: [
127
+ children: [ { type: canvas, fit: true, camera: { zoom: @config.scale }, projection: "isometric", showMinimap: true, tileClickEvent: PLACE_BUILDING, children: [
128
128
  { type: draw-sprite-layer, items: (array/map @config.tiles (fn t { type: draw-sprite, position: { x: (object/get @t x), y: (object/get @t y) }, asset: (object/get @t terrainSprite) })) }
129
129
  { type: draw-sprite-layer, items: (array/map @entity.features (fn f { type: draw-sprite, position: { x: (object/get @f x), y: (object/get @f y) }, asset: (object/get @f sprite) })) }
130
130
  { type: draw-shape-layer, items: (array/map @entity.validMoves (fn m { type: draw-shape, shape: "cell", position: { x: (object/get @m x), y: (object/get @m y) }, fill: "rgba(74,222,128,0.4)" })) }
@@ -139,6 +139,7 @@ orbital CityBuilderBoardOrbital {
139
139
  (set @entity.features (array/concat @entity.features [{ id: (str/concat "bld-" (array/len @entity.features)), x: ?x, y: ?y, type: @entity.pendingBuildType, sprite: (object/get @config.featureSprites @entity.pendingBuildType) }]))
140
140
  (set @entity.population (+ @entity.population @config.populationPerBuilding))
141
141
  (set @entity.result (if (>= @entity.population @config.targetPopulation) "won" @entity.result))
142
+ (if (!= @entity.result "none") (emit GAME_END { result: @entity.result }) null)
142
143
  (set @entity.selectedUnitId "")
143
144
  (set @entity.validMoves [])
144
145
  (render-ui main {
@@ -146,7 +147,7 @@ orbital CityBuilderBoardOrbital {
146
147
  backgroundAsset: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.json", sprite: "grey_panel.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "panel-frame", thumbnailUrl: "" }
147
148
  hudBackgroundAsset: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.json", sprite: "grey_panel.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "panel-frame", thumbnailUrl: "" }
148
149
  hud: { type: stack, direction: horizontal, gap: md, justify: between, children: [ { type: game-hud, stats: [ { label: "Population", value: @entity.population, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.json", sprite: "icon_hand", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-population", thumbnailUrl: "" } }, { label: "Gold", value: @entity.gold, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.json", sprite: "icon_money", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-gold", thumbnailUrl: "" } }, { label: "Wood", value: @entity.wood, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.json", sprite: "wood046.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-wood", thumbnailUrl: "" } }, { label: "Build", value: @entity.pendingBuildType } ] }, { type: stat-badge, label: "Gold", value: @entity.gold, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.json", sprite: "icon_money", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-gold", thumbnailUrl: "" } }, { type: stat-badge, label: "Wood", value: @entity.wood, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.json", sprite: "wood046.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-wood", thumbnailUrl: "" } }, { type: control-grid, items: @config.buildTypes, action: SELECT_BUILD_TYPE, labelKey: "label", valueKey: "type", selected: @entity.pendingBuildType } ] }
149
- children: [ { type: canvas, camera: { zoom: @config.scale }, projection: "isometric", showMinimap: true, tileClickEvent: PLACE_BUILDING, children: [
150
+ children: [ { type: canvas, fit: true, camera: { zoom: @config.scale }, projection: "isometric", showMinimap: true, tileClickEvent: PLACE_BUILDING, children: [
150
151
  { type: draw-sprite-layer, items: (array/map @config.tiles (fn t { type: draw-sprite, position: { x: (object/get @t x), y: (object/get @t y) }, asset: (object/get @t terrainSprite) })) }
151
152
  { type: draw-sprite-layer, items: (array/map @entity.features (fn f { type: draw-sprite, position: { x: (object/get @f x), y: (object/get @f y) }, asset: (object/get @f sprite) })) }
152
153
  { type: draw-shape-layer, items: (array/map @entity.validMoves (fn m { type: draw-shape, shape: "cell", position: { x: (object/get @m x), y: (object/get @m y) }, fill: "rgba(74,222,128,0.4)" })) }
@@ -159,10 +160,11 @@ orbital CityBuilderBoardOrbital {
159
160
  GAME_END -> gameover when (or (== @entity.result "won") (== @entity.result "lost"))
160
161
  (render-ui main {
161
162
  type: game-shell
163
+ overlay: { type: game-menu, title: (if (== @entity.result "won") "CITY COMPLETE!" "GAME OVER"), subtitle: (str/concat "Population: " @entity.population), options: [ { id: "again", label: "Play Again", event: "PLAY_AGAIN", variant: "primary" } ] }
162
164
  backgroundAsset: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.json", sprite: "grey_panel.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "panel-frame", thumbnailUrl: "" }
163
165
  hudBackgroundAsset: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.json", sprite: "grey_panel.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "panel-frame", thumbnailUrl: "" }
164
166
  hud: { type: stack, direction: horizontal, gap: md, justify: between, children: [ { type: game-hud, stats: [ { label: "Population", value: @entity.population, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.json", sprite: "icon_hand", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-population", thumbnailUrl: "" } }, { label: "Gold", value: @entity.gold, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.json", sprite: "icon_money", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-gold", thumbnailUrl: "" } }, { label: "Wood", value: @entity.wood, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.json", sprite: "wood046.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-wood", thumbnailUrl: "" } }, { label: "Build", value: @entity.pendingBuildType } ] }, { type: stat-badge, label: "Gold", value: @entity.gold, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.json", sprite: "icon_money", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-gold", thumbnailUrl: "" } }, { type: stat-badge, label: "Wood", value: @entity.wood, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.json", sprite: "wood046.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-wood", thumbnailUrl: "" } }, { type: control-grid, items: @config.buildTypes, action: SELECT_BUILD_TYPE, labelKey: "label", valueKey: "type", selected: @entity.pendingBuildType } ] }
165
- children: [ { type: canvas, camera: { zoom: @config.scale }, projection: "isometric", showMinimap: true, tileClickEvent: PLACE_BUILDING, children: [
167
+ children: [ { type: canvas, fit: true, camera: { zoom: @config.scale }, projection: "isometric", showMinimap: true, tileClickEvent: PLACE_BUILDING, children: [
166
168
  { type: draw-sprite-layer, items: (array/map @config.tiles (fn t { type: draw-sprite, position: { x: (object/get @t x), y: (object/get @t y) }, asset: (object/get @t terrainSprite) })) }
167
169
  { type: draw-sprite-layer, items: (array/map @entity.features (fn f { type: draw-sprite, position: { x: (object/get @f x), y: (object/get @f y) }, asset: (object/get @f sprite) })) }
168
170
  { type: draw-shape-layer, items: (array/map @entity.validMoves (fn m { type: draw-shape, shape: "cell", position: { x: (object/get @m x), y: (object/get @m y) }, fill: "rgba(74,222,128,0.4)" })) }
@@ -191,7 +193,7 @@ orbital CityBuilderBoardOrbital {
191
193
  backgroundAsset: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.json", sprite: "grey_panel.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "panel-frame", thumbnailUrl: "" }
192
194
  hudBackgroundAsset: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.json", sprite: "grey_panel.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "panel-frame", thumbnailUrl: "" }
193
195
  hud: { type: stack, direction: horizontal, gap: md, justify: between, children: [ { type: game-hud, stats: [ { label: "Population", value: @entity.population, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.json", sprite: "icon_hand", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-population", thumbnailUrl: "" } }, { label: "Gold", value: @entity.gold, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.json", sprite: "icon_money", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-gold", thumbnailUrl: "" } }, { label: "Wood", value: @entity.wood, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.json", sprite: "wood046.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-wood", thumbnailUrl: "" } }, { label: "Build", value: @entity.pendingBuildType } ] }, { type: stat-badge, label: "Gold", value: @entity.gold, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.json", sprite: "icon_money", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-gold", thumbnailUrl: "" } }, { type: stat-badge, label: "Wood", value: @entity.wood, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.json", sprite: "wood046.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-wood", thumbnailUrl: "" } }, { type: control-grid, items: @config.buildTypes, action: SELECT_BUILD_TYPE, labelKey: "label", valueKey: "type", selected: @entity.pendingBuildType } ] }
194
- children: [ { type: canvas, camera: { zoom: @config.scale }, projection: "isometric", showMinimap: true, tileClickEvent: PLACE_BUILDING, children: [
196
+ children: [ { type: canvas, fit: true, camera: { zoom: @config.scale }, projection: "isometric", showMinimap: true, tileClickEvent: PLACE_BUILDING, children: [
195
197
  { type: draw-sprite-layer, items: (array/map @config.tiles (fn t { type: draw-sprite, position: { x: (object/get @t x), y: (object/get @t y) }, asset: (object/get @t terrainSprite) })) }
196
198
  { type: draw-sprite-layer, items: (array/map @entity.features (fn f { type: draw-sprite, position: { x: (object/get @f x), y: (object/get @f y) }, asset: (object/get @f sprite) })) }
197
199
  { type: draw-shape-layer, items: (array/map @entity.validMoves (fn m { type: draw-shape, shape: "cell", position: { x: (object/get @m x), y: (object/get @m y) }, fill: "rgba(74,222,128,0.4)" })) }
@@ -211,7 +213,7 @@ orbital CityBuilderBoardOrbital {
211
213
  backgroundAsset: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.json", sprite: "grey_panel.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "panel-frame", thumbnailUrl: "" }
212
214
  hudBackgroundAsset: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.json", sprite: "grey_panel.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "panel-frame", thumbnailUrl: "" }
213
215
  hud: { type: stack, direction: horizontal, gap: md, justify: between, children: [ { type: game-hud, stats: [ { label: "Population", value: @entity.population, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.json", sprite: "icon_hand", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-population", thumbnailUrl: "" } }, { label: "Gold", value: @entity.gold, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.json", sprite: "icon_money", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-gold", thumbnailUrl: "" } }, { label: "Wood", value: @entity.wood, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.json", sprite: "wood046.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-wood", thumbnailUrl: "" } }, { label: "Build", value: @entity.pendingBuildType } ] }, { type: stat-badge, label: "Gold", value: @entity.gold, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.json", sprite: "icon_money", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-gold", thumbnailUrl: "" } }, { type: stat-badge, label: "Wood", value: @entity.wood, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.json", sprite: "wood046.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-wood", thumbnailUrl: "" } }, { type: control-grid, items: @config.buildTypes, action: SELECT_BUILD_TYPE, labelKey: "label", valueKey: "type", selected: @entity.pendingBuildType } ] }
214
- children: [ { type: canvas, camera: { zoom: @config.scale }, projection: "isometric", showMinimap: true, tileClickEvent: PLACE_BUILDING, children: [
216
+ children: [ { type: canvas, fit: true, camera: { zoom: @config.scale }, projection: "isometric", showMinimap: true, tileClickEvent: PLACE_BUILDING, children: [
215
217
  { type: draw-sprite-layer, items: (array/map @config.tiles (fn t { type: draw-sprite, position: { x: (object/get @t x), y: (object/get @t y) }, asset: (object/get @t terrainSprite) })) }
216
218
  { type: draw-sprite-layer, items: (array/map @entity.features (fn f { type: draw-sprite, position: { x: (object/get @f x), y: (object/get @f y) }, asset: (object/get @f sprite) })) }
217
219
  { type: draw-shape-layer, items: (array/map @entity.validMoves (fn m { type: draw-shape, shape: "cell", position: { x: (object/get @m x), y: (object/get @m y) }, fill: "rgba(74,222,128,0.4)" })) }
@@ -232,7 +234,7 @@ orbital CityBuilderBoardOrbital {
232
234
  backgroundAsset: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.json", sprite: "grey_panel.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "panel-frame", thumbnailUrl: "" }
233
235
  hudBackgroundAsset: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.json", sprite: "grey_panel.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "panel-frame", thumbnailUrl: "" }
234
236
  hud: { type: stack, direction: horizontal, gap: md, justify: between, children: [ { type: game-hud, stats: [ { label: "Population", value: @entity.population, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.json", sprite: "icon_hand", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-population", thumbnailUrl: "" } }, { label: "Gold", value: @entity.gold, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.json", sprite: "icon_money", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-gold", thumbnailUrl: "" } }, { label: "Wood", value: @entity.wood, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.json", sprite: "wood046.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-wood", thumbnailUrl: "" } }, { label: "Build", value: @entity.pendingBuildType } ] }, { type: stat-badge, label: "Gold", value: @entity.gold, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.json", sprite: "icon_money", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-gold", thumbnailUrl: "" } }, { type: stat-badge, label: "Wood", value: @entity.wood, iconUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-city-builder-board/kenney-isometric-vector-buildings/features/spritesheet_wood.json", sprite: "wood046.png", role: "ui", category: "ui", animations: [], style: "vector", variant: "", dimension: "2d", aspect: "1:1", name: "icon-wood", thumbnailUrl: "" } }, { type: control-grid, items: @config.buildTypes, action: SELECT_BUILD_TYPE, labelKey: "label", valueKey: "type", selected: @entity.pendingBuildType } ] }
235
- children: [ { type: canvas, camera: { zoom: @config.scale }, projection: "isometric", showMinimap: true, tileClickEvent: PLACE_BUILDING, children: [
237
+ children: [ { type: canvas, fit: true, camera: { zoom: @config.scale }, projection: "isometric", showMinimap: true, tileClickEvent: PLACE_BUILDING, children: [
236
238
  { type: draw-sprite-layer, items: (array/map @config.tiles (fn t { type: draw-sprite, position: { x: (object/get @t x), y: (object/get @t y) }, asset: (object/get @t terrainSprite) })) }
237
239
  { type: draw-sprite-layer, items: (array/map @entity.features (fn f { type: draw-sprite, position: { x: (object/get @f x), y: (object/get @f y) }, asset: (object/get @f sprite) })) }
238
240
  { type: draw-shape-layer, items: (array/map @entity.validMoves (fn m { type: draw-shape, shape: "cell", position: { x: (object/get @m x), y: (object/get @m y) }, fill: "rgba(74,222,128,0.4)" })) }
@@ -53,7 +53,7 @@ orbital GridTacticsDemoOrbital {
53
53
  type: game-shell
54
54
  hud: { type: game-hud, stats: [ { label: "Result", value: @entity.result }, { label: "Phase", value: @entity.uiPhase }, { label: "Selected", value: @entity.selectedUnitId } ] }
55
55
  addons: { type: stack, direction: vertical, gap: sm, children: [ { type: button, action: END_TURN, label: "End Turn", variant: primary }, { type: button, action: CANCEL, label: "Cancel", variant: secondary } ] }
56
- children: [ { type: canvas, projection: "flat", showMinimap: false, tileClickEvent: TILE_CLICK, unitClickEvent: UNIT_CLICK, children: [
56
+ children: [ { type: canvas, fit: true, projection: "flat", showMinimap: false, tileClickEvent: TILE_CLICK, unitClickEvent: UNIT_CLICK, children: [
57
57
  { type: draw-shape-layer, items: (array/map @entity.tiles (fn t { type: draw-shape, shape: "cell", position: { x: (object/get @t x), y: (object/get @t y) }, fill: (if (== (object/get @t passable) true) "rgba(148,163,184,0.15)" "rgba(51,65,85,0.75)") })) }
58
58
  { type: draw-shape-layer, items: (array/map @entity.validMoves (fn m { type: draw-shape, shape: "cell", position: { x: (object/get @m x), y: (object/get @m z) }, fill: "rgba(74,222,128,0.4)" })) }
59
59
  { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (object/get @u id) @entity.selectedUnitId))) (fn u { type: draw-shape, shape: "ellipse", position: (object/get @u position), radiusX: 0.5, radiusY: 0.2, stroke: "rgba(0,200,255,0.8)", strokeWidth: 3 })) }
@@ -101,7 +101,7 @@ orbital GridTacticsDemoOrbital {
101
101
  type: game-shell
102
102
  hud: { type: game-hud, stats: [ { label: "Result", value: @entity.result }, { label: "Phase", value: @entity.uiPhase }, { label: "Selected", value: @entity.selectedUnitId } ] }
103
103
  addons: { type: stack, direction: vertical, gap: sm, children: [ { type: button, action: END_TURN, label: "End Turn", variant: primary }, { type: button, action: CANCEL, label: "Cancel", variant: secondary } ] }
104
- children: [ { type: canvas, projection: "flat", showMinimap: false, tileClickEvent: TILE_CLICK, unitClickEvent: UNIT_CLICK, children: [
104
+ children: [ { type: canvas, fit: true, projection: "flat", showMinimap: false, tileClickEvent: TILE_CLICK, unitClickEvent: UNIT_CLICK, children: [
105
105
  { type: draw-shape-layer, items: (array/map @entity.tiles (fn t { type: draw-shape, shape: "cell", position: { x: (object/get @t x), y: (object/get @t y) }, fill: (if (== (object/get @t passable) true) "rgba(148,163,184,0.15)" "rgba(51,65,85,0.75)") })) }
106
106
  { type: draw-shape-layer, items: (array/map @entity.validMoves (fn m { type: draw-shape, shape: "cell", position: { x: (object/get @m x), y: (object/get @m z) }, fill: "rgba(74,222,128,0.4)" })) }
107
107
  { type: draw-shape-layer, items: (array/map (array/filter @entity.units (fn u (== (object/get @u id) @entity.selectedUnitId))) (fn u { type: draw-shape, shape: "ellipse", position: (object/get @u position), radiusX: 0.5, radiusY: 0.2, stroke: "rgba(0,200,255,0.8)", strokeWidth: 3 })) }
@@ -1,6 +1,148 @@
1
1
  app ui-hex-strategy-board "1.0.0"
2
- "Fantasy hex-tile grid-tactics combat board: thin organism composing the std-tactics-board-2d frame with fantasy unit/terrain assets supplied via config."
2
+ "Fantasy hex-tile grid-tactics combat board: thin organism composing the std-tactics-board-2d frame with fantasy unit/terrain assets supplied via config. Hand-authored hex svg theme supplied via config."
3
3
  ;; @capabilities "hex-tile grid-tactics combat, fantasy unit movement, terrain-based strategy, turn-based battles"
4
+
5
+ ;; ============================================================================
6
+ ;; PERSONA + USER STORIES
7
+ ;;
8
+ ;; Read these before changing anything here, and walk them end to end after.
9
+ ;; One persona: the PLAYER, commanding a three-unit warband on a 6x6 hex-tile
10
+ ;; field ringed by an impassable stone wall, against two enemies holding the
11
+ ;; north. Status re-verified 2026-07-30 by a scripted full playthrough
12
+ ;; (38/38 checks) driving the real game on the runtime-verify catalog through
13
+ ;; window.__orbitalVerification — events in, canvas drawables + HUD DOM + bus
14
+ ;; event log out — plus 11/11 play_transition guard probes. The svg assets
15
+ ;; are not on the CDN yet this wave (404 → fallback squares on canvas, by
16
+ ;; design); every drawable descriptor was asserted to point at the right
17
+ ;; /shared/ui-hex-strategy-board/svg/hex/ URL.
18
+ ;;
19
+ ;; THE GENRE (what a hex-tactics player expects): a small warband on a tight
20
+ ;; hex field where terrain frames every decision. Positioning is the game —
21
+ ;; the stone ring funnels movement through the open inner cells, the crystal
22
+ ;; resource and the outpost tower mark the landmarks you fight around, and
23
+ ;; every End Turn hands the field to the enemy, which closes in and punishes
24
+ ;; exposed units. Kills are the economy: each one scores 10. You win by
25
+ ;; wiping the enemy; you lose by being wiped. A round looks like: select a
26
+ ;; unit -> green reach cells (range 2) -> move -> the unit STAYS selected and
27
+ ;; auto-arms (red cells = enemies in reach) -> strike for 3 -> the unit is
28
+ ;; SPENT (dims, cannot act again this turn) -> activate the next unit ->
29
+ ;; End Turn -> every living enemy strikes an adjacent player for 1 or steps
30
+ ;; 1 cell toward the nearest player -> repeat. Each unit may move ONCE and
31
+ ;; attack ONCE per turn (movedIds/actedIds track the activation; End Turn
32
+ ;; resets both).
33
+ ;; ============================================================================
34
+ ;;
35
+ ;; PLAYER — "I command my warband and wipe the enemy before they wipe me."
36
+ ;;
37
+ ;; 1. I open the board and see the whole field framed on screen — a hex
38
+ ;; tile under every cell, the stone wall ringing the field, my warband
39
+ ;; in the south, the enemy in the north, and the HUD showing
40
+ ;; Result/Phase/Turn/Score.
41
+ ;; WORKS. Boot paints 36 hex-cell descriptors (stone ring impassable,
42
+ ;; grass/dirt/sand inner), 5 units (3v2), resource + outpost features
43
+ ;; (ground-anchored 1x1), minimap on; HUD reads
44
+ ;; "none / observation / 0 / 0".
45
+ ;; 2. Every unit on the board is a readable character sprite with a name
46
+ ;; label and a health bar I can read at a glance — and each unit TYPE
47
+ ;; looks distinct (guardian / archer / worker).
48
+ ;; WORKS. Each unit paints its svg idle frame (4-frame breathing,
49
+ ;; cycled by the AnimClock tick — all 5 verified cycling idle-N)
50
+ ;; anchored "ground", with the black backing + green health fraction
51
+ ;; above (all full at boot) and the name label (5 labels). The three
52
+ ;; types are distinct shape/color silhouettes (guardian red squircle /
53
+ ;; archer orange square / worker purple rhombus — ranger was renamed
54
+ ;; to archer this wave because the generator's name-hash gave ranger
55
+ ;; guardian's exact silhouette).
56
+ ;; 3. I click one of MY units and the cells it can reach light up.
57
+ ;; WORKS. Clicking u1 sets phase "selection" and lights exactly 7
58
+ ;; green cells — the range-2 manhattan diamond (13) minus self, two
59
+ ;; enemies, one friendly unit, and two stone-wall cells. Clicking an
60
+ ;; out-of-reach enemy keeps the selection (guard denies, phase stays
61
+ ;; "selection"). Dead units are not selectable (health > 0 guard);
62
+ ;; SPENT units (in actedIds) are not selectable either; a unit that
63
+ ;; already MOVED this turn still selects but lights zero green cells.
64
+ ;; 4. I click a lit cell and the unit moves there — and stays selected,
65
+ ;; auto-armed, so I can strike immediately.
66
+ ;; WORKS. u1 walked (3,2)->(4,2): the walk animation plays, the
67
+ ;; authority re-validates bounds/passable/occupied and writes the
68
+ ;; position, and the unit lands in phase "action" with the enemy now
69
+ ;; in reach lit red. The move is SPENT: a second TILE_CLICK is denied
70
+ ;; outright (unit held its cell), and re-selecting lights zero green
71
+ ;; cells — one move per turn (movedIds guard).
72
+ ;; 5. Adjacent enemies I can strike light up red — right after my move,
73
+ ;; or when I click my selected unit again.
74
+ ;; WORKS. Post-move auto-arm computes red cells from the NEW position
75
+ ;; (verified: phase "action" + 1 red target after stepping adjacent);
76
+ ;; the manual re-click arm (phase "action") works from a fresh
77
+ ;; selection. Living enemies at manhattan distance <= attackRange
78
+ ;; (config, default 1) light red.
79
+ ;; 6. I click a red-lit enemy — or any enemy in reach, even without arming
80
+ ;; first — and it takes a hit; my unit is then spent for the turn.
81
+ ;; WORKS. The attack arm fires whenever a living selected unit has a
82
+ ;; living enemy in reach, regardless of phase — verified by direct
83
+ ;; enemy click: e1's health bar 1.00 -> 0.63 of max (3 of 8). The
84
+ ;; attacker plays its attack frame, the target plays its hit frame, a
85
+ ;; "-3" damage number + hit-star fx sprite spawn at the target (BURST,
86
+ ;; ttl 3 decayed by FxDecay), and the attacker joins actedIds: it dims
87
+ ;; to 45% opacity and cannot be selected or attack again until End
88
+ ;; Turn (re-click verified a no-op).
89
+ ;; 7. I change my mind mid-selection and back out cleanly.
90
+ ;; WORKS. CANCEL clears selection, highlights, and phase — verified
91
+ ;; green cells 7 -> 0 and phase back to "observation".
92
+ ;; 8. I end my turn and the enemy takes theirs — they close in and fight
93
+ ;; back, and my warband is fresh again.
94
+ ;; WORKS. END_TURN bumps Turn, clears selection + both activation
95
+ ;; lists (movedIds/actedIds), and emits AI_TURN; the authority strikes
96
+ ;; every player adjacent to a living enemy for 1 and steps each
97
+ ;; unengaged enemy 1 cell toward the nearest living player. Verified:
98
+ ;; turn 0 -> 1, player hp dropped 10,8,12 -> 9,7,12 the first turn,
99
+ ;; and a spent unit is selectable again after End Turn.
100
+ ;; LIMITATION (inherited from the frame): enemies POP to their new
101
+ ;; cell — the single walk-anim slot is player-facing; per-enemy MOVE
102
+ ;; fan-out is atom surgery, deferred upstream.
103
+ ;; 9. When I kill an enemy I am rewarded — score ticks up and the corpse
104
+ ;; stays on the field.
105
+ ;; WORKS x2. Each kill: Score +10 (ScoreKeeper on UNITS_CHANGED —
106
+ ;; verified 10 then 20), the corpse renders its death frame, and the
107
+ ;; cell becomes walkable again — corpses never block movement or green
108
+ ;; highlights (authority and highlight filters agree on health > 0).
109
+ ;; 10. When the last enemy falls, I win and the game tells me — then the
110
+ ;; board freezes.
111
+ ;; WORKS. Result flips to "victory" (RoundLogic on UNITS_CHANGED),
112
+ ;; GAME_END fires, and the board is FROZEN: every UNIT_CLICK /
113
+ ;; TILE_CLICK arm is guarded on result == "none", so post-game clicks
114
+ ;; select nothing and move nothing (verified by probe). Reload to
115
+ ;; play again — an in-game rematch button does not exist yet.
116
+ ;;
117
+ ;; MULTIPLAYER NOTE: GameState is [runtime, shared], so every connected
118
+ ;; client watches the same battle on the same frame; intents serialize
119
+ ;; through the server authority. There is no per-seat turn ownership yet —
120
+ ;; any client can drive any player unit.
121
+ ;;
122
+ ;; ASSET INVENTORY (hand-authored svg, almadar-kflow-assets.web.app
123
+ ;; /shared/ui-hex-strategy-board/svg/hex/, generated by tools/asset-workflow
124
+ ;; svg-generator from the sibling .md descriptions)
125
+ ;;
126
+ ;; Terrain terrain/{grass,dirt,sand,stone}.svg — full-cell pointy-top hex
127
+ ;; tiles (outer hex + inner facets) drawn at width/height 1;
128
+ ;; stone is the impassable border ring.
129
+ ;; Units units/{guardian,archer,worker}.svg + animation frames
130
+ ;; .{idle-0..3, walk-0..1, attack-0, hit-0, death-0}.svg; the
131
+ ;; frame swaps url-rewrites name.svg -> name.<anim>-<i>.svg and a
132
+ ;; hidden warm-up layer preloads every frame so swaps never pop.
133
+ ;; party: u1 Miner worker 10hp (3,2)
134
+ ;; u2 Thornbow archer 8hp (2,3)
135
+ ;; u3 Ironwall guardian 12hp (2,4)
136
+ ;; enemy: e1 Foe archer 8hp (4,1)
137
+ ;; e2 Foe guardian 10hp (3,1)
138
+ ;; Features features/resource.svg at (1,1) (crystal cluster),
139
+ ;; features/outpost.svg at (1,3) (tower) — drawn from
140
+ ;; config.features anchored "ground" at 1x1 so they sit ON their
141
+ ;; cell.
142
+ ;; Effects effects/hit.svg (BURST "hit" fx).
143
+ ;; UI chrome ui/panel-frame.svg = game-shell background + HUD panel.
144
+ ;; ============================================================================
145
+
4
146
  orbital HexStrategyBoardOrbital {
5
147
  uses Frame from "std/behaviors/std-tactics-board-2d"
6
148
  uses Score from "std/behaviors/std-score"
@@ -69,13 +211,15 @@ orbital HexStrategyBoardOrbital {
69
211
 
70
212
  entity GameState [runtime, shared] {
71
213
  id : string!
72
- units : [Unit] = [ { id: "u1", position: { x: 3, y: 2 }, x: 3, y: 2, z: 0, team: "player", health: 10, maxHealth: 10, unitType: "worker", name: "Miner", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-base-pack/units/aliens.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-base-pack/units/aliens.json", sprite: "alienBeige.png", role: "npc", category: "worker", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "worker", thumbnailUrl: "" } }, { id: "u2", position: { x: 2, y: 3 }, x: 2, y: 3, z: 0, team: "player", health: 8, maxHealth: 10, unitType: "ranger", name: "Thornbow", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-base-pack/units/aliens.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-base-pack/units/aliens.json", sprite: "alienGreen.png", role: "npc", category: "ranger", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "ranger", thumbnailUrl: "" } }, { id: "u3", position: { x: 2, y: 4 }, x: 2, y: 4, z: 0, team: "player", health: 12, maxHealth: 12, unitType: "guardian", name: "Ironwall", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-base-pack/units/aliens.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-base-pack/units/aliens.json", sprite: "alienYellow.png", role: "npc", category: "guardian", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "guardian", thumbnailUrl: "" } }, { id: "e1", position: { x: 4, y: 1 }, x: 4, y: 1, z: 0, team: "enemy", health: 8, maxHealth: 8, unitType: "ranger", name: "Foe", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-base-pack/units/aliens.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-base-pack/units/aliens.json", sprite: "alienGreen.png", role: "npc", category: "ranger", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "ranger", thumbnailUrl: "" } }, { id: "e2", position: { x: 3, y: 1 }, x: 3, y: 1, z: 0, team: "enemy", health: 10, maxHealth: 10, unitType: "guardian", name: "Foe", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-base-pack/units/aliens.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-base-pack/units/aliens.json", sprite: "alienYellow.png", role: "npc", category: "guardian", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "guardian", thumbnailUrl: "" } } ]
214
+ units : [Unit] = [ { id: "u1", position: { x: 3, y: 2 }, x: 3, y: 2, z: 0, team: "player", health: 10, maxHealth: 10, unitType: "worker", name: "Miner", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/svg/hex/units/worker.svg", role: "npc", category: "worker", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "worker", thumbnailUrl: "" } }, { id: "u2", position: { x: 2, y: 3 }, x: 2, y: 3, z: 0, team: "player", health: 8, maxHealth: 8, unitType: "archer", name: "Thornbow", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/svg/hex/units/archer.svg", role: "npc", category: "archer", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "archer", thumbnailUrl: "" } }, { id: "u3", position: { x: 2, y: 4 }, x: 2, y: 4, z: 0, team: "player", health: 12, maxHealth: 12, unitType: "guardian", name: "Ironwall", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/svg/hex/units/guardian.svg", role: "npc", category: "guardian", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "guardian", thumbnailUrl: "" } }, { id: "e1", position: { x: 4, y: 1 }, x: 4, y: 1, z: 0, team: "enemy", health: 8, maxHealth: 8, unitType: "archer", name: "Foe", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/svg/hex/units/archer.svg", role: "npc", category: "archer", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "archer", thumbnailUrl: "" } }, { id: "e2", position: { x: 3, y: 1 }, x: 3, y: 1, z: 0, team: "enemy", health: 10, maxHealth: 10, unitType: "guardian", name: "Foe", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/svg/hex/units/guardian.svg", role: "npc", category: "guardian", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "guardian", thumbnailUrl: "" } } ]
73
215
  fx : [Fx] = []
74
- tiles : [Tile] = [ { id: "t-0-0", x: 0, y: 0, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-1-0", x: 1, y: 0, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-2-0", x: 2, y: 0, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-3-0", x: 3, y: 0, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-4-0", x: 4, y: 0, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-5-0", x: 5, y: 0, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-0-1", x: 0, y: 1, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-1-1", x: 1, y: 1, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "grass_01.png", role: "tile", category: "grass", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-2-1", x: 2, y: 1, terrain: "dirt", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "dirt_01.png", role: "tile", category: "dirt", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "dirt", thumbnailUrl: "" } }, { id: "t-3-1", x: 3, y: 1, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "grass_01.png", role: "tile", category: "grass", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-4-1", x: 4, y: 1, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "grass_01.png", role: "tile", category: "grass", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-5-1", x: 5, y: 1, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-0-2", x: 0, y: 2, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-1-2", x: 1, y: 2, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "grass_01.png", role: "tile", category: "grass", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-2-2", x: 2, y: 2, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "grass_01.png", role: "tile", category: "grass", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-3-2", x: 3, y: 2, terrain: "dirt", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "dirt_01.png", role: "tile", category: "dirt", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "dirt", thumbnailUrl: "" } }, { id: "t-4-2", x: 4, y: 2, terrain: "sand", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "sand_01.png", role: "tile", category: "sand", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "sand", thumbnailUrl: "" } }, { id: "t-5-2", x: 5, y: 2, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-0-3", x: 0, y: 3, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-1-3", x: 1, y: 3, terrain: "dirt", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "dirt_01.png", role: "tile", category: "dirt", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "dirt", thumbnailUrl: "" } }, { id: "t-2-3", x: 2, y: 3, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "grass_01.png", role: "tile", category: "grass", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-3-3", x: 3, y: 3, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "grass_01.png", role: "tile", category: "grass", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-4-3", x: 4, y: 3, terrain: "sand", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "sand_01.png", role: "tile", category: "sand", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "sand", thumbnailUrl: "" } }, { id: "t-5-3", x: 5, y: 3, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-0-4", x: 0, y: 4, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-1-4", x: 1, y: 4, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "grass_01.png", role: "tile", category: "grass", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-2-4", x: 2, y: 4, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "grass_01.png", role: "tile", category: "grass", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-3-4", x: 3, y: 4, terrain: "sand", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "sand_01.png", role: "tile", category: "sand", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "sand", thumbnailUrl: "" } }, { id: "t-4-4", x: 4, y: 4, terrain: "sand", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "sand_01.png", role: "tile", category: "sand", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "sand", thumbnailUrl: "" } }, { id: "t-5-4", x: 5, y: 4, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-0-5", x: 0, y: 5, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-1-5", x: 1, y: 5, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-2-5", x: 2, y: 5, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-3-5", x: 3, y: 5, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-4-5", x: 4, y: 5, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-5-5", x: 5, y: 5, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } } ]
216
+ tiles : [Tile] = [ { id: "t-0-0", x: 0, y: 0, terrain: "stone", passable: false }, { id: "t-1-0", x: 1, y: 0, terrain: "stone", passable: false }, { id: "t-2-0", x: 2, y: 0, terrain: "stone", passable: false }, { id: "t-3-0", x: 3, y: 0, terrain: "stone", passable: false }, { id: "t-4-0", x: 4, y: 0, terrain: "stone", passable: false }, { id: "t-5-0", x: 5, y: 0, terrain: "stone", passable: false }, { id: "t-0-1", x: 0, y: 1, terrain: "stone", passable: false }, { id: "t-1-1", x: 1, y: 1, terrain: "grass", passable: true }, { id: "t-2-1", x: 2, y: 1, terrain: "dirt", passable: true }, { id: "t-3-1", x: 3, y: 1, terrain: "grass", passable: true }, { id: "t-4-1", x: 4, y: 1, terrain: "grass", passable: true }, { id: "t-5-1", x: 5, y: 1, terrain: "stone", passable: false }, { id: "t-0-2", x: 0, y: 2, terrain: "stone", passable: false }, { id: "t-1-2", x: 1, y: 2, terrain: "grass", passable: true }, { id: "t-2-2", x: 2, y: 2, terrain: "grass", passable: true }, { id: "t-3-2", x: 3, y: 2, terrain: "dirt", passable: true }, { id: "t-4-2", x: 4, y: 2, terrain: "sand", passable: true }, { id: "t-5-2", x: 5, y: 2, terrain: "stone", passable: false }, { id: "t-0-3", x: 0, y: 3, terrain: "stone", passable: false }, { id: "t-1-3", x: 1, y: 3, terrain: "dirt", passable: true }, { id: "t-2-3", x: 2, y: 3, terrain: "grass", passable: true }, { id: "t-3-3", x: 3, y: 3, terrain: "grass", passable: true }, { id: "t-4-3", x: 4, y: 3, terrain: "sand", passable: true }, { id: "t-5-3", x: 5, y: 3, terrain: "stone", passable: false }, { id: "t-0-4", x: 0, y: 4, terrain: "stone", passable: false }, { id: "t-1-4", x: 1, y: 4, terrain: "grass", passable: true }, { id: "t-2-4", x: 2, y: 4, terrain: "grass", passable: true }, { id: "t-3-4", x: 3, y: 4, terrain: "sand", passable: true }, { id: "t-4-4", x: 4, y: 4, terrain: "sand", passable: true }, { id: "t-5-4", x: 5, y: 4, terrain: "stone", passable: false }, { id: "t-0-5", x: 0, y: 5, terrain: "stone", passable: false }, { id: "t-1-5", x: 1, y: 5, terrain: "stone", passable: false }, { id: "t-2-5", x: 2, y: 5, terrain: "stone", passable: false }, { id: "t-3-5", x: 3, y: 5, terrain: "stone", passable: false }, { id: "t-4-5", x: 4, y: 5, terrain: "stone", passable: false }, { id: "t-5-5", x: 5, y: 5, terrain: "stone", passable: false } ]
75
217
  result : string = "none"
76
218
  selectedUnitId : string = ""
77
219
  validMoves : [ValidMove] = []
78
220
  attackTargets : [ValidMove] = []
221
+ movedIds : [string] = []
222
+ actedIds : [string] = []
79
223
  uiPhase : string = "observation"
80
224
  turn : number = 0
81
225
  score : number = 0
@@ -88,8 +232,8 @@ orbital HexStrategyBoardOrbital {
88
232
  gridWidth: 6
89
233
  gridHeight: 6
90
234
  attackDamage: 3
91
- units: [ { id: "u1", position: { x: 3, y: 2 }, x: 3, y: 2, z: 0, team: "player", health: 10, maxHealth: 10, unitType: "worker", name: "Miner", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-base-pack/units/aliens.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-base-pack/units/aliens.json", sprite: "alienBeige.png", role: "npc", category: "worker", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "worker", thumbnailUrl: "" } }, { id: "u2", position: { x: 2, y: 3 }, x: 2, y: 3, z: 0, team: "player", health: 8, maxHealth: 10, unitType: "ranger", name: "Thornbow", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-base-pack/units/aliens.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-base-pack/units/aliens.json", sprite: "alienGreen.png", role: "npc", category: "ranger", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "ranger", thumbnailUrl: "" } }, { id: "u3", position: { x: 2, y: 4 }, x: 2, y: 4, z: 0, team: "player", health: 12, maxHealth: 12, unitType: "guardian", name: "Ironwall", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-base-pack/units/aliens.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-base-pack/units/aliens.json", sprite: "alienYellow.png", role: "npc", category: "guardian", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "guardian", thumbnailUrl: "" } }, { id: "e1", position: { x: 4, y: 1 }, x: 4, y: 1, z: 0, team: "enemy", health: 8, maxHealth: 8, unitType: "ranger", name: "Foe", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-base-pack/units/aliens.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-base-pack/units/aliens.json", sprite: "alienGreen.png", role: "npc", category: "ranger", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "ranger", thumbnailUrl: "" } }, { id: "e2", position: { x: 3, y: 1 }, x: 3, y: 1, z: 0, team: "enemy", health: 10, maxHealth: 10, unitType: "guardian", name: "Foe", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-base-pack/units/aliens.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-base-pack/units/aliens.json", sprite: "alienYellow.png", role: "npc", category: "guardian", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "guardian", thumbnailUrl: "" } } ]
92
- tiles: [ { id: "t-0-0", x: 0, y: 0, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-1-0", x: 1, y: 0, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-2-0", x: 2, y: 0, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-3-0", x: 3, y: 0, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-4-0", x: 4, y: 0, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-5-0", x: 5, y: 0, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-0-1", x: 0, y: 1, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-1-1", x: 1, y: 1, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "grass_01.png", role: "tile", category: "grass", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-2-1", x: 2, y: 1, terrain: "dirt", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "dirt_01.png", role: "tile", category: "dirt", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "dirt", thumbnailUrl: "" } }, { id: "t-3-1", x: 3, y: 1, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "grass_01.png", role: "tile", category: "grass", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-4-1", x: 4, y: 1, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "grass_01.png", role: "tile", category: "grass", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-5-1", x: 5, y: 1, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-0-2", x: 0, y: 2, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-1-2", x: 1, y: 2, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "grass_01.png", role: "tile", category: "grass", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-2-2", x: 2, y: 2, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "grass_01.png", role: "tile", category: "grass", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-3-2", x: 3, y: 2, terrain: "dirt", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "dirt_01.png", role: "tile", category: "dirt", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "dirt", thumbnailUrl: "" } }, { id: "t-4-2", x: 4, y: 2, terrain: "sand", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "sand_01.png", role: "tile", category: "sand", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "sand", thumbnailUrl: "" } }, { id: "t-5-2", x: 5, y: 2, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-0-3", x: 0, y: 3, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-1-3", x: 1, y: 3, terrain: "dirt", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "dirt_01.png", role: "tile", category: "dirt", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "dirt", thumbnailUrl: "" } }, { id: "t-2-3", x: 2, y: 3, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "grass_01.png", role: "tile", category: "grass", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-3-3", x: 3, y: 3, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "grass_01.png", role: "tile", category: "grass", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-4-3", x: 4, y: 3, terrain: "sand", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "sand_01.png", role: "tile", category: "sand", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "sand", thumbnailUrl: "" } }, { id: "t-5-3", x: 5, y: 3, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-0-4", x: 0, y: 4, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-1-4", x: 1, y: 4, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "grass_01.png", role: "tile", category: "grass", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-2-4", x: 2, y: 4, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "grass_01.png", role: "tile", category: "grass", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-3-4", x: 3, y: 4, terrain: "sand", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "sand_01.png", role: "tile", category: "sand", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "sand", thumbnailUrl: "" } }, { id: "t-4-4", x: 4, y: 4, terrain: "sand", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "sand_01.png", role: "tile", category: "sand", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "sand", thumbnailUrl: "" } }, { id: "t-5-4", x: 5, y: 4, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-0-5", x: 0, y: 5, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-1-5", x: 1, y: 5, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-2-5", x: 2, y: 5, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-3-5", x: 3, y: 5, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-4-5", x: 4, y: 5, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } }, { id: "t-5-5", x: 5, y: 5, terrain: "stone", passable: false, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" } } ]
235
+ units: [ { id: "u1", position: { x: 3, y: 2 }, x: 3, y: 2, z: 0, team: "player", health: 10, maxHealth: 10, unitType: "worker", name: "Miner", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/svg/hex/units/worker.svg", role: "npc", category: "worker", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "worker", thumbnailUrl: "" } }, { id: "u2", position: { x: 2, y: 3 }, x: 2, y: 3, z: 0, team: "player", health: 8, maxHealth: 8, unitType: "archer", name: "Thornbow", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/svg/hex/units/archer.svg", role: "npc", category: "archer", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "archer", thumbnailUrl: "" } }, { id: "u3", position: { x: 2, y: 4 }, x: 2, y: 4, z: 0, team: "player", health: 12, maxHealth: 12, unitType: "guardian", name: "Ironwall", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/svg/hex/units/guardian.svg", role: "npc", category: "guardian", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "guardian", thumbnailUrl: "" } }, { id: "e1", position: { x: 4, y: 1 }, x: 4, y: 1, z: 0, team: "enemy", health: 8, maxHealth: 8, unitType: "archer", name: "Foe", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/svg/hex/units/archer.svg", role: "npc", category: "archer", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "archer", thumbnailUrl: "" } }, { id: "e2", position: { x: 3, y: 1 }, x: 3, y: 1, z: 0, team: "enemy", health: 10, maxHealth: 10, unitType: "guardian", name: "Foe", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/svg/hex/units/guardian.svg", role: "npc", category: "guardian", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "guardian", thumbnailUrl: "" } } ]
236
+ tiles: [ { id: "t-0-0", x: 0, y: 0, terrain: "stone", passable: false }, { id: "t-1-0", x: 1, y: 0, terrain: "stone", passable: false }, { id: "t-2-0", x: 2, y: 0, terrain: "stone", passable: false }, { id: "t-3-0", x: 3, y: 0, terrain: "stone", passable: false }, { id: "t-4-0", x: 4, y: 0, terrain: "stone", passable: false }, { id: "t-5-0", x: 5, y: 0, terrain: "stone", passable: false }, { id: "t-0-1", x: 0, y: 1, terrain: "stone", passable: false }, { id: "t-1-1", x: 1, y: 1, terrain: "grass", passable: true }, { id: "t-2-1", x: 2, y: 1, terrain: "dirt", passable: true }, { id: "t-3-1", x: 3, y: 1, terrain: "grass", passable: true }, { id: "t-4-1", x: 4, y: 1, terrain: "grass", passable: true }, { id: "t-5-1", x: 5, y: 1, terrain: "stone", passable: false }, { id: "t-0-2", x: 0, y: 2, terrain: "stone", passable: false }, { id: "t-1-2", x: 1, y: 2, terrain: "grass", passable: true }, { id: "t-2-2", x: 2, y: 2, terrain: "grass", passable: true }, { id: "t-3-2", x: 3, y: 2, terrain: "dirt", passable: true }, { id: "t-4-2", x: 4, y: 2, terrain: "sand", passable: true }, { id: "t-5-2", x: 5, y: 2, terrain: "stone", passable: false }, { id: "t-0-3", x: 0, y: 3, terrain: "stone", passable: false }, { id: "t-1-3", x: 1, y: 3, terrain: "dirt", passable: true }, { id: "t-2-3", x: 2, y: 3, terrain: "grass", passable: true }, { id: "t-3-3", x: 3, y: 3, terrain: "grass", passable: true }, { id: "t-4-3", x: 4, y: 3, terrain: "sand", passable: true }, { id: "t-5-3", x: 5, y: 3, terrain: "stone", passable: false }, { id: "t-0-4", x: 0, y: 4, terrain: "stone", passable: false }, { id: "t-1-4", x: 1, y: 4, terrain: "grass", passable: true }, { id: "t-2-4", x: 2, y: 4, terrain: "grass", passable: true }, { id: "t-3-4", x: 3, y: 4, terrain: "sand", passable: true }, { id: "t-4-4", x: 4, y: 4, terrain: "sand", passable: true }, { id: "t-5-4", x: 5, y: 4, terrain: "stone", passable: false }, { id: "t-0-5", x: 0, y: 5, terrain: "stone", passable: false }, { id: "t-1-5", x: 1, y: 5, terrain: "stone", passable: false }, { id: "t-2-5", x: 2, y: 5, terrain: "stone", passable: false }, { id: "t-3-5", x: 3, y: 5, terrain: "stone", passable: false }, { id: "t-4-5", x: 4, y: 5, terrain: "stone", passable: false }, { id: "t-5-5", x: 5, y: 5, terrain: "stone", passable: false } ]
93
237
  }
94
238
  }
95
239
 
@@ -105,6 +249,10 @@ orbital HexStrategyBoardOrbital {
105
249
  config { running: true, pointsPerKill: 10, startScore: 0, initialEnemies: 2 }
106
250
  }
107
251
 
252
+ trait AnimClock = Frame.traits.AnimClock -> GameState {
253
+ config { frames: [] }
254
+ }
255
+
108
256
  trait Player = Frame.traits.PlayerIntent -> GameState {
109
257
  config {
110
258
  gridWidth: 6
@@ -113,12 +261,12 @@ orbital HexStrategyBoardOrbital {
113
261
  projection: "hex"
114
262
  showMinimap: true
115
263
  scale: 0.45
116
- backgroundAsset: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.json", sprite: "grey_panel.png", role: "ui", category: "ui", animations: [], style: "fantasy-border", dimension: "2d", aspect: "1:1", name: "panel-frame", thumbnailUrl: "" }
117
- hudBackgroundAsset: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-ui-pack/ui/greySheet.json", sprite: "grey_panel.png", role: "ui", category: "ui", animations: [], style: "fantasy-border", dimension: "2d", aspect: "1:1", name: "panel-frame", thumbnailUrl: "" }
118
- features: [ { id: "f1", x: 3, y: 1, z: 0, type: "resource", assetUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/features/hexagonObjects_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/features/hexagonObjects_sheet.json", sprite: "crystals1.png", role: "decoration", category: "resource", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "resource", thumbnailUrl: "" } }, { id: "f2", x: 1, y: 3, z: 0, type: "outpost", assetUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/features/hexagonObjects_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/features/hexagonObjects_sheet.json", sprite: "tower.png", role: "decoration", category: "outpost", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "outpost", thumbnailUrl: "" } } ]
119
- assetManifest: { terrains: { grass: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "grass_01.png", role: "tile", category: "grass", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" }, stone: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "stone_01.png", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" }, dirt: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "dirt_01.png", role: "tile", category: "dirt", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "dirt", thumbnailUrl: "" }, sand: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/terrain/hexagonTerrain_sheet.json", sprite: "sand_01.png", role: "tile", category: "sand", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "sand", thumbnailUrl: "" } }, units: { worker: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-base-pack/units/aliens.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-base-pack/units/aliens.json", sprite: "alienBeige.png", role: "npc", category: "worker", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "worker", thumbnailUrl: "" }, ranger: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-base-pack/units/aliens.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-base-pack/units/aliens.json", sprite: "alienGreen.png", role: "npc", category: "ranger", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "ranger", thumbnailUrl: "" }, guardian: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-base-pack/units/aliens.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-base-pack/units/aliens.json", sprite: "alienYellow.png", role: "npc", category: "guardian", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "guardian", thumbnailUrl: "" } }, features: { resource: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/features/hexagonObjects_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/features/hexagonObjects_sheet.json", sprite: "crystals1.png", role: "decoration", category: "resource", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "resource", thumbnailUrl: "" }, outpost: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/features/hexagonObjects_sheet.png", atlas: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/kenney-hexagon-pack/features/hexagonObjects_sheet.json", sprite: "tower.png", role: "decoration", category: "outpost", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "outpost", thumbnailUrl: "" } }, effects: { hit: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-mobile-controls/ui/icons-default.json", sprite: "icon_burst", role: "effect", category: "slash", animations: ["static"], style: "", dimension: "2d", aspect: "8:1", name: "slash", thumbnailUrl: "" } } }
264
+ backgroundAsset: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/svg/hex/ui/panel-frame.svg", role: "ui", category: "ui", animations: [], style: "fantasy-border", dimension: "2d", aspect: "1:1", name: "panel-frame", thumbnailUrl: "" }
265
+ hudBackgroundAsset: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/svg/hex/ui/panel-frame.svg", role: "ui", category: "ui", animations: [], style: "fantasy-border", dimension: "2d", aspect: "1:1", name: "panel-frame", thumbnailUrl: "" }
266
+ features: [ { id: "f1", x: 1, y: 1, z: 0, type: "resource", assetUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/svg/hex/features/resource.svg", role: "decoration", category: "resource", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "resource", thumbnailUrl: "" } }, { id: "f2", x: 1, y: 3, z: 0, type: "outpost", assetUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/svg/hex/features/outpost.svg", role: "decoration", category: "outpost", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "outpost", thumbnailUrl: "" } } ]
267
+ assetManifest: { terrains: { grass: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/svg/hex/terrain/grass.svg", role: "tile", category: "grass", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" }, stone: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/svg/hex/terrain/stone.svg", role: "tile", category: "stone", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "stone", thumbnailUrl: "" }, dirt: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/svg/hex/terrain/dirt.svg", role: "tile", category: "dirt", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "dirt", thumbnailUrl: "" }, sand: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/svg/hex/terrain/sand.svg", role: "tile", category: "sand", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "sand", thumbnailUrl: "" } }, units: { worker: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/svg/hex/units/worker.svg", role: "npc", category: "worker", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "worker", thumbnailUrl: "" }, archer: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/svg/hex/units/archer.svg", role: "npc", category: "archer", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "archer", thumbnailUrl: "" }, guardian: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/svg/hex/units/guardian.svg", role: "npc", category: "guardian", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "guardian", thumbnailUrl: "" } }, features: { resource: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/svg/hex/features/resource.svg", role: "decoration", category: "resource", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "resource", thumbnailUrl: "" }, outpost: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/svg/hex/features/outpost.svg", role: "decoration", category: "outpost", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "outpost", thumbnailUrl: "" } }, effects: { hit: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/svg/hex/effects/hit.svg", role: "effect", category: "hit", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "hit", thumbnailUrl: "" } } }
120
268
  }
121
269
  }
122
270
 
123
- page "/hex-strategy-board" as HexStrategyBoardPage -> Authority, FxDecay, RoundLogic, ScoreKeeper, Player
271
+ page "/hex-strategy-board" as HexStrategyBoardPage -> Authority, FxDecay, RoundLogic, ScoreKeeper, Player, AnimClock
124
272
  }
@@ -94,7 +94,7 @@ orbital HolidayRunnerBoardOrbital {
94
94
  (set @entity.units @config.units)
95
95
  (set @entity.distance 0)
96
96
  (set @entity.score 0)
97
- (set @entity.result "")
97
+ (set @entity.result "none")
98
98
  (set @entity.effects [])
99
99
  (set @entity.selectedUnitId "")
100
100
  (set @entity.validMoves [])