How Combat Works
Battles in Sparta are not resolved by two numbers trading blows. Every soldier fights the individual in front of them, carries their own health, stamina, and footing, and each blow is rolled on its own. The tactics you know — flanking kills faster, never turn your back, spears screen, a braced line stops a charge, a surrounded man tires and falls — are not bonuses bolted on. They emerge from where bodies are and the dice each strike rolls. This page lays out those dice.
This model is rolling out in phases. Live now: combat resolves per soldier – the opposed hit contest, facing (flank and rear), per-soldier health and death, weapon reach (the spear-vs-sword standoff), knockback (every committed strike shoves the struck soldier back – harder on a clean landing or at charge speed, and less against a heavy soldier like cavalry), knockdown (a hard enough hit can knock a soldier flat: while down it has no active defence and can’t strike until it scrambles up), bracing (an engaged, set file buttresses the front man with the whole column’s footing – a deep phalanx absorbs a shove that would throw a lone man back, and is far harder to fell; bracing is graded and takes time to set, not an instant switch – order Brace and hold still before the charge lands, or a moving/merely-engaged line gets only partial credit), and stamina and exhaustion (every strike thrown and every blow met drains stamina; a soldier under sustained pressure tires, their defence collapses, and then blows land freely – surround and exhaust is real, not a modifier; live speed-band stamina flow regenerates at rest, stays neutral at a walk, and drains at a jog or sprint). Coming: the full discrete posture state machine (named stance states rather than continuous speed-band stamina flow) and the rearward domino cascade (a blow that punches through the front rank topples men rearward until the impulse is spent). The sections below describe the whole model; where a piece isn’t live yet, it soon will be.
What each soldier carries
Every soldier has live state that combat reads and changes moment to moment:
- Health — wounds add up here; at zero, the soldier falls.
- Stamina — spent by every action; when it runs low, everything gets worse.
- Facing — the direction they are turned. You can only defend what you face.
- Stance — from at ease, through advancing and sprinting, to braced (set to receive a hit), or knocked prone. Stance sets how hard you hit on the move, how well you hold your ground, and how fast you tire — and changing it takes time, so you must be set before the blow arrives. Order Brace (
Ctrl+F4) and hold a line still to set it deliberately; a merely-engaged line that never got the order is only partly set, and one still moving is barely set at all.
and fixed traits from their regiment:
- Skill \(s\) — training. Lands blows, parries, beats shields, tires slower.
- Armour \(a\) — soaks part of a landed blow, from any angle.
- Shield \(b\) — blocks blows, but only ones you face, and only as well as your skill lets you use it.
- Lethality \(\ell\) — how deadly the weapon is.
- Reach \(r\) — how far the weapon strikes (a spear out-reaches a sword).
- Mass \(m\) — how hard they are to shove or knock down (a horse is heavy).
Two things scale everything a soldier does: being wounded and being winded. A hurt or exhausted soldier hits softer, defends weaker, and is easier to put down — so wounds and fatigue snowball.
One blow, step by step
When a soldier swings at the enemy in front of them, the game resolves a closing speed, a contest, a wound, a stamina cost, and a shove. How often they get to swing depends on the weapon: a legionary’s gladius lands a blow roughly every 1.2 seconds, slower than the 0.6-second baseline every other weapon still uses — a short sword-and-shield exchange is a deliberate, telegraphed affair, not a flurry.
The formulas below are sketches: a subscript \(A\) or \(D\) means the attacker’s or defender’s value (so \(a_D\) is the defender’s armour), and a trailing \(\cdots\) hides finer factors kept in the full spec. Each symbol is explained where it first appears.
0. How fast are they closing? The attacker’s speed toward the target — call it the charge \(c\) — is zero standing still and large for a galloping horse. It makes the blow harder to dodge, harder-hitting, and harder-shoving, all at once. Closing speed belongs to both fighters: it counts for whoever strikes during the rush, in either direction, and head-on speeds add. So a spearman who holds his point into a charge spits the rider on its own momentum, and two horsemen charging each other trade blows at combined speed — cavalry into cavalry is the deadliest clash there is.
1. Does it land? (attack vs. defence) The blow is an opposed roll: the attacker’s offence against the defender’s active defence — footwork, parry, shield. Crucially, you can only actively defend what you can see:
\[p_{\mathrm{land}} = L\big(\beta\,(\mathcal{A} - \mathcal{D})\big), \qquad \mathcal{D} = \phi\,(s_D + \lambda\,b_D\,s_D)\cdots\]
Here \(\mathcal{A}\) and \(\mathcal{D}\) are the attacker’s and defender’s scores, \(L\) turns the gap between them into a hit chance (an even gap is even odds), and \(\beta\) sets how sharply skill tells. \(\phi\) is your facing against the incoming blow: full to the front, little to the flank, zero to the back — and \(\lambda\) is how much a shield (\(b_D\)) multiplies the defence your training already buys. A shield is something a soldier uses, not armour that works regardless: it is worth almost nothing to a raw recruit and more the better trained they are. A blow to a soldier’s back meets no parry and no shield — only armour. Skill, shields, and footwork all live on the front. Wound the attacker or wind the defender and these scores shift; nothing is ever a guaranteed hit or miss.
2. Does it wound? A blow that lands subtracts from the defender’s health — we don’t flip a kill-or-not coin, we track damage. Its size is the weapon’s lethality, boosted by the charge and blunted by armour:
\[\Delta h = D_0\,\ell_A\,(1 + c)\,(1 - a_{\mathrm{eff}})\cdots\]
Here \(\Delta h\) is the health lost, \(D_0\) a base damage scale, and \(a_{\mathrm{eff}}\) the effective armour rating. Piercing weapons (spears, lances, daggers, pilum thrusts) concentrate impact force onto a narrow contact point, bypassing 25% of the defender’s armour (\(a_{\mathrm{eff}} = 0.75\,a_D\)). Non-piercing weapons (swords, spathas, axes) meet full armour (\(a_{\mathrm{eff}} = a_D\)). There is no separate “injured” flag: health just drops, and a soldier near death fights weaker, so the next wound comes easier than the last. At zero health they fall. Armour is the only thing that protects a man hit from behind.
3. Everyone tires. Stamina is spent by attacking, by defending (every blow you meet costs you — a charge costs more), and by getting up after being knocked down. Movement follows the regiment’s live pace: resting restores stamina, a walk is neutral, and a jog or sprint drains it. So a soldier under sustained pressure, or surrounded, burns through stamina, their defence collapses, and then blows land freely. Fatigue, not a hidden timer, is what breaks a line.
4. The shove. Every blow that connects — even a blocked one — shoves the target back, harder from a charge, scaled by weapon delivery type, and less against a heavy soldier:
\[J = J_0\,\frac{\ell_A\,(1 + c)}{m_D}\;\gamma_{\mathrm{type}}\cdots\]
Here \(J\) is the shove (an impulse) and \(J_0\) its base strength. Delivery type scales the impulse: piercing strikes slip into tissue rather than shoving whole body mass backward, transmitting only 35% of standard knockback (\(\gamma_{\mathrm{type}} = 0.35\)). Non-piercing weapons deliver full whole-body displacement (\(\gamma_{\mathrm{type}} = 1\)). A blocked blow draws no blood but still pushes — which is how a spear wall drives a stalled enemy backward.
Shoves from several attackers in the same moment add up, but the summed speed is capped: a pile-on in a crowded press hurls a man back a few body-lengths at most, never across the field. The uncapped force still decides whether he is knocked down, so a heavy hit fells as hard as ever.
Cavalry charge separation: For mounted cavalry, the charge separates naturally across ticks. The rider’s lance strikes first at weapon reach (\(\approx 3.0\) m), landing an early piercing wound. When the horse’s physical body arrives at contact distance, the physical collision delivers massive blunt damage, heavy knockback, and topples unbraced defenders prone.
Knocked down — and the domino
A hard enough shove knocks a soldier prone. A blow delivered above the feet acts on a lever arm and exerts torque about the soldier’s footing. Because toppling an upright body takes roughly a fourth of the force needed to slide their feet across the earth (\(\Lambda \approx 0.25\)), a blow trips and fells a defender in place first; only the surplus impulse that breaks their footing loose translates their body backward into a slide. Bracing and mass make you harder to topple; once down, you defend nothing, can’t strike, and must spend time and stamina scrambling up — which is exactly when the next blow kills you. Prone soldiers appear as dark horizontal marks (or a lying silhouette at high zoom), so a charge that bowls men over is visible at a glance.
A shoved soldier also collides with whoever is behind them. Bracing soaks only so much — but the men behind help. Braced comrades in a tight file back up the man in front, so the front rank resists with the whole column’s footing, not one man’s. A shove smaller than that combined footing dies at the front; a hit stronger than the column can absorb bowls the front man over and the surplus dominoes rearward, fading as it goes:
\[J_{i+1} = \tau\,\big(J_i - \mathrm{capacity}_i\big)_+, \qquad 0 < \tau < 1.\]
Here \(J_i\) is the shove reaching the \(i\)-th man back, \(\mathrm{capacity}_i\) his rank’s combined footing, and \(\tau\) how much of the surplus carries on to the next rank (\((\,\cdot\,)_+\) just means a negative result is zero — a shove fully absorbed stops). So a light shove dies at the first set rank; a heavy charge punches through, toppling rank after rank until it is spent — and the deeper the braced file, the bigger the hit it takes to break through. You are more braced when set (the braced stance), in tight formation, and facing into the blow — the same facing that lets you defend, and the support vanishes the instant the file loosens, opens a gap, or is hit from a side it isn’t facing. A loose, flanked, or sprinting file dominoes and goes down; a deep, set, front-facing shield wall stands.
Why your tactics work
Everything tactical comes out of the rolls above:
- Flank and surround. A soldier hemmed in is in reach of more enemies (more blows rolled at them), burns stamina meeting all of them (their defence collapses), and takes hits they can’t face (armour only). Three effects, one cause — not a “rear bonus” number. Get around the flank and the line melts.
- Never show your back. Facing gates both your defence and your footing. A soldier fighting to their front is hard to hit and hard to topple; the moment they turn — routing, or caught from behind — defence and footing vanish and they’re run down. That’s why a breaking line dies so fast.
- Spears screen. A spear’s reach holds shorter weapons out past their own reach: the spearmen jab and shove while the swordsmen can’t answer. Put a spear line in front of what you want to protect.
- Brace for the charge — in time. A charge lights up everything at once — harder to dodge, deadlier, and a shove that bowls men over and lays them out. Into a loose line it’s a massacre. A braced, deep spear line, set and facing, soaks it at the front rank — the ranks behind buttressing the front — stays on its feet, and out-reaches the horse: the charge breaks on the hedge. But setting the brace takes time, so order it before contact (a line caught still at ease is ridden down), keep it deep (a shallow braced line can be punched through), and a heavy enough charge topples men even when braced. Never take a charge loose or in the flank; never send horse into set spears.
- Armour and shields buy time — but shields only for troops who can use them. Heavy, shielded troops turn wounds into blocked shoves and glancing hits, so they grind slowly and endure, and light troops caught in the press evaporate. Armour protects whoever wears it; a shield’s worth scales with training, so handing shields to a raw levy buys far less than handing them to veterans.
- Fight fresh, fight skilled. Skill and stamina help at both ends — landing more, defending more, tiring slower. Rested veterans beat winded levies by more than the headcount suggests, so pace your commitment.
- Piercing vs. cutting/blunt strikes. Spear thrusts, daggers, and pila concentrate impact force onto a narrow point: they bypass 25% of the defender’s armour to inflict deeper wounds on armoured foes, while imparting minimal whole-body shove (35% knockback impulse). Swords, spathas, and chopping weapons meet full armour but deliver a strong, displacing shove with every blow that connects.
The exact constants (\(\beta\), \(D_0\), \(\tau\), the stamina costs, the knockdown threshold, and the rest) are balance dials we tune against playtests; the shape of the model above is what’s fixed. For the full specification, see the docs/combat-model.md design note in the project repository.