* Banshee's Balde, Five-Alarm Fire, Descendant of Kiyomaro - Fixed that the combat damage triggered ability triggered multiple times if damage was dealt to multiple creatures instead of correctly only once per dealing creature and combat damage step.

This commit is contained in:
LevelX2 2014-06-23 09:37:22 +02:00
parent 8388225f90
commit db68d881da
5 changed files with 56 additions and 34 deletions

View file

@ -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;
}

View file

@ -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<UUID> 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

View file

@ -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;
}

View file

@ -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(),

View file

@ -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