diff --git a/Mage.Sets/src/mage/sets/betrayersofkamigawa/UmezawasJitte.java b/Mage.Sets/src/mage/sets/betrayersofkamigawa/UmezawasJitte.java index 8304afd2a36..2e1e5db0184 100644 --- a/Mage.Sets/src/mage/sets/betrayersofkamigawa/UmezawasJitte.java +++ b/Mage.Sets/src/mage/sets/betrayersofkamigawa/UmezawasJitte.java @@ -110,9 +110,9 @@ class UmezawasJitteAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - if (event instanceof DamagedEvent) { - Permanent p = game.getPermanent(event.getSourceId()); - if (!usedInPhase && ((DamagedEvent) event).isCombatDamage() && p != null && p.getAttachments().contains(this.getSourceId())) { + if (event instanceof DamagedEvent && !usedInPhase && ((DamagedEvent) event).isCombatDamage()) { + Permanent permanent = game.getPermanent(event.getSourceId()); + if (permanent != null && permanent.getAttachments().contains(this.getSourceId())) { usedInPhase = true; return true; } diff --git a/Mage.Sets/src/mage/sets/gatecrash/FiveAlarmFire.java b/Mage.Sets/src/mage/sets/gatecrash/FiveAlarmFire.java index fb6a35d0812..897ced3401f 100644 --- a/Mage.Sets/src/mage/sets/gatecrash/FiveAlarmFire.java +++ b/Mage.Sets/src/mage/sets/gatecrash/FiveAlarmFire.java @@ -27,10 +27,8 @@ */ package mage.sets.gatecrash; +import java.util.HashSet; import java.util.UUID; -import mage.constants.CardType; -import mage.constants.Rarity; -import mage.constants.Zone; import mage.abilities.Ability; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.SimpleActivatedAbility; @@ -38,11 +36,15 @@ import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; import mage.counters.CounterType; import mage.filter.common.FilterControlledCreaturePermanent; import mage.game.Game; import mage.game.events.DamagedEvent; import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; import mage.game.permanent.Permanent; import mage.target.common.TargetCreatureOrPlayer; @@ -79,6 +81,10 @@ public class FiveAlarmFire extends CardImpl { class FiveAlarmFireTriggeredAbility extends TriggeredAbilityImpl { + // Because a creature that is blocked by multiple creatures it deals damage to, only causes to add one counter to , + // it's neccessary to remember which creature already triggered + HashSet triggeringCreatures = new HashSet<>(); + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent(); public FiveAlarmFireTriggeredAbility() { @@ -87,6 +93,7 @@ class FiveAlarmFireTriggeredAbility extends TriggeredAbilityImpl { public FiveAlarmFireTriggeredAbility(final FiveAlarmFireTriggeredAbility ability) { super(ability); + triggeringCreatures.addAll(ability.triggeringCreatures); } @Override @@ -96,13 +103,24 @@ class FiveAlarmFireTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.DAMAGED_CREATURE || event.getType() == GameEvent.EventType.DAMAGED_PLANESWALKER || event.getType() == GameEvent.EventType.DAMAGED_PLAYER) { + if (event.getType() == GameEvent.EventType.DAMAGED_CREATURE + || event.getType() == GameEvent.EventType.DAMAGED_PLANESWALKER + || event.getType() == GameEvent.EventType.DAMAGED_PLAYER) { + if (((DamagedEvent) event).isCombatDamage() && triggeringCreatures.contains(event.getSourceId())) { Permanent permanent = game.getPermanent(event.getSourceId()); - if(permanent != null && filter.match(permanent, sourceId, controllerId, game) && ((DamagedEvent) event).isCombatDamage()){ + if (permanent != null && filter.match(permanent, sourceId, controllerId, game)) { + triggeringCreatures.add(event.getSourceId()); return true; } + } - return false; + + } + // reset the remembered creatures for every combat damage step + if (event.getType().equals(EventType.COMBAT_DAMAGE_STEP_PRE)) { + triggeringCreatures.clear(); + } + return false; } @Override diff --git a/Mage.Sets/src/mage/sets/mirrodin/BansheesBlade.java b/Mage.Sets/src/mage/sets/mirrodin/BansheesBlade.java index 4285711fd29..f9481cc9f73 100644 --- a/Mage.Sets/src/mage/sets/mirrodin/BansheesBlade.java +++ b/Mage.Sets/src/mage/sets/mirrodin/BansheesBlade.java @@ -78,12 +78,16 @@ public class BansheesBlade extends CardImpl { class BansheesBladeAbility extends TriggeredAbilityImpl { + private boolean usedInPhase; + public BansheesBladeAbility() { super(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.CHARGE.createInstance(1))); + this.usedInPhase = false; } public BansheesBladeAbility(final BansheesBladeAbility ability) { super(ability); + this.usedInPhase = ability.usedInPhase; } @Override @@ -93,12 +97,16 @@ class BansheesBladeAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - if (event instanceof DamagedEvent) { - Permanent p = game.getPermanent(event.getSourceId()); - if (((DamagedEvent) event).isCombatDamage() && p != null && p.getAttachments().contains(this.getSourceId())) { + if (event instanceof DamagedEvent && ((DamagedEvent) event).isCombatDamage() && !usedInPhase) { + Permanent permanent = game.getPermanent(event.getSourceId()); + if (permanent != null && permanent.getAttachments().contains(this.getSourceId())) { + usedInPhase = true; return true; } } + if (event.getType().equals(GameEvent.EventType.COMBAT_DAMAGE_STEP_PRE)) { + usedInPhase = false; + } return false; } diff --git a/Mage.Sets/src/mage/sets/saviorsofkamigawa/DescendantOfKiyomaro.java b/Mage.Sets/src/mage/sets/saviorsofkamigawa/DescendantOfKiyomaro.java index bc0dd4e1e66..ee84ea767f5 100644 --- a/Mage.Sets/src/mage/sets/saviorsofkamigawa/DescendantOfKiyomaro.java +++ b/Mage.Sets/src/mage/sets/saviorsofkamigawa/DescendantOfKiyomaro.java @@ -62,7 +62,7 @@ public class DescendantOfKiyomaro extends CardImpl { Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new ConditionalContinousEffect( new BoostSourceEffect(1,2, Duration.WhileOnBattlefield), new MoreCardsInHandThanOpponentsCondition(), - "As long as you have more cards in hand than each opponent, Descendant of Kiyomaro gets +1/+2")); + "As long as you have more cards in hand than each opponent, {this} gets +1/+2")); ability.addEffect(new ConditionalContinousEffect( new GainAbilitySourceEffect(new DealsCombatDamageTriggeredAbility(new GainLifeEffect(3), false)), new MoreCardsInHandThanOpponentsCondition(), diff --git a/Mage/src/mage/abilities/common/DealsCombatDamageTriggeredAbility.java b/Mage/src/mage/abilities/common/DealsCombatDamageTriggeredAbility.java index 88ebfeedf40..95e3b34985c 100644 --- a/Mage/src/mage/abilities/common/DealsCombatDamageTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/DealsCombatDamageTriggeredAbility.java @@ -34,28 +34,26 @@ import mage.constants.Zone; import mage.game.Game; import mage.game.events.DamagedEvent; import mage.game.events.GameEvent; -import mage.target.targetpointer.FixedTarget; /** + * This triggers only once for each phase the source creature deals damage. + * So a creature blocked by two creatures and dealing damage to both blockers in the same + * combat damage step triggers only once. * * @author LevelX */ public class DealsCombatDamageTriggeredAbility extends TriggeredAbilityImpl { - private boolean setTargetPointer; + private boolean usedInPhase; public DealsCombatDamageTriggeredAbility(Effect effect, boolean optional) { - this(effect, optional, false); - } - - public DealsCombatDamageTriggeredAbility(Effect effect, boolean optional, boolean setTargetPointer) { super(Zone.BATTLEFIELD, effect, optional); - this.setTargetPointer = setTargetPointer; + this.usedInPhase = false; } public DealsCombatDamageTriggeredAbility(final DealsCombatDamageTriggeredAbility ability) { super(ability); - this.setTargetPointer = ability.setTargetPointer; + this.usedInPhase = ability.usedInPhase; } @Override @@ -65,20 +63,18 @@ public class DealsCombatDamageTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.DAMAGED_CREATURE || event.getType() == GameEvent.EventType.DAMAGED_PLANESWALKER || event.getType() == GameEvent.EventType.DAMAGED_PLAYER) { - if (event.getSourceId().equals(this.sourceId) - && ((DamagedEvent) event).isCombatDamage()) { - if (setTargetPointer) { - for (Effect effect : this.getEffects()) { - effect.setTargetPointer(new FixedTarget(event.getTargetId())); - effect.setValue("damage", event.getAmount()); - } - } - return true; - } + if (event instanceof DamagedEvent + && !usedInPhase + && event.getSourceId().equals(this.sourceId) + && ((DamagedEvent) event).isCombatDamage()) { + usedInPhase = true; + return true; - } - return false; + } + if (event.getType().equals(GameEvent.EventType.COMBAT_DAMAGE_STEP_PRE)) { + usedInPhase = false; + } + return false; } @Override