T08 iter 5: the DARVO sequence machine

Resolution step 3 (GR-R06), the last unimplemented step:

- GR-D02 binding: one stage per consecutive round, DENY then ATTACK
  then REVERSE, regardless of the player's later Stress.
- GR-D03 DENY: turn one face-up, unsolved, unprotected Problem face
  down and Deny it. Under the U3 default no legal target is a no-op and
  the sequence still advances.
- GR-D04 ATTACK: one extra Attack under the normal relation rules, then
  place the Focus token beside the target even if it was cancelled.
- GR-D05 REVERSE: flip Focus to Blame, +1 Stress to the holder, one
  Protection to the owner, unless the holder's GROUND-ND rejects it.
  Under the U5 default the owner takes -2 either way and the sequence
  ends.
- GR-D06 early end: a Support through a Bond that predates this round's
  Support step cancels the stage and ends the sequence, and the placed
  Focus token is removed. GROUND-GR ends it after the stage resolves.
- GR-D07: the marker returns to OFF, so a later End can re-trigger.

The Attack rules are now one routine shared by the chosen ATTACK Action
and the DARVO extra Attack, so GR-A06..A09 cannot drift between them.

Stage targets are named by their own command during Reveal, validated
against what the stage admits: DENY needs an eligible Problem, ATTACK
another player, and only a player with a live sequence may choose.

18 scenarios pass; AM-1 coverage 47/58 (81%), up from 41/58.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
tegwick 2026-07-31 02:30:58 +02:00
parent 290ad06c31
commit 0e92535f11
5 changed files with 513 additions and 61 deletions

View file

@ -0,0 +1,48 @@
scenario: ground/gr-d03-darvo-deny
description: >
The DENY stage turns one face-up, unsolved, unprotected Problem face
down and Denies it (GR-D03), then the sequence advances to ATTACK
(GR-D02). A protected Problem is not a legal DENY target (GR-A11).
covers: [GR-D02, GR-D03, GR-P01]
provisional: false
seed: 42
setup:
players: 3
preset: standard-3p
patch:
"lead": 0
"players.0.darvo": Deny
"problems.2.face_up": true
commands:
- actor: P1
cmd: select_action
args: { action: INVESTIGATE, problem: 3 }
- actor: P2
cmd: select_action
args: { action: INVESTIGATE, problem: 3 }
- actor: P3
cmd: select_action
args: { action: INVESTIGATE, problem: 3 }
- actor: SYSTEM
cmd: reveal
# GR-D02: only a player with a live sequence names a stage target.
- actor: P2
cmd: choose_darvo_target
args: { problem: 1 }
- actor: P1
cmd: choose_darvo_target
args: { problem: 1 }
- actor: SYSTEM
cmd: resolve
expect:
events:
- kind: ProblemDenied
problem: 1
- kind: DarvoAdvanced
player: 0
stage: Attack
state:
"problems.1.denied": true
"problems.1.face_up": false
"players.0.darvo": Attack
rejects: [4]

View file

@ -0,0 +1,53 @@
scenario: ground/gr-d04-darvo-attack
description: >
The ATTACK stage makes one extra Attack under the normal relation
rules and places the Focus token beside the target (GR-D04), then
advances to REVERSE.
covers: [GR-D04, GR-T03]
provisional: false
seed: 42
setup:
players: 3
preset: standard-3p
patch:
"lead": 0
"players.0.darvo": Attack
commands:
- actor: P1
cmd: select_action
args: { action: INVESTIGATE, problem: 3 }
- actor: P2
cmd: select_action
args: { action: INVESTIGATE, problem: 3 }
- actor: P3
cmd: select_action
args: { action: INVESTIGATE, problem: 3 }
- actor: SYSTEM
cmd: reveal
# GR-D04: the extra Attack targets another player.
- actor: P1
cmd: choose_darvo_target
args: { target: P1 }
- actor: P1
cmd: choose_darvo_target
args: { target: P2 }
- actor: SYSTEM
cmd: resolve
expect:
events:
- kind: StressSet
player: 1
stress: 3
- kind: FocusPlaced
owner: 0
target: 1
- kind: DarvoAdvanced
player: 0
stage: Reverse
state:
"players.1.stress": 3
"focus.0": 1
"players.0.darvo": Reverse
# GR-L03: the extra Attack forms a Rivalry like any other.
"relations.0-1": Rivalry
rejects: [4]

View file

@ -0,0 +1,54 @@
scenario: ground/gr-d05-darvo-reverse
description: >
The REVERSE stage flips Focus to Blame in front of the Focus holder,
gives them +1 Stress and the owner one Protection token, then the
owner takes 2 Stress and the sequence ends (GR-D05, GR-D07).
covers: [GR-D05, GR-D07, GR-T01]
provisional: true
seed: 42
setup:
players: 3
preset: standard-3p
patch:
"lead": 0
"players.0.darvo": Reverse
"players.0.stress": 3
"focus.0": 1
commands:
- actor: P1
cmd: select_action
args: { action: INVESTIGATE, problem: 3 }
- actor: P2
cmd: select_action
args: { action: INVESTIGATE, problem: 3 }
- actor: P3
cmd: select_action
args: { action: INVESTIGATE, problem: 3 }
- actor: SYSTEM
cmd: reveal
- actor: SYSTEM
cmd: resolve
expect:
events:
- kind: FocusFlippedToBlame
owner: 0
target: 1
- kind: StressSet
player: 1
stress: 3
- kind: ProtectionGained
player: 0
- kind: StressSet
player: 0
stress: 1
- kind: DarvoEnded
player: 0
state:
"players.1.blame_from": [0]
"players.1.stress": 3
"players.0.protection": 1
"players.0.stress": 1
# GR-D07: the marker is OFF, so a new sequence can trigger later.
"players.0.darvo": Off
"focus": {}
rejects: []

View file

@ -0,0 +1,43 @@
scenario: ground/gr-d06-darvo-early-end
description: >
A Support through a Bond that existed before this round cancels the
current stage and ends the sequence; the placed Focus token is removed
(GR-D06, GR-A04, GR-L05).
covers: [GR-D06, GR-L05]
provisional: false
seed: 42
setup:
players: 3
preset: standard-3p
patch:
"lead": 0
"players.0.darvo": Attack
"focus.0": 2
"relations.0-1": Bond
commands:
- actor: P2
cmd: select_action
args: { action: SUPPORT, target: P1 }
- actor: P1
cmd: select_action
args: { action: INVESTIGATE, problem: 3 }
- actor: P3
cmd: select_action
args: { action: INVESTIGATE, problem: 3 }
- actor: SYSTEM
cmd: reveal
- actor: P1
cmd: choose_darvo_target
args: { target: P3 }
- actor: SYSTEM
cmd: resolve
expect:
events:
- kind: DarvoEnded
player: 0
state:
"players.0.darvo": Off
# GR-D06: the stage never fired, so P3 took no extra Attack.
"players.2.stress": 2
"focus": {}
rejects: []