A Deathrattle summon used the dying minion's board index from before the Death Creation Step removed anything. That index is stale when a minion to its left dies in the same step, so the token landed one place too far right. Each Death Event now records `before`: the nearest minion to the right that is not dying in the same step. The position handed to the effect context is resolved when the trigger resolves: the current index of `before`, or the right end. Applied to the Rust and TS references of Modules 3-10. Module 3 gains two tests, documented in scenarios.md: test_03_summon_position_after_simultaneous_deaths (fails before the fix) and test_03_simultaneous_summons_keep_board_order. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
54 lines
1.3 KiB
Rust
54 lines
1.3 KiB
Rust
//! What happened, in order. The engine records an event each time it changes the game.
|
|
|
|
use super::card::TriggerOn;
|
|
use super::world::{EntityId, PlayerId};
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
pub enum Event {
|
|
Summoned {
|
|
id: EntityId,
|
|
},
|
|
Damaged {
|
|
target: EntityId,
|
|
amount: i32,
|
|
},
|
|
Triggered {
|
|
source: EntityId,
|
|
on: TriggerOn,
|
|
},
|
|
Drew {
|
|
player: PlayerId,
|
|
id: EntityId,
|
|
},
|
|
Fatigue {
|
|
player: PlayerId,
|
|
},
|
|
ArmorGained {
|
|
player: PlayerId,
|
|
amount: i32,
|
|
},
|
|
StatsChanged {
|
|
id: EntityId,
|
|
attack: i32,
|
|
health: i32,
|
|
},
|
|
SpellCast {
|
|
card: String,
|
|
},
|
|
/// A Death Event: the Death Creation Step moved `id` from play to the graveyard.
|
|
/// `before` is the nearest minion to its right that did not die in the same step, if any:
|
|
/// its Deathrattle summons immediately left of that minion, or at the right end. It is a
|
|
/// handle because a board index goes stale when a minion further left dies in the same step.
|
|
Destroyed {
|
|
id: EntityId,
|
|
before: Option<EntityId>,
|
|
},
|
|
DeathPhase {
|
|
round: u32,
|
|
},
|
|
/// A minion was played from hand (it has just entered the board). Its Battlecry answers this.
|
|
Played {
|
|
id: EntityId,
|
|
},
|
|
}
|