diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 02697597d23..58ef536f627 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -253,7 +253,10 @@ public class AiController { } boolean rightapi = false; Player activatingPlayer = sa.getActivatingPlayer(); - + + // for xPaid stuff + card.setCastSA(sa); + // Trigger play improvements for (final Trigger tr : card.getTriggers()) { // These triggers all care for ETB effects @@ -743,7 +746,7 @@ public class AiController { return AiPlayDecision.CantPlaySa; } - boolean xCost = sa.getPayCosts().hasXInAnyCostPart(); + boolean xCost = sa.getPayCosts().hasXInAnyCostPart() || sa.getHostCard().hasStartOfKeyword("Strive"); if (!xCost && !ComputerUtilCost.canPayCost(sa, player)) { // for most costs, it's OK to check if they can be paid early in order to avoid running a heavy API check // when the AI won't even be able to play the spell in the first place (even if it could afford it) @@ -751,11 +754,11 @@ public class AiController { } // state needs to be switched here so API checks evaluate the right face - if (sa.getCardState().getStateName() == CardStateName.Modal) { + if (sa.getCardState() != null && !sa.getHostCard().isInPlay() && sa.getCardState().getStateName() == CardStateName.Modal) { sa.getHostCard().setState(CardStateName.Modal, false); } AiPlayDecision canPlay = canPlaySa(sa); // this is the "heaviest" check, which also sets up targets, defines X, etc. - if (sa.getCardState().getStateName() == CardStateName.Modal) { + if (sa.getCardState() != null && !sa.getHostCard().isInPlay() && sa.getCardState().getStateName() == CardStateName.Modal) { sa.getHostCard().setState(CardStateName.Original, false); } @@ -1754,10 +1757,10 @@ public class AiController { } public boolean doTrigger(SpellAbility spell, boolean mandatory) { - if (spell.getApi() != null) - return SpellApiToAi.Converter.get(spell.getApi()).doTriggerAI(player, spell, mandatory); if (spell instanceof WrappedAbility) return doTrigger(((WrappedAbility)spell).getWrappedAbility(), mandatory); + if (spell.getApi() != null) + return SpellApiToAi.Converter.get(spell.getApi()).doTriggerAI(player, spell, mandatory); if (spell.getPayCosts() == Cost.Zero && spell.getTargetRestrictions() == null) { // For non-converted triggers (such as Cumulative Upkeep) that don't have costs or targets to worry about return true; diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java index 409c29cfa94..abac4e11587 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java @@ -695,8 +695,9 @@ public class ComputerUtilCost { public static int getMaxXValue(SpellAbility sa, Player ai) { final Card source = sa.getHostCard(); - final SpellAbility root = sa.getRootAbility(); + SpellAbility root = sa.getRootAbility(); final Cost abCost = root.getPayCosts(); + if (abCost == null || !abCost.hasXInAnyCostPart()) { return 0; } diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index 470460f4e64..331fbb599a7 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -827,8 +827,7 @@ public class ComputerUtilMana { // remove from available lists Iterables.removeIf(sourcesForShards.values(), CardTraitPredicates.isHostCard(saPayment.getHostCard())); - } - else { + } else { final CostPayment pay = new CostPayment(saPayment.getPayCosts(), saPayment); if (!pay.payComputerCosts(new AiCostDecision(ai, saPayment))) { saList.remove(saPayment); @@ -863,8 +862,7 @@ public class ComputerUtilMana { if (test) { resetPayment(paymentList); return false; - } - else { + } else { System.out.println("ComputerUtil : payManaCost() cost was not paid for " + sa.getHostCard().getName() + ". Didn't find what to pay for " + toPay); return false; } @@ -1233,8 +1231,7 @@ public class ComputerUtilMana { if (!(ai.getGame().getPhaseHandler().isPlayerTurn(ai))) { AiCardMemory.clearMemorySet(ai, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_ENEMY_DECLBLK); AiCardMemory.clearMemorySet(ai, AiCardMemory.MemorySet.CHOSEN_FOG_EFFECT); - } - else + } else AiCardMemory.clearMemorySet(ai, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_DECLBLK); } else { if ((AiCardMemory.isRememberedCard(ai, sourceCard, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_DECLBLK)) || @@ -1255,8 +1252,7 @@ public class ComputerUtilMana { if (curPhase == PhaseType.MAIN2 || curPhase == PhaseType.CLEANUP) { AiCardMemory.clearMemorySet(ai, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_MAIN2); - } - else { + } else { if (AiCardMemory.isRememberedCard(ai, sourceCard, AiCardMemory.MemorySet.HELD_MANA_SOURCES_FOR_MAIN2)) { // This mana source is held elsewhere for a Main Phase 2 spell. return true; @@ -1266,7 +1262,6 @@ public class ComputerUtilMana { return false; } - private static ManaCostShard getNextShardToPay(ManaCostBeingPaid cost) { // mind the priorities // * Pay mono-colored first,curPhase == PhaseType.CLEANUP @@ -1352,8 +1347,7 @@ public class ComputerUtilMana { String commonColor = ComputerUtilCard.getMostProminentColor(ai.getCardsIn(ZoneType.Hand)); if (!commonColor.isEmpty() && satisfiesColorChoice(abMana, choiceString, MagicColor.toShortString(commonColor)) && abMana.getComboColors().contains(MagicColor.toShortString(commonColor))) { choice = MagicColor.toShortString(commonColor); - } - else { + } else { // default to first available color for (String c : comboColors) { if (satisfiesColorChoice(abMana, choiceString, c)) { @@ -1398,8 +1392,7 @@ public class ComputerUtilMana { break; } } - } - else { + } else { String color = MagicColor.toShortString(manaPart); boolean wasNeeded = testCost.ai_payMana(color, p.getManaPool()); if (!wasNeeded) { diff --git a/forge-ai/src/main/java/forge/ai/GameState.java b/forge-ai/src/main/java/forge/ai/GameState.java index 2fc61fab01b..9f2b53e6dac 100644 --- a/forge-ai/src/main/java/forge/ai/GameState.java +++ b/forge-ai/src/main/java/forge/ai/GameState.java @@ -434,7 +434,7 @@ public abstract class GameState { boolean first = true; StringBuilder counterString = new StringBuilder(); - for(Entry kv : counters.entrySet()) { + for (Entry kv : counters.entrySet()) { if (!first) { counterString.append(","); } @@ -470,7 +470,7 @@ public abstract class GameState { } public void parse(List lines) { - for(String line : lines) { + for (String line : lines) { parseLine(line); } } @@ -1110,13 +1110,13 @@ public abstract class GameState { private void handleCardAttachments() { // Unattach all permanents first - for(Entry entry : cardToAttachId.entrySet()) { + for (Entry entry : cardToAttachId.entrySet()) { Card attachedTo = idToCard.get(entry.getValue()); attachedTo.unAttachAllCards(); } // Attach permanents by ID - for(Entry entry : cardToAttachId.entrySet()) { + for (Entry entry : cardToAttachId.entrySet()) { Card attachedTo = idToCard.get(entry.getValue()); Card attacher = entry.getKey(); if (attacher.isAttachment()) { @@ -1125,7 +1125,7 @@ public abstract class GameState { } // Enchant players by ID - for(Entry entry : cardToEnchantPlayerId.entrySet()) { + for (Entry entry : cardToEnchantPlayerId.entrySet()) { // TODO: improve this for game states with more than two players Card attacher = entry.getKey(); Game game = attacher.getGame(); @@ -1136,9 +1136,9 @@ public abstract class GameState { } private void handleMergedCards() { - for(Entry> entry : cardToMergedCards.entrySet()) { + for (Entry> entry : cardToMergedCards.entrySet()) { Card mergedTo = entry.getKey(); - for(String mergedCardName : entry.getValue()) { + for (String mergedCardName : entry.getValue()) { Card c; PaperCard pc = StaticData.instance().getCommonCards().getCard(mergedCardName. replace("^", ",")); if (pc == null) { diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 97dc8521d78..923d862b406 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -1064,7 +1064,7 @@ public class PlayerControllerAi extends PlayerController { } } - private boolean prepareSingleSa(final Card host, final SpellAbility sa, boolean isMandatory){ + private boolean prepareSingleSa(final Card host, final SpellAbility sa, boolean isMandatory) { if (sa.hasParam("TargetingPlayer")) { Player targetingPlayer = AbilityUtils.getDefinedPlayers(host, sa.getParam("TargetingPlayer"), sa).get(0); sa.setTargetingPlayer(targetingPlayer); diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index 05a76410082..6248b29c1e4 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -115,8 +115,7 @@ public class AttachAi extends SpellAbilityAi { } if (abCost.getTotalMana().countX() > 0 && sa.getSVar("X").equals("Count$xPaid")) { - // Set PayX here to maximum value. (Endless Scream and Venarian - // Gold) + // Set PayX here to maximum value. (Endless Scream and Venarian Gold) final int xPay = ComputerUtilCost.getMaxXValue(sa, ai); if (xPay == 0) { diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java index 6e2fc09207e..802cdc60bb1 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -407,6 +407,7 @@ public class ChangeZoneAi extends SpellAbilityAi { if (num.contains("X") && sa.getSVar("X").equals("Count$xPaid")) { // Set PayX here to maximum value. int xPay = ComputerUtilCost.getMaxXValue(sa, ai); + if (xPay == 0) return false; xPay = Math.min(xPay, list.size()); sa.setXManaCostPaid(xPay); } diff --git a/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java b/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java index e0f03379bd2..b36c2ac87a8 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java @@ -45,7 +45,7 @@ public class CopyPermanentAi extends SpellAbilityAi { } if ("MomirAvatar".equals(aiLogic)) { - return SpecialCardAi.MomirVigAvatar.consider(aiPlayer, sa); + return SpecialCardAi.MomirVigAvatar.consider(aiPlayer, sa); } else if ("MimicVat".equals(aiLogic)) { return SpecialCardAi.MimicVat.considerCopy(aiPlayer, sa); } else if ("AtEOT".equals(aiLogic)) { @@ -59,7 +59,7 @@ public class CopyPermanentAi extends SpellAbilityAi { } } - if (sa.hasParam("AtEOT") && !aiPlayer.getGame().getPhaseHandler().is(PhaseType.MAIN1)) { + if (sa.hasParam("AtEOT") && !ph.is(PhaseType.MAIN1)) { return false; } @@ -118,7 +118,6 @@ public class CopyPermanentAi extends SpellAbilityAi { final String sourceName = ComputerUtilAbility.getAbilitySourceName(sa); final boolean canCopyLegendary = sa.hasParam("NonLegendary"); - // //// // Targeting if (sa.usesTargeting()) { diff --git a/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java b/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java index 17d69dcdbc0..9bdbeb8f6c1 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java @@ -163,8 +163,6 @@ public class DiscardAi extends SpellAbilityAi { return false; } // discardTargetAI() - - @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { final TargetRestrictions tgt = sa.getTargetRestrictions(); @@ -211,9 +209,8 @@ public class DiscardAi extends SpellAbilityAi { return true; } // discardCheckDrawbackAI() - public boolean confirmAction(Player player, SpellAbility sa, PlayerActionConfirmMode mode, String message) { - if ( mode == PlayerActionConfirmMode.Random ) { // + if ( mode == PlayerActionConfirmMode.Random ) { // TODO For now AI will always discard Random used currently with: Balduvian Horde and similar cards return true; } diff --git a/forge-ai/src/main/java/forge/ai/ability/LegendaryRuleAi.java b/forge-ai/src/main/java/forge/ai/ability/LegendaryRuleAi.java index f91ef1ba505..7ac6840c602 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LegendaryRuleAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LegendaryRuleAi.java @@ -4,8 +4,10 @@ import java.util.Map; import com.google.common.collect.Iterables; +import forge.ai.ComputerUtil; import forge.ai.SpellAbilityAi; import forge.game.card.Card; +import forge.game.card.CardCollection; import forge.game.card.CounterEnumType; import forge.game.player.Player; import forge.game.spellability.SpellAbility; @@ -23,15 +25,17 @@ public class LegendaryRuleAi extends SpellAbilityAi { protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) { return false; // should not get here } - @Override public Card chooseSingleCard(Player ai, SpellAbility sa, Iterable options, boolean isOptional, Player targetedPlayer, Map params) { // Choose a single legendary/planeswalker card to keep - Card firstOption = Iterables.getFirst(options, null); + CardCollection legends = new CardCollection(options); + CardCollection badOptions = ComputerUtil.choosePermanentsToSacrifice(ai, legends, legends.size() -1, sa, false, false); + legends.removeAll(badOptions); + Card firstOption = Iterables.getFirst(legends, null); boolean choosingFromPlanewalkers = firstOption.isPlaneswalker(); - if ( choosingFromPlanewalkers ) { + if (choosingFromPlanewalkers) { // AI decision making - should AI compare counters? } else { // AI decision making - should AI compare damage and debuffs? diff --git a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java index a6452827851..3b3a31a953e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java @@ -250,9 +250,6 @@ public class TokenAi extends SpellAbilityAi { @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { - String tokenAmount = sa.getParamOrDefault("TokenAmount", "1"); - - final Card source = sa.getHostCard(); final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt != null) { sa.resetTargets(); @@ -262,16 +259,21 @@ public class TokenAi extends SpellAbilityAi { sa.getTargets().add(ai); } } + Card actualToken = spawnToken(ai, sa); String tokenPower = sa.getParamOrDefault("TokenPower", actualToken.getBasePowerString()); String tokenToughness = sa.getParamOrDefault("TokenToughness", actualToken.getBaseToughnessString()); + String tokenAmount = sa.getParamOrDefault("TokenAmount", "1"); + final Card source = sa.getHostCard(); if ("X".equals(tokenAmount) || "X".equals(tokenPower) || "X".equals(tokenToughness)) { int x = AbilityUtils.calculateAmount(source, tokenAmount, sa); if (sa.getSVar("X").equals("Count$xPaid")) { - // Set PayX here to maximum value. - x = ComputerUtilCost.getMaxXValue(sa, ai); - sa.setXManaCostPaid(x); + if (x == 0) { // already paid outside trigger + // Set PayX here to maximum value. + x = ComputerUtilCost.getMaxXValue(sa, ai); + sa.setXManaCostPaid(x); + } } if (x <= 0) { return false; diff --git a/forge-core/src/main/java/forge/card/CardRules.java b/forge-core/src/main/java/forge/card/CardRules.java index d062a4a0f0e..174229fe0c0 100644 --- a/forge-core/src/main/java/forge/card/CardRules.java +++ b/forge-core/src/main/java/forge/card/CardRules.java @@ -414,7 +414,7 @@ public final class CardRules implements ICardCharacteristics { String key = colonPos > 0 ? line.substring(0, colonPos) : line; String value = colonPos > 0 ? line.substring(1+colonPos).trim() : null; - switch(key.charAt(0)) { + switch (key.charAt(0)) { case 'A': if ("A".equals(key)) { this.faces[curFace].addAbility(value); diff --git a/forge-core/src/main/java/forge/card/CardType.java b/forge-core/src/main/java/forge/card/CardType.java index 2dc2f912a2d..93e945bb6f2 100644 --- a/forge-core/src/main/java/forge/card/CardType.java +++ b/forge-core/src/main/java/forge/card/CardType.java @@ -759,7 +759,6 @@ public final class CardType implements Comparable, CardTypeView { }; } - ///////// Utility methods public static boolean isACardType(final String cardType) { return CoreType.isValidEnum(cardType); diff --git a/forge-core/src/main/java/forge/card/PrintSheet.java b/forge-core/src/main/java/forge/card/PrintSheet.java index 822c37bafe2..573c834e158 100644 --- a/forge-core/src/main/java/forge/card/PrintSheet.java +++ b/forge-core/src/main/java/forge/card/PrintSheet.java @@ -40,7 +40,6 @@ public class PrintSheet { private final ItemPool cardsWithWeights; - private final String name; public PrintSheet(String name0) { this(name0, null); diff --git a/forge-core/src/main/java/forge/deck/generation/DeckGenPool.java b/forge-core/src/main/java/forge/deck/generation/DeckGenPool.java index 870c6472107..3bdd0619e7f 100644 --- a/forge-core/src/main/java/forge/deck/generation/DeckGenPool.java +++ b/forge-core/src/main/java/forge/deck/generation/DeckGenPool.java @@ -43,9 +43,8 @@ public class DeckGenPool implements IDeckGenPool { Iterable editionCards=Iterables.filter(cards.values(), filter); if (editionCards.iterator().hasNext()){ return editionCards.iterator().next(); - }else { - return getCard(name); } + return getCard(name); } @Override diff --git a/forge-core/src/main/java/forge/item/ItemPredicate.java b/forge-core/src/main/java/forge/item/ItemPredicate.java index 02f0cc65c88..5c48f57f7f6 100644 --- a/forge-core/src/main/java/forge/item/ItemPredicate.java +++ b/forge-core/src/main/java/forge/item/ItemPredicate.java @@ -3,9 +3,6 @@ package forge.item; import com.google.common.base.Predicate; import com.google.common.base.Predicates; - - - /** * Filtering conditions for miscellaneous InventoryItems. */ diff --git a/forge-core/src/main/java/forge/item/PaperCard.java b/forge-core/src/main/java/forge/item/PaperCard.java index 8e068286db1..eb0900f2d7f 100644 --- a/forge-core/src/main/java/forge/item/PaperCard.java +++ b/forge-core/src/main/java/forge/item/PaperCard.java @@ -351,4 +351,3 @@ public final class PaperCard implements Comparable, InventoryItemFro || (this.getName().equals("Mountain")); } } - diff --git a/forge-core/src/main/java/forge/item/PaperToken.java b/forge-core/src/main/java/forge/item/PaperToken.java index 776d17ceed8..caa35ab3bc5 100644 --- a/forge-core/src/main/java/forge/item/PaperToken.java +++ b/forge-core/src/main/java/forge/item/PaperToken.java @@ -95,7 +95,7 @@ public class PaperToken implements InventoryItemFromSet, IPaperCard { build.add(subtypes); // Are these keywords sorted? - for(String keyword : rules.getMainPart().getKeywords()) { + for (String keyword : rules.getMainPart().getKeywords()) { build.add(keyword); } diff --git a/forge-core/src/main/java/forge/util/ImageUtil.java b/forge-core/src/main/java/forge/util/ImageUtil.java index 9db62073242..9608c97bf0c 100644 --- a/forge-core/src/main/java/forge/util/ImageUtil.java +++ b/forge-core/src/main/java/forge/util/ImageUtil.java @@ -15,7 +15,7 @@ public class ImageUtil { } public static PaperCard getPaperCardFromImageKey(String key) { - if ( key == null ) { + if (key == null) { return null; } @@ -42,6 +42,10 @@ public class ImageUtil { String edition = key.substring(index + 1); if (script.startsWith("emblem")) return null; + if (null == StaticData.instance().getCardEdition(edition)) { + script = key; + edition = "???"; + } script = script.replaceAll("[0-9]*$", ""); return StaticData.instance().getAllTokens().getToken(script, edition); } diff --git a/forge-game/src/main/java/forge/game/CardTraitBase.java b/forge-game/src/main/java/forge/game/CardTraitBase.java index a37c387d966..aabf916208c 100644 --- a/forge-game/src/main/java/forge/game/CardTraitBase.java +++ b/forge-game/src/main/java/forge/game/CardTraitBase.java @@ -366,7 +366,6 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView, if (!Expressions.compare(left, presentCompare, right)) { return false; } - } if (params.containsKey("IsPresent2")) { diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 5e00330c620..61159befd7c 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -1633,7 +1633,7 @@ public class GameAction { recheck = true; - Card toKeep = p.getController().chooseSingleEntityForEffect(new CardCollection(cc), new SpellAbility.EmptySa(ApiType.InternalLegendaryRule, null, p), + Card toKeep = p.getController().chooseSingleEntityForEffect(new CardCollection(cc), new SpellAbility.EmptySa(ApiType.InternalLegendaryRule, new Card(-1, game), p), "You have multiple legendary permanents named \""+name+"\" in play.\n\nChoose the one to stay on battlefield (the rest will be moved to graveyard)", null); for (Card c: cc) { if (c != toKeep) { @@ -1905,7 +1905,6 @@ public class GameAction { game.getTriggerHandler().runTrigger(TriggerType.NewGame, AbilityKey.newMap(), true); // - game.getPhaseHandler().startFirstTurn(first, startGameHook); //after game ends, ensure Auto-Pass canceled for all players so it doesn't apply to next game for (Player p : game.getRegisteredPlayers()) { @@ -1980,7 +1979,6 @@ public class GameAction { private void runPreOpeningHandActions(final Player first) { Player takesAction = first; do { - // List ploys = CardLists.filter(takesAction.getCardsIn(ZoneType.Command), new Predicate() { @Override public boolean apply(Card input) { @@ -2054,8 +2052,7 @@ public class GameAction { public void invoke(final Runnable proc) { if (ThreadUtil.isGameThread()) { proc.run(); - } - else { + } else { ThreadUtil.invokeInGameThread(proc); } } diff --git a/forge-game/src/main/java/forge/game/GameLogFormatter.java b/forge-game/src/main/java/forge/game/GameLogFormatter.java index 7cb50d14fa8..12cd7450824 100644 --- a/forge-game/src/main/java/forge/game/GameLogFormatter.java +++ b/forge-game/src/main/java/forge/game/GameLogFormatter.java @@ -274,8 +274,7 @@ public class GameLogFormatter extends IGameEventVisitor.Base { blockers = att.getValue(); if (blockers.isEmpty()) { sb.append(Localizer.getInstance().getMessage("lblLogPlayerDidntBlockAttacker", controllerName, att.getKey())); - } - else { + } else { sb.append(Localizer.getInstance().getMessage("lblLogPlayerAssignedBlockerToBlockAttacker", controllerName, Lang.joinHomogenous(blockers), att.getKey())); } firstAttacker = false; diff --git a/forge-game/src/main/java/forge/game/ability/AbilityFactory.java b/forge-game/src/main/java/forge/game/ability/AbilityFactory.java index 13d36cd4633..c8723830c9a 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityFactory.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityFactory.java @@ -178,7 +178,6 @@ public final class AbilityFactory { return getAbility(type, type.getApiTypeOf(mapParams), mapParams, parseAbilityCost(state, mapParams, type), state, sVarHolder); } - public static Cost parseAbilityCost(final CardState state, Map mapParams, AbilityRecordType type) { Cost abCost = null; if (type != AbilityRecordType.SubAbility) { diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index f4e757c137e..7cbfd343112 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -1282,7 +1282,8 @@ public class AbilityUtils { } else if (defined.equals("Opponent")) { players.addAll(player.getOpponents()); - } else if (defined.startsWith("NextPlayerToYour")) { + } + else if (defined.startsWith("NextPlayerToYour")) { Direction dir = defined.substring(16).equals("Left") ? Direction.Left : Direction.Right; players.add(game.getNextPlayerAfter(player, dir)); } @@ -1806,6 +1807,19 @@ public class AbilityUtils { } return count; } + // Count$TriggeredManaCostDevotion. + if (sq[0].startsWith("TriggeredManaCostDevotion")) { + final SpellAbility root = sa.getRootAbility(); + Card triggeringObject = (Card) root.getTriggeringObject(AbilityKey.Card); + int count = 0; + byte colorCode = ManaAtom.fromName(sq[1]); + for (ManaCostShard sh : triggeringObject.getManaCost()) { + if (sh.isColor(colorCode)) { + count++; + } + } + return count; + } // Count$TriggeredPayingMana.. if (sq[0].startsWith("TriggeredPayingMana")) { final SpellAbility root = sa.getRootAbility(); @@ -1927,7 +1941,7 @@ public class AbilityUtils { // Count$DevotionDual.. // Count$Devotion. if (sq[0].contains("Devotion")) { - int colorOcurrencices = 0; + int colorOccurrences = 0; String colorName = sq[1]; if (colorName.contains("Chosen")) { colorName = MagicColor.toShortString(c.getChosenColor()); @@ -1939,12 +1953,12 @@ public class AbilityUtils { for (Card c0 : player.getCardsIn(ZoneType.Battlefield)) { for (ManaCostShard sh : c0.getManaCost()) { if (sh.isColor(colorCode)) { - colorOcurrencices++; + colorOccurrences++; } } - colorOcurrencices += c0.getAmountOfKeyword("Your devotion to each color and each combination of colors is increased by one."); + colorOccurrences += c0.getAmountOfKeyword("Your devotion to each color and each combination of colors is increased by one."); } - return doXMath(colorOcurrencices, expr, c, ctb); + return doXMath(colorOccurrences, expr, c, ctb); } } // end ctb != null diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java index 59ba85ecc2d..743c746ae9f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java @@ -1,21 +1,15 @@ package forge.game.ability.effects; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.List; -import org.apache.commons.lang3.StringUtils; - import com.google.common.base.Predicate; import com.google.common.base.Predicates; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; import forge.StaticData; import forge.card.CardFacePredicates; import forge.card.CardRules; -import forge.card.CardRulesPredicates; import forge.card.CardSplitType; import forge.card.ICardFace; import forge.game.ability.AbilityUtils; @@ -26,9 +20,7 @@ import forge.game.card.CardLists; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; -import forge.item.PaperCard; import forge.util.Aggregates; -import forge.util.ComparableOp; import forge.util.Localizer; public class ChooseCardNameEffect extends SpellAbilityEffect { diff --git a/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java b/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java index e34e1b33c9e..8168028e11e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java @@ -327,11 +327,10 @@ public class EffectEffect extends SpellAbilityEffect { hostCard.addImprintedCard(eff); } - eff.updateStateForView(); - // TODO: Add targeting to the effect so it knows who it's dealing with game.getTriggerHandler().suppressMode(TriggerType.ChangesZone); game.getAction().moveTo(ZoneType.Command, eff, sa); + eff.updateStateForView(); game.getTriggerHandler().clearSuppression(TriggerType.ChangesZone); //if (effectTriggers != null) { // game.getTriggerHandler().registerActiveTrigger(cmdEffect, false); diff --git a/forge-game/src/main/java/forge/game/ability/effects/RegenerateAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RegenerateAllEffect.java index 626568be339..c25f9239760 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RegenerateAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RegenerateAllEffect.java @@ -36,7 +36,7 @@ public class RegenerateAllEffect extends RegenerateBaseEffect { list = CardLists.getValidCards(list, valid.split(","), hostCard.getController(), hostCard, sa); // create Effect for Regeneration - createRengenerationEffect(sa, list); + createRegenerationEffect(sa, list); } // regenerateAllResolve } diff --git a/forge-game/src/main/java/forge/game/ability/effects/RegenerateBaseEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RegenerateBaseEffect.java index 2429a660154..adcb187be84 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RegenerateBaseEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RegenerateBaseEffect.java @@ -17,7 +17,7 @@ import forge.game.zone.ZoneType; public abstract class RegenerateBaseEffect extends SpellAbilityEffect { - public void createRengenerationEffect(SpellAbility sa, final Iterable list) { + public void createRegenerationEffect(SpellAbility sa, final Iterable list) { final Card hostCard = sa.getHostCard(); final Game game = hostCard.getGame(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/RegenerateEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RegenerateEffect.java index 5eca60660f9..8a9541342f7 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RegenerateEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RegenerateEffect.java @@ -46,7 +46,7 @@ public class RegenerateEffect extends RegenerateBaseEffect { @Override public void resolve(SpellAbility sa) { // create Effect for Regeneration - createRengenerationEffect(sa, getTargetCards(sa)); - } // regenerateResolve + createRegenerationEffect(sa, getTargetCards(sa)); + } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/RegenerationEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RegenerationEffect.java index f96ad2a2ead..b107e531166 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RegenerationEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RegenerationEffect.java @@ -31,6 +31,7 @@ public class RegenerationEffect extends SpellAbilityEffect { c.addRegeneratedThisTurn(); if (game.getCombat() != null) { + game.getCombat().saveLKI(c); game.getCombat().removeFromCombat(c); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/RemoveFromCombatEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RemoveFromCombatEffect.java index 9778b854703..82a377a84f6 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RemoveFromCombatEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RemoveFromCombatEffect.java @@ -59,6 +59,7 @@ public class RemoveFromCombatEffect extends SpellAbilityEffect { } } + game.getCombat().saveLKI(c); combat.removeFromCombat(c); if (rem) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java index 7d81128d7bc..53ce96f4059 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java @@ -49,6 +49,7 @@ public class RestartGameEffect extends SpellAbilityEffect { game.clearCounterAddedThisTurn(); game.resetPlayersAttackedOnNextTurn(); game.resetPlayersAttackedOnNextTurn(); + game.setMonarch(null); GameAction action = game.getAction(); for (Player p: players) { @@ -59,6 +60,7 @@ public class RestartGameEffect extends SpellAbilityEffect { p.setLandsPlayedLastTurn(0); p.resetCommanderStats(); p.resetCompletedDungeons(); + p.setBlessing(false); CardCollection newLibrary = new CardCollection(p.getCardsIn(restartZones, false)); List filteredCards = null; @@ -111,4 +113,3 @@ public class RestartGameEffect extends SpellAbilityEffect { return TextUtil.fastReplace(desc, "CARDNAME", sa.getHostCard().getName()); } } - 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 949130f83a8..d0fc243dc25 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -32,6 +32,7 @@ import forge.game.ability.AbilityKey; import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.combat.Combat; +import forge.game.combat.CombatLki; import forge.game.cost.Cost; import forge.game.cost.CostSacrifice; import forge.game.event.*; @@ -295,6 +296,8 @@ public class Card extends GameEntity implements Comparable, IHasSVars { private final Table> chosenModesTurnStatic = HashBasedTable.create(); private final Table> chosenModesGameStatic = HashBasedTable.create(); + private CombatLki combatLKI = null; + // Enumeration for CMC request types public enum SplitCMCMode { CurrentSideCMC, @@ -1354,7 +1357,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { @Override public int addCounter(final CounterType counterType, final int n, final Player source, final SpellAbility cause, final boolean applyMultiplier, final boolean fireEvents, GameEntityCounterTable table) { int addAmount = n; - if(addAmount <= 0 || !canReceiveCounters(counterType)) { + if (addAmount <= 0 || !canReceiveCounters(counterType)) { // As per rule 107.1b return 0; } @@ -1974,6 +1977,8 @@ public class Card extends GameEntity implements Comparable, IHasSVars { sbx.append(" (").append(inst.getReminderText()).append(")"); sbLong.append(sbx).append("\r\n"); } + } else if (keyword.startsWith("Trample:")) { + sbLong.append("Trample over planeswalkers").append(" (").append(inst.getReminderText()).append(")").append("\r\n"); } else if (keyword.startsWith("Hexproof:")) { final String[] k = keyword.split(":"); sbLong.append("Hexproof from ").append(k[2]) @@ -2000,7 +2005,6 @@ public class Card extends GameEntity implements Comparable, IHasSVars { || keyword.equals("Suspend") // for the ones without amount || keyword.equals("Foretell") // for the ones without cost || keyword.equals("Hideaway") || keyword.equals("Ascend") - || keyword.equals("Trample over planeswalkers") || keyword.equals("Totem armor") || keyword.equals("Battle cry") || keyword.equals("Devoid") || keyword.equals("Riot")){ sbLong.append(keyword).append(" (").append(inst.getReminderText()).append(")"); @@ -4670,6 +4674,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { setPhasedOut(!phasedOut); final Combat combat = getGame().getPhaseHandler().getCombat(); if (combat != null && phasedOut) { + combat.saveLKI(this); combat.removeFromCombat(this); } @@ -6167,7 +6172,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { return false; } - if (source == null){ + if (source == null) { return true; } @@ -6924,4 +6929,18 @@ public class Card extends GameEntity implements Comparable, IHasSVars { public final void clearUntilLeavesBattlefield() { 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); + } } 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 2c10561077f..c739451f738 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -518,6 +518,7 @@ public class CardFactoryUtil { final Set protectionkw = Sets.newHashSet(); final Set protectionColorkw = Sets.newHashSet(); final Set hexproofkw = Sets.newHashSet(); + final Set tramplekw = Sets.newHashSet(); final Set allkw = Sets.newHashSet(); for (Card c : CardLists.getValidCards(cardlist, restrictions, p, host, null)) { @@ -535,6 +536,8 @@ public class CardFactoryUtil { } } else if (k.startsWith("Hexproof")) { hexproofkw.add(k); + } else if (k.startsWith("Trample")) { + tramplekw.add(k); } allkw.add(k); } @@ -548,6 +551,8 @@ public class CardFactoryUtil { filteredkw.addAll(landkw); } else if (keyword.equals("Hexproof")) { filteredkw.addAll(hexproofkw); + } else if (keyword.equals("Trample")) { + filteredkw.addAll(tramplekw); } else if (allkw.contains(keyword)) { filteredkw.add(keyword); } @@ -781,7 +786,7 @@ public class CardFactoryUtil { + "TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ " + "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); trigger.setOverridingAbility(AbilityFactory.getAbility(effect, card)); @@ -1516,7 +1521,7 @@ public class CardFactoryUtil { } else if (keyword.equals("Provoke")) { final String actualTrigger = "Mode$ Attacks | ValidCard$ Card.Self | OptionalDecider$ You | Secondary$ True" + " | 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"; SpellAbility blockSA = AbilityFactory.getAbility(blockStr, card); diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index 2e7fc988c48..46d0a2d916a 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -1412,8 +1412,7 @@ public class CardProperty { // These predicated refer to ongoing combat. If no combat happens, they'll return false (meaning not attacking/blocking ATM) else if (property.startsWith("attacking")) { if (null == combat) return false; - if (property.equals("attacking")) return combat.isAttacking(card); - if (property.equals("attackingLKI")) return combat.isLKIAttacking(card); + if (property.equals("attacking")) return card.isAttacking(); if (property.equals("attackingYou")) return combat.isAttacking(card, sourceController); if (property.equals("attackingSame")) { final GameEntity attacked = combat.getDefenderByAttacker(source); @@ -1514,12 +1513,10 @@ public class CardProperty { return false; } String valid = property.split(" ")[1]; - for(Card c : blocked) { - if (c.isValid(valid, card.getController(), source, spellAbility)) { - return true; - } + if (Iterables.any(blocked, CardPredicates.restriction(valid, card.getController(), source, spellAbility))) { + return true; } - for(Card c : AbilityUtils.getDefinedCards(source, valid, spellAbility)) { + for (Card c : AbilityUtils.getDefinedCards(source, valid, spellAbility)) { if (blocked.contains(c)) { return true; } 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 b5c8cf23516..bb57f0115a5 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -323,6 +323,10 @@ public final class CardUtil { newCopy.setExiledWith(getLKICopy(in.getExiledWith(), cachedMap)); + if (in.getGame().getCombat() != null) { + newCopy.setCombatLKI(in.getGame().getCombat().saveLKI(newCopy)); + } + return newCopy; } diff --git a/forge-game/src/main/java/forge/game/card/CounterType.java b/forge-game/src/main/java/forge/game/card/CounterType.java index d64222b1691..c9e6d279f0d 100644 --- a/forge-game/src/main/java/forge/game/card/CounterType.java +++ b/forge-game/src/main/java/forge/game/card/CounterType.java @@ -97,6 +97,9 @@ public class CounterType implements Comparable, Serializable { final String[] k = sVal.split(":"); return "Hexproof from " + k[2]; } + if (sVal.startsWith("Trample:")) { + return "Trample over Planeswalkers"; + } return sVal; } @@ -119,6 +122,9 @@ public class CounterType implements Comparable, Serializable { if (sVal.startsWith("Hexproof:")) { return true; } + if (sVal.startsWith("Trample:")) { + return true; + } return keywordCounter.contains(sVal); } diff --git a/forge-game/src/main/java/forge/game/combat/Combat.java b/forge-game/src/main/java/forge/game/combat/Combat.java index 857b0738076..4fccef7ba91 100644 --- a/forge-game/src/main/java/forge/game/combat/Combat.java +++ b/forge-game/src/main/java/forge/game/combat/Combat.java @@ -45,6 +45,7 @@ import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; import forge.game.card.CardDamageMap; +import forge.game.card.CardUtil; import forge.game.keyword.Keyword; import forge.game.player.Player; import forge.game.replacement.ReplacementType; @@ -75,7 +76,7 @@ public class Combat { private Map attackersOrderedForDamageAssignment = Maps.newHashMap(); private Map blockersOrderedForDamageAssignment = Maps.newHashMap(); - private Map lkiCache = Maps.newHashMap(); + private CardCollection lkiCache = new CardCollection(); 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) @@ -300,7 +301,7 @@ public class Combat { return ab; } } - CombatLki lki = lkiCache.get(c); + CombatLki lki = lkiCache.get(c).getCombatLKI(); return lki == null || !lki.isAttacker ? null : lki.getFirstBand(); } @@ -316,14 +317,6 @@ public class Combat { 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) { AttackingBand ab = getBandOfAttacker(card); for (Entry ee : attackedByBands.entries()) { @@ -786,7 +779,7 @@ public class Combat { assignedDamage = true; GameEntity defender = getDefenderByAttacker(band); // If the Attacker is unblocked, or it's a trampler and has 0 blockers, deal damage to defender - if (defender instanceof Card && attacker.hasKeyword("Trample over planeswalkers")) { + if (defender instanceof Card && attacker.hasKeyword("Trample:Planeswalker")) { if (orderedBlockers == null || orderedBlockers.isEmpty()) { CardCollection cc = new CardCollection(); cc.add((Card)defender); @@ -918,7 +911,7 @@ public class Combat { return false; } - CombatLki lki = lkiCache.get(blocker); + CombatLki lki = lkiCache.get(blocker).getCombatLKI(); return null != lki && !lki.isAttacker; // was blocking something anyway } @@ -933,21 +926,36 @@ public class Combat { 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 } - public void saveLKI(Card lastKnownInfo) { + public CombatLki saveLKI(Card lki) { + if (!lki.isLKI()) { + lki = CardUtil.getLKICopy(lki); + } FCollectionView attackersBlocked = null; - final AttackingBand attackingBand = getBandOfAttacker(lastKnownInfo); + final AttackingBand attackingBand = getBandOfAttacker(lki); final boolean isAttacker = attackingBand != null; - if (!isAttacker) { - attackersBlocked = getAttackingBandsBlockedBy(lastKnownInfo); + if (isAttacker) { + 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()) { - return; // card was not even in combat + return null; // card was not even in combat } } + lkiCache.add(lki); final FCollectionView relatedBands = isAttacker ? new FCollection<>(attackingBand) : attackersBlocked; - lkiCache.put(lastKnownInfo, new CombatLki(isAttacker, relatedBands)); + return new CombatLki(isAttacker, relatedBands); } } diff --git a/forge-game/src/main/java/forge/game/cost/Cost.java b/forge-game/src/main/java/forge/game/cost/Cost.java index fae4d70df52..65e87a3b4ff 100644 --- a/forge-game/src/main/java/forge/game/cost/Cost.java +++ b/forge-game/src/main/java/forge/game/cost/Cost.java @@ -240,8 +240,7 @@ public class Cost implements Serializable { xCantBe0 = true; } else if ("Mandatory".equals(part)) { this.isMandatory = true; - } - else { + } else { CostPart cp = parseCostPart(part, tapCost, untapCost); if (null != cp ) if (cp instanceof CostPartMana ) { @@ -268,7 +267,6 @@ public class Cost implements Serializable { } private static CostPart parseCostPart(String parse, boolean tapCost, boolean untapCost) { - if (parse.startsWith("Mana<")) { final String[] splitStr = TextUtil.split(abCostParse(parse, 1)[0], '\\'); final String restriction = splitStr.length > 1 ? splitStr[1] : null; diff --git a/forge-game/src/main/java/forge/game/event/GameEventAnteCardsSelected.java b/forge-game/src/main/java/forge/game/event/GameEventAnteCardsSelected.java index de91fa47733..1b9c06ece6e 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventAnteCardsSelected.java +++ b/forge-game/src/main/java/forge/game/event/GameEventAnteCardsSelected.java @@ -10,8 +10,7 @@ public class GameEventAnteCardsSelected extends GameEvent { public GameEventAnteCardsSelected(Multimap list) { cards = list; } - - + @Override public T visit(IGameEventVisitor visitor) { return visitor.visit(this); diff --git a/forge-game/src/main/java/forge/game/event/GameEventAttackersDeclared.java b/forge-game/src/main/java/forge/game/event/GameEventAttackersDeclared.java index 561598eaac1..09ef47c0a43 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventAttackersDeclared.java +++ b/forge-game/src/main/java/forge/game/event/GameEventAttackersDeclared.java @@ -14,7 +14,7 @@ public class GameEventAttackersDeclared extends GameEvent { public final Player player; public final Multimap attackersMap; - + public GameEventAttackersDeclared(Player playerTurn, Multimap attackersMap) { this.player = playerTurn; this.attackersMap = attackersMap; diff --git a/forge-game/src/main/java/forge/game/event/GameEventBlockersDeclared.java b/forge-game/src/main/java/forge/game/event/GameEventBlockersDeclared.java index 87a78679c28..810c727b87c 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventBlockersDeclared.java +++ b/forge-game/src/main/java/forge/game/event/GameEventBlockersDeclared.java @@ -20,7 +20,7 @@ public class GameEventBlockersDeclared extends GameEvent { public final Map> blockers; public final Player defendingPlayer; - + public GameEventBlockersDeclared(Player who, Map> blockers) { this.blockers = blockers; defendingPlayer = who; diff --git a/forge-game/src/main/java/forge/game/event/GameEventCardAttachment.java b/forge-game/src/main/java/forge/game/event/GameEventCardAttachment.java index 567e9208d48..1653c15777e 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventCardAttachment.java +++ b/forge-game/src/main/java/forge/game/event/GameEventCardAttachment.java @@ -8,13 +8,13 @@ public class GameEventCardAttachment extends GameEvent { 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 oldEntiy; - + public GameEventCardAttachment(Card attachment, GameEntity formerEntity, GameEntity newEntity) { this.equipment = attachment; this.newTarget = newEntity; this.oldEntiy = formerEntity; } - + @Override public T visit(IGameEventVisitor visitor) { return visitor.visit(this); diff --git a/forge-game/src/main/java/forge/game/event/GameEventCardChangeZone.java b/forge-game/src/main/java/forge/game/event/GameEventCardChangeZone.java index 42cbde5dd20..12bb68655b4 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventCardChangeZone.java +++ b/forge-game/src/main/java/forge/game/event/GameEventCardChangeZone.java @@ -6,11 +6,10 @@ import forge.util.TextUtil; 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) { card = c; from = zoneFrom; @@ -21,7 +20,7 @@ public class GameEventCardChangeZone extends GameEvent { public T visit(IGameEventVisitor visitor) { return visitor.visit(this); } - + /* (non-Javadoc) * @see java.lang.Object#toString() */ diff --git a/forge-game/src/main/java/forge/game/event/GameEventCardCounters.java b/forge-game/src/main/java/forge/game/event/GameEventCardCounters.java index 45284d863db..31c09db1b7e 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventCardCounters.java +++ b/forge-game/src/main/java/forge/game/event/GameEventCardCounters.java @@ -15,7 +15,7 @@ public class GameEventCardCounters extends GameEvent { this.oldValue = old; this.newValue = newValue; } - + @Override public T visit(IGameEventVisitor visitor) { return visitor.visit(this); diff --git a/forge-game/src/main/java/forge/game/event/GameEventCardDamaged.java b/forge-game/src/main/java/forge/game/event/GameEventCardDamaged.java index 149cf8e3ea9..69a4c156205 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventCardDamaged.java +++ b/forge-game/src/main/java/forge/game/event/GameEventCardDamaged.java @@ -3,7 +3,7 @@ package forge.game.event; import forge.game.card.Card; public class GameEventCardDamaged extends GameEvent { - + public enum DamageType { Normal, M1M1Counters, diff --git a/forge-game/src/main/java/forge/game/event/GameEventCardDestroyed.java b/forge-game/src/main/java/forge/game/event/GameEventCardDestroyed.java index c990b0df78a..bfb0d0590cf 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventCardDestroyed.java +++ b/forge-game/src/main/java/forge/game/event/GameEventCardDestroyed.java @@ -1,7 +1,7 @@ package forge.game.event; public class GameEventCardDestroyed extends GameEvent { - + @Override public T visit(IGameEventVisitor visitor) { return visitor.visit(this); diff --git a/forge-game/src/main/java/forge/game/event/GameEventCardModeChosen.java b/forge-game/src/main/java/forge/game/event/GameEventCardModeChosen.java index 634b78a0cdb..24ce0c5f1bb 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventCardModeChosen.java +++ b/forge-game/src/main/java/forge/game/event/GameEventCardModeChosen.java @@ -3,12 +3,12 @@ package forge.game.event; import forge.game.player.Player; public class GameEventCardModeChosen extends GameEvent { - + public final Player player; public final String cardName; public final String mode; public final boolean log; - + public GameEventCardModeChosen(Player player, String cardName, String mode, boolean log) { this.player = player; this.cardName = cardName; @@ -21,5 +21,3 @@ public class GameEventCardModeChosen extends GameEvent { return visitor.visit(this); } } - - diff --git a/forge-game/src/main/java/forge/game/event/GameEventCardPhased.java b/forge-game/src/main/java/forge/game/event/GameEventCardPhased.java index f637301e1a4..132aae4bce7 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventCardPhased.java +++ b/forge-game/src/main/java/forge/game/event/GameEventCardPhased.java @@ -10,7 +10,7 @@ public class GameEventCardPhased extends GameEvent { public final Card card; public final boolean phaseState; - + public GameEventCardPhased(Card card, boolean state) { this.card = card; phaseState = state; @@ -20,7 +20,7 @@ public class GameEventCardPhased extends GameEvent { public T visit(IGameEventVisitor visitor) { return visitor.visit(this); } - + /* (non-Javadoc) * @see java.lang.Object#toString() */ diff --git a/forge-game/src/main/java/forge/game/event/GameEventCardRegenerated.java b/forge-game/src/main/java/forge/game/event/GameEventCardRegenerated.java index 55fb988fe64..45a84360374 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventCardRegenerated.java +++ b/forge-game/src/main/java/forge/game/event/GameEventCardRegenerated.java @@ -1,7 +1,7 @@ package forge.game.event; public class GameEventCardRegenerated extends GameEvent { - + @Override public T visit(IGameEventVisitor visitor) { return visitor.visit(this); diff --git a/forge-game/src/main/java/forge/game/event/GameEventCardSacrificed.java b/forge-game/src/main/java/forge/game/event/GameEventCardSacrificed.java index fdd36b17ff1..105d9d1724c 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventCardSacrificed.java +++ b/forge-game/src/main/java/forge/game/event/GameEventCardSacrificed.java @@ -1,7 +1,7 @@ package forge.game.event; public class GameEventCardSacrificed extends GameEvent { - + @Override public T visit(IGameEventVisitor visitor) { return visitor.visit(this); diff --git a/forge-game/src/main/java/forge/game/event/GameEventCardStatsChanged.java b/forge-game/src/main/java/forge/game/event/GameEventCardStatsChanged.java index b2e16e6e347..140e3a2ef00 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventCardStatsChanged.java +++ b/forge-game/src/main/java/forge/game/event/GameEventCardStatsChanged.java @@ -18,7 +18,7 @@ public class GameEventCardStatsChanged extends GameEvent { public GameEventCardStatsChanged(Card affected) { cards = Arrays.asList(affected); } - + public GameEventCardStatsChanged(Collection affected) { cards = affected; } @@ -31,13 +31,13 @@ public class GameEventCardStatsChanged extends GameEvent { // TODO Auto-generated method stub return visitor.visit(this); } - + @Override public String toString() { Card card = Iterables.getFirst(cards, null); - if ( null == card ) + if (null == card) return "Card state changes: (empty list)"; - if( cards.size() == 1) + if (cards.size() == 1) return "Card state changes: " + card.getName() + " (" + StringUtils.join(card.getType(), ' ') + ") " + card.getNetPower() + "/" + card.getNetToughness(); diff --git a/forge-game/src/main/java/forge/game/event/GameEventCardTapped.java b/forge-game/src/main/java/forge/game/event/GameEventCardTapped.java index 21e84f6ce2b..993e1cda1db 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventCardTapped.java +++ b/forge-game/src/main/java/forge/game/event/GameEventCardTapped.java @@ -10,8 +10,7 @@ public class GameEventCardTapped extends GameEvent { this.tapped = tapped; this.card = card; } - - + @Override public T visit(IGameEventVisitor visitor) { return visitor.visit(this); diff --git a/forge-game/src/main/java/forge/game/event/GameEventCombatEnded.java b/forge-game/src/main/java/forge/game/event/GameEventCombatEnded.java index b3f45a44280..db7b42e3de4 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventCombatEnded.java +++ b/forge-game/src/main/java/forge/game/event/GameEventCombatEnded.java @@ -8,7 +8,7 @@ public class GameEventCombatEnded extends GameEvent { public final List attackers; public final List blockers; - + public GameEventCombatEnded(List attackers, List blockers) { this.attackers = attackers; this.blockers = blockers; diff --git a/forge-game/src/main/java/forge/game/event/GameEventFlipCoin.java b/forge-game/src/main/java/forge/game/event/GameEventFlipCoin.java index 02d05b6cabb..a28dc4ed16e 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventFlipCoin.java +++ b/forge-game/src/main/java/forge/game/event/GameEventFlipCoin.java @@ -1,8 +1,7 @@ package forge.game.event; public class GameEventFlipCoin extends GameEvent { - - + @Override public T visit(IGameEventVisitor visitor) { return visitor.visit(this); diff --git a/forge-game/src/main/java/forge/game/event/GameEventGameOutcome.java b/forge-game/src/main/java/forge/game/event/GameEventGameOutcome.java index 3d9210555fa..4a675c05881 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventGameOutcome.java +++ b/forge-game/src/main/java/forge/game/event/GameEventGameOutcome.java @@ -12,8 +12,7 @@ public class GameEventGameOutcome extends GameEvent { this.result = lastOne; this.history = history; } - - + @Override public T visit(IGameEventVisitor visitor) { return visitor.visit(this); diff --git a/forge-game/src/main/java/forge/game/event/GameEventGameRestarted.java b/forge-game/src/main/java/forge/game/event/GameEventGameRestarted.java index dacc7c0c539..e997831a714 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventGameRestarted.java +++ b/forge-game/src/main/java/forge/game/event/GameEventGameRestarted.java @@ -9,12 +9,11 @@ import forge.game.player.Player; public class GameEventGameRestarted extends GameEvent { public final Player whoRestarted; - + public GameEventGameRestarted(Player playerTurn) { whoRestarted = playerTurn; } - @Override public T visit(IGameEventVisitor visitor) { return visitor.visit(this); diff --git a/forge-game/src/main/java/forge/game/event/GameEventGameStarted.java b/forge-game/src/main/java/forge/game/event/GameEventGameStarted.java index b3da3b48099..550a439d5e5 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventGameStarted.java +++ b/forge-game/src/main/java/forge/game/event/GameEventGameStarted.java @@ -22,12 +22,11 @@ public class GameEventGameStarted extends GameEvent { this.players = players; } - @Override public T visit(IGameEventVisitor visitor) { return visitor.visit(this); } - + /* (non-Javadoc) * @see java.lang.Object#toString() */ diff --git a/forge-game/src/main/java/forge/game/event/GameEventLandPlayed.java b/forge-game/src/main/java/forge/game/event/GameEventLandPlayed.java index a1b00918cc3..595bf9783c9 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventLandPlayed.java +++ b/forge-game/src/main/java/forge/game/event/GameEventLandPlayed.java @@ -14,7 +14,6 @@ public class GameEventLandPlayed extends GameEvent { } - @Override public T visit(IGameEventVisitor visitor) { return visitor.visit(this); diff --git a/forge-game/src/main/java/forge/game/event/GameEventManaBurn.java b/forge-game/src/main/java/forge/game/event/GameEventManaBurn.java index 30c5a9b5bbf..5b9a06367f1 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventManaBurn.java +++ b/forge-game/src/main/java/forge/game/event/GameEventManaBurn.java @@ -4,11 +4,11 @@ import forge.game.player.Player; // This special event denotes loss of mana due to phase end public class GameEventManaBurn extends GameEvent { - + public final Player player; public final boolean causedLifeLoss; public final int amount; - + /** * TODO: Write javadoc for Constructor. * @param dealDamage @@ -19,7 +19,7 @@ public class GameEventManaBurn extends GameEvent { amount = burn; causedLifeLoss = dealDamage; } - + @Override public T visit(IGameEventVisitor visitor) { return visitor.visit(this); diff --git a/forge-game/src/main/java/forge/game/event/GameEventManaPool.java b/forge-game/src/main/java/forge/game/event/GameEventManaPool.java index 003006ad4c8..1d37a832e42 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventManaPool.java +++ b/forge-game/src/main/java/forge/game/event/GameEventManaPool.java @@ -24,7 +24,7 @@ public class GameEventManaPool extends GameEvent { public T visit(IGameEventVisitor visitor) { return visitor.visit(this); } - + /* (non-Javadoc) * @see java.lang.Object#toString() */ diff --git a/forge-game/src/main/java/forge/game/event/GameEventMulligan.java b/forge-game/src/main/java/forge/game/event/GameEventMulligan.java index 9260d09e022..30dcd25391b 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventMulligan.java +++ b/forge-game/src/main/java/forge/game/event/GameEventMulligan.java @@ -12,8 +12,7 @@ public class GameEventMulligan extends GameEvent { public GameEventMulligan(Player p) { player = p; } - - + @Override public T visit(IGameEventVisitor visitor) { return visitor.visit(this); diff --git a/forge-game/src/main/java/forge/game/event/GameEventPlayerLivesChanged.java b/forge-game/src/main/java/forge/game/event/GameEventPlayerLivesChanged.java index 7b303ead7ab..c84ab7edea5 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventPlayerLivesChanged.java +++ b/forge-game/src/main/java/forge/game/event/GameEventPlayerLivesChanged.java @@ -8,18 +8,18 @@ public class GameEventPlayerLivesChanged extends GameEvent { public final Player player; public final int oldLives; public final int newLives; - + public GameEventPlayerLivesChanged(Player who, int oldValue, int newValue) { player = who; oldLives = oldValue; newLives = newValue; } - + @Override public T visit(IGameEventVisitor visitor) { return visitor.visit(this); } - + @Override public String toString() { return TextUtil.concatWithSpace(Lang.getInstance().getPossesive(player.getName()),"lives changed:", String.valueOf(oldLives),"->", String.valueOf(newLives)); diff --git a/forge-game/src/main/java/forge/game/event/GameEventPlayerPoisoned.java b/forge-game/src/main/java/forge/game/event/GameEventPlayerPoisoned.java index aa79ef66aa9..6adcebeb9e2 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventPlayerPoisoned.java +++ b/forge-game/src/main/java/forge/game/event/GameEventPlayerPoisoned.java @@ -19,8 +19,7 @@ public class GameEventPlayerPoisoned extends GameEvent { oldValue = old; amount = num; } - - + @Override public T visit(IGameEventVisitor visitor) { return visitor.visit(this); diff --git a/forge-game/src/main/java/forge/game/event/GameEventPlayerPriority.java b/forge-game/src/main/java/forge/game/event/GameEventPlayerPriority.java index 8ea6d8a3fbb..0a748996269 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventPlayerPriority.java +++ b/forge-game/src/main/java/forge/game/event/GameEventPlayerPriority.java @@ -13,7 +13,7 @@ public class GameEventPlayerPriority extends GameEvent { public final Player turn; public final PhaseType phase; public final Player priority; - + public GameEventPlayerPriority(Player playerTurn, PhaseType phase, Player priorityPlayer) { turn = playerTurn; this.phase = phase; @@ -25,7 +25,6 @@ public class GameEventPlayerPriority extends GameEvent { return visitor.visit(this); } - /* (non-Javadoc) * @see java.lang.Object#toString() */ diff --git a/forge-game/src/main/java/forge/game/event/GameEventScry.java b/forge-game/src/main/java/forge/game/event/GameEventScry.java index 18ec8b70dba..624de741bf2 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventScry.java +++ b/forge-game/src/main/java/forge/game/event/GameEventScry.java @@ -3,10 +3,10 @@ package forge.game.event; import forge.game.player.Player; public class GameEventScry extends GameEvent { - + public final Player player; public final int toTop, toBottom; - + public GameEventScry(Player player, int toTop, int toBottom) { this.player = player; this.toTop = toTop; @@ -18,4 +18,3 @@ public class GameEventScry extends GameEvent { return visitor.visit(this); } } - diff --git a/forge-game/src/main/java/forge/game/event/GameEventShuffle.java b/forge-game/src/main/java/forge/game/event/GameEventShuffle.java index fbc8d923757..893d617fe16 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventShuffle.java +++ b/forge-game/src/main/java/forge/game/event/GameEventShuffle.java @@ -5,9 +5,9 @@ import forge.util.Lang; import forge.util.TextUtil; public class GameEventShuffle extends GameEvent { - + public final Player player; - + public GameEventShuffle(Player player) { this.player = player; } @@ -16,7 +16,7 @@ public class GameEventShuffle extends GameEvent { public T visit(IGameEventVisitor visitor) { return visitor.visit(this); } - + /* (non-Javadoc) * @see java.lang.Object#toString() */ diff --git a/forge-game/src/main/java/forge/game/event/GameEventSpellAbilityCast.java b/forge-game/src/main/java/forge/game/event/GameEventSpellAbilityCast.java index c65b6823a78..54e075c63c7 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventSpellAbilityCast.java +++ b/forge-game/src/main/java/forge/game/event/GameEventSpellAbilityCast.java @@ -13,7 +13,7 @@ public class GameEventSpellAbilityCast extends GameEvent { public final SpellAbilityStackInstance si; public final boolean replicate; public final int stackIndex; - + public GameEventSpellAbilityCast(SpellAbility sp, SpellAbilityStackInstance si, int stackIndex, boolean replicate) { sa = sp; this.si = si; diff --git a/forge-game/src/main/java/forge/game/event/GameEventSpellResolved.java b/forge-game/src/main/java/forge/game/event/GameEventSpellResolved.java index f4c5e0fb592..af97226fcfb 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventSpellResolved.java +++ b/forge-game/src/main/java/forge/game/event/GameEventSpellResolved.java @@ -23,8 +23,6 @@ public class GameEventSpellResolved extends GameEvent { this.hasFizzled = hasFizzled; } - - @Override public T visit(IGameEventVisitor visitor) { return visitor.visit(this); diff --git a/forge-game/src/main/java/forge/game/event/GameEventSurveil.java b/forge-game/src/main/java/forge/game/event/GameEventSurveil.java index db003097bb1..8ef9e8710f9 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventSurveil.java +++ b/forge-game/src/main/java/forge/game/event/GameEventSurveil.java @@ -3,10 +3,10 @@ package forge.game.event; import forge.game.player.Player; public class GameEventSurveil extends GameEvent { - + public final Player player; public final int toLibrary, toGraveyard; - + public GameEventSurveil(Player player, int toLibrary, int toGraveyard) { this.player = player; this.toLibrary = toLibrary; @@ -18,4 +18,3 @@ public class GameEventSurveil extends GameEvent { return visitor.visit(this); } } - diff --git a/forge-game/src/main/java/forge/game/event/GameEventTokenCreated.java b/forge-game/src/main/java/forge/game/event/GameEventTokenCreated.java index aa1e651bbc0..9cae6830b1f 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventTokenCreated.java +++ b/forge-game/src/main/java/forge/game/event/GameEventTokenCreated.java @@ -1,8 +1,7 @@ package forge.game.event; public class GameEventTokenCreated extends GameEvent { - - + @Override public T visit(IGameEventVisitor visitor) { return visitor.visit(this); diff --git a/forge-game/src/main/java/forge/game/event/GameEventTurnBegan.java b/forge-game/src/main/java/forge/game/event/GameEventTurnBegan.java index 8247f100712..198e4c86614 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventTurnBegan.java +++ b/forge-game/src/main/java/forge/game/event/GameEventTurnBegan.java @@ -4,10 +4,10 @@ import forge.game.player.Player; import forge.util.TextUtil; public class GameEventTurnBegan extends GameEvent { - + public final Player turnOwner; public final int turnNumber; - + public GameEventTurnBegan(Player turnOwner, int turnNumber) { super(); this.turnOwner = turnOwner; @@ -18,7 +18,7 @@ public class GameEventTurnBegan extends GameEvent { public T visit(IGameEventVisitor visitor) { return visitor.visit(this); } - + /* (non-Javadoc) * @see java.lang.Object#toString() */ diff --git a/forge-game/src/main/java/forge/game/event/GameEventTurnEnded.java b/forge-game/src/main/java/forge/game/event/GameEventTurnEnded.java index d3f7c7eadb9..04e3fc22c30 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventTurnEnded.java +++ b/forge-game/src/main/java/forge/game/event/GameEventTurnEnded.java @@ -1,8 +1,7 @@ package forge.game.event; public class GameEventTurnEnded extends GameEvent { - - + @Override public T visit(IGameEventVisitor visitor) { return visitor.visit(this); diff --git a/forge-game/src/main/java/forge/game/event/IGameEventVisitor.java b/forge-game/src/main/java/forge/game/event/IGameEventVisitor.java index 0041e7545fc..c0aba8f84ad 100644 --- a/forge-game/src/main/java/forge/game/event/IGameEventVisitor.java +++ b/forge-game/src/main/java/forge/game/event/IGameEventVisitor.java @@ -105,4 +105,3 @@ public interface IGameEventVisitor { public T visit(GameEventZone event) { return null; } } } - diff --git a/forge-game/src/main/java/forge/game/keyword/Keyword.java b/forge-game/src/main/java/forge/game/keyword/Keyword.java index fe9dd404b4e..a31b1adbb0b 100644 --- a/forge-game/src/main/java/forge/game/keyword/Keyword.java +++ b/forge-game/src/main/java/forge/game/keyword/Keyword.java @@ -152,8 +152,7 @@ public enum Keyword { SURGE("Surge", KeywordWithCost.class, false, "You may cast this spell for its surge cost if you or a teammate has cast another spell this turn."), SUSPEND("Suspend", Suspend.class, false, "Rather than cast this card from your hand, you may pay %s and exile it with {%d:time counter} on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost."), TOTEM_ARMOR("Totem armor", SimpleKeyword.class, true, "If enchanted permanent would be destroyed, instead remove all damage marked on it and destroy this Aura."), - TRAMPLE("Trample", SimpleKeyword.class, true, "This creature can deal excess combat damage to the player or planeswalker it's attacking."), - TRAMPLE_OVER_PLANESWALKERS("Trample over planeswalkers", SimpleKeyword.class, true, "This creature can deal excess combat damage to the controller of the planeswalker it’s attacking."), + TRAMPLE("Trample", Trample.class, true, "This creature can deal excess combat damage to the player or planeswalker it's attacking."), TRANSFIGURE("Transfigure", KeywordWithCost.class, false, "%s, Sacrifice this creature: Search your library for a creature card with the same mana value as this creature and put that card onto the battlefield, then shuffle. Transfigure only as a sorcery."), TRANSMUTE("Transmute", KeywordWithCost.class, false, "%s, Discard this card: Search your library for a card with the same mana value as this card, reveal it, and put it into your hand, then shuffle. Transmute only as a sorcery."), TRIBUTE("Tribute", KeywordWithAmount.class, false, "As this creature enters the battlefield, an opponent of your choice may put {%d:+1/+1 counter} on it."), diff --git a/forge-game/src/main/java/forge/game/keyword/Trample.java b/forge-game/src/main/java/forge/game/keyword/Trample.java new file mode 100644 index 00000000000..d74920de663 --- /dev/null +++ b/forge-game/src/main/java/forge/game/keyword/Trample.java @@ -0,0 +1,35 @@ +package forge.game.keyword; + +import java.util.Collection; + +public class Trample extends KeywordInstance { + private String type = ""; + + @Override + protected void parse(String details) { + if (!details.isEmpty()) { + type = details.split(":")[0]; + } + } + + @Override + protected String formatReminderText(String reminderText) { + if (!type.isEmpty()) { + return "This creature can deal excess combat damage to the controller of the planeswalker it’s attacking."; + } + return reminderText; + } + + /* (non-Javadoc) + * @see forge.game.keyword.KeywordInstance#redundant(java.util.Collection) + */ + @Override + public boolean redundant(Collection list) { + for (KeywordInterface i : list) { + if (i.getOriginal().equals(getOriginal())) { + return true; + } + } + return false; + } +} diff --git a/forge-game/src/main/java/forge/game/mana/Mana.java b/forge-game/src/main/java/forge/game/mana/Mana.java index c1a7f022934..cc94f03b3df 100644 --- a/forge-game/src/main/java/forge/game/mana/Mana.java +++ b/forge-game/src/main/java/forge/game/mana/Mana.java @@ -20,8 +20,10 @@ package forge.game.mana; import forge.card.MagicColor; import forge.card.mana.ManaAtom; import forge.game.card.Card; +import forge.game.card.CardUtil; import forge.game.spellability.AbilityManaPart; import forge.game.spellability.SpellAbility; +import forge.game.zone.ZoneType; /** *

