v0.41.12 Fix Tech Tree — Turn-1 RP Actually Works
2026-05-05

Fresh games now begin with the documented turn-1 Research Points. v0.41.9 claimed to fix initial RP but only addressed the per-turn accrual being undefined in MP. Players were still starting turn 1 at 0 RP in both single-player and multiplayer because nothing seeded the v0.30.0 starter pool (5 base + 2 per city + 1 per FAB). v0.41.12 adds an explicit seed at start-of-play in both code paths — the Tech Tree is now actually usable from turn 1 as the design intends.

  • SP fix: startGame() now seeds RP after MAP_LAYOUT structure HP setup, when tile ownership is finalized.
  • MP fix: mpFinalizePvPStart() seeds RP after the per-client owner remap, so each player gets the correct seed for their own faction holdings.
  • Idempotent: a mid-game reconnect won't double-seed, and a second game in the same session re-seeds correctly.
v0.41.11 Fix Multiplayer Polish — Home, Combat Log, Stats
2026-05-03

Three multiplayer bugs fixed in one hotfix. Returning to the home screen after an MP match no longer leaves all the panel buttons silently dead. Your opponent's actions now show up in the combat log. And the host no longer absorbs the opponent's losses into their own stats — kills, losses, damage and captures are now correctly attributed per player.

  • Bug 1 — Post-MP home buttons fixed. mpShowLobby hides home panels with inline display:none; the cleanup only ran when the user explicitly left the lobby. Coming home from a finished match skipped it, so the inline style stuck and beat the .home-panel.active CSS rule. showHomeScreen now resets those styles on every entry.
  • Bug 2 — Opponent actions logged. mpApplyOpponentAction now emits a combat-log entry for attacks (with damage and kills), captures, builds, barrages, airdrops, nuclear strikes, smoke screens, and unit production.
  • Bug 3 — Personal stats fixed. Stat tracking now keys on unit.owner === 'player' instead of isHumanSlot(), which returned true for every human in MP and caused the host to absorb the opponent's losses (Megagam3 jumped 36 → 81 KIA after one MP loss). Applied to attack, counter-attack, and capture sites.
  • Bug 4 — Megagam3 stats restored. One-off SQL fixup reset units_lost from 81 → 37.
v0.41.4 Fix Dashboard SP Game History
2026-05-01

Single-player games now appear on the admin dashboard. v0.41.3 fixed presence tracking and the Active Games count, but the games listing was still multiplayer-only — finish an SP game and the dashboard didn't show it. v0.41.4 adds a dedicated Recent Single-Player Games section pulled from game_history, plus updates the top-line counters so Games Today and Avg Game Length sum SP and MP.

  • New section: Recent Single-Player Games shows player, result, faction matchup, difficulty, turns, kills/losses, and timing.
  • Games Today now sums multiplayer_games (24h) + game_history (24h).
  • Avg Game Length is now a weighted average across SP and MP. SP duration is approximated as turns × 60s since SP doesn't track started_at.
  • New endpoint: GET /api/admin/dashboard/sp-games?limit=30. Filters out backend users.
  • Existing MP table renamed to "Active & Recent Multiplayer Games" so the two are unambiguous.
v0.41.3 Fix Dashboard Now Sees Single-Player
2026-05-01

The admin dashboard now counts single-player activity. Before v0.41.3, presence tracking was wired entirely to the multiplayer socket — anyone in a solo game showed as "0 players online" and SP games were invisible to the Active Games card. Now the client posts a small heartbeat to /api/sessions/heartbeat every 30 seconds with a kind field (sp / mp / lobby / idle), and the dashboard sums distinct SP players into the unified Active Games count.

  • New REST heartbeat: POST /api/sessions/heartbeat with { kind }. Authenticated. Best-effort; never blocks gameplay.
  • New player_sessions.session_kind column. Distinguishes SP / MP / lobby / idle without adding a parallel table.
  • Active Games card now shows SP + MP combined, with the split visible in the sub-text (SP: 1 · MP: 0).
  • Players Online table renders a colored activity tag per row so admins can see at a glance who's in SP vs MP vs the lobby.
  • Migration: migrate_v0_41_3_session_kind.js --apply adds the column + index. Idempotent.
v0.41.2 Fix Backend-Only Admin User
2026-05-01

The Admin account no longer shows up anywhere in-game. Adding admin privileges in v0.41.1 was a backend-only need (so I could sign into the dashboard without using a real player account), but is_admin = TRUE alone wasn't a filter — the Admin user was leaking into Personnel Dossiers and the leaderboards. v0.41.2 adds a dedicated is_backend_user flag and applies it as a hard filter across every user-facing rollup, plus updates create_admin_user.js so future admin accounts are invisible-in-game by default.

  • New users.is_backend_user column (BOOLEAN, default FALSE). Safe to redeploy — ALTER TABLE IF NOT EXISTS.
  • Filter applied to: /api/stats/dossiers, /api/stats/leaderboard, /api/stats/ranked/leaderboard, /api/stats/ranked/individual, and the battalion-roster subquery in /api/stats/ranked/battalion/:id.
  • create_admin_user.js now sets is_backend_user = TRUE + profile_public = FALSE on every upsert. Creating or resetting an admin produces a fully hidden account out of the box.
  • Migration script: migrate_v0_41_2_backend_user.js --apply ensures the column exists and back-fills the existing Admin user. Idempotent and refuses to flag non-admin users.
  • Dashboard untouched: the admin dashboard's online-players list still shows everyone signed in, including admins — that's the whole point of an ops view.
v0.41.1 Fix Dashboard — Inline Sign-In
2026-04-30

The admin dashboard at /dashboard.html now has its own sign-in form. Before v0.41.1, hitting that URL while logged-out showed a generic error and required bouncing through the main site to authenticate. Now the dashboard probes /api/auth/me on load; if you're not signed in, it hides the panels and shows a callsign + password form. The form posts to the existing /api/auth/login endpoint and re-runs the dashboard load on success.

  • Sign-in form with callsign + password fields. Errors render inline.
  • Auth-state aware: 401 shows the form, 403 shows "signed in but not admin", 200 shows live dashboard.
  • Header chip shows the signed-in callsign and a Sign Out button. Sign Out clears the session and returns to the sign-in form.
  • Auto-refresh interval pauses when signed out so the page stops spamming 401s.
v0.41.0 Feature Server Activity Log + Admin Dashboard
2026-04-30

New admin-gated dashboard with live game metrics. Visit /dashboard.html (admin-flagged accounts only) for a real-time view of active games, online players, today's activity, faction popularity, and a filterable event log. Auto-refreshes every 10 seconds. Backed by two new tables (server_events + player_sessions) and a logEvent() helper hooked into every key code path.

  • Top-line metric cards: active games, players online, games today, total users, avg game duration (last 7 days), errors in last 24 hours.
  • Online players list: currently-connected users via socket presence. Heartbeat pings every 30s; users drop off after 90s of silence.
  • Active & recent games table: room codes, status badges, players (with AI tags), map size + type, victory mode, winner.
  • Faction popularity: bar chart of pick counts + win rate per faction over the last 30 days.
  • Event log: structured events filterable by severity (info / warn / error / debug) and event type (e.g. auth., mp., error.). Last 100 events shown, auto-refreshing.
  • Hooks landed at: auth.login, auth.register, auth.logout, auth.steam-login, mp.game-created, mp.game-ended, mp.socket-connected, mp.socket-disconnected, plus error.500 catch-alls in MP routes.
  • 30-day retention on the event log; auto-pruned daily. Player sessions kept indefinitely (small footprint).
v0.40.4 Fix Service Record Rank Stuck at E-9
2026-04-30

The Service Record summary was showing E-9 (Sergeant Major) for every player past 35,000 XP, even when they'd qualified for Warrant Officer or Commissioned Officer ranks. Root cause: getRankForPlayer() read condition values via stats[key] where the rank-condition key is wins, but the actual player_stats column is games_won. Every wins-gated rank silently failed its condition check and the loop fell through to E-9 (last rank without a condition). The Dossiers route already aliased this manually at its call site — that's why dossier rows showed the correct rank but the Service Record didn't.

  • Server fix: getRankForPlayer() now maps winsgames_won internally. Defensive lookup tries the canonical column first, falls back to the literal condition key — so callers that already alias (the Dossiers route) keep working.
  • Rank Progression list polish: previously the list marked "achieved" purely by XP, so 92K XP would show green checks all the way to W-3 even if you hadn't met the 10-hard-wins condition. Now derived from the rank's index relative to the server's resolved current rank — monotonic and consistent with the summary at the top.
v0.40.3 Fix Mixed-MP Polish — AI Slots Visible, Terrain Density in Theater
2026-04-30

Two MP lobby fixes shipped together. AI slots no longer render as "Waiting for player..." — they show up filled with AI difficulty visible, host-controlled faction (with a Random option), and host-controlled team. The MP Theater of Operations now has the Terrain Density selector that single-player has had since v0.31.4 — same Low/Medium/High control driving the same terrain generator that v0.31.26 made themed maps respect.

  • AI slot rendering. Slots marked AI in the create-game form show "AI · DIFFICULTY" in the lobby, not "Waiting for player...". Steam-blue tint distinguishes them from human slots.
  • Host-controlled faction. Each AI slot has a "Select Faction" button (host-only). Opens the existing faction picker; a new "Random" tile at the top of the grid rolls a uniform pick. Click "Change Faction" → "Random" again to re-roll.
  • Host-controlled team. Click an AI slot's team badge to cycle 0 → 1 → 2 → 3 → 4 → 0. AI slots now participate in 2v2/3v1/etc. team configs.
  • Server mp:select-faction + mp:select-team accept an optional forSlot parameter. Authorized only when the requester is the host (player1) AND the target slot is AI. Other clients are unaffected.
  • Theater of Operations: Terrain Density matches the single-player UI — Low / Medium / High buttons. Sent to the server on create, persisted on multiplayer_games.terrain_density, applied to gameState.terrainDensity before initMap runs, so every map generator (standard + the six themed ones) respects the host's pick.
v0.40.2 Fix Quick Match Queue 500 — Wrong elo_lifetime Table
2026-04-30

Quick Match was failing for everyone with a generic "Failed to join queue" error. The queue-join endpoint was querying users.elo_lifetime, but that column lives on player_stats — the SELECT crashed with SQLSTATE 42703 ('column elo_lifetime of relation users does not exist') on every attempt, and the catch-all returned a generic 500 that hid the real cause.

  • Fixed query: LEFT JOIN player_stats ps ON ps.user_id = u.id with COALESCE(ps.elo_lifetime, 1000) so brand-new accounts (no player_stats row yet) default to ELO 1000 instead of crashing.
  • Surface error details: the catch-all in /quickmatch/join now returns err.message, err.code (Postgres SQLSTATE), and err.detail — same diagnostic pattern shipped for /api/auth/steam-login in v0.31.22. Future bugs surface in one launch instead of needing a pm2 log dive.
v0.40.1 Fix Ranked Games Server-Enforced as All-Human
2026-04-30

Closes the v0.40.0 known limitation. The rule that ranked multiplayer games must be all-human is now enforced server-side, not just advisory. The Quick Match matchmaker has always sent all-human compositions, so no live ranked games were affected — the fix prevents a hand-crafted API request from creating a ranked game with an AI slot, which would have let players farm ELO against deterministic computer opponents.

  • Server check: /api/multiplayer/create rejects requests where isRanked: true is paired with any AI slot in slotConfig. Returns 400 with: "Ranked games must be all-human. Either turn off Ranked or set every slot to Human."
  • No UI change required. The lobby form has no Ranked toggle (only Quick Match creates ranked games, and that path always sends all-human compositions). The guard is hardening, not new UX.
  • Backward-compatible: every v0.40.0 ranked game already passes the new check.
v0.40.0 Major Mixed Human/AI Multiplayer
2026-04-30

Multiplayer games now support mixed human/AI compositions. When you create a 3-4 player game, you can mark each non-host slot as Human (waits for a player to join) or AI (filled at create time, plays automatically). Minimum two humans is enforced — host plus at least one other. AI slots use the same engine the single-player game uses, including difficulty.

  • Slot Composition section in the lobby create-game form. Visible for 3-4 player games. Per-slot Human/AI toggle, plus difficulty (Easy/Medium/Hard) for AI slots.
  • Min-2-humans rule. Validated client-side (clear in-form message) and server-side (400 on /api/multiplayer/create with an actionable error). Single-player MP-vs-AI is not supported — that's what the regular single-player mode is for.
  • AI slots pre-filled. They don't wait for a join. The room moves to faction_select as soon as all human slots are filled.
  • AI slots can't be joined by other humans — the join endpoint skips them. If only AI seats remain in a room, a join attempt gets a clear "all human seats are taken or filled by AI" error.
  • Host drives all AI turns. When the active turn is an AI slot, the host's client runs runAiSlotTurn() locally (re-using the single-player multi-AI engine). Each AI move is broadcast through the existing mp:action-applied pipeline, so non-host clients see the AI's moves in real time without any new transport.
  • Double-apply prevention. The host's own broadcast echoes are filtered via a new senderRole field on mp:action-applied — so the host doesn't apply its own AI moves twice (once when running, once when receiving the broadcast).
  • Schema additions. Per-slot player[1-4]_type and per-AI-slot player[2-4]_ai_difficulty columns on multiplayer_games. Default 'human' so existing rows behave exactly like v0.31.x games.
v0.31.30 Feature Steam Sign-In Preference — Auto Steam vs Custom Login
2026-04-30

You can now choose what happens when HexArmy is launched via Steam. A new profile-panel section between Public Dossier and Security has two radio options. The default is Automatically use Steam account (current behavior — Steam ticket auto-links to your account). The alternative, Use custom login, shows the manual login form on every Steam launch so you sign in with your callsign and password instead.

  • Default: "Automatically use Steam account". Steam ticket → auto-link → signed in. No change for anyone who's been happy with how it works today.
  • Alternative: "Use custom login". Steam launch shows the manual login form. The form's existing Steam-detected banner still works — signing in this way still links your Steam profile to the account you log into, if it wasn't already.
  • Custom-mode sub-option: "Automatically sign-in". When ON, your session cookie persists across launches so you don't have to re-enter credentials every time. When OFF, the session is cleared on every Steam launch so you're always prompted.
  • Per-machine setting. Stored in localStorage. Auto on your PC, custom on a shared laptop, etc. — no server roundtrip required.
  • When useful: shared machines where the Steam profile and the HexArmy account shouldn't be coupled, or HexArmy accounts you want to keep deliberately separate from the Steam identity that's running the game.
v0.31.29 Fix Tech Tree Research Now Applies to Existing Units
2026-04-30

Buying a research level now upgrades your entire army, not just future production. Until v0.31.29, Tech Tree purchases baked their stat deltas into units only at spawn time — so paying RP for Armor L1 (+1 ATK tank) only affected tanks you produced AFTER the purchase. The four tanks already on the field kept their old ATK, despite the cost being identical and the description making no mention of the limitation.

  • What now applies retroactively: all simple stat deltas — atk, def, hp, maxHp, mov, acc, dge, range, vision. Examples: Infantry L1 (+1 ATK Infantry), Infantry L2 (+2 HP Infantry), Armor L1 (+2 DEF Tank), Air L1 (+1 MOV jet/heli), Naval L1 (+3 HP destroyer/aa_ship), etc.
  • If a research level grants +1 MOV: the affected units' movRemaining for the current turn is also bumped (capped at the new max), so they can use the extra movement immediately rather than waiting until next turn.
  • Combat-time effects (e.g. ACC vs adjacent enemies, DEF when adjacent to friendly Infantry, the Air L6 Stealth Bomber capstone) were already applied dynamically to existing units and are unchanged.
  • Comms log now reports how many existing units received the upgrade: "Research: Armor Doctrine L1 — Field Drill: +1 ATK on Tanks — applied to 4 existing units".
v0.31.28 Fix North Korea Artillery No Longer Wrongly Hit by Mobility Penalty
2026-04-30

NK artillery now keeps its full base MOV, matching the doctrine description. The North Korea weakness card reads "Non-Inf/Art -1 MOV" — meaning infantry and artillery are exempt from the movement penalty. Behind the scenes the modifier is even named nonInfantryArtilleryMovPenalty to make the exemption obvious. But the artillery-specific branch of applyFactionModifiersToUnit() contained a stray application of that modifier, hitting artillery for -1 MOV in direct contradiction of the modifier's name and the on-card text.

  • Removed: the duplicate nonInfantryArtilleryMovPenalty application inside if (type === 'artillery').
  • Effect: Koksan and any other NK artillery unit now move at base MOV. Tanks, recon, helicopters, jets, AA, engineers, ships, etc. still take the -1, which is correct per the doctrine.
  • Infantry was already correctly exempt — behavior unchanged for infantry.
v0.31.27 Fix Killed Attackers Can No Longer Land Their Hit
2026-04-30

An AA-shot-down helicopter no longer gets a free attack on the way down. Reported case: an AI Apache moved into the player's airspace, the player's Pantsir reaction-fired for -17 damage (lethal), and the comms log still showed the dead Apache hitting the player's Razvedchik on the very next line. Root cause: doAttack() and attackCity() checked attacker.attacked and attacker.movRemaining but never checked attacker.hp > 0. The AI's move-then-attack flow runs checkAAReaction() (which can lethally damage the moving air unit) and then unconditionally fell through to the attack call.

  • Single-line guards at the top of both combat functions. A killed unit (hp <= 0) silently fails to resolve its attack instead of completing it. Defense in depth — the bug can't recur from any caller, including future flows we haven't written yet.
  • Most visible effect: air units shot down by AA reaction fire no longer score a hit before being removed from the board.
  • Side benefit: any future "opportunity fire" or "trap" mechanic that kills the attacker mid-action also benefits from the guard for free.
v0.31.26 Fix Terrain Density Now Works on Themed Maps
2026-04-30

The Terrain Density slider does what it says on every map type now. Until v0.31.26, the Low/Medium/High setting was silently ignored by every themed map generator — Continents, Archipelago, Pangea, Highlands, Forest Basin, and River Networks. Forest and mountain counts were hardcoded; only the Standard generator honored the slider. And because themed map types are only selectable on maps 400+ tiles, the slider appeared to do nothing on Medium, Large, Max, Huge, and Epic maps whenever a non-Standard type was picked.

  • What scales now: forest clusters and forest scattered fill, mountain peaks and Highland plateaus, Highland lakes, Forest Basin ponds, River Networks junction lakes — all in every themed generator.
  • What still doesn't scale (intentionally): structural water that defines a theme — Continent oceans, Archipelago seas, Pangean coastline — plus Highland mountain ranges and the river network in River Networks. These stay fixed so a Continents map at Low density still looks like Continents and not like Pangea.
  • Desert Wastes is unchanged because it has no forest/mountain/water by design.
  • Refactored: the Standard generator's inline density-multiplier is now a shared _terrainDensityMul() helper used by every generator. Easier to verify and tweak in one place.
v0.31.25 Feature Home Page — Steam Linkage Status + Link-to-Steam Button
2026-04-30

