* Arashin War Beast - Fixed triggerd ability.

This commit is contained in:
LevelX2 2015-01-08 10:47:09 +01:00
parent bcb1331c0f
commit a588b601b6
2 changed files with 105 additions and 20 deletions

View file

@ -29,11 +29,20 @@ package mage.sets.fatereforged;
import java.util.UUID; import java.util.UUID;
import mage.MageInt; import mage.MageInt;
import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.Effect;
import mage.abilities.effects.keyword.ManifestEffect; import mage.abilities.effects.keyword.ManifestEffect;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.Rarity; import mage.constants.Rarity;
import mage.constants.Zone;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.BlockingPredicate;
import mage.game.Game;
import mage.game.events.DamagedCreatureEvent;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.game.permanent.Permanent;
/** /**
* *
@ -49,7 +58,7 @@ public class ArashinWarBeast extends CardImpl {
this.toughness = new MageInt(6); this.toughness = new MageInt(6);
// Whenever Arashin War Beast deals combat damage to one or more blockers, manifest the top card of your library. // Whenever Arashin War Beast deals combat damage to one or more blockers, manifest the top card of your library.
this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new ManifestEffect(1), true)); this.addAbility(new ArashinWarBeastTriggeredAbility(new ManifestEffect(1), true));
} }
@ -62,3 +71,55 @@ public class ArashinWarBeast extends CardImpl {
return new ArashinWarBeast(this); return new ArashinWarBeast(this);
} }
} }
class ArashinWarBeastTriggeredAbility extends TriggeredAbilityImpl {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("one or more blockers");
static {
filter.add(new BlockingPredicate());
}
boolean usedForCombatDamageStep;
public ArashinWarBeastTriggeredAbility(Effect effect, boolean optional) {
super(Zone.BATTLEFIELD, effect, optional);
this.usedForCombatDamageStep = false;
}
public ArashinWarBeastTriggeredAbility(final ArashinWarBeastTriggeredAbility ability) {
super(ability);
this.usedForCombatDamageStep = ability.usedForCombatDamageStep;
}
@Override
public ArashinWarBeastTriggeredAbility copy() {
return new ArashinWarBeastTriggeredAbility(this);
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.DAMAGED_CREATURE &&
event.getSourceId().equals(this.sourceId) &&
((DamagedCreatureEvent) event).isCombatDamage() &&
!usedForCombatDamageStep) {
Permanent creature = game.getPermanentOrLKIBattlefield(event.getTargetId());
if (creature == null || !filter.match(creature, getSourceId(), getControllerId(), game)) {
return false;
}
// trigger only once per combat damage step
usedForCombatDamageStep = true;
return true;
}
if (event.getType() == EventType.COMBAT_DAMAGE_STEP_POST) {
usedForCombatDamageStep = false;
}
return false;
}
@Override
public String getRule() {
return "Whenever {this} deals combat damage to one or more blockers, " + super.getRule();
}
}

View file

@ -25,16 +25,17 @@
* authors and should not be interpreted as representing official policies, either expressed * authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com. * or implied, of BetaSteward_at_googlemail.com.
*/ */
package mage.abilities.common; package mage.abilities.common;
import mage.constants.Zone; import mage.constants.Zone;
import mage.abilities.TriggeredAbilityImpl; import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.Effect; import mage.abilities.effects.Effect;
import mage.filter.common.FilterCreaturePermanent;
import mage.game.Game; import mage.game.Game;
import mage.game.events.DamagedCreatureEvent; import mage.game.events.DamagedCreatureEvent;
import mage.game.events.GameEvent; import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType; import mage.game.events.GameEvent.EventType;
import mage.game.permanent.Permanent;
import mage.target.targetpointer.FixedTarget; import mage.target.targetpointer.FixedTarget;
/** /**
@ -44,45 +45,68 @@ import mage.target.targetpointer.FixedTarget;
public class DealsDamageToACreatureTriggeredAbility extends TriggeredAbilityImpl { public class DealsDamageToACreatureTriggeredAbility extends TriggeredAbilityImpl {
private boolean combatOnly; private boolean combatOnly;
private boolean setTargetPointer; private final boolean setTargetPointer;
private FilterCreaturePermanent filter;
public DealsDamageToACreatureTriggeredAbility(Effect effect, boolean combatOnly, boolean optional, boolean setTargetPointer) { public DealsDamageToACreatureTriggeredAbility(Effect effect, boolean combatOnly, boolean optional, boolean setTargetPointer) {
this(effect, combatOnly, optional, setTargetPointer, null);
}
public DealsDamageToACreatureTriggeredAbility(Effect effect, boolean combatOnly, boolean optional, boolean setTargetPointer, FilterCreaturePermanent filter) {
super(Zone.BATTLEFIELD, effect, optional); super(Zone.BATTLEFIELD, effect, optional);
this.setTargetPointer = setTargetPointer; this.setTargetPointer = setTargetPointer;
} }
public DealsDamageToACreatureTriggeredAbility(final DealsDamageToACreatureTriggeredAbility ability) { public DealsDamageToACreatureTriggeredAbility(final DealsDamageToACreatureTriggeredAbility ability) {
super(ability); super(ability);
this.setTargetPointer = ability.setTargetPointer; this.setTargetPointer = ability.setTargetPointer;
this.combatOnly = ability.combatOnly; this.combatOnly = ability.combatOnly;
this.filter = ability.filter;
} }
@Override @Override
public DealsDamageToACreatureTriggeredAbility copy() { public DealsDamageToACreatureTriggeredAbility copy() {
return new DealsDamageToACreatureTriggeredAbility(this); return new DealsDamageToACreatureTriggeredAbility(this);
} }
@Override @Override
public boolean checkTrigger(GameEvent event, Game game) { public boolean checkTrigger(GameEvent event, Game game) {
if (event.getType() == EventType.DAMAGED_CREATURE) { if (event.getType() == EventType.DAMAGED_CREATURE) {
if (event.getSourceId().equals(this.sourceId) if (event.getSourceId().equals(this.sourceId)
&& (!combatOnly || ((DamagedCreatureEvent) event).isCombatDamage())) { && (!combatOnly || ((DamagedCreatureEvent) event).isCombatDamage())) {
if (setTargetPointer) { if (filter != null) {
for (Effect effect : this.getEffects()) { Permanent creature = game.getPermanentOrLKIBattlefield(event.getTargetId());
effect.setTargetPointer(new FixedTarget(event.getTargetId())); if (creature == null || !filter.match(creature, getSourceId(), getControllerId(), game)) {
effect.setValue("damage", event.getAmount()); return false;
}
}
return true;
} }
}
if (setTargetPointer) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getTargetId()));
effect.setValue("damage", event.getAmount());
}
}
return true;
} }
return false;
}
return false;
} }
@Override @Override
public String getRule() { public String getRule() {
return new StringBuilder("Whenever {this} deals ").append(combatOnly ? "combat ":"").append("damage to a creature, ").append(super.getRule()).toString(); StringBuilder sb = new StringBuilder("Whenever {this} deals ");
if (combatOnly) {
sb.append("combat ");
}
sb.append("damage to ");
if (filter == null) {
sb.append("a creature, ");
} else {
sb.append(filter.getMessage());
}
sb.append(super.getRule());
return sb.toString();
} }
} }