Affliction

What Is an Affliction?

An Affliction is something working on a character from the outside — a disease, a poison, a curse. It has a source, a way of reaching a victim, a course it runs, and an end it is heading toward.

What separates it from a Trauma is where the harm comes from. A Trauma is a state the character carries: a wound, exhaustion, terror. An Affliction is an agent at work on them, and it will get better or worse whether or not anything else happens. A poisoned character has an Affliction; the fatigue and the shock that poison inflicts on them are Traumas.

Every affliction runs through three phases:

  1. Incubation — contracted, present, possibly catching, but showing nothing.
  2. Symptomatic — from onset to the end. The body fights it, and the affliction’s Healing Rate rises or falls with each Course Test.
  3. Outcome — the end of the road: death, or a cure, possibly leaving a Trauma behind.

The Afflictions rules describe the mechanics behind those phases. This page describes the item, its fields, and the three actions that move it from one phase to the next.

Where It Appears

Afflictions live on the Being sheet’s Health tab, in their own Afflictions list below the Traumas, grouped by SubType. Each row shows:

ColumnWhat it shows
AfflictionThe item’s name
CategoryThe free-text Category field, when it has one
LevelSeverity, as authored
HRThe current Healing Rate — an when the affliction does not heal
Next Heal TestWhen the next Course Test is due, or blank when nothing is scheduled
The Actions menu for that affliction

Afflictions arrive in three ways: the Being’s Contagion Test action (rolled exposure — see Being), a drag from a compendium of written-up diseases and poisons, or the control on the list when the table decides a character has caught something.

How it arrived decides whether it goes anywhere. Only Contagion Test offers to start the clock. An affliction you drag or add by hand sits inert: it is on the sheet, its fields are real, but nothing is scheduled and it will never onset on its own until someone arms it.

To reach an affliction’s actions, right-click its row (or use the ), or open the affliction and use its Actions tab. See Actions for how the menu works generally.

Additional Properties

The SubType is chosen when the affliction is created and is not editable afterwards — it is shown read-only in the sheet header’s subtitle, as Disease Affliction, Poison/Toxin Affliction, and so on. It classifies the affliction by the nature of the agent:

SubTypeNatureExamples
Poison/ToxinChemicalvenom, mandrake, hemotoxin
DiseaseBiologicaltyphoid, tuberculosis, river blindness
MaladictionSupernaturala curse, a hex, a divine or spirit blight
Otheranything not covered above

The SubType is descriptive: it does not change the Course Test or the outcome machinery, which are the same for every affliction. It decides only which afflictions count as contagious diseases for exposure — only Disease afflictions can be caught with a Contagion Test. Conditions a character carries — fatigue, fear, morale, infection, aural shock — are Traumas, not afflictions.

Along with the Standard Item Properties, the Properties tab offers:

FieldWhat it is
CategoryAn optional free sub-classification within the SubType. Shown in the Category column on the Health tab
DormantThe affliction is present but inactive. A dormant affliction may still be transmissible, but it runs no course
LevelSeverity, low to high. Authored, and it does not move — see below
Healing RateHow the fight is going, 1–6. This is the number that moves. Clear the field entirely for an affliction that does not heal naturally at all
Contagion IndexHow readily it spreads, 1–5. Lower is more contagious
TransmissionHow it reaches a new victim — see the table below
Onset Macro UUIDOptional. A Macro run once at onset, letting an author attach concrete consequences to a specific affliction. A reference only, never code
OutcomeWhat running the course to the end does to the character: Death or Cured. Defaults to the benign Cured
Outcome TraumaOptional. A Safe Expression yielding the shortcode — or a list of shortcodes — of the Traumas the character contracts at the end
ContractedWorld-time the affliction was contracted. Stamped automatically when the item is created
TreatedWorld-time treatment was applied. Blank means untreated

Three fieldsets below them carry the timing of each phase. Each pairs an authored formula with the seconds last rolled from it, plus a view-only projection:

FieldsetFields
OnsetOnset Interval Formula, Onset Interval (sec), Est. Onset Date (view-only), Onset Date
Healing CheckHeal-Check Interval Formula, Heal-Check Interval (sec), Next Heal Test (view-only)
ResolutionResolution Interval Formula, Resolution Interval (sec), Est. Resolution Date (view-only), Resolution Date

The formulas are dice expressions or plain second counts, and they are rolled fresh at the moment each phase needs them — so two characters who catch the same disease do not incubate for the same number of days.