Steam linkage now visible at a glance on the home screen. The callsign panel shows a "STEAM LINKED" pill (with your Steam persona) directly under the XP bar when your account is linked. If it isn't, a "Link to Steam" button appears whenever Steam is running — one click connects the two profiles without needing to sign out and back in.

  • Linked state. Shows "STEAM LINKED as <persona>" in a Steam-blue pill.
  • Unlinked + Steam available. Shows a "Link to Steam" button. Click → grabs a fresh Steam auth ticket → POSTs to /api/auth/steam-link-current → server links steam_id onto your existing account in a single transaction. Throwaway accounts (the Nechtan_0546-style auto-creates) are merged + deleted as part of the same operation.
  • Unlinked + no Steam. Shows a small "Steam Not Detected — Launch via Steam to Link" hint instead of a button that couldn't work. Browser players see this; Steam players see the button.
  • New endpoint. POST /api/auth/steam-link-current requires authenticated session + Steam ticket. No password re-prompt — session establishes account ownership, ticket establishes Steam ownership, and linking doesn't set a new credential.
  • Idempotent. Clicking when already linked refreshes persona/avatar (in case you renamed yourself on Steam) but doesn't change anything else.
  • Refuses to overwrite. If your HexArmy account is somehow already linked to a different Steam profile, returns 409 with a clear message rather than clobbering.
v0.31.24 Policy Public Dossier Default — On for Every Account
2026-04-30

Personnel Dossiers and Ribbon Bars are now visible by default. Until v0.31.24, manually-registered accounts started with profile_public = FALSE — you had to find the toggle in account settings to appear in the Dossiers tab or to share your Service Record in multiplayer lobbies. Steam-registered accounts always defaulted to public; this brings the manual-registration path in line. The opt-out toggle still works exactly the same; this only changes the default starting state.

  • New accounts. /api/auth/register now sets profile_public = TRUE on the INSERT. No extra click required after sign-up — you appear in Dossiers immediately.
  • Existing accounts. A one-shot migration (scripts/flip_profile_public.js) flips every existing FALSE/NULL row to TRUE in a single transaction. Inspect-first/apply-second pattern with row counts before and after, same shape as the Steam merge tooling.
  • Schema default. db/init.js column default flipped from FALSE to TRUE so fresh deploys come up with the right default without needing the migration.
  • Opt-out still works. The Public Dossier checkbox in account settings flips the flag back off any time. The migration is a default-reset, not a permanent override.
v0.31.23 Feature Steam Account Linking — Sign In to Existing HexArmy Account
2026-04-30

Self-service Steam linking. If your first Steam launch landed you on a throwaway numbered account (e.g. Nechtan_0546) because your original callsign was already taken, you can now sign in to your real account from the manual login form and HexArmy will permanently link your Steam profile to it. No more support tickets or SQL surgery for the migration case.

  • Login form auto-detects Steam. A blue banner appears above "Returning Operator" when Steam is running, explaining that signing in will link the Steam profile to your existing HexArmy account.
  • New endpoint /api/auth/steam-link. Validates the Steam ticket against Valve and your callsign + password against the database in the same request, then transactionally links the steam_id onto your existing account.
  • Self-healing for the throwaway case. If steam-login already auto-created a throwaway account for your Steam ID (the typical situation right now), the link operation transfers the steam_* columns onto your real account and deletes the throwaway in one atomic transaction. ON DELETE CASCADE handles its player_stats etc.
  • Idempotent. If your account is already linked to the same Steam profile, the request just establishes a session — no DB write.
  • Refuses to overwrite. If your HexArmy account is already linked to a different Steam profile, the request is rejected with 409 instead of clobbering.
  • Fully transactional. If anything fails (ticket rejection, FK violation, anything), the transaction is rolled back and nothing is changed.
v0.31.22 Patch Steam Auto-Login — Diagnostic Surfacing for 500 Errors
2026-04-30

Diagnostic patch. After v0.31.21 fixed the wrong Valve API host, Steam auto-login moved past Valve and started failing with a generic 500 Server error during Steam login instead. The catch-all in /api/auth/steam-login was swallowing the actual error from the DB upsert / session-establishment path, forcing a server-side log dive every time. v0.31.22 surfaces err.message, err.code (Postgres SQLSTATE), err.detail, and err.where in both the server log and the JSON response, and the client autoLogin warning prints all four. The next Steam launch will name the failing column, constraint, or middleware directly in F12.

  • Server 500 catch-all now returns { error, message, code, detail, where } instead of just { error }. Truncates message/detail to 300 chars and where to 200 chars to keep payloads bounded.
  • Client autoLogin warning prints all four diagnostic fields so F12 alone identifies the failure point — no pm2 log round-trip needed for the next attempt.
  • No success-path changes. Only the unexpected-error branch is more verbose.
  • Known limitation: this release is purely diagnostic and does NOT fix the underlying 500. Once the next Steam launch reports the specific message/code, a follow-up patch addresses the root cause.
v0.31.21 Patch Steam Auto-Login — Wrong Valve API Host Fixed
2026-04-29

Steam auto-login is fixed. Server-only patch. The ticket validation URL was hitting Valve's Steamworks Partner API host (partner.steam-api.com), which requires a publisher API key. Our STEAM_WEB_API_KEY is a standard Web API key (the kind you get from steamcommunity.com/dev/apikey) — valid, but rejected by the partner endpoint. Valve returned non-2xx, the server's catch-all mapped that to "502 Steam authentication service unavailable", every Steam-launched client saw the manual login screen.

  • Switched the validation URL from partner.steam-api.com to api.steampowered.com — same path, public host that accepts Web API keys.
  • Server now logs the actual Valve response body on validation failures. Previously just the status code — now you see the actual error text, so future host/key issues are diagnosable in one pass.
  • No client rebuild needed. Just deploy the updated server route + restart pm2.
  • The diagnostic patches (v0.31.19 F12 + v0.31.20 per-step logs) earned their cost in 24 hours. The user's first new console capture pinpointed the failure end-to-end. Without F12 and per-step logs, this would still be a guessing game.
v0.31.20 Patch Steam Auto-Login Diagnostics — Per-Step Logging
2026-04-29

Diagnostic patch. Steam auto-login was failing silently — F12 console showed only [STEAM] Ready. Persona: <name> with no follow-up explaining why the chain didn't continue. HexSteam.getAuthTicket was swallowing every Steamworks error (catch (_) { return null; }) and autoLogin had no per-step logging. This patch adds explicit logs at every decision point so the next failed launch produces an actionable trace. No behavior change — only diagnostic output.

  • getAuthTicket now logs the actual Steamworks error before returning null instead of fully swallowing it. Logs the result type and length so 'returned null' vs 'returned empty string' vs 'returned a real hex ticket' is distinguishable.
  • autoLogin logs every step: starting, ticket length, POST URL+persona, response status, JSON parse failures, rejection vs success.
  • Followup target: once the new logs surface the actual root cause, the underlying fix ships as v0.31.21.
v0.31.19 Patch F12 Devtools Enabled in Release Builds
2026-04-29

F12 silently doing nothing in Steam-launched builds is fixed. Tauri 2 strips the WebView inspector entirely from release builds by default unless you explicitly opt in via the devtools Cargo feature flag. We weren't opting in, so F12 was a no-op in every shipped build. With this patch, F12 (and right-click → Inspect) open the inspector in any Steam-launched copy.

  • F12 opens the WebView inspector in Steam-launched (release) builds.
  • Right-click → Inspect Element also works.
  • All console logs visible: [STEAM], [STATS], [API], [AI] — useful for debugging end-of-game stat issues, MP lobby, Steam autoLogin diagnosis, etc.
  • Network tab available for inspecting API calls in flight.

Reason for the trade-off (small binary size + players can inspect HTML/JS): every future "this doesn't work in Steam" bug now becomes diagnosable in 30 seconds instead of requiring a multi-step server-side investigation. Devtools-in-release is the standard for any Tauri app expected to ever debug shipped builds.

v0.31.18 Patch Server-Only — dotenv Path Hardened (Fixes Steam Auto-Login + MP Lobby)
2026-04-29

Steam launches were silently dropping into the manual login screen. The multiplayer lobby was refusing entry. Same root cause for both: the server's require('dotenv').config() call was looking for the .env file in the wrong directory (process cwd, not the server's own directory). STEAM_WEB_API_KEY ended up undefined in the running process; /api/auth/steam-login returned 500 to every client; Steam autoLogin failed silently; you saw the login screen and the lobby couldn't authenticate you.

  • One-line server-side fix — pinned the dotenv path explicitly to the .env next to server.js, so it works regardless of which directory pm2 was started from.
  • Steam auto-login works again. No manual login screen on Steam launches.
  • MP lobby reachable again (the lobby gate needed an authenticated session — which Steam auto-login was failing to produce).
  • No client rebuild needed. Server-only change. Just deploy src/server.js + restart pm2.

If you've been seeing the login screen on Steam launches over the last few days — that's done. The Steam autoLogin flow has been correct in code for releases; the dotenv path was just looking in the wrong place.

v0.31.17 Patch Suppression Implemented + Advance-on-Kill Captures Neutrals
2026-04-29

Two real bugs surfaced by the v0.31.16 tutorial accuracy audit, both fixed. Plus a documentation correction to the in-game Field Manual and the public tutorial page that had been quietly inaccurate for releases.

  • Artillery suppression now actually works. The Field Manual has documented since release that artillery hits suppress survivors (−1 MOV next turn, cannot counter-attack). The suppressed flag was read in the counter-attack guard but never set anywhere — the mechanic was a Field Manual fiction. Now applied: artillery hits AND Barrage ultimate hits both flag survivors as suppressed, −1 MOV applied at the suppressed unit's next turn, flag cleared at end of that turn.
  • Advance-on-kill onto a neutral structure now captures it. A melee unit that killed a defender on a neutral city/HQ would advance onto the tile but the city stayed neutral — the capture branch required hp ≤ 0, which excluded full-HP neutrals. Now captures neutrals AND empty-HP enemy structures, mirroring the moveUnit walk-on capture rule. Capturing unit also gets promotion-progress credit.
  • Flanking description corrected. The Field Manual and tutorial pages had been claiming the defender's facing updates with attacks/advances and that pinning forces the defender to face the pinning unit. Neither is true — the flank calc uses each defender's HQ position as a fixed facing reference. Both pages rewritten to accurately describe the mechanic.

If your artillery has felt weirdly underwhelming — counters were ignoring suppression, MOV reductions weren't applying. That's done. The Field Manual has been telling you about a feature that didn't exist; now it does.

v0.31.16 Feature Recruit Tutorial — Beginner's Guide Added to Website
2026-04-29

New Field Academy page on the marketing site. A structured ~15-minute walkthrough that takes a brand-new player from "I just installed it" to "I won my first match." Twelve numbered missions plus a ten-tip cheat sheet, with all numbers, terrain values, faction budgets, capture rules, and combat formulas sourced from the canonical Field Manual rather than guessed.

  • Mission 01–04 — match setup (the real menu: faction picker, AI count and per-slot difficulty, map size, map type, terrain density, victory condition, map lock), reading the hex map (real DEF/dodge values: Plains +0/+0, Forest +2/+10, Mountain +3/+0, City +3/+5, HQ +4/+5, plus a movement-cost table showing tanks are impassable in forest/mountain), the draft phase (faction budgets 850–1,020g, 6/7/8 unit caps), and placement (within 2 hexes of any owned HQ or city).
  • Mission 05–07 — the move-then-attack rule and its two exceptions (Tank Blitz, Assault Veteran Infantry), real combat math (Hit% formula, damage formula with current-HP scaling, flank multipliers 1.0x/1.25x/1.5x/Iran 1.75x, counter-attacks only on melee at 50% ATK, suppression mechanics, advance-after-kill), and the combined-arms role table with effectiveness multipliers (Heli vs Tank 1.7x, AA vs Jet 2.5x, Infantry vs Tank 0.25x, etc.).
  • Mission 08–11 — capture rules (neutral = walk-on instant, enemy = HP must be reduced to 0 first, air units cannot capture), the five structure types (HQ 150g/turn, City 100g/turn, FOB/FAB/Port), engineer camps (engineer is consumed on construction), garrisons (City 525g, HQ 800g), fog of war with real vision values (Scout 5, Recon 4, Heli 4, default 2), promotions with real OR-gated thresholds (2 kills / 8 kills / 16 kills with combats-survived and captures alternates), Commander aura rules and the one-per-class-per-side limit, and all five victory conditions (HQ Takeover, Military Annihilation, Complete Domination, Infantry Only, 20 Turn Survival).
  • Quick-tips block — ten one-liner habits sourced from real mechanics: read the damage preview because damage scales with HP, save 1 MP for the punch (move-then-attack), tanks cannot enter forest/mountain, pin-and-flank, mortars need a Recon spotter, artillery must deploy before firing, engineers are consumed when building camps, etc.
  • Wired into nav and footers — new "Tutorial" link added to the index nav, the home footer, the features-page footer, and this release-notes footer.

Marketing-only release. No game-engine changes. Initial draft of this page was rewritten end-to-end after a code-grounded factual audit — first version was authored without consulting the Field Manual and contained substantial inaccuracies; this released version is sourced from HexArmy_Field_Manual_v0.20.20.pdf.

v0.31.15 Patch Sprite Transparency Audit — 5 Sprites Fixed
2026-04-29

Audited all 598 unit and HQ sprites for proper transparent backgrounds. Found five problems — four subtle, one obvious. All fixed.

  • AA Ship non-directional sprites (4 team colors) — were stored as RGB without an alpha channel and rendered with solid gray/white backdrops in the selected-unit panel, draft preview, production menu, and minimap. Fixed by replacing them with copies of their `_d2` directional variants, which were correctly RGBA-transparent.
  • New Zealand HQ sprite — was RGBA-mode but every single pixel was opaque. The building rendered with a 300x300 white square around it instead of being cut out from the terrain like the other 9 HQs. Fixed by flood-filling the white background from the four corners with a tolerance, preserving any white elements of the building itself.
  • All 598 sprites verified. Every PNG now has an alpha channel and at least some transparent pixels.

If your AA Ships have looked subtly off in production cards or your NZ HQ has had an awkward white halo — that's done.

v0.31.14 Patch AI Engineer Auto-Repair + Sapper Drill Research Wired In
2026-04-29

Two follow-ups from v0.31.13 land here. AI engineers now know how to use the repair action they were granted last patch — if they're sitting next to a damaged owned city/HQ/camp and can't build a camp from where they are, they patch it up instead of moving past it. And the Engineering Tech Tree's L1 node (Sapper Drill, +10% engineer repair) now actually applies to the player's repair rate — until now it was a Tech Tree node with no in-game effect.

  • AI engineer fallback — Medium and Hard AI engineers auto-repair the most-damaged adjacent owned structure when they can't build a camp from their current tile.
  • 15% damage threshold — AI doesn't waste a turn fixing a 5% scratch when there's offensive value to be had.
  • Sapper Drill (Engineering L1, +10%) now stacks on the faction base rate — Canada engineer + Sapper Drill = 50% repair per action; USA + Sapper = 30%; Russia + Sapper = 25%; default + Sapper = 30%.
  • Generic research-delta accessor added so future research effects with numeric deltas (Field Medic +1 heal, Logistics structure self-repair, etc.) plug in cleanly when their resolver hooks land.

Easy-difficulty AI engineers still don't repair, matching the existing easy-no-engineer-camps policy. AI tech-spending is the next major Tech Tree milestone.

v0.31.13 Patch Engineer City Repair — Action Implemented
2026-04-29

Engineers can finally repair damaged owned cities and structures. The Field Manual has been describing this for releases ("Engineers also repair owned cities — 20% per action; Canada: 40%") but the action button was never actually wired up. The engineerRepairRate modifier on USA / Canada / Russia was set, displayed in the bonus list, but did nothing. Closing that gap.

  • Repair action — appears on the engineer's action bar when they're on or adjacent to an owned damaged structure (City / HQ / FOB / FAB / Port).
  • Single target — one click repairs.
  • Multiple targets — valid structures glow gold; click the one to repair.
  • Repair amount: -20% damage by default (USA), -40% Canada (highest in the game), -15% Russia.
  • Engineer survives the repair (unlike camp construction, which sacrifices the unit). The engineer's MOV and ATK are spent for the turn, but they can repair again next turn.
  • PvP synced — the action broadcasts to the opponent so both clients see the same damage value.

If you've been losing income on a half-damaged HQ for ten turns — that's no longer just on you. Walk an engineer over.

v0.31.12 Patch Faction Modifier Audit — Five Bugs Fixed
2026-04-29

Walked every faction's bonuses and penalties end-to-end. Most were correctly applied. Five real bugs found in cost calc, ultimate cooldowns, and Iran's air penalties — each one had the modifier set in the FACTIONS table and shown in the bonus/penalty list, but the runtime code wasn't actually reading it.

  • Canada — +20% jet/heli cost penalty now actually applied. The cost calc handled the same penalty under two other names (airCostIncrease, jetCostIncrease) but missed Canada's third synonym.
  • China — -10% production cost is now actually applied at city production for both player and AI. Previously the bonus list bragged about it; the production code didn't read it.
  • UK — Engineer Fortify cooldown is now 4 (was running at 5 like every other faction).
  • China — Recon Deep Scan cooldown is now 2 (was running at 3). Same root cause as UK.
  • Iran — Jet -10 ACC penalty now applies once to jets (was double-applied) and not at all to helicopters (was leaking onto them).
  • Iran — Jet -2 HP penalty no longer leaks onto helicopters.
  • Cleanup — removed a typo in createUnit (jetHeliDgePenalty → the actual modifier is heliJetDgePenalty, already handled elsewhere).

If your last few games against China felt suspiciously hard — you weren't imagining it. Their economy was supposed to have a 10% production discount that wasn't actually firing. Now it is.

v0.31.11 Patch Ultimate Audit — Four Real Bugs Found And Fixed
2026-04-29

Walked all 19 unit ultimates end-to-end. Most worked correctly. Four real bugs found and fixed. One cosmetic description mismatch corrected.

  • Engineer Fortify — was fortifying the player's hovered hex (or nothing for AI engineers). Now correctly fortifies the engineer's current hex, matching the Field Manual.
  • Submarine Dive (single-player) — was lasting 1 turn instead of the documented 2 because the duration counter was being decremented twice per turn cycle. Subs now stay down the full duration.
  • Submarine Dive (multiplayer) — was even worse: subs never surfaced because the MP turn cleanup never cleared the submerged flag. Fixed.
  • AA Ship Missile Salvo — the "guaranteed hit vs air" portion of the ability was documented but never implemented (only the 2x damage and range 4 worked). Now actually guarantees a hit against air targets.
  • Recon Deep Scan description — was "Vision range 8 for 1 turn" which sounded omnidirectional. Now reads "Reveals an 8-hex directional corridor (pick an adjacent tile to set direction)" — matches the Field Manual and the actual behavior.

Confirmed working as expected: Dig In, Barrage, Strafe, Broadside, Strategic Strike, Killshot, Airdrop, Nuclear Strike, Smoke Screen, Phantom Signal, Recon Dash, Rapid Deploy, Antiair Missile Salvo, Bombing Run. Tank Blitz was already fixed in 0.31.10. AoE kills already counted toward promotion as of 0.31.8.

v0.31.10 Patch Tank Blitz Now Actually Allows Two Attacks
2026-04-29

