About This Tool

WARNO Replay Analytics is a browser-based postmatch analysis suite for WARNO 1v1 matches. It has no server, no account, and no install requirement — everything runs locally against files you provide.

Limitations:

  • 1v1 multiplayer ranked or skirmish games are the only fully-supported game mode. Single-player skirmish matches cannot track AI opponent unit buys.
  • Selling of transports not saved in the replay files, so available points (e.g. points floated) cannot be calculated.

It is open source software, released under the MIT License. Suggestions and bug reports are welcome. Contact: [email protected].

Replay Analysis — How It Works

WARNO saves 1v1 matches as binary .rpl3 files. This tool implements a client-side parser for the RPL3 format that extracts the structured event log embedded in the file — specifically the unit purchase events, their timestamps, and the player and phase (deployment vs. reinforcement) they belong to.

Each buy event is cross-referenced against the unit database to recover unit stats, cost, domain, and role. This produces a complete acquisition log for both players with millisecond-precision timestamps that can be normalized to match time.

The warno kill feed data comes from end-game screenshots taken of WARNO's post-battle summary screen. The tool sends these screenshots to Google Gemini for optical character recognition. The returned unit names and kill counts are fuzzy-matched against the unit database to recover structured kill records with cost information.

The two streams — buy events and kill events — are merged into a unified chronological event feed and used to reconstruct both players' force composition over time. At each point in the match, the tool maintains a live roster of units purchased minus units destroyed, computes the aggregate combat power of each player's surviving force across all five power metrics, and plots those values on a timeline. The result surfaces inflection points — the specific events that caused a measurable, sustained decline in one side's combat power.

WARNO COMPOSITION ANALYSIS — Methodology

The quantitative assessment of unit combat effectiveness has deep roots in military operations research. Frederick Lanchester's 1916 differential equations — now known as Lanchester's Laws — demonstrated that a force's fighting power scales with the square of its size and its individual unit kill rate, establishing the mathematical foundation for weighted unit valuations. Trevor N. Dupuy's Quantified Judgment Model (QJM), developed at the Historical Evaluation and Research Organization in the 1970s and codified in Numbers, Predictions, and War (1979), extended this framework to multi-factor unit scores: firepower, mobility, protection, and operational factors combined into a single Combat Effectiveness Value (CEV). NATO's Weighted Unit Value (WUV) methodology applied similar scored-factor composites to European theater balance assessments throughout the 1980s, and RAND's attrition-based campaign models and the U.S. Army's JANUS simulation engine likewise incorporate scored unit lethality and survivability parameters as foundational inputs.

This tool applies the same analytical tradition to WARNO's game data. Five orthogonal power metrics are derived from unit data files, each evaluated against a standardized reference engagement — a fixed target type, reference engagement range, and normalized fire cycle. All values are expected-value estimates: not "which unit wins a duel" but "what is this unit worth per engagement-second against a standard reference target." Values are comparable within a metric across all units; they are deliberately not comparable across metrics, which are on different scales by design.

Shared Sub-Formula: Fire Rate

All three lethality metrics depend on a weapon's effective sustained fire rate, computed across a complete fire cycle. A weapon aims, fires its full salvo, then reloads before the next cycle begins. Multi-barrel or multi-tube systems fire all tubes in parallel within each cycle.

Fire rate (shots per second, averaged over complete cycle):
fire_rate = (salvo_length × nb_weapons) / (aiming_time_s + salvo_length × time_between_shots_s + reload_time_s)
  • salvo_length: number of rounds fired per burst before the weapon must reload
  • nb_weapons: barrels or launcher tubes firing in parallel each cycle
  • aiming_time_s: seconds from first engagement decision to the first shot leaving the barrel
  • time_between_shots_s: inter-round interval within the salvo; clamped to a minimum of 1 μs to prevent division by zero for instant-fire entries
  • reload_time_s: seconds to reload after the last round in the salvo has fired
  • If the computed cycle time is zero or negative, fire_rate = 0 — the weapon cannot fire

Shared Sub-Formula: Hit Probability

For direct-fire weapons the hit probability is drawn directly from game accuracy data. For indirect-fire weapons (artillery, mortars, MLRS), the game stores accuracy = 0 because on-target effects are modeled through area splash footprints rather than individual projectile impact probability. A calibrated area-effect proxy is used in their place.

