diff --git a/forge-core/src/main/java/forge/util/TextUtil.java b/forge-core/src/main/java/forge/util/TextUtil.java index 06a706b20f0..c1479a43c86 100644 --- a/forge-core/src/main/java/forge/util/TextUtil.java +++ b/forge-core/src/main/java/forge/util/TextUtil.java @@ -300,4 +300,10 @@ public class TextUtil { sb.append( str, idx1, str.length() ); return sb.toString(); } + //Convert to Mana String + public static String toManaString(String ManaProduced){ + if (ManaProduced == "mana"|| ManaProduced.contains("Combo")|| ManaProduced.contains("Any")) + return "mana";//fix manamorphose stack description and probably others.. + return "{"+TextUtil.fastReplace(ManaProduced," ","}{")+"}"; + } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 79fab604916..2238fabfdca 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -121,7 +121,14 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } final String destination = sa.getParam("Destination"); - final String type = sa.hasParam("ChangeType") ? sa.getParam("ChangeType") : "Card"; + String type = "card"; + if (sa.hasParam("ChangeTypeDesc")) { + type = sa.getParam("ChangeTypeDesc"); + } + else if (sa.hasParam("ChangeType")) { + type = sa.getParam("ChangeType"); + } + final int num = sa.hasParam("ChangeNum") ? AbilityUtils.calculateAmount(host, sa.getParam("ChangeNum"), sa) : 1; @@ -140,8 +147,17 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } else if (origin.equals("Library")) { sb.append(chooserNames); sb.append(" search").append(choosers.size() > 1 ? " " : "es "); - sb.append(fetchPlayer); - sb.append("'s library for ").append(num).append(" ").append(type).append(" and "); + sb.append(fetchPlayer).append(fetchPlayer.equals(chooserNames) ? "'s " : " "); + sb.append("library for ").append(num).append(" "); + sb.append(type).append(num > 1 ? "s" : ""); + if (!sa.hasParam("NoReveal")) { + if (choosers.size() == 1) { + sb.append(num > 1 ? ", reveals those cards," : ", reveals that card,"); + } else { + sb.append(num > 1 ? ", reveal those cards," : ", reveal that card,"); + } + } + sb.append(" and "); if (destination.equals("Exile")) { if (num == 1) { @@ -169,10 +185,19 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } if (destination.equals("Hand")) { - sb.append("into its owner's hand."); + if (num == 1) { + sb.append("into its owner's hand."); + } else { + sb.append("into their owner's hand."); + } } if (destination.equals("Graveyard")) { - sb.append("into its owners's graveyard."); + if (num == 1) { + sb.append("into its owner's graveyard."); + } else { + sb.append("into their owner's graveyard."); + } + } } sb.append(" Then shuffle that library."); @@ -297,7 +322,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { if (ZoneType.Graveyard.equals(origin)) { sb.append(fromGraveyard); } - sb.append(" to").append(pronoun).append("owners hand."); + sb.append(" to").append(pronoun).append("owner's hand."); } if (destination.equals(ZoneType.Library)) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java index 61d58891566..d00896a5d05 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java @@ -49,6 +49,13 @@ public class CountersPutEffect extends SpellAbilityEffect { final boolean dividedAsYouChoose = spellAbility.hasParam("DividedAsYouChoose"); final int amount = AbilityUtils.calculateAmount(card, spellAbility.getParamOrDefault("CounterNum", "1"), spellAbility); + //skip the StringBuilder if no targets are chosen ("up to" scenario) + if (spellAbility.usesTargeting()) { + final List targetCards = SpellAbilityEffect.getTargetCards(spellAbility); + if (targetCards.size() == 0) { + return stringBuilder.toString(); + } + } if (spellAbility.hasParam("Bolster")) { stringBuilder.append("Bolster ").append(amount); return stringBuilder.toString(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/GoadEffect.java b/forge-game/src/main/java/forge/game/ability/effects/GoadEffect.java index ae1cdb689ee..3080170b353 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/GoadEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/GoadEffect.java @@ -6,26 +6,24 @@ import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; import forge.game.player.Player; import forge.game.spellability.SpellAbility; -import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; public class GoadEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { - final TargetRestrictions tgt = sa.getTargetRestrictions(); final Player player = sa.getActivatingPlayer(); final Game game = player.getGame(); final long timestamp = game.getNextTimestamp(); - for (final Card tgtC : getTargetCards(sa)) { + for (final Card tgtC : getDefinedCardsOrTargeted(sa)) { // only pump things in PumpZone if (!game.getCardsIn(ZoneType.Battlefield).contains(tgtC)) { continue; } // if pump is a target, make sure we can still target now - if ((tgt != null) && !tgtC.canBeTargetedBy(sa)) { + if (sa.usesTargeting() && !sa.getTargetRestrictions().canTgtPlayer() && !tgtC.canBeTargetedBy(sa)) { continue; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java index 8558f46272b..56ad0850a19 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java @@ -24,6 +24,8 @@ import org.apache.commons.lang3.StringUtils; import com.google.common.collect.Iterables; import java.util.List; +import static forge.util.TextUtil.toManaString; + public class ManaEffect extends SpellAbilityEffect { @Override @@ -252,7 +254,7 @@ public class ManaEffect extends SpellAbilityEffect { final StringBuilder sb = new StringBuilder(); String mana = !sa.hasParam("Amount") || StringUtils.isNumeric(sa.getParam("Amount")) ? GameActionUtil.generatedMana(sa) : "mana"; - sb.append("Add ").append(mana).append("."); + sb.append("Add ").append(toManaString(mana)).append("."); return sb.toString(); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java index 7b28f2427b4..7806099a99c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java @@ -105,9 +105,7 @@ public class MillEffect extends SpellAbilityEffect { if (numCards != 1) { sb.append("s"); } - final String millPosition = sa.hasParam("FromBottom") ? "bottom" : "top"; - sb.append(" from the ").append(millPosition).append(" of their library."); - + sb.append("."); return sb.toString(); } 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 1ec7fbe8a83..d26f2fc876f 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -6174,6 +6174,12 @@ public class Card extends GameEntity implements Comparable { source.forceTurnFaceUp(); } + // the modal state is not copied with lki, need to copy it extra + if (!source.hasState(CardStateName.Modal)) { + source.addAlternateState(CardStateName.Modal, false); + source.getState(CardStateName.Modal).copyFrom(this.getState(CardStateName.Modal), true); + } + source.setSplitStateToPlayAbility(la); if (la.canPlay(source)) { 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 fce27c3824a..d1f5edd6eef 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -43,6 +43,7 @@ import forge.game.keyword.Keyword; import forge.game.keyword.KeywordInterface; import forge.game.phase.PhaseHandler; import forge.game.player.Player; +import forge.game.player.PlayerCollection; import forge.game.replacement.ReplacementEffect; import forge.game.replacement.ReplacementHandler; import forge.game.replacement.ReplacementLayer; @@ -80,10 +81,9 @@ public class CardFactoryUtil { public static SpellAbility buildBasicLandAbility(final CardState state, byte color) { String strcolor = MagicColor.toShortString(color); String abString = "AB$ Mana | Cost$ T | Produced$ " + strcolor + - " | SpellDescription$ Add {" + strcolor + "}."; + " | Secondary$ True | SpellDescription$ Add {" + strcolor + "}."; SpellAbility sa = AbilityFactory.getAbility(abString, state); sa.setIntrinsic(true); // always intristic - sa.setBasicLandAbility(true); // to exclude it from other suspress effects return sa; } @@ -1294,6 +1294,9 @@ public class CardFactoryUtil { if (sq[0].contains("CardNumColors")) { return doXMath(CardUtil.getColors(c).countColors(), m, c); } + if (sq[0].contains("CardNumAttacksThisTurn")) { + return doXMath(c.getDamageHistory().getCreatureAttacksThisTurn(), m, c); + } if (sq[0].contains("ChosenNumber")) { Integer i = c.getChosenNumber(); return doXMath(i == null ? 0 : i, m, c); @@ -1336,6 +1339,13 @@ public class CardFactoryUtil { return doXMath(getCardTypesFromList(game.getCardsIn(ZoneType.smartValueOf(sq[1]))), m, c); } + if (sq[0].contains("OppTypesInGrave")) { + final PlayerCollection opponents = cc.getOpponents(); + CardCollection oppCards = new CardCollection(); + oppCards.addAll(opponents.getCardsIn(ZoneType.Graveyard)); + return doXMath(getCardTypesFromList(oppCards), m, c); + } + if (sq[0].contains("BushidoPoint")) { return doXMath(c.getKeywordMagnitude(Keyword.BUSHIDO), m, c); } diff --git a/forge-game/src/main/java/forge/game/card/CardPredicates.java b/forge-game/src/main/java/forge/game/card/CardPredicates.java index 6104f053fd2..63ee3b22f8b 100644 --- a/forge-game/src/main/java/forge/game/card/CardPredicates.java +++ b/forge-game/src/main/java/forge/game/card/CardPredicates.java @@ -456,6 +456,19 @@ public final class CardPredicates { }; } + public static final Predicate castSA(final Predicate predSA) { + return new Predicate() { + @Override + public boolean apply(final Card c) + { + if (c.getCastSA() == null) { + return false; + } + return predSA.apply(c.getCastSA()); + } + }; + } + public static class Presets { /** 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 b44445d3bfa..f917130d190 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -173,23 +173,12 @@ public final class CardUtil { } public static List getThisTurnCast(final String valid, final Card src) { - List res = Lists.newArrayList(); - final Game game = src.getGame(); - res.addAll(game.getStack().getSpellsCastThisTurn()); - - res = CardLists.getValidCardsAsList(res, valid, src.getController(), src); - - return res; + return CardLists.getValidCardsAsList(src.getGame().getStack().getSpellsCastThisTurn(), valid, src.getController(), src); } public static List getLastTurnCast(final String valid, final Card src) { - List res = Lists.newArrayList(); - final Game game = src.getGame(); - res.addAll(game.getStack().getSpellsCastLastTurn()); + return CardLists.getValidCardsAsList(src.getGame().getStack().getSpellsCastLastTurn(), valid, src.getController(), src); - res = CardLists.getValidCardsAsList(res, valid, src.getController(), src); - - return res; } /** diff --git a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java index 0465c61f465..3ead5f27d1b 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java +++ b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java @@ -14,6 +14,7 @@ import forge.game.mana.ManaCostBeingPaid; import forge.game.player.Player; import forge.game.spellability.AbilityActivated; import forge.game.spellability.SpellAbility; +import forge.game.spellability.SpellAbilityPredicates; import forge.game.spellability.TargetChoices; import forge.game.staticability.StaticAbility; import forge.game.zone.Zone; @@ -423,6 +424,7 @@ public class CostAdjustment { final Player controller = hostCard.getController(); final Player activator = sa.getActivatingPlayer(); final Card card = sa.getHostCard(); + final Game game = hostCard.getGame(); if (st.hasParam("ValidCard") && !card.isValid(st.getParam("ValidCard").split(","), controller, hostCard, sa)) { @@ -452,7 +454,19 @@ public class CostAdjustment { if (activator == null ) { return false; } - List list = CardUtil.getThisTurnCast(st.getParam("ValidCard"), hostCard); + List list; + if (st.hasParam("ValidCard")) { + list = CardUtil.getThisTurnCast(st.getParam("ValidCard"), hostCard); + } else { + list = game.getStack().getSpellsCastThisTurn(); + } + + if (st.hasParam("ValidSpell")) { + list = CardLists.filterAsList(list, CardPredicates.castSA( + SpellAbilityPredicates.isValid(st.getParam("ValidSpell").split(","), controller, hostCard, sa)) + ); + } + if (CardLists.filterControlledBy(list, activator).size() > 0) { return false; } diff --git a/forge-game/src/main/java/forge/game/player/PlayerController.java b/forge-game/src/main/java/forge/game/player/PlayerController.java index 8c8f7312410..2fb8eaf7d5f 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerController.java +++ b/forge-game/src/main/java/forge/game/player/PlayerController.java @@ -1,8 +1,16 @@ package forge.game.player; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; + import com.google.common.base.Predicate; import com.google.common.collect.ListMultimap; import com.google.common.collect.Multimap; + import forge.LobbyPlayer; import forge.card.ColorSet; import forge.card.ICardFace; @@ -14,7 +22,11 @@ import forge.game.GameEntity; import forge.game.GameObject; import forge.game.GameOutcome.AnteResult; import forge.game.GameType; -import forge.game.card.*; +import forge.game.card.Card; +import forge.game.card.CardCollection; +import forge.game.card.CardCollectionView; +import forge.game.card.CardView; +import forge.game.card.CounterType; import forge.game.combat.Combat; import forge.game.cost.Cost; import forge.game.cost.CostPart; @@ -23,18 +35,17 @@ import forge.game.keyword.KeywordInterface; import forge.game.mana.Mana; import forge.game.mana.ManaConversionMatrix; import forge.game.replacement.ReplacementEffect; -import forge.game.spellability.*; +import forge.game.spellability.AbilitySub; +import forge.game.spellability.OptionalCostValue; +import forge.game.spellability.SpellAbility; +import forge.game.spellability.SpellAbilityStackInstance; +import forge.game.spellability.TargetChoices; import forge.game.trigger.WrappedAbility; +import forge.game.zone.Zone; import forge.game.zone.ZoneType; import forge.item.PaperCard; import forge.util.ITriggerEvent; import forge.util.collect.FCollectionView; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.Collection; -import java.util.List; -import java.util.Map; /** * A prototype for player controller class @@ -278,4 +289,7 @@ public abstract class PlayerController { public abstract CardCollection chooseCardsForEffectMultiple(Map validMap, SpellAbility sa, String title, boolean isOptional); + + public void handleLandPlayed(Card land, Zone zone) { + } } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 95db0fad1e5..11035b6a2b1 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -113,8 +113,6 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit private boolean blessing = false; private Integer chapter = null; - private boolean basicLandAbility = false; - private CardStateName stateName = null; private int totalManaSpent = 0; @@ -789,13 +787,6 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit return this.isAlternativeCost(AlternativeCost.Flashback); } - public void setBasicLandAbility(final boolean basicLandAbility0) { - basicLandAbility = basicLandAbility0; - } - public boolean isBasicLandAbility() { - return basicLandAbility && isIntrinsic(); - } - /** * @return the aftermath */ diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityPredicates.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityPredicates.java index 4f575371492..46865d5931a 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityPredicates.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityPredicates.java @@ -4,6 +4,8 @@ import com.google.common.base.Predicate; import forge.game.CardTraitPredicates; import forge.game.ability.ApiType; +import forge.game.card.Card; +import forge.game.player.Player; public final class SpellAbilityPredicates extends CardTraitPredicates { public static final Predicate isApi(final ApiType type) { @@ -59,4 +61,13 @@ public final class SpellAbilityPredicates extends CardTraitPredicates { } }; } + + public static final Predicate isValid(String[] restrictions, Player sourceController, Card source, SpellAbility spellAbility) { + return new Predicate() { + @Override + public boolean apply(final SpellAbility sa) { + return sa.isValid(restrictions, sourceController, source, spellAbility); + } + }; + } } 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 6cbf96cc1aa..499e5426022 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java @@ -26,6 +26,8 @@ import forge.util.Localizer; import java.util.Map; +import static forge.util.TextUtil.toManaString; + /** *

