# 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

| Input | Default | Supported values |
|---|---:|---|
| HP before the hit | 4 | Positive integers; not an already incapacitated PC |
| Armour | 2 | Integers 0–3 |
| STR before the hit | 11 | Integers 1–20 |
| Horns | d8 | Fixed 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.

```dice
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"))
```

## Reading and checking the report

| Default horn faces | Category | Independent check |
|---|---|---:|
| 1–2 | No effect | 1/4 |
| 3–5 | HP loss only | 3/8 |
| 6 | Scar triggered at exactly zero HP | 1/8 |
| 7–8, passed save | STR loss, still fighting | (10 + 9)/160 = 19/160 |
| 7–8, failed save | Critical damage | (10 + 11)/160 = 21/160 |
| None | Death at zero STR | 0 |

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](https://cairnrpg.com/second-edition/players-guide/core-rules/).
Warden’s Guide: [Blood Elk](https://cairnrpg.com/second-edition/wardens-guide/bestiary/#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](../tutorial/03-modifiers.html) introduces named inputs;
[ordered outcomes](../tutorial/11-ordered-outcomes.html) explains the label ladder.
