Rationale
A family of effects that should iterate over EACH opponent only resolve against the first. Shared root: the ResolvedAbility player_scope driver / per-opponent iteration loses subsequent opponents in 3+ player games. Herald of Hadar is code-confirmed (game/effects/roll_die.rs ~L92-100 drops player_scope when building the branch ResolvedAbility). Cluster end: per-opponent iteration is centralized and all members iterate all opponents.
Likely seam: crates/engine/src/game/effects/roll_die.rs (confirmed) + the ResolvedAbility player_scope driver in game/ (PlayerFilter::Opponent iteration)
Ordering
Start with the code-confirmed member (#1972) to localize the shared seam, then fan the fix across the remaining children.
Children
(attached as sub-issues)
Rationale
A family of effects that should iterate over EACH opponent only resolve against the first. Shared root: the ResolvedAbility
player_scopedriver / per-opponent iteration loses subsequent opponents in 3+ player games. Herald of Hadar is code-confirmed (game/effects/roll_die.rs ~L92-100 drops player_scope when building the branch ResolvedAbility). Cluster end: per-opponent iteration is centralized and all members iterate all opponents.Likely seam:
crates/engine/src/game/effects/roll_die.rs (confirmed) + the ResolvedAbility player_scope driver in game/ (PlayerFilter::Opponent iteration)Ordering
Start with the code-confirmed member (#1972) to localize the shared seam, then fan the fix across the remaining children.
Children
(attached as sub-issues)