From a71c627fc72cd9cb82cf00af79d9324e8b4c8a4d Mon Sep 17 00:00:00 2001 From: Jeff Date: Fri, 23 Mar 2018 12:10:29 -0500 Subject: [PATCH] - Added Cabal Shrine, Hint of Insanity, Mind Burst, and Traveling Plague. Odyssey set 100%. --- Mage.Sets/src/mage/cards/c/CabalShrine.java | 144 ++++++++++++++ .../src/mage/cards/h/HintOfInsanity.java | 114 +++++++++++ Mage.Sets/src/mage/cards/m/MindBurst.java | 76 +++++++ .../src/mage/cards/t/TravelingPlague.java | 185 ++++++++++++++++++ Mage.Sets/src/mage/sets/Odyssey.java | 4 + 5 files changed, 523 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/CabalShrine.java create mode 100644 Mage.Sets/src/mage/cards/h/HintOfInsanity.java create mode 100644 Mage.Sets/src/mage/cards/m/MindBurst.java create mode 100644 Mage.Sets/src/mage/cards/t/TravelingPlague.java diff --git a/Mage.Sets/src/mage/cards/c/CabalShrine.java b/Mage.Sets/src/mage/cards/c/CabalShrine.java new file mode 100644 index 0000000000..9177e40cb6 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CabalShrine.java @@ -0,0 +1,144 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.c; + +import java.util.UUID; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.NamePredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.stack.Spell; +import mage.players.Player; + +/** + * + * @author jeffwadsworth + */ +public class CabalShrine extends CardImpl { + + public CabalShrine(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{B}{B}"); + + + // Whenever a player casts a spell, that player discards X cards, where X is the number of cards in all graveyards with the same name as that spell. + this.addAbility(new CabalShrineTriggeredAbility()); + } + + public CabalShrine(final CabalShrine card) { + super(card); + } + + @Override + public CabalShrine copy() { + return new CabalShrine(this); + } +} + +class CabalShrineTriggeredAbility extends TriggeredAbilityImpl { + + public CabalShrineTriggeredAbility() { + super(Zone.BATTLEFIELD, new CabalShrineEffect(), false); + } + + public CabalShrineTriggeredAbility(final CabalShrineTriggeredAbility ability) { + super(ability); + } + + @Override + public CabalShrineTriggeredAbility copy() { + return new CabalShrineTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.SPELL_CAST; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + Spell spell = game.getStack().getSpell(event.getTargetId()); + MageObject mageObject = game.getObject(sourceId); + if (spell != null) { + game.getState().setValue("cabalShrine" + mageObject, spell); + return true; + } + return false; + } + +} + +class CabalShrineEffect extends OneShotEffect { + + public CabalShrineEffect() { + super(Outcome.Discard); + staticText = "Whenever a player casts a spell, that player discards X cards, where X is the number of cards in all graveyards with the same name as that spell"; + } + + public CabalShrineEffect(final CabalShrineEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + int count = 0; + MageObject mageObject = game.getObject(source.getSourceId()); + Spell spell = (Spell) game.getState().getValue("cabalShrine" + mageObject); + if (spell != null) { + Player controller = game.getPlayer(spell.getControllerId()); + if (controller != null) { + String name = spell.getName(); + FilterCard filterCardName = new FilterCard(); + filterCardName.add(new NamePredicate(name)); + for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { + Player player = game.getPlayer(playerId); + if (player != null) { + count += player.getGraveyard().count(filterCardName, game); + } + } + controller.discard(count, false, source, game); + return true; + } + } + return false; + } + + @Override + public CabalShrineEffect copy() { + return new CabalShrineEffect(this); + } +} diff --git a/Mage.Sets/src/mage/cards/h/HintOfInsanity.java b/Mage.Sets/src/mage/cards/h/HintOfInsanity.java new file mode 100644 index 0000000000..f38224f076 --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HintOfInsanity.java @@ -0,0 +1,114 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.h; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.filter.FilterCard; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetPlayer; +import mage.target.common.TargetCardInHand; + +/** + * + * @author jeffwadsworth + */ +public class HintOfInsanity extends CardImpl { + + public HintOfInsanity(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{B}"); + + // Target player reveals his or her hand. That player discards all nonland cards with the same name as another card in his or her hand. + this.getSpellAbility().addEffect(new HintOfInsanityEffect()); + this.getSpellAbility().addTarget(new TargetPlayer()); + + } + + public HintOfInsanity(final HintOfInsanity card) { + super(card); + } + + @Override + public HintOfInsanity copy() { + return new HintOfInsanity(this); + } +} + +class HintOfInsanityEffect extends OneShotEffect { + + public HintOfInsanityEffect() { + super(Outcome.Discard); + this.staticText = "Target player reveals his or her hand. That player discards all nonland cards with the same name as another card in his or her hand"; + } + + public HintOfInsanityEffect(final HintOfInsanityEffect effect) { + super(effect); + } + + @Override + public HintOfInsanityEffect copy() { + return new HintOfInsanityEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + FilterCard filter = new FilterCard("card from your hand"); + Player targetPlayer = game.getPlayer(source.getFirstTarget()); + String nameOfChosenCard; + Card chosenCard; + if (targetPlayer != null) { + TargetCardInHand targetCard = new TargetCardInHand(filter); + targetCard.setNotTarget(true); + Cards cardsInHand = new CardsImpl(); + cardsInHand.addAll(targetPlayer.getHand()); + targetPlayer.revealCards("Hint of Insanity Reveal", cardsInHand, game); + if (!cardsInHand.isEmpty() + && targetPlayer.choose(Outcome.Discard, targetCard, source.getSourceId(), game)) { + chosenCard = game.getCard(targetCard.getFirstTarget()); + nameOfChosenCard = chosenCard.getName(); + for (Card card : cardsInHand.getCards(game)) { + if (card.getName().equals(nameOfChosenCard) + && !card.isLand()) { + targetPlayer.discard(card, source, game); + } + } + return true; + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/cards/m/MindBurst.java b/Mage.Sets/src/mage/cards/m/MindBurst.java new file mode 100644 index 0000000000..e49b1b8c95 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MindBurst.java @@ -0,0 +1,76 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.m; + +import java.util.UUID; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.IntPlusDynamicValue; +import mage.abilities.dynamicvalue.common.CardsInAllGraveyardsCount; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.discard.DiscardTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.NamePredicate; +import mage.target.TargetPlayer; + +/** + * + * @author jeffwadsworth + */ +public class MindBurst extends CardImpl { + + private static final FilterCard filter = new FilterCard(); + + static { + filter.add(new NamePredicate("Mind Burst")); + } + + public MindBurst(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{B}"); + + + // Target player discards X cards, where X is one plus the number of cards named Mind Burst in all graveyards. + DynamicValue numberOfCardsNamedMindBurst = new IntPlusDynamicValue(1, new CardsInAllGraveyardsCount(filter)); + Effect effect = new DiscardTargetEffect(numberOfCardsNamedMindBurst); + effect.setText("Target player discards X cards, where X is one plus the number of cards named Mind Burst in all graveyards."); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetPlayer()); + + } + + public MindBurst(final MindBurst card) { + super(card); + } + + @Override + public MindBurst copy() { + return new MindBurst(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/TravelingPlague.java b/Mage.Sets/src/mage/cards/t/TravelingPlague.java new file mode 100644 index 0000000000..304f24d7e1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TravelingPlague.java @@ -0,0 +1,185 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.t; + +import java.util.UUID; +import mage.constants.SubType; +import mage.target.common.TargetCreaturePermanent; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.MultipliedValue; +import mage.abilities.dynamicvalue.common.CountersSourceCount; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.constants.Outcome; +import mage.target.TargetPermanent; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.ZoneChangeEvent; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author jeffwadsworth + */ +public class TravelingPlague extends CardImpl { + + public TravelingPlague(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}{B}"); + + this.subtype.add(SubType.AURA); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // At the beginning of each upkeep, put a plague counter on Traveling Plague. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.PLAGUE.createInstance()), TargetController.ANY, false)); + + // Enchanted creature gets -1/-1 for each plague counter on Traveling Plague. + DynamicValue boostValue = new MultipliedValue(new CountersSourceCount(CounterType.PLAGUE), -1); + Effect effect = new BoostEnchantedEffect(boostValue, boostValue, Duration.WhileOnBattlefield); + effect.setText("Enchanted creature gets -1/-1 for each plague counter on {this}"); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect)); + + // When enchanted creature leaves the battlefield, that creature's controller returns Traveling Plague from its owner's graveyard to the battlefield. + this.addAbility(new TravelingPlagueTriggeredAbility()); + + } + + public TravelingPlague(final TravelingPlague card) { + super(card); + } + + @Override + public TravelingPlague copy() { + return new TravelingPlague(this); + } +} + +class TravelingPlagueTriggeredAbility extends TriggeredAbilityImpl { + + public TravelingPlagueTriggeredAbility() { + super(Zone.BATTLEFIELD, new TravelingPlagueEffect(), false); + } + + public TravelingPlagueTriggeredAbility(final TravelingPlagueTriggeredAbility ability) { + super(ability); + } + + @Override + public TravelingPlagueTriggeredAbility copy() { + return new TravelingPlagueTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.ZONE_CHANGE; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + ZoneChangeEvent zEvent = (ZoneChangeEvent) event; + if (zEvent.getFromZone() == Zone.BATTLEFIELD) { + Permanent enchantedCreature = game.getPermanentOrLKIBattlefield(event.getTargetId()); + Permanent travelingPlague = game.getPermanentOrLKIBattlefield(sourceId); + if (enchantedCreature != null + && enchantedCreature.getAttachments().contains(travelingPlague.getId())) { + game.getState().setValue("travelingPlague" + sourceId, enchantedCreature); + return true; + } + } + return false; + } + + @Override + public String getRule() { + return "When enchanted creature leaves the battlefield, " + super.getRule(); + } +} + +class TravelingPlagueEffect extends OneShotEffect { + + public TravelingPlagueEffect() { + super(Outcome.Detriment); + staticText = "that creature's controller returns {this} from its owner's graveyard to the battlefield"; + } + + public TravelingPlagueEffect(final TravelingPlagueEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Card travelingPlague = game.getCard(source.getSourceId()); + Permanent enchantedCreature = (Permanent) game.getState().getValue("travelingPlague" + source.getSourceId()); + if (enchantedCreature != null) { + Player controllerOfEnchantedCreature = game.getPlayer(enchantedCreature.getControllerId()); + if (travelingPlague != null + && game.getState().getZone(travelingPlague.getId()).equals(Zone.GRAVEYARD) // aura must come from the graveyard + && controllerOfEnchantedCreature != null) { + TargetPermanent target = new TargetPermanent(new FilterCreaturePermanent("creature to enchant with " + travelingPlague.getName())); + target.setNotTarget(true); + if (controllerOfEnchantedCreature.choose(Outcome.Detriment, target, source.getSourceId(), game)) { + Permanent targetPermanent = game.getPermanent(target.getFirstTarget()); + if (!targetPermanent.cantBeAttachedBy(travelingPlague, game)) { + game.getState().setValue("attachTo:" + travelingPlague.getId(), targetPermanent); + travelingPlague.putOntoBattlefield(game, Zone.GRAVEYARD, source.getSourceId(), controllerOfEnchantedCreature.getId()); + return targetPermanent.addAttachment(travelingPlague.getId(), game); + } + } + } + } + return false; + } + + @Override + public TravelingPlagueEffect copy() { + return new TravelingPlagueEffect(this); + } +} diff --git a/Mage.Sets/src/mage/sets/Odyssey.java b/Mage.Sets/src/mage/sets/Odyssey.java index f768dd93fa..121b3ad17d 100644 --- a/Mage.Sets/src/mage/sets/Odyssey.java +++ b/Mage.Sets/src/mage/sets/Odyssey.java @@ -98,6 +98,7 @@ public class Odyssey extends ExpansionSet { cards.add(new SetCardInfo("Cabal Inquisitor", 119, Rarity.COMMON, mage.cards.c.CabalInquisitor.class)); cards.add(new SetCardInfo("Cabal Patriarch", 120, Rarity.RARE, mage.cards.c.CabalPatriarch.class)); cards.add(new SetCardInfo("Cabal Pit", 315, Rarity.UNCOMMON, mage.cards.c.CabalPit.class)); + cards.add(new SetCardInfo("Cabal Shrine", 121, Rarity.RARE, mage.cards.c.CabalShrine.class)); cards.add(new SetCardInfo("Call of the Herd", 231, Rarity.RARE, mage.cards.c.CallOfTheHerd.class)); cards.add(new SetCardInfo("Cantivore", 13, Rarity.RARE, mage.cards.c.Cantivore.class)); cards.add(new SetCardInfo("Careful Study", 70, Rarity.COMMON, mage.cards.c.CarefulStudy.class)); @@ -190,6 +191,7 @@ public class Odyssey extends ExpansionSet { cards.add(new SetCardInfo("Halberdier", 196, Rarity.COMMON, mage.cards.h.Halberdier.class)); cards.add(new SetCardInfo("Hallowed Healer", 25, Rarity.COMMON, mage.cards.h.HallowedHealer.class)); cards.add(new SetCardInfo("Haunting Echoes", 142, Rarity.RARE, mage.cards.h.HauntingEchoes.class)); + cards.add(new SetCardInfo("Hint of Insanity", 143, Rarity.RARE, mage.cards.h.HintOfInsanity.class)); cards.add(new SetCardInfo("Holistic Wisdom", 243, Rarity.RARE, mage.cards.h.HolisticWisdom.class)); cards.add(new SetCardInfo("Howling Gale", 244, Rarity.UNCOMMON, mage.cards.h.HowlingGale.class)); cards.add(new SetCardInfo("Immobilizing Ink", 87, Rarity.COMMON, mage.cards.i.ImmobilizingInk.class)); @@ -228,6 +230,7 @@ public class Odyssey extends ExpansionSet { cards.add(new SetCardInfo("Master Apothecary", 32, Rarity.RARE, mage.cards.m.MasterApothecary.class)); cards.add(new SetCardInfo("Metamorphic Wurm", 250, Rarity.UNCOMMON, mage.cards.m.MetamorphicWurm.class)); cards.add(new SetCardInfo("Millikin", 302, Rarity.UNCOMMON, mage.cards.m.Millikin.class)); + cards.add(new SetCardInfo("Mind Burst", 148, Rarity.COMMON, mage.cards.m.MindBurst.class)); cards.add(new SetCardInfo("Mindslicer", 149, Rarity.RARE, mage.cards.m.Mindslicer.class)); cards.add(new SetCardInfo("Mine Layer", 205, Rarity.RARE, mage.cards.m.MineLayer.class)); cards.add(new SetCardInfo("Minotaur Explorer", 206, Rarity.UNCOMMON, mage.cards.m.MinotaurExplorer.class)); @@ -376,6 +379,7 @@ public class Odyssey extends ExpansionSet { cards.add(new SetCardInfo("Tombfire", 165, Rarity.RARE, mage.cards.t.Tombfire.class)); cards.add(new SetCardInfo("Touch of Invisibility", 109, Rarity.COMMON, mage.cards.t.TouchOfInvisibility.class)); cards.add(new SetCardInfo("Traumatize", 110, Rarity.RARE, mage.cards.t.Traumatize.class)); + cards.add(new SetCardInfo("Traveling Plague", 166, Rarity.RARE, mage.cards.t.TravelingPlague.class)); cards.add(new SetCardInfo("Treetop Sentinel", 111, Rarity.UNCOMMON, mage.cards.t.TreetopSentinel.class)); cards.add(new SetCardInfo("Tremble", 225, Rarity.COMMON, mage.cards.t.Tremble.class)); cards.add(new SetCardInfo("Twigwalker", 279, Rarity.UNCOMMON, mage.cards.t.Twigwalker.class));