Tank Blitz has been silently broken since v0.20.17. Activating Blitz correctly reset movement and flagged the tank for a second attack — but the v0.20.17 "no movement, no attack" rule we added later didn't carve out an exception for Blitz, and the first attack zeroes out movement. So the second attack always rejected with "has no movement left and cannot attack." For three weeks of patches, Blitz's documented "two attacks per turn" was actually one attack with extra cooldown.

  • Tank Blitz now grants two attacks per activation, as documented.
  • Player and AI both fixed — the AI's move-then-Blitz pattern correctly resolves both shots now.
  • Patch is tight: only the second-attack window is exempted, not all 0-MP attacks. attacker.attacked = true on the second hit closes the door behind it — no third attack possible.
  • City bombardment via Blitz works too — the same fix covers attackCity for tanks blasting structures with their second shot.

If your favorite tactic was "Blitz to break a stalemate" and it felt underwhelming — that's because half the ability was missing. Try it again.

v0.31.9 Patch Fog Of War No Longer Leaks From Re-Entered Draft
2026-04-29

The map and minimap are no longer permanently revealed when you go back from the draft screen and re-enter it. Repro: start a match vs AI, get to draft, click Back to the lock-map screen, click Start again. Before this fix, the entire map and minimap stayed revealed for the rest of the match — you could see every AI unit and movement through the fog.

  • Root cause: the visibility rebuilder revealed every tile during the draft preview but didn't track those writes in its dirty-tile list. The placement and play phases use that list to know which tiles to clear, so they had nothing to clean up.
  • Fix: the draft preview now records every tile it sets, so when the player confirms draft and moves to placement and play, fog is correctly restored.
  • Minimap uses the same visibility grid — this fix covers it too.
  • Saves: format unchanged, older saves load normally.

If your last AI matches felt suspiciously easy — the AI was hiding nothing. Try again with proper fog of war.

v0.31.8 Patch AoE Ultimates Now Credit Promotion Kills
2026-04-29

Kills from area-of-effect ultimates now count toward promotion. Strafe Run (helicopter), Broadside (destroyer), Barrage (artillery), and Nuclear Strike (nuclear) all bypassed the normal attack pipeline, so the firing unit's promotion progress never advanced from those kills. Most painful with helicopters — their ultimate is a kill machine, but it was contributing zero toward Veteran/Specialist/Commander promotions.

  • Strafe Run (helicopter) — kills now count.
  • Broadside (destroyer) — previously had NO tracking at all (not even end-of-game stats). Now full bookkeeping.
  • Barrage (artillery) — kills now count toward the artillery's promotion (game stats were already tracked).
  • Nuclear Strike — the firing unit self-destructs, but slain enemy commanders now correctly vacate their commander slot.
  • Combat-survived credit for promotion is also now awarded to units who participated in AoE damage and survived — same end-of-turn pass that handles normal-combat survivors.

If your "kill leaderboard" helicopter has been stuck at zero promotion progress despite a body count — that's why. It's fixed.

v0.31.7 Patch HUD Consolidation — Resources In The Bottom Panel
2026-04-29

Gold and Research Points now live in one canonical place: the bottom command panel. They sit alongside TURN, UNITS, CITIES, and FACTION, both with their per-turn income lines underneath. The duplicate counters at the top of the screen and on the Tech Tree button are gone. One place to read your economy — bottom-center, always visible.

  • RESEARCH section added to the bottom panel between GOLD and UNITS. Shows current RP and "+N/turn" income.
  • Top-left gold counter retired — just the flag and faction name now.
  • Top-right twin counter (gold-coin + flask, added in v0.31.0) retired.
  • Tech Tree button: RP badge removed; cleaner icon-and-label look.

If your eye was bouncing between three corners of the screen to track resources — that's done. One row, one read.

v0.31.6 Patch Promotion Progression Bar On Unit Information
2026-04-29

Every player unit now shows how close it is to its next promotion. The Intel Panel on the left and the bottom command-bar unit card both render a tinted progress bar — bronze for Veteran, silver for Specialist, gold for Commander — that fills toward whichever path is closest to its threshold. No more guessing whether your infantry is one combat away from Veteran or six.

  • Intel Panel — full breakdown: every promotion path (kills, combats, captures, turns-as-spec where applicable) listed with current/threshold and percent. The closest path is tinted in the next-rank color.
  • Bottom command-bar card — compact bar showing just the closest path inline with the buffs row.
  • Color coded by next rank: bronze, silver, gold.
  • ★★★ COMMANDER reached shows a gold MAX track instead of a fill, so the cap is visible.
  • ⬆ READY badge next to the path label when a promotion is pending pickup — reinforces the existing PROMOTE buff.

Worth noting: promotion thresholds are OR-gated — you only need to hit one path's number, not all of them. So the bar tracks your fastest lane to the next rank, which is what actually triggers the promotion.

v0.31.5 Patch AI Now Pays Movement Cost Before Attacking
2026-04-29

The AI no longer gets to attack with free movement. The "no movement, no attack" rule that was added in v0.20.17 was being silently bypassed by the AI: it relocates units by teleporting them (assigning row/col directly) instead of going through the same movement pipeline the player uses, and that pipeline is what deducts the path cost. As a result, the gate that checks movRemaining ≤ 0 never fired for the AI, and AI units could move-then-attack with their full MP intact regardless of distance traveled.

  • Move-then-attack — AI's path cost is now deducted before the attack resolves. If the move used all its MP, the attack is rejected just like a player's would be.
  • Standard movement — same deduction, so the post-move attack block correctly skips when no MP remains.
  • Retreat — deduction applied for consistency. A unit that retreated all the way can't turn around and attack on the same turn.
  • AI move-target simulator — also respects the prospective MP cost. The AI no longer plans attacks from positions that would zero out its MP and then waste its turn moving to a useless spot.

Practical effect: melee AI units now have to commit. They can move close and attack, OR move further without attacking — same trade-off you've been making since v0.20.9. Long-distance "free" charges are gone.

v0.31.4 Patch Terrain Density Now Actually Affects Larger Maps
2026-04-29

Low / Medium / High terrain density now produces visibly different maps at every size. The setting was working as intended for small maps but quietly broke down on anything larger than roughly 25×25 because the terrain placement loop had a hard-coded 200-attempt cap. On a 100×100 map at High density the requested forest count is around 1,400 tiles — the loop bailed at 200 every time, so all three density settings produced near-identical large maps.

  • Low density on a 100×100 map: ~280 forests now actually place (was capped at ~200 regardless).
  • High density on a 100×100 map: ~1,400 forests now actually place (was capped at ~200 — a 7× difference).
  • Mountains and small-map water share the same placement helper and benefit from the same fix.
  • Small-map behavior unchanged — the 200-attempt floor preserves the original numbers for any density target under 20 tiles.

If you've been picking maps based on a "they all feel the same" assumption, give Max + High Density another look — you'll see real forest cover this time.

v0.31.3 Patch Player Rank Shown In Personnel Dossiers
2026-04-29

Every dossier row now shows the player's rank to the left of their callsign. A tier-tinted badge displays the rank abbreviation — Pvt, Cpl, GySgt, Capt, Gen, etc. Hover the badge to see the full grade and title (e.g. "E-7 Gunnery Sergeant").

  • Rank badge rendered between the row number and the battalion tag, in the same line as the callsign.
  • Tier tinting — green for enlisted (E-1 through E-9), silver for warrant officers (W-1 through W-5), gold for commissioned officers (O-1 through O-10). Visually scannable at a glance.
  • Server-side resolution — the Dossiers endpoint now returns rank data computed by the same getRankForPlayer() helper used on the main profile page, so a player's rank is consistent everywhere it's displayed.

If you've been wondering where you stand against other commanders — sort the Dossiers by Top Wins and see how many ★★★ Commanders are ahead of you.

v0.31.2 Patch Sleeping Units Now Visible On The Roster
2026-04-29

Sleeping units are now clearly marked in the Unit Roster panel. Until now, a sleeping unit looked identical to an exhausted unit — same ✕ status icon, same 50% opacity, same "MOV 0/N" and "ATK NO" stat row. There was no way to tell at a glance which of your units were voluntarily resting versus actually out of moves.

  • 💤SLEEP label sits next to the unit name alongside the existing ⚓DEPLOYED / rank / stack-count badges.
  • Status icon for sleeping units is the 💤 moon, distinct from the ✕ used for exhausted units.
  • Stat row reads MOV ZZZ and ATK SLEEP in blue, rather than the misleading MOV 0/N + ATK NO — the unit isn't out of resources, it's resting.
  • Row chrome tinted blue with softer opacity, so sleeping rows visually cluster with "done for the turn" but read as their own state.

The MOV ▼ filter still hides sleeping units the same way it hides exhausted ones — sleeping units aren't actionable, so they don't clutter the "what can still move?" view.

v0.31.1 Patch UK HQ Income Correctly Shown As Bonus
2026-04-29

The UK's 175g/turn HQ income was being labelled a penalty even though it's a +25g/turn bonus over the 150g default. The faction-select card listed it under "Penalties," and the Field Manual called it a "Weakness" while simultaneously admitting it was higher than default. Both threads have been straightened out.

  • Faction-select card — UK's 175g HQ income now shows in the Bonuses column. Threshold logic checks against the actual 150g default (was incorrectly checking < 200).
  • MP faction-detail panel — the secondary display path had no hqIncome handling at all; now renders the bonus on the same logic as the main card.
  • Field Manual UK card — "+25g/turn HQ income (175g vs 150g default)" moved to Strengths. Weaknesses rewritten to focus on the real constraint: the 7-unit initial draft cap.

If you've been picking other factions because UK looked like it had a bad economic profile — that profile was a bug, not a balance choice. UK actually has the highest HQ income in the game.

v0.31.0 Minor Tech Tree — UI Overlay & Air Superiority Live
2026-04-28

The Tech Tree is now playable. v0.30.0 shipped the foundation; v0.31.0 ships the UI to interact with it and the first fully-resolved branch in combat. Open the tree from the bottom of the Intel Panel, watch your Research Points tick up next to your gold in the new top-right HUD, and click any unlocked node to research it.

Air Superiority is fully active. All 6 levels of the Air branch now have resolver hooks — deploy bonuses, AA reaction-fire dodge, ECM first-shot immunity, anti-ground bonuses, and the Stealth Bombers capstone. Every other branch still ticks up RP and accepts purchases, but their gameplay effects ship branch-by-branch in 0.31.x patches.

  • Tech Tree overlay — 10 branch columns × 6 level rows. Available nodes glow green; locked nodes are greyed with their requirement text; capstones get a gold border. Click to research.
  • Resource HUD swap — the AI faction flag/gold leak in the top-right is gone. In its place: a gold-coin counter and a research-flask counter for the human player. The AI's intel lives in the Intel Panel, where it should.
  • Intel Panel button — "Tech Tree" with the flask-and-gear icon, anchored at the bottom.
  • Air L1 — Jet Engine Tuning: Jet and Helicopter deploy with +1 MOV.
  • Air L2 — Targeting Pod: Jet deploys with +5 ACC.
  • Air L3 — Chaff Dispenser: air units gain +10 DGE against AA reaction fire.
  • Air L4 — ECM Suite: each air unit ignores the first AA reaction shot taken against it per turn.
  • Air L5 — Air-to-Ground: Jet attacks against ground targets get +2 ATK.
  • Air L6 — Stealth Bombers (capstone): AA fired at Bombers takes a −75% accuracy and −75% damage hit.
  • Generic stat hook in createUnit — every numeric stat (MOV/ATK/DEF/ACC/DGE/range/vision/HP) now sums in research deltas at deploy. Means future "+stat" research effects across the other 9 branches auto-apply with zero per-branch wiring.

Coming in 0.31.x: Armor (Sabot Rounds, Reactive Armor), Infantry (Squad Tactics, Forward Observer), Recon city vision, Engineering FAB cost reductions, Logistics supply lines, Command HQ aura. AI-side tech spending lands in 0.31.6.

v0.30.0 Major Tech Tree — Phase 1 (Foundation)
2026-04-28

HexArmy gets a Tech Tree. Spend Research Points each turn to unlock 60 nodes across 10 doctrines: Infantry, Armor, Artillery, Air Superiority, Naval Power, Reconnaissance, Engineering, Anti-Air, Logistics, and Command. Each branch has 5 stat-bump tiers plus a L6 capstone with a unique mechanic (Stealth Bombers, Saturation Strike, Satellite Deployment, Corpsman Up!, Sky Curtain, and more).

v0.30.0 is the foundation drop — the data model, the RP economy, save/load wiring, and the resolver helpers all ship today. The in-game Tech Tree overlay and the runtime gameplay effects roll out in 0.30.1+ patches alongside the resource HUD redesign.

  • Research Points — base 5/turn + 2 per owned city + 5 per captured HQ + 1 per FAB. Aggression scales your tech faster than turtling.
  • Faction-favored discount — each faction has one branch at −25% cost (USA: Air, UK: Engineering, Russia: Armor, China & Canada: Logistics, etc.).
  • Linear unlock — L2 needs L1, L3 needs L2, capstone L6 needs L5. No leapfrogging.
  • Save format additive — 0.20.x saves still load cleanly. Old saves get all branches at level 0.
  • Per-game tree — not meta-progression. Every new match starts fresh, so build choice is part of every game.

Coming in 0.30.1: the Tech Tree overlay, the resource HUD swap (gold-coin + flask icons replacing the AI flag/money leak), and the first wave of combat resolver hooks (Air Superiority all 6 levels as the proof-of-pattern).

v0.20.22 Patch Faction MOV Modifiers Apply On Deploy
2026-04-28

Newly drafted and produced units now use their faction-modified movement on their first turn instead of the base value. The unit-creation function was setting movRemaining = def.mov (base) before applying faction modifiers to unit.mov, so units deployed with mismatched MP — for example Iran helicopters showing 5/4 (could move 5) and India infantry showing 3/4 (could only move 3). The mismatch fixed itself from turn 2 onward but mattered immediately for Iran (whose units act on their spawn turn) and on turn 1 of every game for any drafted faction with MOV modifiers.

  • D-MOV — Single-line sync at the end of createUnit. After all faction modifiers have been applied, unit.movRemaining = unit.mov brings the displayed and usable MP into agreement.
  • Affected factions: Iran (heliMovPenalty, tankMovPenalty), India (infantryEngineerMovBonus, artilleryMovPenalty), North Korea (nonInfantryArtilleryMovPenalty), Australia (reconMovBonus), Canada (engineerMovBonus). All now show correct MP on deploy.

If you've been wondering why Iran's helicopters felt faster than they should — that's why. They were quietly cheating themselves an extra hex on the spawn turn.

v0.20.21 Patch APC Loading No Longer Freezes The Game
2026-04-28

Loading units onto an APC and ending your turn no longer freezes the game. Embarked cargo units are stored at (row=-1, col=-1) while inside the carrier so they don't render on the map. The AI's spatial-index builder — called every enemy turn — was using Math.floor(-1 / 5) = -1 to bucket them, producing a negative array index that crashed with Cannot read properties of undefined (reading 'push'). The throw killed the AI turn chain and the game appeared frozen.

  • D-APC — Spatial index ignores off-map entities. SpatialIndex.build() now skips any entity with negative coordinates or embarked = true. Two-line guard, fixes the crash directly.
  • D-APC — Embarked cargo excluded from AI targeting. getEnemyUnitsForSlot and getOwnUnitsForSlot filter out embarked units so threat maps, targeting, and the "all enemies destroyed" check all behave correctly.
  • D-APC — aiActUnit wrapped in try/catch. If any AI unit throws an unhandled exception, the error is logged to console and the unit is marked done so the rest of the turn proceeds. No more silent freezes from a single bad unit.

This affects both the player's APC + Transport loading and AI-driven loading. Existing carriers in saved games will work without any further intervention.

v0.20.20 Patch Field Manual Rewrite
2026-04-28

The in-game Field Manual is now in sync with how the game actually plays. Roughly 80 stats and rules across all 9 sections were out of date — unit costs were off by 2-3x, draft budgets were wrong for most factions, garrison costs were ~2.6x what the manual claimed, the NZ-only force cap doctrine wasn't documented, and the move-then-attack rule (v0.20.9) wasn't anywhere in the manual at all. Every section was audited against the actual game data and rewritten where needed.

  • Overview — documents the move-then-attack rule and Assault Infantry exemption, multi-AI 1v1/1v2/1v3 matches, all 8 map types, terrain density options, and the unit cycle / sleep controls.
  • Factions — all 10 factions are now documented as player-pickable. Each entry has the correct draft budget, doctrine, strengths, weaknesses, and play tips. New Force Cap Rule section clarifies that only NZ has an alive-units cap.
  • Units — 21 unit cost cells corrected. Specialist unit list expanded. Passives and ultimates now match UNIT_DEFS exactly.
  • Terrain — FOB, FAB, and Port now properly distinguished. Movement-cost table expanded to cover all unit categories.
  • Combat — new section on the move-then-attack rule. Damage formula updated to current factors. Special attack rules (snipers, mortars, bombers, subs, AA, min-range) called out.
  • Promotions — Assault Infantry correctly described as "attack with 0 MP, one attack per turn" (per the v0.20.9 rework).
  • Economy — HQ income 150g (UK 175g), garrison costs 525g/800g/400g, force cap rule, engineer camp construction, damaged-city production multiplier.
  • Advanced — updated vision table (Scout 5, Recon 4, etc.), multi-AI match documentation, AI difficulty per slot.
  • Strategy Tips — rewritten to cover all 10 factions on both sides of an engagement.

If you've referenced specific manual numbers in past planning, those numbers are now reliable. Future rebalances should update the manual alongside the game data.

v0.20.19 Hotfix Restored Truncated Build
2026-04-28

v0.20.18 shipped with a corrupt index.html — the inline <script> block was truncated mid-statement, leaving every JS event handler unbound and every main-screen button dead. v0.20.19 restores the missing tail (the rest of the disconnect-overlay timer, the PvP chat helper, the init() call that wires up the page, and the closing </script></body></html>) and bumps the version so it's clearly distinguishable from the broken build.

All v0.20.16, v0.20.17, and v0.20.18 changes ship intact: NZ-only force cap, AI movement-gated attacks, 10x10-start fix, start-flow diagnostics, server version stamp.

Apologies for the broken build — v0.20.18 should never have shipped without a parse-check on the inline script. CI guard is on the followup list.

v0.20.18 Patch 10x10 Maps Start Cleanly
2026-04-28

Caught the actual cause of the 10x10-cannot-start bug, thanks to v0.20.16's diagnostic envelope. The error was a stale-visibility-list bug: after playing on a larger map (default 20x20) and then trying to start a 10x10 game, the visibility tracker still held tile coordinates from the bigger grid. The first visibility pass for the new game tried to clear row 15 on a 10-row grid, threw Cannot set properties of undefined (setting '2'), and the new try/catch envelope showed it cleanly in the alert.

  • D-DIMS — Purge tile-tracking lists when dimensions change. applyMapDimensions() now nulls _visGrid, _discoveredGrid, _aiVisGrid AND clears _visibleTiles, _aiVisibleTiles. The previous code only nulled _visGrid, leaving the tile lists pointing at rows that no longer existed.
  • D-DIMS — Same purge on exit-to-home. Players who finish a game, return to home, then start a different-sized one are also covered.
  • D-DIMS — Bounds check in the visibility loops. A defensive guard inside each for (const vt of _visibleTiles) skips any entry outside the current grid bounds. If a future code path forgets to clear the list on map-size change, the fallback prevents a hard crash.

10x10 maps now start cleanly from any prior state — first launch, after a 20x20 game, after exit-to-home, etc.

v0.20.17 Patch AI Plays By The Same Attack Rules
2026-04-27

