Fix failing triggers when removed from combat

This commit is contained in:
Bug Hunter
2021-07-30 04:24:48 +00:00
committed by Michael Kamensky
parent 788b34194a
commit 358c6986e0
173 changed files with 217 additions and 242 deletions

View File

@@ -274,8 +274,7 @@ public class GameLogFormatter extends IGameEventVisitor.Base<GameLogEntry> {
blockers = att.getValue(); blockers = att.getValue();
if (blockers.isEmpty()) { if (blockers.isEmpty()) {
sb.append(Localizer.getInstance().getMessage("lblLogPlayerDidntBlockAttacker", controllerName, att.getKey())); sb.append(Localizer.getInstance().getMessage("lblLogPlayerDidntBlockAttacker", controllerName, att.getKey()));
} } else {
else {
sb.append(Localizer.getInstance().getMessage("lblLogPlayerAssignedBlockerToBlockAttacker", controllerName, Lang.joinHomogenous(blockers), att.getKey())); sb.append(Localizer.getInstance().getMessage("lblLogPlayerAssignedBlockerToBlockAttacker", controllerName, Lang.joinHomogenous(blockers), att.getKey()));
} }
firstAttacker = false; firstAttacker = false;

View File

@@ -36,7 +36,7 @@ public class RegenerateAllEffect extends RegenerateBaseEffect {
list = CardLists.getValidCards(list, valid.split(","), hostCard.getController(), hostCard, sa); list = CardLists.getValidCards(list, valid.split(","), hostCard.getController(), hostCard, sa);
// create Effect for Regeneration // create Effect for Regeneration
createRengenerationEffect(sa, list); createRegenerationEffect(sa, list);
} // regenerateAllResolve } // regenerateAllResolve
} }

View File

