diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersMoveEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersMoveEffect.java index cea93674399..2522abf8853 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersMoveEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersMoveEffect.java @@ -100,6 +100,7 @@ public class CountersMoveEffect extends SpellAbilityEffect { // Test to see if the card we're trying to add is in the expected state return; } + dest = cur; int csum = 0; @@ -194,15 +195,15 @@ public class CountersMoveEffect extends SpellAbilityEffect { Map params = Maps.newHashMap(); params.put("CounterType", cType); params.put("Source", source); - params.put("Target", dest); + params.put("Target", cur); StringBuilder sb = new StringBuilder(); - sb.append("Put how many ").append(cType.getName()).append(" counters on ").append(dest).append("?"); + sb.append("Put how many ").append(cType.getName()).append(" counters on ").append(cur).append("?"); int cnum = player.getController().chooseNumber(sa, sb.toString(), 0, source.getCounters(cType), params); if (cnum > 0) { source.subtractCounter(cType, cnum); - dest.addCounter(cType, cnum, player, true); - game.updateLastStateForCard(dest); + cur.addCounter(cType, cnum, player, true); + game.updateLastStateForCard(cur); updateSource = true; } } @@ -245,7 +246,7 @@ public class CountersMoveEffect extends SpellAbilityEffect { } if (!"Any".matches(counterName)) { - if (!dest.canReceiveCounters(cType)) { + if (!cur.canReceiveCounters(cType)) { continue; } @@ -253,7 +254,7 @@ public class CountersMoveEffect extends SpellAbilityEffect { Map params = Maps.newHashMap(); params.put("CounterType", cType); params.put("Source", source); - params.put("Target", dest); + params.put("Target", cur); StringBuilder sb = new StringBuilder(); sb.append("Take how many ").append(cType.getName()); sb.append(" counters from ").append(source).append("?"); @@ -262,8 +263,8 @@ public class CountersMoveEffect extends SpellAbilityEffect { if (source.getCounters(cType) >= cntToMove) { source.subtractCounter(cType, cntToMove); - dest.addCounter(cType, cntToMove, player, true); - game.updateLastStateForCard(dest); + cur.addCounter(cType, cntToMove, player, true); + game.updateLastStateForCard(cur); } } else { // any counterType currently only Leech Bonder diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java index 6c05b77a7a5..61eb5e73201 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java @@ -135,9 +135,10 @@ public class CountersPutEffect extends SpellAbilityEffect { for (final GameObject obj : tgtObjects) { // check if the object is still in game or if it was moved + Card gameCard = null; if (obj instanceof Card) { Card tgtCard = (Card) obj; - Card gameCard = game.getCardState(tgtCard, null); + gameCard = game.getCardState(tgtCard, null); // gameCard is LKI in that case, the card is not in game anymore // or the timestamp did change // this should check Self too @@ -164,7 +165,7 @@ public class CountersPutEffect extends SpellAbilityEffect { ((Player) obj).addCounter(ct, counterAmount, placer, true); } if (obj instanceof Card) { - ((Card) obj).addCounter(ct, counterAmount, placer, true); + gameCard.addCounter(ct, counterAmount, placer, true); } } continue; @@ -185,7 +186,7 @@ public class CountersPutEffect extends SpellAbilityEffect { } if (obj instanceof Card) { - Card tgtCard = (Card) obj; + Card tgtCard = gameCard; counterAmount = sa.usesTargeting() && sa.hasParam("DividedAsYouChoose") ? sa.getTargetRestrictions().getDividedValue(tgtCard) : counterAmount; if (!sa.usesTargeting() || tgtCard.canBeTargetedBy(sa)) { if (max != -1) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersPutOrRemoveEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersPutOrRemoveEffect.java index 979e383ab54..8a45a41f78d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersPutOrRemoveEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersPutOrRemoveEffect.java @@ -65,16 +65,16 @@ public class CountersPutOrRemoveEffect extends SpellAbilityEffect { if (gameCard == null || !tgtCard.equalsWithTimestamp(gameCard)) { continue; } - if (!sa.usesTargeting() || tgtCard.canBeTargetedBy(sa)) { - if (tgtCard.hasCounters()) { + if (!sa.usesTargeting() || gameCard.canBeTargetedBy(sa)) { + if (gameCard.hasCounters()) { if (sa.hasParam("EachExistingCounter")) { - for (CounterType listType : Lists.newArrayList(tgtCard.getCounters().keySet())) { - addOrRemoveCounter(sa, tgtCard, listType, counterAmount); + for (CounterType listType : Lists.newArrayList(gameCard.getCounters().keySet())) { + addOrRemoveCounter(sa, gameCard, listType, counterAmount); } } else { - addOrRemoveCounter(sa, tgtCard, ctype, counterAmount); + addOrRemoveCounter(sa, gameCard, ctype, counterAmount); } - game.updateLastStateForCard(tgtCard); + game.updateLastStateForCard(gameCard); } } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java index 1b6f684af87..4d73671c8ef 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java @@ -115,27 +115,27 @@ public class CountersRemoveEffect extends SpellAbilityEffect { if (gameCard == null || !tgtCard.equalsWithTimestamp(gameCard)) { continue; } - if (!sa.usesTargeting() || tgtCard.canBeTargetedBy(sa)) { + if (!sa.usesTargeting() || gameCard.canBeTargetedBy(sa)) { final Zone zone = game.getZoneOf(gameCard); if (type.equals("All")) { - for (Map.Entry e : tgtCard.getCounters().entrySet()) { - tgtCard.subtractCounter(e.getKey(), e.getValue()); + for (Map.Entry e : gameCard.getCounters().entrySet()) { + gameCard.subtractCounter(e.getKey(), e.getValue()); } - game.updateLastStateForCard(tgtCard); + game.updateLastStateForCard(gameCard); continue; } else if (num.equals("All")) { - cntToRemove = tgtCard.getCounters(counterType); + cntToRemove = gameCard.getCounters(counterType); } else if (sa.getParam("CounterNum").equals("Remembered")) { - cntToRemove = tgtCard.getCountersAddedBy(card, counterType); + cntToRemove = gameCard.getCountersAddedBy(card, counterType); } PlayerController pc = sa.getActivatingPlayer().getController(); if (type.equals("Any")) { - while (cntToRemove > 0 && tgtCard.hasCounters()) { - final Map tgtCounters = tgtCard.getCounters(); + while (cntToRemove > 0 && gameCard.hasCounters()) { + final Map tgtCounters = gameCard.getCounters(); Map params = Maps.newHashMap(); - params.put("Target", tgtCard); + params.put("Target", gameCard); String prompt = "Select type of counters to remove"; CounterType chosenType = pc.chooseCounterType( @@ -143,13 +143,13 @@ public class CountersRemoveEffect extends SpellAbilityEffect { prompt = "Select the number of " + chosenType.getName() + " counters to remove"; int max = Math.min(cntToRemove, tgtCounters.get(chosenType)); params = Maps.newHashMap(); - params.put("Target", tgtCard); + params.put("Target", gameCard); params.put("CounterType", chosenType); int chosenAmount = pc.chooseNumber(sa, prompt, 1, max, params); if (chosenAmount > 0) { - tgtCard.subtractCounter(chosenType, chosenAmount); - game.updateLastStateForCard(tgtCard); + gameCard.subtractCounter(chosenType, chosenAmount); + game.updateLastStateForCard(gameCard); if (rememberRemoved) { for (int i = 0; i < chosenAmount; i++) { card.addRemembered(Pair.of(chosenType, i)); @@ -159,12 +159,12 @@ public class CountersRemoveEffect extends SpellAbilityEffect { } } } else { - cntToRemove = Math.min(cntToRemove, tgtCard.getCounters(counterType)); + cntToRemove = Math.min(cntToRemove, gameCard.getCounters(counterType)); if (zone.is(ZoneType.Battlefield) || zone.is(ZoneType.Exile)) { if (sa.hasParam("UpTo")) { Map params = Maps.newHashMap(); - params.put("Target", tgtCard); + params.put("Target", gameCard); params.put("CounterType", type); String title = "Select the number of " + type + " counters to remove"; cntToRemove = pc.chooseNumber(sa, title, 0, cntToRemove, params); @@ -172,13 +172,13 @@ public class CountersRemoveEffect extends SpellAbilityEffect { } if (cntToRemove > 0) { - tgtCard.subtractCounter(counterType, cntToRemove); + gameCard.subtractCounter(counterType, cntToRemove); if (rememberRemoved) { for (int i = 0; i < cntToRemove; i++) { card.addRemembered(Pair.of(counterType, i)); } } - game.updateLastStateForCard(tgtCard); + game.updateLastStateForCard(gameCard); } } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java index a7ef697d62c..9f3e2df9ef7 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java @@ -1,6 +1,8 @@ package forge.game.ability.effects; import com.google.common.collect.Iterables; + +import forge.game.Game; import forge.game.GameObject; import forge.game.ability.AbilityUtils; import forge.game.card.Card; @@ -68,6 +70,7 @@ public class DamageDealEffect extends DamageBaseEffect { @Override public void resolve(SpellAbility sa) { final Card hostCard = sa.getHostCard(); + final Game game = hostCard.getGame(); final String damage = sa.getParam("NumDmg"); int dmg = AbilityUtils.calculateAmount(hostCard, damage, sa); @@ -176,7 +179,12 @@ public class DamageDealEffect extends DamageBaseEffect { dmg = (sa.usesTargeting() && sa.hasParam("DividedAsYouChoose")) ? sa.getTargetRestrictions().getDividedValue(o) : dmg; if (o instanceof Card) { final Card c = (Card) o; - if (c.isInPlay() && (!targeted || c.canBeTargetedBy(sa))) { + final Card gc = game.getCardState(c, null); + if (gc == null || !c.equalsWithTimestamp(gc) || !gc.isInPlay()) { + // timestamp different or not in play + continue; + } + if (!targeted || c.canBeTargetedBy(sa)) { if (removeDamage) { c.setDamage(0); c.setHasBeenDealtDeathtouchDamage(false); diff --git a/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java b/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java index 11ee48dc6cc..998cbf27220 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java @@ -86,7 +86,7 @@ public class FightEffect extends DamageBaseEffect { defined.addAll(AbilityUtils.getDefinedCards(host, sa.getParam("ExtraDefined"), sa)); } - List remove = Lists.newArrayList(); + List newDefined = Lists.newArrayList(); for (final Card d : defined) { final Card g = game.getCardState(d, null); // 701.12b If a creature instructed to fight is no longer on the battlefield or is no longer a creature, @@ -94,10 +94,12 @@ public class FightEffect extends DamageBaseEffect { // for a resolving spell or ability that instructs it to fight, no damage is dealt. if (g == null || !g.equalsWithTimestamp(d) || !d.isInPlay() || !d.isCreature()) { // Test to see if the card we're trying to add is in the expected state - remove.add(d); + continue; } + newDefined.add(g); } - defined.removeAll(remove); + // replace with new List using CardState + defined = newDefined; if (!defined.isEmpty()) { if (defined.size() > 1 && fighter1 == null) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java index f59418910ea..b954cc7cdfc 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java @@ -12,7 +12,6 @@ import forge.game.event.GameEventCardStatsChanged; import forge.game.keyword.KeywordInterface; import forge.game.player.Player; import forge.game.spellability.SpellAbility; -import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; import forge.util.Aggregates; import forge.util.Lang; @@ -31,32 +30,40 @@ public class PumpEffect extends SpellAbilityEffect { final int a, final int d, final List keywords, final long timestamp) { final Card host = sa.getHostCard(); + final Game game = host.getGame(); //if host is not on the battlefield don't apply // Suspend should does Affect the Stack if (sa.hasParam("UntilLoseControlOfHost") && !(host.isInPlay() || host.isInZone(ZoneType.Stack))) { return; } - final Game game = sa.getActivatingPlayer().getGame(); + + // do Game Check there in case of LKI + final Card gameCard = game.getCardState(applyTo, null); + if (gameCard == null || !applyTo.equalsWithTimestamp(gameCard)) { + return; + } final List kws = Lists.newArrayList(); boolean redrawPT = false; for (String kw : keywords) { if (kw.startsWith("HIDDEN")) { - applyTo.addHiddenExtrinsicKeyword(kw); + gameCard.addHiddenExtrinsicKeyword(kw); redrawPT |= kw.contains("CARDNAME's power and toughness are switched"); } else { kws.add(kw); } } - applyTo.addTempPowerBoost(a); - applyTo.addTempToughnessBoost(d); - applyTo.addChangedCardKeywords(kws, Lists.newArrayList(), false, false, timestamp); - if (redrawPT) { applyTo.updatePowerToughnessForView(); } + gameCard.addTempPowerBoost(a); + gameCard.addTempToughnessBoost(d); + gameCard.addChangedCardKeywords(kws, Lists.newArrayList(), false, false, timestamp); + if (redrawPT) { + gameCard.updatePowerToughnessForView(); + } if (sa.hasParam("LeaveBattlefield")) { - addLeaveBattlefieldReplacement(applyTo, sa, sa.getParam("LeaveBattlefield")); + addLeaveBattlefieldReplacement(gameCard, sa, sa.getParam("LeaveBattlefield")); } if (!sa.hasParam("Permanent")) { @@ -66,8 +73,8 @@ public class PumpEffect extends SpellAbilityEffect { @Override public void run() { - applyTo.addTempPowerBoost(-1 * a); - applyTo.addTempToughnessBoost(-1 * d); + gameCard.addTempPowerBoost(-1 * a); + gameCard.addTempToughnessBoost(-1 * d); if (keywords.size() > 0) { boolean redrawPT = false; @@ -75,16 +82,16 @@ public class PumpEffect extends SpellAbilityEffect { for (String kw : keywords) { redrawPT |= kw.contains("CARDNAME's power and toughness are switched"); if (kw.startsWith("HIDDEN")) { - applyTo.removeHiddenExtrinsicKeyword(kw); + gameCard.removeHiddenExtrinsicKeyword(kw); if (redrawPT) { - applyTo.updatePowerToughnessForView(); + gameCard.updatePowerToughnessForView(); } } } - applyTo.removeChangedCardKeywords(timestamp); + gameCard.removeChangedCardKeywords(timestamp); } - game.fireEvent(new GameEventCardStatsChanged(applyTo)); + game.fireEvent(new GameEventCardStatsChanged(gameCard)); } }; if (sa.hasParam("UntilEndOfCombat")) { @@ -107,7 +114,7 @@ public class PumpEffect extends SpellAbilityEffect { game.getEndOfTurn().addUntil(untilEOT); } } - game.fireEvent(new GameEventCardStatsChanged(applyTo)); + game.fireEvent(new GameEventCardStatsChanged(gameCard)); } private static void applyPump(final SpellAbility sa, final Player p, @@ -218,7 +225,6 @@ public class PumpEffect extends SpellAbilityEffect { public void resolve(final SpellAbility sa) { final List untargetedCards = Lists.newArrayList(); - final TargetRestrictions tgt = sa.getTargetRestrictions(); final Game game = sa.getActivatingPlayer().getGame(); final Card host = sa.getHostCard(); final long timestamp = game.getNextTimestamp(); @@ -350,7 +356,7 @@ public class PumpEffect extends SpellAbilityEffect { } // if pump is a target, make sure we can still target now - if ((tgt != null) && !tgtC.canBeTargetedBy(sa)) { + if (sa.usesTargeting() && !tgtC.canBeTargetedBy(sa)) { continue; } diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 4189ea62ba5..e6611e7b0e2 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -4872,7 +4872,7 @@ public class Card extends GameEntity implements Comparable { timestamp = t; } public boolean equalsWithTimestamp(Card c) { - return c == this && c.getTimestamp() == timestamp; + return equals(c) && c.getTimestamp() == timestamp; } /** diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 606442ad7e1..0ff2ab3e107 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -2362,7 +2362,7 @@ public class CardFactoryUtil { + "TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ " + "Exalted (" + inst.getReminderText() + ")"; - final String effect = "DB$ Pump | Defined$ TriggeredAttacker | NumAtt$ +1 | NumDef$ +1"; + final String effect = "DB$ Pump | Defined$ TriggeredAttackerLKICopy | NumAtt$ +1 | NumDef$ +1"; final Trigger trigger = TriggerHandler.parseTrigger(trig, card, intrinsic); trigger.setOverridingAbility(AbilityFactory.getAbility(effect, card)); @@ -2441,7 +2441,7 @@ public class CardFactoryUtil { " | TriggerZones$ Battlefield | Secondary$ True " + " | TriggerDescription$ Flanking (" + inst.getReminderText() + ")"); - final String effect = "DB$ Pump | Defined$ TriggeredBlocker | NumAtt$ -1 | NumDef$ -1"; + final String effect = "DB$ Pump | Defined$ TriggeredBlockerLKICopy | NumAtt$ -1 | NumDef$ -1"; final Trigger trigger = TriggerHandler.parseTrigger(trigFlanking.toString(), card, intrinsic); trigger.setOverridingAbility(AbilityFactory.getAbility(effect, card)); @@ -2645,7 +2645,7 @@ public class CardFactoryUtil { final String trigStr = "Mode$ Attacks | ValidCard$ Card.Self | Secondary$ True " + " | TriggerDescription$ Melee (" + inst.getReminderText() + ")"; - final String effect = "DB$ Pump | Defined$ TriggeredAttacker | NumAtt$ MeleeX | NumDef$ MeleeX"; + final String effect = "DB$ Pump | Defined$ TriggeredAttackerLKICopy | NumAtt$ MeleeX | NumDef$ MeleeX"; final Trigger trigger = TriggerHandler.parseTrigger(trigStr.toString(), card, intrinsic); SpellAbility sa = AbilityFactory.getAbility(effect, card); @@ -2818,7 +2818,7 @@ public class CardFactoryUtil { " | ValidBlocker$ Creature | MinBlockers$ 1 | Secondary$ True " + " | TriggerDescription$ Rampage " + n + " (" + inst.getReminderText() + ")"; - final String effect = "DB$ Pump | Defined$ TriggeredAttacker" + + final String effect = "DB$ Pump | Defined$ TriggeredAttackerLKICopy" + " | NumAtt$ Rampage" + n + " | NumDef$ Rampage" + n; final Trigger trigger = TriggerHandler.parseTrigger(trigStr.toString(), card, intrinsic); diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index c65620f2ca1..0f959f598d5 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -283,6 +283,8 @@ public final class CardUtil { newCopy.setMeldedWith(in.getMeldedWith()); + newCopy.setTimestamp(in.getTimestamp()); + // update keyword cache on all states for (CardStateName s : newCopy.getStates()) { newCopy.updateKeywordsCache(newCopy.getState(s)); diff --git a/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java b/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java index 0108097f53d..927895756f3 100644 --- a/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java +++ b/forge-game/src/main/java/forge/game/trigger/WrappedAbility.java @@ -209,10 +209,10 @@ public class WrappedAbility extends Ability { // a real solution would include only the triggering information that actually is used, but that's a major change @Override public String toUnsuppressedString() { - String desc = this.getStackDescription(); /* use augmented stack description as string for wrapped things */ - String card = getTrigger().getHostCard().toString(); + String desc = this.getStackDescription(); /* use augmented stack description as string for wrapped things */ + String card = getTrigger().getHostCard().toString(); if ( !desc.contains(card) && desc.contains(" this ")) { /* a hack for Evolve and similar that don't have CARDNAME */ - return card + ": " + desc; + return card + ": " + desc; } else return desc; } @@ -476,34 +476,9 @@ public class WrappedAbility extends Ability { return; } - // Check timestamps of triggered objects - final List original = Lists.newArrayList(sa.getTriggerRemembered()); - for (Object o : original) { - if (o instanceof Card) { - Card card = (Card) o; - Card current = game.getCardState(card); - if (current.getTimestamp() != card.getTimestamp()) { - // TODO: figure out if NoTimestampCheck should be the default for ChangesZone triggers - if (!triggerParams.containsKey("NoTimestampCheck")) { - sa.getTriggerRemembered().remove(o); - } - } - } + if (!triggerParams.containsKey("NoTimestampCheck")) { + timestampCheck(); } - final Map triggerMap = new HashMap(sa.getTriggeringObjects()); - for (Entry ev : triggerMap.entrySet()) { - if (ev.getValue() instanceof Card) { - Card card = (Card) ev.getValue(); - Card current = game.getCardState(card); - if (card.isInPlay() && current.isInPlay() && current.getTimestamp() != card.getTimestamp()) { - // TODO: figure out if NoTimestampCheck should be the default for ChangesZone triggers - if (!triggerParams.containsKey("NoTimestampCheck")) { - sa.getTriggeringObjects().remove(ev.getKey()); - } - } - } - } - // TODO: CardCollection getActivatingPlayer().getController().playSpellAbilityNoStack(sa, false); @@ -516,4 +491,50 @@ public class WrappedAbility extends Ability { th.registerDelayedTrigger(deltrig); } } -} + + /** + * TODO remove this function after the Effects are updated + */ + protected void timestampCheck() { + final Game game = sa.getActivatingPlayer().getGame(); + + if (ApiType.PutCounter.equals(sa.getApi()) + || ApiType.MoveCounter.equals(sa.getApi()) + || ApiType.MultiplyCounter.equals(sa.getApi()) + || ApiType.MoveCounter.equals(sa.getApi()) + || ApiType.RemoveCounter.equals(sa.getApi()) + || ApiType.AddOrRemoveCounter.equals(sa.getApi()) + || ApiType.MoveCounter.equals(sa.getApi()) + + // Token has no Defined it should not be timestamp problems + || ApiType.Token.equals(sa.getApi()) + ) { + return; + } + + // Check timestamps of triggered objects + final List original = Lists.newArrayList(sa.getTriggerRemembered()); + for (Object o : original) { + if (o instanceof Card) { + Card card = (Card) o; + Card current = game.getCardState(card); + if (current.getTimestamp() != card.getTimestamp()) { + // TODO: figure out if NoTimestampCheck should be the default for ChangesZone triggers + sa.getTriggerRemembered().remove(o); + } + } + } + final Map triggerMap = new HashMap(sa.getTriggeringObjects()); + for (Entry ev : triggerMap.entrySet()) { + if (ev.getValue() instanceof Card) { + Card card = (Card) ev.getValue(); + Card current = game.getCardState(card); + if (card.isInPlay() && current.isInPlay() && current.getTimestamp() != card.getTimestamp()) { + // TODO: figure out if NoTimestampCheck should be the default for ChangesZone triggers + sa.getTriggeringObjects().remove(ev.getKey()); + } + } + } + // TODO: CardCollection + } +} \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/a/acolyte_of_the_inferno.txt b/forge-gui/res/cardsfolder/a/acolyte_of_the_inferno.txt index a03344aa3c3..00e9b7f9e14 100644 --- a/forge-gui/res/cardsfolder/a/acolyte_of_the_inferno.txt +++ b/forge-gui/res/cardsfolder/a/acolyte_of_the_inferno.txt @@ -4,7 +4,7 @@ Types:Creature Human Monk PT:3/1 K:Renown:1 T:Mode$ AttackerBlockedByCreature | ValidCard$ Card.Self | ValidBlocker$ Creature | Execute$ TrigDealDamage | TriggerDescription$ Whenever CARDNAME becomes blocked by a creature, it deals 2 damage to that creature. -SVar:TrigDealDamage:DB$ DealDamage | Defined$ TriggeredBlocker | NumDmg$ 2 +SVar:TrigDealDamage:DB$ DealDamage | Defined$ TriggeredBlockerLKICopy | NumDmg$ 2 DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/acolyte_of_the_inferno.jpg Oracle:Renown 1 (When this creature deals combat damage to a player, if it isn't renowned, put a +1/+1 counter on it and it becomes renowned.)\nWhenever Acolyte of the Inferno becomes blocked by a creature, it deals 2 damage to that creature. diff --git a/forge-gui/res/cardsfolder/a/aether_flash.txt b/forge-gui/res/cardsfolder/a/aether_flash.txt index bec2d46807b..a331c6bda14 100644 --- a/forge-gui/res/cardsfolder/a/aether_flash.txt +++ b/forge-gui/res/cardsfolder/a/aether_flash.txt @@ -2,7 +2,7 @@ Name:Aether Flash ManaCost:2 R R Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever a creature enters the battlefield, CARDNAME deals 2 damage to it. -SVar:TrigDealDamage:DB$DealDamage | Defined$ TriggeredCard | NumDmg$ 2 +SVar:TrigDealDamage:DB$DealDamage | Defined$ TriggeredCardLKICopy | NumDmg$ 2 SVar:RemRandomDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/aether_flash.jpg Oracle:Whenever a creature enters the battlefield, Aether Flash deals 2 damage to it. diff --git a/forge-gui/res/cardsfolder/a/ashmouth_hound.txt b/forge-gui/res/cardsfolder/a/ashmouth_hound.txt index 7c7dd11602e..ca3725f2850 100644 --- a/forge-gui/res/cardsfolder/a/ashmouth_hound.txt +++ b/forge-gui/res/cardsfolder/a/ashmouth_hound.txt @@ -4,7 +4,7 @@ Types:Creature Elemental Hound PT:2/1 T:Mode$ AttackerBlockedByCreature | ValidCard$ Creature | ValidBlocker$ Card.Self | Execute$ TrigDamageAttacker | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature, CARDNAME deals 1 damage to that creature. T:Mode$ AttackerBlockedByCreature | ValidCard$ Card.Self | ValidBlocker$ Creature | Execute$ TrigDamageBlocker | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature, CARDNAME deals 1 damage to that creature. -SVar:TrigDamageAttacker:DB$ DealDamage | Defined$ TriggeredAttacker | NumDmg$ 1 -SVar:TrigDamageBlocker:DB$ DealDamage | Defined$ TriggeredBlocker | NumDmg$ 1 +SVar:TrigDamageAttacker:DB$ DealDamage | Defined$ TriggeredAttackerLKICopy | NumDmg$ 1 +SVar:TrigDamageBlocker:DB$ DealDamage | Defined$ TriggeredBlockerLKICopy | NumDmg$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/ashmouth_hound.jpg Oracle:Whenever Ashmouth Hound blocks or becomes blocked by a creature, Ashmouth Hound deals 1 damage to that creature. diff --git a/forge-gui/res/cardsfolder/a/assembled_alphas.txt b/forge-gui/res/cardsfolder/a/assembled_alphas.txt index 2bc7e3150d6..cb51640928d 100644 --- a/forge-gui/res/cardsfolder/a/assembled_alphas.txt +++ b/forge-gui/res/cardsfolder/a/assembled_alphas.txt @@ -4,10 +4,10 @@ Types:Creature Wolf PT:5/5 T:Mode$ AttackerBlockedByCreature | ValidCard$ Creature | ValidBlocker$ Card.Self | Execute$ TrigDamageAttacker | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature, CARDNAME deals 3 damage to that creature and 3 damage to that creature's controller. T:Mode$ AttackerBlockedByCreature | ValidCard$ Card.Self | ValidBlocker$ Creature | Execute$ TrigDamageBlocker | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature, CARDNAME deals 3 damage to that creature and 3 damage to that creature's controller. -SVar:TrigDamageAttacker:DB$ DealDamage | Defined$ TriggeredAttacker | NumDmg$ 3 | SubAbility$ DBDamageAtk -SVar:TrigDamageBlocker:DB$ DealDamage | Defined$ TriggeredBlocker | NumDmg$ 3 | SubAbility$ DBDamageBlk +SVar:TrigDamageAttacker:DB$ DealDamage | Defined$ TriggeredAttackerLKICopy | NumDmg$ 3 | SubAbility$ DBDamageAtk +SVar:TrigDamageBlocker:DB$ DealDamage | Defined$ TriggeredBlockerLKICopy | NumDmg$ 3 | SubAbility$ DBDamageBlk SVar:DBDamageAtk:DB$ DealDamage | Defined$ TriggeredAttackerController | NumDmg$ 3 SVar:DBDamageBlk:DB$ DealDamage | Defined$ TriggeredBlockerController | NumDmg$ 3 SVar:HasCombatEffect:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/assembled_alphas.jpg -Oracle:Whenever Assembled Alphas blocks or becomes blocked by a creature, Assembled Alphas deals 3 damage to that creature and 3 damage to that creature's controller. \ No newline at end of file +Oracle:Whenever Assembled Alphas blocks or becomes blocked by a creature, Assembled Alphas deals 3 damage to that creature and 3 damage to that creature's controller. diff --git a/forge-gui/res/cardsfolder/c/caltrops.txt b/forge-gui/res/cardsfolder/c/caltrops.txt index 36f8c93b78e..54a95dcaaba 100644 --- a/forge-gui/res/cardsfolder/c/caltrops.txt +++ b/forge-gui/res/cardsfolder/c/caltrops.txt @@ -2,7 +2,7 @@ Name:Caltrops ManaCost:3 Types:Artifact T:Mode$ Attacks | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature attacks, CARDNAME deals 1 damage to it. -SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredAttacker | NumDmg$ 1 +SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredAttackerLKICopy | NumDmg$ 1 SVar:RemRandomDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/caltrops.jpg Oracle:Whenever a creature attacks, Caltrops deals 1 damage to it. diff --git a/forge-gui/res/cardsfolder/c/circle_of_flame.txt b/forge-gui/res/cardsfolder/c/circle_of_flame.txt index a849343cb5b..5ee48bb2c72 100644 --- a/forge-gui/res/cardsfolder/c/circle_of_flame.txt +++ b/forge-gui/res/cardsfolder/c/circle_of_flame.txt @@ -2,6 +2,6 @@ Name:Circle of Flame ManaCost:1 R Types:Enchantment T:Mode$ Attacks | ValidCard$ Creature.withoutFlying | Attacked$ You,Planeswalker.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature without flying attacks you or a planeswalker you control, CARDNAME deals 1 damage to that creature. -SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredAttacker | NumDmg$ 1 +SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredAttackerLKICopy | NumDmg$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/circle_of_flame.jpg Oracle:Whenever a creature without flying attacks you or a planeswalker you control, Circle of Flame deals 1 damage to that creature. diff --git a/forge-gui/res/cardsfolder/f/flame_kin_war_scout.txt b/forge-gui/res/cardsfolder/f/flame_kin_war_scout.txt index f7d59b71ba4..fc0033f3967 100644 --- a/forge-gui/res/cardsfolder/f/flame_kin_war_scout.txt +++ b/forge-gui/res/cardsfolder/f/flame_kin_war_scout.txt @@ -4,7 +4,8 @@ Types:Creature Elemental Scout PT:2/4 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other |TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ When another creature enters the battlefield, sacrifice Flame-Kin War Scout. If you do, Flame-Kin War Scout deals 4 damage to that creature. SVar:TrigSac:DB$Sacrifice | Defined$ Self | SubAbility$ DBDamage | RememberSacrificed$ True -SVar:DBDamage:DB$DealDamage | Defined$ TriggeredCard | NumDmg$ 4 | ConditionDefined$ Remembered | ConditionPresent$ Card.Self +SVar:DBDamage:DB$DealDamage | Defined$ TriggeredCardLKICopy | NumDmg$ 4 | ConditionDefined$ Remembered | ConditionPresent$ Card.Self | SubAbility$ DBCleanup +SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True SVar:RemAIDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/flame_kin_war_scout.jpg Oracle:When another creature enters the battlefield, sacrifice Flame-Kin War Scout. If you do, Flame-Kin War Scout deals 4 damage to that creature. diff --git a/forge-gui/res/cardsfolder/g/guilty_conscience.txt b/forge-gui/res/cardsfolder/g/guilty_conscience.txt index 7bc70d7597f..5578ac5d5f1 100644 --- a/forge-gui/res/cardsfolder/g/guilty_conscience.txt +++ b/forge-gui/res/cardsfolder/g/guilty_conscience.txt @@ -4,7 +4,7 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ W | ValidTgts$ Creature | AILogic$ SpecificCard T:Mode$ DamageDealtOnce | ValidSource$ Card.AttachedBy | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever enchanted creature deals damage, CARDNAME deals that much damage to that creature. -SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredSource | NumDmg$ X | References$ X +SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredSourceLKICopy | NumDmg$ X | References$ X SVar:X:TriggerCount$DamageAmount SVar:Picture:http://www.wizards.com/global/images/magic/general/guilty_conscience.jpg Oracle:Enchant creature\nWhenever enchanted creature deals damage, Guilty Conscience deals that much damage to that creature. diff --git a/forge-gui/res/cardsfolder/i/inferno_elemental.txt b/forge-gui/res/cardsfolder/i/inferno_elemental.txt index cef3e9e687d..0da06759b89 100644 --- a/forge-gui/res/cardsfolder/i/inferno_elemental.txt +++ b/forge-gui/res/cardsfolder/i/inferno_elemental.txt @@ -4,7 +4,7 @@ Types:Creature Elemental PT:4/4 T:Mode$ AttackerBlockedByCreature | ValidCard$ Creature | ValidBlocker$ Card.Self | Execute$ TrigDealDamageAttack | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature, CARDNAME deals 3 damage to that creature. T:Mode$ AttackerBlockedByCreature | ValidCard$ Card.Self | ValidBlocker$ Creature | Execute$ TrigDealDamageBlock | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature, CARDNAME deals 3 damage to that creature. -SVar:TrigDealDamageAttack:DB$DealDamage | Defined$ TriggeredAttacker | NumDmg$ 3 -SVar:TrigDealDamageBlock:DB$DealDamage | Defined$ TriggeredBlocker | NumDmg$ 3 +SVar:TrigDealDamageAttack:DB$DealDamage | Defined$ TriggeredAttackerLKICopy | NumDmg$ 3 +SVar:TrigDealDamageBlock:DB$DealDamage | Defined$ TriggeredBlockerLKICopy | NumDmg$ 3 SVar:Picture:http://www.wizards.com/global/images/magic/general/inferno_elemental.jpg Oracle:Whenever Inferno Elemental blocks or becomes blocked by a creature, Inferno Elemental deals 3 damage to that creature. diff --git a/forge-gui/res/cardsfolder/k/kessig_forgemaster_flameheart_werewolf.txt b/forge-gui/res/cardsfolder/k/kessig_forgemaster_flameheart_werewolf.txt index f7bae04e526..78b0a5bce20 100644 --- a/forge-gui/res/cardsfolder/k/kessig_forgemaster_flameheart_werewolf.txt +++ b/forge-gui/res/cardsfolder/k/kessig_forgemaster_flameheart_werewolf.txt @@ -4,8 +4,8 @@ Types:Creature Human Shaman Werewolf PT:2/1 T:Mode$ AttackerBlockedByCreature | ValidCard$ Creature | ValidBlocker$ Card.Self | Execute$ TrigDamageAttacker | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature, CARDNAME deals 1 damage to that creature. T:Mode$ AttackerBlockedByCreature | ValidCard$ Card.Self | ValidBlocker$ Creature | Execute$ TrigDamageBlocker | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature, CARDNAME deals 1 damage to that creature. -SVar:TrigDamageAttacker:DB$ DealDamage | Defined$ TriggeredAttacker | NumDmg$ 1 -SVar:TrigDamageBlocker:DB$ DealDamage | Defined$ TriggeredBlocker | NumDmg$ 1 +SVar:TrigDamageAttacker:DB$ DealDamage | Defined$ TriggeredAttackerLKICopy | NumDmg$ 1 +SVar:TrigDamageBlocker:DB$ DealDamage | Defined$ TriggeredBlockerLKICopy | NumDmg$ 1 T:Mode$Phase | Phase$ Upkeep | WerewolfTransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if no spells were cast last turn, transform CARDNAME. SVar:TrigTransform:DB$SetState | Defined$ Self | Mode$ Transform AlternateMode:DoubleFaced @@ -21,8 +21,8 @@ Types:Creature Werewolf PT:3/2 T:Mode$ AttackerBlockedByCreature | ValidCard$ Creature | ValidBlocker$ Card.Self | Execute$ TrigDamageAttacker | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature, CARDNAME deals 2 damage to that creature. T:Mode$ AttackerBlockedByCreature | ValidCard$ Card.Self | ValidBlocker$ Creature | Execute$ TrigDamageBlocker | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature, CARDNAME deals 2 damage to that creature. -SVar:TrigDamageAttacker:DB$ DealDamage | Defined$ TriggeredAttacker | NumDmg$ 2 -SVar:TrigDamageBlocker:DB$ DealDamage | Defined$ TriggeredBlocker | NumDmg$ 2 +SVar:TrigDamageAttacker:DB$ DealDamage | Defined$ TriggeredAttackerLKICopy | NumDmg$ 2 +SVar:TrigDamageBlocker:DB$ DealDamage | Defined$ TriggeredBlockerLKICopy | NumDmg$ 2 T:Mode$Phase | Phase$ Upkeep | WerewolfUntransformCondition$ True | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ At the beginning of each upkeep, if a player cast two or more spells last turn, transform CARDNAME. SVar:TrigTransform:DB$SetState | Defined$ Self | Mode$ Transform SVar:Picture:http://www.wizards.com/global/images/magic/general/flameheart_werewolf.jpg diff --git a/forge-gui/res/cardsfolder/k/kolaghan_aspirant.txt b/forge-gui/res/cardsfolder/k/kolaghan_aspirant.txt index 53bc07ec78c..84bb055d40b 100644 --- a/forge-gui/res/cardsfolder/k/kolaghan_aspirant.txt +++ b/forge-gui/res/cardsfolder/k/kolaghan_aspirant.txt @@ -3,6 +3,6 @@ ManaCost:1 R Types:Creature Human Warrior PT:2/1 T:Mode$ AttackerBlockedByCreature | ValidCard$ Card.Self | ValidBlocker$ Creature | Execute$ TrigDamage | TriggerDescription$ Whenever CARDNAME becomes blocked by a creature, CARDNAME deals 1 damage to that creature. -SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredBlocker | NumDmg$ 1 +SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredBlockerLKICopy | NumDmg$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/kolaghan_aspirant.jpg Oracle:Whenever Kolaghan Aspirant becomes blocked by a creature, Kolaghan Aspirant deals 1 damage to that creature. diff --git a/forge-gui/res/cardsfolder/m/mangaras_equity.txt b/forge-gui/res/cardsfolder/m/mangaras_equity.txt index 9a2f3a6e9c7..9ab5cf449cc 100644 --- a/forge-gui/res/cardsfolder/m/mangaras_equity.txt +++ b/forge-gui/res/cardsfolder/m/mangaras_equity.txt @@ -5,7 +5,7 @@ K:UpkeepCost:1 W K:ETBReplacement:Other:ChooseBlackOrRed SVar:ChooseBlackOrRed:DB$ ChooseColor | Defined$ You | Choices$ black,red | AILogic$ MostProminentHumanCreatures | SpellDescription$ As CARDNAME enters the battlefield, choose black or red. T:Mode$ DamageDone | ValidSource$ Creature.ChosenColor | ValidTarget$ Creature.White+YouCtrl,You | TriggerZones$ Battlefield | Execute$ MangarasRetribution | TriggerDescription$ Whenever a creature of the chosen color deals damage to you or a white creature you control, CARDNAME deals that much damage to that creature. -SVar:MangarasRetribution:DB$ DealDamage | Defined$ TriggeredSource | NumDmg$ MangaraX | References$ MangaraX +SVar:MangarasRetribution:DB$ DealDamage | Defined$ TriggeredSourceLKICopy | NumDmg$ MangaraX | References$ MangaraX SVar:MangaraX:TriggerCount$DamageAmount SVar:RemRandomDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/mangaras_equity.jpg diff --git a/forge-gui/res/cardsfolder/p/powerstone_minefield.txt b/forge-gui/res/cardsfolder/p/powerstone_minefield.txt index 5cfbeb3b293..cf64d69912c 100644 --- a/forge-gui/res/cardsfolder/p/powerstone_minefield.txt +++ b/forge-gui/res/cardsfolder/p/powerstone_minefield.txt @@ -3,8 +3,8 @@ ManaCost:2 R W Types:Enchantment T:Mode$ Attacks | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature attacks or blocks, CARDNAME deals 2 damage to it. T:Mode$ Blocks | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigDamage2 | Secondary$ True | TriggerDescription$ Whenever a creature attacks or blocks, CARDNAME deals 2 damage to it. -SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredAttacker | NumDmg$ 2 -SVar:TrigDamage2:DB$DealDamage | Defined$ TriggeredBlocker | NumDmg$ 2 +SVar:TrigDamage:DB$DealDamage | Defined$ TriggeredAttackerLKICopy | NumDmg$ 2 +SVar:TrigDamage2:DB$DealDamage | Defined$ TriggeredBlockerLKICopy | NumDmg$ 2 SVar:RemRandomDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/powerstone_minefield.jpg Oracle:Whenever a creature attacks or blocks, Powerstone Minefield deals 2 damage to it. diff --git a/forge-gui/res/cardsfolder/p/primal_forcemage.txt b/forge-gui/res/cardsfolder/p/primal_forcemage.txt index 5a41e541177..7845a017319 100644 --- a/forge-gui/res/cardsfolder/p/primal_forcemage.txt +++ b/forge-gui/res/cardsfolder/p/primal_forcemage.txt @@ -3,7 +3,7 @@ ManaCost:2 G Types:Creature Elf Shaman PT:2/2 T:Mode$ ChangesZone | ValidCard$ Creature.Other+YouCtrl | Origin$ Any | Destination$ Battlefield | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever another creature enters the battlefield under your control, that creature gets +3/+3 until end of turn. -SVar:TrigPump:DB$ Pump | Defined$ TriggeredCard | NumAtt$ +3 | NumDef$ +3 +SVar:TrigPump:DB$ Pump | Defined$ TriggeredCardLKICopy | NumAtt$ +3 | NumDef$ +3 SVar:PlayMain1:ALWAYS SVar:Picture:http://www.wizards.com/global/images/magic/general/primal_forcemage.jpg Oracle:Whenever another creature enters the battlefield under your control, that creature gets +3/+3 until end of turn. diff --git a/forge-gui/res/cardsfolder/r/raking_canopy.txt b/forge-gui/res/cardsfolder/r/raking_canopy.txt index 753e559187b..1c34c62febd 100644 --- a/forge-gui/res/cardsfolder/r/raking_canopy.txt +++ b/forge-gui/res/cardsfolder/r/raking_canopy.txt @@ -2,6 +2,6 @@ Name:Raking Canopy ManaCost:1 G G Types:Enchantment T:Mode$ Attacks | ValidCard$ Creature.withFlying | Attacked$ You | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature with flying attacks you, CARDNAME deals 4 damage to it. -SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredAttacker | NumDmg$ 4 +SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredAttackerLKICopy | NumDmg$ 4 SVar:Picture:http://www.wizards.com/global/images/magic/general/raking_canopy.jpg Oracle:Whenever a creature with flying attacks you, Raking Canopy deals 4 damage to it. diff --git a/forge-gui/res/cardsfolder/s/somberwald_vigilante.txt b/forge-gui/res/cardsfolder/s/somberwald_vigilante.txt index 4defde3c122..ddd60c3f12e 100644 --- a/forge-gui/res/cardsfolder/s/somberwald_vigilante.txt +++ b/forge-gui/res/cardsfolder/s/somberwald_vigilante.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Creature Human Warrior PT:1/1 T:Mode$ AttackerBlockedByCreature | ValidCard$ Card.Self | ValidBlocker$ Creature | TriggerZones$ Battlefield | Execute$ RogueDamage | TriggerDescription$ Whenever CARDNAME becomes blocked by a creature, CARDNAME deals 1 damage to that creature. -SVar:RogueDamage:DB$ DealDamage | Defined$ TriggeredBlocker | NumDmg$ 1 +SVar:RogueDamage:DB$ DealDamage | Defined$ TriggeredBlockerLKICopy | NumDmg$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/somberwald_vigilante.jpg Oracle:Whenever Somberwald Vigilante becomes blocked by a creature, Somberwald Vigilante deals 1 damage to that creature. diff --git a/forge-gui/res/cardsfolder/t/tephraderm.txt b/forge-gui/res/cardsfolder/t/tephraderm.txt index 4390bd657b0..2af3f9f1a10 100644 --- a/forge-gui/res/cardsfolder/t/tephraderm.txt +++ b/forge-gui/res/cardsfolder/t/tephraderm.txt @@ -4,7 +4,7 @@ Types:Creature Beast PT:4/5 T:Mode$ DamageDone | ValidSource$ Creature | ValidTarget$ Card.Self | Execute$ TrigDealDamage1 | TriggerDescription$ Whenever a creature deals damage to CARDNAME, CARDNAME deals that much damage to that creature. T:Mode$ DamageDone | ValidSource$ Instant,Sorcery | ValidTarget$ Card.Self | Execute$ TrigDealDamage2 | TriggerDescription$ Whenever a spell deals damage to CARDNAME, CARDNAME deals that much damage to that spell's controller. -SVar:TrigDealDamage1:DB$ DealDamage | Defined$ TriggeredSource | NumDmg$ X | References$ X +SVar:TrigDealDamage1:DB$ DealDamage | Defined$ TriggeredSourceLKICopy | NumDmg$ X | References$ X SVar:TrigDealDamage2:DB$ DealDamage | Defined$ TriggeredSourceController | NumDmg$ X | References$ X SVar:X:TriggerCount$DamageAmount SVar:Picture:http://www.wizards.com/global/images/magic/general/tephraderm.jpg