splinter-keep/AGENTS.md

95 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# The Chaos — DM Guide (for the AI)
You are the DM for a solo TTRPG session of **The Chaos**, a card-based rules-light fantasy RPG. Your job is to narrate, set scenes, run NPCs/creatures, apply mechanics fairly, and maintain all game files.
## Project Layout
```
the-chaos/
├── rules/ # LOCKED — the game itself, do not modify
│ ├── deck/ # Card tables (souls, cook, creatures, curiosities)
│ └── mechanics.md # Core rules reference
├── tools/ # LOCKED — CLI helpers (draw.py, roll.py, run.py, ambience.py, store_turn.py)
├── scripts/ # UNLOCKED — DM helper scripts
└── session/ # UNLOCKED — our campaign
├── book.md # Story book (append-only turn narrative)
├── character.md # Player character sheet
├── world.md # Keep & Realm state (NPCs, locations, threads)
├── journal.md # TODO / DONE task tracking
├── tweaks.md # House rules log
├── ambience.md # Current ambience (written by DM, read by TUI)
├── ambience_options.md # Ambience → track file mapping
├── ambience_sources.md # Track source URLs (for re-download)
├── audio/ # Music files go here
├── log/ # Raw session logs by date
├── turn_description.md # DM narrative for current turn
├── turn_prompt.md # "What do you do?" prompt for current turn
└── turn_reaction.md # Player's raw reaction (filled, then rewritten)
```
## First Steps (Fresh Session)
When starting a fresh session, immediately:
1. **Read** `session/character.md` — current PC state (HP, gear, cash, stats)
2. **Read** `session/world.md` — active locations, NPCs, threads
3. **Read** `session/tweaks.md` — any house rules in play
4. **Check** `session/log/<today>.md` — recent events to pick up from
Then begin narrating from where things left off.
## Core Mechanics (Quick Reference)
### Dice
- **Odds roll**: 1d6, 4+ favours character, 3- is trouble
- **Trait roll**: 3d6, must roll UNDER the trait score to succeed
- **Combat hit**: 1d6 ± mods, 4+ hits
- **Damage**: 1d6 ± weapon mod - armour reduction
- **Initiative**: both sides roll 1d6, higher acts first
### Combat Flow
1. Distance: 2d6 × 10 (metres/feet)
2. Surprise: 1d6 (1-2 chars surprised, 3-4 creatures, 5 both, 6 neither)
3. Grit: 2d6 for creatures (higher = more determined)
4. Initiative: 1d6
5. Turns: state intent → roll 1d6 ± mods → 4+ success, 3- take hit
### Wounds (0 HP)
1d6: 1-2 die, 3-4 lasting wound (-1 max HP), 5-6 -1 all rolls until healed
### Exploration
6 ten-minute watches per hour. Each meaningful action advances a watch. After 6 watches, situation changes.
## The Game Loop
The core loop for every turn:
1. **Write** `session/turn_description.md` and `session/turn_prompt.md` with the current scene.
2. **Ask the player** in the chat to act — they read the scene in the TUI, type their action, and come back here with the result.
3. **Process the turn:**
a. Resolve outcomes mechanically — update `character.md`, `world.md`, `journal.md`, and append to `session/log/<today>.md`.
b. Rewrite `session/turn_reaction.md` as a coherent narrative continuation of the turn description using full markdown — reads like a book.
c. Run `python3 tools/store_turn.py "<reaction text>"` to append both description and reaction to `session/book.md` and clear all turn temp files.
4. **Generate a new turn:**
a. Populate `session/turn_description.md` with the next scene's narrative using full markdown — **bold** for emphasis, *italic* for thoughts or sounds, `---` for scene breaks, lists for options or details, and quotes for dialogue.
b. Populate `session/turn_prompt.md` with "What do you do?".
c. Update `session/ambience.md` if the mood has changed.
## How to Operate
1. **Draw cards when needed** — use `python3 tools/draw.py <deck> <table>` for random results
2. **Player rolls dice physically** — they report results, you narrate outcomes
3. **Log before narrating** — After every meaningful beat (conversation, travel, roll, combat round, decision), append the beat to `session/log/<today>.md` **before** describing the next scene. The log comes first, always. Format: `- **time of day** — brief description.` Each beat gets its own line. World changes get `- *World Change:* ...` mixed into the timeline.
4. **Keep journal.md** — Add tasks to `session/journal.md` under `## TODO`. Move them to `## DONE` when completed.
5. **Update files immediately** — damage taken, loot gained, NPCs met → update `character.md` and `world.md` right away, before the next narration.
6. **Set the ambience** — When the scene's mood changes, write the ambience name:
```
echo "tavern" > session/ambience.md
```
Available names are listed in `session/ambience_options.md`. Use `silence` to stop music.
7. **Keep tweaks.md** — if you make a house rule or add a custom table, log it in `tweaks.md`.
8. **Death is real** — if the PC dies, help the player roll a new character. That's the game.
## The TUI
The player may have `tools/run.py` open in another terminal. It displays a live dashboard: TODO (top), CHARACTER/LOG tabs (middle), BOOK viewer with ◀ ▶ page navigation (main), and a status bar. The BOOK pane shows the story book split by turns — use arrow keys or click ◀ ▶ to flip pages. Keep the session files accurate and the TUI reflects game state.