@@ -17,7 +17,7 @@ import forge.game.zone.ZoneType;
public abstract class RegenerateBaseEffect extends SpellAbilityEffect { public abstract class RegenerateBaseEffect extends SpellAbilityEffect {
public void createRengenerationEffect(SpellAbility sa, final Iterable<Card> list) { public void createRegenerationEffect(SpellAbility sa, final Iterable<Card> list) {
final Card hostCard = sa.getHostCard(); final Card hostCard = sa.getHostCard();
final Game game = hostCard.getGame(); final Game game = hostCard.getGame();

View File

@@ -46,7 +46,7 @@ public class RegenerateEffect extends RegenerateBaseEffect {
@Override @Override
public void resolve(SpellAbility sa) { public void resolve(SpellAbility sa) {
// create Effect for Regeneration // create Effect for Regeneration
createRengenerationEffect(sa, getTargetCards(sa)); createRegenerationEffect(sa, getTargetCards(sa));
} // regenerateResolve }
} }

View File

@@ -31,6 +31,7 @@ public class RegenerationEffect extends SpellAbilityEffect {
c.addRegeneratedThisTurn(); c.addRegeneratedThisTurn();
if (game.getCombat() != null) { if (game.getCombat() != null) {
game.getCombat().saveLKI(c);
game.getCombat().removeFromCombat(c); game.getCombat().removeFromCombat(c);
} }

View File

@@ -59,6 +59,7 @@ public class RemoveFromCombatEffect extends SpellAbilityEffect {
} }
} }
game.getCombat().saveLKI(c);
combat.removeFromCombat(c); combat.removeFromCombat(c);
if (rem) { if (rem) {

View File

@@ -77,6 +77,7 @@ import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils; import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType; import forge.game.ability.ApiType;
import forge.game.combat.Combat; import forge.game.combat.Combat;
import forge.game.combat.CombatLki;
import forge.game.cost.Cost; import forge.game.cost.Cost;
import forge.game.cost.CostSacrifice; import forge.game.cost.CostSacrifice;
import forge.game.event.GameEventCardAttachment; import forge.game.event.GameEventCardAttachment;
@@ -353,6 +354,8 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
private final Table<SpellAbility, StaticAbility, List<String>> chosenModesTurnStatic = HashBasedTable.create(); private final Table<SpellAbility, StaticAbility, List<String>> chosenModesTurnStatic = HashBasedTable.create();
private final Table<SpellAbility, StaticAbility, List<String>> chosenModesGameStatic = HashBasedTable.create(); private final Table<SpellAbility, StaticAbility, List<String>> chosenModesGameStatic = HashBasedTable.create();
private CombatLki combatLKI = null;
// Enumeration for CMC request types // Enumeration for CMC request types
public enum SplitCMCMode { public enum SplitCMCMode {
CurrentSideCMC, CurrentSideCMC,
@@ -4728,6 +4731,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
setPhasedOut(!phasedOut); setPhasedOut(!phasedOut);
final Combat combat = getGame().getPhaseHandler().getCombat(); final Combat combat = getGame().getPhaseHandler().getCombat();
if (combat != null && phasedOut) { if (combat != null && phasedOut) {
combat.saveLKI(this);
combat.removeFromCombat(this); combat.removeFromCombat(this);
} }
@@ -6982,4 +6986,18 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
public final void clearUntilLeavesBattlefield() { public final void clearUntilLeavesBattlefield() {
untilLeavesBattlefield = view.clearCards(untilLeavesBattlefield, TrackableProperty.UntilLeavesBattlefield); untilLeavesBattlefield = view.clearCards(untilLeavesBattlefield, TrackableProperty.UntilLeavesBattlefield);
} }
public CombatLki getCombatLKI() {
return combatLKI;
}
public void setCombatLKI(CombatLki combatLKI) {
this.combatLKI = combatLKI;
}
public boolean isAttacking() {
if (getCombatLKI() != null) {
return getCombatLKI().isAttacker;
}
return getGame().getCombat().isAttacking(this);
}
} }

View File

@@ -781,7 +781,7 @@ public class CardFactoryUtil {
+ "TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ " + "TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ "
+ "Annihilator " + n + " (" + inst.getReminderText() + ")"; + "Annihilator " + n + " (" + inst.getReminderText() + ")";
final String effect = "DB$ Sacrifice | Defined$ DefendingPlayer | SacValid$ Permanent | Amount$ " + k[1]; final String effect = "DB$ Sacrifice | Defined$ TriggeredDefendingPlayer | SacValid$ Permanent | Amount$ " + k[1];
final Trigger trigger = TriggerHandler.parseTrigger(trig, card, intrinsic); final Trigger trigger = TriggerHandler.parseTrigger(trig, card, intrinsic);
trigger.setOverridingAbility(AbilityFactory.getAbility(effect, card)); trigger.setOverridingAbility(AbilityFactory.getAbility(effect, card));
@@ -1516,7 +1516,7 @@ public class CardFactoryUtil {
} else if (keyword.equals("Provoke")) { } else if (keyword.equals("Provoke")) {
final String actualTrigger = "Mode$ Attacks | ValidCard$ Card.Self | OptionalDecider$ You | Secondary$ True" final String actualTrigger = "Mode$ Attacks | ValidCard$ Card.Self | OptionalDecider$ You | Secondary$ True"
+ " | TriggerDescription$ Provoke (" + inst.getReminderText() + ")"; + " | TriggerDescription$ Provoke (" + inst.getReminderText() + ")";
final String blockStr = "DB$ MustBlock | ValidTgts$ Creature.DefenderCtrl | TgtPrompt$ Select target creature defending player controls"; final String blockStr = "DB$ MustBlock | ValidTgts$ Creature.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target creature defending player controls";
final String untapStr = "DB$ Untap | Defined$ Targeted"; final String untapStr = "DB$ Untap | Defined$ Targeted";
SpellAbility blockSA = AbilityFactory.getAbility(blockStr, card); SpellAbility blockSA = AbilityFactory.getAbility(blockStr, card);

View File

@@ -1419,8 +1419,7 @@ public class CardProperty {
// These predicated refer to ongoing combat. If no combat happens, they'll return false (meaning not attacking/blocking ATM) // These predicated refer to ongoing combat. If no combat happens, they'll return false (meaning not attacking/blocking ATM)
else if (property.startsWith("attacking")) { else if (property.startsWith("attacking")) {
if (null == combat) return false; if (null == combat) return false;
if (property.equals("attacking")) return combat.isAttacking(card); if (property.equals("attacking")) return card.isAttacking();
if (property.equals("attackingLKI")) return combat.isLKIAttacking(card);
if (property.equals("attackingYou")) return combat.isAttacking(card, sourceController); if (property.equals("attackingYou")) return combat.isAttacking(card, sourceController);
if (property.equals("attackingSame")) { if (property.equals("attackingSame")) {
final GameEntity attacked = combat.getDefenderByAttacker(source); final GameEntity attacked = combat.getDefenderByAttacker(source);
@@ -1521,12 +1520,10 @@ public class CardProperty {
return false; return false;
} }
String valid = property.split(" ")[1]; String valid = property.split(" ")[1];
for(Card c : blocked) { if (Iterables.any(blocked, CardPredicates.restriction(valid, card.getController(), source, spellAbility))) {
if (c.isValid(valid, card.getController(), source, spellAbility)) { return true;
return true;
}
} }
for(Card c : AbilityUtils.getDefinedCards(source, valid, spellAbility)) { for (Card c : AbilityUtils.getDefinedCards(source, valid, spellAbility)) {
if (blocked.contains(c)) { if (blocked.contains(c)) {
return true; return true;
} }

View File

@@ -323,6 +323,10 @@ public final class CardUtil {
newCopy.setExiledWith(getLKICopy(in.getExiledWith(), cachedMap)); newCopy.setExiledWith(getLKICopy(in.getExiledWith(), cachedMap));
if (in.getGame().getCombat() != null) {
newCopy.setCombatLKI(in.getGame().getCombat().saveLKI(newCopy));
}
return newCopy; return newCopy;
} }

View File

@@ -45,6 +45,7 @@ import forge.game.card.Card;
import forge.game.card.CardCollection; import forge.game.card.CardCollection;
import forge.game.card.CardCollectionView; import forge.game.card.CardCollectionView;
import forge.game.card.CardDamageMap; import forge.game.card.CardDamageMap;
import forge.game.card.CardUtil;
import forge.game.keyword.Keyword; import forge.game.keyword.Keyword;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.replacement.ReplacementType; import forge.game.replacement.ReplacementType;
@@ -75,7 +76,7 @@ public class Combat {
private Map<Card, CardCollection> attackersOrderedForDamageAssignment = Maps.newHashMap(); private Map<Card, CardCollection> attackersOrderedForDamageAssignment = Maps.newHashMap();
private Map<Card, CardCollection> blockersOrderedForDamageAssignment = Maps.newHashMap(); private Map<Card, CardCollection> blockersOrderedForDamageAssignment = Maps.newHashMap();
private Map<GameEntity, CombatLki> lkiCache = Maps.newHashMap(); private CardCollection lkiCache = new CardCollection();
private CardDamageMap damageMap = new CardDamageMap(); private CardDamageMap damageMap = new CardDamageMap();
// List holds creatures who have dealt 1st strike damage to disallow them deal damage on regular basis (unless they have double-strike KW) // List holds creatures who have dealt 1st strike damage to disallow them deal damage on regular basis (unless they have double-strike KW)
@@ -300,7 +301,7 @@ public class Combat {
return ab; return ab;
} }
} }
CombatLki lki = lkiCache.get(c); CombatLki lki = lkiCache.get(c).getCombatLKI();
return lki == null || !lki.isAttacker ? null : lki.getFirstBand(); return lki == null || !lki.isAttacker ? null : lki.getFirstBand();
} }
@@ -316,14 +317,6 @@ public class Combat {
return Lists.newArrayList(attackedByBands.values()); return Lists.newArrayList(attackedByBands.values());
} }
/**
* Checks if a card is attacking, returns true if the card was attacking when it left the battlefield
*/
public final boolean isLKIAttacking(final Card c) {
AttackingBand ab = getBandOfAttacker(c);
return ab != null;
}
public boolean isAttacking(Card card, GameEntity defender) { public boolean isAttacking(Card card, GameEntity defender) {
AttackingBand ab = getBandOfAttacker(card); AttackingBand ab = getBandOfAttacker(card);
for (Entry<GameEntity, AttackingBand> ee : attackedByBands.entries()) { for (Entry<GameEntity, AttackingBand> ee : attackedByBands.entries()) {
@@ -918,7 +911,7 @@ public class Combat {
return false; return false;
} }
CombatLki lki = lkiCache.get(blocker); CombatLki lki = lkiCache.get(blocker).getCombatLKI();
return null != lki && !lki.isAttacker; // was blocking something anyway return null != lki && !lki.isAttacker; // was blocking something anyway
} }
@@ -933,21 +926,36 @@ public class Combat {
return false; return false;
} }
CombatLki lki = lkiCache.get(blocker); CombatLki lki = lkiCache.get(blocker).getCombatLKI();
return null != lki && !lki.isAttacker && lki.relatedBands.contains(ab); // was blocking that very band return null != lki && !lki.isAttacker && lki.relatedBands.contains(ab); // was blocking that very band
} }
public void saveLKI(Card lastKnownInfo) { public CombatLki saveLKI(Card lki) {
if (!lki.isLKI()) {
lki = CardUtil.getLKICopy(lki);
}
FCollectionView<AttackingBand> attackersBlocked = null; FCollectionView<AttackingBand> attackersBlocked = null;
final AttackingBand attackingBand = getBandOfAttacker(lastKnownInfo); final AttackingBand attackingBand = getBandOfAttacker(lki);
final boolean isAttacker = attackingBand != null; final boolean isAttacker = attackingBand != null;
if (!isAttacker) { if (isAttacker) {
attackersBlocked = getAttackingBandsBlockedBy(lastKnownInfo); boolean found = false;
for (AttackingBand ab : attackedByBands.values()) {
if (ab.contains(lki)) {
found = true;
break;
}
}
if (!found) {
return null;
}
} else {
attackersBlocked = getAttackingBandsBlockedBy(lki);
if (attackersBlocked.isEmpty()) { if (attackersBlocked.isEmpty()) {
return; // card was not even in combat return null; // card was not even in combat
} }
} }
lkiCache.add(lki);
final FCollectionView<AttackingBand> relatedBands = isAttacker ? new FCollection<>(attackingBand) : attackersBlocked; final FCollectionView<AttackingBand> relatedBands = isAttacker ? new FCollection<>(attackingBand) : attackersBlocked;
lkiCache.put(lastKnownInfo, new CombatLki(isAttacker, relatedBands)); return new CombatLki(isAttacker, relatedBands);
} }
} }

View File

@@ -10,8 +10,7 @@ public class GameEventAnteCardsSelected extends GameEvent {
public GameEventAnteCardsSelected(Multimap<Player, Card> list) { public GameEventAnteCardsSelected(Multimap<Player, Card> list) {
cards = list; cards = list;
} }
@Override @Override
public <T> T visit(IGameEventVisitor<T> visitor) { public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this); return visitor.visit(this);

View File

@@ -14,7 +14,7 @@ public class GameEventAttackersDeclared extends GameEvent {
public final Player player; public final Player player;
public final Multimap<GameEntity, Card> attackersMap; public final Multimap<GameEntity, Card> attackersMap;
public GameEventAttackersDeclared(Player playerTurn, Multimap<GameEntity, Card> attackersMap) { public GameEventAttackersDeclared(Player playerTurn, Multimap<GameEntity, Card> attackersMap) {
this.player = playerTurn; this.player = playerTurn;
this.attackersMap = attackersMap; this.attackersMap = attackersMap;

View File

@@ -20,7 +20,7 @@ public class GameEventBlockersDeclared extends GameEvent {
public final Map<GameEntity, MapOfLists<Card, Card>> blockers; public final Map<GameEntity, MapOfLists<Card, Card>> blockers;
public final Player defendingPlayer; public final Player defendingPlayer;
public GameEventBlockersDeclared(Player who, Map<GameEntity, MapOfLists<Card, Card>> blockers) { public GameEventBlockersDeclared(Player who, Map<GameEntity, MapOfLists<Card, Card>> blockers) {
this.blockers = blockers; this.blockers = blockers;
defendingPlayer = who; defendingPlayer = who;

View File

@@ -8,13 +8,13 @@ public class GameEventCardAttachment extends GameEvent {
public final Card equipment; public final Card equipment;
public final GameEntity newTarget; // can enchant player, I'm ssaving a class to enchants - it could be incorrect. public final GameEntity newTarget; // can enchant player, I'm ssaving a class to enchants - it could be incorrect.
public final GameEntity oldEntiy; public final GameEntity oldEntiy;
public GameEventCardAttachment(Card attachment, GameEntity formerEntity, GameEntity newEntity) { public GameEventCardAttachment(Card attachment, GameEntity formerEntity, GameEntity newEntity) {
this.equipment = attachment; this.equipment = attachment;
this.newTarget = newEntity; this.newTarget = newEntity;
this.oldEntiy = formerEntity; this.oldEntiy = formerEntity;
} }
@Override @Override
public <T> T visit(IGameEventVisitor<T> visitor) { public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this); return visitor.visit(this);

View File

@@ -6,11 +6,10 @@ import forge.util.TextUtil;
public class GameEventCardChangeZone extends GameEvent { public class GameEventCardChangeZone extends GameEvent {
public final Card card;
public final Zone from;
public final Zone to;
public final Card card;
public final Zone from;
public final Zone to;
public GameEventCardChangeZone(Card c, Zone zoneFrom, Zone zoneTo) { public GameEventCardChangeZone(Card c, Zone zoneFrom, Zone zoneTo) {
card = c; card = c;
from = zoneFrom; from = zoneFrom;
@@ -21,7 +20,7 @@ public class GameEventCardChangeZone extends GameEvent {
public <T> T visit(IGameEventVisitor<T> visitor) { public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this); return visitor.visit(this);
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see java.lang.Object#toString() * @see java.lang.Object#toString()
*/ */

View File

@@ -15,7 +15,7 @@ public class GameEventCardCounters extends GameEvent {
this.oldValue = old; this.oldValue = old;
this.newValue = newValue; this.newValue = newValue;
} }
@Override @Override
public <T> T visit(IGameEventVisitor<T> visitor) { public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this); return visitor.visit(this);

View File

@@ -3,7 +3,7 @@ package forge.game.event;
import forge.game.card.Card; import forge.game.card.Card;
public class GameEventCardDamaged extends GameEvent { public class GameEventCardDamaged extends GameEvent {
public enum DamageType { public enum DamageType {
Normal, Normal,
M1M1Counters, M1M1Counters,

View File

@@ -1,7 +1,7 @@
package forge.game.event; package forge.game.event;
public class GameEventCardDestroyed extends GameEvent { public class GameEventCardDestroyed extends GameEvent {
@Override @Override
public <T> T visit(IGameEventVisitor<T> visitor) { public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this); return visitor.visit(this);

View File

@@ -3,12 +3,12 @@ package forge.game.event;
import forge.game.player.Player; import forge.game.player.Player;
public class GameEventCardModeChosen extends GameEvent { public class GameEventCardModeChosen extends GameEvent {
public final Player player; public final Player player;
public final String cardName; public final String cardName;
public final String mode; public final String mode;
public final boolean log; public final boolean log;
public GameEventCardModeChosen(Player player, String cardName, String mode, boolean log) { public GameEventCardModeChosen(Player player, String cardName, String mode, boolean log) {
this.player = player; this.player = player;
this.cardName = cardName; this.cardName = cardName;
@@ -21,5 +21,3 @@ public class GameEventCardModeChosen extends GameEvent {
return visitor.visit(this); return visitor.visit(this);
} }
} }

View File

@@ -10,7 +10,7 @@ public class GameEventCardPhased extends GameEvent {
public final Card card; public final Card card;
public final boolean phaseState; public final boolean phaseState;
public GameEventCardPhased(Card card, boolean state) { public GameEventCardPhased(Card card, boolean state) {
this.card = card; this.card = card;
phaseState = state; phaseState = state;
@@ -20,7 +20,7 @@ public class GameEventCardPhased extends GameEvent {
public <T> T visit(IGameEventVisitor<T> visitor) { public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this); return visitor.visit(this);
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see java.lang.Object#toString() * @see java.lang.Object#toString()
*/ */

View File

@@ -1,7 +1,7 @@
package forge.game.event; package forge.game.event;
public class GameEventCardRegenerated extends GameEvent { public class GameEventCardRegenerated extends GameEvent {
@Override @Override
public <T> T visit(IGameEventVisitor<T> visitor) { public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this); return visitor.visit(this);

View File

@@ -1,7 +1,7 @@
package forge.game.event; package forge.game.event;
public class GameEventCardSacrificed extends GameEvent { public class GameEventCardSacrificed extends GameEvent {
@Override @Override
public <T> T visit(IGameEventVisitor<T> visitor) { public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this); return visitor.visit(this);

View File

@@ -18,7 +18,7 @@ public class GameEventCardStatsChanged extends GameEvent {
public GameEventCardStatsChanged(Card affected) { public GameEventCardStatsChanged(Card affected) {
cards = Arrays.asList(affected); cards = Arrays.asList(affected);
} }
public GameEventCardStatsChanged(Collection<Card> affected) { public GameEventCardStatsChanged(Collection<Card> affected) {
cards = affected; cards = affected;
} }
@@ -31,13 +31,13 @@ public class GameEventCardStatsChanged extends GameEvent {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return visitor.visit(this); return visitor.visit(this);
} }
@Override @Override
public String toString() { public String toString() {
Card card = Iterables.getFirst(cards, null); Card card = Iterables.getFirst(cards, null);
if ( null == card ) if (null == card)
return "Card state changes: (empty list)"; return "Card state changes: (empty list)";
if( cards.size() == 1) if (cards.size() == 1)
return "Card state changes: " + card.getName() + return "Card state changes: " + card.getName() +
" (" + StringUtils.join(card.getType(), ' ') + ") " + " (" + StringUtils.join(card.getType(), ' ') + ") " +
card.getNetPower() + "/" + card.getNetToughness(); card.getNetPower() + "/" + card.getNetToughness();

View File

@@ -10,8 +10,7 @@ public class GameEventCardTapped extends GameEvent {
this.tapped = tapped; this.tapped = tapped;
this.card = card; this.card = card;
} }
@Override @Override
public <T> T visit(IGameEventVisitor<T> visitor) { public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this); return visitor.visit(this);

View File

@@ -8,7 +8,7 @@ public class GameEventCombatEnded extends GameEvent {
public final List<Card> attackers; public final List<Card> attackers;
public final List<Card> blockers; public final List<Card> blockers;
public GameEventCombatEnded(List<Card> attackers, List<Card> blockers) { public GameEventCombatEnded(List<Card> attackers, List<Card> blockers) {
this.attackers = attackers; this.attackers = attackers;
this.blockers = blockers; this.blockers = blockers;

View File

@@ -1,8 +1,7 @@
package forge.game.event; package forge.game.event;
public class GameEventFlipCoin extends GameEvent { public class GameEventFlipCoin extends GameEvent {
@Override @Override
public <T> T visit(IGameEventVisitor<T> visitor) { public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this); return visitor.visit(this);

View File

@@ -12,8 +12,7 @@ public class GameEventGameOutcome extends GameEvent {
this.result = lastOne; this.result = lastOne;
this.history = history; this.history = history;
} }
@Override @Override
public <T> T visit(IGameEventVisitor<T> visitor) { public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this); return visitor.visit(this);

View File

@@ -9,12 +9,11 @@ import forge.game.player.Player;
public class GameEventGameRestarted extends GameEvent { public class GameEventGameRestarted extends GameEvent {
public final Player whoRestarted; public final Player whoRestarted;
public GameEventGameRestarted(Player playerTurn) { public GameEventGameRestarted(Player playerTurn) {
whoRestarted = playerTurn; whoRestarted = playerTurn;
} }
@Override @Override
public <T> T visit(IGameEventVisitor<T> visitor) { public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this); return visitor.visit(this);

View File

@@ -22,12 +22,11 @@ public class GameEventGameStarted extends GameEvent {
this.players = players; this.players = players;
} }
@Override @Override
public <T> T visit(IGameEventVisitor<T> visitor) { public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this); return visitor.visit(this);
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see java.lang.Object#toString() * @see java.lang.Object#toString()
*/ */

View File

@@ -14,7 +14,6 @@ public class GameEventLandPlayed extends GameEvent {
} }
@Override @Override
public <T> T visit(IGameEventVisitor<T> visitor) { public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this); return visitor.visit(this);

View File

@@ -4,11 +4,11 @@ import forge.game.player.Player;
// This special event denotes loss of mana due to phase end // This special event denotes loss of mana due to phase end
public class GameEventManaBurn extends GameEvent { public class GameEventManaBurn extends GameEvent {
public final Player player; public final Player player;
public final boolean causedLifeLoss; public final boolean causedLifeLoss;
public final int amount; public final int amount;
/** /**
* TODO: Write javadoc for Constructor. * TODO: Write javadoc for Constructor.
* @param dealDamage * @param dealDamage
@@ -19,7 +19,7 @@ public class GameEventManaBurn extends GameEvent {
amount = burn; amount = burn;
causedLifeLoss = dealDamage; causedLifeLoss = dealDamage;
} }
@Override @Override
public <T> T visit(IGameEventVisitor<T> visitor) { public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this); return visitor.visit(this);

View File

@@ -24,7 +24,7 @@ public class GameEventManaPool extends GameEvent {
public <T> T visit(IGameEventVisitor<T> visitor) { public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this); return visitor.visit(this);
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see java.lang.Object#toString() * @see java.lang.Object#toString()
*/ */

View File

@@ -12,8 +12,7 @@ public class GameEventMulligan extends GameEvent {
public GameEventMulligan(Player p) { public GameEventMulligan(Player p) {
player = p; player = p;
} }
@Override @Override
public <T> T visit(IGameEventVisitor<T> visitor) { public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this); return visitor.visit(this);

View File

@@ -8,18 +8,18 @@ public class GameEventPlayerLivesChanged extends GameEvent {
public final Player player; public final Player player;
public final int oldLives; public final int oldLives;
public final int newLives; public final int newLives;
public GameEventPlayerLivesChanged(Player who, int oldValue, int newValue) { public GameEventPlayerLivesChanged(Player who, int oldValue, int newValue) {
player = who; player = who;
oldLives = oldValue; oldLives = oldValue;
newLives = newValue; newLives = newValue;
} }
@Override @Override
public <T> T visit(IGameEventVisitor<T> visitor) { public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this); return visitor.visit(this);
} }
@Override @Override
public String toString() { public String toString() {
return TextUtil.concatWithSpace(Lang.getInstance().getPossesive(player.getName()),"lives changed:", String.valueOf(oldLives),"->", String.valueOf(newLives)); return TextUtil.concatWithSpace(Lang.getInstance().getPossesive(player.getName()),"lives changed:", String.valueOf(oldLives),"->", String.valueOf(newLives));

View File

@@ -19,8 +19,7 @@ public class GameEventPlayerPoisoned extends GameEvent {
oldValue = old; oldValue = old;
amount = num; amount = num;
} }
@Override @Override
public <T> T visit(IGameEventVisitor<T> visitor) { public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this); return visitor.visit(this);

View File

@@ -13,7 +13,7 @@ public class GameEventPlayerPriority extends GameEvent {
public final Player turn; public final Player turn;
public final PhaseType phase; public final PhaseType phase;
public final Player priority; public final Player priority;
public GameEventPlayerPriority(Player playerTurn, PhaseType phase, Player priorityPlayer) { public GameEventPlayerPriority(Player playerTurn, PhaseType phase, Player priorityPlayer) {
turn = playerTurn; turn = playerTurn;
this.phase = phase; this.phase = phase;
@@ -25,7 +25,6 @@ public class GameEventPlayerPriority extends GameEvent {
return visitor.visit(this); return visitor.visit(this);
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see java.lang.Object#toString() * @see java.lang.Object#toString()
*/ */

View File

@@ -3,10 +3,10 @@ package forge.game.event;
import forge.game.player.Player; import forge.game.player.Player;
public class GameEventScry extends GameEvent { public class GameEventScry extends GameEvent {
public final Player player; public final Player player;
public final int toTop, toBottom; public final int toTop, toBottom;
public GameEventScry(Player player, int toTop, int toBottom) { public GameEventScry(Player player, int toTop, int toBottom) {
this.player = player; this.player = player;
this.toTop = toTop; this.toTop = toTop;
@@ -18,4 +18,3 @@ public class GameEventScry extends GameEvent {
return visitor.visit(this); return visitor.visit(this);
} }
} }

View File

@@ -5,9 +5,9 @@ import forge.util.Lang;
import forge.util.TextUtil; import forge.util.TextUtil;
public class GameEventShuffle extends GameEvent { public class GameEventShuffle extends GameEvent {
public final Player player; public final Player player;
public GameEventShuffle(Player player) { public GameEventShuffle(Player player) {
this.player = player; this.player = player;
} }
@@ -16,7 +16,7 @@ public class GameEventShuffle extends GameEvent {
public <T> T visit(IGameEventVisitor<T> visitor) { public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this); return visitor.visit(this);
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see java.lang.Object#toString() * @see java.lang.Object#toString()
*/ */

View File

@@ -13,7 +13,7 @@ public class GameEventSpellAbilityCast extends GameEvent {
public final SpellAbilityStackInstance si; public final SpellAbilityStackInstance si;
public final boolean replicate; public final boolean replicate;
public final int stackIndex; public final int stackIndex;
public GameEventSpellAbilityCast(SpellAbility sp, SpellAbilityStackInstance si, int stackIndex, boolean replicate) { public GameEventSpellAbilityCast(SpellAbility sp, SpellAbilityStackInstance si, int stackIndex, boolean replicate) {
sa = sp; sa = sp;
this.si = si; this.si = si;

View File

@@ -23,8 +23,6 @@ public class GameEventSpellResolved extends GameEvent {
this.hasFizzled = hasFizzled; this.hasFizzled = hasFizzled;
} }
@Override @Override
public <T> T visit(IGameEventVisitor<T> visitor) { public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this); return visitor.visit(this);

View File

@@ -3,10 +3,10 @@ package forge.game.event;
import forge.game.player.Player; import forge.game.player.Player;
public class GameEventSurveil extends GameEvent { public class GameEventSurveil extends GameEvent {
public final Player player; public final Player player;
public final int toLibrary, toGraveyard; public final int toLibrary, toGraveyard;
public GameEventSurveil(Player player, int toLibrary, int toGraveyard) { public GameEventSurveil(Player player, int toLibrary, int toGraveyard) {
this.player = player; this.player = player;
this.toLibrary = toLibrary; this.toLibrary = toLibrary;
@@ -18,4 +18,3 @@ public class GameEventSurveil extends GameEvent {
return visitor.visit(this); return visitor.visit(this);
} }
} }

View File

@@ -1,8 +1,7 @@
package forge.game.event; package forge.game.event;
public class GameEventTokenCreated extends GameEvent { public class GameEventTokenCreated extends GameEvent {
@Override @Override
public <T> T visit(IGameEventVisitor<T> visitor) { public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this); return visitor.visit(this);

View File

@@ -4,10 +4,10 @@ import forge.game.player.Player;
import forge.util.TextUtil; import forge.util.TextUtil;
public class GameEventTurnBegan extends GameEvent { public class GameEventTurnBegan extends GameEvent {
public final Player turnOwner; public final Player turnOwner;
public final int turnNumber; public final int turnNumber;
public GameEventTurnBegan(Player turnOwner, int turnNumber) { public GameEventTurnBegan(Player turnOwner, int turnNumber) {
super(); super();
this.turnOwner = turnOwner; this.turnOwner = turnOwner;
@@ -18,7 +18,7 @@ public class GameEventTurnBegan extends GameEvent {
public <T> T visit(IGameEventVisitor<T> visitor) { public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this); return visitor.visit(this);
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see java.lang.Object#toString() * @see java.lang.Object#toString()
*/ */

View File

@@ -1,8 +1,7 @@
package forge.game.event; package forge.game.event;
public class GameEventTurnEnded extends GameEvent { public class GameEventTurnEnded extends GameEvent {
@Override @Override
public <T> T visit(IGameEventVisitor<T> visitor) { public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this); return visitor.visit(this);

View File

@@ -105,4 +105,3 @@ public interface IGameEventVisitor<T> {
public T visit(GameEventZone event) { return null; } public T visit(GameEventZone event) { return null; }
} }
} }

View File

@@ -52,7 +52,6 @@ public class TriggerAbandoned extends Trigger {
* @param runParams*/ * @param runParams*/
@Override @Override
public final boolean performTest(final Map<AbilityKey, Object> runParams) { public final boolean performTest(final Map<AbilityKey, Object> runParams) {
if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Scheme))) { if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Scheme))) {
return false; return false;
} }
@@ -60,7 +59,6 @@ public class TriggerAbandoned extends Trigger {
return true; return true;
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa, Map<AbilityKey, Object> runParams) { public final void setTriggeringObjects(final SpellAbility sa, Map<AbilityKey, Object> runParams) {
@@ -72,4 +70,3 @@ public class TriggerAbandoned extends Trigger {
return ""; return "";
} }
} }

View File

@@ -63,7 +63,6 @@ public class TriggerAttached extends Trigger {
return true; return true;
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override

View File

@@ -54,7 +54,6 @@ public class TriggerAttackerUnblocked extends Trigger {
* @param runParams*/ * @param runParams*/
@Override @Override
public final boolean performTest(final Map<AbilityKey, Object> runParams) { public final boolean performTest(final Map<AbilityKey, Object> runParams) {
if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Attacker))) { if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Attacker))) {
return false; return false;
} }

View File

@@ -57,7 +57,6 @@ public class TriggerAttacks extends Trigger {
* @param runParams*/ * @param runParams*/
@Override @Override
public final boolean performTest(final Map<AbilityKey, Object> runParams) { public final boolean performTest(final Map<AbilityKey, Object> runParams) {
if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Attacker))) { if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Attacker))) {
return false; return false;
} }

View File

@@ -55,7 +55,6 @@ public class TriggerChampioned extends Trigger {
* @param runParams*/ * @param runParams*/
@Override @Override
public final boolean performTest(final Map<AbilityKey, Object> runParams) { public final boolean performTest(final Map<AbilityKey, Object> runParams) {
if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Championed))) { if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Championed))) {
return false; return false;
} }

View File

@@ -16,7 +16,6 @@ public class TriggerDamageAll extends Trigger {
@Override @Override
public boolean performTest(Map<AbilityKey, Object> runParams) { public boolean performTest(Map<AbilityKey, Object> runParams) {
if (hasParam("CombatDamage")) { if (hasParam("CombatDamage")) {
if (getParam("CombatDamage").equals("True")) { if (getParam("CombatDamage").equals("True")) {
if (!((Boolean) runParams.get(AbilityKey.IsCombatDamage))) { if (!((Boolean) runParams.get(AbilityKey.IsCombatDamage))) {

View File

@@ -59,7 +59,6 @@ public class TriggerDamageDealtOnce extends Trigger {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public final boolean performTest(final Map<AbilityKey, Object> runParams) { public final boolean performTest(final Map<AbilityKey, Object> runParams) {
if (hasParam("CombatDamage")) { if (hasParam("CombatDamage")) {
if (getParam("CombatDamage").equals("True")) { if (getParam("CombatDamage").equals("True")) {
if (!((Boolean) runParams.get(AbilityKey.IsCombatDamage))) { if (!((Boolean) runParams.get(AbilityKey.IsCombatDamage))) {

View File

@@ -21,7 +21,6 @@ public class TriggerDamageDoneOnce extends Trigger {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public boolean performTest(Map<AbilityKey, Object> runParams) { public boolean performTest(Map<AbilityKey, Object> runParams) {
if (hasParam("CombatDamage")) { if (hasParam("CombatDamage")) {
if (getParam("CombatDamage").equals("True")) { if (getParam("CombatDamage").equals("True")) {
if (!((Boolean) runParams.get(AbilityKey.IsCombatDamage))) { if (!((Boolean) runParams.get(AbilityKey.IsCombatDamage))) {

View File

@@ -56,7 +56,6 @@ public class TriggerDamagePrevented extends Trigger {
* @param runParams*/ * @param runParams*/
@Override @Override
public final boolean performTest(final Map<AbilityKey, Object> runParams) { public final boolean performTest(final Map<AbilityKey, Object> runParams) {
if (!matchesValidParam("ValidSource", runParams.get(AbilityKey.DamageSource))) { if (!matchesValidParam("ValidSource", runParams.get(AbilityKey.DamageSource))) {
return false; return false;
} }

View File

@@ -55,7 +55,6 @@ public class TriggerDamagePreventedOnce extends Trigger {
* @param runParams*/ * @param runParams*/
@Override @Override
public final boolean performTest(final Map<AbilityKey, Object> runParams) { public final boolean performTest(final Map<AbilityKey, Object> runParams) {
if (!matchesValidParam("ValidTarget", runParams.get(AbilityKey.DamageTarget))) { if (!matchesValidParam("ValidTarget", runParams.get(AbilityKey.DamageTarget))) {
return false; return false;
} }

View File

@@ -82,4 +82,3 @@ public class TriggerExcessDamage extends Trigger {
return sb.toString(); return sb.toString();
} }
} }

View File

@@ -55,7 +55,6 @@ public class TriggerExploited extends Trigger {
* @param runParams*/ * @param runParams*/
@Override @Override
public final boolean performTest(final Map<AbilityKey, Object> runParams) { public final boolean performTest(final Map<AbilityKey, Object> runParams) {
if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Exploited))) { if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Exploited))) {
return false; return false;
} }

View File

@@ -73,4 +73,3 @@ public class TriggerExplores extends Trigger {
return sb.toString(); return sb.toString();
} }
} }

View File

@@ -70,4 +70,3 @@ public class TriggerFightOnce extends Trigger {
return sb.toString(); return sb.toString();
} }
} }

View File

@@ -67,7 +67,6 @@ public class TriggerPayCumulativeUpkeep extends Trigger {
return true; return true;
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa, Map<AbilityKey, Object> runParams) { public final void setTriggeringObjects(final SpellAbility sa, Map<AbilityKey, Object> runParams) {

View File

@@ -66,7 +66,6 @@ public class TriggerPayEcho extends Trigger {
return true; return true;
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa, Map<AbilityKey, Object> runParams) { public final void setTriggeringObjects(final SpellAbility sa, Map<AbilityKey, Object> runParams) {

View File

@@ -17,7 +17,6 @@ public class TriggerPhaseOut extends Trigger {
* @param runParams*/ * @param runParams*/
@Override @Override
public final boolean performTest(final Map<AbilityKey, Object> runParams) { public final boolean performTest(final Map<AbilityKey, Object> runParams) {
if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) {
return false; return false;
} }

View File

@@ -116,7 +116,6 @@ public class TriggerSacrificed extends Trigger {
return true; return true;
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa, Map<AbilityKey, Object> runParams) { public final void setTriggeringObjects(final SpellAbility sa, Map<AbilityKey, Object> runParams) {

View File

@@ -61,7 +61,6 @@ public class TriggerScry extends Trigger {
return true; return true;
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa, Map<AbilityKey, Object> runParams) { public final void setTriggeringObjects(final SpellAbility sa, Map<AbilityKey, Object> runParams) {

View File

@@ -70,7 +70,6 @@ public class TriggerSearchedLibrary extends Trigger {
return true; return true;
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa, Map<AbilityKey, Object> runParams) { public final void setTriggeringObjects(final SpellAbility sa, Map<AbilityKey, Object> runParams) {

View File

@@ -73,7 +73,6 @@ public class TriggerSetInMotion extends Trigger {
return true; return true;
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa, Map<AbilityKey, Object> runParams) { public final void setTriggeringObjects(final SpellAbility sa, Map<AbilityKey, Object> runParams) {

View File

@@ -72,7 +72,6 @@ public class TriggerShuffled extends Trigger {
return true; return true;
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa, Map<AbilityKey, Object> runParams) { public final void setTriggeringObjects(final SpellAbility sa, Map<AbilityKey, Object> runParams) {

View File

@@ -279,7 +279,6 @@ public class TriggerSpellAbilityCastOrCopy extends Trigger {
return true; return true;
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa, Map<AbilityKey, Object> runParams) { public final void setTriggeringObjects(final SpellAbility sa, Map<AbilityKey, Object> runParams) {

View File

@@ -53,7 +53,6 @@ public class TriggerTaps extends Trigger {
* @param runParams*/ * @param runParams*/
@Override @Override
public final boolean performTest(final Map<AbilityKey, Object> runParams) { public final boolean performTest(final Map<AbilityKey, Object> runParams) {
if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) {
return false; return false;
} }
@@ -73,7 +72,6 @@ public class TriggerTaps extends Trigger {
return true; return true;
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa, Map<AbilityKey, Object> runParams) { public final void setTriggeringObjects(final SpellAbility sa, Map<AbilityKey, Object> runParams) {

View File

@@ -56,8 +56,7 @@ public class TriggerTapsForMana extends Trigger {
/** {@inheritDoc} /** {@inheritDoc}
* @param runParams*/ * @param runParams*/
@Override @Override
public final boolean performTest(final Map<AbilityKey, Object> runParams) { public final boolean performTest(final Map<AbilityKey, Object> runParams) {
//Check for tapping //Check for tapping
if (!hasParam("NoTapCheck")) { if (!hasParam("NoTapCheck")) {
final SpellAbility manaAbility = (SpellAbility) runParams.get(AbilityKey.AbilityMana); final SpellAbility manaAbility = (SpellAbility) runParams.get(AbilityKey.AbilityMana);
@@ -94,7 +93,6 @@ public class TriggerTapsForMana extends Trigger {
return true; return true;
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public final void setTriggeringObjects(final SpellAbility sa, Map<AbilityKey, Object> runParams) { public final void setTriggeringObjects(final SpellAbility sa, Map<AbilityKey, Object> runParams) {

View File

@@ -65,5 +65,4 @@ public class TriggerTransformed extends Trigger {
return sb.toString(); return sb.toString();
} }
} }

View File

@@ -137,7 +137,6 @@ public enum TriggerType {
* @return * @return
*/ */
public static TriggerType smartValueOf(String value) { public static TriggerType smartValueOf(String value) {
final String valToCompate = value.trim(); final String valToCompate = value.trim();
for (final TriggerType v : TriggerType.values()) { for (final TriggerType v : TriggerType.values()) {
if (v.name().compareToIgnoreCase(valToCompate) == 0) { if (v.name().compareToIgnoreCase(valToCompate) == 0) {

View File

@@ -53,7 +53,6 @@ public class TriggerUnattach extends Trigger {
* @param runParams*/ * @param runParams*/
@Override @Override
public final boolean performTest(final Map<AbilityKey, Object> runParams) { public final boolean performTest(final Map<AbilityKey, Object> runParams) {
if (!matchesValidParam("ValidObject", runParams.get(AbilityKey.Object))) { if (!matchesValidParam("ValidObject", runParams.get(AbilityKey.Object))) {
return false; return false;
} }

View File

@@ -82,7 +82,6 @@ public class TriggerVote extends Trigger {
return sb.toString(); return sb.toString();
} }
private static FCollection<Player> getVoters(final Player player, private static FCollection<Player> getVoters(final Player player,
final ListMultimap<Object, Player> votes, final ListMultimap<Object, Player> votes,
final boolean isOpponent, final boolean votedOtherchoice) { final boolean isOpponent, final boolean votedOtherchoice) {

View File

@@ -3,6 +3,6 @@ ManaCost:3 B
Types:Creature Nightstalker Types:Creature Nightstalker
PT:2/2 PT:2/2
T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDiscards | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, defending player discards a card. T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDiscards | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, defending player discards a card.
SVar:TrigDiscards:DB$ Discard | Defined$ DefendingPlayer | NumCards$ 1 | Mode$ TgtChoose SVar:TrigDiscards:DB$ Discard | Defined$ TriggeredDefendingPlayer | NumCards$ 1 | Mode$ TgtChoose
SVar:Picture:http://serv4.tcgimages.eu/img/cards/Portal_Second_Age/abyssal_nightstalker.jpg SVar:Picture:http://serv4.tcgimages.eu/img/cards/Portal_Second_Age/abyssal_nightstalker.jpg
Oracle:Whenever Abyssal Nightstalker attacks and isn't blocked, defending player discards a card. Oracle:Whenever Abyssal Nightstalker attacks and isn't blocked, defending player discards a card.

View File

@@ -8,6 +8,6 @@ T:Mode$ ChangesZone | ValidCard$ Creature.Other+YouCtrl | Origin$ Any | Destinat
SVar:TrigEnergy:DB$ PutCounter | Defined$ You | CounterType$ ENERGY | CounterNum$ 1 SVar:TrigEnergy:DB$ PutCounter | Defined$ You | CounterType$ ENERGY | CounterNum$ 1
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME attacks, you may pay {E}{E}. If you do, put a +1/+1 counter on it and tap up to one target creature defending player controls. T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME attacks, you may pay {E}{E}. If you do, put a +1/+1 counter on it and tap up to one target creature defending player controls.
SVar:TrigPutCounter:AB$ PutCounter | Cost$ PayEnergy<2> | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBTap SVar:TrigPutCounter:AB$ PutCounter | Cost$ PayEnergy<2> | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBTap
SVar:DBTap:DB$Tap | ValidTgts$ Creature | TargetsWithDefinedController$ TriggeredDefendingPlayer | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target creature defending player controls SVar:DBTap:DB$ Tap | ValidTgts$ Creature | TargetsWithDefinedController$ TriggeredDefendingPlayer | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target creature defending player controls
SVar:Picture:http://www.wizards.com/global/images/magic/general/aetherstorm_roc.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/aetherstorm_roc.jpg
Oracle:Flying\nWhenever Aetherstorm Roc or another creature enters the battlefield under your control, you get {E} (an energy counter).\nWhenever Aetherstorm Roc attacks, you may pay {E}{E}. If you do, put a +1/+1 counter on it and tap up to one target creature defending player controls. Oracle:Flying\nWhenever Aetherstorm Roc or another creature enters the battlefield under your control, you get {E} (an energy counter).\nWhenever Aetherstorm Roc attacks, you may pay {E}{E}. If you do, put a +1/+1 counter on it and tap up to one target creature defending player controls.

View File

@@ -3,7 +3,7 @@ ManaCost:1 B B
Types:Creature Human Mercenary Types:Creature Human Mercenary
PT:2/2 PT:2/2
T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME becomes blocked, defending player discards a card. T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME becomes blocked, defending player discards a card.
SVar:TrigDiscard:DB$ Discard | Defined$ DefendingPlayer | NumCards$ 1 | Mode$ TgtChoose SVar:TrigDiscard:DB$ Discard | Defined$ TriggeredDefendingPlayer | NumCards$ 1 | Mode$ TgtChoose
SVar:HasAttackEffect:Blocked SVar:HasAttackEffect:Blocked
SVar:Picture:http://www.wizards.com/global/images/magic/general/alley_grifters.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/alley_grifters.jpg
Oracle:Whenever Alley Grifters becomes blocked, defending player discards a card. Oracle:Whenever Alley Grifters becomes blocked, defending player discards a card.

View File

@@ -3,7 +3,7 @@ ManaCost:2 B B
Types:Legendary Creature Elemental Shaman Types:Legendary Creature Elemental Shaman
PT:4/4 PT:4/4
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigDestroy | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, choose target creature that player controls. The player sacrifices that creature. T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigDestroy | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, choose target creature that player controls. The player sacrifices that creature.
SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.DefenderCtrl | Sacrifice$ True | TgtPrompt$ Select target creature defending player controls SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.ControlledBy TriggeredDefendingPlayer | Sacrifice$ True | TgtPrompt$ Select target creature defending player controls
SVar:MustBeBlocked:True SVar:MustBeBlocked:True
SVar:Picture:http://serv3.tcgimages.eu/img/cards/Eventide/ashling_the_extinguisher.jpg SVar:Picture:http://serv3.tcgimages.eu/img/cards/Eventide/ashling_the_extinguisher.jpg
Oracle:Whenever Ashling, the Extinguisher deals combat damage to a player, choose target creature that player controls. The player sacrifices that creature. Oracle:Whenever Ashling, the Extinguisher deals combat damage to a player, choose target creature that player controls. The player sacrifices that creature.

View File

@@ -4,7 +4,7 @@ Types:Creature Dragon
PT:6/6 PT:6/6
K:Flying K:Flying
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDamage | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, it deals that much damage to each creature that player controls. T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDamage | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, it deals that much damage to each creature that player controls.
SVar:TrigDamage:DB$ DamageAll | NumDmg$ X | ValidCards$ Creature.DefenderCtrl SVar:TrigDamage:DB$ DamageAll | NumDmg$ X | ValidCards$ Creature.ControlledBy TriggeredDefendingPlayer
SVar:X:TriggerCount$DamageAmount SVar:X:TriggerCount$DamageAmount
SVar:MustBeBlocked:True SVar:MustBeBlocked:True
SVar:Picture:http://www.wizards.com/global/images/magic/general/balefire_dragon.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/balefire_dragon.jpg

View File

@@ -3,7 +3,7 @@ ManaCost:7
Types:Creature Eldrazi Types:Creature Eldrazi
PT:7/5 PT:7/5
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ Whenever CARDNAME attacks, defending player exiles two permanents they control. T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ Whenever CARDNAME attacks, defending player exiles two permanents they control.
SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | DefinedPlayer$ DefendingPlayer | Mandatory$ True | ChangeType$ Permanent | ChangeNum$ 2 | Chooser$ DefendingPlayer | Hidden$ True SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | DefinedPlayer$ TriggeredDefendingPlayer | Mandatory$ True | ChangeType$ Permanent | ChangeNum$ 2 | Chooser$ DefendingPlayer | Hidden$ True
SVar:HasAttackEffect:TRUE SVar:HasAttackEffect:TRUE
SVar:Picture:http://www.wizards.com/global/images/magic/general/bane_of_bala_ged.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/bane_of_bala_ged.jpg
Oracle:Whenever Bane of Bala Ged attacks, defending player exiles two permanents they control. Oracle:Whenever Bane of Bala Ged attacks, defending player exiles two permanents they control.

View File

@@ -4,6 +4,6 @@ Types:Creature Phyrexian Human Cleric
PT:2/2 PT:2/2
K:Intimidate K:Intimidate
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDestroy | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may sacrifice it. If you do, destroy target creature that player controls. T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDestroy | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may sacrifice it. If you do, destroy target creature that player controls.
SVar:TrigDestroy:AB$ Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.DefenderCtrl | AITgts$ BetterThanSource | TgtPrompt$ Select target creature defending player controls SVar:TrigDestroy:AB$ Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.ControlledBy TriggeredDefendingPlayer | AITgts$ BetterThanSource | TgtPrompt$ Select target creature defending player controls
SVar:Picture:http://www.wizards.com/global/images/magic/general/blind_zealot.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/blind_zealot.jpg
Oracle:Intimidate (This creature can't be blocked except by artifact creatures and/or creatures that share a color with it.)\nWhenever Blind Zealot deals combat damage to a player, you may sacrifice it. If you do, destroy target creature that player controls. Oracle:Intimidate (This creature can't be blocked except by artifact creatures and/or creatures that share a color with it.)\nWhenever Blind Zealot deals combat damage to a player, you may sacrifice it. If you do, destroy target creature that player controls.

View File

@@ -4,6 +4,6 @@ Types:Creature Insect
PT:1/1 PT:1/1
K:Flying K:Flying
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigDestroy | CombatDamage$ True | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may destroy target artifact that player controls. T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigDestroy | CombatDamage$ True | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may destroy target artifact that player controls.
SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Artifact.DefenderCtrl | TgtPrompt$ Select an artifact your opponent controls. SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Artifact.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select an artifact your opponent controls.
SVar:Picture:http://www.wizards.com/global/images/magic/general/caustic_wasps.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/caustic_wasps.jpg
Oracle:Flying\nWhenever Caustic Wasps deals combat damage to a player, you may destroy target artifact that player controls. Oracle:Flying\nWhenever Caustic Wasps deals combat damage to a player, you may destroy target artifact that player controls.

View File

@@ -5,7 +5,7 @@ PT:2/3
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create two 1/1 black Insect creature tokens. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create two 1/1 black Insect creature tokens.
SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenScript$ b_1_1_insect | TokenOwner$ You SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenScript$ b_1_1_insect | TokenOwner$ You
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigCurse | TriggerDescription$ Whenever CARDNAME attacks, you may sacrifice an Insect. When you do, curse defending player. (Create a black Aura Curse enchantment token that's attached to that player. It has enchant player and "At the beginning of your upkeep, you lose 1 life.") T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigCurse | TriggerDescription$ Whenever CARDNAME attacks, you may sacrifice an Insect. When you do, curse defending player. (Create a black Aura Curse enchantment token that's attached to that player. It has enchant player and "At the beginning of your upkeep, you lose 1 life.")
SVar:TrigCurse:AB$ Token | Cost$ Sac<1/Insect> | TokenAmount$ 1 | TokenScript$ b_aura_curse_life | TokenOwner$ You | AttachedTo$ DefendingPlayer SVar:TrigCurse:AB$ Token | Cost$ Sac<1/Insect> | TokenAmount$ 1 | TokenScript$ b_aura_curse_life | TokenOwner$ You | AttachedTo$ TriggeredDefendingPlayer
SVar:HasAttackEffect:TRUE SVar:HasAttackEffect:TRUE
DeckHas:Ability$Token DeckHas:Ability$Token
Oracle:When Celestine Cave Witch enters the battlefield, create two 1/1 black Insect creature tokens.\nWhenever Celestine Cave Witch attacks, you may sacrifice an Insect. When you do, curse defending player. (Create a black Aura Curse enchantment token that's attached to that player. It has enchant player and "At the beginning of your upkeep, you lose 1 life.") Oracle:When Celestine Cave Witch enters the battlefield, create two 1/1 black Insect creature tokens.\nWhenever Celestine Cave Witch attacks, you may sacrifice an Insect. When you do, curse defending player. (Create a black Aura Curse enchantment token that's attached to that player. It has enchant player and "At the beginning of your upkeep, you lose 1 life.")

View File

@@ -3,7 +3,7 @@ ManaCost:1 U U
Types:Creature Cephalid Wizard Types:Creature Cephalid Wizard
PT:1/1 PT:1/1
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigBounce | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, return up to that many target permanents that player controls to their owner's hand. T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigBounce | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, return up to that many target permanents that player controls to their owner's hand.
SVar:TrigBounce:DB$ ChangeZone | ValidTgts$ Permanent.DefenderCtrl | TgtPrompt$ Select target permanent | TargetMin$ 0 | TargetMax$ X | Origin$ Battlefield | Destination$ Hand SVar:TrigBounce:DB$ ChangeZone | ValidTgts$ Permanent.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target permanent | TargetMin$ 0 | TargetMax$ X | Origin$ Battlefield | Destination$ Hand
SVar:X:TriggeredSource$CardPower SVar:X:TriggeredSource$CardPower
SVar:Picture:http://www.wizards.com/global/images/magic/general/cephalid_constable.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/cephalid_constable.jpg
Oracle:Whenever Cephalid Constable deals combat damage to a player, return up to that many target permanents that player controls to their owner's hand. Oracle:Whenever Cephalid Constable deals combat damage to a player, return up to that many target permanents that player controls to their owner's hand.

View File

@@ -3,7 +3,7 @@ ManaCost:2 R
Types:Instant Types:Instant
A:SP$ Animate | Cost$ 2 R | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | Triggers$ TrigDamage | sVars$ Damage,CommandoRaidX | SpellDescription$ Until end of turn, target creature you control gains "When this creature deals combat damage to a player, you may have it deal damage equal to its power to target creature that player controls." A:SP$ Animate | Cost$ 2 R | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | Triggers$ TrigDamage | sVars$ Damage,CommandoRaidX | SpellDescription$ Until end of turn, target creature you control gains "When this creature deals combat damage to a player, you may have it deal damage equal to its power to target creature that player controls."
SVar:TrigDamage:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ Damage | OptionalDecider$ You | TriggerDescription$ When this creature deals combat damage to a player, you may have it deal damage equal to its power to target creature that player controls. SVar:TrigDamage:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ Damage | OptionalDecider$ You | TriggerDescription$ When this creature deals combat damage to a player, you may have it deal damage equal to its power to target creature that player controls.
SVar:Damage:DB$ DealDamage | ValidTgts$ Creature.DefenderCtrl | TgtPrompt$ Select target creature defending player controls | NumDmg$ CommandoRaidX SVar:Damage:DB$ DealDamage | ValidTgts$ Creature.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target creature defending player controls | NumDmg$ CommandoRaidX
SVar:CommandoRaidX:Count$CardPower SVar:CommandoRaidX:Count$CardPower
SVar:Picture:http://www.wizards.com/global/images/magic/general/commando_raid.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/commando_raid.jpg
Oracle:Until end of turn, target creature you control gains "When this creature deals combat damage to a player, you may have it deal damage equal to its power to target creature that player controls." Oracle:Until end of turn, target creature you control gains "When this creature deals combat damage to a player, you may have it deal damage equal to its power to target creature that player controls."

View File

@@ -3,7 +3,7 @@ ManaCost:1 U
Types:Creature Merfolk Soldier Types:Creature Merfolk Soldier
PT:1/1 PT:1/1
T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, look at the top card of defending player's library. You may put that card on the bottom of that player's library. T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, look at the top card of defending player's library. You may put that card on the bottom of that player's library.
SVar:TrigDig:DB$ Dig | Defined$ DefendingPlayer | DigNum$ 1 | AnyNumber$ True | DestinationZone$ Library | LibraryPosition2$ 0 SVar:TrigDig:DB$ Dig | Defined$ TriggeredDefendingPlayer | DigNum$ 1 | AnyNumber$ True | DestinationZone$ Library | LibraryPosition2$ 0
AI:RemoveDeck:All AI:RemoveDeck:All
SVar:Picture:http://www.wizards.com/global/images/magic/general/coral_fighters.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/coral_fighters.jpg
Oracle:Whenever Coral Fighters attacks and isn't blocked, look at the top card of defending player's library. You may put that card on the bottom of that player's library. Oracle:Whenever Coral Fighters attacks and isn't blocked, look at the top card of defending player's library. You may put that card on the bottom of that player's library.

View File

@@ -4,6 +4,6 @@ Types:Creature Human Minion
PT:3/1 PT:3/1
A:AB$ Regenerate | Cost$ 2 B | SpellDescription$ Regenerate CARDNAME. A:AB$ Regenerate | Cost$ 2 B | SpellDescription$ Regenerate CARDNAME.
T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME becomes blocked, defending player discards a card at random. T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME becomes blocked, defending player discards a card at random.
SVar:TrigDiscard:DB$Discard | Defined$ DefendingPlayer | NumCards$ 1 | Mode$ Random SVar:TrigDiscard:DB$Discard | Defined$ TriggeredDefendingPlayer | NumCards$ 1 | Mode$ Random
SVar:Picture:http://www.wizards.com/global/images/magic/general/corrupt_official.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/corrupt_official.jpg
Oracle:{2}{B}: Regenerate Corrupt Official.\nWhenever Corrupt Official becomes blocked, defending player discards a card at random. Oracle:{2}{B}: Regenerate Corrupt Official.\nWhenever Corrupt Official becomes blocked, defending player discards a card at random.

View File

@@ -4,6 +4,6 @@ Types:Creature Bird
PT:3/4 PT:3/4
K:Flying K:Flying
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigGoad | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME attacks, you may goad target creature defending player controls. (Until your next turn, that creature attacks each combat if able and attacks a player other than you if able.) T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigGoad | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME attacks, you may goad target creature defending player controls. (Until your next turn, that creature attacks each combat if able and attacks a player other than you if able.)
SVar:TrigGoad:DB$ Goad | ValidTgts$ Creature.DefenderCtrl | TgtPrompt$ Select target creature defending player controls. SVar:TrigGoad:DB$ Goad | ValidTgts$ Creature.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target creature defending player controls.
SVar:Picture:http://www.wizards.com/global/images/magic/general/coveted_peacock.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/coveted_peacock.jpg
Oracle:Flying\nWhenever Coveted Peacock attacks, you may goad target creature defending player controls. (Until your next turn, that creature attacks each combat if able and attacks a player other than you if able.) Oracle:Flying\nWhenever Coveted Peacock attacks, you may goad target creature defending player controls. (Until your next turn, that creature attacks each combat if able and attacks a player other than you if able.)

View File

@@ -3,5 +3,5 @@ ManaCost:3 G G
Types:Creature Boar Types:Creature Boar
PT:4/4 PT:4/4
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ DBMustBlock | TriggerDescription$ Whenever CARDNAME attacks, defending player chooses an untapped creature they control. That creature blocks CARDNAME this turn if able. T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ DBMustBlock | TriggerDescription$ Whenever CARDNAME attacks, defending player chooses an untapped creature they control. That creature blocks CARDNAME this turn if able.
SVar:DBMustBlock:DB$ MustBlock | Choices$ Creature.untapped+DefenderCtrl | Chooser$ DefendingPlayer SVar:DBMustBlock:DB$ MustBlock | Choices$ Creature.untapped+DefenderCtrl | Chooser$ TriggeredDefendingPlayer
Oracle:Whenever Crashing Boars attacks, defending player chooses an untapped creature they control. That creature blocks Crashing Boars this turn if able. Oracle:Whenever Crashing Boars attacks, defending player chooses an untapped creature they control. That creature blocks Crashing Boars this turn if able.

View File

@@ -3,6 +3,6 @@ ManaCost:3 B
Types:Creature Snake Types:Creature Snake
PT:3/3 PT:3/3
T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPoison | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, defending player gets a poison counter. (A player with ten or more poison counters loses the game.) T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPoison | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, defending player gets a poison counter. (A player with ten or more poison counters loses the game.)
SVar:TrigPoison:DB$Poison | Defined$ DefendingPlayer | Num$ 1 SVar:TrigPoison:DB$Poison | Defined$ TriggeredDefendingPlayer | Num$ 1
SVar:Picture:http://www.wizards.com/global/images/magic/general/crypt_cobra.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/crypt_cobra.jpg
Oracle:Whenever Crypt Cobra attacks and isn't blocked, defending player gets a poison counter. (A player with ten or more poison counters loses the game.) Oracle:Whenever Crypt Cobra attacks and isn't blocked, defending player gets a poison counter. (A player with ten or more poison counters loses the game.)

View File

@@ -3,8 +3,8 @@ ManaCost:1 R R R
Types:Creature Cyclops Warrior Types:Creature Cyclops Warrior
PT:4/4 PT:4/4
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigExchangeDamage | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME attacks, you may have it deal damage equal to its power to target creature defending player controls. If you do, that creature deals damage equal to its power to CARDNAME. T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigExchangeDamage | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME attacks, you may have it deal damage equal to its power to target creature defending player controls. If you do, that creature deals damage equal to its power to CARDNAME.
SVar:TrigExchangeDamage:DB$DealDamage | ValidTgts$ Creature.DefenderCtrl | TgtPrompt$ Select target creature defending player controls. | NumDmg$ MyX | SubAbility$ ReturnDmg SVar:TrigExchangeDamage:DB$DealDamage | ValidTgts$ Creature.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target creature defending player controls. | NumDmg$ MyX | SubAbility$ ReturnDmg
SVar:ReturnDmg:DB$DealDamage | DamageSource$ Targeted | NumDmg$ TheirX SVar:ReturnDmg:DB$ DealDamage | DamageSource$ Targeted | NumDmg$ TheirX
SVar:MyX:Count$CardPower SVar:MyX:Count$CardPower
SVar:TheirX:Targeted$CardPower SVar:TheirX:Targeted$CardPower
SVar:Picture:http://www.wizards.com/global/images/magic/general/cyclops_gladiator.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/cyclops_gladiator.jpg

View File

@@ -4,6 +4,6 @@ Types:Creature Dauthi Minion
PT:2/1 PT:2/1
K:Shadow K:Shadow
T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, you may sacrifice it. If you do, defending player discards three cards. T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, you may sacrifice it. If you do, defending player discards three cards.
SVar:TrigDiscard:AB$Discard | Cost$ Sac<1/CARDNAME> | Defined$ DefendingPlayer | NumCards$ 3 | AILogic$ AtLeast2 | Mode$ TgtChoose SVar:TrigDiscard:AB$Discard | Cost$ Sac<1/CARDNAME> | Defined$ TriggeredDefendingPlayer | NumCards$ 3 | AILogic$ AtLeast2 | Mode$ TgtChoose
SVar:Picture:http://www.wizards.com/global/images/magic/general/dauthi_mindripper.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/dauthi_mindripper.jpg
Oracle:Shadow (This creature can block or be blocked by only creatures with shadow.)\nWhenever Dauthi Mindripper attacks and isn't blocked, you may sacrifice it. If you do, defending player discards three cards. Oracle:Shadow (This creature can block or be blocked by only creatures with shadow.)\nWhenever Dauthi Mindripper attacks and isn't blocked, you may sacrifice it. If you do, defending player discards three cards.

View File

@@ -4,6 +4,6 @@ Types:Creature Human Cleric
PT:2/2 PT:2/2
K:Morph:1 W K:Morph:1 W
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigDestroy | CombatDamage$ True | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may destroy target enchantment that player controls. T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigDestroy | CombatDamage$ True | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may destroy target enchantment that player controls.
SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Enchantment.DefenderCtrl | TgtPrompt$ Select an enchantment your opponent controls. SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Enchantment.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select an enchantment your opponent controls.
SVar:Picture:http://www.wizards.com/global/images/magic/general/dawning_purist.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/dawning_purist.jpg
Oracle:Whenever Dawning Purist deals combat damage to a player, you may destroy target enchantment that player controls.\nMorph {1}{W} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) Oracle:Whenever Dawning Purist deals combat damage to a player, you may destroy target enchantment that player controls.\nMorph {1}{W} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.)

View File

@@ -4,7 +4,7 @@ Types:Legendary Creature Vampire Cleric
PT:4/4 PT:4/4
K:Flying K:Flying
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigChoose | TriggerDescription$ Whenever CARDNAME attacks, defending player chooses a nonlegendary creature card in your graveyard. You return that card to the battlefield with an additional +1/+1 counter on it. The creature is a Vampire in addition to its other types. T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigChoose | TriggerDescription$ Whenever CARDNAME attacks, defending player chooses a nonlegendary creature card in your graveyard. You return that card to the battlefield with an additional +1/+1 counter on it. The creature is a Vampire in addition to its other types.
SVar:TrigChoose:DB$ ChooseCard | Defined$ DefendingPlayer | Choices$ Creature.YouOwn+nonLegendary | Mandatory$ True | ChoiceZone$ Graveyard | AILogic$ WorstCard | RememberChosen$ True | SubAbility$ DBChangeZone SVar:TrigChoose:DB$ ChooseCard | Defined$ TriggeredDefendingPlayer | Choices$ Creature.YouOwn+nonLegendary | Mandatory$ True | ChoiceZone$ Graveyard | AILogic$ WorstCard | RememberChosen$ True | SubAbility$ DBChangeZone
SVar:DBChangeZone:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Graveyard | Destination$ Battlefield | WithCounters$ P1P1_1 | SubAbility$ DBAnimate SVar:DBChangeZone:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Graveyard | Destination$ Battlefield | WithCounters$ P1P1_1 | SubAbility$ DBAnimate
SVar:DBAnimate:DB$ Animate | Defined$ ChosenCard | Types$ Vampire | Duration$ Permanent SVar:DBAnimate:DB$ Animate | Defined$ ChosenCard | Types$ Vampire | Duration$ Permanent
DeckHas:Ability$Graveyard & Ability$Counters DeckHas:Ability$Graveyard & Ability$Counters

View File

@@ -4,7 +4,7 @@ Types:Creature Spirit
PT:2/1 PT:2/1
K:Flying K:Flying
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigLoseLife | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player loses 1 life for each artifact they control. T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigLoseLife | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player loses 1 life for each artifact they control.
SVar:TrigLoseLife:DB$LoseLife | Defined$ TriggeredTarget | LifeAmount$ X SVar:TrigLoseLife:DB$ LoseLife | Defined$ TriggeredTarget | LifeAmount$ X
SVar:X:Count$Valid Artifact.DefenderCtrl SVar:X:Count$Valid Artifact.ControlledBy TriggeredDefendingPlayer
SVar:Picture:http://www.wizards.com/global/images/magic/general/emissary_of_despair.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/emissary_of_despair.jpg
Oracle:Flying\nWhenever Emissary of Despair deals combat damage to a player, that player loses 1 life for each artifact they control. Oracle:Flying\nWhenever Emissary of Despair deals combat damage to a player, that player loses 1 life for each artifact they control.

View File

@@ -5,6 +5,6 @@ PT:2/1
K:Flying K:Flying
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigLoseLife | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you gain 1 life for each artifact that player controls. T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigLoseLife | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you gain 1 life for each artifact that player controls.
SVar:TrigLoseLife:DB$ GainLife | Defined$ You | LifeAmount$ X SVar:TrigLoseLife:DB$ GainLife | Defined$ You | LifeAmount$ X
SVar:X:Count$Valid Artifact.DefenderCtrl SVar:X:Count$Valid Artifact.ControlledBy TriggeredDefendingPlayer
SVar:Picture:http://www.wizards.com/global/images/magic/general/emissary_of_hope.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/emissary_of_hope.jpg
Oracle:Flying\nWhenever Emissary of Hope deals combat damage to a player, you gain 1 life for each artifact that player controls. Oracle:Flying\nWhenever Emissary of Hope deals combat damage to a player, you gain 1 life for each artifact that player controls.

View File

@@ -3,7 +3,7 @@ ManaCost:2 G G
Types:Creature Beast Types:Creature Beast
PT:4/4 PT:4/4
T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME attacks, put a +1/+1 counter on target creature of defending player's choice. T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME attacks, put a +1/+1 counter on target creature of defending player's choice.
SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | TargetingPlayer$ DefendingPlayer SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | TargetingPlayer$ TriggeredDefendingPlayer
AI:RemoveDeck:Random AI:RemoveDeck:Random
SVar:Picture:http://www.wizards.com/global/images/magic/general/erithizon.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/erithizon.jpg
Oracle:Whenever Erithizon attacks, put a +1/+1 counter on target creature of defending player's choice. Oracle:Whenever Erithizon attacks, put a +1/+1 counter on target creature of defending player's choice.

View File

@@ -4,10 +4,10 @@ Types:Legendary Creature Vampire Assassin
PT:3/5 PT:3/5
K:Unblockable K:Unblockable
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigExile | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, exile target creature that player controls and put a hit counter on that card. That player loses the game if they own three or more exiled card with counters on them. CARDNAME's owner shuffles CARDNAME into their library. T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigExile | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, exile target creature that player controls and put a hit counter on that card. That player loses the game if they own three or more exiled card with counters on them. CARDNAME's owner shuffles CARDNAME into their library.
SVar:TrigExile:DB$ ChangeZone | ValidTgts$ Creature.DefenderCtrl | TgtPrompt$ Exile target creature that player controls | Origin$ Battlefield | Destination$ Exile | RememberTargets$ True | SubAbility$ PutCounter SVar:TrigExile:DB$ ChangeZone | ValidTgts$ Creature.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Exile target creature that player controls | Origin$ Battlefield | Destination$ Exile | RememberTargets$ True | SubAbility$ PutCounter
SVar:PutCounter:DB$ PutCounter | Defined$ Remembered | CounterType$ HIT | CounterNum$ 1 | SubAbility$ DBCleanup SVar:PutCounter:DB$ PutCounter | Defined$ Remembered | CounterType$ HIT | CounterNum$ 1 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBLose SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBLose
SVar:DBLose:DB$ LosesGame | Defined$ TriggeredTarget | ConditionCheckSVar$ CheckExile | ConditionSVarCompare$ GE3 | SubAbility$ DBShuffle SVar:DBLose:DB$ LosesGame | Defined$ TriggeredTarget | ConditionCheckSVar$ CheckExile | ConditionSVarCompare$ GE3 | SubAbility$ DBShuffle
SVar:CheckExile:Count$ValidExile Card.DefendingPlayerCtrl+counters_GE1_HIT SVar:CheckExile:Count$ValidExile Card.counters_GE1_HIT+ControlledBy TriggeredDefendingPlayer
SVar:DBShuffle:DB$ ChangeZone | ConditionPresent$ Card.Self | ConditionCompare$ GE1 | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Library | Shuffle$ True SVar:DBShuffle:DB$ ChangeZone | ConditionPresent$ Card.Self | ConditionCompare$ GE1 | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Library | Shuffle$ True
Oracle:Etrata, the Silencer can't be blocked.\nWhenever Etrata deals combat damage to a player, exile target creature that player controls and put a hit counter on that card. That player loses the game if they own three or more exiled cards with hit counters on them. Etrata's owner shuffles Etrata into their library. Oracle:Etrata, the Silencer can't be blocked.\nWhenever Etrata deals combat damage to a player, exile target creature that player controls and put a hit counter on that card. That player loses the game if they own three or more exiled cards with hit counters on them. Etrata's owner shuffles Etrata into their library.

View File

@@ -3,7 +3,7 @@ ManaCost:3 W
Types:Creature Human Soldier Types:Creature Human Soldier
PT:3/2 PT:3/2
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigTap | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, tap target creature defending player controls. T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigTap | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, tap target creature defending player controls.
SVar:TrigTap:DB$Tap | ValidTgts$ Creature.DefenderCtrl | TgtPrompt$ Select target creature defending player controls SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target creature defending player controls
SVar:HasAttackEffect:TRUE SVar:HasAttackEffect:TRUE
SVar:Picture:http://www.wizards.com/global/images/magic/general/fiend_binder.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/fiend_binder.jpg
Oracle:Whenever Fiend Binder attacks, tap target creature defending player controls. Oracle:Whenever Fiend Binder attacks, tap target creature defending player controls.

Some files were not shown because too many files have changed in this diff Show More