From c42f6fea9d8cfb3a69247e2c3d8888d7ed4f2737 Mon Sep 17 00:00:00 2001 From: Sol Date: Mon, 21 Jul 2014 02:56:13 +0000 Subject: [PATCH] - !PrintSheets can now be referenced inside Booster contents of an edition file - M15 Boosters no longer contain cards only found in Intro decks - Adding a few Conspiracy type cards, along with the capability of their use (NOTE: Deck editors still need a way to add Conspiracy types) - Added Brago's Favor, Immediate Action, Muzzio's Preparations, Secret Summoning, Secrets of Paradise --- .gitattributes | 5 ++ .../java/forge/ai/PlayerControllerAi.java | 3 ++ .../java/forge/card/BoosterGenerator.java | 12 ++++- .../main/java/forge/card/BoosterSlots.java | 1 + .../src/main/java/forge/card/CardRules.java | 2 +- .../src/main/java/forge/card/CardType.java | 8 +++- .../src/main/java/forge/deck/DeckFormat.java | 3 ++ .../src/main/java/forge/deck/DeckSection.java | 3 +- .../src/main/java/forge/game/Match.java | 4 +- .../java/forge/game/card/CardFactoryUtil.java | 47 +++++++++++++++++++ .../main/java/forge/game/player/Player.java | 11 +++++ .../forge/game/player/RegisteredPlayer.java | 10 ++++ .../home/sanctioned/CSubmenuDraft.java | 3 ++ forge-gui/res/blockdata/blocks.txt | 1 + forge-gui/res/blockdata/printsheets.txt | 44 +++++++++++++++++ forge-gui/res/cardsfolder/b/bragos_favor.txt | 7 +++ .../res/cardsfolder/i/immediate_action.txt | 7 +++ .../cardsfolder/m/muzzios_preparations.txt | 9 ++++ .../res/cardsfolder/s/secret_summoning.txt | 9 ++++ .../res/cardsfolder/s/secrets_of_paradise.txt | 8 ++++ forge-gui/res/editions/Conspiracy.txt | 2 + forge-gui/res/editions/Magic 2015.txt | 2 +- 22 files changed, 193 insertions(+), 8 deletions(-) create mode 100644 forge-gui/res/cardsfolder/b/bragos_favor.txt create mode 100644 forge-gui/res/cardsfolder/i/immediate_action.txt create mode 100644 forge-gui/res/cardsfolder/m/muzzios_preparations.txt create mode 100644 forge-gui/res/cardsfolder/s/secret_summoning.txt create mode 100644 forge-gui/res/cardsfolder/s/secrets_of_paradise.txt diff --git a/.gitattributes b/.gitattributes index 9fadf8055b3..172d1ddd4a1 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2635,6 +2635,7 @@ forge-gui/res/cardsfolder/b/bower_passage.txt -text forge-gui/res/cardsfolder/b/brace_for_impact.txt -text forge-gui/res/cardsfolder/b/brackwater_elemental.txt svneol=native#text/plain forge-gui/res/cardsfolder/b/brago_king_eternal.txt -text +forge-gui/res/cardsfolder/b/bragos_favor.txt -text forge-gui/res/cardsfolder/b/bragos_representative.txt -text forge-gui/res/cardsfolder/b/braid_of_fire.txt svneol=native#text/plain forge-gui/res/cardsfolder/b/braids_cabal_minion.txt svneol=native#text/plain @@ -7033,6 +7034,7 @@ forge-gui/res/cardsfolder/i/imagecrafter.txt -text forge-gui/res/cardsfolder/i/imaginary_pet.txt svneol=native#text/plain forge-gui/res/cardsfolder/i/imi_statue.txt svneol=native#text/plain forge-gui/res/cardsfolder/i/immaculate_magistrate.txt svneol=native#text/plain +forge-gui/res/cardsfolder/i/immediate_action.txt -text forge-gui/res/cardsfolder/i/immersturm.txt -text forge-gui/res/cardsfolder/i/immerwolf.txt -text forge-gui/res/cardsfolder/i/immobilizing_ink.txt svneol=native#text/plain @@ -9084,6 +9086,7 @@ forge-gui/res/cardsfolder/m/mutavault.txt svneol=native#text/plain forge-gui/res/cardsfolder/m/mutilate.txt svneol=native#text/plain forge-gui/res/cardsfolder/m/mutual_epiphany.txt -text forge-gui/res/cardsfolder/m/muzzio_visionary_architect.txt -text +forge-gui/res/cardsfolder/m/muzzios_preparations.txt -text forge-gui/res/cardsfolder/m/muzzle.txt svneol=native#text/plain forge-gui/res/cardsfolder/m/mwonvuli_acid_moss.txt svneol=native#text/plain forge-gui/res/cardsfolder/m/mwonvuli_beast_tracker.txt -text @@ -11646,7 +11649,9 @@ forge-gui/res/cardsfolder/s/second_sight.txt svneol=native#text/plain forge-gui/res/cardsfolder/s/second_sunrise.txt -text forge-gui/res/cardsfolder/s/second_thoughts.txt svneol=native#text/plain forge-gui/res/cardsfolder/s/second_wind.txt svneol=native#text/plain +forge-gui/res/cardsfolder/s/secret_summoning.txt -text forge-gui/res/cardsfolder/s/secretkeeper.txt -text +forge-gui/res/cardsfolder/s/secrets_of_paradise.txt -text forge-gui/res/cardsfolder/s/secrets_of_the_dead.txt -text forge-gui/res/cardsfolder/s/security_blockade.txt -text forge-gui/res/cardsfolder/s/security_detail.txt svneol=native#text/plain diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index ef5367f745d..bf5b6cdb80c 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -814,6 +814,9 @@ public class PlayerControllerAi extends PlayerController { return ComputerUtilCard.getMostProminentCardName(player.getCardsIn(ZoneType.Library)); } else if (logic.equals("MostProminentInHumanDeck")) { return ComputerUtilCard.getMostProminentCardName(player.getOpponent().getCardsIn(ZoneType.Library)); + } else if (logic.equals("MostProminentCreatureInComputerDeck")) { + List cards = CardLists.getValidCards(player.getCardsIn(ZoneType.Library), "Creature", player, sa.getHostCard()); + return ComputerUtilCard.getMostProminentCardName(cards); } else if (logic.equals("BestCreatureInComputerDeck")) { return ComputerUtilCard.getBestCreatureAI(player.getCardsIn(ZoneType.Library)).getName(); } else if (logic.equals("RandomInComputerDeck")) { diff --git a/forge-core/src/main/java/forge/card/BoosterGenerator.java b/forge-core/src/main/java/forge/card/BoosterGenerator.java index 3340224ba52..cc64a83c712 100644 --- a/forge-core/src/main/java/forge/card/BoosterGenerator.java +++ b/forge-core/src/main/java/forge/card/BoosterGenerator.java @@ -176,8 +176,8 @@ public class BoosterGenerator { if( invert ) operator = operator.substring(1); Predicate toAdd = null; - if( operator.equalsIgnoreCase("dfc") ) { toAdd = Predicates.compose(CardRulesPredicates.splitType(CardSplitType.Transform), PaperCard.FN_GET_RULES); - } else if ( operator.equalsIgnoreCase(BoosterSlots.LAND) ) { toAdd = Predicates.compose(CardRulesPredicates.Presets.IS_LAND, PaperCard.FN_GET_RULES); + if( operator.equalsIgnoreCase(BoosterSlots.DUAL_FACED_CARD) ) { toAdd = Predicates.compose(CardRulesPredicates.splitType(CardSplitType.Transform), PaperCard.FN_GET_RULES); + } else if ( operator.equalsIgnoreCase(BoosterSlots.LAND) ) { toAdd = Predicates.compose(CardRulesPredicates.Presets.IS_LAND, PaperCard.FN_GET_RULES); } else if ( operator.equalsIgnoreCase(BoosterSlots.BASIC_LAND)) { toAdd = IPaperCard.Predicates.Presets.IS_BASIC_LAND; } else if ( operator.equalsIgnoreCase(BoosterSlots.TIME_SHIFTED)) { toAdd = IPaperCard.Predicates.Presets.IS_SPECIAL; } else if ( operator.equalsIgnoreCase(BoosterSlots.MYTHIC)) { toAdd = IPaperCard.Predicates.Presets.IS_MYTHIC_RARE; @@ -188,6 +188,14 @@ public class BoosterGenerator { operator = StringUtils.strip(operator.substring(4), "() "); String[] cardNames = TextUtil.splitWithParenthesis(operator, ',', '"', '"'); toAdd = IPaperCard.Predicates.names(Lists.newArrayList(cardNames)); + } else if (operator.startsWith("fromSheet(")) { + String sheetName = StringUtils.strip(operator.substring(9), "()\" "); + Iterable src = StaticData.instance().getPrintSheets().get(sheetName).toFlatList(); + ArrayList cardNames = Lists.newArrayList(); + for (PaperCard card : src) { + cardNames.add(card.getName()); + } + toAdd = IPaperCard.Predicates.names(Lists.newArrayList(cardNames)); } if(toAdd == null) diff --git a/forge-core/src/main/java/forge/card/BoosterSlots.java b/forge-core/src/main/java/forge/card/BoosterSlots.java index f7ac8f07ce3..68c594b3a86 100644 --- a/forge-core/src/main/java/forge/card/BoosterSlots.java +++ b/forge-core/src/main/java/forge/card/BoosterSlots.java @@ -11,4 +11,5 @@ public class BoosterSlots { public static final String MYTHIC = "Mythic"; public static final String BASIC_LAND = "BasicLand"; public static final String TIME_SHIFTED = "TimeShifted"; + public static final String DUAL_FACED_CARD = "dfc"; } \ No newline at end of file diff --git a/forge-core/src/main/java/forge/card/CardRules.java b/forge-core/src/main/java/forge/card/CardRules.java index e5190db9325..1a6efc6be57 100644 --- a/forge-core/src/main/java/forge/card/CardRules.java +++ b/forge-core/src/main/java/forge/card/CardRules.java @@ -96,7 +96,7 @@ public final class CardRules implements ICardCharacteristics { public boolean isVariant() { CardType t = getType(); - return t.isVanguard() || t.isScheme() || t.isPlane() || t.isPhenomenon(); + return t.isVanguard() || t.isScheme() || t.isPlane() || t.isPhenomenon() || t.isConspiracy(); } public CardSplitType getSplitType() { diff --git a/forge-core/src/main/java/forge/card/CardType.java b/forge-core/src/main/java/forge/card/CardType.java index 800e301fb04..0698d99d97d 100644 --- a/forge-core/src/main/java/forge/card/CardType.java +++ b/forge-core/src/main/java/forge/card/CardType.java @@ -38,6 +38,7 @@ public final class CardType implements Comparable { public enum CoreType { Artifact(true), + Conspiracy(false), Creature(true), Enchantment(true), Instant(false), @@ -216,6 +217,10 @@ public final class CardType implements Comparable { return this.coreType.contains(CardType.CoreType.Sorcery); } + public boolean isConspiracy() { + return this.coreType.contains(CoreType.Conspiracy); + } + public boolean isVanguard() { return this.coreType.contains(CardType.CoreType.Vanguard); } @@ -346,10 +351,11 @@ public final class CardType implements Comparable { // types.addAll(getCardTypes()); types.addAll(Constant.CARD_TYPES); - // not currently used by Forge + // Variant card types (I don't understand these lines, shouldn't core types be enough?) types.add("Plane"); types.add("Scheme"); types.add("Vanguard"); + types.add("Conspiracy"); return types; } diff --git a/forge-core/src/main/java/forge/deck/DeckFormat.java b/forge-core/src/main/java/forge/deck/DeckFormat.java index 1c3400834bf..f0e49e439de 100644 --- a/forge-core/src/main/java/forge/deck/DeckFormat.java +++ b/forge-core/src/main/java/forge/deck/DeckFormat.java @@ -114,6 +114,9 @@ public enum DeckFormat { int min = getMainRange().getMinimum(); int max = getMainRange().getMaximum(); + // TODO "Your minimum deck size is reduced by five." + // Adjust minimum base on number of Advantageous Proclamation or similar cards + if (deckSize < min) { return String.format("should have a minimum of %d cards", min); } diff --git a/forge-core/src/main/java/forge/deck/DeckSection.java b/forge-core/src/main/java/forge/deck/DeckSection.java index 8e3772a7549..e52393094ea 100644 --- a/forge-core/src/main/java/forge/deck/DeckSection.java +++ b/forge-core/src/main/java/forge/deck/DeckSection.java @@ -6,7 +6,8 @@ public enum DeckSection { Main(60), Sideboard(15), Planes(10), - Schemes(20); + Schemes(20), + Conspiracy(0); private final int typicalSize; // Rules enforcement is done in DeckFormat class, this is for reference only private DeckSection(int commonSize) { diff --git a/forge-game/src/main/java/forge/game/Match.java b/forge-game/src/main/java/forge/game/Match.java index 714755fb119..52eff578cff 100644 --- a/forge-game/src/main/java/forge/game/Match.java +++ b/forge-game/src/main/java/forge/game/Match.java @@ -211,8 +211,6 @@ public class Match { final Player player = players.get(i); final RegisteredPlayer psc = playersConditions.get(i); - player.initVariantsZones(psc); - if (canSideBoard) { Deck toChange = psc.getDeck(); List newMain = player.getController().sideboard(toChange, rules.getGameType()); @@ -230,6 +228,8 @@ public class Match { } } + player.initVariantsZones(psc); + Deck myDeck = psc.getDeck(); Set myRemovedAnteCards = null; diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 6881c93ca72..65d58011bef 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -18,6 +18,7 @@ package forge.game.card; import com.google.common.base.Predicate; +import com.google.common.base.Predicates; import com.google.common.collect.Lists; import com.google.common.collect.Sets; @@ -56,6 +57,8 @@ import forge.game.trigger.Trigger; import forge.game.trigger.TriggerHandler; import forge.game.zone.Zone; import forge.game.zone.ZoneType; +import forge.item.IPaperCard; +import forge.item.PaperCard; import forge.util.Aggregates; import forge.util.Lang; @@ -159,6 +162,50 @@ public class CardFactoryUtil { return morphUp; } + public static boolean handleHiddenAgenda(Player player, Card card) { + SpellAbility sa = new SpellAbility.EmptySa(card); + sa.getMapParams().put("AILogic", card.getSVar("AgendaLogic")); + Predicate cpp = Predicates.alwaysTrue(); + //Predicate pc = Predicates.in(player.getAllCards()); + // TODO This would be better to send in the player's deck, not all cards + String name = player.getController().chooseCardName(sa, cpp, "Card", "Name a card for " + card.getName()); + if (name == null || name.isEmpty()) { + return false; + } + + card.setNamedCard(name); + card.turnFaceDown(); + // Hopefully face down also hides the named card? + card.addSpellAbility(abilityRevealHiddenAgenda(card)); + return true; + } + + public static AbilityStatic abilityRevealHiddenAgenda(final Card sourceCard) { + final AbilityStatic revealAgenda = new AbilityStatic(sourceCard, Cost.Zero, null) { + + @Override + public void resolve() { + if (sourceCard.turnFaceUp()) { + String sb = this.getActivatingPlayer() + " has revealed " + sourceCard.getName() + " with the chosen name " + sourceCard.getNamedCard(); + sourceCard.getGame().getGameLog().add(GameLogEntryType.STACK_RESOLVE, sb); + sourceCard.getGame().fireEvent(new GameEventCardStatsChanged(sourceCard)); + } + } + + @Override + public boolean canPlay() { + return sourceCard.getController().equals(this.getActivatingPlayer()) && sourceCard.isFaceDown() + && sourceCard.isInZone(ZoneType.Command); + } + + // TODO When should the AI activate this? + + }; // reveal hidden agenda + + revealAgenda.setDescription("Reveal this Hidden Agenda at any time. "); + return revealAgenda; + } + /** *

