Skip to main content

manabrew_engine/ability/effects/
choose_even_odd_effect.rs

1use super::{resolve_defined_players, EffectContext};
2use crate::agent::BinaryChoiceKind;
3use crate::ids::PlayerId;
4
5/// `SP$ ChooseEvenOdd` — chosen player picks odd or even.
6///
7/// Mirrors Java `ChooseEvenOddEffect.java`.
8/// Struct form of this effect so it can participate in the
9/// `SpellAbilityEffect` trait hierarchy — mirrors Java's
10/// `ChooseEvenOddEffect` class extending `SpellAbilityEffect`.
11#[manabrew_engine_macros::spell_effect(ChooseEvenOddEffect)]
12fn resolve(ctx: &mut EffectContext, sa: &crate::spellability::SpellAbility) {
13    let Some(source_id) = sa.source else { return };
14    let source_name = ctx.game.card(source_id).card_name.clone();
15
16    let players: Vec<PlayerId> = if let Some(pid) = sa.target_chosen.target_player {
17        vec![pid]
18    } else if let Some(defined) = sa.defined() {
19        resolve_defined_players(defined, sa.activating_player, ctx.game)
20    } else {
21        vec![sa.activating_player]
22    };
23
24    for pid in players {
25        if !ctx.game.player(pid).is_alive() {
26            continue;
27        }
28        let odd = ctx.agents[pid.index()].choose_binary(
29            pid,
30            "Odd or even?",
31            BinaryChoiceKind::OddsOrEvens,
32            None,
33            Some(source_id),
34            sa.api,
35        );
36        ctx.game
37            .card_mut(source_id)
38            .set_s_var("ChosenEvenOdd", if odd { "Odd" } else { "Even" });
39    }
40}