@almadar/std 16.154.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 (39) hide show
  1. package/behaviors/lolo/ui/game/molecules/std-tactics-board-2d.lolo +35 -21
  2. package/behaviors/lolo/ui/game/molecules/ui-canvas.lolo +5 -0
  3. package/behaviors/lolo/ui/game/organisms/ui-battle-board.lolo +122 -74
  4. package/behaviors/lolo/ui/game/organisms/ui-hex-strategy-board.lolo +153 -9
  5. package/behaviors/lolo/ui/game/organisms/ui-tactics-demo-2d.lolo +130 -8
  6. package/behaviors/lolo/ui/game/organisms/ui-tanks-board.lolo +147 -7
  7. package/behaviors/lolo/ui/game/organisms/ui-topdown-rts-board.lolo +291 -19
  8. package/behaviors/registry/factory-signatures.json +1893 -2294
  9. package/behaviors/registry/ui/game/molecules/std-tactics-board-2d.orb +798 -189
  10. package/behaviors/registry/ui/game/molecules/ui-canvas.orb +7 -0
  11. package/behaviors/registry/ui/game/organisms/ui-battle-board.orb +17 -1
  12. package/behaviors/registry/ui/game/organisms/ui-hex-strategy-board.orb +68 -1180
  13. package/behaviors/registry/ui/game/organisms/ui-tactics-demo-2d.orb +192 -322
  14. package/behaviors/registry/ui/game/organisms/ui-tanks-board.orb +97 -85
  15. package/behaviors/registry/ui/game/organisms/ui-topdown-rts-board.orb +1477 -259
  16. package/dist/behaviors/behaviors-embeddings.json +244 -236
  17. package/dist/behaviors/behaviors-registry.json +143 -772
  18. package/dist/behaviors/exports-reader.js +1099 -2090
  19. package/dist/behaviors/functions/index.d.ts +33 -26
  20. package/dist/behaviors/functions/index.js +1099 -2091
  21. package/dist/behaviors/index.d.ts +1 -1
  22. package/dist/behaviors/index.js +1100 -2091
  23. package/dist/behaviors/knob-embeddings.json +1 -1
  24. package/dist/behaviors/query.js +1099 -2090
  25. package/dist/behaviors/registry/factory-signatures.json +1893 -2294
  26. package/dist/behaviors/registry/ui/game/molecules/std-tactics-board-2d.orb +798 -189
  27. package/dist/behaviors/registry/ui/game/molecules/ui-canvas.orb +7 -0
  28. package/dist/behaviors/registry/ui/game/organisms/ui-battle-board.orb +17 -1
  29. package/dist/behaviors/registry/ui/game/organisms/ui-hex-strategy-board.orb +68 -1180
  30. package/dist/behaviors/registry/ui/game/organisms/ui-tactics-demo-2d.orb +192 -322
  31. package/dist/behaviors/registry/ui/game/organisms/ui-tanks-board.orb +97 -85
  32. package/dist/behaviors/registry/ui/game/organisms/ui-topdown-rts-board.orb +1477 -259
  33. package/dist/behaviors-embeddings.json +244 -236
  34. package/dist/behaviors-registry.json +143 -772
  35. package/dist/index.d.ts +1 -1
  36. package/dist/index.js +1100 -2091
  37. package/dist/knob-embeddings.json +1 -1
  38. package/dist/registry/factory-signatures.json +1893 -2294
  39. package/package.json +2 -2
@@ -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
 
@@ -117,10 +261,10 @@ orbital HexStrategyBoardOrbital {
117
261
  projection: "hex"
118
262
  showMinimap: true
119
263
  scale: 0.45
120
- 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: "" }
121
- 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: "" }
122
- 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: "" } } ]
123
- 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: "" } } }
124
268
  }
125
269
  }
126
270
 
@@ -1,5 +1,123 @@
1
1
  app ui-tactics-demo-2d "1.0.0"
