diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseCardNameAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseCardNameAi.java index 4a0ded95dc2..9775cd32395 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseCardNameAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseCardNameAi.java @@ -63,7 +63,6 @@ public class ChooseCardNameAi extends SpellAbilityAi { */ @Override public Card chooseSingleCard(final Player ai, SpellAbility sa, Iterable options, boolean isOptional, Player targetedPlayer, Map params) { - return ComputerUtilCard.getBestAI(options); } diff --git a/forge-game/src/main/java/forge/game/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java index 9a09d1abbe6..95f447942bf 100644 --- a/forge-game/src/main/java/forge/game/GameActionUtil.java +++ b/forge-game/src/main/java/forge/game/GameActionUtil.java @@ -276,7 +276,7 @@ public final class GameActionUtil { continue; } - // set the cost to this directly to buypass non mana cost + // set the cost to this directly to bypass non mana cost final SpellAbility newSA = sa.copyWithDefinedCost("Discard<1/CARDNAME>"); newSA.setActivatingPlayer(activator); newSA.putParam("CostDesc", ManaCostParser.parse("0")); @@ -295,6 +295,32 @@ public final class GameActionUtil { alternatives.add(newSA); } } + if (sa.hasParam("Equip") && activator.hasKeyword("You may pay 0 rather than pay equip costs.")) { + for (final KeywordInterface inst : source.getKeywords()) { + // need to find the correct Keyword from which this Ability is from + if (!inst.getAbilities().contains(sa)) { + continue; + } + + // set the cost to this directly to bypass non mana cost + SpellAbility newSA = sa.copyWithDefinedCost("0"); + newSA.setActivatingPlayer(activator); + newSA.putParam("CostDesc", ManaCostParser.parse("0")); + + // need to build a new Keyword to get better Reminder Text + String data[] = inst.getOriginal().split(":"); + data[1] = "0"; + KeywordInterface newKi = Keyword.getInstance(StringUtils.join(data, ":")); + + // makes new SpellDescription + final StringBuilder sb = new StringBuilder(); + sb.append(newSA.getCostDescription()); + sb.append("(").append(newKi.getReminderText()).append(")"); + newSA.setDescription(sb.toString()); + + alternatives.add(newSA); + } + } return alternatives; } diff --git a/forge-game/src/main/java/forge/game/GameFormat.java b/forge-game/src/main/java/forge/game/GameFormat.java index ab222201d6f..7b7e15e3141 100644 --- a/forge-game/src/main/java/forge/game/GameFormat.java +++ b/forge-game/src/main/java/forge/game/GameFormat.java @@ -120,7 +120,7 @@ public class GameFormat implements Comparable { this.name = fName; this.effectiveDate = effectiveDate; - if(sets != null) { + if (sets != null) { StaticData data = StaticData.instance(); Set parsedSets = new HashSet<>(); for (String set : sets) { @@ -129,10 +129,9 @@ public class GameFormat implements Comparable { continue; } parsedSets.add(set); - } allowedSetCodes = Lists.newArrayList(parsedSets); - }else{ + } else { allowedSetCodes = new ArrayList<>(); } @@ -183,7 +182,7 @@ public class GameFormat implements Comparable { } private static Date parseDate(String date) { - if( date.length() <= 7 ) + if (date.length() <= 7) date = date + "-01"; try { return formatter.parse(date); @@ -192,7 +191,7 @@ public class GameFormat implements Comparable { } } - public Date getEffectiveDate() { return effectiveDate; } + public Date getEffectiveDate() { return effectiveDate; } public FormatType getFormatType() { return this.formatType; @@ -299,10 +298,9 @@ public class GameFormat implements Comparable { if (other.formatType != formatType){ return formatType.compareTo(other.formatType); - }else{ - if (other.formatSubType != formatSubType){ - return formatSubType.compareTo(other.formatSubType); - } + } + if (other.formatSubType != formatSubType){ + return formatSubType.compareTo(other.formatSubType); } if (formatType.equals(FormatType.HISTORIC)){ int compareDates = this.effectiveDate.compareTo(other.effectiveDate); @@ -342,7 +340,7 @@ public class GameFormat implements Comparable { @Override protected GameFormat read(File file) { - if(!includeHistoric && !coreFormats.contains(file.getName())){ + if (!includeHistoric && !coreFormats.contains(file.getName())) { return null; } final Map> contents = FileSection.parseSections(FileUtil.readFile(file)); @@ -391,17 +389,17 @@ public class GameFormat implements Comparable { } Boolean strRestrictedLegendary = section.getBoolean("restrictedlegendary"); - if ( strRestrictedLegendary != null ) { + if (strRestrictedLegendary != null) { restrictedLegendary = strRestrictedLegendary; } strCars = section.get("additional"); - if ( strCars != null ) { + if (strCars != null) { additionalCards = Arrays.asList(strCars.split("; ")); } strCars = section.get("rarities"); - if ( strCars != null ) { + if (strCars != null) { CardRarity cr; rarities = Lists.newArrayList(); for (String s: strCars.split(", ")) { @@ -453,8 +451,8 @@ public class GameFormat implements Comparable { public Iterable getSanctionedList() { List coreList = new ArrayList<>(); - for(GameFormat format: naturallyOrdered){ - if(format.getFormatType().equals(FormatType.SANCTIONED)){ + for (GameFormat format: naturallyOrdered) { + if (format.getFormatType().equals(FormatType.SANCTIONED)){ coreList.add(format); } } @@ -463,8 +461,8 @@ public class GameFormat implements Comparable { public Iterable getFilterList() { List coreList = new ArrayList<>(); - for(GameFormat format: naturallyOrdered){ - if(!format.getFormatType().equals(FormatType.HISTORIC) + for (GameFormat format: naturallyOrdered) { + if (!format.getFormatType().equals(FormatType.HISTORIC) &&!format.getFormatType().equals(FormatType.DIGITAL)){ coreList.add(format); } @@ -474,8 +472,8 @@ public class GameFormat implements Comparable { public Iterable getHistoricList() { List coreList = new ArrayList<>(); - for(GameFormat format: naturallyOrdered){ - if(format.getFormatType().equals(FormatType.HISTORIC)){ + for (GameFormat format: naturallyOrdered) { + if (format.getFormatType().equals(FormatType.HISTORIC)){ coreList.add(format); } } @@ -484,10 +482,10 @@ public class GameFormat implements Comparable { public Map> getHistoricMap() { Map> coreList = new HashMap<>(); - for(GameFormat format: naturallyOrdered){ - if(format.getFormatType().equals(FormatType.HISTORIC)){ + for (GameFormat format: naturallyOrdered){ + if (format.getFormatType().equals(FormatType.HISTORIC)){ String alpha = format.getName().substring(0,1); - if(!coreList.containsKey(alpha)){ + if (!coreList.containsKey(alpha)) { coreList.put(alpha,new ArrayList<>()); } coreList.get(alpha).add(format); @@ -549,7 +547,7 @@ public class GameFormat implements Comparable { SortedSet result = new TreeSet<>(); Set coveredTypes = new HashSet<>(); CardPool allCards = deck.getAllCardsInASinglePool(); - for(GameFormat gf : reverseDateOrdered) { + for (GameFormat gf : reverseDateOrdered) { if (gf.getFormatType().equals(FormatType.DIGITAL) && !exhaustive){ //exclude Digital formats from lists for now continue; @@ -587,13 +585,12 @@ public class GameFormat implements Comparable { } if (gf2.formatType != gf1.formatType){ return gf1.formatType.compareTo(gf2.formatType); - }else{ - if (gf2.formatSubType != gf1.formatSubType){ - return gf1.formatSubType.compareTo(gf2.formatSubType); - } + } + if (gf2.formatSubType != gf1.formatSubType){ + return gf1.formatSubType.compareTo(gf2.formatSubType); } if (gf1.formatType.equals(FormatType.HISTORIC)){ - if(gf1.effectiveDate!=gf2.effectiveDate) {//for matching dates or default dates default to name sorting + if (gf1.effectiveDate!=gf2.effectiveDate) {//for matching dates or default dates default to name sorting return gf1.effectiveDate.compareTo(gf2.effectiveDate); } } diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index decce0025e1..7a5583272a1 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -2200,6 +2200,10 @@ public class AbilityUtils { return doXMath(player.getCycledThisTurn(), expr, c, ctb); } + if (sq[0].equals("YouEquippedThisTurn")) { + return doXMath(player.getEquippedThisTurn(), expr, c, ctb); + } + if (sq[0].equals("YouDrewThisTurn")) { return doXMath(player.getNumDrawnThisTurn(), expr, c, ctb); } @@ -3372,6 +3376,18 @@ public class AbilityUtils { if (value.equals("DungeonsCompleted")) { return doXMath(player.getCompletedDungeons().size(), m, source, ctb); } + if (value.startsWith("DungeonCompletedNamed")) { + String [] full = value.split("_"); + String name = full[1]; + int completed = 0; + List dungeons = player.getCompletedDungeons(); + for (Card c : dungeons) { + if (c.getName().equals(name)) { + ++completed; + } + } + return doXMath(completed, m, source, ctb); + } if (value.equals("DifferentlyNamedDungeonsCompleted")) { int amount = 0; List dungeons = player.getCompletedDungeons(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/AnimateEffectBase.java b/forge-game/src/main/java/forge/game/ability/effects/AnimateEffectBase.java index 42d914afa41..bba087ecd8f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AnimateEffectBase.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AnimateEffectBase.java @@ -164,6 +164,14 @@ public abstract class AnimateEffectBase extends SpellAbilityEffect { final Trigger parsedTrigger = TriggerHandler.parseTrigger(AbilityUtils.getSVar(sa, s), c, false, sa); addedTriggers.add(parsedTrigger); } + if (sa.hasParam("GainsTriggeredAbilitiesOf")) { + final List cards = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("GainsTriggeredAbilitiesOf"), sa); + for (final Card card : cards) { + for (Trigger t : card.getTriggers()) { + addedTriggers.add(t.copy(c, false)); + } + } + } // give replacement effects final List addedReplacements = Lists.newArrayList(); diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 600fbfc3153..664b2a68d2d 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -148,6 +148,7 @@ public class Player extends GameEntity implements Comparable { private int investigatedThisTurn = 0; private int surveilThisTurn = 0; private int cycledThisTurn = 0; + private int equippedThisTurn = 0; private int lifeLostThisTurn = 0; private int lifeLostLastTurn = 0; private int lifeGainedThisTurn = 0; @@ -2498,6 +2499,7 @@ public class Player extends GameEntity implements Comparable { resetInvestigatedThisTurn(); resetSurveilThisTurn(); resetCycledThisTurn(); + resetEquippedThisTurn(); resetSacrificedThisTurn(); clearAssignedDamage(); resetAttackersDeclaredThisTurn(); @@ -3455,6 +3457,17 @@ public class Player extends GameEntity implements Comparable { cycledThisTurn = 0; } + public void addEquipped() { equippedThisTurn++; } + + public int getEquippedThisTurn() { + return equippedThisTurn; + } + + public void resetEquippedThisTurn() { + equippedThisTurn = 0; + } + + public boolean hasUrzaLands() { final CardCollectionView landsControlled = getCardsIn(ZoneType.Battlefield); return Iterables.any(landsControlled, Predicates.and(CardPredicates.isType("Urza's"), CardPredicates.isType("Mine"))) diff --git a/forge-game/src/main/java/forge/game/player/PlayerView.java b/forge-game/src/main/java/forge/game/player/PlayerView.java index 6dcaa8faf70..873e7df5b1e 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerView.java +++ b/forge-game/src/main/java/forge/game/player/PlayerView.java @@ -436,6 +436,13 @@ public class PlayerView extends GameEntityView { return getZoneSize(TrackableProperty.Library); } + public FCollectionView getSideboard() { + return get(TrackableProperty.Sideboard); + } + public int getSideboardSize() { + return getZoneSize(TrackableProperty.Sideboard); + } + public FCollectionView getCards(final ZoneType zone) { TrackableProperty prop = getZoneProp(zone); if (prop != null) { diff --git a/forge-game/src/main/java/forge/game/zone/MagicStack.java b/forge-game/src/main/java/forge/game/zone/MagicStack.java index acec5248da0..1150bf071ff 100644 --- a/forge-game/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-game/src/main/java/forge/game/zone/MagicStack.java @@ -326,6 +326,11 @@ public class MagicStack /* extends MyObservable */ implements Iterable manaAction = new Function() { @Override public final Boolean apply(final Byte colorCode) { @@ -85,7 +87,8 @@ public class CField implements ICDoc { } }; - view.getDetailsPanel().setupMouseActions(handAction, libraryAction, exileAction, graveAction, flashBackAction, commandAction, manaAction); + view.getDetailsPanel().setupMouseActions(handAction, libraryAction, exileAction, graveAction, flashBackAction, + commandAction, anteAction, sideboardAction, manaAction); } public final CMatchUI getMatchUI() { diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/special/PlayerDetailsPanel.java b/forge-gui-desktop/src/main/java/forge/toolbox/special/PlayerDetailsPanel.java index 9a847227d2e..b3b00fb6a02 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/special/PlayerDetailsPanel.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/special/PlayerDetailsPanel.java @@ -39,6 +39,8 @@ public class PlayerDetailsPanel extends JPanel { private final DetailLabel lblExile = new DetailLabel(FSkinProp.IMG_ZONE_EXILE, Localizer.getInstance().getMessage("lblExileNCards", "%s")); private final DetailLabel lblFlashback = new DetailLabel(FSkinProp.IMG_ZONE_FLASHBACK, Localizer.getInstance().getMessage("lblFlashbackNCards", "%s")); private final DetailLabel lblCommand = new DetailLabel(FSkinProp.IMG_PLANESWALKER, Localizer.getInstance().getMessage("lblCommandZoneNCards", "%s")); + private final DetailLabel lblAnte = new DetailLabel(FSkinProp.IMG_ZONE_ANTE, Localizer.getInstance().getMessage("lblAnteZoneNCards", "%s")); + private final DetailLabel lblSideboard = new DetailLabel(FSkinProp.IMG_ZONE_SIDEBOARD, Localizer.getInstance().getMessage("lblSideboardNCards", "%s")); private final List> manaLabels = new ArrayList<>(); public PlayerDetailsPanel(final PlayerView player0) { @@ -67,6 +69,7 @@ public class PlayerDetailsPanel extends JPanel { final SkinnedPanel row4 = new SkinnedPanel(new MigLayout("insets 0, gap 0")); final SkinnedPanel row5 = new SkinnedPanel(new MigLayout("insets 0, gap 0")); final SkinnedPanel row6 = new SkinnedPanel(new MigLayout("insets 0, gap 0")); + final SkinnedPanel row7 = new SkinnedPanel(new MigLayout("insets 0, gap 0")); row1.setBackground(FSkin.getColor(FSkin.Colors.CLR_ZEBRA)); row2.setOpaque(false); @@ -74,6 +77,7 @@ public class PlayerDetailsPanel extends JPanel { row4.setOpaque(false); row5.setBackground(FSkin.getColor(FSkin.Colors.CLR_ZEBRA)); row6.setOpaque(false); + row7.setBackground(FSkin.getColor(FSkin.Colors.CLR_ZEBRA)); // Hand, library, graveyard, exile, flashback, command final String constraintsCell = "w 50%-4px!, h 100%!, gapleft 2px, gapright 2px"; @@ -87,22 +91,26 @@ public class PlayerDetailsPanel extends JPanel { row3.add(lblFlashback, constraintsCell); row3.add(lblCommand, constraintsCell); - row4.add(manaLabels.get(0).getLeft(), constraintsCell); - row4.add(manaLabels.get(1).getLeft(), constraintsCell); + row4.add(lblAnte, constraintsCell); + row4.add(lblSideboard, constraintsCell); - row5.add(manaLabels.get(2).getLeft(), constraintsCell); - row5.add(manaLabels.get(3).getLeft(), constraintsCell); + row5.add(manaLabels.get(0).getLeft(), constraintsCell); + row5.add(manaLabels.get(1).getLeft(), constraintsCell); - row6.add(manaLabels.get(4).getLeft(), constraintsCell); - row6.add(manaLabels.get(5).getLeft(), constraintsCell); + row6.add(manaLabels.get(2).getLeft(), constraintsCell); + row6.add(manaLabels.get(3).getLeft(), constraintsCell); - final String constraintsRow = "w 100%!, h 16%!"; + row7.add(manaLabels.get(4).getLeft(), constraintsCell); + row7.add(manaLabels.get(5).getLeft(), constraintsCell); + + final String constraintsRow = "w 100%!, h 14%!"; add(row1, constraintsRow + ", gap 0 0 2% 0"); add(row2, constraintsRow); add(row3, constraintsRow); add(row4, constraintsRow); add(row5, constraintsRow); add(row6, constraintsRow); + add(row7, constraintsRow); } public Component getLblLibrary() { @@ -119,7 +127,9 @@ public class PlayerDetailsPanel extends JPanel { librarySize = String.valueOf(player.getLibrarySize()), flashbackSize = String.valueOf(player.getFlashbackSize()), exileSize = String.valueOf(player.getExileSize()), - commandSize = String.valueOf(player.getCommandSize()); + commandSize = String.valueOf(player.getCommandSize()), + anteSize = String.valueOf(player.getAnteSize()), + sideboardSize = String.valueOf(player.getSideboardSize()); lblHand.setText(handSize); lblHand.setToolTip(handSize, player.getMaxHandString()); @@ -133,6 +143,10 @@ public class PlayerDetailsPanel extends JPanel { lblExile.setToolTip(exileSize); lblCommand.setText(commandSize); lblCommand.setToolTip(commandSize); + lblAnte.setText(anteSize); + lblAnte.setToolTip(anteSize); + lblSideboard.setText(sideboardSize); + lblSideboard.setToolTip(sideboardSize); } /** @@ -147,7 +161,7 @@ public class PlayerDetailsPanel extends JPanel { } public void setupMouseActions(final Runnable handAction, final Runnable libraryAction, final Runnable exileAction, - final Runnable graveAction, final Runnable flashBackAction, final Runnable commandAction, + final Runnable graveAction, final Runnable flashBackAction, final Runnable commandAction, final Runnable anteAction, final Runnable sideboardAction, final Function manaAction) { // Detail label listeners lblGraveyard.addMouseListener(new FMouseAdapter() { @@ -180,6 +194,16 @@ public class PlayerDetailsPanel extends JPanel { commandAction.run(); } }); + lblAnte.addMouseListener(new FMouseAdapter() { + @Override public void onLeftClick(final MouseEvent e) { + anteAction.run(); + } + }); + lblSideboard.addMouseListener(new FMouseAdapter() { + @Override public void onLeftClick(final MouseEvent e) { + sideboardAction.run(); + } + }); for (final Pair labelPair : manaLabels) { labelPair.getLeft().addMouseListener(new FMouseAdapter() { diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java index 235c96a12fe..0ed98b9e306 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/FloatingZone.java @@ -188,6 +188,15 @@ public class FloatingZone extends FloatingCardArea { case Flashback: window.setIconImage(FSkin.getImage(FSkinProp.IMG_ZONE_FLASHBACK)); break; + case Command: + window.setIconImage(FSkin.getImage(FSkinProp.IMG_PLANESWALKER)); + break; + case Ante: + window.setIconImage(FSkin.getImage(FSkinProp.IMG_ZONE_ANTE)); + break; + case Sideboard: + window.setIconImage(FSkin.getImage(FSkinProp.IMG_ZONE_SIDEBOARD)); + break; default: locPref = null; break; @@ -247,6 +256,15 @@ public class FloatingZone extends FloatingCardArea { case Flashback: locPref = isAi ? FPref.ZONE_LOC_AI_FLASHBACK : FPref.ZONE_LOC_HUMAN_FLASHBACK; break; + case Command: + locPref = isAi ? FPref.ZONE_LOC_AI_COMMAND : FPref.ZONE_LOC_HUMAN_COMMAND; + break; + case Ante: + locPref = isAi ? FPref.ZONE_LOC_AI_ANTE : FPref.ZONE_LOC_HUMAN_ANTE; + break; + case Sideboard: + locPref = isAi ? FPref.ZONE_LOC_AI_SIDEBOARD : FPref.ZONE_LOC_HUMAN_SIDEBOARD; + break; default: locPref = null; break; diff --git a/forge-gui-mobile/src/forge/assets/FSkinImage.java b/forge-gui-mobile/src/forge/assets/FSkinImage.java index 060797d48a5..e5db8abf2ae 100644 --- a/forge-gui-mobile/src/forge/assets/FSkinImage.java +++ b/forge-gui-mobile/src/forge/assets/FSkinImage.java @@ -34,6 +34,8 @@ public enum FSkinImage implements FImage { GRAVEYARD (FSkinProp.IMG_ZONE_GRAVEYARD, SourceFile.ICONS), HDGRAVEYARD (FSkinProp.IMG_HDZONE_GRAVEYARD, SourceFile.BUTTONS), + SIDEBOARD (FSkinProp.IMG_ZONE_SIDEBOARD, SourceFile.ICONS), + HDMANAPOOL (FSkinProp.IMG_HDZONE_MANAPOOL, SourceFile.BUTTONS), POISON (FSkinProp.IMG_ZONE_POISON, SourceFile.ICONS), @@ -482,7 +484,7 @@ public enum FSkinImage implements FImage { // If any return true, image exists. int x0 = 0, y0 = 0; Color c; - + // Center x0 = (x + w / 2); y0 = (y + h / 2); @@ -491,7 +493,7 @@ public enum FSkinImage implements FImage { textureRegion = new TextureRegion(texture, x, y, w, h); return; } - + x0 += 2; y0 += 2; c = new Color(preferredIcons.getPixel(x0, y0)); @@ -499,21 +501,21 @@ public enum FSkinImage implements FImage { textureRegion = new TextureRegion(texture, x, y, w, h); return; } - + x0 -= 4; c = new Color(preferredIcons.getPixel(x0, y0)); if (c.a != 0) { textureRegion = new TextureRegion(texture, x, y, w, h); return; } - + y0 -= 4; c = new Color(preferredIcons.getPixel(x0, y0)); if (c.a != 0) { textureRegion = new TextureRegion(texture, x, y, w, h); return; } - + x0 += 4; c = new Color(preferredIcons.getPixel(x0, y0)); if (c.a != 0) { diff --git a/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java b/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java index 645f7598c83..a5bb861d39d 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java @@ -76,6 +76,7 @@ public class VPlayerPanel extends FContainer { tabs.add(tabManaPool); addZoneDisplay(ZoneType.Exile, Forge.hdbuttons ? FSkinImage.HDEXILE : FSkinImage.EXILE); + addZoneDisplay(ZoneType.Sideboard, Forge.hdbuttons ? FSkinImage.HDSIDEBOARD :FSkinImage.SIDEBOARD); commandZone = add(new CommandZoneDisplay(player)); @@ -441,7 +442,7 @@ public class VPlayerPanel extends FContainer { if (vibrateDuration > 0 && MatchController.instance.isLocalPlayer(player) && FModel.getPreferences().getPrefBoolean(FPref.UI_VIBRATE_ON_LIFE_LOSS)) { //never vibrate more than two seconds regardless of life lost or poison counters gained - Gdx.input.vibrate(Math.min(vibrateDuration, 2000)); + Gdx.input.vibrate(Math.min(vibrateDuration, 2000)); } } diff --git a/forge-gui/res/cardsfolder/f/frontier_explorer.txt b/forge-gui/res/cardsfolder/f/frontier_explorer.txt index 316a284eb3a..19573ce0789 100644 --- a/forge-gui/res/cardsfolder/f/frontier_explorer.txt +++ b/forge-gui/res/cardsfolder/f/frontier_explorer.txt @@ -2,7 +2,6 @@ Name:Frontier Explorer ManaCost:W Types:Creature Cat Scout PT:2/1 -A:AB$ Effect | Cost$ 3 T | Name$ Play a Plains | Abilities$ PlayLand | EffectOwner$ You | SpellDescription$ Until end of turn, you may play one basic Plains card from outside the game. -SVar:PlayLand:ST$ Play | Cost$ 0 | ActivationZone$ Command | SorcerySpeed$ True | ValidZone$ Sideboard | Valid$ Land.Plains+Basic | SubAbility$ ExileEffect | SpellDescription$ Play a basic Plains card from outside the game. -SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile +A:AB$ Effect | Cost$ 3 T | StaticAbilities$ PlaySideboard | EffectOwner$ You | SpellDescription$ Until end of turn, you may play one basic Plains card from outside the game. +SVar:PlaySideboard:Mode$ Continuous | Affected$ Land.Plains+Basic | MayPlay$ True | MayPlayLimit$ 1 | EffectZone$ Command | AffectedZone$ Sideboard | Description$ Until end of turn, you may play one basic Plains card from outside the game. Oracle:{3}, {T}: Until end of turn, you may play one basic Plains card from outside the game. diff --git a/forge-gui/res/cardsfolder/t/the_cinematic_phoenix.txt b/forge-gui/res/cardsfolder/t/the_cinematic_phoenix.txt new file mode 100644 index 00000000000..2d08044ac0f --- /dev/null +++ b/forge-gui/res/cardsfolder/t/the_cinematic_phoenix.txt @@ -0,0 +1,13 @@ +Name:The Cinematic Phoenix +ManaCost:3 B R +Types:Legendary Creature Phoenix +PT:4/4 +K:Flying +K:Haste +K:Protection from red +A:AB$ ChangeZone | Cost$ 1 T | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.Legendary+YouCtrl | TgtPrompt$ Select target legendary creature in your graveyard | GainControl$ True | SpellDescription$ Return target legendary creature card from your graveyard to the battlefield. +A:AB$ ChangeZone | Cost$ tapXType<6/Creature> | RememberCostCards$ True | Origin$ Graveyard | Destination$ Battlefield | ActivationZone$ Graveyard | SubAbility$ CheckWin | SpellDescription$ Return CARDNAME from your graveyard to the battlefield. If you tapped six legendary creatures this way, you win the game. +SVar:CheckWin:DB$ WinsGame | Defined$ You | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ6 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Remembered$Valid Creature.Legendary +Oracle:Flying, haste, protection from red\n{1}, {T}: Return target legendary creature card from your graveyard to the battlefield.\nTap six untapped creatures you control: Return The Cinematic Phoenix from your graveyard to the battlefield. If you tapped six legendary creatures this way, you win the game. diff --git a/forge-gui/res/cardsfolder/upcoming/acererak_the_archlich.txt b/forge-gui/res/cardsfolder/upcoming/acererak_the_archlich.txt new file mode 100644 index 00000000000..f46cd17b46d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/acererak_the_archlich.txt @@ -0,0 +1,15 @@ +Name:Acererak the Archlich +ManaCost:2 B +Types:Legendary Creature Zombie Wizard +PT:5/5 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | CheckSVar$ X | SVarCompare$ LT1 | Execute$ TrigBounce | TriggerDescription$ When CARDNAME enters the battlefield, if you haven't completed Tomb of Annihilation, return CARDNAME to its owner's hand and venture into the dungeon. +SVar:TrigBounce:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBVenture +SVar:DBVenture:DB$ Venture +SVar:X:PlayerCountPropertyYou$DungeonCompletedNamed_Tomb of Annihilation +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigRepeat | TriggerDescription$ Whenever CARDNAME attacks, for each opponent, you create a 2/2 black Zombie creature token unless that player sacrifices a creature. +SVar:TrigRepeat:DB$ RepeatEach | RepeatPlayers$ Opponent | RepeatSubAbility$ DBToken +SVar:DBToken:DB$ Token | TokenScript$ b_2_2_zombie | UnlessCost$ Sac<1/Creature> | UnlessPayer$ Player.IsRemembered +SVar:HasAttackEffect:TRUE +DeckHas:Ability$Token +DeckHints:Type$Zombie +Oracle:When Acererak the Archlich enters the battlefield, if you haven't completed Tomb of Annihilation, return Acererak the Archlich to its owner's hand and venture into the dungeon.\nWhenever Acererak the Archlich attacks, for each opponent, you create a 2/2 black Zombie creature token unless that player sacrifices a creature. diff --git a/forge-gui/res/cardsfolder/upcoming/arcane_investigator.txt b/forge-gui/res/cardsfolder/upcoming/arcane_investigator.txt new file mode 100644 index 00000000000..d7ad243f17a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/arcane_investigator.txt @@ -0,0 +1,8 @@ +Name:Arcane Investigator +ManaCost:1 U +Types:Creature Elf Wizard +PT:2/1 +A:AB$ RollDice | Cost$ 5 U | Sides$ 20 | ResultSubAbilities$ 1-9:DBDraw,10-20:DBDig | PrecostDesc$ Search the Room — | SpellDescription$ Roll a d20. +SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ 1-9 VERT Draw a card. +SVar:DBDig:DB$ Dig | DigNum$ 3 | ChangeNum$ 1 | SpellDescription$ 10-20 VERT Look at the top three cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order. +Oracle:Search the Room — {5}{U}: Roll a d20.\n1-9 | Draw a card.\n10-20 | Look at the top three cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order. diff --git a/forge-gui/res/cardsfolder/upcoming/asmodeus_the_archfiend.txt b/forge-gui/res/cardsfolder/upcoming/asmodeus_the_archfiend.txt new file mode 100644 index 00000000000..42d195ef823 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/asmodeus_the_archfiend.txt @@ -0,0 +1,12 @@ +Name:Asmodeus the Archfiend +ManaCost:4 B B +Types:Legendary Creature Devil God +PT:6/6 +R:Event$ Draw | ActiveZones$ Battlefield | ValidPlayer$ You | ReplaceWith$ ExileTop | Description$ Binding Contract — If you would draw a card, exile the top card of your library face down instead. +SVar:ExileTop:DB$ ChangeZone | Defined$ TopOfLibrary | Origin$ Library | Destination$ Exile | ExileFaceDown$ True +A:AB$ Draw | Cost$ B B B | NumCards$ 3 | SpellDescription$ Draw three cards. +A:AB$ ChangeZoneAll | Cost$ B | ChangeType$ Card.ExiledWithSource | Origin$ Exile | Destination$ Hand | RememberChanged$ True | SubAbility$ DBLoseLife | SpellDescription$ Return all cards exiled with CARDNAME to their owner’s hand and you lose that much life. +SVar:DBLoseLife:DB$ LoseLife | Defined$ You | LifeAmount$ X | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Remembered$Amount +Oracle:Binding Contract — If you would draw a card, exile the top card of your library face down instead.\n{B}{B}{B}: Draw seven cards.\n{B}: Return all cards exiled with Asmodeus the Archfiend to their owner's hand and you lose that much life. diff --git a/forge-gui/res/cardsfolder/upcoming/battle_cry_goblin.txt b/forge-gui/res/cardsfolder/upcoming/battle_cry_goblin.txt new file mode 100644 index 00000000000..db9bda932af --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/battle_cry_goblin.txt @@ -0,0 +1,10 @@ +Name:Battle Cry Goblin +ManaCost:1 R +Types:Creature Goblin +PT:2/2 +A:AB$ PumpAll | Cost$ 1 R | ValidCards$ Creature.Goblin+YouCtrl | NumAtt$ +1 | KW$ Haste | SpellDescription$ Goblins you control get +1/+0 and gain haste until end of turn. +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigToken | TriggerZones$ Battlefield | CheckSVar$ PackTactics | SVarCompare$ GE6 | NoResolvingCheck$ True | TriggerDescription$ Pack tactics — Whenever CARDNAME attacks, if you attacked with creatures with total power 6 or greater this combat, create a 1/1 red Goblin creature token that's tapped and attacking. +SVar:TrigToken:DB$Token | TokenAmount$ 1 | TokenScript$ r_1_1_goblin | TokenOwner$ You | TokenTapped$ True | TokenAttacking$ True +SVar:PackTactics:Count$SumPower_Creature.attacking +DeckHas:Ability$Token +Oracle:{1}{R}: Goblins you control get +1/+0 and gain haste until end of turn.\nPack tactics — Whenever Battle Cry Goblin attacks, if you attacked with creatures with total power 6 or greater this combat, create a 1/1 red Goblin creature token that’s tapped and attacking. diff --git a/forge-gui/res/cardsfolder/upcoming/blink_dog.txt b/forge-gui/res/cardsfolder/upcoming/blink_dog.txt new file mode 100644 index 00000000000..a190f2ad714 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/blink_dog.txt @@ -0,0 +1,7 @@ +Name:Blink Dog +ManaCost:2 W +Types:Creature Dog +PT:1/1 +K:Double Strike +A:AB$ Phases | Cost$ 3 W | Defined$ Self | SpellDescription$ Teleport — CARDNAME phases out. +Oracle:Double strike\nTeleport — {3}{W}: Blink Dog phases out. (Treat it and anything attached to it as though they don't exist until your next turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/blue_dragon.txt b/forge-gui/res/cardsfolder/upcoming/blue_dragon.txt new file mode 100644 index 00000000000..9dac913ad9a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/blue_dragon.txt @@ -0,0 +1,12 @@ +Name:Blue Dragon +ManaCost:5 U U +Types:Creature Dragon +PT:5/5 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Lightning Breath — When CARDNAME enters the battlefield, until your next turn, target creature an opponent controls gets -3/-0, up to one other target creature gets -2/-0, and up to one other target creature gets -1/-0. +SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls (-3/-0) | NumAtt$ -3 | Duration$ UntilYourNextTurn | SubAbility$ DBPump +SVar:DBPump:DB$ Pump | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose up to one other target creature an opponent controls (-2/-0) | TargetMin$ 0 | TargetMax$ 1 | NumAtt$ -2 | TargetUnique$ True | Duration$ UntilYourNextTurn | SubAbility$ DBPump2 +SVar:DBPump2:DB$ Pump | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose up to one other target creature an opponent controls (-1/-0) | TargetMin$ 0 | TargetMax$ 1 | NumAtt$ -1 | TargetUnique$ True | Duration$ UntilYourNextTurn +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:PlayMain1:TRUE +Oracle:Flying\nLightning Breath — When Blue Dragon enters the battlefield, until your next turn, target creature an opponent controls gets -3/-0, up to one other target creature gets -2/-0, and up to one other target creature gets -1/-0. diff --git a/forge-gui/res/cardsfolder/upcoming/bruenor_battlehammer.txt b/forge-gui/res/cardsfolder/upcoming/bruenor_battlehammer.txt new file mode 100644 index 00000000000..6cd7b74966c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/bruenor_battlehammer.txt @@ -0,0 +1,9 @@ +Name:Bruenor Battlehammer +ManaCost:2 R W +Types:Legendary Creature Dwarf Warrior +PT:5/3 +S:Mode$ Continuous | Affected$ Creature.YouCtrl | AffectedZone$ Battlefield | AddPower$ AffectedX | Description$ Each creature you control gets +2/+0 for each Equipment attached to it. +SVar:AffectedX:Count$Valid Equipment.Attached/Times.2 +S:Mode$ Continuous | Affected$ You | AddKeyword$ You may pay 0 rather than pay equip costs. | CheckSVar$ X | SVarCompare$ LT1 | Description$ You may pay {0} rather than pay the equip cost of the first equip ability you activate each turn. +SVar:X:Count$YouEquippedThisTurn +Oracle:Each creature you control gets +2/+0 for each Equipment attached to it.\nYou may pay {0} rather than pay the equip cost of the first equip ability you activate each turn. diff --git a/forge-gui/res/cardsfolder/upcoming/check_for_traps.txt b/forge-gui/res/cardsfolder/upcoming/check_for_traps.txt new file mode 100644 index 00000000000..eb690948269 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/check_for_traps.txt @@ -0,0 +1,9 @@ +Name:Check for Traps +ManaCost:1 B +Types:Sorcery +A:SP$ ChangeZone | Cost$ 1 B | Origin$ Hand | Destination$ Exile | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | DefinedPlayer$ Targeted | Chooser$ You | ChangeType$ Card.nonLand | ChangeNum$ 1 | IsCurse$ True | Mandatory$ True | RememberChanged$ True | SubAbility$ TheyLose | SpellDescription$ Target opponent reveals their hand. You choose a nonland card from it. Exile that card. If an instant card or a card with flash is exiled this way, they lose 1 life. Otherwise, you lose 1 life. +SVar:TheyLose:DB$ LoseLife | Defined$ RememberedOwner | LifeAmount$ 1 | ConditionCheckSVar$ X | SubAbility$ YouLose +SVar:YouLose:DB$ LoseLife | LifeAmount$ 1 | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Remembered$Valid Instant,Card.withFlash +Oracle:Target opponent reveals their hand. You choose a nonland card from it. Exile that card. If an instant card or a card with flash is exiled this way, they lose 1 life. Otherwise, you lose 1 life. diff --git a/forge-gui/res/cardsfolder/upcoming/djinni_windseer.txt b/forge-gui/res/cardsfolder/upcoming/djinni_windseer.txt new file mode 100644 index 00000000000..7963a52cd40 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/djinni_windseer.txt @@ -0,0 +1,11 @@ +Name:Djinni Windseer +ManaCost:3 U +Types:Creature Djinn +PT:3/3 +K:Flying +T:Mode$ ChangesZone | ValidCard$ Card.Self | Destination$ Battlefield | Execute$ TrigRollDice | TriggerDescription$ When CARDNAME enters the battlefield, ABILITY +SVar:TrigRollDice:DB$ RollDice | Sides$ 20 | ResultSubAbilities$ 1-9:Scry1,10-19:Scry2,20:Scry3 | SpellDescription$ roll a d20. +SVar:Scry1:DB$ Scry | ScryNum$ 1 | SpellDescription$ 1-9 VERT Scry 1. +SVar:Scry2:DB$ Scry | ScryNum$ 2 | SpellDescription$ 10-19 VERT Scry 2. +SVar:Scry3:DB$ Scry | ScryNum$ 3 | SpellDescription$ 20 VERT Scry 3. +Oracle:Flying\nWhen Djinni Windseer enters the battlefield, roll a d20.\n1-9 | Scry 1.\n10-19 | Scry 2.\n20 | Scry 3. diff --git a/forge-gui/res/cardsfolder/upcoming/eye_of_vecna.txt b/forge-gui/res/cardsfolder/upcoming/eye_of_vecna.txt new file mode 100644 index 00000000000..c841e893fc9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/eye_of_vecna.txt @@ -0,0 +1,10 @@ +Name:Eye of Vecna +ManaCost:2 +Types:Legendary Artifact +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, you draw a card and you lose 2 life. +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | OptionalDecider$ You | Execute$ TrigDrawUpkeep | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, you may pay {2}. If you do, you draw a card and you lose 2 life. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SubAbility$ DBLoseLife +SVar:TrigDrawUpkeep:AB$ Draw | Cost$ 2 | Defined$ You | NumCards$ 1 | SubAbility$ DBLoseLife +SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 2 +DeckHints:Name$Hand of Vecna|The Book of Vile Darkness +Oracle:When Eye of Vecna enters the battlefield, you draw a card and you lose 2 life.\nAt the beginning of your upkeep, you may pay {2}. If you do, you draw a card and you lose 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/eyes_of_the_beholder.txt b/forge-gui/res/cardsfolder/upcoming/eyes_of_the_beholder.txt new file mode 100644 index 00000000000..d1c3ad20187 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/eyes_of_the_beholder.txt @@ -0,0 +1,5 @@ +Name:Eyes of the Beholder +ManaCost:4 B B +Types:Instant +A:SP$ Pump | Cost$ 4 B B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -11 | NumDef$ -11 | IsCurse$ True | SpellDescription$ Target creature gets -11/-11 until end of turn. +Oracle:Target creature gets -11/-11 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/flameskull.txt b/forge-gui/res/cardsfolder/upcoming/flameskull.txt new file mode 100644 index 00000000000..89928972c0b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/flameskull.txt @@ -0,0 +1,14 @@ +Name:Flameskull +ManaCost:1 R R +Types:Creature Skeleton +PT:3/1 +K:Flying +K:CARDNAME can't block. +T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigExile | TriggerDescription$ Rejuvenation – When CARDNAME dies, exile it. If you do, exile the top card of your library. Until the end of your next turn, you may play one of those cards. (If you cast CARDNAME this way, you can't play the other card, and vice versa.) +SVar:TrigExile:DB$ ChangeZone | Defined$ TriggeredNewCardLKICopy | Origin$ Graveyard | Destination$ Exile | RememberChanged$ True | SubAbility$ DBExile +SVar:DBExile:DB$ Dig | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ MayPlay | Duration$ UntilTheEndOfYourNextTurn | ForgetOnMoved$ Exile | SubAbility$ DBCleanup +SVar:MayPlay:Mode$ Continuous | Affected$ Card.IsRemembered | MayPlay$ True | MayPlayLimit$ 1 | EffectZone$ Command | AffectedZone$ Exile | Description$ Until the end of your next turn, you may play one of these cards. (If you cast EFFECTSOURCE this way, you can't play the other card, and vice versa.) +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:SacMe:3 +Oracle:Flying\nFlameskull can’t block.\nRejuvenation — When Flameskull dies, exile it. If you do, exile the top card of your library. Until the end of your next turn, you may play one of those cards. (If you cast Flameskull this way, you can't play the other card, and vice versa.) diff --git a/forge-gui/res/cardsfolder/upcoming/froghemoth.txt b/forge-gui/res/cardsfolder/upcoming/froghemoth.txt new file mode 100644 index 00000000000..8e9db60caf0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/froghemoth.txt @@ -0,0 +1,16 @@ +Name:Froghemoth +ManaCost:3 G G +Types:Creature Frog Horror +PT:4/4 +K:Trample +K:Haste +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigExile | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, exile up to that many target cards from their graveyard. Put a +1/+1 counter on CARDNAME for each creature exiled this way. You gain 1 life for each noncreature card exiled this way. +SVar:TrigExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | ChangeType$ Card.DefenderCtrl | ChangeNum$ X | Hidden$ True | RememberChanged$ True | SubAbility$ DBPutCounter +SVar:DBPutCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ Y | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | LifeAmount$ Z | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:TriggerCount$DamageAmount +SVar:Y:Remembered$Valid Creature +SVar:Z:Remembered$Valid Card.nonCreature +DeckHas:Ability$LifeGain & Ability$Counters +Oracle:Trample, haste\nWhenever Froghemoth deals combat damage to a player, exile up to that many target cards from their graveyard. Put a +1/+1 counter on Froghemoth for each creature exiled this way. You gain 1 life for each noncreature card exiled this way. diff --git a/forge-gui/res/cardsfolder/upcoming/gnoll_hunter.txt b/forge-gui/res/cardsfolder/upcoming/gnoll_hunter.txt new file mode 100644 index 00000000000..18ee1353b0d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gnoll_hunter.txt @@ -0,0 +1,9 @@ +Name:Gnoll Hunter +ManaCost:1 G +Types:Creature Gnoll +PT:2/2 +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerZones$ Battlefield | CheckSVar$ PackTactics | SVarCompare$ GE6 | NoResolvingCheck$ True | TriggerDescription$ Pack tactics — Whenever CARDNAME attacks, if you attacked with creatures with total power 6 or greater this combat, put a +1/+1 counter on CARDNAME. +SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +SVar:PackTactics:Count$SumPower_Creature.attacking +DeckHas:Ability$Counters +Oracle:Pack tactics — Whenever Gnoll Hunter attacks, if you attacked with creatures with total power 6 or greater this combat, put a +1/+1 counter on Gnoll Hunter. diff --git a/forge-gui/res/cardsfolder/upcoming/goblin_javelineer.txt b/forge-gui/res/cardsfolder/upcoming/goblin_javelineer.txt new file mode 100644 index 00000000000..a56edb7582b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/goblin_javelineer.txt @@ -0,0 +1,8 @@ +Name:Goblin Javelineer +ManaCost:R +Types:Creature Goblin Warrior +PT:1/1 +K:Haste +T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME becomes blocked, it deals 1 damage to target creature blocking it. +SVar:TrigDealDamage:DB$ DealDamage | DamageSource$ TriggeredAttacker | NumDmg$ 1 | Defined$ TriggeredBlockers +Oracle:Haste\nWhenever Goblin Javelineer becomes blocked, it deals 1 damage to target creature blocking it. diff --git a/forge-gui/res/cardsfolder/upcoming/grand_master_of_flowers.txt b/forge-gui/res/cardsfolder/upcoming/grand_master_of_flowers.txt new file mode 100644 index 00000000000..7cefc21f38c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/grand_master_of_flowers.txt @@ -0,0 +1,9 @@ +Name:Grand Master of Flowers +ManaCost:2 W W +Types:Legendary Planeswalker Bahamut +Loyalty:3 +S:Mode$ Continuous | Affected$ Card.Self | CheckSVar$ X | SVarCompare$ GE7 | AddKeyword$ Flying & Indestructible | AddType$ Creature & Dragon & God | SetPower$ 7 | SetToughness$ 7 | RemoveCardTypes$ True | CharacteristicDefining$ True | Description$ As long as CARDNAME has seven or more loyalty counters on him, he's a 7/7 Dragon God creature with flying and indestructible. +SVar:X:Count$CardCounters.LOYALTY +A:AB$ Pump | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature.withoutFirst Strike+withoutDouble Strike+withoutVigilance | KW$ HIDDEN CARDNAME can't attack or block. | IsCurse$ True | Duration$ UntilYourNextTurn | AILogic$ DetainNonLand | SpellDescription$ Target creature without first strike, double strike, or vigilance can't attack or block until your next turn. +A:AB$ ChangeZone | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedMonk of the Open Hand | ChangeNum$ 1 | Optional$ True | SpellDescription$ Search your library and/or graveyard for a card named Monk of the Open Hand, reveal it, and put it into your hand. If you search your library this way, shuffle. +Oracle:As long as Grand Master of Flowers has seven or more loyalty counters on him, he’s a 7/7 Dragon God creature with flying and indestructible.\n[+1]: Target creature without first strike, double strike, or vigilance can't attack or block until your next turn.\n[+1]: Search your library and/or graveyard for a card named Monk of the Open Hand, reveal it, and put it into your hand. If you search your library this way, shuffle. diff --git a/forge-gui/res/cardsfolder/upcoming/gretchen_titchwillow.txt b/forge-gui/res/cardsfolder/upcoming/gretchen_titchwillow.txt new file mode 100644 index 00000000000..7526a449213 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gretchen_titchwillow.txt @@ -0,0 +1,7 @@ +Name:Gretchen Titchwillow +ManaCost:G U +Types:Legendary Creature Halfling Druid +PT:0/4 +A:AB$ Draw | Cost$ 2 G U | Defined$ You | NumCards$ 1 | SubAbility$ DBChangeZone | SpellDescription$ Draw a card. +SVar:DBChangeZone:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | Optional$ You | ChangeType$ Land | ChangeNum$ 1 | SpellDescription$ You may put a land card from your hand onto the battlefield. +Oracle:{2}{G}{U}: Draw a card. You may put a land card from your hand onto the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/hand_of_vecna.txt b/forge-gui/res/cardsfolder/upcoming/hand_of_vecna.txt new file mode 100644 index 00000000000..43cf723724b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/hand_of_vecna.txt @@ -0,0 +1,12 @@ +Name:Hand of Vecna +ManaCost:3 +Types:Legendary Artifact Equipment +T:Mode$Phase | Phase$ BeginCombat | ValidPlayer$ You | Execute$ TrigChoose | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of combat on your turn, equipped creature or a creature you control named Vecna gets +X/+X until end of turn, where X is the number of cards in your hand. +SVar:TrigChoose:DB$ ChooseCard | Choices$ Creature.EquippedBy,Creature.YouCtrl+namedVecna | SubAbility$ DBPump +SVar:DBPump:DB$ Pump | Defined$ ChosenCard | NumAtt$ +X | NumDef$ +X | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True +K:Equip:PayLife +K:Equip:2 +SVar:X:Count$CardsInYourHand +DeckHints:Name$Eye of Vecna|The Book of Vile Darkness +Oracle:At the beginning of combat on your turn, equipped creature or a creature you control named Vecna gets +X/+X until end of turn, where X is the number of cards in your hand.\nEquip—Pay 1 life for each card in your hand.\nEquip {2} diff --git a/forge-gui/res/cardsfolder/upcoming/hobgoblin_bandit_lord.txt b/forge-gui/res/cardsfolder/upcoming/hobgoblin_bandit_lord.txt new file mode 100644 index 00000000000..96df5033502 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/hobgoblin_bandit_lord.txt @@ -0,0 +1,9 @@ +Name:Hobgoblin Bandit Lord +ManaCost:1 R R +Types:Creature Goblin Rogue +PT:2/3 +S:Mode$ Continuous | AffectedZone$ Battlefield | Affected$ Goblin.Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Other Goblins you control get +1/+1. +A:AB$ DealDamage | Cost$ R T | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to the number of Goblins that entered the battlefield under your control this turn to any target. +SVar:X:Count$Valid Goblin.ThisTurnEntered+EnteredUnder You +DeckNeeds:Type$Goblin +Oracle:Other Goblins you control get +1/+1.\n{R}, {T}: Hobgoblin Bandit Lord deals damage equal to the number of Goblins that entered the battlefield under your control this turn to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/hobgoblin_captain.txt b/forge-gui/res/cardsfolder/upcoming/hobgoblin_captain.txt new file mode 100644 index 00000000000..cf75d4df78f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/hobgoblin_captain.txt @@ -0,0 +1,8 @@ +Name:Hobgoblin Captain +ManaCost:1 R +Types:Creature Goblin Barbarian +PT:3/1 +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerZones$ Battlefield | CheckSVar$ PackTactics | SVarCompare$ GE6 | NoResolvingCheck$ True | TriggerDescription$ Pack tactics — Whenever CARDNAME attacks, if you attacked with creatures with total power 6 or greater this combat, CARDNAME gains first strike until end of turn. +SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ First Strike +SVar:PackTactics:Count$SumPower_Creature.attacking +Oracle:Pack tactics — Whenever Hobgoblin Captain attacks, if you attacked with creatures with total power 6 or greater this combat, Hobgoblin Captain gains first strike until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/hulking_bugbear.txt b/forge-gui/res/cardsfolder/upcoming/hulking_bugbear.txt new file mode 100644 index 00000000000..7ecc782e30b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/hulking_bugbear.txt @@ -0,0 +1,6 @@ +Name:Hulking Bugbear +ManaCost:1 R R +Types:Creature Goblin +PT:3/3 +K:Haste +Oracle:Haste diff --git a/forge-gui/res/cardsfolder/upcoming/ingenious_smith.txt b/forge-gui/res/cardsfolder/upcoming/ingenious_smith.txt new file mode 100644 index 00000000000..24c127d306c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ingenious_smith.txt @@ -0,0 +1,11 @@ +Name:Ingenious Smith +ManaCost:1 W +Types:Creature Human Artificer +PT:1/1 +T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDig | TriggerDescription$ When CARDNAME enters the battlefield, look at the top four cards of your library. You may reveal an artifact card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. +SVar:TrigDig:DB$ Dig | DigNum$ 4 | ChangeNum$ 1 | Optional$ True | ForceRevealToController$ True | ChangeValid$ Artifact | RestRandomOrder$ True +T:Mode$ ChangesZoneAll | ValidCards$ Artifact.YouCtrl | Destination$ Battlefield | TriggerZones$ Battlefield | ActivationLimit$ 1 | Execute$ TrigPutCounter | TriggerDescription$ Whenever one or more artifacts enter the battlefield under your control, put a +1/+1 counter on CARDNAME. This ability triggers only once each turn. +SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +DeckHints:Type$Artifact +DeckHas:Ability$Counters +Oracle:When Ingenious Smith enters the battlefield, look at the top four cards of your library. You may reveal an artifact card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.\nWhenever one or more artifacts enter the battlefield under your control, put a +1/+1 counter on Ingenious Smith. This ability triggers only once each turn. diff --git a/forge-gui/res/cardsfolder/upcoming/intrepid_outlander.txt b/forge-gui/res/cardsfolder/upcoming/intrepid_outlander.txt new file mode 100644 index 00000000000..c475addc35d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/intrepid_outlander.txt @@ -0,0 +1,9 @@ +Name:Intrepid Outlander +ManaCost:1 G +Types:Creature Orc Ranger +PT:2/3 +K:Reach +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigVenture | TriggerZones$ Battlefield | CheckSVar$ PackTactics | SVarCompare$ GE6 | NoResolvingCheck$ True | TriggerDescription$ Pack tactics — Whenever CARDNAME attacks, if you attacked with creatures with total power 6 or greater this combat, venture into the dungeon. (Enter the first room or advance to the next room.) +SVar:TrigVenture:DB$ Venture +SVar:PackTactics:Count$SumPower_Creature.attacking +Oracle:Reach\nPack tactics — Whenever Intrepid Outlander attacks, if you attacked with creatures with total power 6 or greater this combat, venture into the dungeon. (Enter the first room or advance to the next room.) diff --git a/forge-gui/res/cardsfolder/upcoming/krydle_of_baldurs_gate.txt b/forge-gui/res/cardsfolder/upcoming/krydle_of_baldurs_gate.txt new file mode 100644 index 00000000000..261cd608246 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/krydle_of_baldurs_gate.txt @@ -0,0 +1,13 @@ +Name:Krydle of Baldur's Gate +ManaCost:U B +Types:Legendary Creature Human Elf Rogue +PT:1/3 +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigLoseLife | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player loses 1 life and mills a card, then you gain 1 life and scry 1. +SVar:TrigLoseLife:DB$ LoseLife | Defined$ TriggeredTarget | LifeAmount$ 1 | SubAbility$ DBMill +SVar:DBMill:DB$ Mill | Defined$ TriggeredTarget | NumCards$ 1 | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 | SubAbility$ DBScry +SVar:DBScry:DB$ Scry | Defined$ You | ScryNum$ 1 +T:Mode$ AttackersDeclared | AttackingPlayer$ You | OptionalDecider$ You | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever you attack, you may pay {2}. If you do, target creature can’t be blocked this turn. +SVar:TrigPump:AB$ Pump | Cost$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN Unblockable +DeckHas:Ability$LifeGain +Oracle:Whenever Krydle of Baldur's Gate deals combat damage to a player, that player loses 1 life and mills a card, then you gain 1 life and scry 1.\nWhenever you attack, you may pay {2}. If you do, target creature can't be blocked this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/lair_of_the_hydra.txt b/forge-gui/res/cardsfolder/upcoming/lair_of_the_hydra.txt new file mode 100644 index 00000000000..5f946a5ef74 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/lair_of_the_hydra.txt @@ -0,0 +1,10 @@ +Name:Lair of the Hydra +ManaCost:no cost +Types:Land +K:ETBReplacement:Other:LandTapped +SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar2 | ConditionSVarCompare$ GT1 | SpellDescription$ If you control two or more other lands, CARDNAME enters the battlefield tapped. +SVar:ETBCheckSVar2:Count$LastStateBattlefield Land.YouCtrl +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +A:AB$ Animate | Cost$ X G XCantBe0 | Defined$ Self | Power$ X | Toughness$ X | Types$ Creature,Hydra | Colors$ Green | SpellDescription$ Until end of turn, CARDNAME becomes an X/X green Hydra creature. It's still a land. X can't be 0. +SVar:X:Count$xPaid +Oracle:If you control two or more other lands, Lair of the Hydra enters the battlefield tapped.\n{T}: Add {G}.\n{X}{G}: Until end of turn, Lair of the Hydra becomes an X/X green Hydra creature. It's still a land. X can't be 0. diff --git a/forge-gui/res/cardsfolder/upcoming/loyal_warhound.txt b/forge-gui/res/cardsfolder/upcoming/loyal_warhound.txt new file mode 100644 index 00000000000..4f45d501793 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/loyal_warhound.txt @@ -0,0 +1,10 @@ +Name:Loyal Warhound +ManaCost:1 W +Types:Creature Dog +PT:3/1 +K:Vigilance +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | CheckSVar$ Y | SVarCompare$ GTX | TriggerDescription$ When CARDNAME enters the battlefield, if an opponent controls more lands than you, search your library for a basic Plains card, put it onto the battlefield tapped, then shuffle. +SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Plains.Basic | ChangeNum$ 1 | Mandatory$ True +SVar:X:Count$Valid Land.YouCtrl +SVar:Y:PlayerCountOpponents$HighestValid Land.YouCtrl +Oracle:Vigilance\nWhen Loyal Warhound enters the battlefield, if an opponent controls more lands than you, search your library for a basic Plains card, put it onto the battlefield tapped, then shuffle. diff --git a/forge-gui/res/cardsfolder/upcoming/mind_flayer.txt b/forge-gui/res/cardsfolder/upcoming/mind_flayer.txt new file mode 100644 index 00000000000..f58cb0776be --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mind_flayer.txt @@ -0,0 +1,8 @@ +Name:Mind Flayer +ManaCost:3 U U +Types:Creature Horror +PT:3/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ Dominate Monster – When CARDNAME enters the battlefield, gain control of target creature for as long as you control CARDNAME. +SVar:TrigChange:DB$ GainControl | TgtPrompt$ Choose target creature | ValidTgts$ Creature | LoseControl$ LeavesPlay,LoseControl +SVar:PlayMain1:TRUE +Oracle:Dominate Monster — When Mind Flayer enters the battlefield, gain control of target creature for as long as you control Mind Flayer. diff --git a/forge-gui/res/cardsfolder/upcoming/minimus_containment.txt b/forge-gui/res/cardsfolder/upcoming/minimus_containment.txt new file mode 100644 index 00000000000..768e8556ad3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/minimus_containment.txt @@ -0,0 +1,8 @@ +Name:Minimus Containment +ManaCost:2 W +Types:Enchantment Aura +K:Enchant nonland permanent +A:SP$ Attach | Cost$ 2 W | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | AILogic$ Curse +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddType$ Artifact & Treasure | RemoveCardTypes$ True | AddAbility$ TreasureSac | RemoveAllAbilities$ True | Description$ Enchanted permanent is a Treasure artifact with "{T}, Sacrifice this artifact: Add one mana of any color," and it loses all other abilities. (If it was a creature, it's no longer a creature.) +SVar:TreasureSac:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ Any | SpellDescription$ Add one mana of any color. +Oracle:Enchant nonland permanent\nEnchanted permanent is a Treasure artifact with "{T}, Sacrifice this artifact: Add one mana of any color," and it loses all other abilities. (If it was a creature, it's no longer a creature.) diff --git a/forge-gui/res/cardsfolder/upcoming/minion_of_the_mighty.txt b/forge-gui/res/cardsfolder/upcoming/minion_of_the_mighty.txt new file mode 100644 index 00000000000..e318528af9b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/minion_of_the_mighty.txt @@ -0,0 +1,10 @@ +Name:Minion of the Mighty +ManaCost:R +Types:Creature Kobold +PT:0/1 +K:Menace +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigChange | TriggerZones$ Battlefield | CheckSVar$ PackTactics | SVarCompare$ GE6 | NoResolvingCheck$ True | TriggerDescription$ Pack tactics — Whenever CARDNAME attacks, if you attacked with creatures wih total power 6 or greater this combat, you may put a Dragon creature card from your hand onto the battlefield tapped and attacking. +SVar:TrigChange:DB$ChangeZone | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature.Dragon+YouCtrl | Tapped$ True | Attacking$ True +SVar:PackTactics:Count$SumPower_Creature.attacking +DeckHints:Type$Dragon +Oracle:Menace\nPack tactics — Whenever Minion of the Mighty attacks, if you attacked with creatures wih total power 6 or greater this combat, you may put a Dragon creature card from your hand onto the battlefield tapped and attacking. diff --git a/forge-gui/res/cardsfolder/upcoming/minsc_beloved_ranger.txt b/forge-gui/res/cardsfolder/upcoming/minsc_beloved_ranger.txt new file mode 100644 index 00000000000..26701ef4923 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/minsc_beloved_ranger.txt @@ -0,0 +1,10 @@ +Name:Minsc, Beloved Ranger +ManaCost:R G W +Types:Legendary Creature Human Ranger +PT:3/3 +T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigMinsc | TriggerDescription$ When CARDNAME enters the battlefield, create Boo, a legendary 1/1 red Hamster creature token with trample and haste. +SVar:TrigMinsc:DB$ Token | TokenAmount$ 1 | TokenScript$ boo | TokenOwner$ You +A:AB$ Animate | Cost$ X | Power$ X | Toughness$ X | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | Types$ Giant | SorcerySpeed$ True | SpellDescription$ Until end of turn, target creature you control has base power and toughness X/X and becomes a Giant in addition to its other types. Activate only a sorcery. +SVar:X:Count$xPaid +DeckHas:Ability$Token +Oracle:When Minsc, Beloved Ranger enters the battlefield, create Boo, a legendary 1/1 red Hamster creature token with trample and haste.\n{X}: Until end of turn, target creature you control has base power and toughness X/X and becomes a Giant in addition to its other types. Activate only a sorcery. diff --git a/forge-gui/res/cardsfolder/upcoming/monk_of_the_open_hand.txt b/forge-gui/res/cardsfolder/upcoming/monk_of_the_open_hand.txt new file mode 100644 index 00000000000..f7594b541b8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/monk_of_the_open_hand.txt @@ -0,0 +1,10 @@ +Name:Monk of the Open Hand +ManaCost:W +Types:Creature Elf Monk +PT:1/1 +T:Mode$ SpellCast | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | CheckSVar$ YouCastThisTurn | SVarCompare$ EQ2 | NoResolvingCheck$ True | TriggerDescription$ Whenever you cast your second spell each turn, put a +1/+1 counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +SVar:YouCastThisTurn:Count$ThisTurnCast_Card.YouCtrl +SVar:BuffedBy:Card +DeckHas:Ability$Counters +Oracle:Whenever you cast your second spell each turn, put a +1/+1 counter on Monk of the Open Hand. diff --git a/forge-gui/res/cardsfolder/upcoming/mordenkainen.txt b/forge-gui/res/cardsfolder/upcoming/mordenkainen.txt new file mode 100644 index 00000000000..dd49e8165af --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mordenkainen.txt @@ -0,0 +1,15 @@ +Name:Mordenkainen +ManaCost:4 U U +Types:Legendary Planeswalker Mordenkainen +Loyalty:5 +A:AB$ Draw | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | NumCards$ 2 | SubAbility$ DBBottom | SpellDescription$ Draw two cards, then put a card from your hand on the bottom of your library. +SVar:DBBottom:DB$ ChangeZone | Origin$ Hand | Destination$ Library | Hand$ Library | LibraryPosition$ -1 | ChangeNum$ 1 +A:AB$ Token | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | TokenOwner$ You | TokenScript$ u_x_x_dog_illusion_cardsinhand | TokenAmount$ 1 | SpellDescription$ Create a blue Dog Illusion creature token with "This creature's power and toughness are each equal to twice the number of cards in your hand." +A:AB$ ChangeZoneAll | Cost$ SubCounter<10/LOYALTY> | Planeswalker$ True | Ultimate$ True | ChangeType$ Card.YouCtrl | Origin$ Hand | Destination$ Library | RememberChanged$ True | SubAbility$ DBChangeZoneAll | SpellDescription$ Exchange your hand and library, then shuffle. You get an emblem with "You have no maximum hand size." +SVar:DBChangeZoneAll:DB$ ChangeZoneAll | ChangeType$ Card.YouCtrl+IsNotRemembered | Origin$ Library | Destination$ Hand | SubAbility$ DBShuffle +SVar:DBShuffle:DB$ Shuffle | Defined$ You | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBEmblem +SVar:DBEmblem:DB$ Effect | Name$ Emblem - Mordenkainen | Image$ emblem_mordenkainen | StaticAbilities$ UnlimitedHand | Stackable$ False | Duration$ Permanent | AILogic$ Always +SVar:UnlimitedHand:Mode$ Continuous | EffectZone$ Command | Affected$ You | SetMaxHandSize$ Unlimited | Description$ You have no maximum hand size. +DeckHas:Ability$Token +Oracle:[+2]: Draw two cards, then put a card from your hand on the bottom of your library.\n[-2]: Create a blue Dog Illusion creature token with "This creature's power and toughness are each equal to twice the number of cards in your hand."\n[-10]: Exchange your hand and library, then shuffle. You get an emblem with "You have no maximum hand size." diff --git a/forge-gui/res/cardsfolder/upcoming/orb_of_dragonkind.txt b/forge-gui/res/cardsfolder/upcoming/orb_of_dragonkind.txt new file mode 100644 index 00000000000..8fbac7b4421 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/orb_of_dragonkind.txt @@ -0,0 +1,8 @@ +Name:Orb of Dragonkind +ManaCost:1 R +Types:Artifact +A:AB$ Mana | Cost$ 1 T | Produced$ Combo W U B R G | Amount$ 2 | RestrictValid$ Card.Dragon,Activated.Dragon | SpellDescription$ Add two mana in any combination of colors. Spend this mana only to cast Dragon spells or to activate abilities of Dragons. +A:AB$ Dig | Cost$ R T Sac<1/CARDNAME> | DigNum$ 7 | ChangeNum$ 1 | Optional$ True | ForceRevealToController$ True | ChangeValid$ Dragon | RestRandomOrder$ True | SpellDescription$ Look at the top seven cards of your library. You may reveal a Dragon card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. +SVar:BuffedBy:Dragon +DeckHints:Type$Dragon +Oracle:{1}, {T}: Add two mana in any combination of colors. Spend this mana only to cast Dragon spells or to activate abilities of Dragons.\n{R}, {T}, Sacrifice Orb of Dragonkind: Look at the top seven cards of your library. You may reveal a Dragon card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/upcoming/oswald_fiddlebender.txt b/forge-gui/res/cardsfolder/upcoming/oswald_fiddlebender.txt new file mode 100644 index 00000000000..86175b46551 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/oswald_fiddlebender.txt @@ -0,0 +1,10 @@ +Name:Oswald Fiddlebender +ManaCost:1 W +Types:Legendary Creature Gnome Artificer +PT:2/2 +A:AB$ ChangeZone | Cost$ W T Sac<1/Artifact> | Origin$ Library | Destination$ Battlefield | ChangeType$ Artifact.cmcEQX | ChangeNum$ 1 | SorcerySpeed$ True | AILogic$ SacAndUpgrade | SpellDescription$ Search your library for an artifact card with mana value equal to 1 plus the sacrificed artifact's mana value, put that card onto the battlefield, then shuffle. Activate only as a sorcery. +SVar:X:Sacrificed$CardManaCost/Plus.1 +SVar:AIPreference:SacCost$Artifact +DeckHas:Ability$Sacrifice +DeckHints:Type$Artifact +Oracle:{T}, Sacrifice an artifact: Search your library for an artifact card with mana value equal to 1 plus the sacrificed artifact's mana value, put that card onto the battlefield, then shuffle. Activate only as a sorcery. diff --git a/forge-gui/res/cardsfolder/upcoming/priest_of_ancient_lore.txt b/forge-gui/res/cardsfolder/upcoming/priest_of_ancient_lore.txt new file mode 100644 index 00000000000..c0851068650 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/priest_of_ancient_lore.txt @@ -0,0 +1,9 @@ +Name:Priest of Ancient Lore +ManaCost:2 W +Types:Creature Dwarf Cleric +PT:2/1 +T:Mode$ ChangesZone | ValidCard$ Card.Self | Destination$ Battlefield | Execute$ TrigLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 1 life and draw a card. +SVar:TrigLife:DB$ GainLife | LifeAmount$ 1 | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw +DeckHas:Ability$LifeGain +Oracle:When Priest of Ancient Lore enters the battlefield, you gain 1 life and draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/prosper_tome_bound.txt b/forge-gui/res/cardsfolder/upcoming/prosper_tome_bound.txt new file mode 100644 index 00000000000..3e45a672efa --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/prosper_tome_bound.txt @@ -0,0 +1,15 @@ +Name:Prosper, Tome-Bound +ManaCost:2 B R +Types:Legendary Creature Tiefling Warlock +PT:1/4 +K:Deathtouch +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigExile | TriggerDescription$ Mystic Arcanum — At the beginning of your end step, exile the top card of your library. Until the end of your next turn, you may play that card. +SVar:TrigExile:DB$ Dig | Defined$ You | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect | SpellDescription$ Exile the top card of your library. Until the end of your next turn, you may play that card. +SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay | RememberObjects$ Remembered | Duration$ UntilTheEndOfYourNextTurn | SubAbility$ DBCleanup | ForgetOnMoved$ Exile +SVar:STPlay:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ Until the end of your next turn, you may play that card. +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +T:Mode$ SpellCast | ValidCard$ Card.wasCastFromExile | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Pact Boon — Whenever you play a card from exile, create a Treasure token. +T:Mode$ ChangesZone | Origin$ Exile | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigToken | Secondary$ True | TriggerDescription$ Pact Boon — Whenever you play a card from exile, create a Treasure token. +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_treasure_sac | TokenOwner$ You | LegacyImage$ c a treasure sac afr +DeckHas:Ability$Token +Oracle:Deathtouch\nMystic Arcanum — At the beginning of your end step, exile the top card of your library. Until the end of your next turn, you may play that card.\nPact Boon — Whenever you play a card from exile, create a Treasure token. diff --git a/forge-gui/res/cardsfolder/upcoming/ray_of_enfeeblement.txt b/forge-gui/res/cardsfolder/upcoming/ray_of_enfeeblement.txt new file mode 100644 index 00000000000..92610ec01cf --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ray_of_enfeeblement.txt @@ -0,0 +1,7 @@ +Name:Ray of Enfeeblement +ManaCost:B +Types:Instant +A:SP$ Pump | Cost$ B | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsCurse$ True | NumAtt$ -4 | NumDef$ -X | SpellDescription$ Target creature gets -4/-1 until end of turn. If that creature is white, it gets -4/-4 until end of turn instead. +SVar:X:Count$Compare Y GE1.4.1 +SVar:Y:Targeted$Valid Creature.White +Oracle:Target creature gets -4/-1 until end of turn. If that creature is white, it gets -4/-4 until end of turn instead. diff --git a/forge-gui/res/cardsfolder/upcoming/red_dragon.txt b/forge-gui/res/cardsfolder/upcoming/red_dragon.txt new file mode 100644 index 00000000000..dc415a594da --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/red_dragon.txt @@ -0,0 +1,8 @@ +Name:Red Dragon +ManaCost:4 R R +Types:Creature Dragon +PT:4/4 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ Fire Breath — When CARDNAME enters the battlefield, it deals 4 damage to each opponent. +SVar:TrigDealDamage:DB$ DealDamage | NumDmg$ 4 | Defined$ Player.Opponent +Oracle:Flying\nFire Breath — When Red Dragon enters the battlefield, it deals 4 damage to each opponent. diff --git a/forge-gui/res/cardsfolder/upcoming/rimeshield_frost_giant.txt b/forge-gui/res/cardsfolder/upcoming/rimeshield_frost_giant.txt new file mode 100644 index 00000000000..60546ceaf93 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rimeshield_frost_giant.txt @@ -0,0 +1,6 @@ +Name:Rimeshield Frost Giant +ManaCost:3 U U +Types:Creature Giant Warrior +PT:4/5 +K:Ward:3 +Oracle:Ward {3} (Whenever this creature becomes the target of a spell or ability an opponent controls, counter it unless that player pays {3}.) diff --git a/forge-gui/res/cardsfolder/upcoming/shessra_deaths_whisper.txt b/forge-gui/res/cardsfolder/upcoming/shessra_deaths_whisper.txt new file mode 100644 index 00000000000..2857aca1e4e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/shessra_deaths_whisper.txt @@ -0,0 +1,10 @@ +Name:Shessra, Death's Whisper +ManaCost:2 B G +Types:Legendary Creature Human Elf Warlock +PT:1/3 +T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigProvoke | TriggerDescription$ Bewitching Whispers — When CARDNAME enters the battlefield, target creature blocks this turn if able. +SVar:TrigProvoke:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME blocks each combat if able. +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ X | SVarCompare$ GE1 | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whispers of the Grave — At the beginning of your end step, if a creature died this turn, you may pay 2 life. If you do, draw a card. +SVar:TrigDraw:AB$ Draw | Cost$ PayLife<2> | NumCards$ 1 +SVar:X:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature +Oracle:Bewitching Whispers — When Shessra, Death’s Whisper enters the battlefield, target creature blocks this turn if able.\nWhispers of the Grave — At the beginning of your end step, if a creature died this turn, you may pay 2 life. If you do, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/silver_raven.txt b/forge-gui/res/cardsfolder/upcoming/silver_raven.txt new file mode 100644 index 00000000000..5b9e392c391 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/silver_raven.txt @@ -0,0 +1,8 @@ +Name:Silver Raven +ManaCost:U +Types:Artifact Creature Bird +PT:1/1 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigScry | TriggerDescription$ When CARDNAME enters the battlefield, scry 1. +SVar:TrigScry:DB$ Scry | ScryNum$ 1 +Oracle:Flying\nWhen Silver Raven enters the battlefield, scry 1. diff --git a/forge-gui/res/cardsfolder/upcoming/targ_nar_demon_fang_gnoll.txt b/forge-gui/res/cardsfolder/upcoming/targ_nar_demon_fang_gnoll.txt new file mode 100644 index 00000000000..ddaad7ab9ac --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/targ_nar_demon_fang_gnoll.txt @@ -0,0 +1,11 @@ +Name:Targ Nar, Demon-Fang Gnoll +ManaCost:R G +Types:Legendary Creature Gnoll +PT:2/2 +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerZones$ Battlefield | CheckSVar$ PackTactics | SVarCompare$ GE6 | NoResolvingCheck$ True | TriggerDescription$ Pack tactics — Whenever CARDNAME attacks, if you attacked with creatures with total power 6 or greater this combat, attacking creatures get +1/+0 until end of turn. +A:AB$ Pump | Cost$ 2 R G | NumAtt$ +X | NumDef$ +Y | SpellDescription$ Double CARDNAME’s power and toughness until end of turn. +SVar:TrigPumpAll:DB$ PumpAll | ValidCards$ Creature.attacking | NumAtt$ 1 +SVar:X:Count$CardPower +SVar:Y:Count$CardToughness +SVar:PackTactics:Count$SumPower_Creature.attacking +Oracle:Pack tactics — Whenever Targ Nar, Demon-Fang Gnoll attacks, if you attacked with creatures with total power 6 or greater this combat, attacking creatures get +1/+0 until end of turn.\n{2}{R}{G}: Double Targ Nar’s power and toughness until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/teleportation_circle.txt b/forge-gui/res/cardsfolder/upcoming/teleportation_circle.txt new file mode 100644 index 00000000000..8320fb8b621 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/teleportation_circle.txt @@ -0,0 +1,8 @@ +Name:Teleportation Circle +ManaCost:3 W +Types:Enchantment +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigExile | TriggerDescription$ At the beginning of your end step, exile up to one target artifact or creature you control, then return that card to the battlefield under its owner's control. +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | ValidTgts$ Artifact.YouCtrl,Creature.YouCtrl | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target artifact or creature | SubAbility$ DBReturn +SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ All | Destination$ Battlefield | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +Oracle:At the beginning of your end step, exile up to one target artifact or creature you control, then return that card to the battlefield under its owner's control. diff --git a/forge-gui/res/cardsfolder/upcoming/the_book_of_vile_darkness.txt b/forge-gui/res/cardsfolder/upcoming/the_book_of_vile_darkness.txt new file mode 100644 index 00000000000..aa4327b7466 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/the_book_of_vile_darkness.txt @@ -0,0 +1,12 @@ +Name:The Book of Vile Darkness +ManaCost:B B B +Types:Legendary Artifact +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | CheckSVar$ X | SVarCompare$ GE2 | TriggerDescription$ At the beginning of your end step, if you lost 2 or more life this turn, create a 2/2 black Zombie creature token. +SVar:TrigToken:DB$ Token | TokenScript$ b_2_2_zombie +SVar:X:PlayerCountPropertyYou$LifeLostThisTurn +A:AB$ Token | Cost$ T Exile<1/CARDNAME> Exile<1/Artifact.YouCtrl+namedEye of Vecna> Exile<1/Artifact.YouCtrl+namedHand of Vecna> | RememberCostCards$ True | ImprintTokens$ True | CostDesc$ {T}, Exile CARDNAME and artifacts you control named Eye of Vecna and Hand of Vecna: | TokenScript$ vecna | SubAbility$ DBAnimate | SpellDescription$ Create Vecna, a legendary 8/8 black Zombie God creature token with indestructible. It gains all triggered abilities of the exiled cards. +SVar:DBAnimate:DB$ Animate | Defined$ Imprinted | Duration$ Permanent | GainsTriggeredAbilitiesOf$ Remembered +DeckHas:Ability$Token +DeckHints:Type$Zombie +DeckHints:Name$Eye of Vecna|Hand of Vecna +Oracle:At the beginning of your end step, if you lost 2 or more life this turn, create a 2/2 black Zombie creature token.\n{T}, Exile The Book of Vile Darkness and artifacts you control named Eye of Vecna and Hand of Vecna: Create Vecna, a legendary 8/8 black Zombie God creature token with indestructible. It gains all triggered abilities of the exiled cards. diff --git a/forge-gui/res/cardsfolder/upcoming/tiger_tribe_hunter.txt b/forge-gui/res/cardsfolder/upcoming/tiger_tribe_hunter.txt new file mode 100644 index 00000000000..306a852250c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tiger_tribe_hunter.txt @@ -0,0 +1,12 @@ +Name:Tiger-Tribe Hunter +ManaCost:3 R R +Types:Creature Human Barbarian +PT:4/4 +K:Trample +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigImmediate | TriggerZones$ Battlefield | CheckSVar$ PackTactics | SVarCompare$ GE6 | NoResolvingCheck$ True | TriggerDescription$ Pack tactics — Whenever CARDNAME attacks, if you attacked with creatures with total power 6 or greater this combat, you may sacrifice another creature. If you do, CARDNAME deals damage equal to the sacrificed creature's power to target creature. +SVar:TrigImmediate:AB$ ImmediateTrigger | Cost$ Sac<1/Creature.Other/another creature> | RememberObjects$ Sacrificed | Execute$ TrigDamage | TriggerDescription$ If you do, CARDNAME deals damage equal to the sacrificed creature's power to target creature. +SVar:TrigDamage:DB$ DealDamage | ConditionDefined$ DelayTriggerRememberedLKI | ValidTgts$ Creature | TgtPrompt$ Select any target | NumDmg$ X +SVar:X:TriggerRemembered$CardPower +SVar:PackTactics:Count$SumPower_Creature.attacking +DeckHas:Ability$Sacrifice +Oracle:Trample\nPack tactics — Whenever Tiger-Tribe Hunter attacks, if you attacked with creatures with total power 6 or greater this combat, you may sacrifice another creature. If you do, Tiger-Tribe Hunter deals damage equal to the sacrificed creature's power to target creature. diff --git a/forge-gui/res/cardsfolder/upcoming/treasure_chest.txt b/forge-gui/res/cardsfolder/upcoming/treasure_chest.txt new file mode 100644 index 00000000000..96ef233d43d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/treasure_chest.txt @@ -0,0 +1,15 @@ +Name:Treasure Chest +ManaCost:3 +Types:Artifact +A:AB$ RollDice | Cost$ Sac<1/CARDNAME> | Sides$ 20 | ResultSubAbilities$ 1:Trapped,2-9:DBToken,10-19:DBGainLife,20:DBChangeZone | SpellDescription$ Roll a d20. +SVar:Trapped:DB$ LoseLife | Defined$ You | LifeAmount$ 3 | SpellDescription$ 1 VERT Trapped! — You lose 3 life. +SVar:DBToken:DB$ Token | TokenAmount$ 5 | TokenScript$ c_a_treasure_sac | SpellDescription$ 2-9 VERT Create five Treasure tokens. +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 3 | SubAbility$ DBDraw | SpellDescription$ 10-19 VERT You gain 3 life and draw three cards. +SVar:DBDraw:DB$ Draw | NumCards$ 3 +SVar:DBChangeZone:DB$ ChangeZone | Origin$ Library | Destination$ Library | ChangeType$ Card | ChangeNum$ 1 | Shuffle$ False | RememberChanged$ True | SubAbility$ DBChangeZone1 | SpellDescription$ 20 VERT Search your library for a card. If it’s an artifact card, you may put it onto the battlefield. Otherwise, put that card into your hand. Then shuffle. +SVar:DBChangeZone1:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Battlefield | ConditionDefined$ Remembered | ConditionPresent$ Artifact | Optional$ True | ForgetChanged$ True | SubAbility$ DBChangeZone2 +SVar:DBChangeZone2:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand | SubAbility$ DBShuffle +SVar:DBShuffle:DB$ Shuffle | Defined$ You | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +DeckHas:Ability$Token & Ability$Sacrifice & Ability$LifeGain +Oracle:{4}, Sacrifice Treasure Chest: Roll a d20.\n1 | Trapped! — You lose 3 life.\n2-9 | Create five Treasure tokens.\n10-19 | You gain 3 life and draw three cards.\n20 | Search your library for a card. If it’s an artifact card, you may put it onto the battlefield. Otherwise, put that card into your hand. Then shuffle. diff --git a/forge-gui/res/cardsfolder/upcoming/treasure_vault.txt b/forge-gui/res/cardsfolder/upcoming/treasure_vault.txt new file mode 100644 index 00000000000..4b4ddb6642e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/treasure_vault.txt @@ -0,0 +1,8 @@ +Name:Treasure Vault +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. +A:AB$ Token | Cost$ X X T Sac<1/CARDNAME> | TokenAmount$ X | TokenScript$ c_a_treasure_sac | SpellDescription$ Create X Treasure tokens. +SVar:X:Count$xPaid +DeckHas:Ability$Token & Ability$Sacrifice +Oracle:{T}: Add {C}.\n{X}{X}, {T}, Sacrifice Treasure Vault: Create X Treasure tokens. diff --git a/forge-gui/res/cardsfolder/upcoming/trelasarra_moon_dancer.txt b/forge-gui/res/cardsfolder/upcoming/trelasarra_moon_dancer.txt new file mode 100644 index 00000000000..213b2e3478f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/trelasarra_moon_dancer.txt @@ -0,0 +1,10 @@ +Name:Trelasarra, Moon Dancer +ManaCost:G W +Types:Legendary Creature Elf Cleric +PT:2/2 +T:Mode$ LifeGained | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever you gain life, put a +1/+1 counter on CARDNAME and scry 1. (Look at the top card of your library. You may put that card on the bottom of your library.) +SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBScry +SVar:DBScry:DB$ Scry | ScryNum$ 1 +DeckHints:Ability$LifeGain +DeckHas:Ability$Counters +Oracle:Whenever you gain life, put a +1/+1 counter on Trelasarra, Moon Dancer and scry 1. (Look at the top card of your library. You may put that card on the bottom of your library.) diff --git a/forge-gui/res/cardsfolder/upcoming/true_polymorph.txt b/forge-gui/res/cardsfolder/upcoming/true_polymorph.txt new file mode 100644 index 00000000000..f0fe145f30a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/true_polymorph.txt @@ -0,0 +1,7 @@ +Name:True Polymorph +ManaCost:4 U U +Types:Instant +A:SP$ Pump | ValidTgts$ Artifact,Creature | TgtPrompt$ Select target artifact or creature to polymorph | SubAbility$ DBClone | StackDescription$ {c:ThisTargetedCard} | SpellDescription$ Target artifact or creature becomes a copy of another target artifact or creature. +SVar:DBClone:DB$ Clone | CloneTarget$ ParentTarget | ValidTgts$ Artifact,Creature | TgtPrompt$ Select another target artifact or creature to copy | TargetUnique$ True | StackDescription$ becomes a copy of {c:ThisTargetedCard}. +AI:RemoveDeck:Random +Oracle:Target artifact or creature becomes a copy of another target artifact or creature. diff --git a/forge-gui/res/cardsfolder/upcoming/unexpected_windfall.txt b/forge-gui/res/cardsfolder/upcoming/unexpected_windfall.txt new file mode 100644 index 00000000000..52a86873baf --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/unexpected_windfall.txt @@ -0,0 +1,9 @@ +Name:Unexpected Windfall +ManaCost:2 R R +Types:Sorcery +A:SP$ Draw | Cost$ 3 R Discard<1/Card/card> | CostDesc$ As an additional cost to cast this spell, discard a card. | NumCards$ 2 | Defined$ You | SubAbility$ DBToken | SpellDescription$ Draw two cards and create two Treasure tokens. (They're artifacts with "{T}, Sacrifice this artifact: Add one mana of any color.") +SVar:DBToken:DB$ Token | TokenAmount$ 2 | TokenScript$ c_a_treasure_sac | TokenOwner$ You +DeckHas:Ability$Discard +DeckHints:Keyword$Madness & Ability$Delirium +DeckHas:Ability$Token +Oracle:As an additional cost to cast this spell, discard a card.\nDraw two cards and create two Treasure tokens. (They're artifacts with "{T}, Sacrifice this artifact: Add one mana of any color.") diff --git a/forge-gui/res/cardsfolder/upcoming/werewolf_pack_leader.txt b/forge-gui/res/cardsfolder/upcoming/werewolf_pack_leader.txt new file mode 100644 index 00000000000..786ba82d061 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/werewolf_pack_leader.txt @@ -0,0 +1,9 @@ +Name:Werewolf Pack Leader +ManaCost:G G +Types:Creature Human Werewolf +PT:3/3 +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerZones$ Battlefield | CheckSVar$ PackTactics | SVarCompare$ GE6 | NoResolvingCheck$ True | TriggerDescription$ Pack tactics — Whenever CARDNAME attacks, if you attacked with creatures with total power 6 or greater this combat, draw a card. +A:AB$ Animate | Cost$ 3 G | ValidCard$ Card.Self | Power$ 5 | Toughness$ 3 | Keywords$ Trample | RemoveTypes$ Human | SpellDescription$ Until end of turn, CARDNAME has base power and toughness 5/3, gains trample, and isn't a Human. +SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 +SVar:PackTactics:Count$SumPower_Creature.attacking +Oracle:Pack tactics — Whenever Werewolf Pack Leader attacks, if you attacked with creatures with total power 6 or greater this combat, draw a card.\n{3}{G}: Until end of turn, Werewolf Pack Leader has base power and toughness 5/3, gains trample, and isn't a Human. diff --git a/forge-gui/res/cardsfolder/upcoming/westgate_regent.txt b/forge-gui/res/cardsfolder/upcoming/westgate_regent.txt new file mode 100644 index 00000000000..efd808719da --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/westgate_regent.txt @@ -0,0 +1,11 @@ +Name:Westgate Regent +ManaCost:3 B B +Types:Creature Vampire +PT:4/4 +K:Flying +K:Ward:Discard<1/Card> +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigPutCounter | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, put that many +1/+1 counters on it. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ X +SVar:X:TriggerCount$DamageAmount +DeckHas:Ability$Counters +Oracle:Flying\nWard — Discard a card. (Whenever this creature becomes the target of a spell or ability an opponent controls, counter it unless that player discards a card.)\nWhenever Westgate Regent deals combat damage to a player, put that many +1/+1 counters on it. diff --git a/forge-gui/res/cardsfolder/upcoming/white_dragon.txt b/forge-gui/res/cardsfolder/upcoming/white_dragon.txt new file mode 100644 index 00000000000..2743eaf0e71 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/white_dragon.txt @@ -0,0 +1,10 @@ +Name:White Dragon +ManaCost:4 W W +Types:Creature Dragon +PT:4/4 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ Cold Breath — When CARDNAME enters the battlefield, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. +SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls. | SubAbility$ DBPump +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent +SVar:PlayMain1:TRUE +Oracle:Flying\nCold Breath — When White Dragon enters the battlefield, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/wish.txt b/forge-gui/res/cardsfolder/upcoming/wish.txt new file mode 100644 index 00000000000..38ad0866f0a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/wish.txt @@ -0,0 +1,6 @@ +Name:Wish +ManaCost:2 R +Types:Sorcery +A:SP$ Effect | StaticAbilities$ PlaySideboard | SpellDescription$ You may play a card you own from outside the game this turn. +SVar:PlaySideboard:Mode$ Continuous | Affected$ Card.YouOwn | MayPlay$ True | MayPlayLimit$ 1 | EffectZone$ Command | AffectedZone$ Sideboard | Description$ You may play a card you own from outside the game this turn. +Oracle:You may play a card you own from outside the game this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/xorn.txt b/forge-gui/res/cardsfolder/upcoming/xorn.txt new file mode 100644 index 00000000000..5b524f6df60 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/xorn.txt @@ -0,0 +1,10 @@ +Name:Xorn +ManaCost:2 R +Types:Creature Elemental +PT:3/2 +R:Event$ CreateToken | ValidPlayer$ You | ValidToken$ Treasure | ReplaceWith$ AdditionalToken | Description$ If you would create one or more Treasure tokens, instead create those tokens plus an additional Treasure token. +SVar:AdditionalToken:DB$ ReplaceEffect | VarName$ TokenNum | VarValue$ X +SVar:X:ReplaceCount$TokenNum/Plus.1 +DeckNeeds:Type$Token +AI:RemoveDeck:Random +Oracle:If you would create one or more Treasure tokens, instead create those tokens plus an additional Treasure token. diff --git a/forge-gui/res/cardsfolder/w/war_of_the_spark.txt b/forge-gui/res/cardsfolder/w/war_of_the_spark.txt new file mode 100644 index 00000000000..e4e3b2b88b4 --- /dev/null +++ b/forge-gui/res/cardsfolder/w/war_of_the_spark.txt @@ -0,0 +1,15 @@ +Name:War of the Spark +ManaCost:3 B +Types:Enchantment Saga +K:Saga:3:TrigChangeZone,TrigSac,TrigExile +SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Hand,Graveyard | Destination$ Battlefield | ChangeType$ Creature.Zombie+setWAR,Planeswalker.setWAR | DefinedPlayer$ Player | ChangeNum$ 1 | SpellDescription$ Each player may put a planeswalker or Zombie card from War of the Spark from their hand or graveyard onto the battlefield. +SVar:TrigSac:DB$ Sacrifice | Defined$ You | Amount$ SacX | SacValid$ Creature,Planeswalker | RememberSacrificed$ True | Optional$ True | SubAbility$ DBEdict | SpellDescription$ Sacrifice any number of creatures and/or planeswalkers. Each opponent sacrifices that many creatures and/or planeswalkers. +SVar:DBEdict:DB$ Sacrifice | Defined$ Player.Opponent | SacValid$ Creature,Planeswalker | SacMessage$ Creature,Planeswalker | Amount$ EdictX +SVar:TrigExile:DB$ ChangeZone | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Creature.Bolas,Planeswalker.Bolas | TgtPrompt$ Select up to one target Bolas | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBProliferate | SpellDescription$ Exile up to one target Bolas. Proliferate three times. +SVar:DBProliferate:DB$ Proliferate | SubAbility$ DBProliferate2 | SpellDescription$ Proliferate three times. +SVar:DBProliferate2:DB$ Proliferate | SubAbility$ DBProliferate3 +SVar:DBProliferate3:DB$ Proliferate +SVar:SacX:Count$Valid Creature.YouCtrl/Plus.SacPlanes +SVar:SacPlanes:Count$Valid Planeswalker.YouCtrl +SVar:EdictX:Remembered$Amount +Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI — Each player may put a planeswalker or Zombie card from War of the Spark from their hand or graveyard onto the battlefield.\nII — Sacrifice any number of creatures and/or planeswalkers. Each opponent sacrifices that many creatures and/or planeswalkers.\nIII — Exile up to one target Bolas. Proliferate three times. diff --git a/forge-gui/res/editions/2019 Heroes of the Realm.txt b/forge-gui/res/editions/2019 Heroes of the Realm.txt new file mode 100644 index 00000000000..744172c46bd --- /dev/null +++ b/forge-gui/res/editions/2019 Heroes of the Realm.txt @@ -0,0 +1,17 @@ +[metadata] +Code=HTR19 +Date=2020-08-01 +Name=2019 Heroes of the Realm +Code2=HTR19 +MciCode=htr19 +Type=Funny +ScryfallCode=HTR19 + +[cards] +1 M Collectigull +2 M Keeper of the Secret Lair +3 M War of the Spark +4 M Champions of Archery +5 M Myntasha, Honored One +6 M The Cinematic Phoenix +7 M Fabled Path of Searo Point diff --git a/forge-gui/res/editions/Dungeons & Dragons Adventures in the Forgotten Realms Commander.txt b/forge-gui/res/editions/Dungeons & Dragons Adventures in the Forgotten Realms Commander.txt new file mode 100644 index 00000000000..1a58da53b6b --- /dev/null +++ b/forge-gui/res/editions/Dungeons & Dragons Adventures in the Forgotten Realms Commander.txt @@ -0,0 +1,16 @@ +[metadata] +Code=AFC +Date=2021-07-23 +Name=Dungeons & Dragons: Adventures in the Forgotten Realms Commander +Type=Commander +ScryfallCode=AFC + +[cards] +1 M Galea, Kindler of Hope +2 M Prosper, Tome-Bound +3 M Sefris of the Hidden Ways +4 M Vrondiss, Rage of Ancients +317 M Galea, Kindler of Hope +324 M Prosper, Tome-Bound +326 M Sefris of the Hidden Ways +328 M Vrondiss, Rage of Ancients diff --git a/forge-gui/res/editions/Dungeons & Dragons Adventures in the Forgotten Realms.txt b/forge-gui/res/editions/Dungeons & Dragons Adventures in the Forgotten Realms.txt index 053aa7c0d6f..119956c3e91 100644 --- a/forge-gui/res/editions/Dungeons & Dragons Adventures in the Forgotten Realms.txt +++ b/forge-gui/res/editions/Dungeons & Dragons Adventures in the Forgotten Realms.txt @@ -9,34 +9,54 @@ ScryfallCode=AFR [cards] 1 C +2 Mace +2 C Arborea Pegasus +3 U Blink Dog +4 M The Book of Exalted Deeds 5 C Celestial Unicorn 6 U Cleric Class 7 U Cloister Gargoyle +8 R Dancing Sword 9 C Dawnbringer Cleric 10 C Delver's Torch 11 C Devoted Paladin +12 U Divine Smite 13 U Dragon's Disciple 14 C Dwarfhold Champion 15 R Flumph 16 C Gloom Stalker +17 M Grand Master of Flowers 18 R Guardian of Faith 19 C Half-Elf Monk 20 M Icingdeath, Frost Tyrant +21 U Ingenious Smith 22 U Keen-Eared Sentry +23 R Loyal Warhound 24 C Minimus Containment +25 U Monk of the Open Hand 26 U Moon-Blessed Cleric 27 R Nadaar, Selfless Paladin 28 R Oswald Fiddlebender +29 R Paladin Class +30 C Paladin's Shield 31 C Planar Ally +32 U Plate Armor 33 U Portable Hole +34 C Potion of Healing +35 C Priest of Ancient Lore +36 U Rally Maneuver 37 C Ranger's Hawk +38 C Steadfast Paladin +39 R Teleportation Circle 40 C Veteran Dungeoneer +41 U White Dragon 42 C You Hear Something on Watch 43 C You're Ambushed on the Road +44 U Aberrant Mind Sorcerer 45 C Air-Cult Elemental 46 C Arcane Investigator 47 C Bar the Gate 48 R The Blackstaff of Waterdeep +49 U Blue Dragon 50 C Charmed Sleep 51 C Clever Conjurer 52 C Contact Other Plane @@ -49,6 +69,9 @@ ScryfallCode=AFR 59 U Fly 60 R Grazilaxx, Illithid Scholar 61 U Guild Thief +62 M Iymrith, Desert Doom +63 R Mind Flayer +64 M Mordenkainen 65 C Mordenkainen's Polymorph 66 C Pixie Guide 67 U Power of Persuasion @@ -58,45 +81,72 @@ ScryfallCode=AFR 71 C Secret Door 72 C Shocking Grasp 73 C Shortcut Seeker +74 C Silver Raven +75 C Soulknife Spy +76 U Split the Party +77 U Sudden Insight 78 R Tasha's Hideous Laughter +79 U Trickster's Talisman +80 R True Polymorph +81 U Wizard Class 82 R Wizard's Spellbook 83 C You Come to a River 84 C You Find the Villains' Lair 85 C You See a Guard Approach 86 R Yuan-Ti Malison +87 M Acererak the Archlich +88 R Asmodeus the Archfiend 89 C Baleful Beholder 90 U Black Dragon 91 M The Book of Vile Darkness +92 U Check for Traps 93 C Clattering Skeletons +94 C Deadly Dispute 95 U Death-Priest of Myrkul +96 U Demogorgon's Clutches 97 C Devour Intellect 98 U Drider 99 U Dungeon Crawler 100 M Ebondeath, Dracolich +101 C Eyes of the Beholder 102 C Fates' Reversal 103 C Feign Death +104 R Forsworn Paladin 105 R Gelatinous Cube +106 C Grim Bounty 107 U Grim Wanderer 108 C Herald of Hadar 109 C Hired Hexblade +110 C Hoard Robber 111 U Lightfoot Rogue 112 M Lolth, Spider Queen 113 C Manticore 114 U Power Word Kill 115 C Precipitous Drop +116 U Ray of Enfeeblement +117 U Reaper's Talisman +118 C Sepulcher Ghoul 119 C Shambling Ghast 120 U Skullport Merchant 121 R Sphere of Annihilation +122 C Thieves' Tools +123 C Vampire Spawn 124 R Vorpal Sword 125 U Warlock Class +126 R Westgate Regent 127 R Wight 128 C Yuan-Ti Fang-Blade 129 C Zombie Ogre +130 C Armory Veteran +131 U Barbarian Class 132 U Battle Cry Goblin +133 C Boots of Speed 134 C Brazen Dwarf +135 U Burning Hands 136 U Chaos Channeler 137 U Critical Hit 138 R Delina, Wild Mage +139 C Dragon's Fire 140 C Dueling Rapier 141 C Earth-Cult Elemental 142 C Farideh's Fireball @@ -104,20 +154,27 @@ ScryfallCode=AFR 144 C Goblin Javelineer 145 U Goblin Morningstar 146 C Hoarding Ogre +147 R Hobgoblin Bandit Lord 148 C Hobgoblin Captain 149 U Hulking Bugbear 150 C Improvised Weaponry +151 M Inferno of the Star Mounts 152 C Jaded Sell-Sword 153 C Kick in the Door +154 U Magic Missile 155 R Meteor Swarm 156 R Minion of the Mighty 157 R Orb of Dragonkind 158 C Plundering Barbarian +159 C Price of Loyalty 160 U Red Dragon +161 U Rust Monster 162 C Swarming Goblins 163 U Tiger-Tribe Hunter +164 C Unexpected Windfall 165 C Valor Singer 166 R Wish +167 R Xorn 168 C You Come to the Gnoll Camp 169 U You Find Some Prisoners 170 U You See a Pair of Goblins @@ -127,28 +184,42 @@ ScryfallCode=AFR 174 C Bull's Strength 175 U Choose Your Weapon 176 R Circle of Dreams Druid +177 C Circle of the Moon Druid +178 C Compelled Duel +179 C Dire Wolf Prowler +180 U Druid Class 181 M Ellywick Tumblestrum 182 C Elturgard Ranger 183 C Find the Path 184 R Froghemoth 185 C Gnoll Hunter 186 U Green Dragon -186 U Hunter's Mark 187 C Hill Giant Herdgorger +188 U Hunter's Mark 189 C Inspiring Bard 190 R Instrument of the Bards 191 U Intrepid Outlander 192 U Loathsome Troll +193 R Long Rest 194 U Lurking Roper +195 C Neverwinter Dryad 196 R Ochre Jelly +197 M Old Gnawbone 198 C Owlbear +199 C Plummet 200 U Prosperous Innkeeper 201 U Purple Worm +202 R Ranger Class +203 C Ranger's Longbow +204 C Scaled Herbalist +205 C Spoils of the Hunt 206 C Sylvan Shepherd 207 M The Tarrasque +208 C Underdark Basilisk 209 R Varis, Silverymoon Ranger 210 U Wandering Troubadour 211 R Werewolf Pack Leader +212 U Wild Shape 213 C You Find a Cursed Idol 214 U You Happen On a Glade 215 U You Meet in a Tavern @@ -158,12 +229,18 @@ ScryfallCode=AFR 219 U Bruenor Battlehammer 220 R Drizzt Do'Urden 221 U Farideh, Devil's Chosen +222 R Fighter Class 223 U Gretchen Titchwillow 224 U Hama Pashar, Ruin Seeker 225 U Kalain, Reclusive Painter 226 U Krydle of Baldur's Gate +227 M Minsc, Beloved Ranger +228 R Monk Class 229 R Orcus, Prince of Undeath +230 R Rogue Class 231 U Shessra, Death's Whisper +232 R Skeletal Swarming +233 R Sorcerer Class 234 U Targ Nar, Demon-Fang Gnoll 235 M Tiamat 236 U Trelasarra, Moon Dancer @@ -173,8 +250,14 @@ ScryfallCode=AFR 240 U Bag of Holding 241 M The Deck of Many Things 242 U Dungeon Map +243 R Eye of Vecna 244 U Fifty Feet of Rope +245 C Greataxe +246 R Hand of Vecna +247 U Iron Golem +248 C Leather Armor 249 C Mimic +250 C Spare Dagger 251 C Spiked Pit Trap 252 R Treasure Chest 253 R Cave of the Frost Dragon @@ -183,36 +266,52 @@ ScryfallCode=AFR 256 C Evolving Wilds 257 R Hall of Storm Giants 258 R Hive of the Eye Tyrant -262 L Plains -263 L Plains -264 L Plains -265 L Plains -266 L Island -267 L Island -268 L Island -269 L Island -270 L Swamp -271 L Swamp -272 L Swamp -273 L Swamp -274 L Mountain -275 L Mountain -276 L Mountain -277 L Mountain -278 L Forest -279 L Forest -280 L Forest -281 L Forest +259 R Lair of the Hydra +260 U Temple of the Dragon Queen +261 R Treasure Vault +262 C Plains +263 C Plains +264 C Plains +265 C Plains +266 C Island +267 C Island +268 C Island +269 C Island +270 C Swamp +271 C Swamp +272 C Swamp +273 C Swamp +274 C Mountain +275 C Mountain +276 C Mountain +277 C Mountain +278 C Forest +279 C Forest +280 C Forest +281 C Forest + +[borderless] +282 M Grand Master of Flowers +283 M Mordenkainen 284 M Lolth, Spider Queen 285 M Zariel, Archduke of Avernus 286 M Ellywick Tumblestrum 287 M Icingdeath, Frost Tyrant +288 U White Dragon +289 U Blue Dragon +290 M Iymrith, Desert Doom 291 U Black Dragon 292 M Ebondeath, Dracolich +293 M Inferno of the Star Mounts 294 U Red Dragon 295 U Green Dragon +296 M Old Gnawbone 297 R Adult Gold Dragon 298 M Tiamat + +[showcase] +299 C Arborea Pegasus +300 U Blink Dog 301 C Celestial Unicorn 302 U Cloister Gargoyle 303 R Nadaar, Selfless Paladin @@ -220,26 +319,33 @@ ScryfallCode=AFR 305 U Displacer Beast 306 C Djinni Windseer 307 R Dragon Turtle +308 R Mind Flayer 309 C Pixie Guide 310 C Rimeshield Frost Giant 311 C Baleful Beholder 312 C Clattering Skeletons 313 R Gelatinous Cube 314 C Manticore +315 R Westgate Regent 316 R Wight 317 R Delina, Wild Mage 318 C Goblin Javelineer 319 U Hulking Bugbear 320 R Minion of the Mighty +321 U Rust Monster +322 R Xorn 323 R Zalto, Fire Giant Duke 324 C Bulette +325 C Dire Wolf Prowler 326 C Gnoll Hunter 327 U Loathsome Troll 328 U Lurking Roper +329 C Neverwinter Dryad 330 R Ochre Jelly 331 C Owlbear 332 U Purple Worm 333 M The Tarrasque +334 C Underdark Basilisk 335 R Varis, Silverymoon Ranger 336 U Barrowin of Clan Undurr 337 U Bruenor Battlehammer @@ -249,9 +355,11 @@ ScryfallCode=AFR 341 U Hama Pashar, Ruin Seeker 342 U Kalain, Reclusive Painter 343 U Krydle of Baldur's Gate +344 M Minsc, Beloved Ranger 345 U Shessra, Death's Whisper 346 U Trelasarra, Moon Dancer 347 R Volo, Guide to Monsters +348 U Iron Golem 349 C Mimic 350 R Cave of the Frost Dragon 351 R Den of the Bugbear @@ -259,35 +367,58 @@ ScryfallCode=AFR 353 C Evolving Wilds 354 R Hall of Storm Giants 355 R Hive of the Eye Tyrant +356 R Lair of the Hydra +357 U Temple of the Dragon Queen +358 R Treasure Vault + +[extended art] +359 M The Book of Exalted Deeds +360 R Dancing Sword 361 R Flumph 362 R Guardian of Faith +363 R Loyal Warhound +364 R Teleportation Circle 365 R The Blackstaff of Waterdeep 366 M Demilich 367 R Grazilaxx, Illithid Scholar 368 R Tasha's Hideous Laughter +369 R True Polymorph 370 R Wizard's Spellbook 371 R Yuan-Ti Malison +372 M Acererak the Archlich +373 R Asmodeus the Archfiend 374 M The Book of Vile Darkness +375 R Forsworn Paladin 376 R Sphere of Annihilation 377 R Vorpal Sword 378 M Flameskull +379 R Hobgoblin Bandit Lord 380 R Meteor Swarm 381 R Orb of Dragonkind 382 R Wish 383 R Circle of Dreams Druid 384 R Froghemoth 385 R Instrument of the Bards +386 R Long Rest 387 R Werewolf Pack Leader 388 R Orcus, Prince of Undeath +389 R Skeletal Swarming 390 R Triumphant Adventurer 391 M Xanathar, Guild Kingpin 392 M The Deck of Many Things +393 R Eye of Vecna +394 R Hand of Vecna 395 R Treasure Chest + +[buy a box] 396 R Vorpal Sword + +[promo] 397 R Treasure Chest 398 U Portable Hole 399 C You Find the Villains' Lair 400 U Power Word Kill +401 U Magic Missile 402 U Prosperous Innkeeper [dungeons] diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index 348a601cafd..e0cc94bac98 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -887,7 +887,7 @@ lblSet=Auflage #Set word has different meanings in other languages lblDefault=Standard lblType=Typ -lblPlaneswalkerDeckSort=Planeswalker Deck +lblPlaneswalkerDeckSort=Planeswalker-Deck lblRarity=Seltenheit lblConvertToFoil=Foil lblMulticolor=Mehrfarbig @@ -904,6 +904,7 @@ lblCard=Karte lblFormat=Format lblFormats=Formate lblQuestWorld=Quest-Welt +lblBlock=Block lblSets=Sets lblTypes=Typen lblConvertedManaCosts=umgewandelte Manakosten @@ -2558,6 +2559,8 @@ lblLibraryNCards=Bibliothek ({0}) lblExileNCards=Exil ({0}) lblFlashbackNCards=Rückblende-Karten ({0}) lblCommandZoneNCards=Komandozone ({0}) +lblAnteZoneNCards=Ante zone ({0}) +lblSideboardNCards=Sideboard ({0}) lblWhiteManaOfN=Weißes Mana ({0}) lblBlueManaOfN=Blaues Mana ({0}) lblBlackManaOfN=Schwarzes Mana ({0}) diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index d5810e20658..f123a41d541 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -2558,6 +2558,8 @@ lblLibraryNCards=Library ({0}) lblExileNCards=Exile ({0}) lblFlashbackNCards=Flashback cards ({0}) lblCommandZoneNCards=Command zone ({0}) +lblAnteZoneNCards=Ante zone ({0}) +lblSideboardNCards=Sideboard ({0}) lblWhiteManaOfN=White mana ({0}) lblBlueManaOfN=Blue mana ({0}) lblBlackManaOfN=Black mana ({0}) diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index b2aa72317a8..f441ce8f48b 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -2557,6 +2557,8 @@ lblLibraryNCards=Biblioteca ({0}) lblExileNCards=Exilio ({0}) lblFlashbackNCards=Cartas con retrospectiva ({0}) lblCommandZoneNCards=Zona de comando ({0}) +lblAnteZoneNCards=Ante zone ({0}) +lblSideboardNCards=Sideboard ({0}) lblWhiteManaOfN=Maná blanco ({0}) lblBlueManaOfN=Maná azul ({0}) lblBlackManaOfN=Maná negro ({0}) diff --git a/forge-gui/res/languages/it-IT.properties b/forge-gui/res/languages/it-IT.properties index c5ef2190be6..acf7c559226 100644 --- a/forge-gui/res/languages/it-IT.properties +++ b/forge-gui/res/languages/it-IT.properties @@ -2557,6 +2557,8 @@ lblLibraryNCards=Grimorio ({0}) lblExileNCards=Esilio ({0}) lblFlashbackNCards=Carte Flashback ({0}) lblCommandZoneNCards=Zona di Comando ({0}) +lblAnteZoneNCards=Ante zone ({0}) +lblSideboardNCards=Sideboard ({0}) lblWhiteManaOfN=Mana Bianco ({0}) lblBlueManaOfN=Mana Blu ({0}) lblBlackManaOfN=Mana Nero ({0}) diff --git a/forge-gui/res/languages/ja-JP.properties b/forge-gui/res/languages/ja-JP.properties index 4934b80baf1..b0bd62ba3e9 100644 --- a/forge-gui/res/languages/ja-JP.properties +++ b/forge-gui/res/languages/ja-JP.properties @@ -2558,6 +2558,8 @@ lblLibraryNCards=ライブラリー ({0}) lblExileNCards=追放 ({0}) lblFlashbackNCards=フラッシュバックカード ({0}) lblCommandZoneNCards=統率領域 ({0}) +lblAnteZoneNCards=アンティ領域 ({0}) +lblSideboardNCards=サイドボード ({0}) lblWhiteManaOfN=白マナ ({0}) lblBlueManaOfN=青マナ ({0}) lblBlackManaOfN=黒マナ ({0}) diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index 65979723f6d..21d74ec0f3e 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -2558,6 +2558,8 @@ lblLibraryNCards=牌库 ({0}) lblExileNCards=放逐区 ({0}) lblFlashbackNCards=可返照 ({0}) lblCommandZoneNCards=指挥官区 ({0}) +lblAnteZoneNCards=Ante zone ({0}) +lblSideboardNCards=Sideboard ({0}) lblWhiteManaOfN=白色法术力 ({0}) lblBlueManaOfN=蓝色法术力 ({0}) lblBlackManaOfN=黑色法术力 ({0}) diff --git a/forge-gui/res/lists/TypeLists.txt b/forge-gui/res/lists/TypeLists.txt index d2a7ba6af8b..0a516719ddb 100644 --- a/forge-gui/res/lists/TypeLists.txt +++ b/forge-gui/res/lists/TypeLists.txt @@ -102,6 +102,7 @@ Gamer:Gamers Gargoyle:Gargoyles Germ:Germs Giant:Giants +Gnoll:Gnolls Gnome:Gnomes Goat:Goats Goblin:Goblins @@ -113,6 +114,7 @@ Gremlin:Gremlins Griffin:Griffins Hag:Hags Halfling:Halflings +Hamster:Hamsters Harpy:Harpies Hellion:Hellions Hippo:Hippos @@ -314,6 +316,7 @@ Angrath Arlinn Ashiok B.O.B. +Bahamut Basri Bolas Calix @@ -347,6 +350,7 @@ Koth Liliana Lolth Lukka +Mordenkainen Nahiri Narset Niko @@ -378,3 +382,4 @@ Wrenn Xenagos Yanggu Yanling +Zariel diff --git a/forge-gui/res/skins/default/sprite_icons.png b/forge-gui/res/skins/default/sprite_icons.png index 7e82aba0b50..0f75f0c1389 100644 Binary files a/forge-gui/res/skins/default/sprite_icons.png and b/forge-gui/res/skins/default/sprite_icons.png differ diff --git a/forge-gui/res/tokenscripts/boo.txt b/forge-gui/res/tokenscripts/boo.txt new file mode 100644 index 00000000000..5ef811610b7 --- /dev/null +++ b/forge-gui/res/tokenscripts/boo.txt @@ -0,0 +1,8 @@ +Name:Boo +ManaCost:no cost +Types:Legendary Creature Hamster +Colors:red +PT:1/1 +K:Trample +K:Haste +Oracle:Trample, haste diff --git a/forge-gui/res/tokenscripts/u_x_x_dog_illusion_cardsinhand.txt b/forge-gui/res/tokenscripts/u_x_x_dog_illusion_cardsinhand.txt new file mode 100644 index 00000000000..89cf60ded0f --- /dev/null +++ b/forge-gui/res/tokenscripts/u_x_x_dog_illusion_cardsinhand.txt @@ -0,0 +1,8 @@ +Name:Dog Illusion +ManaCost:no cost +Types:Creature Dog Illusion +Colors:blue +PT:*/* +S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ This creature's power and toughness are each equal to twice the number of cards in your hand. +SVar:X:Count$InYourHand/Times.2 +Oracle:This creature's power and toughness are each equal to twice the number of cards in your hand. diff --git a/forge-gui/res/tokenscripts/vecna.txt b/forge-gui/res/tokenscripts/vecna.txt new file mode 100644 index 00000000000..d1d06866e4f --- /dev/null +++ b/forge-gui/res/tokenscripts/vecna.txt @@ -0,0 +1,7 @@ +Name:Vecna +ManaCost:no cost +Types:Legendary Creature Zombie God +Colors:black +PT:8/8 +K:Indestructible +Oracle:Indestructible diff --git a/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java b/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java index d63e3bea2df..2ccaebfe505 100644 --- a/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java +++ b/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java @@ -86,7 +86,7 @@ public class ForgePreferences extends PreferencesStore { UI_IMAGE_CACHE_MAXIMUM("400"), UI_OVERLAY_FOIL_EFFECT ("true"), UI_HIDE_REMINDER_TEXT ("false"), - UI_SR_OPTIMIZE ("false"), + UI_SR_OPTIMIZE ("false"), UI_OPEN_PACKS_INDIV ("false"), UI_STACK_CREATURES ("false"), UI_UPLOAD_DRAFT ("false"), @@ -238,12 +238,18 @@ public class ForgePreferences extends PreferencesStore { ZONE_LOC_HUMAN_GRAVEYARD(""), ZONE_LOC_HUMAN_EXILE(""), ZONE_LOC_HUMAN_FLASHBACK(""), + ZONE_LOC_HUMAN_COMMAND(""), + ZONE_LOC_HUMAN_ANTE(""), + ZONE_LOC_HUMAN_SIDEBOARD(""), ZONE_LOC_AI_HAND(""), ZONE_LOC_AI_LIBRARY(""), ZONE_LOC_AI_GRAVEYARD(""), ZONE_LOC_AI_EXILE(""), ZONE_LOC_AI_FLASHBACK(""), + ZONE_LOC_AI_COMMAND(""), + ZONE_LOC_AI_ANTE(""), + ZONE_LOC_AI_SIDEBOARD(""), CHAT_WINDOW_LOC(""), diff --git a/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java b/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java index 3847813761c..add774d0c80 100644 --- a/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java +++ b/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java @@ -20,7 +20,7 @@ package forge.localinstance.skin; /** * Assembles settings from selected or default theme as appropriate. Saves in a * hashtable, access using .get(settingName) method. - * + * */ public enum FSkinProp { //backgrounds @@ -62,6 +62,11 @@ public enum FSkinProp { IMG_ZONE_GRAVEYARD (new int[] {320, 0, 40, 40}, PropType.IMAGE), IMG_HDZONE_GRAVEYARD (new int[] {132, 6, 128, 128}, PropType.BUTTONS), + IMG_ZONE_ANTE (new int[] {360, 0, 40, 40}, PropType.IMAGE), + + IMG_ZONE_SIDEBOARD (new int[] {360, 40, 40, 40}, PropType.IMAGE), + IMG_HDZONE_SIDEBOARD (new int[] {132, 1792, 128, 128}, PropType.BUTTONS), + IMG_HDZONE_MANAPOOL (new int[] {2, 6, 128, 128}, PropType.BUTTONS), IMG_ZONE_POISON (new int[] {320, 80, 40, 40}, PropType.IMAGE), @@ -143,7 +148,7 @@ public enum FSkinProp { IMG_COUNTERS_MULTI (new int[] {80, 400, 80, 80}, PropType.IMAGE), IMG_ENERGY (new int[] {320, 120, 40, 40}, PropType.IMAGE), IMG_EXPERIENCE (new int[] {280, 120, 40, 30}, PropType.IMAGE), - + //foils FOIL_01 (new int[] {0, 0, 400, 570}, PropType.FOIL), FOIL_02 (new int[] {400, 0, 400, 570}, PropType.FOIL), @@ -395,7 +400,7 @@ public enum FSkinProp { IMG_FAV4 (new int[] {300, 0, 100, 100}, PropType.FAVICON), IMG_FAV5 (new int[] {400, 0, 100, 100}, PropType.FAVICON), IMG_FAVNONE (new int[] {500, 0, 100, 100}, PropType.FAVICON), - + IMG_QUEST_DRAFT_DECK (new int[] {0, 0, 680, 475}, PropType.IMAGE), //COMMANDER IMG_ABILITY_COMMANDER (new int[] {330, 576, 80, 80}, PropType.ABILITY), @@ -452,7 +457,7 @@ public enum FSkinProp { IMG_ABILITY_PROTECT_U (new int[] {2, 330, 80, 80}, PropType.ABILITY), IMG_ABILITY_PROTECT_UW (new int[] {84, 330, 80, 80}, PropType.ABILITY), IMG_ABILITY_PROTECT_W (new int[] {166, 330, 80, 80}, PropType.ABILITY); - + private int[] coords; private PropType type;