Direct fire:
hit_prob = max(accuracy_static, accuracy_moving) / 100

The higher of static and moving accuracy is taken, capturing stabilized weapons whose static accuracy may be listed as 0 while moving accuracy reflects full engagement capability.

Indirect fire — area-effect proxy (weapons with is_indirect = true):
p = 0.22 × (1 + 0.10 × ln(1 + splash_radius_m) + 0.08 × ln(1 + suppress_radius_m))
p_indirect = clamp(p, 0.01, 0.65)
  • Baseline (0.22): a zero-splash indirect weapon has 22% effective hit probability
  • Splash bonus (0.10 × ln(1 + r)): logarithmic weighting rewards larger blast radii with diminishing returns. A 50 m splash adds ≈ 0.39 inside the bracket; 200 m adds ≈ 0.53
  • Suppress bonus (0.08 × ln(1 + r)): derived from the suppression footprint radius at a slightly lower weight
  • Cap (0.65): no indirect weapon exceeds 65% effective hit probability against a maneuvering target

S — Survivability

Survivability encodes how long a unit remains in action long enough to deliver its firepower. Dupuy's QJM applied a non-linear armor protection factor because historical engagement data consistently showed that armor above a penetration threshold conferred non-proportional protection. This is modeled through the gamma exponent on the armor factor. Stealth multiplies survivability because a unit that cannot be targeted if it cannot be detected.

Formula:
S = HP × armor_factorγ × stealth_factor × Msmoke × Mecm
  • HP: unit hit points from game data
  • armor_factor — for armored vehicles, helicopters, and fixed-wing aircraft (armor families: blindage, helico, avion):
    armor_factor = 1 + (armor_front / ABAR) = 1 + (armor_front / 15)
    For infantry and light unarmored vehicles (infanterie, vehicule): armor_factor = 1.0. Aircraft/helicopter front armor is typically 1–5, yielding modest multipliers of 1.13–1.78× — real, but well below an MBT's factor.
  • γ (gamma) = 2.0: the non-linearity exponent. A tank with armor_front = 20 scores (1 + 20/15)² ≈ 5.44×; armor_front = 10 scores ≈ 2.78×.
  • ABAR = 15: reference front armor index for a heavy MBT (calibrated to the M1A1 / T-80 class).
  • stealth_factor = unit.stealth / 1.0: linear scaling. STEALTH_REF = 1.0 is the low-stealth baseline.
  • Msmoke: 1.25× if the unit has smoke dischargers, else 1.0×.
  • Mecm: Electronic Counter-Measures survivability multiplier. ECM reduces the effective hit-roll probability for all incoming fire. WARNO stores ECM as a negative HitRollECM modifier (e.g. −0.1 to −0.6 for progressively stronger suites). Converted to a multiplicative survivability bonus:
    Mecm = 1 / max(ECM_FLOOR, 1 + ecm) where ECM_FLOOR = 0.10
    Examples: ecm = 0.0 (all ground units) → Mecm = 1.0 (no effect); ecm = −0.1 (Su-25) → 1.11×; ecm = −0.3 → 1.43×; ecm = −0.6 (EA-6B Prowler, EF-111) → 2.50×. ECM_FLOOR prevents division by zero and floors attacker effectiveness at 10% even against the strongest suite.

Shared Sub-Formula: AP Damage Per Hit

In WARNO, anti-armor weapons are categorized into two terminal ballistics models. Kinetic-energy (KE) penetrators are range-dependent; HEAT warheads and ATGMs use jet penetration independent of range. The damage applied to the targeted unit is mitigated by armor according to these penetration formulas;

