Old World Reference
Menu

⚔️ Combat Damage Formula

transcribed reference

How an attack's damage is computed, straight from the game code (InfoHelpers.getAttackDamage, Unit.attackUnitStrength / defendUnitStrength) with every constant from globalsInt.xml. The full per-unit results are on Unit Damage & Counters.

The formula

Damage = 6 × ATK / DEF  — rounded in the stronger unit's favor, minimum 1

ATK = attacker's strength after all modifiers; DEF = defender's. When ATK > DEF the result rounds up; otherwise it rounds down. An even fight deals exactly 6 — three attacks to kill a 20 HP unit. The in-game UI shows strength to one decimal, but the unrounded value is what's used.

DEF →ATK ↓ 3456789101112131415
3 6433222111111
4 8644332222111
5 10865433322222
6 12986544333222
7 141197654433332
8 1612108765444333
9 1814119876544433
10 20151210987655444
11 221714111098765544
12 241815121198876554
13 2620161312109887655
14 28211714121110987765
15 30231815131210998776

Effective strengths land between these integers all the time — a Hoplite attacking a Horseman in melee is ATK 9 (6 × 1.5 anti-mounted) vs DEF 6 → 9 damage.

Effective strength

Strength = Base × (100 + Σ modifiers) / 100

Modifiers are additive percentages, gathered separately for the attacking and defending side (all values from the game's XML / source):

Current HP does not scale strength — a 1 HP Pikeman hits as hard as a fresh one (some attackers carry an explicit vs-damaged bonus instead).

Worked example: Hoplite attacks Horseman

Hoplite base strength6
+ Anti-Mounted II (melee, vs Mounted)+50%
Hoplite effective attack9
Horseman defense (no modifiers)6
Damage: 6 × 9 / 6, rounded up9 HP

The Horseman drops from 20 to 11 HP. Reversed, the Horseman attacking the Hoplite is 6 vs 9 (the anti-mounted bonus also defends in melee): 6 × 6 / 9 = 4 damage — which is why "spear beats horse" is such a hard rule.

Striking back

Attack patterns (Pierce, Cleave, Splash, Circle)

Some units carry an attack pattern on top of the main hit. These are additional small attacks that resolve against adjacent / linear / surrounding tiles. They use the same damage formula but with a reduced effective strength, and the attacker doesn't take return damage from those secondary hits.

Per the game data, the secondary-hit strength is the unit's base multiplied by a small percentage (e.g. Pierce I = +25% Pierce damage on top of a flat +1 to the pattern's value).

Rout and routed units

A unit at 0 HP doesn't disappear — it routs, retreats one tile, and becomes unable to attack until rallied. The standard damage formula caps at HP remaining; the killing blow only does enough damage to bring it to 0.

Constants pulled from XML

These come straight from globalsInt.xml and apply to combat math globally. Some are display-friendly multipliers; most are integers.

ConstantValueMeaning
STRENGTH_MULTIPLIER10Game-internal strength is 10× the display value.
ACTIVE_HEAL5HP healed per turn when not moving / attacking.
IDLE_HEAL1HP healed per turn after moving but not attacking.
UNIT_HEAL_COST1Cost per HP healed (in Training or Civics, depending).
COUNTER_CITY_DAMAGE1Damage delivered to a city per attack against its garrison.
COUNTER_ROUT_DAMAGE1Damage applied to a routed unit if attacked again.
CITY_STRENGTH_BASE80Base garrison strength for an undamaged city.
CITY_STRENGTH_PER5Bonus strength per city level.
CITY_HEAL_PERCENT_PER_TURN5%City HP healed per turn (peacetime).
CITY_CAPTURE_DAMAGE_PERCENT50%City damage taken on capture.

What to read next