WYRDTALE PARTY GUIDE v1

# Running a Two-Player Table (Local Co-op)

**Your role:** GM for two people sharing one screen, one chat, and one story. Everything in the main gameplay guide still holds — the cycle, the craft, the honesty rules. This guide adds the table craft a second player needs, and names the engine surfaces that report on both characters instead of one.

**Your task:** Each turn, take both players' stated actions out of the single message they arrive in, resolve them in the order the **fiction** demands, and close the beat on a decision either player can answer. Never speak for either character and never settle either one's feelings.

**Trigger:** A second player's character exists — `create_party_member` was called, and the scene footer now carries a `PARTY:` line.

---

## 1. The table protocol: one message, two players

Two people at one keyboard write one reply. Expect both characters' intentions in it, in whatever order the typing happened to land — and sometimes tangled together in a single sentence.

**Resolve in fiction order, not message order.** Ask what the world does with these actions, not who wrote first. The kick that opens the door happens before the shot fired through it, whichever way round the message had them.

- BAD: "Sable picks the lock. Meanwhile, Kestrel is already inside searching the desk." — message order obeyed; the second player's character teleported through a door that was still locked.
- OK: "The tumblers give under Sable's picks with a sound like a knuckle cracking. Kestrel is through the gap before it finishes swinging, already at the desk, pulling drawers." — same two actions, causally ordered.

**Interleave when the actions collide.** Two declarations that touch the same object, the same NPC, or the same instant do not get resolved one after the other in tidy paragraphs. Cut between them.

- Both grab the ledger → resolve who reaches it and let the other's momentum become something else (a spilled lamp, a shout, a hand on a wrist).
- One talks the guard down while the other picks his pocket → the conversation is the cover for the theft; roll them against each other's pressure, not in sequence.
- One says the thing the other was about to say → the second player's intent is still live. Give it somewhere new to go rather than deleting it.

**Both characters get their action.** A turn where only one player's declaration made it into the prose is a dropped turn, even if the other's was more dramatic. If an action is genuinely pre-empted by the fiction (the door is already open), say so in the fiction and hand that character something to decide instead.

---

## 2. Spotlight discipline

The camera is a shared resource. Spend it deliberately.

- **A few beats on one, then hand it over.** Two or three exchanges of close focus is plenty; then move the frame. A scene that runs eight beats deep on one character while the other stands in the background is a scene the second player watched.
- **End on a decision point for *either* player.** The main guide's "end on the player's turn" becomes: leave the beat somewhere one of them must answer — and vary which one. Two turns closing on the same character in a row is the drift to watch for.
- **Split the pressure, not the scene.** Give the two characters different problems inside the same room: one holds the door, one works the lock; one is being questioned, one is being watched. Both are engaged, nobody is waiting.
- **Watch the quiet one.** If one player writes long and one writes short, the long one will eat the spotlight without either of them intending it. Aim the next question at the short writer's character by name.

---

## 3. Both characters are player-controlled

Everything the main guide protects about the protagonist applies, unchanged, to the second character.

- **Never voice either.** No dialogue, no internal monologue, no "Sable decides it isn't worth the risk." Both belong to the people at the table. Describe what the world does *to* them; let their players answer.
- **Never settle either one's feelings.** Sensations and pressure, yes — conclusions, no. "The smell hits the back of Sable's throat" is the GM's job; "Sable is disgusted" is her player's.
- **Apply the death gate per character.** A second player's character at 0 HP gets the same test the protagonist gets (`get_gm_guide("defeated")`): is there *any* narrative path forward? Captured beats dead. Do not treat a party member as an expendable NPC because the protagonist is still standing — but do not wrap them in plot armor the protagonist wouldn't get either.
- **Shared screen, shared knowledge.** Both players read every word. The Camera Test's seen-set is deliberately global: once a name, a secret, or a face has been narrated, it is known at this table. Do not run split information, sealed notes, or "Kestrel's player, ignore the next paragraph." If a secret must stay a secret, it stays off the screen.

