Skip to main content

manabrew_engine/replacement/
replace_proliferate.rs

1//! Replacement logic for `Event$ Proliferate`.
2//!
3//! Mirrors Java `ReplaceProliferate.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 `ReplaceProliferate.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::Proliferate {
23        return false;
24    }
25    let (player, count) = match event {
26        ReplacementEvent::Proliferate { player, count } => (*player, *count),
27        _ => return false,
28    };
29    if count <= 0 {
30        return false;
31    }
32    if let Some(valid) = effect.ir.valid_player_selector.as_ref() {
33        if !effect.matches_compiled_valid_player(valid, player, source_card) {
34            return false;
35        }
36    }
37    true
38}
39
40/// Mirrors Java `ReplacementHandler.executeReplacement()` for Proliferate.
41pub fn execute(
42    effect: &ReplacementEffect,
43    event: &mut ReplacementEvent,
44    _game: &GameState,
45    _source_card_id: CardId,
46) -> ReplacementResult {
47    let count = match event {
48        ReplacementEvent::Proliferate { count, .. } => count,
49        _ => return ReplacementResult::NotReplaced,
50    };
51    if effect.prevents() {
52        *count = 0;
53        return ReplacementResult::Prevented;
54    }
55    ReplacementResult::Replaced
56}