KE penetrators (DamageFamily_ap):
delta = damage_index − 15
if delta ≤ −2 : ap_damage = 0
if delta > −2 : ap_damage = 1 + delta / 2
HEAT / ATGM (DamageFamily_ap_missile, _roquette_ap, _clu_sol_ap):
delta = damage_index − 15
if delta ≤ −2 : ap_damage = 0
if −2 < delta ≤ 10 : ap_damage = 1 + delta / 2
if delta > 10 : ap_damage = delta − 4
  • KE bounce threshold: a KE round with damage_index ≤ 13 does zero damage — it shatters without penetrating.
  • Linear region (both): for −2 < delta ≤ 10, each armor index of excess penetration adds 0.5 damage points.
  • HEAT super-penetration (delta > 10): at delta = 10 both formulas give 6.0; above delta = 10 tandem warheads receive an additional bonus. Example: delta = 15 → ap_damage = 11.0.
  • HEAT is range-independent: shaped-charge jet penetration does not degrade with range in WARNO's mechanics.

Lhard — Hard Lethality

This is the primary anti-armor work metric. AP and HEAT weapons contribute at full credit via direct penetration damage. Indirect HE weapons contribute at reduced credit through a blast-and-shock conversion path. The reference engagement distance is 2000 m; weapons with greater reach receive a proportional bonus up to a cap of 2.0×.

AP / HEAT weapons (direct fire):
Lhard = fire_rate × hit_prob × (ap_damage + suppress_damage × 0.002) × min(max_range_m / 2000, 2.0)
Indirect HE weapons (blast / shock conversion path):
Lhard = fire_rate × pindirect × (physical_damage × 0.55 + suppress_damage × 0.0045) × min(max_range_m / 2000, 2.0)
  • Suppression weight — direct AP (0.002): near-miss shocks reduce crew effectiveness even without penetration; kept low as suppression rarely produces kills outright in armored combat.
  • Indirect HE conversion factor (0.55): 55% of nominal HE physical damage is credited as anti-armor lethality through tracked damage, engine fires, ERA detonation, and crew overpressure.
  • Suppression weight — indirect (0.0045): more than twice the direct-fire weight; sustained artillery concentrations produce crew shock at rates disproportionate to actual penetration.
  • Range weight: a weapon engaging beyond 2000 m receives a range_m / 2000 multiplier, capped at 2.0×. Encodes first-shot advantage at range.

Lsoft — Soft Lethality

This is the work metric for damage against infantry and unarmored vehicles. Any weapon with a high-explosive or small-arms damage family contributes. The reference engagement range is 1000 m. Suppression weights are slightly higher here than in Lhard: Dupuy's historical attrition studies consistently show that suppression accounts for a large fraction of tactical outcome against dismounted infantry.

Direct fire HE / small arms:
Lsoft = fire_rate × hit_prob × (physical_damage + suppress_damage × 0.003) × min(max_range_m / 1000, 3.0)
Indirect fire HE (artillery, mortars, MLRS, thermobaric, cluster):
Lsoft = fire_rate × pindirect × (physical_damage + suppress_damage × 0.004) × min(max_range_m / 1000, 3.0)
  • Eligible damage families: DamageFamily_he, _he_autocanon, _he_dca, _fmballe (small arms), _superhe, _howz, _howz_bombe, _cluster, _he_cluster, _thermobarique, _cac
  • Suppression weight — direct (0.003): 50% higher than Lhard direct weight. Suppressed infantry cannot fire, move, assault, or capture.
  • Suppression weight — indirect (0.004): artillery barrages are historically the dominant source of infantry suppression on the conventional battlefield.
  • Range cap (3.0×): higher than the Lhard cap because long-range HE area weapons engage at many multiples of the reference distance with nearly unchanged lethality against soft targets.

Lair — Air Lethality

This is the work metric for damage against helicopters and fixed-wing aircraft. Any weapon with a non-zero anti-helicopter or anti-aircraft engagement range contributes, regardless of damage family — capturing short-range SAMs, SHORAD autocannons, MANPADs, and air-to-air gun systems uniformly. The reference engagement range is 3000 m. Suppression is weighted near zero: routing or disrupting an air crew produces negligible modeled tactical outcome within the engagement timeframe compared to the physical kill probability.

Any weapon with max_range_helo_m > 0 or max_range_plane_m > 0:
max_air_range = max(max_range_helo_m, max_range_plane_m)
Lair = fire_rate × hit_prob × (physical_damage + suppress_damage × 0.001) × min(max_air_range / 3000, 2.0)
  • Suppression weight (0.001): near-zero. Physical damage dominates entirely in air engagements within WARNO's modeled timeframe.
  • No indirect path: indirect-fire weapons are excluded. Artillery is not modeled as a meaningful SHORAD asset.
  • Range weight cap (2.0×): long-range SAM systems receive the full cap, giving them proportional credit for airspace-denial capability well beyond typical SHORAD coverage.

