Skip to main content

manabrew_engine/replacement/
replacement_layer.rs

1//! Replacement effect layer ordering.
2//!
3//! Mirrors Java `ReplacementLayer.java` in `forge/game/replacement/`.
4
5use serde::{Deserialize, Serialize};
6
7/// CR 614 / CR 616 layer ordering for replacement effects.
8///
9/// Multiple replacement effects that apply to the same event are applied in
10/// the order below. Within the same layer the affected player chooses the order.
11///
12/// Reference: CR 616.1, Java `ReplacementLayer.java`.
13#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
14pub enum ReplacementLayer {
15    /// CR 614.17 — effects that say an event "can't happen" (highest priority).
16    CantHappen = 0,
17    /// CR 616.1b — control-changing replacement effects.
18    Control = 1,
19    /// CR 616.1c — copy replacement effects.
20    Copy = 2,
21    /// CR 616.1d — transform replacement effects.
22    Transform = 3,
23    /// All other replacement effects (damage prevention, zone rerouting, etc.).
24    Other = 4,
25}
26
27impl ReplacementLayer {
28    /// Case-insensitive `Layer$` value parser. Mirrors Java
29    /// `ReplacementLayer.smartValueOf()`. Returns `None` if unrecognised.
30    pub fn smart_value_of(value: &str) -> Option<Self> {
31        match value.trim().to_ascii_lowercase().as_str() {
32            "canthappen" => Some(Self::CantHappen),
33            "control" => Some(Self::Control),
34            "copy" => Some(Self::Copy),
35            "transform" => Some(Self::Transform),
36            "other" => Some(Self::Other),
37            _ => None,
38        }
39    }
40}