@@ -71,7 +73,7 @@ public class Mana { public Mana(final byte color, final Card source, final AbilityManaPart manaAbility) { this.color = color; this.manaAbility = manaAbility; - this.sourceCard = source; + this.sourceCard = source.isInZone(ZoneType.Battlefield) ? CardUtil.getLKICopy(source) : source.getGame().getChangeZoneLKIInfo(source); } @Override diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 9090e05852c..3667af7abc5 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -3221,21 +3221,21 @@ public class Player extends GameEntity implements Comparable { } public void updateKeywordCardAbilityText() { - if(getKeywordCard() == null) + if (getKeywordCard() == null) return; final PlayerZone com = getZone(ZoneType.Command); keywordEffect.setText(""); keywordEffect.updateAbilityTextForView(); boolean headerAdded = false; StringBuilder kw = new StringBuilder(); - for(KeywordInterface k : keywords) { - if(!headerAdded) { + for (KeywordInterface k : keywords) { + if (!headerAdded) { headerAdded = true; kw.append(this.getName()).append(" has: \n"); } kw.append(k).append("\n"); } - if(!kw.toString().isEmpty()) { + if (!kw.toString().isEmpty()) { keywordEffect.setText(trimKeywords(kw.toString())); keywordEffect.updateAbilityTextForView(); } @@ -3275,7 +3275,7 @@ public class Player extends GameEntity implements Comparable { final PlayerZone com = getZone(ZoneType.Command); - if(bless) { + if (bless) { blessingEffect = new Card(game.nextCardId(), null, game); blessingEffect.setOwner(this); blessingEffect.setImageKey("t:blessing"); @@ -3337,7 +3337,6 @@ public class Player extends GameEntity implements Comparable { } return targetPlayer == null || !targetPlayer.equals(sa.getActivatingPlayer()) || !hasKeyword("Spells and abilities you control can't cause you to search your library."); - } public Card getKeywordCard() { diff --git a/forge-game/src/main/java/forge/game/spellability/AbilityActivated.java b/forge-game/src/main/java/forge/game/spellability/AbilityActivated.java index d1f867fd99d..5008719eb52 100644 --- a/forge-game/src/main/java/forge/game/spellability/AbilityActivated.java +++ b/forge-game/src/main/java/forge/game/spellability/AbilityActivated.java @@ -65,7 +65,7 @@ public abstract class AbilityActivated extends SpellAbility implements Cloneable this.setTargetRestrictions(tgt); } - public boolean isActivatedAbility() { return true; } + public boolean isActivatedAbility() { return !isTrigger(); } /** {@inheritDoc} */ @Override diff --git a/forge-game/src/main/java/forge/game/trigger/Trigger.java b/forge-game/src/main/java/forge/game/trigger/Trigger.java index d3ad74f957a..82b6c3390ee 100644 --- a/forge-game/src/main/java/forge/game/trigger/Trigger.java +++ b/forge-game/src/main/java/forge/game/trigger/Trigger.java @@ -30,6 +30,7 @@ import com.google.common.collect.Sets; import forge.game.Game; import forge.game.GameEntity; +import forge.game.GameStage; import forge.game.IHasSVars; import forge.game.TriggerReplacementBase; import forge.game.ability.AbilityFactory; @@ -347,8 +348,9 @@ public abstract class Trigger extends TriggerReplacementBase { } // host controller will be null when adding card in a simulation game - if (this.getHostCard().getController() == null || !meetsCommonRequirements(this.mapParams)) + if (this.getHostCard().getController() == null || game.getAge() != GameStage.Play || !meetsCommonRequirements(this.mapParams)) { return false; + } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java b/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java index 6c03e890194..a7c6edf2e7b 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java @@ -52,7 +52,6 @@ public class TriggerAbandoned extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Scheme))) { return false; } @@ -60,7 +59,6 @@ public class TriggerAbandoned extends Trigger { return true; } - /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa, Map runParams) { @@ -72,4 +70,3 @@ public class TriggerAbandoned extends Trigger { return ""; } } - diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java index 568913463c4..0fbf5446dcf 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java @@ -63,7 +63,6 @@ public class TriggerAttached extends Trigger { return true; } - /** {@inheritDoc} */ @Override diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java index 0e468764b8f..1ea62c1d70f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java @@ -54,7 +54,6 @@ public class TriggerAttackerUnblocked extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Attacker))) { return false; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java index a5f47ed9b62..061a23fab37 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java @@ -57,7 +57,6 @@ public class TriggerAttacks extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Attacker))) { return false; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java b/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java index 1715c54f476..2c6e438af3e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java @@ -55,7 +55,6 @@ public class TriggerChampioned extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Championed))) { return false; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamageAll.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamageAll.java index 12c64f89130..cbdb908480a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamageAll.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamageAll.java @@ -16,7 +16,6 @@ public class TriggerDamageAll extends Trigger { @Override public boolean performTest(Map runParams) { - if (hasParam("CombatDamage")) { if (getParam("CombatDamage").equals("True")) { if (!((Boolean) runParams.get(AbilityKey.IsCombatDamage))) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java index a82453ec549..bab0dc829bf 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java @@ -59,7 +59,6 @@ public class TriggerDamageDealtOnce extends Trigger { @SuppressWarnings("unchecked") @Override public final boolean performTest(final Map runParams) { - if (hasParam("CombatDamage")) { if (getParam("CombatDamage").equals("True")) { if (!((Boolean) runParams.get(AbilityKey.IsCombatDamage))) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java index 9e07ed4790d..5c750c0a381 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java @@ -21,7 +21,6 @@ public class TriggerDamageDoneOnce extends Trigger { @SuppressWarnings("unchecked") @Override public boolean performTest(Map runParams) { - if (hasParam("CombatDamage")) { if (getParam("CombatDamage").equals("True")) { if (!((Boolean) runParams.get(AbilityKey.IsCombatDamage))) { @@ -54,7 +53,11 @@ public class TriggerDamageDoneOnce extends Trigger { @SuppressWarnings("unchecked") final Map damageMap = (Map) runParams.get(AbilityKey.DamageMap); - sa.setTriggeringObject(AbilityKey.Target, CardUtil.getLKICopy((Card)runParams.get(AbilityKey.DamageTarget))); + Object target = runParams.get(AbilityKey.DamageTarget); + if (target instanceof Card) { + target = CardUtil.getLKICopy((Card)runParams.get(AbilityKey.DamageTarget)); + } + sa.setTriggeringObject(AbilityKey.Target, target); sa.setTriggeringObject(AbilityKey.Sources, getDamageSources(damageMap)); sa.setTriggeringObject(AbilityKey.DamageAmount, getDamageAmount(damageMap)); } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java index f6efcb04573..3686a45805e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java @@ -56,7 +56,6 @@ public class TriggerDamagePrevented extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (!matchesValidParam("ValidSource", runParams.get(AbilityKey.DamageSource))) { return false; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamagePreventedOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamagePreventedOnce.java index 561da606f08..d64c2ca41f6 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamagePreventedOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamagePreventedOnce.java @@ -55,7 +55,6 @@ public class TriggerDamagePreventedOnce extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (!matchesValidParam("ValidTarget", runParams.get(AbilityKey.DamageTarget))) { return false; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExcessDamage.java b/forge-game/src/main/java/forge/game/trigger/TriggerExcessDamage.java index 51e19158d22..51df52b3dc9 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExcessDamage.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExcessDamage.java @@ -82,4 +82,3 @@ public class TriggerExcessDamage extends Trigger { return sb.toString(); } } - diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java b/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java index 5a351753a90..4568e59ecd1 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java @@ -55,7 +55,6 @@ public class TriggerExploited extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Exploited))) { return false; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java b/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java index bc4b3c2a2e8..191c3c2cdee 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java @@ -73,4 +73,3 @@ public class TriggerExplores extends Trigger { return sb.toString(); } } - diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerFightOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerFightOnce.java index 255a1f5127a..8bf5bb440df 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerFightOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerFightOnce.java @@ -70,4 +70,3 @@ public class TriggerFightOnce extends Trigger { return sb.toString(); } } - diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java index 046e673abe4..94fd70373c3 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -579,7 +579,7 @@ public class TriggerHandler { sa.setOptionalTrigger(true); decider = AbilityUtils.getDefinedPlayers(host, regtrig.getParam("OptionalDecider"), sa).get(0); } - else if (sa instanceof AbilitySub || !sa.hasParam("Cost") || sa.getParam("Cost").equals("0")) { + else if (sa instanceof AbilitySub || !sa.hasParam("Cost") || (sa.getPayCosts() != null && sa.getPayCosts().isMandatory()) || sa.getParam("Cost").equals("0")) { isMandatory = true; } else { // triggers with a cost can't be mandatory sa.setOptionalTrigger(true); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java b/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java index 29f168f8559..f155e5019ea 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java @@ -67,7 +67,6 @@ public class TriggerPayCumulativeUpkeep extends Trigger { return true; } - /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa, Map runParams) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java b/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java index 96c49439e9d..e32e91f840d 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java @@ -66,7 +66,6 @@ public class TriggerPayEcho extends Trigger { return true; } - /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa, Map runParams) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java index dbe7c1714ea..cc4474c049f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java @@ -17,7 +17,6 @@ public class TriggerPhaseOut extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { return false; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java b/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java index 9ad3b9d8a61..45ef6af9d44 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java @@ -116,7 +116,6 @@ public class TriggerSacrificed extends Trigger { return true; } - /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa, Map runParams) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerScry.java b/forge-game/src/main/java/forge/game/trigger/TriggerScry.java index d1da154b9f6..4cba3657554 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerScry.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerScry.java @@ -61,7 +61,6 @@ public class TriggerScry extends Trigger { return true; } - /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa, Map runParams) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java b/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java index 4c371fe28dd..026aa9bce8e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java @@ -70,7 +70,6 @@ public class TriggerSearchedLibrary extends Trigger { return true; } - /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa, Map runParams) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java b/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java index c83f4d7535c..aeb8bc58cd6 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java @@ -73,7 +73,6 @@ public class TriggerSetInMotion extends Trigger { return true; } - /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa, Map runParams) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java b/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java index 793e79a9fb3..d68aced30c6 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java @@ -72,7 +72,6 @@ public class TriggerShuffled extends Trigger { return true; } - /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa, Map runParams) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCastOrCopy.java b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCastOrCopy.java index ca3b10d4a12..5ab0e6a2cd5 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCastOrCopy.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCastOrCopy.java @@ -279,7 +279,6 @@ public class TriggerSpellAbilityCastOrCopy extends Trigger { return true; } - /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa, Map runParams) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java b/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java index 6351abfab30..816d8ea51d4 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java @@ -53,7 +53,6 @@ public class TriggerTaps extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { return false; } @@ -73,7 +72,6 @@ public class TriggerTaps extends Trigger { return true; } - /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa, Map runParams) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java b/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java index e786c869b37..94f3165ad72 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java @@ -56,8 +56,7 @@ public class TriggerTapsForMana extends Trigger { /** {@inheritDoc} * @param runParams*/ @Override - public final boolean performTest(final Map runParams) { - + public final boolean performTest(final Map runParams) { //Check for tapping if (!hasParam("NoTapCheck")) { final SpellAbility manaAbility = (SpellAbility) runParams.get(AbilityKey.AbilityMana); @@ -94,7 +93,6 @@ public class TriggerTapsForMana extends Trigger { return true; } - /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa, Map runParams) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java b/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java index 0c6cd7309a6..f2fcb6084ab 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java @@ -65,5 +65,4 @@ public class TriggerTransformed extends Trigger { return sb.toString(); } - } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerType.java b/forge-game/src/main/java/forge/game/trigger/TriggerType.java index f97a099e0a2..9329d34d685 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerType.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerType.java @@ -137,7 +137,6 @@ public enum TriggerType { * @return */ public static TriggerType smartValueOf(String value) { - final String valToCompate = value.trim(); for (final TriggerType v : TriggerType.values()) { if (v.name().compareToIgnoreCase(valToCompate) == 0) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java b/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java index 332309d01a8..fd9bd6dd875 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java @@ -53,7 +53,6 @@ public class TriggerUnattach extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (!matchesValidParam("ValidObject", runParams.get(AbilityKey.Object))) { return false; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerVote.java b/forge-game/src/main/java/forge/game/trigger/TriggerVote.java index c97bd048b26..1e81a355ec6 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerVote.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerVote.java @@ -82,7 +82,6 @@ public class TriggerVote extends Trigger { return sb.toString(); } - private static FCollection getVoters(final Player player, final ListMultimap votes, final boolean isOpponent, final boolean votedOtherchoice) { diff --git a/forge-gui-desktop/src/main/java/forge/ImageCache.java b/forge-gui-desktop/src/main/java/forge/ImageCache.java index 581b3578b12..128aa326e6a 100644 --- a/forge-gui-desktop/src/main/java/forge/ImageCache.java +++ b/forge-gui-desktop/src/main/java/forge/ImageCache.java @@ -156,7 +156,7 @@ public class ImageCache { IPaperCard ipc = null; boolean altState = imageKey.endsWith(ImageKeys.BACKFACE_POSTFIX); - if(altState) + if (altState) imageKey = imageKey.substring(0, imageKey.length() - ImageKeys.BACKFACE_POSTFIX.length()); if (imageKey.startsWith(ImageKeys.CARD_PREFIX)) { PaperCard pc = ImageUtil.getPaperCardFromImageKey(imageKey); @@ -165,7 +165,7 @@ public class ImageCache { if (StringUtils.isBlank(imageKey)) { return _defaultImage; } - } else if (imageKey.startsWith(ImageKeys.TOKEN_PREFIX)) { + } else if (imageKey.startsWith(ImageKeys.TOKEN_PREFIX) && cardView != null && cardView.isToken()) { ipc = ImageUtil.getPaperTokenFromImageKey(imageKey); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java index 3c88ac0d171..4115e9b7837 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java @@ -149,6 +149,8 @@ public enum CSubmenuPreferences implements ICDoc { lstControls.add(Pair.of(view.getCbCompactPrompt(), FPref.UI_COMPACT_PROMPT)); lstControls.add(Pair.of(view.getCbHideReminderText(), FPref.UI_HIDE_REMINDER_TEXT)); + lstControls.add(Pair.of(view.getCbCardTextUseSansSerif(), FPref.UI_CARD_IMAGE_RENDER_USE_SANS_SERIF_FONT)); + lstControls.add(Pair.of(view.getCbCardTextHideReminder(), FPref.UI_CARD_IMAGE_RENDER_HIDE_REMINDER_TEXT)); lstControls.add(Pair.of(view.getCbOpenPacksIndiv(), FPref.UI_OPEN_PACKS_INDIV)); lstControls.add(Pair.of(view.getCbTokensInSeparateRow(), FPref.UI_TOKENS_IN_SEPARATE_ROW)); lstControls.add(Pair.of(view.getCbStackCreatures(), FPref.UI_STACK_CREATURES)); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java index b4ffdf65bbd..e9437f8d58d 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java @@ -102,6 +102,8 @@ public enum VSubmenuPreferences implements IVSubmenu { private final JCheckBox cbEscapeEndsTurn = new OptionsCheckBox(localizer.getMessage("cbEscapeEndsTurn")); private final JCheckBox cbPreselectPrevAbOrder = new OptionsCheckBox(localizer.getMessage("cbPreselectPrevAbOrder")); private final JCheckBox cbHideReminderText = new OptionsCheckBox(localizer.getMessage("cbHideReminderText")); + private final JCheckBox cbCardTextUseSansSerif = new OptionsCheckBox(localizer.getMessage("cbCardTextUseSansSerif")); + private final JCheckBox cbCardTextHideReminder = new OptionsCheckBox(localizer.getMessage("cbCardTextHideReminder")); private final JCheckBox cbOpenPacksIndiv = new OptionsCheckBox(localizer.getMessage("cbOpenPacksIndiv")); private final JCheckBox cbTokensInSeparateRow = new OptionsCheckBox(localizer.getMessage("cbTokensInSeparateRow")); private final JCheckBox cbStackCreatures = new OptionsCheckBox(localizer.getMessage("cbStackCreatures")); @@ -368,6 +370,12 @@ public enum VSubmenuPreferences implements IVSubmenu { pnlPrefs.add(cbHideReminderText, titleConstraints); pnlPrefs.add(new NoteLabel(localizer.getMessage("nlHideReminderText")), descriptionConstraints); + pnlPrefs.add(cbCardTextUseSansSerif, titleConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlCardTextUseSansSerif")), descriptionConstraints); + + pnlPrefs.add(cbCardTextHideReminder, titleConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlCardTextHideReminder")), descriptionConstraints); + pnlPrefs.add(cbOpenPacksIndiv, titleConstraints); pnlPrefs.add(new NoteLabel(localizer.getMessage("nlOpenPacksIndiv")), descriptionConstraints); @@ -857,6 +865,14 @@ public enum VSubmenuPreferences implements IVSubmenu { return cbHideReminderText; } + public JCheckBox getCbCardTextUseSansSerif() { + return cbCardTextUseSansSerif; + } + + public final JCheckBox getCbCardTextHideReminder() { + return cbCardTextHideReminder; + } + public final JCheckBox getCbOpenPacksIndiv() { return cbOpenPacksIndiv; } diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FCardImageRenderer.java b/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FCardImageRenderer.java index d7d6432f19a..e39742bc2cb 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FCardImageRenderer.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FCardImageRenderer.java @@ -52,6 +52,7 @@ public class FCardImageRenderer { private static BreakIterator boundary; private static Pattern linebreakPattern; private static Pattern reminderPattern; + private static Pattern reminderHidePattern; private static Pattern symbolPattern; private static Map shrinkFonts; @@ -60,6 +61,7 @@ public class FCardImageRenderer { boundary = BreakIterator.getLineInstance(locale); linebreakPattern = Pattern.compile("(\r\n\r\n)|(\n)"); reminderPattern = Pattern.compile("\\((.+?)\\)"); + reminderHidePattern = Pattern.compile(" \\((.+?)\\)"); symbolPattern = Pattern.compile("\\{([A-Z0-9]+)\\}|\\{([A-Z0-9]+)/([A-Z0-9]+)\\}"); NAME_FONT = new Font(Font.SERIF, Font.BOLD, 26); @@ -68,8 +70,13 @@ public class FCardImageRenderer { TEXT_FONT = new Font(Font.SANS_SERIF, Font.PLAIN, 24); REMINDER_FONT = new Font(Font.SANS_SERIF, Font.PLAIN, 22); } else { - TEXT_FONT = new Font(Font.SERIF, Font.PLAIN, 24); - REMINDER_FONT = new Font(Font.SERIF, Font.ITALIC, 24); + if (FModel.getPreferences().getPrefBoolean(FPref.UI_CARD_IMAGE_RENDER_USE_SANS_SERIF_FONT)) { + TEXT_FONT = new Font(Font.SANS_SERIF, Font.PLAIN, 24); + REMINDER_FONT = new Font(Font.SANS_SERIF, Font.ITALIC, 24); + } else { + TEXT_FONT = new Font(Font.SERIF, Font.PLAIN, 24); + REMINDER_FONT = new Font(Font.SERIF, Font.ITALIC, 24); + } } PT_FONT = NAME_FONT; @@ -272,36 +279,47 @@ public class FCardImageRenderer { String [] paragraphs = linebreakPattern.split(text); StringBuilder sb = new StringBuilder(); String text1 = "", text2 = "", text3 = ""; - String level2 = null, level3 = null; + String level2 = "", level3 = ""; String ptOverride2 = null, ptOverride3 = null; - boolean matchedLevel = false; for (String pg : paragraphs) { - if (pg.matches(".*[0-9]+-[0-9]+")) { - text1 = sb.toString(); + if (pg.matches("(.*[0-9]+-[0-9]+)|(.*[0-9]+\\+)")) { + //add space before numbers in case there is no space. + pg = pg.replaceAll("([^0-9 ]+)(([0-9]+-[0-9]+)|([0-9]+\\+))", "$1 $2"); + if (level2.isEmpty()) { + text1 = sb.toString(); + level2 = pg; + } else { + text2 = sb.toString(); + level3 = pg; + } sb.setLength(0); - level2 = pg; - matchedLevel = true; - continue; - } else if (pg.matches(".*[0-9]+\\+")) { - text2 = sb.toString(); - sb.setLength(0); - level3 = pg; - matchedLevel = true; continue; } - if (!matchedLevel) { - if (sb.length() > 0) - sb.append("\n"); - sb.append(pg); - } else { + if (pg.matches("[0-9]+/[0-9]+")) { if (ptOverride2 == null) ptOverride2 = pg; else ptOverride3 = pg; + continue; } - matchedLevel = false; + if (sb.length() > 0) + sb.append("\n"); + sb.append(pg); } text3 = sb.toString(); + //handle the case that translated text doesn't contains P/T info. + if (ptOverride2 == null) { + paragraphs = linebreakPattern.split(state.getOracleText()); + for (String pg : paragraphs) { + if (pg.matches("[0-9]+/[0-9]+")) { + if (ptOverride2 == null) + ptOverride2 = pg; + else + ptOverride3 = pg; + } + } + } + int textX = x + artInset; //draw text box @@ -859,7 +877,11 @@ public class FCardImageRenderer { } pieces.add(new TextPiece(subtext.substring(parsed, sbMatcher.start()), isReminder)); } - symbols.add(sbMatcher.group(1) != null ? sbMatcher.group(1) : sbMatcher.group(2) + sbMatcher.group(3)); + String symbol = sbMatcher.group(1) != null ? sbMatcher.group(1) : + // switch position of "P" and mana color for phyrexian mana symbol. + "P".equals(sbMatcher.group(3)) ? sbMatcher.group(3) + sbMatcher.group(2) : + sbMatcher.group(2) + sbMatcher.group(3); + symbols.add(symbol); parsed = sbMatcher.end(); } if (!symbols.isEmpty()) { @@ -951,10 +973,12 @@ public class FCardImageRenderer { } } - private static void drawTextBoxText(Graphics2D g, final String text, int x, int y, int w, int h, int flagPTBox) { + private static void drawTextBoxText(Graphics2D g, String text, int x, int y, int w, int h, int flagPTBox) { boolean hasPTBox = (flagPTBox & 1) == 1; boolean isLevelup = (flagPTBox & 2) == 2; boolean isLevelBox = (flagPTBox & 4) == 4; + if (FModel.getPreferences().getPrefBoolean(FPref.UI_CARD_IMAGE_RENDER_HIDE_REMINDER_TEXT)) + text = reminderHidePattern.matcher(text).replaceAll(""); String [] paragraphs = isLevelBox ? text.split(" ") : linebreakPattern.split(text); List pgList = new ArrayList<>(); for (String pg : paragraphs) { diff --git a/forge-gui/res/cardsfolder/a/abomination_of_gudul.txt b/forge-gui/res/cardsfolder/a/abomination_of_gudul.txt index 3f9501c5511..f4cbaf8c10a 100644 --- a/forge-gui/res/cardsfolder/a/abomination_of_gudul.txt +++ b/forge-gui/res/cardsfolder/a/abomination_of_gudul.txt @@ -4,8 +4,7 @@ Types:Creature Horror PT:3/4 K:Flying K:Morph:2 B G U -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigLoot | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may draw a card. If you do, discard a card. -SVar:TrigLoot:DB$Draw | NumCards$ 1 | SubAbility$ DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigLoot | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may draw a card. If you do, discard a card. +SVar:TrigLoot:AB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 | Cost$ Draw<1/You> SVar:Picture:http://www.wizards.com/global/images/magic/general/abomination_of_gudul.jpg Oracle:Flying\nWhenever Abomination of Gudul deals combat damage to a player, you may draw a card. If you do, discard a card.\nMorph {2}{B}{G}{U} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) diff --git a/forge-gui/res/cardsfolder/a/abyssal_nightstalker.txt b/forge-gui/res/cardsfolder/a/abyssal_nightstalker.txt index 11dee7ae759..a2c0b57f404 100644 --- a/forge-gui/res/cardsfolder/a/abyssal_nightstalker.txt +++ b/forge-gui/res/cardsfolder/a/abyssal_nightstalker.txt @@ -3,6 +3,6 @@ ManaCost:3 B Types:Creature Nightstalker 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. -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 Oracle:Whenever Abyssal Nightstalker attacks and isn't blocked, defending player discards a card. diff --git a/forge-gui/res/cardsfolder/a/aetherstorm_roc.txt b/forge-gui/res/cardsfolder/a/aetherstorm_roc.txt index 09153fd7ac2..4bfbe71de88 100644 --- a/forge-gui/res/cardsfolder/a/aetherstorm_roc.txt +++ b/forge-gui/res/cardsfolder/a/aetherstorm_roc.txt @@ -8,6 +8,6 @@ T:Mode$ ChangesZone | ValidCard$ Creature.Other+YouCtrl | Origin$ Any | Destinat 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. 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 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. diff --git a/forge-gui/res/cardsfolder/a/akoum_stonewaker.txt b/forge-gui/res/cardsfolder/a/akoum_stonewaker.txt index 4077b19e63c..de3ebef0a9a 100644 --- a/forge-gui/res/cardsfolder/a/akoum_stonewaker.txt +++ b/forge-gui/res/cardsfolder/a/akoum_stonewaker.txt @@ -3,7 +3,7 @@ ManaCost:1 R Types:Creature Human Shaman PT:2/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, you may pay {2}{R}. If you do, create a 3/1 red Elemental creature token with trample and haste. Exile that token at the beginning of the next end step. -SVar:TrigToken:AB$Token | Cost$ 2 R | TokenScript$ r_3_1_elemental_trample_haste | LegacyImage$ r 3 1 elemental trample haste bfz | AtEOT$ Exile +SVar:TrigToken:AB$ Token | Cost$ 2 R | TokenScript$ r_3_1_elemental_trample_haste | LegacyImage$ r 3 1 elemental trample haste bfz | AtEOT$ Exile DeckHas:Ability$Token SVar:Picture:http://www.wizards.com/global/images/magic/general/akoum_stonewaker.jpg Oracle:Landfall — Whenever a land enters the battlefield under your control, you may pay {2}{R}. If you do, create a 3/1 red Elemental creature token with trample and haste. Exile that token at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/a/alley_grifters.txt b/forge-gui/res/cardsfolder/a/alley_grifters.txt index 9c983aa034a..a6c1d4e8947 100644 --- a/forge-gui/res/cardsfolder/a/alley_grifters.txt +++ b/forge-gui/res/cardsfolder/a/alley_grifters.txt @@ -3,7 +3,7 @@ ManaCost:1 B B Types:Creature Human Mercenary PT:2/2 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:Picture:http://www.wizards.com/global/images/magic/general/alley_grifters.jpg Oracle:Whenever Alley Grifters becomes blocked, defending player discards a card. diff --git a/forge-gui/res/cardsfolder/a/arrogant_poet.txt b/forge-gui/res/cardsfolder/a/arrogant_poet.txt index b950e9def49..27e09b97dec 100644 --- a/forge-gui/res/cardsfolder/a/arrogant_poet.txt +++ b/forge-gui/res/cardsfolder/a/arrogant_poet.txt @@ -2,6 +2,6 @@ Name:Arrogant Poet ManaCost:1 B Types:Creature Human Warlock PT:2/1 -T:Mode$ Attacks | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, you may pay 2 life. If you do, it gains flying until end of turn. +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, you may pay 2 life. If you do, it gains flying until end of turn. SVar:TrigPump:AB$ Pump | Cost$ PayLife<2> | Defined$ Self | KW$ Flying Oracle:Whenever Arrogant Poet attacks, you may pay 2 life. If you do, it gains flying until end of turn. diff --git a/forge-gui/res/cardsfolder/a/ashling_the_extinguisher.txt b/forge-gui/res/cardsfolder/a/ashling_the_extinguisher.txt index eb12d9da248..4338eb4e460 100644 --- a/forge-gui/res/cardsfolder/a/ashling_the_extinguisher.txt +++ b/forge-gui/res/cardsfolder/a/ashling_the_extinguisher.txt @@ -3,7 +3,7 @@ ManaCost:2 B B Types:Legendary Creature Elemental Shaman 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. -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: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. diff --git a/forge-gui/res/cardsfolder/a/awaken_the_sky_tyrant.txt b/forge-gui/res/cardsfolder/a/awaken_the_sky_tyrant.txt index e7d2b4a872b..8065271b7da 100644 --- a/forge-gui/res/cardsfolder/a/awaken_the_sky_tyrant.txt +++ b/forge-gui/res/cardsfolder/a/awaken_the_sky_tyrant.txt @@ -2,9 +2,7 @@ Name:Awaken the Sky Tyrant ManaCost:3 R Types:Enchantment T:Mode$ DamageDone | ValidSource$ Card.OppCtrl | ValidTarget$ You | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ When a source an opponent controls deals damage to you, sacrifice CARDNAME. If you do, create a 5/5 red Dragon creature token with flying. -SVar:TrigSac:DB$ Sacrifice | SacValid$ Self | RememberSacrificed$ True | SubAbility$ DBToken -SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ r_5_5_dragon_flying | TokenOwner$ You | LegacyImage$ r 5 5 dragon flying c15 | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:TrigSac:AB$ Token | TokenAmount$ 1 | TokenScript$ r_5_5_dragon_flying | TokenOwner$ You | Cost$ Mandatory Sac<1/CARDNAME> SVar:X:Remembered$Amount SVar:Picture:http://www.wizards.com/global/images/magic/general/awaken_the_sky_tyrant.jpg Oracle:When a source an opponent controls deals damage to you, sacrifice Awaken the Sky Tyrant. If you do, create a 5/5 red Dragon creature token with flying. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/b/balduvian_horde.txt b/forge-gui/res/cardsfolder/b/balduvian_horde.txt index ca337b8a7e5..8a4c851097c 100644 --- a/forge-gui/res/cardsfolder/b/balduvian_horde.txt +++ b/forge-gui/res/cardsfolder/b/balduvian_horde.txt @@ -2,11 +2,8 @@ Name:Balduvian Horde ManaCost:2 R R Types:Creature Human Barbarian PT:5/5 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, sacrifice it unless you discard a card at random. -SVar:TrigDiscard:DB$ Discard | NumCards$ 1 | Mode$ Random | Optional$ True | RememberDiscarded$ True | SubAbility$ DBSacrifice -SVar:DBSacrifice:DB$ Sacrifice | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:X:Remembered$Amount +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME enters the battlefield, sacrifice it unless you discard a card at random. +SVar:TrigSac:DB$ Sacrifice | SacValid$ Self | UnlessCost$ Discard<1/Random> | UnlessPayer$ You SVar:NeedsToPlayVar:Y GE2 SVar:Y:Count$InYourHand SVar:Picture:http://www.wizards.com/global/images/magic/general/balduvian_horde.jpg diff --git a/forge-gui/res/cardsfolder/b/balefire_dragon.txt b/forge-gui/res/cardsfolder/b/balefire_dragon.txt index cbf83007cb0..bef43c2af05 100644 --- a/forge-gui/res/cardsfolder/b/balefire_dragon.txt +++ b/forge-gui/res/cardsfolder/b/balefire_dragon.txt @@ -4,7 +4,7 @@ Types:Creature Dragon PT:6/6 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. -SVar:TrigDamage:DB$ DamageAll | NumDmg$ X | ValidCards$ Creature.DefenderCtrl +SVar:TrigDamage:DB$ DamageAll | NumDmg$ X | ValidCards$ Creature.ControlledBy TriggeredDefendingPlayer SVar:X:TriggerCount$DamageAmount SVar:MustBeBlocked:True SVar:Picture:http://www.wizards.com/global/images/magic/general/balefire_dragon.jpg diff --git a/forge-gui/res/cardsfolder/b/bane_of_bala_ged.txt b/forge-gui/res/cardsfolder/b/bane_of_bala_ged.txt index 6e409ea672a..093bf8ce71d 100644 --- a/forge-gui/res/cardsfolder/b/bane_of_bala_ged.txt +++ b/forge-gui/res/cardsfolder/b/bane_of_bala_ged.txt @@ -3,7 +3,7 @@ ManaCost:7 Types:Creature Eldrazi PT:7/5 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: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. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/b/bar_the_gate.txt b/forge-gui/res/cardsfolder/b/bar_the_gate.txt index 27cb802ed16..5c743a3e96e 100644 --- a/forge-gui/res/cardsfolder/b/bar_the_gate.txt +++ b/forge-gui/res/cardsfolder/b/bar_the_gate.txt @@ -1,6 +1,6 @@ Name:Bar the Gate ManaCost:2 U Types:Instant -A:SP$ Counter | Cost$ 2 U | Type$ Spell | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker spell | SubAbility$ DBVenture | SpellDescription$ Counter target creature or planeswalker spell. Venture into the dungeon. (Enter the first room or advance to the next room.) +A:SP$ Counter | Cost$ 2 U | TargetType$ Spell | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker spell | SubAbility$ DBVenture | SpellDescription$ Counter target creature or planeswalker spell. Venture into the dungeon. (Enter the first room or advance to the next room.) SVar:DBVenture:DB$ Venture Oracle:Counter target creature or planeswalker spell. Venture into the dungeon. (Enter the first room or advance to the next room.) diff --git a/forge-gui/res/cardsfolder/b/baral_chief_of_compliance.txt b/forge-gui/res/cardsfolder/b/baral_chief_of_compliance.txt index 14bf4b8a955..ebeb89fe99a 100644 --- a/forge-gui/res/cardsfolder/b/baral_chief_of_compliance.txt +++ b/forge-gui/res/cardsfolder/b/baral_chief_of_compliance.txt @@ -3,9 +3,8 @@ ManaCost:1 U Types:Legendary Creature Human Wizard PT:1/3 S:Mode$ ReduceCost | ValidCard$ Instant,Sorcery | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Instant and sorcery spells you cast cost {1} less to cast. -T:Mode$ Countered | ValidCause$ Card.YouCtrl | ValidCard$ Card | ValidType$ Spell | OptionalDecider$ You | TriggerZones$ Battlefield | Execute$ TrigLoot | TriggerDescription$ Whenever a spell or ability you control counters a spell, you may draw a card. If you do, discard a card. -SVar:TrigLoot:DB$Draw | NumCards$ 1 | SubAbility$ DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 +T:Mode$ Countered | ValidCause$ Card.YouCtrl | ValidCard$ Card | ValidType$ Spell | TriggerZones$ Battlefield | Execute$ TrigLoot | TriggerDescription$ Whenever a spell or ability you control counters a spell, you may draw a card. If you do, discard a card. +SVar:TrigLoot:AB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 | Cost$ Draw<1/You> DeckHints:Type$Instant|Sorcery SVar:Picture:http://www.wizards.com/global/images/magic/general/baral_chief_of_compliance.jpg Oracle:Instant and sorcery spells you cast cost {1} less to cast.\nWhenever a spell or ability you control counters a spell, you may draw a card. If you do, discard a card. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/b/battlefield_scavenger.txt b/forge-gui/res/cardsfolder/b/battlefield_scavenger.txt index 2e59e545135..9ee9b17dd0c 100644 --- a/forge-gui/res/cardsfolder/b/battlefield_scavenger.txt +++ b/forge-gui/res/cardsfolder/b/battlefield_scavenger.txt @@ -5,7 +5,5 @@ PT:2/2 K:You may exert CARDNAME as it attacks. T:Mode$ Exerted | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ Whenever you exert a creature, you may discard a card. If you do, draw a card. // This code presumes that you are only ever allowed to exert creatures you control. If this is changed in the future, it will need an update. -SVar:TrigDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | RememberDiscarded$ True | Optional$ True | SubAbility$ DBDraw -SVar:DBDraw:DB$ Draw | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:TrigDiscard:AB$ Draw | NumCards$ 1 | Cost$ Discard<1/Card> Oracle:You may exert Battlefield Scavenger as it attacks. (It won't untap during your next untap step.)\nWhenever you exert a creature, you may discard a card. If you do, draw a card. diff --git a/forge-gui/res/cardsfolder/b/birgi_god_of_storytelling_harnfel_horn_of_bounty.txt b/forge-gui/res/cardsfolder/b/birgi_god_of_storytelling_harnfel_horn_of_bounty.txt index a055470db9e..0b7d562e23b 100644 --- a/forge-gui/res/cardsfolder/b/birgi_god_of_storytelling_harnfel_horn_of_bounty.txt +++ b/forge-gui/res/cardsfolder/b/birgi_god_of_storytelling_harnfel_horn_of_bounty.txt @@ -13,7 +13,7 @@ ALTERNATE Name:Harnfel, Horn of Bounty ManaCost:4 R Types:Legendary Artifact -A:AB$ Dig | Cost$ Discard<1/Card> | Defined$ You | DigNum$ 2 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect | StackDescription$ SpellDescription | SpellDescription$ Exile the top two cards of your library. You may play that card this turn. +A:AB$ Dig | Cost$ Discard<1/Card> | Defined$ You | DigNum$ 2 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect | StackDescription$ SpellDescription | SpellDescription$ Exile the top two cards of your library. You may play those cards this turn. SVar:DBEffect:DB$ Effect | StaticAbilities$ StaticMayPlay | RememberObjects$ Remembered | ForgetOnMoved$ Exile | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:StaticMayPlay:Mode$ Continuous | Affected$ Card.IsRemembered | EffectZone$ Command | AffectedZone$ Exile | MayPlay$ True | Description$ You may play those cards this turn. diff --git a/forge-gui/res/cardsfolder/b/blind_zealot.txt b/forge-gui/res/cardsfolder/b/blind_zealot.txt index 2903abe0dc1..53cb9863f43 100644 --- a/forge-gui/res/cardsfolder/b/blind_zealot.txt +++ b/forge-gui/res/cardsfolder/b/blind_zealot.txt @@ -4,6 +4,6 @@ Types:Creature Phyrexian Human Cleric PT:2/2 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. -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 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. diff --git a/forge-gui/res/cardsfolder/b/bone_rattler.txt b/forge-gui/res/cardsfolder/b/bone_rattler.txt index f5c0707a631..593912f5e97 100644 --- a/forge-gui/res/cardsfolder/b/bone_rattler.txt +++ b/forge-gui/res/cardsfolder/b/bone_rattler.txt @@ -3,8 +3,9 @@ ManaCost:3 B B Types:Creature Skeleton PT:4/4 T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Graveyard | Execute$ TrigExile | TriggerDescription$ When CARDNAME is put into your graveyard from anywhere, exile it. When you do, create four Reassembling Skeleton token cards and put them into your graveyard. -SVar:TrigExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | RememberChanged$ True | SubAbility$ DBMakeCard -SVar:DBMakeCard:DB$ MakeCard | Name$ Reassembling Skeleton | Zone$ Graveyard | Amount$ 4 | SubAbility$ DBCleanup | ConditionDefined$ Remembered | ConditionPresent$ Card.Self | ConditionCompare$ GE1 +SVar:TrigExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | RememberChanged$ True | SubAbility$ DBImmediateTrigger +SVar:DBImmediateTrigger:DB$ ImmediateTrigger | ConditionDefined$ Remembered | ConditionPresent$ Card.Self | Execute$ TrigMakeCard | SubAbility$ DBCleanup | TriggerDescription$ When you do, create four Reassembling Skeleton token cards and put them into your graveyard. +SVar:TrigMakeCard:DB$ MakeCard | Name$ Reassembling Skeleton | Zone$ Graveyard | Amount$ 4 SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True DeckHas:Ability$Graveyard Oracle:When Bone Rattler is put into your graveyard from anywhere, exile it. When you do, create four Reassembling Skeleton token cards and put them into your graveyard. diff --git a/forge-gui/res/cardsfolder/b/burning_tree_vandal.txt b/forge-gui/res/cardsfolder/b/burning_tree_vandal.txt index 664652dc71a..4e116984c3e 100644 --- a/forge-gui/res/cardsfolder/b/burning_tree_vandal.txt +++ b/forge-gui/res/cardsfolder/b/burning_tree_vandal.txt @@ -3,9 +3,7 @@ ManaCost:2 R Types:Creature Human Rogue PT:2/1 K:Riot -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME attacks, you may discard a card. If you do, draw a card. -SVar:TrigDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | RememberDiscarded$ True | Optional$ True | SubAbility$ DBDraw -SVar:DBDraw:DB$ Draw | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME attacks, you may discard a card. If you do, draw a card. +SVar:TrigDraw:AB$ Draw | NumCards$ 1 | Cost$ Discard<1/Card> DeckHas:Ability$Counters Oracle:Riot (This creature enters the battlefield with your choice of a +1/+1 counter or haste.)\nWhenever Burning-Tree Vandal attacks, you may discard a card. If you do, draw a card. diff --git a/forge-gui/res/cardsfolder/c/caustic_wasps.txt b/forge-gui/res/cardsfolder/c/caustic_wasps.txt index 7ed8815a0f1..fa8d467de24 100644 --- a/forge-gui/res/cardsfolder/c/caustic_wasps.txt +++ b/forge-gui/res/cardsfolder/c/caustic_wasps.txt @@ -4,6 +4,6 @@ Types:Creature Insect PT:1/1 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. -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 Oracle:Flying\nWhenever Caustic Wasps deals combat damage to a player, you may destroy target artifact that player controls. diff --git a/forge-gui/res/cardsfolder/c/celestine_cave_witch.txt b/forge-gui/res/cardsfolder/c/celestine_cave_witch.txt index 6c41e91645a..b21a05fdd9c 100644 --- a/forge-gui/res/cardsfolder/c/celestine_cave_witch.txt +++ b/forge-gui/res/cardsfolder/c/celestine_cave_witch.txt @@ -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. 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.") -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 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.") diff --git a/forge-gui/res/cardsfolder/c/cephalid_constable.txt b/forge-gui/res/cardsfolder/c/cephalid_constable.txt index 5ea8e2cc28b..6eea7573df9 100644 --- a/forge-gui/res/cardsfolder/c/cephalid_constable.txt +++ b/forge-gui/res/cardsfolder/c/cephalid_constable.txt @@ -3,7 +3,7 @@ ManaCost:1 U U Types:Creature Cephalid Wizard 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. -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: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. diff --git a/forge-gui/res/cardsfolder/c/cloudpiercer.txt b/forge-gui/res/cardsfolder/c/cloudpiercer.txt index 91e965f0163..9dd012c8ffb 100755 --- a/forge-gui/res/cardsfolder/c/cloudpiercer.txt +++ b/forge-gui/res/cardsfolder/c/cloudpiercer.txt @@ -4,8 +4,6 @@ Types:Creature Dinosaur PT:5/4 K:Mutate:3 R K:Reach -T:Mode$ Mutates | ValidCard$ Card.Self | Execute$ TrigDiscard | OptionalDecider$ You | TriggerDescription$ Whenever this creature mutates, you may discard a card. If you do, draw a card. -SVar:TrigDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBDraw -SVar:DBDraw:DB$ Draw | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +T:Mode$ Mutates | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ Whenever this creature mutates, you may discard a card. If you do, draw a card. +SVar:TrigDiscard:AB$ Draw | NumCards$ 1 | Cost$ Discard<1/Card> Oracle:Mutate {3}{R} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.)\nReach\nWhenever this creature mutates, you may discard a card. If you do, draw a card. diff --git a/forge-gui/res/cardsfolder/c/commando_raid.txt b/forge-gui/res/cardsfolder/c/commando_raid.txt index 1f4ad9c32cc..e9ffc5aa963 100644 --- a/forge-gui/res/cardsfolder/c/commando_raid.txt +++ b/forge-gui/res/cardsfolder/c/commando_raid.txt @@ -3,7 +3,7 @@ ManaCost:2 R 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." 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: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." diff --git a/forge-gui/res/cardsfolder/c/coral_fighters.txt b/forge-gui/res/cardsfolder/c/coral_fighters.txt index ed5bda97282..ee7f2aeae7d 100644 --- a/forge-gui/res/cardsfolder/c/coral_fighters.txt +++ b/forge-gui/res/cardsfolder/c/coral_fighters.txt @@ -3,7 +3,7 @@ ManaCost:1 U Types:Creature Merfolk Soldier 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. -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 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. diff --git a/forge-gui/res/cardsfolder/c/corrupt_official.txt b/forge-gui/res/cardsfolder/c/corrupt_official.txt index 13322567abc..1e0e034bc00 100644 --- a/forge-gui/res/cardsfolder/c/corrupt_official.txt +++ b/forge-gui/res/cardsfolder/c/corrupt_official.txt @@ -4,6 +4,6 @@ Types:Creature Human Minion PT:3/1 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. -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 Oracle:{2}{B}: Regenerate Corrupt Official.\nWhenever Corrupt Official becomes blocked, defending player discards a card at random. diff --git a/forge-gui/res/cardsfolder/c/coveted_peacock.txt b/forge-gui/res/cardsfolder/c/coveted_peacock.txt index 0cb3ff999b5..ea5f9de51c0 100644 --- a/forge-gui/res/cardsfolder/c/coveted_peacock.txt +++ b/forge-gui/res/cardsfolder/c/coveted_peacock.txt @@ -4,6 +4,6 @@ Types:Creature Bird PT:3/4 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.) -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 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.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/c/crashing_boars.txt b/forge-gui/res/cardsfolder/c/crashing_boars.txt index 11e5e01f776..4c33f9202dc 100644 --- a/forge-gui/res/cardsfolder/c/crashing_boars.txt +++ b/forge-gui/res/cardsfolder/c/crashing_boars.txt @@ -3,5 +3,5 @@ ManaCost:3 G G Types:Creature Boar 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. -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. diff --git a/forge-gui/res/cardsfolder/c/crypt_cobra.txt b/forge-gui/res/cardsfolder/c/crypt_cobra.txt index ea71f5917bc..e198fce1335 100644 --- a/forge-gui/res/cardsfolder/c/crypt_cobra.txt +++ b/forge-gui/res/cardsfolder/c/crypt_cobra.txt @@ -3,6 +3,6 @@ ManaCost:3 B Types:Creature Snake 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.) -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 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.) diff --git a/forge-gui/res/cardsfolder/c/cyclops_gladiator.txt b/forge-gui/res/cardsfolder/c/cyclops_gladiator.txt index 755e73d41df..575e82ceea1 100644 --- a/forge-gui/res/cardsfolder/c/cyclops_gladiator.txt +++ b/forge-gui/res/cardsfolder/c/cyclops_gladiator.txt @@ -3,8 +3,8 @@ ManaCost:1 R R R Types:Creature Cyclops Warrior 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. -SVar:TrigExchangeDamage:DB$DealDamage | ValidTgts$ Creature.DefenderCtrl | TgtPrompt$ Select target creature defending player controls. | NumDmg$ MyX | SubAbility$ ReturnDmg -SVar:ReturnDmg:DB$DealDamage | DamageSource$ Targeted | NumDmg$ TheirX +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:MyX:Count$CardPower SVar:TheirX:Targeted$CardPower SVar:Picture:http://www.wizards.com/global/images/magic/general/cyclops_gladiator.jpg diff --git a/forge-gui/res/cardsfolder/d/daring_saboteur.txt b/forge-gui/res/cardsfolder/d/daring_saboteur.txt index 1d1061ce23e..c787fd5c7d5 100644 --- a/forge-gui/res/cardsfolder/d/daring_saboteur.txt +++ b/forge-gui/res/cardsfolder/d/daring_saboteur.txt @@ -3,7 +3,6 @@ ManaCost:1 U Types:Creature Human Pirate PT:2/1 A:AB$ Pump | Cost$ 2 U | Defined$ Self | KW$ HIDDEN Unblockable | SpellDescription$ CARDNAME can't be blocked this turn. -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigLoot | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may draw a card. If you do, discard a card. -SVar:TrigLoot:DB$ Draw | NumCards$ 1 | SubAbility$ DBDiscard -SVar:DBDiscard:DB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigLoot | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may draw a card. If you do, discard a card. +SVar:TrigLoot:AB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 | Cost$ Draw<1/You> Oracle:{2}{U}: Daring Saboteur can't be blocked this turn.\nWhenever Daring Saboteur deals combat damage to a player, you may draw a card. If you do, discard a card. diff --git a/forge-gui/res/cardsfolder/d/dauthi_mindripper.txt b/forge-gui/res/cardsfolder/d/dauthi_mindripper.txt index 5c7e2a02080..eea01cc7f14 100644 --- a/forge-gui/res/cardsfolder/d/dauthi_mindripper.txt +++ b/forge-gui/res/cardsfolder/d/dauthi_mindripper.txt @@ -4,6 +4,6 @@ Types:Creature Dauthi Minion PT:2/1 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. -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 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. diff --git a/forge-gui/res/cardsfolder/d/dawning_purist.txt b/forge-gui/res/cardsfolder/d/dawning_purist.txt index 5cd0b5d8ca2..18b4a228b63 100644 --- a/forge-gui/res/cardsfolder/d/dawning_purist.txt +++ b/forge-gui/res/cardsfolder/d/dawning_purist.txt @@ -4,6 +4,6 @@ Types:Creature Human Cleric PT:2/2 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. -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 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.) diff --git a/forge-gui/res/cardsfolder/d/drana_the_last_bloodchief.txt b/forge-gui/res/cardsfolder/d/drana_the_last_bloodchief.txt index c51e75fec6a..e7f7cd18dd1 100755 --- a/forge-gui/res/cardsfolder/d/drana_the_last_bloodchief.txt +++ b/forge-gui/res/cardsfolder/d/drana_the_last_bloodchief.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Vampire Cleric PT:4/4 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. -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:DBAnimate:DB$ Animate | Defined$ ChosenCard | Types$ Vampire | Duration$ Permanent DeckHas:Ability$Graveyard & Ability$Counters diff --git a/forge-gui/res/cardsfolder/d/durable_handicraft.txt b/forge-gui/res/cardsfolder/d/durable_handicraft.txt index 044f0f1a8a5..8c994669750 100644 --- a/forge-gui/res/cardsfolder/d/durable_handicraft.txt +++ b/forge-gui/res/cardsfolder/d/durable_handicraft.txt @@ -2,7 +2,7 @@ Name:Durable Handicraft ManaCost:1 G Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a creature enters the battlefield under your control, you may pay {1}. If you do, put a +1/+1 counter on that creature. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 1 | Defined$ TriggeredCardLKICopy | CounterType$ P1P1 | CounterNum$ 1 +SVar:TrigPutCounter:AB$ PutCounter | Cost$ 1 | Defined$ TriggeredCardLKICopy | CounterType$ P1P1 | CounterNum$ 1 A:AB$ PutCounterAll | Cost$ 5 G Sac<1/CARDNAME> | ValidCards$ Creature.YouCtrl | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on each creature you control. SVar:Picture:http://www.wizards.com/global/images/magic/general/durable_handicraft.jpg Oracle:Whenever a creature enters the battlefield under your control, you may pay {1}. If you do, put a +1/+1 counter on that creature.\n{5}{G}, Sacrifice Durable Handicraft: Put a +1/+1 counter on each creature you control. diff --git a/forge-gui/res/cardsfolder/e/emissary_of_despair.txt b/forge-gui/res/cardsfolder/e/emissary_of_despair.txt index e59a53a3f57..3476544e68f 100644 --- a/forge-gui/res/cardsfolder/e/emissary_of_despair.txt +++ b/forge-gui/res/cardsfolder/e/emissary_of_despair.txt @@ -4,7 +4,7 @@ Types:Creature Spirit PT:2/1 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. -SVar:TrigLoseLife:DB$LoseLife | Defined$ TriggeredTarget | LifeAmount$ X -SVar:X:Count$Valid Artifact.DefenderCtrl +SVar:TrigLoseLife:DB$ LoseLife | Defined$ TriggeredTarget | LifeAmount$ X +SVar:X:Count$Valid Artifact.ControlledBy TriggeredDefendingPlayer 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. diff --git a/forge-gui/res/cardsfolder/e/emissary_of_hope.txt b/forge-gui/res/cardsfolder/e/emissary_of_hope.txt index f04ffaa5ab3..3893077fbb7 100644 --- a/forge-gui/res/cardsfolder/e/emissary_of_hope.txt +++ b/forge-gui/res/cardsfolder/e/emissary_of_hope.txt @@ -5,6 +5,6 @@ PT:2/1 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. 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 Oracle:Flying\nWhenever Emissary of Hope deals combat damage to a player, you gain 1 life for each artifact that player controls. diff --git a/forge-gui/res/cardsfolder/e/endrek_sahr_master_breeder.txt b/forge-gui/res/cardsfolder/e/endrek_sahr_master_breeder.txt index 85636974abd..3ebd3ae54c1 100644 --- a/forge-gui/res/cardsfolder/e/endrek_sahr_master_breeder.txt +++ b/forge-gui/res/cardsfolder/e/endrek_sahr_master_breeder.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Human Wizard PT:2/2 T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a creature spell, create X 1/1 black Thrull creature tokens, where X is that spell's mana value. T:Mode$ Always | IsPresent$ Card.Thrull+YouCtrl | PresentCompare$ GE7 | Execute$ TrigSac | TriggerZones$ Battlefield | TriggerDescription$ When you control seven or more Thrulls, sacrifice CARDNAME. -SVar:TrigToken:DB$Token | TokenOwner$ You | TokenAmount$ X | TokenScript$ b_1_1_thrull | LegacyImage$ b 1 1 thrull tsp +SVar:TrigToken:DB$ Token | TokenOwner$ You | TokenAmount$ X | TokenScript$ b_1_1_thrull | LegacyImage$ b 1 1 thrull tsp SVar:X:TriggerCount$CastSACMC SVar:TrigSac:DB$Sacrifice | Defined$ Self SVar:Picture:http://www.wizards.com/global/images/magic/general/endrek_sahr_master_breeder.jpg diff --git a/forge-gui/res/cardsfolder/e/erithizon.txt b/forge-gui/res/cardsfolder/e/erithizon.txt index fcc8e558a20..2c677ccabe2 100644 --- a/forge-gui/res/cardsfolder/e/erithizon.txt +++ b/forge-gui/res/cardsfolder/e/erithizon.txt @@ -3,7 +3,7 @@ ManaCost:2 G G Types:Creature Beast 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. -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 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. diff --git a/forge-gui/res/cardsfolder/e/etrata_the_silencer.txt b/forge-gui/res/cardsfolder/e/etrata_the_silencer.txt index c4c14654ca4..6d539647fb4 100644 --- a/forge-gui/res/cardsfolder/e/etrata_the_silencer.txt +++ b/forge-gui/res/cardsfolder/e/etrata_the_silencer.txt @@ -4,10 +4,10 @@ Types:Legendary Creature Vampire Assassin PT:3/5 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. -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:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBLose 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 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. diff --git a/forge-gui/res/cardsfolder/e/exploding_borders.txt b/forge-gui/res/cardsfolder/e/exploding_borders.txt index c298e61530c..c3739741b85 100644 --- a/forge-gui/res/cardsfolder/e/exploding_borders.txt +++ b/forge-gui/res/cardsfolder/e/exploding_borders.txt @@ -2,7 +2,7 @@ Name:Exploding Borders ManaCost:2 R G Types:Sorcery A:SP$ ChangeZone | Cost$ 2 R G | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | Tapped$ True | ChangeNum$ 1 | SubAbility$ DBDealDamage | SpellDescription$ Domain — Search your library for a basic land card and put that card onto the battlefield tapped. Then shuffle. -SVar:DBDealDamage:DB$DealDamage | ValidTgts$ Player,Planeswlaker | TgtPrompt$ Select target player or planeswalker | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to target player or planeswalker, where X is the number of basic land types among lands you control. +SVar:DBDealDamage:DB$ DealDamage | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to target player or planeswalker, where X is the number of basic land types among lands you control. SVar:X:Count$Domain SVar:Picture:http://www.wizards.com/global/images/magic/general/exploding_borders.jpg Oracle:Domain — Search your library for a basic land card, put that card onto the battlefield tapped, then shuffle. Exploding Borders deals X damage to target player or planeswalker, where X is the number of basic land types among lands you control. diff --git a/forge-gui/res/cardsfolder/f/fall_of_the_impostor.txt b/forge-gui/res/cardsfolder/f/fall_of_the_impostor.txt index 836361d00b6..b41b596b104 100644 --- a/forge-gui/res/cardsfolder/f/fall_of_the_impostor.txt +++ b/forge-gui/res/cardsfolder/f/fall_of_the_impostor.txt @@ -3,7 +3,7 @@ ManaCost:1 G W Types:Enchantment Saga K:Saga:3:DBPutCounter,DBPutCounter,DBExileGreatest SVar:DBPutCounter:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | TargetMin$ 0 | TargetMax$ 1 | SpellDescription$ Put a +1/+1 counter on up to one target creature. -SVar:DBExileGreatest:DB$ Pump | ValidTgts$ Player.Opponent | RememberTargets$ True | SubAbility$ DBChooseExiled | SpellDescription$ Exile a creature with the greatest power among creatures target opponent controls. +SVar:DBExileGreatest:DB$ Pump | ValidTgts$ Player.Opponent | RememberTargets$ True | SubAbility$ DBChooseExiled | IsCurse$ True | SpellDescription$ Exile a creature with the greatest power among creatures target opponent controls. SVar:DBChooseExiled:DB$ ChooseCard | Choices$ Creature.greatestPowerControlledByRemembered | MinAmount$ 1 | Amount$ 1 | Mandatory$ True | ChoiceZone$ Battlefield | SubAbility$ DBChangeZone SVar:DBChangeZone:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | Defined$ ChosenCard | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True diff --git a/forge-gui/res/cardsfolder/f/fiend_binder.txt b/forge-gui/res/cardsfolder/f/fiend_binder.txt index a148854d1a3..b10c22a739a 100644 --- a/forge-gui/res/cardsfolder/f/fiend_binder.txt +++ b/forge-gui/res/cardsfolder/f/fiend_binder.txt @@ -3,7 +3,7 @@ ManaCost:3 W Types:Creature Human Soldier PT:3/2 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:Picture:http://www.wizards.com/global/images/magic/general/fiend_binder.jpg Oracle:Whenever Fiend Binder attacks, tap target creature defending player controls. 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 cc48c710f0a..56db269b309 100644 --- a/forge-gui/res/cardsfolder/f/flame_kin_war_scout.txt +++ b/forge-gui/res/cardsfolder/f/flame_kin_war_scout.txt @@ -3,9 +3,7 @@ ManaCost:3 R 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$ TriggeredCardLKICopy | NumDmg$ 4 | ConditionDefined$ Remembered | ConditionPresent$ Card.Self | SubAbility$ DBCleanup -SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True +SVar:TrigSac:AB$ DealDamage | Defined$ TriggeredCardLKICopy | NumDmg$ 4 | Cost$ Sac<1/CARDNAME> | CostMandatory$ True AI:RemoveDeck:All 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/f/flameskull.txt b/forge-gui/res/cardsfolder/f/flameskull.txt index 383109c1ff4..0e87078e3c1 100644 --- a/forge-gui/res/cardsfolder/f/flameskull.txt +++ b/forge-gui/res/cardsfolder/f/flameskull.txt @@ -6,7 +6,7 @@ K:Flying K:CARDNAME can't block. T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigExile | TriggerDescription$ Rejuvenation – When CARDNAME dies, exile it. If you do, exile the top card of your library. Until the end of your next turn, you may play one of those cards. (If you cast CARDNAME this way, you can't play the other card, and vice versa.) SVar:TrigExile:DB$ ChangeZone | Defined$ TriggeredNewCardLKICopy | Origin$ Graveyard | Destination$ Exile | RememberChanged$ True | SubAbility$ DBExile -SVar:DBExile:DB$ Dig | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect +SVar:DBExile:DB$ Dig | DigNum$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card.Self | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ MayPlay | Duration$ UntilTheEndOfYourNextTurn | ForgetOnMoved$ Exile | SubAbility$ DBCleanup SVar:MayPlay:Mode$ Continuous | Affected$ Card.IsRemembered | MayPlay$ True | MayPlayLimit$ 1 | EffectZone$ Command | AffectedZone$ Exile | Description$ Until the end of your next turn, you may play one of these cards. (If you cast EFFECTSOURCE this way, you can't play the other card, and vice versa.) SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True diff --git a/forge-gui/res/cardsfolder/f/flint_golem.txt b/forge-gui/res/cardsfolder/f/flint_golem.txt index a9f27848f25..25d21bb9ddd 100644 --- a/forge-gui/res/cardsfolder/f/flint_golem.txt +++ b/forge-gui/res/cardsfolder/f/flint_golem.txt @@ -3,5 +3,5 @@ ManaCost:4 Types:Artifact Creature Golem PT:2/3 T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigMill | TriggerDescription$ Whenever CARDNAME becomes blocked, defending player mills three cards. -SVar:TrigMill:DB$ Mill | Defined$ DefendingPlayer | NumCards$ 3 +SVar:TrigMill:DB$ Mill | Defined$ TriggeredDefendingPlayer | NumCards$ 3 Oracle:Whenever Flint Golem becomes blocked, defending player mills three cards. diff --git a/forge-gui/res/cardsfolder/f/floral_spuzzem.txt b/forge-gui/res/cardsfolder/f/floral_spuzzem.txt index f0b7466813f..752bb98e35e 100644 --- a/forge-gui/res/cardsfolder/f/floral_spuzzem.txt +++ b/forge-gui/res/cardsfolder/f/floral_spuzzem.txt @@ -3,6 +3,6 @@ ManaCost:3 G Types:Creature Elemental PT:2/2 T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | Execute$ TrigDestroy | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, you may destroy target artifact defending player controls. If you do, CARDNAME assigns no combat damage this turn. -SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Artifact.DefenderCtrl | TgtPrompt$ Select target artifact | SubAbility$ DBPump +SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Artifact.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target artifact | SubAbility$ DBPump SVar:DBPump:DB$ Pump | Defined$ Self | KW$ HIDDEN CARDNAME assigns no combat damage Oracle:Whenever Floral Spuzzem attacks and isn't blocked, you may destroy target artifact defending player controls. If you do, Floral Spuzzem assigns no combat damage this turn. diff --git a/forge-gui/res/cardsfolder/g/gallia_of_the_endless_dance.txt b/forge-gui/res/cardsfolder/g/gallia_of_the_endless_dance.txt index 53d8b139310..2ac298f5888 100644 --- a/forge-gui/res/cardsfolder/g/gallia_of_the_endless_dance.txt +++ b/forge-gui/res/cardsfolder/g/gallia_of_the_endless_dance.txt @@ -4,10 +4,8 @@ Types:Legendary Creature Satyr PT:2/2 K:Haste S:Mode$ Continuous | Affected$ Card.Satyr+Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Haste | Description$ Other Satyrs you control get +1/+1 and have haste. -T:Mode$ AttackersDeclared | Execute$ TrigDiscard | CheckSVar$ AttackerCount | SVarCompare$ GE3 | NoResolvingCheck$ True | TriggerZones$ Battlefield | AttackingPlayer$ You | OptionalDecider$ You | TriggerDescription$ Whenever you attack with three or more creatures, you may discard a card at random. If you do, draw two cards. +T:Mode$ AttackersDeclared | Execute$ TrigDiscard | CheckSVar$ AttackerCount | SVarCompare$ GE3 | NoResolvingCheck$ True | TriggerZones$ Battlefield | AttackingPlayer$ You | TriggerDescription$ Whenever you attack with three or more creatures, you may discard a card at random. If you do, draw two cards. SVar:AttackerCount:Count$Valid Creature.attacking -SVar:TrigDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ Random | RememberDiscarded$ True | SubAbility$ DBDraw -SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 2 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:TrigDiscard:AB$ Draw | Defined$ You | NumCards$ 2 | Cost$ Discard<1/Random> DeckHints:Type$Satyr Oracle:Haste\nOther Satyrs you control get +1/+1 and have haste.\nWhenever you attack with three or more creatures, you may discard a card at random. If you do, draw two cards. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/g/goblin_guide.txt b/forge-gui/res/cardsfolder/g/goblin_guide.txt index 3b7f250d6c7..65e261ccd78 100644 --- a/forge-gui/res/cardsfolder/g/goblin_guide.txt +++ b/forge-gui/res/cardsfolder/g/goblin_guide.txt @@ -4,6 +4,6 @@ Types:Creature Goblin Scout PT:2/2 K:Haste T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDig | TriggerDescription$ Whenever CARDNAME attacks, defending player reveals the top card of their library. If it's a land card, that player puts it into their hand. -SVar:TrigDig:DB$ Dig | Defined$ DefendingPlayer | DigNum$ 1 | Reveal$ True | ChangeNum$ All | ChangeValid$ Land | LibraryPosition2$ 0 +SVar:TrigDig:DB$ Dig | Defined$ TriggeredDefendingPlayer | DigNum$ 1 | Reveal$ True | ChangeNum$ All | ChangeValid$ Land | LibraryPosition2$ 0 SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_guide.jpg Oracle:Haste\nWhenever Goblin Guide attacks, defending player reveals the top card of their library. If it's a land card, that player puts it into their hand. diff --git a/forge-gui/res/cardsfolder/g/goblin_racketeer.txt b/forge-gui/res/cardsfolder/g/goblin_racketeer.txt index 07095f2fb97..a9792f1a006 100644 --- a/forge-gui/res/cardsfolder/g/goblin_racketeer.txt +++ b/forge-gui/res/cardsfolder/g/goblin_racketeer.txt @@ -3,6 +3,6 @@ ManaCost:3 R Types:Creature Goblin Rogue PT:4/2 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/goblin_racketeer.jpg Oracle:Whenever Goblin Racketeer 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.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/g/goblin_vandal.txt b/forge-gui/res/cardsfolder/g/goblin_vandal.txt index f0aec5ccb84..bdbd8674ba3 100644 --- a/forge-gui/res/cardsfolder/g/goblin_vandal.txt +++ b/forge-gui/res/cardsfolder/g/goblin_vandal.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Creature Goblin Rogue PT:1/1 T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, you may pay {R}. If you do, destroy target artifact defending player controls and CARDNAME assigns no combat damage this turn. -SVar:TrigDestroy:AB$ Destroy | Cost$ R | ValidTgts$ Artifact.DefenderCtrl | TgtPrompt$ Select target artifact defending player controls | SubAbility$ DBPump +SVar:TrigDestroy:AB$ Destroy | Cost$ R | ValidTgts$ Artifact.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target artifact defending player controls | SubAbility$ DBPump SVar:DBPump:DB$ Pump | Defined$ Self | KW$ HIDDEN CARDNAME assigns no combat damage Oracle:Whenever Goblin Vandal attacks and isn't blocked, you may pay {R}. If you do, destroy target artifact defending player controls and Goblin Vandal assigns no combat damage this turn. diff --git a/forge-gui/res/cardsfolder/g/grave_peril.txt b/forge-gui/res/cardsfolder/g/grave_peril.txt index f2fff0bf33c..b3dc40c3f1a 100644 --- a/forge-gui/res/cardsfolder/g/grave_peril.txt +++ b/forge-gui/res/cardsfolder/g/grave_peril.txt @@ -2,8 +2,7 @@ Name:Grave Peril ManaCost:1 B Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonBlack |TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ When a nonblack creature enters the battlefield, sacrifice Grave Peril. If you do, destroy that creature. -SVar:TrigSac:DB$ SacrificeAll | Defined$ Self | SubAbility$ DBDestroy | RememberSacrificed$ True -SVar:DBDestroy:DB$ Destroy | Defined$ TriggeredCardLKICopy | ConditionDefined$ Remembered | ConditionPresent$ Card | SubAbility$ DBCleanup +SVar:TrigSac:AB$ Destroy | Defined$ TriggeredCardLKICopy | Cost$ Sac<1/CARDNAME> | CostMandatory$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:NonStackingEffect:True AI:RemoveDeck:Random diff --git a/forge-gui/res/cardsfolder/g/graven_abomination.txt b/forge-gui/res/cardsfolder/g/graven_abomination.txt index 8d928443977..d9d4e43839e 100644 --- a/forge-gui/res/cardsfolder/g/graven_abomination.txt +++ b/forge-gui/res/cardsfolder/g/graven_abomination.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Artifact Creature Horror PT:3/1 T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigExile | TriggerDescription$ Whenever CARDNAME attacks, exile target card from defending player's graveyard. -SVar:TrigExile:DB$ChangeZone | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in defending player's graveyard | ValidTgts$ Card | TargetsWithDefinedController$ TriggeredDefendingPlayer +SVar:TrigExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in defending player's graveyard | ValidTgts$ Card | TargetsWithDefinedController$ TriggeredDefendingPlayer SVar:Picture:http://www.wizards.com/global/images/magic/general/graven_abomination.jpg Oracle:Whenever Graven Abomination attacks, exile target card from defending player's graveyard. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/g/grimgrin_corpse_born.txt b/forge-gui/res/cardsfolder/g/grimgrin_corpse_born.txt index e4fe5ff7979..919c1f9a306 100644 --- a/forge-gui/res/cardsfolder/g/grimgrin_corpse_born.txt +++ b/forge-gui/res/cardsfolder/g/grimgrin_corpse_born.txt @@ -7,7 +7,7 @@ K:CARDNAME doesn't untap during your untap step. A:AB$ Untap | Cost$ Sac<1/Creature.Other/another creature> | SubAbility$ DBPutCounter | SpellDescription$ Untap CARDNAME and put a +1/+1 counter on it. SVar:DBPutCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$1 T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME attacks, destroy target creature defending player controls, then put a +1/+1 counter on CARDNAME. -SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.DefenderCtrl | TgtPrompt$ Select target creature | SubAbility$ DBPutCounter +SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target creature | SubAbility$ DBPutCounter SVar:DBPutCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$1 AI:RemoveDeck:Random SVar:HasAttackEffect:TRUE diff --git a/forge-gui/res/cardsfolder/g/guiltfeeder.txt b/forge-gui/res/cardsfolder/g/guiltfeeder.txt index d2812b1a309..68d16f39ab5 100644 --- a/forge-gui/res/cardsfolder/g/guiltfeeder.txt +++ b/forge-gui/res/cardsfolder/g/guiltfeeder.txt @@ -4,7 +4,7 @@ Types:Creature Horror PT:0/4 K:Fear T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, defending player loses 1 life for each card in their graveyard. -SVar:TrigLoseLife:DB$ LoseLife | Defined$ DefendingPlayer | LifeAmount$ X +SVar:TrigLoseLife:DB$ LoseLife | Defined$ TriggeredDefendingPlayer | LifeAmount$ X SVar:X:Count$ValidGraveyard Card.DefenderCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/guiltfeeder.jpg Oracle:Fear (This creature can't be blocked except by artifact creatures and/or black creatures.)\nWhenever Guiltfeeder attacks and isn't blocked, defending player loses 1 life for each card in their graveyard. diff --git a/forge-gui/res/cardsfolder/h/hammer_of_ruin.txt b/forge-gui/res/cardsfolder/h/hammer_of_ruin.txt index d3619e7fa36..313cffd2407 100644 --- a/forge-gui/res/cardsfolder/h/hammer_of_ruin.txt +++ b/forge-gui/res/cardsfolder/h/hammer_of_ruin.txt @@ -4,6 +4,6 @@ Types:Artifact Equipment K:Equip:2 S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | Description$ Equipped creature gets +2/+0. T:Mode$ DamageDone | ValidSource$ Creature.EquippedBy | ValidTarget$ Player | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigDestroy | TriggerZones$ Battlefield | TriggerDescription$ Whenever equipped creature deals combat damage to a player, you may destroy target Equipment that player controls. -SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Equipment.DefenderCtrl | TgtPrompt$ Select target equipment defending player controls +SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Equipment.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target equipment defending player controls SVar:Picture:http://www.wizards.com/global/images/magic/general/hammer_of_ruin.jpg Oracle:Equipped creature gets +2/+0.\nWhenever equipped creature deals combat damage to a player, you may destroy target Equipment that player controls.\nEquip {2} diff --git a/forge-gui/res/cardsfolder/h/harbor_guardian.txt b/forge-gui/res/cardsfolder/h/harbor_guardian.txt index 1fad2d3112e..719eab92337 100644 --- a/forge-gui/res/cardsfolder/h/harbor_guardian.txt +++ b/forge-gui/res/cardsfolder/h/harbor_guardian.txt @@ -4,6 +4,6 @@ Types:Creature Gargoyle PT:3/4 K:Reach T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDraw | OptionalDecider$ Opponent | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME attacks, defending player may draw a card. -SVar:TrigDraw:DB$ Draw | Defined$ DefendingPlayer | NumCards$ 1 +SVar:TrigDraw:DB$ Draw | Defined$ TriggeredDefendingPlayer | NumCards$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/harbor_guardian.jpg Oracle:Reach (This creature can block creatures with flying.)\nWhenever Harbor Guardian attacks, defending player may draw a card. diff --git a/forge-gui/res/cardsfolder/h/hazorets_monument.txt b/forge-gui/res/cardsfolder/h/hazorets_monument.txt index 23e48f0344a..879c13f000b 100644 --- a/forge-gui/res/cardsfolder/h/hazorets_monument.txt +++ b/forge-gui/res/cardsfolder/h/hazorets_monument.txt @@ -3,9 +3,7 @@ ManaCost:3 Types:Legendary Artifact S:Mode$ ReduceCost | ValidCard$ Creature.Red | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Red creature spells you cast cost {1} less to cast. T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | Execute$ TrigDiscard | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a creature spell, you may discard a card. If you do, draw a card. -SVar:TrigDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | RememberDiscarded$ True | Optional$ True | SubAbility$ DBDraw -SVar:DBDraw:DB$ Draw | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:TrigDiscard:AB$ Draw | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | Cost$ Discard<1/Card> DeckNeeds:Color$Red SVar:Picture:http://www.wizards.com/global/images/magic/general/hazorets_monument.jpg Oracle:Red creature spells you cast cost {1} less to cast.\nWhenever you cast a creature spell, you may discard a card. If you do, draw a card. diff --git a/forge-gui/res/cardsfolder/h/heart_piercer_bow.txt b/forge-gui/res/cardsfolder/h/heart_piercer_bow.txt index 04125019c14..f1d77fd073d 100644 --- a/forge-gui/res/cardsfolder/h/heart_piercer_bow.txt +++ b/forge-gui/res/cardsfolder/h/heart_piercer_bow.txt @@ -3,7 +3,7 @@ ManaCost:2 Types:Artifact Equipment K:Equip:1 T:Mode$ Attacks | ValidCard$ Card.AttachedBy | Execute$ TrigDamage | TriggerDescription$ Whenever equipped creature attacks, CARDNAME deals 1 damage to target creature defending player controls. -SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature.DefenderCtrl | TgtPrompt$ Select target creature defending player controls | NumDmg$ 1 +SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target creature defending player controls | NumDmg$ 1 S:Mode$ Continuous | Affected$ Creature.AttachedBy | AddSVar$ AE SVar:AE:SVar:HasAttackEffect:TRUE DeckHints:Name$Renowned Weaponsmith diff --git a/forge-gui/res/cardsfolder/h/hellkite_tyrant.txt b/forge-gui/res/cardsfolder/h/hellkite_tyrant.txt index 192f200d2fa..da88c300f09 100644 --- a/forge-gui/res/cardsfolder/h/hellkite_tyrant.txt +++ b/forge-gui/res/cardsfolder/h/hellkite_tyrant.txt @@ -5,7 +5,7 @@ PT:6/5 K:Flying K:Trample T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigGainControl | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, gain control of all artifacts that player controls. -SVar:TrigGainControl:DB$ GainControl | AllValid$ Artifact.DefenderCtrl | NewController$ You +SVar:TrigGainControl:DB$ GainControl | AllValid$ Artifact.ControlledBy TriggeredDefendingPlayer | NewController$ You T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | PresentCompare$ GE20 | IsPresent$ Artifact.YouCtrl | Execute$ WinGame | TriggerDescription$ At the beginning of your upkeep, if you control twenty or more artifacts, you win the game. SVar:WinGame:DB$ WinsGame | Defined$ You SVar:Picture:http://www.wizards.com/global/images/magic/general/hellkite_tyrant.jpg diff --git a/forge-gui/res/cardsfolder/h/hellkite_whelp.txt b/forge-gui/res/cardsfolder/h/hellkite_whelp.txt index 2b162c06070..d651d6f5735 100644 --- a/forge-gui/res/cardsfolder/h/hellkite_whelp.txt +++ b/forge-gui/res/cardsfolder/h/hellkite_whelp.txt @@ -4,5 +4,5 @@ Types:Creature Dragon PT:3/3 K:Flying T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ Whenever CARDNAME attacks, it deals 1 damage to target creature defending player controls. -SVar:TrigDealDamage:DB$DealDamage | ValidTgts$ Creature.DefenderCtrl | TgtPrompt$ Select target creature defending player controls | NumDmg$ 1 +SVar:TrigDealDamage:DB$DealDamage | ValidTgts$ Creature.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target creature defending player controls | NumDmg$ 1 Oracle:Flying\nWhenever Hellkite Whelp attacks, it deals 1 damage to target creature defending player controls. diff --git a/forge-gui/res/cardsfolder/h/hellrider.txt b/forge-gui/res/cardsfolder/h/hellrider.txt index c41f3fca069..06ce5e8e0bc 100644 --- a/forge-gui/res/cardsfolder/h/hellrider.txt +++ b/forge-gui/res/cardsfolder/h/hellrider.txt @@ -4,7 +4,7 @@ Types:Creature Devil PT:3/3 K:Haste T:Mode$ Attacks | ValidCard$ Creature.YouCtrl | Execute$ TrigDealDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever a creature you control attacks, CARDNAME deals 1 damage to the player or planeswalker it's attacking. -SVar:TrigDealDamage:DB$DealDamage | Defined$ TriggeredDefendingPlayer| NumDmg$ 1 +SVar:TrigDealDamage:DB$DealDamage | Defined$ TriggeredDefendingPlayer | NumDmg$ 1 SVar:HasAttackEffect:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/hellrider.jpg Oracle:Haste\nWhenever a creature you control attacks, Hellrider deals 1 damage to the player or planeswalker it's attacking. diff --git a/forge-gui/res/cardsfolder/i/izzet_keyrune.txt b/forge-gui/res/cardsfolder/i/izzet_keyrune.txt index 413f58067a9..094159528fb 100644 --- a/forge-gui/res/cardsfolder/i/izzet_keyrune.txt +++ b/forge-gui/res/cardsfolder/i/izzet_keyrune.txt @@ -4,9 +4,8 @@ Types:Artifact A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. A:AB$ Animate | Cost$ U R | Defined$ Self | Power$ 2 | Toughness$ 1 | Types$ Artifact,Creature,Elemental | Colors$ Blue,Red | SpellDescription$ Until end of turn, CARDNAME becomes a 2/1 blue and red Elemental artifact creature. -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigLoot | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may draw a card. If you do, discard a card. -SVar:TrigLoot:DB$Draw | NumCards$ 1 | SubAbility$ DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigLoot | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may draw a card. If you do, discard a card. +SVar:TrigLoot:AB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 | Cost$ Draw<1/You> AI:RemoveDeck:Random DeckNeeds:Color$Blue|Red SVar:Picture:http://www.wizards.com/global/images/magic/general/izzet_keyrune.jpg diff --git a/forge-gui/res/cardsfolder/j/jangling_automaton.txt b/forge-gui/res/cardsfolder/j/jangling_automaton.txt index 1c87c49b082..da8cc3164af 100644 --- a/forge-gui/res/cardsfolder/j/jangling_automaton.txt +++ b/forge-gui/res/cardsfolder/j/jangling_automaton.txt @@ -3,7 +3,7 @@ ManaCost:3 Types:Artifact Creature Construct PT:3/2 T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigUntap | TriggerDescription$ Whenever CARDNAME attacks, untap all creatures defending player controls. -SVar:TrigUntap:DB$UntapAll | ValidCards$ Creature.DefenderCtrl +SVar:TrigUntap:DB$ UntapAll | ValidCards$ Creature.ControlledBy TriggeredDefendingPlayer AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/jangling_automaton.jpg Oracle:Whenever Jangling Automaton attacks, untap all creatures defending player controls. diff --git a/forge-gui/res/cardsfolder/j/jeskai_ascendancy.txt b/forge-gui/res/cardsfolder/j/jeskai_ascendancy.txt index 5447810ea5a..4e357f7c18e 100644 --- a/forge-gui/res/cardsfolder/j/jeskai_ascendancy.txt +++ b/forge-gui/res/cardsfolder/j/jeskai_ascendancy.txt @@ -2,11 +2,10 @@ Name:Jeskai Ascendancy ManaCost:U R W Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPumpAll | TriggerDescription$ Whenever you cast a noncreature spell, creatures you control get +1/+1 until end of turn. Untap those creatures. -T:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigLoot | OptionalDecider$ You | TriggerDescription$ Whenever you cast a noncreature spell, you may draw a card. If you do, discard a card. +T:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigLoot | TriggerDescription$ Whenever you cast a noncreature spell, you may draw a card. If you do, discard a card. SVar:TrigPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl | NumAtt$ 1 | NumDef$ 1 | SubAbility$ TrigUntapAll SVar:TrigUntapAll:DB$ UntapAll | ValidCards$ Creature.YouCtrl -SVar:TrigLoot:DB$Draw | NumCards$ 1 | SubAbility$ DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 +SVar:TrigLoot:AB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 | Cost$ Draw<1/You> SVar:BuffedBy:Card.nonCreature+nonLand SVar:Picture:http://www.wizards.com/global/images/magic/general/jeskai_ascendancy.jpg Oracle:Whenever you cast a noncreature spell, creatures you control get +1/+1 until end of turn. Untap those creatures.\nWhenever you cast a noncreature spell, you may draw a card. If you do, discard a card. diff --git a/forge-gui/res/cardsfolder/j/jeskai_elder.txt b/forge-gui/res/cardsfolder/j/jeskai_elder.txt index d217c58bc04..f9ddadfc912 100644 --- a/forge-gui/res/cardsfolder/j/jeskai_elder.txt +++ b/forge-gui/res/cardsfolder/j/jeskai_elder.txt @@ -3,8 +3,7 @@ ManaCost:1 U Types:Creature Human Monk PT:1/2 K:Prowess -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigLoot | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may draw a card. If you do, discard a card. -SVar:TrigLoot:DB$Draw | NumCards$ 1 | SubAbility$ DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigLoot | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may draw a card. If you do, discard a card. +SVar:TrigLoot:AB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 | Cost$ Draw<1/You> SVar:Picture:http://www.wizards.com/global/images/magic/general/jeskai_elder.jpg Oracle:Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.)\nWhenever Jeskai Elder deals combat damage to a player, you may draw a card. If you do, discard a card. diff --git a/forge-gui/res/cardsfolder/k/kardur_doomscourge.txt b/forge-gui/res/cardsfolder/k/kardur_doomscourge.txt index c6335c453d3..75a79b37f2f 100644 --- a/forge-gui/res/cardsfolder/k/kardur_doomscourge.txt +++ b/forge-gui/res/cardsfolder/k/kardur_doomscourge.txt @@ -6,7 +6,7 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:TrigEffect:DB$ Effect | StaticAbilities$ AttackEach,AttackOther | Duration$ UntilYourNextTurn SVar:AttackEach:Mode$ Continuous | Affected$ Creature.OppCtrl | AddHiddenKeyword$ CARDNAME attacks each combat if able. | Description$ Creatures your opponents control attack each combat if able and attack a player other than you if able. SVar:AttackOther:Mode$ Continuous | Affected$ You | AddKeyword$ Creatures your opponents control attack a player other than you if able. | Secondary$ True | Description$ Creatures your opponents control attack each combat if able and attack a player other than you if able. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.attackingLKI | Execute$ TrigDrain | TriggerZones$ Battlefield | TriggerDescription$ Whenever an attacking creature dies, each opponent loses 1 life and you gain 1 life. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.attacking | Execute$ TrigDrain | TriggerZones$ Battlefield | TriggerDescription$ Whenever an attacking creature dies, each opponent loses 1 life and you gain 1 life. SVar:TrigDrain:DB$ LoseLife | Defined$ Player.Opponent | LifeAmount$ 1 | SubAbility$ DBGainOneLife SVar:DBGainOneLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 DeckHas:Ability$LifeGain diff --git a/forge-gui/res/cardsfolder/k/keeper_of_tresserhorn.txt b/forge-gui/res/cardsfolder/k/keeper_of_tresserhorn.txt index 87b1770280c..952f234abdb 100644 --- a/forge-gui/res/cardsfolder/k/keeper_of_tresserhorn.txt +++ b/forge-gui/res/cardsfolder/k/keeper_of_tresserhorn.txt @@ -4,5 +4,5 @@ Types:Creature Avatar PT:6/6 T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, it assigns no combat damage this turn and defending player loses 2 life. SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ HIDDEN CARDNAME assigns no combat damage | SubAbility$ DBLose -SVar:DBLose:DB$ LoseLife | Defined$ DefendingPlayer | LifeAmount$ 2 +SVar:DBLose:DB$ LoseLife | Defined$ TriggeredDefendingPlayer | LifeAmount$ 2 Oracle:Whenever Keeper of Tresserhorn attacks and isn't blocked, it assigns no combat damage this turn and defending player loses 2 life. diff --git a/forge-gui/res/cardsfolder/k/keldon_raider.txt b/forge-gui/res/cardsfolder/k/keldon_raider.txt index 7b935cc7afc..51bb1b78bd1 100644 --- a/forge-gui/res/cardsfolder/k/keldon_raider.txt +++ b/forge-gui/res/cardsfolder/k/keldon_raider.txt @@ -3,8 +3,6 @@ ManaCost:2 R R Types:Creature Human Warrior PT:4/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, you may discard a card. If you do, draw a card. -SVar:TrigDiscard:DB$ Discard | NumCards$ 1 | Mode$ TgtChoose | Optional$ True | RememberDiscarded$ True | SubAbility$ DBDraw -SVar:DBDraw:DB$ Draw | NumCards$ 1 | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:TrigDiscard:AB$ Draw | NumCards$ 1 | Cost$ Discard<1/Card> SVar:X:Remembered$Amount Oracle:When Keldon Raider enters the battlefield, you may discard a card. If you do, draw a card. diff --git a/forge-gui/res/cardsfolder/k/kithkin_mourncaller.txt b/forge-gui/res/cardsfolder/k/kithkin_mourncaller.txt index 3106b291a04..206251bdd84 100644 --- a/forge-gui/res/cardsfolder/k/kithkin_mourncaller.txt +++ b/forge-gui/res/cardsfolder/k/kithkin_mourncaller.txt @@ -2,7 +2,7 @@ Name:Kithkin Mourncaller ManaCost:2 G Types:Creature Kithkin Scout PT:2/2 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Kithkin+attackingLKI+YouOwn,Creature.Elf+attackingLKI+YouOwn | Execute$ TrigDraw | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever an attacking Kithkin or Elf is put into your graveyard from the battlefield, you may draw a card. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Kithkin+YouOwn+attacking,Creature.Elf+YouOwn+attacking | Execute$ TrigDraw | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever an attacking Kithkin or Elf is put into your graveyard from the battlefield, you may draw a card. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/kithkin_mourncaller.jpg diff --git a/forge-gui/res/cardsfolder/k/knight_of_the_ebon_legion.txt b/forge-gui/res/cardsfolder/k/knight_of_the_ebon_legion.txt index 0a79ffe99f5..9e0426e407b 100644 --- a/forge-gui/res/cardsfolder/k/knight_of_the_ebon_legion.txt +++ b/forge-gui/res/cardsfolder/k/knight_of_the_ebon_legion.txt @@ -5,6 +5,6 @@ PT:1/2 A:AB$ Pump | Cost$ 2 B | NumAtt$ +3 | NumDef$ +3 | Defined$ Self | KW$ Deathtouch | SpellDescription$ CARDNAME gets +3/+3 and gains deathtouch until end of turn. T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ X | SVarCompare$ GE4 | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your end step, if a player lost 4 or more life this turn, put a +1/+1 counter on CARDNAME. (Damage causes loss of life.) SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:X:PlayerCountOpponents$HighestLifeLostThisTurn +SVar:X:PlayerCountPlayers$HighestLifeLostThisTurn DeckHas:Ability$Counters Oracle:{2}{B}: Knight of the Ebon Legion gets +3/+3 and gains deathtouch until end of turn.\nAt the beginning of your end step, if a player lost 4 or more life this turn, put a +1/+1 counter on Knight of the Ebon Legion. (Damage causes loss of life.) diff --git a/forge-gui/res/cardsfolder/k/kogla_the_titan_ape.txt b/forge-gui/res/cardsfolder/k/kogla_the_titan_ape.txt index 5f368e332b8..739ef9e656b 100644 --- a/forge-gui/res/cardsfolder/k/kogla_the_titan_ape.txt +++ b/forge-gui/res/cardsfolder/k/kogla_the_titan_ape.txt @@ -5,7 +5,7 @@ PT:7/6 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFight | TriggerDescription$ When CARDNAME enters the battlefield, it fights up to one target creature you don't control. SVar:TrigFight:DB$ Fight | Defined$ TriggeredCardLKICopy | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Choose target creature you don't control | TargetMin$ 0 | TargetMax$ 1 T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME attacks, destroy target artifact or enchantment defending player controls. -SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Artifact.DefenderCtrl,Enchantment.DefenderCtrl | TgtPrompt$ Select target artifact or enchantment defending player controls +SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Artifact.ControlledBy TriggeredDefendingPlayer,Enchantment.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target artifact or enchantment defending player controls A:AB$ ChangeZone | Cost$ 1 G | ValidTgts$ Human.YouCtrl | TgtPrompt$ Choose target Human you control | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBPump | SpellDescription$ Return target Human you control to its owner's hand. CARDNAME gains indestructible until end of turn. SVar:DBPump:DB$ Pump | Defined$ Self | KW$ Indestructible Oracle:When Kogla, the Titan Ape enters the battlefield, it fights up to one target creature you don't control.\nWhenever Kogla attacks, destroy target artifact or enchantment defending player controls.\n{1}{G}: Return target Human you control to its owner's hand. Kogla gains indestructible until end of turn. diff --git a/forge-gui/res/cardsfolder/k/kukemssa_pirates.txt b/forge-gui/res/cardsfolder/k/kukemssa_pirates.txt index 83d76500e53..3a4e65519fb 100644 --- a/forge-gui/res/cardsfolder/k/kukemssa_pirates.txt +++ b/forge-gui/res/cardsfolder/k/kukemssa_pirates.txt @@ -3,7 +3,7 @@ ManaCost:3 U Types:Creature Human Pirate PT:2/2 T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | Execute$ TrigGainControl | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, you may gain control of target artifact defending player controls. If you do, CARDNAME assigns no combat damage this turn. -SVar:TrigGainControl:DB$ GainControl | ValidTgts$ Artifact.DefenderCtrl | TgtPrompt$ Select target artifact defending player controls | SubAbility$ DBNoCombatDamage +SVar:TrigGainControl:DB$ GainControl | ValidTgts$ Artifact.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target artifact defending player controls | SubAbility$ DBNoCombatDamage SVar:DBNoCombatDamage:DB$ Pump | Defined$ Self | KW$ HIDDEN CARDNAME assigns no combat damage SVar:Picture:http://www.wizards.com/global/images/magic/general/kukemssa_pirates.jpg Oracle:Whenever Kukemssa Pirates attacks and isn't blocked, you may gain control of target artifact defending player controls. If you do, Kukemssa Pirates assigns no combat damage this turn. diff --git a/forge-gui/res/cardsfolder/l/lamplighter_of_selhoff.txt b/forge-gui/res/cardsfolder/l/lamplighter_of_selhoff.txt index b91d4965785..f97e65e20aa 100644 --- a/forge-gui/res/cardsfolder/l/lamplighter_of_selhoff.txt +++ b/forge-gui/res/cardsfolder/l/lamplighter_of_selhoff.txt @@ -2,9 +2,8 @@ Name:Lamplighter of Selhoff ManaCost:4 U Types:Creature Zombie Horror PT:3/5 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | IsPresent$ Permanent.Zombie+Other+YouCtrl | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, if you control another Zombie, you may draw a card. If you do, discard a card. -SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 | SubAbility$ DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | IsPresent$ Permanent.Zombie+Other+YouCtrl | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, if you control another Zombie, you may draw a card. If you do, discard a card. +SVar:TrigDraw:AB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | Cost$ Draw<1/You> DeckHints:Type$Zombie SVar:Picture:http://www.wizards.com/global/images/magic/general/lamplighter_of_selhoff.jpg Oracle:When Lamplighter of Selhoff enters the battlefield, if you control another Zombie, you may draw a card. If you do, discard a card. diff --git a/forge-gui/res/cardsfolder/l/latullas_orders.txt b/forge-gui/res/cardsfolder/l/latullas_orders.txt index 5ffcc17a9b4..9d96ea6a3b9 100644 --- a/forge-gui/res/cardsfolder/l/latullas_orders.txt +++ b/forge-gui/res/cardsfolder/l/latullas_orders.txt @@ -5,6 +5,6 @@ K:Flash K:Enchant creature A:SP$ Attach | Cost$ 1 R | ValidTgts$ Creature | AITgts$ Card.powerGE1 | AILogic$ Pump T:Mode$ DamageDone | ValidSource$ Card.AttachedBy | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDestroy | OptionalDecider$ You | TriggerDescription$ Whenever enchanted creature deals combat damage to defending player, you may destroy target artifact that player controls. -SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Artifact.DefenderCtrl | TgtPrompt$ Select target artifact +SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Artifact.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target artifact SVar:Picture:http://www.wizards.com/global/images/magic/general/latullas_orders.jpg Oracle:Flash\nEnchant creature\nWhenever enchanted creature deals combat damage to defending player, you may destroy target artifact that player controls. diff --git a/forge-gui/res/cardsfolder/l/lightwielder_paladin.txt b/forge-gui/res/cardsfolder/l/lightwielder_paladin.txt index 3dc5e51258b..f0e12c4058a 100644 --- a/forge-gui/res/cardsfolder/l/lightwielder_paladin.txt +++ b/forge-gui/res/cardsfolder/l/lightwielder_paladin.txt @@ -4,6 +4,6 @@ Types:Creature Human Knight PT:4/4 K:First Strike T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigExile | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may exile target black or red permanent that player controls. -SVar:TrigExile:DB$ ChangeZone | ValidTgts$ Permanent.Black+DefenderCtrl,Permanent.Red+DefenderCtrl | TgtPrompt$ Choose target black or red permanent. | Origin$ Battlefield | Destination$ Exile | IsCurse$ True +SVar:TrigExile:DB$ ChangeZone | ValidTgts$ Permanent.Black+ControlledBy TriggeredDefendingPlayer,Permanent.Red+ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Choose target black or red permanent. | Origin$ Battlefield | Destination$ Exile | IsCurse$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/lightwielder_paladin.jpg Oracle:First strike (This creature deals combat damage before creatures without first strike.)\nWhenever Lightwielder Paladin deals combat damage to a player, you may exile target black or red permanent that player controls. diff --git a/forge-gui/res/cardsfolder/l/lim_duls_paladin.txt b/forge-gui/res/cardsfolder/l/lim_duls_paladin.txt index b8039c412b3..6a7a844ae38 100644 --- a/forge-gui/res/cardsfolder/l/lim_duls_paladin.txt +++ b/forge-gui/res/cardsfolder/l/lim_duls_paladin.txt @@ -12,7 +12,7 @@ T:Mode$ AttackerBlocked | ValidCard$ Card.Self | ValidBlocker$ Creature | Trigge SVar:TrigBlockedPump:DB$ Pump | Defined$ Self | NumAtt$ 6 | NumDef$ 3 T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | Execute$ TrigUnBlockedPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever Lim-Dûl's Paladin attacks and isn't blocked, it assigns no combat damage this turn and defending player loses 4 life. SVar:TrigUnBlockedPump:DB$ Pump | Defined$ Self | KW$ HIDDEN CARDNAME assigns no combat damage | SubAbility$ DBLoseLife -SVar:DBLoseLife:DB$ LoseLife | Defined$ DefendingPlayer | LifeAmount$ 4 +SVar:DBLoseLife:DB$ LoseLife | Defined$ TriggeredDefendingPlayer | LifeAmount$ 4 SVar:X:Remembered$Amount AI:RemoveDeck:All Oracle:Trample\nAt the beginning of your upkeep, you may discard a card. If you don't, sacrifice Lim-Dûl's Paladin and draw a card.\nWhenever Lim-Dûl's Paladin becomes blocked, it gets +6/+3 until end of turn.\nWhenever Lim-Dûl's Paladin attacks and isn't blocked, it assigns no combat damage this turn and defending player loses 4 life. diff --git a/forge-gui/res/cardsfolder/m/mage_slayer.txt b/forge-gui/res/cardsfolder/m/mage_slayer.txt index 07aee4965c4..921c76737a4 100644 --- a/forge-gui/res/cardsfolder/m/mage_slayer.txt +++ b/forge-gui/res/cardsfolder/m/mage_slayer.txt @@ -3,7 +3,7 @@ ManaCost:1 R G Types:Artifact Equipment K:Equip:3 T:Mode$ Attacks | ValidCard$ Card.AttachedBy | Execute$ TrigDamage | TriggerDescription$ Whenever equipped creature attacks, it deals damage equal to its power to defending player. -SVar:TrigDamage:DB$ DealDamage | Defined$ DefendingPlayer | DamageSource$ TriggeredAttackerLKICopy | NumDmg$ X +SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredDefendingPlayer | DamageSource$ TriggeredAttackerLKICopy | NumDmg$ X SVar:X:TriggeredAttacker$CardPower S:Mode$ Continuous | Affected$ Creature.AttachedBy | AddSVar$ AE SVar:AE:SVar:HasAttackEffect:TRUE diff --git a/forge-gui/res/cardsfolder/m/mask_of_memory.txt b/forge-gui/res/cardsfolder/m/mask_of_memory.txt index efca65d7859..07fa17cf9f1 100644 --- a/forge-gui/res/cardsfolder/m/mask_of_memory.txt +++ b/forge-gui/res/cardsfolder/m/mask_of_memory.txt @@ -2,8 +2,7 @@ Name:Mask of Memory ManaCost:2 Types:Artifact Equipment K:Equip:1 -T:Mode$ DamageDone | ValidSource$ Creature.AttachedBy | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigLoot | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever equipped creature deals combat damage to a player, you may draw two cards. If you do, discard a card. -SVar:TrigLoot:DB$Draw | NumCards$ 2 | SubAbility$ DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 +T:Mode$ DamageDone | ValidSource$ Creature.AttachedBy | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigLoot | TriggerZones$ Battlefield | TriggerDescription$ Whenever equipped creature deals combat damage to a player, you may draw two cards. If you do, discard a card. +SVar:TrigLoot:AB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 | Cost$ Draw<2/You> SVar:Picture:http://www.wizards.com/global/images/magic/general/mask_of_memory.jpg Oracle:Whenever equipped creature deals combat damage to a player, you may draw two cards. If you do, discard a card.\nEquip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/m/master_of_diversion.txt b/forge-gui/res/cardsfolder/m/master_of_diversion.txt index f88e20399d6..c1ab3b662f4 100644 --- a/forge-gui/res/cardsfolder/m/master_of_diversion.txt +++ b/forge-gui/res/cardsfolder/m/master_of_diversion.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Creature Human Scout PT:2/2 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:Picture:http://www.wizards.com/global/images/magic/general/master_of_diversion.jpg Oracle:Whenever Master of Diversion attacks, tap target creature defending player controls. diff --git a/forge-gui/res/cardsfolder/m/mindleech_mass.txt b/forge-gui/res/cardsfolder/m/mindleech_mass.txt index fb07890fbc1..e1788f5ecc3 100644 --- a/forge-gui/res/cardsfolder/m/mindleech_mass.txt +++ b/forge-gui/res/cardsfolder/m/mindleech_mass.txt @@ -5,6 +5,6 @@ PT:6/6 K:Trample T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigReveal | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may look at that player's hand. If you do, you may cast a spell from among those cards without paying its mana cost. SVar:TrigReveal:DB$ RevealHand | Defined$ TriggeredTarget | SubAbility$ TrigPlay -SVar:TrigPlay:DB$ Play | Valid$ Card.DefenderCtrl | ValidZone$ Hand | ValidSA$ Spell | WithoutManaCost$ True | Optional$ True +SVar:TrigPlay:DB$ Play | Valid$ Card.ControlledBy TriggeredDefendingPlayer | ValidZone$ Hand | ValidSA$ Spell | WithoutManaCost$ True | Optional$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/mindleech_mass.jpg Oracle:Trample\nWhenever Mindleech Mass deals combat damage to a player, you may look at that player's hand. If you do, you may cast a spell from among those cards without paying its mana cost. diff --git a/forge-gui/res/cardsfolder/m/minotaur_explorer.txt b/forge-gui/res/cardsfolder/m/minotaur_explorer.txt index 9afb763ddc3..069b819eb1e 100644 --- a/forge-gui/res/cardsfolder/m/minotaur_explorer.txt +++ b/forge-gui/res/cardsfolder/m/minotaur_explorer.txt @@ -2,11 +2,8 @@ Name:Minotaur Explorer ManaCost:1 R Types:Creature Minotaur Scout PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, sacrifice it unless you discard a card at random. -SVar:TrigDiscard:DB$ Discard | NumCards$ 1 | Mode$ Random | Optional$ True | RememberDiscarded$ True | SubAbility$ DBSacrifice -SVar:DBSacrifice:DB$ Sacrifice | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:X:Remembered$Amount +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME enters the battlefield, sacrifice it unless you discard a card at random. +SVar:TrigSac:DB$ Sacrifice | SacValid$ Self | UnlessCost$ Discard<1/Random> | UnlessPayer$ You SVar:NeedsToPlayVar:Y GE2 SVar:Y:Count$InYourHand SVar:Picture:http://resources.wizards.com/magic/cards/od/en-us/card31786.jpg diff --git a/forge-gui/res/cardsfolder/m/mistblade_shinobi.txt b/forge-gui/res/cardsfolder/m/mistblade_shinobi.txt index 4c0eafd9067..b5b70cdb414 100644 --- a/forge-gui/res/cardsfolder/m/mistblade_shinobi.txt +++ b/forge-gui/res/cardsfolder/m/mistblade_shinobi.txt @@ -4,6 +4,6 @@ Types:Creature Human Ninja PT:1/1 K:Ninjutsu:U T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigBounce | OptionalDecider$ You | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may return target creature that player controls to its owner's hand. -SVar:TrigBounce:DB$ ChangeZone | ValidTgts$ Creature.DefenderCtrl | TgtPrompt$ Choose target creature your opponent controls. | Origin$ Battlefield | Destination$ Hand +SVar:TrigBounce:DB$ ChangeZone | ValidTgts$ Creature.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Choose target creature your opponent controls. | Origin$ Battlefield | Destination$ Hand SVar:Picture:http://www.wizards.com/global/images/magic/general/mistblade_shinobi.jpg Oracle:Ninjutsu {U} ({U}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.)\nWhenever Mistblade Shinobi deals combat damage to a player, you may return target creature that player controls to its owner's hand. diff --git a/forge-gui/res/cardsfolder/m/momir_vig_simic_visionary_avatar.txt b/forge-gui/res/cardsfolder/m/momir_vig_simic_visionary_avatar.txt index f62e6259cbd..3dc7c2493f1 100644 --- a/forge-gui/res/cardsfolder/m/momir_vig_simic_visionary_avatar.txt +++ b/forge-gui/res/cardsfolder/m/momir_vig_simic_visionary_avatar.txt @@ -2,7 +2,6 @@ Name:Momir Vig, Simic Visionary Avatar ManaCost:no cost Types:Vanguard HandLifeModifier:+0/+4 -A:AB$ CopyPermanent | Cost$ X Discard<1/Card> | AILogic$ MomirAvatar | ActivationZone$ Command | NumCopies$ 1 | ValidSupportedCopy$ Creature.cmcEQX | RandomCopied$ True | RandomNum$ 1 | SorcerySpeed$ True | ActivationLimit$ 1 | AILogic$ MomirAvatar | SpellDescription$ Create a token that's a copy of a creature card with mana value X chosen at random. Activate only as a sorcery and only once each turn. | StackDescription$ SpellDescription +A:AB$ CopyPermanent | Cost$ X Discard<1/Card> | AILogic$ MomirAvatar | ActivationZone$ Command | NumCopies$ 1 | ValidSupportedCopy$ Creature.cmcEQX | RandomCopied$ True | RandomNum$ 1 | SorcerySpeed$ True | ActivationLimit$ 1 | SpellDescription$ Create a token that's a copy of a creature card with mana value X chosen at random. Activate only as a sorcery and only once each turn. | StackDescription$ SpellDescription SVar:X:Count$xPaid -SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Momir Vig, Simic Visionary Avatar.full.jpg Oracle:Hand +0, life +4\n{X}, Discard a card: Create a token that's a copy of a creature card with mana value X chosen at random. Activate only as a sorcery and only once each turn. diff --git a/forge-gui/res/cardsfolder/m/mordant_dragon.txt b/forge-gui/res/cardsfolder/m/mordant_dragon.txt index 81c837bbf0c..137c79683b9 100644 --- a/forge-gui/res/cardsfolder/m/mordant_dragon.txt +++ b/forge-gui/res/cardsfolder/m/mordant_dragon.txt @@ -5,7 +5,7 @@ PT:5/5 K:Flying A:AB$ Pump | Cost$ 1 R | Defined$ Self | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigDamage | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may have it deal that much damage to target creature that player controls. -SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature.DefenderCtrl | NumDmg$ X | TgtPrompt$ Select target creature. +SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature.ControlledBy TriggeredDefendingPlayer | NumDmg$ X | TgtPrompt$ Select target creature. SVar:X:Count$CardPower SVar:MustBeBlocked:True Oracle:Flying\n{1}{R}: Mordant Dragon gets +1/+0 until end of turn.\nWhenever Mordant Dragon deals combat damage to a player, you may have it deal that much damage to target creature that player controls. diff --git a/forge-gui/res/cardsfolder/m/mortal_obstinacy.txt b/forge-gui/res/cardsfolder/m/mortal_obstinacy.txt index 0134f508d04..351906ef8e6 100644 --- a/forge-gui/res/cardsfolder/m/mortal_obstinacy.txt +++ b/forge-gui/res/cardsfolder/m/mortal_obstinacy.txt @@ -4,7 +4,7 @@ Types:Enchantment Aura K:Enchant creature you control A:SP$ Attach | Cost$ W | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 1 | Description$ Enchanted creature gets +1/+1. -T:Mode$ DamageDone | ValidSource$ Card.EnchantedBy | ValidTarget$ Player | Execute$ TrigDestroy| CombatDamage$ True | TriggerDescription$ Whenever enchanted creature deals combat damage to a player, you may sacrifice CARDNAME. If you do, destroy target enchantment. +T:Mode$ DamageDone | ValidSource$ Card.EnchantedBy | ValidTarget$ Player | Execute$ TrigDestroy | CombatDamage$ True | TriggerDescription$ Whenever enchanted creature deals combat damage to a player, you may sacrifice CARDNAME. If you do, destroy target enchantment. SVar:TrigDestroy:AB$ Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment SVar:Picture:http://www.wizards.com/global/images/magic/general/mortal_obstinacy.jpg Oracle:Enchant creature you control\nEnchanted creature gets +1/+1.\nWhenever enchanted creature deals combat damage to a player, you may sacrifice Mortal Obstinacy. If you do, destroy target enchantment. diff --git a/forge-gui/res/cardsfolder/m/mtenda_lion.txt b/forge-gui/res/cardsfolder/m/mtenda_lion.txt index eb6ec899e03..ab693e6172e 100644 --- a/forge-gui/res/cardsfolder/m/mtenda_lion.txt +++ b/forge-gui/res/cardsfolder/m/mtenda_lion.txt @@ -3,5 +3,5 @@ ManaCost:G Types:Creature Cat PT:2/1 T:Mode$ Attacks | ValidCard$ Creature.Self | Execute$ MtendaLionPump | TriggerDescription$ Whenever CARDNAME attacks, defending player may pay {U}. If that player does, prevent all combat damage that would be dealt by CARDNAME this turn. -SVar:MtendaLionPump:DB$ Pump | Defined$ Self | KW$ Prevent all combat damage that would be dealt by CARDNAME. | UnlessCost$ U | UnlessPayer$ DefendingPlayer | UnlessSwitched$ True +SVar:MtendaLionPump:DB$ Pump | Defined$ Self | KW$ Prevent all combat damage that would be dealt by CARDNAME. | UnlessCost$ U | UnlessPayer$ TriggeredDefendingPlayer | UnlessSwitched$ True Oracle:Whenever Mtenda Lion attacks, defending player may pay {U}. If that player does, prevent all combat damage that would be dealt by Mtenda Lion this turn. diff --git a/forge-gui/res/cardsfolder/m/murder_of_crows.txt b/forge-gui/res/cardsfolder/m/murder_of_crows.txt index 521d9a6ba29..c9dd20abef4 100644 --- a/forge-gui/res/cardsfolder/m/murder_of_crows.txt +++ b/forge-gui/res/cardsfolder/m/murder_of_crows.txt @@ -3,8 +3,7 @@ ManaCost:3 U U Types:Creature Bird PT:4/4 K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Other | TriggerZones$ Battlefield | Execute$ TrigLoot | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever another creature dies, you may draw a card. If you do, discard a card. -SVar:TrigLoot:DB$Draw | NumCards$ 1 | SubAbility$ DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Other | TriggerZones$ Battlefield | Execute$ TrigLoot | TriggerZones$ Battlefield | TriggerDescription$ Whenever another creature dies, you may draw a card. If you do, discard a card. +SVar:TrigLoot:AB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 | Cost$ Draw<1/You> SVar:Picture:http://www.wizards.com/global/images/magic/general/murder_of_crows.jpg Oracle:Flying\nWhenever another creature dies, you may draw a card. If you do, discard a card. diff --git a/forge-gui/res/cardsfolder/n/natures_wrath.txt b/forge-gui/res/cardsfolder/n/natures_wrath.txt index e7194672d6d..0d61edf2302 100644 --- a/forge-gui/res/cardsfolder/n/natures_wrath.txt +++ b/forge-gui/res/cardsfolder/n/natures_wrath.txt @@ -4,9 +4,8 @@ Types:Enchantment K:UpkeepCost:G T:Mode$ ChangesZone | ValidCard$ Island,Card.Blue | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigSacrificeBlue | TriggerDescription$ Whenever a player puts an Island or blue permanent onto the battlefield, that player sacrifices an Island or blue permanent. SVar:TrigSacrificeBlue:DB$ Sacrifice | Defined$ TriggeredCardController | SacValid$ Island,Card.Blue | SacMessage$ Island or a blue permanent -T:Mode$ ChangesZone | ValidCard$ Swamp,Card.Black | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigSacrificeBlack | TriggerDescription$ Whenever a player puts an Swamp or black permanent onto the battlefield, they sacrifice an Swamp or black permanent. +T:Mode$ ChangesZone | ValidCard$ Swamp,Card.Black | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigSacrificeBlack | TriggerDescription$ Whenever a player puts an Swamp or black permanent onto the battlefield, that player sacrifices a Swamp or black permanent. SVar:TrigSacrificeBlack:DB$ Sacrifice | Defined$ TriggeredCardController | SacValid$ Swamp,Card.Black | SacMessage$ Swamp or a black permanent SVar:NonStackingEffect:True AI:RemoveDeck:Random -SVar:Picture:http://www.wizards.com/global/images/magic/general/natures_wrath.jpg Oracle:At the beginning of your upkeep, sacrifice Nature's Wrath unless you pay {G}.\nWhenever a player puts an Island or blue permanent onto the battlefield, that player sacrifices an Island or blue permanent.\nWhenever a player puts a Swamp or black permanent onto the battlefield, that player sacrifices a Swamp or black permanent. diff --git a/forge-gui/res/cardsfolder/n/necrite.txt b/forge-gui/res/cardsfolder/n/necrite.txt index 864340ced86..e35d5005552 100644 --- a/forge-gui/res/cardsfolder/n/necrite.txt +++ b/forge-gui/res/cardsfolder/n/necrite.txt @@ -3,6 +3,6 @@ ManaCost:1 B B Types:Creature Thrull PT:2/2 T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, you may sacrifice it. If you do, destroy target creature defending player controls. It can't be regenerated. -SVar:TrigDestroy:AB$ Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.DefenderCtrl | NoRegen$ True | AITgts$ BetterThanSource | TgtPrompt$ Select target creature defending player controls +SVar:TrigDestroy:AB$ Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.ControlledBy TriggeredDefendingPlayer | NoRegen$ True | AITgts$ BetterThanSource | TgtPrompt$ Select target creature defending player controls SVar:Picture:http://www.wizards.com/global/images/magic/general/necrite.jpg Oracle:Whenever Necrite attacks and isn't blocked, you may sacrifice it. If you do, destroy target creature defending player controls. It can't be regenerated. diff --git a/forge-gui/res/cardsfolder/n/nefarox_overlord_of_grixis.txt b/forge-gui/res/cardsfolder/n/nefarox_overlord_of_grixis.txt index f788a16c628..bb0629e2a3c 100644 --- a/forge-gui/res/cardsfolder/n/nefarox_overlord_of_grixis.txt +++ b/forge-gui/res/cardsfolder/n/nefarox_overlord_of_grixis.txt @@ -5,7 +5,7 @@ PT:5/5 K:Flying K:Exalted T:Mode$ Attacks | ValidCard$ Card.Self | Alone$ True | Execute$ TrigSac | TriggerDescription$ Whenever CARDNAME attacks alone, defending player sacrifices a creature. -SVar:TrigSac:DB$ Sacrifice | Defined$ DefendingPlayer | SacValid$ Creature +SVar:TrigSac:DB$ Sacrifice | Defined$ TriggeredDefendingPlayer | SacValid$ Creature SVar:HasAttackEffect:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/nefarox_overlord_of_grixis.jpg Oracle:Flying\nExalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.)\nWhenever Nefarox, Overlord of Grixis attacks alone, defending player sacrifices a creature. diff --git a/forge-gui/res/cardsfolder/n/nemesis_of_reason.txt b/forge-gui/res/cardsfolder/n/nemesis_of_reason.txt index 9cb17a904e2..57f00b6610a 100644 --- a/forge-gui/res/cardsfolder/n/nemesis_of_reason.txt +++ b/forge-gui/res/cardsfolder/n/nemesis_of_reason.txt @@ -3,6 +3,6 @@ ManaCost:3 U B Types:Creature Leviathan Horror PT:3/7 T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigMill | TriggerDescription$ Whenever CARDNAME attacks, defending player mills ten cards. -SVar:TrigMill:DB$ Mill | Defined$ DefendingPlayer | NumCards$ 10 +SVar:TrigMill:DB$ Mill | Defined$ TriggeredDefendingPlayer | NumCards$ 10 SVar:HasAttackEffect:TRUE Oracle:Whenever Nemesis of Reason attacks, defending player mills ten cards. diff --git a/forge-gui/res/cardsfolder/o/o_kagachi_vengeful_kami.txt b/forge-gui/res/cardsfolder/o/o_kagachi_vengeful_kami.txt index b0d35e4a809..c5ed01bf033 100644 --- a/forge-gui/res/cardsfolder/o/o_kagachi_vengeful_kami.txt +++ b/forge-gui/res/cardsfolder/o/o_kagachi_vengeful_kami.txt @@ -5,6 +5,6 @@ PT:6/6 K:Flying K:Trample T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigExile | CombatDamage$ True | Condition$ AttackedPlayerWhoAttackedYouLastTurn | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, if that player attacked you during their last turn, exile target nonland permanent that player controls. -SVar:TrigExile:DB$ ChangeZone | ValidTgts$ Permanent.nonLand+DefenderCtrl | TgtPrompt$ Select target nonland permanent | Origin$ Battlefield | Destination$ Exile +SVar:TrigExile:DB$ ChangeZone | ValidTgts$ Permanent.nonLand+ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target nonland permanent | Origin$ Battlefield | Destination$ Exile SVar:Picture:http://www.wizards.com/global/images/magic/general/o-kagachi_vengeful_kami.jpg Oracle:Flying, trample\nWhenever O-Kagachi, Vengeful Kami deals combat damage to a player, if that player attacked you during their last turn, exile target nonland permanent that player controls. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/p/peregrination.txt b/forge-gui/res/cardsfolder/p/peregrination.txt index 5f0f626ccdf..90a44610adb 100644 --- a/forge-gui/res/cardsfolder/p/peregrination.txt +++ b/forge-gui/res/cardsfolder/p/peregrination.txt @@ -1,7 +1,7 @@ Name:Peregrination ManaCost:3 G Types:Sorcery -A:SP$ ChangeZone | Cost$ 2 G | Origin$ Library | Destination$ Library | ChangeType$ Land.Basic | ChangeNum$ 2 | RememberChanged$ True | Reveal$ True | Shuffle$ False | StackDescription$ SpellDescription | SubAbility$ DBChangeZone1 | SpellDescription$ Search your library for up to two basic land cards, reveal those cards, and put one onto the battlefield tapped and the other into your hand. Shuffle, then scry 1. (Look at the top card of your library. You may put that card on the bottom of your library.) +A:SP$ ChangeZone | Origin$ Library | Destination$ Library | ChangeType$ Land.Basic | ChangeNum$ 2 | RememberChanged$ True | Reveal$ True | Shuffle$ False | StackDescription$ SpellDescription | SubAbility$ DBChangeZone1 | SpellDescription$ Search your library for up to two basic land cards, reveal those cards, and put one onto the battlefield tapped and the other into your hand. Shuffle, then scry 1. (Look at the top card of your library. You may put that card on the bottom of your library.) SVar:DBChangeZone1:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.IsRemembered | ChangeNum$ 1 | Mandatory$ True | NoLooking$ True | SelectPrompt$ Select a card for the battlefield | Tapped$ True | Shuffle$ False | SubAbility$ DBChangeZone2 | StackDescription$ None SVar:DBChangeZone2:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Land.IsRemembered | Mandatory$ True | NoLooking$ True | SelectPrompt$ Select a card for your hand | StackDescription$ None | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBScry diff --git a/forge-gui/res/cardsfolder/p/pillaging_horde.txt b/forge-gui/res/cardsfolder/p/pillaging_horde.txt index 2e80cc30580..b049d02ebf1 100644 --- a/forge-gui/res/cardsfolder/p/pillaging_horde.txt +++ b/forge-gui/res/cardsfolder/p/pillaging_horde.txt @@ -2,10 +2,8 @@ Name:Pillaging Horde ManaCost:2 R R Types:Creature Human Barbarian PT:5/5 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, sacrifice it unless you discard a card at random. -SVar:TrigDiscard:DB$ Discard | NumCards$ 1 | Mode$ Random | Optional$ True | RememberDiscarded$ True | SubAbility$ DBSacrifice -SVar:DBSacrifice:DB$ Sacrifice | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME enters the battlefield, sacrifice it unless you discard a card at random. +SVar:TrigSac:DB$ Sacrifice | SacValid$ Self | UnlessCost$ Discard<1/Random> | UnlessPayer$ You SVar:X:Remembered$Amount SVar:NeedsToPlayVar:Y GE2 SVar:Y:Count$InYourHand diff --git a/forge-gui/res/cardsfolder/p/port_inspector.txt b/forge-gui/res/cardsfolder/p/port_inspector.txt index df4d2e1c236..f762a9a2be2 100644 --- a/forge-gui/res/cardsfolder/p/port_inspector.txt +++ b/forge-gui/res/cardsfolder/p/port_inspector.txt @@ -3,6 +3,6 @@ ManaCost:1 U Types:Creature Human PT:1/2 T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigPeek | TriggerDescription$ Whenever CARDNAME becomes blocked, you may look at defending player's hand. -SVar:TrigPeek:DB$RevealHand | Defined$ DefendingPlayer +SVar:TrigPeek:DB$ RevealHand | Defined$ TriggeredDefendingPlayer SVar:Picture:http://www.wizards.com/global/images/magic/general/port_inspector.jpg Oracle:Whenever Port Inspector becomes blocked, you may look at defending player's hand. diff --git a/forge-gui/res/cardsfolder/p/pretenders_claim.txt b/forge-gui/res/cardsfolder/p/pretenders_claim.txt index 31fb5334874..8e838e417ef 100644 --- a/forge-gui/res/cardsfolder/p/pretenders_claim.txt +++ b/forge-gui/res/cardsfolder/p/pretenders_claim.txt @@ -4,6 +4,6 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ 1 B | ValidTgts$ Creature | AILogic$ Pump T:Mode$ AttackerBlocked | ValidCard$ Card.AttachedBy | Execute$ TrigTapAll | TriggerDescription$ Whenever enchanted creature becomes blocked, tap all lands defending player controls. -SVar:TrigTapAll:DB$TapAll | ValidCards$ Land.DefenderCtrl +SVar:TrigTapAll:DB$ TapAll | ValidCards$ Land.ControlledBy TriggeredDefendingPlayer SVar:Picture:http://www.wizards.com/global/images/magic/general/pretenders_claim.jpg Oracle:Enchant creature\nWhenever enchanted creature becomes blocked, tap all lands defending player controls. diff --git a/forge-gui/res/cardsfolder/p/promise_of_bunrei.txt b/forge-gui/res/cardsfolder/p/promise_of_bunrei.txt index f3eadbd61bb..e24a4476751 100644 --- a/forge-gui/res/cardsfolder/p/promise_of_bunrei.txt +++ b/forge-gui/res/cardsfolder/p/promise_of_bunrei.txt @@ -2,7 +2,5 @@ Name:Promise of Bunrei ManaCost:2 W Types:Enchantment T:Mode$ ChangesZone | ValidCard$ Creature.YouCtrl | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigSac | TriggerZones$ Battlefield | TriggerDescription$ When a creature you control dies, sacrifice CARDNAME. If you do, create four 1/1 colorless Spirit creature tokens. -SVar:TrigSac:DB$ SacrificeAll | Defined$ Self | RememberSacrificed$ True | SubAbility$ DBToken -SVar:DBToken:DB$ Token | TokenAmount$ 4 | TokenScript$ c_1_1_spirit | TokenOwner$ You | LegacyImage$ c 1 1 spirit sok | ConditionDefined$ Remembered | ConditionPresent$ Card | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:TrigSac:AB$ Token | TokenAmount$ 4 | TokenScript$ c_1_1_spirit | TokenOwner$ You | LegacyImage$ c 1 1 spirit sok | Cost$ Sac<1/CARDNAME> | CostMandatory$ True Oracle:When a creature you control dies, sacrifice Promise of Bunrei. If you do, create four 1/1 colorless Spirit creature tokens. diff --git a/forge-gui/res/cardsfolder/r/reckless_racer.txt b/forge-gui/res/cardsfolder/r/reckless_racer.txt index 7c2c60c6cac..249df800f9e 100644 --- a/forge-gui/res/cardsfolder/r/reckless_racer.txt +++ b/forge-gui/res/cardsfolder/r/reckless_racer.txt @@ -4,8 +4,6 @@ Types:Creature Human Pilot PT:2/3 K:First Strike T:Mode$ Taps | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME becomes tapped, you may discard a card. If you do, draw a card. -SVar:TrigDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBDraw -SVar:DBDraw:DB$ Draw | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:TrigDiscard:AB$ Draw | NumCards$ 1 | Cost$ Discard<1/Card> SVar:Picture:http://www.wizards.com/global/images/magic/general/reckless_racer.jpg Oracle:First strike\nWhenever Reckless Racer becomes tapped, you may discard a card. If you do, draw a card. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/r/riddlesmith.txt b/forge-gui/res/cardsfolder/r/riddlesmith.txt index 8eb1a59c874..ee9ce54dadf 100644 --- a/forge-gui/res/cardsfolder/r/riddlesmith.txt +++ b/forge-gui/res/cardsfolder/r/riddlesmith.txt @@ -2,9 +2,8 @@ Name:Riddlesmith ManaCost:1 U Types:Creature Human Artificer PT:2/1 -T:Mode$ SpellCast | ValidCard$ Artifact | ValidActivatingPlayer$ You | Execute$ TrigLoot | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever you cast an artifact spell, you may draw a card. If you do, discard a card. -SVar:TrigLoot:DB$Draw | NumCards$ 1 | SubAbility$ DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 +T:Mode$ SpellCast | ValidCard$ Artifact | ValidActivatingPlayer$ You | Execute$ TrigLoot | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an artifact spell, you may draw a card. If you do, discard a card. +SVar:TrigLoot:AB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 | Cost$ Draw<1/You> AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/riddlesmith.jpg Oracle:Whenever you cast an artifact spell, you may draw a card. If you do, discard a card. diff --git a/forge-gui/res/cardsfolder/r/riptide_entrancer.txt b/forge-gui/res/cardsfolder/r/riptide_entrancer.txt index 771e949af5a..eed0ef6c14b 100644 --- a/forge-gui/res/cardsfolder/r/riptide_entrancer.txt +++ b/forge-gui/res/cardsfolder/r/riptide_entrancer.txt @@ -3,7 +3,7 @@ ManaCost:1 U U Types:Creature Human Wizard PT:1/1 T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigGainControl | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may sacrifice it. If you do, gain control of target creature that player controls. (This effect lasts indefinitely.) -SVar:TrigGainControl:AB$GainControl | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.DefenderCtrl | TgtPrompt$ Select target creature that player controls +SVar:TrigGainControl:AB$GainControl | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target creature that player controls K:Morph:U U SVar:Picture:http://www.wizards.com/global/images/magic/general/riptide_entrancer.jpg Oracle:Whenever Riptide Entrancer deals combat damage to a player, you may sacrifice it. If you do, gain control of target creature that player controls. (This effect lasts indefinitely.)\nMorph {U}{U} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) diff --git a/forge-gui/res/cardsfolder/r/rise_of_the_hobgoblins.txt b/forge-gui/res/cardsfolder/r/rise_of_the_hobgoblins.txt index 84eb235ab51..c64f50293b3 100644 --- a/forge-gui/res/cardsfolder/r/rise_of_the_hobgoblins.txt +++ b/forge-gui/res/cardsfolder/r/rise_of_the_hobgoblins.txt @@ -1,7 +1,7 @@ Name:Rise of the Hobgoblins ManaCost:RW RW Types:Enchantment -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may pay {X}. If you do, create X 1/1 red and white Goblin Soldier creature tokens. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, you may pay {X}. If you do, create X 1/1 red and white Goblin Soldier creature tokens. SVar:TrigToken:AB$ Token | Cost$ X | TokenAmount$ X | TokenScript$ rw_1_1_goblin_soldier | TokenOwner$ You | LegacyImage$ rw 1 1 goblin soldier eve SVar:X:Count$xPaid A:AB$ PumpAll | Cost$ RW | ValidCards$ Creature.Red+YouCtrl,Creature.White+YouCtrl | KW$ First Strike | SpellDescription$ Red creatures and white creatures you control gain first strike until end of turn. diff --git a/forge-gui/res/cardsfolder/r/robber_fly.txt b/forge-gui/res/cardsfolder/r/robber_fly.txt index 9a177e9c9cf..4c4de9a64b2 100644 --- a/forge-gui/res/cardsfolder/r/robber_fly.txt +++ b/forge-gui/res/cardsfolder/r/robber_fly.txt @@ -4,8 +4,8 @@ Types:Creature Insect PT:1/1 K:Flying T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME becomes blocked, defending player discards all the cards in their hand, then draws that many cards. -SVar:TrigDiscard:DB$ Discard | Defined$ DefendingPlayer | Mode$ Hand | RememberDiscarded$ True | SubAbility$ DBDraw -SVar:DBDraw:DB$ Draw | NumCards$ X | Defined$ DefendingPlayer | SubAbility$ DBCleanup +SVar:TrigDiscard:DB$ Discard | Defined$ TriggeredDefendingPlayer | Mode$ Hand | RememberDiscarded$ True | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw | NumCards$ X | Defined$ TriggeredDefendingPlayer | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount SVar:Picture:http://www.wizards.com/global/images/magic/general/robber_fly.jpg diff --git a/forge-gui/res/cardsfolder/r/ronin_cliffrider.txt b/forge-gui/res/cardsfolder/r/ronin_cliffrider.txt index 4a6477fe794..4ccc689506a 100644 --- a/forge-gui/res/cardsfolder/r/ronin_cliffrider.txt +++ b/forge-gui/res/cardsfolder/r/ronin_cliffrider.txt @@ -4,7 +4,7 @@ Types:Creature Human Samurai PT:2/2 K:Bushido:1 T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDamage | OptionalDecider$ You| TriggerDescription$ Whenever CARDNAME attacks, you may have it deal 1 damage to each creature defending player controls. -SVar:TrigDamage:DB$DamageAll | ValidCards$ Creature.DefenderCtrl | NumDmg$ 1| ValidDescription$ each creature defending player controls. +SVar:TrigDamage:DB$DamageAll | ValidCards$ Creature.ControlledBy TriggeredDefendingPlayer | NumDmg$ 1| ValidDescription$ each creature defending player controls. SVar:HasAttackEffect:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/ronin_cliffrider.jpg Oracle:Bushido 1 (Whenever this creature blocks or becomes blocked, it gets +1/+1 until end of turn.)\nWhenever Ronin Cliffrider attacks, you may have it deal 1 damage to each creature defending player controls. diff --git a/forge-gui/res/cardsfolder/r/roots_of_wisdom.txt b/forge-gui/res/cardsfolder/r/roots_of_wisdom.txt index a37e6c85319..0db7058125c 100644 --- a/forge-gui/res/cardsfolder/r/roots_of_wisdom.txt +++ b/forge-gui/res/cardsfolder/r/roots_of_wisdom.txt @@ -1,7 +1,7 @@ Name:Roots of Wisdom ManaCost:1 G Types:Sorcery -A:SP$ Mill | Cost$ 1 G | NumCards$ 3 | Defined$ You | SubAbility$ DBChangeZone | SpellDescription$ Mill three cards, then return a land card or Elf card from your graveyard to your hand. If you can't draw a card. +A:SP$ Mill | Cost$ 1 G | NumCards$ 3 | Defined$ You | SubAbility$ DBChangeZone | SpellDescription$ Mill three cards, then return a land card or Elf card from your graveyard to your hand. If you can't, draw a card. SVar:DBChangeZone:DB$ ChangeZone | Hidden$ True | Mandatory$ True | ChangeType$ Elf.YouOwn,Land.YouOwn | ChangeNum$ 1 | Origin$ Graveyard | Destination$ Hand | RememberChanged$ True | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 | ConditionCheckSVar$ X | ConditionSVarCompare$ LT1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True diff --git a/forge-gui/res/cardsfolder/r/rust_scarab.txt b/forge-gui/res/cardsfolder/r/rust_scarab.txt index 384314f2c61..f3f16600034 100644 --- a/forge-gui/res/cardsfolder/r/rust_scarab.txt +++ b/forge-gui/res/cardsfolder/r/rust_scarab.txt @@ -3,7 +3,7 @@ ManaCost:4 G Types:Creature Insect PT:4/5 T:Mode$ AttackerBlocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME becomes blocked, you may destroy target artifact or enchantment defending player controls. -SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Artifact.DefenderCtrl,Enchantment.DefenderCtrl | TgtPrompt$ Select target artifact or enchantment defending player control +SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Artifact.ControlledBy TriggeredDefendingPlayer,Enchantment.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target artifact or enchantment defending player control SVar:HasAttackEffect:Blocked SVar:Picture:http://www.wizards.com/global/images/magic/general/rust_scarab.jpg Oracle:Whenever Rust Scarab becomes blocked, you may destroy target artifact or enchantment defending player controls. diff --git a/forge-gui/res/cardsfolder/r/rustmouth_ogre.txt b/forge-gui/res/cardsfolder/r/rustmouth_ogre.txt index d33722e223e..79f69e27191 100644 --- a/forge-gui/res/cardsfolder/r/rustmouth_ogre.txt +++ b/forge-gui/res/cardsfolder/r/rustmouth_ogre.txt @@ -3,6 +3,6 @@ ManaCost:4 R R Types:Creature Ogre PT:5/4 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/rustmouth_ogre.jpg Oracle:Whenever Rustmouth Ogre deals combat damage to a player, you may destroy target artifact that player controls. diff --git a/forge-gui/res/cardsfolder/s/sage_of_the_falls.txt b/forge-gui/res/cardsfolder/s/sage_of_the_falls.txt index 24c4cf4ef12..f27a147b5f8 100644 --- a/forge-gui/res/cardsfolder/s/sage_of_the_falls.txt +++ b/forge-gui/res/cardsfolder/s/sage_of_the_falls.txt @@ -4,6 +4,5 @@ Types:Creature Merfolk Wizard PT:2/5 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigLoot | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME or another non-Human creature enters the battlefield under your control, you may draw a card. If you do, discard a card. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonHuman+Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigLoot | OptionalDecider$ You | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another non-Human creature enters the battlefield under your control, you may draw a card. If you do, discard a card. -SVar:TrigLoot:DB$ Draw | NumCards$ 1 | SubAbility$ DBDiscard -SVar:DBDiscard:DB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 +SVar:TrigLoot:AB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 | Cost$ Draw<1/You> Oracle:Whenever Sage of the Falls or another non-Human creature enters the battlefield under your control, you may draw a card. If you do, discard a card. diff --git a/forge-gui/res/cardsfolder/s/salvage_drone.txt b/forge-gui/res/cardsfolder/s/salvage_drone.txt index ec8a9d9bbc9..b99ddd5fc98 100644 --- a/forge-gui/res/cardsfolder/s/salvage_drone.txt +++ b/forge-gui/res/cardsfolder/s/salvage_drone.txt @@ -4,9 +4,8 @@ Types:Creature Eldrazi Drone PT:1/1 K:Devoid K:Ingest -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigLoot | OptionalDecider$ You | TriggerDescription$ When CARDNAME dies, you may draw a card. If you do, discard a card. -SVar:TrigLoot:DB$Draw | NumCards$ 1 | SubAbility$ DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigLoot | TriggerDescription$ When CARDNAME dies, you may draw a card. If you do, discard a card. +SVar:TrigLoot:AB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 | Cost$ Draw<1/You> DeckHints:Type$Processor SVar:Picture:http://www.wizards.com/global/images/magic/general/salvage_drone.jpg Oracle:Devoid (This card has no color.)\nIngest (Whenever this creature deals combat damage to a player, that player exiles the top card of their library.)\nWhen Salvage Drone dies, you may draw a card. If you do, discard a card. diff --git a/forge-gui/res/cardsfolder/s/scalding_salamander.txt b/forge-gui/res/cardsfolder/s/scalding_salamander.txt index 352bd59fa3f..d2ff089238c 100644 --- a/forge-gui/res/cardsfolder/s/scalding_salamander.txt +++ b/forge-gui/res/cardsfolder/s/scalding_salamander.txt @@ -3,7 +3,7 @@ ManaCost:2 R Types:Creature Salamander PT:2/1 T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDamage | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME attacks, you may have it deal 1 damage to each creature without flying defending player controls. -SVar:TrigDamage:DB$DamageAll | NumDmg$ 1 | ValidCards$ Creature.withoutFlying+DefenderCtrl +SVar:TrigDamage:DB$DamageAll | NumDmg$ 1 | ValidCards$ Creature.withoutFlying+ControlledBy TriggeredDefendingPlayer SVar:HasAttackEffect:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/scalding_salamander.jpg Oracle:Whenever Scalding Salamander attacks, you may have it deal 1 damage to each creature without flying defending player controls. diff --git a/forge-gui/res/cardsfolder/s/shipwreck_looter.txt b/forge-gui/res/cardsfolder/s/shipwreck_looter.txt index 3c1988ab0bc..10838966237 100644 --- a/forge-gui/res/cardsfolder/s/shipwreck_looter.txt +++ b/forge-gui/res/cardsfolder/s/shipwreck_looter.txt @@ -2,8 +2,7 @@ Name:Shipwreck Looter ManaCost:1 U Types:Creature Human Pirate PT:2/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | CheckSVar$ RaidTest | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ Raid — When CARDNAME enters the battlefield, if you attacked this turn, you may draw a card. If you do, discard a card. -SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 | SubAbility$ DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | CheckSVar$ RaidTest | Execute$ TrigDraw | TriggerDescription$ Raid — When CARDNAME enters the battlefield, if you attacked this turn, you may draw a card. If you do, discard a card. +SVar:TrigDraw:AB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | Cost$ Draw<1/You> SVar:RaidTest:Count$AttackersDeclared Oracle:Raid — When Shipwreck Looter enters the battlefield, if you attacked this turn, you may draw a card. If you do, discard a card. diff --git a/forge-gui/res/cardsfolder/s/shoal_kraken.txt b/forge-gui/res/cardsfolder/s/shoal_kraken.txt index a59d513e294..af8a01e449a 100755 --- a/forge-gui/res/cardsfolder/s/shoal_kraken.txt +++ b/forge-gui/res/cardsfolder/s/shoal_kraken.txt @@ -2,8 +2,7 @@ Name:Shoal Kraken ManaCost:4 U Types:Creature Kraken PT:3/5 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Constellation - Whenever an enchantment enters the battlefield under your control, you may a draw card. If you do, discard a card. -SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SubAbility$ DBDiscard -SVar:DBDiscard:DB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Constellation - Whenever an enchantment enters the battlefield under your control, you may a draw card. If you do, discard a card. +SVar:TrigDraw:AB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 | Cost$ Draw<1/You> DeckNeeds:Type$Enchantment Oracle:Constellation — Whenever an enchantment enters the battlefield under your control, you may draw a card. If you do, discard a card. diff --git a/forge-gui/res/cardsfolder/s/shockmaw_dragon.txt b/forge-gui/res/cardsfolder/s/shockmaw_dragon.txt index 794ed9682be..d1905954d68 100644 --- a/forge-gui/res/cardsfolder/s/shockmaw_dragon.txt +++ b/forge-gui/res/cardsfolder/s/shockmaw_dragon.txt @@ -4,6 +4,6 @@ Types:Creature Dragon PT:4/4 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 1 damage to each creature that player controls. -SVar:TrigDamage:DB$ DamageAll | NumDmg$ 1 | ValidCards$ Creature.DefenderCtrl +SVar:TrigDamage:DB$ DamageAll | NumDmg$ 1 | ValidCards$ Creature.ControlledBy TriggeredDefendingPlayer SVar:Picture:http://www.wizards.com/global/images/magic/general/shockmaw_dragon.jpg Oracle:Flying\nWhenever Shockmaw Dragon deals combat damage to a player, it deals 1 damage to each creature that player controls. diff --git a/forge-gui/res/cardsfolder/s/shrieking_specter.txt b/forge-gui/res/cardsfolder/s/shrieking_specter.txt index f0f56489460..dec7ff75b20 100644 --- a/forge-gui/res/cardsfolder/s/shrieking_specter.txt +++ b/forge-gui/res/cardsfolder/s/shrieking_specter.txt @@ -4,7 +4,7 @@ Types:Creature Specter PT:2/2 K:Flying T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME attacks, 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:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/shrieking_specter.jpg Oracle:Flying\nWhenever Shrieking Specter attacks, defending player discards a card. diff --git a/forge-gui/res/cardsfolder/s/shrouded_serpent.txt b/forge-gui/res/cardsfolder/s/shrouded_serpent.txt index 4ccbf798dc0..c113084181b 100644 --- a/forge-gui/res/cardsfolder/s/shrouded_serpent.txt +++ b/forge-gui/res/cardsfolder/s/shrouded_serpent.txt @@ -3,6 +3,6 @@ ManaCost:4 U U U Types:Creature Serpent PT:4/4 T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, defending player may pay {4}. If that player doesn't, CARDNAME can't be blocked this turn. -SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ HIDDEN Unblockable | UnlessCost$ 4 | UnlessPayer$ DefendingPlayer +SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ HIDDEN Unblockable | UnlessCost$ 4 | UnlessPayer$ TriggeredDefendingPlayer SVar:Picture:http://www.wizards.com/global/images/magic/general/shrouded_serpent.jpg Oracle:Whenever Shrouded Serpent attacks, defending player may pay {4}. If that player doesn't, Shrouded Serpent can't be blocked this turn. diff --git a/forge-gui/res/cardsfolder/s/sibilant_spirit.txt b/forge-gui/res/cardsfolder/s/sibilant_spirit.txt index 159ba733a36..0d80ad687a8 100644 --- a/forge-gui/res/cardsfolder/s/sibilant_spirit.txt +++ b/forge-gui/res/cardsfolder/s/sibilant_spirit.txt @@ -4,6 +4,6 @@ Types:Creature Spirit PT:5/6 K:Flying T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDraw | OptionalDecider$ Opponent | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME attacks, defending player may draw a card. -SVar:TrigDraw:DB$ Draw | Defined$ DefendingPlayer | NumCards$ 1 +SVar:TrigDraw:DB$ Draw | Defined$ TriggeredDefendingPlayer | NumCards$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/sibilant_spirit.jpg Oracle:Flying\nWhenever Sibilant Spirit attacks, defending player may draw a card. diff --git a/forge-gui/res/cardsfolder/s/sidar_jabari.txt b/forge-gui/res/cardsfolder/s/sidar_jabari.txt index 032e78a1e6a..c353f58028d 100644 --- a/forge-gui/res/cardsfolder/s/sidar_jabari.txt +++ b/forge-gui/res/cardsfolder/s/sidar_jabari.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Human Knight PT:2/2 K:Flanking 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:Picture:http://www.wizards.com/global/images/magic/general/sidar_jabari.jpg Oracle:Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.)\nWhenever Sidar Jabari attacks, tap target creature defending player controls. diff --git a/forge-gui/res/cardsfolder/s/silumgar_the_drifting_death.txt b/forge-gui/res/cardsfolder/s/silumgar_the_drifting_death.txt index 928faed1e54..093128c7eb6 100644 --- a/forge-gui/res/cardsfolder/s/silumgar_the_drifting_death.txt +++ b/forge-gui/res/cardsfolder/s/silumgar_the_drifting_death.txt @@ -5,7 +5,7 @@ PT:3/7 K:Flying K:Hexproof T:Mode$ Attacks | ValidCard$ Dragon.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigMassacre | TriggerDescription$ Whenever a Dragon you control attacks, creatures defending player control each get -1/-1 until end of turn. -SVar:TrigMassacre:DB$ PumpAll | NumAtt$ -1 | NumDef$ -1 | ValidCards$ TriggeredAttacker.Creature+DefenderCtrl | IsCurse$ True +SVar:TrigMassacre:DB$ PumpAll | NumAtt$ -1 | NumDef$ -1 | ValidCards$ TriggeredAttacker.Creature+ControlledBy TriggeredDefendingPlayer | IsCurse$ True SVar:BuffedBy:Dragon DeckHints:Type$Dragon SVar:Picture:http://www.wizards.com/global/images/magic/general/silumgar_the_drifting_death.jpg diff --git a/forge-gui/res/cardsfolder/s/skeleton_key.txt b/forge-gui/res/cardsfolder/s/skeleton_key.txt index bd6aae3714f..2a8f7a6cd1f 100644 --- a/forge-gui/res/cardsfolder/s/skeleton_key.txt +++ b/forge-gui/res/cardsfolder/s/skeleton_key.txt @@ -2,9 +2,8 @@ Name:Skeleton Key ManaCost:1 Types:Artifact Equipment S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddKeyword$ Skulk | Description$ Equipped creature has skulk. (It can't be blocked by creatures with greater power.) -T:Mode$ DamageDone | ValidSource$ Creature.EquippedBy | ValidTarget$ Player | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever equipped creature deals combat damage to a player, you may draw a card. If you do, discard a card. -SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SubAbility$ DBDiscard -SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose +T:Mode$ DamageDone | ValidSource$ Creature.EquippedBy | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever equipped creature deals combat damage to a player, you may draw a card. If you do, discard a card. +SVar:TrigDraw:AB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | Cost$ Draw<1/You> K:Equip:2 DeckHas:Ability$Discard DeckHints:Keyword$Madness & Ability$Delirium diff --git a/forge-gui/res/cardsfolder/s/skirk_commando.txt b/forge-gui/res/cardsfolder/s/skirk_commando.txt index a33ea651d41..86bd786c06a 100644 --- a/forge-gui/res/cardsfolder/s/skirk_commando.txt +++ b/forge-gui/res/cardsfolder/s/skirk_commando.txt @@ -4,6 +4,6 @@ Types:Creature Goblin PT:2/1 K:Morph:2 R T:Mode$ DamageDone | ValidSource$ Card.Self+faceUp | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDamage | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may have it deal 2 damage to target creature that player controls. -SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature.DefenderCtrl | TgtPrompt$ Select target creature controlled by opponent | NumDmg$ 2 +SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target creature controlled by opponent | NumDmg$ 2 SVar:Picture:http://www.wizards.com/global/images/magic/general/skirk_commando.jpg Oracle:Whenever Skirk Commando deals combat damage to a player, you may have it deal 2 damage to target creature that player controls.\nMorph {2}{R} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) diff --git a/forge-gui/res/cardsfolder/s/skymark_roc.txt b/forge-gui/res/cardsfolder/s/skymark_roc.txt index 67e17b82b24..ff10f499c66 100644 --- a/forge-gui/res/cardsfolder/s/skymark_roc.txt +++ b/forge-gui/res/cardsfolder/s/skymark_roc.txt @@ -4,6 +4,6 @@ Types:Creature Bird PT:3/3 K:Flying T:Mode$ Attacks | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigBounce | TriggerDescription$ Whenever CARDNAME attacks, you may return target creature defending player controls with toughness 2 or less to its owner's hand. -SVar:TrigBounce:DB$ ChangeZone | ValidTgts$ Creature.DefenderCtrl+toughnessLE2 | TgtPrompt$ Choose creature defending player controls with toughness 2 or less | Origin$ Battlefield | Destination$ Hand +SVar:TrigBounce:DB$ ChangeZone | ValidTgts$ Creature.toughnessLE2+ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Choose creature defending player controls with toughness 2 or less | Origin$ Battlefield | Destination$ Hand SVar:Picture:http://www.wizards.com/global/images/magic/general/skymark_roc.jpg Oracle:Flying\nWhenever Skymark Roc attacks, you may return target creature defending player controls with toughness 2 or less to its owner's hand. diff --git a/forge-gui/res/cardsfolder/s/slate_street_ruffian.txt b/forge-gui/res/cardsfolder/s/slate_street_ruffian.txt index 27ead4624fc..37ded5cccaa 100644 --- a/forge-gui/res/cardsfolder/s/slate_street_ruffian.txt +++ b/forge-gui/res/cardsfolder/s/slate_street_ruffian.txt @@ -3,7 +3,7 @@ ManaCost:2 B Types:Creature Human Warrior PT:2/2 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:Picture:http://www.wizards.com/global/images/magic/general/slate_street_ruffian.jpg Oracle:Whenever Slate Street Ruffian becomes blocked, defending player discards a card. diff --git a/forge-gui/res/cardsfolder/s/smugglers_copter.txt b/forge-gui/res/cardsfolder/s/smugglers_copter.txt index 054727674af..a265b0b511b 100644 --- a/forge-gui/res/cardsfolder/s/smugglers_copter.txt +++ b/forge-gui/res/cardsfolder/s/smugglers_copter.txt @@ -3,10 +3,9 @@ ManaCost:2 Types:Artifact Vehicle PT:3/3 K:Flying -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigLoot | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME attacks or blocks, you may draw a card. If you do, discard a card. -T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigLoot | OptionalDecider$ You | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, you may draw a card. If you do, discard a card. -SVar:TrigLoot:DB$ Draw | NumCards$ 1 | SubAbility$ DBDiscard -SVar:DBDiscard:DB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigLoot | TriggerDescription$ Whenever CARDNAME attacks or blocks, you may draw a card. If you do, discard a card. +T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigLoot | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, you may draw a card. If you do, discard a card. +SVar:TrigLoot:AB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 | Cost$ Draw<1/You> K:Crew:1 SVar:Picture:http://www.wizards.com/global/images/magic/general/smugglers_copter.jpg Oracle:Flying\nWhenever Smuggler's Copter attacks or blocks, you may draw a card. If you do, discard a card.\nCrew 1 (Tap any number of creatures you control with total power 1 or more: This Vehicle becomes an artifact creature until end of turn.) diff --git a/forge-gui/res/cardsfolder/s/snapping_thragg.txt b/forge-gui/res/cardsfolder/s/snapping_thragg.txt index 797748b6ca4..9d119e010b2 100644 --- a/forge-gui/res/cardsfolder/s/snapping_thragg.txt +++ b/forge-gui/res/cardsfolder/s/snapping_thragg.txt @@ -4,6 +4,6 @@ Types:Creature Beast PT:3/3 K:Morph:4 R R T:Mode$ DamageDone | ValidSource$ Card.Self+faceUp | ValidTarget$ Player | Execute$ TrigDamage | TriggerZones$ Battlefield | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may have it deal 3 damage to target creature that player controls. -SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature.DefenderCtrl | TgtPrompt$ Select target creature defending player controls | NumDmg$ 3 +SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target creature defending player controls | NumDmg$ 3 SVar:Picture:http://www.wizards.com/global/images/magic/general/snapping_thragg.jpg Oracle:Whenever Snapping Thragg deals combat damage to a player, you may have it deal 3 damage to target creature that player controls.\nMorph {4}{R}{R} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) diff --git a/forge-gui/res/cardsfolder/s/soul_seizer_ghastly_haunting.txt b/forge-gui/res/cardsfolder/s/soul_seizer_ghastly_haunting.txt index 26b0fb3f09c..d7b8ebe6cb1 100644 --- a/forge-gui/res/cardsfolder/s/soul_seizer_ghastly_haunting.txt +++ b/forge-gui/res/cardsfolder/s/soul_seizer_ghastly_haunting.txt @@ -5,7 +5,7 @@ PT:1/3 K:Flying T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigTransform | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may transform it. If you do, attach it to target creature that player controls. SVar:TrigTransform:DB$ SetState | Defined$ Self | Mode$ Transform | SubAbility$ DBAttach -SVar:DBAttach:DB$ Attach | ValidTgts$ Creature.DefenderCtrl | TgtPrompt$ Select target creature that damaged player controls | AILogic$ GainControl +SVar:DBAttach:DB$ Attach | ValidTgts$ Creature.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target creature that damaged player controls | AILogic$ GainControl SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_seizer.jpg AlternateMode:DoubleFaced Oracle:Flying\nWhen Soul Seizer deals combat damage to a player, you may transform it. If you do, attach it to target creature that player controls. diff --git a/forge-gui/res/cardsfolder/s/spark_mage.txt b/forge-gui/res/cardsfolder/s/spark_mage.txt index 7169d3176ce..bdb5a09f5eb 100644 --- a/forge-gui/res/cardsfolder/s/spark_mage.txt +++ b/forge-gui/res/cardsfolder/s/spark_mage.txt @@ -3,6 +3,6 @@ ManaCost:R Types:Creature Dwarf Wizard PT:1/1 T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigDamage | CombatDamage$ True | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may have CARDNAME deal 1 damage to target creature that player controls. -SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature.DefenderCtrl | TgtPrompt$ Select target creature | NumDmg$ 1 | OptionalDecider$ You +SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target creature | NumDmg$ 1 | OptionalDecider$ You SVar:Picture:http://www.wizards.com/global/images/magic/general/spark_mage.jpg Oracle:Whenever Spark Mage deals combat damage to a player, you may have Spark Mage deal 1 damage to target creature that player controls. diff --git a/forge-gui/res/cardsfolder/s/sphinx_ambassador.txt b/forge-gui/res/cardsfolder/s/sphinx_ambassador.txt index 599ee0049a0..46e79763006 100644 --- a/forge-gui/res/cardsfolder/s/sphinx_ambassador.txt +++ b/forge-gui/res/cardsfolder/s/sphinx_ambassador.txt @@ -4,10 +4,10 @@ Types:Creature Sphinx PT:5/5 K:Flying T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigSearch | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, search that player's library for a card, then that player chooses a card name. If you searched for a creature card that doesn't have that name, you may put it onto the battlefield under your control. Then that player shuffles. -SVar:TrigSearch:DB$ ChangeZone | ChangeType$ Card | Origin$ Library | Destination$ Library | DefinedPlayer$ DefendingPlayer | Chooser$ You | Shuffle$ False | RememberChanged$ True | SubAbility$ DBName -SVar:DBName:DB$ NameCard | Defined$ DefendingPlayer | SubAbility$ DBChangeZone | AILogic$ BestCreatureInComputerDeck +SVar:TrigSearch:DB$ ChangeZone | ChangeType$ Card | Origin$ Library | Destination$ Library | DefinedPlayer$ TriggeredDefendingPlayer | Chooser$ You | Shuffle$ False | RememberChanged$ True | SubAbility$ DBName +SVar:DBName:DB$ NameCard | Defined$ TriggeredDefendingPlayer | SubAbility$ DBChangeZone | AILogic$ BestCreatureInComputerDeck SVar:DBChangeZone:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Battlefield | GainControl$ True | ConditionDefined$ Remembered | Shuffle$ False | ConditionPresent$ Card.NamedCard | ConditionCompare$ EQ0 | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | Optional$ True | OptionalDecider$ You | SubAbility$ DBShuffle -SVar:DBShuffle:DB$ Shuffle | Defined$ DefendingPlayer | SubAbility$ DBCleanup +SVar:DBShuffle:DB$ Shuffle | Defined$ TriggeredDefendingPlayer | SubAbility$ DBCleanup SVar:X:Count$ValidLibrary Creature.IsRemembered SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/sphinx_ambassador.jpg diff --git a/forge-gui/res/cardsfolder/s/standstill.txt b/forge-gui/res/cardsfolder/s/standstill.txt index 3f466236530..03197655541 100644 --- a/forge-gui/res/cardsfolder/s/standstill.txt +++ b/forge-gui/res/cardsfolder/s/standstill.txt @@ -2,9 +2,7 @@ Name:Standstill ManaCost:1 U Types:Enchantment T:Mode$ SpellCast | ValidActivatingPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ When a player casts a spell, sacrifice CARDNAME. If you do, each of that player's opponents draws three cards. -SVar:TrigSac:DB$ Sacrifice | SacValid$ Self | RememberSacrificed$ True | SubAbility$ DrawOpp -SVar:DrawOpp:DB$ Draw | NumCards$ 3 | Defined$ TriggeredCardOpponent | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:TrigSac:AB$ Draw | NumCards$ 3 | Cost$ Mandatory Sac<1/CARDNAME> | Defined$ TriggeredCardOpponent SVar:X:Remembered$Amount SVar:Y:Count$Valid Creature.YouCtrl SVar:Z:Count$Valid Creature.OppCtrl diff --git a/forge-gui/res/cardsfolder/s/star_crowned_stag.txt b/forge-gui/res/cardsfolder/s/star_crowned_stag.txt index e343644108b..1ab0459f422 100644 --- a/forge-gui/res/cardsfolder/s/star_crowned_stag.txt +++ b/forge-gui/res/cardsfolder/s/star_crowned_stag.txt @@ -2,6 +2,6 @@ Name:Star-Crowned Stag ManaCost:3 W Types:Creature Elk T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigTap | 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. Oracle:Whenever Star-Crowned Stag attacks, tap target creature defending player controls. PT:3/3 diff --git a/forge-gui/res/cardsfolder/s/sunder_shaman.txt b/forge-gui/res/cardsfolder/s/sunder_shaman.txt index 955f4d7deeb..0c16a979a37 100644 --- a/forge-gui/res/cardsfolder/s/sunder_shaman.txt +++ b/forge-gui/res/cardsfolder/s/sunder_shaman.txt @@ -4,5 +4,5 @@ Types:Creature Giant Shaman PT:5/5 K:CantBeBlockedByAmount GT1 T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDestroy | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, destroy target artifact or enchantment that player controls. -SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Artifact.DefenderCtrl,Enchantment.DefenderCtrl | TgtPrompt$ Select target artifact or enchantment that player controls. +SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Artifact.ControlledBy TriggeredDefendingPlayer,Enchantment.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target artifact or enchantment that player controls. Oracle:Sunder Shaman can't be blocked by more than one creature.\nWhenever Sunder Shaman deals combat damage to a player, destroy target artifact or enchantment that player controls. diff --git a/forge-gui/res/cardsfolder/s/suqata_assassin.txt b/forge-gui/res/cardsfolder/s/suqata_assassin.txt index ac83d809cbd..76978802d43 100644 --- a/forge-gui/res/cardsfolder/s/suqata_assassin.txt +++ b/forge-gui/res/cardsfolder/s/suqata_assassin.txt @@ -4,6 +4,6 @@ Types:Creature Human Assassin PT:1/1 K:Fear 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/suqata_assassin.jpg Oracle:Fear (This creature can't be blocked except by artifact creatures and/or black creatures.)\nWhenever Suq'Ata Assassin attacks and isn't blocked, defending player gets a poison counter. (A player with ten or more poison counters loses the game.) diff --git a/forge-gui/res/cardsfolder/s/surge_mare.txt b/forge-gui/res/cardsfolder/s/surge_mare.txt index aa992d1aba4..88fd5ce255e 100644 --- a/forge-gui/res/cardsfolder/s/surge_mare.txt +++ b/forge-gui/res/cardsfolder/s/surge_mare.txt @@ -3,9 +3,8 @@ ManaCost:U U Types:Creature Horse Fish PT:0/5 S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.Green | Description$ CARDNAME can't be blocked by green creatures. -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME deals damage to an opponent, you may draw a card. If you do, discard a card. -SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SubAbility$ DBDiscard -SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME deals damage to an opponent, you may draw a card. If you do, discard a card. +SVar:TrigDraw:AB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | Cost$ Draw<1/You> A:AB$ Pump | Cost$ 1 U | ValidCard$ Card.Self | NumAtt$ +2 | NumDef$ -2 | SpellDescription$ CARDNAME gets +2/-2 until end of turn. DeckHas:Ability$Discard Oracle:Surge Mare can't be blocked by green creatures.\nWhenever Surge Mare deals damage to an opponent, you may draw a card. If you do, discard a card.\n{1}{U}: Surge Mare gets +2/-2 until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/swamp_mosquito.txt b/forge-gui/res/cardsfolder/s/swamp_mosquito.txt index 764b9b118df..1a3874548c2 100644 --- a/forge-gui/res/cardsfolder/s/swamp_mosquito.txt +++ b/forge-gui/res/cardsfolder/s/swamp_mosquito.txt @@ -4,6 +4,6 @@ Types:Creature Insect PT:0/1 K:Flying 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/swamp_mosquito.jpg Oracle:Flying\nWhenever Swamp Mosquito attacks and isn't blocked, defending player gets a poison counter. (A player with ten or more poison counters loses the game.) diff --git a/forge-gui/res/cardsfolder/s/swathcutter_giant.txt b/forge-gui/res/cardsfolder/s/swathcutter_giant.txt index 977d030b6fb..219a10f1bcf 100644 --- a/forge-gui/res/cardsfolder/s/swathcutter_giant.txt +++ b/forge-gui/res/cardsfolder/s/swathcutter_giant.txt @@ -4,6 +4,6 @@ Types:Creature Giant Soldier PT:5/5 K:Vigilance T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, it deals 1 damage to each creature defending player controls. -SVar:TrigDamage:DB$DamageAll | ValidCards$ Creature.DefenderCtrl | NumDmg$ 1 | ValidDescription$ each creature defending player controls. +SVar:TrigDamage:DB$DamageAll | ValidCards$ Creature.ControlledBy TriggeredDefendingPlayer | NumDmg$ 1 | ValidDescription$ each creature defending player controls. SVar:HasAttackEffect:TRUE Oracle:Vigilance\nWhenever Swathcutter Giant attacks, it deals 1 damage to each creature defending player controls. diff --git a/forge-gui/res/cardsfolder/t/terra_ravager.txt b/forge-gui/res/cardsfolder/t/terra_ravager.txt index 77c7a1dca0d..a10fef83ccc 100644 --- a/forge-gui/res/cardsfolder/t/terra_ravager.txt +++ b/forge-gui/res/cardsfolder/t/terra_ravager.txt @@ -4,6 +4,6 @@ Types:Creature Elemental Beast PT:0/4 T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +X/+0 until end of turn, where X is the number of lands defending player controls. SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ X -SVar:X:Count$Valid Land.DefenderCtrl +SVar:X:Count$Valid Land.ControlledBy TriggeredDefendingPlayer SVar:Picture:http://www.wizards.com/global/images/magic/general/terra_ravager.jpg Oracle:Whenever Terra Ravager attacks, it gets +X/+0 until end of turn, where X is the number of lands defending player controls. diff --git a/forge-gui/res/cardsfolder/t/the_haunt_of_hightower.txt b/forge-gui/res/cardsfolder/t/the_haunt_of_hightower.txt index e05e9dca861..c9a2ad1f50d 100644 --- a/forge-gui/res/cardsfolder/t/the_haunt_of_hightower.txt +++ b/forge-gui/res/cardsfolder/t/the_haunt_of_hightower.txt @@ -5,7 +5,7 @@ PT:3/3 K:Flying K:Lifelink T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME attacks, 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:TRUE T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Card.nonToken+OppOwn | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a card is put into an opponent's graveyard from anywhere, put a +1/+1 counter on CARDNAME. SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 diff --git a/forge-gui/res/cardsfolder/t/thrasta_tempests_roar.txt b/forge-gui/res/cardsfolder/t/thrasta_tempests_roar.txt index f50c47ab5d5..a26c4d27af0 100644 --- a/forge-gui/res/cardsfolder/t/thrasta_tempests_roar.txt +++ b/forge-gui/res/cardsfolder/t/thrasta_tempests_roar.txt @@ -6,6 +6,6 @@ S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone SVar:X:Count$ThisTurnCast_Card.Other/Times.3 K:Trample K:Haste -K:Trample over planeswalkers +K:Trample:Planeswalker S:Mode$ Continuous | Affected$ Card.Self+ThisTurnEntered | AddKeyword$ Hexproof | Description$ CARDNAME has hexproof as long as it entered the battlefield this turn. Oracle:This spell costs {3} less to cast for each other spell cast this turn.\nTrample, haste\nTrample over planeswalkers (This creature can deal excess combat damage to the controller of the planeswalker it's attacking.)\nThrasta, Tempest's Roar has hexproof as long as it entered the battlefield this turn. diff --git a/forge-gui/res/cardsfolder/t/thraximundar.txt b/forge-gui/res/cardsfolder/t/thraximundar.txt index 6ce42d94781..013dda67f33 100644 --- a/forge-gui/res/cardsfolder/t/thraximundar.txt +++ b/forge-gui/res/cardsfolder/t/thraximundar.txt @@ -5,7 +5,7 @@ PT:6/6 K:Haste T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ Whenever Thraximundar attacks, defending player sacrifices a creature. T:Mode$ Sacrificed | ValidCard$ Creature | Execute$ TrigPutCounter | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever a player sacrifices a creature, you may put a +1/+1 counter on CARDNAME. -SVar:TrigSac:DB$ Sacrifice | Defined$ DefendingPlayer | SacValid$ Creature +SVar:TrigSac:DB$ Sacrifice | Defined$ TriggeredDefendingPlayer | SacValid$ Creature SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 SVar:HasAttackEffect:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/thraximundar.jpg diff --git a/forge-gui/res/cardsfolder/t/thresher_beast.txt b/forge-gui/res/cardsfolder/t/thresher_beast.txt index 855e1ed66ed..701e76c1e53 100644 --- a/forge-gui/res/cardsfolder/t/thresher_beast.txt +++ b/forge-gui/res/cardsfolder/t/thresher_beast.txt @@ -3,7 +3,7 @@ ManaCost:3 G G Types:Creature Beast PT:4/4 T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ Whenever CARDNAME becomes blocked, defending player sacrifices a land. -SVar:TrigSac:DB$ Sacrifice | SacValid$ Land | Defined$ DefendingPlayer | ChangeNum$ 1 +SVar:TrigSac:DB$ Sacrifice | SacValid$ Land | Defined$ TriggeredDefendingPlayer | ChangeNum$ 1 SVar:HasAttackEffect:Blocked SVar:Picture:http://www.wizards.com/global/images/magic/general/thresher_beast.jpg Oracle:Whenever Thresher Beast becomes blocked, defending player sacrifices a land. diff --git a/forge-gui/res/cardsfolder/t/throat_slitter.txt b/forge-gui/res/cardsfolder/t/throat_slitter.txt index d3aee044eba..2de5a88b742 100644 --- a/forge-gui/res/cardsfolder/t/throat_slitter.txt +++ b/forge-gui/res/cardsfolder/t/throat_slitter.txt @@ -4,7 +4,7 @@ Types:Creature Rat Ninja PT:2/2 K:Ninjutsu:2 B T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigDestroy | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, destroy target nonblack creature that player controls. -SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.nonBlack+DefenderCtrl | TgtPrompt$ Select target nonblack creature defending player controls +SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.nonBlack+ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target nonblack creature defending player controls SVar:MustBeBlocked:True SVar:Picture:http://www.wizards.com/global/images/magic/general/throat_slitter.jpg Oracle:Ninjutsu {2}{B} ({2}{B}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.)\nWhenever Throat Slitter deals combat damage to a player, destroy target nonblack creature that player controls. diff --git a/forge-gui/res/cardsfolder/t/tormentors_helm.txt b/forge-gui/res/cardsfolder/t/tormentors_helm.txt index 2aa6628c41f..1ca4d1e41dd 100644 --- a/forge-gui/res/cardsfolder/t/tormentors_helm.txt +++ b/forge-gui/res/cardsfolder/t/tormentors_helm.txt @@ -4,6 +4,6 @@ Types:Artifact Equipment K:Equip:1 S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 1 | AddToughness$ 1 | Description$ Equipped creature gets +1/+1. T:Mode$ AttackerBlocked | ValidCard$ Creature.EquippedBy | Execute$ TrigDealDamage | TriggerDescription$ Whenever equipped creature becomes blocked, it deals 1 damage to defending player. -SVar:TrigDealDamage:DB$DealDamage | Defined$ DefendingPlayer | NumDmg$ 1 +SVar:TrigDealDamage:DB$DealDamage | Defined$ TriggeredDefendingPlayer | NumDmg$ 1 SVar:HasAttackEffect:Blocked Oracle:Equipped creature gets +1/+1.\nWhenever equipped creature becomes blocked, it deals 1 damage to defending player.\nEquip {1} ({1}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/t/torrent_elemental.txt b/forge-gui/res/cardsfolder/t/torrent_elemental.txt index 074ad665672..550d395d35b 100644 --- a/forge-gui/res/cardsfolder/t/torrent_elemental.txt +++ b/forge-gui/res/cardsfolder/t/torrent_elemental.txt @@ -4,7 +4,7 @@ Types:Creature Elemental PT:3/5 K:Flying T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME attacks, tap all creatures defending player controls. -SVar:TrigTap:DB$TapAll | ValidCards$ Creature.DefenderCtrl +SVar:TrigTap:DB$ TapAll | ValidCards$ Creature.ControlledBy TriggeredDefendingPlayer A:AB$ ChangeZone | Cost$ 3 BG BG | ActivationZone$ Exile | Origin$ Exile | Destination$ Battlefield | Tapped$ True | SorcerySpeed$ True | SpellDescription$ Put CARDNAME from exile onto the battlefield tapped. Activate only as a sorcery. SVar:Picture:http://www.wizards.com/global/images/magic/general/torrent_elemental.jpg Oracle:Flying\nWhenever Torrent Elemental attacks, tap all creatures defending player controls.\n{3}{B/G}{B/G}: Put Torrent Elemental from exile onto the battlefield tapped. Activate only as a sorcery. diff --git a/forge-gui/res/cardsfolder/t/trepanation_blade.txt b/forge-gui/res/cardsfolder/t/trepanation_blade.txt index b47e2aa4fba..1c561c114df 100644 --- a/forge-gui/res/cardsfolder/t/trepanation_blade.txt +++ b/forge-gui/res/cardsfolder/t/trepanation_blade.txt @@ -3,7 +3,7 @@ ManaCost:3 Types:Artifact Equipment K:Equip:2 T:Mode$ Attacks | ValidCard$ Card.EquippedBy | Execute$ TrigDig | TriggerDescription$ Whenever equipped creature attacks, defending player reveals cards from the top of their library until their reveals a land card. The creature gets +1/+0 until end of turn for each card revealed this way. That player puts the revealed cards into their graveyard. -SVar:TrigDig:DB$ DigUntil | Defined$ DefendingPlayer | Valid$ Land | ValidDescription$ land | RevealedDestination$ Graveyard | RememberRevealed$ True | SubAbility$ TrigPump +SVar:TrigDig:DB$ DigUntil | Defined$ TriggeredDefendingPlayer | Valid$ Land | ValidDescription$ land | RevealedDestination$ Graveyard | RememberRevealed$ True | SubAbility$ TrigPump SVar:TrigPump:DB$ Pump | Defined$ Equipped | NumAtt$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$Amount diff --git a/forge-gui/res/cardsfolder/t/trygon_predator.txt b/forge-gui/res/cardsfolder/t/trygon_predator.txt index c455b9f497b..72f24720d56 100644 --- a/forge-gui/res/cardsfolder/t/trygon_predator.txt +++ b/forge-gui/res/cardsfolder/t/trygon_predator.txt @@ -4,6 +4,6 @@ Types:Creature Beast PT:2/3 K:Flying T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | OptionalDecider$ You | CombatDamage$ True | Execute$ TrigDestroy | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may destroy target artifact or enchantment that player controls. -SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Artifact.DefenderCtrl,Enchantment.DefenderCtrl | TgtPrompt$ Select target artifact or enchantment you don't control. +SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Artifact.ControlledBy TriggeredDefendingPlayer,Enchantment.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target artifact or enchantment you don't control. SVar:Picture:http://www.wizards.com/global/images/magic/general/trygon_predator.jpg Oracle:Flying\nWhenever Trygon Predator deals combat damage to a player, you may destroy target artifact or enchantment that player controls. diff --git a/forge-gui/res/cardsfolder/t/tyrants_familiar.txt b/forge-gui/res/cardsfolder/t/tyrants_familiar.txt index d8f2c3238f1..27f3885d973 100644 --- a/forge-gui/res/cardsfolder/t/tyrants_familiar.txt +++ b/forge-gui/res/cardsfolder/t/tyrants_familiar.txt @@ -6,7 +6,7 @@ K:Flying K:Haste S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 2 | AddToughness$ 2 | AddTrigger$ TrigAttacks | CheckSVar$ X | SVarCompare$ GE1 | Description$ Lieutenant — As long as you control your commander, CARDNAME gets +2/+2 and has "Whenever CARDNAME attacks, it deals 7 damage to target creature defending player controls." SVar:TrigAttacks:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ Whenever CARDNAME attacks, it deals 7 damage to target creature defending player controls. -SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Creature.DefenderCtrl | TgtPrompt$ Select target creature defending player controls | NumDmg$ 7 +SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Creature.ControlledBy TriggeredDefendingPlayer | TgtPrompt$ Select target creature defending player controls | NumDmg$ 7 SVar:X:Count$Valid Card.IsCommander+YouOwn+YouCtrl SVar:BuffedBy:Card.IsCommander AI:RemoveDeck:Random diff --git a/forge-gui/res/cardsfolder/upcoming/boneyard_aberration.txt b/forge-gui/res/cardsfolder/upcoming/boneyard_aberration.txt new file mode 100644 index 00000000000..cb2da249ed9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/boneyard_aberration.txt @@ -0,0 +1,10 @@ +Name:Boneyard Aberration +ManaCost:4 B +Types:Creature Skeleton Dog +PT:3/3 +T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigExile | TriggerDescription$ When CARDNAME dies, exile it. If you do, conjure three Reassembling Skeleton cards into your graveyard. +SVar:TrigExile:DB$ ChangeZone | Defined$ TriggeredNewCardLKICopy | Origin$ Graveyard | Destination$ Exile | RememberChanged$ True | SubAbility$ DBConjure +SVar:DBConjure:DB$ MakeCard | ConditionDefined$ Remembered | ConditionPresent$ Card | Name$ Reassembling Skeleton | Zone$ Graveyard | Amount$ 3 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +DeckHas:Ability$Graveyard +Oracle:When Boneyard Aberration dies, exile it. If you do, conjure three Reassembling Skeleton cards into your graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/death_tyrant.txt b/forge-gui/res/cardsfolder/upcoming/death_tyrant.txt index 217710626c6..4f8ca93fcf7 100644 --- a/forge-gui/res/cardsfolder/upcoming/death_tyrant.txt +++ b/forge-gui/res/cardsfolder/upcoming/death_tyrant.txt @@ -3,7 +3,7 @@ ManaCost:4 B Types:Creature Beholder Skeleton PT:4/6 K:Menace -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.attackingLKI+YouCtrl,Creature.blocking+OppCtrl | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ Negative Energy Cone — Whenever an attacking creature you control or a blocking creature an opponent controls dies, create a 2/2 black Zombie creature token. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.attacking+YouCtrl,Creature.blocking+OppCtrl | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ Negative Energy Cone — Whenever an attacking creature you control or a blocking creature an opponent controls dies, create a 2/2 black Zombie creature token. SVar:TrigToken:DB$ Token | TokenScript$ b_2_2_zombie | TokenOwner$ You | TokenAmount$ 1 A:AB$ ChangeZone | Cost$ 5 B | Origin$ Graveyard | Destination$ Battlefield | ActivationZone$ Graveyard | Tapped$ True | SpellDescription$ Return CARDNAME from your graveyard to the battlefield tapped. DeckHas:Ability$Token diff --git a/forge-gui/res/cardsfolder/upcoming/managorger_phoenix.txt b/forge-gui/res/cardsfolder/upcoming/managorger_phoenix.txt new file mode 100644 index 00000000000..dd3e8104db0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/managorger_phoenix.txt @@ -0,0 +1,17 @@ +Name:Managorger Phoenix +ManaCost:R R +Types:Creature Phoenix +PT:2/2 +K:Flying +K:CARDNAME can't block. +T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | NoResolvingCheck$ True | TriggerZones$ Graveyard | Execute$ TrigPutCounter | TriggerDescription$ Whenever you cast a spell, if CARDNAME is in your graveyard, put a flame counter on CARDNAME for each {R} in that spell's mana cost. If CARDNAME has five or more flame counters on it, return it to the battlefield and it perpetually gets +1/+1. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ FLAME | CounterNum$ X | SubAbility$ DBReturn +SVar:DBReturn:DB$ ChangeZone | ConditionDefined$ Self | ConditionPresent$ Card.counters_GE5_FLAME | Defined$ Self | Origin$ Graveyard | Destination$ Battlefield | RememberChanged$ True | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | ConditionDefined$ Remembered | ConditionPresent$ Card.Self | StaticAbilities$ PerpetualP1P1 | Duration$ Permanent | SubAbility$ DBCleanup +SVar:PerpetualP1P1:Mode$ Continuous | Affected$ Card.EffectSource | AddPower$ 1 | AddToughness$ 1 | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ EFFECTSOURCE perpetually gets +1/+1. +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Count$TriggeredManaCostDevotion.Red +SVar:SacMe:3 +DeckHas:Ability$Counters & Ability$Graveyard +DeckHints:Ability$Discard +Oracle:Flying\nManagorger Phoenix can't block.\nWhenever you cast a spell, if Managorger Phoenix is in your graveyard, put a flame counter on Managorger Phoenix for each {R} in that spell's mana cost. If Managorger Phoenix has five or more flame counters on it, return it to the battlefield and it perpetually gets +1/+1. diff --git a/forge-gui/res/cardsfolder/upcoming/pool_of_vigorous_growth.txt b/forge-gui/res/cardsfolder/upcoming/pool_of_vigorous_growth.txt new file mode 100644 index 00000000000..5142ec54e9e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/pool_of_vigorous_growth.txt @@ -0,0 +1,7 @@ +Name:Pool of Vigorous Growth +ManaCost:1 G +Types:Artifact +A:AB$ CopyPermanent | Cost$ X T Discard<1/Card> | AILogic$ MomirAvatar | NumCopies$ 1 | ValidSupportedCopy$ Creature.cmcEQX | RandomCopied$ True | RandomNum$ 1 | SorcerySpeed$ True | StackDescription$ SpellDescription | SpellDescription$ Create a token that's a copy of a random creature card with mana value X. Activate only as a sorcery. +SVar:X:Count$xPaid +DeckHas:Ability$Token +Oracle:{X}, {T}, Discard a card: Create a token that's a copy of a random creature card with mana value X. Activate only as a sorcery. diff --git a/forge-gui/res/cardsfolder/upcoming/vengeful_ancestor.txt b/forge-gui/res/cardsfolder/upcoming/vengeful_ancestor.txt index 7e5cbf1d5e7..c3b25491dc6 100644 --- a/forge-gui/res/cardsfolder/upcoming/vengeful_ancestor.txt +++ b/forge-gui/res/cardsfolder/upcoming/vengeful_ancestor.txt @@ -6,6 +6,6 @@ K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGoad | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, goad target creature. (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 | Secondary$ True | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, goad target creature. (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 | TgtPrompt$ Select target creature -T:Mode$ Attacks | ValidCard$ Creature.IsGoaded | Execute$ TrigDamage | Secondary$ True | TriggerDescription$ Whenever a goaded creature attacks, it deals 1 damage to its controller. +T:Mode$ Attacks | ValidCard$ Creature.IsGoaded | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever a goaded creature attacks, it deals 1 damage to its controller. SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredAttackerController | DamageSource$ TriggeredAttackerLKICopy | NumDmg$ 1 Oracle:Flying\nWhenever Vengeful Ancestor enters the battlefield or attacks, goad target creature. (Until your next turn, that creature attacks each combat if able and attacks a player other than you if able.)\nWhenever a goaded creature attacks, it deals 1 damage to its controller. diff --git a/forge-gui/res/cardsfolder/v/vedalken_ghoul.txt b/forge-gui/res/cardsfolder/v/vedalken_ghoul.txt index 511a1272c17..500a0cf1c17 100644 --- a/forge-gui/res/cardsfolder/v/vedalken_ghoul.txt +++ b/forge-gui/res/cardsfolder/v/vedalken_ghoul.txt @@ -3,7 +3,7 @@ ManaCost:U B Types:Creature Vedalken Zombie PT:1/1 T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigDrain | TriggerDescription$ Whenever CARDNAME becomes blocked, defending player loses 4 life. -SVar:TrigDrain:DB$ LoseLife | Defined$ DefendingPlayer | LifeAmount$ 4 +SVar:TrigDrain:DB$ LoseLife | Defined$ TriggeredDefendingPlayer | LifeAmount$ 4 SVar:HasAttackEffect:Blocked SVar:Picture:http://www.wizards.com/global/images/magic/general/vedalken_ghoul.jpg Oracle:Whenever Vedalken Ghoul becomes blocked, defending player loses 4 life. diff --git a/forge-gui/res/cardsfolder/v/viashino_racketeer.txt b/forge-gui/res/cardsfolder/v/viashino_racketeer.txt index 35be277b37e..a4c2ff54475 100644 --- a/forge-gui/res/cardsfolder/v/viashino_racketeer.txt +++ b/forge-gui/res/cardsfolder/v/viashino_racketeer.txt @@ -3,9 +3,7 @@ ManaCost:2 R Types:Creature Viashino Rogue PT:2/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, you may discard a card. If you do, draw a card. -SVar:TrigDiscard:DB$ Discard | NumCards$ 1 | Mode$ TgtChoose | Optional$ True | RememberDiscarded$ True | SubAbility$ DBDraw -SVar:DBDraw:DB$ Draw | NumCards$ 1 | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:TrigDiscard:AB$ Draw | NumCards$ 1 | Cost$ Discard<1/Card> SVar:X:Remembered$Amount SVar:Picture:http://www.wizards.com/global/images/magic/general/viashino_racketeer.jpg Oracle:When Viashino Racketeer enters the battlefield, you may discard a card. If you do, draw a card. diff --git a/forge-gui/res/cardsfolder/w/waking_the_trolls.txt b/forge-gui/res/cardsfolder/w/waking_the_trolls.txt index 25ebec1388d..2b47e159230 100644 --- a/forge-gui/res/cardsfolder/w/waking_the_trolls.txt +++ b/forge-gui/res/cardsfolder/w/waking_the_trolls.txt @@ -4,7 +4,7 @@ Types:Enchantment Saga K:Saga:3:DBDestroy,DBChangeZone,DBPump SVar:DBDestroy:DB$ Destroy | ValidTgts$ Land | TgtPrompt$ Choose target land. | SpellDescription$ Destroy target land. SVar:DBChangeZone:DB$ ChangeZone | ValidTgts$ Land | TgtPrompt$ Choose target land card. | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | SpellDescription$ Put target land card from a graveyard onto the battlefield under your control. -SVar:DBPump:DB$ Pump | ValidTgts$ Player.Opponent | RememberTargets$ True | TgtPrompt$ Choose target player. | SubAbility$ DBToken | SpellDescription$ Choose target player. If they control fewer lands than you, create a number of 4/4 green Troll Warrior creature tokens with trample equal to the difference. +SVar:DBPump:DB$ Pump | ValidTgts$ Player.Opponent | RememberTargets$ True | IsCurse$ True | TgtPrompt$ Choose target player. | SubAbility$ DBToken | SpellDescription$ Choose target player. If they control fewer lands than you, create a number of 4/4 green Troll Warrior creature tokens with trample equal to the difference. SVar:DBToken:DB$ Token | TokenAmount$ X | TokenScript$ g_4_4_troll_warrior_trample | TokenOwner$ You | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$Valid Land.YouCtrl/Minus.Y diff --git a/forge-gui/res/cardsfolder/w/wandering_champion.txt b/forge-gui/res/cardsfolder/w/wandering_champion.txt index 8e0203fc569..217a24a3aa4 100644 --- a/forge-gui/res/cardsfolder/w/wandering_champion.txt +++ b/forge-gui/res/cardsfolder/w/wandering_champion.txt @@ -2,10 +2,8 @@ Name:Wandering Champion ManaCost:1 W Types:Creature Human Monk PT:3/1 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | IsPresent$ Permanent.Blue+YouCtrl,Permanent.Red+YouCtrl | CombatDamage$ True | Execute$ TrigDiscard | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, if you control a blue or red permanent, you may discard a card. If you do, draw a card. -SVar:TrigDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBDraw -SVar:DBDraw:DB$ Draw | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | IsPresent$ Permanent.Blue+YouCtrl,Permanent.Red+YouCtrl | CombatDamage$ True | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, if you control a blue or red permanent, you may discard a card. If you do, draw a card. +SVar:TrigDiscard:AB$ Draw | NumCards$ 1 | Cost$ Discard<1/Card> DeckHints:Color$Blue|Red SVar:Picture:http://www.wizards.com/global/images/magic/general/wandering_champion.jpg Oracle:Whenever Wandering Champion deals combat damage to a player, if you control a blue or red permanent, you may discard a card. If you do, draw a card. diff --git a/forge-gui/res/cardsfolder/w/wharf_infiltrator.txt b/forge-gui/res/cardsfolder/w/wharf_infiltrator.txt index 4f69997d820..e210c27f852 100644 --- a/forge-gui/res/cardsfolder/w/wharf_infiltrator.txt +++ b/forge-gui/res/cardsfolder/w/wharf_infiltrator.txt @@ -3,9 +3,8 @@ ManaCost:1 U Types:Creature Human Horror PT:1/1 K:Skulk -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may draw a card. If you do, discard a card. -SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SubAbility$ DBDiscard -SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may draw a card. If you do, discard a card. +SVar:TrigDraw:AB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | Cost$ Draw<1/You> T:Mode$ Discarded | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you discard a creature card, you may pay {2}. If you do, create a 3/2 colorless Eldrazi Horror creature token. SVar:TrigToken:AB$ Token | Cost$ 2 | TokenAmount$ 1 | TokenScript$ c_3_2_eldrazi_horror | TokenOwner$ You | LegacyImage$ c 3 2 eldrazi horror emn DeckHas:Ability$Token & Ability$Discard diff --git a/forge-gui/res/cardsfolder/w/windrider_wizard.txt b/forge-gui/res/cardsfolder/w/windrider_wizard.txt index 26334907bef..8cea9047c69 100644 --- a/forge-gui/res/cardsfolder/w/windrider_wizard.txt +++ b/forge-gui/res/cardsfolder/w/windrider_wizard.txt @@ -3,8 +3,7 @@ ManaCost:2 U Types:Creature Human Wizard PT:2/2 K:Flying -T:Mode$ SpellCast | ValidCard$ Instant,Sorcery,Wizard | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigLoot | OptionalDecider$ You | TriggerDescription$ Whenever you cast an instant, sorcery, or Wizard spell, you may draw a card. If you do, discard a card. -SVar:TrigLoot:DB$ Draw | NumCards$ 1 | SubAbility$ DBDiscard -SVar:DBDiscard:DB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 +T:Mode$ SpellCast | ValidCard$ Instant,Sorcery,Wizard | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigLoot | TriggerDescription$ Whenever you cast an instant, sorcery, or Wizard spell, you may draw a card. If you do, discard a card. +SVar:TrigLoot:AB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 | Cost$ Draw<1/You> DeckHints:Type$Instant|Sorcery|Wizard Oracle:Flying\nWhenever you cast an instant, sorcery, or Wizard spell, you may draw a card. If you do, discard a card. diff --git a/forge-gui/res/cardsfolder/x/xantid_swarm.txt b/forge-gui/res/cardsfolder/x/xantid_swarm.txt index c0466ef809f..c0f71c1b640 100644 --- a/forge-gui/res/cardsfolder/x/xantid_swarm.txt +++ b/forge-gui/res/cardsfolder/x/xantid_swarm.txt @@ -4,7 +4,7 @@ Types:Creature Insect PT:0/1 K:Flying T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigEffect | TriggerDescription$ When CARDNAME attacks, defending player can't cast spells this turn. -SVar:TrigEffect:DB$ Effect | Name$ Xantid Swarm Effect | RememberObjects$ DefendingPlayer | StaticAbilities$ CantBeCast | SubAbility$ DBCleanup +SVar:TrigEffect:DB$ Effect | Name$ Xantid Swarm Effect | RememberObjects$ TriggeredDefendingPlayer | StaticAbilities$ CantBeCast | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:CantBeCast:Mode$ CantBeCast | EffectZone$ Command | ValidCard$ Card | Caster$ Player.IsRemembered | Description$ Defending player can't cast spells. AI:RemoveDeck:Random diff --git a/forge-gui/res/cardsfolder/z/zealous_conscripts.txt b/forge-gui/res/cardsfolder/z/zealous_conscripts.txt index 50dcfafacf5..90d86fe6776 100644 --- a/forge-gui/res/cardsfolder/z/zealous_conscripts.txt +++ b/forge-gui/res/cardsfolder/z/zealous_conscripts.txt @@ -4,7 +4,7 @@ Types:Creature Human Warrior PT:3/3 K:Haste T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, untap target permanent and gain control of it until end of turn. It gains haste until end of turn. -SVar:TrigChange:DB$GainControl | TgtPrompt$ Choose target permanent | ValidTgts$ Permanent | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SpellDescription$ Untap target permanent gain control of it until end of turn. It gains haste until end of turn. +SVar:TrigChange:DB$ GainControl | TgtPrompt$ Choose target permanent | ValidTgts$ Permanent | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SpellDescription$ Untap target permanent gain control of it until end of turn. It gains haste until end of turn. SVar:PlayMain1:OPPONENTCREATURES SVar:Picture:http://www.wizards.com/global/images/magic/general/zealous_conscripts.jpg Oracle:Haste\nWhen Zealous Conscripts enters the battlefield, gain control of target permanent until end of turn. Untap that permanent. It gains haste until end of turn. diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index a58b2ed46ba..91843b6aad2 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -97,6 +97,8 @@ cbCompactPrompt=Kompaktes Bestätigungsfenster cbEscapeEndsTurn=Nutze Escape für Zugende cbPreselectPrevAbOrder=Nutze letzte Reihenfolge von Fähigkeiten cbHideReminderText=Verstecke Erinnerungstext +cbCardTextUseSansSerif=Nutze Sans-Serif-Schriftart für den Kartentext +cbCardTextHideReminder=Übergehe Hinweisteste beim Erzeugen der Kartentexte cbOpenPacksIndiv=Öffne Packs einzeln cbTokensInSeparateRow=Zeige Spielsteine in extra Reihe cbStackCreatures=Staple Kreaturen @@ -180,7 +182,9 @@ nlSmallDeckViewer=Setzt die Kartenansicht auf 800x600 statt auf einen relativen nlRandomArtInPools=Nimm zufällige Versionen von Kartenbildern beim Erzeugen von zufälligen Kartensammlungen. nlUiForTouchScreen=Vergrößert einige Elemente der Benutzeroberfläche zu besseren Bedienung auf Touchscreen-Geräten. (Erfordert Neustart) nlCompactPrompt=Entfernt Überschriften und nutzt kleinere Schriftgröße um Bedienfenster kompakter zu machen. -nlHideReminderText=Verstecke Erinnerungstext im Kartendetailfenster. +nlHideReminderText=Verstecke Hinweistext im Kartendetailfenster. +nlCardTextUseSansSerif=Nutze Sans-Serif-Schriftart für den Kartentext beim Erzeugen des Kartenbildes. (Erfordert Neustart) +nlCardTextHideReminder=Übergehe Hinweisteste beim Erzeugen der Kartentexte. nlOpenPacksIndiv=Beim Öffnen von FatPacks und Boosterboxen werden Booster einzeln nacheinander geöffnet. nlTokensInSeparateRow=Zeige Spielsteine auf dem Spielfeld in einer separaten Reihe unter den Nicht-Spielsteinkreaturen. nlStackCreatures=Stapelt identische Kreaturen auf dem Spielfeld, analog der Länder, Artefakte und Verzauberungen. diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index 1de6d8d2323..41b6b67d0f0 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -98,6 +98,8 @@ cbCompactPrompt=Compact Prompt cbEscapeEndsTurn=Use Escape Key to End Turn cbPreselectPrevAbOrder=Preselect Last Order of Abilities cbHideReminderText=Hide Reminder Text +cbCardTextUseSansSerif=Use Sans-serif Font for Card Text Renderer +cbCardTextHideReminder=Hide Reminder Text for Card Text Renderer cbOpenPacksIndiv=Open Packs Individually cbTokensInSeparateRow=Display Tokens in a Separate Row cbStackCreatures=Stack Creatures @@ -185,6 +187,8 @@ nlRandomArtInPools=Generates cards with random art in generated limited mode car nlUiForTouchScreen=Increases some UI elements to provide a better experience on touchscreen devices. (REQUIRES RESTART) nlCompactPrompt=Hide header and use smaller font in Prompt pane to make it more compact. nlHideReminderText=Hide reminder text in Card Detail pane. +nlCardTextUseSansSerif=Render card images by using Sans-serif font for card text. (Requires restart) +nlCardTextHideReminder=When render card images, skip rendering reminder text. nlOpenPacksIndiv=When opening Fat Packs and Booster Boxes, booster packs will be opened and displayed one at a time. nlTokensInSeparateRow=Displays tokens in a separate row on the battlefield below the non-token creatures. nlStackCreatures=Stacks identical creatures on the battlefield like lands, artifacts, and enchantments. diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index 103fd1920bb..c7ada80b9a2 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -98,6 +98,8 @@ cbCompactPrompt=Ventana de aviso compacta cbEscapeEndsTurn=Use la tecla Escape para Fin del Turno cbPreselectPrevAbOrder=Preseleccionar el último orden de habilidades cbHideReminderText=Ocultar texto de recordatorio +cbCardTextUseSansSerif=Use Sans-serif Font for Card Text Renderer +cbCardTextHideReminder=Hide Reminder Text for Card Text Renderer cbOpenPacksIndiv=Abrir packs individualmente cbTokensInSeparateRow=Mostrar fichas en una fila separada cbStackCreatures=Apilar criaturas @@ -182,6 +184,8 @@ nlRandomArtInPools=Genera cartas con arte al azar en pools generados de cartas d nlUiForTouchScreen=Aumenta algunos elementos de la interfaz de usuario para proporcionar una mejor experiencia en dispositivos de pantalla táctil. (Necesita reinicio) nlCompactPrompt=Oculte el encabezado y use una fuente más pequeña en el panel de solicitud para hacerlo más compacto. nlHideReminderText=Ocultar el texto del recordatorio en el panel de Detalle de la carta +nlCardTextUseSansSerif=Render card images by using Sans-serif font for card text. (Requires restart) +nlCardTextHideReminder=When render card images, skip rendering reminder text. nlOpenPacksIndiv=Al abrir packs de cartas (Fat Packs) y cajas de sobres, los sobres se abrirán y se mostrarán de uno en uno. nlTokensInSeparateRow=Muestra las fichas en una fila separada en el campo de batalla debajo de las criaturas que no son fichas. nlStackCreatures=Apila criaturas idénticas en el campo de batalla, como tierras, artefactos y encantamientos. diff --git a/forge-gui/res/languages/it-IT.properties b/forge-gui/res/languages/it-IT.properties index d9d62e82a48..577577b7d17 100644 --- a/forge-gui/res/languages/it-IT.properties +++ b/forge-gui/res/languages/it-IT.properties @@ -97,6 +97,8 @@ cbCompactPrompt=Riquadro messaggi compatto cbEscapeEndsTurn=Utilizzare il tasto Esc per terminare il turno cbPreselectPrevAbOrder=Preseleziona Ultimo ordine di abilità cbHideReminderText=Nascondi testo promemoria +cbCardTextUseSansSerif=Use Sans-serif Font for Card Text Renderer +cbCardTextHideReminder=Hide Reminder Text for Card Text Renderer cbOpenPacksIndiv=Apri i pacchetti singolarmente cbTokensInSeparateRow=Visualizza token in una riga separata cbStackCreatures=Sovrapponi le creature @@ -181,6 +183,8 @@ nlRandomArtInPools=Genera carte con arte casuale nei gruppi di carte generati in nlUiForTouchScreen=Ingrandisce alcuni elementi dell''interfaccia utente per offrire una migliore esperienza sui dispositivi touchscreen. (RIAVVIO NECESSARIO) nlCompactPrompt=Nascondi l''intestazione e usa caratteri più piccoli nel riquadro messaggi per renderlo più compatto. nlHideReminderText=Nascondi il testo del promemoria nel riquadro Dettagli carta. +nlCardTextUseSansSerif=Render card images by using Sans-serif font for card text. (Requires restart) +nlCardTextHideReminder=When render card images, skip rendering reminder text. nlOpenPacksIndiv=Quando si aprono Fat Pack e Booster Box, le buste verranno aperte e visualizzate una alla volta. nlTokensInSeparateRow=Visualizza le pedine in una riga separata sul campo di battaglia sotto alle creature non pedina. nlStackCreatures=Raggruppa sul campo di battaglia le creature identiche così come con le terre, gli artefatti e gli incantesimi. diff --git a/forge-gui/res/languages/ja-JP.properties b/forge-gui/res/languages/ja-JP.properties index 52c74cf9bc1..3d8e498d165 100644 --- a/forge-gui/res/languages/ja-JP.properties +++ b/forge-gui/res/languages/ja-JP.properties @@ -98,6 +98,8 @@ cbCompactPrompt=コンパクトプロンプト cbEscapeEndsTurn=エスケープキーを使用してターンを終了する cbPreselectPrevAbOrder=前回選択したを同時能力の順序を事前選択にする cbHideReminderText=リマインダーテキストを非表示 +cbCardTextUseSansSerif=カードの文章欄にゴシック体を使います +cbCardTextHideReminder=カードの文章欄のリマインダーテキストを非表示 cbOpenPacksIndiv=パックを個別に開く cbTokensInSeparateRow=別の行にトークンを表示する cbStackCreatures=クリーチャー表示をスタックする @@ -182,6 +184,8 @@ nlRandomArtInPools=限定的なカードプールでデッキを生成する時 nlUiForTouchScreen=一部の UI 要素を増やして、タッチスクリーンデバイスでの操作性を向上させます。 (再起動が必要) nlCompactPrompt=ヘッダーを非表示にし、プロンプトペインでより小さいフォントを使用して、ヘッダーをよりコンパクトにします。 nlHideReminderText=カード詳細パネルでリマインダーテキストを非表示にします。 +nlCardTextUseSansSerif=カードを描画する時、文章欄の文字はゴシック体で描画します。(非アジア言語だけに影響します、再起動必須) +nlCardTextHideReminder=カードを描画する時、文章欄のリマインダーテキストを非表示にします。 nlOpenPacksIndiv=ファットパックとブースターボックスを開く時、ブースターパックが 1つずつ開かれ、表示されます。 nlTokensInSeparateRow=トークンをトークンでないクリーチャーの下の戦場の別の行に表示します。 nlStackCreatures=土地、アーティファクト、エンチャント、クリーチャーなど、同名のカードを戦場にスタックします。 diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index 89fd1da1f6e..6f36342813a 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -98,6 +98,8 @@ cbCompactPrompt=紧凑型提示 cbEscapeEndsTurn=使用空格结束回合 cbPreselectPrevAbOrder=预选能力的顺序 cbHideReminderText=隐藏提示文字 +cbCardTextUseSansSerif=Use Sans-serif Font for Card Text Renderer +cbCardTextHideReminder=Hide Reminder Text for Card Text Renderer cbOpenPacksIndiv=逐个打开补充包 cbTokensInSeparateRow=在单独一行中显示衍生物 cbStackCreatures=堆叠生物 @@ -182,6 +184,8 @@ nlRandomArtInPools=限制赛生成的卡池中带有闪卡。 nlUiForTouchScreen=增加一些UI元素以提高触屏体验(需要重启)。 nlCompactPrompt=隐藏标题并在“提示”窗格中使用较小的字体使其更紧凑。 nlHideReminderText=在“卡牌详情“窗格中隐藏提醒文本 +nlCardTextUseSansSerif=Render card images by using Sans-serif font for card text. (Requires restart, only has effects on non-Asian languages) +nlCardTextHideReminder=When render card images, skip rendering reminder text. nlOpenPacksIndiv=打开肥包或者补充盒的时候一包一包开。 nlTokensInSeparateRow=生物与衍生物分不同的行显示。 nlStackCreatures=在战场上如同地、神器、结界一般堆叠一样的生物。 diff --git a/forge-gui/res/puzzle/PS_AFR01.pzl b/forge-gui/res/puzzle/PS_AFR01.pzl new file mode 100644 index 00000000000..3a4b6227f4d --- /dev/null +++ b/forge-gui/res/puzzle/PS_AFR01.pzl @@ -0,0 +1,18 @@ +[metadata] +Name:Possibility Storm - Adventures in the Forgotten Realms #01 +URL:https://i1.wp.com/www.possibilitystorm.com/wp-content/uploads/2021/07/179.-AFR1-scaled.jpg +Goal:Win +Turns:1 +Difficulty:Rare +Description:Win this turn. Remember that your solution must satisfy all possible blocking options! Assume your opponent has no mana available. +[state] +humanlife=20 +ailife=20 +turn=1 +activeplayer=human +activephase=MAIN1 +humanhand=Choose Your Weapon;Old Gnawbone;Inferno of the Star Mounts;Titanic Growth +humanbattlefield=Minion of the Mighty|Counters:P1P1=2;Leafkin Avenger;Belt of Giant Strength;Forest;Forest;Mountain;Mountain;Mountain +aibattlefield=Faerie Formation +aiprecast=Faerie Formation:CustomScript:DB$ Token | TokenScript$ u_1_1_faerie_flying;Faerie Formation:CustomScript:DB$ Token | TokenScript$ u_1_1_faerie_flying +removesummoningsickness=true diff --git a/forge-gui/res/tokenscripts/icingdeath_frost_tongue.txt b/forge-gui/res/tokenscripts/icingdeath_frost_tongue.txt index f1af5d331ae..5bf6a257a0e 100644 --- a/forge-gui/res/tokenscripts/icingdeath_frost_tongue.txt +++ b/forge-gui/res/tokenscripts/icingdeath_frost_tongue.txt @@ -4,6 +4,6 @@ Types:Legendary Artifact Equipment Colors:white S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddToughness$ 0 | Description$ Equipped creature gets +2/+0. T:Mode$ Attacks | ValidCard$ Card.AttachedBy | Execute$ TrigTap | TriggerDescription$ Whenever equipped creature 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 K:Equip:2 Oracle:Equipped creature gets +2/+0.\nWhenever equipped creature attacks, tap target creature defending player controls.\nEquip {2} diff --git a/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java b/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java index 96c6e4af2da..da70404dac1 100644 --- a/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java +++ b/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java @@ -87,6 +87,8 @@ public class ForgePreferences extends PreferencesStore { UI_IMAGE_CACHE_MAXIMUM("400"), UI_OVERLAY_FOIL_EFFECT ("true"), UI_HIDE_REMINDER_TEXT ("false"), + UI_CARD_IMAGE_RENDER_USE_SANS_SERIF_FONT ("true"), + UI_CARD_IMAGE_RENDER_HIDE_REMINDER_TEXT ("true"), UI_SR_OPTIMIZE ("false"), UI_OPEN_PACKS_INDIV ("false"), UI_STACK_CREATURES ("false"), diff --git a/forge-gui/src/main/java/forge/player/HumanCostDecision.java b/forge-gui/src/main/java/forge/player/HumanCostDecision.java index ed69cdd0fd2..068adbb1e94 100644 --- a/forge-gui/src/main/java/forge/player/HumanCostDecision.java +++ b/forge-gui/src/main/java/forge/player/HumanCostDecision.java @@ -269,8 +269,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { final CardCollection enoughType = CardLists.filter(list, CardPredicates.isOwner(p)); if (enoughType.size() < c) { list.removeAll((CardCollectionView)enoughType); - } - else { + } else { payableZone.add(p); } } @@ -437,9 +436,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { if (source.getController() == ability.getActivatingPlayer() && source.isInPlay()) { return player.getController().confirmPayment(cost, Localizer.getInstance().getMessage("lblExertCardConfirm", CardTranslation.getTranslatedName(source.getName())), ability) ? PaymentDecision.card(source) : null; } - else { - return null; - } + return null; } Integer c = cost.convertAmount(); @@ -570,7 +567,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { } // for costs declared mandatory, this is only reachable with a valid amount - if (ability.getPayCosts().isMandatory() || (player.canPayLife(c) && player.getController().confirmPayment(cost, Localizer.getInstance().getMessage("lblPayNLifeConfirm", String.valueOf(c)),ability))) { + if (ability.getPayCosts().isMandatory() || (player.canPayLife(c) && player.getController().confirmPayment(cost, Localizer.getInstance().getMessage("lblPayNLifeConfirm", String.valueOf(c)), ability))) { return PaymentDecision.number(c); } return null; @@ -782,8 +779,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { } }; inp.setMessage(Localizer.getInstance().getMessage("lblSelectNCardOfSameColorToReveal", String.valueOf(num))); - } - else { + } else { Integer num = cost.convertAmount(); CardCollectionView hand = player.getCardsIn(cost.getRevealFrom()); @@ -1027,11 +1023,9 @@ public class HumanCostDecision extends CostDecisionMakerBase { if (cost.payCostFromSource()) { if (source.getController() == ability.getActivatingPlayer() && source.isInPlay()) { - return player.getController().confirmPayment(cost, Localizer.getInstance().getMessage("lblSacrificeCardConfirm", CardTranslation.getTranslatedName(source.getName())), ability) ? PaymentDecision.card(source) : null; - } - else { - return null; + return ability.getPayCosts().isMandatory() || player.getController().confirmPayment(cost, Localizer.getInstance().getMessage("lblSacrificeCardConfirm", CardTranslation.getTranslatedName(source.getName())), ability) ? PaymentDecision.card(source) : null; } + return null; } if (type.equals("OriginalHost")) { @@ -1039,9 +1033,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { if (host.getController() == ability.getActivatingPlayer() && host.isInPlay()) { return player.getController().confirmPayment(cost, Localizer.getInstance().getMessage("lblSacrificeCardConfirm", CardTranslation.getTranslatedName(host.getName())), ability) ? PaymentDecision.card(host) : null; } - else { - return null; - } + return null; } if (amount.equals("All")) { @@ -1067,7 +1059,6 @@ public class HumanCostDecision extends CostDecisionMakerBase { } return PaymentDecision.card(inp.getSelected()); - } @Override @@ -1209,8 +1200,6 @@ public class HumanCostDecision extends CostDecisionMakerBase { @Override public PaymentDecision visit(final CostUnattach cost) { - final Card source = ability.getHostCard(); - final Card cardToUnattach = cost.findCardToUnattach(source, player, ability); if (cardToUnattach != null && player.getController().confirmPayment(cost, Localizer.getInstance().getMessage("lblUnattachCardConfirm", CardTranslation.getTranslatedName(cardToUnattach.getName())), ability)) { return PaymentDecision.card(cardToUnattach); diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index a410e3e3006..760c9374e90 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -44,6 +44,7 @@ import forge.gamemodes.match.input.InputPayManaOfCostPayment; import forge.gamemodes.match.input.InputSelectCardsFromList; import forge.gui.FThreads; import forge.gui.util.SGuiChoose; +import forge.util.Aggregates; import forge.util.Localizer; import forge.util.TextUtil; import forge.util.collect.FCollectionView; @@ -565,15 +566,21 @@ public class HumanPlay { if (!hasPaid) { return false; } } else if (part instanceof CostDiscard) { + int amount = getAmountFromPartX(part, source, sourceAbility); if ("Hand".equals(part.getType())) { if (!p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantDiscardYourHand"), sourceAbility)) { return false; } ((CostDiscard)part).payAsDecided(p, PaymentDecision.card(p.getCardsIn(ZoneType.Hand)), sourceAbility); + } else if ("Random".equals(part.getType())) { + if (!part.canPay(sourceAbility, p) || !p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblWouldYouLikeRandomDiscardTargetCard", amount), sourceAbility)) { + return false; + } + + ((CostDiscard)part).payAsDecided(p, (PaymentDecision.card(Aggregates.random(p.getCardsIn(ZoneType.Hand), amount, new CardCollection()))), sourceAbility); } else { CardCollectionView list = CardLists.getValidCards(p.getCardsIn(ZoneType.Hand), part.getType(), p, source, sourceAbility); - int amount = getAmountFromPartX(part, source, sourceAbility); boolean hasPaid = payCostPart(controller, p, sourceAbility, (CostPartWithList)part, amount, list, Localizer.getInstance().getMessage("lbldiscard") + orString); if (!hasPaid) { return false; } } diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 1822c29ff50..b3fe1be293c 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -361,7 +361,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont if ((attacker.hasKeyword(Keyword.TRAMPLE) && defender != null) || (blockers.size() > 1) || ((attacker.hasKeyword("You may assign CARDNAME's combat damage divided as you choose among " + "defending player and/or any number of creatures they control.")) && overrideOrder && - blockers.size() >0) || (attacker.hasKeyword("Trample over planeswalkers") && defender instanceof Card)) { + blockers.size() >0) || (attacker.hasKeyword("Trample:Planeswalker") && defender instanceof Card)) { GameEntityViewMap gameCacheBlockers = GameEntityView.getMap(blockers); final CardView vAttacker = CardView.get(attacker); final GameEntityView vDefender = GameEntityView.get(defender);