2
- "Reference thin organism: a 2D grid-tactics game composed entirely from the std-tactics-board-2d frame moleculesupplies only units/theme via config."
2
+ "Micro grid-tactics demo: thin organism composing the std-tactics-board-2d frame + std-score. Two soldiers vs one raider on a 3x3 flat grid the minimal reference consumer of the tactics frame. Flat hand-authored svg theme supplied via config."
3
+ ;; @capabilities "turn-based combat, strategy gameplay"
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 two soldiers on a 3x3 flat grid
10
+ ;; against a single raider. Statuses verified 2026-07-30 by guard-truth
11
+ ;; probes (almadar-tools play_transition, 8/8) and a scripted playthrough
12
+ ;; (29/29 checks) driving the real game on the runtime-verify catalog
13
+ ;; through window.__orbitalVerification — events in, canvas drawables +
14
+ ;; HUD DOM + bus event log out. Asset sprites 404 until the CDN push
15
+ ;; lands; they are verified at the drawable-descriptor (URL) level.
16
+ ;;
17
+ ;; THE GENRE (what a grid-tactics player expects, at demo scale): you command
18
+ ;; a tiny squad, not an army. Positioning is the whole game — you read the
19
+ ;; grid, step each soldier inside the raider's reach, and commit to the
20
+ ;; strike. Every End Turn hands the board to the raider AI, which closes the
21
+ ;; distance and punishes an adjacent soldier. The kill is the economy: it
22
+ ;; scores, and wiping the enemy wins the skirmish. A round looks like:
23
+ ;; select a soldier -> green reach cells -> move -> the soldier STAYS
24
+ ;; selected and auto-arms (red cells = enemies in reach) -> strike for 2 ->
25
+ ;; the soldier is SPENT (dims, cannot act again this turn) -> activate the
26
+ ;; next soldier -> End Turn -> the raider strikes an adjacent soldier for 1
27
+ ;; or steps 1 cell toward the nearest soldier -> repeat. Each unit may move
28
+ ;; ONCE and attack ONCE per turn (movedIds/actedIds track the activation;
29
+ ;; End Turn resets both). The raider has 2 hp, so one 2-damage strike kills
30
+ ;; it; a kill scores 10 and flips the Result to victory.
31
+ ;; ============================================================================
32
+ ;;
33
+ ;; PLAYER — "I maneuver my two soldiers and take the raider down."
34
+ ;;
35
+ ;; 1. I open the board and see the whole skirmish framed on screen —
36
+ ;; grass under every cell, my soldiers on the west column, the raider
37
+ ;; on the east, and the HUD showing Result/Phase/Turn/Score.
38
+ ;; WORKS. Boot paints 9 flat cells whose terrain drawables all point
39
+ ;; at svg/flat/terrain/grass.svg, 3 units (2v1: soldiers x=0, raider
40
+ ;; x=2), HUD reads "none / observation / 0 / 0". Verified in the
41
+ ;; catalog playthrough (s01-boot.png).
42
+ ;; 2. Every unit on the board is a visible sprite with a name label and a
43
+ ;; health bar I can read at a glance.
44
+ ;; WORKS. Each unit's drawable url-rewrites to its svg idle frame
45
+ ;; (4-frame breathing, cycled by the AnimClock tick — descriptors
46
+ ;; showed soldier.idle-N.svg cycling) anchored "ground", with the
47
+ ;; black backing + green health fraction above and the name label.
48
+ ;; All 3 bars read full (1.00) at boot; labels Soldier A / Soldier B
49
+ ;; / Raider all painted.
50
+ ;; 3. I click one of MY soldiers and the cells it can reach light up.
51
+ ;; WORKS. Clicking p1 sets phase "selection" and lights exactly 4
52
+ ;; green cells — the range-2 manhattan diamond from (0,0) minus the
53
+ ;; two occupied cells (s03-select.png). SPENT soldiers (in actedIds)
54
+ ;; are not selectable: play_transition on the attack arm with
55
+ ;; actedIds ["p1"] returns guard=fail.
56
+ ;; 4. I click a lit cell and the soldier moves there — and stays selected,
57
+ ;; auto-armed, so I can strike immediately. One move per turn.
58
+ ;; WORKS. p1 walked (0,0)->(1,1): the walk animation plays (caught
59
+ ;; mid-cycle, s04-walk.png), the authority re-validates and writes
60
+ ;; the position, and the unit lands in phase "action". A second
61
+ ;; TILE_CLICK the same turn is denied (movedIds guard — unit held
62
+ ;; at (1,1)), and re-clicking the moved unit lights zero green
63
+ ;; cells. Guard truth: play_transition move pass / already-moved
64
+ ;; fail / out-of-bounds fail.
65
+ ;; 5. Adjacent enemies I can strike light up red — right after my move,
66
+ ;; or when I click my selected soldier again.
67
+ ;; WORKS. Post-move auto-arm computes red cells from the NEW position:
68
+ ;; after p1 -> (1,1) the raider's cell (2,1) lit red (s05-armed.png).
69
+ ;; Living enemies at manhattan distance <= attackRange (config,
70
+ ;; default 1) light red.
71
+ ;; 6. I click a red-lit enemy — or any enemy in reach, even without arming
72
+ ;; first — and it takes a hit; my soldier is then spent for the turn.
73
+ ;; WORKS. The attack arm fires whenever a living selected unit has a
74
+ ;; living enemy in reach, regardless of phase — a direct click on the
75
+ ;; raider from phase "selection" landed the 2-damage kill. A "-2"
76
+ ;; damage number + hit fx sprite spawn at the target (BURST, ttl 3),
77
+ ;; and the attacker joins actedIds: it dimmed to 0.45 opacity.
78
+ ;; Guard truth via play_transition: in-range pass, out-of-range
79
+ ;; fail, already-acted fail. (On this 2hp-raider board the first
80
+ ;; strike also ends the game, so spent-select denial is proven by
81
+ ;; the guard probe rather than a mid-game click.)
82
+ ;; 7. I change my mind mid-selection and back out cleanly.
83
+ ;; WORKS. CANCEL clears selection, highlights, and phase back to
84
+ ;; "observation" (green 4 -> 0). Guard truth: play_transition pass.
85
+ ;; 8. I end my turn and the raider takes theirs — it closes in and fights
86
+ ;; back, and my soldiers are fresh again.
87
+ ;; WORKS. END_TURN bumps Turn (0 -> 1), clears selection + both
88
+ ;; activation lists, and emits AI_TURN; the authority struck the
89
+ ;; adjacent p1 for 1 (hp 3 -> 2, health bar shrank) — the raider was
90
+ ;; already in reach, so no step was needed (s08-ai-turn.png). After
91
+ ;; the reset p1 was selectable again (phase "selection").
92
+ ;; 9. When I kill the raider I am rewarded — score ticks up and the
93
+ ;; corpse stays on the field.
94
+ ;; WORKS. The kill scored +10 (ScoreKeeper on UNITS_CHANGED; HUD
95
+ ;; Score 0 -> 10), the corpse renders its death frame
96
+ ;; (raider.death-0.svg descriptor), and its health bar + name label
97
+ ;; dropped from the canvas (s09-kill.png).
98
+ ;; 10. When the raider falls, I win and the game tells me — then the
99
+ ;; board freezes.
100
+ ;; WORKS. Result flips to "victory" (RoundLogic on UNITS_CHANGED),
101
+ ;; GAME_END fires on the bus, and every UNIT_CLICK / TILE_CLICK arm
102
+ ;; is guarded on result == "none" — a post-game click on p2 selected
103
+ ;; nothing and lit zero cells (s10-victory.png).
104
+ ;;
105
+ ;; ASSET INVENTORY (hand-authored svg, almadar-kflow-assets.web.app
106
+ ;; /shared/ui-tactics-demo-2d/svg/flat/, generated by tools/asset-workflow
107
+ ;; svg-generator from the sibling .md descriptions)
108
+ ;;
109
+ ;; Terrain terrain/grass.svg — full-cell flat tile, drawn at
110
+ ;; width/height 1 so no gaps show between cells.
111
+ ;; Units units/{soldier,raider}.svg + animation frames
112
+ ;; .{idle-0..3, walk-0..1, attack-0, hit-0, death-0}.svg; the
113
+ ;; frame swaps url-rewrites name.svg -> name.<anim>-<i>.svg and a
114
+ ;; hidden warm-up layer preloads every frame so swaps never pop.
115
+ ;; player: p1 Soldier A 3hp (0,0) p2 Soldier B 3hp (0,2)
116
+ ;; enemy: e1 Raider 2hp (2,1)
117
+ ;; Effects effects/hit.svg (BURST "hit" fx at the struck cell).
118
+ ;; UI chrome ui/panel-frame.svg = game-shell background + HUD panel.
119
+ ;; ============================================================================
120
+
3
121
  orbital TacticsDemo2DOrbital {
4
122
  uses Frame from "std/behaviors/std-tactics-board-2d"
5
123
  uses Score from "std/behaviors/std-score"
@@ -68,13 +186,15 @@ orbital TacticsDemo2DOrbital {
68
186
 
69
187
  entity GameState [runtime, shared] {
70
188
  id : string!
71
- units : [Unit] = [ { id: "p1", position: { x: 0, y: 0 }, x: 0, y: 0, z: 0, team: "player", health: 3, maxHealth: 3, unitType: "soldier", name: "Soldier A", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.json", sprite: "blue_body_square.png", role: "player", category: "unit", animations: ["idle"], style: "vector", dimension: "2d", aspect: "1:1", name: "player-unit", thumbnailUrl: "" } }, { id: "p2", position: { x: 0, y: 2 }, x: 0, y: 2, z: 0, team: "player", health: 3, maxHealth: 3, unitType: "soldier", name: "Soldier B", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.json", sprite: "blue_body_square.png", role: "player", category: "unit", animations: ["idle"], style: "vector", dimension: "2d", aspect: "1:1", name: "player-unit", thumbnailUrl: "" } }, { id: "e1", position: { x: 2, y: 1 }, x: 2, y: 1, z: 0, team: "enemy", health: 2, maxHealth: 2, unitType: "raider", name: "Raider", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.json", sprite: "red_body_square.png", role: "enemy", category: "unit", animations: ["idle"], style: "vector", dimension: "2d", aspect: "1:1", name: "enemy-unit", thumbnailUrl: "" } } ]
189
+ units : [Unit] = [ { id: "p1", position: { x: 0, y: 0 }, x: 0, y: 0, z: 0, team: "player", health: 3, maxHealth: 3, unitType: "soldier", name: "Soldier A", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-tactics-demo-2d/svg/flat/units/soldier.svg", role: "npc", category: "soldier", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "soldier", thumbnailUrl: "" } }, { id: "p2", position: { x: 0, y: 2 }, x: 0, y: 2, z: 0, team: "player", health: 3, maxHealth: 3, unitType: "soldier", name: "Soldier B", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-tactics-demo-2d/svg/flat/units/soldier.svg", role: "npc", category: "soldier", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "soldier", thumbnailUrl: "" } }, { id: "e1", position: { x: 2, y: 1 }, x: 2, y: 1, z: 0, team: "enemy", health: 2, maxHealth: 2, unitType: "raider", name: "Raider", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-tactics-demo-2d/svg/flat/units/raider.svg", role: "npc", category: "raider", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "raider", thumbnailUrl: "" } } ]
72
190
  fx : [Fx] = []
73
- tiles : [Tile] = [ { id: "t-0-0", x: 0, y: 0, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.json", sprite: "tile_grey.png", role: "tile", category: "grass", animations: ["static"], style: "vector", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-1-0", x: 1, y: 0, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.json", sprite: "tile_grey.png", role: "tile", category: "grass", animations: ["static"], style: "vector", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-2-0", x: 2, y: 0, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.json", sprite: "tile_grey.png", role: "tile", category: "grass", animations: ["static"], style: "vector", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-0-1", x: 0, y: 1, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.json", sprite: "tile_grey.png", role: "tile", category: "grass", animations: ["static"], style: "vector", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-1-1", x: 1, y: 1, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.json", sprite: "tile_grey.png", role: "tile", category: "grass", animations: ["static"], style: "vector", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-2-1", x: 2, y: 1, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.json", sprite: "tile_grey.png", role: "tile", category: "grass", animations: ["static"], style: "vector", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-0-2", x: 0, y: 2, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.json", sprite: "tile_grey.png", role: "tile", category: "grass", animations: ["static"], style: "vector", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-1-2", x: 1, y: 2, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.json", sprite: "tile_grey.png", role: "tile", category: "grass", animations: ["static"], style: "vector", 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/_shared/kenney-shape-characters/units/spritesheet_default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.json", sprite: "tile_grey.png", role: "tile", category: "grass", animations: ["static"], style: "vector", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } } ]
191
+ tiles : [Tile] = [ { id: "t-0-0", x: 0, y: 0, terrain: "grass", passable: true }, { id: "t-1-0", x: 1, y: 0, terrain: "grass", passable: true }, { id: "t-2-0", x: 2, y: 0, terrain: "grass", passable: true }, { id: "t-0-1", x: 0, y: 1, terrain: "grass", passable: true }, { id: "t-1-1", x: 1, y: 1, terrain: "grass", passable: true }, { id: "t-2-1", x: 2, y: 1, terrain: "grass", passable: true }, { id: "t-0-2", x: 0, y: 2, terrain: "grass", passable: true }, { id: "t-1-2", x: 1, y: 2, terrain: "grass", passable: true }, { id: "t-2-2", x: 2, y: 2, terrain: "grass", passable: true } ]
74
192
  result : string = "none"
75
193
  selectedUnitId : string = ""
76
194
  validMoves : [ValidMove] = []
77
195
  attackTargets : [ValidMove] = []
196
+ movedIds : [string] = []
197
+ actedIds : [string] = []
78
198
  uiPhase : string = "observation"
79
199
  turn : number = 0
80
200
  score : number = 0
@@ -87,8 +207,8 @@ orbital TacticsDemo2DOrbital {
87
207
  gridWidth: 3
88
208
  gridHeight: 3
89
209
  attackDamage: 2
90
- units: [ { id: "p1", position: { x: 0, y: 0 }, x: 0, y: 0, z: 0, team: "player", health: 3, maxHealth: 3, unitType: "soldier", name: "Soldier A", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.json", sprite: "blue_body_square.png", role: "player", category: "unit", animations: ["idle"], style: "vector", dimension: "2d", aspect: "1:1", name: "player-unit", thumbnailUrl: "" } }, { id: "p2", position: { x: 0, y: 2 }, x: 0, y: 2, z: 0, team: "player", health: 3, maxHealth: 3, unitType: "soldier", name: "Soldier B", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.json", sprite: "blue_body_square.png", role: "player", category: "unit", animations: ["idle"], style: "vector", dimension: "2d", aspect: "1:1", name: "player-unit", thumbnailUrl: "" } }, { id: "e1", position: { x: 2, y: 1 }, x: 2, y: 1, z: 0, team: "enemy", health: 2, maxHealth: 2, unitType: "raider", name: "Raider", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.json", sprite: "red_body_square.png", role: "enemy", category: "unit", animations: ["idle"], style: "vector", dimension: "2d", aspect: "1:1", name: "enemy-unit", thumbnailUrl: "" } } ]
91
- tiles: [ { id: "t-0-0", x: 0, y: 0, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.json", sprite: "tile_grey.png", role: "tile", category: "grass", animations: ["static"], style: "vector", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-1-0", x: 1, y: 0, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.json", sprite: "tile_grey.png", role: "tile", category: "grass", animations: ["static"], style: "vector", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-2-0", x: 2, y: 0, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.json", sprite: "tile_grey.png", role: "tile", category: "grass", animations: ["static"], style: "vector", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-0-1", x: 0, y: 1, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.json", sprite: "tile_grey.png", role: "tile", category: "grass", animations: ["static"], style: "vector", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-1-1", x: 1, y: 1, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.json", sprite: "tile_grey.png", role: "tile", category: "grass", animations: ["static"], style: "vector", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-2-1", x: 2, y: 1, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.json", sprite: "tile_grey.png", role: "tile", category: "grass", animations: ["static"], style: "vector", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-0-2", x: 0, y: 2, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.json", sprite: "tile_grey.png", role: "tile", category: "grass", animations: ["static"], style: "vector", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, { id: "t-1-2", x: 1, y: 2, terrain: "grass", passable: true, terrainSprite: { url: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.json", sprite: "tile_grey.png", role: "tile", category: "grass", animations: ["static"], style: "vector", 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/_shared/kenney-shape-characters/units/spritesheet_default.png", atlas: "https://almadar-kflow-assets.web.app/shared/_shared/kenney-shape-characters/units/spritesheet_default.json", sprite: "tile_grey.png", role: "tile", category: "grass", animations: ["static"], style: "vector", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } } ]
210
+ units: [ { id: "p1", position: { x: 0, y: 0 }, x: 0, y: 0, z: 0, team: "player", health: 3, maxHealth: 3, unitType: "soldier", name: "Soldier A", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-tactics-demo-2d/svg/flat/units/soldier.svg", role: "npc", category: "soldier", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "soldier", thumbnailUrl: "" } }, { id: "p2", position: { x: 0, y: 2 }, x: 0, y: 2, z: 0, team: "player", health: 3, maxHealth: 3, unitType: "soldier", name: "Soldier B", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-tactics-demo-2d/svg/flat/units/soldier.svg", role: "npc", category: "soldier", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "soldier", thumbnailUrl: "" } }, { id: "e1", position: { x: 2, y: 1 }, x: 2, y: 1, z: 0, team: "enemy", health: 2, maxHealth: 2, unitType: "raider", name: "Raider", modelUrl: { url: "https://almadar-kflow-assets.web.app/shared/ui-tactics-demo-2d/svg/flat/units/raider.svg", role: "npc", category: "raider", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "raider", thumbnailUrl: "" } } ]
211
+ tiles: [ { id: "t-0-0", x: 0, y: 0, terrain: "grass", passable: true }, { id: "t-1-0", x: 1, y: 0, terrain: "grass", passable: true }, { id: "t-2-0", x: 2, y: 0, terrain: "grass", passable: true }, { id: "t-0-1", x: 0, y: 1, terrain: "grass", passable: true }, { id: "t-1-1", x: 1, y: 1, terrain: "grass", passable: true }, { id: "t-2-1", x: 2, y: 1, terrain: "grass", passable: true }, { id: "t-0-2", x: 0, y: 2, terrain: "grass", passable: true }, { id: "t-1-2", x: 1, y: 2, terrain: "grass", passable: true }, { id: "t-2-2", x: 2, y: 2, terrain: "grass", passable: true } ]
92
212
  }
93
213
  }
94
214
 
@@ -101,7 +221,7 @@ orbital TacticsDemo2DOrbital {
101
221
  }
102
222
 
103
223
  trait ScoreKeeper = Score.traits.ScoreKeeper -> GameState {
104
- config { running: true, initialEnemies: 1 }
224
+ config { running: true, pointsPerKill: 10, startScore: 0, initialEnemies: 1 }
105
225
  }
106
226
 
107
227
  trait AnimClock = Frame.traits.AnimClock -> GameState {
@@ -113,11 +233,13 @@ orbital TacticsDemo2DOrbital {
113
233
  gridWidth: 3
114
234
  gridHeight: 3
115
235
  movementRange: 2
116
- features: []
117
- assetManifest: { terrains: {}, units: {}, features: {}, effects: {} }
118
236
  projection: "flat"
119
237
  showMinimap: false
120
238
  scale: 1
239
+ backgroundAsset: { url: "https://almadar-kflow-assets.web.app/shared/ui-tactics-demo-2d/svg/flat/ui/panel-frame.svg", role: "ui", category: "ui", animations: [], style: "adventure", dimension: "2d", aspect: "1:1", name: "panel-frame", thumbnailUrl: "" }
240
+ hudBackgroundAsset: { url: "https://almadar-kflow-assets.web.app/shared/ui-tactics-demo-2d/svg/flat/ui/panel-frame.svg", role: "ui", category: "ui", animations: [], style: "adventure", dimension: "2d", aspect: "1:1", name: "panel-frame", thumbnailUrl: "" }
241
+ features: []
242
+ assetManifest: { terrains: { grass: { url: "https://almadar-kflow-assets.web.app/shared/ui-tactics-demo-2d/svg/flat/terrain/grass.svg", role: "tile", category: "grass", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "grass", thumbnailUrl: "" } }, units: { soldier: { url: "https://almadar-kflow-assets.web.app/shared/ui-tactics-demo-2d/svg/flat/units/soldier.svg", role: "npc", category: "soldier", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "soldier", thumbnailUrl: "" }, raider: { url: "https://almadar-kflow-assets.web.app/shared/ui-tactics-demo-2d/svg/flat/units/raider.svg", role: "npc", category: "raider", animations: ["idle","walk","attack","hit","death"], style: "", dimension: "2d", aspect: "1:1", name: "raider", thumbnailUrl: "" } }, features: {}, effects: { hit: { url: "https://almadar-kflow-assets.web.app/shared/ui-tactics-demo-2d/svg/flat/effects/hit.svg", role: "effect", category: "hit", animations: ["static"], style: "", dimension: "2d", aspect: "1:1", name: "hit", thumbnailUrl: "" } }, ui: { panel-frame: { url: "https://almadar-kflow-assets.web.app/shared/ui-tactics-demo-2d/svg/flat/ui/panel-frame.svg", role: "ui", category: "ui", animations: [], style: "adventure", dimension: "2d", aspect: "1:1", name: "panel-frame", thumbnailUrl: "" } } }
121
243
  }
122
244
  }
123
245