From 26fd5a0fa2f6230a7eb8d494faf94abcf8f2c2dd Mon Sep 17 00:00:00 2001 From: Ryan Bigg Date: Sun, 20 Oct 2024 13:34:45 +1100 Subject: [PATCH] Add Shalai's Acolyte --- lib/magic/cards/ajanis_pridemate.rb | 2 +- lib/magic/cards/shalais_acolyte.rb | 30 +++++++++++++++++++++ lib/magic/cards/verduran_enchantress.rb | 27 +++++++------------ lib/magic/events/spell_cast.rb | 4 +++ lib/magic/triggered_ability.rb | 4 +++ spec/cards/shalais_acolyte_spec.rb | 35 +++++++++++++++++++++++++ 6 files changed, 84 insertions(+), 18 deletions(-) create mode 100644 lib/magic/cards/shalais_acolyte.rb create mode 100644 spec/cards/shalais_acolyte_spec.rb diff --git a/lib/magic/cards/ajanis_pridemate.rb b/lib/magic/cards/ajanis_pridemate.rb index 0902bc56..c2ea0e61 100644 --- a/lib/magic/cards/ajanis_pridemate.rb +++ b/lib/magic/cards/ajanis_pridemate.rb @@ -9,7 +9,7 @@ class AjanisPridemate < Creature class LifeGain < TriggeredAbility def should_perform? - event.player == controller + you? end def call diff --git a/lib/magic/cards/shalais_acolyte.rb b/lib/magic/cards/shalais_acolyte.rb new file mode 100644 index 00000000..f390d7f4 --- /dev/null +++ b/lib/magic/cards/shalais_acolyte.rb @@ -0,0 +1,30 @@ +module Magic + module Cards + ShalaisAcolyte = Creature("Shalai's Acolyte") do + cost generic: 4, white: 1 + creature_type "Angel" + + power 3 + toughness 4 + + kicker_cost generic: 1, green: 1 + end + + class ShalaisAcolyte < Creature + class ETB < TriggeredAbility::EnterTheBattlefield + def perform + if actor.kicked? + actor.trigger_effect( + :add_counter, + target: actor, + counter_type: Counters::Plus1Plus1, + amount: 2 + ) + end + end + end + + def etb_triggers = [ETB] + end + end +end diff --git a/lib/magic/cards/verduran_enchantress.rb b/lib/magic/cards/verduran_enchantress.rb index 04b93648..c4315816 100644 --- a/lib/magic/cards/verduran_enchantress.rb +++ b/lib/magic/cards/verduran_enchantress.rb @@ -9,33 +9,26 @@ module Cards class VerduranEnchantress < Creature class Choice < Magic::Choice::May - attr_reader :owner + def resolve! + owner.draw! + end + end - def initialize(owner:) - @owner = owner + class SpellCastTrigger < TriggeredAbility + def should_perform? + you? && event.type?("Enchantment") end - def resolve! - owner.draw! + def call + game.add_choice(VerduranEnchantress::Choice.new(actor: actor)) end end def event_handlers { - Events::SpellCast => ->(receiver, event) do - return if event.player != receiver.controller - return unless event.spell.type?("Enchantment") - - game - .choices - .add( - self.class::Choice.new(owner: receiver.controller) - ) - end + Events::SpellCast => SpellCastTrigger } end - - end end end diff --git a/lib/magic/events/spell_cast.rb b/lib/magic/events/spell_cast.rb index e97c8318..68e39622 100644 --- a/lib/magic/events/spell_cast.rb +++ b/lib/magic/events/spell_cast.rb @@ -7,6 +7,10 @@ def initialize(spell:, player:) @spell = spell @player = player end + + def type?(type) + spell.types.include?(type) + end end end end diff --git a/lib/magic/triggered_ability.rb b/lib/magic/triggered_ability.rb index fdca5e7e..d800505f 100644 --- a/lib/magic/triggered_ability.rb +++ b/lib/magic/triggered_ability.rb @@ -8,6 +8,10 @@ def initialize(event:, actor:) @actor = actor end + def you? + controller == event.player + end + def perform! return unless should_perform? call diff --git a/spec/cards/shalais_acolyte_spec.rb b/spec/cards/shalais_acolyte_spec.rb new file mode 100644 index 00000000..d0240c85 --- /dev/null +++ b/spec/cards/shalais_acolyte_spec.rb @@ -0,0 +1,35 @@ +require 'spec_helper' + +RSpec.describe Magic::Cards::ShalaisAcolyte do + include_context "two player game" + + subject { Card("Shalai's Acolyte") } + + context "resolution" do + it "kicker cost paid" do + p1.add_mana(white: 6, green: 1) + action = cast_action(card: subject, player: p1) + action.pay_mana(white: 1, generic: { white: 4 }) + action.pay_kicker(generic: { white: 1 }, green: 1) + game.take_action(action) + game.tick! + + permanent = p1.creatures.by_name("Shalai's Acolyte").first + expect(permanent.power).to eq(5) + expect(permanent.toughness).to eq(6) + expect(permanent.counters.of_type(Magic::Counters::Plus1Plus1).count).to eq(2) + end + + it "kicker cost not paid" do + p1.add_mana(white: 5) + action = cast_action(card: subject, player: p1) + action.pay_mana(white: 1, generic: { white: 4 }) + game.take_action(action) + game.tick! + + permanent = p1.creatures.by_name("Shalai's Acolyte").first + expect(permanent.power).to eq(3) + expect(permanent.toughness).to eq(4) + end + end +end