Skip to main content

manabrew_engine/replacement/
replace_game_loss.rs

1//! Replacement logic for `Event$ GameLoss`.
2//!
3//! Mirrors Java `ReplaceGameLoss.java` in `forge/game/replacement/`.
4
5use crate::card::Card;
6use crate::game::GameState;
7use crate::ids::CardId;
8
9use super::replacement_effect::{GameLossReason, ReplacementEffect};
10use super::replacement_handler::ReplacementEvent;
11use super::replacement_result::ReplacementResult;
12use super::replacement_type::ReplacementType;
13use crate::card_trait_base::CardTrait;
14
15/// Mirrors Java `ReplaceGameLoss.canReplace()`.
16pub fn can_replace(
17    effect: &ReplacementEffect,
18    event: &ReplacementEvent,
19    _game: &GameState,
20    source_card: &Card,
21) -> bool {
22    if effect.event != ReplacementType::GameLoss {
23        return false;
24    }
25    let (player, reason) = match event {
26        ReplacementEvent::GameLoss { player, reason } => (*player, *reason),
27        _ => return false,
28    };
29    if let Some(valid) = effect.ir.valid_player_selector.as_ref() {
30        if !effect.matches_compiled_valid_player(valid, player, source_card) {
31            return false;
32        }
33    }
34    if let Some(valid_reason) = effect.ir.valid_lose_reason_text.as_deref() {
35        let matches_reason = valid_reason.split(',').map(str::trim).any(|r| {
36            r.eq_ignore_ascii_case(match reason {
37                GameLossReason::LifeReachedZero => "LifeReachedZero",
38                GameLossReason::Poisoned => "Poisoned",
39                GameLossReason::CommanderDamage => "CommanderDamage",
40                GameLossReason::Milled => "Milled",
41                GameLossReason::OpponentWon => "OpponentWon",
42                GameLossReason::SpellEffect => "SpellEffect",
43                GameLossReason::IntentionalDraw => "IntentionalDraw",
44            })
45        });
46        if !matches_reason {
47            return false;
48        }
49    }
50    true
51}
52
53/// CantHappen layer prevents the game loss (e.g. Platinum Angel).
54pub fn execute(
55    _effect: &ReplacementEffect,
56    _event: &mut ReplacementEvent,
57    _game: &GameState,
58    _source_card_id: CardId,
59) -> ReplacementResult {
60    ReplacementResult::Replaced
61}