* Trigger_TapsForMana class. @@ -99,6 +101,9 @@ public class TriggerTapsForMana extends Trigger { if (!this.getHostCard().hasChosenColor() || !produced.contains(MagicColor.toShortString(this.getHostCard().getChosenColor()))) { return false; } + if (!produced.contains(MagicColor.toShortString(this.getParam("Produced")))) { + return false; + } } } @@ -116,7 +121,7 @@ public class TriggerTapsForMana extends Trigger { public String getImportantStackObjects(SpellAbility sa) { StringBuilder sb = new StringBuilder(); sb.append(Localizer.getInstance().getMessage("lblTappedForMana")).append(": ").append(sa.getTriggeringObject(AbilityKey.Card)); - sb.append(Localizer.getInstance().getMessage("lblProduced")).append(": ").append(sa.getTriggeringObject(AbilityKey.Produced)); + sb.append(Localizer.getInstance().getMessage("lblProduced")).append(": ").append(toManaString(sa.getTriggeringObject(AbilityKey.Produced).toString())); return sb.toString(); } diff --git a/forge-game/src/main/java/forge/game/zone/Zone.java b/forge-game/src/main/java/forge/game/zone/Zone.java index 9fe62acfc37..5b3304b081f 100644 --- a/forge-game/src/main/java/forge/game/zone/Zone.java +++ b/forge-game/src/main/java/forge/game/zone/Zone.java @@ -28,6 +28,8 @@ import forge.game.card.CardUtil; import forge.game.event.EventValueChangeType; import forge.game.event.GameEventZone; import forge.game.player.Player; +import forge.game.player.PlayerCollection; +import forge.game.player.PlayerController; import forge.util.CollectionSuppliers; import forge.util.MyRandom; import forge.util.maps.EnumMapOfLists; @@ -123,8 +125,22 @@ public class Zone implements java.io.Serializable, Iterable { } } onChanged(); + + if(zoneType == ZoneType.Battlefield && c.isLand()) { + PlayerCollection playerCollection = game.getPlayers(); + int numPlayers = playerCollection.size(); + for (int i = 0; i < numPlayers; i++) { + Player player = playerCollection.get(i); + if(!player.isAI()) { + PlayerController playerControllerHuman = player.getController(); + playerControllerHuman.handleLandPlayed(c,this); + } + } + } + game.fireEvent(new GameEventZone(zoneType, getPlayer(), EventValueChangeType.Added, c)); - } + + } public final boolean contains(final Card c) { return cardList.contains(c); 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 7ecf07dc642..09652cfddfd 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 @@ -246,6 +246,7 @@ public enum CSubmenuPreferences implements ICDoc { initializeMulliganRuleComboBox(); initializeAiProfilesComboBox(); initializeStackAdditionsComboBox(); + initializeLandPlayedComboBox(); initializeColorIdentityCombobox(); initializeAutoYieldModeComboBox(); initializeCounterDisplayTypeComboBox(); @@ -447,7 +448,18 @@ public enum CSubmenuPreferences implements ICDoc { final String selectedItem = this.prefs.getPref(userSetting); panel.setComboBox(comboBox, selectedItem); } - + + private void initializeLandPlayedComboBox() { + final String[] elems = {ForgeConstants.LAND_PLAYED_NOTIFICATION_NEVER, ForgeConstants.LAND_PLAYED_NOTIFICATION_ALWAYS, + ForgeConstants.LAND_PLAYED_NOTIFICATION_ALWAYS_FOR_NONBASIC_LANDS, ForgeConstants.LAND_PLAYED_NOTIFICATION_AI, + ForgeConstants.LAND_PLAYED_NOTIFICATION_AI_FOR_NONBASIC_LANDS}; + final FPref userSetting = FPref.UI_LAND_PLAYED_NOTIFICATION_POLICY; + final FComboBoxPanel panel = this.view.getCbpLandPlayedComboBoxPanel(); + final FComboBox comboBox = createComboBox(elems, userSetting); + final String selectedItem = this.prefs.getPref(userSetting); + panel.setComboBox(comboBox, selectedItem); + } + private void initializeColorIdentityCombobox() { final String[] elems = {ForgeConstants.DISP_CURRENT_COLORS_NEVER, ForgeConstants.DISP_CURRENT_COLORS_CHANGED, ForgeConstants.DISP_CURRENT_COLORS_MULTICOLOR, ForgeConstants.DISP_CURRENT_COLORS_MULTI_OR_CHANGED, 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 103a046b3fd..352d1a69a60 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 @@ -120,6 +120,7 @@ public enum VSubmenuPreferences implements IVSubmenu { private final FComboBoxPanel cbpMulliganRule = new FComboBoxPanel<>(localizer.getMessage("cbpMulliganRule")+":"); private final FComboBoxPanel cbpAiProfiles = new FComboBoxPanel<>(localizer.getMessage("cbpAiProfiles")+":"); private final FComboBoxPanel cbpStackAdditions = new FComboBoxPanel<>(localizer.getMessage("cbpStackAdditions")+":"); + private final FComboBoxPanel cbpLandPlayed = new FComboBoxPanel<>(localizer.getMessage("cbpLandPlayed")+":"); private final FComboBoxPanel cbpDisplayCurrentCardColors = new FComboBoxPanel<>(localizer.getMessage("cbpDisplayCurrentCardColors")+":"); private final FComboBoxPanel cbpAutoYieldMode = new FComboBoxPanel<>(localizer.getMessage("cbpAutoYieldMode")+":"); private final FComboBoxPanel cbpCounterDisplayType = new FComboBoxPanel<>(localizer.getMessage("cbpCounterDisplayType")+":"); @@ -205,6 +206,9 @@ public enum VSubmenuPreferences implements IVSubmenu { pnlPrefs.add(cbpStackAdditions, comboBoxConstraints); pnlPrefs.add(new NoteLabel(localizer.getMessage("nlpStackAdditions")), descriptionConstraints); + + pnlPrefs.add(cbpLandPlayed, comboBoxConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlpLandPlayed")), descriptionConstraints); pnlPrefs.add(cbEnforceDeckLegality, titleConstraints); pnlPrefs.add(new NoteLabel(localizer.getMessage("nlEnforceDeckLegality")), descriptionConstraints); @@ -684,6 +688,10 @@ public enum VSubmenuPreferences implements IVSubmenu { public FComboBoxPanel getCbpStackAdditionsComboBoxPanel() { return cbpStackAdditions; } + + public FComboBoxPanel getCbpLandPlayedComboBoxPanel() { + return cbpLandPlayed; + } public FComboBoxPanel getGameLogVerbosityComboBoxPanel() { return cbpGameLogEntryType; diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index 4d17085fd6b..c0133940a03 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -17,11 +17,40 @@ */ package forge.screens.match; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.event.KeyEvent; +import java.awt.image.BufferedImage; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.atomic.AtomicReference; + +import javax.swing.JMenu; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.KeyStroke; +import javax.swing.SwingUtilities; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; + import com.google.common.base.Function; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; -import forge.*; + +import forge.FThreads; +import forge.GuiBase; +import forge.ImageCache; +import forge.LobbyPlayer; +import forge.Singletons; +import forge.StaticData; import forge.assets.FSkinProp; import forge.card.CardStateName; import forge.control.KeyboardShortcuts; @@ -42,11 +71,28 @@ import forge.game.keyword.Keyword; import forge.game.phase.PhaseType; import forge.game.player.DelayedReveal; import forge.game.player.IHasIcon; +import forge.game.player.Player; import forge.game.player.PlayerView; -import forge.game.spellability.*; +import forge.game.spellability.SpellAbility; +import forge.game.spellability.SpellAbilityStackInstance; +import forge.game.spellability.SpellAbilityView; +import forge.game.spellability.StackItemView; +import forge.game.spellability.TargetChoices; +import forge.game.zone.Zone; import forge.game.zone.ZoneType; -import forge.gui.*; -import forge.gui.framework.*; +import forge.gui.FNetOverlay; +import forge.gui.GuiChoose; +import forge.gui.GuiDialog; +import forge.gui.GuiUtils; +import forge.gui.SOverlayUtils; +import forge.gui.framework.DragCell; +import forge.gui.framework.EDocID; +import forge.gui.framework.FScreen; +import forge.gui.framework.ICDoc; +import forge.gui.framework.IVDoc; +import forge.gui.framework.SDisplayUtil; +import forge.gui.framework.SLayoutIO; +import forge.gui.framework.VEmptyDoc; import forge.item.InventoryItem; import forge.item.PaperCard; import forge.match.AbstractGuiGame; @@ -57,12 +103,23 @@ import forge.player.PlayerZoneUpdates; import forge.properties.ForgeConstants; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; -import forge.screens.match.controllers.*; +import forge.screens.match.controllers.CAntes; +import forge.screens.match.controllers.CCombat; +import forge.screens.match.controllers.CDetailPicture; +import forge.screens.match.controllers.CDev; +import forge.screens.match.controllers.CDock; +import forge.screens.match.controllers.CLog; +import forge.screens.match.controllers.CPrompt; +import forge.screens.match.controllers.CStack; import forge.screens.match.menus.CMatchUIMenus; import forge.screens.match.views.VField; import forge.screens.match.views.VHand; -import forge.toolbox.*; +import forge.toolbox.FButton; +import forge.toolbox.FLabel; +import forge.toolbox.FOptionPane; +import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinImage; +import forge.toolbox.FTextArea; import forge.toolbox.imaging.FImagePanel; import forge.toolbox.imaging.FImagePanel.AutoSizeImageMode; import forge.toolbox.imaging.FImageUtil; @@ -79,17 +136,6 @@ import forge.view.arcane.CardPanel; import forge.view.arcane.FloatingZone; import net.miginfocom.swing.MigLayout; -import javax.swing.*; -import javax.swing.event.PopupMenuEvent; -import javax.swing.event.PopupMenuListener; -import java.awt.*; -import java.awt.event.KeyEvent; -import java.awt.image.BufferedImage; -import java.util.*; -import java.util.List; -import java.util.Map.Entry; -import java.util.concurrent.atomic.AtomicReference; - /** * Constructs instance of match UI controller, used as a single point of * top-level control for child UIs. Tasks targeting the view of individual @@ -1392,4 +1438,57 @@ public final class CMatchUI nextNotifiableStackIndex--; } + @Override + public void handleLandPlayed(Card land, Zone zone) { + Runnable createPopupThread = new Runnable() { + @Override + public void run() { + createLandPopupPanel(land,zone); + } + }; + GuiBase.getInterface().invokeInEdtAndWait(createPopupThread); + } + + private void createLandPopupPanel(Card land, Zone zone) { + + String landPlayedNotificationPolicy = FModel.getPreferences().getPref(FPref.UI_LAND_PLAYED_NOTIFICATION_POLICY); + Player cardController = land.getController(); + boolean isAi = cardController.isAI(); + if(ForgeConstants.LAND_PLAYED_NOTIFICATION_ALWAYS.equals(landPlayedNotificationPolicy) + || (ForgeConstants.LAND_PLAYED_NOTIFICATION_AI.equals(landPlayedNotificationPolicy) && (isAi)) + || (ForgeConstants.LAND_PLAYED_NOTIFICATION_ALWAYS_FOR_NONBASIC_LANDS.equals(landPlayedNotificationPolicy) && !land.isBasicLand()) + || (ForgeConstants.LAND_PLAYED_NOTIFICATION_AI_FOR_NONBASIC_LANDS.equals(landPlayedNotificationPolicy) && !land.isBasicLand()) && (isAi)) { + String title = "Forge"; + List options = ImmutableList.of(Localizer.getInstance().getMessage("lblOK")); + + MigLayout migLayout = new MigLayout("insets 15, left, gap 30, fill"); + JPanel mainPanel = new JPanel(migLayout); + final Dimension parentSize = JOptionPane.getRootFrame().getSize(); + Dimension maxSize = new Dimension(1400, parentSize.height - 100); + mainPanel.setMaximumSize(maxSize); + mainPanel.setOpaque(false); + + int rotation = getRotation(land.getView()); + + FImagePanel imagePanel = new FImagePanel(); + BufferedImage bufferedImage = FImageUtil.getImage(land.getCurrentState().getView()); + imagePanel.setImage(bufferedImage, rotation, AutoSizeImageMode.SOURCE); + int imageWidth = 433; + int imageHeight = 600; + Dimension imagePanelDimension = new Dimension(imageWidth,imageHeight); + imagePanel.setMinimumSize(imagePanelDimension); + + mainPanel.add(imagePanel, "cell 0 0, spany 3"); + + String msg = cardController.toString() + " puts " + land.toString() + " into play into " + zone.toString() + "."; + + final FTextArea prompt1 = new FTextArea(msg); + prompt1.setFont(FSkin.getFont(21)); + prompt1.setAutoSize(true); + prompt1.setMinimumSize(new Dimension(475,200)); + mainPanel.add(prompt1, "cell 1 0, aligny top"); + + FOptionPane.showOptionDialog(null, title, null, mainPanel, options); + } + } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VCombat.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VCombat.java index dfd7e67a2d7..82be2110926 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VCombat.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VCombat.java @@ -36,7 +36,7 @@ public class VCombat implements IVDoc { // Fields used with interface IVDoc private DragCell parentCell; - private final DragTab tab = new DragTab(Localizer.getInstance().getMessage("lblCombat")); + private final DragTab tab = new DragTab(Localizer.getInstance().getMessage("lblCombatTab")); private final SkinnedTextArea tar = new SkinnedTextArea(); @@ -109,7 +109,7 @@ public class VCombat implements IVDoc { // No need to update this unless it's showing if (!this.equals(parentCell.getSelected())) { return; } - tab.setText(cntAttackers > 0 ? (Localizer.getInstance().getMessage("lblCombat") + " : " + cntAttackers) : Localizer.getInstance().getMessage("lblCombat")); + tab.setText(cntAttackers > 0 ? (Localizer.getInstance().getMessage("lblCombatTab") + " : " + cntAttackers) : Localizer.getInstance().getMessage("lblCombatTab")); tar.setText(desc); } } diff --git a/forge-gui-mobile/src/forge/assets/ImageCache.java b/forge-gui-mobile/src/forge/assets/ImageCache.java index 6880658f4f1..bf85d66b8fb 100644 --- a/forge-gui-mobile/src/forge/assets/ImageCache.java +++ b/forge-gui-mobile/src/forge/assets/ImageCache.java @@ -39,7 +39,9 @@ import forge.properties.ForgeConstants; import forge.util.ImageUtil; import org.apache.commons.lang3.StringUtils; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; @@ -77,6 +79,7 @@ public class ImageCache { public static final Texture defaultImage; public static FImage BlackBorder = FSkinImage.IMG_BORDER_BLACK; public static FImage WhiteBorder = FSkinImage.IMG_BORDER_WHITE; + private static final Map Borders = new HashMap<>(); private static boolean imageLoaded, delayLoadRequested; public static void allowSingleLoad() { @@ -99,6 +102,7 @@ public class ImageCache { cache.invalidateAll(); cache.cleanUp(); missingIconKeys.clear(); + Borders.clear(); } public static void disposeTexture(){ @@ -181,6 +185,8 @@ public class ImageCache { if (useDefaultIfNotFound) { image = defaultImage; cache.put(imageKey, defaultImage); + if (Borders.get(image) == null) + Borders.put(image, false); //black border } } return image; @@ -192,8 +198,8 @@ public class ImageCache { e.printStackTrace(); } } - public static TextureRegion croppedBorderImage(Texture image, boolean fullborder) { - if (!fullborder) + public static TextureRegion croppedBorderImage(Texture image) { + if (!image.toString().contains(".fullborder.")) return new TextureRegion(image); float rscale = 0.96f; int rw = Math.round(image.getWidth()*rscale); @@ -202,25 +208,6 @@ public class ImageCache { int ry = Math.round((image.getHeight() - rh)/2f)-2; return new TextureRegion(image, rx, ry, rw, rh); } - public static boolean isWhiteBordered(IPaperCard c) { - if (c == null) - return false; - - CardEdition ed = FModel.getMagicDb().getEditions().get(c.getEdition()); - if (ed != null && ed.isWhiteBorder()) - return true; - return false; - } - public static boolean isWhiteBordered(CardView c) { - if (c == null) - return false; - - CardView.CardStateView state = c.getCurrentState(); - CardEdition ed = FModel.getMagicDb().getEditions().get(state.getSetCode()); - if (ed != null && ed.isWhiteBorder() && state.getFoilIndex() == 0) - return true; - return false; - } public static Color borderColor(IPaperCard c) { if (c == null) return Color.valueOf("#171717"); @@ -250,38 +237,24 @@ public class ImageCache { return 1; return 0; } - public static boolean isExtendedArt(CardView c) { - if (c == null) - return false; - - CardView.CardStateView state = c.getCurrentState(); - if (state.getSetCode().contains("MPS_")) - return true; - if (state.getSetCode().equalsIgnoreCase("UST")) - return true; - return false; + public static boolean isBorderlessCardArt(Texture t) { + return ImageLoader.isBorderless(t); } - public static boolean isExtendedArt(IPaperCard c) { - if (c == null) - return false; - - if (c.getEdition().contains("MPS_")) - return true; - if (c.getEdition().equalsIgnoreCase("UST")) - return true; - return false; + public static void updateBorders(Texture t, boolean val){ + Borders.put(t, val); } - public static FImage getBorderImage(CardView c, boolean canshow) { + public static FImage getBorder(Texture t) { + if (Borders.get(t) == null) + return BlackBorder; + return Borders.get(t) ? WhiteBorder : BlackBorder; + } + public static FImage getBorderImage(Texture t, boolean canshow) { if (!canshow) return BlackBorder; - if (isWhiteBordered(c)) - return WhiteBorder; - return BlackBorder; + return getBorder(t); } - public static FImage getBorderImage(IPaperCard c) { - if (isWhiteBordered(c)) - return WhiteBorder; - return BlackBorder; + public static FImage getBorderImage(Texture t) { + return getBorder(t); } public static Color getTint(CardView c) { if (c == null) diff --git a/forge-gui-mobile/src/forge/assets/ImageLoader.java b/forge-gui-mobile/src/forge/assets/ImageLoader.java index 0137daa9f5e..064300ae635 100644 --- a/forge-gui-mobile/src/forge/assets/ImageLoader.java +++ b/forge-gui-mobile/src/forge/assets/ImageLoader.java @@ -1,6 +1,7 @@ package forge.assets; import java.io.File; +import java.util.ArrayList; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.Color; @@ -13,24 +14,155 @@ import forge.FThreads; import forge.Forge; import forge.ImageKeys; +import forge.util.TextUtil; + +import static forge.assets.ImageCache.croppedBorderImage; final class ImageLoader extends CacheLoader { + private static ArrayList borderlessCardlistKey = new ArrayList() { + {//TODO: load the values from text list instead of hardcoded + add("2XM/Academy Ruins2.fullborder"); + add("2XM/Atraxa, Praetors' Voice2.fullborder"); + add("2XM/Avacyn, Angel of Hope2.fullborder"); + add("2XM/Batterskull2.fullborder"); + add("2XM/Blightsteel Colossus2.fullborder"); + add("2XM/Blood Moon2.fullborder"); + add("2XM/Brainstorm2.fullborder"); + add("2XM/Chrome Mox2.fullborder"); + add("2XM/Council's Judgment2.fullborder"); + add("2XM/Crop Rotation2.fullborder"); + add("2XM/Cyclonic Rift2.fullborder"); + add("2XM/Dark Confidant2.fullborder"); + add("2XM/Doubling Season2.fullborder"); + add("2XM/Expedition Map2.fullborder"); + add("2XM/Exploration2.fullborder"); + add("2XM/Fatal Push2.fullborder"); + add("2XM/Force of Will2.fullborder"); + add("2XM/Goblin Guide2.fullborder"); + add("2XM/Jace, the Mind Sculptor2.fullborder"); + add("2XM/Kaalia of the Vast2.fullborder"); + add("2XM/Karn Liberated2.fullborder"); + add("2XM/Lightning Greaves2.fullborder"); + add("2XM/Mana Crypt2.fullborder"); + add("2XM/Meddling Mage2.fullborder"); + add("2XM/Mox Opal2.fullborder"); + add("2XM/Noble Hierarch2.fullborder"); + add("2XM/Phyrexian Metamorph2.fullborder"); + add("2XM/Sneak Attack2.fullborder"); + add("2XM/Stoneforge Mystic2.fullborder"); + add("2XM/Sword of Body and Mind2.fullborder"); + add("2XM/Sword of Feast and Famine2.fullborder"); + add("2XM/Sword of Fire and Ice2.fullborder"); + add("2XM/Sword of Light and Shadow2.fullborder"); + add("2XM/Sword of War and Peace2.fullborder"); + add("2XM/Thoughtseize2.fullborder"); + add("2XM/Toxic Deluge2.fullborder"); + add("2XM/Urza's Mine2.fullborder"); + add("2XM/Urza's Power Plant2.fullborder"); + add("2XM/Urza's Tower2.fullborder"); + add("2XM/Wurmcoil Engine2.fullborder"); + add("ELD/Garruk, Cursed Huntsman2.fullborder"); + add("ELD/Oko, Thief of Crowns2.fullborder"); + add("ELD/The Royal Scions2.fullborder"); + add("IKO/Brokkos, Apex of Forever2.fullborder"); + add("IKO/Brokkos, Apex of Forever3.fullborder"); + add("IKO/Crystalline Giant3.fullborder"); + add("IKO/Cubwarden2.fullborder"); + add("IKO/Dirge Bat2.fullborder"); + add("IKO/Dirge Bat3.fullborder"); + add("IKO/Everquill Phoenix2.fullborder"); + add("IKO/Everquill Phoenix3.fullborder"); + add("IKO/Gemrazer2.fullborder"); + add("IKO/Gemrazer3.fullborder"); + add("IKO/Gyruda, Doom of Depths3.fullborder"); + add("IKO/Huntmaster Liger2.fullborder"); + add("IKO/Huntmaster Liger3.fullborder"); + add("IKO/Illuna, Apex of Wishes2.fullborder"); + add("IKO/Illuna, Apex of Wishes3.fullborder"); + add("IKO/Indatha Triome2.fullborder"); + add("IKO/Ketria Triome2.fullborder"); + add("IKO/Lukka, Coppercoat Outcast2.fullborder"); + add("IKO/Luminous Broodmoth3.fullborder"); + add("IKO/Mysterious Egg2.fullborder"); + add("IKO/Narset of the Ancient Way2.fullborder"); + add("IKO/Nethroi, Apex of Death2.fullborder"); + add("IKO/Nethroi, Apex of Death3.fullborder"); + add("IKO/Pollywog Symbiote2.fullborder"); + add("IKO/Raugrin Triome2.fullborder"); + add("IKO/Savai Triome2.fullborder"); + add("IKO/Sea-Dasher Octopus2.fullborder"); + add("IKO/Snapdax, Apex of the Hunt2.fullborder"); + add("IKO/Snapdax, Apex of the Hunt3.fullborder"); + add("IKO/Sprite Dragon3.fullborder"); + add("IKO/Titanoth Rex2.fullborder"); + add("IKO/Vadrok, Apex of Thunder2.fullborder"); + add("IKO/Vadrok, Apex of Thunder3.fullborder"); + add("IKO/Vivien, Monsters' Advocate2.fullborder"); + add("IKO/Void Beckoner2.fullborder"); + add("IKO/Yidaro, Wandering Monster3.fullborder"); + add("IKO/Zagoth Triome2.fullborder"); + add("IKO/Zilortha, Strength Incarnate.fullborder"); + add("M21/Basri Ket2.fullborder"); + add("M21/Chandra, Heart of Fire2.fullborder"); + add("M21/Containment Priest2.fullborder"); + add("M21/Cultivate2.fullborder"); + add("M21/Garruk, Unleashed2.fullborder"); + add("M21/Grim Tutor2.fullborder"); + add("M21/Liliana, Waker of the Dead2.fullborder"); + add("M21/Massacre Wurm2.fullborder"); + add("M21/Scavenging Ooze2.fullborder"); + add("M21/Solemn Simulacrum2.fullborder"); + add("M21/Teferi, Master of Time2.fullborder"); + add("M21/Ugin, the Spirit Dragon2.fullborder"); + add("M21/Ugin, the Spirit Dragon3.fullborder"); + add("PLGS/Hangarback Walker.fullborder"); + add("SLD/Acidic Slime.fullborder"); + add("SLD/Captain Sisay.fullborder"); + add("SLD/Meren of Clan Nel Toth.fullborder"); + add("SLD/Narset, Enlightened Master.fullborder"); + add("SLD/Necrotic Ooze.fullborder"); + add("SLD/Oona, Queen of the Fae.fullborder"); + add("SLD/Saskia the Unyielding.fullborder"); + add("SLD/The Mimeoplasm.fullborder"); + add("SLD/Voidslime.fullborder"); + add("THB/Ashiok, Nightmare Muse2.fullborder"); + add("THB/Calix, Destiny's Hand2.fullborder"); + add("THB/Elspeth, Sun's Nemesis2.fullborder"); + add("UST/Forest.fullborder"); + add("UST/Island.fullborder"); + add("UST/Mountain.fullborder"); + add("UST/Plains.fullborder"); + add("UST/Swamp.fullborder"); + add("ZNR/Boulderloft Pathway2.fullborder"); + add("ZNR/Branchloft Pathway2.fullborder"); + add("ZNR/Brightclimb Pathway2.fullborder"); + add("ZNR/Clearwater Pathway2.fullborder"); + add("ZNR/Cragcrown Pathway2.fullborder"); + add("ZNR/Grimclimb Pathway2.fullborder"); + add("ZNR/Jace, Mirror Mage2.fullborder"); + add("ZNR/Lavaglide Pathway2.fullborder"); + add("ZNR/Murkwater Pathway2.fullborder"); + add("ZNR/Nahiri, Heir of the Ancients2.fullborder"); + add("ZNR/Needleverge Pathway2.fullborder"); + add("ZNR/Nissa of Shadowed Boughs2.fullborder"); + add("ZNR/Pillarverge Pathway2.fullborder"); + add("ZNR/Riverglide Pathway2.fullborder"); + add("ZNR/Timbercrown Pathway2.fullborder"); + } + }; + Texture n; @Override public Texture load(String key) { - boolean extendedArt = false; + boolean extendedArt = isBorderless(key); boolean textureFilter = Forge.isTextureFilteringEnabled(); - if (key.length() > 4){ - if ((key.substring(0,4).contains("MPS_"))) //MPS_ sets - extendedArt = true; - else if ((key.substring(0,3).contains("UST"))) //Unstable Set - extendedArt = true; - } File file = ImageKeys.getImageFile(key); if (file != null) { FileHandle fh = new FileHandle(file); try { Texture t = new Texture(fh, textureFilter); + //update + ImageCache.updateBorders(t, extendedArt ? false: isCloserToWhite(getpixelColor(t))); if (textureFilter) t.setFilter(Texture.TextureFilter.MipMapLinearLinear, Texture.TextureFilter.Linear); if (extendedArt) @@ -106,4 +238,44 @@ final class ImageLoader extends CacheLoader { } } } + + public boolean isBorderless(String imagekey) { + if (imagekey.length() > 7) { + if ((!imagekey.substring(0, 7).contains("MPS_KLD"))&&(imagekey.substring(0, 4).contains("MPS_"))) //MPS_ sets except MPD_KLD + return true; + } + return borderlessCardlistKey.contains(TextUtil.fastReplace(imagekey,".full",".fullborder")); + } + + public static boolean isBorderless(Texture t) { + //generated texture/pixmap? + if (t.toString().contains("com.badlogic.gdx.graphics.Texture@")) + return true; + for (String key : borderlessCardlistKey) { + if (t.toString().contains(key)) + return true; + } + return false; + } + + public static String getpixelColor(Texture i) { + if (!i.getTextureData().isPrepared()) { + i.getTextureData().prepare(); //prepare texture + } + //get pixmap from texture data + Pixmap pixmap = i.getTextureData().consumePixmap(); + //get pixel color from x,y texture coordinate based on the image fullborder or not + Color color = new Color(pixmap.getPixel(croppedBorderImage(i).getRegionX()+1, croppedBorderImage(i).getRegionY()+1)); + pixmap.dispose(); + return color.toString(); + } + public static boolean isCloserToWhite(String c){ + if (c == null || c == "") + return false; + int c_r = Integer.parseInt(c.substring(0,2),16); + int c_g = Integer.parseInt(c.substring(2,4),16); + int c_b = Integer.parseInt(c.substring(4,6),16); + int brightness = ((c_r * 299) + (c_g * 587) + (c_b * 114)) / 1000; + return brightness > 155; + } } diff --git a/forge-gui-mobile/src/forge/card/CardImage.java b/forge-gui-mobile/src/forge/card/CardImage.java index ef841355c75..a15772a51d7 100644 --- a/forge-gui-mobile/src/forge/card/CardImage.java +++ b/forge-gui-mobile/src/forge/card/CardImage.java @@ -49,13 +49,12 @@ public class CardImage implements FImage { } else { if (Forge.enableUIMask) { - boolean fullborder = image.toString().contains(".fullborder."); - if (ImageCache.isExtendedArt(card)) + if (ImageCache.isBorderlessCardArt(image)) g.drawImage(image, x, y, w, h); else { float radius = (h - w)/8; g.drawfillBorder(3, ImageCache.borderColor(card), x, y, w, h, radius); - g.drawImage(ImageCache.croppedBorderImage(image, fullborder), x+radius/2.2f, y+radius/2, w*0.96f, h*0.96f); + g.drawImage(ImageCache.croppedBorderImage(image), x+radius/2.2f, y+radius/2, w*0.96f, h*0.96f); } } else diff --git a/forge-gui-mobile/src/forge/card/CardImageRenderer.java b/forge-gui-mobile/src/forge/card/CardImageRenderer.java index 969110d178c..0295d1be631 100644 --- a/forge-gui-mobile/src/forge/card/CardImageRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardImageRenderer.java @@ -348,7 +348,6 @@ public class CardImageRenderer { if (image == ImageCache.defaultImage) { //support drawing card image manually if card image not found drawCardImage(g, card, altState, x, y, w, h, CardStackPosition.Top); } else { - boolean fullborder = image.toString().contains(".fullborder."); float radius = (h - w)/8; float wh_Adj = ForgeConstants.isGdxPortLandscape && isCurrentCard ? 1.38f:1.0f; float new_w = w*wh_Adj; @@ -367,32 +366,32 @@ public class CardImageRenderer { } if (rotatePlane && (card.getCurrentState().isPhenomenon() || card.getCurrentState().isPlane())) { if (Forge.enableUIMask){ - if (ImageCache.isExtendedArt(card)) + if (ImageCache.isBorderlessCardArt(image)) g.drawRotatedImage(image, new_x, new_y, new_w, new_h, new_x + new_w / 2, new_y + new_h / 2, -90); else { g.drawRotatedImage(FSkin.getBorders().get(0), new_x, new_y, new_w, new_h, new_x + new_w / 2, new_y + new_h / 2, -90); - g.drawRotatedImage(ImageCache.croppedBorderImage(image, fullborder), new_x+radius/2-minusxy, new_y+radius/2-minusxy, new_w*croppedArea, new_h*croppedArea, (new_x+radius/2-minusxy) + (new_w*croppedArea) / 2, (new_y+radius/2-minusxy) + (new_h*croppedArea) / 2, -90); + g.drawRotatedImage(ImageCache.croppedBorderImage(image), new_x+radius/2-minusxy, new_y+radius/2-minusxy, new_w*croppedArea, new_h*croppedArea, (new_x+radius/2-minusxy) + (new_w*croppedArea) / 2, (new_y+radius/2-minusxy) + (new_h*croppedArea) / 2, -90); } } else g.drawRotatedImage(image, new_x, new_y, new_w, new_h, new_x + new_w / 2, new_y + new_h / 2, -90); } else if (rotateSplit && isCurrentCard && card.isSplitCard() && canshow) { boolean isAftermath = card.getText().contains("Aftermath") || card.getAlternateState().getOracleText().contains("Aftermath"); if (Forge.enableUIMask) { - if (ImageCache.isExtendedArt(card)) + if (ImageCache.isBorderlessCardArt(image)) g.drawRotatedImage(image, new_x, new_y, new_w, new_h, new_x + new_w / 2, new_y + new_h / 2, isAftermath ? 90 : -90); else { g.drawRotatedImage(FSkin.getBorders().get(ImageCache.getFSkinBorders(card)), new_x, new_y, new_w, new_h, new_x + new_w / 2, new_y + new_h / 2, isAftermath ? 90 : -90); - g.drawRotatedImage(ImageCache.croppedBorderImage(image, fullborder), new_x + radius / 2-minusxy, new_y + radius / 2-minusxy, new_w * croppedArea, new_h * croppedArea, (new_x + radius / 2-minusxy) + (new_w * croppedArea) / 2, (new_y + radius / 2-minusxy) + (new_h * croppedArea) / 2, isAftermath ? 90 : -90); + g.drawRotatedImage(ImageCache.croppedBorderImage(image), new_x + radius / 2-minusxy, new_y + radius / 2-minusxy, new_w * croppedArea, new_h * croppedArea, (new_x + radius / 2-minusxy) + (new_w * croppedArea) / 2, (new_y + radius / 2-minusxy) + (new_h * croppedArea) / 2, isAftermath ? 90 : -90); } } else g.drawRotatedImage(image, new_x, new_y, new_w, new_h, new_x + new_w / 2, new_y + new_h / 2, isAftermath ? 90 : -90); } else { if (Forge.enableUIMask && canshow) { - if (ImageCache.isExtendedArt(card)) + if (ImageCache.isBorderlessCardArt(image)) g.drawImage(image, x, y, w, h); else { - g.drawImage(ImageCache.getBorderImage(card, canshow), x, y, w, h); - g.drawImage(ImageCache.croppedBorderImage(image, fullborder), x + radius / 2.4f-minusxy, y + radius / 2-minusxy, w * croppedArea, h * croppedArea); + g.drawImage(ImageCache.getBorderImage(image, canshow), x, y, w, h); + g.drawImage(ImageCache.croppedBorderImage(image), x + radius / 2.4f-minusxy, y + radius / 2-minusxy, w * croppedArea, h * croppedArea); } } else { if (canshow) diff --git a/forge-gui-mobile/src/forge/card/CardRenderer.java b/forge-gui-mobile/src/forge/card/CardRenderer.java index 46133714499..3eb6ed751e2 100644 --- a/forge-gui-mobile/src/forge/card/CardRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardRenderer.java @@ -459,13 +459,12 @@ public class CardRenderer { if (image == ImageCache.defaultImage) { CardImageRenderer.drawCardImage(g, CardView.getCardForUi(pc), false, x, y, w, h, pos); } else { - boolean fullborder = image.toString().contains(".fullborder."); if (Forge.enableUIMask) { - if (ImageCache.isExtendedArt(pc)) + if (ImageCache.isBorderlessCardArt(image)) g.drawImage(image, x, y, w, h); else { - g.drawImage(ImageCache.getBorderImage(pc), x, y, w, h); - g.drawImage(ImageCache.croppedBorderImage(image, fullborder), x + radius / 2.4f-minusxy, y + radius / 2-minusxy, w * croppedArea, h * croppedArea); + g.drawImage(ImageCache.getBorderImage(image), x, y, w, h); + g.drawImage(ImageCache.croppedBorderImage(image), x + radius / 2.4f-minusxy, y + radius / 2-minusxy, w * croppedArea, h * croppedArea); } } else g.drawImage(image, x, y, w, h); @@ -499,26 +498,25 @@ public class CardRenderer { if (image == ImageCache.defaultImage) { CardImageRenderer.drawCardImage(g, card, false, x, y, w, h, pos); } else { - boolean fullborder = image.toString().contains(".fullborder."); if(FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_ROTATE_PLANE_OR_PHENOMENON) && (card.getCurrentState().isPhenomenon() || card.getCurrentState().isPlane()) && rotate){ if (Forge.enableUIMask) { - if (ImageCache.isExtendedArt(card)) + if (ImageCache.isBorderlessCardArt(image)) g.drawRotatedImage(image, x, y, w, h, x + w / 2, y + h / 2, -90); else { g.drawRotatedImage(FSkin.getBorders().get(0), x, y, w, h, x + w / 2, y + h / 2, -90); - g.drawRotatedImage(ImageCache.croppedBorderImage(image, fullborder), x+radius/2.3f-minusxy, y+radius/2-minusxy, w*croppedArea, h*croppedArea, (x+radius/2.3f-minusxy) + (w*croppedArea) / 2, (y+radius/2-minusxy) + (h*croppedArea) / 2, -90); + g.drawRotatedImage(ImageCache.croppedBorderImage(image), x+radius/2.3f-minusxy, y+radius/2-minusxy, w*croppedArea, h*croppedArea, (x+radius/2.3f-minusxy) + (w*croppedArea) / 2, (y+radius/2-minusxy) + (h*croppedArea) / 2, -90); } } else g.drawRotatedImage(image, x, y, w, h, x + w / 2, y + h / 2, -90); } else { if (Forge.enableUIMask && canshow) { - if (ImageCache.isExtendedArt(card)) + if (ImageCache.isBorderlessCardArt(image)) g.drawImage(image, x, y, w, h); else { boolean t = (card.getCurrentState().getOriginalColors() != card.getCurrentState().getColors()) || card.getCurrentState().hasChangeColors(); - g.drawBorderImage(ImageCache.getBorderImage(card, canshow), ImageCache.getTint(card), x, y, w, h, t); //tint check for changed colors - g.drawImage(ImageCache.croppedBorderImage(image, fullborder), x + radius / 2.4f-minusxy, y + radius / 2-minusxy, w * croppedArea, h * croppedArea); + g.drawBorderImage(ImageCache.getBorderImage(image, canshow), ImageCache.getTint(card), x, y, w, h, t); //tint check for changed colors + g.drawImage(ImageCache.croppedBorderImage(image), x + radius / 2.4f-minusxy, y + radius / 2-minusxy, w * croppedArea, h * croppedArea); } } else { if (canshow) diff --git a/forge-gui/res/blockdata/blocks.txt b/forge-gui/res/blockdata/blocks.txt index 6909006ea72..f54b17e967c 100644 --- a/forge-gui/res/blockdata/blocks.txt +++ b/forge-gui/res/blockdata/blocks.txt @@ -90,3 +90,4 @@ Core Set 2021, 3/6/M21, M21 Jumpstart, -/2/JMP, Meta-Choose(S(JMP Above the Clouds 1)Above the Clouds 1;S(JMP Above the Clouds 2)Above the Clouds 2;S(JMP Above the Clouds 3)Above the Clouds 3;S(JMP Above the Clouds 4)Above the Clouds 4;S(JMP Angels 1)Angels 1;S(JMP Angels 2)Angels 2;S(JMP Archaeology 1)Archaeology 1;S(JMP Archaeology 2)Archaeology 2;S(JMP Archaeology 3)Archaeology 3;S(JMP Archaeology 4)Archaeology 4;;S(JMP Basri)Basri;S(JMP Cats 1)Cats 1;S(JMP Cats 2)Cats 2;S(JMP Chandra)Chandra;S(JMP Devilish 1)Devilish 1;S(JMP Devilish 2)Devilish 2;S(JMP Devilish 3)Devilish 3;S(JMP Devilish 4)Devilish 4;S(JMP Dinosaurs 1)Dinosaurs 1;S(JMP Dinosaurs 2)Dinosaurs 2;S(JMP Dinosaurs 3)Dinosaurs 3;S(JMP Dinosaurs 4)Dinosaurs 4;S(JMP Discarding 1)Discarding 1;S(JMP Discarding 2)Discarding 2;S(JMP Doctor 1)Doctor 1;S(JMP Doctor 2)Doctor 2;S(JMP Doctor 3)Doctor 3;S(JMP Doctor 4)Doctor 4;S(JMP Dogs 1)Dogs 1;S(JMP Dogs 2)Dogs 2;S(JMP Dragons 1)Dragons 1;S(JMP Dragons 2)Dragons 2;S(JMP Elves 1)Elves 1;S(JMP Elves 2)Elves 2;S(JMP Enchanted 1)Enchanted 1;S(JMP Enchanted 2)Enchanted 2;S(JMP Feathered Friends 1)Feathered Friends 1;S(JMP Feathered Friends 2)Feathered Friends 2;S(JMP Feathered Friends 3)Feathered Friends 3;S(JMP Feathered Friends 4)Feathered Friends 4;S(JMP Garruk)Garruk;S(JMP Goblins 1)Goblins 1;S(JMP Goblins 2)Goblins 2;S(JMP Goblins 3)Goblins 3;S(JMP Goblins 4)Goblins 4;S(JMP Heavily Armored 1)Heavily Armored 1;S(JMP Heavily Armored 2)Heavily Armored 2;S(JMP Heavily Armored 3)Heavily Armored 3;S(JMP Heavily Armored 4)Heavily Armored 4;S(JMP Lands 1)Lands 1;S(JMP Lands 2)Lands 2;S(JMP Legion 1)Legion 1;S(JMP Legion 2)Legion 2;S(JMP Legion 3)Legion 3;S(JMP Legion 4)Legion 4;S(JMP Lightning 1)Lightning 1;S(JMP Lightning 2)Lightning 2;S(JMP Liliana)Liliana;S(JMP Milling)Milling;S(JMP Minions 1)Minions 1;S(JMP Minions 2)Minions 2;S(JMP Minions 3)Minions 3;S(JMP Minions 4)Minions 4;S(JMP Minotaurs 1)Minotaurs 1;S(JMP Minotaurs 2)Minotaurs 2;S(JMP Phyrexian)Phyrexian;S(JMP Pirates 1)Pirates 1;S(JMP Pirates 2)Pirates 2;S(JMP Plus One 1)Plus One 1;S(JMP Plus One 2)Plus One 2;S(JMP Plus One 3)Plus One 3;S(JMP Plus One 4)Plus One 4;S(JMP Predatory 1)Predatory 1;S(JMP Predatory 2)Predatory 2;S(JMP Predatory 3)Predatory 3;S(JMP Predatory 4)Predatory 4;S(JMP Rainbow)Rainbow;S(JMP Reanimated 1)Reanimated 1;S(JMP Reanimated 2)Reanimated 2;S(JMP Reanimated 3)Reanimated 3;S(JMP Reanimated 4)Reanimated 4;S(JMP Rogues 1)Rogues 1;S(JMP Rogues 2)Rogues 2;S(JMP Seismic)Seismic;S(JMP Smashing 1)Smashing 1;S(JMP Smashing 2)Smashing 2;S(JMP Smashing 3)Smashing 3;S(JMP Smashing 4)Smashing 4;S(JMP Spellcasting 1)Spellcasting 1;S(JMP Spellcasting 2)Spellcasting 2;S(JMP Spellcasting 3)Spellcasting 3;S(JMP Spellcasting 4)Spellcasting 4;S(JMP Spirits 1)Spirits 1;S(JMP Spirits 2)Spirits 2;S(JMP Spooky 1)Spooky 1;S(JMP Spooky 2)Spooky 2;S(JMP Spooky 3)Spooky 3;S(JMP Spooky 4)Spooky 4;S(JMP Teferi)Teferi;S(JMP Tree Hugging 1)Tree Hugging 1;S(JMP Tree Hugging 2)Tree Hugging 2;S(JMP Tree Hugging 3)Tree Hugging 3;S(JMP Tree Hugging 4)Tree Hugging 4;S(JMP Under the Sea 1)Under the Sea 1;S(JMP Under the Sea 2)Under the Sea 2;S(JMP Unicorns)Unicorns;S(JMP Vampires 1)Vampires 1;S(JMP Vampires 2)Vampires 2;S(JMP Vampires 3)Vampires 3;S(JMP Vampires 4)Vampires 4;S(JMP Walls)Walls;S(JMP Well-Read 1)Well-Read 1;S(JMP Well-Read 2)Well-Read 2;S(JMP Well-Read 3)Well-Read 3;S(JMP Well-Read 4)Well-Read 4;S(JMP Witchcraft 1)Witchcraft 1;S(JMP Witchcraft 2)Witchcraft 2;S(JMP Wizards 1)Wizards 1;S(JMP Wizards 2)Wizards 2;S(JMP Wizards 3)Wizards 3;S(JMP Wizards 4)Wizards 4)Themes Amonkhet Remastered, 3/6/AKR, AKR Double Masters, 3/6/2XM, 2XM +Zendikar Rising, 3/6/ZNR, ZNR \ No newline at end of file diff --git a/forge-gui/res/blockdata/boosterboxes.txt b/forge-gui/res/blockdata/boosterboxes.txt index 175265439c1..b142fc60821 100644 --- a/forge-gui/res/blockdata/boosterboxes.txt +++ b/forge-gui/res/blockdata/boosterboxes.txt @@ -113,4 +113,5 @@ ELD: 36 Boosters THB: 36 Boosters MB1: 24 Boosters IKO: 36 Boosters -M21: 36 Boosters \ No newline at end of file +M21: 36 Boosters +ZNR: 36 Boosters \ No newline at end of file diff --git a/forge-gui/res/blockdata/fatpacks.txt b/forge-gui/res/blockdata/fatpacks.txt index 2b7569fbb43..8cea55a24af 100644 --- a/forge-gui/res/blockdata/fatpacks.txt +++ b/forge-gui/res/blockdata/fatpacks.txt @@ -79,4 +79,6 @@ THB: 10 Boosters, 40 BasicLands IKO: 10 Boosters, 40 BasicLands #needs to be 20 BasicLands, 20 Foil BasicLands, 1 Colossification+|IKO|3 M21: 10 Boosters, 40 BasicLands -#needs to be 20 BasicLands, 20 Foil BasicLands, 1 Pack Leader+|M21|3 \ No newline at end of file +#needs to be 20 BasicLands, 20 Foil BasicLands, 1 Pack Leader+|M21|3 +ZNR: 10 Boosters, 40 BasicLands +#needs to be 20 BasicLands, 20 Foil BasicLands, 1 Charix, the Raging Isle+|ZNR|3 \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/acquisitions_expert.txt b/forge-gui/res/cardsfolder/a/acquisitions_expert.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/acquisitions_expert.txt rename to forge-gui/res/cardsfolder/a/acquisitions_expert.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/adventure_awaits.txt b/forge-gui/res/cardsfolder/a/adventure_awaits.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/adventure_awaits.txt rename to forge-gui/res/cardsfolder/a/adventure_awaits.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/agadeems_awakening_agadeem_the_undercrypt.txt b/forge-gui/res/cardsfolder/a/agadeems_awakening_agadeem_the_undercrypt.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/agadeems_awakening_agadeem_the_undercrypt.txt rename to forge-gui/res/cardsfolder/a/agadeems_awakening_agadeem_the_undercrypt.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/akiri_fearless_voyager.txt b/forge-gui/res/cardsfolder/a/akiri_fearless_voyager.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/akiri_fearless_voyager.txt rename to forge-gui/res/cardsfolder/a/akiri_fearless_voyager.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/akoum_hellhound.txt b/forge-gui/res/cardsfolder/a/akoum_hellhound.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/akoum_hellhound.txt rename to forge-gui/res/cardsfolder/a/akoum_hellhound.txt diff --git a/forge-gui/res/cardsfolder/a/akoum_warrior_akoum_teeth.txt b/forge-gui/res/cardsfolder/a/akoum_warrior_akoum_teeth.txt new file mode 100644 index 00000000000..b6528587290 --- /dev/null +++ b/forge-gui/res/cardsfolder/a/akoum_warrior_akoum_teeth.txt @@ -0,0 +1,16 @@ +Name:Akoum Warrior +ManaCost:5 R +Types:Creature Minotaur Warrior +PT:4/5 +K:Trample +AlternateMode:Modal +Oracle:Trample + +ALTERNATE + +Name:Akoum Teeth +ManaCost:no cost +Types:Land +K:CARDNAME enters the battlefield tapped. +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +Oracle:Akoum Teeth enters the battlefield tapped.\n{T}: Add {R}. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/allied_assault.txt b/forge-gui/res/cardsfolder/a/allied_assault.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/allied_assault.txt rename to forge-gui/res/cardsfolder/a/allied_assault.txt diff --git a/forge-gui/res/cardsfolder/a/ancient_greenwarden.txt b/forge-gui/res/cardsfolder/a/ancient_greenwarden.txt new file mode 100755 index 00000000000..23c4fd8f267 --- /dev/null +++ b/forge-gui/res/cardsfolder/a/ancient_greenwarden.txt @@ -0,0 +1,8 @@ +Name:Ancient Greenwarden +ManaCost:4 G G +Types:Creature Elemental +PT:5/7 +K:Reach +S:Mode$ Continuous | Affected$ Land.YouCtrl | MayPlay$ True | AffectedZone$ Graveyard | Description$ You may play lands from your graveyard. +K:Panharmonicon:Land:If a land entering the battlefield causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. +Oracle:Reach\nYou may play lands from your graveyard.\nIf a land entering the battlefield causes a triggered ability of a permanent you control to trigger, that ability triggers an additional time. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/angel_of_destiny.txt b/forge-gui/res/cardsfolder/a/angel_of_destiny.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/angel_of_destiny.txt rename to forge-gui/res/cardsfolder/a/angel_of_destiny.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/angelheart_protector.txt b/forge-gui/res/cardsfolder/a/angelheart_protector.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/angelheart_protector.txt rename to forge-gui/res/cardsfolder/a/angelheart_protector.txt diff --git a/forge-gui/res/cardsfolder/a/anowon_the_ruin_thief.txt b/forge-gui/res/cardsfolder/a/anowon_the_ruin_thief.txt new file mode 100644 index 00000000000..28f04968100 --- /dev/null +++ b/forge-gui/res/cardsfolder/a/anowon_the_ruin_thief.txt @@ -0,0 +1,13 @@ +Name:Anowon, the Ruin Thief +ManaCost:2 U B +Types:Legendary Creature Vampire Rogue +PT:2/4 +S:Mode$ Continuous | Affected$ Rogue.Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Other Rogues you control get +1/+1. +T:Mode$ DamageDoneOnce | CombatDamage$ True | ValidSource$ Rogue.YouCtrl | ValidTarget$ Player | TriggerZones$ Battlefield | Execute$ TrigMill | TriggerDescription$ Whenever one or more Rogues you control deal combat damage to a player, that player mills a card for each 1 damage dealt to them. If the player mills at least one creature card this way, you draw a card. (To mill a card, a player puts the top card of their library into their graveyard.) +SVar:TrigMill:DB$ Mill | Defined$ TriggeredTarget | NumCards$ X | References$ X | RememberMilled$ True | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Creature | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:TriggerCount$DamageAmount +DeckNeeds:Type$Rogue +DeckHas:Ability$Mill +Oracle:Other Rogues you control get +1/+1.\nWhenever one or more Rogues you control deal combat damage to a player, that player mills a card for each 1 damage dealt to them. If the player mills at least one creature card this way, you draw a card. (To mill a card, a player puts the top card of their library into their graveyard.) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/anticognition.txt b/forge-gui/res/cardsfolder/a/anticognition.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/anticognition.txt rename to forge-gui/res/cardsfolder/a/anticognition.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/archon_of_emeria.txt b/forge-gui/res/cardsfolder/a/archon_of_emeria.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/archon_of_emeria.txt rename to forge-gui/res/cardsfolder/a/archon_of_emeria.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/archpriest_of_iona.txt b/forge-gui/res/cardsfolder/a/archpriest_of_iona.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/archpriest_of_iona.txt rename to forge-gui/res/cardsfolder/a/archpriest_of_iona.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/ardent_electromancer.txt b/forge-gui/res/cardsfolder/a/ardent_electromancer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/ardent_electromancer.txt rename to forge-gui/res/cardsfolder/a/ardent_electromancer.txt diff --git a/forge-gui/res/cardsfolder/a/ashaya_soul_of_the_wild.txt b/forge-gui/res/cardsfolder/a/ashaya_soul_of_the_wild.txt new file mode 100755 index 00000000000..dfd02eb91d2 --- /dev/null +++ b/forge-gui/res/cardsfolder/a/ashaya_soul_of_the_wild.txt @@ -0,0 +1,12 @@ +Name:Ashaya, Soul of the Wild +ManaCost:3 G G +Types:Legendary Creature Elemental +PT:*/* +S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to the number of lands you control. +S:Mode$ Continuous | Affected$ Creature.nonToken+YouCtrl | AddType$ Forest & Land | Description$ Nontoken creatures you control are Forest lands in addition to their other types. (They're still affected by summoning sickness.) +SVar:X:Count$Valid Land.YouCtrl +SVar:Y:Count$Valid Creature.nonToken+YouCtrl +SVar:Z:SVar$X/Plus.Y +SVar:NeedsToPlayVar:Z GE4 +SVar:BuffedBy:Land,Creature +Oracle:Ashaya, Soul of the Wild's power and toughness are each equal to the number of lands you control.\nNontoken creatures you control are Forest lands in addition to their other types. (They're still affected by summoning sickness.) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/attended_healer.txt b/forge-gui/res/cardsfolder/a/attended_healer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/attended_healer.txt rename to forge-gui/res/cardsfolder/a/attended_healer.txt diff --git a/forge-gui/res/cardsfolder/a/azorius_justiciar.txt b/forge-gui/res/cardsfolder/a/azorius_justiciar.txt index 3cf3a514976..87cca6176bd 100644 --- a/forge-gui/res/cardsfolder/a/azorius_justiciar.txt +++ b/forge-gui/res/cardsfolder/a/azorius_justiciar.txt @@ -3,7 +3,6 @@ ManaCost:2 W W Types:Creature Human Wizard PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ Detain | TriggerDescription$ When CARDNAME enters the battlefield, detain up to two target creatures your opponents control. (Until your next turn, those creatures can't attack or block and their activated abilities can't be activated.) -SVar:Detain:DB$ Pump | TargetMin$ 0 | TargetMax$ 2 | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | UntilYourNextTurn$ True | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature your opponent controls to detain. +SVar:Detain:DB$ Pump | TargetMin$ 0 | TargetMax$ 2 | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | UntilYourNextTurn$ True | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature your opponent controls to detain. | AILogic$ DetainNonLand SVar:PlayMain1:TRUE -SVar:Picture:http://www.wizards.com/global/images/magic/general/azorius_justiciar.jpg Oracle:When Azorius Justiciar enters the battlefield, detain up to two target creatures your opponents control. (Until your next turn, those creatures can't attack or block and their activated abilities can't be activated.) diff --git a/forge-gui/res/cardsfolder/b/bala_ged_recovery_bala_ged_sanctuary.txt b/forge-gui/res/cardsfolder/b/bala_ged_recovery_bala_ged_sanctuary.txt new file mode 100644 index 00000000000..ab86241ed2b --- /dev/null +++ b/forge-gui/res/cardsfolder/b/bala_ged_recovery_bala_ged_sanctuary.txt @@ -0,0 +1,16 @@ +Name:Bala Ged Recovery +ManaCost:2 G +Types:Sorcery +A:SP$ ChangeZone | Cost$ 2 G | ValidTgts$ Card.YouOwn | TgtPrompt$ Select target card | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target card from your graveyard to your hand. +DeckHas:Ability$Graveyard +AlternateMode:Modal +Oracle:Return target card from your graveyard to your hand. + +ALTERNATE + +Name:Bala Ged Sanctuary +ManaCost:no cost +Types:Land +K:CARDNAME enters the battlefield tapped. +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +Oracle:Bala Ged Sanctuary enters the battlefield tapped.\n{T}: Add {G}. diff --git a/forge-gui/res/cardsfolder/b/base_camp.txt b/forge-gui/res/cardsfolder/b/base_camp.txt new file mode 100644 index 00000000000..75aa8cb9624 --- /dev/null +++ b/forge-gui/res/cardsfolder/b/base_camp.txt @@ -0,0 +1,9 @@ +Name:Base Camp +ManaCost:no cost +Types:Land +K:CARDNAME enters the battlefield tapped. +A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. +A:AB$ Mana | Cost$ T | Produced$ Any | RestrictValid$ Cleric,Rogue,Warrior,Wizard | SpellDescription$ Add one mana of any color. Spend this mana only to cast a Cleric, Rogue, Warrior, or Wizard spell or to activate an ability of a Cleric, Rogue, Warrior, or Wizard. +DeckHas:Ability$Party +DeckHints:Type$Cleric|Rogue|Warrior|Wizard +Oracle:Base Camp enters the battlefield tapped.\n{T}: Add {C}.\n{T}: Add one mana of any color. Spend this mana only to cast a Cleric, Rogue, Warrior, or Wizard spell or to activate an ability of a Cleric, Rogue, Warrior, or Wizard. diff --git a/forge-gui/res/cardsfolder/b/basris_lieutenant.txt b/forge-gui/res/cardsfolder/b/basris_lieutenant.txt index f8e90baf2d8..5699bb655e2 100755 --- a/forge-gui/res/cardsfolder/b/basris_lieutenant.txt +++ b/forge-gui/res/cardsfolder/b/basris_lieutenant.txt @@ -6,7 +6,7 @@ K:Vigilance K:Protection from multicolored T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ When CARDNAME enters the battlefield, put a +1/+1 counter on target creature you control. SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ 1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self+counters_GE1_P1P1 | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerController$ TriggeredCardController | TriggerDescription$ Whenever CARDNAME or another creature you control dies, if it had a +1/+1 counter on it, create a 2/2 white Knight creature token with vigilance. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self+counters_GE1_P1P1 | Execute$ TrigToken | TriggerController$ TriggeredCardController | TriggerDescription$ Whenever CARDNAME or another creature you control dies, if it had a +1/+1 counter on it, create a 2/2 white Knight creature token with vigilance. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Other+YouCtrl+counters_GE1_P1P1 | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerController$ TriggeredCardController | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another creature you control dies, if it had a +1/+1 counter on it, create a 2/2 white Knight creature token with vigilance. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_2_2_knight_vigilance | TokenOwner$ You DeckHas:Ability$Counters & Ability$Token diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/beyeen_veil_beyeen_coast.txt b/forge-gui/res/cardsfolder/b/beyeen_veil_beyeen_coast.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/beyeen_veil_beyeen_coast.txt rename to forge-gui/res/cardsfolder/b/beyeen_veil_beyeen_coast.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/blackbloom_rogue_blackbloom_bog.txt b/forge-gui/res/cardsfolder/b/blackbloom_rogue_blackbloom_bog.txt similarity index 83% rename from forge-gui/res/cardsfolder/upcoming/ZNR/blackbloom_rogue_blackbloom_bog.txt rename to forge-gui/res/cardsfolder/b/blackbloom_rogue_blackbloom_bog.txt index e0a1b72f2c0..aff69e4823a 100644 --- a/forge-gui/res/cardsfolder/upcoming/ZNR/blackbloom_rogue_blackbloom_bog.txt +++ b/forge-gui/res/cardsfolder/b/blackbloom_rogue_blackbloom_bog.txt @@ -6,7 +6,7 @@ K:Menace S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 3 | CheckSVar$ X | SVarCompare$ GE8 | Description$ CARDNAME gets +3/+0 as long as an opponent has eight or more cards in their graveyard. SVar:X:PlayerCountOpponents$HighestCardsInGraveyard AlternateMode:Modal -Oracle:Blackbloom Rogue gets +3/+0 as long as an opponent has eight or more cards in their graveyard. +Oracle:Menace\nBlackbloom Rogue gets +3/+0 as long as an opponent has eight or more cards in their graveyard. ALTERNATE diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/blood_beckoning.txt b/forge-gui/res/cardsfolder/b/blood_beckoning.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/blood_beckoning.txt rename to forge-gui/res/cardsfolder/b/blood_beckoning.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/blood_price.txt b/forge-gui/res/cardsfolder/b/blood_price.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/blood_price.txt rename to forge-gui/res/cardsfolder/b/blood_price.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/bloodchiefs_thirst.txt b/forge-gui/res/cardsfolder/b/bloodchiefs_thirst.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/bloodchiefs_thirst.txt rename to forge-gui/res/cardsfolder/b/bloodchiefs_thirst.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/branchloft_pathway_boulderloft_pathway.txt b/forge-gui/res/cardsfolder/b/branchloft_pathway_boulderloft_pathway.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/branchloft_pathway_boulderloft_pathway.txt rename to forge-gui/res/cardsfolder/b/branchloft_pathway_boulderloft_pathway.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/brightclimb_pathway_grimclimb_pathway.txt b/forge-gui/res/cardsfolder/b/brightclimb_pathway_grimclimb_pathway.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/brightclimb_pathway_grimclimb_pathway.txt rename to forge-gui/res/cardsfolder/b/brightclimb_pathway_grimclimb_pathway.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/broken_wings.txt b/forge-gui/res/cardsfolder/b/broken_wings.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/broken_wings.txt rename to forge-gui/res/cardsfolder/b/broken_wings.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/brushfire_elemental.txt b/forge-gui/res/cardsfolder/b/brushfire_elemental.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/brushfire_elemental.txt rename to forge-gui/res/cardsfolder/b/brushfire_elemental.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/bubble_snare.txt b/forge-gui/res/cardsfolder/b/bubble_snare.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/bubble_snare.txt rename to forge-gui/res/cardsfolder/b/bubble_snare.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/canopy_baloth.txt b/forge-gui/res/cardsfolder/c/canopy_baloth.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/canopy_baloth.txt rename to forge-gui/res/cardsfolder/c/canopy_baloth.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/canyon_jerboa.txt b/forge-gui/res/cardsfolder/c/canyon_jerboa.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/canyon_jerboa.txt rename to forge-gui/res/cardsfolder/c/canyon_jerboa.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/cascade_seer.txt b/forge-gui/res/cardsfolder/c/cascade_seer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/cascade_seer.txt rename to forge-gui/res/cardsfolder/c/cascade_seer.txt diff --git a/forge-gui/res/cardsfolder/c/cellar_door.txt b/forge-gui/res/cardsfolder/c/cellar_door.txt index 2a0b0982396..d49f0c34a19 100644 --- a/forge-gui/res/cardsfolder/c/cellar_door.txt +++ b/forge-gui/res/cardsfolder/c/cellar_door.txt @@ -1,8 +1,7 @@ Name:Cellar Door ManaCost:2 Types:Artifact -A:AB$ Mill | Cost$ 3 T | NumCards$ 1 | ValidTgts$ Player | TgtPrompt$ Choose a player | FromBottom$ True | RememberMilled$ True | SubAbility$ DBToken | SpellDescription$ Target player puts the bottom card of their library into their graveyard. If it's a creature card, you create a 2/2 black Zombie creature token. -SVar:DBToken:DB$ Token | LegacyImage$ b 2 2 zombie isd | TokenScript$ b_2_2_zombie | TokenOwner$ You | TokenAmount$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ EQ1 | SubAbility$ DBCleanup +A:AB$ Mill | Cost$ 3 T | NumCards$ 1 | ValidTgts$ Player | TgtPrompt$ Choose a player | FromBottom$ True | RememberMilled$ True | SubAbility$ DBToken | StackDescription$ {p:Targeted} puts the bottom card of their library into their graveyard. | SpellDescription$ Target player puts the bottom card of their library into their graveyard. If it's a creature card, you create a 2/2 black Zombie creature token. +SVar:DBToken:DB$ Token | TokenScript$ b_2_2_zombie | TokenOwner$ You | TokenAmount$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ EQ1 | SubAbility$ DBCleanup | StackDescription$ If it's a creature card, {p:You} creates a 2/2 black Zombie creature token. | SpellDescription$ If it's a creature card, you create a 2/2 black Zombie creature token. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:Picture:http://www.wizards.com/global/images/magic/general/cellar_door.jpg Oracle:{3}, {T}: Target player puts the bottom card of their library into their graveyard. If it's a creature card, create a 2/2 black Zombie creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/charix_the_raging_isle.txt b/forge-gui/res/cardsfolder/c/charix_the_raging_isle.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/charix_the_raging_isle.txt rename to forge-gui/res/cardsfolder/c/charix_the_raging_isle.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/chilling_trap.txt b/forge-gui/res/cardsfolder/c/chilling_trap.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/chilling_trap.txt rename to forge-gui/res/cardsfolder/c/chilling_trap.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/cinderclasm.txt b/forge-gui/res/cardsfolder/c/cinderclasm.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/cinderclasm.txt rename to forge-gui/res/cardsfolder/c/cinderclasm.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/cleansing_wildfire.txt b/forge-gui/res/cardsfolder/c/cleansing_wildfire.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/cleansing_wildfire.txt rename to forge-gui/res/cardsfolder/c/cleansing_wildfire.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/clearwater_pathway_murkwater_pathway.txt b/forge-gui/res/cardsfolder/c/clearwater_pathway_murkwater_pathway.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/clearwater_pathway_murkwater_pathway.txt rename to forge-gui/res/cardsfolder/c/clearwater_pathway_murkwater_pathway.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/cleric_of_chill_depths.txt b/forge-gui/res/cardsfolder/c/cleric_of_chill_depths.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/cleric_of_chill_depths.txt rename to forge-gui/res/cardsfolder/c/cleric_of_chill_depths.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/cleric_of_lifes_bond.txt b/forge-gui/res/cardsfolder/c/cleric_of_lifes_bond.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/cleric_of_lifes_bond.txt rename to forge-gui/res/cardsfolder/c/cleric_of_lifes_bond.txt diff --git a/forge-gui/res/cardsfolder/c/cliffhaven_kitesail.txt b/forge-gui/res/cardsfolder/c/cliffhaven_kitesail.txt new file mode 100755 index 00000000000..179ea82edf9 --- /dev/null +++ b/forge-gui/res/cardsfolder/c/cliffhaven_kitesail.txt @@ -0,0 +1,9 @@ +Name:Cliffhaven Kitesail +ManaCost:1 +Types:Artifact Equipment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigAttach | TriggerDescription$ When CARDNAME enters the battlefield, attach it to target creature you control. +SVar:TrigAttach:DB$ Attach | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control +SVar:NeedsToPlay:Creature.YouCtrl+inZoneBattlefield +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddKeyword$ Flying | Description$ Equipped creature has flying. +K:Equip:2 +Oracle:When Cliffhaven Kitesail enters the battlefield, attach it to target creature you control.\nEquipped creature has flying.\nEquip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/cliffhaven_sell_sword.txt b/forge-gui/res/cardsfolder/c/cliffhaven_sell_sword.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/cliffhaven_sell_sword.txt rename to forge-gui/res/cardsfolder/c/cliffhaven_sell_sword.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/concerted_defense.txt b/forge-gui/res/cardsfolder/c/concerted_defense.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/concerted_defense.txt rename to forge-gui/res/cardsfolder/c/concerted_defense.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/confounding_conundrum.txt b/forge-gui/res/cardsfolder/c/confounding_conundrum.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/confounding_conundrum.txt rename to forge-gui/res/cardsfolder/c/confounding_conundrum.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/coralhelm_chronicler.txt b/forge-gui/res/cardsfolder/c/coralhelm_chronicler.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/coralhelm_chronicler.txt rename to forge-gui/res/cardsfolder/c/coralhelm_chronicler.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/coveted_prize.txt b/forge-gui/res/cardsfolder/c/coveted_prize.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/coveted_prize.txt rename to forge-gui/res/cardsfolder/c/coveted_prize.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/cragcrown_pathway_timbercrown_pathway.txt b/forge-gui/res/cardsfolder/c/cragcrown_pathway_timbercrown_pathway.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/cragcrown_pathway_timbercrown_pathway.txt rename to forge-gui/res/cardsfolder/c/cragcrown_pathway_timbercrown_pathway.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/cragplate_baloth.txt b/forge-gui/res/cardsfolder/c/cragplate_baloth.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/cragplate_baloth.txt rename to forge-gui/res/cardsfolder/c/cragplate_baloth.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/crawling_barrens.txt b/forge-gui/res/cardsfolder/c/crawling_barrens.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/crawling_barrens.txt rename to forge-gui/res/cardsfolder/c/crawling_barrens.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/cunning_geysermage.txt b/forge-gui/res/cardsfolder/c/cunning_geysermage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/cunning_geysermage.txt rename to forge-gui/res/cardsfolder/c/cunning_geysermage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/dauntless_survivor.txt b/forge-gui/res/cardsfolder/d/dauntless_survivor.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/dauntless_survivor.txt rename to forge-gui/res/cardsfolder/d/dauntless_survivor.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/dauntless_unity.txt b/forge-gui/res/cardsfolder/d/dauntless_unity.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/dauntless_unity.txt rename to forge-gui/res/cardsfolder/d/dauntless_unity.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/deadly_alliance.txt b/forge-gui/res/cardsfolder/d/deadly_alliance.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/deadly_alliance.txt rename to forge-gui/res/cardsfolder/d/deadly_alliance.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/deliberate.txt b/forge-gui/res/cardsfolder/d/deliberate.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/deliberate.txt rename to forge-gui/res/cardsfolder/d/deliberate.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/demons_disciple.txt b/forge-gui/res/cardsfolder/d/demons_disciple.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/demons_disciple.txt rename to forge-gui/res/cardsfolder/d/demons_disciple.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/drana_the_last_bloodchief.txt b/forge-gui/res/cardsfolder/d/drana_the_last_bloodchief.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/drana_the_last_bloodchief.txt rename to forge-gui/res/cardsfolder/d/drana_the_last_bloodchief.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/dranas_silencer.txt b/forge-gui/res/cardsfolder/d/dranas_silencer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/dranas_silencer.txt rename to forge-gui/res/cardsfolder/d/dranas_silencer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/dreadwurm.txt b/forge-gui/res/cardsfolder/d/dreadwurm.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/dreadwurm.txt rename to forge-gui/res/cardsfolder/d/dreadwurm.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/emeria_captain.txt b/forge-gui/res/cardsfolder/e/emeria_captain.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/emeria_captain.txt rename to forge-gui/res/cardsfolder/e/emeria_captain.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/emerias_call_emeria_shattered_skyclave.txt b/forge-gui/res/cardsfolder/e/emerias_call_emeria_shattered_skyclave.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/emerias_call_emeria_shattered_skyclave.txt rename to forge-gui/res/cardsfolder/e/emerias_call_emeria_shattered_skyclave.txt diff --git a/forge-gui/res/cardsfolder/e/enigma_thief.txt b/forge-gui/res/cardsfolder/e/enigma_thief.txt new file mode 100644 index 00000000000..3aca4b281db --- /dev/null +++ b/forge-gui/res/cardsfolder/e/enigma_thief.txt @@ -0,0 +1,10 @@ +Name:Enigma Thief +ManaCost:5 U U +Types:Creature Sphinx Rogue +PT:5/5 +K:Prowl:3 U +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ ReturnOneEach | TriggerDescription$ When CARDNAME enters the battlefield, for each opponent, return up to one target nonland permanent that player controls to its owner’s hand. +SVar:ReturnOneEach:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Permanent.nonLand+OppCtrl | TargetMin$ 0 | TargetMax$ OneEach | References$ OneEach | TargetsWithDifferentControllers$ True | TgtPrompt$ Select up to one target nonland permanent each opponent controls +SVar:OneEach:PlayerCountOpponents$Amount +Oracle:Prowl {3}{U} (You may cast this spell for its prowl cost if you dealt combat damage to a player this turn with a Sphinx or a Rogue.)\nFlying\nWhen Enigma Thief enters the battlefield, for each opponent, return up to one target nonland permanent that player controls to its owner’s hand. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/expedition_champion.txt b/forge-gui/res/cardsfolder/e/expedition_champion.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/expedition_champion.txt rename to forge-gui/res/cardsfolder/e/expedition_champion.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/expedition_diviner.txt b/forge-gui/res/cardsfolder/e/expedition_diviner.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/expedition_diviner.txt rename to forge-gui/res/cardsfolder/e/expedition_diviner.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/expedition_healer.txt b/forge-gui/res/cardsfolder/e/expedition_healer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/expedition_healer.txt rename to forge-gui/res/cardsfolder/e/expedition_healer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/expedition_skulker.txt b/forge-gui/res/cardsfolder/e/expedition_skulker.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/expedition_skulker.txt rename to forge-gui/res/cardsfolder/e/expedition_skulker.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/farsight_adept.txt b/forge-gui/res/cardsfolder/f/farsight_adept.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/farsight_adept.txt rename to forge-gui/res/cardsfolder/f/farsight_adept.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/fearless_fledgling.txt b/forge-gui/res/cardsfolder/f/fearless_fledgling.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/fearless_fledgling.txt rename to forge-gui/res/cardsfolder/f/fearless_fledgling.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/feed_the_swarm.txt b/forge-gui/res/cardsfolder/f/feed_the_swarm.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/feed_the_swarm.txt rename to forge-gui/res/cardsfolder/f/feed_the_swarm.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/felidar_retreat.txt b/forge-gui/res/cardsfolder/f/felidar_retreat.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/felidar_retreat.txt rename to forge-gui/res/cardsfolder/f/felidar_retreat.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/field_research.txt b/forge-gui/res/cardsfolder/f/field_research.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/field_research.txt rename to forge-gui/res/cardsfolder/f/field_research.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/fireblade_charger.txt b/forge-gui/res/cardsfolder/f/fireblade_charger.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/fireblade_charger.txt rename to forge-gui/res/cardsfolder/f/fireblade_charger.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/fissure_wizard.txt b/forge-gui/res/cardsfolder/f/fissure_wizard.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/fissure_wizard.txt rename to forge-gui/res/cardsfolder/f/fissure_wizard.txt diff --git a/forge-gui/res/cardsfolder/f/forsaken_monument.txt b/forge-gui/res/cardsfolder/f/forsaken_monument.txt new file mode 100644 index 00000000000..c1e2c929667 --- /dev/null +++ b/forge-gui/res/cardsfolder/f/forsaken_monument.txt @@ -0,0 +1,12 @@ +Name:Forsaken Monument +ManaCost:5 +Types:Legendary Artifact +S:Mode$ Continuous | Affected$ Creature.Colorless+YouCtrl | AddPower$ 2 | AddToughness$ 2 | Description$ Colorless creatures you control get +2/+2. +T:Mode$ TapsForMana | ValidCard$ Permanent.YouCtrl | Produced$ C | Execute$ TrigMana | TriggerZones$ Battlefield | Static$ True | TriggerDescription$ Whenever you tap a permanent for {C}, add an additional {C}. +SVar:TrigMana:DB$ Mana | Produced$ C +T:Mode$ SpellCast | ValidCard$ Card.Colorless | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever you cast a colorless spell, you gain 1 life. +SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 +SVar:PlayMain1:TRUE +DeckHints:Color$Colorless +DeckHas:Ability$LifeGain +Oracle:Colorless creatures you control get +2/+2.\nWhenever you tap a permanent for {C}, add an additional {C}.\nWhenever you cast a colorless spell, you gain 1 life. diff --git a/forge-gui/res/cardsfolder/g/geode_rager.txt b/forge-gui/res/cardsfolder/g/geode_rager.txt new file mode 100644 index 00000000000..27857b961be --- /dev/null +++ b/forge-gui/res/cardsfolder/g/geode_rager.txt @@ -0,0 +1,9 @@ +Name:Geode Rager +ManaCost:4 R R +Types:Creature Elemental +PT:4/3 +K:First Strike +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigGoad | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, goad each creature target player controls. (Until your next turn, those creatures attack each combat if able and attack a player other than you if able.) +SVar:TrigGoad:DB$ Goad | ValidTgts$ Player | TgtPrompt$ Select target player | Defined$ Valid Creature.ControlledBy TargetedPlayer +SVar:BuffedBy:Land +Oracle:First strike\nLandfall — Whenever a land enters the battlefield under your control, goad each creature target player controls. (Until your next turn, those creatures attack each combat if able and attack a player other than you if able.) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/ghastly_gloomhunter.txt b/forge-gui/res/cardsfolder/g/ghastly_gloomhunter.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/ghastly_gloomhunter.txt rename to forge-gui/res/cardsfolder/g/ghastly_gloomhunter.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/glacial_grasp.txt b/forge-gui/res/cardsfolder/g/glacial_grasp.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/glacial_grasp.txt rename to forge-gui/res/cardsfolder/g/glacial_grasp.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/glasspool_mimic_glasspool_shore.txt b/forge-gui/res/cardsfolder/g/glasspool_mimic_glasspool_shore.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/glasspool_mimic_glasspool_shore.txt rename to forge-gui/res/cardsfolder/g/glasspool_mimic_glasspool_shore.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/gnarlid_colony.txt b/forge-gui/res/cardsfolder/g/gnarlid_colony.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/gnarlid_colony.txt rename to forge-gui/res/cardsfolder/g/gnarlid_colony.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/goma_fada_vanguard.txt b/forge-gui/res/cardsfolder/g/goma_fada_vanguard.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/goma_fada_vanguard.txt rename to forge-gui/res/cardsfolder/g/goma_fada_vanguard.txt diff --git a/forge-gui/res/cardsfolder/g/grakmaw_skyclave_ravager.txt b/forge-gui/res/cardsfolder/g/grakmaw_skyclave_ravager.txt new file mode 100755 index 00000000000..21b692cfe15 --- /dev/null +++ b/forge-gui/res/cardsfolder/g/grakmaw_skyclave_ravager.txt @@ -0,0 +1,13 @@ +Name:Grakmaw, Skyclave Ravager +ManaCost:1 B G +Types:Legendary Creature Hydra Horror +PT:0/0 +K:etbCounter:P1P1:3 +SVar:WasKicked:Count$CardCounters.P1P1 +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl+Other+counters_GE1_P1P1 | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerController$ TriggeredCardController | TriggerDescription$ Whenever another creature you control dies, if it had a +1/+1 counter on it, put a +1/+1 counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | ConditionPresent$ Card.StrictlySelf +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, create an X/X black and green Hydra creature token, where X is the number of +1/+1 counters on CARDNAME. +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ bg_x_x_hydra | TokenOwner$ TriggeredCardController | TokenPower$ X | TokenToughness$ X | References$ X +SVar:X:TriggeredCard$CardCounters.P1P1 +DeckHas:Ability$Counters & Ability$Token +Oracle:Grakmaw, Skyclave Ravager enters the battlefield with three +1/+1 counters on it.\nWhenever another creature you control dies, if it had a +1/+1 counter on it, put a +1/+1 counter on Grakmaw.\nWhen Grakmaw dies, create an X/X black and green Hydra creature token, where X is the number of +1/+1 counters on Grakmaw. diff --git a/forge-gui/res/cardsfolder/g/grenzo_havoc_raiser.txt b/forge-gui/res/cardsfolder/g/grenzo_havoc_raiser.txt index be9ea4b9703..ec283b930b4 100644 --- a/forge-gui/res/cardsfolder/g/grenzo_havoc_raiser.txt +++ b/forge-gui/res/cardsfolder/g/grenzo_havoc_raiser.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Goblin Rogue PT:2/2 T:Mode$ DamageDone | ValidSource$ Creature.YouCtrl | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigCharm | TriggerZones$ Battlefield | TriggerDescription$ Whenever a creature you control deals combat damage to a player, ABILITY SVar:TrigCharm:DB$ Charm | Choices$ DBGoad,DBExile -SVar:DBGoad:DB$ Goad | ValidTgts$ Creature.DefenderCtrl | TgtPrompt$ Select target creature defending player controls. | SpellDescription$ Goad target creature that player controls. +SVar:DBGoad:DB$ Goad | ValidTgts$ Creature | TargetsWithDefinedController$ TriggeredTarget | TgtPrompt$ Select target creature damaged player controls | SpellDescription$ Goad target creature that player controls. SVar:DBExile:DB$ Dig | Defined$ TriggeredDefendingPlayer | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect | SpellDescription$ Exile the top card of that player's library. Until end of turn, you may cast that card and you may spend mana as though it were mana of any color to cast it. SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay | Triggers$ TriggerCastDoM | SVars$ TrigRemoveSelf | RememberObjects$ Remembered | SubAbility$ DBCleanup SVar:STPlay:Mode$ Continuous | MayPlay$ True | MayPlayIgnoreColor$ True | EffectZone$ Command | Affected$ Card.IsRemembered+nonLand | AffectedZone$ Exile | Description$ Until end of turn, you may cast that card and you may spend mana as though it were mana of any color to cast it. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/grotag_bug_catcher.txt b/forge-gui/res/cardsfolder/g/grotag_bug_catcher.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/grotag_bug_catcher.txt rename to forge-gui/res/cardsfolder/g/grotag_bug_catcher.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/grotag_night_runner.txt b/forge-gui/res/cardsfolder/g/grotag_night_runner.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/grotag_night_runner.txt rename to forge-gui/res/cardsfolder/g/grotag_night_runner.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/guul_draz_mucklord.txt b/forge-gui/res/cardsfolder/g/guul_draz_mucklord.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/guul_draz_mucklord.txt rename to forge-gui/res/cardsfolder/g/guul_draz_mucklord.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/hagra_constrictor.txt b/forge-gui/res/cardsfolder/h/hagra_constrictor.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/hagra_constrictor.txt rename to forge-gui/res/cardsfolder/h/hagra_constrictor.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/hagra_mauling_hagra_broodpit.txt b/forge-gui/res/cardsfolder/h/hagra_mauling_hagra_broodpit.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/hagra_mauling_hagra_broodpit.txt rename to forge-gui/res/cardsfolder/h/hagra_mauling_hagra_broodpit.txt diff --git a/forge-gui/res/cardsfolder/h/hallar_the_firefletcher.txt b/forge-gui/res/cardsfolder/h/hallar_the_firefletcher.txt index 5502804bb49..c56437aa153 100644 --- a/forge-gui/res/cardsfolder/h/hallar_the_firefletcher.txt +++ b/forge-gui/res/cardsfolder/h/hallar_the_firefletcher.txt @@ -8,5 +8,5 @@ SVar:DBPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNu SVar:DBDealDamage:DB$ DealDamage | Defined$ Player.Opponent | NumDmg$ X | References$ X SVar:X:Count$CardCounters.P1P1 DeckHas:Ability$Counters -SVar:Picture:http://www.wizards.com/global/images/magic/general/hallar_the_firefletcher.jpg +SVar:BuffedBy:Card.withKicker,Card.withMultikicker Oracle:Trample\nWhenever you cast a spell, if that spell was kicked, put a +1/+1 counter on Hallar, the Firefletcher, then Hallar deals damage equal to the number of +1/+1 counters on it to each opponent. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/highborn_vampire.txt b/forge-gui/res/cardsfolder/h/highborn_vampire.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/highborn_vampire.txt rename to forge-gui/res/cardsfolder/h/highborn_vampire.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/inordinate_rage.txt b/forge-gui/res/cardsfolder/i/inordinate_rage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/inordinate_rage.txt rename to forge-gui/res/cardsfolder/i/inordinate_rage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/jace_mirror_mage.txt b/forge-gui/res/cardsfolder/j/jace_mirror_mage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/jace_mirror_mage.txt rename to forge-gui/res/cardsfolder/j/jace_mirror_mage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/joraga_visionary.txt b/forge-gui/res/cardsfolder/j/joraga_visionary.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/joraga_visionary.txt rename to forge-gui/res/cardsfolder/j/joraga_visionary.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/journey_to_oblivion.txt b/forge-gui/res/cardsfolder/j/journey_to_oblivion.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/journey_to_oblivion.txt rename to forge-gui/res/cardsfolder/j/journey_to_oblivion.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/jwari_disruption_jwari_ruins.txt b/forge-gui/res/cardsfolder/j/jwari_disruption_jwari_ruins.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/jwari_disruption_jwari_ruins.txt rename to forge-gui/res/cardsfolder/j/jwari_disruption_jwari_ruins.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/kabira_outrider.txt b/forge-gui/res/cardsfolder/k/kabira_outrider.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/kabira_outrider.txt rename to forge-gui/res/cardsfolder/k/kabira_outrider.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/kabira_takedown_kabira_plateau.txt b/forge-gui/res/cardsfolder/k/kabira_takedown_kabira_plateau.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/kabira_takedown_kabira_plateau.txt rename to forge-gui/res/cardsfolder/k/kabira_takedown_kabira_plateau.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/kargan_intimidator.txt b/forge-gui/res/cardsfolder/k/kargan_intimidator.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/kargan_intimidator.txt rename to forge-gui/res/cardsfolder/k/kargan_intimidator.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/kargan_warleader.txt b/forge-gui/res/cardsfolder/k/kargan_warleader.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/kargan_warleader.txt rename to forge-gui/res/cardsfolder/k/kargan_warleader.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/kaza_roil_chaser.txt b/forge-gui/res/cardsfolder/k/kaza_roil_chaser.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/kaza_roil_chaser.txt rename to forge-gui/res/cardsfolder/k/kaza_roil_chaser.txt diff --git a/forge-gui/res/cardsfolder/k/kazandu_mammoth_kazandu_valley.txt b/forge-gui/res/cardsfolder/k/kazandu_mammoth_kazandu_valley.txt new file mode 100644 index 00000000000..ea79f09c19c --- /dev/null +++ b/forge-gui/res/cardsfolder/k/kazandu_mammoth_kazandu_valley.txt @@ -0,0 +1,18 @@ +Name:Kazandu Mammoth +ManaCost:1 G G +Types:Creature Elephant +PT:3/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, CARDNAME gets +2/+2 until end of turn. +SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ +2 | NumDef$ +2 +SVar:BuffedBy:Land +AlternateMode:Modal +Oracle:Landfall — Whenever a land enters the battlefield under your control, Kazandu Mammoth gets +2/+2 until end of turn. + +ALTERNATE + +Name:Kazandu Valley +ManaCost:no cost +Types:Land +K:CARDNAME enters the battlefield tapped. +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +Oracle:Kazandu Valley enters the battlefield tapped.\n{T}: Add {G}. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/kazandu_nectarpot.txt b/forge-gui/res/cardsfolder/k/kazandu_nectarpot.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/kazandu_nectarpot.txt rename to forge-gui/res/cardsfolder/k/kazandu_nectarpot.txt diff --git a/forge-gui/res/cardsfolder/k/kazandu_stomper.txt b/forge-gui/res/cardsfolder/k/kazandu_stomper.txt new file mode 100755 index 00000000000..056f6841d7d --- /dev/null +++ b/forge-gui/res/cardsfolder/k/kazandu_stomper.txt @@ -0,0 +1,8 @@ +Name:Kazandu Stomper +ManaCost:5 G +Types:Creature Beast +PT:6/5 +K:Trample +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, return up to two lands you control to their owner's hand. +SVar:TrigChangeZone:DB$ ChangeZone | PrimaryPrompt$ Choose up to two lands you control | ChangeNum$ 2 | ChangeType$ Land.YouCtrl | Origin$ Battlefield | Destination$ Hand | Hidden$ True +Oracle:Trample\nWhen Kazandu Stomper enters the battlefield, return up to two lands you control to their owner's hand. diff --git a/forge-gui/res/cardsfolder/k/kazuuls_fury_kazuuls_cliffs.txt b/forge-gui/res/cardsfolder/k/kazuuls_fury_kazuuls_cliffs.txt new file mode 100644 index 00000000000..b0b45d16807 --- /dev/null +++ b/forge-gui/res/cardsfolder/k/kazuuls_fury_kazuuls_cliffs.txt @@ -0,0 +1,17 @@ +Name:Kazuul's Fury +ManaCost:2 R +Types:Instant +A:SP$ DealDamage | Cost$ 2 R Sac<1/Creature> | NumDmg$ X | References$ X | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | SpellDescription$ CARDNAME deals damage equal to the sacrificed creature's power to any target. +SVar:X:Sacrificed$CardPower +DeckHas:Ability$Sacrifice +AlternateMode:Modal +Oracle:As an additional cost to cast this spell, sacrifice a creature. Kazuul's Fury deals damage equal to the sacrificed creature's power to any target. + +ALTERNATE + +Name:Kazuul's Cliffs +ManaCost:no cost +Types:Land +K:CARDNAME enters the battlefield tapped. +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +Oracle:Kazuul's Cliffs enters the battlefield tapped.\n{T}: Add {R}. diff --git a/forge-gui/res/cardsfolder/k/khalni_ambush_khalni_territory.txt b/forge-gui/res/cardsfolder/k/khalni_ambush_khalni_territory.txt new file mode 100644 index 00000000000..93d4b297755 --- /dev/null +++ b/forge-gui/res/cardsfolder/k/khalni_ambush_khalni_territory.txt @@ -0,0 +1,16 @@ +Name:Khalni Ambush +ManaCost:2 G +Types:Instant +A:SP$ Pump | Cost$ 2 G | ValidTgts$ Creature.YouCtrl | AILogic$ Fight | TgtPrompt$ Choose target creature you control | StackDescription$ None | SubAbility$ DBFight | SpellDescription$ Target creature you control fights target creature you don't control. (Each deals damage equal to its power to the other.) +SVar:DBFight:DB$ Fight | Defined$ ParentTarget | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Choose target creature you don't control +AlternateMode:Modal +Oracle:Target creature you control fights target creature you don't control. (Each deals damage equal to its power to the other.) + +ALTERNATE + +Name:Khalni Territory +ManaCost:no cost +Types:Land +K:CARDNAME enters the battlefield tapped. +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +Oracle:Khalni Territory enters the battlefield tapped.\n{T}: Add {G}. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/kitesail_cleric.txt b/forge-gui/res/cardsfolder/k/kitesail_cleric.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/kitesail_cleric.txt rename to forge-gui/res/cardsfolder/k/kitesail_cleric.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/kor_blademaster.txt b/forge-gui/res/cardsfolder/k/kor_blademaster.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/kor_blademaster.txt rename to forge-gui/res/cardsfolder/k/kor_blademaster.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/kor_celebrant.txt b/forge-gui/res/cardsfolder/k/kor_celebrant.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/kor_celebrant.txt rename to forge-gui/res/cardsfolder/k/kor_celebrant.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/legion_angel.txt b/forge-gui/res/cardsfolder/l/legion_angel.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/legion_angel.txt rename to forge-gui/res/cardsfolder/l/legion_angel.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/leyline_tyrant.txt b/forge-gui/res/cardsfolder/l/leyline_tyrant.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/leyline_tyrant.txt rename to forge-gui/res/cardsfolder/l/leyline_tyrant.txt diff --git a/forge-gui/res/cardsfolder/l/linvala_shield_of_sea_gate.txt b/forge-gui/res/cardsfolder/l/linvala_shield_of_sea_gate.txt new file mode 100755 index 00000000000..2844c99de3e --- /dev/null +++ b/forge-gui/res/cardsfolder/l/linvala_shield_of_sea_gate.txt @@ -0,0 +1,15 @@ +Name:Linvala, Shield of Sea Gate +ManaCost:1 W U +Types:Legendary Creature Angel Wizard +PT:3/3 +K:Flying +T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ X | SVarCompare$ EQ4 | Execute$ TrigPump | TriggerDescription$ At the beginning of combat on your turn, if you have a full party, choose target nonland permanent an opponent controls. Until your next turn, it can't attack or block, and its activated abilities can't be activated. +SVar:TrigPump:DB$ Pump | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Choose target nonland permanent an opponent controls | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | UntilYourNextTurn$ True | AILogic$ DetainNonLand +A:AB$ GenericChoice | Cost$ Sac<1/CARDNAME> | Choices$ PumpHexproof,PumpIndestructible | StackDescription$ {p:You} chooses hexproof or indestructible. Creatures {p:You} controls gain that ability until end of turn. | SpellDescription$ Choose hexproof or indestructible. Creatures you control gain that ability until end of turn. +SVar:PumpHexproof:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Hexproof | SpellDescription$ Hexproof +SVar:PumpIndestructible:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Indestructible | SpellDescription$ Indestructible +SVar:X:Count$Party +DeckHas:Ability$Party & Ability$Sacrifice +SVar:BuffedBy:Rogue,Warrior,Wizard +DeckHints:Type$Rogue|Warrior|Wizard +Oracle:Flying\nAt the beginning of combat on your turn, if you have a full party, choose target nonland permanent an opponent controls. Until your next turn, it can't attack or block, and its activated abilities can't be activated.\nSacrifice Linvala: Choose hexproof or indestructible. Creatures you control gain that ability until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/lithoform_blight.txt b/forge-gui/res/cardsfolder/l/lithoform_blight.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/lithoform_blight.txt rename to forge-gui/res/cardsfolder/l/lithoform_blight.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/living_tempest.txt b/forge-gui/res/cardsfolder/l/living_tempest.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/living_tempest.txt rename to forge-gui/res/cardsfolder/l/living_tempest.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/lullmages_domination.txt b/forge-gui/res/cardsfolder/l/lullmages_domination.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/lullmages_domination.txt rename to forge-gui/res/cardsfolder/l/lullmages_domination.txt diff --git a/forge-gui/res/cardsfolder/l/lullmages_familiar.txt b/forge-gui/res/cardsfolder/l/lullmages_familiar.txt new file mode 100755 index 00000000000..4888b08a66c --- /dev/null +++ b/forge-gui/res/cardsfolder/l/lullmages_familiar.txt @@ -0,0 +1,11 @@ +Name:Lullmage's Familiar +ManaCost:1 G U +Types:Creature Beast +PT:2/4 +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. +T:Mode$ SpellCast | ValidCard$ Card.kicked | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever you cast a kicked spell, you gain 2 life. +SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 +SVar:BuffedBy:Card.withKicker,Card.withMultikicker +DeckHas:Ability$LifeGain +Oracle:{T}: Add {G} or {U}.\nWhenever you cast a kicked spell, you gain 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/luminarch_aspirant.txt b/forge-gui/res/cardsfolder/l/luminarch_aspirant.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/luminarch_aspirant.txt rename to forge-gui/res/cardsfolder/l/luminarch_aspirant.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/maddening_cacophony.txt b/forge-gui/res/cardsfolder/m/maddening_cacophony.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/maddening_cacophony.txt rename to forge-gui/res/cardsfolder/m/maddening_cacophony.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/magmatic_channeler.txt b/forge-gui/res/cardsfolder/m/magmatic_channeler.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/magmatic_channeler.txt rename to forge-gui/res/cardsfolder/m/magmatic_channeler.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/makindi_ox.txt b/forge-gui/res/cardsfolder/m/makindi_ox.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/makindi_ox.txt rename to forge-gui/res/cardsfolder/m/makindi_ox.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/makindi_stampede_makindi_mesas.txt b/forge-gui/res/cardsfolder/m/makindi_stampede_makindi_mesas.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/makindi_stampede_makindi_mesas.txt rename to forge-gui/res/cardsfolder/m/makindi_stampede_makindi_mesas.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/malakir_blood_priest.txt b/forge-gui/res/cardsfolder/m/malakir_blood_priest.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/malakir_blood_priest.txt rename to forge-gui/res/cardsfolder/m/malakir_blood_priest.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/malakir_rebirth_malakir_mire.txt b/forge-gui/res/cardsfolder/m/malakir_rebirth_malakir_mire.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/malakir_rebirth_malakir_mire.txt rename to forge-gui/res/cardsfolder/m/malakir_rebirth_malakir_mire.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/marauding_blight_priest.txt b/forge-gui/res/cardsfolder/m/marauding_blight_priest.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/marauding_blight_priest.txt rename to forge-gui/res/cardsfolder/m/marauding_blight_priest.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/master_of_winds.txt b/forge-gui/res/cardsfolder/m/master_of_winds.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/master_of_winds.txt rename to forge-gui/res/cardsfolder/m/master_of_winds.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/maul_of_the_skyclaves.txt b/forge-gui/res/cardsfolder/m/maul_of_the_skyclaves.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/maul_of_the_skyclaves.txt rename to forge-gui/res/cardsfolder/m/maul_of_the_skyclaves.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/merfolk_falconer.txt b/forge-gui/res/cardsfolder/m/merfolk_falconer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/merfolk_falconer.txt rename to forge-gui/res/cardsfolder/m/merfolk_falconer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/merfolk_windrobber.txt b/forge-gui/res/cardsfolder/m/merfolk_windrobber.txt similarity index 93% rename from forge-gui/res/cardsfolder/upcoming/ZNR/merfolk_windrobber.txt rename to forge-gui/res/cardsfolder/m/merfolk_windrobber.txt index a4162ace954..5b28122af0d 100755 --- a/forge-gui/res/cardsfolder/upcoming/ZNR/merfolk_windrobber.txt +++ b/forge-gui/res/cardsfolder/m/merfolk_windrobber.txt @@ -4,7 +4,7 @@ Types:Creature Merfolk Rogue PT:1/1 K:Flying T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigMill | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player mills a card. -SVar:TrigMill:DB$ Draw | Defined$ TriggeredTarget | NumCards$ 1 +SVar:TrigMill:DB$ Mill | Defined$ TriggeredTarget | NumCards$ 1 A:AB$ Draw | Cost$ Sac<1/CARDNAME> | NumCards$ 1 | CheckSVar$ X | SVarCompare$ GE8 | References$ X | SpellDescription$ Draw a card. Activate this ability only if an opponent has eight or more cards in their graveyard. SVar:X:PlayerCountOpponents$HighestCardsInGraveyard DeckHas:Ability$Mill & Ability$Sacrifice diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/mesa_lynx.txt b/forge-gui/res/cardsfolder/m/mesa_lynx.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/mesa_lynx.txt rename to forge-gui/res/cardsfolder/m/mesa_lynx.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/might_of_murasa.txt b/forge-gui/res/cardsfolder/m/might_of_murasa.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/might_of_murasa.txt rename to forge-gui/res/cardsfolder/m/might_of_murasa.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/mind_carver.txt b/forge-gui/res/cardsfolder/m/mind_carver.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/mind_carver.txt rename to forge-gui/res/cardsfolder/m/mind_carver.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/mind_drain.txt b/forge-gui/res/cardsfolder/m/mind_drain.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/mind_drain.txt rename to forge-gui/res/cardsfolder/m/mind_drain.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/molten_blast.txt b/forge-gui/res/cardsfolder/m/molten_blast.txt similarity index 64% rename from forge-gui/res/cardsfolder/upcoming/ZNR/molten_blast.txt rename to forge-gui/res/cardsfolder/m/molten_blast.txt index 0407e95f5ed..bd2fa916a79 100755 --- a/forge-gui/res/cardsfolder/upcoming/ZNR/molten_blast.txt +++ b/forge-gui/res/cardsfolder/m/molten_blast.txt @@ -2,6 +2,6 @@ Name:Molten Blast ManaCost:2 R Types:Instant A:SP$ Charm | Cost$ 2 R | CharmNum$ 1 | Choices$ Shock,DestroyArtifact -SVar:Shock:DB$ DealDamage | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or planeswalker. +SVar:Shock:DB$ DealDamage | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or planeswalker. SVar:DestroyArtifact:DB$ Destroy | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact. Oracle:Choose one —\n• Molten Blast deals 2 damage to target creature or planeswalker.\n• Destroy target artifact. diff --git a/forge-gui/res/cardsfolder/m/moraug_fury_of_akoum.txt b/forge-gui/res/cardsfolder/m/moraug_fury_of_akoum.txt new file mode 100644 index 00000000000..8b2834eaadc --- /dev/null +++ b/forge-gui/res/cardsfolder/m/moraug_fury_of_akoum.txt @@ -0,0 +1,12 @@ +Name:Moraug, Fury of Akoum +ManaCost:4 R R +Types:Legendary Creature Minotaur Warrior +PT:6/6 +S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddPower$ AffectedX | Description$ Each creature you control gets +1/+0 for each time it has attacked this turn. +SVar:AffectedX:Count$CardNumAttacksThisTurn +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | PlayerTurn$ True | Phase$ Main1,Main2 | Execute$ TrigAddPhase | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, if it's your main phase, there's an additional combat phase after this phase. At the beginning of that combat, untap all creatures you control. +SVar:TrigAddPhase:DB$ AddPhase | ExtraPhase$ BeginCombat | AfterPhase$ Main1 | FollowedBy$ BeginCombat | ConditionPhases$ Main1 | SubAbility$ DBAddPhase +SVar:DBAddPhase:DB$ AddPhase | ExtraPhase$ BeginCombat | AfterPhase$ Main2 | FollowedBy$ End of Turn | ConditionPhases$ Main2 | SubAbility$ DelTrigUntap +SVar:DelTrigUntap:DB$ DelayedTrigger | Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | Execute$ TrigUntapAll | TriggerDescription$ At the beginning of that combat, untap all creatures you control. +SVar:TrigUntapAll:DB$ UntapAll | ValidCards$ Creature.YouCtrl +Oracle:Each creature you control gets +1/+0 for each time it has attacked this turn.\nLandfall — Whenever a land enters the battlefield under your control, if it's your main phase, there's an additional combat phase after this phase. At the beginning of that combat, untap all creatures you control. diff --git a/forge-gui/res/cardsfolder/m/moss_pit_skeleton.txt b/forge-gui/res/cardsfolder/m/moss_pit_skeleton.txt new file mode 100755 index 00000000000..dcf35870975 --- /dev/null +++ b/forge-gui/res/cardsfolder/m/moss_pit_skeleton.txt @@ -0,0 +1,11 @@ +Name:Moss-Pit Skeleton +ManaCost:B G +Types:Creature Plant Skeleton +PT:2/2 +K:Kicker:3 +K:etbCounter:P1P1:3:CheckSVar$ WasKicked:If CARDNAME was kicked, it enters the battlefield with three +1/+1 counters on it. +SVar:WasKicked:Count$Kicked.1.0 +T:Mode$ CounterAddedOnce | ValidCard$ Creature.YouCtrl | CounterType$ P1P1 | TriggerZones$ Graveyard | IsPresent$ Card.StrictlySelf | PresentZone$ Graveyard | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ Whenever one or more +1/+1 counters are put on a creature you control, if CARDNAME is in your graveyard, you may put CARDNAME on top of your library. +SVar:TrigChange:DB$ ChangeZone | Defined$ Self | Origin$ Graveyard | Destination$ Library +DeckHints:Ability$Counters & Ability$Graveyard +Oracle:Kicker {3} (You may pay an additional {3} as you cast this spell)\nIf Moss-Pit Skeleton was kicked, it enters the battlefield with three +1/+1 counters on it.\nWhenever one or more +1/+1 counters are put on a creature you control, if Moss-Pit Skeleton is in your graveyard, you may put Moss-Pit Skeleton on top of your library. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/murasa_brute.txt b/forge-gui/res/cardsfolder/m/murasa_brute.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/murasa_brute.txt rename to forge-gui/res/cardsfolder/m/murasa_brute.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/murasa_rootgrazer.txt b/forge-gui/res/cardsfolder/m/murasa_rootgrazer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/murasa_rootgrazer.txt rename to forge-gui/res/cardsfolder/m/murasa_rootgrazer.txt diff --git a/forge-gui/res/cardsfolder/m/murasa_sproutling.txt b/forge-gui/res/cardsfolder/m/murasa_sproutling.txt new file mode 100755 index 00000000000..fd2d841a221 --- /dev/null +++ b/forge-gui/res/cardsfolder/m/murasa_sproutling.txt @@ -0,0 +1,9 @@ +Name:Murasa Sproutling +ManaCost:2 G +Types:Creature Plant Elemental +PT:3/3 +K:Kicker:1 G +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, return target card with a kicker ability from your graveyard to your hand. +SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target card with a kicker ability | ValidTgts$ Card.withKicker+YouOwn,Card.withMultikicker+YouOwn +DeckHas:Ability$Graveyard +Oracle:Kicker {1}{G} (You may pay an additional {1}{G} as you cast this spell.)\nWhen Murasa Sproutling enters the battlefield, if it was kicked, return target card with a kicker ability from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/m/myriad_construct.txt b/forge-gui/res/cardsfolder/m/myriad_construct.txt new file mode 100755 index 00000000000..126c695db3c --- /dev/null +++ b/forge-gui/res/cardsfolder/m/myriad_construct.txt @@ -0,0 +1,17 @@ +Name:Myriad Construct +ManaCost:4 +Types:Artifact Creature Construct +PT:4/4 +K:Kicker:3 +R:Event$ Moved | ValidCard$ Card.Self+kicked | Destination$ Battlefield | ReplaceWith$ DBPutCounter | Description$ If CARDNAME was kicked, it enters the battlefield with a +1/+1 counter on it for each nonbasic land your opponents control. +SVar:DBPutCounter:DB$ PutCounter | ETB$ True | Defined$ Self | CounterType$ P1P1 | CounterNum$ X | References$ X | SubAbility$ DBMoveToPlay +SVar:DBMoveToPlay:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard +SVar:X:Count$LastStateBattlefield Land.nonBasic+OppCtrl +SVar:NeedsToPlayKicked:Land.nonBasic+OppCtrl +T:Mode$ BecomesTarget | ValidTarget$ Card.Self | TriggerZones$ Battlefield | SourceType$ Spell | Execute$ TrigSac | TriggerDescription$ When CARDNAME becomes the target of a spell, sacrifice it and create a number of 1/1 colorless Construct artifact creature tokens equal to its power. +SVar:TrigSac:DB$ Destroy | Defined$ Self | Sacrifice$ True | RememberLKI$ True | SubAbility$ DBToken +SVar:DBToken:DB$ Token | TokenAmount$ Y | References$ Y | TokenScript$ c_1_1_a_construct | TokenOwner$ You | SubAbility$ DBCleanup +SVar:Y:RememberedLKI$CardPower +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +DeckHas:Ability$Token & Ability$Counters +Oracle:Kicker {3}\nIf Myriad Construct was kicked, it enters the battlefield with a +1/+1 counter on it for each nonbasic land your opponents control.\nWhen Myriad Construct becomes the target of a spell, sacrifice it and create a number of 1/1 colorless Construct artifact creature tokens equal to its power. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/nahiri_heir_of_the_ancients.txt b/forge-gui/res/cardsfolder/n/nahiri_heir_of_the_ancients.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/nahiri_heir_of_the_ancients.txt rename to forge-gui/res/cardsfolder/n/nahiri_heir_of_the_ancients.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/nahiris_binding.txt b/forge-gui/res/cardsfolder/n/nahiris_binding.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/nahiris_binding.txt rename to forge-gui/res/cardsfolder/n/nahiris_binding.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/nahiris_lithoforming.txt b/forge-gui/res/cardsfolder/n/nahiris_lithoforming.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/nahiris_lithoforming.txt rename to forge-gui/res/cardsfolder/n/nahiris_lithoforming.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/needleverge_pathway_pillarverge_pathway.txt b/forge-gui/res/cardsfolder/n/needleverge_pathway_pillarverge_pathway.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/needleverge_pathway_pillarverge_pathway.txt rename to forge-gui/res/cardsfolder/n/needleverge_pathway_pillarverge_pathway.txt diff --git a/forge-gui/res/cardsfolder/n/niambi_esteemed_speaker.txt b/forge-gui/res/cardsfolder/n/niambi_esteemed_speaker.txt index a806b2e4135..93db0ed7422 100755 --- a/forge-gui/res/cardsfolder/n/niambi_esteemed_speaker.txt +++ b/forge-gui/res/cardsfolder/n/niambi_esteemed_speaker.txt @@ -8,6 +8,6 @@ SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | V SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X SVar:X:Targeted$CardManaCost DeckHas:Ability$LifeGain -A:AB$ Draw | Cost$ 1 W U T Discard<1/Card.Legendary> | NumCards$ 2 | SpellDescription$ Draw two cards. +A:AB$ Draw | Cost$ 1 W U T Discard<1/Card.Legendary/legendary> | NumCards$ 2 | SpellDescription$ Draw two cards. DeckHints:Type$Legendary Oracle:Flash\nWhen Niambi, Esteemed Speaker enters the battlefield, you may return another target creature you control to its owner's hand. If you do, you gain life equal to that creature's converted mana cost.\n{1}{W}{U}, {T}, Discard a legendary card: Draw two cards. diff --git a/forge-gui/res/cardsfolder/n/nighthawk_scavenger.txt b/forge-gui/res/cardsfolder/n/nighthawk_scavenger.txt new file mode 100644 index 00000000000..1009360fade --- /dev/null +++ b/forge-gui/res/cardsfolder/n/nighthawk_scavenger.txt @@ -0,0 +1,10 @@ +Name:Nighthawk Scavenger +ManaCost:1 B B +Types:Creature Vampire Rogue +PT:1+*/3 +K:Flying +K:Deathtouch +K:Lifelink +S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | References$ X | Description$ CARDNAME's power is equal to 1 plus the number of card types among cards in your opponents' graveyards. +SVar:X:Count$OppTypesInGrave/Plus.1 +Oracle:Flying, deathtouch, lifelink\nNighthawk Scavenger's power is equal to 1 plus the number of card types among cards in your opponents' graveyards. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/nimana_skitter_sneak.txt b/forge-gui/res/cardsfolder/n/nimana_skitter_sneak.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/nimana_skitter_sneak.txt rename to forge-gui/res/cardsfolder/n/nimana_skitter_sneak.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/nimana_skydancer.txt b/forge-gui/res/cardsfolder/n/nimana_skydancer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/nimana_skydancer.txt rename to forge-gui/res/cardsfolder/n/nimana_skydancer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/nimble_trapfinder.txt b/forge-gui/res/cardsfolder/n/nimble_trapfinder.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/nimble_trapfinder.txt rename to forge-gui/res/cardsfolder/n/nimble_trapfinder.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/nissa_of_shadowed_boughs.txt b/forge-gui/res/cardsfolder/n/nissa_of_shadowed_boughs.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/nissa_of_shadowed_boughs.txt rename to forge-gui/res/cardsfolder/n/nissa_of_shadowed_boughs.txt diff --git a/forge-gui/res/cardsfolder/n/nissas_zendikon.txt b/forge-gui/res/cardsfolder/n/nissas_zendikon.txt new file mode 100755 index 00000000000..c69b8603e89 --- /dev/null +++ b/forge-gui/res/cardsfolder/n/nissas_zendikon.txt @@ -0,0 +1,9 @@ +Name:Nissa's Zendikon +ManaCost:3 G +Types:Enchantment Aura +K:Enchant land +A:SP$ Attach | Cost$ 3 G | ValidTgts$ Land | AILogic$ Animate +S:Mode$ Continuous | Affected$ Land.AttachedBy | SetPower$ 4 | SetToughness$ 4 | AddType$ Creature & Elemental | AddKeyword$ Reach & Haste | Description$ Enchanted land is a 4/4 Elemental creature with reach and haste. It's still a land. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.AttachedBy | Execute$ TrigChangeZone | TriggerDescription$ When enchanted land dies, return that card to its owner's hand. +SVar:TrigChangeZone:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Hand +Oracle:Enchant land\nEnchanted land is a 4/4 Elemental creature with reach and haste. It's still a land.\nWhen enchanted land dies, return that card to its owner's hand. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/nullpriest_of_oblivion.txt b/forge-gui/res/cardsfolder/n/nullpriest_of_oblivion.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/nullpriest_of_oblivion.txt rename to forge-gui/res/cardsfolder/n/nullpriest_of_oblivion.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/oblivions_hunger.txt b/forge-gui/res/cardsfolder/o/oblivions_hunger.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/oblivions_hunger.txt rename to forge-gui/res/cardsfolder/o/oblivions_hunger.txt diff --git a/forge-gui/res/cardsfolder/o/obuun_mul_daya_ancestor.txt b/forge-gui/res/cardsfolder/o/obuun_mul_daya_ancestor.txt new file mode 100644 index 00000000000..92613f47e74 --- /dev/null +++ b/forge-gui/res/cardsfolder/o/obuun_mul_daya_ancestor.txt @@ -0,0 +1,12 @@ +Name:Obuun, Mul Daya Ancestor +ManaCost:1 R G W +Types:Legendary Creature Elf Spirit +PT:3/3 +T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAnimate | TriggerDescription$ At the beginning of combat on your turn, up to one target land you control becomes an X/X Elemental creature with trample and haste until end of turn, where X is CARDNAME’s power. It’s still a land. +SVar:TrigAnimate:DB$ Animate | ValidTgts$ Land.YouCtrl | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select up to one target land you control | Power$ X | Toughness$ X | References$ X | Types$ Elemental,Creature | Keywords$ Trample & Haste +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, put a +1/+1 counter on target creature. +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 +SVar:X:Count$CardPower +DeckHas:Ability$Counters +SVar:BuffedBy:Land +Oracle:At the beginning of combat on your turn, up to one target land you control becomes an X/X Elemental creature with trample and haste until end of turn, where X is Obuun’s power. It’s still a land.\nLandfall — Whenever land enters the battlefield under your control, put a +1/+1 counter on target creature. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/omnath_locus_of_creation.txt b/forge-gui/res/cardsfolder/o/omnath_locus_of_creation.txt similarity index 66% rename from forge-gui/res/cardsfolder/upcoming/ZNR/omnath_locus_of_creation.txt rename to forge-gui/res/cardsfolder/o/omnath_locus_of_creation.txt index 2a42805e30d..4f45181a378 100644 --- a/forge-gui/res/cardsfolder/upcoming/ZNR/omnath_locus_of_creation.txt +++ b/forge-gui/res/cardsfolder/o/omnath_locus_of_creation.txt @@ -7,11 +7,11 @@ SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ LandfallReset | Static$ True T:Mode$ TurnBegin | ValidPlayer$ Player | Static$ True | TriggerZones$ Battlefield | Execute$ LandfallReset SVar:LandfallReset:DB$ StoreSVar | SVar$ LandfallAmount | Type$ Number | Expression$ 0 | References$ LandfallAmount -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, you gain 4 life if this is the first time this ability has resolved this turn. If it's the second time, add {R}{G}{W}{U}. If it's the third time, CARDNAME deals 4 damage to each opponent and each planeswalker you don't control. -SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 4 | ConditionCheckSVar$ LandfallAmount | ConditionSVarCompare$ EQ0 | SubAbility$ DBMana -SVar:DBMana:DB$ Mana | Produced$ R G W U | ConditionCheckSVar$ LandfallAmount | ConditionSVarCompare$ EQ1 | SubAbility$ DBDamageAll -SVar:DBDamageAll:DB$ DamageAll | ValidPlayers$ Opponent | ValidCards$ Planeswalker.YouDontCtrl | NumDmg$ 4 | ConditionCheckSVar$ LandfallAmount | ConditionSVarCompare$ EQ2 | SubAbility$ LandfallCount -SVar:LandfallCount:DB$ StoreSVar | SVar$ LandfallAmount | Type$ CountSVar | Expression$ LandfallAmount/Plus.1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigLandfallCount | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, you gain 4 life if this is the first time this ability has resolved this turn. If it's the second time, add {R}{G}{W}{U}. If it's the third time, CARDNAME deals 4 damage to each opponent and each planeswalker you don't control. +SVar:TrigLandfallCount:DB$ StoreSVar | SVar$ LandfallAmount | Type$ CountSVar | SubAbility$ DBGainLife | Expression$ LandfallAmount/Plus.1 +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 4 | ConditionCheckSVar$ LandfallAmount | ConditionSVarCompare$ EQ1 | SubAbility$ DBMana +SVar:DBMana:DB$ Mana | Produced$ R G W U | ConditionCheckSVar$ LandfallAmount | ConditionSVarCompare$ EQ2 | SubAbility$ DBDamageAll +SVar:DBDamageAll:DB$ DamageAll | ValidPlayers$ Opponent | ValidCards$ Planeswalker.YouDontCtrl | NumDmg$ 4 | ConditionCheckSVar$ LandfallAmount | ConditionSVarCompare$ EQ3 SVar:LandfallAmount:Number$0 DeckHas:Ability$LifeGain Oracle:When Omnath, Locus of Creation enters the battlefield, draw a card.\nLandfall - Whenever a land enters the battlefield under your control, you gain 4 life if this is the first time this ability has resolved this turn. If it's the second time, add {R}{G}{W}{U}. If it's the third time, Omnath deals 4 damage to each opponent and each planeswalker you don't control. diff --git a/forge-gui/res/cardsfolder/o/omnath_locus_of_rage.txt b/forge-gui/res/cardsfolder/o/omnath_locus_of_rage.txt index 957451b3abb..7ba753e9a0b 100644 --- a/forge-gui/res/cardsfolder/o/omnath_locus_of_rage.txt +++ b/forge-gui/res/cardsfolder/o/omnath_locus_of_rage.txt @@ -4,8 +4,7 @@ Types:Legendary Creature Elemental PT:5/5 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, create a 5/5 red and green Elemental creature token. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ rg_5_5_elemental | TokenOwner$ You | LegacyImage$ rg 5 5 elemental -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerController$ TriggeredCardController | TriggerDescription$ Whenever CARDNAME or another Elemental you control dies, CARDNAME deals 3 damage to any target. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerController$ TriggeredCardController | TriggerDescription$ Whenever CARDNAME or another Elemental you control dies, CARDNAME deals 3 damage to any target. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Elemental.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerController$ TriggeredCardController | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another Elemental you control dies, CARDNAME deals 3 damage to any target. SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 -SVar:Picture:http://www.wizards.com/global/images/magic/general/omnath_locus_of_rage.jpg -Oracle:Landfall — Whenever a land enters the battlefield under your control, create a 5/5 red and green Elemental creature token.\nWhenever Omnath, Locus of Rage or another Elemental you control dies, Omnath deals 3 damage to any target. \ No newline at end of file +Oracle:Landfall — Whenever a land enters the battlefield under your control, create a 5/5 red and green Elemental creature token.\nWhenever Omnath, Locus of Rage or another Elemental you control dies, Omnath deals 3 damage to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/ondu_inversion_ondu_skyruins.txt b/forge-gui/res/cardsfolder/o/ondu_inversion_ondu_skyruins.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/ondu_inversion_ondu_skyruins.txt rename to forge-gui/res/cardsfolder/o/ondu_inversion_ondu_skyruins.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/orah_skyclave_hierophant.txt b/forge-gui/res/cardsfolder/o/orah_skyclave_hierophant.txt similarity index 79% rename from forge-gui/res/cardsfolder/upcoming/ZNR/orah_skyclave_hierophant.txt rename to forge-gui/res/cardsfolder/o/orah_skyclave_hierophant.txt index c760412568b..f12bb686902 100755 --- a/forge-gui/res/cardsfolder/upcoming/ZNR/orah_skyclave_hierophant.txt +++ b/forge-gui/res/cardsfolder/o/orah_skyclave_hierophant.txt @@ -3,7 +3,7 @@ ManaCost:2 W B Types:Legendary Creature Kor Cleric PT:3/3 K:Lifelink -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | TriggerZone$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ Whenever CARDNAME or another Cleric you control dies, return target Cleric with lesser converted mana cost from your graveyard to the battlefield. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ Whenever CARDNAME or another Cleric you control dies, return target Cleric with lesser converted mana cost from your graveyard to the battlefield. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | TriggerZone$ Battlefield | ValidCard$ Cleric.YouCtrl+Other | Execute$ TrigReturn | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another Cleric you control dies, return target Cleric card with lesser converted mana cost from your graveyard to the battlefield. SVar:TrigReturn:DB$ ChangeZone | ValidTgts$ Cleric.cmcLTX+YouOwn | TgtPrompt$ Choose target Cleric card with lesser converted mana cost | References$ X | Origin$ Graveyard | Destination$ Battlefield SVar:X:TriggeredCard$CardManaCost diff --git a/forge-gui/res/cardsfolder/o/oran_rief_ooze.txt b/forge-gui/res/cardsfolder/o/oran_rief_ooze.txt new file mode 100755 index 00000000000..944ad67f36d --- /dev/null +++ b/forge-gui/res/cardsfolder/o/oran_rief_ooze.txt @@ -0,0 +1,11 @@ +Name:Oran-Rief Ooze +ManaCost:2 G +Types:Creature Ooze +PT:2/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ When CARDNAME enters the battlefield, put a +1/+1 counter on target creature you control. +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ 1 +T:Mode$ Attacks | ValidCard$ Creature.Self | Execute$ TrigPutCounterAll | TriggerDescription$ Whenever CARDNAME attacks, put a +1/+1 counter on each attacking creature with a +1/+1 counter on it. +SVar:TrigPutCounterAll:DB$ PutCounterAll | ValidCards$ Creature.attacking+counters_GE1_P1P1 | CounterType$ P1P1 | CounterNum$ 1 +SVar:HasAttackEffect:TRUE +DeckHas:Ability$Counters +Oracle:When Oran-Rief Ooze enters the battlefield, put a +1/+1 counter on target creature you control.\nWhenever Oran-Rief Ooze attacks, put a +1/+1 counter on each attacking creature with a +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/paired_tactician.txt b/forge-gui/res/cardsfolder/p/paired_tactician.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/paired_tactician.txt rename to forge-gui/res/cardsfolder/p/paired_tactician.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/pelakka_predation_pelakka_caverns.txt b/forge-gui/res/cardsfolder/p/pelakka_predation_pelakka_caverns.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/pelakka_predation_pelakka_caverns.txt rename to forge-gui/res/cardsfolder/p/pelakka_predation_pelakka_caverns.txt diff --git a/forge-gui/res/cardsfolder/p/phylath_world_sculptor.txt b/forge-gui/res/cardsfolder/p/phylath_world_sculptor.txt new file mode 100755 index 00000000000..682674b1e4e --- /dev/null +++ b/forge-gui/res/cardsfolder/p/phylath_world_sculptor.txt @@ -0,0 +1,12 @@ +Name:Phylath, World Sculptor +ManaCost:4 R G +Types:Legendary Creature Elemental +PT:5/5 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 0/1 green Plant creature token for each basic land you control. +SVar:TrigToken:DB$ Token | TokenAmount$ X | References$ X | TokenScript$ g_0_1_plant | TokenOwner$ You +SVar:X:Count$Valid Land.Basic+YouCtrl +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, put four +1/+1 counters on target Plant you control. +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Plant.YouCtrl | TgtPrompt$ Select target Plant you control | CounterType$ P1P1 | CounterNum$ 4 +SVar:BuffedBy:Land,Land.Basic +DeckHas:Ability$Token & Ability$Counters +Oracle:When Phylath, World Sculptor enters the battlefield, create a 0/1 green Plant creature token for each basic land you control.\nLandfall — Whenever a land enters the battlefield under your control, put four +1/+1 counters on target Plant you control. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/practiced_tactics.txt b/forge-gui/res/cardsfolder/p/practiced_tactics.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/practiced_tactics.txt rename to forge-gui/res/cardsfolder/p/practiced_tactics.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/prowling_felidar.txt b/forge-gui/res/cardsfolder/p/prowling_felidar.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/prowling_felidar.txt rename to forge-gui/res/cardsfolder/p/prowling_felidar.txt diff --git a/forge-gui/res/cardsfolder/p/pyroclastic_hellion.txt b/forge-gui/res/cardsfolder/p/pyroclastic_hellion.txt new file mode 100644 index 00000000000..65f3c866064 --- /dev/null +++ b/forge-gui/res/cardsfolder/p/pyroclastic_hellion.txt @@ -0,0 +1,10 @@ +Name:Pyroclastic Hellion +ManaCost:4 R +Types:Creature Hellion +PT:4/5 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, you may return a land you control to its owner's hand. +SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Hidden$ True | ChangeType$ Land.YouCtrl | ChangeNum$ 1 | SubAbility$ DBImmediateTrigger | RememberChanged$ True | SelectPrompt$ You may choose a land you control to return to its owner's hand +SVar:DBImmediateTrigger:DB$ ImmediateTrigger | RememberObjects$ RememberedCard | ConditionDefined$ Remembered | ConditionPresent$ Card | Execute$ TrigDamage | SubAbility$ DBCleanup | TriggerDescription$ When you do, CARDNAME deals 2 damage to each opponent. +SVar:TrigDamage:DB$ DealDamage | Defined$ Player.Opponent | NumDmg$ 2 +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +Oracle:When Pyroclastic Hellion enters the battlefield, you may return a land you control to its owner's hand. When you do, Pyroclastic Hellion deals 2 damage to each opponent. diff --git a/forge-gui/res/cardsfolder/r/ravagers_mace.txt b/forge-gui/res/cardsfolder/r/ravagers_mace.txt new file mode 100755 index 00000000000..f82ef56f2a6 --- /dev/null +++ b/forge-gui/res/cardsfolder/r/ravagers_mace.txt @@ -0,0 +1,12 @@ +Name:Ravager's Mace +ManaCost:1 B R +Types:Artifact Equipment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigAttach | TriggerDescription$ When CARDNAME enters the battlefield, attach it to target creature you control. +SVar:TrigAttach:DB$ Attach | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control +S:Mode$ Continuous | Affected$ Card.EquippedBy | AddPower$ X | AddKeyword$ Menace | Description$ Equipped creature gets +1/+0 for each creature in your party and has menace. (Your party consists of up to one each of Cleric, Rogue, Warrior, and Wizard.) +SVar:X:Count$Party +K:Equip:2 B R +SVar:NeedsToPlay:Creature.YouCtrl+inZoneBattlefield +DeckHas:Ability$Party +DeckHints:Type$Cleric|Rogue|Warrior|Wizard +Oracle:When Ravager's Mace enters the battlefield, attach it to target creature you control.\nEquipped creature gets +1/+0 for each creature in your party and has menace. (Your party consists of up to one each of Cleric, Rogue, Warrior, and Wizard.)\nEquip {2}{B}{R} diff --git a/forge-gui/res/cardsfolder/r/reclaim_the_wastes.txt b/forge-gui/res/cardsfolder/r/reclaim_the_wastes.txt new file mode 100755 index 00000000000..8da72fc7a02 --- /dev/null +++ b/forge-gui/res/cardsfolder/r/reclaim_the_wastes.txt @@ -0,0 +1,7 @@ +Name:Reclaim the Wastes +ManaCost:G +Types:Sorcery +K:Kicker:3 +A:SP$ ChangeZone | Cost$ G | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeTypeDesc$ basic land | ChangeNum$ X | References$ X | SpellDescription$ Search your library for a basic land card, reveal that card, put it into your hand, then shuffle your library. If this spell was kicked, search your library for two basic land cards instead of one. +SVar:X:Count$Kicked.2.1 +Oracle:Kicker {3} (You may pay an additional {3} as you cast this spell.)\nSearch your library for a basic land card, reveal it, put it into your hand, then shuffle your library. If this spell was kicked, search your library for two basic land cards instead of one. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/relic_amulet.txt b/forge-gui/res/cardsfolder/r/relic_amulet.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/relic_amulet.txt rename to forge-gui/res/cardsfolder/r/relic_amulet.txt diff --git a/forge-gui/res/cardsfolder/r/relic_axe.txt b/forge-gui/res/cardsfolder/r/relic_axe.txt new file mode 100755 index 00000000000..dd7edc252be --- /dev/null +++ b/forge-gui/res/cardsfolder/r/relic_axe.txt @@ -0,0 +1,13 @@ +Name:Relic Axe +ManaCost:2 +Types:Artifact Equipment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigAttach | TriggerDescription$ When CARDNAME enters the battlefield, attach it to target creature you control. +SVar:TrigAttach:DB$ Attach | ValidTgts$ Creature.YouCtrl | AITgts$ Warrior | TgtPrompt$ Select target creature you control +S:Mode$ Continuous | Affected$ Card.EquippedBy | AddPower$ X | AddToughness$ 1 | References$ X,Y | Description$ Equipped creature gets +1/+1. If it's a Warrior, it gets +2/+1 instead. +SVar:X:Count$Compare Y GE1.2.1 +SVar:Y:Targeted$Valid Warrior +SVar:Y:Count$Valid Warrior.AttachedBy +K:Equip:2 +SVar:NeedsToPlay:Creature.YouCtrl+inZoneBattlefield +DeckHints:Type$Warrior +Oracle:When Relic Axe enters the battlefield, attach it to target creature you control.\nEquipped creature gets +1/+1. If it's a Warrior, it gets +2/+1 instead.\nEquip {2} diff --git a/forge-gui/res/cardsfolder/r/relic_golem.txt b/forge-gui/res/cardsfolder/r/relic_golem.txt new file mode 100755 index 00000000000..9c6a000c03f --- /dev/null +++ b/forge-gui/res/cardsfolder/r/relic_golem.txt @@ -0,0 +1,9 @@ +Name:Relic Golem +ManaCost:3 +Types:Artifact Creature Golem +PT:6/6 +S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME can't attack or block. | CheckSVar$ X | SVarCompare$ LT8 | Description$ CARDNAME can't attack or block unless an opponent has eight or more cards in their graveyard. +SVar:X:PlayerCountOpponents$HighestCardsInGraveyard +A:AB$ Mill | Cost$ 2 T | NumCards$ 2 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player mills two cards. (They put the top two cards of their library into their graveyard.) +DeckHas:Ability$Mill +Oracle:Relic Golem can't attack or block unless an opponent has eight or more cards in their graveyard.\n{2}, {T}: Target player mills two cards. (They put the top two cards of their library into their graveyard.) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/relic_robber.txt b/forge-gui/res/cardsfolder/r/relic_robber.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/relic_robber.txt rename to forge-gui/res/cardsfolder/r/relic_robber.txt diff --git a/forge-gui/res/cardsfolder/r/relic_vial.txt b/forge-gui/res/cardsfolder/r/relic_vial.txt new file mode 100644 index 00000000000..c9ed307fa8c --- /dev/null +++ b/forge-gui/res/cardsfolder/r/relic_vial.txt @@ -0,0 +1,11 @@ +Name:Relic Vial +ManaCost:3 +Types:Artifact +A:AB$ Draw | Cost$ 2 T Sac<1/Creature> | NumCards$ 1 | SpellDescription$ Draw a card. +S:Mode$ Continuous | Affected$ Card.Self | AddTrigger$ TrigDrain | IsPresent$ Cleric.YouCtrl | Description$ As long as you control a Cleric, CARDNAME has "Whenever a creature you control dies, each opponent loses 1 life and you gain 1 life." +SVar:TrigDrain:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever a creature you control dies, each opponent loses 1 life and you gain 1 life. +SVar:TrigLoseLife:DB$ LoseLife | Defined$ Player.Opponent | LifeAmount$ 1 | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 +DeckHas:Ability$Sacrifice & Ability$LifeGain +DeckNeeds:Type$Cleric +Oracle:{2}, {T}, Sacrifice a creature: Draw a card.\nAs long as you control a Cleric, Relic Vial has "Whenever a creature you control dies, each opponent loses 1 life and you gain 1 life." diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/resolute_strike.txt b/forge-gui/res/cardsfolder/r/resolute_strike.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/resolute_strike.txt rename to forge-gui/res/cardsfolder/r/resolute_strike.txt diff --git a/forge-gui/res/cardsfolder/r/reweave.txt b/forge-gui/res/cardsfolder/r/reweave.txt index 21103b71615..94d2ef7ca4c 100644 --- a/forge-gui/res/cardsfolder/r/reweave.txt +++ b/forge-gui/res/cardsfolder/r/reweave.txt @@ -2,10 +2,9 @@ Name:Reweave ManaCost:5 U Types:Instant Arcane K:Splice:Arcane:2 U U -A:SP$ Destroy | Cost$ 5 U | ValidTgts$ Permanent | Sacrifice$ True | SubAbility$ DBDigUntil | RememberDestroyed$ True | SpellDescription$ Target permanent's controller sacrifices it. If they do, that player reveals cards from the top of their library until they reveal a permanent card that shares a card type with the sacrificed permanent, puts that card onto the battlefield, then shuffles their library. -SVar:DBDigUntil:DB$ DigUntil | Defined$ TargetedController | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ1 | Valid$ Permanent.sharesCardTypeWith Remembered | ValidDescription$ permanent card that shares a card type with the sacrificed permanent | FoundDestination$ Battlefield | RevealedDestination$ Library | Shuffle$ True | SubAbility$ DBCleanup +A:SP$ Destroy | Cost$ 5 U | ValidTgts$ Permanent | Sacrifice$ True | SubAbility$ DBDigUntil | RememberLKI$ True | StackDescription$ {p:TargetedController} destroys {c:Targeted}. If {p:TargetedController} does, | SpellDescription$ Target permanent's controller sacrifices it. If they do, that player reveals cards from the top of their library until they reveal a permanent card that shares a card type with the sacrificed permanent, puts that card onto the battlefield, then shuffles their library. +SVar:DBDigUntil:DB$ DigUntil | Defined$ RememberedController | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ EQ1 | Valid$ Permanent.sharesCardTypeWith Remembered | ValidDescription$ permanent card that shares a card type with the sacrificed permanent | FoundDestination$ Battlefield | RevealedDestination$ Library | Shuffle$ True | StackDescription$ they reveal cards from the top of their library until they reveal a permanent card that shares a card type with {c:Targeted}, put that card onto the battlefield, then shuffle their library. | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True AI:RemoveDeck:All DeckHints:Type$Arcane -SVar:Picture:http://www.wizards.com/global/images/magic/general/reweave.jpg Oracle:Target permanent's controller sacrifices it. If they do, that player reveals cards from the top of their library until they reveal a permanent card that shares a card type with the sacrificed permanent, puts that card onto the battlefield, then shuffles their library.\nSplice onto Arcane {2}{U}{U} (As you cast an Arcane spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell.) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/risen_riptide.txt b/forge-gui/res/cardsfolder/r/risen_riptide.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/risen_riptide.txt rename to forge-gui/res/cardsfolder/r/risen_riptide.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/riverglide_pathway_lavaglide_pathway.txt b/forge-gui/res/cardsfolder/r/riverglide_pathway_lavaglide_pathway.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/riverglide_pathway_lavaglide_pathway.txt rename to forge-gui/res/cardsfolder/r/riverglide_pathway_lavaglide_pathway.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/rockslide_sorcerer.txt b/forge-gui/res/cardsfolder/r/rockslide_sorcerer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/rockslide_sorcerer.txt rename to forge-gui/res/cardsfolder/r/rockslide_sorcerer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/roil_eruption.txt b/forge-gui/res/cardsfolder/r/roil_eruption.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/roil_eruption.txt rename to forge-gui/res/cardsfolder/r/roil_eruption.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/roiling_regrowth.txt b/forge-gui/res/cardsfolder/r/roiling_regrowth.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/roiling_regrowth.txt rename to forge-gui/res/cardsfolder/r/roiling_regrowth.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/roiling_vortex.txt b/forge-gui/res/cardsfolder/r/roiling_vortex.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/roiling_vortex.txt rename to forge-gui/res/cardsfolder/r/roiling_vortex.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/roost_of_drakes.txt b/forge-gui/res/cardsfolder/r/roost_of_drakes.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/roost_of_drakes.txt rename to forge-gui/res/cardsfolder/r/roost_of_drakes.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/ruin_crab.txt b/forge-gui/res/cardsfolder/r/ruin_crab.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/ruin_crab.txt rename to forge-gui/res/cardsfolder/r/ruin_crab.txt diff --git a/forge-gui/res/cardsfolder/s/scale_the_heights.txt b/forge-gui/res/cardsfolder/s/scale_the_heights.txt new file mode 100755 index 00000000000..875db2b69ee --- /dev/null +++ b/forge-gui/res/cardsfolder/s/scale_the_heights.txt @@ -0,0 +1,10 @@ +Name:Scale the Heights +ManaCost:2 G +Types:Sorcery +A:SP$ PutCounter | Cost$ 2 G | ValidTgts$ Creature | TgtPrompt$ Select up to one target creature | CounterType$ P1P1 | CounterNum$ 1 | TargetMin$ 0 | TargetMax$ 1 | SubAbility$ DBGainLife | SpellDescription$ Put a +1/+1 counter on up to one target creature. +SVar:DBGainLife:DB$ GainLife | LifeAmount$ 2 | SubAbility$ DBEffect | SpellDescription$ You gain 2 life. +SVar:DBEffect:DB$ Effect | StaticAbilities$ LandPlay | AILogic$ Always | SubAbility$ DBDraw | SpellDescription$ You may play an additional land this turn. +SVar:LandPlay:Mode$ Continuous | Affected$ You | AdjustLandPlays$ 1 | EffectZone$ Command | Description$ You may play an additional land this turn. +SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card. +DeckHas:Ability$Counters & Ability$LifeGain +Oracle:Put a +1/+1 counter on up to one target creature. You gain 2 life. You may play an additional land this turn.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/scavenged_blade.txt b/forge-gui/res/cardsfolder/s/scavenged_blade.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/scavenged_blade.txt rename to forge-gui/res/cardsfolder/s/scavenged_blade.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/scion_of_the_swarm.txt b/forge-gui/res/cardsfolder/s/scion_of_the_swarm.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/scion_of_the_swarm.txt rename to forge-gui/res/cardsfolder/s/scion_of_the_swarm.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/scorch_rider.txt b/forge-gui/res/cardsfolder/s/scorch_rider.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/scorch_rider.txt rename to forge-gui/res/cardsfolder/s/scorch_rider.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/scourge_of_the_skyclaves.txt b/forge-gui/res/cardsfolder/s/scourge_of_the_skyclaves.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/scourge_of_the_skyclaves.txt rename to forge-gui/res/cardsfolder/s/scourge_of_the_skyclaves.txt diff --git a/forge-gui/res/cardsfolder/s/scute_swarm.txt b/forge-gui/res/cardsfolder/s/scute_swarm.txt new file mode 100755 index 00000000000..a33e408a7bc --- /dev/null +++ b/forge-gui/res/cardsfolder/s/scute_swarm.txt @@ -0,0 +1,12 @@ +Name:Scute Swarm +ManaCost:2 G +Types:Creature Insect +PT:1/1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigBranch | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, create a 1/1 green Insect creature token. If you control six or more lands, create a token that's a copy of CARDNAME instead. +SVar:TrigBranch:DB$ Branch | References$ X | BranchConditionSVar$ X | BranchConditionSVarCompare$ GE6 | TrueSubAbility$ DBCopy | FalseSubAbility$ DBToken +SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ g_1_1_insect | TokenOwner$ You +SVar:DBCopy:DB$ CopyPermanent | Defined$ Self | NumCopies$ 1 +SVar:X:Count$Valid Land.YouCtrl +DeckHas:Ability$Token +SVar:BuffedBy:Land +Oracle:Landfall — Whenever a land enters the battlefield under your control, create a 1/1 green Insect creature token. If you control six or more lands, create a token that's a copy of Scute Swarm instead. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/sea_gate_banneret.txt b/forge-gui/res/cardsfolder/s/sea_gate_banneret.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/sea_gate_banneret.txt rename to forge-gui/res/cardsfolder/s/sea_gate_banneret.txt diff --git a/forge-gui/res/cardsfolder/s/sea_gate_colossus.txt b/forge-gui/res/cardsfolder/s/sea_gate_colossus.txt new file mode 100644 index 00000000000..a5ae88f9f84 --- /dev/null +++ b/forge-gui/res/cardsfolder/s/sea_gate_colossus.txt @@ -0,0 +1,9 @@ +Name:Sea Gate Colossus +ManaCost:7 +Types:Artifact Creature Golem Warrior +PT:7/5 +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | References$ X | EffectZone$ All | Description$ This spell costs {1} less to cast for each creature in your party. +SVar:X:Count$Party +DeckHas:Ability$Party +DeckHints:Type$Cleric|Rogue|Warrior|Wizard +Oracle:This spell costs {1} less to cast for each creature in your party. (Your party consists of up to one each of Cleric, Rogue, Warrior, and Wizard.) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/sea_gate_restoration_sea_gate_reborn.txt b/forge-gui/res/cardsfolder/s/sea_gate_restoration_sea_gate_reborn.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/sea_gate_restoration_sea_gate_reborn.txt rename to forge-gui/res/cardsfolder/s/sea_gate_restoration_sea_gate_reborn.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/sea_gate_stormcaller.txt b/forge-gui/res/cardsfolder/s/sea_gate_stormcaller.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/sea_gate_stormcaller.txt rename to forge-gui/res/cardsfolder/s/sea_gate_stormcaller.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/seafloor_stalker.txt b/forge-gui/res/cardsfolder/s/seafloor_stalker.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/seafloor_stalker.txt rename to forge-gui/res/cardsfolder/s/seafloor_stalker.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/sejiri_shelter_sejiri_glacier.txt b/forge-gui/res/cardsfolder/s/sejiri_shelter_sejiri_glacier.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/sejiri_shelter_sejiri_glacier.txt rename to forge-gui/res/cardsfolder/s/sejiri_shelter_sejiri_glacier.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/shadow_stinger.txt b/forge-gui/res/cardsfolder/s/shadow_stinger.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/shadow_stinger.txt rename to forge-gui/res/cardsfolder/s/shadow_stinger.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/shadows_verdict.txt b/forge-gui/res/cardsfolder/s/shadows_verdict.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/shadows_verdict.txt rename to forge-gui/res/cardsfolder/s/shadows_verdict.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/shatterskull_charger.txt b/forge-gui/res/cardsfolder/s/shatterskull_charger.txt similarity index 57% rename from forge-gui/res/cardsfolder/upcoming/ZNR/shatterskull_charger.txt rename to forge-gui/res/cardsfolder/s/shatterskull_charger.txt index af28bda3a88..c43c01ace52 100755 --- a/forge-gui/res/cardsfolder/upcoming/ZNR/shatterskull_charger.txt +++ b/forge-gui/res/cardsfolder/s/shatterskull_charger.txt @@ -7,8 +7,8 @@ K:Trample K:Haste K:etbCounter:P1P1:1:CheckSVar$ WasKicked:If CARDNAME was kicked, it enters the battlefield with a +1/+1 counter on it. SVar:WasKicked:Count$Kicked.1.0 -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ Player | Execute$ TrigReturn | IsPresent$ Card.Self+counters_EQ0_P1P1 | TriggerDescription$ At the beginning of the end step, return Shatterskull Charger to its owner's hand unless it has a +1/+1 counter on it. +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | Execute$ TrigReturn | IsPresent$ Card.Self+counters_EQ0_P1P1 | TriggerDescription$ At the beginning of your end step, return Shatterskull Charger to its owner's hand unless it has a +1/+1 counter on it. SVar:TrigReturn:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Defined$ Self SVar:PlayMain1:TRUE DeckHas:Ability$Counters -Oracle:Kicker {2}\nTrample, haste\nIf Shatterskull Charger was kicked, it enters the battlefield with a +1/+1 counter on it.\nAt the beginning of the end step, return Shatterskull Charger to its owner's hand unless it has a +1/+1 counter on it. +Oracle:Kicker {2}\nTrample, haste\nIf Shatterskull Charger was kicked, it enters the battlefield with a +1/+1 counter on it.\nAt the beginning of your end step, return Shatterskull Charger to its owner's hand unless it has a +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/s/shatterskull_minotaur.txt b/forge-gui/res/cardsfolder/s/shatterskull_minotaur.txt new file mode 100644 index 00000000000..2c5507f62d9 --- /dev/null +++ b/forge-gui/res/cardsfolder/s/shatterskull_minotaur.txt @@ -0,0 +1,10 @@ +Name:Shatterskull Minotaur +ManaCost:4 R R +Types:Creature Minotaur Warrior +PT:5/4 +K:Haste +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | References$ X | Description$ This spell costs {1} less to cast for each creature in your party. (Your party consists of up to one each of Cleric, Rogue, Warrior, and Wizard.) +SVar:X:Count$Party +DeckHas:Ability$Party +DeckHints:Type$Cleric|Rogue|Wizard +Oracle:This spell costs {1} less to cast for each creature in your party. (Your party consists of up to one each of Cleric, Rogue, Warrior, and Wizard.)\nHaste diff --git a/forge-gui/res/cardsfolder/s/shatterskull_smashing_shatterskull_the_hammer_pass.txt b/forge-gui/res/cardsfolder/s/shatterskull_smashing_shatterskull_the_hammer_pass.txt new file mode 100644 index 00000000000..3d415f23313 --- /dev/null +++ b/forge-gui/res/cardsfolder/s/shatterskull_smashing_shatterskull_the_hammer_pass.txt @@ -0,0 +1,19 @@ +Name:Shatterskull Smashing +ManaCost:X R R +Types:Sorcery +A:SP$ DealDamage | Cost$ X R R | NumDmg$ Y | References$ X,Y,Z | ValidTgts$ Creature,Planeswalker | TargetMin$ 0 | TargetMax$ 2 | DividedAsYouChoose$ Y | TgtPrompt$ Select up to two target creatures and/or planeswalkers | SpellDescription$ CARDNAME deals X damage divided as you choose among up to two target creatures and/or planeswalkers. If X is 6 or more, CARDNAME deals twice X damage divided as you choose among them instead. +SVar:X:Count$xPaid +SVar:Y:Count$Compare X LT6.X.Z +SVar:Z:Count$xPaid/Twice +AlternateMode:Modal +Oracle:Shatterskull Smashing deals X damage divided as you choose among up to two target creatures and/or planeswalkers. If X is 6 or more, Shatterskull Smashing deals twice X damage divided as you choose among them instead. + +ALTERNATE + +Name:Shatterskull, the Hammer Pass +ManaCost:no cost +Types:Land +K:ETBReplacement:Other:DBTap +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<3> | UnlessPayer$ You | UnlessAI$ Shockland | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped. +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +Oracle:As Shatterskull, the Hammer Pass enters the battlefield, you may pay 3 life. If you don’t, it enters the battlefield tapped.\n{T}: Add {R}. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/shell_shield.txt b/forge-gui/res/cardsfolder/s/shell_shield.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/shell_shield.txt rename to forge-gui/res/cardsfolder/s/shell_shield.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/shepherd_of_heroes.txt b/forge-gui/res/cardsfolder/s/shepherd_of_heroes.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/shepherd_of_heroes.txt rename to forge-gui/res/cardsfolder/s/shepherd_of_heroes.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/silundi_vision_silundi_isle.txt b/forge-gui/res/cardsfolder/s/silundi_vision_silundi_isle.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/silundi_vision_silundi_isle.txt rename to forge-gui/res/cardsfolder/s/silundi_vision_silundi_isle.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/sizzling_barrage.txt b/forge-gui/res/cardsfolder/s/sizzling_barrage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/sizzling_barrage.txt rename to forge-gui/res/cardsfolder/s/sizzling_barrage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_apparition.txt b/forge-gui/res/cardsfolder/s/skyclave_apparition.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_apparition.txt rename to forge-gui/res/cardsfolder/s/skyclave_apparition.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_cleric_skyclave_basilica.txt b/forge-gui/res/cardsfolder/s/skyclave_cleric_skyclave_basilica.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_cleric_skyclave_basilica.txt rename to forge-gui/res/cardsfolder/s/skyclave_cleric_skyclave_basilica.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_geopede.txt b/forge-gui/res/cardsfolder/s/skyclave_geopede.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_geopede.txt rename to forge-gui/res/cardsfolder/s/skyclave_geopede.txt diff --git a/forge-gui/res/cardsfolder/s/skyclave_pick_axe.txt b/forge-gui/res/cardsfolder/s/skyclave_pick_axe.txt new file mode 100755 index 00000000000..67d096c6630 --- /dev/null +++ b/forge-gui/res/cardsfolder/s/skyclave_pick_axe.txt @@ -0,0 +1,11 @@ +Name:Skyclave Pick-Axe +ManaCost:G +Types:Artifact Equipment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigAttach | TriggerDescription$ When CARDNAME enters the battlefield, attach it to target creature you control. +SVar:TrigAttach:DB$ Attach | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, equipped creature gets +2/+2 until end of turn. +SVar:TrigPump:DB$ Pump | Defined$ Equipped | NumAtt$ 2 | NumDef$ 2 +K:Equip:2 G +SVar:NeedsToPlay:Creature.YouCtrl+inZoneBattlefield +SVar:BuffedBy:Land +Oracle:Skyclave Pick-Axe enters the battlefield, attach it to target creature you control.\nLandfall — Whenever a land enters the battlefield under your control, equipped creature gets +2/+2 until end of turn.\nEquip {2}{G} diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_plunder.txt b/forge-gui/res/cardsfolder/s/skyclave_plunder.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_plunder.txt rename to forge-gui/res/cardsfolder/s/skyclave_plunder.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_relic.txt b/forge-gui/res/cardsfolder/s/skyclave_relic.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_relic.txt rename to forge-gui/res/cardsfolder/s/skyclave_relic.txt diff --git a/forge-gui/res/cardsfolder/s/skyclave_sentinel.txt b/forge-gui/res/cardsfolder/s/skyclave_sentinel.txt new file mode 100644 index 00000000000..bfac1929b3f --- /dev/null +++ b/forge-gui/res/cardsfolder/s/skyclave_sentinel.txt @@ -0,0 +1,12 @@ +Name:Skyclave Sentinel +ManaCost:3 +Types:Artifact Creature Gargoyle +PT:2/3 +K:Kicker:4 +K:Flying +K:Defender +K:etbCounter:P1P1:2:CheckSVar$ WasKicked:If CARDNAME was kicked, it enters the battlefield with two +1/+1 counters on it. +S:Mode$ Continuous | Affected$ Card.Self+counters_GE1_P1P1 | AddHiddenKeyword$ CARDNAME can attack as though it didn't have defender. | Description$ As long as CARDNAME has a +1/+1 counter on it, it can attack as though it didn't have defender. +SVar:WasKicked:Count$Kicked.1.0 +DeckHas:Ability$Counters +Oracle:Kicker {4} (You may pay an additional {4} as you cast this spell).\nFlying, defender\nIf Skyclave Sentinel was kicked, it enters the battlefield with two +1/+1 counters on it.\nAs long as Skyclave Sentinel has a +1/+1 counter on it, it can attack as though it didn't have defender. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_shade.txt b/forge-gui/res/cardsfolder/s/skyclave_shade.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_shade.txt rename to forge-gui/res/cardsfolder/s/skyclave_shade.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_shadowcat.txt b/forge-gui/res/cardsfolder/s/skyclave_shadowcat.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_shadowcat.txt rename to forge-gui/res/cardsfolder/s/skyclave_shadowcat.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_squid.txt b/forge-gui/res/cardsfolder/s/skyclave_squid.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/skyclave_squid.txt rename to forge-gui/res/cardsfolder/s/skyclave_squid.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/sneaking_guide.txt b/forge-gui/res/cardsfolder/s/sneaking_guide.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/sneaking_guide.txt rename to forge-gui/res/cardsfolder/s/sneaking_guide.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/soaring_thought_thief.txt b/forge-gui/res/cardsfolder/s/soaring_thought_thief.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/soaring_thought_thief.txt rename to forge-gui/res/cardsfolder/s/soaring_thought_thief.txt diff --git a/forge-gui/res/cardsfolder/s/song_mad_treachery_song_mad_ruins.txt b/forge-gui/res/cardsfolder/s/song_mad_treachery_song_mad_ruins.txt new file mode 100644 index 00000000000..2d82b98865e --- /dev/null +++ b/forge-gui/res/cardsfolder/s/song_mad_treachery_song_mad_ruins.txt @@ -0,0 +1,15 @@ +Name:Song-Mad Treachery +ManaCost:3 R R +Types:Sorcery +A:SP$ GainControl | Cost$ 3 R R | ValidTgts$ Creature | TgtPrompt$ Select target creature | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | StackDescription$ {p:You} gains control of {c:Targeted} until end of turn. Untap it. It gains haste until end of turn. | SpellDescription$ Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. +AlternateMode:Modal +Oracle:Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. + +ALTERNATE + +Name:Song-Mad Ruins +ManaCost:no cost +Types:Land +K:CARDNAME enters the battlefield tapped. +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +Oracle:Song-Mad Ruins enters the battlefield tapped.\n{T}: Add {R}. diff --git a/forge-gui/res/cardsfolder/s/soul_shatter.txt b/forge-gui/res/cardsfolder/s/soul_shatter.txt new file mode 100755 index 00000000000..e15b44612a2 --- /dev/null +++ b/forge-gui/res/cardsfolder/s/soul_shatter.txt @@ -0,0 +1,12 @@ +Name:Soul Shatter +ManaCost:2 B +Types:Instant +A:SP$ RepeatEach | Cost$ 2 B | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ CreatureHighCMC | SubAbility$ DBSac | StackDescription$ Each opponent | SpellDescription$ Each opponent sacrifices a creature or planeswalker with the highest converted mana cost among creatures and planeswalkers they control. +SVar:CreatureHighCMC:DB$ ChooseCard | ConditionCheckSVar$ X | ConditionSVarCompare$ GTY | Defined$ Player.IsRemembered | Choices$ Creature.RememberedPlayerCtrl+cmcEQX | ChoiceTitle$ Choose a creature with the highest converted mana cost to sacrifice | References$ X,Y | Mandatory$ True | RememberChosen$ True | SubAbility$ WalkerHighCMC +SVar:WalkerHighCMC:DB$ ChooseCard | ConditionCheckSVar$ Y | ConditionSVarCompare$ GTX | Defined$ Player.IsRemembered | Choices$ Planeswalker.RememberedPlayerCtrl+cmcEQY | ChoiceTitle$ Choose a planeswalker with the highest converted mana cost to sacrifice | References$ X,Y | Mandatory$ True | RememberChosen$ True | SubAbility$ TieCMC +SVar:TieCMC:DB$ ChooseCard | ConditionCheckSVar$ X | ConditionSVarCompare$ EQY | Defined$ Player.IsRemembered | Choices$ Creature.RememberedPlayerCtrl+cmcEQX,Planeswalker.RememberedPlayerCtrl+cmcEQX | ChoiceTitle$ Choose a creature or planeswalker with the highest converted mana cost to sacrifice | References$ X,Y | Mandatory$ True | RememberChosen$ True +SVar:DBSac:DB$ SacrificeAll | ValidCards$ Card.IsRemembered | SubAbility$ DBCleanup | StackDescription$ sacrifices a creature or planeswalker with the highest converted mana cost among creatures and planeswalkers they control. +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosen$ True +SVar:X:Count$HighestCMC_Creature.RememberedPlayerCtrl+inZoneBattlefield +SVar:Y:Count$HighestCMC_Planeswalker.RememberedPlayerCtrl+inZoneBattlefield +Oracle:Each opponent sacrifices a creature or planeswalker with the highest converted mana cost among creatures and planeswalkers they control. diff --git a/forge-gui/res/cardsfolder/s/spare_supplies.txt b/forge-gui/res/cardsfolder/s/spare_supplies.txt new file mode 100644 index 00000000000..0c95ab7c428 --- /dev/null +++ b/forge-gui/res/cardsfolder/s/spare_supplies.txt @@ -0,0 +1,9 @@ +Name:Spare Supplies +ManaCost:2 +Types:Artifact +K:CARDNAME enters the battlefield tapped. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 +A:AB$ Draw | Cost$ 2 T Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. +DeckHas:Ability$Sacrifice +Oracle:Spare Supplies enters the battlefield tapped.\nWhen Spare Supplies enters the battlefield, draw a card.\n{2}, {T}, Sacrifice Spare Supplies: Draw a card. diff --git a/forge-gui/res/cardsfolder/s/spikefield_hazard_spikefield_cave.txt b/forge-gui/res/cardsfolder/s/spikefield_hazard_spikefield_cave.txt new file mode 100644 index 00000000000..61504f179a9 --- /dev/null +++ b/forge-gui/res/cardsfolder/s/spikefield_hazard_spikefield_cave.txt @@ -0,0 +1,15 @@ +Name:Spikefield Hazard +ManaCost:R +Types:Instant +A:SP$ DealDamage | Cost$ R | NumDmg$ 1 | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | ReplaceDyingDefined$ Targeted | SpellDescription$ CARDNAME deals 1 damage to any target. If a permanent dealt damage this way would die this turn, exile it instead. +AlternateMode:Modal +Oracle:Spikefield Hazard deals 1 damage to any target. If a permanent dealt damage this way would die this turn, exile it instead. + +ALTERNATE + +Name:Spikefield Cave +ManaCost:no cost +Types:Land +K:CARDNAME enters the battlefield tapped. +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +Oracle:Spikefield Cave enters the battlefield tapped.\n{T}: Add {R}. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/spitfire_lagac.txt b/forge-gui/res/cardsfolder/s/spitfire_lagac.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/spitfire_lagac.txt rename to forge-gui/res/cardsfolder/s/spitfire_lagac.txt diff --git a/forge-gui/res/cardsfolder/s/spoils_of_adventure.txt b/forge-gui/res/cardsfolder/s/spoils_of_adventure.txt new file mode 100755 index 00000000000..c9ba92d79e9 --- /dev/null +++ b/forge-gui/res/cardsfolder/s/spoils_of_adventure.txt @@ -0,0 +1,10 @@ +Name:Spoils of Adventure +ManaCost:4 W U +Types:Instant +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | References$ X | Description$ This spell costs {1} less to cast for each creature in your party. +SVar:X:Count$Party +A:SP$ GainLife | Cost$ 4 W U | LifeAmount$ 3 | SubAbility$ DBDraw | SpellDescription$ You gain 3 life and draw three cards. +SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 3 +DeckHas:Ability$Party +DeckHints:Type$Cleric|Rogue|Warrior|Wizard +Oracle:This spell costs {1} less to cast for each creature in your party. (Your party consists of up to one each of Cleric, Rogue, Warrior, and Wizard.)\nYou gain 3 life and draw three cards. diff --git a/forge-gui/res/cardsfolder/s/springmantle_cleric.txt b/forge-gui/res/cardsfolder/s/springmantle_cleric.txt new file mode 100644 index 00000000000..a181994b9e5 --- /dev/null +++ b/forge-gui/res/cardsfolder/s/springmantle_cleric.txt @@ -0,0 +1,8 @@ +Name:Springmantle Cleric +ManaCost:4 G +Types:Creature Elf Cleric +PT:2/3 +K:etbCounter:P1P1:X:no Condition:CARDNAME enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it. +SVar:X:Count$Converge +DeckHas:Ability$Counters +Oracle:Springmantle Cleric enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/squad_commander.txt b/forge-gui/res/cardsfolder/s/squad_commander.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/squad_commander.txt rename to forge-gui/res/cardsfolder/s/squad_commander.txt diff --git a/forge-gui/res/cardsfolder/s/stonework_packbeast.txt b/forge-gui/res/cardsfolder/s/stonework_packbeast.txt new file mode 100644 index 00000000000..3f05aded909 --- /dev/null +++ b/forge-gui/res/cardsfolder/s/stonework_packbeast.txt @@ -0,0 +1,8 @@ +Name:Stonework Packbeast +ManaCost:2 +Types:Artifact Creature Beast +PT:2/1 +S:Mode$ Continuous | EffectZone$ All | Affected$ Card.Self | CharacteristicDefining$ True | AddType$ Cleric & Rogue & Warrior & Wizard | Description$ CARDNAME is also a Cleric, Rogue, Warrior, and Wizard. +A:AB$ Mana | Cost$ 2 | Produced$ Any | SpellDescription$ Add one mana of any color. +DeckHints:Ability$Party +Oracle:Stonework Packbeast is also a Cleric, Rogue, Warrior, and Wizard.\n{2}: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/s/strength_of_solidarity.txt b/forge-gui/res/cardsfolder/s/strength_of_solidarity.txt new file mode 100755 index 00000000000..e11aa4e862e --- /dev/null +++ b/forge-gui/res/cardsfolder/s/strength_of_solidarity.txt @@ -0,0 +1,9 @@ +Name:Strength of Solidarity +ManaCost:G +Types:Sorcery +A:SP$ PutCounter | Cost$ G | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ X | References$ X | SpellDescription$ Choose target creature you control. Put a +1/+1 counter on it for each creature in your party. (Your party consists of up to one each of Cleric, Rogue, Warrior, and Wizard.) +DeckHas:Ability$Party & Ability$Counters +DeckHints:Type$Cleric|Rogue|Warrior|Wizard +SVar:X:Count$Party +SVar:NeedsToPlayVar:X GE1 +Oracle:Choose target creature you control. Put a +1/+1 counter on it for each creature in your party. (Your party consists of up to one each of Cleric, Rogue, Warrior, and Wizard.) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/sure_footed_infiltrator.txt b/forge-gui/res/cardsfolder/s/sure_footed_infiltrator.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/sure_footed_infiltrator.txt rename to forge-gui/res/cardsfolder/s/sure_footed_infiltrator.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/swarm_shambler.txt b/forge-gui/res/cardsfolder/s/swarm_shambler.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/swarm_shambler.txt rename to forge-gui/res/cardsfolder/s/swarm_shambler.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/synchronized_spellcraft.txt b/forge-gui/res/cardsfolder/s/synchronized_spellcraft.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/synchronized_spellcraft.txt rename to forge-gui/res/cardsfolder/s/synchronized_spellcraft.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/taborax_hopes_demise.txt b/forge-gui/res/cardsfolder/t/taborax_hopes_demise.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/taborax_hopes_demise.txt rename to forge-gui/res/cardsfolder/t/taborax_hopes_demise.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/tajuru_blightblade.txt b/forge-gui/res/cardsfolder/t/tajuru_blightblade.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/tajuru_blightblade.txt rename to forge-gui/res/cardsfolder/t/tajuru_blightblade.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/tajuru_paragon.txt b/forge-gui/res/cardsfolder/t/tajuru_paragon.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/tajuru_paragon.txt rename to forge-gui/res/cardsfolder/t/tajuru_paragon.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/tajuru_snarecaster.txt b/forge-gui/res/cardsfolder/t/tajuru_snarecaster.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/tajuru_snarecaster.txt rename to forge-gui/res/cardsfolder/t/tajuru_snarecaster.txt diff --git a/forge-gui/res/cardsfolder/t/tangled_florahedron_tangled_vale.txt b/forge-gui/res/cardsfolder/t/tangled_florahedron_tangled_vale.txt new file mode 100644 index 00000000000..fb04efc0d4b --- /dev/null +++ b/forge-gui/res/cardsfolder/t/tangled_florahedron_tangled_vale.txt @@ -0,0 +1,16 @@ +Name:Tangled Florahedron +ManaCost:1 G +Types:Creature Elemental +PT:1/1 +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +AlternateMode:Modal +Oracle:{T}: Add {G}. + +ALTERNATE + +Name:Tangled Vale +ManaCost:no cost +Types:Land +K:CARDNAME enters the battlefield tapped. +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +Oracle:Tangled Vale enters the battlefield tapped.\n{T}: Add {G}. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/taunting_arbormage.txt b/forge-gui/res/cardsfolder/t/taunting_arbormage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/taunting_arbormage.txt rename to forge-gui/res/cardsfolder/t/taunting_arbormage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/tazeem_raptor.txt b/forge-gui/res/cardsfolder/t/tazeem_raptor.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/tazeem_raptor.txt rename to forge-gui/res/cardsfolder/t/tazeem_raptor.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/tazeem_roilmage.txt b/forge-gui/res/cardsfolder/t/tazeem_roilmage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/tazeem_roilmage.txt rename to forge-gui/res/cardsfolder/t/tazeem_roilmage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/tazri_beacon_of_unity.txt b/forge-gui/res/cardsfolder/t/tazri_beacon_of_unity.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/tazri_beacon_of_unity.txt rename to forge-gui/res/cardsfolder/t/tazri_beacon_of_unity.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/teeterpeak_ambusher.txt b/forge-gui/res/cardsfolder/t/teeterpeak_ambusher.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/teeterpeak_ambusher.txt rename to forge-gui/res/cardsfolder/t/teeterpeak_ambusher.txt diff --git a/forge-gui/res/cardsfolder/t/territorial_scythecat.txt b/forge-gui/res/cardsfolder/t/territorial_scythecat.txt new file mode 100644 index 00000000000..4e60e7a54f9 --- /dev/null +++ b/forge-gui/res/cardsfolder/t/territorial_scythecat.txt @@ -0,0 +1,10 @@ +Name:Territorial Scythecat +ManaCost:2 G +Types:Creature Cat +PT:2/1 +K:Trample +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, put a +1/+1 counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +SVar:BuffedBy:Land +DeckHas:Ability$Counters +Oracle:Trample\nLandfall — Whenever a land enters the battlefield under your control, put a +1/+1 counter on Territorial Scythecat. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/thieving_skydiver.txt b/forge-gui/res/cardsfolder/t/thieving_skydiver.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/thieving_skydiver.txt rename to forge-gui/res/cardsfolder/t/thieving_skydiver.txt diff --git a/forge-gui/res/cardsfolder/t/throne_of_makindi.txt b/forge-gui/res/cardsfolder/t/throne_of_makindi.txt new file mode 100644 index 00000000000..a583aeb926b --- /dev/null +++ b/forge-gui/res/cardsfolder/t/throne_of_makindi.txt @@ -0,0 +1,8 @@ +Name:Throne of Makindi +ManaCost:no cost +Types:Land +A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. +A:AB$ PutCounter | Cost$ 1 T | Defined$ Self | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. +A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ Any | Amount$ 2 | RestrictValid$ Spell.Kicked | SpellDescription$ Add two mana of any one color. Spend this mana only to cast kicked spells. +DeckHas:Ability$Counters +Oracle:{T}: Add {C}.\n{1}, {T}: Put a charge counter on Throne of Makindi.\n{T}, Remove a charge counter from Throne of Makindi: Add two mana of any one color. Spend this mana only to cast kicked spells. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/thundering_rebuke.txt b/forge-gui/res/cardsfolder/t/thundering_rebuke.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/thundering_rebuke.txt rename to forge-gui/res/cardsfolder/t/thundering_rebuke.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/thundering_sparkmage.txt b/forge-gui/res/cardsfolder/t/thundering_sparkmage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/thundering_sparkmage.txt rename to forge-gui/res/cardsfolder/t/thundering_sparkmage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/thwart_the_grave.txt b/forge-gui/res/cardsfolder/t/thwart_the_grave.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/thwart_the_grave.txt rename to forge-gui/res/cardsfolder/t/thwart_the_grave.txt diff --git a/forge-gui/res/cardsfolder/t/trove_warden.txt b/forge-gui/res/cardsfolder/t/trove_warden.txt new file mode 100644 index 00000000000..46805d78d72 --- /dev/null +++ b/forge-gui/res/cardsfolder/t/trove_warden.txt @@ -0,0 +1,12 @@ +Name:Trove Warden +ManaCost:2 W W +Types:Creature Cat Beast +PT:3/4 +K:Vigilance +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigExile | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, exile target permanent card with converted mana cost 3 or less from your graveyard. +SVar:TrigExile:DB$ ChangeZone | ValidTgts$ Permanent.YouOwn+cmcLE3 | TgtPrompt$ | Select target permanent card with converted mana cost 3 or less from your graveyard | Origin$ Graveyard | Destination$ Exile +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigReturn | TriggerDescription$ When CARDNAME dies, put each permanent card exiled with it onto the battlefield under the control of that card’s owner. +SVar:TrigReturn:DB$ ChangeZoneAll | ChangeType$ Permanent.ExiledWithSource | Origin$ Exile | Destination$ Battlefield +DeckHas:Ability$Graveyard +SVar:BuffedBy:Land +Oracle:Landfall — Whenever a land enters the battlefield under your control, exile target permanent card with converted mana cost 3 or less from your graveyard.\nWhen Trove Warden dies, put each permanent card exiled with it onto the battlefield under the control of that card’s owner. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/tuktuk_rubblefort.txt b/forge-gui/res/cardsfolder/t/tuktuk_rubblefort.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/tuktuk_rubblefort.txt rename to forge-gui/res/cardsfolder/t/tuktuk_rubblefort.txt diff --git a/forge-gui/res/cardsfolder/t/turntimber_ascetic.txt b/forge-gui/res/cardsfolder/t/turntimber_ascetic.txt new file mode 100644 index 00000000000..bd47187f883 --- /dev/null +++ b/forge-gui/res/cardsfolder/t/turntimber_ascetic.txt @@ -0,0 +1,8 @@ +Name:Turntimber Ascetic +ManaCost:4 G +Types:Creature Giant Cleric +PT:5/4 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 3 life. +SVar:TrigGainLife:DB$ GainLife | LifeAmount$ 3 +DeckHas:Ability$LifeGain +Oracle:When Turntimber Ascetic enters the battlefield, you gain 3 life. diff --git a/forge-gui/res/cardsfolder/t/turntimber_symbiosis_turntimber_serpentine_wood.txt b/forge-gui/res/cardsfolder/t/turntimber_symbiosis_turntimber_serpentine_wood.txt new file mode 100644 index 00000000000..0b32f6f3ce1 --- /dev/null +++ b/forge-gui/res/cardsfolder/t/turntimber_symbiosis_turntimber_serpentine_wood.txt @@ -0,0 +1,20 @@ +Name:Turntimber Symbiosis +ManaCost:4 G G G +Types:Sorcery +A:SP$ Dig | Cost$ 4 G G G | DigNum$ 7 | ChangeNum$ 1 | Optional$ True | ForceRevealToController$ True | ChangeValid$ Creature | PrimaryPrompt$ You may choose a creature card to put on the battlefield | DestinationZone$ Library | LibraryPosition$ 0 | RememberChanged$ True | RestRandomOrder$ True | SubAbility$ DBChangeZone | StackDescription$ SpellDescription | SpellDescription$ Look at the top seven cards of your library. You may put a creature card from among them onto the battlefield. If that creature card has converted mana cost 3 or less, it enters with three additional +1/+1 counters on it. Put the rest on the bottom of your library in a random order. +SVar:DBChangeZone:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ Remembered | ConditionDefined$ Remembered | ConditionPresent$ Creature.cmcGT3 | SubAbility$ DBChangeZone2 +SVar:DBChangeZone2:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | WithCounters$ P1P1_3 | Defined$ Remembered | ConditionDefined$ Remembered | ConditionPresent$ Creature.cmcLE3 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +AlternateMode:Modal +DeckHas:Ability$Counters +Oracle:Look at the top seven cards of your library. You may put a creature card from among them onto the battlefield. If that creature card has converted mana cost 3 or less, it enters with three additional +1/+1 counters on it. Put the rest on the bottom of your library in a random order. + +ALTERNATE + +Name:Turntimber, Serpentine Wood +ManaCost:no cost +Types:Land +K:ETBReplacement:Other:DBTap +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<3> | UnlessPayer$ You | UnlessAI$ Shockland | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped. +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +Oracle:As Turntimber, Serpentine Wood enters the battlefield, you may pay 3 life. If you don’t, it enters the battlefield tapped.\n{T}: Add {G}. diff --git a/forge-gui/res/cardsfolder/u/ukkima_stalking_shadow.txt b/forge-gui/res/cardsfolder/u/ukkima_stalking_shadow.txt index 047eacbe316..a23b5a1bc3f 100755 --- a/forge-gui/res/cardsfolder/u/ukkima_stalking_shadow.txt +++ b/forge-gui/res/cardsfolder/u/ukkima_stalking_shadow.txt @@ -7,6 +7,6 @@ K:Unblockable T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME leaves the battlefield, it deals X damage to target player and you gain X life, where X is its power. SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Player | TgtPrompt$ Select target player | NumDmg$ X | References$ X | SubAbility$ DBGainLife SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | References$ X -SVar:X:Count$CardPower +SVar:X:TriggeredCard$CardPower DeckHas:Ability$LifeGain Oracle:Partner with Cazur, Ruthless Stalker (When this creature enters the battlefield, target player may put Cazur into their hand from their library, then shuffle.)\nUkkima, Stalking Shadow can't be blocked.\nWhen Ukkima leaves the battlefield, it deals X damage to target player and you gain X life, where X is its power. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/umara_mystic.txt b/forge-gui/res/cardsfolder/u/umara_mystic.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/umara_mystic.txt rename to forge-gui/res/cardsfolder/u/umara_mystic.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/umara_wizard_umara_skyfalls.txt b/forge-gui/res/cardsfolder/u/umara_wizard_umara_skyfalls.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/umara_wizard_umara_skyfalls.txt rename to forge-gui/res/cardsfolder/u/umara_wizard_umara_skyfalls.txt diff --git a/forge-gui/res/cardsfolder/u/utility_knife.txt b/forge-gui/res/cardsfolder/u/utility_knife.txt new file mode 100644 index 00000000000..772cec9e156 --- /dev/null +++ b/forge-gui/res/cardsfolder/u/utility_knife.txt @@ -0,0 +1,9 @@ +Name:Utility Knife +ManaCost:1 +Types:Artifact Equipment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigAttach | TriggerDescription$ When CARDNAME enters the battlefield, attach it to target creature you control. +SVar:TrigAttach:DB$ Attach | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control +SVar:NeedsToPlay:Creature.YouCtrl+inZoneBattlefield +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 1 | AddToughness$ 1 | Description$ Equipped creature gets +1/+1. +K:Equip:3 +Oracle:When Utility Knife enters the battlefield, attach it to target creature you control.\nEquipped creature gets +1/+1.\nEquip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/soul_shatter.txt b/forge-gui/res/cardsfolder/upcoming/ZNR/soul_shatter.txt deleted file mode 100755 index c8f9baa8258..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/ZNR/soul_shatter.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Soul Shatter -ManaCost:2 B -Types:Instant -A:SP$ RepeatEach | Cost$ 2 B | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ CreatureHighCMC | SubAbility$ DBSac | StackDescription$ SpellDescription | SpellDescription$ Each opponent sacrifices a creature or planeswalker with the highest converted mana cost among creatures and planeswalkers they control. -SVar:CreatureHighCMC:DB$ ChooseCard | ConditionCheckSVar$ X | ConditionSVarCompare$ GTY | Defined$ Player.IsRemembered | Choices$ Creature.YouCtrl+cmcEQX | ChoiceTitle$ Choose a creature with the highest converted mana cost to sacrifice | References$ X,Y | Mandatory$ True | RememberChosen$ True | SubAbility$ WalkerHighCMC -SVar:WalkerHighCMC:DB$ ChooseCard | ConditionCheckSVar$ Y | ConditionSVarCompare$ GTX | Defined$ Player.IsRemembered | Choices$ Planeswalker.YouCtrl+cmcEQY | ChoiceTitle$ Choose a planeswalker with the highest converted mana cost to sacrifice | References$ X,Y | Mandatory$ True | RememberChosen$ True | SubAbility$ TieCMC -SVar:TieCMC:DB$ ChooseCard | ConditionCheckSVar$ X | ConditionSVarCompare$ EQY | Defined$ Player.IsRemembered | Choices$ Creature.YouCtrl+cmcEQX,Planeswalker.YouCtrl+cmcEQX | ChoiceTitle$ Choose a creature or planeswalker with the highest converted mana cost to sacrifice | References$ X,Y | Mandatory$ True | RememberChosen$ True -SVar:DBSac:DB$ SacrificeAll | ValidCards$ Card.IsRemembered | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosen$ True -SVar:X:Count$HighestCMC_Creature.RememberedPlayerCtrl+inZoneBattlefield -SVar:Y:Count$HighestCMC_Planeswalker.RememberedPlayerCtrl+inZoneBattlefield -Oracle:Each opponent sacrifices a creature or planeswalker with the highest converted mana cost among creatures and planeswalkers they control. diff --git a/forge-gui/res/cardsfolder/v/valakut_awakening_valakut_stoneforge.txt b/forge-gui/res/cardsfolder/v/valakut_awakening_valakut_stoneforge.txt new file mode 100644 index 00000000000..4e26492a92a --- /dev/null +++ b/forge-gui/res/cardsfolder/v/valakut_awakening_valakut_stoneforge.txt @@ -0,0 +1,19 @@ +Name:Valakut Awakening +ManaCost:2 R +Types:Instant +A:SP$ ChangeZone | Cost$ 2 R | Origin$ Hand | Destination$ Library | LibraryPosition$ -1 | ChangeType$ Card | ChangeNum$ X | References$ X | RememberChanged$ True | SubAbility$ DBDraw | StackDescription$ {p:You} puts any number of cards from their hand on the bottom of their library, | SpellDescription$ Put any number of cards from your hand on the bottom of your library, then draw that many cards plus one. +SVar:DBDraw:DB$ Draw | NumCards$ Y | References$ Y | SubAbility$ DBCleanup | StackDescription$ then draws that many cards plus one. +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Count$InYourHand +SVar:Y:Count$RememberedSize/Plus.1 +AlternateMode:Modal +Oracle:Put any number of cards from your hand on the bottom of your library, then draw that many cards plus one. + +ALTERNATE + +Name:Valakut Stoneforge +ManaCost:no cost +Types:Land +K:CARDNAME enters the battlefield tapped. +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +Oracle:Valakut Stoneforge enters the battlefield tapped.\n{T}: Add {R}. diff --git a/forge-gui/res/cardsfolder/v/valakut_exploration.txt b/forge-gui/res/cardsfolder/v/valakut_exploration.txt new file mode 100755 index 00000000000..e006e2149b6 --- /dev/null +++ b/forge-gui/res/cardsfolder/v/valakut_exploration.txt @@ -0,0 +1,18 @@ +Name:Valakut Exploration +ManaCost:2 R +Types:Enchantment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigExile | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, exile the top card of your library. You may play that card for as long as it remains exiled. +SVar:TrigExile:DB$ Dig | Defined$ You | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True +S:Mode$ Continuous | MayPlay$ True | Affected$ Card.IsRemembered | AffectedZone$ Exile +T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBForget +SVar:DBForget:DB$ Pump | Defined$ TriggeredCard | ForgetObjects$ TriggeredCard +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | Execute$ TrigGraveyard | CheckSVar$ Y | SVarCompare$ GT0 | References$ Y | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your end step, if there are cards exiled with CARDNAME, put them into their owner's graveyard, then CARDNAME deals that much damage to each opponent. +SVar:TrigGraveyard:DB$ ChangeZoneAll | ChangeType$ Card.ExiledWithSource | Origin$ Exile | Destination$ Graveyard | RememberChanged$ True | SubAbility$ DBDamageAll +SVar:DBDamageAll:DB$ DamageAll | ValidPlayers$ Player.Opponent | NumDmg$ X | References$ X | SubAbility$ DBCleanup +SVar:X:Remembered$Amount +SVar:Y:Count$ValidExile Card.ExiledWithSource +SVar:BuffedBy:Land +DeckHas:Ability$Graveyard +Oracle:Landfall — Whenever a land enters the battlefield under your control, exile the top card of your library. You may play that card for as long as it remains exiled.\nAt the beginning of your end step, if there are cards exiled with Valakut Exploration, put them into their owner's graveyard, then Valakut Exploration deals that much damage to each opponent. diff --git a/forge-gui/res/cardsfolder/v/vampire_sovereign.txt b/forge-gui/res/cardsfolder/v/vampire_sovereign.txt index be7235f77ad..23743974283 100644 --- a/forge-gui/res/cardsfolder/v/vampire_sovereign.txt +++ b/forge-gui/res/cardsfolder/v/vampire_sovereign.txt @@ -3,7 +3,7 @@ ManaCost:3 B B Types:Creature Vampire Noble PT:3/4 K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigBite | TriggerDescription$ When CARDNAME enters the battlefield target opponent loses 3 life and you gain 3 life. -SVar:TrigBite:DB$LoseLife | ValidTgts$ Opponent | TgtPrompt$ Select an opponent | LifeAmount$ 3 | SubAbility$ DBGainLife | SpellDescription$ Target opponent loses 3 life and you gain 3 life. -SVar:DBGainLife:DB$GainLife | LifeAmount$ 3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigBite | TriggerDescription$ When CARDNAME enters the battlefield, target opponent loses 3 life and you gain 3 life. +SVar:TrigBite:DB$ LoseLife | ValidTgts$ Opponent | TgtPrompt$ Select an opponent | LifeAmount$ 3 | SubAbility$ DBGainLife | SpellDescription$ Target opponent loses 3 life and you gain 3 life. +SVar:DBGainLife:DB$ GainLife | LifeAmount$ 3 Oracle:Flying\nWhen Vampire Sovereign enters the battlefield, target opponent loses 3 life and you gain 3 life. diff --git a/forge-gui/res/cardsfolder/v/vastwood_fortification_vastwood_thicket.txt b/forge-gui/res/cardsfolder/v/vastwood_fortification_vastwood_thicket.txt new file mode 100644 index 00000000000..a4307ac3a88 --- /dev/null +++ b/forge-gui/res/cardsfolder/v/vastwood_fortification_vastwood_thicket.txt @@ -0,0 +1,16 @@ +Name:Vastwood Fortification +ManaCost:G +Types:Instant +A:SP$ PutCounter | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. +DeckHas:Ability$Counters +AlternateMode:Modal +Oracle:Put a +1/+1 counter on target creature. + +ALTERNATE + +Name:Vastwood Thicket +ManaCost:no cost +Types:Land +K:CARDNAME enters the battlefield tapped. +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +Oracle:Vastwood Thicket enters the battlefield tapped.\n{T}: Add {G}. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/vastwood_surge.txt b/forge-gui/res/cardsfolder/v/vastwood_surge.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/vastwood_surge.txt rename to forge-gui/res/cardsfolder/v/vastwood_surge.txt diff --git a/forge-gui/res/cardsfolder/v/veteran_adventurer.txt b/forge-gui/res/cardsfolder/v/veteran_adventurer.txt new file mode 100755 index 00000000000..18cd0863918 --- /dev/null +++ b/forge-gui/res/cardsfolder/v/veteran_adventurer.txt @@ -0,0 +1,10 @@ +Name:Veteran Adventurer +ManaCost:5 G +Types:Creature Human +PT:5/5 +K:Vigilance +S:Mode$ Continuous | EffectZone$ All | Affected$ Card.Self | CharacteristicDefining$ True | AddType$ Cleric & Rogue & Warrior & Wizard | Description$ CARDNAME is also a Cleric, Rogue, Warrior, and Wizard. +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | References$ X | Description$ This spell costs {1} less to cast for each creature in your party. +DeckHints:Ability$Party & Type$Cleric|Rogue|Warrior|Wizard +SVar:X:Count$Party +Oracle:Veteran Adventurer is also a Cleric, Rogue, Warrior, and Wizard.\nThis spell costs {1} less to cast for each creature in your party.\nVigilance diff --git a/forge-gui/res/cardsfolder/v/vine_gecko.txt b/forge-gui/res/cardsfolder/v/vine_gecko.txt new file mode 100644 index 00000000000..501694f3fc4 --- /dev/null +++ b/forge-gui/res/cardsfolder/v/vine_gecko.txt @@ -0,0 +1,11 @@ +Name:Vine Gecko +ManaCost:1 G +Types:Creature Elemental Lizard +PT:2/2 +S:Mode$ ReduceCost | OnlyFirstSpell$ True | Type$ Spell | ValidSpell$ Spell.Kicked | Activator$ You | Amount$ 1 | Description$ The first kicked spell you cast each turn costs {1} less to cast. +T:Mode$ SpellCast | ValidCard$ Card.kicked+YouCtrl | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a kicked spell, put a +1/+1 counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +SVar:BuffedBy:Card.withKicker,Card.withMultikicker +DeckHas:Ability$Counters +Oracle:The first kicked spell you cast each turn costs {1} less to cast.\nWhenever you cast a kicked spell, put a +1/+1 counter on Vine Gecko. + diff --git a/forge-gui/res/cardsfolder/w/wayward_guide_beast.txt b/forge-gui/res/cardsfolder/w/wayward_guide_beast.txt new file mode 100755 index 00000000000..46793180bbf --- /dev/null +++ b/forge-gui/res/cardsfolder/w/wayward_guide_beast.txt @@ -0,0 +1,9 @@ +Name:Wayward Guide-Beast +ManaCost:R +Types:Creature Beast +PT:2/2 +K:Trample +K:Haste +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigBounce | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, return a land you control to its owner's hand. +SVar:TrigBounce:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | ChangeType$ Land.YouCtrl | ChangeNum$ 1 | Hidden$ True | Mandatory$ True | SelectPrompt$ Select a land you control to return to its owner's hand +Oracle:Trample, haste\nWhenever Wayward Guide-Beast deals combat damage to a player, return a land you control to its owner's hand. diff --git a/forge-gui/res/cardsfolder/w/whispersteel_dagger.txt b/forge-gui/res/cardsfolder/w/whispersteel_dagger.txt new file mode 100644 index 00000000000..1ef375e69b7 --- /dev/null +++ b/forge-gui/res/cardsfolder/w/whispersteel_dagger.txt @@ -0,0 +1,9 @@ +Name:Whispersteel Dagger +ManaCost:2 B +Types:Artifact Equipment +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | Description$ Equipped creature gets +2/+0. +T:Mode$ DamageDone | CombatDamage$ True | ValidSource$ Creature.EquippedBy | ValidTarget$ Player | OptionalDecider$ You | Execute$ TrigEffect | TriggerZones$ Battlefield | TriggerDescription$ Whenever equipped creature deals combat damage to a player, you may cast a creature spell from that player’s graveyard this turn, and you may spend mana as though it were mana of any color to cast that spell. +SVar:TrigEffect:DB$ Effect | StaticAbilities$ MayCastGrave | RememberObjects$ TriggeredTarget +SVar:MayCastGrave:Mode$ Continuous | Affected$ Creature.RememberedPlayerCtrl | MayPlay$ True | MayPlayLimit$ 1 | MayPlayIgnoreType$ True | EffectZone$ Command | AffectedZone$ Graveyard | Description$ You may cast a creature spell from that player’s graveyard this turn, and you may spend mana as though it were mana of any color to cast that spell. +K:Equip:3 +Oracle:Equipped creature gets +2/+0.\nWhenever equipped creature deals combat damage to a player, you may cast a creature spell from that player’s graveyard this turn, and you may spend mana as though it were mana of any color to cast that spell.\nEquip {3} diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/windrider_wizard.txt b/forge-gui/res/cardsfolder/w/windrider_wizard.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/windrider_wizard.txt rename to forge-gui/res/cardsfolder/w/windrider_wizard.txt diff --git a/forge-gui/res/cardsfolder/z/zagras_thief_of_heartbeats.txt b/forge-gui/res/cardsfolder/z/zagras_thief_of_heartbeats.txt new file mode 100644 index 00000000000..89c972e646d --- /dev/null +++ b/forge-gui/res/cardsfolder/z/zagras_thief_of_heartbeats.txt @@ -0,0 +1,15 @@ +Name:Zagras, Thief of Heartbeats +ManaCost:4 B R +Types:Legendary Creature Vampire Rogue +PT:4/4 +K:Flying +K:Deathtouch +K:Haste +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | References$ X | Description$ This spell costs {1} less to cast for each creature in your party. +SVar:X:Count$Party +S:Mode$ Continuous | Affected$ Creature.Other+YouCtrl | AddKeyword$ Deathtouch | Description$ Other creatures you control have deathtouch. +T:Mode$ DamageDone | ValidSource$ Creature.YouCtrl | ValidTarget$ Planeswalker | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Whenever a creature you control deals combat damage to a planeswalker, destroy that planeswalker. +SVar:TrigDestroy:DB$ Destroy | Defined$ TriggeredTarget +DeckHas:Ability$Party +DeckHints:Type$Cleric|Warrior|Wizard +Oracle:This spell costs 1 less to cast for each creature in your party.\nFlying, deathtouch, haste \nOther creatures you control have deathtouch.\nWhenever a creature you control deals combat damage to a planeswalker, destroy that planeswalker. diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/zareth_san_the_trickster.txt b/forge-gui/res/cardsfolder/z/zareth_san_the_trickster.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/zareth_san_the_trickster.txt rename to forge-gui/res/cardsfolder/z/zareth_san_the_trickster.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/zof_consumption_zof_bloodbog.txt b/forge-gui/res/cardsfolder/z/zof_consumption_zof_bloodbog.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/zof_consumption_zof_bloodbog.txt rename to forge-gui/res/cardsfolder/z/zof_consumption_zof_bloodbog.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ZNR/zulaport_duelist.txt b/forge-gui/res/cardsfolder/z/zulaport_duelist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ZNR/zulaport_duelist.txt rename to forge-gui/res/cardsfolder/z/zulaport_duelist.txt diff --git a/forge-gui/res/editions/Commander Legends.txt b/forge-gui/res/editions/Commander Legends.txt new file mode 100644 index 00000000000..43310a37422 --- /dev/null +++ b/forge-gui/res/editions/Commander Legends.txt @@ -0,0 +1,34 @@ +[metadata] +Code=CMR +Date=2020-11-11 +Name=Commander Legends +Type=Other + +[cards] +1 C The Prismatic Piper +27 R Keeper of the Accord +149 R Sengir, the Dark Baron +160 U Alena, Kessig Trapper +231 U Halana, Kessig Ranger +306 C Commander's Sphere +350 C Command Tower +354 R Rejuvenating Springs +356 R Spectator Seating +358 R Training Center +359 R Undergrowth Stadium +360 R Vault of Champions +530 M Prossh, Skyraider of Kher +546 C The Prismatic Piper +568 R Sengir, the Dark Baron +570 U Alena, Kessig Trapper +579 U Halana, Kessig Ranger +621 R Keeper of the Accord +693 C Commander's Sphere +705 C Command Tower +709 R Rejuvenating Springs +711 R Spectator Seating +713 R Training Center +714 R Undergrowth Stadium +715 R Vault of Champions +721 M Mana Confluence +722 R Sengir, the Dark Baron diff --git a/forge-gui/res/editions/Masters 25.txt b/forge-gui/res/editions/Masters 25.txt index d15953355df..041803b48aa 100644 --- a/forge-gui/res/editions/Masters 25.txt +++ b/forge-gui/res/editions/Masters 25.txt @@ -54,7 +54,7 @@ FoilChanceInBooster=100 43 U Blue Elemental Blast 44 R Blue Sun's Zenith 45 C Borrowing 100,000 Arrows -46 U Brainstorm +46 C Brainstorm 47 U Brine Elemental 48 C Choking Tethers 49 C Coralhelm Guide diff --git a/forge-gui/res/editions/Zendikar Rising Commander.txt b/forge-gui/res/editions/Zendikar Rising Commander.txt new file mode 100644 index 00000000000..555e14d0cf8 --- /dev/null +++ b/forge-gui/res/editions/Zendikar Rising Commander.txt @@ -0,0 +1,13 @@ +[metadata] +Code=ZNC +Date=2020-09-25 +Name=Zendikar Rising Commander +Type=Other + +[cards] +1 M Anowon, the Ruin Thief +2 M Obuun, Mul Daya Ancestor +3 R Trove Warden +4 R Enigma Thief +5 R Whispersteel Dagger +6 R Geode Rager diff --git a/forge-gui/res/editions/Zendikar_Rising_Expeditions.txt b/forge-gui/res/editions/Zendikar Rising Expeditions.txt similarity index 100% rename from forge-gui/res/editions/Zendikar_Rising_Expeditions.txt rename to forge-gui/res/editions/Zendikar Rising Expeditions.txt diff --git a/forge-gui/res/formats/Casual/Brawl.txt b/forge-gui/res/formats/Casual/Brawl.txt index c2559cc7064..2730bf5e4c1 100644 --- a/forge-gui/res/formats/Casual/Brawl.txt +++ b/forge-gui/res/formats/Casual/Brawl.txt @@ -3,5 +3,5 @@ Name:Brawl Order:101 Type:Casual Subtype:Commander -Sets:GRN, RNA, WAR, M20, ELD, THB, IKO, M21 -Banned:Drannith Magistrate; Golos, Tireless Pilgrim; Lutri, the Spellchaser; Oko, Thief of Crowns; Sorcerous Spyglass; Teferi, Time Raveler; Winota, Joiner of Forces; +Sets:ELD, THB, IKO, M21, ZNR +Banned:Drannith Magistrate; Lutri, the Spellchaser; Oko, Thief of Crowns; Sorcerous Spyglass; Winota, Joiner of Forces; diff --git a/forge-gui/res/formats/Digital/Historic.txt b/forge-gui/res/formats/Digital/Historic.txt index f7f64df5a78..5982278d88e 100644 --- a/forge-gui/res/formats/Digital/Historic.txt +++ b/forge-gui/res/formats/Digital/Historic.txt @@ -4,6 +4,6 @@ Type:Digital Subtype:Arena Effective:2019-11-21 Order:142 -Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, HA1, THB, HA2, IKO, HA3, M21, JMP, AKR +Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, HA1, THB, HA2, IKO, HA3, M21, JMP, AKR, ZNR Banned:Agent of Treachery; Burning-Tree Emissary; Field of the Dead; Fires of Invention; Oko, Thief of Crowns; Nexus of Fate; Once Upon a Time; Teferi, Time Raveler; Veil of Summer; Wilderness Reclamation; Winota, Joiner of Forces #Suspended:Burning-Tree Emissary; Teferi, Time Raveler; Wilderness Reclamation diff --git a/forge-gui/res/formats/Sanctioned/Modern.txt b/forge-gui/res/formats/Sanctioned/Modern.txt index 129e1ae9f81..713333995fa 100644 --- a/forge-gui/res/formats/Sanctioned/Modern.txt +++ b/forge-gui/res/formats/Sanctioned/Modern.txt @@ -3,5 +3,5 @@ Name:Modern Order:103 Subtype:Modern Type:Sanctioned -Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, EVE, SHM, MOR, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, MM2, ORI, BFZ, OGW, SOI, EMN, KLD, AER, AKH, W17, HOU, XLN, RIX, DOM, M19, G18, GRN, RNA, WAR, MH1, M20, ELD, THB, IKO, M21 +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, EVE, SHM, MOR, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, MM2, ORI, BFZ, OGW, SOI, EMN, KLD, AER, AKH, W17, HOU, XLN, RIX, DOM, M19, G18, GRN, RNA, WAR, MH1, M20, ELD, THB, IKO, M21, ZNR Banned:Ancient Den; Arcum's Astrolabe; Birthing Pod; Blazing Shoal; Bridge from Below; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Faithless Looting; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hogaak, Arisen Necropolis; Hypergenesis; Krark-Clan Ironworks; Mental Misstep; Mox Opal; Mycosynth Lattice; Oko, Thief of Crowns; Once Upon A Time; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Skullclamp; Splinter Twin; Summer Bloom; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Vault of Whispers diff --git a/forge-gui/res/formats/Sanctioned/Pioneer.txt b/forge-gui/res/formats/Sanctioned/Pioneer.txt index c2283a34319..bbcdb3e3904 100644 --- a/forge-gui/res/formats/Sanctioned/Pioneer.txt +++ b/forge-gui/res/formats/Sanctioned/Pioneer.txt @@ -3,5 +3,5 @@ Name:Pioneer Order:102 Subtype:Pioneer Type:Sanctioned -Sets:RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, SOI, EMN, KLD, AER, AKH, HOU, XLN, RIX, DOM, M19, GRN, RNA, WAR, M20, ELD, THB, IKO, M21 +Sets:RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, SOI, EMN, KLD, AER, AKH, HOU, XLN, RIX, DOM, M19, GRN, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR Banned:Bloodstained Mire; Felidar Guardian; Field of the Dead; Flooded Strand; Inverter of Truth; Kethis, the Hidden Hand; Leyline of Abundance; Nexus of Fate; Oko, Thief of Crowns; Once Upon a Time; Polluted Delta; Smuggler's Copter; Underworld Breach; Veil of Summer; Walking Ballista; Windswept Heath; Wooded Foothills diff --git a/forge-gui/res/formats/Sanctioned/Standard.txt b/forge-gui/res/formats/Sanctioned/Standard.txt index efd1c5c7383..496a3967104 100644 --- a/forge-gui/res/formats/Sanctioned/Standard.txt +++ b/forge-gui/res/formats/Sanctioned/Standard.txt @@ -3,5 +3,5 @@ Name:Standard Order:101 Subtype:Standard Type:Sanctioned -Sets:GRN, RNA, WAR, M20, ELD, THB, IKO, M21 -Banned:Agent of Treachery; Cauldron Familiar; Field of the Dead; Fires of Invention; Growth Spiral; Oko, Thief of Crowns; Once Upon a Time; Teferi, Time Raveler; Veil of Summer; Wilderness Reclamation +Sets:ELD, THB, IKO, M21, ZNR +Banned:Cauldron Familiar; Fires of Invention; Oko, Thief of Crowns; Once Upon a Time; Veil of Summer diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index f7ef60e3d03..e5e3e3dbdd1 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -183,6 +183,8 @@ nlEnableMusic=Hintergrundmusik während des Spiels nlAltSoundSystem=Nutze alternatives Sound-System (nur nutzen, wenn es Probleme mit fehlenden Geräuschen gibt) nlSrOptimize=Setze verschiedene Optionen, um Forge besser für Screenreader lesbar zu machen KeyboardShortcuts=Tastenkombinationen +cbpLandPlayed=Land-kommt-ins-Spiel-Benachrichtigung +nlpLandPlayed=Wenn ein Land auf das Spielfeld kommt, wann möchtest du eine Benachrichtigung bekommen: Niemals, immer oder nur bei Aktionen der KI? #VSubmenuAchievements.java lblAchievements=Errungenschaften #VSubmenuDownloaders.java @@ -990,6 +992,7 @@ nlExperimentalNetworkCompatibility=Forge wechselt auf kompatiblen Netzwerk-Strea lblPlayers=Spieler lblLog=Bericht lblDev=Entw. +lblCombatTab=Kampf lblStack=Stapel lblMustWaitPriority=Warte auf Priorität... #FDeckEditor.java diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index b3a6dd27fb8..90d59578556 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -183,6 +183,8 @@ nlEnableMusic=Enable background music during the game nlAltSoundSystem=Use the alternate sound system (only use if you have issues with sound not playing or disappearing) nlSrOptimize=Set various options to make FOrge work better with screen readers KeyboardShortcuts=Keyboard Shortcuts +cbpLandPlayed=Land entering battlefield notifications +nlpLandPlayed=Choose when you want to get visual notifications for a land entering the battlefield: Never, always, or only for the lands entering a battlefield because of an action of a AI player #VSubmenuAchievements.java lblAchievements=Achievements #VSubmenuDownloaders.java @@ -990,6 +992,7 @@ nlExperimentalNetworkCompatibility=Forge switches to compatible network stream. lblPlayers=Players lblLog=Log lblDev=Dev +lblCombatTab=Combat lblStack=Stack lblMustWaitPriority=Must wait for priority... #FDeckEditor.java @@ -1141,7 +1144,7 @@ lblStormCount=Storm Count #InputAttack.java lblCallBack=Call Back lblDisabled=Disabled -lblSelectAttackCreatures=Select creatures to attack +lblSelectAttackCreatures=Select creatures to attack lblSelectAttackTarget= or select player/planeswalker you wish to attack. lblSelectBandingTarget= To attack as a band, select an attacking creature to activate its ''band'' then select another to join it. #InputBlock.java @@ -2587,4 +2590,4 @@ lblChooseACompanion=Choose a companion lblWildOpponentMultiplier=Wild Multiplier lblEnteraDecimal=Enter a decimal lblWildOpponentNumber=Number of Wild Opponents -lblWildOpponentNumberError=Wild Opponents can only be 0 to 3 \ No newline at end of file +lblWildOpponentNumberError=Wild Opponents can only be 0 to 3 diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index 804e036e11d..296284bf716 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -183,6 +183,8 @@ nlEnableMusic=Habilitar música de fondo durante el juego nlAltSoundSystem=Use el sistema de sonido alternativo (solo use si tiene problemas con el sonido que no se reproduce o desaparece) nlSrOptimize=Set various options to make FOrge work better with screen readers KeyboardShortcuts=Atajos de teclado +cbpLandPlayed=Land entering battlefield notifications +nlpLandPlayed=Choose when you want to get visual notifications for a land entering the battlefield: Never, always, or only for the lands entering a battlefield because of an action of a AI player #VSubmenuAchievements.java lblAchievements=Logros #VSubmenuDownloaders.java @@ -990,6 +992,7 @@ nlExperimentalNetworkCompatibility=Forge switches to compatible network stream. lblPlayers=Jugadores lblLog=Log lblDev=Dev +lblCombatTab=Combate lblStack=Pila lblMustWaitPriority=Debes esperar debido a la prioridad... #FDeckEditor.java diff --git a/forge-gui/res/languages/it-IT.properties b/forge-gui/res/languages/it-IT.properties index a184ec1e714..3f1e61e6639 100644 --- a/forge-gui/res/languages/it-IT.properties +++ b/forge-gui/res/languages/it-IT.properties @@ -183,6 +183,8 @@ nlEnableMusic=Abilita la musica di sottofondo durante il gioco nlAltSoundSystem=Utilizza il sistema audio alternativo (utilizza solo se hai problemi con l''audio che non viene riprodotto o che scompare) nlSrOptimize=Set various options to make FOrge work better with screen readers KeyboardShortcuts=Tasti rapidi +cbpLandPlayed=Land entering battlefield notifications +nlpLandPlayed=Choose when you want to get visual notifications for a land entering the battlefield: Never, always, or only for the lands entering a battlefield because of an action of a AI player #VSubmenuAchievements.java lblAchievements=realizzazioni #VSubmenuDownloaders.java @@ -989,7 +991,8 @@ nlExperimentalNetworkCompatibility=Forge switches to compatible network stream. #MatchScreen.java lblPlayers=Giocatori lblLog=Login -lblDev=dev +lblDev=Dev +lblCombatTab=Combat lblStack=Pila lblMustWaitPriority=Devi aspettare la priorità ... #FDeckEditor.java diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index 1e4e6252a5f..40339a9f4ce 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -183,6 +183,8 @@ nlEnableMusic=在游戏中启用背景音乐 nlAltSoundSystem=使用备用音效系统(仅在声音消失的情况使用) nlSrOptimize=使屏幕阅读器能更好的在forge上使用 KeyboardShortcuts=键盘快捷键 +cbpLandPlayed=当地牌进入战场发出通知 +nlpLandPlayed=选择你是否想收到地牌进入战场的视觉通知:从不(Never),总是(always), 或者只有当地牌是因AI玩家的动作而进入战场 #VSubmenuAchievements.java lblAchievements=成就 #VSubmenuDownloaders.java @@ -990,6 +992,7 @@ nlExperimentalNetworkCompatibility=Forge将切换为兼容性的网络流。( lblPlayers=玩家列表 lblLog=日志 lblDev=开发者工具 +lblCombatTab=战斗 lblStack=堆叠 lblMustWaitPriority=等待获得优先权 #FDeckEditor.java diff --git a/forge-gui/res/lists/achievement-images.txt b/forge-gui/res/lists/achievement-images.txt index 718abf2b224..7d7919e0287 100644 --- a/forge-gui/res/lists/achievement-images.txt +++ b/forge-gui/res/lists/achievement-images.txt @@ -2,9 +2,13 @@ https://downloads.cardforge.org/images/achievements/Ajani%20Goldmane.png https://downloads.cardforge.org/images/achievements/Ajani%20Steadfast.png https://downloads.cardforge.org/images/achievements/Ajani%20Unyielding.png https://downloads.cardforge.org/images/achievements/Ajani%20Vengeant.png +https://downloads.cardforge.org/images/achievements/Ajani%2C%20Adversary%20of%20Tyrants.png https://downloads.cardforge.org/images/achievements/Ajani%2C%20Caller%20of%20the%20Pride.png +https://downloads.cardforge.org/images/achievements/Ajani%2C%20Inspiring%20Leader.png https://downloads.cardforge.org/images/achievements/Ajani%2C%20Mentor%20of%20Heroes.png +https://downloads.cardforge.org/images/achievements/Ajani%2C%20Strength%20of%20the%20Pride.png https://downloads.cardforge.org/images/achievements/Ajani%2C%20Valiant%20Protector.png +https://downloads.cardforge.org/images/achievements/Ajani%2C%20Wise%20Counselor.png https://downloads.cardforge.org/images/achievements/Approach%20of%20the%20Second%20Sun.png https://downloads.cardforge.org/images/achievements/ArcaneMaster.png https://downloads.cardforge.org/images/achievements/Archenemy.png @@ -16,7 +20,9 @@ https://downloads.cardforge.org/images/achievements/Barren%20Glory.png https://downloads.cardforge.org/images/achievements/Battle%20of%20Wits.png https://downloads.cardforge.org/images/achievements/Biovisionary.png https://downloads.cardforge.org/images/achievements/Blackjack.png +https://downloads.cardforge.org/images/achievements/Brawl.png https://downloads.cardforge.org/images/achievements/Chance%20Encounter.png +https://downloads.cardforge.org/images/achievements/Chance%20for%20Glory.png https://downloads.cardforge.org/images/achievements/Chandra%20Ablaze.png https://downloads.cardforge.org/images/achievements/Chandra%20Nalaar.png https://downloads.cardforge.org/images/achievements/Chandra%2C%20Flamecaller.png @@ -43,6 +49,7 @@ https://downloads.cardforge.org/images/achievements/Elspeth%2C%20Knight-Errant.p https://downloads.cardforge.org/images/achievements/Elspeth%2C%20Sun%27s%20Champion.png https://downloads.cardforge.org/images/achievements/Epic%20Struggle.png https://downloads.cardforge.org/images/achievements/Epic.png +https://downloads.cardforge.org/images/achievements/Etrata%2C%20the%20Silencer.png https://downloads.cardforge.org/images/achievements/Felidar%20Sovereign.png https://downloads.cardforge.org/images/achievements/Freyalise%2C%20Llanowar%27s%20Fury.png https://downloads.cardforge.org/images/achievements/GameWinStreak.png @@ -82,17 +89,21 @@ https://downloads.cardforge.org/images/achievements/Liliana%2C%20Death%20Wielder https://downloads.cardforge.org/images/achievements/Liliana%2C%20Death%27s%20Majesty.png https://downloads.cardforge.org/images/achievements/Liliana%2C%20Defiant%20Necromancer.png https://downloads.cardforge.org/images/achievements/Liliana%2C%20The%20Last%20Hope.png +https://downloads.cardforge.org/images/achievements/Lord%20Windgrace.png +https://downloads.cardforge.org/images/achievements/Lukka%2C%20Coppercoat%20Outcast.png https://downloads.cardforge.org/images/achievements/ManaFlooded.png https://downloads.cardforge.org/images/achievements/ManaScrewed.png https://downloads.cardforge.org/images/achievements/MatchWinStreak.png https://downloads.cardforge.org/images/achievements/Mayael%27s%20Aria.png https://downloads.cardforge.org/images/achievements/Maze%27s%20End.png https://downloads.cardforge.org/images/achievements/Mechanized%20Production.png +https://downloads.cardforge.org/images/achievements/MoJhoSto.png https://downloads.cardforge.org/images/achievements/MomirBasic.png https://downloads.cardforge.org/images/achievements/Mortal%20Combat.png https://downloads.cardforge.org/images/achievements/Nahiri%2C%20the%20Harbinger.png https://downloads.cardforge.org/images/achievements/Nahiri%2C%20the%20Lithomancer.png https://downloads.cardforge.org/images/achievements/Narset%20Transcendent.png +https://downloads.cardforge.org/images/achievements/Narset%20of%20the%20Ancient%20Way.png https://downloads.cardforge.org/images/achievements/Near-Death%20Experience.png https://downloads.cardforge.org/images/achievements/NeedForSpeed.png https://downloads.cardforge.org/images/achievements/Nicol%20Bolas%2C%20Planeswalker.png @@ -106,8 +117,11 @@ https://downloads.cardforge.org/images/achievements/Nissa%2C%20Worldwaker.png https://downloads.cardforge.org/images/achievements/NoCreatures.png https://downloads.cardforge.org/images/achievements/NoLands.png https://downloads.cardforge.org/images/achievements/NoSpells.png +https://downloads.cardforge.org/images/achievements/Oathbreaker.png https://downloads.cardforge.org/images/achievements/Ob%20Nixilis%20Reignited.png https://downloads.cardforge.org/images/achievements/Ob%20Nixilis%20of%20the%20Black%20Oath.png +https://downloads.cardforge.org/images/achievements/Oko%2C%20the%20Trickster.png +https://downloads.cardforge.org/images/achievements/Oko%2C%20Thief%20of%20Crowns.png https://downloads.cardforge.org/images/achievements/Overkill.png https://downloads.cardforge.org/images/achievements/Phage%20the%20Untouchable.png https://downloads.cardforge.org/images/achievements/Planechase.png diff --git a/forge-gui/res/lists/altwin-achievements.txt b/forge-gui/res/lists/altwin-achievements.txt index 7a18e57e5bc..a1cc9fae8bd 100644 --- a/forge-gui/res/lists/altwin-achievements.txt +++ b/forge-gui/res/lists/altwin-achievements.txt @@ -1,3 +1,4 @@ +Angel of Destiny|Outlive Long and Prosper|Life eternal thanks to one weird trick! Approach of the Second Sun|The God-Pharaoh's Return|I'm back! Did you miss me? Azor's Elocutors|The Filibuster|Talk might be cheap, but it can buy you victory! Barren Glory|The Clean Slate|When you have nothing, you can lose nothing... so you can win everything! diff --git a/forge-gui/res/lists/planeswalker-achievements.txt b/forge-gui/res/lists/planeswalker-achievements.txt index 2044532eeb5..3510930ed1b 100644 --- a/forge-gui/res/lists/planeswalker-achievements.txt +++ b/forge-gui/res/lists/planeswalker-achievements.txt @@ -74,6 +74,7 @@ Jace, Architect of Thought|Jace's Incantation|I like that one. I'll steal it! Jace, Cunning Castaway|Jace's Mirror Image|Who is real and who is fake? Jace, Ingenious Mind-Mage|Jace's Will|Let me change your minds... Jace, Memory Adept|Jace's Revelation|So many things to learn! +Jace, Mirror Mage|Jace the Bob|Really not much of an achievement at all, but what can you do? Jace, Telepath Unbound|Jace's Erasure|First empty your mind and then... nope, that's it. Jace, the Living Guildpact|Jace's Timetwister|Symmetry? What symmetry? Jace, the Mind Sculptor|Jace's Lobotomy|What do you mean, "overpowered"? @@ -100,6 +101,7 @@ Liliana, Untouched by Death|Liliana's Graveyard Party|What? I'm not touching you Liliana, Waker of the Dead|Liliana's Rotten Reserves|They awaken, feeling well-rested. Lord Windgrace|Windgrace's Hunting Party|Let me show you a true cat-astrophe. Lukka, Coppercoat Outcast|Lukka's Ultimatum|Get them. +Nahiri, Heir of the Ancients|Swiss-Army Nahiri|It pays to be well-equipped. Nahiri, the Harbinger|Nahiri's Mystery Guest|This should be your cue to run. Nahiri, the Lithomancer|Nahiri's Gift|I pulled it out! Now I'm a king! Narset of the Ancient Way|Narset's Burning Knowledge|Prowess both magical and martial. @@ -109,6 +111,7 @@ Nicol Bolas, God-Pharaoh|Bolas's Cleansing|Let's just tear this down and start a Nicol Bolas, Planeswalker|Bolas's Ultimatum|Whatever you do, don't call him "Nicol"! Nicol Bolas, the Arisen|Bolas's Mind Wipe|Anything Jace can do, I can do better. Nicol Bolas, the Deceiver|Bolas's Cunning Hit|I know exactly how to hurt you. +Nissa of Shadowed Boughs|Nissa's Reanimation|Every land hides some secrets deep down. Nissa Revane|Nissa's Summoning|The whole village is here! Nissa, Genesis Mage|Nissa's Genesis Wave|Let's see who shows up. Nissa, Nature's Artisan|Nissa's Stampede|Big enough for you? diff --git a/forge-gui/res/tokenscripts/bg_x_x_hydra.txt b/forge-gui/res/tokenscripts/bg_x_x_hydra.txt new file mode 100644 index 00000000000..512f9b800ea --- /dev/null +++ b/forge-gui/res/tokenscripts/bg_x_x_hydra.txt @@ -0,0 +1,6 @@ +Name:Hydra +ManaCost:no cost +Colors:black,green +Types:Creature Hydra +PT:*/* +Oracle: diff --git a/forge-gui/res/tokenscripts/c_1_1_a_construct.txt b/forge-gui/res/tokenscripts/c_1_1_a_construct.txt new file mode 100644 index 00000000000..eeea124b2e0 --- /dev/null +++ b/forge-gui/res/tokenscripts/c_1_1_a_construct.txt @@ -0,0 +1,5 @@ +Name:Construct +ManaCost:no cost +PT:1/1 +Types:Artifact Creature Construct +Oracle: diff --git a/forge-gui/src/main/java/forge/interfaces/IGuiGame.java b/forge-gui/src/main/java/forge/interfaces/IGuiGame.java index 4f3ef7c081b..71251fab2ab 100644 --- a/forge-gui/src/main/java/forge/interfaces/IGuiGame.java +++ b/forge-gui/src/main/java/forge/interfaces/IGuiGame.java @@ -1,11 +1,17 @@ package forge.interfaces; +import java.util.Collection; +import java.util.List; +import java.util.Map; + import com.google.common.base.Function; + import forge.LobbyPlayer; import forge.assets.FSkinProp; import forge.deck.CardPool; import forge.game.GameEntityView; import forge.game.GameView; +import forge.game.card.Card; import forge.game.card.CardView; import forge.game.event.GameEventSpellAbilityCast; import forge.game.event.GameEventSpellRemovedFromStack; @@ -14,6 +20,7 @@ import forge.game.player.DelayedReveal; import forge.game.player.IHasIcon; import forge.game.player.PlayerView; import forge.game.spellability.SpellAbilityView; +import forge.game.zone.Zone; import forge.game.zone.ZoneType; import forge.item.PaperCard; import forge.player.PlayerZoneUpdate; @@ -21,10 +28,6 @@ import forge.player.PlayerZoneUpdates; import forge.trackable.TrackableCollection; import forge.util.ITriggerEvent; -import java.util.Collection; -import java.util.List; -import java.util.Map; - public interface IGuiGame { void setGameView(GameView gameView); GameView getGameView(); @@ -51,6 +54,7 @@ public interface IGuiGame { void updateStack(); void notifyStackAddition(final GameEventSpellAbilityCast event); void notifyStackRemoval(final GameEventSpellRemovedFromStack event); + void handleLandPlayed(Card land, Zone zone); Iterable tempShowZones(PlayerView controller, Iterable zonesToUpdate); void hideZones(PlayerView controller, Iterable zonesToUpdate); void updateZones(Iterable zonesToUpdate); diff --git a/forge-gui/src/main/java/forge/match/AbstractGuiGame.java b/forge-gui/src/main/java/forge/match/AbstractGuiGame.java index d2c762b7840..a626d36548f 100644 --- a/forge-gui/src/main/java/forge/match/AbstractGuiGame.java +++ b/forge-gui/src/main/java/forge/match/AbstractGuiGame.java @@ -9,8 +9,6 @@ import java.util.Set; import java.util.Timer; import java.util.TimerTask; -import forge.GuiBase; -import forge.util.Localizer; import org.apache.commons.lang3.StringUtils; import com.google.common.collect.ImmutableList; @@ -20,13 +18,16 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import forge.FThreads; +import forge.GuiBase; import forge.assets.FSkinProp; import forge.game.GameView; +import forge.game.card.Card; import forge.game.card.CardView; import forge.game.card.CardView.CardStateView; import forge.game.event.GameEventSpellAbilityCast; import forge.game.event.GameEventSpellRemovedFromStack; import forge.game.player.PlayerView; +import forge.game.zone.Zone; import forge.interfaces.IGameController; import forge.interfaces.IGuiGame; import forge.interfaces.IMayViewCards; @@ -34,6 +35,7 @@ import forge.model.FModel; import forge.properties.ForgeConstants; import forge.properties.ForgePreferences; import forge.trackable.TrackableTypes; +import forge.util.Localizer; public abstract class AbstractGuiGame implements IGuiGame, IMayViewCards { private PlayerView currentPlayer = null; @@ -709,5 +711,9 @@ public abstract class AbstractGuiGame implements IGuiGame, IMayViewCards { public void notifyStackRemoval(GameEventSpellRemovedFromStack event) { } + @Override + public void handleLandPlayed(Card land, Zone zone) { + } + // End of Choice code } diff --git a/forge-gui/src/main/java/forge/match/input/InputAttack.java b/forge-gui/src/main/java/forge/match/input/InputAttack.java index 956b94f5c31..5552774c24a 100644 --- a/forge-gui/src/main/java/forge/match/input/InputAttack.java +++ b/forge-gui/src/main/java/forge/match/input/InputAttack.java @@ -328,7 +328,7 @@ public class InputAttack extends InputSyncronizedBase { private void updateMessage() { Localizer localizer = Localizer.getInstance(); - String message = localizer.getMessage("lblSelectAttackCreatures") + currentDefender + localizer.getMessage("lblSelectAttackTarget"); + String message = localizer.getMessage("lblSelectAttackCreatures") + " " + currentDefender + " " + localizer.getMessage("lblSelectAttackTarget"); if (potentialBanding) { message += localizer.getMessage("lblSelectBandingTarget"); } diff --git a/forge-gui/src/main/java/forge/match/input/InputBlock.java b/forge-gui/src/main/java/forge/match/input/InputBlock.java index b3deff42243..dfc9977468e 100644 --- a/forge-gui/src/main/java/forge/match/input/InputBlock.java +++ b/forge-gui/src/main/java/forge/match/input/InputBlock.java @@ -86,7 +86,7 @@ public class InputBlock extends InputSyncronizedBase { } else { String attackerName = currentAttacker.isFaceDown() ? localizer.getMessage("lblMorph") : currentAttacker.getName() + " (" + currentAttacker.getId() + ")"; - String message = localizer.getMessage("lblSelectBlocker") + attackerName + localizer.getMessage("lblOrSelectBlockTarget"); + String message = localizer.getMessage("lblSelectBlocker") + attackerName + " " + localizer.getMessage("lblOrSelectBlockTarget"); showMessage(message); } diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 9606b476eb8..784840224a1 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -1,9 +1,37 @@ package forge.player; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.apache.commons.lang3.Range; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; + import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Predicates; -import com.google.common.collect.*; +import com.google.common.collect.Collections2; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; +import com.google.common.collect.ListMultimap; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Multimap; + import forge.FThreads; import forge.GuiBase; import forge.LobbyPlayer; @@ -11,7 +39,11 @@ import forge.StaticData; import forge.achievement.AchievementCollection; import forge.ai.GameState; import forge.assets.FSkinProp; -import forge.card.*; +import forge.card.CardDb; +import forge.card.CardType; +import forge.card.ColorSet; +import forge.card.ICardFace; +import forge.card.MagicColor; import forge.card.mana.ManaCost; import forge.card.mana.ManaCostShard; import forge.control.FControlGamePlayback; @@ -19,12 +51,27 @@ import forge.deck.CardPool; import forge.deck.Deck; import forge.deck.DeckSection; import forge.events.UiEventNextGameDecision; -import forge.game.*; +import forge.game.Game; +import forge.game.GameEntity; +import forge.game.GameEntityView; +import forge.game.GameEntityViewMap; +import forge.game.GameLogEntryType; +import forge.game.GameObject; +import forge.game.GameType; +import forge.game.PlanarDice; import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityKey; import forge.game.ability.ApiType; import forge.game.ability.effects.CharmEffect; -import forge.game.card.*; +import forge.game.card.Card; +import forge.game.card.CardCollection; +import forge.game.card.CardCollectionView; +import forge.game.card.CardFaceView; +import forge.game.card.CardLists; +import forge.game.card.CardPredicates; +import forge.game.card.CardView; +import forge.game.card.CounterEnumType; +import forge.game.card.CounterType; import forge.game.combat.Combat; import forge.game.combat.CombatUtil; import forge.game.cost.Cost; @@ -35,10 +82,20 @@ import forge.game.keyword.Keyword; import forge.game.keyword.KeywordInterface; import forge.game.mana.Mana; import forge.game.mana.ManaConversionMatrix; -import forge.game.player.*; +import forge.game.player.DelayedReveal; +import forge.game.player.Player; +import forge.game.player.PlayerActionConfirmMode; +import forge.game.player.PlayerController; +import forge.game.player.PlayerView; import forge.game.replacement.ReplacementEffect; import forge.game.replacement.ReplacementLayer; -import forge.game.spellability.*; +import forge.game.spellability.AbilityManaPart; +import forge.game.spellability.AbilitySub; +import forge.game.spellability.OptionalCostValue; +import forge.game.spellability.SpellAbility; +import forge.game.spellability.SpellAbilityStackInstance; +import forge.game.spellability.SpellAbilityView; +import forge.game.spellability.TargetChoices; import forge.game.trigger.Trigger; import forge.game.trigger.WrappedAbility; import forge.game.zone.MagicStack; @@ -52,28 +109,32 @@ import forge.interfaces.IMacroSystem; import forge.item.IPaperCard; import forge.item.PaperCard; import forge.match.NextGameDecision; -import forge.match.input.*; +import forge.match.input.Input; +import forge.match.input.InputAttack; +import forge.match.input.InputBlock; +import forge.match.input.InputConfirm; +import forge.match.input.InputConfirmMulligan; +import forge.match.input.InputLondonMulligan; +import forge.match.input.InputPassPriority; +import forge.match.input.InputPayMana; +import forge.match.input.InputProxy; +import forge.match.input.InputQueue; +import forge.match.input.InputSelectCardsForConvokeOrImprovise; +import forge.match.input.InputSelectCardsFromList; +import forge.match.input.InputSelectEntitiesFromList; import forge.model.FModel; import forge.properties.ForgeConstants; import forge.properties.ForgePreferences.FPref; +import forge.util.CardTranslation; import forge.util.ITriggerEvent; import forge.util.Lang; import forge.util.Localizer; -import forge.util.CardTranslation; import forge.util.MessageUtil; import forge.util.TextUtil; import forge.util.collect.FCollection; import forge.util.collect.FCollectionView; import forge.util.gui.SOptionPane; import io.sentry.Sentry; -import org.apache.commons.lang3.Range; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; - -import java.io.*; -import java.util.*; -import java.util.Map.Entry; /** * A prototype for player controller class @@ -3032,5 +3093,13 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } return result; } + + @Override + public void handleLandPlayed(Card land, Zone zone) { + IGuiGame guiGame = getGui(); + guiGame.handleLandPlayed(land,zone); + } + + } diff --git a/forge-gui/src/main/java/forge/player/TargetSelection.java b/forge-gui/src/main/java/forge/player/TargetSelection.java index d9230e11b1e..7a143733d35 100644 --- a/forge-gui/src/main/java/forge/player/TargetSelection.java +++ b/forge-gui/src/main/java/forge/player/TargetSelection.java @@ -66,7 +66,8 @@ public class TargetSelection { private boolean bTargetingDone = false; private boolean isMandatory() { - return ability.isMandatory() || getTgt().getMandatory(); + // even if its an optionalTrigger, the targeting is still mandatory + return ability.isTrigger() || getTgt().getMandatory(); } public final boolean chooseTargets(Integer numTargets) { diff --git a/forge-gui/src/main/java/forge/properties/ForgeConstants.java b/forge-gui/src/main/java/forge/properties/ForgeConstants.java index eedfa484152..00c2bb02ecd 100644 --- a/forge-gui/src/main/java/forge/properties/ForgeConstants.java +++ b/forge-gui/src/main/java/forge/properties/ForgeConstants.java @@ -321,6 +321,13 @@ public final class ForgeConstants { public static final String STACK_EFFECT_NOTIFICATION_NEVER = "Never"; public static final String STACK_EFFECT_NOTIFICATION_ALWAYS = "Always"; public static final String STACK_EFFECT_NOTIFICATION_AI_AND_TRIGGERED = "AI cast/activated, or triggered by any player"; + + // Constants for LAnd played notification policy + public static final String LAND_PLAYED_NOTIFICATION_NEVER = "Never"; + public static final String LAND_PLAYED_NOTIFICATION_ALWAYS = "Always"; + public static final String LAND_PLAYED_NOTIFICATION_ALWAYS_FOR_NONBASIC_LANDS = "Always, but only for nonbasic lands"; + public static final String LAND_PLAYED_NOTIFICATION_AI = "Lands entering a battlefield because of an action of a AI player"; + public static final String LAND_PLAYED_NOTIFICATION_AI_FOR_NONBASIC_LANDS = "Nonbasic lands entering a battlefield because of an action of a AI player"; // Set boolean constant for landscape mode for gdx port public static final boolean isGdxPortLandscape = FileUtil.doesFileExist(ASSETS_DIR + "switch_orientation.ini"); diff --git a/forge-gui/src/main/java/forge/properties/ForgePreferences.java b/forge-gui/src/main/java/forge/properties/ForgePreferences.java index fa49f465f71..679b2922e96 100644 --- a/forge-gui/src/main/java/forge/properties/ForgePreferences.java +++ b/forge-gui/src/main/java/forge/properties/ForgePreferences.java @@ -121,6 +121,7 @@ public class ForgePreferences extends PreferencesStore { UI_CLOSE_ACTION ("NONE"), UI_MANA_LOST_PROMPT ("false"), // Prompt on losing mana when passing priority UI_STACK_EFFECT_NOTIFICATION_POLICY ("Never"), + UI_LAND_PLAYED_NOTIFICATION_POLICY ("Never"), UI_PAUSE_WHILE_MINIMIZED("false"), UI_TOKENS_IN_SEPARATE_ROW("false"), // Display tokens in their own battlefield row. UI_DISPLAY_CURRENT_COLORS(ForgeConstants.DISP_CURRENT_COLORS_NEVER), diff --git a/forge-gui/src/main/java/forge/util/ImageFetcher.java b/forge-gui/src/main/java/forge/util/ImageFetcher.java index ef83a64f414..d255e1ba004 100644 --- a/forge-gui/src/main/java/forge/util/ImageFetcher.java +++ b/forge-gui/src/main/java/forge/util/ImageFetcher.java @@ -21,6 +21,22 @@ import forge.properties.ForgePreferences; public abstract class ImageFetcher { private static final ExecutorService threadPool = Executors.newCachedThreadPool(); + // see https://scryfall.com/docs/api/languages and + // https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes + private static final HashMap langCodeMap = new HashMap<>(); + static { + langCodeMap.put("en-US", "en"); + langCodeMap.put("es-ES", "es"); + langCodeMap.put("fr-FR", "fr"); + langCodeMap.put("de-DE", "de"); + langCodeMap.put("it-IT", "it"); + langCodeMap.put("pt-BR", "pt"); + langCodeMap.put("ja-JP", "ja"); + langCodeMap.put("ko-KR", "ko"); + langCodeMap.put("ru-RU", "ru"); + langCodeMap.put("zh-CN", "zhs"); + langCodeMap.put("zh-HK", "zht"); + }; private HashMap> currentFetches = new HashMap<>(); private HashMap tokenImages; @@ -47,40 +63,49 @@ public abstract class ImageFetcher { final String filename = ImageUtil.getImageKey(paperCard, backFace, true); destFile = new File(ForgeConstants.CACHE_CARD_PICS_DIR + "/" + filename + ".jpg"); - // First try to download the LQ Set URL, then fetch from scryfall - StringBuilder setDownload = new StringBuilder(ForgeConstants.URL_PIC_DOWNLOAD); - setDownload.append(ImageUtil.getDownloadUrl(paperCard, backFace)); - downloadUrls.add(setDownload.toString()); - int artIndex = 1; - final Pattern pattern = Pattern.compile( - "^.:([^|]*\\|){2}(\\d+).*$" - ); + final Pattern pattern = Pattern.compile("^.:([^|]*\\|){2}(\\d+).*$"); Matcher matcher = pattern.matcher(imageKey); if (matcher.matches()) { artIndex = Integer.parseInt(matcher.group(2)); } final StaticData data = StaticData.instance(); - final String cardNum = data.getCommonCards().getCardCollectorNumber(paperCard.getName(), paperCard.getEdition(), artIndex); - if (cardNum != null) { + final String cardNum = data.getCommonCards().getCardCollectorNumber(paperCard.getName(), + paperCard.getEdition(), artIndex); + if (cardNum != null) { String suffix = ""; if (paperCard.getRules().getOtherPart() != null) { suffix = (backFace ? "b" : "a"); } final String editionMciCode = data.getEditions().getMciCodeByCode(paperCard.getEdition()); - downloadUrls.add(String.format("https://img.scryfall.com/cards/normal/en/%s/%s%s.jpg", editionMciCode, cardNum, suffix)); + String langCode = "en"; + String UILang = FModel.getPreferences().getPref(ForgePreferences.FPref.UI_LANGUAGE); + if (langCodeMap.containsKey(UILang)) { + langCode = langCodeMap.get(UILang); + } + // see https://scryfall.com/blog 2020/8/6, and + // https://scryfall.com/docs/api/cards/collector + downloadUrls.add(String.format("https://api.scryfall.com/cards/%s/%s%s/%s?format=image&version=normal", + editionMciCode, cardNum, suffix, langCode)); } + + StringBuilder setDownload = new StringBuilder(ForgeConstants.URL_PIC_DOWNLOAD); + setDownload.append(ImageUtil.getDownloadUrl(paperCard, backFace)); + downloadUrls.add(setDownload.toString()); + } else if (prefix.equals(ImageKeys.TOKEN_PREFIX)) { if (tokenImages == null) { tokenImages = new HashMap<>(); - for (Pair nameUrlPair : FileUtil.readNameUrlFile(ForgeConstants.IMAGE_LIST_TOKENS_FILE)) { + for (Pair nameUrlPair : FileUtil + .readNameUrlFile(ForgeConstants.IMAGE_LIST_TOKENS_FILE)) { tokenImages.put(nameUrlPair.getLeft(), nameUrlPair.getRight()); } } final String filename = imageKey.substring(2) + ".jpg"; String tokenUrl = tokenImages.get(filename); if (tokenUrl == null) { - System.err.println("No specified file for '" + filename + "'.. Attempting to download from default Url"); + System.err + .println("No specified file for '" + filename + "'.. Attempting to download from default Url"); tokenUrl = String.format("%s%s", ForgeConstants.URL_TOKEN_DOWNLOAD, filename); } destFile = new File(ForgeConstants.CACHE_TOKEN_PICS_DIR, filename);