Four of these fields deserve a second look:

  • Level does not fall as the character recovers. On a wound, Level is what heals. On an affliction it is authored severity and nothing in the lifecycle touches it. Healing Rate is the number that tells you how the fight is going: it rises and falls with every Course Test, and reaching 6 is what beats the affliction.
  • A blank Healing Rate means the affliction never heals naturally. The column on the Health tab shows an , and no Course Test is ever rolled — the affliction simply runs its clock to the outcome. That is how a lethal poison is written.
  • Est. Onset Date and Est. Resolution Date are projections from the interval and the anchor date, shown so you can see roughly where this is heading. They are never saved. Onset Date and Resolution Date are the real, crystallized facts, and they are only filled in once the matching check has actually been performed.
  • Next Heal Test reads the live reminder when one is armed, so an accepted reschedule shows up here. It is blank far more often than you might expect, and that is correct: SoHL never schedules anything on its own.

Transmission describes how the affliction reaches a new victim:

ModeHow it spreads
NoncommunicableNot transmissible
AirborneThrough the air
ContactBy skin contact
Body FluidBy body fluid through an orifice or a wound
InjestedBy eating or drinking
ProximityBy being near the source — a force such as radiation, rather than the air
VectorBy a sting, bite, or other break in the skin
PerceptionBy seeing or hearing the source
ArcaneBy spell or other arcane means
DivineBy divine attunement
SpiritFrom one aura or soul to another

The Affliction Actions

ActionShortcodeWhere you meet it
Request TreatmentrequestTreatmentActions context menu
Treat AfflictiontreatAfflictionActions context menu
Course TestcourseTestActions context menu
Course CheckcourseCheckHidden — scheduled reminder
Healing TesthealingTestActions context menu
Healing CheckhealingCheckHidden — scheduled reminder
Set OnsetsetOnsetActions menu / Onset card
Onset CheckonsetCheckHidden — scheduled reminder
Set ResolutionsetResolutionActions menu / Resolution card
Resolution CheckresolutionCheckHidden — scheduled reminder

The four Check actions are hidden, and deliberately so: they are never in the Actions context menu. You meet each one as a card in chat when that phase of the affliction comes due. They are not off-limits — they are simply reached from where they make sense.

A Check and a Test are different things, and the difference is the whole design. A Check offers: it posts a card asking whether to make the test, and changes nothing by itself. Anyone can post one. A Test acts: it rolls, applies the outcome, and then offers to schedule the next test. Nothing is ever rolled or applied without someone pressing a button first.

How an affliction moves through the system

  1. It is contracted. A Contagion Check on the exposed character offers a Contagion Test; failing that test catches the affliction, and — if the test’s add to character sheet box was ticked — it is created with Contracted stamped and its incubation already rolled. A critical failure takes hold twice as fast as a marginal one. An affliction added by hand skips all of this and sits inert.
  2. It onsets. The onset reminder comes due and posts an Onset Check card; pressing its Set Onset button runs Set Onset, which asks once, marks the affliction symptomatic, and then offers the course and resolution checks that carry it from here.
  3. The body fights it. Each Course Check offers a Course Test; the test moves the Healing Rate up or down, and the character reacts to wherever that rate now sits — fatigue, shock, or nothing. Reaching HR 6 defeats the affliction and the recurrence ends.
  4. It resolves. If the clock runs out first, a Resolution Check card offers Set Resolution, which asks which outcome the affliction settles on — death or cure — and applies it, plus any Trauma the affliction leaves behind, stamping the resolution date as now.

At no point does the system take a step for you. Every transition waits on a human: an offer you accept, and a Perform you press.

The reminder loop

All three checks follow one pattern:

offer → check → test → offer the next

When a check would begin, SoHL opens the offer-schedule dialog, described once on Base Item, asking whether to set a reminder with the rolled cadence already filled in (“Set a reminder to perform the Course Test in 5 days?”). Schedule It arms it; Not Now declines, and nothing is tracked. When the time comes, a reminder card appears in chat with a Perform button. Nothing has happened to the character yet: the check runs when someone presses it.

Declining is always safe. It does not cure the disease — it only means SoHL stops keeping time for you, and the table runs the check by hand when it decides the time has come.

One check, one test. However much game time has passed, a check offers exactly one test and performing it rolls exactly once. Nothing is silently caught up in a single click.

That is not the same as losing the time. Because each test schedules the next one from the last test’s date rather than from the moment you got round to it, a character who is behind simply has a test already due — so its card appears at once, and you work through the backlog one consent at a time, with the illness’s original rhythm intact.

Onset Check

NameArm Onset
ShortcodeonsetCheck
Iconfa-hourglass (an hourglass)
InvokedHidden — not on the Actions context menu. Posted as a card when the incubation period runs out
APIAfflictionLogic.onsetCheck

What it does

Nothing, by design. The incubation period has run out, so the check posts a card saying so and offering a Set Onset button. Whether the affliction actually becomes symptomatic is Set Onset’s job, and it asks first.

The symptoms are yours

SoHL marks the affliction symptomatic and stops. It does not describe a fever, roll a penalty, or announce anything in chat — an affliction can be almost anything, and what it feels like to have it is played at the table, not modeled.

