sagaphone/spec/event-system.md
Tim 06df9df339 Initial spec for Sagaphone
Pulled from Notion project docs: overview, architecture, data model,
event system, line logic, and implementation notes for the family-tree
generator + TTS narrator.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-17 22:04:33 +02:00

7.8 KiB

Event System

See Data Model for the Event, EventEntry, Stage types this section builds on.

Death Probability per Stage

Before every event, a roll decides whether the person dies. A minimum number of events per stage must happen before death is even possible. Past that minimum, the probability rises with a magic_factor.

death_probability = death_at_stage[stage]
Generate events until the person dies.
minimum_events = events_per_stage[stage]
if current_event_count > events_per_stage[stage]:
    death_probability += (current_event_count - events_per_stage[stage]) * magic_factor

Starting values (to be tuned via playtesting):

Stage Min. Events Base Death %
Child 2 30%
Teen 3 10%
Young Adult 3 25%
Adult 3 35%
Senior 3 60%

Person 1 (the ancestor / is_ancestor = True) is guaranteed to survive every stage — no early death for them.

Event Categories

  1. Death — events leading to death (only rolled if death was decided).
  2. Partnership — love, marriage, engagement, political engagement, childhood promise.
  3. Offspring — birth, complications (mother dies giving birth), twins/triplets.
  4. Daily Life — daily routine, family interactions, temporary characters.
  5. Travel — the person travels, experiences things, temp characters possible.
  6. Learning — formative learning, training, profession.
  7. Conflict/Fight — not fatal for the active person.
  8. Discovery — object, spell, natural wonder etc. (boosted probability after travel).
  9. Local Conflict — rebellion, crisis, natural disaster, and how the person handles it.
  10. Intrigue — political intrigue, social conflict.
  11. Illness/Injury — not fatal, but formative.

Event Tables

Concrete fantasy events per category, used during simulation (Phase 1). Each entry represents a possible result/context payload for a given Event type. The LLM receives these as narrative input during Phase 2.

Category 1 — Death

Event Type Description Notes
DEATH_ILLNESS Succumbs to a long illness Can follow ILLNESS_CHRONIC
DEATH_ACCIDENT Fatal accident (e.g. fall, fire, drowning) Higher chance in CHILD stage
DEATH_COMBAT Killed in a fight or battle Can follow CONFLICT_FIGHT or LOCAL_REBELLION
DEATH_OLD_AGE Dies peacefully of old age Senior stage only
DEATH_CHILDBIRTH Mother dies giving birth Triggers active node switch to newborn if mother was the active node

Category 2 — Partnership

Event Type Description Notes
PARTNER_MARRIAGE Formal marriage ceremony From TEEN stage onwards
PARTNER_AFFAIR Secret or open love affair May produce illegitimate children
PARTNER_ENGAGEMENT Formal betrothal, not yet married Can be broken off by later event
PARTNER_POLITICAL Arranged marriage for political gain Often initiated by parent
PARTNER_CHILDHOOD_PROMISE Two children swear to marry one day Can be fulfilled or broken later

Category 3 — Offspring

Event Type Description Notes
CHILD_BORN A healthy child is born Sets child's birth_year
CHILD_TWINS Twin birth Two new Person objects created
CHILD_TRIPLETS Triplet birth Three new Person objects created
CHILD_STILLBORN Child is born dead No new Person object; affects parents narratively
CHILD_ADOPT Person adopts a child Only path to offspring for NONBINARY; possible for all genders at reduced weight. From YOUNG_ADULT onwards.

Category 4 — Daily Life

Event Type Description Notes
DAILY_FRIENDSHIP Forms a meaningful friendship New person added to acquaintances
DAILY_FAMILY Notable interaction with a family member Uses existing person from tree
DAILY_TEMP_CHAR Encounter with a temporary character New person added to person_pool

Category 5 — Travel

