CB-WP-0018-T02: a game log the player can read
bot::Journal -- a shared list of Applied { actor, command, events } the
driver appends to via play_journaled; play delegates with None so
nothing existing changed. BotGame.events only appears after play
returns, which is no use to a page rendered mid-game.
Phrased with record::to_step, the recorder's vocabulary, so what the
player reads is what the scenario file will say, and all 29 GroundEvent
variants now render in words instead of Debug.
A command that produced no events says 'no effect'; the mutation
dropping that branch goes red. Honest limitation recorded: the reported
SOLVE case is resolved inside the system's resolve command, which does
produce events for other seats, so it shows as a selection with no claim
following rather than an explicit 'no effect'. Making it explicit would
mean the renderer deciding why a rule did nothing -- a second
implementation of the rules, which this task's control forbids.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
57639623da
commit
7a78c58404
6 changed files with 333 additions and 15 deletions
|
|
@ -267,7 +267,13 @@ fn run_game<'a, R: BufRead + 'a, W: Write + 'a>(
|
|||
}
|
||||
}
|
||||
|
||||
let result = games_ground::bot::play(initial, &mut policies);
|
||||
// CB-WP-0018 T02: the browser seat's page renders the journal as it
|
||||
// fills, so a player sees what each command produced -- including the
|
||||
// commands that produced nothing.
|
||||
let result = match &server {
|
||||
Some(srv) => games_ground::bot::play_journaled(initial, &mut policies, Some(srv.journal())),
|
||||
None => games_ground::bot::play(initial, &mut policies),
|
||||
};
|
||||
|
||||
// A human seat that ran out of input reports *that*, not the
|
||||
// out-of-range index it had to return to get here.
|
||||
|
|
@ -318,11 +324,7 @@ fn run_game<'a, R: BufRead + 'a, W: Write + 'a>(
|
|||
// to stdout, and the page's post-`ok` reload got Connection refused.
|
||||
if let Some(srv) = &server {
|
||||
let ended = game.state.project(Viewer::Spectator);
|
||||
let msg = format!(
|
||||
"{} commands, hash {}",
|
||||
game.commands,
|
||||
&end_hash[..12]
|
||||
);
|
||||
let msg = format!("{} commands, hash {}", game.commands, &end_hash[..12]);
|
||||
let _ = srv.serve_end(Some(&ended), &msg, END_LINGER);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue