Skip to content

Commit

Permalink
Add Flensermite
Browse files Browse the repository at this point in the history
  • Loading branch information
radar committed Mar 5, 2024
1 parent 6d2a5ff commit e21afae
Show file tree
Hide file tree
Showing 9 changed files with 90 additions and 9 deletions.
12 changes: 12 additions & 0 deletions lib/magic/cards/flensermite.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
module Magic
module Cards
class Flensermite < Creature
card_name "Flensermite"
cost "{1}{B}"
creature_type "Gremlin"
power 1
toughness 1
keywords :infect
end
end
end
5 changes: 5 additions & 0 deletions lib/magic/cards/keywords.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ class Keyword
HASTE = Class.new(Keyword)
HEXPROOF = Class.new(Keyword)
INDESTRUCTIBLE = Class.new(Keyword)
INFECT = Class.new(Keyword)
LIFELINK = Class.new(Keyword)
MENACE = Class.new(Keyword)
PROWESS = Class.new(Keyword)
Expand Down Expand Up @@ -66,6 +67,10 @@ def has_keyword?(keyword)
(is_a?(Magic::Permanent) && attachments.flat_map(&:keyword_grants).include?(keyword))
end

def infect?
has_keyword?(Keywords::INFECT)
end

def hexproof?
has_keyword?(Keywords::HEXPROOF)
end
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module Magic
module Counters
class Toxic
class Poison
end
end
end
4 changes: 2 additions & 2 deletions lib/magic/effects/deal_combat_damage.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ def initialize(damage:, **args)

def resolve!
game.notify!(
Events::CombatDamageDealt.new(source: self, target: target, damage: damage)
Events::CombatDamageDealt.new(source: self, target: target, damage: damage, infect: source.infect?)
)
if target.player? && source.has_keyword?(Magic::Keywords::Toxic)
source.trigger_effect(
:add_counter,
counter_type: Counters::Toxic,
counter_type: Counters::Poison,
target: target,
)
end
Expand Down
11 changes: 8 additions & 3 deletions lib/magic/events/combat_damage_dealt.rb
Original file line number Diff line number Diff line change
@@ -1,16 +1,21 @@
module Magic
module Events
class CombatDamageDealt
attr_reader :source, :target, :damage
attr_reader :source, :target, :damage, :infect

def initialize(source:, target:, damage:)
def initialize(source:, target:, damage:, infect: false)
@source = source
@target = target
@damage = damage
@infect = infect
end

def infect?
@infect
end

def inspect
"#<Events::CombatDamageDealt source: #{source}, target: #{target}, damage: #{damage}>"
"#<Events::CombatDamageDealt source: #{source}, target: #{target}, damage: #{damage}, infect:#{infect?}>"
end
end
end
Expand Down
16 changes: 15 additions & 1 deletion lib/magic/player.rb
Original file line number Diff line number Diff line change
Expand Up @@ -256,13 +256,27 @@ def receive_event(event)
@life += event.life
when Events::PlayerLoses
lose!
when Events::DamageDealt, Events::CombatDamageDealt
when Events::DamageDealt
trigger_effect(:lose_life, life: event.damage, source: event.source)
when Events::CombatDamageDealt
if event.infect?
trigger_effect(
:add_counter,
counter_type: Counters::Poison,
target: self,
source: event.source,
amount: event.damage
)
else
trigger_effect(:lose_life, life: event.damage, source: event.source)
end
end
end

def trigger_effect(effect_name, **args)
case effect_name
when :add_counter
game.add_effect(Effects::AddCounterToPlayer.new(source: args[:source], player: args[:target], **args))
when :lose_life
game.add_effect(Effects::LoseLife.new(target: self, **args))
end
Expand Down
11 changes: 11 additions & 0 deletions spec/cards/flensermite_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
require "spec_helper"

RSpec.describe Magic::Cards::Flensermite do
include_context "two player game"

subject { ResolvePermanent("Flensermite") }

it "has infect" do
expect(subject.infect?).to eq(true)
end
end
34 changes: 34 additions & 0 deletions spec/game/integration/combat/infect_no_blockers_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
require 'spec_helper'

RSpec.describe Magic::Game, "combat -- infect no blockers" do
include_context "two player game"

let!(:flensermite) { ResolvePermanent("Flensermite", owner: p1) }

before do
game.battlefield.add(flensermite)
end

context "when in combat" do
before do
skip_to_combat!
end

it "p1 attacks with Flensermite" do
p1_starting_life = p1.life
p2_starting_life = p2.life

current_turn.declare_attackers!

current_turn.declare_attacker(
flensermite,
target: p2,
)

go_to_combat_damage!

expect(p2.life).to eq(p2_starting_life)
expect(p2.counters.of_type(Magic::Counters::Poison).count).to eq(1)
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
skip_to_combat!
end

it "p1 deals damage to p2, adding a toxic counter" do
it "p1 deals damage to p2, adding a poison counter" do
p2_starting_life = p2.life

current_turn.declare_attackers!
Expand All @@ -26,7 +26,7 @@

aggregate_failures do
expect(p2.life).to eq(p2_starting_life - 1)
expect(p2.counters.of_type(Magic::Counters::Toxic).count).to eq(1)
expect(p2.counters.of_type(Magic::Counters::Poison).count).to eq(1)
end
end
end
Expand Down

0 comments on commit e21afae

Please sign in to comment.