Air Domain Adjustments

Fixed-wing aircraft exhibit two structural limitations not captured by raw DPS figures and addressed by explicit post-formula corrections. Helicopters benefit from the ECM survivability multiplier (described under S) but do not receive the lethality discount below; their controlled engagement patterns (nap-of-earth, hover behind cover, selective exposure) give them far higher and more consistent battlefield presence.

Aircraft Lethality Uptime Discount

Fixed-wing aircraft are highly lethal per engagement-second, but spend a significant portion of a match away from the battlefield. Two mechanics limit ground-attack throughput: suppression-triggered evac (aircraft automatically retreat when they accumulate sufficient suppression, which AA fires impose very quickly), and limited payload (gunpods and unguided bombs allow only 1–2 passes before the aircraft must return for a multi-minute refuel cycle).

Air-to-air fighters operate under different constraints — they can pursue enemy aircraft anywhere across the map and are not similarly ammo-constrained — so a lighter malus is applied to air lethality than to ground-attack lethality.

Separate multipliers are applied after trait adjustments:

Applied in profile_unit() for domain = "aircraft" only:
Lsoft × AIRCRAFT_GROUND_UPTIME (80% malus, multiplier = 0.20) Lhard × AIRCRAFT_GROUND_UPTIME (80% malus, multiplier = 0.20) Lair × AIRCRAFT_AIR_UPTIME (25% malus, multiplier = 0.75)
  • This does not affect Survivability (S) or Initiative (I) — both are already 0 for fixed-wing aircraft (I = 0 by definition; S is meaningful but a destroyed aircraft is not worth comparing on the same chart as the lethality scores).
  • AIRCRAFT_GROUND_UPTIME = 0.20: reflects the severe throughput reduction from suppression evac and 1–2-pass ammo limits on ground-attack sorties.
  • AIRCRAFT_AIR_UPTIME = 0.75: a lighter discount for air-to-air capability — fighters can engage enemy aircraft across the full map extent, but are still not continuously on-station for the entire match duration.

Infantry Entrenchment Adjustment

Infantry rarely fight in the open. Their default deployment posture is entrenched in buildings or forest. In WARNO, cover in these terrain types applies two significant bonuses not captured by the base formula:

  • Stealth ×3 in buildings/forest — partially encoded in the raw stealth field but not fully modelled for an entrenched squad.
  • Incoming physical damage ÷2 — cover absorption that is entirely absent from the raw HP value.

Together these approximately double effective survivability beyond what the raw HP × stealth formula produces for an equivalent unit in the open. Entrenchment is, however, a direct trade for mobility: squads in cover are slow to reposition, cannot easily choose their engagements, and cede initiative to more mobile opponents. This is modelled as a ×0.5 discount on Initiative, reflecting the reduced ability to act rather than react in the OODA cycle.

Applied in profile_unit() for armor family = “infanterie”:
S × INFANTRY_S_MULT (INFANTRY_S_MULT = 2.0) I × INFANTRY_I_MULT (INFANTRY_I_MULT = 0.5)
  • Lethality metrics are unchanged — cover does not reduce a squad’s outgoing firepower. Lsoft and Lhard are computed entirely from weapon stats and are unaffected by the entrenchment model.
  • INFANTRY_S_MULT = 2.0: calibrated to damage ×0.5 in cover. A squad that absorbs half the physical damage of an exposed one effectively requires twice the fire to destroy.
  • INFANTRY_I_MULT = 0.5: entrenched infantry respond to threats rather than dictating the terms of engagement. The halved I score correctly re-orders initiative rankings relative to mobile reconnaissance and armoured units that can reposition and choose contact ranges freely.
  • Specialist traits still stack: a _sniper unit receives SNIPER_S_MULT on top of INFANTRY_S_MULT, correctly reflecting extreme stationary concealment.

I — Initiative

