diff --git a/.project/designs/combat-preview-sketch.html b/.project/designs/combat-preview-sketch.html
index 2b5b0df6..2806e409 100644
--- a/.project/designs/combat-preview-sketch.html
+++ b/.project/designs/combat-preview-sketch.html
@@ -3,516 +3,1077 @@
-
-
-
-
-
-
-
-
-
-
-
-
⚔
-
Iron Warrior
-
Melee Infantry
-
Stoneguard Clan (You)
-
-
-
-
-
-
Base attack18
-
★ Strength I+2
-
★ Flanking+15%
-
Wounded (85%)—
-
-
Effective attack21.7
-
-
-
-
-
VS
-
-
-
-
🛡
-
Bronze Guard
-
Melee Infantry
-
Emberfall Clan
-
-
-
-
-
-
Base defense18
-
Plains terrain+0%
-
Fortified (1t)+10%
-
Outnumbered−10%
-
-
Effective defense18.0
-
-
-
-
-
-
- ⚠ Flanking bonus active — 2nd Stoneguard unit adjacent gives +15% attack
-
-
-
-
-
Predicted Outcome
-
-
-
-
62%
-
38%
-
win probability
-
-
- Attacker wins
- Defender survives
-
-
-
-
-
-
Attacker takes
-
−22
-
HP · 46 remain
-
-
⟷
-
-
Defender takes
-
−34
-
HP · 46 remain
-
-
-
-
-
-
-
-
-
-
⚔ Confirm Attack
-
Cancel
-
-
-
+
Combat Preview
+
+ warrior.json
+ berserker.json
+ pikeman.json
+ COMBAT_SYSTEM.md
+ promotions.json
+ items/
+ — real unit stats, real promotions, real damage matrix
+
+
+
+
+
+ | Attack \ Armor |
+ Unarmored |
+ Light |
+ Medium |
+ Armored (Heavy) |
+ Plate |
+ Fortified |
+
+
+ | Blade ⚔ |
+ 125% |
+ 125% |
+ 100% |
+ 75% |
+ 50% |
+ 25% |
+
+
+ | Pierce 🏹 |
+ 100% |
+ 100% |
+ 125% |
+ 100% |
+ 75% |
+ 50% |
+
+
+ | Crush 🔨 |
+ 75% |
+ 75% |
+ 100% |
+ 125% |
+ 150% |
+ 175% |
+
+
+ | Trample 🐎 |
+ 200% |
+ 150% |
+ 100% |
+ 50% |
+ 25% |
+ 0% |
+
+
+ | Siege 💣 |
+ 50% |
+ 50% |
+ 75% |
+ 100% |
+ 100% |
+ 200% |
+
+
+
+
+
+
+
⚔ Warrior vs Pikeman
+
🪓 Berserker RAGE
+
🛡 Items Equipped
+
🐎 Trample Counter
+
+
+
+
+
+
+
+
+
+
+
+
+
blade
+
light armor
+
Shock I ✓
+
+
+
ATK14
+
DEF8
+
HP68/80
+
MOV2
+
+
+
Attack calculation
+
Base attack14
+
Blade vs Light (125%)×1.25
+
Shock I · plains terrain+15%
+
HP penalty (85% health)—
+
Effective attack20.1
+
+
+
+
+
+
+
+
+
+
pierce
+
armored
+
zoc
+
anti_cavalry
+
+
+
ATK10
+
DEF14
+
HP100/100
+
MOV2
+
+
+
Defense calculation
+
14Base defense
+
—Plains terrain (+0%)
+
+0%No promotions
+
14.0Effective defense
+
+
+
+
+
+
+ Damage type
+
+ blade vs armored (light)
+ →
+ 125% multiplier
+
+ Favourable matchup
+
+
+
+
+
Predicted Outcome
+
+
+
win% ≈ eff_atk / (eff_atk + eff_def) = 20.1 / (20.1 + 14.0) = 59%
+
+
+ Warrior winsPikeman survives
+
+
+
+
+
Damage Range (terrain + RNG variance ±20%)
+
+
Attacker deals to Pikeman:
+
+
+ min 14
+ avg 20
+ max 25
+
+
+
+
Pikeman counter-deals to Warrior:
+
+
+ min 8
+ avg 12
+ max 16
+
+
+
+
+
+
+
Warrior HP after
+
56–60
+
likely survives
+
+
⟷
+
+
Pikeman HP after
+
75–86
+
damaged, survives
+
+
+
+
+
+
⚔ Confirm Attack
+
Cancel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
blade
+
light armor
+
rage 🔥
+
no_shield
+
+
+
ATK20
+
DEF6
+
HP90/90
+
MOV2
+
+
+
Attack calculation
+
Base attack20
+
Blade vs Light (125%)×1.25
+
RAGE active (killed last turn)+25%
+
Drill I · plains (no bonus)—
+
Effective attack31.3
+
+
+
+
+
+
+
+
+
+
ATK14
+
DEF8
+
HP80/80
+
MOV2
+
+
+
Defense calculation
+
8Base defense
+
—No promotions
+
8.0Effective defense
+
+
+
+
+
+ 🔥 RAGE active — Berserker killed a unit last turn. Gains +25% attack this turn. Resets after. DEF 6 means it will take heavy counter-damage.
+
+
+ 🛡 no_shield — Berserker cannot benefit from Cover promotions (ranged defense bonuses disabled).
+
+
+
+ Damage type
+ blade vs light → 125% + RAGE +25%
+ Devastating attack
+
+
+
+
Predicted Outcome
+
+
win% = 31.3 / (31.3 + 8.0) = 80%
+
+
+ Berserker killsWarrior survives
+
+
+
+
Damage Range
+
+
Berserker deals to Warrior (RAGE + 125%):
+
+
min 25avg 31max 38
+
+
+
Warrior counter-deals (blade vs light):
+
+
min 10avg 17max 22
+
+
+
+
+
Berserker HP after
+
68–80
+
survives (DEF 6 is fragile)
+
+
⟷
+
+
Warrior HP after
+
42–55
+
likely survives, heavily wounded
+
+
+
+
+
⚔ Confirm Attack
+
Cancel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
blade
+
heavy armor
+
formation
+
shield_wall
+
+
+
Items equipped
+
⚔ Master Blade +6 melee
+
🛡 Tower Shield +3 def / +2 vs ranged
+
+
+
ATK22+6=28
+
DEF18+3=21
+
HP110/110
+
MOV2
+
+
+
Attack calculation
+
Base attack22
+
Master Blade (item)+6
+
Blade vs Light (125%)×1.25
+
Hills terrain attack (no mod)—
+
Shock II · open terrain+30%
+
Effective attack45.5
+
+
+
+
+
+
+
+
+
blade
+
light armor
+
rage
+
no_shield
+
+
+
ATK20
+
DEF6
+
HP90/90
+
MOV2
+
+
+
Attack vs Ironwarden (heavy)
+
20Base attack
+
×0.75Blade vs Heavy (75%)
+
—No promotions
+
15.0Effective attack
+
+
+
+
+
+ ⚔ Master Blade — crafted at Forge (100⚒, 2× mithril_vein). Requires tech: high_smithing. +6 melee flat bonus before matrix multiply.
+
+
+ 🛡 Tower Shield — crafted at Smithy (50⚒, 2× iron_ore). +3 defense flat, +2 additional vs ranged attacks. Requires tech: tactics.
+
+
+ ⚙ Blade vs Heavy armor = 75% — Berserker's blade attack is significantly penalised against Ironwarden's heavy armour. Use Pierce or Crush units instead.
+
+
+
+ Ironwarden attacks
+ blade vs light → 125% · +items +promotion
+ 45.5 effective
+
+
+
+
Predicted Outcome
+
+
win% = 45.5 / (45.5 + 6.0) = 88%
+
+
+
+
Damage Range
+
+
Ironwarden deals to Berserker (items + 125%):
+
+
min 36avg 45max 57 💀
+
+
+
Berserker vs Ironwarden (blade vs heavy 75%):
+
+
min 10avg 15max 20
+
+
+
+
+
Ironwarden HP after
+
90–100
+
barely scratched
+
+
⟷
+
+
Berserker HP after
+
33–54
+
critical / likely dead
+
+
+
+
+
⚔ Confirm Attack
+
Cancel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
blade
+
light armor
+
fast (4 mov)
+
flanking
+
+
+
ATK16
+
DEF6
+
HP70/70
+
MOV4
+
+
+
Attack calculation
+
Base attack16
+
Blade vs Medium (100%)×1.00
+
flanking keyword bonus+15%
+
Effective attack18.4
+
+
+
+
+
+
+
+
+
pierce
+
medium armor
+
reach
+
anti_cavalry +100%
+
+
+
ATK8
+
DEF8
+
HP60/60
+
MOV1
+
+
+
Counter-attack vs Cavalry
+
8Base attack
+
×1.25Pierce vs Light (125%)
+
+100%anti_cavalry keyword!
+
25.0Effective counter
+
+
+
+
+
+ ⚠ HARD COUNTER — anti_cavalry keyword gives Spearmen +100% attack vs Cavalry archetype. Cavalry DEF 6 vs effective counter 25 = very likely death if Spearmen survive first strike.
+
+
+ 🗡 reach keyword — Spearmen can strike flying attackers and units attacking from range-1. First strike against charging melee if unit moved this turn (Charge situations).
+
+
+ 🌿 Open terrain caveat — In Forest or City, Cavalry loses its terrain advantage. In Plains (this tile), Cavalry wins open-field matchups EXCEPT vs Anti-Cavalry (full table in COMBAT_SYSTEM.md).
+
+
+
+ Counter damage
+ pierce vs light → 125% + anti_cavalry +100%
+ Spearmen = hard counter
+
+
+
+
Predicted Outcome
+
+
+ Cavalry win%: 18.4 / (18.4 + 25.0) = 42% — do not attack into spears
+
+
+
+ Cavalry winsSpearmen survive + Cavalry likely dies
+
+
+
+
Damage Range
+
+
Cavalry deals to Spearmen (blade vs medium):
+
+
min 12avg 18max 23
+
+
+
Spearmen counter (pierce vs light + anti_cavalry ×200%):
+
+
min 18avg 25max 32 💀
+
+
+
+
+
Cavalry HP after
+
38–52
+
wounded / dead next hit
+
+
⟷
+
+
Spearmen HP after
+
37–48
+
damaged but survives
+
+
+
+
+
⚠ Risky — Confirm Anyway
+
Cancel (Recommended)
+
+
+
+
+
+
+