From dfa906a8bf2f834b8bdbb6f1a3f445c14060c031 Mon Sep 17 00:00:00 2001 From: Ryan Bigg Date: Fri, 1 May 2026 19:54:27 +1000 Subject: [PATCH] Add Ranger's Guile Closes #209 Co-Authored-By: Claude Opus 4.7 (1M context) --- lib/magic/cards/rangers_guile.rb | 23 +++++++++++++++ spec/cards/rangers_guile_spec.rb | 49 ++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 lib/magic/cards/rangers_guile.rb create mode 100644 spec/cards/rangers_guile_spec.rb diff --git a/lib/magic/cards/rangers_guile.rb b/lib/magic/cards/rangers_guile.rb new file mode 100644 index 0000000..9aab9b6 --- /dev/null +++ b/lib/magic/cards/rangers_guile.rb @@ -0,0 +1,23 @@ +module Magic + module Cards + RangersGuile = Instant("Ranger's Guile") do + cost green: 1 + end + + class RangersGuile < Instant + def single_target? + true + end + + def target_choices + controller.creatures + end + + def resolve!(target:) + target.modify_power(1) + target.modify_toughness(1) + target.grant_hexproof! + end + end + end +end diff --git a/spec/cards/rangers_guile_spec.rb b/spec/cards/rangers_guile_spec.rb new file mode 100644 index 0000000..a405000 --- /dev/null +++ b/spec/cards/rangers_guile_spec.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Magic::Cards::RangersGuile do + include_context "two player game" + + let!(:wood_elves) { ResolvePermanent("Wood Elves", owner: p1) } + + it "gives target creature you control +1/+1 and hexproof until end of turn" do + p1.add_mana(green: 1) + p1.cast(card: Card("Ranger's Guile")) do + _1.auto_pay_mana + _1.targeting(wood_elves) + end + + game.stack.resolve! + game.tick! + + expect(wood_elves.power).to eq(2) + expect(wood_elves.toughness).to eq(2) + expect(wood_elves.hexproof?).to eq(true) + expect(wood_elves.keyword_grant_modifiers.first.until_eot?).to eq(true) + end + + it "the +1/+1 boost and hexproof wear off after end of turn" do + p1.add_mana(green: 1) + p1.cast(card: Card("Ranger's Guile")) do + _1.auto_pay_mana + _1.targeting(wood_elves) + end + + game.stack.resolve! + game.tick! + + expect(wood_elves.power).to eq(2) + expect(wood_elves.toughness).to eq(2) + expect(wood_elves.hexproof?).to eq(true) + + game.current_turn.end! + game.current_turn.cleanup! + game.next_turn + game.tick! + + expect(wood_elves.power).to eq(1) + expect(wood_elves.toughness).to eq(1) + expect(wood_elves.hexproof?).to eq(false) + end +end