Absy Labs ABSY LABSKingshot Theorycraft

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.

Confirmed Probable Speculative every claim on this page carries one.

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
Confirmed  Read directly from the SoS engine's per-troop calculation. The trailing /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.

Probable  Op-code assignments for a handful of skills are reproduced by community testing but not visible in the UI, so they're tagged, not asserted.

Fatigue factor

fatigue_factor = 1 − round_index × 0.0001   round 0 starts at 1.0
Speculative  Soldiers doing 0.01% less damage each round is confirmed in the SoS engine, but not independently verified for Kingshot. It's assumed identical because of shared engine lineage, which is exactly why the simulator exposes it as a toggle rather than baking it in.

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
Confirmed  189 deaths. The simulator carries this as a permanent regression test: every change to the formula, the per-troop math, the SkillMod resolver or the bonus aggregation has to keep this exact number green, or the change doesn't ship.

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.

  1. Roll every chance-based skill once. Each success injects its effect into the relevant SkillMod family for this round only.
  2. Attacker Infantry hits the first available enemy line.
  3. Attacker Cavalry hits, subject to the bypass roll below.
  4. Attacker Archer hits.
  5. Mirror steps 2–4 for the defender.
  6. Sum all incoming damage on each squad, cap at squad size, apply deaths.
  7. Tick down timed buffs, reset round-only debuffs.
  8. 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.

Confirmed  The engine does not recompute targets mid-round. If your target line collapses partway through because another of your squads killed it first, the surviving damage simply misses. It is not redirected. A faithful simulator must not "fix" this.

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.