@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.
- package/behaviors/lolo/ui/game/molecules/std-tactics-board-2d.lolo +35 -21
- package/behaviors/lolo/ui/game/molecules/ui-canvas.lolo +5 -0
- package/behaviors/lolo/ui/game/organisms/ui-battle-board.lolo +122 -74
- package/behaviors/lolo/ui/game/organisms/ui-hex-strategy-board.lolo +153 -9
- package/behaviors/lolo/ui/game/organisms/ui-tactics-demo-2d.lolo +130 -8
- package/behaviors/lolo/ui/game/organisms/ui-tanks-board.lolo +147 -7
- package/behaviors/lolo/ui/game/organisms/ui-topdown-rts-board.lolo +291 -19
- package/behaviors/registry/factory-signatures.json +1893 -2294
- package/behaviors/registry/ui/game/molecules/std-tactics-board-2d.orb +798 -189
- package/behaviors/registry/ui/game/molecules/ui-canvas.orb +7 -0
- package/behaviors/registry/ui/game/organisms/ui-battle-board.orb +17 -1
- package/behaviors/registry/ui/game/organisms/ui-hex-strategy-board.orb +68 -1180
- package/behaviors/registry/ui/game/organisms/ui-tactics-demo-2d.orb +192 -322
- package/behaviors/registry/ui/game/organisms/ui-tanks-board.orb +97 -85
- package/behaviors/registry/ui/game/organisms/ui-topdown-rts-board.orb +1477 -259
- package/dist/behaviors/behaviors-embeddings.json +244 -236
- package/dist/behaviors/behaviors-registry.json +143 -772
- package/dist/behaviors/exports-reader.js +1099 -2090
- package/dist/behaviors/functions/index.d.ts +33 -26
- package/dist/behaviors/functions/index.js +1099 -2091
- package/dist/behaviors/index.d.ts +1 -1
- package/dist/behaviors/index.js +1100 -2091
- package/dist/behaviors/knob-embeddings.json +1 -1
- package/dist/behaviors/query.js +1099 -2090
- package/dist/behaviors/registry/factory-signatures.json +1893 -2294
- package/dist/behaviors/registry/ui/game/molecules/std-tactics-board-2d.orb +798 -189
- package/dist/behaviors/registry/ui/game/molecules/ui-canvas.orb +7 -0
- package/dist/behaviors/registry/ui/game/organisms/ui-battle-board.orb +17 -1
- package/dist/behaviors/registry/ui/game/organisms/ui-hex-strategy-board.orb +68 -1180
- package/dist/behaviors/registry/ui/game/organisms/ui-tactics-demo-2d.orb +192 -322
- package/dist/behaviors/registry/ui/game/organisms/ui-tanks-board.orb +97 -85
- package/dist/behaviors/registry/ui/game/organisms/ui-topdown-rts-board.orb +1477 -259
- package/dist/behaviors-embeddings.json +244 -236
- package/dist/behaviors-registry.json +143 -772
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1100 -2091
- package/dist/knob-embeddings.json +1 -1
- package/dist/registry/factory-signatures.json +1893 -2294
- 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/
|
|
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/
|
|
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/
|
|
121
|
-
hudBackgroundAsset: { url: "https://almadar-kflow-assets.web.app/shared/
|
|
122
|
-
features: [ { id: "f1", x:
|
|
123
|
-
assetManifest: { terrains: { grass: { url: "https://almadar-kflow-assets.web.app/shared/ui-hex-strategy-board/
|
|
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
|
-
"
|
|
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/
|
|
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
|
|
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/
|
|
91
|
-
tiles: [ { id: "t-0-0", x: 0, y: 0, terrain: "grass", passable: true
|
|
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
|
|