User guide All recipes Tutorial Function reference Open playground

Open this document in the playground · Download source

Cairn 2e — one Blood Elk hit

Advanced · R23 · Component: immediate injury categories, not a combat simulator

Question and scope

After one ordinary Blood Elk horns hit, how likely is each immediate injury category? The attack hits automatically. Armour reduces the d8 damage, HP absorbs what it can, and overflow reduces STR. A surviving victim then saves against reduced STR. At zero STR the victim dies before any save can help.

This report flags a scar but does not resolve the scar table, recovery, aid, subsequent attacks, or the fictional consequences of goring. Impaired/enhanced attacks and multiple attackers are excluded.

Inputs

InputDefaultSupported values
HP before the hit4Positive integers; not an already incapacitated PC
Armour2Integers 0–3
STR before the hit11Integers 1–20
Hornsd8Fixed ordinary Blood Elk attack

Model sketch

The function receives a horn face and an independent potential save face. def defines a function; return supplies its answer. Indented if branches stop at the first applicable outcome. Passing blood_elk_hit by name lets joint_classify apply it to all 8 × 20 possible pairs.

The potential save is ignored when damage does not require one. This preserves the relationship between damage and its save threshold; multiplying two separately displayed marginal probabilities would not preserve it.

HP = 4
ARMOR = 2
STR = 11

if HP < 1 or ARMOR < 0 or ARMOR > 3 or STR < 1 or STR > 20:
    fail("Use positive HP, Armor 0–3, and STR 1–20")

Scale = (
    scale()
    .step("NO_EFFECT")
    .step("HIT_PROTECTION_LOSS")
    .step("SCAR")
    .step("STR_DOWN_OK")
    .step("CRITICAL_DAMAGE")
    .step("DEATH")
)

def blood_elk_hit(horn, save):
    dmg = max(0, horn - ARMOR)
    if dmg == 0:
        return "NO_EFFECT"
    if dmg < HP:
        return "HIT_PROTECTION_LOSS"
    if dmg == HP:
        return "SCAR"
    new_str = STR - (dmg - HP)
    if new_str <= 0:
        return "DEATH"
    if save == 1:
        return "STR_DOWN_OK"
    if save == 20:
        return "CRITICAL_DAMAGE"
    if save <= new_str:
        return "STR_DOWN_OK"
    return "CRITICAL_DAMAGE"

out = joint_classify(d(8), d(20), Scale, blood_elk_hit)
output("blood_elk_horns", out)
output("p_protection_loss_or_worse", out.p_at_least("HIT_PROTECTION_LOSS"))
output("p_scar_or_worse", out.p_at_least("SCAR"))
output("Critical damage or death", out.p_at_least("CRITICAL_DAMAGE"))

blood_elk_horns · Outcomes

outcome%fracX/160
NO_EFFECT25.01/440
HIT_PROTECTION_LOSS37.53/860
SCAR12.51/820
STR_DOWN_OK11.919/16019
CRITICAL_DAMAGE13.121/16021
DEATH0.0000

p_protection_loss_or_worse · Prob

outcome%fracX/160
p_protection_loss_or_worse75.03/4120

p_scar_or_worse · Prob

outcome%fracX/160
p_scar_or_worse37.53/860

Critical damage or death · Prob

outcome%fracX/160
Critical damage or death13.121/16021

Reading and checking the report

Default horn facesCategoryIndependent check
1–2No effect1/4
3–5HP loss only3/8
6Scar triggered at exactly zero HP1/8
7–8, passed saveSTR loss, still fighting(10 + 9)/160 = 19/160
7–8, failed saveCritical damage(10 + 11)/160 = 21/160
NoneDeath at zero STR0

The default scar is keyed to 4 HP lost (Broken Limb), but its later rolls are outside this report. The last probability includes critical damage or death; the output title states both possibilities rather than hiding death in a critical-damage label.

Adaptations and boundaries

Change STR to 1 while keeping HP 4 and armour 2: horns 7–8 now cause death, probability 1/4. Even a potential save of 1 cannot prevent it. With STR 2, only a horn face of 8 causes immediate death, probability 1/8. These boundary checks catch an error that the default inputs cannot expose.

Do not chain this report into a second attack as if it preserved the remaining HP and STR. That needs a stateful model, not just these outcome labels.

Rules dossier

Cairn second edition, online Player’s Guide: Saves, Armor, Attacking & Damage, Critical Damage, Attribute Loss, and Scars; core rules. Warden’s Guide: Blood Elk. The online text was source-checked during this rewrite; no printing-specific page numbers are implied. Rules are paraphrased, not a replacement for the game. Independent human rules review and beginner/browser review remain pending.

Related: modifiers introduces named inputs; ordered outcomes explains the label ladder.

Content ID: R23 · Review status: pilot