Skip to main content

manabrew_engine/ability/effects/
choose_player_effect.rs

1use super::{resolve_defined_players, EffectContext};
2
3/// `SP$ ChoosePlayer` — the activating player chooses a player.
4/// Stores the result in `source.chosen_player` for subsequent effects.
5///
6/// Mirrors Java's `ChoosePlayerEffect.java`.
7///
8/// # Card script examples
9/// ```text
10/// A:SP$ ChoosePlayer | Defined$ You
11/// ```
12/// Struct form of this effect so it can participate in the
13/// `SpellAbilityEffect` trait hierarchy — mirrors Java's
14/// `ChoosePlayerEffect` class extending `SpellAbilityEffect`.
15#[manabrew_engine_macros::spell_effect(ChoosePlayerEffect)]
16fn resolve(ctx: &mut EffectContext, sa: &crate::spellability::SpellAbility) {
17    let controller = sa.activating_player;
18    let defined = sa.defined().unwrap_or("You");
19    let choosers = resolve_defined_players(defined, controller, ctx.game);
20
21    let valid_players: Vec<_> = if let Some(choices) = sa.ir.choices.as_deref() {
22        resolve_defined_players(choices, controller, ctx.game)
23            .into_iter()
24            .filter(|&pid| ctx.game.player(pid).is_alive())
25            .collect()
26    } else {
27        // Match Java getPlayersInTurnOrder() ordering while excluding players
28        // no longer in game.
29        ctx.game
30            .player_order
31            .iter()
32            .copied()
33            .filter(|&pid| ctx.game.player(pid).is_alive())
34            .collect()
35    };
36
37    for chooser in choosers {
38        if !ctx.game.player(chooser).is_alive() {
39            continue;
40        }
41        let chosen =
42            ctx.agents[chooser.index()].choose_target_player(chooser, &valid_players, None);
43
44        if let Some(chosen_pid) = chosen {
45            if let Some(source_id) = sa.source {
46                ctx.game.card_mut(source_id).set_chosen_player(
47                    Some(chosen_pid),
48                    Some(chooser),
49                    !sa.ir.secretly,
50                );
51            }
52        }
53    }
54}