Skip to main content

manabrew_engine/ability/effects/
abandon_effect.rs

1//! Abandon — leave a game in a multiplayer match.
2//! Ported from Java's AbandonEffect: sets player as lost.
3
4use super::EffectContext;
5use crate::event::RunParams;
6use crate::parsing::keys;
7use crate::trigger::TriggerType;
8use forge_foundation::ZoneType;
9
10/// Struct form of this effect so it can participate in the
11/// `SpellAbilityEffect` trait hierarchy — mirrors Java's
12/// `AbandonEffect` class extending `SpellAbilityEffect`.
13#[manabrew_engine_macros::spell_effect(AbandonEffect)]
14fn resolve(ctx: &mut EffectContext, sa: &crate::spellability::SpellAbility) {
15    let Some(source_id) = sa.source else {
16        return;
17    };
18    let controller = ctx.game.card(source_id).controller;
19
20    if sa.param_is_true(keys::OPTIONAL) {
21        let source_name = ctx.game.card(source_id).card_name.clone();
22        let confirmed = ctx.agents[controller.index()].confirm_action(
23            controller,
24            None,
25            &format!("Would you like to abandon {source_name}?"),
26            &[],
27            Some(source_id),
28            None,
29        );
30        if !confirmed {
31            return;
32        }
33    }
34
35    if sa.ir.remember_abandoned {
36        ctx.game.card_mut(source_id).add_remembered(source_id);
37    }
38
39    if ctx.game.card(source_id).zone == ZoneType::Command {
40        ctx.game
41            .move_card(source_id, ZoneType::SchemeDeck, controller);
42    }
43
44    ctx.trigger_handler.run_trigger(
45        TriggerType::Abandoned,
46        RunParams {
47            card: Some(source_id),
48            ..Default::default()
49        },
50        false,
51    );
52}