Initiative operationalizes John Boyd's OODA (Observe-Orient-Decide-Act) loop theory as applied to ground combat: the unit that detects first, can engage from greater range, and can reposition faster will consistently compel the enemy to react rather than act. This is a force-multiplier concept independent of raw firepower. Fixed-wing aircraft return I = 0 because their tactical initiative domain is entirely separate from the ground-centric combat modeled here.

Formula (ground and helicopter units only):
I = detect × range_f × mobile × Mstab
detect — combined sensing and concealment factor:
detect = (optics_strength / 70) × (stealth / 1.0)
  • OPTICS_REF = 70: calibrated to a "Normal" optics rating. A unit with exceptional sensors (optics_strength ≥ 250) carries 3.5× the detect score of a Normal unit.
  • STEALTH_REF = 1.0: low-stealth baseline. The multiplication of optics and stealth computes the "see without being seen" compound advantage.
range_f — effective engagement / sensing range factor:
ground_f = √(max_ground_range / 2000) if max_ground_range > 0, else 0
air_f = √(max_air_range / 3000) if max_air_range > 0, else 0
sensor_f = √(vision_range_m / 2200) if vision_range_m > 0, else 0
engage_f = max(ground_f, 0.85 × air_f)
range_f = max(engage_f, 0.35 × sensor_f)
  • Square root (diminishing returns): range confers initiative with decreasing marginal value. 4× the reference range → 2× the range_f.
  • AIR_RANGE_TO_INIT = 0.85: AA engagement range contributes to initiative at 85% weight.
  • INIT_SENSOR_FLOOR = 0.35: unarmed scouts receive a minimum range_f contribution of 35% of their sensor_f score.
  • VISION_REF = 2200 m: baseline vision projection range. A unit with vision_range_m = 2200 m contributes sensor_f = 1.0.
mobile — normalized off-road speed:
mobile = min(speed_offroad_kmh, speed_cap) / 40
speed_cap = 120 km/h for ground units; 350 km/h for helicopters
  • SPEED_REF = 40 km/h: reference off-road speed, representative of a medium tank or IFV.
  • Speed caps: jet aircraft at 400–600 km/h would produce I scores 10–15× any ground unit — analytically vacuous in a ground-centric metric. Fixed-wing aircraft are excluded (I = 0).
  • Mstab = 1.2× if any non-hidden weapon has can_shoot_moving = true; 1.0× otherwise. Stabilized units deliver accurate first-round fire while still moving.
Deployment-phase paratrooper boost (WARPLAN only):
Iagg += Iunit × deploy_count × PARA_DEPLOY_I_MULT
Iagg += Iunit × reinf_count × 1.0
  • PARA_DEPLOY_I_MULT = 3.0: units with the _para (paratrooper) trait that are spawned during the deployment phase contribute 3× their base Initiative score to the aggregate I metric. Paratroopers can deploy into a forward zone beyond the standard deployment boundary, establishing observation posts and ambush positions before the battle begins. This positional advantage maps directly to Boyd's OODA framework: the side that places eyes and weapons forward before first contact will observe earlier, orient faster, and compel the opponent to react rather than act. The boost applies only to deployment-phase instances and diminishes naturally as those forward-deployed units take casualties.
  • PARA_DEPLOY_I_MULT_RECO = 1.5: RECO (reconnaissance) units with the _para trait receive a reduced deployment multiplier of 1.5× rather than 3.0×. RECO units already deploy closer to the front line during the deployment phase by default, so the marginal positional advantage gained from the paratrooper forward deployment zone is smaller. The boost remains meaningful — they still reach positions beyond the standard RECO deployment boundary — but the delta is less pronounced than for non-RECO paratroopers deploying forward from deeper starting positions.
  • Scope: this multiplier is applied during WARPLAN aggregate power calculation, not in the per-unit I score computed by WARCAL. It is a contextual, phase-dependent modifier visible only in the WARPLAN initiative timeline — reflecting the fact that the advantage is tied to the act of forward deployment, not to the unit's inherent capabilities.

Veterancy — Power Modifiers

Units accumulate combat experience across four levels. Two distinct veterancy tables apply depending on unit type: standard units and Special Forces (_sf trait). Green (level 0) does not exist for SF units in-game; the baseline row is included for reference only.