The 0-movement attack ban now applies to every unit on the board, not just yours. v0.20.9 introduced the rule for player units: spend all your MP on movement, you don't get to attack that turn (Assault Infantry exempt). The AI was supposed to follow the same rule, but a couple of attack-after-move branches in aiActUnit() computed targets directly and bypassed the UI-side gate. v0.20.17 closes that.

  • D-PROMO2 — Centralized in the combat resolvers. The 0-MP check now lives at the top of doAttack() and attackCity(), so every caller — player UI, AI, and any future multiplayer/scripted path — is uniformly gated. Belt-and-suspenders with the existing getAttackableHexes() gate (which shapes the player's targeting UI).
  • D-PROMO2 — Assault Infantry exemption preserved on both sides. Player and AI Infantry that have earned the Assault Veteran promotion can still attack with 0 MP, one attack per turn. This isn't a nerf to anyone — it's the rule the player has always seen, now consistently enforced for the opposition.
  • D-PROMO2 — Silent reject for AI. The combat log only emits a "no movement left" line when the player would have seen the attempt, so AI bookkeeping doesn't pollute the feed.

Practically: you'll notice fewer "how did that AI unit get an attack after running across the map" moments. Tactically it tightens late-turn AI positioning — the AI now has to choose between closing distance and attacking, just like you.

v0.20.16 Patch Force Cap Narrowed To NZ · Start-Flow Diagnostics
2026-04-27

Course-corrects the v0.20.14 force cap and adds the diagnostic plumbing to chase down the remaining 10x10-start and stats-not-updating reports. The cap was applying to too many factions and quietly hard-locking USA at 7 alive units mid-match. The start flow was throwing silently on 10x10 boards. The stats deploy state was not visible from the client. All three are addressed here.

  • D-CAP — Force cap is a New Zealand doctrine, not a universal rule. v0.20.14 extended NZ's maxDraft: 6 alive-unit cap to every faction with a maxDraft modifier — which silently capped UK at 7 alive units, blocking replacement production after a single casualty. Fixed: produceUnit() and showProduceMenu() now only enforce the cap when playerFaction === 'newzealand'. Every other faction can field replacements without limit. UK's maxDraft: 7 still constrains the initial draft.
  • D-START — Diagnostic envelope around the start flow. The Start Game button click, beginGame(), the initMap() call, and the startDraft() setTimeout callback are all wrapped in try/catch with [START]-tagged console logs. Previously a thrown exception in the 500ms draft-init timer was silently swallowed. Now any failure surfaces in F12 with the precise function name + stack trace, and the user sees a gameAlert instead of a stuck overlay.
  • D-START — Multi-AI HQ placement floor relaxed for small maps. The 10-hex minimum HQ separation was unreachable on a 10x10 board's 14-hex diagonal, forcing the fallback path every time and potentially leaving HQs clustered. On maps under 400 tiles, the floor drops to 3.
  • D-STATS — Server stamps its version in every response. POST /api/stats/game now returns serverVersion: '0.20.16'. The client logs that field in its [STATS] OK line so the user (and devs) can confirm at a glance whether the deployed server is current. The server also logs a REJECT 400 line listing each missing field on payload validation failures.
  • D-STATS — Client logs the full stats payload. finalizeGameStats() prints the exact body before the POST and again on failure, plus a pre-flight warning when any required field is missing — so the user can paste a single F12 line that tells us whether their stats failure is a payload bug, a server reject, or stale-deploy.

If you reported "stats still not updating" after v0.20.15, the next time you finish a match please open F12 (DevTools), find the [STATS] lines, and share what you see — that single line will pinpoint the failure mode.

v0.20.15 Patch Stats Actually Update (For Real This Time)
2026-04-27

Found a deeper silent-failure mode that explains why some players' Dossiers still weren't updating after v0.20.13. The server's UPDATE player_stats query was a no-op for any user without a pre-seeded player_stats row — the transaction committed cleanly, the endpoint returned 200 OK, the client logged success, but zero rows actually changed. v0.20.13 fixed the client side; v0.20.15 fixes the server side.

  • D-STATS — Upsert before update. The server now INSERT INTO player_stats (user_id) VALUES ($1) ON CONFLICT (user_id) DO NOTHING immediately before the UPDATE, guaranteeing a row exists. No more silent zero-row updates.
  • D-STATS — Server observability. Every /api/stats/game POST now logs [stats/game] OK user_id=X callsign=Y result=victory faction=usa turns=15 on success and a WARN if the UPDATE somehow still affects 0 rows. Future regressions will be visible in pm2 logs hexarmy immediately.
  • D-STATS — Client diagnostic logging. finalizeGameStats() now prints [STATS]-tagged console lines at every key checkpoint: entry, retry attempt, bail-out, and successful POST. F12 in any future "stats not updating" report will surface the exact failure point in seconds.

Same caveat as v0.20.13: matches that failed silently before this build cannot be retroactively recovered. From v0.20.15 forward, every match POSTs cleanly.

v0.20.14 Balance Force Cap, All The Time
2026-04-27

The faction maxDraft cap now applies to total alive units at any time, not just initial draft. Previously, New Zealand could draft 6 units, lose 2 in combat, then produce 4 more from a city — climbing to 8 alive units, blowing past the doctrine. That loophole is closed.

  • D-36 — Production cap. When you open a city's production overlay, all unit cards are disabled if you're at or above your faction's cap. A red banner explains the cap (e.g. "Force cap reached (6 / 6). Lose a unit before recruiting more."). The actual produceUnit() function also rejects with a clear alert — defence in depth.
  • The math. NZ caps at 6, USA at 7, all other factions at 8. Counts only alive player units (HP > 0). Killed units free up cap space immediately, so attrition replacements still work as intended.
  • Why this matters for NZ. "Lean Volunteer Force" is now actually lean. You commit to 6 units, you lose them carefully, and every casualty is a real loss until the next opening. That's the doctrine working as designed.
v0.20.13 Patch Game Stats Reach the Server
2026-04-27

Steam-authenticated games now correctly update your Dossier. A latent bug was silently dropping every game's stats on the floor: Steam auto-login completed and gave you a session, but the client-side playerAccount variable never refreshed, so finalizeGameStats() bailed out at its first guard and nothing got POSTed to /api/stats/game. Wins, losses, kills, damage — all lost.

  • D-35 — Auto-login state propagation. The Steam autoLogin success path was calling a refreshAuthState() hook that didn't exist anywhere in the codebase, so the typeof === 'function' check silently skipped it. Now calls loadAccount() directly — which actually exists and correctly hydrates playerAccount, playerStats, and the rest of the auth-derived UI state.
  • D-35 — Belt-and-suspenders retry in finalizeGameStats. If playerAccount is still null when a match ends (e.g. timing race where Steam autoLogin completed mid-match), finalizeGameStats() now does one loadAccount() retry before giving up. Last line of defence against silently-dropped match results.

If you played any matches between v0.20.7 and v0.20.13 via Steam, those games are not retroactively recorded — but every match from v0.20.13 forward will land in your Dossier the way it should.

v0.20.12 QoL Personnel Dossiers, Always Open
2026-04-27

Dossiers now load automatically every time you open the panel. No more clicking Search on an empty input to populate the list — the moment you click Dossiers, the panel fetches every public player (sorted by Top Wins by default) and shows you who's on the server.

  • D-34 — Auto-load on open. Removed the cache guard that was suppressing reloads on subsequent opens. Each open now resets the search box, snaps to page 1, and re-fetches the current "all players" view.
  • Sort persistence. Your selected sort (Top Wins, Top Kills, Top Streaks, Most Decorated, Recent) carries over between opens within a session. You only have to set it once.
v0.20.11 Patch Steam-Only Distribution
2026-04-27

HexArmy now distributes exclusively through Steam. The standalone-installer auto-update channel has been retired in favour of Steam's native update system.

  • Steam players see no change. Updates continue to arrive automatically through the Steam client.
  • Standalone installs (pre-Steam) keep working at their current version. The in-game "Update Available" modal has been removed; existing installs will no longer prompt to download updates. To receive future updates, install HexArmy through Steam.
  • Server cleanup. The legacy /api/version and /updates/ endpoints have been retired. The Tauri custom updater code (Rust + JS modal) is gone too — one update channel, one source of truth.
v0.20.10 Patch Steam Players in Dossiers
2026-04-27

Three-part fix so Steam-authenticated players appear in the Personnel Dossiers panel as soon as they sign in — not only after they finish their first match.

  • D-34 — Default Dossiers list now includes Steam users with zero games. The browse list previously hid any account with games_played = 0. Steam players who launched the desktop app and signed in but hadn't completed a match yet were invisible until you searched their callsign. The filter now also lets through any account with a linked steam_id, so Steam players appear immediately.
  • D-35 — Pre-existing accounts that link Steam are now retroactively visible. The Steam login UPDATE branch did not flip profile_public from FALSE to TRUE, so any account created before Steam auth shipped (or with a manually-set FALSE) stayed hidden even after linking a Steam ID. The UPDATE now sets profile_public = TRUE on every Steam sign-in, mirroring the new-account INSERT.
  • D-36 — Clear server warning when STEAM_WEB_API_KEY is missing. Without the key, every Steam sign-in returned HTTP 500 silently. The server now prints a multi-line warning at boot if the key is unset or doesn't look like a 32-char hex string, explaining the downstream effect on Dossiers visibility.
v0.20.9 Patch Tactical Cleanup
2026-04-26

Five tactical bug fixes reported from playtest. Map clarity, production rules, faction limits, and the Infantry Veteran promotion all tightened.

  • D-29 — Minimap during draft. The minimap could leak into the draft screen on some transitions. Now hard-guarded: renderMinimap() early-returns during draft, and the container is explicitly hidden the moment the draft phase starts.
  • D-30 — Production on occupied hex. You could buy a new unit on a city tile while the capturing unit was still on it, stacking two units on one hex. Now blocked: produceUnit() checks for an existing unit and shows "A unit is already on this city. Move it off the city tile first."
  • D-31 — New Zealand draft cap. NZ's "Lean Volunteer Force" doctrine declares a 6-unit max but the cap was hardcoded to 8 in three places. The faction's maxDraft modifier is now actually honoured in the draft logic, count display, and disabled-card state. NZ caps at 6, USA at 7, everyone else at 8.
  • D-32 — Field Manual right-click claim. The manual said you could deselect with right-click, but right-click was never wired up. The hint now reads "Click an empty hex or press ESC."
  • D-33 — New movement rule: attacking now requires at least 1 MP. A unit that has fully exhausted its movement points can no longer also attack on the same turn. This adds a meaningful tactical decision: do you advance into striking range now and shoot, or close the gap and finish next turn?
  • D-33 — Infantry Veteran "Assault" promotion reworked. The old description ("Can move AND attack, +1 ATK, +1 HP") was a no-op — units already could move and attack. The new "Assault" is a real combat promotion: +2 ATK, +1 HP, and the ability to attack even with 0 MP remaining (one attack per turn). It's the only way to fully advance AND strike in the same turn — turning Veteran infantry into the backbone of the assault wave.
v0.20.7 Feature Steam Authentication & Dossiers
2026-04-26

Steam players now appear in Dossiers. When you launch HexArmy through Steam, the game silently authenticates your Steam ticket against Valve's Web API, creates (or refreshes) your server-side dossier, and surfaces you in the global Dossiers panel. No login form, no second password — just play.

  • D-STEAM — Steam ticket auth. New POST /api/auth/steam-login endpoint validates Steam auth-session tickets via ISteamUserAuth/AuthenticateUserTicket. Returns a session cookie identical to email/password login.
  • D-STEAM — User schema. users table gained steam_id, steam_persona_name, steam_avatar_url, steam_last_seen. Steam users default to profile_public = TRUE so they appear in Dossiers immediately.
  • D-STEAM — Callsign collision handling. If your Steam persona name is already taken by another HexArmy player, the system appends your SteamID3 suffix (e.g. Andrew_4321) so you don’t collide.
  • D-STEAM — Profile enrichment. GetPlayerSummaries pulls your Steam avatar URL on first login and refreshes it on every launch. Surfaces nicely in Dossier cards (UI work pending follow-up).
  • D-FOG2 — Faction reveal modal trap fixed. The "Intelligence Report" modal can now be dismissed by clicking the dark backdrop, pressing Escape, or by the ACKNOWLEDGED button (now always visible — max-height capped to viewport with internal scroll).
  • D-FOG2 — AI counter-attack crash fixed. A defIsHuman is not defined ReferenceError was breaking the AI turn whenever an AI attack landed AND the player’s counter-attack also hit. The two stat-tracking variables are now hoisted to function scope.
  • D-FOG2 — AudioContext double-close guarded. Closing the faction reveal music context twice no longer throws InvalidStateError.
  • D-FOG2 — Player-owned cities never fall under fog. The structure-vision pass now force-rebuilds its cache on every visibility update, so captured cities and ally cities stay visible even when units move away.
v0.20.6 Patch Responsive Layout Pass
2026-04-26

Smaller-screen polish across the entire game. Game setup, faction selection, theater of operations, draft, multiplayer lobby, and the in-game HUD now fit cleanly at 1280×720 minimum. Specifically tuned for Steam Deck (1280×800) and 14-inch laptops (1366×768) where panels and headers used to crowd the map.

  • New short-screen breakpoints at 820px and 720px height — reduces top/bottom HUD bar height so the map keeps real estate on the Steam Deck and on 14″ laptops.
  • Tightened 1280px-wide breakpoint — left/right sidebars now scale down sooner, font scale tuned, fewer pixels wasted on chrome.
  • Faction selection / Theater of Operations — header and grid spacing now use viewport-relative units so the map preview never gets pushed off-screen.
  • Draft screen — title and budget rows now scale; unit grid stacks to a single column at ≤1100px width so cards aren’t squeezed into 4-letter labels.
  • Multiplayer lobby — left panel width now fluid; both column headers scale.
  • Modals (intel, Field Manual, medals, stats) — max-heights now relative to viewport; medal-layout left column shrinks at narrower widths.
  • Home screen panels — padding and section headers now scale with viewport so the home overlay no longer clips on short screens.
v0.20.5 Maintenance Maintenance Build
2026-04-26

Routine version bump — no functional changes. Carries forward all v0.20.4 victory-condition polish (D-25 through D-28) and v0.20.3 fixes. Issued to keep the auto-updater channel and installer artifact aligned with the current build.

v0.20.4 Patch Victory Condition Polish
2026-04-26

D-25 — HQ Takeover Elimination Fix: HQ Takeover victory mode no longer eliminates a player when all their troops are destroyed if their HQ still stands. Only capturing the HQ eliminates a player in this mode.

D-26 — Advance-on-Kill City Bypass Fix: Units no longer advance onto enemy cities with active defenses (HP > 0) after killing a defending unit. The attacker stays in place and the log reports “city defenses hold.”

D-27 — Disband Units on Elimination (HQ Takeover): When a player is eliminated in HQ Takeover or Infantry Only mode, all their remaining units are disbanded and removed from the battlefield.

D-28 — Neutralize Cities on Elimination (Military Annihilation): When a player is eliminated in Military Annihilation mode, all their cities, HQ, and camps revert to neutral ownership and can be captured by remaining players.

v0.20.0 Major Update Operation Overmatch — Multi-AI & 10,000-Tile Battlefields
April 25, 2026

One commander. Multiple fronts. Ten thousand hexes. Fifteen milestones engineered to put solo commanders against two and three thinking AI opponents on battlefields ten times the size of anything we've shipped before.

v0.16.7 Fix Rendering, AI Draft & CSP Fixes + M-8 Network Compression
April 25, 2026
v0.16.6 Fix Multiplayer Lobby Overhaul
April 12, 2026
v0.16.5 Fix FOB Immediate Visibility Fix
April 12, 2026
v0.16.4 Fix Victory Condition & Lobby Button Fixes
April 7, 2026
v0.16.3 Fix Lobby Button Click Fix
April 7, 2026
v0.16.2 Fix Multiplayer Lobby Settings Sync
April 7, 2026
v0.16.1 Fix Map Type & Desktop Multiplayer Fix
April 7, 2026
v0.16.0 Feature Steam Matchmaking
April 7, 2026
v0.15.9 Feature Player Ticket System
April 7, 2026
v0.15.8 Feature Admin Command Center
April 7, 2026
v0.15.7 Feature Steam Cloud Saves April 7, 2026
Steam — Cloud Save
  • Steam Cloud integration — Game saves are now synced to Steam Cloud via the Remote Storage API. Players can save on one machine and resume on another seamlessly.
  • Dual-write saves — When saving a game on the desktop app, the save is written to both the HexArmy server and Steam Cloud simultaneously. Deletes are also mirrored.
  • Cross-machine sync on launch — On desktop startup, all 3 save slots are compared between server and Steam Cloud. The newer save wins, and missing saves are restored in both directions.
  • 6 new Rust commandssteam_cloud_status, steam_cloud_list_files, steam_cloud_write, steam_cloud_read, steam_cloud_delete, and steam_cloud_file_exists exposed as Tauri invocations.
v0.15.6 Improvement Auto-Update & Support April 6, 2026
Desktop — Auto-Update
  • Steam-aware updater — The custom auto-updater now detects when running via Steam and skips entirely, deferring to Steam's native update system. Prevents duplicate prompts and installer conflicts.
  • Fixed version drift — Cargo.toml version was stuck at 0.15.0 while tauri.conf.json advanced, causing get_app_version() to report the wrong version and trigger false "update available" prompts for all standalone users.
  • Build script version syncbuild-and-sign.ps1 now auto-syncs Cargo.toml version from tauri.conf.json before building, preventing future drift.
  • Release date in update modal — The update notification now shows the release date alongside version and release notes.
v0.15.5 Feature Steam Stats Integration April 6, 2026
Steam — Stats
  • 25 Steam Stats — All tracked game statistics now sync to Steam: games played/won/lost, combat stats (kills, damage dealt/received), objective stats (cities captured, camps built, ultimates used, gold earned), records (best kills, fastest victory, perfect victories), win streaks, hard mode stats, clutch wins, rank XP, and multiplayer stats.
  • Real-time sync — Stats push to Steam automatically after every completed match via efficient batch update (single API call for all 25 stats).
  • Bulk sync on launch — Desktop app syncs all cumulative stats to Steam on startup, ensuring web-earned progress is reflected in the Steam client.
  • Steamworks partner config — Upload script and VDF config ready for partner portal registration.
UI — Support
  • In-app support modal — Submit bug reports, feature requests, and feedback without leaving the game. Accessible via the "Support" link in the home screen footer. Auto-fills your callsign, platform, and game version.
v0.15.4 Improvement Audio Cleanup April 6, 2026
Audio
  • Removed old ambient loops — Removed pre-v0.15.2 ambient drone, wind, tension, heartbeat, and radio chatter sound loops that were superseded by the new 9-track background music system.
  • Simplified audio settings — Removed the Ambient volume slider. Audio panel now has Master, Music, and SFX controls.
  • Streamlined phase audio — Phase transitions now only control background music playback (play/pause) rather than managing multiple ambient loop layers.
v0.15.3 Feature Steam Achievement Mapping April 6, 2026
Steam — Achievements
  • 100 achievements mapped — All game achievements now sync to Steam when unlocked. Achievement API names match between the server database and Steam’s achievement system for seamless integration.
  • Real-time sync — When you earn an achievement in-game, it immediately unlocks on Steam with the overlay notification.
  • Bulk sync on launch — Desktop app automatically syncs any achievements earned on the web to your Steam profile when you launch the game. Checks each achievement to avoid redundant API calls.
  • Steamworks VDF config — Achievement definitions exported in Valve’s VDF format, ready for upload to the Steamworks partner portal. Includes display names, descriptions, and hidden flags for ultra-rare achievements.
v0.15.2 Feature Background Music & Desktop Fix April 6, 2026
Audio — Background Music
  • 9 music tracks — Military-themed background music plays during draft, placement, and battle phases. Tracks are shuffled and auto-advance when each one ends.
  • Skip Track button — New “Skip Track” button in the audio settings panel lets players advance to the next track at any time.
  • Volume control — Music volume is controlled by the existing Music slider in the audio settings panel. Master volume and Mute All also affect music playback.
  • Phase-aware playback — Music starts when entering gameplay (draft/placement/battle) and pauses in menus and on victory/defeat screens.
Desktop — Bug Fix
  • Console window removed — The DevTools console window no longer appears when launching the desktop app in release builds.
  • Steam DLL bundling — Fixed steam_api64.dll not being included in the NSIS installer. The build script now automatically copies the DLL from steamworks-sys output.
v0.15.1 Feature Support Form April 6, 2026
Community — Support System
  • Support page — New support.html page where players can submit bug reports, feature requests, and general feedback directly from the website.
  • Ticket categories — Three submission types: Bug Report, Feature Idea, and General comment. Each ticket captures platform, game version, callsign, and optional contact email.
  • Ticket tracking — Every submission receives a unique reference number (HX-XXXXXX) for follow-up. Tickets are stored in the database with status tracking and admin notes support.
  • Rate limiting — Support submissions are rate-limited to 5 per 15 minutes per IP to prevent abuse.
  • Auto-detection — Game version is auto-filled from the server’s version endpoint. Logged-in users are automatically linked to their account.
v0.15.0 Feature Steamworks API Integration April 6, 2026
Steam — Platform Integration (S-1)
  • Steam authentication — The desktop client now connects to Steam at launch. SteamID, persona name, and logged-on status are available to the game. Auth session tickets can be generated for server-side identity verification.
  • Steam overlay — The Steam overlay can be opened to friends, community, achievements, or any URL directly from the game. Overlay availability is detected and reported.
  • Achievements & stats — Full achievement API: unlock, query, and clear achievements by API name. Integer stats can be read and written. Stats are automatically persisted to Steam Cloud.
  • Friends list — Query Steam friends with online/offline status for future social features and matchmaking.
  • Graceful fallback — If Steam isn't running, the game operates normally in non-Steam mode. All Steam API calls return safe defaults with no errors surfaced to the player.
  • Background callbacks — A dedicated thread runs Steam callbacks every 100ms, ensuring overlay events, achievement notifications, and auth responses are processed promptly.
v0.14.1 Feature 6-Direction Unit Sprites April 6, 2026
Visual — Directional Sprites
  • 504 new sprite variants — Every unit type (21) across all team colors (4) now has 6 unique directional sprites: E, NE, NW, W, SW, SE. Units visually face the direction they moved with distinct rotation, perspective, and lighting per direction.
  • 6-direction facing system — Replaced the 2-direction left/right flip with a proper hex-direction system. getHexDirection() computes the exact hex direction from movement paths, and both renderers select the correct pre-rendered sprite variant.
  • Direction-aware animation — During movement animations, the sprite updates per path segment to show the correct facing for each step of the move.
  • Perspective effects — NE/NW sprites lean back with slight vertical compression (away from camera). SE/SW sprites lean forward with subtle stretch (toward camera). E/W are standard orientation.
v0.14.0 Feature AI Fog of War & Faction Awareness April 6, 2026
AI — Fog of War (P-3)
  • AI vision system — AI now computes its own fog of war grid using the same rules as the player: unit vision radii, line-of-sight, desert/plains bonuses, radar directional scans, deep scan reveals, city/camp vision, and smoke blocking.
  • Difficulty scaling — Easy AI remains omniscient. Medium AI gets +1 bonus vision range. Hard AI plays under strict identical fog of war rules.
  • Vision-filtered decisions — Threat maps, target selection, production counter-building, vulnerable city scouting, and retreat decisions all operate on visible player units only. AI vision rebuilds after each unit acts to reflect newly revealed areas.
  • Stealth & submarine rules — Snipers, PsyOps (Ghost Protocol), and submerged submarines remain invisible to the AI unless an AI unit is adjacent, matching the player's stealth detection rules.
AI — Faction Awareness (P-4)
  • Medium difficulty upgraded — All 10 faction strategies (draft orders, production weights, tactical priorities, retreat thresholds, camp priorities, income raiding, terrain preferences) now activate on Medium, not just Hard.
  • Faction-aware production — Medium AI blends 50% faction weights with 50% generic weights for a balanced but faction-flavored army composition. Counter-building remains Hard-only.
  • Faction-aware targeting — Medium AI receives lighter faction targeting bonuses: Iran flanks, USA prioritizes air, NZ rushes cities, Russia finishes weak units, UK maximizes damage per shot.
  • Faction-aware movement — Medium AI uses faction terrain preferences (India seeks mountains, Canada prefers forests, NK holds cities) and faction aggressiveness to weight movement decisions.
  • Faction-aware drafting — Medium AI now uses the faction draft order instead of the generic order, producing doctrinally correct starting armies.
  • Move-to-attack & retreat — Medium AI now evaluates optimal repositioning before attacking and uses faction-specific retreat thresholds.
v0.13.9 Feature Unit Facing Direction April 6, 2026
Visual
  • Units now face their movement direction — Sprites are horizontally flipped based on direction of travel. Units face right when moving right and face left when moving left, making it much easier to read unit intent and track AI actions.
  • Animation-aware facing — During movement animation, sprites update facing per path segment so units visually turn as they follow multi-step routes.
  • Advance-on-kill facing — When a melee unit kills a defender and advances into the hex, the sprite faces the direction of the advance.
  • Initial spawn facing — Player units spawn facing right (toward the enemy), AI units spawn facing left (toward the player).
v0.13.8 Feature Sort Units by Cost April 6, 2026
Draft & Production
  • Force Composition sorted by cost — The draft screen now sorts all available units by their effective cost (cheapest first), taking faction cost modifiers into account. Previously, units appeared in a fixed hardcoded order.
  • Production menu sorted by cost — The city/HQ/camp production menu also sorts units by effective cost, with bombardment damage cost increases reflected in the displayed price.
v0.13.7 Feature Structure HP Bars April 6, 2026
Map Rendering
  • Structure HP bars (isometric view) — Cities, HQs, FOBs, FABs, and Ports now display a color-coded HP bar directly on the hex tile in isometric view. The bar is green above 50% HP, orange between 25–50%, and red below 25%. An HP fraction (e.g., “7/10”) is shown below the bar.
  • Faction flags on structures — Owned cities and HQs now display the controlling faction’s flag above the tile in isometric view. Neutral structures show no flag.
  • Defense shield icon — Structures with active garrison or HQ guard defenses show a shield icon on the tile.
  • Bombardment damage overlay — Structures taking bombardment damage display the damage percentage (e.g., “40% dmg”) in red below the HP bar.
  • Flat view expanded — The existing flat-view HP bars now also cover FOBs, FABs, and Ports, matching the isometric view’s coverage.
v0.13.6 Bugfix Ultimate Ability Timing Fix April 6, 2026
Ultimate Abilities
  • Turn-start restriction — Ultimate abilities can now only be activated at the very start of a unit’s turn, before any move or attack action. Previously, units could move into position and then activate their ultimate, allowing unintended combos like repositioning before Dig In or moving a scout then using Deep Scan without the expected action cost.
  • Disabled button feedback — When a unit has already moved or attacked, the ultimate button now appears grayed out with a “Turn Start Only” label instead of disappearing, so players understand why the ability is unavailable.
  • Safety guard — Added a validation check in the activateUltimate function to prevent activation after move/attack, even if the UI check is bypassed. AI ultimate usage is unaffected as AI always evaluates ultimates before acting.
Auto-Updater
  • Fixed download URL routing — The “Install Update” button appeared to work but the app always reopened on the old version. The server was returning the game’s HTML page instead of the actual installer because the /updates/ directory wasn’t being served. Added both an Express static route and an Nginx location block to correctly serve installer files.
  • Content-type validation — The desktop updater now checks that the downloaded file isn’t HTML before attempting to run it as an installer. If the server returns the wrong content, the user sees a clear error message instead of a silent failure.
v0.13.5 Bugfix Victory Conditions & AI Capture Fix March 28, 2026
Victory System
  • AI city/HQ capture — Fixed a critical bug where AI units could move onto enemy cities and HQs but never actually capture them. AI movement bypassed the capture logic entirely, meaning the AI could never win by HQ Takeover or contribute to Complete Domination victory.
  • Victory check logging — Added comprehensive console logging to the victory condition system. All victory checks now log the current state (HQ ownership, city counts, unit counts, victory mode) to help diagnose any future issues.
  • Capture diagnostics — When a unit lands on a city/HQ but cannot capture it (wrong unit type, HP not zero), a diagnostic log is now emitted explaining why.
Victory Modes Verified
  • All 5 modes reviewed — HQ Takeover, Military Annihilation, Complete Domination, Infantry Only, and Survival 20 victory conditions have been audited and confirmed correct.
v0.13.4 Feature Naval Sprites & Updater Fix March 28, 2026
Naval Sprites
  • AA Ship sprites — New Arleigh Burke-class destroyer sprites for the Naval Anti-Air unit across all 4 team colors (blue, red, green, yellow).
  • Transport sprites — New carrier/LHD-style ship sprites for the Transport unit across all 4 team colors, replacing the old patrol vessel art.
  • Sprite mapping fix — Transport units now correctly load the naval_transport sprite instead of looking for a missing transport.png. AA Ship added to sprite preloader.
Auto-Updater
  • Robust update mechanism — Rewrote the desktop auto-updater to use a self-cleaning batch script that properly waits for the app to exit, runs the NSIS installer in passive mode, relaunches HexArmy, and cleans up temp files. Fixes “The system cannot execute the specified program” and “The batch file cannot be found” errors.
Build & Deploy
  • Sprite deployment — Build script now uploads the entire sprites directory to the server during deployment.
v0.13.3 Feature Naval & Transport Update March 28, 2026
Naval Production
  • Coastal city naval production — Cities and HQs adjacent to water tiles can now produce naval units (Destroyer, Submarine, Transport, AA Ship). Naval units spawn on the nearest empty water tile.
  • AI coastal production — AI can also produce naval units from coastal cities, enabling naval warfare on maps without dedicated ports.
Transport System
  • Board Transport action — Land units adjacent to a friendly Transport ship now display a “Board” button to embark. Foot and tracked units can board (capacity 3).
  • Unload All — Transport units with cargo show an “Unload All” button that automatically distributes embarked units to adjacent passable tiles. Units that can’t deploy (no valid land tiles nearby) stay aboard until next turn.
  • Individual unload — You can also unload units one at a time, choosing which unit to deploy first.
  • Cargo manifest — Transport action bar shows which units are currently aboard.
  • Cargo destruction — If a Transport is destroyed, all embarked units are lost (same as APC).
Isometric Buildings
  • FOB structures — Forward Operating Bases now render with sandbag perimeter, olive command tent, and supply crates in isometric view.
  • FAB structures — Forward Air Bases show a diagonal runway with threshold markings, quonset-hut hangar, and orange windsock.
  • Port structures — Ports display wooden pier with planks, warehouse building, crane with cable and hook, bollards, and water ripples.
Intel Panel
  • Graphical intel cards — Enemy intel cards now show inline threat level bars, territory control bars, K/D ratios, unit type breakdown tags, and combat record summaries.
  • Enhanced Military tab — Force composition bar chart by movement class (infantry/armor/air/naval), unit roster with average HP bars, and scrollable tracking data.
  • Enhanced Strategic tab — Stacked territory control bar, visual kill/loss comparison bars, and large K/D ratio display.
Bug Fix
  • Isometric zoom/pan completely fixed — All zoom handlers (wheel, keyboard, pinch, double-tap, gamepad) now use iso-specific coordinate math. Pan clamping centers correctly around the iso grid center, not the origin.
v0.13.2 Fix Zoom & Pan on Large Maps March 28, 2026
Bug Fix
  • Zoom no longer jumps or drifts — Removed the center-pull that fought zoom-toward-cursor, causing the viewport to slide away from where you were pointing.
  • Smooth pan clamping — Replaced the hard branch in pan clamping (grid fits vs. doesn't fit viewport) with a unified formula. The old code snapped pan to ±20px when the grid barely fit the canvas, causing violent jumps when zooming out on large maps.
  • Minimum zoom lowered to 0.5x — Large maps (30×30+) can now zoom out further to see the full battlefield.
  • Pan limits scale properly — Navigation range now smoothly scales from minimal drift when the map fits the viewport to full navigation with small overscroll on large maps.
  • Isometric view pan fixed — Pan clamping was using the flat view's grid dimensions, but the isometric renderer produces a grid 2–3× larger on screen (due to WORLD_HR-based coordinates and iso projection). Added _isoGridScreenExtent() to compute actual iso grid bounds, so pan limits match what's rendered.
v0.13.1 Fix Auto-Updater Restart March 28, 2026
Bug Fix
  • App now exits and restarts after update — Fixed missing process:allow-exit permission in Tauri capabilities that prevented the app from closing during updates.
  • Silent install with auto-relaunch — Updates now run the NSIS installer silently (/S flag) via a helper script that waits for the app to close, installs the update, and automatically relaunches HexArmy.
  • Fallback exit command — Added a direct exit_app Rust command as a fallback if the plugin-based exit fails.
v0.13.0 Feature Unit Promotion System March 28, 2026
New Feature
  • 3-tier promotion system — Units earn promotions through combat kills, surviving engagements, or capturing cities. Veteran (2 kills / 4 combats), Specialist (8 kills / 15 combats / 3 captures), Commander (16 kills / 30 combats / Specialist + 15 turns).
  • Specialization choices — Each promotion rank offers two permanent specialization options per unit type (18 unit types supported). Choices shape unit roles with stat boosts, new abilities, and playstyle tradeoffs.
  • Commander Aura — Rank 3 grants a passive aura buffing nearby same-class units. Only one Commander per unit type per player per game. Losing a Commander permanently removes the aura slot.
  • Visual indicators — Bronze chevron (Veteran), silver double-chevron (Specialist), gold star (Commander). Commanders display a pulsing aura ring on the hex map. Pending promotions show a pulsing arrow.
  • AI promotion support — AI units promote using the same criteria and auto-select specializations at end of turn.
  • Combat integration — Commander aura bonuses (ATK, DEF, DGE, ACC) are applied in combat resolution. Auras do not stack (best aura wins).
v0.12.9 Fix Auto-Updater Fix March 28, 2026
Bug Fixes
  • Installer download robustness — Auto-updater now explicitly flushes the downloaded installer to disk, validates file size before execution, and removes stale partial downloads. Adds a brief delay after write to let Windows finish any AV scan.
  • Fallback launch method — If direct process spawn fails (e.g., OS error 1392 "corrupted or unreadable"), the updater falls back to cmd /c start which handles Windows security prompts more gracefully.
  • Download validation — Rejects downloads smaller than 100KB to catch truncated or error-page responses before attempting to run them as installers.
v0.12.8 Fix Victory Condition Fix March 28, 2026
Bug Fixes
  • Game now ends immediately — Victory/defeat is checked after every player attack and city capture, not just at the end of the AI turn. Killing the last enemy unit or capturing the enemy HQ now triggers the game-over screen instantly.
v0.12.7 Fix Movement Animation & UI Polish March 28, 2026
Bug Fixes
  • Path-following animation — Units now follow the actual Dijkstra hex path tile-by-tile instead of sliding in a straight line. Falls back to findFullPath when prev-pointer data is unavailable.
  • Isometric grounding during animation — Sprite base Y-position interpolates between tiles during movement, preventing sprites from snapping to the destination ground level while still mid-path.
  • Action bar icon sizing — Unit icon wrapper now scales responsively with clamp(44px, 5.5vw, 64px) to better match action button heights at all viewport sizes.
v0.12.6 Feature Intel Panel Overhaul March 28, 2026
UI Improvements
  • Split Intel panel — Left panel now shows your Unit Roster in the top half and Enemy Intelligence in the bottom half, clearly separated.
  • Per-enemy intel sections — Each enemy player gets their own intel section with faction flag, visible unit count, cities, and KIA/LOST combat stats. Supports multiple enemies in multiplayer.
  • Enemy-only intelligence — The Intel panel no longer mixes your own units with enemy data. Your roster stays clean; enemy intel is in its own dedicated area.
v0.12.5 Feature Smooth Unit Movement March 28, 2026
Visual Improvements
  • Smooth movement animation — Units now glide between tiles over 0.5 seconds with an ease-out curve instead of teleporting instantly. Works in both flat and isometric views.
v0.12.4 Balance Jet & Bomber Balance March 28, 2026
Balance Changes
  • Jet movement reduced — MOV decreased from 6 to 3. Jets are now less mobile, making positioning more important.
  • Bomber buffed — attack range increased from 1 to 2 (matching the jet) and MOV increased from 4 to 6. Bombers now fill the role of a fast, long-range strategic strike unit.
v0.12.3 Feature Seamless Auto-Updater March 28, 2026
New Features
  • In-app auto-updater — the desktop app now uses the Tauri updater plugin with signed binaries for seamless download-and-install updates. When a new version is available, clicking “Install Update” downloads, applies, and restarts the app automatically — no manual download needed.
v0.12.2 Improvement UI Polish & Consistent Icons March 28, 2026
Improvements
  • Consistent unit icons — all UI elements (minimap unit buttons, action bar unit card, selection panel, enemy intel cards) now use the same 3D team sprites shown on the game map, falling back to flat silhouettes only when sprites aren’t loaded.
  • Action bar centered — the bottom action bar is now properly centered on the screen with the unit identification card anchored to its left edge.
  • Turn indicator relocated — moved the turn counter from inside the minimap to the minimap action row, sitting to the left of the Center Map button for better visibility.
v0.12.1.7 Improvement Auto-Updater & Action Bar Fix March 27, 2026
Improvements
  • Simple auto-updater — replaced the Tauri updater plugin (which required signed binaries and a complex build pipeline) with a lightweight version check. The desktop app now fetches the latest version from the server, and if an update is available, shows a themed modal with a “Download” button that opens the download page in the default browser. No signing keys needed.
  • Action bar layout — action buttons now sit directly next to the unit card on the left side of the command bar, instead of floating to the center with a gap.
v0.12.1.6 Feature Enemy Intelligence System March 23, 2026
New Features
  • Enemy Intel Cards — after first visual contact with an enemy faction, a compact card appears in the bottom-left of the map showing the faction flag, name, visible unit count, and known city count. Cards stack vertically for multi-enemy games.
  • Intelligence Modal — click the intel button on any enemy card to open a detailed Intelligence report with tabbed sections: Military (visible units, positions, HP), Strategic (threat level, territory control, combat record K/D), and Faction Info (doctrine, bonuses, full unit roster with stats).
  • Multiplayer Dossier Tab — in multiplayer games, the Intelligence modal includes a Dossier tab showing the opponent’s profile, win rate, kills, and streaks fetched from the server.
  • Fog-of-war integration — enemy faction identity is only revealed after units are spotted in the game. Intel updates in real-time as visibility changes each turn.
  • Combat stat tracking — kills and losses are tracked per enemy faction during combat (including counter-attacks), feeding into the Strategic tab’s combat record.
v0.12.1.5 Bug Fix Minimap Polish & UI Fixes March 23, 2026
Bug Fixes
  • Scout & APC icons — added missing unit icons for Scout and APC units. They now display correctly in the action bar unit card and minimap unit buttons.
  • Unit button status colors — minimap unit buttons now show dim green when a unit has partially moved (moved some hexes but can still move and attack), yellow for attack-only, and blue for move-only. Previously all units with remaining actions showed green.
  • Menu button works — the minimap menu button now opens a local popup menu with SFX toggle, Reset Zoom, Field Manual, Save Game, Surrender, and Exit options. Previously it tried to toggle the top-bar hamburger menu which was invisible from the bottom of the screen.
  • Field Manual formatting — the in-game Field Manual modal now renders with full styling (tables, stat cards, faction cards, tips). Previously the modal used a different element ID than the CSS targeted, so all guide content appeared unstyled.
v0.12.1.4 Bug Fix Minimap Viewport & Layout Fix March 23, 2026
Bug Fixes
  • Viewport indicator now accurate in isometric mode — the minimap camera rectangle now correctly reflects the isometric projection, rotation, and zoom. Previously it used flat hex math which didn't match the isometric view.
  • Unit buttons, action row, and turn counter now visible — restructured the minimap layout from absolute positioning (which placed elements off-screen) to a proper flexbox layout. Unit buttons appear to the left of the minimap, action buttons below.
  • Viewport drawn on canvas — switched from a CSS div to drawing the viewport polygon directly on the minimap canvas, enabling correct shape rendering for the rotated isometric view.
v0.12.1.3 Feature Tactical Minimap March 23, 2026
Features
  • Tactical minimap — a real-time minimap in the bottom-right corner shows the full battlefield with terrain, cities, HQs, and unit positions. Click anywhere on the minimap to pan the camera instantly.
  • Unit action buttons — up to 8 unit buttons appear along the right edge of the minimap for units that still have moves or attacks available. Green border = can move & attack, yellow = attack only, blue = move only. Click to select and center on the unit.
  • Turn counter — circular turn indicator in the top-left of the minimap shows the current turn number.
  • Quick-access buttons — Center Map, Field Manual (Help), and Menu buttons arranged below the minimap for fast access.
  • Fog-of-war compliant — enemy units only appear on the minimap when in your vision range. Undiscovered tiles remain black; previously seen tiles are darkened.
v0.12.1.2 Feature Cinematic Turn Splash March 23, 2026
Features
  • Cinematic letterbox turn splash — black bars slide in from top and bottom with a scan-line effect when turns change. Shows "YOUR TURN" in your faction color with flag, or "ENEMY TURN" for the opponent. Lasts 1.5 seconds and auto-dismisses.
  • Fog-of-war safe — enemy faction name, flag, and colors are hidden until first visual contact. Before discovery, shows "Unidentified Force" in generic red.
  • Works everywhere — appears at game start, when ending your turn (AI takes over), when AI finishes (your turn starts), and in PvP multiplayer turn changes.
v0.12.1.1 Bug Fix Zoom & Pan Fix for Wide Monitors March 23, 2026
Bug Fixes
  • Minimum zoom raised to 0.85x — the map already fits the viewport at 1.0x, so zooming out past 85% just creates unnecessary void. Previously 0.6x allowed the map to become tiny on wide monitors.
  • Pan clamping tightened — when the map is smaller than the viewport, pan is now limited to ±20px drift (was 10% of viewport width, which allowed ~290px drift on ultra-wide monitors).
  • Auto-recenter on zoom-out — when zooming out below 1.2x, the camera gradually pulls back toward center, preventing the map from drifting into a corner of the screen.
  • Finer zoom steps — zoom increment reduced from 0.15 to 0.1 per scroll tick for smoother, more precise zoom control.
  • Zoom display shows zoom-out — the zoom percentage indicator now appears when zoomed out (below 100%), not just when zoomed in.
v0.12.1.0 Feature Ultimate Powers Overhaul March 23, 2026
Bug Fixes
  • Buff-type ultimates now work correctly — Sniper Killshot, Tank Blitz, Anti-Air Missile Salvo, AA Ship Missile Salvo, Jet Bombing Run, Bomber Strategic Strike, and Scout Recon Dash no longer consume the unit's attack action on activation. Units can now attack after activating these buff ultimates to actually use the buff.
  • Tank Blitz "attack twice" now functional — Tank Blitz ultimate correctly allows two attacks per turn. After the first attack, the tank stays selected with attack targets highlighted for a second strike. Blitz buff indicator shows attack count (1/2).
  • Intel Panel fog of war — enemy unit details are no longer shown in the Intel Panel before first contact. Unmet enemies show "Unidentified Contact" and met-but-not-visible enemies show "Enemy Unit" with "Intel unavailable."
Features
  • Scout ultimate: Recon Dash — doubles movement and reveals all enemy units within vision range.
  • APC ultimate: Rapid Deploy — unloaded units can move and attack immediately this turn instead of waiting until next turn.
  • AA Ship ultimate: Missile Salvo — next attack deals 2x damage with range 4 and guaranteed hit vs air units.
  • AI uses new ultimates — AI opponents on Medium and Hard difficulty now use Scout Recon Dash, APC Rapid Deploy, and AA Ship Missile Salvo.
v0.12.0.9 Bug Fix Zoom & Pan Overhaul March 23, 2026
Bug Fixes
  • Can no longer get lost in the void — completely rewrote the pan clamping system. When zoomed out so the map is smaller than the screen, the camera now locks near center with only minimal drift allowed. When zoomed in, at least 30% of the map stays on-screen at all times.
  • Minimum zoom raised to 0.6x — the map always fills at least 60% of the viewport at maximum zoom-out, preventing the tiny-dot-in-blackness issue.
  • CENTER MAP button — added a floating button in the bottom-right of the map that instantly resets zoom and pan to the default view. Also accessible via the Home key or clicking the zoom display in the command bar.
v0.12.0.8 Feature Scout & APC Draftable, Zoom Limits March 22, 2026
Features
  • Scout and APC now draftable — both units are now available in the draft selection screen. Scout offers high vision and forest pathfinding; APC can transport up to 5 units with a Rapid Deploy ultimate.
Bug Fixes
  • Zoom no longer loses the map — raised minimum zoom from 0.3x to 0.55x so the map stays visible, and tightened pan margins from 25% to 10% so you can't scroll far past the map edges.
  • Server stability — switched from bcrypt (native binary) to bcryptjs (pure JS) to prevent crash loops caused by ELF header mismatches on the server. CORS handling moved to raw HTTP server level for reliability.
v0.12.0.7 Bug Fix CORS Fix for Desktop App Login March 22, 2026
Bug Fixes
  • Desktop app login now works — resolved CORS preflight failure that prevented the Tauri desktop app from making API calls to hexarmy.com. Added explicit OPTIONS preflight handling at the Nginx reverse proxy layer, which was intercepting preflight requests before they reached the Express CORS middleware.
  • Fixed "fullUrl is not defined" error — corrected variable scoping in the apiCall() function so error logging works properly when fetch requests fail.
  • Updated Tauri CSP — added http://tauri.localhost to connect-src and default-src to allow the desktop app WebView to make cross-origin requests without CSP violations.
v0.12.0.6 Bug Fix Splash Screen Image & Transition Fix March 22, 2026
Bug Fixes
  • Splash images now display — split CSS background shorthand into separate properties (background-image, background-size, background-position) for full WebView2 compatibility. The shorthand center/cover syntax was silently failing in some renderers.
  • Splash now transitions to menu — fixed a race condition where clicking the splash screen before all scripts finished loading meant audio initialization never started. The splash now polls for script availability and triggers SFX init directly, rather than relying on a document-level click listener that hadn't been registered yet.
  • Audio failure resilience — if audio initialization fails, the splash now transitions immediately instead of hanging for the full 8-second safety timeout.
v0.12.0.5 Feature Scout & APC Units, PsyOps Rework March 22, 2026
New Units
  • Scout — cheapest unit in the game (250g). High mobility (MOV 5), excellent vision (5), but very fragile (HP 3). Pathfinder passive ignores forest movement penalty. Recon Dash ultimate doubles movement and reveals all units in vision range.
  • APC (Armored Personnel Carrier) — land transport that carries up to 5 foot/vehicle units (600g). MOV 5, moderate defense. Load adjacent friendly units, unload to adjacent hexes. Rapid Deploy ultimate lets all unloaded units act immediately. Cargo destroyed if APC is lost.
Balance
  • PsyOps reworked — now limited to 3 decoy deployments. After deploying its 3rd decoy, the PsyOps unit is consumed and removed from the battlefield. This makes each decoy deployment a strategic decision.
UI
  • Quick Compositions removed — the preset draft buttons (Rush, Armor Push, Air Superiority, Economy Play) have been removed. Players now build their army composition manually.
v0.12.0.4 Bug Fix Splash Screen Fix for Desktop App March 22, 2026
Desktop App
  • Splash screen now displays correctly — fixed an issue where the splash screen was invisible in the Tauri desktop build because the home overlay rendered on top of it despite lower z-index
  • Deferred home overlay — the home screen now starts hidden and is only revealed when the splash screen is dismissed, ensuring reliable splash visibility across all WebView renderers
v0.12.0.3 Feature Auto-Update System March 22, 2026
Desktop App
  • Auto-update detection — the desktop app now checks for updates on launch via the Tauri updater plugin and displays a styled modal when a new version is available
  • One-click update install — download progress bar with percentage, automatic install, and app relaunch after update completes
  • Server update endpoint — new /api/update/:target/:arch/:version endpoint serves platform-specific update manifests with semver comparison
v0.12.0.2 Feature New Splash Screens & App Icon March 22, 2026
Visual
  • 5 new cinematic splash screens — replaced the previous 3 splash images with 5 high-quality themed screens: HQ Logo, Ground Forces, Air Superiority, Naval Warfare, and 10 Nations
  • Slower crossfade — splash slideshow now holds each image for 3 seconds (up from 1s) with a smoother 1.2s transition
  • New app icon — custom HexArmy icon with hex frame, fighter jet, and neon glow applied to the Tauri desktop app (taskbar, installer, window title bar)
v0.12.0.1 Fix HQ Building Sprite Fix March 22, 2026
Fixes
  • HQ buildings now render correctly — faction-specific HQ sprites were not appearing because the sprite loader stored images under abbreviated keys (e.g. us) while the renderer looked them up by full faction key (e.g. usa). Sprites are now stored under both keys so the lookup always succeeds
v0.12.0.0 Feature Phase 2 — Tauri Desktop Shell & Controller Support March 22, 2026
Desktop App (Tauri)
  • Native desktop application — HexArmy now runs as a standalone Windows desktop app via Tauri 2, wrapping the existing web frontend in a native window with WebView2
  • Seamless remote connection — desktop app automatically connects to hexarmy.com for multiplayer, authentication, and stats — same experience as the browser version
  • Window management — default 1280×800 with 1024×768 minimum, resizable, F11 fullscreen toggle, and dynamic window title showing current game phase and turn
  • NSIS & MSI installers — production build generates both installer formats for easy Windows distribution
  • Tauri environment detection — game automatically detects desktop vs browser context via window.__TAURI__ and routes API calls and Socket.IO accordingly
Controller Support
  • Gamepad input — full controller support via the Gamepad API with virtual cursor, map panning, zoom, unit selection, and turn management
  • Button mapping — A=select, B=cancel, X=next unit, Y=end turn, LB/RB=zoom, triggers=analog zoom, left stick=pan, right stick=cursor, D-pad=menu navigation
  • Visual cursor — glowing green cursor appears when using the right stick, with hover detection on the game canvas
Server
  • CORS updated for Tauri — server now accepts requests from tauri://localhost and https://tauri.localhost origins in production
v0.11.0.3 Fix CSP Font Fix, Phase Cycling & Timer Leak March 22, 2026
Fixes
  • Base64 font rendering — added data: to the Content Security Policy font-src directive so embedded woff2 fonts are no longer blocked
  • Phase cycling on game restart — starting a new game after victory caused rapid placement/draft phase looping. Orphaned setTimeout callbacks from the previous game instance were firing during the new game. Timer IDs are now tracked and cleared on reset
  • Render suppression reset — rendering is no longer left frozen between games if a previous game was abandoned during the AI draft transition
v0.11.0.2 Fix Placement Centering, Map Flash, Victory & Zoom Fixes March 22, 2026
Fixes
  • Placement centering — camera now correctly centers on the player HQ and valid placement area when the deployment phase begins. Previously, pan coordinates were computed before canvas dimensions were finalized, causing the view to land off-target
  • Map flash after placement — eliminated the brief full-map reveal that occurred between the placement phase and game start. Rendering is now suppressed during the AI draft transition so only the fog-of-war view is shown
  • Premature victory on large maps — AI units can now spawn on all traversable terrain (forest, hills, desert, etc.) instead of only plains. On max-size continent maps, the AI HQ could be surrounded by non-plains terrain, resulting in zero AI units and an immediate false victory. Added a safety guard requiring at least one AI unit before annihilation victory can trigger
  • Scroll zoom cursor centering — mouse wheel zoom now reliably zooms toward the cursor position. The zoom handler uses the actual last-rendered pixel offsets instead of recomputed values, eliminating drift between the cursor and the map point beneath it
v0.11.0.1 Bugfix Draft Sprites & Ranged Advance Fix March 22, 2026
Fixes
  • Force composition sprites — draft cards now reliably show team sprites even when they load after the draft screen opens. Added a callback that redraws all draft card icons when team sprites finish loading
  • Ranged units no longer advance — snipers, artillery, and mortar units no longer move into the defeated unit's tile after a kill. Only melee units (infantry, tank, recon, engineer, paratrooper, psyops, anti-air, radar) advance on kill
v0.11.0.0 Major Client Modularization — Vite + ES Modules March 21, 2026
Architecture
  • Modular client architecture — split the 15,355-line monolithic game file into ~30 ES6 modules organized by domain: data, core, engine, UI, audio, rendering, and network
  • Vite build system — zero-config dev server with hot module replacement, proxy to backend, and production build output to server public directory
  • TypeScript-ready — tsconfig.json configured for incremental TypeScript adoption with allowJs enabled
  • Event bus — centralized pub/sub system in core/state.js for decoupled module communication
  • Global bridge — temporary window exposure layer maintains compatibility with HTML onclick handlers during transition
Module Structure
  • Data layer — terrain, units, factions, achievements, and victory modes extracted to dedicated JSON-like modules
  • Engine layer — combat, pathfinding, map generation, AI, turns, ultimates, and unit management as independent modules
  • UI layer — panels, events, screens, draft, and account systems separated
  • Audio & rendering — Web Audio DSP, canvas rendering, and sprite management isolated
  • Network — complete multiplayer PvP system (Socket.IO) extracted to standalone module
Notes
  • No gameplay changes — pure structural refactoring
  • Original monolith preserved as reference/fallback
  • Prepares codebase for future Steam deployment via Tauri
v0.10.15.3 Feature Unit Mechanics: Produce Sprites, City/HQ HP, Attack-Advance March 21, 2026
New Features
  • Produce menu team sprites — produce unit cards now display team-colored 3D sprites instead of tinted icons, matching the draft screen visual upgrade
  • Structure HP system — cities start with 20 HP and HQs with 30 HP. Structures must be damaged to 0 HP before capture
  • Attack-advance for foot and vehicle units — infantry, tracked vehicles, and APCs automatically move into an enemy hex when their attack kills the defender. Provides tactical advantage for melee-range units
  • Advance-capture mechanic — units that advance into a city or HQ with 0 HP automatically capture it and restore its structure HP
v0.10.15.9 Bugfix Battle Start Flash Fix (Global Render Gate) March 21, 2026
Fixes
  • Render suppression now works — replaced the ineffective window.render override with a global _suppressRender flag checked at the top of the render() function declaration. This properly blocks all render calls during the placement-to-play transition until the camera is positioned
v0.10.15.8 Feature Psyops Unit Sprite March 21, 2026
New
  • Psyops unit sprite — new isometric SIGINT/communications vehicle sprite for the psyops unit, replacing the old SVG placeholder. Features satellite dishes, antennas, and communications equipment on an armored 6-wheel chassis
  • All 4 teams — psyops sprite deployed to blue, red, green, and yellow team sprite folders
v0.10.15.7 Improvement Stacked Unit Formation Layout March 21, 2026
Changes
  • Formation-based stacking — stacked units now display in a triangular formation instead of a linear offset. Unit 1 is center, unit 2 is right-front, and unit 3 is back-left, giving a clearer visual of the stack composition
  • Back-to-front depth sorting — stacked sprites are drawn in depth order so rear units are behind front units, with slight dimming for depth perception
v0.10.15.6 Bugfix Stacked Sprite Offsets & Flash Fix March 21, 2026
Fixes
  • Larger stacked sprite offsets — increased from 3px/4px to 8px/10px per unit in the stack, making individual sprites in a stack much more visible and distinct
  • Battle start flash eliminated — rendering is now fully suppressed during the placement-to-play transition using a render gate. The render() function is temporarily replaced with a no-op while zoom and camera position are calculated, then restored for the first proper render at the correct zoom level
v0.10.15.5 Feature Draft Sprites, Stacked Visuals & Flash Fix March 21, 2026
Improvements
  • Draft screen team sprites — the force composition screen now displays the full team-colored unit sprites instead of the old tinted silhouette icons
  • Stacked unit visuals — when units are stacked on a tile, multiple offset sprites are drawn (one per unit in the stack) with depth fading, giving a clear visual indication of stack size
  • Battle start flash fixed — eliminated the brief full-map flash that occurred when transitioning from placement to battle phase. Canvas dimensions are now updated without rendering until the zoom and center position are properly calculated
v0.10.15.4 Bugfix Stack Highlights & Battle Start Camera March 21, 2026
Fixes & Improvements
  • Stack target highlighting — clicking the "Stack" button now highlights valid target hexes in cyan in the isometric view (was only working in flat view)
  • Battle start camera — when the battle begins after unit placement, the camera now automatically zooms in (1.5x–3.0x) and centers on the player's visible tiles, providing an immediate tactical view instead of a zoomed-out overview
v0.10.15.3 Feature Faction Flags, Map Centering & Stack Units Button March 21, 2026
Improvements
  • Faction flags on structures — captured cities, HQ, FOB, FAB, and port tiles now display the actual faction flag image on the flagpole instead of a generic blue/red triangle
  • Map centering in isometric mode — clicking "Next Unit" or clicking a unit in the Intel panel now properly centers the isometric camera on that unit's hex position
  • Stack Units button — new "Stack" action card appears in the command bar when a unit can merge with an adjacent same-type friendly unit. Click to enter stack targeting mode (cyan highlights), then click a valid target to merge. Combined unit gets scaled stats (80% per additional unit)
v0.10.15.2 Feature City Ownership Indicator in Isometric View March 21, 2026
New
  • Ownership flag — captured cities, HQ, FOB, FAB, and port tiles now display a colored flag (blue for player, red for AI) on a pole to clearly indicate who controls the structure
  • Ownership hex border — structure tiles with an owner also get a colored hex border outline matching the owner's color
  • Flag detail — flags include a highlight for 3D appearance and are positioned at the top-right of the tile for visibility
v0.10.15.1 Bugfix Fix Movement & Attack Highlights in Isometric View March 21, 2026
Fixes
  • Movement range highlight restored — blue hex overlay now correctly appears on movable tiles when a unit is selected (was referencing gameState._moveHexes instead of gameState.movableHexes)
  • Attack range highlight restored — red hex overlay now correctly appears on attackable tiles (was referencing gameState._atkHexes instead of gameState.attackableHexes)
  • All 12 highlight types now working — ported all overlay types from flat renderer: placement, deep scan, barrage, airdrop, relocate, nuke, smoke, decoy, smoke zones, radiation zones, attack range, movement range — all with correct colors matching the flat view
v0.10.15.0 Feature Phase 4: Standing 3D Unit Sprites in Isometric View March 21, 2026
Major Feature
  • Standing 3D unit sprites — units in isometric view now render as full-size standing sprites directly from team sprite files, replacing the small tinted icon system. Blue team for player, red team for AI
  • Uniform unit sizing — all units fit within the same bounding box (75% of hex diameter), scaled proportionally by aspect ratio for visual consistency
  • Air unit elevation — jets, bombers, and helicopters float 45% above ground level, appearing to fly over the battlefield
  • Grounded positioning — land units positioned at 55% between tile centroid and bottom vertex so they sit naturally on the tile surface
  • Stack count badges — units with multiple stacks show a yellow count badge
  • Deployed indicator — deployed artillery/radar shows an anchor emoji above the unit
  • Stealth visibility — submerged submarines and ghost protocol snipers/psyops only visible when adjacent to player units
v0.10.13.0 Feature Phase 2: Isometric 3D View March 21, 2026
Major Feature
  • Isometric 3D rendering — the game map now renders in full isometric perspective with 3D hex tiles featuring visible side faces, directional lighting gradients, and depth-based shading
  • Map rotation — press Q/E to rotate the map in 90° increments (4 directions), providing different tactical viewpoints
  • Painter's algorithm — tiles, highlights, and units are all depth-sorted back-to-front for correct visual overlap in the isometric view
  • Full game integration — fog of war, owner tinting, movement/attack highlights, unit selection, and click-to-hex all work seamlessly in the new 3D view
  • Backward compatible — the original flat 2D view is preserved and can be toggled via _useIsometric = false in the console
Technical
  • Projection systemhexToWorld_iso(), worldToScreen_iso(), getHexScreenVerts_iso() for full isometric coordinate transformation with rotation
  • Inverse projectionscreenToWorld_iso() and pixelToHex_iso() for accurate mouse-to-hex detection in isometric mode
  • 3D tile renderingdrawIsometricTile() draws hex prisms with side faces and top faces using terrain-specific color palettes
  • Isometric render pipelinerenderIsometric() handles full scene rendering with depth sorting, culling, and all overlay types
v0.10.14.0 Feature Phase 3: Terrain Decorations in Isometric View March 21, 2026
Major Feature
  • Isometric forests — lush hand-painted trees with visible trunks, roots, and multi-layered canopies in 4 distinct variants. Trees are depth-sorted for proper visual overlap
  • Isometric mountains — craggy rock formations with jagged spires, stratified ledges, vertical crack lines, secondary peaks, and moss patches clinging to rock faces. Each mountain variant is procedurally different
  • Isometric cities — dense urban centers with 7-10 varied buildings per tile, featuring grey/slate and orange/terracotta color palettes, windows with multiple styles (dark, lit, glass), rooftop details (AC units, antennas, satellite dishes), street-level trees, and lamp posts
  • Isometric HQ rendering — faction headquarters buildings rendered as sprite-based structures sized to fill hexes prominently
  • Seeded PRNG variation — mulberry32 algorithm used for all decoration generation, ensuring consistent terrain appearance per hex tile while maintaining visual diversity
  • Depth-sorted rendering — decorations drawn after all tiles, using painter's algorithm for correct layering
Technical
  • Decoration system — new drawDecorations_iso(sx, sy, row, col) function handles all terrain-specific visual detail rendering
  • PRNG integrationmulberry32_iso() seeded PRNG provides deterministic random generation for tile variation
  • Render pipeline updaterenderIsometric() extended with secondary decoration loop for layered depth composition
v0.10.12.21 Feature Unit Status Bars Replace Circular Indicators March 21, 2026
Changes
  • HP bar — replaced the circular HP ring with a horizontal bar beneath each unit. Green above 50% health, orange 25–50%, red below 25%
  • Ultimate cooldown bar — second bar below HP shows ultimate ability status. Bright green when ready, purple shrinking bar during cooldown. Only appears for units with ultimates
  • Owner dot removed — team-colored unit sprites already indicate ownership, so the blue/red dot beneath units is no longer needed
  • Selection highlight — selected units now show a white rectangle outline around their status bars instead of a circular ring
v0.10.12.16 Feature 4-Team Color-Coded Unit Sprites March 21, 2026
New
  • 4 team-colored sprite sets — blue, red, green, and yellow team variants for all 17 unit types (68 sprites total), each with distinct color tinting to identify team ownership at a glance
  • Team-based sprite loading — sprites organized in /sprites/units/blue/, red/, green/, yellow/ subdirectories, loaded per-team at startup
  • Player 1 = Blue, Player 2 = Red — player units use blue team sprites, AI units use red team sprites (expandable to 4 players with green and yellow)
  • Embedded base64 for all 4 teams — SPRITE_DATA contains base64 sprites for all 4 teams for offline fallback
v0.10.12.15 Feature 3D HQ Buildings at Scale 20 March 21, 2026
Changes
  • HQ scale increased to 20 — headquarters buildings now fill the majority of their hex tile
  • 3D raised platform — all HQ buildings now sit on a 3D elliptical platform with a visible side face, edge lines, top face with highlight, and ground shadow — giving them a raised, solid appearance on the map
v0.10.12.14 Improvement Larger HQ Buildings March 21, 2026
Changes
  • HQ buildings enlarged — faction headquarters base scale increased from 10 to 16, making them fill more of their hex tile
v0.10.12.13 Improvement Raised Air Unit Positioning March 21, 2026
Changes
  • Air units raised — jet, bomber, and helicopter sprites are now drawn higher above the tile (lifted by 45% of the unit box size), giving the appearance of flight rather than sitting on the ground
v0.10.12.12 Improvement Uniform Unit Size, No Shadow March 21, 2026
Changes
  • Shadow removed — ground shadow ellipse removed from all units for a cleaner look
  • Uniform sizing — all units now fit within the same bounding box (75% of tile hex diameter), scaled proportionally. Previously sprite width was fixed but height varied by aspect ratio, making tall units huge and wide units tiny
v0.10.12.11 Improvement Remove Faction Circle from Units March 21, 2026
Changes
  • Faction circle removed — units now stand directly on the tile with just a ground shadow beneath them, no colored circle or pedestal
v0.10.12.10 Bugfix Grounded Units, Alpha Cleanup, Trimmed Sprites March 21, 2026
Fixes
  • Units grounded on circle — pushed faction circle further down tile (60% toward bottom vertex, up from 45%), sprite bottom overlaps circle by 2px so units look planted on it rather than floating above
  • Trimmed sprite padding — all 16 sprites re-processed to trim transparent padding around edges, so image bottom actually matches content bottom
  • Alpha fringe cleanup — cleaned semi-transparent background pixels (alpha < 15 set to 0) on paratrooper, infantry, artillery, engineer, helicopter, and tank sprites to eliminate visible background artifacts
v0.10.12.9 Improvement Flat Faction Circle & Grounded Units March 21, 2026
Changes
  • Flat faction circle — replaced the 3D raised pedestal with a simple flat ellipse in faction accent color with a dark outline, sitting flush on the tile surface
  • Units sit on the circle — sprite bottom edge aligns directly with the flat circle, so units appear grounded rather than floating above a raised platform
v0.10.12.8 Bugfix Unit Sprite Fixes: Anti-Air, Positioning March 21, 2026
Fixes
  • Anti-Air sprite now renders — fixed unit type mismatch (antiair vs anti_air) that caused the Anti-Air unit to show as a fallback "A" circle instead of its sprite image
  • Units sit on tile surface — moved unit base position from tile centroid down toward the bottom vertex (45% blend), so sprites appear grounded on the tile rather than floating above it
v0.10.12.7 Feature 3D Standing Unit Sprites March 21, 2026
Changes
  • Standing 3D units — units now render as upright sprites standing on the tile surface like miniature figures, replacing the hex-framed token approach entirely
  • No hex border — removed all hex clipping, hex borders, and hex prism effects from unit rendering. Sprites are drawn directly and unmodified
  • Faction base pedestal — small 3D elliptical pedestal in faction accent color beneath each unit, with a darker side face and highlighted top rim
  • Ground shadow — elliptical shadow cast on the tile surface beneath each standing unit
v0.10.12.6 Feature 3D Unit Token Prism Effect March 21, 2026
Improvements
  • 3D prism depth — unit tokens now render as raised hex prisms with visible side faces, matching the 3D style of terrain tiles. Side faces are drawn between a top hex (raised up) and bottom hex (at tile surface), with faction-colored shading
  • Directional side lighting — 6 side faces use different shade levels (15%–25% of faction accent color) for realistic directional lighting
  • Bevel highlight/shadow — top-left inner edges have a subtle white highlight, bottom-right edges have a dark shadow for an embossed 3D look on the top face
  • Side edge lines — vertical edges on visible sides add definition to the prism shape
  • Ground shadow — larger offset shadow beneath the raised token for depth perception
v0.10.12.5 Feature Isometric Unit Token Sprites & Faction Indicators March 21, 2026
New
  • 16 new isometric unit tokens — high-quality transparent-background sprites (resized from 1024px to 256px for web), replacing previous artwork. Sprites are displayed unmodified within the hex clip
  • Faction-based hex border colors — unit hex borders and star badges now use the selected faction's accent/flag colors (e.g., US blue, Russia red, India orange) instead of generic green/red team colors
Sprite Mapping
  • destroyer.png → ship unit type
  • mobile_missile_launcher.png → missile unit type
  • mobile_radar.png → radar unit type
  • mortarman.png → mortar unit type
v0.10.12.4 Bugfix Unit Hex Centering Fix March 21, 2026
Fixes
  • Centered unit hexes on tiles — unit sprite hexagons are now perfectly centered on their tile by using the computed tile vertex centroid directly, removing the previous offset that anchored units to the top-left of the tile
v0.10.12.3 Bugfix Isometric Unit Hex Orientation March 21, 2026
Fixes
  • Isometric hex orientation — unit sprite hexagons now use the actual isometric-projected tile vertices from getHexScreenVerts(), matching the 3D tile orientation exactly instead of using flat 2D pointy-top hexes
  • Perspective-correct clipping — sprite images are clipped to the projected hex shape, rotating and distorting with the isometric camera view
  • Cover-fit within projected bounds — sprite sizing uses the bounding box of the projected hex for proper aspect-ratio-preserving fill
v0.10.12.2 Feature New Unit Sprite Art March 21, 2026
Improvements
  • 16 new high-quality unit sprites — all unit types replaced with new hand-crafted artwork featuring richer detail and consistent art style
  • Updated sprite mapping — destroyer sprite mapped to ship unit type, nuclear sprite mapped to missile unit type
  • Embedded base64 fallback — all 16 new sprites embedded as base64 data for offline/no-server operation
v0.10.12.1 Feature Hex-Shaped Unit Sprite Rendering March 21, 2026
Improvements
  • Hex-shaped unit sprites — unit sprites are now clipped to a pointy-top hexagon that consumes 75% of the tile hex area, replacing the previous elliptical base plate
  • Team-color hex border — thick colored hex border (green for player, red for AI) clearly identifies unit ownership at a glance
  • Hex drop shadow — hex-shaped shadow beneath each unit for depth
  • Cover-fit sprite scaling — sprites are aspect-ratio-preserved and cover the hex area, clipped to the hex boundary for clean edges
  • Team badge — small star indicator badge in bottom-right corner of hex for additional team identification
  • Fallback rendering — if sprite fails to load, unit displays as a team-colored hex with the unit type initial
v0.10.12.0 Feature Image-Based Unit Sprite System
2026-03-20

Replaced all Canvas 2D hand-drawn unit sprites with an image-based PNG sprite system using ctx.drawImage(). Units now load pre-rendered 256x256 artwork from /sprites/units/, enabling realistic painted-style graphics that Canvas primitives cannot achieve.

  • Tank: Sherman/T-34 style with rounded turret, sloped hull, detailed running gear, muzzle brake
  • Infantry: Standing soldier with M1 helmet, rifle with bayonet, belt and buckle detail
  • Artillery: Towed field gun with split trail legs, spoked wheels, curved gun shield, long barrel
  • Recon: Open-top WW2 Willys Jeep with windshield, spare tire, grille slats, headlights
  • Anti-Air: Half-track with twin upward AA barrels, ammo magazine, open fighting compartment
  • Jet: Swept-wing fighter (MiG/F-86 era) with glass canopy, intake ring, team roundel
  • Helicopter: Attack helicopter with tandem cockpit, stub wings, rocket pods, chin turret, rotor disc
  • Engineer: Soldier with yellow hard hat, tool belt with pouches, wrench and shovel
  • Ship: Naval destroyer with superstructure, gun turrets, funnel, mast with radar, bow wave
  • Submarine: Cigar hull with conning tower, periscope, dive planes, wake bubbles
  • Radar: Truck with large parabolic radar dish, feed horn, signal waves, flatbed detail
  • Bomber: Multi-engine wide-wing aircraft with glass nose, 4 engine nacelles, propeller discs
  • Sniper: Prone soldier in ghillie suit, scoped rifle on bipod, boonie hat
  • Paratrooper: Soldier descending with parachute canopy, suspension lines, panel detail
  • Missile: TEL truck with ballistic missile on angled launch rail, nosecone, rear fins
  • Mortar: Mortar tube on baseplate with bipod, ammo crate with standing rounds
v0.10.10.0 Feature Realistic Unit Sprite Revamp — All 16 Types March 20, 2026

Every unit sprite in the 3D isometric prototype has been completely redrawn with realistic, organic shapes replacing the blocky rectangular primitives:

  • Curved geometry — All primary shapes now use quadratic Bezier curves for natural, organic silhouettes instead of flat rectangles
  • Multi-tone shading — Each unit features 3-4 tonal layers (shadow, body, highlight, specular accent) for depth and volume
  • Sub-component detail — Rivets, hatches, wheel hubs, lug nuts, panel lines, glass reflections, scope lenses, and weapon details
  • All 16 unit types — Tank, infantry, artillery, recon jeep, anti-air, jet, helicopter, engineer, ship, submarine, radar vehicle, bomber, sniper, paratrooper, missile TEL, and mortar
v0.10.9.0 Feature Unit Visibility System — Base Plates & Team Glow March 20, 2026

Units now stand out clearly on all terrain types — especially forests and mountains — with a new 3-layer visibility system:

  • Ground Shadow: Wider, softer elliptical shadow anchors units to the terrain
  • Base Plate: 3-tone olive drab platform under every unit, visually separating it from terrain decorations like tree canopies and rock spires
  • Team-Color Rim Glow: Colored ring (green for player, red for AI) around the base plate for instant team identification at a glance
v0.10.8.11 Improvement Terrain Tile Coverage Increase March 20, 2026
Improvements
  • Forest tiles — trees now spread across full tile area (ox 0.65→1.0, oy 0.35→0.55), increased count (2–3→3–4), larger trunks (3→3.8 width, 10→13 height), bigger canopies (6.5→8.5 radius), increased individual scale (0.7–1.2→0.9–1.5)
  • Mountain tiles — larger rock formations (baseW 14–20→20–28, baseH 16–26→22–36), more spires (2–3→3–4), wider spread (0.6→0.85), wider rubble field (0.8→1.1, 4→6 stones)
  • City tiles — larger sidewalk pad (0.55→0.80), more buildings (3–4→4–6), wider spread (ox 0.55→0.85, oy 0.28→0.45), bigger buildings (bw 3.5–7.5→4.5–9.5, bh 5–17→7–21), wider tree and lamp placement
v0.10.8.10 Feature Isometric City Building Rendering March 20, 2026
Improvements
  • Varied city layouts — each city tile now generates a unique cluster of 3–5 buildings with different heights, widths, and color palettes so no two cities look the same
  • 3-color building palettes — grey/slate, orange/terracotta, and dark blue building types with proper isometric front face, right side face, and roof face rendering
  • Window grid system — auto-scaled rows and columns of windows on front and side faces with 3 styles: dark, warm-lit, and glass reflection
  • Ground-level detail — dark entrance doors with frames, darker base band for entrance areas, concrete sidewalk pad
  • Rooftop equipment — randomized AC units with fan grilles, antenna towers with cross-bars and red blinking lights, satellite dishes
  • Street trees — 1–2 small round-canopy trees with layered foliage per city tile
  • Street lamps — occasional lamp posts with warm glow heads
  • Depth sorting — buildings sorted back-to-front by Y position for correct isometric overlap
v0.10.8.9 Feature Craggy Rock Mountain Rendering March 20, 2026
Improvements
  • Multi-spire rock formations — mountains now consist of 2–3 jagged rock spires with depth-sorted back-to-front rendering, each with unique height, width, and jaggedness
  • Stratified rock faces — 4-tone rock palette (dark shadow, mid slate, light face, bright highlight edge) with realistic cliff face geometry
  • Horizontal ledge lines — 3–5 jagged stratification lines per spire simulating geological layering
  • Vertical crack detail — curved crack lines running down rock faces for weathered appearance
  • Secondary peaks — smaller jagged sub-spires on higher-variant formations
  • Moss/vegetation patches — green elliptical patches clinging to rock faces at lower elevations
  • Ground detail — grass/moss base ring and scattered rock rubble at mountain base
v0.10.8.8 Feature Illustrated Forest Tree Rendering March 20, 2026
Improvements
  • Lush deciduous trees — complete rewrite of forest tile rendering inspired by hand-painted sprite sheet; trees now feature thick tapered trunks with bark texture, knot/whorl details, and dark crevice lines
  • Bubble-cluster canopies — 4-layer canopy system (dark back, mid-green mass, light highlights, bright top spots) using overlapping circles for a lush, organic illustrated look
  • Exposed root system — visible gnarled roots spreading from trunk base using quadratic curves
  • Branch stubs — visible branch connections below canopy for added depth
  • Leaf edge detail — small circles along canopy perimeter creating a bubble/leaf-cluster silhouette
  • Ground detail — grass/moss patches at tree bases with varied green tones
  • Depth sorting — trees within each hex are sorted back-to-front by Y position for correct overlap
v0.10.8.7 Feature Complete 16-Unit Type Rendering March 20, 2026
New Units
  • Anti-Air — tracked chassis with open turret platform, dual upward-angled AA barrels with flash suppressors, ammo box detail
  • Jet — pointed fuselage with swept wings, tail fins, vertical stabilizer, glass canopy, nose cone, wing roundels with team colors
  • Helicopter — tail boom with tail rotor, main fuselage with curves, glass canopy, stub wings with rocket pylons, nose gun, semi-transparent rotor disc, landing skids
  • Field Engineer — soldier body with bright yellow tool vest, belt with tools, wrench in hand, yellow-green hard hat
  • Naval Ship — boat-shaped hull with deck, superstructure/bridge with windows, radar mast, forward and aft gun turrets, wake foam
  • Submarine — elongated submerged hull, deck casing, conning tower with windows, periscope mast, propeller area, wake effect
  • Mobile Radar — 6-wheeled chassis, equipment housing body, radar mast with concave dish and feed horn, windshield
  • Bomber — wider fuselage and wings than jet, 4 engine nacelles, tail fins, canopy, bomb bay doors
  • Sniper — prone/crouched ghillie suit body, extended arms, long rifle with scope and bipod, boonie hat, low profile silhouette
  • Paratrooper — parachute canopy with team-color panels, suspension lines, compact soldier body, harness, weapon across chest, team-color beret
  • Mobile Ballistic Launcher — 8-wheeled truck chassis, cab body, angled launch rail with missile body, nose cone, fins
  • Mortar — elliptical baseplate, bipod legs with hinge, angled mortar tube with muzzle opening, stacked mortar rounds
Improvements
  • Spiral unit placement — all 16 unit types now placed around each HQ using spiral outward algorithm, with naval units on water tiles and land units on terrain
  • Shared military palette — PAL object with 18 colors (olive, khaki, brown, steel, skin, navy, red, glass) for consistent rendering across all unit types
v0.10.8.6 Feature Sprite-Faithful Unit Graphics Rewrite March 20, 2026
Improvements
  • Tank — complete rewrite with dual track assemblies (road wheels, return rollers, drive sprockets), track guards, angled glacis hull with engine deck grille/exhaust, tool stowage, tow cable, rounded turret with mantlet, bore evacuator on barrel, slotted muzzle brake, commander's cupola with hatch handle
  • Infantry — full-body soldier with visible face/skin, prominent steel pot helmet with netting band and chin strap, olive jacket with chest pockets/button line, Y-harness webbing, leather belt with buckle, knee-highlighted trousers, detailed rifle with wooden stock and front sight
  • Artillery — towed field gun with split trail legs and spade plates, large spoked wheels with hub caps, curved gun shield with edge outline, recoil mechanism/cradle detail, barrel with highlight and slotted muzzle brake
  • Recon — open-top jeep with rounded fenders, fold-down windshield with glass reflection, visible seats and steering wheel, hood with center ridge and side vents, front grille with headlight, spare tire on rear, whip antenna
  • Expanded palette — 14-color military palette (olive, khaki, brown, steel, skin) with highlights and shadows matching the sprite sheet's tonal range
v0.10.8.5 Feature Faction-Specific HQ Buildings March 20, 2026
New Features
  • 10 factions — United States, Canada, New Zealand, Iran, China, United Kingdom, Australia, Russia, North Korea, India
  • Faction selector — choose your faction and enemy faction from dropdowns in the control panel
  • US — Pentagon — 5-sided ring building with inner courtyard
  • Canada — Parliament — Centre Block with Peace Tower gothic spire and clock
  • New Zealand — The Beehive — tiered circular building with dome
  • Iran — Azadi Tower — inverted-Y arch monument with crown
  • China — Bayi Building — columned hall with pagoda tower and red star
  • UK — Whitehall — classical columns, pediment, and clock tower with spire
  • Australia — Parliament House — low-profile building with iconic 81m flag mast
  • Russia — Kremlin Tower — Spasskaya tower with clock, crenellations, and red star
  • North Korea — Ryugyong Hotel — massive pyramid with window grid
  • India — Rashtrapati Bhavan — sandstone building with Mughal dome and columns
v0.10.8.4 Feature Military Unit Graphics Overhaul March 20, 2026
New Features
  • Olive-drab military palette — all units now use realistic military colors (#5a6b3a olive base) with small team-color accent markings (stars, stripes) instead of full team paint
  • Tank — detailed tracks with road wheels, angled hull with engine deck hatches, turret with cupola, barrel with muzzle brake
  • Infantry — steel pot helmet with highlight band, olive jacket with webbing/gear straps, belt, rifle with stock, team-color armband
  • Artillery — towed howitzer with trail legs and spades, wheels with hubs, gun shield, breech, angled barrel with muzzle brake
  • Recon — jeep with 4 wheels, hood, windshield with frame, roll bar, seats, spare tire, whip antenna with team-color tip
v0.10.8.3 Fix Flat Hex Grid — Terrain via Color & Icons March 20, 2026
Improvements
  • Flat terrain — all tiles at uniform height; terrain type now indicated by tile color and decoration icons rather than elevation
  • Uniform tile depth — all hex prism sides same height for a clean, consistent grid appearance
v0.10.8.2 Fix Seamless Hex Tiling & Zoom-to-Cursor Fix March 20, 2026
Bug Fixes
  • Seamless hex tiling — hex corners are now computed in world space and projected through the isometric transform, so adjacent tiles share exact screen vertices with zero gaps
  • Zoom-to-cursor — fixed math error where pan offset wasn't adjusted relative to canvas center; scrolling now correctly zooms toward the mouse pointer
v0.10.8.1 Feature 3D Renderer Overhaul — Rotation, Zoom Fix, Enhanced Graphics March 20, 2026
New Features
  • 90° map rotation — rotate the isometric view in 90° increments via UI buttons or Q/E keyboard shortcuts
  • Zoom-toward-cursor — scroll wheel zooms toward mouse position instead of center; range expanded to 0.3x–4.0x
Improvements
  • Tile zoom fix — hex radius now scales with zoom level so tiles never split apart at any zoom
  • Enhanced 3D tiles — proper side faces with dark shading, gradient lighting on top face, separate top/side/highlight colors per terrain, water shimmer effect
  • Enhanced 3D units — tank with tracks/hull/turret/barrel, infantry with helmet/rifle/limbs, artillery with wheels/shield/angled barrel, recon vehicle with windshield/antenna; all with drop shadows
  • Enhanced decorations — layered tree canopies, multi-ridge mountains with snow caps, 3D buildings with roofs/windows, HQ compounds with triangular flags
  • Deterministic heights — mountain heights cached per tile position instead of random-per-frame
  • Minimap unit dots — units now visible on minimap with team colors
  • Improved sort order — painter's algorithm sorts by screen Y for correct overlap at all rotations
v0.10.8.0 Major Zero-Dependency Isometric 3D Renderer March 20, 2026
New Features
  • Self-contained isometric renderer — complete Canvas 2D engine with 3D-looking hex prism rendering; zero external dependencies, no CDN required
  • Hex prism depth — visible side faces with darker shading for convincing 3D depth effect using painter's algorithm
  • Terrain decorations — forest trees with trunks/canopies, snow-capped mountain peaks, city buildings, HQ structures with colored flags
  • 3D unit models — tank (body+turret+barrel), infantry (torso+head), artillery (base+barrel), recon (body+antenna) with team colors
  • Camera controls — click-drag pan, scroll-wheel zoom, reset button
  • Hex selection — click any hex to see terrain, coordinates, owner, and unit info
Improvements
  • Eliminated CDN dependency — no more Three.js CDN loading failures; works offline and behind any firewall
  • All 8 map generators — preserved from previous versions with identical algorithms
v0.10.7.1 Fix Three.js CDN Fallback March 20, 2026
Improvements
  • Local fallback — if CDN is blocked, Three.js loads from self-hosted /lib/three.min.js
  • Resilient loading — synchronous fallback via document.write ensures Three.js is available before game code runs
v0.10.7.0 Major 3D Hex Terrain — Three.js Prototype March 20, 2026
New Features
  • Three.js 3D renderer — full rewrite using Three.js r128 from cdnjs CDN with manual camera controls (no OrbitControls dependency)
  • Extruded hex terrain — CylinderGeometry hex tiles with terrain-based height variation (mountains elevated, water recessed)
  • 3D unit models — tank (body + turret + barrel), infantry (torso + head), artillery (base + angled barrel), recon (body + antenna) with team coloring
  • Terrain decorations — forest trees (trunk + canopy cones), mountain peaks with snow caps, city buildings, HQ compounds with flag poles
  • Manual camera orbit — left-drag orbit, right-drag pan, scroll zoom using spherical coordinates; no CDN dependency on OrbitControls
  • Hex raycasting — click-to-select hex tiles with emissive highlight and info panel display
  • Grid edge lines — hex tile edges rendered with THREE.EdgesGeometry for clear grid visibility
  • All 8 map generators — standard, continents, archipelago, pangea, highlands, desert wastes, forest basin, river networks
Improvements
  • Error banner — visible red error banner for debugging instead of silent failures
  • Version in header — game version displayed next to prototype title for easy identification
v0.10.6.3 Feature Isometric Hex Prototype — Zero Dependencies March 20, 2026
New Features
  • Zero-dependency renderer — complete rewrite using Canvas 2D with isometric projection; no CDN or external libraries needed
  • 3/4 isometric hex view — hex prisms with terrain-based height, side faces for depth, and back-to-front rendering order
  • Terrain decorations — trees on forests, snow-capped mountain peaks, city buildings with windows, HQ flags, water wave lines
  • Pan & zoom — click-drag to pan, scroll to zoom toward cursor, auto-fit on map generate
  • Hex selection — click any hex to see terrain type, coordinates, owner, and unit info
  • Unit rendering — infantry, tank, artillery, recon with distinct shapes and team colors
  • Minimap — live viewport indicator updates as you pan/zoom
  • All 8 map generators — standard, continents, archipelago, pangea, highlands, desert wastes, forest basin, river networks
v0.10.6.2 Fix 3D Prototype — Robust Initialization March 20, 2026
Bug Fixes
  • CDN consolidation — switched Three.js and OrbitControls to same CDN (unpkg) to prevent cross-CDN loading failures
  • OrbitControls fallback — tries both THREE.OrbitControls and global OrbitControls references; falls back to static camera with error message if neither loads
  • Camera switch — replaced OrthographicCamera with PerspectiveCamera for more reliable 3/4 view rendering
  • Error display — visible on-screen error messages instead of silent failures when Three.js or controls fail to load
  • Init guard — all render functions now check for initialized scene/camera/renderer before operating
Improvements
  • Version in header — game version now displayed next to "HEXARMY 3D VIEW PROTOTYPE" title
  • Smart camera framing — camera distance scales based on map size for proper framing at any grid dimension
v0.10.6.1 Fix 3D Prototype Rendering Fix March 20, 2026
Bug Fixes
  • Renderer initialization — fixed typo THREE.PCFShadowShadowMap that prevented WebGL renderer from initializing
  • OrbitControls — fixed bare OrbitControls reference to THREE.OrbitControls for CDN-loaded Three.js r128
  • Camera frustum — orthographic camera viewable area was microscopic (dividing by 150); now uses proper frustumSize-based calculation
  • Camera centering — camera and orbit target now auto-center on the generated map instead of always pointing at world origin
v0.10.6.0 Feature 3D Hex Terrain Prototype March 20, 2026
New Features
  • 3D terrain prototype — standalone test-3d.html page renders hex maps in full 3D with Three.js r128
  • All 7 map generators ported — standard, continents, archipelago, pangea, highlands, desert wastes, forest basin, and river networks render as 3D hex tiles with terrain-based height variation
  • 3D terrain features — forests rendered as cone trees, mountains as peaks, cities and HQs as buildings on the hex grid
  • 3/4 isometric camera — orthographic camera with OrbitControls for pan, zoom, and rotation
  • Hex selection — raycasting-based hex picking with coordinate display and terrain info
  • Placeholder 3D units — infantry, tank, artillery, jet, and helicopter models placed on the map
  • Fog of war — toggleable fog visualization on the 3D terrain
  • HEXARMY-themed UI overlay — controls panel, info panel, and minimap matching the dark military aesthetic
v0.10.5.0 Feature Battalion Tags on Player Names March 20, 2026
New Features
  • Battalion tag display — your battalion's [TAG] now appears in its emblem color before your callsign throughout the game
  • Tag shown everywhere — home screen, multiplayer lobby slots, turn indicators, ranked leaderboard, and dossier profiles
  • Server-side support — battalion data included in auth session, multiplayer join/start queries, and dossier search results
Improvements
  • Field Manual updated — battalion section expanded with tag visibility documentation
  • Design guide — comprehensive visual style reference document created
v0.10.4.0 Fix Multiplayer Lobby Fixes (7 Issues) March 20, 2026
Bug Fixes
  • Map preview proportions — canvas now preserves actual map aspect ratio instead of stretching to fill frame
  • Accept Faction button — now a static button below the faction selection frame that never scrolls off-screen
  • Faction change — players can change their faction after accepting but before selecting Ready
  • Team designator — updates correctly when player changes team
  • Teammate faction visibility — same-team players can now see each other's faction selection (blind pick preserved for opponents)
  • Ready indicator — READY badge now displays correctly next to each player in the lobby
  • Game start logic — fixed critical bug where local player's ready state wasn't written to the players object, preventing game start even when all players were ready
  • Fatal syntax error — fixed duplicate variable declaration that prevented the entire game from loading past the splash screen
  • Button overflow — Command row buttons (Tournaments, Service Record) no longer clip text on narrower viewports
v0.10.3.0 Feature Features & Release Notes Pages March 20, 2026
New Features
  • Features page — marketing-focused showcase highlighting all game systems, accessible from footer
  • Release notes page — full version history with color-coded tags, accessible from footer
  • Footer links — Features and Release Notes links open in new browser tabs from below the version display
v0.10.2.0 Feature Ranked Ladder System March 20, 2026
New Features
  • Ranked ladder — multiplayer games can now be flagged as ranked for competitive ELO tracking
  • Human-only enforcement — ranked matches require all player slots to be filled by authenticated human players; no AI allowed
  • Individual ranked leaderboard — top 100 players by ELO with battalion affiliation, win rate, and streak data
  • Battalion ELO system — battalions earn their own ranked ELO based on members' ranked match results
  • Battalion ranked leaderboard — top 100 battalions by ranked ELO with member counts and win rates
  • Battalion ranked profile — detailed battalion stats, ELO history, and top members display
v0.10.1.0 Feature Multiplayer Lobby & Tournament Polish March 19, 2026
Improvements
  • Public lobby browser — real-time game list with Socket.io live updates
  • Password-protected rooms — private games with bcrypt-hashed passwords
  • Tournament bracket system — single-elimination tournaments with automatic progression
  • Stale game cleanup — auto-cancels abandoned lobbies after 30 minutes
v0.8.0.0 Major 4-Player Multiplayer March 18, 2026
New Features
  • 2–4 player matches — host selects player count when creating a room
  • Team configurations — FFA, 2v2, 2v1v1, 3v1, and 2v1 modes
  • Player elimination — eliminated players are removed from turn order; game continues until one remains
  • Turn order system — sequential turns with skip for eliminated players
  • Color-coded players — P1 Blue, P2 Red, P3 Yellow, P4 Green
v0.7.4.0 Feature Responsive Design March 18, 2026
Improvements
  • Fluid scaling — all UI elements use clamp() for smooth scaling across desktop and tablet
  • Responsive breakpoints — 4 media queries at 1280px, 1024px, 860px, and 768px
  • Click-to-enlarge map preview — full-screen modal for map inspection at any resolution
  • Responsive faction selection — stacked layout on smaller screens
v0.7.3.0 Feature Auto-Movement & Waypoint Pathfinding March 18, 2026
New Features
  • Waypoint system — set multi-turn movement paths for units that execute automatically each turn
  • Pathfinding — A* pathfinding calculates optimal routes accounting for terrain movement costs
  • Visual waypoint trail — dashed path overlay shows planned movement routes on the map
v0.7.0.0 Major New Units, Combat Rework & Faction Reveal March 18, 2026
New Features
  • Transport naval unit — carries up to 3 foot/vehicle units across water; no attack capability
  • AA Frigate naval unit — fleet air defense ship with anti-air auto-fire and Missile Salvo ultimate
  • Dramatic faction reveal — cinematic curtain animation reveals opponent's faction at game start
  • Radar & vision overhaul — mountain LOS blocking, improved fog of war
Balance Changes
  • Complete combat rework with updated unit effectiveness tables
  • Terrain defense bonuses rebalanced for all terrain types
  • Faction budget and production weight adjustments
v0.6.6.0 Feature Full Hex Terrain Rendering Overhaul March 17, 2026
Improvements
  • New terrain rendering — rich visual terrain with distinct textures for all terrain types
  • Intel panel LOS enforcement — information panels respect fog of war visibility
v0.6.5.0 Feature Profile Page & Auth Gate March 17, 2026
New Features
  • Callsign profile page — account management with password change and profile visibility toggle
  • Main page auth gate — streamlined login/register flow on the home screen
  • Personnel dossiers — searchable public profiles with paginated browse and ribbon bar display
v0.6.2.0 Feature Mountain LOS & Public Service Records March 17, 2026
New Features
  • Mountain line-of-sight — mountains now block vision, creating tactical blind spots
  • Public service records — opt-in profile visibility for other commanders to inspect
v0.6.0.0 Major Epic Maps & 7 Map Generators March 17, 2026
New Features
  • 5,000 tile maps — massive battlefields for extended strategic campaigns
  • 7 map generators — Continents, Archipelago, Pangaea, Desert Storm, Pacific Islands, Frozen Steppe, European Plains
  • Terrain-first generation — natural landmass shapes with organic continent and island formations
  • Fog of war: hidden faction — enemy faction identity is concealed until the dramatic faction reveal
v0.5.8.0 Feature Nuclear Overhaul & Radiation March 17, 2026
New Features
  • Nuclear rework — overhauled nuclear strike mechanics with area-of-effect radiation zones
  • Radiation system — irradiated terrain damages units over time, creating denial zones
  • Visual polish — enhanced explosion effects and irradiated terrain rendering
v0.5.5.0 Major Ruthless AI: Faction Strategy Engine March 17, 2026
New Features
  • 10 faction-specific AI strategies — each faction uses unique tactical priorities, aggression levels, and production weights
  • Simulation-driven tuning — AI strategies balanced through automated battle simulations
  • Adaptive behaviors — AI retreat thresholds, income raiding, and camp priorities vary by doctrine
v0.5.3.0 Major New Units, Stacking & Nuclear Warfare March 16, 2026
New Features
  • Unit stacking — multiple units can occupy the same hex tile
  • Nuclear warfare — devastating area-of-effect weapons that reshape the battlefield
  • New unit types — expanded army roster with additional tactical options
v0.5.0.0 Major Multiplayer PvP System March 16, 2026
New Features
  • Real-time PvP — Socket.io-powered multiplayer with room codes and lobby system
  • Blind faction pick — simultaneous faction selection without knowing opponent's choice
  • ELO rating system — competitive ranking with lifetime and monthly ladders
  • Disconnect recovery — games pause on disconnect with 60-second grace period for reconnection
v0.4.1.0 Feature 50 New Achievements & Tiered Ribbon System March 16, 2026
New Features
  • 97 total achievements — expanded from 47 with new milestones across all categories
  • Tiered ribbon system — visual commendation ribbons displayed on service records and dossiers
  • Server-side validation — all achievements verified server-side to prevent manipulation
v0.4.0.0 Major AI Intelligence Overhaul March 16, 2026
Improvements
  • Smart AI — complete AI rewrite with terrain analysis, threat mapping, and target prioritization
  • Unit effectiveness matrix — 15x14 matchup table guiding AI combat decisions
  • Three difficulty levels — Easy, Medium, and Hard with distinct AI behavior parameters
v0.3.0.0 Feature Save/Load System & UI Polish March 16, 2026
New Features
  • Save/load system — 3 save slots per player with server-side persistence
  • UI readability overhaul — improved fonts, colors, and contrast across all panels
  • State cleanup — proper game state management on exit and resume