Event Type Description Notes
TRAVEL_NEAR Journey to a nearby village or town location_is_temp = True
TRAVEL_FAR Long journey to a distant land Increases follow_bonus for DISCOVER_*
TRAVEL_PILGRIMAGE Religious or spiritual journey May trigger LEARN_SELF or DISCOVER_WONDER

Category 6 — Learning

Event Type Description Notes
LEARN_APPRENTICESHIP Begins formal training under a master Sets profession
LEARN_MENTOR Gains wisdom from an older figure May use existing acquaintance as mentor
LEARN_SELF Self-taught skill or insight Often follows TRAVEL or DISCOVER

Category 7 — Personal Conflict

Event Type Description Notes
CONFLICT_PERSONAL Serious argument or falling out Can involve family or acquaintance
CONFLICT_FIGHT Physical altercation, non-fatal May leave injury (INJURY_COMBAT follow)
CONFLICT_FEUD Long-running grudge with a person or family Can span multiple stages

Category 8 — Discovery

Event Type Description Notes
DISCOVER_OBJECT Finds a curious or valuable object Object stored in result.item
DISCOVER_SPELL Stumbles upon a magical formula or ritual Higher chance if LEARN_SELF preceded
DISCOVER_WONDER Witnesses a natural or supernatural wonder Often follows TRAVEL_FAR
DISCOVER_KNOWLEDGE Uncovers a secret, history, or forbidden lore May trigger INTRIGUE follow events

Category 9 — Local Conflict

Event Type Description Notes
LOCAL_REBELLION A local uprising disrupts daily life Person may flee, fight, or hide
LOCAL_PLAGUE Disease sweeps through the region Increases death probability for all
LOCAL_DISASTER Natural disaster (flood, fire, earthquake) May destroy home or kill acquaintances
LOCAL_CRISIS Economic or political crisis in the region Affects profession and home stability

Category 10 — Intrigue

Event Type Description Notes
INTRIGUE_POLITICAL Person becomes entangled in a power struggle Higher chance for persons with political partners
INTRIGUE_EXILE Person is banished from home or community Changes person.home
INTRIGUE_CONSPIRACY Person is targeted by a secret group May follow DISCOVER_KNOWLEDGE

Category 11 — Illness & Injury

Event Type Description Notes
ILLNESS_WEAK Mild illness, recovers quickly Minimal long-term effect
ILLNESS_SEVERE Serious illness, leaves a mark May set a permanent trait in appearance
ILLNESS_CHRONIC Ongoing condition affecting daily life Stored as permanent result flag
INJURY_ACCIDENT Hurt in an accident Higher chance after TRAVEL or LOCAL_DISASTER
INJURY_COMBAT Wounded in a fight Follows CONFLICT_FIGHT or LOCAL_REBELLION

Follow Bonus Map

Some events make certain follow-up events more likely, stored in EventEntry.follow_bonus.

Trigger Event follow_bonus
TRAVEL_FAR DISCOVER_OBJECT, DISCOVER_WONDER
TRAVEL_PILGRIMAGE DISCOVER_WONDER, LEARN_SELF
CONFLICT_FIGHT INJURY_COMBAT
LOCAL_REBELLION DEATH_COMBAT, INJURY_COMBAT, INTRIGUE_EXILE
LOCAL_PLAGUE DEATH_ILLNESS, ILLNESS_SEVERE
LOCAL_DISASTER INJURY_ACCIDENT, INTRIGUE_EXILE
DISCOVER_KNOWLEDGE INTRIGUE_CONSPIRACY, INTRIGUE_POLITICAL
PARTNER_POLITICAL INTRIGUE_POLITICAL
LEARN_APPRENTICESHIP LEARN_MENTOR
ILLNESS_CHRONIC, ILLNESS_SEVERE DEATH_ILLNESS
INJURY_COMBAT ILLNESS_SEVERE, DEATH_COMBAT

See Implementation Notes for the concrete weight calculation (get_effective_chance) and stage-lock rules that gate which events are even eligible.