Skip to main content

manabrew_engine/replacement/
replace_explore.rs

1//! Replacement logic for `Event$ Explore`.
2//!
3//! Mirrors Java `ReplaceExplore.java` in `forge/game/replacement/`.
4
5use crate::card::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 `ReplaceExplore.canReplace()`.
16/// Java checks `ValidExplorer` using the same pattern as `ValidCard`.
17pub fn can_replace(
18    effect: &ReplacementEffect,
19    event: &ReplacementEvent,
20    game: &GameState,
21    source_card: &Card,
22) -> bool {
23    if effect.event != ReplacementType::Explore {
24        return false;
25    }
26    let card = match event {
27        ReplacementEvent::Explore { card } => *card,
28        _ => return false,
29    };
30    let target_card = &game.cards[card.index()];
31    // Java uses ValidExplorer with the same semantics as ValidCard.
32    if let Some(valid) = effect.ir.valid_explorer_text.as_deref() {
33        if !effect.matches_valid_card(valid, target_card, source_card) {
34            return false;
35        }
36    } else if let Some(valid) = effect.ir.valid_card_selector.as_ref() {
37        if !effect.matches_compiled_valid_card(valid, target_card, source_card) {
38            return false;
39        }
40    }
41    true
42}
43
44/// Mirrors Java `ReplacementHandler.executeReplacement()` for Explore.
45pub fn execute(
46    effect: &ReplacementEffect,
47    _event: &mut ReplacementEvent,
48    _game: &GameState,
49    _source_card_id: CardId,
50) -> ReplacementResult {
51    if effect.prevents() || effect.has_skip() {
52        return ReplacementResult::Skipped;
53    }
54    ReplacementResult::Replaced
55}