* abilityCycle. 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 36b5ea122b6..2cd77b28627 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -30,6 +30,7 @@ import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.card.Card; +import forge.game.card.CardFactoryUtil; import forge.game.card.CardLists; import forge.game.card.CardPredicates; import forge.game.card.CardPredicates.Presets; @@ -3321,6 +3322,16 @@ public class Player extends GameEntity implements Comparable { getZone(ZoneType.Command).add(eff); } + + for (IPaperCard cp : registeredPlayer.getConspiracies()) { + Card conspire = Card.fromPaperCard(cp, this); + if (conspire.hasKeyword("Hidden agenda")) { + if (!CardFactoryUtil.handleHiddenAgenda(this, conspire)) { + continue; + } + } + com.add(conspire); + } } public void changeOwnership(Card card) { diff --git a/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java b/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java index 32fb58a56ea..a90205d52fd 100644 --- a/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java +++ b/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java @@ -27,6 +27,7 @@ public class RegisteredPlayer { private final List cardsInCommand = new ArrayList(); private Iterable schemes = null; private Iterable planes = null; + private Iterable conspiracies = null; private PaperCard commander = null; private int teamNumber = -1; // members of teams with negative id will play FFA. @@ -101,6 +102,15 @@ public class RegisteredPlayer { return planes == null ? EmptyList : planes; } + public Iterable getConspiracies() { + return conspiracies == null ? EmptyList : conspiracies; + } + + public void assignConspiracies() { + if (currentDeck.has(DeckSection.Conspiracy)) + conspiracies = currentDeck.get(DeckSection.Conspiracy).toFlatList(); + } + public int getTeamNumber() { return teamNumber; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java index 9a3888251a9..5870e35426a 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java @@ -139,6 +139,9 @@ public enum CSubmenuDraft implements ICDoc { List starter = new ArrayList(); starter.add(new RegisteredPlayer(humanDeck.getDeck()).setPlayer(GuiBase.getInterface().getGuiPlayer())); starter.add(new RegisteredPlayer(aiDeck).setPlayer(GuiBase.getInterface().createAiPlayer())); + for(RegisteredPlayer pl : starter) { + pl.assignConspiracies(); + } GuiBase.getInterface().startMatch(GameType.Draft, starter); } diff --git a/forge-gui/res/blockdata/blocks.txt b/forge-gui/res/blockdata/blocks.txt index 8b60c630219..9fa74eae7aa 100644 --- a/forge-gui/res/blockdata/blocks.txt +++ b/forge-gui/res/blockdata/blocks.txt @@ -51,4 +51,5 @@ Dragon's Maze Race, -/5/RTR, DGM DGM DGM Meta-Choose(All(S(RTR Azorius Guild);Ra Modern Masters, 3/6/M13, MMA Magic 2014, 3/6/M14, M14 Theros, 3/6/THS, THS BNG JOU +#Conspiracy, 3/6/M14, CNS Magic 2015, 3/6/M15, M15 \ No newline at end of file diff --git a/forge-gui/res/blockdata/printsheets.txt b/forge-gui/res/blockdata/printsheets.txt index a66e2d0fb9c..bed9510ba6a 100644 --- a/forge-gui/res/blockdata/printsheets.txt +++ b/forge-gui/res/blockdata/printsheets.txt @@ -657,3 +657,47 @@ 1 Vitu-Ghazi Guildmage|RTR 1 Wayfaring Temple|RTR 1 Wild Beastmaster|RTR + +[CNS Draft Matters] +#1 Advantageous Proclamation|CNS +#1 AEther Searcher|CNS +#1 Agent of Acquisitions|CNS +#1 Backup Plan|CNS +1 Brago's Favor|CNS +#1 Canal Dredger|CNS +#1 Cogwork Grinder|CNS +#1 Cogwork Librarian|CNS +#1 Cogwork Spy|CNS +#1 Cogwork Tracker|CNS +#1 Deal Broker|CNS +#1 Double Stroke|CNS +1 Immediate Action|CNS +#1 Iterative Analysis|CNS +#1 Lore Seeker|CNS +#1 Lurking Automaton|CNS +1 Muzzio's Preparations|CNS +#1 Paliano, the High City|CNS +#1 Power Play|CNS +1 Secret Summoning|CNS +1 Secrets of Paradise|CNS +#1 Sentinel Dispatch|CNS +#1 Unexpected Potential|CNS +#1 Whispergear Sneak|CNS +#1 Worldknit|CNS + +[M15 Sample Cards] +1 Aegis Angel|M15 +1 Cancel|M15 +1 Centaur Courser|M15 +1 Divine Verdict|M15 +1 Furnace Whelp|M15 +1 Garruk's Packleader|M15 +1 Inspired Charge|M15 +1 Mahamoti Djinn|M15 +1 Nightmare|M15 +1 Seismic Strike|M15 +1 Sengir Vampire|M15 +1 Serra Angel|M15 +1 Shivan Dragon|M15 +1 Terra Stomper|M15 +1 Walking Corpse|M15 \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/b/bragos_favor.txt b/forge-gui/res/cardsfolder/b/bragos_favor.txt new file mode 100644 index 00000000000..030c9db9fd6 --- /dev/null +++ b/forge-gui/res/cardsfolder/b/bragos_favor.txt @@ -0,0 +1,7 @@ +Name:Brago's Favor +ManaCost:no cost +Types:Conspiracy +K:Hidden agenda +S:Mode$ ReduceCost | ValidCard$ Card.NamedCard | EffectZone$ Command | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Spells of the named card cost 1 less. +SVar:AgendaLogic:BestCreatureInComputerDeck +Oracle:Hidden agenda (Start the game with this conspiracy face down in the command zone and secretly name a card. You may turn this conspiracy face up any time and reveal the chosen name.)\nSpells with the chosen name you cast cost {1} less to cast. diff --git a/forge-gui/res/cardsfolder/i/immediate_action.txt b/forge-gui/res/cardsfolder/i/immediate_action.txt new file mode 100644 index 00000000000..e02e423c1f6 --- /dev/null +++ b/forge-gui/res/cardsfolder/i/immediate_action.txt @@ -0,0 +1,7 @@ +Name:Immediate Action +ManaCost:no cost +Types:Conspiracy +K:Hidden agenda +S:Mode$ Continuous | Affected$ Creature.YouCtrl+NamedCard | EffectZone$ Command | AddKeyword$ Haste | Description$ Creatures you control of the named card has haste. +SVar:AgendaLogic:BestCreatureInComputerDeck +Oracle:Hidden agenda (Start the game with this conspiracy face down in the command zone and secretly name a card. You may turn this conspiracy face up any time and reveal the chosen name.)\nCreatures you control with the chosen name have haste. diff --git a/forge-gui/res/cardsfolder/m/muzzios_preparations.txt b/forge-gui/res/cardsfolder/m/muzzios_preparations.txt new file mode 100644 index 00000000000..63236cf7874 --- /dev/null +++ b/forge-gui/res/cardsfolder/m/muzzios_preparations.txt @@ -0,0 +1,9 @@ +Name:Muzzio's Preparations +ManaCost:no cost +Types:Conspiracy +K:Hidden agenda +R:Event$ Moved | ActiveZones$ Command | Destination$ Battlefield | ValidCard$ Creature.YouCtrl+NamedCard | ReplaceWith$ AddExtraCounter | Description$ Each creature with the named card you control enters the battlefield with an additional +1/+1 counter on it. +SVar:AddExtraCounter:DB$ PutCounter | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ MoveToBattlefield +SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard +SVar:AgendaLogic:MostProminentCreatureInComputerDeck +Oracle:Hidden agenda (Start the game with this conspiracy face down in the command zone and secretly name a card. You may turn this conspiracy face up any time and reveal the chosen name.)\nEach creature you control with the chosen name enters the battlefield with an additional +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/s/secret_summoning.txt b/forge-gui/res/cardsfolder/s/secret_summoning.txt new file mode 100644 index 00000000000..4b353334562 --- /dev/null +++ b/forge-gui/res/cardsfolder/s/secret_summoning.txt @@ -0,0 +1,9 @@ +Name:Secret Summoning +ManaCost:no cost +Types:Conspiracy +K:Hidden agenda +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.NamedCard+YouCtrl | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ Whenever a creature with the chosen name enters the battlefield under your control, you may search your library for any number of cards with that name, reveal them, put them into your hand, then shuffle your library. +SVar:TrigChange:DB$ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Card.NamedCard | ChangeNum$ X | References$ X +SVar:X:Count$InYourLibrary +SVar:AgendaLogic:MostProminentCreatureInComputerDeck +Oracle:Hidden agenda (Start the game with this conspiracy face down in the command zone and secretly name a card. You may turn this conspiracy face up any time and reveal the chosen name.)\nWhenever a creature with the chosen name enters the battlefield under your control, you may search your library for any number of cards with that name, reveal them, put them into your hand, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/s/secrets_of_paradise.txt b/forge-gui/res/cardsfolder/s/secrets_of_paradise.txt new file mode 100644 index 00000000000..fac3da4193a --- /dev/null +++ b/forge-gui/res/cardsfolder/s/secrets_of_paradise.txt @@ -0,0 +1,8 @@ +Name:Secrets of Paradise +ManaCost:no cost +Types:Conspiracy +K:Hidden agenda +S:Mode$ Continuous | Affected$ Creature.YouCtrl+NamedCard | EffectZone$ Command | AddAbility$ AnyMana | Description$ Creatures of the named card you control have "{T}: Add one mana of any color to your mana pool." +SVar:AnyMana:AB$Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color to your mana pool. +SVar:AgendaLogic:MostProminentCreatureInComputerDeck +Oracle:Hidden agenda (Start the game with this conspiracy face down in the command zone and secretly name a card. You may turn this conspiracy face up any time and reveal the chosen name.)\nCreatures you control with the chosen name have "{T}: Add one mana of any color to your mana pool." diff --git a/forge-gui/res/editions/Conspiracy.txt b/forge-gui/res/editions/Conspiracy.txt index 455b2d10abc..9eed2aa25f2 100644 --- a/forge-gui/res/editions/Conspiracy.txt +++ b/forge-gui/res/editions/Conspiracy.txt @@ -4,6 +4,8 @@ Date=2014-06-06 Name=Conspiracy Code2=CNS Type=Other +BoosterCovers=3 +Booster=10 Common:!fromSheet("CNS Draft Matters"), 3 Uncommon:!fromSheet("CNS Draft Matters"), 1 RareMythic:!fromSheet("CNS Draft Matters"), 1 fromSheet("CNS Draft Matters") [cards] U Advantageous Proclamation diff --git a/forge-gui/res/editions/Magic 2015.txt b/forge-gui/res/editions/Magic 2015.txt index 04c467b65a7..592a006fc1b 100644 --- a/forge-gui/res/editions/Magic 2015.txt +++ b/forge-gui/res/editions/Magic 2015.txt @@ -5,7 +5,7 @@ Name=Magic 2015 Code2=M15 Type=Core BoosterCovers=5 -Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 BasicLand +Booster=10 Common:!fromSheet("M15 Sample Cards"), 3 Uncommon:!fromSheet("M15 Sample Cards"), 1 RareMythic:!fromSheet("M15 Sample Cards"), 1 BasicLand [cards] M Ajani Steadfast