feat: log tree from Module 2 (logTree / log_tree); SpellGrid CLIs print Log:

Engine events carry the nesting depth they were recorded at; the harness
prints the log as an indented tree. New tests test_02_log_tree_shows_nesting
and test_03_log_tree_death_phase; both SpellGrid CLIs print the tree of the
last command's Sequences under a Log: line.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Lucas WintherandClaude Opus 5.5 committed 2026-11-11 10:23:59 +01:00
1 parent 06a1b34c5d
commit 97c64ebee8
86 files changed
+1375 -55

No files matched your search

@@ -84,6 +84,10 @@ pub struct World {
sides: [Side; 2],
next_order_of_play: u32,
log: Vec<Event>,
/// The nesting depth at which each event in `log` was recorded, index for index.
depths: Vec<u32>,
/// How many triggers are resolving right now, one inside another.
depth: u32,
/// The auras in force as of the last Aura Update. Changes only there (see `aura.rs`).
auras: Vec<ActiveAura>,
}
@@ -99,6 +103,8 @@ impl World {
sides: Default::default(),
next_order_of_play: 0,
log: Vec::new(),
depths: Vec::new(),
depth: 0,
auras: Vec::new(),
};
for owner in 0..2 {
@@ -287,10 +293,27 @@ impl World {
&self.log
}
/// The nesting depth of each event in `log()`, index for index: 0 for the outermost
/// action's own events.
pub fn log_depths(&self) -> &[u32] {
&self.depths
}
// ---- Changes: each one records its event ----------------------------
pub fn record(&mut self, event: Event) {
self.log.push(event);
self.depths.push(self.depth);
}
/// A trigger starts resolving: the events it causes are recorded one level deeper.
pub fn open_block(&mut self) {
self.depth += 1;
}
/// The trigger that last opened a block has finished resolving.
pub fn close_block(&mut self) {
self.depth -= 1;
}
/// Add a card to the library, or replace the card with the same name.
@@ -325,6 +348,7 @@ impl World {
pub fn clear_log(&mut self) {
self.log.clear();
self.depths.clear();
}
pub fn damage(&mut self, target: EntityId, amount: i32) {