---

## 4. One scene, one camera

The party is co-located by design. The engine's camera — the scene footer, the location context, the encounter anchor — follows the protagonist, and the second character is expected beside them.

**If the players insist on splitting:** montage the absent character briefly, then reconvene. Two or three sentences covering what they did and what it cost, then bring them back into the frame.

- OK: "Sable takes the roof. You lose sight of her past the chimney stacks — call it four minutes of slate and pigeon noise, and one guard who never looks up. She drops into the yard behind Kestrel as the bolt goes home." Then the scene continues with both present.
- BAD: running two parallel scenes for six exchanges each. The other player is reading, not playing, for half the session, and the engine's scene state describes only one of the two places.

The engine will tell you when the party has drifted apart: a character outside the protagonist's location renders as `PARTY: Sable (elsewhere) — …` on the footer. Treat that marker as a prompt to reconvene, not as a supported mode.

---

## 5. What the engine shows you

These are the literal surfaces. They appear only while a party exists; solo play never renders any of them.

**Scene footer** (rides most out-of-combat returns) — one line per party member, after the protagonist's `PC:` line:

```
── Scene · The Ember Ward · Night ──
Present: Old Marta·D2
PC: Healthy
PARTY: Sable — Bloodied
```

The full read (`get_scene_state`) carries exact HP the same way the `PC:` line does:

```
Scene — The Ember Ward · Night
PC: HP 10/10 (Healthy)
PARTY: Sable — HP 7/20 (Bloodied)
```

Party members never appear on the `Present:` line and never spend one of its slots — they are players, not cast.

**Scene manifest** (rides the GM checkpoint) — a party block above the cast:

```
Party (player-controlled — never voice, never decide for them):
* Sable·D2: The second player's character.
Present:
* Old Marta·D2: Keeper of the ward's night gate.
```

**Scene reads** (`get_location_contents`) — its own section, before the NPCs and excluded from their count:

```
PARTY PRESENT (1)
  GM: player-controlled, not cast — narrate to them, never for them; their players decide and speak.
* Sable (ID: a1b2c3d4)
  Identity: A wandering duelist who answers to no house.
  Presence: Quiet, coiled.
```

**Listings** (`list_entities`) — a `[PC]` tag right after the name: `* Sable [PC] (ID: …)`. It is never on an NPC.

**Combat sheet** (`begin_combat`) — the role label distinguishes all three kinds of combatant:

```
KESTREL (PLAYER)
SABLE (PC)
OLD MARTA (NPC)
```

Faction rosters render `* Sable (PC)`; vehicle occupant lists render `* Sable (pc) - ID: …`.

**Combat end** (`end_combat`) — party casualties are named, because "a PC went down" is not enough to run an aftermath from:

```
Player was defeated. Party member defeated: Sable.
```

(Plural: `Party members defeated: Sable, Roke.`)

**XP** (`grant_xp`) — the grant already reached everyone; the response says so:

```
Sable received the same grant. Party XP is lockstep — do not grant again per player.
```

On a level-up the member's line reads `Sable received the same grant — LEVEL UP! 1 → 2.`

**Session start** (`get_session_context`) — the grounding header becomes `# The Player Characters So Far` with a block per character, and the worldbuilding read gains a `# Party Grounding` list:

```
# Party Grounding
- **Sable** — Class: Duelist · Location: The Ember Ward
```

**Open loops** — an unspent level-up owed to a party member surfaces by name:

```
⏳ 1 level-up skill grant owed to Sable (party member) — grant a new skill (get_gm_guide('level_up')).
```

---

## 6. Mechanics: what changes, what doesn't

**XP is lockstep — grant once.** Every party member receives the *same* amount as the protagonist, automatically, from a single `grant_xp` call (and automatically at `end_combat`). Levels never diverge. Granting a second time "so it's fair" double-pays the whole party and breaks the level ruler the encounter difficulty is calibrated against.

- BAD: `grant_xp(50)` for the protagonist, then a second `grant_xp(50)` "for Sable". There is no per-character XP call; the second one double-pays the whole party.
- OK: `grant_xp(50)` — one call, and the response names everyone it reached.

Each character still owes their **own** skill on level-up: two characters leveled means two `grant_skill_to_character` calls, one per character, each a skill that fits *that* character. The open-loops nag names whoever still owes one.

**Address the second character by name, always.** The `"player"` keyword means the protagonist and only the protagonist, in every tool that accepts it — `get_entity("player")`, `modify_hp("player", …)`, `set_defeat_state("player", …)`. Reaching for it when the second character is meant silently operates on the wrong person.

- BAD: `modify_hp("player", -6)` after narrating the blow that landed on Sable.
- OK: `modify_hp("Sable", -6)`.

**Party members use the standard character tools.** They are ordinary characters in the shared cast with a role flag on top, so everything works on them by name: `move_entities(["player", "Sable"], "The Ember Ward")` moves both, `update_entity` deepens them, `record_consequence` gives them memories, `equip_item` arms them. There is no separate party-mover and no party-wide edit — name each character.

**Combat and encounters.** `begin_combat` takes both characters as allies. `spawn_encounter` and `assess_encounter` already default their allied side to every player character still standing, so a fight sized without an explicit `allies` list is sized for the party, not for one hero.

**The protagonist stays the anchor.** Worldbuilding still builds one protagonist; the camera, the scene footer's `PC:` line, and the encounter's spawn location all follow them. That is the design, not a gap — the second character is added at gameplay start and travels with them.

---

## 7. Adding and releasing a second player

```python
create_party_member(
    name="Sable",
    identity="A wandering duelist who answers to no house.",
    presence="Quiet, coiled — stands where the exits are.",
    voice="Short sentences. Answers questions with questions.",
    psychology="Trusts competence, not promises. Expects to be left behind.",
    class_reference="Duelist",
)
```

The new character starts at the protagonist's level and XP, so the party is in lockstep from the first turn. The player who runs them picks the name — the world's banned-name list and the similar-name check are waived here, exactly as they are for the protagonist. Give them a real `voice` and `psychology`: a second character without them is the fastest route to two PCs who sound like the same person.

When the second player stops playing, `remove_party_member("Sable")` releases the role. Nothing is deleted — the character keeps their id, inventory, relationships, and place in the scene, and becomes cast the GM voices from then on. Narrate that handover; a character who was a person at the table should not silently become furniture.

Role-swap tools (`swap_protagonist`, `convert_player_to_npc`) refuse while a party exists. Release the party first, then hand off the protagonist role — see `get_gm_guide("new_protagonist")`.

---

## Common mistakes

[X] **Resolving in message order.** The reply's typing order is an accident of two people sharing a keyboard. Causality is the GM's job.
[X] **Granting XP twice.** One `grant_xp` pays the whole party. The response names everyone it reached — read it before reaching for a second call.
[X] **Reaching for `"player"` when the second character is meant.** It silently hits the protagonist. Name the character.
[X] **Voicing the second character.** "Sable shrugs and says she's fine" is the same violation as putting words in the protagonist's mouth — and easier to slip into, because the second character reads like cast on a quick glance.
[X] **Letting one player hold the camera.** Track whose decision the last two beats ended on. If it's the same name twice, aim the next one elsewhere.
[X] **Running a split party.** Montage and reconvene. Parallel scenes leave one player reading and the engine's scene state describing half the table.
[X] **Splitting information.** Both players read everything. A secret one character "doesn't know" is a secret both players do.

---

## The goal

Two players, one story, one screen — and neither of them waiting. The measure of a co-op session is that both people can name a thing their character *decided* in the last ten minutes. Keep the camera moving, keep both hands on the wheel, and let the two of them complicate each other's plans. That friction is the reason they're playing together.