The one hook for a specific affliction to do something concrete at onset is the Onset Macro: an affliction may name a Macro that runs the moment onset is performed, after the affliction has been marked symptomatic. It can apply whatever that particular disease or curse actually does, and it may schedule further events of its own. The affliction stores only the Macro’s reference, never any code.

Request Treatment

NameRequest Treatment
ShortcoderequestTreatment
Iconfa-hand (an open hand)
InvokedActions context menu
APIAfflictionLogic.requestTreatment

What it does

Posts a card asking someone to treat this affliction, naming it so a physician knows what they are being asked to look at. The card’s button is open to any character with the Physician skill, who makes a Treatment Success Value test; the Value Diamonds they earn come back to you as a proposed Course Bonus, which you accept — or not — through Treat Affliction.

Be clear-eyed about what treatment buys you. Unlike a wound, an affliction is mostly not something a physician can fix: the body either fights it off or it does not. A Course Bonus improves the odds on every later Course Test; it cures nothing by itself.

Treat Affliction

NameTreat Affliction
ShortcodetreatAffliction
Iconfa-staff-snake (the rod of Asclepius)
InvokedActions context menu, or the Accept Treatment button on a treatment result card
APIAfflictionLogic.treatAffliction

What it does

Records that this affliction has been treated. A dialog confirms two things: the treatment date (stamped as now) and a Course Bonus. Reached from a physician’s result card, the bonus arrives pre-filled with the Value Diamonds they earned; run by hand, it starts at zero and is yours to set.

A Course Bonus above zero is written as an Active Effect on the affliction rather than folded away as a one-off adjustment — so it is visible on the sheet, can be edited or removed later, and applies to every subsequent Course Test for as long as it stands.

Set Onset

NameSet Onset
ShortcodesetOnset
Iconfa-hourglass-start (an hourglass beginning to run)
InvokedActions context menu, or the Set Onset button on an Onset Check card
APIAfflictionLogic.setOnset

What it does

Asks whether to mark the affliction symptomatic as of now, and on Yes stamps the Onset date. The affliction’s interval formulas are rolled at the same time, so the sheet’s projected resolution and next-check dates read correctly, and any authored onset Macro runs once the onset is recorded.

It then offers the two events that carry the affliction from here — the recurring Course Check and the one-shot Resolution Check — as two separate offer-schedule dialogs with the rolled cadences already filled in. Each is answered on its own, and Not Now on either arms nothing.

They are offered, not armed. Pressing Set Onset says the affliction is now symptomatic; it does not say SoHL should start keeping its calendar. Declining is always safe — the affliction is still running, you are simply tracking it by hand.

Set Resolution

NameSet Resolution
ShortcodesetResolution
Iconfa-skull (a skull)
InvokedActions context menu, or the Set Resolution button on a Resolution Check card
APIAfflictionLogic.setResolution

What it does

Asks which outcome the affliction settles on — the authored one is pre-selected, and you can override it — then records that outcome with the Resolution date stamped as now. Resolution is terminal, so the affliction’s remaining checks are cleared.

The chosen outcome is then applied: Death sets the character’s shock state to Dead, Cured takes the Healing Rate to 6. Any authored Outcome Trauma is contracted alongside it.

An affliction that has already been defeated (Healing Rate 6 or better) beat its course on its own. Its resolution is still recorded, but no outcome is inflicted — the character won.

Course Check

NameArm Course Check
ShortcodecourseCheck
Iconginf-heart-beats (a beating heart)
InvokedHidden — not on the Actions context menu. Posted as a card when the course interval comes due
APIAfflictionLogic.courseCheck

What it does

Nothing, by design — and that is the point. A Course Check posts a card offering a Course Test and stops there. No roll is made, no Healing Rate moves, and nothing is written to the character. Because it imposes nothing on anyone, anyone can post one.

Course Test

NameCourse Test
ShortcodecourseTest
Iconginf-heart-beats (a beating heart)
InvokedActions context menu, or the button on a Course Check card
APIAfflictionLogic.courseTest

What it does

This is the body fighting the affliction — the roll that actually advances an illness, made once per invocation.

Each Course Test is a d100 rolled against the affliction’s Course target — Healing Base × the affliction’s current Healing Rate, plus anything that has modified it. A physician’s Course Bonus from Treat Affliction is exactly such a modifier, and so is any Active Effect an author has written against the course. The result moves the Healing Rate:

RollChange to Healing Rate
Critical success+2
Marginal success+1
Marginal failure−1
Critical failure−2

The standard test dialog opens first, so the roll is yours to see and modify, and a result card reports what happened afterwards.

Between the two, SoHL asks once more before touching the character: a confirmation dialog offers the reaction below, and declining leaves the sheet alone. The result card says which way you answered, so the table can see whether a result was applied or set aside.

