fix(reference): Death Events remember a right-hand neighbour, not a board index
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>
This commit is contained in:
1 parent
638549161f
commit
429137a6ef
79 files changed
+808
-236
No files matched your search
@@ -5,7 +5,7 @@
|
||||
// ends. Then this step removes every marked minion at once.
|
||||
|
||||
import type { Event } from "./event";
|
||||
import type { World } from "./world";
|
||||
import type { EntityId, World } from "./world";
|
||||
|
||||
/**
|
||||
* Remove every mortally wounded or pending-destroy minion from play, simultaneously.
|
||||
@@ -13,9 +13,17 @@ import type { World } from "./world";
|
||||
*/
|
||||
export function deathCreationStep(world: World): Event[] {
|
||||
const dying = world.minionsInPlay().filter((id) => world.isDoomed(id));
|
||||
// Every position is read before anything moves: removal is simultaneous, and each
|
||||
// Death Event remembers where its minion stood when the step began.
|
||||
const deaths = dying.map((id) => ({ type: "Destroyed" as const, id, position: world.boardIndex(id)! }));
|
||||
for (const { id, position } of deaths) world.kill(id, position);
|
||||
// Every neighbour is read before anything moves: removal is simultaneous. Each Death
|
||||
// Event remembers where its minion stood as a handle, the minion that stays to its
|
||||
// right, not as a board index: an index goes stale as soon as a minion further left
|
||||
// leaves play in the same step (Module 1: hold handles, not indexes).
|
||||
const deaths = dying.map((id) => ({ type: "Destroyed" as const, id, before: survivorToTheRight(world, id) }));
|
||||
for (const { id, before } of deaths) world.kill(id, before);
|
||||
return deaths;
|
||||
}
|
||||
|
||||
/** The nearest minion to the right of `id` on its board that is not leaving play in this step, if any. */
|
||||
function survivorToTheRight(world: World, id: EntityId): EntityId | undefined {
|
||||
const board = world.zone(world.ownerOf(id), "board");
|
||||
return board.slice(board.indexOf(id) + 1).find((other) => !world.isDoomed(other));
|
||||
}
|
||||
Reference in new issue
Block a user