Skip to main content

manabrew_engine/replacement/
replace_untap.rs

1//! Replacement logic for `Event$ Untap`.
2//!
3//! Mirrors Java `ReplaceUntap.java` in `forge/game/replacement/`.
4
5use crate::card::{valid_filter, Card};
6use crate::game::GameState;
7use crate::ids::CardId;
8
9use super::replacement_effect::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 `ReplaceUntap.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::Untap {
23        return false;
24    }
25    let (card, player) = match event {
26        ReplacementEvent::Untap { card, player } => (*card, *player),
27        _ => return false,
28    };
29    let target_card = &game.cards[card.index()];
30    if let Some(valid) = effect.ir.valid_card_selector.as_ref() {
31        if !effect.matches_compiled_valid_card(valid, target_card, source_card) {
32            return false;
33        }
34    }
35    if let Some(valid) = effect.ir.valid_step_turn_to_controller_text.as_deref() {
36        let Some(player) = player else {
37            return false;
38        };
39        if !valid_filter::matches_valid_player(valid, player, target_card.controller) {
40            return false;
41        }
42    }
43    true
44}
45
46/// Mirrors Java `ReplacementHandler.executeReplacement()` for Untap.
47pub fn execute(
48    effect: &ReplacementEffect,
49    _event: &mut ReplacementEvent,
50    _game: &GameState,
51    _source_card_id: CardId,
52) -> ReplacementResult {
53    if effect.prevents() || effect.has_skip() {
54        return ReplacementResult::Skipped;
55    }
56    ReplacementResult::Replaced
57}