Standard Units

Veterancy improves weapon handling (aiming and reload time) and accuracy. Survivability (S) and Initiative (I) are unchanged.

Stat Green (0) Trained (1) Veteran (2) Elite (3)
Accuracy baseline +5% +10% +15%
Aiming time baseline −4% −8% −12%
Reload time baseline −10% −15% −20%
Stress resistance baseline +14% +22% +32%
Stress recovery 0.6 / sec 1.9 / sec 2.3 / sec 2.7 / sec

Aiming time and reload time both reduce the fire cycle, increasing fire_rate. Accuracy scales hit_prob directly. The two compound multiplicatively — lethality is proportional to fire_rate × hit_prob:

Standard — compound lethality multiplier vs Green (typical weapon cycle):
L_mult = fire_rate_mult × accuracy_mult
Green: 1.00 × 1.000 = 1.000× (baseline)
Trained: ~1.073 × 1.050 ≈ 1.127× (+13%)
Veteran: ~1.124 × 1.100 ≈ 1.236× (+24%)
Elite: ~1.176 × 1.150 ≈ 1.352× (+35%)

The fire_rate multiplier assumes aiming ≈ 25% and reload ≈ 60% of cycle time. Weapons with longer relative reload times (artillery) see a larger gain; fast autocannons with near-zero reload see a smaller one.

Stress resistance and recovery create an additional hidden uptime multiplier. Elite stress recovery (2.7/sec vs 0.6/sec for Green, a 4.5× improvement) keeps a unit near full effectiveness under sustained fire while a Green-tier equivalent is largely pinned. This compounds further with the fire-rate and accuracy gains.

Special Forces (SF) Units

SF veterancy exposes rate of fire and precision directly rather than working through the weapon cycle components. Critically, Veteran and Elite levels also confer a movement speed bonus, which boosts Initiative through the mobile factor and provides a modest survivability gain through improved maneuverability.

Stat Green (0) Trained (1) Veteran (2) Elite (3)
Precision n/a +8% +12% +16%
Rate of fire n/a +10% +20% +30%
Stress resistance n/a +20% +30% +40%
Stress recovery n/a 2.3 / sec 2.9 / sec 3.3 / sec
Movement speed n/a +20% +30%
SF — lethality, initiative, and survivability multipliers:
L_mult = rate_of_fire_mult × precision_mult
I_mult = movement_speed_mult
S_mult = 1 + (speed_bonus% / 300) [maneuver proxy]
Trained: L×1.188 I×1.000 S×1.000
Veteran: L×1.344 I×1.200 S×1.067
Elite: L×1.508 I×1.300 S×1.100

The SF lethality gains are substantially larger than for standard units (+19/34/51% vs +13/24/35%). Movement speed at Veteran and Elite further lifts the Initiative score — capturing SF's ability to close distance, break contact, and control engagement range — while the maneuver survivability proxy acknowledges that a faster-moving unit is harder to track and engage.

Reading the Metrics

  • Within-metric comparisons are valid: rank any set of units by S, Lhard, Lsoft, Lair, or I and the ordering is meaningful.
  • Cross-metric comparisons are not directly valid: S and L are on different scales by design. A high S does not mean the unit is "worth more" than one with a high Lhard.
  • Normalize by Cost converts each metric to points per point-cost, enabling cost-efficiency analysis within a metric — equivalent to WUV per-dollar assessments used in theater balance modeling.
  • Bar charts expose the unit archetype profile. A specialist platform shows a single tall bar for its primary metric; a generalist shows moderate values across multiple metrics simultaneously.
  • Domain filter: Initiative values for helicopters use helicopter-specific speed caps and range parameters. Numeric comparison of I between ground and helicopter units is mathematically valid but should be read with domain context.

License & Attribution

WARNO Replay Analytics is released under the MIT License. You are free to use, modify, and redistribute the code for any purpose with attribution.

Combat power formulas are original work, applying established military operations research methodology to WARNO's game data. The methodology is not endorsed by or affiliated with Eugen Systems.

WARNO is a trademark of Eugen Systems. This tool is an independent community project and is not affiliated with, endorsed by, or connected to Eugen Systems in any way.