
Roll-up patch · v0.30.0 → v0.31.15 · 29 April 2026
Tech Tree goes live. Every system audited.
Commanders,
Sixteen patches since "Rules of Engagement" landed. The headline is the Tech Tree — a per-game research system with 60 nodes across 10 doctrines, the first fully-resolved branch (Air Superiority) live in combat, and a clean resource HUD that reads at a glance. Underneath that, every major system got walked end-to-end and audited: ultimates, faction modifiers, AI movement accounting, sprite art. Twenty-plus real bugs found and fixed. One promised-but-missing capability (engineer city repair) finally exists. The HUD that used to scatter resources across three corners of the screen now reads in one row.
This is the build to play if you've been on default since 0.20.22.
Per-game research, reset on every match start, no meta-grind. Ten branches: Infantry, Armor, Artillery, Air Superiority, Naval Power, Reconnaissance, Engineering, Anti-Air, Logistics, Command. Each branch has 5 stat-bump tiers and a unique L6 capstone with a bespoke mechanic — Stealth Bombers, Saturation Strike, Satellite Deployment, Corpsman Up!, Sky Curtain, Spearhead Doctrine, Forward Operating Logistics, Phantom Striker, Supreme Command, and more.
Research Points accrue automatically: 5/turn baseline, +2 per owned city, +5 per captured HQ, +1 per FAB. Aggression scales your tech faster than turtling. Each faction has one favored branch at −25% cost, so doctrine identity carries through into research.
Linear unlock per branch. L2 needs L1, L6 needs L5. No leapfrogging to capstones — you have to commit to a build.
Save format additive. 0.20.x saves load cleanly with all branches at level 0.
The 10×6 overlay opens from a button at the bottom of the Intel Panel. Each node shows its description, cost, and state — purchased (green check), available (clickable), locked (greyed with prereq text). Capstones get a gold border. Faction-favored branches show a −25% FAVORED tag and strike through the base cost.
The first branch with all 6 levels resolved end-to-end:
L1 Jet Engine Tuning — Jet and Helicopter deploy with +1 MOV
L2 Targeting Pod — Jet deploys with +5 ACC
L3 Chaff Dispenser — air units gain +10 DGE against AA reaction fire
L4 ECM Suite — each air unit ignores the first AA reaction shot per turn
L5 Air-to-Ground — Jet attacks against ground (foot/tracked/vehicle) get +2 ATK
L6 Stealth Bombers (capstone) — AA fired at Bombers takes −75% accuracy and −75% damage
The other nine branches accept purchases now (so RP isn't wasted) but their bespoke effects ship branch-by-branch in 0.31.x patches. Generic stat-bump effects (unitStat deltas) auto-apply across all branches via a unified createUnit hook — about 70% of all tech effects already work on whatever you research.
Bottom panel is now the canonical place to read your economy: TURN · GOLD · RESEARCH · UNITS · CITIES · FACTION. Both gold and RP show their +N/turn income on the second line. The duplicate counters at the top of the screen (next to the faction flag) and on the Tech Tree button are gone. One row, one read.
If your eye was bouncing between three corners of the screen — that's done.
v0.20.17 added the "spend all your MP, no attack" rule centrally to doAttack and attackCity. The intent was for the gate to apply equally to player and AI. But the AI relocates units by teleporting them (assigning row/col directly) instead of going through the player's moveUnit() pipeline — and moveUnit() is what deducts MP. The AI's teleport left movRemaining at full, so the gate that checks movRemaining ≤ 0 was permanently disabled for the AI.
The AI could move-then-attack with full MP intact, regardless of distance traveled.
Fixed at every AI relocation site: a new _aiDeductMoveCost helper looks up the path cost from the Dijkstra map produced by getMovableHexes and clamps movRemaining accordingly. Plus the move-then-attack candidate evaluator now simulates the post-move MP, so the AI doesn't plan attacks from positions that would zero out its MP and then waste its turn moving to a useless hex.
Practical result: late-turn AI charges across the map are now properly capped. The AI has to commit, just like you do.
Blitz has been silently broken since v0.20.17. Activation correctly reset movement and flagged the tank for a second attack — but the v0.20.17 movement gate (mentioned above) didn't carve out an exception for Blitz, and the first Blitz attack zeroes movRemaining. So the second attack always rejected with "has no movement left and cannot attack."
Three weeks of patches, Blitz's documented "two attacks per turn" was actually one attack with extra cooldown. Now it works as written. The exemption is tight: only fires when blitzActive && blitzAttackCount >= 1, so it can't be exploited for a third attack.
Four ultimates that deal direct damage outside the normal doAttack pipeline — Strafe Run (helicopter), Broadside (destroyer), Barrage (artillery), Nuclear Strike — were not crediting their kills toward the firing unit's promotion. Most painful with helicopters: their ultimate is a kill machine but it was contributing zero toward Veteran/Specialist/Commander.
Centralized the bookkeeping in a new _aoeRecordHit helper. All four sites route through it. Promotion progression and end-of-game session stats now both register correctly. Slain enemy commanders also correctly free their commander slot via _promoHandleDeath.
Walked all 19 unit ultimates end-to-end — activation handler, in-combat consumption, end-of-turn cleanup. Most worked correctly. Four real bugs:
Engineer Fortify — was reading gameState.hoveredHex instead of the engineer's own hex. AI engineers couldn't fortify at all; player engineers fortified random tiles unless the cursor was over the target. Fixed.
Submarine Dive (single-player) — endTurnCleanup had two separate ultActive-- blocks, so subs surfaced after 1 turn instead of the documented 2. Fixed.
Submarine Dive (multiplayer) — the MP turn cleanup never cleared submerged/diveBonus. MP subs stayed underwater forever. Fixed.
AA Ship Missile Salvo — "guaranteed hit vs air" was documented but never implemented. Now AA Ships actually get a 100% hit chance against air targets when Salvo is active. Antiair Salvo deliberately does NOT — its description doesn't claim that.
Also corrected the Recon Deep Scan ult description (was "Vision range 8 for 1 turn", which sounded omnidirectional; actually a directional 8-tile corridor scan).
Walked every modifier defined in the FACTIONS table and confirmed each one is actually read by runtime code. Five real bugs and one dead-code typo:
Canada jetHeliCostIncrease: 20 — never read by getEffectiveCost. The cost calc handled airCostIncrease (India) and jetCostIncrease (Iran) but missed Canada's third synonym. Canada's +20% jet/heli cost penalty was zero. Fixed.
China produceReduction: 0.10 — defined and shown in the bonus list, but never applied to city production cost. Fixed in both player and AI production paths.
UK engineerFortifyCD: -1 — defined and displayed, but the ultimate handler used the raw def.ultCD. Engineer Fortify CD was running at 5 instead of 4. Fixed.
China reconDeepScanCD: 2 — same root cause. Recon Deep Scan CD was running at 3 instead of 2. Fixed.
Iran jetAccPenalty: -10 — was being double-applied to jets and incorrectly leaking onto helicopters. Now applies once to jets only. Same fix for jetHpPenalty.
Removed a dead-code typo on jetHeliDgePenalty (no faction defined that key — the real one is heliJetDgePenalty).
The other ~50 modifiers were confirmed in active code paths. No balance changes in this patch — every fix brings in-game behavior into line with what was already documented.
The Field Manual has described engineer city repair for releases ("Engineers also repair owned cities — 20% per action; Canada: 40%"). The engineerRepairRate modifier was set on USA / Canada / Russia. The bonus list bragged about it. But no action button or handler existed.
When a player engineer is on or adjacent to an owned damaged structure (City / HQ / FOB / FAB / Port), a 🔧 Repair action card appears on the action bar. Single target → repair fires immediately. Multiple targets → enter a targeting mode (gold highlight on valid hexes), click the structure to repair.
Repair amount: −20% damage per action by default, −40% Canada (highest in the game), −15% Russia. Consumes the engineer's MOV and ATK for the turn but does not sacrifice the engineer the way camp construction does — the engineer can keep repairing on subsequent turns.
PvP: action broadcasts to the opponent so both clients see the same damage value.
Medium and Hard AI engineers now auto-repair the most-damaged adjacent owned structure when they can't build a camp from their current tile. Easy-difficulty AI does NOT repair, matching the existing easy-no-engineer-camps policy. The AI threshold is max(15%, repair%) damage — small scratches get ignored when there's offensive value to be had elsewhere.
The Engineering Tech Tree's L1 node ("Sapper Drill: Engineer city repair rate +10%") finally has an in-game effect. Stacks on the faction base rate via a new generic getResearchEffectDelta(kind) helper. Canada + Sapper Drill = 50% repair per action; USA + Sapper = 30%; Russia + Sapper = 25%; default + Sapper = 30%. The same generic helper is reusable for fieldMedicHealDelta, structureSelfRepairDelta, and other delta-payload research effects as their resolver hooks land.
A long list, kept short.
UK HQ income shown as a bonus (v0.31.1). Was being labelled a penalty against a phantom 200g baseline. The actual default is 150g/turn — UK's 175g is a +25g bonus, not a penalty. Fixed in both faction-card displays and the Field Manual.
Sleeping units marked on the Unit Roster (v0.31.2). Sleeping units (which set moved=true; attacked=true to short-circuit their turn) were rendering identical to genuinely-exhausted units. Now: 💤SLEEP label, distinct moon icon, blue-tinted row, "MOV ZZZ / ATK SLEEP" instead of "MOV 0/N / ATK NO".
Player rank in Personnel Dossiers (v0.31.3). Every dossier row now shows the player's military rank as a tier-tinted badge (green enlisted, silver warrant, gold officer) to the left of the callsign. Hover for full grade and title.
Terrain Density actually affects larger maps (v0.31.4). The setting was working for small maps but quietly broke down on anything bigger than ~25×25 because the placement loop had a hard-coded 200-attempt cap. On a 100×100 at High density, the requested forest count is ~1,400 tiles — the loop bailed at 200 every time. All three densities produced near-identical large maps. Cap is now scaled with the requested count.
Promotion progression bar on unit information (v0.31.6). Both unit info panels (Intel Panel and bottom command card) now show how close each player unit is to its next promotion — bronze for Veteran, silver for Specialist, gold for Commander. Bar fills toward whichever path (kills, combats, captures, longevity) is closest to its threshold.
Fog of war no longer leaks from re-entered draft (v0.31.9). Repro: start match → draft → click Back → start again. Before this patch, the entire map and minimap stayed revealed for the rest of the game. The visibility rebuilder revealed every tile during the draft preview but didn't track those writes in its dirty-tile list. Fixed.
Sprite transparency audit (v0.31.15). Audited all 598 unit and HQ sprite PNGs. Five problems fixed: four AA Ship non-directional sprites (RGB without alpha — solid gray/white backdrops in selected-unit panels and production menu) and the New Zealand HQ sprite (RGBA mode but every pixel opaque — rendered as a 300×300 solid white block with the building inside). All 598 sprites verified RGBA-transparent.
The Tech Tree is the new system to learn. The HUD is the cleaner place to read your economy. The AI fights to the same standard as you do — including the Tank Blitz it never had until now. Twenty-plus bugs across the audit pass are gone. Every faction's modifiers actually fire. Every ultimate's kill counts. Every sprite has a transparent background.
Research a branch. Patch a city. Watch the AI commit.
v0.31.15 — Roger, Command.