Every Last City — The Unit Roster and the Escalation of Complexity
Status: Design proposal v0.1 · Owner: unassigned · Depends on: direction.md, stack-decision.md
Clean-room note: EDCE.pdf and EDCE.txt are present in the working directory. Neither was opened
in the production of this document. Every value here is derived from a stated design intent and the
derivations are shown, so any number can be re-argued on its own terms without reference to anything
outside this file.
1. The problem
Two problems, and they turn out to be one problem.
Problem one: how does a player grow into the depth? A game of this shape has a real cliff. The loop — cities make units, units take cities — takes ninety seconds to explain. The roster that makes the loop interesting takes an hour. The classic answer was to ship four fixed unit sets of escalating richness and make the player pick one in the setup screen. That answer has four things wrong with it, and they are not small:
- It asks the wrong person to choose. The setup screen is where a new player is least equipped to judge how much complexity they want. They pick blind, and they pick wrong in both directions.
- It builds four games and ships them as one. Four rosters is four balance surfaces, four sets of AI evaluation weights, four regression suites, four communities. In practice three of them get a fraction of the testing and one of them becomes "the real game."
- It never lets you grow. Learning happens across games, not within one. The only way to see more of the game is to abandon the game you are in and start a different one at a higher setting.
- The complexity is a packaging decision, not a play decision. It is a menu, not gameplay. That is a waste: the question "how much machinery do I want running" is one of the most interesting questions a strategy game can ask, and it is being answered before the game starts.
Problem two: design a roster. Twenty-odd units, each with a defensible role, none dominated, covering ground, sea, air, transport and specialists, expressible as pure data.
These are one problem because the roster is the complexity. There is no separate "advanced rules module." Air combat rules are invisible until an aircraft exists. Submarine detection is invisible until a submarine exists. Flak is invisible until something can fly. If you control when unit classes become available, you control the entire complexity curve for free, with no second system. That observation drives everything below.
2. Decision one — complexity arrives through the Industry ladder
2.1 The alternatives, weighed honestly
| Approach | Onboarding | Replayability | Balance surface | Content cost | Verdict |
|---|---|---|---|---|---|
| Fixed tiers chosen at setup | Works, but the choice is made blind by the person least able to make it | Four separate games; you replay within a tier | ×4 | ×4 rosters | The safe answer. Rejected — it converts a play decision into a menu. |
| One roster + optional systems toggled at setup | Good if the toggles are few; a wall of checkboxes is worse than four tiers | High — orthogonal toggles multiply | ×2^n, and the interactions are the hard part | ×1 roster + n systems | Close second. Rejected because most "systems" here are units, so the toggles would just be a clumsier version of what follows. |
| In-game progression | Excellent — the first ten turns have four units in them | High — the curve is a strategic axis | ×1 | ×1 roster + a ladder | Chosen. |
| Scenario-driven rosters | Good for a campaign, useless for skirmish and multiplayer | Depends entirely on scenario supply | ×1 per scenario, but no global balance | Unbounded | Rejected as the primary mechanism; kept as a layer on top (a scenario can pin the ladder). |
2.2 The design
Complexity escalates inside a single game, driven by a thing the player already understands and already manages: their cities.
Every city has an Industry rating, 1 to 4. Industry determines two things and nothing else:
- how much the city produces per turn (its Output, in build points, BP), and
- which unit classes the city may build.
| Industry | Name | Output (BP/turn) | Cost to reach | Unlocks |
|---|---|---|---|---|
| 1 | Depot | 4 | — (all cities start here) | 5 units — the whole simple game |
| 2 | Workshop | 7 | 30 BP | +3 units — armour, real warships, the sky |
| 3 | Foundry | 11 | 60 BP | +6 units — concealment, strategic air, engineering, amphibious assault |
| 4 | Arsenal | 16 | 120 BP | +6 units — fleet-scale power and strategic reach |
An upgrade is queued in the city's production queue exactly like a unit. It occupies the queue, costs BP, and finishes when it is paid for. There is no research, no research points, no tech tree, no choosing a branch. You are not managing a second economy; you are deciding whether this city builds a thing or builds itself. That decision already existed in shape — it is a build-order decision — and it is now the ladder.
Unlocks are per-city, not per-empire. Your frontier towns are cheap infantry mills. Your one Arsenal on the safe coast is where carriers come from. This is deliberate and it is worth more than it costs:
- It gives the map an industrial geography. There is now a reason to raid two hundred tiles behind the line, and a reason to garrison a city that is nowhere near the front.
- It is legible in the vocabulary players already have: "that city has a shipyard, this one doesn't" needs no tutorial.
- It stops a single lucky capture from unlocking the whole game.
Capture degrades Industry. A captured city drops one Industry level (minimum 1) and loses all accumulated build progress. Taking an Arsenal gets you a Foundry and a bill for 120 BP. This is the single most important balancing rule in the proposal: without it, conquest of a developed empire is a jackpot and the game snowballs on capture rather than on production. With it, conquering an industrial core is an investment — you still have to rebuild it — and defending yours is proportionally more valuable than defending a frontier town.
Everything is previewable and nothing is hidden. The encyclopedia is complete from turn one. You can inspect what Industry 3 will give you before you spend a point on it. Enemy city Industry is visible whenever you have vision on the city, which makes scouting industry a genuine objective. There is no fog over rules, only over the map.
2.3 What the setup screen does instead
Setup no longer picks a roster. It picks the shape of the curve — four numbers, all of which mean something obvious:
| Preset | Start Industry | Cap | Upgrade costs | What it is for |
|---|---|---|---|---|
| Outpost | 1 | 2 | ×1 | First game. Eight unit types, ever. A complete game of land, sea crossing and escort. |
| Standard | 1 | 4 | ×1 | The full arc. The default. |
| Escalation | 1 | 4 | ×0.6 (18 / 36 / 72) | Shorter games; the deep roster arrives by mid-game. |
| Total War | 3 | 4 | ×1 | Starts at the Foundry. For players who want the deep game immediately, and the only reliable way to get tier-4 play tested. |
| Fixed | n | = n | — | Freezes the roster at one tier. |
That last row deserves a sentence, because it is the argument in miniature: the classic fixed-tier experience falls out of this design as a degenerate case, for free. Anyone who wants "pick a set and play it" sets start = cap and has exactly that. We get their mode as a special case of ours; the reverse is not true.
Mixed-skill play gets a further tool: the cap is settable per player. A veteran capped at Industry 2 against a newcomer with 4 is a real, legible handicap ladder that costs no extra content.
2.4 What this does to onboarding
Turn 1 of a first game presents five units. Not twenty. By the time the sixth exists, the player has spent fifteen turns learning what the first five do, in a live game, with something at stake. Each unlock is presented as a single card on arrival: one sentence of role, the stat line, and the two units it beats and the two that beat it.
The hole in this — and it is a real hole — is that you can meet a unit class before you can build one. The mitigation is a contact briefing: the first time you sight an enemy unit class you have not built, its card opens. Stats are public information in this game; the fog is over positions, not over rules. A player who is out-teched should be beaten by tempo, not by surprise.
3. The attribute schema, and the combat model the numbers assume
Combat resolution belongs to another subsystem. But numbers are meaningless without a procedure, so this is the procedure the roster is tuned against. If the combat author changes it, the roster needs re-tuning, not redesign — the relationships survive; the constants move.
3.1 Attributes
Every unit is these integers plus a flag list. No unit has a special case in code.
| Attribute | Meaning |
|---|---|
cost |
BP to build |
industry |
Minimum city Industry required |
upkeep |
BP/turn charged to the empire = ceil(cost / 20) |
move |
Movement points per turn |
vision |
Sight radius in tiles |
hits |
Damage absorbed before destruction. Damage persists between turns. |
atkLand / atkSea / atkAir |
Attack strength against each domain. 0 = cannot engage that domain. |
def |
Defence strength against all attackers |
flak |
Return fire against air attackers only, resolved before the exchange |
slots |
Transport slots this unit occupies as cargo |
capacity |
Transport slots this unit provides |
Three attack numbers instead of a per-unit target matrix is the load-bearing simplification. It puts every counter relationship in three integers a player can read off a card, it is trivially data-driven for custom sets, and it makes "this thing cannot touch that thing" expressible as a zero rather than as a rule.
flak is the second one. It means anti-air is a property of units rather than a special unit
class, so a destroyer is naturally dangerous to aircraft without any code that knows what a
destroyer is — and it means the anti-air rules are dormant, and invisible, in a game where nobody
has built an aircraft. That is the escalation argument working.
3.2 Resolution (integer-only, per-mille)
All strengths are carried in per-mille (atk 4 → 4000) so modifiers compose without loss.
A = attacker's atk[domain of defender] × Π modifiers (per-mille)
D = defender's def × Π modifiers (per-mille)
share = clamp( A * 1000 / (A + D), 50, 950 ) // integer division
Then repeat: draw r = prng.next(1000). If r < share, the defender loses 1 hit; otherwise the
attacker loses 1 hit. Continue until a side reaches 0 hits, or until the attacker's strikeRun
round limit is reached (air and raiding units break off; ground and naval units fight it out).
The clamp at 50/950 guarantees nothing is ever mathematically impossible, which matters because a player who is told "0%" and then loses feels cheated, and a player who is told "5%" and loses does not.
This is exactly representable, exact to compute expected outcomes for, and therefore the UI can show the honest win probability before you commit — a Markov race between two hit counts is a closed form. That is a modern-UX win that a dice-table system cannot offer.
3.3 The modifiers that give combat texture
| Modifier | Effect on D |
Why |
|---|---|---|
| Defender in a city | ×1500 | Cities should be hard. This is what makes infantry the answer to everything. |
| Defender in rough terrain | ×1200 to ×1400 (terrain subsystem owns the table) | Positioning matters |
| Entrenched — did not move last turn | ×1250 | Rewards patience; punishes constant shuffling |
| Suppressed — took bombard damage this turn | entrenchment lost, terrain/city bonus halved | The combined-arms lever |
| Attacker attacking from aboard a transport | attacker's A ×750 |
Amphibious assault should be expensive |
Bombard is the combined-arms mechanic and the answer to the "flat attrition" complaint in §6 of
the direction brief. A unit with the bombard flag spends its whole turn firing at a target within
range. It resolves shots single rounds; the target takes hits, the firer takes none, and
bombard cannot reduce a target below 1 hit — artillery softens, it never takes ground. Bombard
ignores the entrenchment multiplier (artillery is precisely the thing that un-digs a dug-in unit)
and applies Suppressed on any hit.
That one rule turns a hopeless frontal assault into a viable operation, as §5.2 shows with numbers.
3.4 Stacking assumption
The roster is tuned for one combat unit per land tile outside cities (cities and transports hold
many; cargo does not count). This is stated because it changes everything: it is what makes five
cheap units genuinely different from one expensive one, what makes bombard range matter, and what
keeps the creation-order activation queue from becoming a stack-management chore. If the rules
author chooses a small cap (2–3) instead, hits values on cheap units should come down ~15%.
4. The roster
Twenty units. Every one has a one-sentence role, and the role names a thing no other unit does.
4.1 Tier 1 — Depot (Industry 1). The complete simple game.
| Unit | Cost | Move | Vis | Hits | atkL | atkS | atkA | Def | Flak | Slots/Cap | Key flags |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Scout | 12 | 5 | 4 | 3 | 2 | 0 | 0 | 2 | 0 | 1 / — | capture, foot |
| Infantry | 20 | 2 | 2 | 6 | 4 | 1 | 0 | 5 | 1 | 1 / — | capture, entrench, foot |
| Field Gun | 26 | 2 | 2 | 4 | 7 | 3 | 0 | 2 | 1 | 1 / — | bombard(range 2, shots 2), foot |
| Transport | 30 | 6 | 2 | 8 | 0 | 0 | 0 | 3 | 1 | — / 6 land | naval, draft 1, cargoLost |
| Corvette | 34 | 8 | 3 | 7 | 3 | 6 | 0 | 5 | 3 | — / — | naval, draft 1, shoreBombard(1) |
- Scout — reveals the map and punishes an undefended flank. It can capture, which is the entire reason your rear cities need garrisons. Three hits and defence 2 mean a single Infantry stops it dead, so this is a punishment for carelessness, not a strategy.
- Infantry — takes cities and holds them; nothing on land is more cost-efficient at defending
one. Note
def 5 > atkLand 4: infantry is better at holding than taking. That asymmetry is the spine of the land game — the attacker must bring more than the defender, always. - Field Gun — grinds down a dug-in defender so that infantry can finish it; cannot take ground itself. The tier-1 unit that teaches combined arms, deliberately placed at the bottom of the ladder so that the most interesting mechanic in the game is available in the first fifteen turns.
- Transport — the only tier-1 way to move an army across water, and helpless while doing it. 8 hits so it does not evaporate; defence 3 so it must never travel alone. If it sinks, the cargo sinks with it.
- Corvette — escorts convoys and contests coastal water; the cheapest thing that can sink a
transport.
draft 1lets it go up rivers and into shallows where nothing bigger can follow, which is what stops it from ever being obsoleted by the Destroyer.
Five units and the game is already complete: expand on land, cross water, contest the crossing, besiege a city. An Outpost-preset game never needs more than this plus tier 2.
4.2 Tier 2 — Workshop (Industry 2). Land war gets fast; the sky opens.
| Unit | Cost | Move | Vis | Hits | atkL | atkS | atkA | Def | Flak | Slots/Cap | Key flags |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Armour | 52 | 4 | 3 | 8 | 9 | 2 | 0 | 6 | 1 | 2 / — | capture, tracked |
| Destroyer | 64 | 10 | 4 | 10 | 4 | 9 | 5 | 7 | 6 | — / — | naval, draft 2, sonar, shoreBombard(1) |
| Fighter | 46 | 14 | 6 | 5 | 3 | 3 | 9 | 4 | 0 | — / — | air, endurance 2, intercept, strikeRun 2 (vs ground/sea) |
- Armour — breaks a line and exploits the gap, and is badly punished by rough ground. It costs
2.6 infantry, takes two transport slots, and
trackedmakes forest, swamp and mountain expensive or impassable. Two Infantry (40 BP, 12 hits, entrenchable) beat one Armour on the defence; one Armour beats two Infantry in the open. That is the trade, and it is a map question. - Destroyer — the fleet's general-purpose escort, and the only mid-tier hull that can shoot at
both submarines and aircraft.
sonarandflak 6are both dormant at the moment it unlocks, which is the point: it is a good ship today and becomes the indispensable ship the moment your opponent reaches Industry 3. - Fighter — owns the sky over your own ground; short-legged, and near-useless against anything
dug in.
atkLand 3is deliberately feeble. Fighters win air superiority and see a very long way; they do not win ground battles.endurance 2— two turns aloft before it must be on a city, airfield or carrier — caps its radius at about 14 tiles and makes airbase geography a real concern.
4.3 Tier 3 — Foundry (Industry 3). Concealment, strategic air, engineering, assault.
| Unit | Cost | Move | Vis | Hits | atkL | atkS | atkA | Def | Flak | Slots/Cap | Key flags |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Engineer | 44 | 2 | 2 | 5 | 1 | 0 | 0 | 3 | 1 | 1 / — | capture, build[road,airfield,fort,bridge], repair 1, foot |
| Air Defence Battery | 42 | 2 | 4 (8 vs air) | 5 | 1 | 0 | 11 | 4 | 12 | 1 / — | interceptZone 1, reactiveOnly, foot |
| Landing Ship | 70 | 7 | 2 | 12 | 3 | 0 | 0 | 5 | 3 | — / 4 land | naval, draft 1, assaultLanding |
| Heavy Artillery | 72 | 1 | 2 | 6 | 14 | 6 | 0 | 3 | 1 | 3 / — | bombard(range 3, shots 3), siege, foot |
| Submarine | 86 | 8 | 3 | 8 | 0 | 14 | 0 | 5 | 0 | — / — | naval, draft 2, submerged, ambush |
| Bomber | 88 | 12 | 4 | 6 | 12 | 10 | 1 | 3 | 0 | — / — | air, endurance 2, strikeRun 3, cityStrike 1 |
- Engineer — turns terrain into infrastructure; the only way to make a large map traversable and a captured city defensible. On maps at the top of the supported size range this is not a specialist, it is the strategic-movement system. Also repairs 1 hit/turn to an adjacent friendly unit, which is the field answer to persistent damage.
- Air Defence Battery — makes a stretch of sky expensive and is useless against anything on the
ground.
reactiveOnly: it never attacks on its own turn. It engages any hostile air unit that ends movement within 1 tile.atkLand 1guarantees it can never be repurposed. - Landing Ship — puts an assault ashore against a defended beach instead of needing an empty one. Cargo may attack directly from aboard at ×750 attack. This is what stops island maps from degenerating into "whoever owns the water wins by default."
- Heavy Artillery — reduces fortified cities, and is nearly immobile and defenceless without a
screen.
siegedoubles bombard effect against units in cities and forts.move 1andslots 3make moving a siege train an operation in itself. - Submarine — kills shipping and heavy hulls from concealment, and is helpless once found.
atkSea 14is the highest sea attack until tier 4 and is meant to be frightening.submerged: invisible except tosonarunits and to anything adjacent.ambush: the first round of an attack it initiates is free — the defender cannot score. Cannot attack land or air, cannot capture. - Bomber — projects force anywhere inside a wide radius, and is the only unit that can knock a
city's works offline.
cityStrike 1: a successful strike on an undefended city destroys accumulated build progress and, on a strong result, drops Industry by 1. That makes strategic air a way to attack an opponent's curve, not just their units — a legible answer to a runaway leader that does not require an invisible economic tax.
4.4 Tier 4 — Arsenal (Industry 4). Fleet-scale power and strategic reach.
| Unit | Cost | Move | Vis | Hits | atkL | atkS | atkA | Def | Flak | Slots/Cap | Key flags |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Missile | 58 | 24 | 1 | 1 | 18 | 18 | 0 | 1 | 0 | — / — | air, endurance 1, expendable, strikeRun 4 |
| Air Transport | 84 | 16 | 4 | 6 | 0 | 0 | 0 | 2 | 0 | — / 2 (slot-1 only) | air, endurance 2, airdrop |
| Heavy Armour | 124 | 4 | 3 | 14 | 16 | 3 | 0 | 11 | 2 | 3 / — | capture, tracked |
| Heavy Bomber | 132 | 14 | 5 | 9 | 16 | 12 | 0 | 5 | 0 | — / — | air, endurance 3, strikeRun 4, cityStrike 2, highAltitude |
| Cruiser | 160 | 9 | 5 | 18 | 12 | 16 | 8 | 12 | 10 | — / — | naval, draft 3, sonar, shoreBombard(2) |
| Carrier | 170 | 9 | 5 | 16 | 0 | 2 | 0 | 8 | 8 | — / 4 air | naval, draft 3, airbase, repairAir 2 |
- Missile — buys one guaranteed heavy blow anywhere in reach, at a price, once. Consumed on use. Interceptable by Fighters and by Air Defence Batteries, which is what keeps it honest. Its real function is economic: it is the way a player with a production lead converts BP into effect without adding permanent units and upkeep to the board. That is anti-snowball by construction.
- Air Transport — drops infantry behind the line; the only unit that can seize a rear city with no ground approach. Carries slot-1 units only, so it moves Infantry and Engineers, never Armour.
- Heavy Armour — the hammer that cracks a dug-in line, expensive enough that losing one is a
campaign event.
slots 3means one Transport carries two of them and nothing else. - Heavy Bomber — wrecks an enemy's industry from beyond the front.
highAltitude: only Fighters andflak ≥ 6may engage it, which makes tier-2 armies genuinely vulnerable and is the sharpest example of the tech gap this design permits (see §8). - Cruiser — the strongest thing afloat gun for gun; slow, expensive, and a magnet for submarines
and bombers.
draft 3bars it from shallows and rivers entirely — it can be denied whole regions of a coastal map by geography alone. - Carrier — moves your air force's home and projects air power beyond your borders. Almost no
attack of its own; 4 air slots, resets aircraft
endurance, repairs 2 hits/turn to embarked aircraft. It is a capability purchase, not a combat purchase, and it is priced as one.
5. Why these numbers and not other numbers
5.1 The two laws the table obeys
Law 1 — build times stay constant across the whole ladder. This is where Output 4 / 7 / 11 / 16 comes from; it is not a taste judgement. The design requirement was that the rhythm of the game should not change as the pieces get bigger — a unit should take between three and eleven turns to build, at every tier, forever.
| Tier | Output | Cheapest → dearest, in turns |
|---|---|---|
| 1 | 4 | Scout 3 · Infantry 5 · Field Gun 7 · Transport 8 · Corvette 9 |
| 2 | 7 | Fighter 7 · Armour 8 · Destroyer 10 |
| 3 | 11 | ADB 4 · Engineer 4 · Landing Ship 7 · Heavy Artillery 7 · Submarine 8 · Bomber 8 |
| 4 | 16 | Missile 4 · Air Transport 6 · Heavy Armour 8 · Heavy Bomber 9 · Cruiser 10 · Carrier 11 |
The band holds. A tier-4 empire is not waiting longer for its toys; it is getting better toys at the same cadence. That is what makes the ladder feel like growth rather than like a tax.
Law 2 — combat power grows as the square root of cost, with a deliberate, small tier premium.
Define a crude power index P = sqrt(primary attack × hits). Then:
| Unit | Cost | P | P / √cost | Tier target |
|---|---|---|---|---|
| Infantry | 20 | 4.90 | 1.10 | 1.10 |
| Corvette | 34 | 6.48 | 1.11 | 1.10 |
| Armour | 52 | 8.49 | 1.18 | 1.18 |
| Destroyer | 64 | 9.49 | 1.19 | 1.18 |
| Submarine | 86 | 10.58 | 1.14 | 1.26 |
| Heavy Artillery | 72 | 9.17 | 1.08 | 1.26 |
| Heavy Armour | 124 | 14.97 | 1.34 | 1.34 |
| Cruiser | 160 | 16.97 | 1.34 | 1.34 |
Two things follow, and both matter more than the numbers themselves.
Higher tiers are better per point, but only slightly — about 22% from Infantry to Cruiser. That premium is the return on the industry investment; without it nobody would ever climb. But it is small enough that five Infantry (100 BP, 30 hits, five tiles of frontage) still beat one Heavy Armour (124 BP, 14 hits, one tile) on a broad front, and lose to it at a single point. Mass versus concentration stays a live strategic question at every tier instead of collapsing into "tech wins."
Units that sit below the curve are buying something other than power. Submarine (1.14) and Heavy
Artillery (1.08) are paying for concealment and for no-return-fire. Transport, Landing Ship, Carrier,
Air Transport and Engineer are off the chart entirely because their atk is 0 or nominal — they are
priced against what they enable. Scout at 12 BP is nearly triple its power-curve price of 5 BP; you
are paying for five movement and four vision, and those are worth it.
5.2 Worked example — combined arms, the whole point of the combat model
An Infantry attacks an entrenched Infantry sitting in a city on plains.
Defender: def 5 → 5000. City ×1500 → 7500. Entrenched ×1250 → D = 9375. 6 hits. Attacker: atkLand 4 → A = 4000. 6 hits.
share = 4000 × 1000 / (4000 + 9375) = 299 — a 29.9% chance per round.
Racing 6 hits against 6 hits at p = 0.299, the attacker wins 7.7% of the time. A lone infantry assault on a defended city is suicide, and the interface will say so before you commit.
Now bring two Field Guns and fire them first. Bombard ignores entrenchment, so it resolves against def 5000 × 1500 = 7500:
share = 7000 × 1000 / (7000 + 7500) = 482. Four shots (2 guns × shots 2) → 1.93 expected hits,
and any hit applies Suppressed.
The defender is now on ~4 hits, un-entrenched, with its city bonus halved: D = 5000 × 1250 = 6250.
share = 4000 × 1000 / (4000 + 6250) = 390. Racing 6 attacker hits against 4 defender hits at
p = 0.390, the attacker wins 49.2%.
7.7% → 49.2% for 52 BP of artillery. That is the design working: the interesting decision is not "do I roll the dice" but "have I brought the right combination, and did I spend a turn setting up." It also means a well-prepared assault still fails half the time, so the attacker must bring depth — which is precisely the texture the direction brief says flat attrition lacks.
5.3 Worked example — the submarine counter chain
A Submarine attacks a lone Transport. A = 14000 vs D = 3000 → share = 823, plus a free ambush
round. The transport dies, with its cargo, almost every time. Convoys without escort are dead.
Escort it with a Corvette (tier 1, def 5000). share = 736 — the submarine is still heavily
favoured. A tier-1 navy cannot beat a tier-3 submarine, and it should not be able to.
Now a Destroyer with sonar finds it. The submarine loses concealment and ambush. But attacking a
submerged contact is hard: sonar attacks apply ×700 to the attacker. A = 9000 × 700 / 1000 = 6300 vs
D = 5000 → share = 557. Racing the Destroyer's 10 hits against the Submarine's 8 at p = 0.557, the
Destroyer wins about 83% — and typically finishes on 4 or 5 hits, needing a port.
That is the shape you want in a counter: the counter works, it is not automatic, and it costs the counter something real. The submarine's answer to being hunted is not to fight; it is to be somewhere else. Detection becomes the game.
5.4 Worked example — why one bomber is not an answer
A Bomber attacks a Destroyer. Flak resolves first: destroyer flak 6 (6000) against bomber
def 3 (3000) → share = 666, so a 66.6% chance the bomber takes a hit before it does anything.
Then the run: A = atkSea 10000 vs D = 7000 → share = 588, limited to strikeRun 3 rounds. Expected
outcome: 1.76 hits on the destroyer, 1.24 on the bomber, then the bomber breaks off.
So one bomber sortie takes about two hits off a ten-hit destroyer and costs the bomber about two of its six. One bomber cannot sink a destroyer. Four bombers over two turns can, and will lose one doing it. Massed air works; sniping with air does not. And a fleet that brings a Destroyer screen has multiplied its own survivability without buying a single dedicated anti-air unit — because flak is an attribute, not a unit.
5.5 Worked example — is the ladder worth climbing?
One city, Industry 1, 4 BP/turn, no captures yet.
Path A (tempo): Scout (turns 1–3) · Infantry (4–8) · Infantry (9–13) · Infantry (14–18) · Transport (19–26). At turn 26: 1 Scout, 3 Infantry, 1 Transport. 104 BP on the board, three cities holdable, and a boat.
Path B (industry): Scout (1–3) · Workshop upgrade, 30 BP (4–11) · Output becomes 7 from turn 12 · Armour (12–18) · Destroyer in progress (19–26, 42 of 64 paid). At turn 26: 1 Scout, 1 Armour, and most of a Destroyer. 102 BP of value.
The two paths are within 2 BP of each other at turn 26, and Path B's break-even on the upgrade alone lands at turn 22 (30 BP spent, 3 BP/turn recovered from turn 12). After that Path B is strictly ahead on production and has three unit classes Path A cannot build.
But Path A holds three cities at turn 18 and Path B holds one. On a crowded continent, tempo wins outright — the land is taken before the Workshop finishes. On an archipelago, or under a victory condition that runs past turn 60, the ladder wins.
Therefore the right tech pace is a function of the map and of the victory condition. That is a genuinely good property: it means §5 of the direction brief (configurable victory) and this subsystem reinforce each other. A short scored game and a long conquest game will not just end differently, they will be played differently from turn four.
6. The capability flag vocabulary
Units are data. The engine must know a closed, enumerable set of flags, each with integer
parameters. Nothing in packages/core may branch on a unit's id or name — that rule is what makes
custom unit sets a real feature rather than a promise, and it is mechanically checkable in CI.
| Flag | Params | Meaning |
|---|---|---|
domain |
land | sea | air |
Which tiles it may occupy |
terrainClass |
foot | tracked | wheeled |
Index into the terrain movement-cost table |
draft |
1–3 | Minimum water depth class it may enter. Gates shallows, rivers, coast. |
endurance |
turns | Air only: turns aloft before it must be at a base or carrier, or it is lost |
zoc |
0/1 | Exerts a zone of control on adjacent tiles |
capacity |
n, carries:[class] |
Transport slots provided and what may occupy them |
slots |
n | Slots consumed as cargo |
cargoLost |
— | Destroying this destroys its cargo |
assaultLanding |
— | Cargo may attack directly from aboard (attacker ×750) |
airdrop |
— | Cargo may unload onto an unoccupied land tile |
airbase |
— | Resets endurance for embarked air units |
repair / repairAir |
hits/turn | Restores hits to adjacent or embarked friendlies |
bombard |
range, shots |
Indirect fire: no return damage, cannot kill, applies Suppressed |
siege |
— | Bombard effect doubled against units in cities and forts |
strikeRun |
rounds | Maximum rounds before disengaging |
submerged |
— | Invisible except to sonar and to adjacent units |
sonar |
— | Detects submerged units within vision |
ambush |
— | First round of an attack it initiates is one-sided |
intercept |
— | May engage air units passing through its vision |
interceptZone |
radius | Automatically engages hostile air ending movement within radius |
reactiveOnly |
— | Never attacks on its own activation |
highAltitude |
— | Engageable only by intercept units or flak ≥ 6 |
expendable |
— | Destroyed after resolving one attack |
capture |
— | May take an enemy city |
entrench |
— | Gains the stationary defence bonus |
cityStrike |
severity 1–2 | May damage a city's build progress and Industry |
build |
[road, airfield, fort, bridge] |
Terrain construction |
clearMines |
— | Reserved; no shipped unit uses it |
That is 27 flags. A custom unit set is then a JSON file of integer stat lines plus flag lists, with no scripting, and the WASM plugin ABI remains the escape hatch for anything genuinely new. The shipped roster uses only this vocabulary, which is the only honest way to prove it is sufficient.
7. Why this beats the classic approach
- One game instead of four. One roster, one balance surface, one AI evaluation function, one community, one set of regression tests. The engineering saving is not incidental — it is what buys the budget to tune twenty units properly instead of eighty units badly.
- The complexity choice is made by someone qualified to make it — the player, mid-game, with information. Nobody has to guess at the setup screen how complicated they want their next four hours to be.
- Complexity arrives attached to a reason to care. You meet the Destroyer's
sonarrating the week you first fear a submarine. You learnflakwhen someone bombs your fleet. Units taught in context stick; units taught in a manual do not. - Rules complexity self-gates at zero cost. No air units in the game means no air rules in the game. This is why "one roster with an in-game curve" dominates "one roster with optional systems": the toggle system would be doing, badly and manually, what unit availability does automatically.
- It turns packaging into gameplay. Build now or build up is a real, recurring, per-city strategic decision with a computable payback period (turn 22, §5.5). The classic approach spent that decision on a dropdown menu.
- It gives the map an industrial geography. Enemy Arsenals are worth a two-hundred-tile raid. Rear cities are worth garrisoning. Bombers have a strategic purpose that is not "kill units."
- It subsumes the thing it replaces. Set start = cap and you have the fixed-tier experience exactly, as a special case, with no extra content.
8. Tradeoffs and what this costs
Stated plainly, because several of these are real.
- A veteran can out-tech a newcomer inside one game. Fixed tiers prevented this by fiat; this design does not. The mitigation is the per-player Industry cap, which is a good handicap system but is still a setting someone has to remember to use.
- Tier 4 will be under-tested, because most games will end before anyone reaches it. This is the most likely place for a balance disaster to hide. The Total War preset exists specifically to give tier 4 play, and tier-4 balance should be validated by AI self-play at start-Industry 3–4 rather than by hoping normal games reach it.
- A player who never invests gets locked out of counters. An Industry-2 army facing Heavy Bombers has exactly one answer (Fighter) and no Air Defence Battery. This is intentional pressure — refusing to climb should have a cost — but it is a hard edge and it will feel bad the first time. Watch it in playtest.
- More decisions per turn in a game that already has many. Every city, every turn, now asks "unit or works?" Standing orders and city templates (a city set to "build up to Industry 3, then produce Infantry") are close to mandatory, not a nicety.
- It depends on a subsystem I do not own. If the economy author does not want per-city industry, the fallback is an empire-wide era ratchet — the same ladder, worse: it loses the industrial geography and the raid targets, but the roster and the escalation argument survive intact.
- Capture-degrades-Industry will feel punitive. Storming an Arsenal and receiving a Foundry is correct design and an unpopular moment. It may need softening to "degrades unless captured by an Engineer" if playtest hates it.
- Persistent damage means a repair economy. Cities repair, Engineers repair, Carriers repair aircraft. That is a real rules surface I have introduced and someone has to specify.
- Twenty units × fourteen attributes is a genuine tuning burden. The two laws in §5.1 make it tractable — most values are derived, not chosen — but derived values still need play validation.
An interaction worth naming
The turn model (direction §4) orders activation by unit creation sequence, oldest first. Newly built units always act last. A Heavy Armour you finish on turn 90 activates after every enemy unit built in the preceding ninety turns. This is an inherent counterweight to teching that nobody designed on purpose, and it is a real one: high-tier units are structurally initiative-poor. It might be exactly the brake the ladder needs. It might also make a 124 BP investment feel awful. It needs a deliberate probe in playtest, and the turn-model author should know this design leans on it.
9. What could go wrong, and how playtest would show it
Deterministic simulation makes AI self-play cheap. These are metrics, with target bands, that a nightly self-play tournament should emit.
| Failure | Metric | Alarm |
|---|---|---|
| Ladder too expensive; tiers 3–4 are dead content | Distribution of maximum Industry reached at game end | >70% of Standard games end at max Industry ≤ 2 |
| Ladder too cheap; tempo play is non-viable | Median turn of first Workshop upgrade | Earlier than turn 10 |
| Tech snowball | Win rate of a scripted "rush industry" opening vs a "rush units" opening at equal AI skill | Outside 45–55% |
| Dead units | Share of total BP spent on each unit within the window where it is available | Any unit below 3% |
| Dominant units | Same metric | Any unit above 30% |
| Scout griefing | Share of city captures made by units with hits ≤ 3 |
Above 15% |
| Submarine window | Naval BP loss ratio in the turn band where subs exist but sonar is rare |
Attacker-favourable beyond 3:1 |
| Combined arms not landing | Share of successful city assaults preceded by bombard in the same turn | Below 50% — means artillery is not worth the tempo |
| Bombard too strong | Share of city captures where the defender was at 1 hit before the assault | Above 60% — bombard has become mandatory rather than valuable |
| Build-time band broken | Turns-to-build for every unit at its unlock Industry | Outside 3–11 |
| Seniority penalty on tech | Win rate of high-tier armies controlling for total BP | Meaningfully below parity |
Human playtest should additionally watch for two things a metric will not catch: whether the arrival of a new unit class is noticed and understood, and whether the "unit or works?" question becomes tedious rather than interesting once an empire passes about a dozen cities.
10. Open questions I could not settle
- Per-city or empire-wide Industry? I chose per-city and I believe it, but it doubles the management surface and it is the decision most likely to be reversed after the first real playtest. Both versions carry the same roster, so this is reversible late.
- Does the Industry cap belong in the victory-condition system? "First to build a Carrier" is a perfectly good objective and it lives at the seam between these two subsystems.
- Should the Field Gun be tier 1? Putting the most interesting mechanic in the game at the very bottom of the ladder is either the best decision here or the one that makes turn 10 too complicated for a first-time player. I lean toward keeping it and cutting the Scout to tier 1.5 if turn-1 load is too high.
- Veterancy. I have deliberately not designed it, because the turn model's seniority ordering already gives old units a mechanical advantage, and two "experience matters" systems will fight. Someone should decide whether seniority is the veterancy system.
- Aircraft endurance in turns versus fuel in movement points. Turns is integer-clean and easy to read; movement points model range more honestly on very large maps. I picked turns for explainability and I am not certain.
- Repair rates are asserted (2/turn in a city at Industry ≥ 2, 1/turn from an Engineer, 2/turn from a Carrier) and not derived from anything. They need their own small argument.
- Does bombard need a supply cost? Unlimited artillery fire may be too cheap, but ammunition tracking is exactly the kind of fiddliness the direction brief warns against.
- What happens to a city's production queue when Industry drops from capture or a city strike — specifically whether a half-built Cruiser in a city knocked to Industry 3 is lost, paused, or refunded. I lean toward paused, because losing it twice (once to the strike, once to the queue) is a compounding punishment.