Mechanics · the engine heart
The Kingshot damage formula
Kingshot's Expedition combat runs on the same engine as State of Survival, close enough that SoS's open-source code is the best reference anyone has. Here's the whole formula: plain words first, full spec after.
TL;DR: the whole fight in one line
If you remember nothing else on this page, remember this:
army size × per-troop power × who-counters-who × skills.
- Bigger armies hit harder, but it's a square root, not a straight line. See army factor below.
- Attack and Lethality multiply each other, so a pure-Attack build and a pure-Lethality build are not the same build.
- Landing the right troop type is worth a flat +10% damage. Infantry beats Cavalry, Cavalry beats Archer, Archer beats Infantry. No defensive version exists.
- Skills multiply on top of all of it through one hidden term called SkillMod. It never shows up in a battle report, which is exactly why it's worth thirty seconds of your attention.
Everything below is those four ideas made exact, each one graded for how sure we actually are.
1. Per-troop attack and defense
Every troop carries four base stats, stored as small integers: Attack, Lethality, Defense, Health. Research, gear, pets, charms and hero stats are all percentages layered on top of those four. They collapse into two numbers per troop: one for attack, one for defense.
att_per_troop = base_atk × (1 + atk%/100) × base_let × (1 + let%/100) / 100 def_per_troop = base_def × (1 + def%/100) × base_hp × (1 + hp%/100) / 100
/100 normalizes the product of the two stat values. Across every tier and troop type, base Lethality = base Defense = 10. Only Attack and Health vary by tier.A stat called "Attack" and one called "Lethality" both feed the same attack value, and they multiply each other. That's the whole reason a pure-Attack build and a pure-Lethality build aren't interchangeable: the product is what counts, not either number alone.
2. The round damage formula
Every attacking squad type, every round, against whatever it's engaging, runs this:
damage = army_factor × att_per_troop_attacker / def_per_troop_target × type_bonus × SkillMod × fatigue_factor / 100 deaths = ceil(damage)
Five multipliers and a divisor, read straight from the SoS engine's round loop. Confirmed. Don't take our word for the arithmetic: drag the levers below and watch deaths recompute. It starts on the canonical example; every value the simulator runs flows through exactly this.
3. What each term means
Army factor
army_factor = sqrt(N_squad_attacker × armyMin) armyMin = min(N_total_attacker, N_total_defender), fixed at fight start
This term is easy to get wrong: it's a square root of your attacking squad's size times the smaller total army in the fight, not the raw army size most people assume. armyMin is computed once at the start and held constant for the whole battle, even as troops die. Confirmed against the SoS engine and the Bear-trap example.
Type bonus & stat bonuses
A flat +10% damage when the attacker's squad type counters the target's: Infantry beats Cavalry, Cavalry beats Archer, Archer beats Infantry. It's a damage bonus only. There is no defensive type bonus. Confirmed.
Everything else you'd call a "bonus": attack %, lethality %, defense %, health % from research, gear, pets, charms, is already folded into att_per_troop and def_per_troop above. There's no separate step for it. A Gordon joiner and an HP buff granting the same health % do exactly the same thing to the math, because to the math, they're the same number.
SkillMod
SkillMod = (DamageUp × OppDefenseDown) / (OppDamageDown × DefenseUp)
One multiplier, and it captures every hero skill, joiner skill and widget effect that isn't already a visible stat bonus. Your damage-ups and the enemy's defense-downs sit in the numerator; the enemy's damage-downs and your own defense-ups in the denominator. It's why four Chenkos lose to two Chenkos plus two Amanes: stacking the same op code has diminishing structure, while diversifying the families multiplies cleanly.
Fatigue factor
fatigue_factor = 1 − round_index × 0.0001 round 0 starts at 1.0
4. The round-zero worked example
This is the anchor. If an engine reproduces this number, its core arithmetic is right; if it returns 187 or 191, something is broken. Round 0, attacker Infantry against defender Infantry:
-- army sizes N_squad_attacker = 40,233 Inf N_total_attacker = 40,233 + 40,323 + 40,233 = 120,789 N_total_defender = 23,644 + 27,644 + 27,584 = 78,872 armyMin = min(120,789, 78,872) = 78,872 army_factor = sqrt(40,233 × 78,872) = 56,335 -- per-troop stats (T10.1 infantry, base_atk 491) att_per_troop = 491 × (1+293.66%) × 10 × (1+251.82%) / 100 = 680 def_per_troop = 2557.9 -- multipliers SkillMod = 1.26 (attacker DamageUp only) type_bonus = 1.00 (Inf vs Inf, no counter) fatigue = 1.0000 (round 0) -- result damage = 56,335 × 680 / 2557.9 × 1.00 × 1.26 × 1.0 / 100 = 188.7 deaths = ceil(188.7) = 189
5. How a round actually runs
A round is one simultaneous-action cycle, not a turn-by-turn trade. Both fighters compute their damage off the state at the start of the round, and deaths only land at the end. That's why the engine can produce a double-kill draw: both sides can wipe each other's front line in the same round.
- Roll every chance-based skill once. Each success injects its effect into the relevant SkillMod family for this round only.
- Attacker Infantry hits the first available enemy line.
- Attacker Cavalry hits, subject to the bypass roll below.
- Attacker Archer hits.
- Mirror steps 2–4 for the defender.
- Sum all incoming damage on each squad, cap at squad size, apply deaths.
- Tick down timed buffs, reset round-only debuffs.
- End if either side has zero total troops; otherwise next round.
In normal PvP there's no round cap and no timeout draw: the fight runs until one army is gone. Confirmed. (Bear Hunt is a separate model that caps at 10 rounds.) In a rally, only the rally leader's troops fight; up to four joiners contribute skills under a four-joiner cap, all of which feed the same SkillMod above.
6. Targeting, bypass and volley
Each squad attacks the first available enemy line in fixed order: Infantry, then Cavalry, then Archer. "Available" means the line has at least one troop alive at the start of the round.
Cavalry bypass (Ambusher). Roughly 20% of the time a cavalry squad bypasses the frontline and strikes archers directly: one roll per round per cavalry-attacking fighter. Confirmed in-game as a troop ability; the exact 20% is the consistently quoted community figure.
Archer volley. A 10% chance to fire a double attack, modeled as +10% expected archer damage or a per-round roll. Confirmed in-game as a troop ability; the exact 10% is the consistently quoted community figure.
FAQ
Is this an official Kingshot tool?
No. Absy Labs is community-built and not affiliated with or endorsed by KingsGroup. It's free and stays free.
Why grade values confirmed / probable / speculative?
Because a number without a source is just a guess wearing a confident font. Every value on this site says exactly how sure we are, instead of pretending otherwise.
Where does the data come from?
The combat math is read from the open-source SoS engine and checked against in-game battle reports; hero, gear and widget stats are pulled from the live game catalog so the simulator never drifts out of date.
Next up in the methodology series: SkillMod & op codes and stat-bonus aggregation. Want them prioritised? Tell me in Discord.
See the formula run on your roster.
Quick Fight shows this exact math round by round on a real matchup.