Skip to content

Combat Resolver Mathematics

Overview

This document defines the precise mathematical model used by the expedition resolver to determine encounter outcomes. Every encounter — creature combat, PvP caravan raid, boss contract — runs through this same core formula. Supplementary inputs (status effects, morale, terrain) are modifiers applied to the base probability before the outcome band is sampled.


Core Outcome Probability Formula

The resolver produces an outcome band on each encounter step:

outcome_band = sample(outcome_distribution(adjusted_score))

Where:

adjusted_score = base_party_score × matchup_modifier × role_coverage_modifier × morale_modifier × status_effect_modifier × seed_bias

Base Party Score

base_party_score = sum(individual_role_scores) / max_expected_role_score

Each party member contributes a role score based on their active role (Vanguard, Warden, Ranger, Arcanist) and their relevant skill band:

Skill Band Role Score Contribution
Untrained 0.3
Familiar 0.5
Practiced 0.7
Skilled 0.9
Veteran 1.1
Expert 1.3
Master 1.5

Role score is the average of the two most relevant skills for that role:

Role Primary Skill Secondary Skill
Vanguard Frontline Combat Endurance
Warden Field Medicine Endurance (or Warding, if higher)
Ranger Archery Tracking
Arcanist Elementalism Arcane Theory

Max expected role score is the ideal-party baseline (all members at Skilled = score 0.9 × 4 roles). This normalizes scores so a perfectly calibrated party has a base party score near 1.0.

Solo party: The solo party score is derived from a single character's highest-relevant two skills. The resolver does not penalize solo play explicitly through the formula, but the role coverage modifier (below) does.


Matchup Modifier

Applied based on the creature family's elemental and tactical affinity against the party's loadout:

Matchup Type Modifier
Strong advantage 1.35×
Neutral 1.0×
Poor matchup 0.70×

Matchup is determined per encounter, not per step. The matchup is fixed at the moment the encounter begins.

Matchup is bidirectional. The creature's resistances and the party's affinities both contribute: - If the party has Flame arcane and the creature is Spectral Karnhaunt (Flame affinity: Advantage), the matchup is Strong - If the party has no arcane and the creature is a Construct (poor matchup without Void), the matchup is Poor - If the party has Void arcane and the creature is a living beast (Void: ineffective against living), the matchup is Poor for the arcane component, but the physical combat lane runs at neutral

Mixed party matchup: If a party has conflicting affinities (one Arcanist with Flame, one with Frost), the resolver uses the better matchup for the dominant affinity (the Arcanist whose affinity gives the stronger modifier).


Role Coverage Modifier

The resolver checks whether each of the four combat roles is covered by at least one party member. Role coverage is defined as the relevant skills being at Familiar or above.

Roles Covered Modifier
All 4 roles covered 1.15×
3 roles covered 1.0×
2 roles covered 0.85×
1 role covered (solo) 0.75×
0 roles (no loadout) 0.5×

A "covered" role requires the party member to be actively assigned to that role slot for the expedition — not just having the skill. If a character has Archery at Skilled but committed as a Vanguard for the expedition, the Ranger slot is not covered.


Morale Modifier

Morale affects the outcome distribution directly. The morale modifier is applied as a linear adjustment to the adjusted score:

morale_modifier = 1.0 + ((current_morale - 50) × 0.005)

This gives: - At morale 100 (maximum): +25% to adjusted score (1.25×) - At morale 75 (full party default): +12.5% (1.125×) - At morale 50 (midpoint): 1.0× (neutral) - At morale 30 (solo default): 0.9× - At morale 0 (forced retreat): encounter cannot proceed — retreat is forced before resolver runs

Morale at encounter start uses the value after pre-encounter adjustments (camp bonus, Fear events, etc.) but before within-encounter morale changes. Within-encounter morale losses affect the next step, not the current one.


Status Effect Modifier

Each active status effect applies a modifier to the adjusted score for the affected party member's role contribution. Multiple status effects stack multiplicatively.

Status Effect Score Modifier
Fear −1 outcome band (applied post-calculation — see outcome band table)
Poison −0.1 to adjusted score per step (cumulative; injury adds up)
Paralysis Role zeroed for 1 step (affected member contributes 0 to party score that step)
Corruption −0.05 per corruption stack to adjusted score; at 3 stacks: role −1 tier; at 5 stacks: role zeroed
Exhaustion −0.1 to adjusted score (persistent while Exhaustion is active)
Constriction Hold Held member: role zeroed per step while held; creature's "defense" effectively raises its score by 0.2 per step