The reaction

After each Course Test, the character reacts to wherever the Healing Rate now sits:

Healing RateWhat happens to the character
6 or moreThe affliction is defeated. The course stops
55 Fatigue Levels of weakness
410 Fatigue Levels of weakness
3Stunned
2Incapacitated
1Unconscious
Below 1Dead

The fatigue is recorded as its own Fatigue Trauma — the affliction is the agent, the exhaustion it causes is a Trauma the character carries.

The shock states only ever worsen the character’s condition. A character already unconscious from something else is not woken up by an affliction that merely stuns.

What stops it

Two things, and only two:

  • Reaching Healing Rate 6. The affliction is beaten, the recurrence ends, and no further reminders come.
  • Declining the offer, which stops SoHL keeping time — the affliction is still there and the table can resolve it by hand.

Otherwise, each check re-rolls the interval from the Heal-Check Interval Formula and offers the next one. The cadence can differ from period to period, which is intended: a fever does not run to a metronome.

When no test is worth rolling

The Course Test needs two things, and without either the check still comes due and still offers the next one — but the Healing Rate has nowhere to go:

  • A Healing Rate. An affliction whose rate is blank does not heal naturally, by design. It has no fight to make; it just runs its clock to the outcome.
  • A usable Endurance attribute. Endurance drives the recovery roll. A character without one — or whose Endurance is disabled — cannot make it.

This is worth knowing before you conclude a check is broken: a poison written to be lethal is supposed to sit at its rate and run out the clock.

Healing Check

NameArm Healing Check
ShortcodehealingCheck
Iconfa-bed-pulse (a bed with a pulse line)
InvokedHidden — not on the Actions context menu. Posted as a card when the healing interval comes due
APIAfflictionLogic.healingCheck

What it does

Nothing, by design. Like the Course Check, it posts a card offering a Healing Test and stops there. Anyone can post one.

Healing Test

NameHealing Test
ShortcodehealingTest
Iconfa-heart-pulse (a heart with a pulse line)
InvokedActions context menu, or the button on a Healing Check card
APIAfflictionLogic.healingTest

What it does

This is the body throwing the affliction off, and it works exactly as a wound’s Healing Test does. One d100 against the affliction’s Healing target — Healing Base × Healing Rate, plus anything that has modified it — and the result reduces the affliction’s Level:

  • Critical success — Level drops by 2
  • Marginal success — Level drops by 1
  • Either failure — no progress this period

An affliction reduced to Level 0 is finished with, and its recurrence ends there. Otherwise the next test is offered.

Where the Course Test asks whether the affliction is winning, this asks whether the body is shaking it off. They are separate tests against separate targets, and an affliction can be losing one while winning the other.

Resolution Check

NameArm Resolution
ShortcoderesolutionCheck
Iconfa-skull (a skull)
InvokedHidden — not on the Actions context menu. Posted as a card when the Symptomatic Period runs out
APIAfflictionLogic.resolutionCheck

What it does

Nothing, by design. The Symptomatic Period has run out, so the check posts a card saying so and offering a Set Resolution button. Settling the affliction — choosing the outcome, stamping the date, applying the consequences — is Set Resolution’s job, and it asks first.

The Outcome

Every affliction declares what it does to a character it beats:

OutcomeWhat it does
DeathThe character’s state becomes dead
CuredThe affliction is beaten — its Healing Rate is set to 6

Cured is the default, and it is the benign one: an affliction nobody authored an ending for lets its victim go.

Alongside it, an affliction may name an Outcome Trauma — a Safe Expression giving the shortcode, or a list of shortcodes, of Traumas the character contracts at resolution. Each is looked for among the world’s items first, then in the compendiums, and the first match found is added to the character’s sheet. A shortcode that matches nothing is skipped with a warning rather than inventing something.

The two combine, which is where the interesting endings live: an affliction with Cured and an outcome trauma leaves its victim free of the disease but permanently marked by it — the fever breaks and the blindness stays.

Set Resolution pre-selects the authored outcome but lets you override it, so the table always has the last word on how an affliction ends. What you see afterwards is the affliction stamped with its Resolution Date, its Healing Rate settled, and any Trauma it left behind now sitting on the Health tab.

See also

  • Trauma — what a character carries: wounds, fatigue, fear, and the Traumas an affliction inflicts along the way.
  • Afflictions and Injuries — the overview of how harm works on a character.
  • BeingContagion Check and Contagion Test, the exposure roll that starts most afflictions, and the character’s shock state.
  • Base Item — the standard item properties and the offer-schedule dialog these three checks use.
  • Actions — how the Actions context menu and chat-card buttons work.
  • Afflictions and Healing Test (rules) — the mechanics behind the Course Test, the reaction table, and the outcomes.
  • Items — every item type at a glance.
  • User Guide — back to the index.