From 6927b1aa82f7c71c04482fce45818e5da1399762 Mon Sep 17 00:00:00 2001 From: glorysr1209-png Date: Mon, 15 Jun 2026 11:40:46 -0400 Subject: [PATCH] feat(parser): parse scry-to-draw replacement --- .../engine/src/parser/oracle_replacement.rs | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/crates/engine/src/parser/oracle_replacement.rs b/crates/engine/src/parser/oracle_replacement.rs index 3a79ad8d27..f5b68716d1 100644 --- a/crates/engine/src/parser/oracle_replacement.rs +++ b/crates/engine/src/parser/oracle_replacement.rs @@ -275,6 +275,14 @@ fn parse_replacement_line_inner(text: &str, card_name: &str) -> Option nom::IResult<&str, QuantityExpr, .parse(input) } +/// CR 614.1a: "If you would scry N, draw that many cards instead" (Sphinx-class). +fn parse_scry_that_many_draw_replacement( + lower: &str, + original_text: &str, +) -> Option { + let (rest, _) = tag::<_, _, OracleError<'_>>("if you would scry ").parse(lower).ok()?; + let (rest, _) = + take_until::<_, _, OracleError<'_>>(", draw that many cards instead").parse(rest).ok()?; + let (_, _) = tag::<_, _, OracleError<'_>>(", draw that many cards instead") + .parse(rest) + .ok()?; + Some( + ReplacementDefinition::new(ReplacementEvent::Scry) + .execute(AbilityDefinition::new( + AbilityKind::Spell, + Effect::Draw { + count: QuantityExpr::Ref { + qty: QuantityRef::EventContextAmount, + }, + target: TargetFilter::Controller, + }, + )) + .description(original_text.to_string()), + ) +} + fn parse_scry_count_replacement(lower: &str, original_text: &str) -> Option { let ((effect_kind, count), rest) = nom_on_lower(lower, lower, |input| { let (input, _) = tag("if you would scry ").parse(input)?; @@ -11818,6 +11852,16 @@ mod tests { Some(DamageModification::Minus { value: 1 }) ); } + + #[test] + fn parses_scry_that_many_draw_instead_replacement() { + let def = parse_replacement_line( + "If you would scry 2, draw that many cards instead.", + "Test Scry Draw", + ) + .expect("scry to draw replacement"); + assert_eq!(def.event, ReplacementEvent::Scry); + } } /// Snapshot tests locking current replacement parser output before/after the IR split.