Stack order: Modifiers are applied in this sequence: 1. Base party score 2. Matchup modifier 3. Role coverage modifier 4. Morale modifier 5. Status effect modifiers 6. Seed bias 7. Outcome distribution sample

Fear's band penalty is applied after the distribution sample, not before it, which means Fear can push a Success outcome down to Partial Success or a Partial Success down to Failure.


Seed Bias

Each expedition has a unique seed generated at submission time. The seed introduces a small ±10% variance to the adjusted score to prevent identical parties from producing identical outcomes on every run:

seed_bias = 1.0 + (hash(expedition_seed) mod 21 - 10) × 0.01

This gives a range of 0.90 to 1.10 multiplied to the adjusted score. The seed is deterministic — the same party submitting the same expedition twice against the same world state will get the same outcome. The variance exists between different expeditions, not between re-runs.


Outcome Distribution

The final adjusted score maps to an outcome band using the following probability distribution:

Adjusted Score Strong Success Success Partial Success Failure Catastrophic Failure
≥ 1.5 40% 40% 15% 5% 0%
1.2–1.49 25% 40% 25% 10% 0%
0.9–1.19 10% 35% 35% 18% 2%
0.6–0.89 2% 18% 40% 32% 8%
0.3–0.59 0% 5% 25% 50% 20%
< 0.3 0% 0% 10% 45% 45%

Outcome band definitions:

Outcome Band Description Injury Morale
Strong Success Party overwhelms the encounter None +5 morale
Success Party resolves the encounter effectively Minor chance Grade 1 (10%) No change
Partial Success Party succeeds but takes meaningful damage Grade 1 guaranteed; Grade 2 chance (20%) −5 morale
Failure Party is driven back or fails objective Grade 1–2; Grade 2 guaranteed if sustained −10 morale
Catastrophic Failure Party is incapacitated or route is failed Grade 3+ per member; incapacitation trigger −20 morale; retreat forced

Catastrophic Failure and Incapacitation: A Catastrophic Failure on the first step of an encounter may not immediately incapacitate — the party may attempt a forced retreat if morale is still above 0. If morale reaches 0 during the forced retreat, incapacitation occurs. If morale is 0 at the point of Catastrophic Failure, incapacitation is immediate.


Multi-Step Encounters

Boss encounters and elite encounters run multiple resolver steps sequentially. Each step:

  1. Recalculates the adjusted score using current morale and accumulated status effects
  2. Samples the outcome distribution
  3. Applies injury, morale changes, and status effect updates from that step's outcome
  4. Passes updated state to the next step

Step count by encounter type:

Encounter Type Steps
Standard creature (Grade D–C) 1 step
Challenging creature (Grade B) 2 steps
Elite creature (Grade A) 3 steps
Boss contract (Tier S) 4–5 steps (template-defined)
PvP caravan raid 1 step (single resolution)

Each step's outcome is independent — a Success on step 1 does not guarantee Success on step 2. However, injury accumulation from step 1 feeds into step 2's status effect modifier, creating a realistic degradation pattern where an injured party performs worse in sustained engagements.


PvP Encounter Resolution

For caravan raids and bounty hunts (from pvp-and-conflict.md), the resolver runs a comparative calculation rather than a single-party calculation:

pvp_adjusted_score = (attacker_score / defender_score)

Where each side's score is computed using the same formula above (base party score × matchup × role coverage × morale × status effects). Seed bias is applied once to the ratio.

The resulting ratio maps to the standard outcome distribution, but the interpretation is: - Strong Success (attacker): raid fully succeeds; maximum cargo loss - Success (attacker): raid succeeds; substantial cargo loss - Partial Success: mixed — caravan loses some cargo but not all - Failure (attacker): raid fails; caravan arrives intact; raider loses expedition supplies - Catastrophic Failure (attacker): raid fails badly; raider incapacitated

Defender morale in PvP uses the escort party's morale, or a default value of 50 if the caravan had no escort party.


Loot Resolution

After the outcome band is determined, loot is resolved through a separate drop table lookup:

loot_roll = base_drop_table(creature_type, outcome_band) × quality_modifier(party_skill_average)

Strong Success grants access to the full drop table including rare tiers. Failure grants reduced access (common drops only, no rare tiers). Catastrophic Failure grants no loot — the party was driven back.

Quality modifier adjusts the probability of higher-quality drops based on the party's average skill band: - Party average Skilled or above: +10% chance of Fine drop in the quality tier roll - Party average Veteran or above: +20% chance of Superior drop - Party average Expert or above: +30% chance of Exceptional drop (where available)