From f04d7c9b03916196db21d0541eb150dcc60576e9 Mon Sep 17 00:00:00 2001 From: Ingmar Goudt Date: Mon, 17 Sep 2018 21:09:42 +0200 Subject: [PATCH 001/140] remove redundant null checks before instanceof --- .../src/main/java/mage/client/MageFrame.java | 2 +- .../components/ext/dlg/DialogManager.java | 2 +- .../collection/viewer/MageBook.java | 6 +- .../client/deckeditor/table/TableModel.java | 2 +- .../plugins/adapters/MageActionCallback.java | 2 +- .../gui/countryBox/CountryItemEditor.java | 2 +- .../java/org/mage/card/arcane/CardPanel.java | 2 +- .../src/main/java/mage/remote/Connection.java | 2 +- .../main/java/mage/utils/CompressUtil.java | 2 +- .../ma/optimizers/impl/LevelUpOptimizer.java | 2 +- .../java/mage/server/util/SystemUtil.java | 6 +- Mage.Sets/src/mage/cards/b/Berserk.java | 2 +- .../src/mage/cards/b/BuzzingWhackADoodle.java | 6 +- .../src/mage/cards/c/ChainOfSilence.java | 2 +- Mage.Sets/src/mage/cards/c/ChainOfVapor.java | 2 +- Mage.Sets/src/mage/cards/c/ChainStasis.java | 2 +- .../src/mage/cards/c/ChorusOfTheConclave.java | 2 +- .../mage/cards/e/EngineeredExplosives.java | 2 +- Mage.Sets/src/mage/cards/e/EssenceFlux.java | 2 +- .../mage/cards/f/FiresongAndSunspeaker.java | 2 +- .../src/mage/cards/f/ForbiddenCrypt.java | 2 +- .../src/mage/cards/f/ForsakenWastes.java | 2 +- Mage.Sets/src/mage/cards/g/GOTOJAIL.java | 2 +- Mage.Sets/src/mage/cards/g/GenesisHydra.java | 2 +- .../src/mage/cards/h/HopeOfGhirapur.java | 2 +- Mage.Sets/src/mage/cards/i/IceCauldron.java | 2 +- .../src/mage/cards/l/LabyrinthGuardian.java | 2 +- .../src/mage/cards/m/MeletisCharlatan.java | 2 +- .../mage/cards/m/MetzaliTowerOfTriumph.java | 2 +- Mage.Sets/src/mage/cards/p/PawnOfUlamog.java | 2 +- .../src/mage/cards/p/PhyrexianProcessor.java | 2 +- .../src/mage/cards/p/PsychicRebuttal.java | 2 +- .../src/mage/cards/p/PyromancersGauntlet.java | 2 +- .../src/mage/cards/p/PyxisOfPandemonium.java | 4 +- .../src/mage/cards/s/SilverfurPartisan.java | 2 +- Mage.Sets/src/mage/cards/s/Solemnity.java | 2 +- .../src/mage/cards/s/SoulfireGrandMaster.java | 2 +- Mage.Sets/src/mage/cards/s/SparkFiend.java | 4 +- .../src/mage/cards/s/SpectralPrison.java | 2 +- Mage.Sets/src/mage/cards/s/SpellShrivel.java | 2 +- Mage.Sets/src/mage/cards/s/SummoningTrap.java | 3 +- Mage.Sets/src/mage/cards/s/Syncopate.java | 2 +- Mage.Sets/src/mage/cards/t/ThoughtPrison.java | 2 +- .../mage/cards/t/TreacherousPitDweller.java | 3 +- Mage.Sets/src/mage/cards/t/TritonTactics.java | 8 +- Mage.Sets/src/mage/cards/w/WildDefiance.java | 2 +- .../src/mage/cards/w/WispweaverAngel.java | 2 +- Mage.Sets/src/mage/cards/w/WorldAtWar.java | 2 +- .../src/mage/cards/y/YawgmothsAgenda.java | 2 +- Mage.Sets/src/mage/cards/y/YawgmothsWill.java | 2 +- ...eToOneOrMoreCreaturesTriggeredAbility.java | 2 +- ...llCounteredControllerTriggeredAbility.java | 124 +++++++++--------- .../condition/common/MeldCondition.java | 80 +++++------ .../dynamicvalue/common/SunburstCount.java | 2 +- .../common/CastSourceTriggeredAbility.java | 2 +- .../effects/common/CopyTargetSpellEffect.java | 2 +- ...efieldUnderOwnerControlAttachedEffect.java | 2 +- ...tlefieldUnderOwnerControlTargetEffect.java | 2 +- ...lefieldUnderYourControlAttachedEffect.java | 2 +- ...ttlefieldUnderYourControlTargetEffect.java | 2 +- .../common/ReturnToHandAttachedEffect.java | 2 +- .../effects/common/TransformSourceEffect.java | 2 +- .../common/UntapAllThatAttackedEffect.java | 2 +- .../abilities/keyword/AftermathAbility.java | 4 +- .../abilities/keyword/ConspireAbility.java | 2 +- .../mage/abilities/keyword/HauntAbility.java | 2 +- .../abilities/keyword/ReplicateAbility.java | 2 +- .../main/java/mage/game/command/Plane.java | 2 +- .../JaceCunningCastawayIllusionToken.java | 2 +- .../src/main/java/mage/target/TargetImpl.java | 2 +- .../main/java/mage/target/TargetSource.java | 2 +- .../common/CastSpellYourLastTurnWatcher.java | 2 +- 72 files changed, 184 insertions(+), 186 deletions(-) diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index 008a3b654ab..34377722947 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -538,7 +538,7 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { // Always hide not hidden popup window or enlarged card view if a frame is set to active try { ActionCallback callback = Plugins.instance.getActionCallback(); - if (callback != null && callback instanceof MageActionCallback) { + if (callback instanceof MageActionCallback) { ((MageActionCallback) callback).hideEnlargedCard(); } Component container = MageFrame.getUI().getComponent(MageComponents.POPUP_CONTAINER); diff --git a/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogManager.java b/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogManager.java index 2f7f69998e4..329ff3ec0ed 100644 --- a/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogManager.java +++ b/Mage.Client/src/main/java/mage/client/components/ext/dlg/DialogManager.java @@ -319,7 +319,7 @@ public class DialogManager extends JComponent implements MouseListener, if (e.getButton() == MouseEvent.BUTTON1) { j = (JComponent) getComponentAt(e.getX(), e.getY()); - if (j != null && j instanceof DialogContainer) { + if (j instanceof DialogContainer) { rec = j.getBounds(); bDragged = true; mx = e.getX(); diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java b/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java index bea5f97b111..fd53051191c 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/collection/viewer/MageBook.java @@ -530,7 +530,7 @@ public class MageBook extends JComponent { Class c = Class.forName(className); Constructor cons = c.getConstructor(); Object newToken = cons.newInstance(); - if (newToken != null && newToken instanceof mage.game.permanent.token.Token) { + if (newToken instanceof Token) { ((Token) newToken).setExpansionSetCodeForImage(set); ((Token) newToken).setOriginalExpansionSetCode(set); ((Token) newToken).setTokenType(token.getType()); @@ -580,7 +580,7 @@ public class MageBook extends JComponent { Class c = Class.forName(className); Constructor cons = c.getConstructor(); Object newEmblem = cons.newInstance(); - if (newEmblem != null && newEmblem instanceof mage.game.command.Emblem) { + if (newEmblem instanceof Emblem) { ((Emblem) newEmblem).setExpansionSetCodeForImage(set); emblems.add((Emblem) newEmblem); @@ -637,7 +637,7 @@ public class MageBook extends JComponent { Class c = Class.forName(className); Constructor cons = c.getConstructor(); Object newPlane = cons.newInstance(); - if (newPlane != null && newPlane instanceof mage.game.command.Plane) { + if (newPlane instanceof Plane) { ((Plane) newPlane).setExpansionSetCodeForImage(set); planes.add((Plane) newPlane); diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/table/TableModel.java b/Mage.Client/src/main/java/mage/client/deckeditor/table/TableModel.java index c2b24748e35..20e6513c1de 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/table/TableModel.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/table/TableModel.java @@ -369,7 +369,7 @@ public class TableModel extends AbstractTableModel implements ICardGrid { if (!card.getId().equals(bigCard.getCardId())) { if (!MageFrame.isLite()) { Image image = Plugins.instance.getOriginalImage(card); - if (image != null && image instanceof BufferedImage) { + if (image instanceof BufferedImage) { // XXX: scaled to fit width bigCard.setCard(card.getId(), EnlargeMode.NORMAL, image, new ArrayList<>(), false); } else { diff --git a/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java b/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java index 4d69a16ce86..344e62c1b6e 100644 --- a/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java +++ b/Mage.Client/src/main/java/mage/client/plugins/adapters/MageActionCallback.java @@ -617,7 +617,7 @@ public class MageActionCallback implements ActionCallback { } private void displayCardInfo(MageCard mageCard, Image image, BigCard bigCard) { - if (image != null && image instanceof BufferedImage) { + if (image instanceof BufferedImage) { // XXX: scaled to fit width bigCard.setCard(mageCard.getOriginal().getId(), enlargeMode, image, mageCard.getOriginal().getRules(), mageCard.getOriginal().isToRotate()); // if it's an ability, show only the ability text as overlay diff --git a/Mage.Client/src/main/java/mage/client/util/gui/countryBox/CountryItemEditor.java b/Mage.Client/src/main/java/mage/client/util/gui/countryBox/CountryItemEditor.java index b7f476bc272..75f66353242 100644 --- a/Mage.Client/src/main/java/mage/client/util/gui/countryBox/CountryItemEditor.java +++ b/Mage.Client/src/main/java/mage/client/util/gui/countryBox/CountryItemEditor.java @@ -47,7 +47,7 @@ public class CountryItemEditor extends BasicComboBoxEditor { @Override public void setItem(Object item) { - if (item == null || !(item instanceof String[])) { + if (!(item instanceof String[])) { return; } diff --git a/Mage.Client/src/main/java/org/mage/card/arcane/CardPanel.java b/Mage.Client/src/main/java/org/mage/card/arcane/CardPanel.java index a124d63fa05..9c670224dd8 100644 --- a/Mage.Client/src/main/java/org/mage/card/arcane/CardPanel.java +++ b/Mage.Client/src/main/java/org/mage/card/arcane/CardPanel.java @@ -800,7 +800,7 @@ public abstract class CardPanel extends MagePermanent implements MouseListener, // this update removes the isChoosable mark from targetCardsInLibrary // so only done for permanents because it's needed to redraw counters in different size, if window size was changed // no perfect solution yet (maybe also other not wanted effects for PermanentView objects) - if (updateCard != null && (updateCard instanceof PermanentView)) { + if ((updateCard instanceof PermanentView)) { update(updateCard); } } diff --git a/Mage.Common/src/main/java/mage/remote/Connection.java b/Mage.Common/src/main/java/mage/remote/Connection.java index 6022fcad8dc..ecc7dd44166 100644 --- a/Mage.Common/src/main/java/mage/remote/Connection.java +++ b/Mage.Common/src/main/java/mage/remote/Connection.java @@ -225,7 +225,7 @@ public class Connection { for (InterfaceAddress addr : iface.getInterfaceAddresses()) { if (addr != null) { InetAddress iaddr = addr.getAddress(); - if (iaddr != null && iaddr instanceof Inet4Address) { + if (iaddr instanceof Inet4Address) { return iaddr; } } diff --git a/Mage.Common/src/main/java/mage/utils/CompressUtil.java b/Mage.Common/src/main/java/mage/utils/CompressUtil.java index 39fa5fdf6d9..eeef7533de1 100644 --- a/Mage.Common/src/main/java/mage/utils/CompressUtil.java +++ b/Mage.Common/src/main/java/mage/utils/CompressUtil.java @@ -39,7 +39,7 @@ public final class CompressUtil { * @return Decompressed object */ public static Object decompress(Object data) { - if (data == null || !(data instanceof ZippedObject)) { + if (!(data instanceof ZippedObject)) { return data; } return ((ZippedObject) data).unzip(); diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ma/optimizers/impl/LevelUpOptimizer.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ma/optimizers/impl/LevelUpOptimizer.java index c3c8934fa1e..545851185a8 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ma/optimizers/impl/LevelUpOptimizer.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ma/optimizers/impl/LevelUpOptimizer.java @@ -27,7 +27,7 @@ public class LevelUpOptimizer extends BaseTreeOptimizer { for (Ability ability : actions) { if (ability instanceof LevelUpAbility) { Permanent permanent = game.getPermanent(ability.getSourceId()); - if (permanent != null && permanent instanceof PermanentCard) { + if (permanent instanceof PermanentCard) { PermanentCard leveler = (PermanentCard) permanent; // check already existing Level counters and compare to maximum that make sense if (permanent.getCounters(game).getCount(CounterType.LEVEL) >= leveler.getMaxLevelCounters()) { diff --git a/Mage.Server/src/main/java/mage/server/util/SystemUtil.java b/Mage.Server/src/main/java/mage/server/util/SystemUtil.java index 0d0941623e1..395becdf947 100644 --- a/Mage.Server/src/main/java/mage/server/util/SystemUtil.java +++ b/Mage.Server/src/main/java/mage/server/util/SystemUtil.java @@ -408,7 +408,7 @@ public final class SystemUtil { Class c = Class.forName("mage.game.permanent.token." + command.cardName); Constructor cons = c.getConstructor(); Object token = cons.newInstance(); - if (token != null && token instanceof mage.game.permanent.token.Token) { + if (token instanceof mage.game.permanent.token.Token) { ((mage.game.permanent.token.Token) token).putOntoBattlefield(command.Amount, game, null, player.getId(), false, false); continue; } @@ -417,7 +417,7 @@ public final class SystemUtil { Class c = Class.forName("mage.game.command.emblems." + command.cardName); Constructor cons = c.getConstructor(); Object emblem = cons.newInstance(); - if (emblem != null && emblem instanceof mage.game.command.Emblem) { + if (emblem instanceof mage.game.command.Emblem) { ((mage.game.command.Emblem) emblem).setControllerId(player.getId()); game.addEmblem((mage.game.command.Emblem) emblem, null, player.getId()); continue; @@ -427,7 +427,7 @@ public final class SystemUtil { Class c = Class.forName("mage.game.command.planes." + command.cardName); Constructor cons = c.getConstructor(); Object plane = cons.newInstance(); - if (plane != null && plane instanceof mage.game.command.Plane) { + if (plane instanceof mage.game.command.Plane) { ((mage.game.command.Plane) plane).setControllerId(player.getId()); game.addPlane((mage.game.command.Plane) plane, null, player.getId()); continue; diff --git a/Mage.Sets/src/mage/cards/b/Berserk.java b/Mage.Sets/src/mage/cards/b/Berserk.java index f193dcae694..3d38da94d83 100644 --- a/Mage.Sets/src/mage/cards/b/Berserk.java +++ b/Mage.Sets/src/mage/cards/b/Berserk.java @@ -171,7 +171,7 @@ class BerserkDelayedDestroyEffect extends OneShotEffect { Permanent permanent = game.getPermanent(this.getTargetPointer().getFirst(game, source)); if (permanent != null) { Watcher watcher = game.getState().getWatchers().get(AttackedThisTurnWatcher.class.getSimpleName()); - if (watcher != null && watcher instanceof AttackedThisTurnWatcher) { + if (watcher instanceof AttackedThisTurnWatcher) { if (((AttackedThisTurnWatcher) watcher).getAttackedThisTurnCreatures().contains(new MageObjectReference(permanent, game))) { return permanent.destroy(source.getSourceId(), game, false); } diff --git a/Mage.Sets/src/mage/cards/b/BuzzingWhackADoodle.java b/Mage.Sets/src/mage/cards/b/BuzzingWhackADoodle.java index 48c26262d3e..1c2b59519b3 100644 --- a/Mage.Sets/src/mage/cards/b/BuzzingWhackADoodle.java +++ b/Mage.Sets/src/mage/cards/b/BuzzingWhackADoodle.java @@ -136,7 +136,7 @@ class WhackCondition extends IntCompareCondition { @Override protected int getInputValue(Game game, Ability source) { Object object = game.getState().getValue("whack" + source.getSourceId()); - if (object != null && object instanceof Boolean && (Boolean) object) { + if (object instanceof Boolean && (Boolean) object) { return 1; } return 0; @@ -157,7 +157,7 @@ class DoodleCondition extends IntCompareCondition { @Override protected int getInputValue(Game game, Ability source) { Object object = game.getState().getValue("doodle" + source.getSourceId()); - if (object != null && object instanceof Boolean && (Boolean) object) { + if (object instanceof Boolean && (Boolean) object) { return 1; } return 0; @@ -178,7 +178,7 @@ class BuzzCondition extends IntCompareCondition { @Override protected int getInputValue(Game game, Ability source) { Object object = game.getState().getValue("buzz" + source.getSourceId()); - if (object != null && object instanceof Boolean && (Boolean) object) { + if (object instanceof Boolean && (Boolean) object) { return 1; } return 0; diff --git a/Mage.Sets/src/mage/cards/c/ChainOfSilence.java b/Mage.Sets/src/mage/cards/c/ChainOfSilence.java index 92d48f1e294..b9848d13baf 100644 --- a/Mage.Sets/src/mage/cards/c/ChainOfSilence.java +++ b/Mage.Sets/src/mage/cards/c/ChainOfSilence.java @@ -81,7 +81,7 @@ class ChainOfSilenceEffect extends OneShotEffect { Spell spell = game.getStack().getSpell(source.getSourceId()); if (spell != null) { StackObject newStackObject = spell.createCopyOnStack(game, source, player.getId(), true); - if (newStackObject != null && newStackObject instanceof Spell) { + if (newStackObject instanceof Spell) { String activateMessage = ((Spell) newStackObject).getActivatedMessage(game); if (activateMessage.startsWith(" casts ")) { activateMessage = activateMessage.substring(6); diff --git a/Mage.Sets/src/mage/cards/c/ChainOfVapor.java b/Mage.Sets/src/mage/cards/c/ChainOfVapor.java index f5abf3ace48..d6b94d8838c 100644 --- a/Mage.Sets/src/mage/cards/c/ChainOfVapor.java +++ b/Mage.Sets/src/mage/cards/c/ChainOfVapor.java @@ -78,7 +78,7 @@ class ChainOfVaporEffect extends OneShotEffect { Spell spell = game.getStack().getSpell(source.getSourceId()); if (spell != null) { StackObject newStackObject = spell.createCopyOnStack(game, source, player.getId(), true); - if (newStackObject != null && newStackObject instanceof Spell) { + if (newStackObject instanceof Spell) { String activateMessage = ((Spell) newStackObject).getActivatedMessage(game); if (activateMessage.startsWith(" casts ")) { activateMessage = activateMessage.substring(6); diff --git a/Mage.Sets/src/mage/cards/c/ChainStasis.java b/Mage.Sets/src/mage/cards/c/ChainStasis.java index f49ea83cc09..295f1bffa14 100644 --- a/Mage.Sets/src/mage/cards/c/ChainStasis.java +++ b/Mage.Sets/src/mage/cards/c/ChainStasis.java @@ -80,7 +80,7 @@ class ChainStasisEffect extends OneShotEffect { Spell spell = game.getStack().getSpell(source.getSourceId()); if (spell != null) { StackObject newStackObject = spell.createCopyOnStack(game, source, player.getId(), true); - if (newStackObject != null && newStackObject instanceof Spell) { + if (newStackObject instanceof Spell) { String activateMessage = ((Spell) newStackObject).getActivatedMessage(game); if (activateMessage.startsWith(" casts ")) { activateMessage = activateMessage.substring(6); diff --git a/Mage.Sets/src/mage/cards/c/ChorusOfTheConclave.java b/Mage.Sets/src/mage/cards/c/ChorusOfTheConclave.java index f49e01f4599..31bb27a1931 100644 --- a/Mage.Sets/src/mage/cards/c/ChorusOfTheConclave.java +++ b/Mage.Sets/src/mage/cards/c/ChorusOfTheConclave.java @@ -98,7 +98,7 @@ class ChorusOfTheConclaveReplacementEffect extends ReplacementEffectImpl { // save the x value to be available for ETB replacement effect Object object = game.getState().getValue("spellX" + source.getSourceId()); Map spellX; - if (object != null && object instanceof Map) { + if (object instanceof Map) { spellX = (Map) object; } else { spellX = new HashMap<>(); diff --git a/Mage.Sets/src/mage/cards/e/EngineeredExplosives.java b/Mage.Sets/src/mage/cards/e/EngineeredExplosives.java index def0376ffce..936d8387677 100644 --- a/Mage.Sets/src/mage/cards/e/EngineeredExplosives.java +++ b/Mage.Sets/src/mage/cards/e/EngineeredExplosives.java @@ -70,7 +70,7 @@ class EngineeredExplosivesEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { MageObject engineeredExplosives = game.getLastKnownInformation(source.getSourceId(), Zone.BATTLEFIELD); - if(engineeredExplosives != null && engineeredExplosives instanceof Permanent){ + if(engineeredExplosives instanceof Permanent){ int count = ((Permanent)engineeredExplosives).getCounters(game).getCount(CounterType.CHARGE); for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getSourceId(), game)) { if(permanent.getConvertedManaCost() == count){ diff --git a/Mage.Sets/src/mage/cards/e/EssenceFlux.java b/Mage.Sets/src/mage/cards/e/EssenceFlux.java index f2802fc6b1f..8364d113e65 100644 --- a/Mage.Sets/src/mage/cards/e/EssenceFlux.java +++ b/Mage.Sets/src/mage/cards/e/EssenceFlux.java @@ -77,7 +77,7 @@ class EssenceFluxEffect extends OneShotEffect { cardsToBattlefield.add(targetId); } else { Card card = game.getCard(targetId); - if (card != null && card instanceof MeldCard) { + if (card instanceof MeldCard) { MeldCard meldCard = (MeldCard) card; Card topCard = meldCard.getTopHalfCard(); Card bottomCard = meldCard.getBottomHalfCard(); diff --git a/Mage.Sets/src/mage/cards/f/FiresongAndSunspeaker.java b/Mage.Sets/src/mage/cards/f/FiresongAndSunspeaker.java index 9c4dcf83fcc..3d396bc5643 100644 --- a/Mage.Sets/src/mage/cards/f/FiresongAndSunspeaker.java +++ b/Mage.Sets/src/mage/cards/f/FiresongAndSunspeaker.java @@ -87,7 +87,7 @@ class FiresongAndSunspeakerTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { MageObject object = game.getObject(event.getSourceId()); - if (object != null && object instanceof Spell) { + if (object instanceof Spell) { if (event.getTargetId().equals(this.getControllerId()) && object.getColor(game).contains(ObjectColor.WHITE) && (object.isInstant() diff --git a/Mage.Sets/src/mage/cards/f/ForbiddenCrypt.java b/Mage.Sets/src/mage/cards/f/ForbiddenCrypt.java index 06678f2232e..3f1471760d6 100644 --- a/Mage.Sets/src/mage/cards/f/ForbiddenCrypt.java +++ b/Mage.Sets/src/mage/cards/f/ForbiddenCrypt.java @@ -151,7 +151,7 @@ class ForbiddenCryptPutIntoYourGraveyardReplacementEffect extends ReplacementEff Card card = game.getCard(event.getTargetId()); if (card != null && card.isOwnedBy(source.getControllerId())) { Permanent permanent = ((ZoneChangeEvent) event).getTarget(); - if (permanent == null || !(permanent instanceof PermanentToken)) { + if (!(permanent instanceof PermanentToken)) { return true; } } diff --git a/Mage.Sets/src/mage/cards/f/ForsakenWastes.java b/Mage.Sets/src/mage/cards/f/ForsakenWastes.java index 0939aab1703..6fb1308f391 100644 --- a/Mage.Sets/src/mage/cards/f/ForsakenWastes.java +++ b/Mage.Sets/src/mage/cards/f/ForsakenWastes.java @@ -73,7 +73,7 @@ class ForsakenWastesTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { MageObject eventSourceObject = game.getObject(event.getSourceId()); - if (eventSourceObject != null && event.getTargetId().equals(this.getSourceId())&& eventSourceObject instanceof Spell ) { + if (event.getTargetId().equals(this.getSourceId()) && eventSourceObject instanceof Spell) { getEffects().get(0).setTargetPointer(new FixedTarget(event.getPlayerId())); return true; } diff --git a/Mage.Sets/src/mage/cards/g/GOTOJAIL.java b/Mage.Sets/src/mage/cards/g/GOTOJAIL.java index bd29803529f..a7977281ffb 100644 --- a/Mage.Sets/src/mage/cards/g/GOTOJAIL.java +++ b/Mage.Sets/src/mage/cards/g/GOTOJAIL.java @@ -150,7 +150,7 @@ class GoToJailUpkeepEffect extends OneShotEffect { Permanent permanent = (Permanent) source.getSourceObjectIfItStillExists(game); - if (sourceObject != null && sourceObject instanceof Permanent && permanent != null) { + if (sourceObject instanceof Permanent && permanent != null) { UUID opponentId = (UUID) game.getState().getValue(sourceObject.getId().toString() + ChooseOpponentEffect.VALUE_KEY); Player opponent = game.getPlayer(opponentId); diff --git a/Mage.Sets/src/mage/cards/g/GenesisHydra.java b/Mage.Sets/src/mage/cards/g/GenesisHydra.java index 1a9527827f5..be84c1942d8 100644 --- a/Mage.Sets/src/mage/cards/g/GenesisHydra.java +++ b/Mage.Sets/src/mage/cards/g/GenesisHydra.java @@ -71,7 +71,7 @@ class GenesisHydraPutOntoBattlefieldEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player controller = game.getPlayer(source.getControllerId()); Object obj = getValue(CastSourceTriggeredAbility.SOURCE_CAST_SPELL_ABILITY); - if (controller != null && obj != null && obj instanceof SpellAbility) { + if (controller != null && obj instanceof SpellAbility) { int count = ((SpellAbility) obj).getManaCostsToPay().getX(); if (count > 0) { Cards cards = new CardsImpl(controller.getLibrary().getTopCards(game, count)); diff --git a/Mage.Sets/src/mage/cards/h/HopeOfGhirapur.java b/Mage.Sets/src/mage/cards/h/HopeOfGhirapur.java index 0a31b9a4fbf..5df2aeefb87 100644 --- a/Mage.Sets/src/mage/cards/h/HopeOfGhirapur.java +++ b/Mage.Sets/src/mage/cards/h/HopeOfGhirapur.java @@ -184,7 +184,7 @@ class HopeOfGhirapurCombatDamageWatcher extends Watcher { public boolean playerGotCombatDamage(UUID objectId, UUID playerId, Game game) { StackObject stackObject = game.getState().getStack().getStackObject(objectId); MageObjectReference mor; - if (stackObject != null && stackObject instanceof StackAbility) { + if (stackObject instanceof StackAbility) { // This is neccessary because the source object was sacrificed as cost and the correct zone change counter for target calid check can only be get from stack mor = new MageObjectReference(objectId, ((StackAbility) stackObject).getSourceObjectZoneChangeCounter(), game); } else { diff --git a/Mage.Sets/src/mage/cards/i/IceCauldron.java b/Mage.Sets/src/mage/cards/i/IceCauldron.java index e0adbe1386c..bacaf44c115 100644 --- a/Mage.Sets/src/mage/cards/i/IceCauldron.java +++ b/Mage.Sets/src/mage/cards/i/IceCauldron.java @@ -265,7 +265,7 @@ class IceCauldronManaCondition implements Condition { public boolean apply(Game game, Ability source) { if (source instanceof SpellAbility) { Card card = game.getCard(source.getSourceId()); - if (card != null && exiledCard != null && card.equals(exiledCard)) { + if (card != null && card.equals(exiledCard)) { return true; } } diff --git a/Mage.Sets/src/mage/cards/l/LabyrinthGuardian.java b/Mage.Sets/src/mage/cards/l/LabyrinthGuardian.java index bbc39d2bad1..691561a52f1 100644 --- a/Mage.Sets/src/mage/cards/l/LabyrinthGuardian.java +++ b/Mage.Sets/src/mage/cards/l/LabyrinthGuardian.java @@ -74,7 +74,7 @@ class LabyrinthGuardianTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { MageObject eventSourceObject = game.getObject(event.getSourceId()); - if (eventSourceObject != null && event.getTargetId().equals(this.getSourceId()) && eventSourceObject instanceof Spell) { + if (event.getTargetId().equals(this.getSourceId()) && eventSourceObject instanceof Spell) { getEffects().get(0).setTargetPointer(new FixedTarget(event.getPlayerId())); return true; } diff --git a/Mage.Sets/src/mage/cards/m/MeletisCharlatan.java b/Mage.Sets/src/mage/cards/m/MeletisCharlatan.java index 32170f2ac65..d88bb2b928c 100644 --- a/Mage.Sets/src/mage/cards/m/MeletisCharlatan.java +++ b/Mage.Sets/src/mage/cards/m/MeletisCharlatan.java @@ -71,7 +71,7 @@ class MeletisCharlatanCopyTargetSpellEffect extends OneShotEffect { if (spell != null) { StackObject newStackObject = spell.createCopyOnStack(game, source, spell.getControllerId(), true); Player player = game.getPlayer(spell.getControllerId()); - if (player != null && newStackObject != null && newStackObject instanceof Spell) { + if (player != null && newStackObject instanceof Spell) { String activateMessage = ((Spell) newStackObject).getActivatedMessage(game); if (activateMessage.startsWith(" casts ")) { activateMessage = activateMessage.substring(6); diff --git a/Mage.Sets/src/mage/cards/m/MetzaliTowerOfTriumph.java b/Mage.Sets/src/mage/cards/m/MetzaliTowerOfTriumph.java index 562ca786fa3..0b77db95408 100644 --- a/Mage.Sets/src/mage/cards/m/MetzaliTowerOfTriumph.java +++ b/Mage.Sets/src/mage/cards/m/MetzaliTowerOfTriumph.java @@ -91,7 +91,7 @@ class MetzaliTowerOfTriumphEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Watcher watcher = game.getState().getWatchers().get(AttackedThisTurnWatcher.class.getSimpleName()); - if (watcher != null && watcher instanceof AttackedThisTurnWatcher) { + if (watcher instanceof AttackedThisTurnWatcher) { Set attackedThisTurn = ((AttackedThisTurnWatcher) watcher).getAttackedThisTurnCreatures(); List available = new ArrayList<>(); for (MageObjectReference mor : attackedThisTurn) { diff --git a/Mage.Sets/src/mage/cards/p/PawnOfUlamog.java b/Mage.Sets/src/mage/cards/p/PawnOfUlamog.java index 0ef7b2de1c2..7c10dd12713 100644 --- a/Mage.Sets/src/mage/cards/p/PawnOfUlamog.java +++ b/Mage.Sets/src/mage/cards/p/PawnOfUlamog.java @@ -70,7 +70,7 @@ class PawnOfUlamogTriggeredAbility extends TriggeredAbilityImpl { public boolean checkTrigger(GameEvent event, Game game) { UUID targetId = event.getTargetId(); MageObject card = game.getLastKnownInformation(targetId, Zone.BATTLEFIELD); - if (card != null && card instanceof Permanent && !(card instanceof PermanentToken)) { + if (card instanceof Permanent && !(card instanceof PermanentToken)) { Permanent permanent = (Permanent) card; ZoneChangeEvent zEvent = (ZoneChangeEvent) event; if (zEvent.getFromZone() == Zone.BATTLEFIELD && zEvent.getToZone() == Zone.GRAVEYARD diff --git a/Mage.Sets/src/mage/cards/p/PhyrexianProcessor.java b/Mage.Sets/src/mage/cards/p/PhyrexianProcessor.java index 545e7787114..eb4d598ecf0 100644 --- a/Mage.Sets/src/mage/cards/p/PhyrexianProcessor.java +++ b/Mage.Sets/src/mage/cards/p/PhyrexianProcessor.java @@ -99,7 +99,7 @@ class PhyrexianProcessorCreateTokenEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { String key = CardUtil.getCardZoneString("lifePaid", source.getSourceId(), game); Object object = game.getState().getValue(key); - if(object != null && object instanceof Integer) { + if(object instanceof Integer) { int lifePaid = (int) object; MinionToken token = new MinionToken(); token.getPower().modifyBaseValue(lifePaid); diff --git a/Mage.Sets/src/mage/cards/p/PsychicRebuttal.java b/Mage.Sets/src/mage/cards/p/PsychicRebuttal.java index 78ed585a423..1e85aba50da 100644 --- a/Mage.Sets/src/mage/cards/p/PsychicRebuttal.java +++ b/Mage.Sets/src/mage/cards/p/PsychicRebuttal.java @@ -85,7 +85,7 @@ class PsychicRebuttalEffect extends OneShotEffect { && controller.chooseUse(Outcome.PlayForFree, "Copy " + spell.getName() + " (you may choose new targets for the copy)?", source, game)) { StackObject newStackObject = spell.createCopyOnStack(game, source, source.getControllerId(), true); - if (newStackObject != null && newStackObject instanceof Spell) { + if (newStackObject instanceof Spell) { String activateMessage = ((Spell) newStackObject).getActivatedMessage(game); if (activateMessage.startsWith(" casts ")) { activateMessage = activateMessage.substring(6); diff --git a/Mage.Sets/src/mage/cards/p/PyromancersGauntlet.java b/Mage.Sets/src/mage/cards/p/PyromancersGauntlet.java index 8c6055dc4bb..6c6c1c9b4cd 100644 --- a/Mage.Sets/src/mage/cards/p/PyromancersGauntlet.java +++ b/Mage.Sets/src/mage/cards/p/PyromancersGauntlet.java @@ -62,7 +62,7 @@ class PyromancersGauntletReplacementEffect extends ReplacementEffectImpl { @Override public boolean applies(GameEvent event, Ability source, Game game) { MageObject object = game.getObject(event.getSourceId()); - if (object != null && object instanceof Spell) { + if (object instanceof Spell) { if (((Spell) object).isControlledBy(source.getControllerId()) && (object.isInstant() || object.isSorcery())){ diff --git a/Mage.Sets/src/mage/cards/p/PyxisOfPandemonium.java b/Mage.Sets/src/mage/cards/p/PyxisOfPandemonium.java index 99bc8263508..9c7e5e2455e 100644 --- a/Mage.Sets/src/mage/cards/p/PyxisOfPandemonium.java +++ b/Mage.Sets/src/mage/cards/p/PyxisOfPandemonium.java @@ -73,7 +73,7 @@ class PyxisOfPandemoniumExileEffect extends OneShotEffect { Map exileIds; String valueKey = CardUtil.getObjectZoneString("exileIds", sourceObject, game); Object object = game.getState().getValue(valueKey); - if (object != null && object instanceof Map) { + if (object instanceof Map) { exileIds = (Map) object; } else { exileIds = new HashMap<>(); @@ -123,7 +123,7 @@ class PyxisOfPandemoniumPutOntoBattlefieldEffect extends OneShotEffect { Map exileIds; String valueKey = CardUtil.getObjectZoneString("exileIds", sourceObject, game); Object object = game.getState().getValue(valueKey); - if (object != null && object instanceof Map) { + if (object instanceof Map) { exileIds = (Map) object; } else { return true; diff --git a/Mage.Sets/src/mage/cards/s/SilverfurPartisan.java b/Mage.Sets/src/mage/cards/s/SilverfurPartisan.java index 4caebce8f99..82648348dab 100644 --- a/Mage.Sets/src/mage/cards/s/SilverfurPartisan.java +++ b/Mage.Sets/src/mage/cards/s/SilverfurPartisan.java @@ -77,7 +77,7 @@ class CreaturesYouControlBecomesTargetTriggeredAbility extends TriggeredAbilityI Permanent permanent = game.getPermanent(event.getTargetId()); if (permanent != null && permanent.isControlledBy(this.controllerId) && (permanent.hasSubtype(SubType.WOLF, game) || permanent.hasSubtype(SubType.WEREWOLF, game))) { MageObject object = game.getObject(event.getSourceId()); - if (object != null && object instanceof Spell) { + if (object instanceof Spell) { Card c = (Spell) object; if (c.isInstant() || c.isSorcery()) { if (getTargets().isEmpty()) { diff --git a/Mage.Sets/src/mage/cards/s/Solemnity.java b/Mage.Sets/src/mage/cards/s/Solemnity.java index b930f65297f..0ce74644dac 100644 --- a/Mage.Sets/src/mage/cards/s/Solemnity.java +++ b/Mage.Sets/src/mage/cards/s/Solemnity.java @@ -123,7 +123,7 @@ class SolemnityEffect2 extends ReplacementEffectImpl { Permanent permanent2 = game.getPermanent(event.getTargetId()); Permanent permanent3 = game.getPermanentEntering(event.getTargetId()); - if (object != null && object instanceof Permanent) { + if (object instanceof Permanent) { if (filter.match((Permanent) object, game)) { return true; } diff --git a/Mage.Sets/src/mage/cards/s/SoulfireGrandMaster.java b/Mage.Sets/src/mage/cards/s/SoulfireGrandMaster.java index 015af98ca9c..abd70447d89 100644 --- a/Mage.Sets/src/mage/cards/s/SoulfireGrandMaster.java +++ b/Mage.Sets/src/mage/cards/s/SoulfireGrandMaster.java @@ -111,7 +111,7 @@ class SoulfireGrandMasterCastFromHandReplacementEffect extends ReplacementEffect @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { MageObject mageObject = game.getObject(spellId); - if (mageObject == null || !(mageObject instanceof Spell) || ((Spell) mageObject).isCopiedSpell()) { + if (!(mageObject instanceof Spell) || ((Spell) mageObject).isCopiedSpell()) { return false; } else { Card sourceCard = game.getCard(spellId); diff --git a/Mage.Sets/src/mage/cards/s/SparkFiend.java b/Mage.Sets/src/mage/cards/s/SparkFiend.java index 0de02f16fdb..3f55cc67b3f 100644 --- a/Mage.Sets/src/mage/cards/s/SparkFiend.java +++ b/Mage.Sets/src/mage/cards/s/SparkFiend.java @@ -69,7 +69,7 @@ class SparkFiendEffect extends OneShotEffect { if (controller != null) { int roll = controller.rollDice(game, 6) + controller.rollDice(game, 6); MageObject mageObject = game.getObject(source.getSourceId()); - if (mageObject != null && mageObject instanceof Permanent) { + if (mageObject instanceof Permanent) { Permanent sourcePermanent = (Permanent) mageObject; if (roll == 2 || roll == 3 || roll == 12) { // sacrifice @@ -114,7 +114,7 @@ class SparkFiendUpkeepEffect extends OneShotEffect { && (Integer) game.getState().getValue("SparkFiend" + source.getSourceId().toString()) != 0) { int roll = controller.rollDice(game, 6) + controller.rollDice(game, 6); MageObject mageObject = game.getObject(source.getSourceId()); - if (mageObject != null && mageObject instanceof Permanent) { + if (mageObject instanceof Permanent) { Permanent sourcePermanent = (Permanent) mageObject; if (roll == 7) { // sacrifice diff --git a/Mage.Sets/src/mage/cards/s/SpectralPrison.java b/Mage.Sets/src/mage/cards/s/SpectralPrison.java index bac2d6a6b64..f502fd33e08 100644 --- a/Mage.Sets/src/mage/cards/s/SpectralPrison.java +++ b/Mage.Sets/src/mage/cards/s/SpectralPrison.java @@ -80,7 +80,7 @@ class SpectralPrisonAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { MageObject eventSourceObject = game.getObject(event.getSourceId()); - if (eventSourceObject != null && eventSourceObject instanceof Spell) { + if (eventSourceObject instanceof Spell) { Permanent enchantment = game.getPermanent(sourceId); if (enchantment != null && enchantment.getAttachedTo() != null) { if (event.getTargetId().equals(enchantment.getAttachedTo())) { diff --git a/Mage.Sets/src/mage/cards/s/SpellShrivel.java b/Mage.Sets/src/mage/cards/s/SpellShrivel.java index 9da3aaafe41..6ab606a1991 100644 --- a/Mage.Sets/src/mage/cards/s/SpellShrivel.java +++ b/Mage.Sets/src/mage/cards/s/SpellShrivel.java @@ -66,7 +66,7 @@ class SpellShrivelCounterUnlessPaysEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { StackObject spell = game.getStack().getStackObject(targetPointer.getFirst(game, source)); MageObject sourceObject = source.getSourceObject(game); - if (spell != null && (spell instanceof Spell) && sourceObject != null) { + if ((spell instanceof Spell) && sourceObject != null) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { int amount = 4; diff --git a/Mage.Sets/src/mage/cards/s/SummoningTrap.java b/Mage.Sets/src/mage/cards/s/SummoningTrap.java index 31be77a83f6..8bc4391c423 100644 --- a/Mage.Sets/src/mage/cards/s/SummoningTrap.java +++ b/Mage.Sets/src/mage/cards/s/SummoningTrap.java @@ -90,8 +90,7 @@ class SummoningTrapWatcher extends Watcher { if (counteredSpell == null) { counteredSpell = (StackObject) game.getLastKnownInformation(event.getTargetId(), Zone.STACK); } - if (counteredSpell != null - && counteredSpell instanceof Spell + if (counteredSpell instanceof Spell && !players.contains(counteredSpell.getControllerId()) && counteredSpell.isCreature()) { StackObject counteringStackObject = game.getStack().getStackObject(event.getSourceId()); diff --git a/Mage.Sets/src/mage/cards/s/Syncopate.java b/Mage.Sets/src/mage/cards/s/Syncopate.java index c2ff8016d86..01dd9e88258 100644 --- a/Mage.Sets/src/mage/cards/s/Syncopate.java +++ b/Mage.Sets/src/mage/cards/s/Syncopate.java @@ -61,7 +61,7 @@ class SyncopateCounterUnlessPaysEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { StackObject spell = game.getStack().getStackObject(targetPointer.getFirst(game, source)); MageObject sourceObject = source.getSourceObject(game); - if (spell != null && (spell instanceof Spell) && sourceObject != null) { + if ((spell instanceof Spell) && sourceObject != null) { Player controller = game.getPlayer(source.getControllerId()); if (controller != null) { int amount = source.getManaCostsToPay().getX(); diff --git a/Mage.Sets/src/mage/cards/t/ThoughtPrison.java b/Mage.Sets/src/mage/cards/t/ThoughtPrison.java index 8a5e27bc067..7eef4e4083c 100644 --- a/Mage.Sets/src/mage/cards/t/ThoughtPrison.java +++ b/Mage.Sets/src/mage/cards/t/ThoughtPrison.java @@ -137,7 +137,7 @@ class ThoughtPrisonTriggeredAbility extends TriggeredAbilityImpl { Spell spell = (Spell) game.getObject(event.getTargetId()); Permanent sourcePermanent = game.getPermanent(this.getSourceId()); - if (spell != null && spell instanceof Spell) { + if (spell instanceof Spell) { if (sourcePermanent == null) { sourcePermanent = (Permanent) game.getLastKnownInformation(event.getSourceId(), Zone.BATTLEFIELD); } diff --git a/Mage.Sets/src/mage/cards/t/TreacherousPitDweller.java b/Mage.Sets/src/mage/cards/t/TreacherousPitDweller.java index d99891cb1f6..876e1d9be12 100644 --- a/Mage.Sets/src/mage/cards/t/TreacherousPitDweller.java +++ b/Mage.Sets/src/mage/cards/t/TreacherousPitDweller.java @@ -102,8 +102,7 @@ class TreacherousPitDwellerEffect extends ContinuousEffectImpl { public boolean apply(Game game, Ability source) { MageObject permanent = source.getSourceObjectIfItStillExists(game); // it can also return Card object Player targetOpponent = game.getPlayer(source.getFirstTarget()); - if (permanent != null - && (permanent instanceof Permanent) + if ((permanent instanceof Permanent) && targetOpponent != null) { return ((Permanent) permanent).changeControllerId(targetOpponent.getId(), game); } else { diff --git a/Mage.Sets/src/mage/cards/t/TritonTactics.java b/Mage.Sets/src/mage/cards/t/TritonTactics.java index d400a0fd42d..1823c39c192 100644 --- a/Mage.Sets/src/mage/cards/t/TritonTactics.java +++ b/Mage.Sets/src/mage/cards/t/TritonTactics.java @@ -89,7 +89,7 @@ class TritonTacticsUntapTargetEffect extends OneShotEffect { // save the targets for the watcher in a map with zone change counter (as the card is recast during combat it's neccessary to save with zone change counter) Map> targetMap; Object object = game.getState().getValue("targets" + source.getSourceId()); - if (object != null && object instanceof Map) { + if (object instanceof Map) { targetMap = (Map>) object; } else { targetMap = new HashMap<>(); @@ -155,7 +155,7 @@ class TritonTacticsEndOfCombatEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Map> attackerMap = null; Object object = game.getState().getValue("blockedAttackers" + source.getSourceId()); - if (object != null && object instanceof Map) { + if (object instanceof Map) { attackerMap = (Map>) object; for (Set attackerSet : attackerMap.values()) { List doNotUntapNextUntapStep = new ArrayList<>(); @@ -197,7 +197,7 @@ class BlockedCreaturesWatcher extends Watcher { if (event.getType() == GameEvent.EventType.BLOCKER_DECLARED) { Map> targetMap; Object object = game.getState().getValue("targets" + this.getSourceId().toString()); - if (object != null && object instanceof Map) { + if (object instanceof Map) { Permanent blocker = game.getPermanent(event.getSourceId()); if (blocker != null) { targetMap = (Map>) object; @@ -217,7 +217,7 @@ class BlockedCreaturesWatcher extends Watcher { Set attackers; Map> attackerMap; Object object = game.getState().getValue("blockedAttackers" + getSourceId()); - if (object != null && object instanceof Map) { + if (object instanceof Map) { attackerMap = (Map>) object; } else { attackerMap = new HashMap<>(); diff --git a/Mage.Sets/src/mage/cards/w/WildDefiance.java b/Mage.Sets/src/mage/cards/w/WildDefiance.java index 6d2fd536150..25dcefa7581 100644 --- a/Mage.Sets/src/mage/cards/w/WildDefiance.java +++ b/Mage.Sets/src/mage/cards/w/WildDefiance.java @@ -65,7 +65,7 @@ class CreaturesYouControlBecomesTargetTriggeredAbility extends TriggeredAbilityI Permanent permanent = game.getPermanent(event.getTargetId()); if (permanent != null && permanent.isControlledBy(this.controllerId) && permanent.isCreature()) { MageObject object = game.getObject(event.getSourceId()); - if (object != null && object instanceof Spell) { + if (object instanceof Spell) { Card c = (Spell) object; if (c.isInstant() || c.isSorcery()) { if (getTargets().isEmpty()) { diff --git a/Mage.Sets/src/mage/cards/w/WispweaverAngel.java b/Mage.Sets/src/mage/cards/w/WispweaverAngel.java index ca7fe9245a9..e52cbe13d4a 100644 --- a/Mage.Sets/src/mage/cards/w/WispweaverAngel.java +++ b/Mage.Sets/src/mage/cards/w/WispweaverAngel.java @@ -96,7 +96,7 @@ class WispweaverAngelEffect extends OneShotEffect { cardsToBattlefield.add(targetId); } else { Card card = game.getCard(targetId); - if (card != null && card instanceof MeldCard) { + if (card instanceof MeldCard) { MeldCard meldCard = (MeldCard) card; Card topCard = meldCard.getTopHalfCard(); Card bottomCard = meldCard.getBottomHalfCard(); diff --git a/Mage.Sets/src/mage/cards/w/WorldAtWar.java b/Mage.Sets/src/mage/cards/w/WorldAtWar.java index 3bd876d6c19..0658ecda702 100644 --- a/Mage.Sets/src/mage/cards/w/WorldAtWar.java +++ b/Mage.Sets/src/mage/cards/w/WorldAtWar.java @@ -143,7 +143,7 @@ class UntapAttackingThisTurnEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Watcher watcher = game.getState().getWatchers().get(AttackedThisTurnWatcher.class.getSimpleName()); - if (watcher != null && watcher instanceof AttackedThisTurnWatcher) { + if (watcher instanceof AttackedThisTurnWatcher) { Set attackedThisTurn = ((AttackedThisTurnWatcher) watcher).getAttackedThisTurnCreatures(); for (MageObjectReference mor : attackedThisTurn) { Permanent permanent = mor.getPermanent(game); diff --git a/Mage.Sets/src/mage/cards/y/YawgmothsAgenda.java b/Mage.Sets/src/mage/cards/y/YawgmothsAgenda.java index fbf46de1dab..d36dfbe7421 100644 --- a/Mage.Sets/src/mage/cards/y/YawgmothsAgenda.java +++ b/Mage.Sets/src/mage/cards/y/YawgmothsAgenda.java @@ -137,7 +137,7 @@ class YawgmothsAgendaReplacementEffect extends ReplacementEffectImpl { Card card = game.getCard(event.getTargetId()); if (card != null && card.isOwnedBy(source.getControllerId())) { Permanent permanent = ((ZoneChangeEvent) event).getTarget(); - if (permanent == null || !(permanent instanceof PermanentToken)) { + if (!(permanent instanceof PermanentToken)) { return true; } } diff --git a/Mage.Sets/src/mage/cards/y/YawgmothsWill.java b/Mage.Sets/src/mage/cards/y/YawgmothsWill.java index 8690dbd141a..cfdb0d77e18 100644 --- a/Mage.Sets/src/mage/cards/y/YawgmothsWill.java +++ b/Mage.Sets/src/mage/cards/y/YawgmothsWill.java @@ -127,7 +127,7 @@ class YawgmothsWillReplacementEffect extends ReplacementEffectImpl { Card card = game.getCard(event.getTargetId()); if (card != null && card.isOwnedBy(source.getControllerId())) { Permanent permanent = ((ZoneChangeEvent) event).getTarget(); - if (permanent == null || !(permanent instanceof PermanentToken)) { + if (!(permanent instanceof PermanentToken)) { return true; } } diff --git a/Mage/src/main/java/mage/abilities/common/DealsDamageToOneOrMoreCreaturesTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/DealsDamageToOneOrMoreCreaturesTriggeredAbility.java index 19fb7eacfde..7d4a85629ce 100644 --- a/Mage/src/main/java/mage/abilities/common/DealsDamageToOneOrMoreCreaturesTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/DealsDamageToOneOrMoreCreaturesTriggeredAbility.java @@ -31,7 +31,7 @@ public class DealsDamageToOneOrMoreCreaturesTriggeredAbility extends DealsDamage || game.getTurn().getStepType() == PhaseStep.FIRST_COMBAT_DAMAGE) { String stepHash = (String) game.getState().getValue("damageStep" + getOriginalId()); String newStepHash = game.getStep().getType().toString() + game.getTurnNum(); - if (stepHash == null || !newStepHash.equals(stepHash)) { + if (!newStepHash.equals(stepHash)) { // this ability did not trigger during this damage step game.getState().setValue("damageStep" + getOriginalId(), game.getStep().getType().toString() + game.getTurnNum()); return true; diff --git a/Mage/src/main/java/mage/abilities/common/SpellCounteredControllerTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/SpellCounteredControllerTriggeredAbility.java index a0d3c0f0e84..b41e1001bb6 100644 --- a/Mage/src/main/java/mage/abilities/common/SpellCounteredControllerTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/SpellCounteredControllerTriggeredAbility.java @@ -1,62 +1,62 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package mage.abilities.common; - -import mage.abilities.TriggeredAbilityImpl; -import mage.abilities.effects.Effect; -import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.game.stack.Spell; -import mage.game.stack.StackObject; - -/** - * - * @author fireshoes - */ -public class SpellCounteredControllerTriggeredAbility extends TriggeredAbilityImpl { - - public SpellCounteredControllerTriggeredAbility(Effect effect) { - this(effect, false); - } - - public SpellCounteredControllerTriggeredAbility(Effect effect, boolean optional) { - super(Zone.BATTLEFIELD, effect, optional); - } - - public SpellCounteredControllerTriggeredAbility(final SpellCounteredControllerTriggeredAbility ability) { - super(ability); - } - - @Override - public SpellCounteredControllerTriggeredAbility copy() { - return new SpellCounteredControllerTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == EventType.COUNTERED; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - StackObject stackObjectThatCountered = game.getStack().getStackObject(event.getSourceId()); - if (stackObjectThatCountered == null) { - stackObjectThatCountered = (StackObject) game.getLastKnownInformation(event.getSourceId(), Zone.STACK); - } - if (stackObjectThatCountered != null && stackObjectThatCountered.isControlledBy(getControllerId())) { - StackObject counteredStackObject = (StackObject) game.getLastKnownInformation(event.getTargetId(), Zone.STACK); - return counteredStackObject != null && (counteredStackObject instanceof Spell); - } - return false; - } - - @Override - public String getRule() { - return "Whenever a spell or ability you control counters a spell, " + super.getRule(); - } -} +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package mage.abilities.common; + +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.stack.Spell; +import mage.game.stack.StackObject; + +/** + * + * @author fireshoes + */ +public class SpellCounteredControllerTriggeredAbility extends TriggeredAbilityImpl { + + public SpellCounteredControllerTriggeredAbility(Effect effect) { + this(effect, false); + } + + public SpellCounteredControllerTriggeredAbility(Effect effect, boolean optional) { + super(Zone.BATTLEFIELD, effect, optional); + } + + public SpellCounteredControllerTriggeredAbility(final SpellCounteredControllerTriggeredAbility ability) { + super(ability); + } + + @Override + public SpellCounteredControllerTriggeredAbility copy() { + return new SpellCounteredControllerTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.COUNTERED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + StackObject stackObjectThatCountered = game.getStack().getStackObject(event.getSourceId()); + if (stackObjectThatCountered == null) { + stackObjectThatCountered = (StackObject) game.getLastKnownInformation(event.getSourceId(), Zone.STACK); + } + if (stackObjectThatCountered != null && stackObjectThatCountered.isControlledBy(getControllerId())) { + StackObject counteredStackObject = (StackObject) game.getLastKnownInformation(event.getTargetId(), Zone.STACK); + return (counteredStackObject instanceof Spell); + } + return false; + } + + @Override + public String getRule() { + return "Whenever a spell or ability you control counters a spell, " + super.getRule(); + } +} diff --git a/Mage/src/main/java/mage/abilities/condition/common/MeldCondition.java b/Mage/src/main/java/mage/abilities/condition/common/MeldCondition.java index 4b95507e5a6..603d43cc69f 100644 --- a/Mage/src/main/java/mage/abilities/condition/common/MeldCondition.java +++ b/Mage/src/main/java/mage/abilities/condition/common/MeldCondition.java @@ -1,40 +1,40 @@ - -package mage.abilities.condition.common; - -import mage.MageObject; -import mage.abilities.Ability; -import mage.abilities.condition.Condition; -import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.mageobject.NamePredicate; -import mage.filter.predicate.other.OwnerIdPredicate; -import mage.game.Game; -import mage.game.permanent.Permanent; - -/** - * - * @author emerald000 - */ -public class MeldCondition implements Condition { - - private final String meldWithName; - - public MeldCondition(String meldWithName) { - this.meldWithName = meldWithName; - } - - @Override - public boolean apply(Game game, Ability source) { - MageObject sourceMageObject = source.getSourceObjectIfItStillExists(game); - if (sourceMageObject != null && sourceMageObject instanceof Permanent) { - Permanent sourcePermanent = (Permanent) sourceMageObject; - if (sourcePermanent.isControlledBy(source.getControllerId()) - && sourcePermanent.isOwnedBy(source.getControllerId())) { - FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent(); - filter.add(new NamePredicate(this.meldWithName)); - filter.add(new OwnerIdPredicate(source.getControllerId())); - return game.getBattlefield().count(filter, source.getSourceId(), source.getControllerId(), game) > 0; - } - } - return false; - } -} + +package mage.abilities.condition.common; + +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.condition.Condition; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.mageobject.NamePredicate; +import mage.filter.predicate.other.OwnerIdPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * + * @author emerald000 + */ +public class MeldCondition implements Condition { + + private final String meldWithName; + + public MeldCondition(String meldWithName) { + this.meldWithName = meldWithName; + } + + @Override + public boolean apply(Game game, Ability source) { + MageObject sourceMageObject = source.getSourceObjectIfItStillExists(game); + if (sourceMageObject instanceof Permanent) { + Permanent sourcePermanent = (Permanent) sourceMageObject; + if (sourcePermanent.isControlledBy(source.getControllerId()) + && sourcePermanent.isOwnedBy(source.getControllerId())) { + FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent(); + filter.add(new NamePredicate(this.meldWithName)); + filter.add(new OwnerIdPredicate(source.getControllerId())); + return game.getBattlefield().count(filter, source.getSourceId(), source.getControllerId(), game) > 0; + } + } + return false; + } +} diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/SunburstCount.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/SunburstCount.java index 9948b486a39..d42cc3f5281 100644 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/SunburstCount.java +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/SunburstCount.java @@ -24,7 +24,7 @@ public class SunburstCount implements DynamicValue { int count = 0; if (!game.getStack().isEmpty()) { StackObject spell = game.getStack().getFirst(); - if (spell != null && spell instanceof Spell && ((Spell) spell).getSourceId().equals(source.getSourceId())) { + if (spell instanceof Spell && ((Spell) spell).getSourceId().equals(source.getSourceId())) { Mana mana = ((Spell) spell).getSpellAbility().getManaCostsToPay().getPayment(); if (mana.getBlack() > 0) { count++; diff --git a/Mage/src/main/java/mage/abilities/effects/common/CastSourceTriggeredAbility.java b/Mage/src/main/java/mage/abilities/effects/common/CastSourceTriggeredAbility.java index 60b9b9468d0..308c16b1890 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/CastSourceTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/effects/common/CastSourceTriggeredAbility.java @@ -44,7 +44,7 @@ public class CastSourceTriggeredAbility extends TriggeredAbilityImpl { public boolean checkTrigger(GameEvent event, Game game) { if (event.getSourceId().equals(this.getSourceId())) { MageObject spellObject = game.getObject(sourceId); - if (spellObject != null && (spellObject instanceof Spell)) { + if ((spellObject instanceof Spell)) { Spell spell = (Spell) spellObject; if (spell.getSpellAbility() != null) { for (Effect effect : getEffects()) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/CopyTargetSpellEffect.java b/Mage/src/main/java/mage/abilities/effects/common/CopyTargetSpellEffect.java index 9278af43743..040be4c85d7 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/CopyTargetSpellEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/CopyTargetSpellEffect.java @@ -54,7 +54,7 @@ public class CopyTargetSpellEffect extends OneShotEffect { if (spell != null) { StackObject newStackObject = spell.createCopyOnStack(game, source, useController ? spell.getControllerId() : source.getControllerId(), true); Player player = game.getPlayer(source.getControllerId()); - if (player != null && newStackObject != null && newStackObject instanceof Spell) { + if (player != null && newStackObject instanceof Spell) { String activateMessage = ((Spell) newStackObject).getActivatedMessage(game); if (activateMessage.startsWith(" casts ")) { activateMessage = activateMessage.substring(6); diff --git a/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderOwnerControlAttachedEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderOwnerControlAttachedEffect.java index 75848513757..ff587be44f1 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderOwnerControlAttachedEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderOwnerControlAttachedEffect.java @@ -37,7 +37,7 @@ public class ReturnToBattlefieldUnderOwnerControlAttachedEffect extends OneShotE return false; } Object object = getValue("attachedTo"); - if (object != null && object instanceof Permanent) { + if (object instanceof Permanent) { Card card = game.getCard(((Permanent) object).getId()); if (card != null) { if (controller.moveCards(card, Zone.BATTLEFIELD, source, game, false, false, true, null)) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderOwnerControlTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderOwnerControlTargetEffect.java index b23a11e1d0c..657a347d2bc 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderOwnerControlTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderOwnerControlTargetEffect.java @@ -66,7 +66,7 @@ public class ReturnToBattlefieldUnderOwnerControlTargetEffect extends OneShotEff } else { Card card = game.getCard(targetId); - if (card != null && card instanceof MeldCard) { + if (card instanceof MeldCard) { MeldCard meldCard = (MeldCard) card; Card topCard = meldCard.getTopHalfCard(); Card bottomCard = meldCard.getBottomHalfCard(); diff --git a/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderYourControlAttachedEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderYourControlAttachedEffect.java index 55130c8f3b3..c3156147b86 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderYourControlAttachedEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderYourControlAttachedEffect.java @@ -43,7 +43,7 @@ public class ReturnToBattlefieldUnderYourControlAttachedEffect extends OneShotEf public boolean apply(Game game, Ability source) { Object object = getValue("attachedTo"); Player controller = game.getPlayer(source.getControllerId()); - if (controller != null && object != null && object instanceof Permanent) { + if (controller != null && object instanceof Permanent) { Card card = game.getCard(((Permanent) object).getId()); // Move the card only, if it is still in the next zone after the battlefield if (card != null && card.getZoneChangeCounter(game) == ((Permanent) object).getZoneChangeCounter(game) + 1) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderYourControlTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderYourControlTargetEffect.java index 05787cfd2f7..e8bd4ab47ae 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderYourControlTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ReturnToBattlefieldUnderYourControlTargetEffect.java @@ -64,7 +64,7 @@ public class ReturnToBattlefieldUnderYourControlTargetEffect extends OneShotEffe } else { Card card = game.getCard(targetId); - if (card != null && card instanceof MeldCard) { + if (card instanceof MeldCard) { MeldCard meldCard = (MeldCard) card; Card topCard = meldCard.getTopHalfCard(); Card bottomCard = meldCard.getBottomHalfCard(); diff --git a/Mage/src/main/java/mage/abilities/effects/common/ReturnToHandAttachedEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ReturnToHandAttachedEffect.java index ff3dce414b2..368788d3f28 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ReturnToHandAttachedEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ReturnToHandAttachedEffect.java @@ -33,7 +33,7 @@ public class ReturnToHandAttachedEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Object object = getValue("attachedTo"); - if (object != null && object instanceof Permanent) { + if (object instanceof Permanent) { Card card = game.getCard(((Permanent)object).getId()); if (card != null) { if (card.moveToZone(Zone.HAND, source.getSourceId(), game, false)) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/TransformSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/TransformSourceEffect.java index 5e70a7f70f3..e3636ad5883 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/TransformSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/TransformSourceEffect.java @@ -47,7 +47,7 @@ public class TransformSourceEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { MageObject sourceObject = source.getSourceObjectIfItStillExists(game); // Transform only if it's the same object as the effect was put on the stack - if (sourceObject != null && sourceObject instanceof Permanent) { + if (sourceObject instanceof Permanent) { Permanent sourcePermanent = (Permanent) sourceObject; if (sourcePermanent.canTransform(source, game)) { // check not to transform twice the same side diff --git a/Mage/src/main/java/mage/abilities/effects/common/UntapAllThatAttackedEffect.java b/Mage/src/main/java/mage/abilities/effects/common/UntapAllThatAttackedEffect.java index 4b95b39ace9..78834f82ae7 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/UntapAllThatAttackedEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/UntapAllThatAttackedEffect.java @@ -37,7 +37,7 @@ public class UntapAllThatAttackedEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Watcher watcher = game.getState().getWatchers().get(AttackedThisTurnWatcher.class.getSimpleName()); - if (watcher != null && watcher instanceof AttackedThisTurnWatcher) { + if (watcher instanceof AttackedThisTurnWatcher) { Set attackedThisTurn = ((AttackedThisTurnWatcher) watcher).getAttackedThisTurnCreatures(); for (MageObjectReference mor : attackedThisTurn) { Permanent permanent = mor.getPermanent(game); diff --git a/Mage/src/main/java/mage/abilities/keyword/AftermathAbility.java b/Mage/src/main/java/mage/abilities/keyword/AftermathAbility.java index 419b78a1552..d661dea2150 100644 --- a/Mage/src/main/java/mage/abilities/keyword/AftermathAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/AftermathAbility.java @@ -149,7 +149,7 @@ class AftermathExileAsResolvesFromGraveyard extends ReplacementEffectImpl { // wants to do that in the future. UUID sourceId = source.getSourceId(); Card sourceCard = game.getCard(source.getSourceId()); - if (sourceCard != null && sourceCard instanceof SplitCardHalf) { + if (sourceCard instanceof SplitCardHalf) { sourceCard = ((SplitCardHalf) sourceCard).getParentCard(); sourceId = sourceCard.getId(); } @@ -170,7 +170,7 @@ class AftermathExileAsResolvesFromGraveyard extends ReplacementEffectImpl { public boolean replaceEvent(GameEvent event, Ability source, Game game) { UUID sourceId = source.getSourceId(); Card sourceCard = game.getCard(source.getSourceId()); - if (sourceCard != null && sourceCard instanceof SplitCardHalf) { + if (sourceCard instanceof SplitCardHalf) { sourceCard = ((SplitCardHalf) sourceCard).getParentCard(); sourceId = sourceCard.getId(); } diff --git a/Mage/src/main/java/mage/abilities/keyword/ConspireAbility.java b/Mage/src/main/java/mage/abilities/keyword/ConspireAbility.java index 212d940a9fa..30778d34e2f 100644 --- a/Mage/src/main/java/mage/abilities/keyword/ConspireAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/ConspireAbility.java @@ -272,7 +272,7 @@ class ConspireEffect extends OneShotEffect { Card card = game.getCard(conspiredSpell.getSourceId()); if (card != null) { StackObject newStackObject = conspiredSpell.createCopyOnStack(game, source, source.getControllerId(), true); - if (newStackObject != null && newStackObject instanceof Spell && !game.isSimulation()) { + if (newStackObject instanceof Spell && !game.isSimulation()) { game.informPlayers(controller.getLogName() + ((Spell) newStackObject).getActivatedMessage(game)); } return true; diff --git a/Mage/src/main/java/mage/abilities/keyword/HauntAbility.java b/Mage/src/main/java/mage/abilities/keyword/HauntAbility.java index 3320589b453..9e08681fb94 100644 --- a/Mage/src/main/java/mage/abilities/keyword/HauntAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/HauntAbility.java @@ -83,7 +83,7 @@ public class HauntAbility extends TriggeredAbilityImpl { if (card != null) { String key = new StringBuilder("Haunting_").append(getSourceId().toString()).append('_').append(card.getZoneChangeCounter(game)).toString(); Object object = game.getState().getValue(key); - if (object != null && object instanceof FixedTarget) { + if (object instanceof FixedTarget) { FixedTarget target = (FixedTarget) object; if (target.getTarget() != null && target.getTarget().equals(event.getTargetId())) { usedFromExile = true; diff --git a/Mage/src/main/java/mage/abilities/keyword/ReplicateAbility.java b/Mage/src/main/java/mage/abilities/keyword/ReplicateAbility.java index bd29bffab27..3f0c3037ddc 100644 --- a/Mage/src/main/java/mage/abilities/keyword/ReplicateAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/ReplicateAbility.java @@ -222,7 +222,7 @@ class ReplicateCopyEffect extends OneShotEffect { // create the copies for (int i = 0; i < replicateCount; i++) { StackObject newStackObject = spell.createCopyOnStack(game, source, source.getControllerId(), true); - if (newStackObject != null && newStackObject instanceof Spell && !game.isSimulation()) { + if (newStackObject instanceof Spell && !game.isSimulation()) { game.informPlayers(controller.getLogName() + ((Spell) newStackObject).getActivatedMessage(game)); } } diff --git a/Mage/src/main/java/mage/game/command/Plane.java b/Mage/src/main/java/mage/game/command/Plane.java index a21f0a27dd3..b6a3768c298 100644 --- a/Mage/src/main/java/mage/game/command/Plane.java +++ b/Mage/src/main/java/mage/game/command/Plane.java @@ -286,7 +286,7 @@ public class Plane implements CommandObject { Class c = Class.forName(planeName); Constructor cons = c.getConstructor(); Object plane = cons.newInstance(); - if (plane != null && plane instanceof mage.game.command.Plane) { + if (plane instanceof Plane) { return (Plane) plane; } } catch (Exception ex) { diff --git a/Mage/src/main/java/mage/game/permanent/token/JaceCunningCastawayIllusionToken.java b/Mage/src/main/java/mage/game/permanent/token/JaceCunningCastawayIllusionToken.java index 26f809f941f..d4dd3a6c8ab 100644 --- a/Mage/src/main/java/mage/game/permanent/token/JaceCunningCastawayIllusionToken.java +++ b/Mage/src/main/java/mage/game/permanent/token/JaceCunningCastawayIllusionToken.java @@ -63,7 +63,7 @@ class IllusionTokenTriggeredAbility extends TriggeredAbilityImpl { @Override public boolean checkTrigger(GameEvent event, Game game) { MageObject eventSourceObject = game.getObject(event.getSourceId()); - if (eventSourceObject != null && event.getTargetId().equals(this.getSourceId()) && eventSourceObject instanceof Spell) { + if (event.getTargetId().equals(this.getSourceId()) && eventSourceObject instanceof Spell) { getEffects().get(0).setTargetPointer(new FixedTarget(event.getPlayerId())); return true; } diff --git a/Mage/src/main/java/mage/target/TargetImpl.java b/Mage/src/main/java/mage/target/TargetImpl.java index 4f95f3287d2..110b67203ca 100644 --- a/Mage/src/main/java/mage/target/TargetImpl.java +++ b/Mage/src/main/java/mage/target/TargetImpl.java @@ -149,7 +149,7 @@ public abstract class TargetImpl implements Target { @Override public boolean isRequired(UUID sourceId, Game game) { MageObject object = game.getObject(sourceId); - if (!requiredExplicitlySet && object != null && object instanceof Ability) { + if (!requiredExplicitlySet && object instanceof Ability) { return isRequired((Ability) object); } else { return isRequired(); diff --git a/Mage/src/main/java/mage/target/TargetSource.java b/Mage/src/main/java/mage/target/TargetSource.java index b65bc14aba3..e0dae36e505 100644 --- a/Mage/src/main/java/mage/target/TargetSource.java +++ b/Mage/src/main/java/mage/target/TargetSource.java @@ -60,7 +60,7 @@ public class TargetSource extends TargetObject { public void addTarget(UUID id, Ability source, Game game) { if (targets.size() < maxNumberOfTargets) { MageObject object = game.getObject(id); - if (object != null && object instanceof StackObject) { + if (object instanceof StackObject) { addTarget(((StackObject) object).getSourceId(), source, game, notTarget); } else { diff --git a/Mage/src/main/java/mage/watchers/common/CastSpellYourLastTurnWatcher.java b/Mage/src/main/java/mage/watchers/common/CastSpellYourLastTurnWatcher.java index 51ce34bcd31..97a51a225d9 100644 --- a/Mage/src/main/java/mage/watchers/common/CastSpellYourLastTurnWatcher.java +++ b/Mage/src/main/java/mage/watchers/common/CastSpellYourLastTurnWatcher.java @@ -37,7 +37,7 @@ public class CastSpellYourLastTurnWatcher extends Watcher { lastActivePlayer = game.getActivePlayerId(); if (event.getType() == GameEvent.EventType.SPELL_CAST) { UUID playerId = event.getPlayerId(); - if (playerId != null && lastActivePlayer != null && playerId.equals(lastActivePlayer)) { + if (playerId != null && playerId.equals(lastActivePlayer)) { amountOfSpellsCastOnCurrentTurn.putIfAbsent(playerId, 0); amountOfSpellsCastOnCurrentTurn.compute(playerId, (k, a) -> a + 1); } From 238774b244493df9e134348ce7ebfd893aba8fb0 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 17 Sep 2018 15:24:06 -0400 Subject: [PATCH 002/140] small text fix --- Mage.Sets/src/mage/cards/a/ArclightPhoenix.java | 5 +++-- Utils/mtg-cards-data.txt | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/cards/a/ArclightPhoenix.java b/Mage.Sets/src/mage/cards/a/ArclightPhoenix.java index 5b341d251d1..8ca0e64be47 100644 --- a/Mage.Sets/src/mage/cards/a/ArclightPhoenix.java +++ b/Mage.Sets/src/mage/cards/a/ArclightPhoenix.java @@ -48,8 +48,9 @@ public final class ArclightPhoenix extends CardImpl { TargetController.YOU, true ), ArclightPhoenixCondition.instance, "At the beginning of combat on your turn, " - + "if you cast 3 or more instants and/or sorceries this turn, " - + "you may return {this} from your graveyard to the battlefield." + + "if you've cast three or more instant " + + "and sorcery spells this turn, you may return {this} " + + "from your graveyard to the battlefield." ), new ArclightPhoenixWatcher()); } diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 48f03262cac..655a9b33623 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -34341,7 +34341,7 @@ Never Happened|Guilds of Ravnica|80|C|{2}{B}|Sorcery|||Target opponent reveals t Price of Fame|Guilds of Ravnica|83|U|{3}{B}|Instant|||This spell costs {2} less to cast if it targets a legendary creature.$Destroy target creature.$Surveil 2.| Ritual of Soot|Guilds of Ravnica|84|R|{2}{B}{B}|Sorcery|||Destroy all creatures with converted mana cost 3 or less.| Whispering Snitch|Guilds of Ravnica|90|U|{1}{B}|Creature - Vampire Rogue|1|3|Whenever you surveil for the first time each turn, Whispering Snitch deals 1 damage to each opponent and you gain 1 life.| -Arclight Phoenix|Guilds of Ravnica|91|M|{3}{R}|Creature - Phoenix|3|2|Flying, haste$At the beginning of combat on your turn, if you cast 3 or more instants and/or sorceries this turn, you may return Arclight Phoenix from your graveyard to the battlefield.| +Arclight Phoenix|Guilds of Ravnica|91|M|{3}{R}|Creature - Phoenix|3|2|Flying, haste$At the beginning of combat on your turn, if you've cast three or more instant and/or sorcery spells this turn, you may return Arclight Phoenix from your graveyard to the battlefield.| Barging Sergeant|Guilds of Ravnica|92|C|{4}{R}|Creature - Minotaur Soldier|4|2|Haste$Mentor| Book Devourer|Guilds of Ravnica|93|U|{5}{R}|Creature - Beast|4|5|Trample$Whenever Book Devourer deals combat damage to a player, you may discard all the cards in your hand. If you do, draw that many cards.| Command the Storm|Guilds of Ravnica|94|C|{4}{R}|Instant|||Command the Storm deals 5 damage to target creature.| From 5773e49fcff70d6ea3ff983784afc310a03d0ad4 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 17 Sep 2018 19:30:59 -0400 Subject: [PATCH 003/140] updated GRN spoiler and reprints --- ...ceAssociation.java => AssureAssemble.java} | 14 ++++---- .../{d/Detour.java => c/CircuitousRoute.java} | 12 +++---- Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 5 +-- Utils/mtg-cards-data.txt | 33 +++++++++++++++++-- 4 files changed, 46 insertions(+), 18 deletions(-) rename Mage.Sets/src/mage/cards/a/{AssuranceAssociation.java => AssureAssemble.java} (83%) rename Mage.Sets/src/mage/cards/{d/Detour.java => c/CircuitousRoute.java} (83%) diff --git a/Mage.Sets/src/mage/cards/a/AssuranceAssociation.java b/Mage.Sets/src/mage/cards/a/AssureAssemble.java similarity index 83% rename from Mage.Sets/src/mage/cards/a/AssuranceAssociation.java rename to Mage.Sets/src/mage/cards/a/AssureAssemble.java index 62d1a928322..dabe55520de 100644 --- a/Mage.Sets/src/mage/cards/a/AssuranceAssociation.java +++ b/Mage.Sets/src/mage/cards/a/AssureAssemble.java @@ -18,12 +18,12 @@ import mage.target.common.TargetCreaturePermanent; * * @author TheElk801 */ -public final class AssuranceAssociation extends SplitCard { +public final class AssureAssemble extends SplitCard { - public AssuranceAssociation(UUID ownerId, CardSetInfo setInfo) { + public AssureAssemble(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{G/W}{G/W}", "{4}{G}{W}", SpellAbilityType.SPLIT); - // Assurance + // Assure // Put a +1/+1 counter on target creature. It gains indestructible until end of turn. this.getLeftHalfCard().getSpellAbility().addEffect( new AddCountersTargetEffect(CounterType.P1P1.createInstance()) @@ -38,19 +38,19 @@ public final class AssuranceAssociation extends SplitCard { new TargetCreaturePermanent() ); - // Association + // Assemble // Create three 2/2 green and white Elf Knight creature tokens with vigilance. this.getRightHalfCard().getSpellAbility().addEffect( new CreateTokenEffect(new ElfKnightToken(), 3) ); } - public AssuranceAssociation(final AssuranceAssociation card) { + public AssureAssemble(final AssureAssemble card) { super(card); } @Override - public AssuranceAssociation copy() { - return new AssuranceAssociation(this); + public AssureAssemble copy() { + return new AssureAssemble(this); } } diff --git a/Mage.Sets/src/mage/cards/d/Detour.java b/Mage.Sets/src/mage/cards/c/CircuitousRoute.java similarity index 83% rename from Mage.Sets/src/mage/cards/d/Detour.java rename to Mage.Sets/src/mage/cards/c/CircuitousRoute.java index cb4a870c925..0b77d6b6597 100644 --- a/Mage.Sets/src/mage/cards/d/Detour.java +++ b/Mage.Sets/src/mage/cards/c/CircuitousRoute.java @@ -1,4 +1,4 @@ -package mage.cards.d; +package mage.cards.c; import java.util.UUID; import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; @@ -18,7 +18,7 @@ import mage.target.common.TargetCardInLibrary; * * @author TheElk801 */ -public final class Detour extends CardImpl { +public final class CircuitousRoute extends CardImpl { private static final FilterCard filter = new FilterCard("basic land cards and/or Gate cards"); @@ -32,7 +32,7 @@ public final class Detour extends CardImpl { )); } - public Detour(UUID ownerId, CardSetInfo setInfo) { + public CircuitousRoute(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{G}"); // Search your library for up to two basic lands and/or Gates and put them onto the battlefield tapped. @@ -41,12 +41,12 @@ public final class Detour extends CardImpl { )); } - public Detour(final Detour card) { + public CircuitousRoute(final CircuitousRoute card) { super(card); } @Override - public Detour copy() { - return new Detour(this); + public CircuitousRoute copy() { + return new CircuitousRoute(this); } } diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 33eb535cad8..11db11cd321 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -27,7 +27,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Arclight Phoenix", 91, Rarity.MYTHIC, mage.cards.a.ArclightPhoenix.class)); cards.add(new SetCardInfo("Artful Takedown", 151, Rarity.COMMON, mage.cards.a.ArtfulTakedown.class)); cards.add(new SetCardInfo("Assassin's Trophy", 152, Rarity.RARE, mage.cards.a.AssassinsTrophy.class)); - cards.add(new SetCardInfo("Assurance // Association", 221, Rarity.RARE, mage.cards.a.AssuranceAssociation.class)); + cards.add(new SetCardInfo("Assure // Assemble", 221, Rarity.RARE, mage.cards.a.AssureAssemble.class)); cards.add(new SetCardInfo("Attendant of Vraska", 271, Rarity.UNCOMMON, mage.cards.a.AttendantOfVraska.class)); cards.add(new SetCardInfo("Aurelia, Exemplar of Justice", 153, Rarity.MYTHIC, mage.cards.a.AureliaExemplarOfJustice.class)); cards.add(new SetCardInfo("Barging Sergeant", 92, Rarity.COMMON, mage.cards.b.BargingSergeant.class)); @@ -43,6 +43,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Centaur Peacemaker", 158, Rarity.COMMON, mage.cards.c.CentaurPeacemaker.class)); cards.add(new SetCardInfo("Chemister's Insight", 32, Rarity.UNCOMMON, mage.cards.c.ChemistersInsight.class)); cards.add(new SetCardInfo("Chromatic Lantern", 233, Rarity.RARE, mage.cards.c.ChromaticLantern.class)); + cards.add(new SetCardInfo("Circuitous Route", 125, Rarity.UNCOMMON, mage.cards.c.CircuitousRoute.class)); cards.add(new SetCardInfo("Citywatch Sphinx", 33, Rarity.UNCOMMON, mage.cards.c.CitywatchSphinx.class)); cards.add(new SetCardInfo("Command the Storm", 94, Rarity.COMMON, mage.cards.c.CommandTheStorm.class)); cards.add(new SetCardInfo("Conclave Guildmage", 162, Rarity.UNCOMMON, mage.cards.c.ConclaveGuildmage.class)); @@ -53,7 +54,6 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Darkblade Agent", 164, Rarity.COMMON, mage.cards.d.DarkbladeAgent.class)); cards.add(new SetCardInfo("Deadly Visit", 68, Rarity.COMMON, mage.cards.d.DeadlyVisit.class)); cards.add(new SetCardInfo("Deafening Clarion", 165, Rarity.RARE, mage.cards.d.DeafeningClarion.class)); - cards.add(new SetCardInfo("Detour", 125, Rarity.UNCOMMON, mage.cards.d.Detour.class)); cards.add(new SetCardInfo("Dimir Guildgate", 245, Rarity.COMMON, mage.cards.d.DimirGuildgate.class)); cards.add(new SetCardInfo("Dimir Guildgate", 246, Rarity.COMMON, mage.cards.d.DimirGuildgate.class)); cards.add(new SetCardInfo("Dimir Informant", 36, Rarity.COMMON, mage.cards.d.DimirInformant.class)); @@ -176,6 +176,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Wary Okapi", 149, Rarity.COMMON, mage.cards.w.WaryOkapi.class)); cards.add(new SetCardInfo("Watcher in the Mist", 59, Rarity.COMMON, mage.cards.w.WatcherInTheMist.class)); cards.add(new SetCardInfo("Watery Grave", 259, Rarity.RARE, mage.cards.w.WateryGrave.class)); + cards.add(new SetCardInfo("Wee Dragonauts", 214, Rarity.UNCOMMON, mage.cards.w.WeeDragonauts.class)); cards.add(new SetCardInfo("Whisper Agent", 220, Rarity.COMMON, mage.cards.w.WhisperAgent.class)); cards.add(new SetCardInfo("Whispering Snitch", 90, Rarity.UNCOMMON, mage.cards.w.WhisperingSnitch.class)); cards.add(new SetCardInfo("Wojek Bodyguard", 120, Rarity.COMMON, mage.cards.w.WojekBodyguard.class)); diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 655a9b33623..e717a2a6223 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -34300,12 +34300,18 @@ Tobias Beckett|Star Wars|614|R|{3}{B}|Legendary Creature - Human Hunter|4|3|When Underground Forum|Star Wars|615|U||Land|||T: Add {1}.${1}, {T}: Add {B}, {R}, or {G}.${2}, {T}: Put a bounty counter on target creature.| Blade Instructor|Guilds of Ravnica|1|C|{2}{W}|Creature - Human Soldier|3|1|Mentor| Bounty Agent|Guilds of Ravnica|2|R|{1}{W}|Creature - Human Soldier|2|2|Vigilance${T}, Sacrifice Bounty Agent: Destroy target legendary permanent that's an artifact, creature, or enchantment.| +Citywide Bust|Guilds of Ravnica|4|R|{1}{W}{W}|Sorcery|||Destroy all creatures with toughness 4 or greater.| Conclave Tribunal|Guilds of Ravnica|6|U|{3}{W}|Enchantment|||Convoke$When Conclave Tribunal enters the battlefield, exile target nonland permanent an opponent controls until Conclave Tribunal leaves the battlefield.| +Divine Visitation|Guilds of Ravnica|10|M|{3}{W}{W}|Enchantment|||If one or more creature tokens would be created under your control, that many 4/4 white Angel creature tokens with flying and vigilance are created instead.| +Gird for Battle|Guilds of Ravnica|12|U|{W}|Sorcery|||Put a +1/+1 counter on each of up to two target creatures.| +Haazda Marshal|Guilds of Ravnica|13|U|{W}|Creature - Human Soldier|1|1|Whenever Haazda Marshal and at least two other creatures attack, create a 1/1 white Solider creature token with lifelink.| Healer's Hawk|Guilds of Ravnica|14|C|{W}|Creature - Bird|1|1|Flying, lifelink| Hunted Witness|Guilds of Ravnica|15|C|{W}|Creature - Human|1|1|When Hunted Witness dies, create a 1/1 white Soldier creature token with lifelink.| Ledev Guardian|Guilds of Ravnica|18|C|{3}{W}|Creature - Human Knight|2|4|Convoke| +Light of the Legion|Guilds of Ravnica|19|R|{4}{W}{W}|Creature - Angel|5|5|Flying$Mentor$When Light of the Legion dies, put a +1/+1 counter on each white creature you control.| Loxodon Restorer|Guilds of Ravnica|20|C|{4}{W}{W}|Creature - Elephant Cleric|3|4|Convoke$When Loxodon Restorer enters the battlefield, you gain 4 life.| Parhelion Patrol|Guilds of Ravnica|22|C|{3}{W}|Creature - Human Knight|2|3|Flying, vigilance$Mentor| +Roc Charger|Guilds of Ravnica|24|U|{2}{W}|Creature - Bird|1|3|Flying$Whenever Roc Charger attacks, target attacking creature without flying gains flying until end of turn.| Sunhome Stalwart|Guilds of Ravnica|26|U|{1}{W}|Creature - Human Soldier|2|2|First strike$Mentor| Venerated Loxodon|Guilds of Ravnica|30|R|{4}{W}|Creature - Elephant Cleric|4|4|Convoke$When Venerated Loxodon enters the battlefield, put a +1/+1 counter on each creature that convoked it.| Chemister's Insight|Guilds of Ravnica|32|U|{3}{U}|Instant|||Draw two cards.$Jump-start| @@ -34341,7 +34347,7 @@ Never Happened|Guilds of Ravnica|80|C|{2}{B}|Sorcery|||Target opponent reveals t Price of Fame|Guilds of Ravnica|83|U|{3}{B}|Instant|||This spell costs {2} less to cast if it targets a legendary creature.$Destroy target creature.$Surveil 2.| Ritual of Soot|Guilds of Ravnica|84|R|{2}{B}{B}|Sorcery|||Destroy all creatures with converted mana cost 3 or less.| Whispering Snitch|Guilds of Ravnica|90|U|{1}{B}|Creature - Vampire Rogue|1|3|Whenever you surveil for the first time each turn, Whispering Snitch deals 1 damage to each opponent and you gain 1 life.| -Arclight Phoenix|Guilds of Ravnica|91|M|{3}{R}|Creature - Phoenix|3|2|Flying, haste$At the beginning of combat on your turn, if you've cast three or more instant and/or sorcery spells this turn, you may return Arclight Phoenix from your graveyard to the battlefield.| +Arclight Phoenix|Guilds of Ravnica|91|M|{3}{R}|Creature - Phoenix|3|2|Flying, haste$At the beginning of combat on your turn, if you've cast three or more instant and sorcery spells this turn, you may return Arclight Phoenix from your graveyard to the battlefield.| Barging Sergeant|Guilds of Ravnica|92|C|{4}{R}|Creature - Minotaur Soldier|4|2|Haste$Mentor| Book Devourer|Guilds of Ravnica|93|U|{5}{R}|Creature - Beast|4|5|Trample$Whenever Book Devourer deals combat damage to a player, you may discard all the cards in your hand. If you do, draw that many cards.| Command the Storm|Guilds of Ravnica|94|C|{4}{R}|Instant|||Command the Storm deals 5 damage to target creature.| @@ -34353,22 +34359,29 @@ Inescapable Blaze|Guilds of Ravnica|107|U|{4}{R}{R}|Instant|||This spell can't b Lava Coil|Guilds of Ravnica|108|U|{1}{R}|Sorcery|||Lava Coil deals 4 damage to target creature. If that creature would die this turn, exile it instead.| Legion Warboss|Guilds of Ravnica|109|R|{2}{R}|Creature - Goblin Soldier|2|2|Mentor$At the beginning of combat on your turn, create a 1/1 red Goblin creature token. That token gains haste until end of turn and attacks this combat if able.| Maximize Velocity|Guilds of Ravnica|111|C|{R}|Sorcery|||Target creature gets +1/+1 and gains haste until end of turn.$Jump-start| +Risk Factor|Guilds of Ravnica|113|R|{2}{R}|Instant|||Target opponent may have Risk Factor deal 4 damage to them. If that player doesn't, you draw three cards.$Jump-start| Runaway Steam-Kin|Guilds of Ravnica|115|R|{1}{R}|Creature - Elemental|1|1|Whenever you cast a red spell, if Runaway Steam-Kin has fewer than three +1/+1 counters on it, put a +1/+1 counter on Runaway Steam-Kin.$Remove three +1/+1 counters from Runaway Steam-Kin: Add {R}{R}{R}.| Wojek Bodyguard|Guilds of Ravnica|120|C|{2}{R}|Creature - Human Soldier|3|3|Mentor$Wojek Bodyguard can't attack or block alone.| Affectionate Indrik|Guilds of Ravnica|121|U|{5}{G}|Creature - Beast|4|4|When Affectionate Indrik enters the battlefield, you may have it fight target creature you don't control.| Arboretum Elemental|Guilds of Ravnica|122|U|{7}{G}{G}|Creature - Elemental|7|5|Convoke$Hexproof| Beast Whisperer|Guilds of Ravnica|123|R|{2}{G}{G}|Creature - Elf Druid|2|3|Whenever you cast a creature spell, draw a card.| +Circuitous Route|Guilds of Ravnica|125|U|{3}{G}|Sorcery|||Search your library for up to two basic land cards and/or Gate cards and put them onto the battlefield tapped, then shuffle your library.| District Guide|Guilds of Ravnica|128|U|{2}{G}|Creature - Elf Scout|2|2|When District Guide enters the battlefield, you may search your library for a basic land card or Gate card, reveal it, put it into your hand, then shuffle your library.| Golgari Raiders|Guilds of Ravnica|130|U|{3}{G}|Creature - Elf Warrior|0|0|Haste$Undergrowth — Golgari Raiders enters the battlefield with a +1/+1 counter on it for each creature card in your graveyard.| +Hatchery Spider|Guilds of Ravnica|132|R|{5}{G}{G}|Creature - Spider|5|7|Reach$Undergrowth — When you cast this spell, reveal the top X cards of your library, where X is the number of creature cards in your graveyard. You may put a green permanent card with converted mana cost X or less from among them onto the battlefield. Put the rest on the bottom of your library in a random order.| Nullhide Ferox|Guilds of Ravnica|138|M|{2}{G}{G}|Creature - Beast|6|6|Hexproof$You can't cast noncreature spells.${2}: Nullhide Ferox loses all abilities until end of turn. Any player may activate this ability.$If a spell or ability an opponent controls causes you to discard Nullhide Ferox, put it onto the battlefield instead of putting it into your graveyard.| Siege Wurm|Guilds of Ravnica|144|C|{5}{G}{G}|Creature - Wurm|5|5|Convoke$Trample| +Sprouting Renewal|Guilds of Ravnica|145|U|{2}{G}|Sorcery|||Convoke$Choose one —$• Create a 2/2 green and white Elf Knight creature token with vigilance.$• Destroy target artifact or enchantment.| Vivid Revival|Guilds of Ravnica|148|R|{4}{G}|Sorcery|||Return up to three target multicolor cards from your graveyard to your hand. Exile Vivid Revival.| Wary Okapi|Guilds of Ravnica|149|C|{2}{G}|Creature - Antelope|3|2|Vigilance| Artful Takedown|Guilds of Ravnica|151|C|{2}{U}{B}|Instant|||Choose one or both —$• Tap target creature.$• Target creature gets -2/-4 until end of turn.| Assassin's Trophy|Guilds of Ravnica|152|R|{B}{G}|Instant|||Destroy target permanent an opponent controls. Its controller may search their library for a basic land card, put it onto the battlefield, then shuffle their library.| Aurelia, Exemplar of Justice|Guilds of Ravnica|153|M|{2}{R}{W}|Legendary Creature - Angel|2|5|Flying$Mentor$At the beginning of combat on your turn, choose up to one target creature you control. Until end of turn, that creature gets +2/+0, gains trample if it's red, and gains vigilance if it's white.| +Beacon Bolt|Guilds of Ravnica|154|U|{1}{U}{R}|Sorcery|||Beacon Bolt deals damage to target creature equal to the total number of instant and sorcery cards you own in exile and in your graveyard.$Jump-start| Boros Challenger|Guilds of Ravnica|156|U|{R}{W}|Creature - Human Soldier|2|3|Mentor${2}{R}{W}: Boros Challenger gets +1/+1 until end of turn.| Centaur Peacemaker|Guilds of Ravnica|158|C|{1}{G}{W}|Creature - Centaur Cleric|3|3|When Centaur Peacemaker enters the battlefield, each player gains 4 life.| +Morgue Troll|Guilds of Ravnica|160|R|{1}{B}{G}|Creature - Troll|4|4|Trample$At the beginning of your upkeep, exile a creature card from your graveyard. If you do, put a +1/+1 counter on Morgue Troll. Otherwise sacrifice it.${B}{G}, Discard a creature card: Put a +1/+1 counter on Morgue Troll.| +Conclave Cavalier|Guilds of Ravnica|161|U|{G}{G}{W}{W}|Creature - Centaur Knight|4|4|Vigilance$When Conclave Cavalier dies, create two green and white 2/2 Elf Knight creature tokens with vigilance.| Conclave Guildmage|Guilds of Ravnica|162|U|{G}{W}|Creature - Elf Cleric|2|2|{G}, {T}: Creatures you control gain trample until end of turn.${5}{W}, {T}: Create a 2/2 green and white Elf Knight creature token with vigilance.| Crackling Drake|Guilds of Ravnica|163|U|{U}{U}{R}{R}|Creature - Drake|*|4|Flying$Crackling Drake's power is equal to the total number of instant and sorcery cards you own in exile and in your graveyard.$When Crackling Drake enters the battlefield, draw a card.| Darkblade Agent|Guilds of Ravnica|164|C|{1}{U}{B}|Creature - Human Assassin|2|3|As long as you've surveilled this turn, Darkblade Agent has deathtouch and "Whenever this creature deals combat damage to a player, draw a card."| @@ -34376,6 +34389,7 @@ Deafening Clarion|Guilds of Ravnica|165|R|{1}{R}{W}|Sorcery|||Choose one or both Dimir Spybug|Guilds of Ravnica|166|U|{U}{B}|Creature - Insect|1|1|Flying$Menace$Whenever you surveil, put a +1/+1 counter on Dimir Spybug.| Disinformation Campaign|Guilds of Ravnica|167|U|{1}{U}{B}|Enchantment|||When Disinformation Campaign enters the battlefield, you draw a card and each opponent discards a card.$Whenever you surveil, return Disinformation Campaign to its owner's hand.| Emmara, Soul of the Accord|Guilds of Ravnica|168|R|{G}{W}|Legendary Creature - Elf Cleric|2|2|Whenever Emmara, Soul of the Accord becomes tapped, create a 1/1 white Soldier creature token with lifelink.| +Etrata, the Silencer|Guilds of Ravnica|170|R|{2}{U}{B}|Legendary Creature - Vampire Assassin|3|5|Etrata, the Silencer can't be blocked.$Whenever Etrata deals combat damage to a player, exile target creature that player controls and put a hit counter on that card. That player loses the game if they own three or more exiled card with hit counters on them. Etrata's owner shuffles Etrata into their library.| Firemind's Research|Guilds of Ravnica|171|R|{U}{R}|Enchantment|||Whenever you cast an instant or sorcery spell, put a charge counter on Firemind's Research.${1}{U}, Remove two charge counters from Firemind's Research: Draw a card.${1}{R}, Remove five charge counters from Firemind's Research: It deals 5 damage to any target.| Garrison Sergeant|Guilds of Ravnica|172|C|{3}{R}{W}|Creature - Viashino Soldier|3|3|Garrison Sergeant has double strike as long as you control a Gate.| Glowspore Shaman|Guilds of Ravnica|173|U|{B}{G}|Creature - Elf Shaman|3|1|When Glowspore Shaman enters the battlefield, put the top three cards of your library into your graveyard. You may put a land card from your graveyard on top of your library.| @@ -34386,9 +34400,12 @@ House Guildmage|Guilds of Ravnica|177|U|{U}{B}|Creature - Human Wizard|2|2|{1}{U Hypothesizzle|Guilds of Ravnica|178|C|{3}{U}{R}|Instant|||Draw two cards. Then you may discard a nonland card. When you do, Hypothesizzle deals 4 damage to target creature.| Ionize|Guilds of Ravnica|179|R|{1}{U}{R}|Instant|||Counter target spell. Ionize deals 2 damage to that spell's controller.| Izoni, Thousand-Eyed|Guilds of Ravnica|180|R|{2}{B}{B}{G}{G}|Legendary Creature - Elf Shaman|2|3|Undergrowth — When Izoni, Thousand-Eyed enters the battlefield, create a 1/1 black and green Insect creature token for each creature card in your graveyard.${B}{G}, Sacrifice another creature: You gain 1 life and draw a card.| +Join Shields|Guilds of Ravnica|181|U|{3}{G}{W}|Instant|||Untap all creatures you control. They gain indestructible and hexproof until end of turn.| +Justice Strike|Guilds of Ravnica|182|U|{R}{W}|Instant|||Target creature deals damage to itself equal to its power.| Knight of Autumn|Guilds of Ravnica|183|R|{1}{G}{W}|Creature - Dryad Knight|2|1|When Knight of Autumn enters the battlefield, choose one —$• Put two +1/+1 counters on Knight of Autumn.$• Destroy target artifact or enchantment.$• You gain 4 life.| Lazav, the Multifarious|Guilds of Ravnica|184|M|{U}{B}|Legendary Creature - Shapeshifter|1|3|When Lazav, the Multifarious enters the battlefield, surveil 1.${X}: Lazav, the Multifarious becomes a copy of target creature card in your graveyard with converted mana cost X, except its name is Lazav, the Multifarious, it's legendary in addition to its other types, and it has this ability.| League Guildmage|Guilds of Ravnica|185|U|{U}{R}|Creature - Human Wizard|2|2|{3}{U}, {T}: Draw a card.${X}{R}, {T}: Copy target instant or sorcery spell you control with converted mana cost X. You may choose new targets for the copy.| +Ledev Champion|Guilds of Ravnica|186|U|{1}{G}{W}|Creature - Human Knight|2|2|Whenever Ledev Champion attacks, you may tap any number of untapped creatures you control. Ledev Champion gets +1/+1 until end of turn for each creature tapped this way.${3}{G}{W}: Create a 1/1 white soldier creature token with lifelink.| Legion Guildmage|Guilds of Ravnica|187|U|{R}{W}|Creature - Human Wizard|2|2|{5}{R}, {T}: Legion Guildmage deals 3 damage to each opponent.${2}{W}, {T}: Tap another target creature.| March of the Multitudes|Guilds of Ravnica|188|M|{X}{G}{W}{W}|Instant|||Convoke$Create X 1/1 white Soldier creature tokens with lifelink.| Molderhulk|Guilds of Ravnica|190|U|{7}{B}{G}|Creature - Fungus Zombie|6|6|Undergrowth — This spell costs {1} less to cast for each creature card in your graveyard.$When Molderhulk enters the battlefield, return target land card from your graveyard to the battlefield.| @@ -34402,19 +34419,28 @@ Skyknight Legionnaire|Guilds of Ravnica|198|C|{1}{R}{W}|Creature - Human Knight| Sonic Assault|Guilds of Ravnica|199|C|{1}{U}{R}|Instant|||Tap target creature. Sonic Assault deals 2 damage to that creature's controller.$Jump-start| Sumala Woodshaper|Guilds of Ravnica|200|C|{2}{G}{W}|Creature - Elf Druid|2|1|When Sumala Woodshaper enters the battlefield, look at the top four cards of your library. You may reveal a creature or enchantment card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.| Swarm Guildmage|Guilds of Ravnica|201|U|{B}{G}|Creature - Elf Shaman|2|2|{4}{B}, {T}: Creatures you control get +1/+0 and gain menace until end of turn.${1}{G}, {T}: You gain 2 life.| +Swathcutter Giant|Guilds of Ravnica|202|U|{4}{R}{W}|Creature - Giant Soldier|5|5|Vigilance$Whenever Swathcutter Giant attacks, it deals 1 damage to each creature defending player controls.| Swiftblade Vindicator|Guilds of Ravnica|203|R|{R}{W}|Creature - Human Soldier|1|1|Double strike, vigilance, trample| +Thief of Sanity|Guilds of Ravnica|205|R|{1}{U}{B}|Creature - Specter|2|2|Flying$Whenever Thief of Sanity deals combat damage to a player, look at the top three cards of that player's library, exile one of them face down, then put the rest into their graveyard. For as long as that card remains exiled, you may look at it, you may cast it, and you may spend mana as though it were mana of any type to cast it.| Thought Erasure|Guilds of Ravnica|206|U|{U}{B}|Sorcery|||Target opponent reveals their hand. You choose a nonland card from it. That player discards that card.$Surveil 1.| +Thousand-Year Storm|Guilds of Ravnica|207|M|{4}{U}{R}|Enchantment|||Whenever you cast an instant or sorcery spell, copy it for each other instant and sorcery spell you've cast before it this turn. You may choose new targets for the copies.| Trostani Discordant|Guilds of Ravnica|208|M|{3}{G}{W}|Legendary Creature - Dryad|1|4|Other creatures you control get +1/+1.$When Trostani Discordant enters the battlefield, create two 1/1 white Soldier creature tokens with lifelink.$At the beginning of your end step, each player gains control of all creatures they own.| Truefire Captain|Guilds of Ravnica|209|U|{R}{R}{W}{W}|Creature - Human Knight|4|3|Mentor$Whenever Truefire Captain is dealt damage, it deals that much damage to target player.| +Undercity Uprising|Guilds of Ravnica|210|C|{2}{B}{G}|Sorcery|||Creatures you control gain deathtouch until end of turn. Target creature you control fights target creature you don't control.| Underrealm Lich|Guilds of Ravnica|211|M|{3}{B}{G}|Creature - Zombie Elf Shaman|4|3|If you would draw a card, instead look at the top three cards of your library, then put one into your hand and the rest into your graveyard.$Pay 4 life: Underrealm Lich gains indestructible until end of turn. Tap it.| +Unmoored Ego|Guilds of Ravnica|212|R|{1}{U}{B}|Sorcery|||Choose a card name. Search target opponent's graveyard, hand, and library for up to four cards with that name and exile them. That player shuffles their library, then draws a card for each card exiled from their hand this way.| Vraska, Golgari Queen|Guilds of Ravnica|213|M|{2}{B}{G}|Legendary Planeswalker - Vraska|4|+2: You may sacrifice another permanent. If you do, you gain 1 life and draw a card.$-3: Destroy target nonland permanent with converted mana cost 3 or less.$-9: You get an emblem with "Whenever a creature you control deals combat damage to a player, that player loses the game."| +Wee Dragonauts|Guilds of Ravnica|214|U|{1}{U}{R}|Creature - Faerie Wizard|1|3|Flying$Whenever you cast an instant or sorcery spell, Wee Dragonauts gets +2/+0 until end of turn.| +Worldsoul Colossus|Guilds of Ravnica|215|U|{X}{G}{W}|Creature - Elemental|0|0|Convoke$Worldsoul Colossus enters the battlefield with X +1/+1 counters on it.| Fresh-Faced Recruit|Guilds of Ravnica|216|C|{1}{R/W}|Creature - Human Soldier|2|1|As long as it's your turn, Fresh-Faced Recruit has first strike.| Piston-Fist Cyclops|Guilds of Ravnica|217|C|{1}{U/R}{U/R}|Creature - Cyclops|4|3|Defender$As long as you've cast an instant or sorcery spell this turn, Piston-Fist Cyclops can attack as though it didn't have defender.| Whisper Agent|Guilds of Ravnica|220|C|{1}{U/B}{U/B}|Creature - Human Rogue|3|2|Flash$When Whisper Agent enters the battlefield, surveil 1.| -Association|Guilds of Ravnica|221|R|{4}{G}{W}|Instant|||Create three 2/2 green and white Elf Knight creature tokens with vigilance.| -Assurance|Guilds of Ravnica|221|R|{G/W}{G/W}|Instant|||Put a +1/+1 counter on target creature. It gains indestructible until end of turn.| +Assemble|Guilds of Ravnica|221|R|{4}{G}{W}|Instant|||Create three 2/2 green and white Elf Knight creature tokens with vigilance.| +Assure|Guilds of Ravnica|221|R|{G/W}{G/W}|Instant|||Put a +1/+1 counter on target creature. It gains indestructible until end of turn.| Concoct|Guilds of Ravnica|222|R|{3}{U}{B}|Sorcery|||Surveil 3, then return a creature card from your graveyard to the battlefield.| Connive|Guilds of Ravnica|222|R|{2}{U/B}{U/B}|Sorcery|||Gain control of target creature with power 2 or less.| +Discovery|Guilds of Ravnica|223|U|{1}{U/B}|Sorcery|||Surveil 2, then draw a card.| +Dispersal|Guilds of Ravnica|223|U|{3}{U}{B}|Instant|||Each opponent returns a nonland permanent they control with the highest converted mana cost among permanents they control to its owner's hand, then discards a card.| Expansion|Guilds of Ravnica|224|R|{U/R}{U/R}|Instant|||Copy target instant or sorcery spell with converted mana cost 4 or less. You may choose new targets for the copy.| Explosion|Guilds of Ravnica|224|R|{X}{U}{U}{R}{R}|Instant|||Explosion deals X damage to any target. Target player draws X cards.| Finality|Guilds of Ravnica|225|R|{4}{B}{G}|Sorcery|||You may put two +1/+1 counters on a creature you control. Then all creatures get -4/-4 until end of turn.| @@ -34434,6 +34460,7 @@ Glaive of the Guildpact|Guilds of Ravnica|236|U|{2}|Artifact - Equipment|||Equip Golgari Locket|Guilds of Ravnica|237|C|{3}|Artifact|||{T}: Add {B} or {G}.${B/G}{B/G}{B/G}{B/G}, {T}, Sacrifice Golgari Locket: Draw two cards.| Izzet Locket|Guilds of Ravnica|238|C|{3}|Artifact|||{T}: Add {U} or {R}.${U/R}{U/R}{U/R}{U/R}, {T}, Sacrifice Izzet Locket: Draw two cards.| Selesnya Locket|Guilds of Ravnica|240|C|{3}|Artifact|||{T}: Add {G} or {W}.${G/W}{G/W}{G/W}{G/W}, {T}, Sacrifice Selesnya Locket: Draw two cards.| +Wand of Vertebrae|Guilds of Ravnica|242|U|{1}|Artifact|||{T}: Put the top card of your library into your graveyard.${2}, {T}, Exile Wand of Vertebrae: Shuffle up to five target cards from your graveyard into your library.| Boros Guildgate|Guilds of Ravnica|243|C||Land - Gate|||Boros Guildgate enters the battlefield tapped.${T}: Add {R} or {W}.| Dimir Guildgate|Guilds of Ravnica|245|C||Land - Gate|||Dimir Guildgate enters the battlefield tapped.${T}: Add {U} or {B}.| Gateway Plaza|Guilds of Ravnica|247|C||Land - Gate|||Gateway Plaza enters the battlefield tapped.$When Gateway Plaza enters the battlefield, sacrifice it unless you pay {1}.${T}: Add one mana of any color.| From 7138125383781268d7e228970687098ca6fea6b5 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 17 Sep 2018 19:48:25 -0400 Subject: [PATCH 004/140] Implemented Citywide Bust --- Mage.Sets/src/mage/cards/c/CitywideBust.java | 40 ++++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 41 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/CitywideBust.java diff --git a/Mage.Sets/src/mage/cards/c/CitywideBust.java b/Mage.Sets/src/mage/cards/c/CitywideBust.java new file mode 100644 index 00000000000..3658e4ea0e9 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CitywideBust.java @@ -0,0 +1,40 @@ +package mage.cards.c; + +import java.util.UUID; +import mage.abilities.effects.common.DestroyAllEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.ToughnessPredicate; + +/** + * + * @author TheElk801 + */ +public final class CitywideBust extends CardImpl { + + private static final FilterPermanent filter = new FilterCreaturePermanent("creatures with toughness 4 or greater"); + + static { + filter.add(new ToughnessPredicate(ComparisonType.MORE_THAN, 3)); + } + + public CitywideBust(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{W}{W}"); + + // Destroy all creatures with toughness 4 or greater. + this.getSpellAbility().addEffect(new DestroyAllEffect(filter)); + } + + public CitywideBust(final CitywideBust card) { + super(card); + } + + @Override + public CitywideBust copy() { + return new CitywideBust(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 11db11cd321..a2f1c3499b8 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -45,6 +45,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Chromatic Lantern", 233, Rarity.RARE, mage.cards.c.ChromaticLantern.class)); cards.add(new SetCardInfo("Circuitous Route", 125, Rarity.UNCOMMON, mage.cards.c.CircuitousRoute.class)); cards.add(new SetCardInfo("Citywatch Sphinx", 33, Rarity.UNCOMMON, mage.cards.c.CitywatchSphinx.class)); + cards.add(new SetCardInfo("Citywide Bust", 4, Rarity.RARE, mage.cards.c.CitywideBust.class)); cards.add(new SetCardInfo("Command the Storm", 94, Rarity.COMMON, mage.cards.c.CommandTheStorm.class)); cards.add(new SetCardInfo("Conclave Guildmage", 162, Rarity.UNCOMMON, mage.cards.c.ConclaveGuildmage.class)); cards.add(new SetCardInfo("Conclave Tribunal", 6, Rarity.UNCOMMON, mage.cards.c.ConclaveTribunal.class)); From 8d62ab7ab95e2dbd4bf0f5ec571ed967c1023255 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 17 Sep 2018 19:50:43 -0400 Subject: [PATCH 005/140] Implemented Conclave Cavalier --- .../src/mage/cards/c/ConclaveCavalier.java | 45 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 46 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/ConclaveCavalier.java diff --git a/Mage.Sets/src/mage/cards/c/ConclaveCavalier.java b/Mage.Sets/src/mage/cards/c/ConclaveCavalier.java new file mode 100644 index 00000000000..f8035d718c5 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ConclaveCavalier.java @@ -0,0 +1,45 @@ +package mage.cards.c; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.DiesTriggeredAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.constants.SubType; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.game.permanent.token.ElfKnightToken; + +/** + * + * @author TheElk801 + */ +public final class ConclaveCavalier extends CardImpl { + + public ConclaveCavalier(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}{G}{W}{W}"); + + this.subtype.add(SubType.CENTAUR); + this.subtype.add(SubType.KNIGHT); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Vigilance + this.addAbility(VigilanceAbility.getInstance()); + + // When Conclave Cavalier dies, create two green and white 2/2 Elf Knight creature tokens with vigilance. + this.addAbility(new DiesTriggeredAbility( + new CreateTokenEffect(new ElfKnightToken(), 2) + )); + } + + public ConclaveCavalier(final ConclaveCavalier card) { + super(card); + } + + @Override + public ConclaveCavalier copy() { + return new ConclaveCavalier(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index a2f1c3499b8..89efdb5d5e5 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -47,6 +47,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Citywatch Sphinx", 33, Rarity.UNCOMMON, mage.cards.c.CitywatchSphinx.class)); cards.add(new SetCardInfo("Citywide Bust", 4, Rarity.RARE, mage.cards.c.CitywideBust.class)); cards.add(new SetCardInfo("Command the Storm", 94, Rarity.COMMON, mage.cards.c.CommandTheStorm.class)); + cards.add(new SetCardInfo("Conclave Cavalier", 161, Rarity.UNCOMMON, mage.cards.c.ConclaveCavalier.class)); cards.add(new SetCardInfo("Conclave Guildmage", 162, Rarity.UNCOMMON, mage.cards.c.ConclaveGuildmage.class)); cards.add(new SetCardInfo("Conclave Tribunal", 6, Rarity.UNCOMMON, mage.cards.c.ConclaveTribunal.class)); cards.add(new SetCardInfo("Connive // Concoct", 222, Rarity.RARE, mage.cards.c.ConniveConcoct.class)); From 73dc3e96a3547b0193cb00ff2a02007f677d9bee Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 17 Sep 2018 19:52:26 -0400 Subject: [PATCH 006/140] Implemented Gird for Battle --- Mage.Sets/src/mage/cards/g/GirdForBattle.java | 35 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 36 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/g/GirdForBattle.java diff --git a/Mage.Sets/src/mage/cards/g/GirdForBattle.java b/Mage.Sets/src/mage/cards/g/GirdForBattle.java new file mode 100644 index 00000000000..7b2338edf1c --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GirdForBattle.java @@ -0,0 +1,35 @@ +package mage.cards.g; + +import java.util.UUID; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.counters.CounterType; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class GirdForBattle extends CardImpl { + + public GirdForBattle(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{W}"); + + // Put a +1/+1 counter on each of up to two target creatures. + this.getSpellAbility().addEffect(new AddCountersTargetEffect( + CounterType.P1P1.createInstance() + ).setText("Put a +1/+1 counter on each of up to two target creatures")); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2)); + } + + public GirdForBattle(final GirdForBattle card) { + super(card); + } + + @Override + public GirdForBattle copy() { + return new GirdForBattle(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 89efdb5d5e5..b58b552c128 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -77,6 +77,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Fresh-Faced Recruit", 216, Rarity.COMMON, mage.cards.f.FreshFacedRecruit.class)); cards.add(new SetCardInfo("Garrison Sergeant", 172, Rarity.COMMON, mage.cards.g.GarrisonSergeant.class)); cards.add(new SetCardInfo("Gateway Plaza", 247, Rarity.COMMON, mage.cards.g.GatewayPlaza.class)); + cards.add(new SetCardInfo("Gird for Battle", 12, Rarity.UNCOMMON, mage.cards.g.GirdForBattle.class)); cards.add(new SetCardInfo("Glaive of the Guildpact", 236, Rarity.UNCOMMON, mage.cards.g.GlaiveOfTheGuildpact.class)); cards.add(new SetCardInfo("Glowspore Shaman", 173, Rarity.UNCOMMON, mage.cards.g.GlowsporeShaman.class)); cards.add(new SetCardInfo("Goblin Banneret", 102, Rarity.UNCOMMON, mage.cards.g.GoblinBanneret.class)); From 6d194707251adfbce9765e3f43a39e955877b6c1 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 17 Sep 2018 19:59:33 -0400 Subject: [PATCH 007/140] Implemented Haazda Marshal --- Mage.Sets/src/mage/cards/h/HaazdaMarshal.java | 75 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 76 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/h/HaazdaMarshal.java diff --git a/Mage.Sets/src/mage/cards/h/HaazdaMarshal.java b/Mage.Sets/src/mage/cards/h/HaazdaMarshal.java new file mode 100644 index 00000000000..fde0b161308 --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HaazdaMarshal.java @@ -0,0 +1,75 @@ +package mage.cards.h; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.token.SoldierLifelinkToken; + +/** + * + * @author TheElk801 + */ +public final class HaazdaMarshal extends CardImpl { + + public HaazdaMarshal(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{W}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Whenever Haazda Marshal and at least two other creatures attack, create a 1/1 white Solider creature token with lifelink. + this.addAbility(new HaazdaMarshalTriggeredAbility()); + } + + public HaazdaMarshal(final HaazdaMarshal card) { + super(card); + } + + @Override + public HaazdaMarshal copy() { + return new HaazdaMarshal(this); + } +} + +class HaazdaMarshalTriggeredAbility extends TriggeredAbilityImpl { + + public HaazdaMarshalTriggeredAbility() { + super(Zone.BATTLEFIELD, new CreateTokenEffect(new SoldierLifelinkToken())); + } + + public HaazdaMarshalTriggeredAbility(final HaazdaMarshalTriggeredAbility ability) { + super(ability); + } + + @Override + public HaazdaMarshalTriggeredAbility copy() { + return new HaazdaMarshalTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DECLARED_ATTACKERS; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + return game.getCombat().getAttackers().size() >= 3 + && game.getCombat().getAttackers().contains(this.sourceId); + } + + @Override + public String getRule() { + return "Whenever {this} and at least two other creatures attack, " + + "create a 1/1 white Solider creature token with lifelink."; + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index b58b552c128..45b293c9f07 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -89,6 +89,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Golgari Locket", 237, Rarity.COMMON, mage.cards.g.GolgariLocket.class)); cards.add(new SetCardInfo("Golgari Raiders", 130, Rarity.UNCOMMON, mage.cards.g.GolgariRaiders.class)); cards.add(new SetCardInfo("Guild Summit", 41, Rarity.UNCOMMON, mage.cards.g.GuildSummit.class)); + cards.add(new SetCardInfo("Haazda Marshal", 13, Rarity.UNCOMMON, mage.cards.h.HaazdaMarshal.class)); cards.add(new SetCardInfo("Hammer Dropper", 176, Rarity.COMMON, mage.cards.h.HammerDropper.class)); cards.add(new SetCardInfo("Healer's Hawk", 14, Rarity.COMMON, mage.cards.h.HealersHawk.class)); cards.add(new SetCardInfo("House Guildmage", 177, Rarity.UNCOMMON, mage.cards.h.HouseGuildmage.class)); From da57d93e7d003c5779f80531a79ceae7eb5a4f45 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 17 Sep 2018 20:07:06 -0400 Subject: [PATCH 008/140] Implemented Join Shields --- Mage.Sets/src/mage/cards/j/JoinShields.java | 45 ++++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 46 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/j/JoinShields.java diff --git a/Mage.Sets/src/mage/cards/j/JoinShields.java b/Mage.Sets/src/mage/cards/j/JoinShields.java new file mode 100644 index 00000000000..f2aac62ca92 --- /dev/null +++ b/Mage.Sets/src/mage/cards/j/JoinShields.java @@ -0,0 +1,45 @@ +package mage.cards.j; + +import java.util.UUID; +import mage.abilities.effects.common.UntapAllEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.HexproofAbility; +import mage.abilities.keyword.IndestructibleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.StaticFilters; + +/** + * + * @author TheElk801 + */ +public final class JoinShields extends CardImpl { + + public JoinShields(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{G}{W}"); + + // Untap all creatures you control. They gain hexproof and indestructible until end of turn. + this.getSpellAbility().addEffect(new UntapAllEffect( + StaticFilters.FILTER_CONTROLLED_CREATURES + )); + this.getSpellAbility().addEffect(new GainAbilityControlledEffect( + HexproofAbility.getInstance(), Duration.EndOfTurn, + StaticFilters.FILTER_CONTROLLED_CREATURES + ).setText("They gain hexproof")); + this.getSpellAbility().addEffect(new GainAbilityControlledEffect( + IndestructibleAbility.getInstance(), Duration.EndOfTurn, + StaticFilters.FILTER_CONTROLLED_CREATURES + ).setText("and indestructible until end of turn")); + } + + public JoinShields(final JoinShields card) { + super(card); + } + + @Override + public JoinShields copy() { + return new JoinShields(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 45b293c9f07..6bcf3baac4c 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -105,6 +105,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Izzet Guildgate", 251, Rarity.COMMON, mage.cards.i.IzzetGuildgate.class)); cards.add(new SetCardInfo("Izzet Guildgate", 252, Rarity.COMMON, mage.cards.i.IzzetGuildgate.class)); cards.add(new SetCardInfo("Izzet Locket", 238, Rarity.COMMON, mage.cards.i.IzzetLocket.class)); + cards.add(new SetCardInfo("Join Shields", 181, Rarity.UNCOMMON, mage.cards.j.JoinShields.class)); cards.add(new SetCardInfo("Knight of Autumn", 183, Rarity.RARE, mage.cards.k.KnightOfAutumn.class)); cards.add(new SetCardInfo("Lava Coil", 108, Rarity.UNCOMMON, mage.cards.l.LavaCoil.class)); cards.add(new SetCardInfo("Lazav, the Multifarious", 184, Rarity.MYTHIC, mage.cards.l.LazavTheMultifarious.class)); From 13f99ad033ec154988fe42f28927f66ea2156867 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 17 Sep 2018 20:11:53 -0400 Subject: [PATCH 009/140] Implemented Light of the Legion --- .../src/mage/cards/l/LightOfTheLegion.java | 58 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 59 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/l/LightOfTheLegion.java diff --git a/Mage.Sets/src/mage/cards/l/LightOfTheLegion.java b/Mage.Sets/src/mage/cards/l/LightOfTheLegion.java new file mode 100644 index 00000000000..c9581e39495 --- /dev/null +++ b/Mage.Sets/src/mage/cards/l/LightOfTheLegion.java @@ -0,0 +1,58 @@ +package mage.cards.l; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.common.DiesTriggeredAbility; +import mage.abilities.effects.common.counter.AddCountersAllEffect; +import mage.constants.SubType; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.MentorAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.counters.CounterType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.mageobject.ColorPredicate; + +/** + * + * @author TheElk801 + */ +public final class LightOfTheLegion extends CardImpl { + + private static final FilterPermanent filter = new FilterControlledCreaturePermanent("white creature you control"); + + static { + filter.add(new ColorPredicate(ObjectColor.WHITE)); + } + + public LightOfTheLegion(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{W}{W}"); + + this.subtype.add(SubType.ANGEL); + this.power = new MageInt(5); + this.toughness = new MageInt(5); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Mentor + this.addAbility(new MentorAbility()); + + // When Light of the Legion dies, put a +1/+1 counter on each white creature you control. + this.addAbility(new DiesTriggeredAbility(new AddCountersAllEffect( + CounterType.P1P1.createInstance(), filter + ))); + } + + public LightOfTheLegion(final LightOfTheLegion card) { + super(card); + } + + @Override + public LightOfTheLegion copy() { + return new LightOfTheLegion(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 6bcf3baac4c..5a54eab94d6 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -113,6 +113,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Ledev Guardian", 18, Rarity.COMMON, mage.cards.l.LedevGuardian.class)); cards.add(new SetCardInfo("Legion Guildmage", 187, Rarity.UNCOMMON, mage.cards.l.LegionGuildmage.class)); cards.add(new SetCardInfo("Legion Warboss", 109, Rarity.RARE, mage.cards.l.LegionWarboss.class)); + cards.add(new SetCardInfo("Light of the Legion", 19, Rarity.RARE, mage.cards.l.LightOfTheLegion.class)); cards.add(new SetCardInfo("Lotleth Giant", 74, Rarity.UNCOMMON, mage.cards.l.LotlethGiant.class)); cards.add(new SetCardInfo("Loxodon Restorer", 20, Rarity.COMMON, mage.cards.l.LoxodonRestorer.class)); cards.add(new SetCardInfo("March of the Multitudes", 188, Rarity.MYTHIC, mage.cards.m.MarchOfTheMultitudes.class)); From 235ef69b5f06a4a375c13e5341a8b4c5845c9167 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 17 Sep 2018 20:17:09 -0400 Subject: [PATCH 010/140] Implemented Roc Charger --- Mage.Sets/src/mage/cards/r/RocCharger.java | 61 ++++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 62 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/r/RocCharger.java diff --git a/Mage.Sets/src/mage/cards/r/RocCharger.java b/Mage.Sets/src/mage/cards/r/RocCharger.java new file mode 100644 index 00000000000..d9b5f7911d0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RocCharger.java @@ -0,0 +1,61 @@ +package mage.cards.r; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.common.FilterAttackingCreature; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.AbilityPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class RocCharger extends CardImpl { + + static final FilterAttackingCreature filter + = new FilterAttackingCreature("attacking creature without flying"); + + static { + filter.add(Predicates.not(new AbilityPredicate(FlyingAbility.class))); + } + + public RocCharger(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}"); + + this.subtype.add(SubType.BIRD); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Whenever Roc Charger attacks, target attacking creature without flying gains flying until end of turn. + Ability ability = new AttacksTriggeredAbility( + new GainAbilityTargetEffect( + FlyingAbility.getInstance(), + Duration.EndOfTurn + ), false + ); + ability.addTarget(new TargetCreaturePermanent(filter)); + addAbility(ability); + } + + public RocCharger(final RocCharger card) { + super(card); + } + + @Override + public RocCharger copy() { + return new RocCharger(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 5a54eab94d6..b9b0d47e54d 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -150,6 +150,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Ral, Izzet Viceroy", 195, Rarity.MYTHIC, mage.cards.r.RalIzzetViceroy.class)); cards.add(new SetCardInfo("Response // Resurgence", 229, Rarity.RARE, mage.cards.r.ResponseResurgence.class)); cards.add(new SetCardInfo("Ritual of Soot", 84, Rarity.RARE, mage.cards.r.RitualOfSoot.class)); + cards.add(new SetCardInfo("Roc Charger", 24, Rarity.UNCOMMON, mage.cards.r.RocCharger.class)); cards.add(new SetCardInfo("Rosemane Centaur", 197, Rarity.COMMON, mage.cards.r.RosemaneCentaur.class)); cards.add(new SetCardInfo("Runaway Steam-Kin", 115, Rarity.RARE, mage.cards.r.RunawaySteamKin.class)); cards.add(new SetCardInfo("Sacred Foundry", 254, Rarity.RARE, mage.cards.s.SacredFoundry.class)); From 9e155309ef7a13e1d1b061c7a151ed941d2ac9a1 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 17 Sep 2018 20:20:34 -0400 Subject: [PATCH 011/140] Implemented Sprouting Renewal --- .../src/mage/cards/s/SproutingRenewal.java | 47 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 48 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SproutingRenewal.java diff --git a/Mage.Sets/src/mage/cards/s/SproutingRenewal.java b/Mage.Sets/src/mage/cards/s/SproutingRenewal.java new file mode 100644 index 00000000000..4a9e9c4285c --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SproutingRenewal.java @@ -0,0 +1,47 @@ +package mage.cards.s; + +import java.util.UUID; +import mage.abilities.Mode; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.keyword.ConvokeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.StaticFilters; +import mage.game.permanent.token.ElfKnightToken; +import mage.target.TargetPermanent; + +/** + * + * @author TheElk801 + */ +public final class SproutingRenewal extends CardImpl { + + public SproutingRenewal(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{G}"); + + // Convoke + this.addAbility(new ConvokeAbility()); + + // Choose one — + // • Create a 2/2 green and white Elf Knight creature token with vigilance. + this.getSpellAbility().addEffect(new CreateTokenEffect(new ElfKnightToken())); + + // • Destroy target artifact or enchantment. + Mode mode = new Mode(new DestroyTargetEffect()); + mode.addTarget(new TargetPermanent( + StaticFilters.FILTER_PERMANENT_ARTIFACT_OR_ENCHANTMENT + )); + this.getSpellAbility().addMode(mode); + } + + public SproutingRenewal(final SproutingRenewal card) { + super(card); + } + + @Override + public SproutingRenewal copy() { + return new SproutingRenewal(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index b9b0d47e54d..c82d1f9cbce 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -161,6 +161,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Sinister Sabotage", 54, Rarity.UNCOMMON, mage.cards.s.SinisterSabotage.class)); cards.add(new SetCardInfo("Skyknight Legionnaire", 198, Rarity.COMMON, mage.cards.s.SkyknightLegionnaire.class)); cards.add(new SetCardInfo("Sonic Assault", 199, Rarity.COMMON, mage.cards.s.SonicAssault.class)); + cards.add(new SetCardInfo("Sprouting Renewal", 145, Rarity.UNCOMMON, mage.cards.s.SproutingRenewal.class)); cards.add(new SetCardInfo("Status // Statue", 230, Rarity.UNCOMMON, mage.cards.s.StatusStatue.class)); cards.add(new SetCardInfo("Steam Vents", 257, Rarity.RARE, mage.cards.s.SteamVents.class)); cards.add(new SetCardInfo("Sumala Woodshaper", 200, Rarity.COMMON, mage.cards.s.SumalaWoodshaper.class)); From 66c41358c3b0f7afd133eef4782a77f48398acdf Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 17 Sep 2018 20:30:31 -0400 Subject: [PATCH 012/140] Implemented Swathcutter Giant --- .../src/mage/cards/s/SwathcutterGiant.java | 75 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 76 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SwathcutterGiant.java diff --git a/Mage.Sets/src/mage/cards/s/SwathcutterGiant.java b/Mage.Sets/src/mage/cards/s/SwathcutterGiant.java new file mode 100644 index 00000000000..3113d45bd05 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SwathcutterGiant.java @@ -0,0 +1,75 @@ +package mage.cards.s; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DamageAllEffect; +import mage.constants.SubType; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerIdPredicate; +import mage.game.Game; + +/** + * + * @author TheElk801 + */ +public final class SwathcutterGiant extends CardImpl { + + public SwathcutterGiant(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{R}{W}"); + + this.subtype.add(SubType.GIANT); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(5); + this.toughness = new MageInt(5); + + // Vigilance + this.addAbility(VigilanceAbility.getInstance()); + + // Whenever Swathcutter Giant attacks, it deals 1 damage to each creature defending player controls. + this.addAbility(new AttacksTriggeredAbility(new SwathcutterGiantEffect(), false)); + } + + public SwathcutterGiant(final SwathcutterGiant card) { + super(card); + } + + @Override + public SwathcutterGiant copy() { + return new SwathcutterGiant(this); + } +} + +class SwathcutterGiantEffect extends OneShotEffect { + + public SwathcutterGiantEffect() { + super(Outcome.Benefit); + this.staticText = "it deals 1 damage to each creature " + + "defending player controls."; + } + + public SwathcutterGiantEffect(final SwathcutterGiantEffect effect) { + super(effect); + } + + @Override + public SwathcutterGiantEffect copy() { + return new SwathcutterGiantEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + FilterCreaturePermanent filter = new FilterCreaturePermanent(); + filter.add(new ControllerIdPredicate( + game.getCombat().getDefenderId(source.getSourceId()) + )); + return new DamageAllEffect(1, filter).apply(game, source); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index c82d1f9cbce..77bfa6b75c6 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -168,6 +168,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Sunhome Stalwart", 26, Rarity.UNCOMMON, mage.cards.s.SunhomeStalwart.class)); cards.add(new SetCardInfo("Swamp", 262, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Swarm Guildmage", 201, Rarity.UNCOMMON, mage.cards.s.SwarmGuildmage.class)); + cards.add(new SetCardInfo("Swathcutter Giant", 202, Rarity.UNCOMMON, mage.cards.s.SwathcutterGiant.class)); cards.add(new SetCardInfo("Swiftblade Vindicator", 203, Rarity.RARE, mage.cards.s.SwiftbladeVindicator.class)); cards.add(new SetCardInfo("Temple Garden", 258, Rarity.RARE, mage.cards.t.TempleGarden.class)); cards.add(new SetCardInfo("Thought Erasure", 206, Rarity.UNCOMMON, mage.cards.t.ThoughtErasure.class)); From bbe8df39dbdcfa318724079d40ad739a1d161851 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 17 Sep 2018 20:36:21 -0400 Subject: [PATCH 013/140] Implemented Undercity Uprising --- .../src/mage/cards/u/UndercityUprising.java | 52 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 53 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/u/UndercityUprising.java diff --git a/Mage.Sets/src/mage/cards/u/UndercityUprising.java b/Mage.Sets/src/mage/cards/u/UndercityUprising.java new file mode 100644 index 00000000000..86eb2368340 --- /dev/null +++ b/Mage.Sets/src/mage/cards/u/UndercityUprising.java @@ -0,0 +1,52 @@ +package mage.cards.u; + +import java.util.UUID; +import mage.abilities.effects.common.FightTargetsEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.DeathtouchAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.TargetController; +import mage.filter.StaticFilters; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class UndercityUprising extends CardImpl { + + private static final FilterCreaturePermanent filter + = new FilterCreaturePermanent("creature you don't control"); + + static { + filter.add(new ControllerPredicate(TargetController.NOT_YOU)); + } + + public UndercityUprising(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{B}{G}"); + + // Creatures you control gain deathtouch until end of turn. Target creature you control fights target creature you don't control. + this.getSpellAbility().addEffect(new GainAbilityControlledEffect( + DeathtouchAbility.getInstance(), Duration.EndOfTurn, + StaticFilters.FILTER_CONTROLLED_CREATURES + )); + this.getSpellAbility().addEffect(new FightTargetsEffect()); + this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); + } + + public UndercityUprising(final UndercityUprising card) { + super(card); + } + + @Override + public UndercityUprising copy() { + return new UndercityUprising(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 77bfa6b75c6..cd432667752 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -175,6 +175,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Thoughtbound Phantasm", 55, Rarity.UNCOMMON, mage.cards.t.ThoughtboundPhantasm.class)); cards.add(new SetCardInfo("Trostani Discordant", 208, Rarity.MYTHIC, mage.cards.t.TrostaniDiscordant.class)); cards.add(new SetCardInfo("Truefire Captain", 209, Rarity.UNCOMMON, mage.cards.t.TruefireCaptain.class)); + cards.add(new SetCardInfo("Undercity Uprising", 210, Rarity.COMMON, mage.cards.u.UndercityUprising.class)); cards.add(new SetCardInfo("Underrealm Lich", 211, Rarity.MYTHIC, mage.cards.u.UnderrealmLich.class)); cards.add(new SetCardInfo("Unexplained Disappearance", 56, Rarity.COMMON, mage.cards.u.UnexplainedDisappearance.class)); cards.add(new SetCardInfo("Venerated Loxodon", 30, Rarity.RARE, mage.cards.v.VeneratedLoxodon.class)); From 2d3649cc4bc49ff2b4d753e30cea6879cbed0c5e Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 17 Sep 2018 20:37:58 -0400 Subject: [PATCH 014/140] Implemented Worldsoul Colossus --- .../src/mage/cards/w/WorldsoulColossus.java | 46 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 47 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/w/WorldsoulColossus.java diff --git a/Mage.Sets/src/mage/cards/w/WorldsoulColossus.java b/Mage.Sets/src/mage/cards/w/WorldsoulColossus.java new file mode 100644 index 00000000000..0f87ed598a4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WorldsoulColossus.java @@ -0,0 +1,46 @@ +package mage.cards.w; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.effects.common.EntersBattlefieldWithXCountersEffect; +import mage.constants.SubType; +import mage.abilities.keyword.ConvokeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.counters.CounterType; + +/** + * + * @author TheElk801 + */ +public final class WorldsoulColossus extends CardImpl { + + public WorldsoulColossus(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{X}{G}{W}"); + + this.subtype.add(SubType.ELEMENTAL); + this.power = new MageInt(0); + this.toughness = new MageInt(0); + + // Convoke + this.addAbility(new ConvokeAbility()); + + // Worldsoul Colossus enters the battlefield with X +1/+1 counters on it. + this.addAbility(new EntersBattlefieldAbility( + new EntersBattlefieldWithXCountersEffect( + CounterType.P1P1.createInstance() + ) + )); + } + + public WorldsoulColossus(final WorldsoulColossus card) { + super(card); + } + + @Override + public WorldsoulColossus copy() { + return new WorldsoulColossus(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index cd432667752..a120bceeb52 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -190,5 +190,6 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Whisper Agent", 220, Rarity.COMMON, mage.cards.w.WhisperAgent.class)); cards.add(new SetCardInfo("Whispering Snitch", 90, Rarity.UNCOMMON, mage.cards.w.WhisperingSnitch.class)); cards.add(new SetCardInfo("Wojek Bodyguard", 120, Rarity.COMMON, mage.cards.w.WojekBodyguard.class)); + cards.add(new SetCardInfo("Worldsoul Colossus", 215, Rarity.UNCOMMON, mage.cards.w.WorldsoulColossus.class)); } } From a4476191bb520117b02cef881d786432912067b4 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 17 Sep 2018 20:52:21 -0400 Subject: [PATCH 015/140] Implemented Justice Strike --- Mage.Sets/src/mage/cards/j/JusticeStrike.java | 62 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 63 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/j/JusticeStrike.java diff --git a/Mage.Sets/src/mage/cards/j/JusticeStrike.java b/Mage.Sets/src/mage/cards/j/JusticeStrike.java new file mode 100644 index 00000000000..db01871ddb1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/j/JusticeStrike.java @@ -0,0 +1,62 @@ +package mage.cards.j; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class JusticeStrike extends CardImpl { + + public JusticeStrike(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{R}{W}"); + + // Target creature deals damage to itself equal to its power. + this.getSpellAbility().addEffect(new JusticeStrikeEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + public JusticeStrike(final JusticeStrike card) { + super(card); + } + + @Override + public JusticeStrike copy() { + return new JusticeStrike(this); + } +} + +class JusticeStrikeEffect extends OneShotEffect { + + public JusticeStrikeEffect() { + super(Outcome.Benefit); + this.staticText = "Target creature deals damage to itself equal to its power."; + } + + public JusticeStrikeEffect(final JusticeStrikeEffect effect) { + super(effect); + } + + @Override + public JusticeStrikeEffect copy() { + return new JusticeStrikeEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(source.getFirstTarget()); + if (permanent == null) { + return false; + } + return permanent.damage(permanent.getPower().getValue(), permanent.getId(), game, false, true) > 0; + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index a120bceeb52..8a0877679c7 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -106,6 +106,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Izzet Guildgate", 252, Rarity.COMMON, mage.cards.i.IzzetGuildgate.class)); cards.add(new SetCardInfo("Izzet Locket", 238, Rarity.COMMON, mage.cards.i.IzzetLocket.class)); cards.add(new SetCardInfo("Join Shields", 181, Rarity.UNCOMMON, mage.cards.j.JoinShields.class)); + cards.add(new SetCardInfo("Justice Strike", 182, Rarity.UNCOMMON, mage.cards.j.JusticeStrike.class)); cards.add(new SetCardInfo("Knight of Autumn", 183, Rarity.RARE, mage.cards.k.KnightOfAutumn.class)); cards.add(new SetCardInfo("Lava Coil", 108, Rarity.UNCOMMON, mage.cards.l.LavaCoil.class)); cards.add(new SetCardInfo("Lazav, the Multifarious", 184, Rarity.MYTHIC, mage.cards.l.LazavTheMultifarious.class)); From 7f51656b0ae24c257521725581d7918b76ff8f1e Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 17 Sep 2018 21:46:01 -0400 Subject: [PATCH 016/140] Implemented Beacon Bolt --- Mage.Sets/src/mage/cards/b/BeaconBolt.java | 39 +++++++++++++++++ .../src/mage/cards/c/CracklingDrake.java | 3 +- .../src/mage/cards/r/RalIzzetViceroy.java | 43 +++---------------- Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + .../InstantSorceryExileGraveyardCount.java | 38 ++++++++++++++++ 5 files changed, 86 insertions(+), 38 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/b/BeaconBolt.java create mode 100644 Mage/src/main/java/mage/abilities/dynamicvalue/common/InstantSorceryExileGraveyardCount.java diff --git a/Mage.Sets/src/mage/cards/b/BeaconBolt.java b/Mage.Sets/src/mage/cards/b/BeaconBolt.java new file mode 100644 index 00000000000..39ec31e518e --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BeaconBolt.java @@ -0,0 +1,39 @@ +package mage.cards.b; + +import java.util.UUID; +import mage.abilities.dynamicvalue.common.InstantSorceryExileGraveyardCount; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.keyword.JumpStartAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author TheElk801 + */ +public final class BeaconBolt extends CardImpl { + + public BeaconBolt(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{U}{R}"); + + // Beacon Bolt deals damage to target creature equal to the total number of instant and sorcery cards you own in exile and in your graveyard. + this.getSpellAbility().addEffect(new DamageTargetEffect( + InstantSorceryExileGraveyardCount.instance + ).setText("{this} deals damage to target creature equal to " + + "the total number of instant and sorcery cards " + + "you own in exile and in your graveyard")); + + // Jump-start + this.addAbility(new JumpStartAbility(this)); + } + + public BeaconBolt(final BeaconBolt card) { + super(card); + } + + @Override + public BeaconBolt copy() { + return new BeaconBolt(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CracklingDrake.java b/Mage.Sets/src/mage/cards/c/CracklingDrake.java index 6399b30b47f..bfe02721df1 100644 --- a/Mage.Sets/src/mage/cards/c/CracklingDrake.java +++ b/Mage.Sets/src/mage/cards/c/CracklingDrake.java @@ -6,6 +6,7 @@ import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.InstantSorceryExileGraveyardCount; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.continuous.SetPowerSourceEffect; @@ -40,7 +41,7 @@ public final class CracklingDrake extends CardImpl { this.addAbility(new SimpleStaticAbility( Zone.ALL, new SetPowerSourceEffect( - new CracklingDrakeCount(), Duration.EndOfGame + InstantSorceryExileGraveyardCount.instance, Duration.EndOfGame ).setText("{this}'s power is equal to the total number " + "of instant and sorcery cards you own " + "in exile and in your graveyard.") diff --git a/Mage.Sets/src/mage/cards/r/RalIzzetViceroy.java b/Mage.Sets/src/mage/cards/r/RalIzzetViceroy.java index 45f603a1b59..556963a5905 100644 --- a/Mage.Sets/src/mage/cards/r/RalIzzetViceroy.java +++ b/Mage.Sets/src/mage/cards/r/RalIzzetViceroy.java @@ -4,9 +4,8 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.InstantSorceryExileGraveyardCount; import mage.abilities.dynamicvalue.common.StaticValue; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; @@ -17,9 +16,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; import mage.filter.StaticFilters; -import mage.game.Game; import mage.game.command.emblems.RalIzzetViceroyEmblem; -import mage.players.Player; import mage.target.common.TargetCreaturePermanent; /** @@ -44,13 +41,11 @@ public final class RalIzzetViceroy extends CardImpl { )); // -3: Ral, Izzet Viceroy deals damage to target creature equal to the total number of instant and sorcery cards you own in exile and in your graveyard. - Ability ability = new LoyaltyAbility( - new DamageTargetEffect(new RalIzzetViceroyCount()) - .setText("{this} deals damage to target creature " - + "equal to the total number of instant " - + "and sorcery cards you own in exile " - + "and in your graveyard"), -3 - ); + Ability ability = new LoyaltyAbility(new DamageTargetEffect( + InstantSorceryExileGraveyardCount.instance + ).setText("{this} deals damage to target creature equal to " + + "the total number of instant and sorcery cards " + + "you own in exile and in your graveyard"), -3); ability.addTarget(new TargetCreaturePermanent()); this.addAbility(ability); @@ -69,29 +64,3 @@ public final class RalIzzetViceroy extends CardImpl { return new RalIzzetViceroy(this); } } - -class RalIzzetViceroyCount implements DynamicValue { - - @Override - public int calculate(Game game, Ability sourceAbility, Effect effect) { - Player player = game.getPlayer(sourceAbility.getControllerId()); - if (player != null) { - return player.getGraveyard().count( - StaticFilters.FILTER_CARD_INSTANT_OR_SORCERY, game - ) + game.getExile().getExileZone(player.getId()).count( - StaticFilters.FILTER_CARD_INSTANT_OR_SORCERY, game - ); - } - return 0; - } - - @Override - public RalIzzetViceroyCount copy() { - return new RalIzzetViceroyCount(); - } - - @Override - public String getMessage() { - return ""; - } -} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 8a0877679c7..158389761eb 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -31,6 +31,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Attendant of Vraska", 271, Rarity.UNCOMMON, mage.cards.a.AttendantOfVraska.class)); cards.add(new SetCardInfo("Aurelia, Exemplar of Justice", 153, Rarity.MYTHIC, mage.cards.a.AureliaExemplarOfJustice.class)); cards.add(new SetCardInfo("Barging Sergeant", 92, Rarity.COMMON, mage.cards.b.BargingSergeant.class)); + cards.add(new SetCardInfo("Beacon Bolt", 154, Rarity.UNCOMMON, mage.cards.b.BeaconBolt.class)); cards.add(new SetCardInfo("Beast Whisperer", 123, Rarity.RARE, mage.cards.b.BeastWhisperer.class)); cards.add(new SetCardInfo("Blade Instructor", 1, Rarity.COMMON, mage.cards.b.BladeInstructor.class)); cards.add(new SetCardInfo("Blood Operative", 63, Rarity.RARE, mage.cards.b.BloodOperative.class)); diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/InstantSorceryExileGraveyardCount.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/InstantSorceryExileGraveyardCount.java new file mode 100644 index 00000000000..744ae371f46 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/InstantSorceryExileGraveyardCount.java @@ -0,0 +1,38 @@ +package mage.abilities.dynamicvalue.common; + +import mage.abilities.Ability; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.Effect; +import mage.game.Game; +import mage.filter.StaticFilters; +import mage.players.Player; + +/** + * @author TheElk801 + */ +public enum InstantSorceryExileGraveyardCount implements DynamicValue { + instance; + + @Override + public int calculate(Game game, Ability sourceAbility, Effect effect) { + Player player = game.getPlayer(sourceAbility.getControllerId()); + if (player != null) { + return player.getGraveyard().count( + StaticFilters.FILTER_CARD_INSTANT_OR_SORCERY, game + ) + game.getExile().getExileZone(player.getId()).count( + StaticFilters.FILTER_CARD_INSTANT_OR_SORCERY, game + ); + } + return 0; + } + + @Override + public InstantSorceryExileGraveyardCount copy() { + return instance; + } + + @Override + public String getMessage() { + return ""; + } +} From 96ff91b00f73d0e81344816389f21317153baa12 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 17 Sep 2018 22:24:38 -0400 Subject: [PATCH 017/140] fixed Chime of Night ability not triggering --- Mage.Sets/src/mage/cards/c/ChimeOfNight.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/c/ChimeOfNight.java b/Mage.Sets/src/mage/cards/c/ChimeOfNight.java index b1ea89b6f3d..5f3a207f0b7 100644 --- a/Mage.Sets/src/mage/cards/c/ChimeOfNight.java +++ b/Mage.Sets/src/mage/cards/c/ChimeOfNight.java @@ -1,4 +1,3 @@ - package mage.cards.c; import java.util.UUID; @@ -46,6 +45,7 @@ public final class ChimeOfNight extends CardImpl { // When Chime of Night is put into a graveyard from the battlefield, destroy target nonblack creature. ability = new PutIntoGraveFromBattlefieldSourceTriggeredAbility(new DestroyTargetEffect(), false); ability.addTarget(new TargetPermanent(filter)); + this.addAbility(ability); } public ChimeOfNight(final ChimeOfNight card) { From 47b431b322a28937c6cba3d9a6321804bc9c3ffc Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Mon, 17 Sep 2018 22:25:26 -0400 Subject: [PATCH 018/140] updated GRN spoiler --- Utils/mtg-cards-data.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index e717a2a6223..e65bc1c83d3 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -34400,7 +34400,7 @@ House Guildmage|Guilds of Ravnica|177|U|{U}{B}|Creature - Human Wizard|2|2|{1}{U Hypothesizzle|Guilds of Ravnica|178|C|{3}{U}{R}|Instant|||Draw two cards. Then you may discard a nonland card. When you do, Hypothesizzle deals 4 damage to target creature.| Ionize|Guilds of Ravnica|179|R|{1}{U}{R}|Instant|||Counter target spell. Ionize deals 2 damage to that spell's controller.| Izoni, Thousand-Eyed|Guilds of Ravnica|180|R|{2}{B}{B}{G}{G}|Legendary Creature - Elf Shaman|2|3|Undergrowth — When Izoni, Thousand-Eyed enters the battlefield, create a 1/1 black and green Insect creature token for each creature card in your graveyard.${B}{G}, Sacrifice another creature: You gain 1 life and draw a card.| -Join Shields|Guilds of Ravnica|181|U|{3}{G}{W}|Instant|||Untap all creatures you control. They gain indestructible and hexproof until end of turn.| +Join Shields|Guilds of Ravnica|181|U|{3}{G}{W}|Instant|||Untap all creatures you control. They gain hexproof and indestructible until end of turn.| Justice Strike|Guilds of Ravnica|182|U|{R}{W}|Instant|||Target creature deals damage to itself equal to its power.| Knight of Autumn|Guilds of Ravnica|183|R|{1}{G}{W}|Creature - Dryad Knight|2|1|When Knight of Autumn enters the battlefield, choose one —$• Put two +1/+1 counters on Knight of Autumn.$• Destroy target artifact or enchantment.$• You gain 4 life.| Lazav, the Multifarious|Guilds of Ravnica|184|M|{U}{B}|Legendary Creature - Shapeshifter|1|3|When Lazav, the Multifarious enters the battlefield, surveil 1.${X}: Lazav, the Multifarious becomes a copy of target creature card in your graveyard with converted mana cost X, except its name is Lazav, the Multifarious, it's legendary in addition to its other types, and it has this ability.| @@ -34414,6 +34414,7 @@ Niv-Mizzet, Parun|Guilds of Ravnica|192|R|{U}{U}{U}{R}{R}{R}|Legendary Creature Notion Rain|Guilds of Ravnica|193|C|{1}{U}{B}|Sorcery|||Surveil 2, then draw two cards. Notion Rain deals 2 damage to you.| Ochran Assassin|Guilds of Ravnica|194|U|{1}{B}{G}|Creature - Elf Assassin|1|1|Deathtouch$All creatures able to block Ochran Assassin do so.| Ral, Izzet Viceroy|Guilds of Ravnica|195|M|{3}{U}{R}|Legendary Planeswalker - Ral|5|+1: Look at the top two cards of your library. Put one of them into your hand and the other into your graveyard.$-3: Ral, Izzet Viceroy deals damage to target creature equal to the total number of instant and sorcery cards you own in exile and in your graveyard.$-8: You get an emblem with "Whenever you cast an instant or sorcery spell, this emblem deals 4 damage to any target and you draw two cards."| +Rhizome Lurcher|Guilds of Ravnica|196|C|{2}{B}{G}|Creature - Fungus Zombie|2|2|Undergrowth — Rhizome Lurcher enters the battlefield with a number of +1/+1 counters on it equal to the number of creature cards in your graveyard.| Rosemane Centaur|Guilds of Ravnica|197|C|{3}{G}{W}|Creature - Centaur Soldier|4|4|Convoke$Vigilance| Skyknight Legionnaire|Guilds of Ravnica|198|C|{1}{R}{W}|Creature - Human Knight|2|2|Flying, haste| Sonic Assault|Guilds of Ravnica|199|C|{1}{U}{R}|Instant|||Tap target creature. Sonic Assault deals 2 damage to that creature's controller.$Jump-start| From 024b7ccb5945a970a47d8948a4493f33d386b2c4 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 18 Sep 2018 08:01:08 -0400 Subject: [PATCH 019/140] Implemented Rhizome Lurcher --- .../src/mage/cards/r/RhizomeLurcher.java | 53 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 54 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/r/RhizomeLurcher.java diff --git a/Mage.Sets/src/mage/cards/r/RhizomeLurcher.java b/Mage.Sets/src/mage/cards/r/RhizomeLurcher.java new file mode 100644 index 00000000000..bfa45116495 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RhizomeLurcher.java @@ -0,0 +1,53 @@ +package mage.cards.r; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.AbilityWord; +import mage.constants.CardType; +import mage.counters.CounterType; +import mage.filter.StaticFilters; + +/** + * + * @author TheElk801 + */ +public final class RhizomeLurcher extends CardImpl { + + public RhizomeLurcher(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}{G}"); + + this.subtype.add(SubType.FUNGUS); + this.subtype.add(SubType.ZOMBIE); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Undergrowth — Rhizome Lurcher enters the battlefield with a number of +1/+1 counters on it equal to the number of creature cards in your graveyard. + Ability ability = new EntersBattlefieldAbility( + new AddCountersSourceEffect( + CounterType.P1P1.createInstance(0), + new CardsInControllerGraveyardCount( + StaticFilters.FILTER_CARD_CREATURE + ), true + ), "with a number of +1/+1 counters on it equal to " + + "the number of creature cards in your graveyard" + ); + ability.setAbilityWord(AbilityWord.UNDERGROWTH); + this.addAbility(ability); + } + + public RhizomeLurcher(final RhizomeLurcher card) { + super(card); + } + + @Override + public RhizomeLurcher copy() { + return new RhizomeLurcher(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 158389761eb..fe361a6e305 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -151,6 +151,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Ral, Caller of Storms", 265, Rarity.MYTHIC, mage.cards.r.RalCallerOfStorms.class)); cards.add(new SetCardInfo("Ral, Izzet Viceroy", 195, Rarity.MYTHIC, mage.cards.r.RalIzzetViceroy.class)); cards.add(new SetCardInfo("Response // Resurgence", 229, Rarity.RARE, mage.cards.r.ResponseResurgence.class)); + cards.add(new SetCardInfo("Rhizome Lurcher", 196, Rarity.COMMON, mage.cards.r.RhizomeLurcher.class)); cards.add(new SetCardInfo("Ritual of Soot", 84, Rarity.RARE, mage.cards.r.RitualOfSoot.class)); cards.add(new SetCardInfo("Roc Charger", 24, Rarity.UNCOMMON, mage.cards.r.RocCharger.class)); cards.add(new SetCardInfo("Rosemane Centaur", 197, Rarity.COMMON, mage.cards.r.RosemaneCentaur.class)); From b19a799b835009b1712ee57c3db75f53981e7019 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 18 Sep 2018 10:57:30 -0400 Subject: [PATCH 020/140] Implemented Hatchery Spider --- .../src/mage/cards/h/HatcherySpider.java | 121 ++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + .../common/CastSourceTriggeredAbility.java | 10 +- 3 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/h/HatcherySpider.java diff --git a/Mage.Sets/src/mage/cards/h/HatcherySpider.java b/Mage.Sets/src/mage/cards/h/HatcherySpider.java new file mode 100644 index 00000000000..ac3d189cc34 --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HatcherySpider.java @@ -0,0 +1,121 @@ +package mage.cards.h; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CastSourceTriggeredAbility; +import mage.constants.SubType; +import mage.abilities.keyword.ReachAbility; +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.ComparisonType; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.StaticFilters; +import mage.filter.common.FilterPermanentCard; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetCard; +import mage.target.common.TargetCardInLibrary; + +/** + * + * @author TheElk801 + */ +public final class HatcherySpider extends CardImpl { + + public HatcherySpider(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{G}{G}"); + + this.subtype.add(SubType.SPIDER); + this.power = new MageInt(5); + this.toughness = new MageInt(7); + + // Reach + this.addAbility(ReachAbility.getInstance()); + + // Undergrowth — When you cast this spell, reveal the top X cards of your library, where X is the number of creature cards in your graveyard. You may put a green permanent card with converted mana cost X or less from among them onto the battlefield. Put the rest on the bottom of your library in a random order. + this.addAbility(new CastSourceTriggeredAbility( + new HatcherySpiderEffect(), false, + "Undergrowth — " + )); + } + + public HatcherySpider(final HatcherySpider card) { + super(card); + } + + @Override + public HatcherySpider copy() { + return new HatcherySpider(this); + } +} + +class HatcherySpiderEffect extends OneShotEffect { + + public HatcherySpiderEffect() { + super(Outcome.Benefit); + this.staticText = "reveal the top X cards of your library, " + + "where X is the number of creature cards in your graveyard. " + + "You may put a green permanent card with converted mana cost " + + "X or less from among them onto the battlefield. " + + "Put the rest on the bottom of your library " + + "in a random order."; + } + + public HatcherySpiderEffect(final HatcherySpiderEffect effect) { + super(effect); + } + + @Override + public HatcherySpiderEffect copy() { + return new HatcherySpiderEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getFirstTarget()); + if (player == null) { + return false; + } + int xValue = new CardsInControllerGraveyardCount( + StaticFilters.FILTER_CARD_CREATURE + ).calculate(game, source, this); + FilterCard filter = new FilterPermanentCard( + "green permanent card with converted mana cost " + + xValue + " or less" + ); + filter.add(new ColorPredicate(ObjectColor.GREEN)); + filter.add(new ConvertedManaCostPredicate( + ComparisonType.FEWER_THAN, xValue + 1 + )); + TargetCard target = new TargetCardInLibrary(filter); + Cards cards = new CardsImpl( + player.getLibrary().getTopCards(game, xValue) + ); + if (player.chooseUse(outcome, "Put a card onto the battlefield?", source, game) + && player.choose(outcome, cards, target, game)) { + Card card = game.getCard(target.getFirstTarget()); + if (card != null + && player.moveCards(card, Zone.BATTLEFIELD, source, game)) { + cards.remove(card); + } + } + while (!cards.isEmpty()) { + Card card = cards.getRandom(game); + player.getLibrary().putOnBottom(card, game); + cards.remove(card); + } + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index fe361a6e305..57139111bbb 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -92,6 +92,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Guild Summit", 41, Rarity.UNCOMMON, mage.cards.g.GuildSummit.class)); cards.add(new SetCardInfo("Haazda Marshal", 13, Rarity.UNCOMMON, mage.cards.h.HaazdaMarshal.class)); cards.add(new SetCardInfo("Hammer Dropper", 176, Rarity.COMMON, mage.cards.h.HammerDropper.class)); + cards.add(new SetCardInfo("Hatchery Spider", 132, Rarity.RARE, mage.cards.h.HatcherySpider.class)); cards.add(new SetCardInfo("Healer's Hawk", 14, Rarity.COMMON, mage.cards.h.HealersHawk.class)); cards.add(new SetCardInfo("House Guildmage", 177, Rarity.UNCOMMON, mage.cards.h.HouseGuildmage.class)); cards.add(new SetCardInfo("Hunted Witness", 15, Rarity.COMMON, mage.cards.h.HuntedWitness.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/common/CastSourceTriggeredAbility.java b/Mage/src/main/java/mage/abilities/effects/common/CastSourceTriggeredAbility.java index 308c16b1890..b9b552d762c 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/CastSourceTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/effects/common/CastSourceTriggeredAbility.java @@ -1,4 +1,3 @@ - package mage.abilities.effects.common; import mage.MageObject; @@ -16,18 +15,25 @@ import mage.game.stack.Spell; public class CastSourceTriggeredAbility extends TriggeredAbilityImpl { public static final String SOURCE_CAST_SPELL_ABILITY = "sourceCastSpellAbility"; + private final String rulePrefix; public CastSourceTriggeredAbility(Effect effect) { this(effect, false); } public CastSourceTriggeredAbility(Effect effect, boolean optional) { + this(effect, optional, ""); + } + + public CastSourceTriggeredAbility(Effect effect, boolean optional, String rulePrefix) { super(Zone.STACK, effect, optional); this.ruleAtTheTop = true; + this.rulePrefix = rulePrefix; } public CastSourceTriggeredAbility(final CastSourceTriggeredAbility ability) { super(ability); + this.rulePrefix = ability.rulePrefix; } @Override @@ -59,6 +65,6 @@ public class CastSourceTriggeredAbility extends TriggeredAbilityImpl { @Override public String getRule() { - return "When you cast {source}, " + super.getRule(); + return rulePrefix + "When you cast this spell, " + super.getRule(); } } From 8792e0b5cf899d39a59b60155c5dc06f331e68c9 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 18 Sep 2018 11:42:37 -0400 Subject: [PATCH 021/140] Implemented Discovery // Dispersal --- .../src/mage/cards/d/DiscoveryDispersal.java | 126 ++++++++++++++++++ Mage.Sets/src/mage/cards/p/Preordain.java | 14 +- Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 3 files changed, 138 insertions(+), 3 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/d/DiscoveryDispersal.java diff --git a/Mage.Sets/src/mage/cards/d/DiscoveryDispersal.java b/Mage.Sets/src/mage/cards/d/DiscoveryDispersal.java new file mode 100644 index 00000000000..762421895e5 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DiscoveryDispersal.java @@ -0,0 +1,126 @@ +package mage.cards.d; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.ReturnToHandFromBattlefieldAllEffect; +import mage.abilities.effects.common.discard.DiscardEachPlayerEffect; +import mage.abilities.effects.keyword.SurveilEffect; +import mage.cards.CardSetInfo; +import mage.cards.SplitCard; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.constants.Outcome; +import mage.constants.SpellAbilityType; +import mage.constants.TargetController; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterNonlandPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; +import mage.filter.predicate.permanent.ControllerIdPredicate; +import mage.filter.predicate.permanent.PermanentIdPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.Target; +import mage.target.TargetPermanent; + +/** + * + * @author TheElk801 + */ +public final class DiscoveryDispersal extends SplitCard { + + public DiscoveryDispersal(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, new CardType[]{CardType.INSTANT}, "{1}{U/B}", "{3}{U}{B}", SpellAbilityType.SPLIT); + + // Discovery + // Surveil 2, then draw a card. + this.getLeftHalfCard().getSpellAbility().addEffect( + new SurveilEffect(2).setText("Surveil 2,") + ); + this.getLeftHalfCard().getSpellAbility().addEffect( + new DrawCardSourceControllerEffect(1 + ).setText("then draw a card. (To surveil 2, " + + "look at the top two cards of your library, " + + "then put any number of them into your graveyard " + + "and the rest on top of your library " + + "in any order.)") + ); + + // Dispersal + // Each opponent returns a nonland permanent they control with the highest converted mana cost among permanents they control to its owner’s hand, then discards a card. + this.getLeftHalfCard().getSpellAbility().addEffect(new DispersalEffect()); + } + + public DiscoveryDispersal(final DiscoveryDispersal card) { + super(card); + } + + @Override + public DiscoveryDispersal copy() { + return new DiscoveryDispersal(this); + } +} + +class DispersalEffect extends OneShotEffect { + + public DispersalEffect() { + super(Outcome.Benefit); + this.staticText = "Each opponent returns a nonland permanent " + + "they control with the highest converted mana cost " + + "among permanents they control to its owner’s hand, " + + "then discards a card."; + } + + public DispersalEffect(final DispersalEffect effect) { + super(effect); + } + + @Override + public DispersalEffect copy() { + return new DispersalEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + Set permsToReturn = new HashSet(); + for (UUID opponentId : game.getOpponents(player.getId())) { + Player opponent = game.getPlayer(opponentId); + if (opponent == null) { + continue; + } + int highestCMC = 0; + for (Permanent permanent : game.getBattlefield().getAllActivePermanents(opponentId)) { + if (permanent != null && !permanent.isLand()) { + highestCMC = Math.max(highestCMC, permanent.getConvertedManaCost()); + } + } + FilterPermanent filter = new FilterNonlandPermanent("permanent you control with converted mana cost " + highestCMC); + filter.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, highestCMC)); + filter.add(new ControllerIdPredicate(opponentId)); + Target target = new TargetPermanent(1, 1, filter, true); + if (opponent.choose(outcome, target, source.getSourceId(), game)) { + if (target.getFirstTarget() == null) { + continue; + } + permsToReturn.add(new PermanentIdPredicate(target.getFirstTarget())); + } + } + FilterPermanent filter = new FilterPermanent(); + filter.add(Predicates.or(permsToReturn)); + new ReturnToHandFromBattlefieldAllEffect(filter).apply(game, source); + new DiscardEachPlayerEffect( + new StaticValue(1), false, TargetController.OPPONENT + ).apply(game, source); + return true; + } +} diff --git a/Mage.Sets/src/mage/cards/p/Preordain.java b/Mage.Sets/src/mage/cards/p/Preordain.java index 519fd4a4f48..4eae38cd40d 100644 --- a/Mage.Sets/src/mage/cards/p/Preordain.java +++ b/Mage.Sets/src/mage/cards/p/Preordain.java @@ -1,4 +1,3 @@ - package mage.cards.p; import java.util.UUID; @@ -18,8 +17,17 @@ public final class Preordain extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{U}"); // Scry 2, then draw a card. (To scry 2, look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) - this.getSpellAbility().addEffect(new ScryEffect(2)); - this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(1)); + this.getSpellAbility().addEffect( + new ScryEffect(2).setText("Scry 2, ") + ); + this.getSpellAbility().addEffect( + new DrawCardSourceControllerEffect(1) + .setText("then draw a card. (To scry 2, " + + "look at the top two cards of your library, " + + "then put any number of them on the " + + "bottom of your library and the rest on " + + "top in any order.)") + ); } public Preordain(final Preordain card) { diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 57139111bbb..7dd179fe5a9 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -63,6 +63,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Dimir Locket", 234, Rarity.COMMON, mage.cards.d.DimirLocket.class)); cards.add(new SetCardInfo("Dimir Spybug", 166, Rarity.UNCOMMON, mage.cards.d.DimirSpybug.class)); cards.add(new SetCardInfo("Direct Current", 96, Rarity.COMMON, mage.cards.d.DirectCurrent.class)); + cards.add(new SetCardInfo("Discovery // Dispersal", 223, Rarity.UNCOMMON, mage.cards.d.DiscoveryDispersal.class)); cards.add(new SetCardInfo("Disdainful Stroke", 37, Rarity.COMMON, mage.cards.d.DisdainfulStroke.class)); cards.add(new SetCardInfo("Disinformation Campaign", 167, Rarity.UNCOMMON, mage.cards.d.DisinformationCampaign.class)); cards.add(new SetCardInfo("District Guide", 128, Rarity.UNCOMMON, mage.cards.d.DistrictGuide.class)); From 5cdc14da4cd26a7e745b83c4f86d05cbbf1474ea Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 18 Sep 2018 11:58:56 -0400 Subject: [PATCH 022/140] Implemented Morgue Troll --- Mage.Sets/src/mage/cards/m/MorgueTroll.java | 76 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + .../effects/common/DoIfCostPaid.java | 5 +- 3 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 Mage.Sets/src/mage/cards/m/MorgueTroll.java diff --git a/Mage.Sets/src/mage/cards/m/MorgueTroll.java b/Mage.Sets/src/mage/cards/m/MorgueTroll.java new file mode 100644 index 00000000000..cf72fbf3388 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MorgueTroll.java @@ -0,0 +1,76 @@ +package mage.cards.m; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.DiscardTargetCost; +import mage.abilities.costs.common.ExileFromGraveCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.constants.SubType; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.StaticFilters; +import mage.target.common.TargetCardInHand; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author TheElk801 + */ +public final class MorgueTroll extends CardImpl { + + public MorgueTroll(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{G}"); + + this.subtype.add(SubType.TROLL); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // At the beginning of your upkeep, exile a creature card from your graveyard. If you do, put a +1/+1 counter on Morgue Troll. Otherwise sacrifice it. + this.addAbility(new BeginningOfUpkeepTriggeredAbility( + new DoIfCostPaid( + new AddCountersSourceEffect(CounterType.P1P1.createInstance()), + new SacrificeSourceEffect(), + new ExileFromGraveCost(new TargetCardInYourGraveyard( + StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD + )), false + ).setText("exile a creature card from your graveyard. " + + "If you do, put a +1/+1 counter on {this}." + + " Otherwise sacrifice it."), + TargetController.YOU, false + )); + + // {B}{G}, Discard a creature card: Put a +1/+1 counter on Morgue Troll. + Ability ability = new SimpleActivatedAbility( + Zone.BATTLEFIELD, + new AddCountersSourceEffect(CounterType.P1P1.createInstance()), + new ManaCostsImpl("{B}{G}") + ); + ability.addCost(new DiscardTargetCost( + new TargetCardInHand(StaticFilters.FILTER_CARD_CREATURE_A) + )); + this.addAbility(ability); + } + + public MorgueTroll(final MorgueTroll card) { + super(card); + } + + @Override + public MorgueTroll copy() { + return new MorgueTroll(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 7dd179fe5a9..6e28c404b95 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -128,6 +128,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Mission Briefing", 44, Rarity.RARE, mage.cards.m.MissionBriefing.class)); cards.add(new SetCardInfo("Molderhulk", 190, Rarity.UNCOMMON, mage.cards.m.Molderhulk.class)); cards.add(new SetCardInfo("Moodmark Painter", 78, Rarity.COMMON, mage.cards.m.MoodmarkPainter.class)); + cards.add(new SetCardInfo("Morgue Troll", 160, Rarity.RARE, mage.cards.m.MorgueTroll.class)); cards.add(new SetCardInfo("Mountain", 263, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Murmuring Mystic", 45, Rarity.UNCOMMON, mage.cards.m.MurmuringMystic.class)); cards.add(new SetCardInfo("Narcomoeba", 47, Rarity.RARE, mage.cards.n.Narcomoeba.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/common/DoIfCostPaid.java b/Mage/src/main/java/mage/abilities/effects/common/DoIfCostPaid.java index a5c530f11c1..845fe9e5a43 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DoIfCostPaid.java +++ b/Mage/src/main/java/mage/abilities/effects/common/DoIfCostPaid.java @@ -27,7 +27,10 @@ public class DoIfCostPaid extends OneShotEffect { } public DoIfCostPaid(Effect effect, Effect effect2, Cost cost) { - this(effect, cost, null, true); + this(effect,effect2,cost,true); + } + public DoIfCostPaid(Effect effect, Effect effect2, Cost cost,boolean optional) { + this(effect, cost, null, optional); this.otherwiseEffects.add(effect2); } From c4042800164aca6868737dad3b0f812e5c718f5e Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 18 Sep 2018 12:07:09 -0400 Subject: [PATCH 023/140] Implemented Risk Factor --- Mage.Sets/src/mage/cards/r/RiskFactor.java | 74 ++++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 75 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/r/RiskFactor.java diff --git a/Mage.Sets/src/mage/cards/r/RiskFactor.java b/Mage.Sets/src/mage/cards/r/RiskFactor.java new file mode 100644 index 00000000000..593af6728f7 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RiskFactor.java @@ -0,0 +1,74 @@ +package mage.cards.r; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.JumpStartAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.game.Game; +import mage.players.Player; +import mage.target.common.TargetOpponent; + +/** + * + * @author TheElk801 + */ +public final class RiskFactor extends CardImpl { + + public RiskFactor(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{R}"); + + // Target opponent may have Risk Factor deal 4 damage to them. If that player doesn't, you draw three cards. + this.getSpellAbility().addEffect(new RiskFactorEffect()); + this.getSpellAbility().addTarget(new TargetOpponent()); + + // Jump-start + this.addAbility(new JumpStartAbility(this)); + + } + + public RiskFactor(final RiskFactor card) { + super(card); + } + + @Override + public RiskFactor copy() { + return new RiskFactor(this); + } +} + +class RiskFactorEffect extends OneShotEffect { + + public RiskFactorEffect() { + super(Outcome.Benefit); + this.staticText = "Target opponent may have {this} deal 4 damage to them. " + + "If that player doesn't, you draw three cards."; + } + + public RiskFactorEffect(final RiskFactorEffect effect) { + super(effect); + } + + @Override + public RiskFactorEffect copy() { + return new RiskFactorEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Player opponent = game.getPlayer(source.getFirstTarget()); + if (controller == null || opponent == null) { + return false; + } + if (opponent.chooseUse(outcome, "Do you choose to take the damage?", source, game)) { + opponent.damage(4, source.getSourceId(), game, false, true); + } else { + controller.drawCards(3, game); + } + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 6e28c404b95..847d012092a 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -155,6 +155,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Ral, Izzet Viceroy", 195, Rarity.MYTHIC, mage.cards.r.RalIzzetViceroy.class)); cards.add(new SetCardInfo("Response // Resurgence", 229, Rarity.RARE, mage.cards.r.ResponseResurgence.class)); cards.add(new SetCardInfo("Rhizome Lurcher", 196, Rarity.COMMON, mage.cards.r.RhizomeLurcher.class)); + cards.add(new SetCardInfo("Risk Factor", 113, Rarity.RARE, mage.cards.r.RiskFactor.class)); cards.add(new SetCardInfo("Ritual of Soot", 84, Rarity.RARE, mage.cards.r.RitualOfSoot.class)); cards.add(new SetCardInfo("Roc Charger", 24, Rarity.UNCOMMON, mage.cards.r.RocCharger.class)); cards.add(new SetCardInfo("Rosemane Centaur", 197, Rarity.COMMON, mage.cards.r.RosemaneCentaur.class)); From ca64b42e51332ba3d0b69dac9ae08c7e29f88d21 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 18 Sep 2018 12:22:33 -0400 Subject: [PATCH 024/140] Implemented Ledev Champion --- Mage.Sets/src/mage/cards/l/LedevChampion.java | 109 ++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 110 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/l/LedevChampion.java diff --git a/Mage.Sets/src/mage/cards/l/LedevChampion.java b/Mage.Sets/src/mage/cards/l/LedevChampion.java new file mode 100644 index 00000000000..51d9b6dfdbc --- /dev/null +++ b/Mage.Sets/src/mage/cards/l/LedevChampion.java @@ -0,0 +1,109 @@ +package mage.cards.l; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.filter.predicate.permanent.TappedPredicate; +import mage.game.Game; +import mage.game.permanent.token.SoldierLifelinkToken; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class LedevChampion extends CardImpl { + + public LedevChampion(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}{W}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.KNIGHT); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Whenever Ledev Champion attacks, you may tap any number of untapped creatures you control. Ledev Champion gets +1/+1 until end of turn for each creature tapped this way. + this.addAbility(new AttacksTriggeredAbility( + new LedevChampionEffect(), false + )); + + // {3}{G}{W}: Create a 1/1 white soldier creature token with lifelink. + this.addAbility(new SimpleActivatedAbility( + Zone.BATTLEFIELD, + new CreateTokenEffect(new SoldierLifelinkToken()), + new ManaCostsImpl("{3}{G}{W}") + )); + } + + public LedevChampion(final LedevChampion card) { + super(card); + } + + @Override + public LedevChampion copy() { + return new LedevChampion(this); + } +} + +class LedevChampionEffect extends OneShotEffect { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("untapped creatures you control"); + + static { + filter.add(new ControllerPredicate(TargetController.YOU)); + filter.add(Predicates.not(new TappedPredicate())); + } + + public LedevChampionEffect() { + super(Outcome.GainLife); + staticText = "you may tap any number of untapped creatures you control. " + + "{this} gets +1/+1 until end of turn for each creature tapped this way."; + } + + public LedevChampionEffect(LedevChampionEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + int tappedAmount = 0; + TargetCreaturePermanent target = new TargetCreaturePermanent(0, Integer.MAX_VALUE, filter, true); + if (target.canChoose(source.getControllerId(), game) + && target.choose(Outcome.Tap, source.getControllerId(), source.getSourceId(), game)) { + for (UUID creature : target.getTargets()) { + if (creature != null) { + game.getPermanent(creature).tap(game); + tappedAmount++; + } + } + } + if (tappedAmount > 0) { + game.addEffect(new BoostSourceEffect(tappedAmount, tappedAmount, Duration.EndOfTurn), source); + return true; + } + return false; + } + + @Override + public LedevChampionEffect copy() { + return new LedevChampionEffect(this); + } + +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 847d012092a..8d7234ae2f5 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -114,6 +114,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Lava Coil", 108, Rarity.UNCOMMON, mage.cards.l.LavaCoil.class)); cards.add(new SetCardInfo("Lazav, the Multifarious", 184, Rarity.MYTHIC, mage.cards.l.LazavTheMultifarious.class)); cards.add(new SetCardInfo("League Guildmage", 185, Rarity.UNCOMMON, mage.cards.l.LeagueGuildmage.class)); + cards.add(new SetCardInfo("Ledev Champion", 186, Rarity.UNCOMMON, mage.cards.l.LedevChampion.class)); cards.add(new SetCardInfo("Ledev Guardian", 18, Rarity.COMMON, mage.cards.l.LedevGuardian.class)); cards.add(new SetCardInfo("Legion Guildmage", 187, Rarity.UNCOMMON, mage.cards.l.LegionGuildmage.class)); cards.add(new SetCardInfo("Legion Warboss", 109, Rarity.RARE, mage.cards.l.LegionWarboss.class)); From 214a527ae03070c228769b8b54a78808b194cd47 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 18 Sep 2018 13:59:17 -0400 Subject: [PATCH 025/140] Implemented Wand of Vertebrae --- .../src/mage/cards/w/WandOfVertebrae.java | 92 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + .../common/TargetCardInYourGraveyard.java | 5 +- 3 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 Mage.Sets/src/mage/cards/w/WandOfVertebrae.java diff --git a/Mage.Sets/src/mage/cards/w/WandOfVertebrae.java b/Mage.Sets/src/mage/cards/w/WandOfVertebrae.java new file mode 100644 index 00000000000..0328b935864 --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WandOfVertebrae.java @@ -0,0 +1,92 @@ +package mage.cards.w; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.ExileSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.PutTopCardOfLibraryIntoGraveControllerEffect; +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.game.Game; +import mage.players.Player; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author TheElk801 + */ +public final class WandOfVertebrae extends CardImpl { + + public WandOfVertebrae(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}"); + + // {T}: Put the top card of your library into your graveyard. + this.addAbility(new SimpleActivatedAbility( + new PutTopCardOfLibraryIntoGraveControllerEffect(1), + new TapSourceCost() + )); + + // {2}, {T}, Exile Wand of Vertebrae: Shuffle up to five target cards from your graveyard into your library. + Ability ability = new SimpleActivatedAbility( + new WandOfVertebraeEffect(), + new GenericManaCost(2) + ); + ability.addCost(new TapSourceCost()); + ability.addCost(new ExileSourceCost()); + ability.addTarget(new TargetCardInYourGraveyard(0, 5)); + this.addAbility(ability); + } + + public WandOfVertebrae(final WandOfVertebrae card) { + super(card); + } + + @Override + public WandOfVertebrae copy() { + return new WandOfVertebrae(this); + } +} + +class WandOfVertebraeEffect extends OneShotEffect { + + public WandOfVertebraeEffect() { + super(Outcome.Benefit); + this.staticText = "Shuffle up to five target cards " + + "from your graveyard into your library."; + } + + public WandOfVertebraeEffect(final WandOfVertebraeEffect effect) { + super(effect); + } + + @Override + public WandOfVertebraeEffect copy() { + return new WandOfVertebraeEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getFirstTarget()); + if (player == null) { + return false; + } + Cards cards = new CardsImpl(); + for (UUID targetId : targetPointer.getTargets(game, source)) { + Card card = game.getCard(targetId); + if (card != null) { + cards.add(card); + } + } + player.getLibrary().addAll(cards.getCards(game), game); + player.shuffleLibrary(source, game); + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 8d7234ae2f5..ee1ee9d0be2 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -191,6 +191,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Vraska's Stoneglare", 272, Rarity.RARE, mage.cards.v.VraskasStoneglare.class)); cards.add(new SetCardInfo("Vraska, Golgari Queen", 213, Rarity.MYTHIC, mage.cards.v.VraskaGolgariQueen.class)); cards.add(new SetCardInfo("Vraska, Regal Gorgon", 269, Rarity.MYTHIC, mage.cards.v.VraskaRegalGorgon.class)); + cards.add(new SetCardInfo("Wand of Vertebrae", 242, Rarity.UNCOMMON, mage.cards.w.WandOfVertebrae.class)); cards.add(new SetCardInfo("Wary Okapi", 149, Rarity.COMMON, mage.cards.w.WaryOkapi.class)); cards.add(new SetCardInfo("Watcher in the Mist", 59, Rarity.COMMON, mage.cards.w.WatcherInTheMist.class)); cards.add(new SetCardInfo("Watery Grave", 259, Rarity.RARE, mage.cards.w.WateryGrave.class)); diff --git a/Mage/src/main/java/mage/target/common/TargetCardInYourGraveyard.java b/Mage/src/main/java/mage/target/common/TargetCardInYourGraveyard.java index a30eba6dee7..e596adce261 100644 --- a/Mage/src/main/java/mage/target/common/TargetCardInYourGraveyard.java +++ b/Mage/src/main/java/mage/target/common/TargetCardInYourGraveyard.java @@ -1,4 +1,3 @@ - package mage.target.common; import java.util.HashSet; @@ -33,6 +32,10 @@ public class TargetCardInYourGraveyard extends TargetCard { this(numTargets, numTargets, filter); } + public TargetCardInYourGraveyard(int minNumTargets, int maxNumTargets) { + this(minNumTargets, maxNumTargets, StaticFilters.FILTER_CARD_FROM_YOUR_GRAVEYARD); + } + public TargetCardInYourGraveyard(int minNumTargets, int maxNumTargets, FilterCard filter) { this(minNumTargets, maxNumTargets, filter, false); } From ce0b647a362c10d2c66a85f3db2466f00d7816c8 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 18 Sep 2018 14:47:42 -0400 Subject: [PATCH 026/140] Implemented Etrata, the Silencer --- .../src/mage/cards/e/EtrataTheSilencer.java | 151 ++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + .../main/java/mage/counters/CounterType.java | 2 +- .../predicate/permanent/CounterPredicate.java | 7 +- 4 files changed, 156 insertions(+), 5 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/e/EtrataTheSilencer.java diff --git a/Mage.Sets/src/mage/cards/e/EtrataTheSilencer.java b/Mage.Sets/src/mage/cards/e/EtrataTheSilencer.java new file mode 100644 index 00000000000..19276ee723f --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/EtrataTheSilencer.java @@ -0,0 +1,151 @@ +package mage.cards.e; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ShuffleIntoLibrarySourceEffect; +import mage.abilities.keyword.CantBeBlockedSourceAbility; +import mage.cards.Card; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.FilterCard; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerIdPredicate; +import mage.filter.predicate.permanent.CounterPredicate; +import mage.game.Game; +import mage.game.events.DamagedPlayerEvent; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class EtrataTheSilencer extends CardImpl { + + public EtrataTheSilencer(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}{B}"); + + this.addSuperType(SuperType.LEGENDARY); + this.subtype.add(SubType.VAMPIRE); + this.subtype.add(SubType.ASSASSIN); + this.power = new MageInt(3); + this.toughness = new MageInt(5); + + // Etrata, the Silencer can't be blocked. + this.addAbility(new CantBeBlockedSourceAbility()); + + // Whenever Etrata deals combat damage to a player, exile target creature that player controls and put a hit counter on that card. That player loses the game if they own three or more exiled card with hit counters on them. Etrata's owner shuffles Etrata into their library. + this.addAbility(new EtrataTheSilencerTriggeredAbility()); + } + + public EtrataTheSilencer(final EtrataTheSilencer card) { + super(card); + } + + @Override + public EtrataTheSilencer copy() { + return new EtrataTheSilencer(this); + } +} + +class EtrataTheSilencerTriggeredAbility extends TriggeredAbilityImpl { + + public EtrataTheSilencerTriggeredAbility() { + super(Zone.BATTLEFIELD, new EtrataTheSilencerEffect()); + } + + public EtrataTheSilencerTriggeredAbility(final EtrataTheSilencerTriggeredAbility ability) { + super(ability); + } + + @Override + public EtrataTheSilencerTriggeredAbility copy() { + return new EtrataTheSilencerTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DAMAGED_PLAYER; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event; + if (damageEvent.isCombatDamage() && event.getSourceId().equals(this.getSourceId())) { + Player opponent = game.getPlayer(event.getPlayerId()); + if (opponent != null) { + FilterCreaturePermanent filter = new FilterCreaturePermanent("creature " + opponent.getLogName() + " controls"); + filter.add(new ControllerIdPredicate(opponent.getId())); + this.getTargets().clear(); + this.addTarget(new TargetCreaturePermanent(filter)); + return true; + } + } + return false; + } + + @Override + public String getRule() { + return "Whenever {this} deals combat damage to a player, " + + "exile target creature that player controls " + + "and put a hit counter on that card. " + + "That player loses the game if they own three or more " + + "exiled cards with hit counters on them. " + + "{this}'s owner shuffles {this} into their library."; + } +} + +class EtrataTheSilencerEffect extends OneShotEffect { + + private static final FilterCard filter = new FilterCard(); + + static { + filter.add(new CounterPredicate(CounterType.HIT)); + } + + public EtrataTheSilencerEffect() { + super(Outcome.Benefit); + } + + public EtrataTheSilencerEffect(final EtrataTheSilencerEffect effect) { + super(effect); + } + + @Override + public EtrataTheSilencerEffect copy() { + return new EtrataTheSilencerEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent creature = game.getPermanent(source.getFirstTarget()); + if (creature == null) { + return false; + } + Player controller = game.getPlayer(source.getControllerId()); + Player player = game.getPlayer(creature.getControllerId()); + if (controller == null || player == null) { + return false; + } + controller.moveCards(creature, Zone.EXILED, source, game); + Card card = game.getCard(source.getFirstTarget()); + if (card != null) { + card.addCounters(CounterType.HIT.createInstance(), source, game); + } + if (game.getExile().getExileZone(player.getId()).count(filter, game) > 2) { + player.lost(game); + } + return new ShuffleIntoLibrarySourceEffect().apply(game, source); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index ee1ee9d0be2..fd76fefa984 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -72,6 +72,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Emmara, Soul of the Accord", 168, Rarity.RARE, mage.cards.e.EmmaraSoulOfTheAccord.class)); cards.add(new SetCardInfo("Enhanced Surveillance", 40, Rarity.UNCOMMON, mage.cards.e.EnhancedSurveillance.class)); cards.add(new SetCardInfo("Erratic Cyclops", 98, Rarity.RARE, mage.cards.e.ErraticCyclops.class)); + cards.add(new SetCardInfo("Etrata, the Silencer", 170, Rarity.RARE, mage.cards.e.EtrataTheSilencer.class)); cards.add(new SetCardInfo("Expansion // Explosion", 224, Rarity.RARE, mage.cards.e.ExpansionExplosion.class)); cards.add(new SetCardInfo("Find // Finality", 225, Rarity.RARE, mage.cards.f.FindFinality.class)); cards.add(new SetCardInfo("Firemind's Research", 171, Rarity.RARE, mage.cards.f.FiremindsResearch.class)); diff --git a/Mage/src/main/java/mage/counters/CounterType.java b/Mage/src/main/java/mage/counters/CounterType.java index 2ded9a796bc..865cab23a53 100644 --- a/Mage/src/main/java/mage/counters/CounterType.java +++ b/Mage/src/main/java/mage/counters/CounterType.java @@ -1,4 +1,3 @@ - package mage.counters; /** @@ -54,6 +53,7 @@ public enum CounterType { GROWTH("growth"), HATCHLING("hatchling"), HEALING("healing"), + HIT("hit"), HOOFPRINT("hoofprint"), HOUR("hour"), HOURGLASS("hourglass"), diff --git a/Mage/src/main/java/mage/filter/predicate/permanent/CounterPredicate.java b/Mage/src/main/java/mage/filter/predicate/permanent/CounterPredicate.java index ed505b2cd2f..75469d4dc17 100644 --- a/Mage/src/main/java/mage/filter/predicate/permanent/CounterPredicate.java +++ b/Mage/src/main/java/mage/filter/predicate/permanent/CounterPredicate.java @@ -1,16 +1,15 @@ - package mage.filter.predicate.permanent; +import mage.cards.Card; import mage.counters.CounterType; import mage.filter.predicate.Predicate; import mage.game.Game; -import mage.game.permanent.Permanent; /** * * @author jeffwadsworth */ -public class CounterPredicate implements Predicate { +public class CounterPredicate implements Predicate { private final CounterType counter; @@ -23,7 +22,7 @@ public class CounterPredicate implements Predicate { } @Override - public boolean apply(Permanent input, Game game) { + public boolean apply(Card input, Game game) { if (counter == null) { return !input.getCounters(game).keySet().isEmpty(); } else { From dffd0e7fc3977569a630680043278ac21b701582 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 18 Sep 2018 15:42:36 -0400 Subject: [PATCH 027/140] renamed Charnel Troll --- .../{m/MorgueTroll.java => c/CharnelTroll.java} | 12 ++++++------ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 2 +- Utils/mtg-cards-data.txt | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) rename Mage.Sets/src/mage/cards/{m/MorgueTroll.java => c/CharnelTroll.java} (91%) diff --git a/Mage.Sets/src/mage/cards/m/MorgueTroll.java b/Mage.Sets/src/mage/cards/c/CharnelTroll.java similarity index 91% rename from Mage.Sets/src/mage/cards/m/MorgueTroll.java rename to Mage.Sets/src/mage/cards/c/CharnelTroll.java index cf72fbf3388..07fb56ebac1 100644 --- a/Mage.Sets/src/mage/cards/m/MorgueTroll.java +++ b/Mage.Sets/src/mage/cards/c/CharnelTroll.java @@ -1,4 +1,4 @@ -package mage.cards.m; +package mage.cards.c; import java.util.UUID; import mage.MageInt; @@ -27,9 +27,9 @@ import mage.target.common.TargetCardInYourGraveyard; * * @author TheElk801 */ -public final class MorgueTroll extends CardImpl { +public final class CharnelTroll extends CardImpl { - public MorgueTroll(UUID ownerId, CardSetInfo setInfo) { + public CharnelTroll(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{G}"); this.subtype.add(SubType.TROLL); @@ -65,12 +65,12 @@ public final class MorgueTroll extends CardImpl { this.addAbility(ability); } - public MorgueTroll(final MorgueTroll card) { + public CharnelTroll(final CharnelTroll card) { super(card); } @Override - public MorgueTroll copy() { - return new MorgueTroll(this); + public CharnelTroll copy() { + return new CharnelTroll(this); } } diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index fd76fefa984..ecfbb93ce1f 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -42,6 +42,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Boros Locket", 231, Rarity.COMMON, mage.cards.b.BorosLocket.class)); cards.add(new SetCardInfo("Bounty Agent", 2, Rarity.RARE, mage.cards.b.BountyAgent.class)); cards.add(new SetCardInfo("Centaur Peacemaker", 158, Rarity.COMMON, mage.cards.c.CentaurPeacemaker.class)); + cards.add(new SetCardInfo("Charnel Troll", 160, Rarity.RARE, mage.cards.c.CharnelTroll.class)); cards.add(new SetCardInfo("Chemister's Insight", 32, Rarity.UNCOMMON, mage.cards.c.ChemistersInsight.class)); cards.add(new SetCardInfo("Chromatic Lantern", 233, Rarity.RARE, mage.cards.c.ChromaticLantern.class)); cards.add(new SetCardInfo("Circuitous Route", 125, Rarity.UNCOMMON, mage.cards.c.CircuitousRoute.class)); @@ -130,7 +131,6 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Mission Briefing", 44, Rarity.RARE, mage.cards.m.MissionBriefing.class)); cards.add(new SetCardInfo("Molderhulk", 190, Rarity.UNCOMMON, mage.cards.m.Molderhulk.class)); cards.add(new SetCardInfo("Moodmark Painter", 78, Rarity.COMMON, mage.cards.m.MoodmarkPainter.class)); - cards.add(new SetCardInfo("Morgue Troll", 160, Rarity.RARE, mage.cards.m.MorgueTroll.class)); cards.add(new SetCardInfo("Mountain", 263, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Murmuring Mystic", 45, Rarity.UNCOMMON, mage.cards.m.MurmuringMystic.class)); cards.add(new SetCardInfo("Narcomoeba", 47, Rarity.RARE, mage.cards.n.Narcomoeba.class)); diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index e65bc1c83d3..da510de815e 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -34380,7 +34380,7 @@ Aurelia, Exemplar of Justice|Guilds of Ravnica|153|M|{2}{R}{W}|Legendary Creatur Beacon Bolt|Guilds of Ravnica|154|U|{1}{U}{R}|Sorcery|||Beacon Bolt deals damage to target creature equal to the total number of instant and sorcery cards you own in exile and in your graveyard.$Jump-start| Boros Challenger|Guilds of Ravnica|156|U|{R}{W}|Creature - Human Soldier|2|3|Mentor${2}{R}{W}: Boros Challenger gets +1/+1 until end of turn.| Centaur Peacemaker|Guilds of Ravnica|158|C|{1}{G}{W}|Creature - Centaur Cleric|3|3|When Centaur Peacemaker enters the battlefield, each player gains 4 life.| -Morgue Troll|Guilds of Ravnica|160|R|{1}{B}{G}|Creature - Troll|4|4|Trample$At the beginning of your upkeep, exile a creature card from your graveyard. If you do, put a +1/+1 counter on Morgue Troll. Otherwise sacrifice it.${B}{G}, Discard a creature card: Put a +1/+1 counter on Morgue Troll.| +Charnel Troll|Guilds of Ravnica|160|R|{1}{B}{G}|Creature - Troll|4|4|Trample$At the beginning of your upkeep, exile a creature card from your graveyard. If you do, put a +1/+1 counter on Charnel Troll. Otherwise sacrifice it.${B}{G}, Discard a creature card: Put a +1/+1 counter on Charnel Troll.| Conclave Cavalier|Guilds of Ravnica|161|U|{G}{G}{W}{W}|Creature - Centaur Knight|4|4|Vigilance$When Conclave Cavalier dies, create two green and white 2/2 Elf Knight creature tokens with vigilance.| Conclave Guildmage|Guilds of Ravnica|162|U|{G}{W}|Creature - Elf Cleric|2|2|{G}, {T}: Creatures you control gain trample until end of turn.${5}{W}, {T}: Create a 2/2 green and white Elf Knight creature token with vigilance.| Crackling Drake|Guilds of Ravnica|163|U|{U}{U}{R}{R}|Creature - Drake|*|4|Flying$Crackling Drake's power is equal to the total number of instant and sorcery cards you own in exile and in your graveyard.$When Crackling Drake enters the battlefield, draw a card.| From 847ed97848b4db5d03bb73a59bc97eb1cd7d0746 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 18 Sep 2018 16:21:34 -0400 Subject: [PATCH 028/140] Implemented Divine Visitation (somewhat incorrectly) --- .../src/mage/cards/d/DivineVisitation.java | 85 +++++++++++++++++++ .../src/mage/cards/r/ResplendentAngel.java | 4 +- Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + ...elToken2.java => AngelVigilanceToken.java} | 10 +-- 4 files changed, 93 insertions(+), 7 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/d/DivineVisitation.java rename Mage/src/main/java/mage/game/permanent/token/{AngelToken2.java => AngelVigilanceToken.java} (71%) diff --git a/Mage.Sets/src/mage/cards/d/DivineVisitation.java b/Mage.Sets/src/mage/cards/d/DivineVisitation.java new file mode 100644 index 00000000000..f7914a8e972 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DivineVisitation.java @@ -0,0 +1,85 @@ +package mage.cards.d; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.CopyEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.EntersTheBattlefieldEvent; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.game.permanent.PermanentToken; +import mage.game.permanent.token.AngelVigilanceToken; + +/** + * + * @author TheElk801 + */ +public final class DivineVisitation extends CardImpl { + + public DivineVisitation(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}{W}"); + + // TODO: This implementation is not entirely correct, see https://twitter.com/EliShffrn/status/1042145606582591490 + // If one or more creature tokens would be created under your control, that many 4/4 white Angel creature tokens with flying and vigilance are created instead. + this.addAbility(new SimpleStaticAbility( + Zone.BATTLEFIELD, new DivineVisitationEffect() + )); + } + + public DivineVisitation(final DivineVisitation card) { + super(card); + } + + @Override + public DivineVisitation copy() { + return new DivineVisitation(this); + } +} + +class DivineVisitationEffect extends ReplacementEffectImpl { + + public DivineVisitationEffect() { + super(Duration.WhileOnBattlefield, Outcome.Copy, false); + staticText = "If one or more creature tokens would be created " + + "under your control, that many 4/4 white Angel creature " + + "tokens with flying and vigilance are created instead."; + } + + public DivineVisitationEffect(DivineVisitationEffect effect) { + super(effect); + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + Permanent perm = ((EntersTheBattlefieldEvent) event).getTarget(); + return perm != null + && perm.isCreature() + && perm instanceof PermanentToken + && perm.isControlledBy(source.getControllerId()); + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + game.addEffect(new CopyEffect(Duration.Custom, new AngelVigilanceToken(), event.getTargetId()), source); + return false; + } + + @Override + public DivineVisitationEffect copy() { + return new DivineVisitationEffect(this); + } + +} diff --git a/Mage.Sets/src/mage/cards/r/ResplendentAngel.java b/Mage.Sets/src/mage/cards/r/ResplendentAngel.java index ef40284b699..86160a7236b 100644 --- a/Mage.Sets/src/mage/cards/r/ResplendentAngel.java +++ b/Mage.Sets/src/mage/cards/r/ResplendentAngel.java @@ -20,7 +20,7 @@ import mage.constants.ComparisonType; import mage.constants.Duration; import mage.constants.TargetController; import mage.constants.Zone; -import mage.game.permanent.token.AngelToken2; +import mage.game.permanent.token.AngelVigilanceToken; import mage.watchers.common.PlayerGainedLifeWatcher; /** @@ -42,7 +42,7 @@ public final class ResplendentAngel extends CardImpl { // At the beginning of each end step, if you gained 5 or more life this turn, create a 4/4 white Angel creature token with flying and vigilance. this.addAbility(new BeginningOfEndStepTriggeredAbility( Zone.BATTLEFIELD, - new CreateTokenEffect(new AngelToken2()), + new CreateTokenEffect(new AngelVigilanceToken()), TargetController.ANY, new YouGainedLifeCondition(ComparisonType.MORE_THAN, 4), false diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index ecfbb93ce1f..678fa94f741 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -68,6 +68,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Disdainful Stroke", 37, Rarity.COMMON, mage.cards.d.DisdainfulStroke.class)); cards.add(new SetCardInfo("Disinformation Campaign", 167, Rarity.UNCOMMON, mage.cards.d.DisinformationCampaign.class)); cards.add(new SetCardInfo("District Guide", 128, Rarity.UNCOMMON, mage.cards.d.DistrictGuide.class)); + cards.add(new SetCardInfo("Divine Visitation", 10, Rarity.MYTHIC, mage.cards.d.DivineVisitation.class)); cards.add(new SetCardInfo("Doom Whisperer", 69, Rarity.MYTHIC, mage.cards.d.DoomWhisperer.class)); cards.add(new SetCardInfo("Dream Eater", 38, Rarity.MYTHIC, mage.cards.d.DreamEater.class)); cards.add(new SetCardInfo("Emmara, Soul of the Accord", 168, Rarity.RARE, mage.cards.e.EmmaraSoulOfTheAccord.class)); diff --git a/Mage/src/main/java/mage/game/permanent/token/AngelToken2.java b/Mage/src/main/java/mage/game/permanent/token/AngelVigilanceToken.java similarity index 71% rename from Mage/src/main/java/mage/game/permanent/token/AngelToken2.java rename to Mage/src/main/java/mage/game/permanent/token/AngelVigilanceToken.java index 9369b05c36f..0167c1a2bb2 100644 --- a/Mage/src/main/java/mage/game/permanent/token/AngelToken2.java +++ b/Mage/src/main/java/mage/game/permanent/token/AngelVigilanceToken.java @@ -6,9 +6,9 @@ import mage.abilities.keyword.VigilanceAbility; import mage.constants.CardType; import mage.constants.SubType; -public final class AngelToken2 extends TokenImpl { +public final class AngelVigilanceToken extends TokenImpl { - public AngelToken2() { + public AngelVigilanceToken() { super("Angel", "4/4 white Angel creature token with flying and vigilance"); cardType.add(CardType.CREATURE); color.setWhite(true); @@ -19,11 +19,11 @@ public final class AngelToken2 extends TokenImpl { addAbility(VigilanceAbility.getInstance()); } - public AngelToken2(final AngelToken2 token) { + public AngelVigilanceToken(final AngelVigilanceToken token) { super(token); } - public AngelToken2 copy() { - return new AngelToken2(this); + public AngelVigilanceToken copy() { + return new AngelVigilanceToken(this); } } From 6448f778525dd8eec0533f18f7cd50d623d20cf7 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 18 Sep 2018 17:32:27 -0400 Subject: [PATCH 029/140] updated GRN spoiler and reprints --- Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + Utils/mtg-cards-data.txt | 21 +++++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 678fa94f741..2fc2cbbb0cf 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -129,6 +129,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Maximize Altitude", 43, Rarity.COMMON, mage.cards.m.MaximizeAltitude.class)); cards.add(new SetCardInfo("Maximize Velocity", 111, Rarity.COMMON, mage.cards.m.MaximizeVelocity.class)); cards.add(new SetCardInfo("Midnight Reaper", 77, Rarity.RARE, mage.cards.m.MidnightReaper.class)); + cards.add(new SetCardInfo("Might of the Masses", 137, Rarity.UNCOMMON, mage.cards.m.MightOfTheMasses.class)); cards.add(new SetCardInfo("Mission Briefing", 44, Rarity.RARE, mage.cards.m.MissionBriefing.class)); cards.add(new SetCardInfo("Molderhulk", 190, Rarity.UNCOMMON, mage.cards.m.Molderhulk.class)); cards.add(new SetCardInfo("Moodmark Painter", 78, Rarity.COMMON, mage.cards.m.MoodmarkPainter.class)); diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index da510de815e..5da4331995e 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -34307,6 +34307,7 @@ Gird for Battle|Guilds of Ravnica|12|U|{W}|Sorcery|||Put a +1/+1 counter on each Haazda Marshal|Guilds of Ravnica|13|U|{W}|Creature - Human Soldier|1|1|Whenever Haazda Marshal and at least two other creatures attack, create a 1/1 white Solider creature token with lifelink.| Healer's Hawk|Guilds of Ravnica|14|C|{W}|Creature - Bird|1|1|Flying, lifelink| Hunted Witness|Guilds of Ravnica|15|C|{W}|Creature - Human|1|1|When Hunted Witness dies, create a 1/1 white Soldier creature token with lifelink.| +Inspiring Unicorn|Guilds of Ravnica|16|C|{2}{W}{W}|Creature - Unicorn|2|2|Whenever Inspiring Unicorn attacks, creatures you control get +1/+1 until end of turn.| Ledev Guardian|Guilds of Ravnica|18|C|{3}{W}|Creature - Human Knight|2|4|Convoke| Light of the Legion|Guilds of Ravnica|19|R|{4}{W}{W}|Creature - Angel|5|5|Flying$Mentor$When Light of the Legion dies, put a +1/+1 counter on each white creature you control.| Loxodon Restorer|Guilds of Ravnica|20|C|{4}{W}{W}|Creature - Elephant Cleric|3|4|Convoke$When Loxodon Restorer enters the battlefield, you gain 4 life.| @@ -34316,9 +34317,11 @@ Sunhome Stalwart|Guilds of Ravnica|26|U|{1}{W}|Creature - Human Soldier|2|2|Firs Venerated Loxodon|Guilds of Ravnica|30|R|{4}{W}|Creature - Elephant Cleric|4|4|Convoke$When Venerated Loxodon enters the battlefield, put a +1/+1 counter on each creature that convoked it.| Chemister's Insight|Guilds of Ravnica|32|U|{3}{U}|Instant|||Draw two cards.$Jump-start| Citywatch Sphinx|Guilds of Ravnica|33|U|{5}{U}|Creature - Sphinx|5|4|Flying$When Citywatch Sphinx dies, surveil 2.| +Devious Cover-up|Guilds of Ravnica|35|C|{2}{U}{U}|Instant|||Counter target spell. If that spell is countered this way, exile it instead of putting it into its owner's graveyard.$You may shuffle up to four target cards from your graveyard into your library.| Dimir Informant|Guilds of Ravnica|36|C|{2}{U}|Creature - Human Rogue|1|4|When Dimir Informant enters the battlefield, surveil 2.| Disdainful Stroke|Guilds of Ravnica|37|C|{1}{U}|Instant|||Counter target spell with converted mana cost 4 or greater.| Dream Eater|Guilds of Ravnica|38|M|{4}{U}{U}|Creature - Nightmare Sphinx|4|3|Flash$Flying$When Dream Eater enters the battlefield, surveil 4. When you do, you may return target nonland permanent an opponent controls to its owner's hand.| +Drowned Secrets|Guilds of Ravnica|39|R|{1}{U}|Enchantment|||Whenever you cast a blue spell, target player puts the top two cards if their library into their graveyard.| Enhanced Surveillance|Guilds of Ravnica|40|U|{1}{U}|Enchantment|||You may look at an additional two cards each time you surveil.$Exile Enhanced Surveillance: Shuffle your graveyard into your library.| Guild Summit|Guilds of Ravnica|41|U|{2}{U}|Enchantment|||When Guild Summit enters the battlefield, you may tap any number of untapped Gates you control. Draw a card for each Gate tapped this way.$Whenever a Gate enters the battlefield under your control, draw a card.| Maximize Altitude|Guilds of Ravnica|43|C|{U}|Sorcery|||Target creature gets +1/+1 and gains flying until end of turn.$Jump-start| @@ -34338,6 +34341,7 @@ Blood Operative|Guilds of Ravnica|63|R|{1}{B}{B}|Creature - Vampire Assassin|3|1 Creeping Chill|Guilds of Ravnica|66|U|{3}{B}|Sorcery|||Creeping Chill deals 3 damage to each opponent and you gain 3 life.$When Creeping Chill is put into your graveyard from your library, you may exile it. If you do, Creeping Chill deals 3 damage to each opponent and you gain 3 life.| Deadly Visit|Guilds of Ravnica|68|C|{3}{B}{B}|Sorcery|||Destroy target creature.$Surveil 2.| Doom Whisperer|Guilds of Ravnica|69|M|{3}{B}{B}|Creature - Nightmare Demon|6|6|Flying, trample$Pay 2 life: Surveil 2.| +Gruesome Menagerie|Guilds of Ravnica|71|R|{3}{B}{B}|Sorcery|||Choose a creature card with converted mana cost 1 in your graveyard, then do the same for creature cards with converted mana costs 2 and 3. Return those cards to the battlefield.| Lotleth Giant|Guilds of Ravnica|74|U|{6}{B}|Creature - Zombie Giant|6|5|Undergrowth — When Lotleth Giant enters the battlefield, it deals 1 damage to target opponent for each creature card in your graveyard.| Mausoleum Secrets|Guilds of Ravnica|75|R|{1}{B}|Instant|||Undergrowth — Search your library for a black card with converted mana cost less than or equal to the number of creature cards in your graveyard, reveal it, put it into your hand, then shuffle your library.| Midnight Reaper|Guilds of Ravnica|77|R|{2}{B}|Creature - Zombie Knight|3|2|Whenever a nontoken creature you control dies, Midnight Reaper deals 1 damage to you and you draw a card.| @@ -34352,7 +34356,9 @@ Barging Sergeant|Guilds of Ravnica|92|C|{4}{R}|Creature - Minotaur Soldier|4|2|H Book Devourer|Guilds of Ravnica|93|U|{5}{R}|Creature - Beast|4|5|Trample$Whenever Book Devourer deals combat damage to a player, you may discard all the cards in your hand. If you do, draw that many cards.| Command the Storm|Guilds of Ravnica|94|C|{4}{R}|Instant|||Command the Storm deals 5 damage to target creature.| Direct Current|Guilds of Ravnica|96|C|{1}{R}{R}|Sorcery|||Direct Current deals 2 damage to any target.$Jump-start| +Electrostatic Field|Guilds of Ravnica|97|C|{1}{R}|Creature - Wall|0|4|Defender$When you cast an instant or sorcery spell, Electrostatic Field deals 1 damage to each opponent.| Erratic Cyclops|Guilds of Ravnica|98|R|{3}{R}|Creature - Cyclops Shaman|0|8|Trample$Whenever you cast an instant or sorcery spell, Erratic Cyclops gets +X/+0 until end of turn, where X is that spell's converted mana cost.| +Experimental Frenzy|Guilds of Ravnica|99|R|{3}{R}|Enchantment|||You may look at the top card of your library any time.$You may play the top card of your library.$You can't play cards from your hand.${3}{R}: Destroy Experimental Frenzy.| Goblin Banneret|Guilds of Ravnica|102|U|{R}|Creature - Goblin Soldier|1|1|Mentor${1}{R}: Goblin Banneret gets +2/+0 until end of turn.| Goblin Cratermaker|Guilds of Ravnica|103|U|{1}{R}|Creature - Goblin Warrior|2|2|{1}, Sacrifice Goblin Cratermaker: Choose one —$• Goblin Cratermaker deals 2 damage to target creature.$• Destroy target colorless nonland permanent.| Inescapable Blaze|Guilds of Ravnica|107|U|{4}{R}{R}|Instant|||This spell can't be countered.$Inescapable Flame deals 6 damage to any target.| @@ -34367,9 +34373,14 @@ Arboretum Elemental|Guilds of Ravnica|122|U|{7}{G}{G}|Creature - Elemental|7|5|C Beast Whisperer|Guilds of Ravnica|123|R|{2}{G}{G}|Creature - Elf Druid|2|3|Whenever you cast a creature spell, draw a card.| Circuitous Route|Guilds of Ravnica|125|U|{3}{G}|Sorcery|||Search your library for up to two basic land cards and/or Gate cards and put them onto the battlefield tapped, then shuffle your library.| District Guide|Guilds of Ravnica|128|U|{2}{G}|Creature - Elf Scout|2|2|When District Guide enters the battlefield, you may search your library for a basic land card or Gate card, reveal it, put it into your hand, then shuffle your library.| +Generous Stray|Guilds of Ravnica|129|C|{2}{G}|Creature - Cat|1|2|When Generous Stray enters the battlefield, draw a card.| Golgari Raiders|Guilds of Ravnica|130|U|{3}{G}|Creature - Elf Warrior|0|0|Haste$Undergrowth — Golgari Raiders enters the battlefield with a +1/+1 counter on it for each creature card in your graveyard.| Hatchery Spider|Guilds of Ravnica|132|R|{5}{G}{G}|Creature - Spider|5|7|Reach$Undergrowth — When you cast this spell, reveal the top X cards of your library, where X is the number of creature cards in your graveyard. You may put a green permanent card with converted mana cost X or less from among them onto the battlefield. Put the rest on the bottom of your library in a random order.| +Kraul Foragers|Guilds of Ravnica|134|C|{4}{G}|Creature - Insect Scout|4|4|Undergrowth — When Kraul Foragers enters the battlefield, you gain 1 life for each creature card in your graveyard.| +Kraul Harpooner|Guilds of Ravnica|136|U|{1}{G}|Creature - Insect Warrior|3|2|Reach$Undergrowth — When Kraul Harpooner enters the battlefield, choose up to one target creature with flying you don't control. Kraul Harpooner gets +X/+0 until end of turn, where X is the number of creature cards in your graveyard, then you may have Kraul Harpooner fight that creature.| +Might of the Masses|Guilds of Ravnica|137|U|{G}|Instant|||Target creature gets +1/+1 until end of turn for each creature you control.| Nullhide Ferox|Guilds of Ravnica|138|M|{2}{G}{G}|Creature - Beast|6|6|Hexproof$You can't cast noncreature spells.${2}: Nullhide Ferox loses all abilities until end of turn. Any player may activate this ability.$If a spell or ability an opponent controls causes you to discard Nullhide Ferox, put it onto the battlefield instead of putting it into your graveyard.| +Pelt Collector|Guilds of Ravnica|141|R|{G}|Creature - Elf Warrior|1|1|Whenever another creature you control enters the battlefield or dies, if that creature's power is greater than Pelt Collector's, put a +1/+1 counter on Pelt Collector.$As long as Pelt Collector has three or more +1/+1 counters on it, it has trample.| Siege Wurm|Guilds of Ravnica|144|C|{5}{G}{G}|Creature - Wurm|5|5|Convoke$Trample| Sprouting Renewal|Guilds of Ravnica|145|U|{2}{G}|Sorcery|||Convoke$Choose one —$• Create a 2/2 green and white Elf Knight creature token with vigilance.$• Destroy target artifact or enchantment.| Vivid Revival|Guilds of Ravnica|148|R|{4}{G}|Sorcery|||Return up to three target multicolor cards from your graveyard to your hand. Exile Vivid Revival.| @@ -34378,8 +34389,11 @@ Artful Takedown|Guilds of Ravnica|151|C|{2}{U}{B}|Instant|||Choose one or both Assassin's Trophy|Guilds of Ravnica|152|R|{B}{G}|Instant|||Destroy target permanent an opponent controls. Its controller may search their library for a basic land card, put it onto the battlefield, then shuffle their library.| Aurelia, Exemplar of Justice|Guilds of Ravnica|153|M|{2}{R}{W}|Legendary Creature - Angel|2|5|Flying$Mentor$At the beginning of combat on your turn, choose up to one target creature you control. Until end of turn, that creature gets +2/+0, gains trample if it's red, and gains vigilance if it's white.| Beacon Bolt|Guilds of Ravnica|154|U|{1}{U}{R}|Sorcery|||Beacon Bolt deals damage to target creature equal to the total number of instant and sorcery cards you own in exile and in your graveyard.$Jump-start| +Boltsplicer Mage|Guilds of Ravnica|155|U|{U}{R}|Creature - Vedalken Wizard|2|2|Whenever you cast an instant or sorcery that targets only Boltsplicer Mage, if you control one or more creatures that the spell could target, choose one of them. Copy the spell and it targets the chosen creature.| Boros Challenger|Guilds of Ravnica|156|U|{R}{W}|Creature - Human Soldier|2|3|Mentor${2}{R}{W}: Boros Challenger gets +1/+1 until end of turn.| +Camaraderie|Guilds of Ravnica|157|R|{4}{G}{W}|Sorcery|||You gain X life and draw X cards, where X is the number of creatures you control. Creatures you control get +1/+1 until end of turn.| Centaur Peacemaker|Guilds of Ravnica|158|C|{1}{G}{W}|Creature - Centaur Cleric|3|3|When Centaur Peacemaker enters the battlefield, each player gains 4 life.| +Chance for Glory|Guilds of Ravnica|159|M|{1}{R}{W}|Instant|||Creatures you control gain indestructible. Take an extra turn after this one. At the beginning of that turn's end step, you lose the game.| Charnel Troll|Guilds of Ravnica|160|R|{1}{B}{G}|Creature - Troll|4|4|Trample$At the beginning of your upkeep, exile a creature card from your graveyard. If you do, put a +1/+1 counter on Charnel Troll. Otherwise sacrifice it.${B}{G}, Discard a creature card: Put a +1/+1 counter on Charnel Troll.| Conclave Cavalier|Guilds of Ravnica|161|U|{G}{G}{W}{W}|Creature - Centaur Knight|4|4|Vigilance$When Conclave Cavalier dies, create two green and white 2/2 Elf Knight creature tokens with vigilance.| Conclave Guildmage|Guilds of Ravnica|162|U|{G}{W}|Creature - Elf Cleric|2|2|{G}, {T}: Creatures you control gain trample until end of turn.${5}{W}, {T}: Create a 2/2 green and white Elf Knight creature token with vigilance.| @@ -34389,7 +34403,7 @@ Deafening Clarion|Guilds of Ravnica|165|R|{1}{R}{W}|Sorcery|||Choose one or both Dimir Spybug|Guilds of Ravnica|166|U|{U}{B}|Creature - Insect|1|1|Flying$Menace$Whenever you surveil, put a +1/+1 counter on Dimir Spybug.| Disinformation Campaign|Guilds of Ravnica|167|U|{1}{U}{B}|Enchantment|||When Disinformation Campaign enters the battlefield, you draw a card and each opponent discards a card.$Whenever you surveil, return Disinformation Campaign to its owner's hand.| Emmara, Soul of the Accord|Guilds of Ravnica|168|R|{G}{W}|Legendary Creature - Elf Cleric|2|2|Whenever Emmara, Soul of the Accord becomes tapped, create a 1/1 white Soldier creature token with lifelink.| -Etrata, the Silencer|Guilds of Ravnica|170|R|{2}{U}{B}|Legendary Creature - Vampire Assassin|3|5|Etrata, the Silencer can't be blocked.$Whenever Etrata deals combat damage to a player, exile target creature that player controls and put a hit counter on that card. That player loses the game if they own three or more exiled card with hit counters on them. Etrata's owner shuffles Etrata into their library.| +Etrata, the Silencer|Guilds of Ravnica|170|R|{2}{U}{B}|Legendary Creature - Vampire Assassin|3|5|Etrata, the Silencer can't be blocked.$Whenever Etrata deals combat damage to a player, exile target creature that player controls and put a hit counter on that card. That player loses the game if they own three or more exiled cards with hit counters on them. Etrata's owner shuffles Etrata into their library.| Firemind's Research|Guilds of Ravnica|171|R|{U}{R}|Enchantment|||Whenever you cast an instant or sorcery spell, put a charge counter on Firemind's Research.${1}{U}, Remove two charge counters from Firemind's Research: Draw a card.${1}{R}, Remove five charge counters from Firemind's Research: It deals 5 damage to any target.| Garrison Sergeant|Guilds of Ravnica|172|C|{3}{R}{W}|Creature - Viashino Soldier|3|3|Garrison Sergeant has double strike as long as you control a Gate.| Glowspore Shaman|Guilds of Ravnica|173|U|{B}{G}|Creature - Elf Shaman|3|1|When Glowspore Shaman enters the battlefield, put the top three cards of your library into your graveyard. You may put a land card from your graveyard on top of your library.| @@ -34408,6 +34422,7 @@ League Guildmage|Guilds of Ravnica|185|U|{U}{R}|Creature - Human Wizard|2|2|{3}{ Ledev Champion|Guilds of Ravnica|186|U|{1}{G}{W}|Creature - Human Knight|2|2|Whenever Ledev Champion attacks, you may tap any number of untapped creatures you control. Ledev Champion gets +1/+1 until end of turn for each creature tapped this way.${3}{G}{W}: Create a 1/1 white soldier creature token with lifelink.| Legion Guildmage|Guilds of Ravnica|187|U|{R}{W}|Creature - Human Wizard|2|2|{5}{R}, {T}: Legion Guildmage deals 3 damage to each opponent.${2}{W}, {T}: Tap another target creature.| March of the Multitudes|Guilds of Ravnica|188|M|{X}{G}{W}{W}|Instant|||Convoke$Create X 1/1 white Soldier creature tokens with lifelink.| +Mnemonic Betrayal|Guilds of Ravnica|189|M|{1}{U}{B}|Sorcery|||Exile all card from all opponents' graveyards. You may cast those cards this turn, and you may spend mana as though it were mana of any type to cast those spells. At the beginning of the next end step, if any of those cards remain exiled, return them to their owner's graveyards.$Exile Mnemonic Betrayal.| Molderhulk|Guilds of Ravnica|190|U|{7}{B}{G}|Creature - Fungus Zombie|6|6|Undergrowth — This spell costs {1} less to cast for each creature card in your graveyard.$When Molderhulk enters the battlefield, return target land card from your graveyard to the battlefield.| Nightveil Predator|Guilds of Ravnica|191|U|{U}{U}{B}{B}|Creature - Vampire|3|3|Flying, deathtouch$Hexproof| Niv-Mizzet, Parun|Guilds of Ravnica|192|R|{U}{U}{U}{R}{R}{R}|Legendary Creature - Dragon Wizard|5|5|This spell can't be countered.$Flying$Whenever you draw a card, Niv-Mizzet, Parun deals 1 damage to any target.$Whenever a player casts an instant or sorcery spell, you draw a card.| @@ -34422,6 +34437,7 @@ Sumala Woodshaper|Guilds of Ravnica|200|C|{2}{G}{W}|Creature - Elf Druid|2|1|Whe Swarm Guildmage|Guilds of Ravnica|201|U|{B}{G}|Creature - Elf Shaman|2|2|{4}{B}, {T}: Creatures you control get +1/+0 and gain menace until end of turn.${1}{G}, {T}: You gain 2 life.| Swathcutter Giant|Guilds of Ravnica|202|U|{4}{R}{W}|Creature - Giant Soldier|5|5|Vigilance$Whenever Swathcutter Giant attacks, it deals 1 damage to each creature defending player controls.| Swiftblade Vindicator|Guilds of Ravnica|203|R|{R}{W}|Creature - Human Soldier|1|1|Double strike, vigilance, trample| +Tajic, Legion's Edge|Guilds of Ravnica|204|R|{1}{R}{W}|Legendary Creature - Human Soldier|3|2|Haste$Mentor$Prevent all noncombat damage that would be dealt to other creatures you control.${R}{W}: Tajic, Legion's Edge gains first strike until end of turn.| Thief of Sanity|Guilds of Ravnica|205|R|{1}{U}{B}|Creature - Specter|2|2|Flying$Whenever Thief of Sanity deals combat damage to a player, look at the top three cards of that player's library, exile one of them face down, then put the rest into their graveyard. For as long as that card remains exiled, you may look at it, you may cast it, and you may spend mana as though it were mana of any type to cast it.| Thought Erasure|Guilds of Ravnica|206|U|{U}{B}|Sorcery|||Target opponent reveals their hand. You choose a nonland card from it. That player discards that card.$Surveil 1.| Thousand-Year Storm|Guilds of Ravnica|207|M|{4}{U}{R}|Enchantment|||Whenever you cast an instant or sorcery spell, copy it for each other instant and sorcery spell you've cast before it this turn. You may choose new targets for the copies.| @@ -34446,6 +34462,8 @@ Expansion|Guilds of Ravnica|224|R|{U/R}{U/R}|Instant|||Copy target instant or so Explosion|Guilds of Ravnica|224|R|{X}{U}{U}{R}{R}|Instant|||Explosion deals X damage to any target. Target player draws X cards.| Finality|Guilds of Ravnica|225|R|{4}{B}{G}|Sorcery|||You may put two +1/+1 counters on a creature you control. Then all creatures get -4/-4 until end of turn.| Find|Guilds of Ravnica|225|R|{B/G}{B/G}|Sorcery|||Return up to two target creature cards from your graveyard to your hand.| +Flourish|Guilds of Ravnica|226|U|{4}{G}{W}|Sorcery|||Creatures you control get +2/+2 until end of turn.| +Flower|Guilds of Ravnica|226|U|{G/W}|Sorcery|||Search your library for a basic Forest or Plains card, reveal it, put it into your hand, then shuffle your library.| Integrity|Guilds of Ravnica|227|U|{R/W}|Instant|||Target creature gets +2/+2 until end of turn.| Intervention|Guilds of Ravnica|227|U|{2}{R}{W}|Instant|||Intervention deals 3 damage to any target and you gain 3 life.| Invent|Guilds of Ravnica|228|U|{4}{U}{R}|Instant|||Search your library for an instant card and/or a sorcery card, reveal them, put them into your hand, then shuffle your library.| @@ -34457,6 +34475,7 @@ Status|Guilds of Ravnica|230|U|{B/G}|Instant|||Target creature gets +1/+1 and ga Boros Locket|Guilds of Ravnica|231|C|{3}|Artifact|||{T}: Add {R} or {W}.${R/W}{R/W}{R/W}{R/W}, {T}, Sacrifice Boros Locket: Draw two cards.| Chromatic Lantern|Guilds of Ravnica|233|R|{3}|Artifact|||Lands you control have "{T}: Add one mana of any color."${T}: Add one mana of any color.| Dimir Locket|Guilds of Ravnica|234|C|{3}|Artifact|||{T}: Add {U} or {B}.${U/B}{U/B}{U/B}{U/B}, {T}, Sacrifice Dimir Locket: Draw two cards.| +Gargoyle Guardian|Guilds of Ravnica|235|U|{6}|Artifact Creature - Gargoyle|3|3|Flying$Gargoyle Guardian enters the battlefield with a +1/+1 counter on it for each Gate you control.| Glaive of the Guildpact|Guilds of Ravnica|236|U|{2}|Artifact - Equipment|||Equipped creature gets +1/+0 for each Gate you control and has vigilance and menace.$Equip {3}| Golgari Locket|Guilds of Ravnica|237|C|{3}|Artifact|||{T}: Add {B} or {G}.${B/G}{B/G}{B/G}{B/G}, {T}, Sacrifice Golgari Locket: Draw two cards.| Izzet Locket|Guilds of Ravnica|238|C|{3}|Artifact|||{T}: Add {U} or {R}.${U/R}{U/R}{U/R}{U/R}, {T}, Sacrifice Izzet Locket: Draw two cards.| From 9dc28221331433df24cdd011dcf78194a10cf478 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 18 Sep 2018 17:46:24 -0400 Subject: [PATCH 030/140] Implemented Flower // Flourish --- .../src/mage/cards/f/FlowerFlourish.java | 62 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 63 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/f/FlowerFlourish.java diff --git a/Mage.Sets/src/mage/cards/f/FlowerFlourish.java b/Mage.Sets/src/mage/cards/f/FlowerFlourish.java new file mode 100644 index 00000000000..47df1408bc8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FlowerFlourish.java @@ -0,0 +1,62 @@ +package mage.cards.f; + +import java.util.UUID; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; +import mage.cards.CardSetInfo; +import mage.cards.SplitCard; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SpellAbilityType; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.mageobject.SupertypePredicate; +import mage.target.common.TargetCardInLibrary; + +/** + * + * @author TheElk801 + */ +public final class FlowerFlourish extends SplitCard { + + private static final FilterCard filter + = new FilterCard("basic Forest or Plains card"); + + static { + filter.add(new SupertypePredicate(SuperType.BASIC)); + filter.add(Predicates.or( + new SubtypePredicate(SubType.FOREST), + new SubtypePredicate(SubType.PLAINS) + )); + } + + public FlowerFlourish(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{G/W}", "{4}{G}{W}", SpellAbilityType.SPLIT); + + // Flower + // Search your library for a basic Forest or Plains card, reveal it, put it into your hand, then shuffle your library. + this.getLeftHalfCard().getSpellAbility().addEffect( + new SearchLibraryPutInHandEffect( + new TargetCardInLibrary(filter), true, true + ) + ); + + // Flourish + // Creatures you control get +2/+2 until end of turn. + this.getRightHalfCard().getSpellAbility().addEffect( + new BoostControlledEffect(2, 2, Duration.EndOfTurn) + ); + } + + public FlowerFlourish(final FlowerFlourish card) { + super(card); + } + + @Override + public FlowerFlourish copy() { + return new FlowerFlourish(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 2fc2cbbb0cf..8b7440a99b2 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -78,6 +78,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Expansion // Explosion", 224, Rarity.RARE, mage.cards.e.ExpansionExplosion.class)); cards.add(new SetCardInfo("Find // Finality", 225, Rarity.RARE, mage.cards.f.FindFinality.class)); cards.add(new SetCardInfo("Firemind's Research", 171, Rarity.RARE, mage.cards.f.FiremindsResearch.class)); + cards.add(new SetCardInfo("Flower // Flourish", 226, Rarity.UNCOMMON, mage.cards.f.FlowerFlourish.class)); cards.add(new SetCardInfo("Forest", 264, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Fresh-Faced Recruit", 216, Rarity.COMMON, mage.cards.f.FreshFacedRecruit.class)); cards.add(new SetCardInfo("Garrison Sergeant", 172, Rarity.COMMON, mage.cards.g.GarrisonSergeant.class)); From ec3696e2bc49f6478c8c103dfd48145d6cbdd153 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 18 Sep 2018 17:52:23 -0400 Subject: [PATCH 031/140] Implemented Drowned Secrets --- .../src/mage/cards/d/DrownedSecrets.java | 46 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 47 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/d/DrownedSecrets.java diff --git a/Mage.Sets/src/mage/cards/d/DrownedSecrets.java b/Mage.Sets/src/mage/cards/d/DrownedSecrets.java new file mode 100644 index 00000000000..50c5e63527c --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DrownedSecrets.java @@ -0,0 +1,46 @@ +package mage.cards.d; + +import java.util.UUID; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.common.PutLibraryIntoGraveTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.FilterSpell; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.target.TargetPlayer; + +/** + * + * @author TheElk801 + */ +public final class DrownedSecrets extends CardImpl { + + private static final FilterSpell filter = new FilterSpell("a blue spell"); + + static { + filter.add(new ColorPredicate(ObjectColor.BLUE)); + } + + public DrownedSecrets(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{U}"); + + // Whenever you cast a blue spell, target player puts the top two cards if their library into their graveyard. + Ability ability = new SpellCastControllerTriggeredAbility( + new PutLibraryIntoGraveTargetEffect(2), filter, false + ); + ability.addTarget(new TargetPlayer()); + this.addAbility(ability); + } + + public DrownedSecrets(final DrownedSecrets card) { + super(card); + } + + @Override + public DrownedSecrets copy() { + return new DrownedSecrets(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 8b7440a99b2..95ab19c8550 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -71,6 +71,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Divine Visitation", 10, Rarity.MYTHIC, mage.cards.d.DivineVisitation.class)); cards.add(new SetCardInfo("Doom Whisperer", 69, Rarity.MYTHIC, mage.cards.d.DoomWhisperer.class)); cards.add(new SetCardInfo("Dream Eater", 38, Rarity.MYTHIC, mage.cards.d.DreamEater.class)); + cards.add(new SetCardInfo("Drowned Secrets", 39, Rarity.RARE, mage.cards.d.DrownedSecrets.class)); cards.add(new SetCardInfo("Emmara, Soul of the Accord", 168, Rarity.RARE, mage.cards.e.EmmaraSoulOfTheAccord.class)); cards.add(new SetCardInfo("Enhanced Surveillance", 40, Rarity.UNCOMMON, mage.cards.e.EnhancedSurveillance.class)); cards.add(new SetCardInfo("Erratic Cyclops", 98, Rarity.RARE, mage.cards.e.ErraticCyclops.class)); From 84e30b2f1f3df2f32fd814c379e9e130baeac140 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 18 Sep 2018 17:53:36 -0400 Subject: [PATCH 032/140] Implemented Generous Stray --- Mage.Sets/src/mage/cards/g/GenerousStray.java | 39 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 40 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/g/GenerousStray.java diff --git a/Mage.Sets/src/mage/cards/g/GenerousStray.java b/Mage.Sets/src/mage/cards/g/GenerousStray.java new file mode 100644 index 00000000000..6657cb089c9 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GenerousStray.java @@ -0,0 +1,39 @@ +package mage.cards.g; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author TheElk801 + */ +public final class GenerousStray extends CardImpl { + + public GenerousStray(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}"); + + this.subtype.add(SubType.CAT); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // When Generous Stray enters the battlefield, draw a card. + this.addAbility(new EntersBattlefieldTriggeredAbility( + new DrawCardSourceControllerEffect(1) + )); + } + + public GenerousStray(final GenerousStray card) { + super(card); + } + + @Override + public GenerousStray copy() { + return new GenerousStray(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 95ab19c8550..0890251476b 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -84,6 +84,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Fresh-Faced Recruit", 216, Rarity.COMMON, mage.cards.f.FreshFacedRecruit.class)); cards.add(new SetCardInfo("Garrison Sergeant", 172, Rarity.COMMON, mage.cards.g.GarrisonSergeant.class)); cards.add(new SetCardInfo("Gateway Plaza", 247, Rarity.COMMON, mage.cards.g.GatewayPlaza.class)); + cards.add(new SetCardInfo("Generous Stray", 129, Rarity.COMMON, mage.cards.g.GenerousStray.class)); cards.add(new SetCardInfo("Gird for Battle", 12, Rarity.UNCOMMON, mage.cards.g.GirdForBattle.class)); cards.add(new SetCardInfo("Glaive of the Guildpact", 236, Rarity.UNCOMMON, mage.cards.g.GlaiveOfTheGuildpact.class)); cards.add(new SetCardInfo("Glowspore Shaman", 173, Rarity.UNCOMMON, mage.cards.g.GlowsporeShaman.class)); From 086d458445701480b76d0690d59f8dae192acbcf Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 18 Sep 2018 17:57:01 -0400 Subject: [PATCH 033/140] Implemented Inspiring Unicorn --- .../src/mage/cards/i/InspiringUnicorn.java | 40 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 41 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/i/InspiringUnicorn.java diff --git a/Mage.Sets/src/mage/cards/i/InspiringUnicorn.java b/Mage.Sets/src/mage/cards/i/InspiringUnicorn.java new file mode 100644 index 00000000000..dd1d9a9e569 --- /dev/null +++ b/Mage.Sets/src/mage/cards/i/InspiringUnicorn.java @@ -0,0 +1,40 @@ +package mage.cards.i; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; + +/** + * + * @author TheElk801 + */ +public final class InspiringUnicorn extends CardImpl { + + public InspiringUnicorn(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}{W}"); + + this.subtype.add(SubType.UNICORN); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Whenever Inspiring Unicorn attacks, creatures you control get +1/+1 until end of turn. + this.addAbility(new AttacksTriggeredAbility( + new BoostControlledEffect(1, 1, Duration.EndOfTurn), false + )); + } + + public InspiringUnicorn(final InspiringUnicorn card) { + super(card); + } + + @Override + public InspiringUnicorn copy() { + return new InspiringUnicorn(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 0890251476b..f3c9beddd53 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -106,6 +106,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Hypothesizzle", 178, Rarity.COMMON, mage.cards.h.Hypothesizzle.class)); cards.add(new SetCardInfo("Impervious Greatwurm", 273, Rarity.MYTHIC, mage.cards.i.ImperviousGreatwurm.class)); cards.add(new SetCardInfo("Inescapable Blaze", 107, Rarity.UNCOMMON, mage.cards.i.InescapableBlaze.class)); + cards.add(new SetCardInfo("Inspiring Unicorn", 16, Rarity.COMMON, mage.cards.i.InspiringUnicorn.class)); cards.add(new SetCardInfo("Integrity // Intervention", 227, Rarity.UNCOMMON, mage.cards.i.IntegrityIntervention.class)); cards.add(new SetCardInfo("Invert // Invent", 228, Rarity.UNCOMMON, mage.cards.i.InvertInvent.class)); cards.add(new SetCardInfo("Ionize", 179, Rarity.RARE, mage.cards.i.Ionize.class)); From f2f60f3780412a9f323ff3a80db47d11e0a3153d Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 18 Sep 2018 17:59:48 -0400 Subject: [PATCH 034/140] Implemented Kraul Foragers --- Mage.Sets/src/mage/cards/k/KraulForagers.java | 42 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 43 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/k/KraulForagers.java diff --git a/Mage.Sets/src/mage/cards/k/KraulForagers.java b/Mage.Sets/src/mage/cards/k/KraulForagers.java new file mode 100644 index 00000000000..ffb5e6200fb --- /dev/null +++ b/Mage.Sets/src/mage/cards/k/KraulForagers.java @@ -0,0 +1,42 @@ +package mage.cards.k; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; +import mage.abilities.effects.common.GainLifeEffect; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author TheElk801 + */ +public final class KraulForagers extends CardImpl { + + public KraulForagers(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{G}"); + + this.subtype.add(SubType.INSECT); + this.subtype.add(SubType.SCOUT); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Undergrowth — When Kraul Foragers enters the battlefield, you gain 1 life for each creature card in your graveyard. + this.addAbility(new EntersBattlefieldTriggeredAbility( + new GainLifeEffect(new CardsInControllerGraveyardCount()), + false, "Undergrowth — " + )); + } + + public KraulForagers(final KraulForagers card) { + super(card); + } + + @Override + public KraulForagers copy() { + return new KraulForagers(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index f3c9beddd53..e28c05f970c 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -118,6 +118,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Join Shields", 181, Rarity.UNCOMMON, mage.cards.j.JoinShields.class)); cards.add(new SetCardInfo("Justice Strike", 182, Rarity.UNCOMMON, mage.cards.j.JusticeStrike.class)); cards.add(new SetCardInfo("Knight of Autumn", 183, Rarity.RARE, mage.cards.k.KnightOfAutumn.class)); + cards.add(new SetCardInfo("Kraul Foragers", 134, Rarity.COMMON, mage.cards.k.KraulForagers.class)); cards.add(new SetCardInfo("Lava Coil", 108, Rarity.UNCOMMON, mage.cards.l.LavaCoil.class)); cards.add(new SetCardInfo("Lazav, the Multifarious", 184, Rarity.MYTHIC, mage.cards.l.LazavTheMultifarious.class)); cards.add(new SetCardInfo("League Guildmage", 185, Rarity.UNCOMMON, mage.cards.l.LeagueGuildmage.class)); From 63c2b9f68cc4d1954e0b29240fc3f4e5abec4d0f Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 18 Sep 2018 19:27:11 -0400 Subject: [PATCH 035/140] Implemented Camaraderie --- Mage.Sets/src/mage/cards/c/Camaraderie.java | 72 ++++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 73 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/Camaraderie.java diff --git a/Mage.Sets/src/mage/cards/c/Camaraderie.java b/Mage.Sets/src/mage/cards/c/Camaraderie.java new file mode 100644 index 00000000000..505d1de53f6 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/Camaraderie.java @@ -0,0 +1,72 @@ +package mage.cards.c; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author TheElk801 + */ +public final class Camaraderie extends CardImpl { + + public Camaraderie(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{G}{W}"); + + // You gain X life and draw X cards, where X is the number of creatures you control. Creatures you control get +1/+1 until end of turn. + this.getSpellAbility().addEffect(new CamaraderieEffect()); + } + + public Camaraderie(final Camaraderie card) { + super(card); + } + + @Override + public Camaraderie copy() { + return new Camaraderie(this); + } +} + +class CamaraderieEffect extends OneShotEffect { + + public CamaraderieEffect() { + super(Outcome.Benefit); + this.staticText = "You gain X life and draw X cards, " + + "where X is the number of creatures you control. " + + "Creatures you control get +1/+1 until end of turn."; + } + + public CamaraderieEffect(final CamaraderieEffect effect) { + super(effect); + } + + @Override + public CamaraderieEffect copy() { + return new CamaraderieEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getSourceId()); + if (player == null) { + return false; + } + int xValue = game.getBattlefield().count( + StaticFilters.FILTER_CONTROLLED_CREATURE, + source.getSourceId(), source.getControllerId(), game + ); + player.gainLife(xValue, game, source); + player.drawCards(xValue, game); + game.addEffect(new BoostControlledEffect(1, 1, Duration.EndOfTurn), source); + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index e28c05f970c..dec4c9668d2 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -41,6 +41,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Boros Guildgate", 244, Rarity.COMMON, mage.cards.b.BorosGuildgate.class)); cards.add(new SetCardInfo("Boros Locket", 231, Rarity.COMMON, mage.cards.b.BorosLocket.class)); cards.add(new SetCardInfo("Bounty Agent", 2, Rarity.RARE, mage.cards.b.BountyAgent.class)); + cards.add(new SetCardInfo("Camaraderie", 157, Rarity.RARE, mage.cards.c.Camaraderie.class)); cards.add(new SetCardInfo("Centaur Peacemaker", 158, Rarity.COMMON, mage.cards.c.CentaurPeacemaker.class)); cards.add(new SetCardInfo("Charnel Troll", 160, Rarity.RARE, mage.cards.c.CharnelTroll.class)); cards.add(new SetCardInfo("Chemister's Insight", 32, Rarity.UNCOMMON, mage.cards.c.ChemistersInsight.class)); From 35ac0e2cadf2df1dbfe7215a89f736af73b3af30 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 18 Sep 2018 19:33:41 -0400 Subject: [PATCH 036/140] Implemented Electrostatic Field --- .../src/mage/cards/e/ElectrostaticField.java | 46 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 47 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/e/ElectrostaticField.java diff --git a/Mage.Sets/src/mage/cards/e/ElectrostaticField.java b/Mage.Sets/src/mage/cards/e/ElectrostaticField.java new file mode 100644 index 00000000000..39347660eae --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/ElectrostaticField.java @@ -0,0 +1,46 @@ +package mage.cards.e; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.common.DamagePlayersEffect; +import mage.constants.SubType; +import mage.abilities.keyword.DefenderAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.TargetController; +import mage.filter.StaticFilters; + +/** + * + * @author TheElk801 + */ +public final class ElectrostaticField extends CardImpl { + + public ElectrostaticField(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); + + this.subtype.add(SubType.WALL); + this.power = new MageInt(0); + this.toughness = new MageInt(4); + + // Defender + this.addAbility(DefenderAbility.getInstance()); + + // When you cast an instant or sorcery spell, Electrostatic Field deals 1 damage to each opponent. + this.addAbility(new SpellCastControllerTriggeredAbility( + new DamagePlayersEffect(1, TargetController.OPPONENT), + StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, false + )); + } + + public ElectrostaticField(final ElectrostaticField card) { + super(card); + } + + @Override + public ElectrostaticField copy() { + return new ElectrostaticField(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index dec4c9668d2..a3777dc0dec 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -73,6 +73,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Doom Whisperer", 69, Rarity.MYTHIC, mage.cards.d.DoomWhisperer.class)); cards.add(new SetCardInfo("Dream Eater", 38, Rarity.MYTHIC, mage.cards.d.DreamEater.class)); cards.add(new SetCardInfo("Drowned Secrets", 39, Rarity.RARE, mage.cards.d.DrownedSecrets.class)); + cards.add(new SetCardInfo("Electrostatic Field", 97, Rarity.COMMON, mage.cards.e.ElectrostaticField.class)); cards.add(new SetCardInfo("Emmara, Soul of the Accord", 168, Rarity.RARE, mage.cards.e.EmmaraSoulOfTheAccord.class)); cards.add(new SetCardInfo("Enhanced Surveillance", 40, Rarity.UNCOMMON, mage.cards.e.EnhancedSurveillance.class)); cards.add(new SetCardInfo("Erratic Cyclops", 98, Rarity.RARE, mage.cards.e.ErraticCyclops.class)); From a1baf7d5b411dd224dc1b27cf1f4ad26089d4249 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 18 Sep 2018 19:39:28 -0400 Subject: [PATCH 037/140] Implemented Gargoyle Guardian --- .../src/mage/cards/g/GargoyleGuardian.java | 57 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 58 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/g/GargoyleGuardian.java diff --git a/Mage.Sets/src/mage/cards/g/GargoyleGuardian.java b/Mage.Sets/src/mage/cards/g/GargoyleGuardian.java new file mode 100644 index 00000000000..c54558ce270 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GargoyleGuardian.java @@ -0,0 +1,57 @@ +package mage.cards.g; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.constants.SubType; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.counters.CounterType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; + +/** + * + * @author TheElk801 + */ +public final class GargoyleGuardian extends CardImpl { + + private static final FilterPermanent filter = new FilterControlledPermanent(); + + static { + filter.add(new SubtypePredicate(SubType.GATE)); + } + + public GargoyleGuardian(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{6}"); + + this.subtype.add(SubType.GARGOYLE); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Gargoyle Guardian enters the battlefield with a +1/+1 counter on it for each Gate you control. + this.addAbility(new EntersBattlefieldAbility( + new AddCountersSourceEffect( + CounterType.P1P1.createInstance(), + new PermanentsOnBattlefieldCount(filter), true + ), "with a +1/+1 counter on it for each Gate you control" + )); + } + + public GargoyleGuardian(final GargoyleGuardian card) { + super(card); + } + + @Override + public GargoyleGuardian copy() { + return new GargoyleGuardian(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index a3777dc0dec..981bda97fdd 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -84,6 +84,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Flower // Flourish", 226, Rarity.UNCOMMON, mage.cards.f.FlowerFlourish.class)); cards.add(new SetCardInfo("Forest", 264, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Fresh-Faced Recruit", 216, Rarity.COMMON, mage.cards.f.FreshFacedRecruit.class)); + cards.add(new SetCardInfo("Gargoyle Guardian", 235, Rarity.UNCOMMON, mage.cards.g.GargoyleGuardian.class)); cards.add(new SetCardInfo("Garrison Sergeant", 172, Rarity.COMMON, mage.cards.g.GarrisonSergeant.class)); cards.add(new SetCardInfo("Gateway Plaza", 247, Rarity.COMMON, mage.cards.g.GatewayPlaza.class)); cards.add(new SetCardInfo("Generous Stray", 129, Rarity.COMMON, mage.cards.g.GenerousStray.class)); From f4b39a4b448d5db567f772dad3e923986ca949a9 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 18 Sep 2018 19:49:19 -0400 Subject: [PATCH 038/140] Implemented Tajic, Legion's Edge --- .../src/mage/cards/t/TajicLegionsEdge.java | 77 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 78 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/t/TajicLegionsEdge.java diff --git a/Mage.Sets/src/mage/cards/t/TajicLegionsEdge.java b/Mage.Sets/src/mage/cards/t/TajicLegionsEdge.java new file mode 100644 index 00000000000..faa291400c4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TajicLegionsEdge.java @@ -0,0 +1,77 @@ +package mage.cards.t; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.PreventAllNonCombatDamageToAllEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.abilities.keyword.HasteAbility; +import mage.abilities.keyword.MentorAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; + +/** + * + * @author TheElk801 + */ +public final class TajicLegionsEdge extends CardImpl { + + private static final FilterPermanent filter = new FilterControlledCreaturePermanent("other creatures you control"); + + static { + filter.add(new AnotherPredicate()); + } + + public TajicLegionsEdge(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}{W}"); + + this.addSuperType(SuperType.LEGENDARY); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // Haste + this.addAbility(HasteAbility.getInstance()); + + // Mentor + this.addAbility(new MentorAbility()); + + // Prevent all noncombat damage that would be dealt to other creatures you control. + this.addAbility(new SimpleStaticAbility( + Zone.BATTLEFIELD, + new PreventAllNonCombatDamageToAllEffect( + Duration.WhileOnBattlefield, filter + ) + )); + + // {R}{W}: Tajic, Legion's Edge gains first strike until end of turn. + this.addAbility(new SimpleActivatedAbility( + Zone.BATTLEFIELD, + new GainAbilitySourceEffect( + FirstStrikeAbility.getInstance(), + Duration.EndOfTurn + ), new ManaCostsImpl("{R}{W}") + )); + } + + public TajicLegionsEdge(final TajicLegionsEdge card) { + super(card); + } + + @Override + public TajicLegionsEdge copy() { + return new TajicLegionsEdge(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 981bda97fdd..565c4361711 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -189,6 +189,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Swarm Guildmage", 201, Rarity.UNCOMMON, mage.cards.s.SwarmGuildmage.class)); cards.add(new SetCardInfo("Swathcutter Giant", 202, Rarity.UNCOMMON, mage.cards.s.SwathcutterGiant.class)); cards.add(new SetCardInfo("Swiftblade Vindicator", 203, Rarity.RARE, mage.cards.s.SwiftbladeVindicator.class)); + cards.add(new SetCardInfo("Tajic, Legion's Edge", 204, Rarity.RARE, mage.cards.t.TajicLegionsEdge.class)); cards.add(new SetCardInfo("Temple Garden", 258, Rarity.RARE, mage.cards.t.TempleGarden.class)); cards.add(new SetCardInfo("Thought Erasure", 206, Rarity.UNCOMMON, mage.cards.t.ThoughtErasure.class)); cards.add(new SetCardInfo("Thoughtbound Phantasm", 55, Rarity.UNCOMMON, mage.cards.t.ThoughtboundPhantasm.class)); From 1c113fb9c6c93a31cd4b8ae5303357077064b00b Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 18 Sep 2018 20:30:24 -0400 Subject: [PATCH 039/140] Implemented Chance for Glory --- .../src/mage/cards/c/ChanceForGlory.java | 36 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 37 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/ChanceForGlory.java diff --git a/Mage.Sets/src/mage/cards/c/ChanceForGlory.java b/Mage.Sets/src/mage/cards/c/ChanceForGlory.java new file mode 100644 index 00000000000..c630431bd6f --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ChanceForGlory.java @@ -0,0 +1,36 @@ +package mage.cards.c; + +import java.util.UUID; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.effects.common.turn.AddExtraTurnControllerEffect; +import mage.abilities.keyword.IndestructibleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; + +/** + * + * @author TheElk801 + */ +public final class ChanceForGlory extends CardImpl { + + public ChanceForGlory(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{R}{W}"); + + // Creatures you control gain indestructible. Take an extra turn after this one. At the beginning of that turn's end step, you lose the game. + this.getSpellAbility().addEffect(new GainAbilityControlledEffect( + IndestructibleAbility.getInstance(), Duration.EndOfGame + ).setText("Creatures you control gain indestructible.")); + this.getSpellAbility().addEffect(new AddExtraTurnControllerEffect(true)); + } + + public ChanceForGlory(final ChanceForGlory card) { + super(card); + } + + @Override + public ChanceForGlory copy() { + return new ChanceForGlory(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 565c4361711..5f98bcad2bf 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -43,6 +43,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Bounty Agent", 2, Rarity.RARE, mage.cards.b.BountyAgent.class)); cards.add(new SetCardInfo("Camaraderie", 157, Rarity.RARE, mage.cards.c.Camaraderie.class)); cards.add(new SetCardInfo("Centaur Peacemaker", 158, Rarity.COMMON, mage.cards.c.CentaurPeacemaker.class)); + cards.add(new SetCardInfo("Chance for Glory", 159, Rarity.MYTHIC, mage.cards.c.ChanceForGlory.class)); cards.add(new SetCardInfo("Charnel Troll", 160, Rarity.RARE, mage.cards.c.CharnelTroll.class)); cards.add(new SetCardInfo("Chemister's Insight", 32, Rarity.UNCOMMON, mage.cards.c.ChemistersInsight.class)); cards.add(new SetCardInfo("Chromatic Lantern", 233, Rarity.RARE, mage.cards.c.ChromaticLantern.class)); From 887646532046158005fa98e2c7e4875a93a66edf Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 18 Sep 2018 20:42:44 -0400 Subject: [PATCH 040/140] Implemented Gruesome Menagerie --- .../src/mage/cards/g/GruesomeMenagerie.java | 109 ++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 110 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/g/GruesomeMenagerie.java diff --git a/Mage.Sets/src/mage/cards/g/GruesomeMenagerie.java b/Mage.Sets/src/mage/cards/g/GruesomeMenagerie.java new file mode 100644 index 00000000000..6f907138688 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GruesomeMenagerie.java @@ -0,0 +1,109 @@ +package mage.cards.g; + +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.ComparisonType; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.common.FilterCreatureCard; +import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.Target; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author TheElk801 + */ +public final class GruesomeMenagerie extends CardImpl { + + public GruesomeMenagerie(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{B}{B}"); + + // Choose a creature card with converted mana cost 1 in your graveyard, then do the same for creature cards with converted mana costs 2 and 3. Return those cards to the battlefield. + this.getSpellAbility().addEffect(new GruesomeMenagerieEffect()); + } + + public GruesomeMenagerie(final GruesomeMenagerie card) { + super(card); + } + + @Override + public GruesomeMenagerie copy() { + return new GruesomeMenagerie(this); + } +} + +class GruesomeMenagerieEffect extends OneShotEffect { + + private static final FilterCard filter1 + = new FilterCreatureCard("creature card with converted mana cost 1"); + private static final FilterCard filter2 + = new FilterCreatureCard("creature card with converted mana cost 2"); + private static final FilterCard filter3 + = new FilterCreatureCard("creature card with converted mana cost 3"); + + static { + filter1.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, 1)); + filter2.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, 2)); + filter3.add(new ConvertedManaCostPredicate(ComparisonType.EQUAL_TO, 3)); + } + + public GruesomeMenagerieEffect() { + super(Outcome.Benefit); + this.staticText = "Choose a creature card with converted mana cost 1 " + + "in your graveyard, then do the same for creature cards " + + "with converted mana costs 2 and 3. " + + "Return those cards to the battlefield."; + } + + public GruesomeMenagerieEffect(final GruesomeMenagerieEffect effect) { + super(effect); + } + + @Override + public GruesomeMenagerieEffect copy() { + return new GruesomeMenagerieEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + Cards cards = new CardsImpl(); + Target target; + target = new TargetCardInYourGraveyard(filter1); + if (player.choose(outcome, target, source.getSourceId(), game)) { + Card card = game.getCard(target.getFirstTarget()); + if (card != null) { + cards.add(card); + } + } + target = new TargetCardInYourGraveyard(filter2); + if (player.choose(outcome, target, source.getSourceId(), game)) { + Card card = game.getCard(target.getFirstTarget()); + if (card != null) { + cards.add(card); + } + } + target = new TargetCardInYourGraveyard(filter3); + if (player.choose(outcome, target, source.getSourceId(), game)) { + Card card = game.getCard(target.getFirstTarget()); + if (card != null) { + cards.add(card); + } + } + return player.moveCards(cards, Zone.BATTLEFIELD, source, game); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 5f98bcad2bf..141ee9de689 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -100,6 +100,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Golgari Guildgate", 249, Rarity.COMMON, mage.cards.g.GolgariGuildgate.class)); cards.add(new SetCardInfo("Golgari Locket", 237, Rarity.COMMON, mage.cards.g.GolgariLocket.class)); cards.add(new SetCardInfo("Golgari Raiders", 130, Rarity.UNCOMMON, mage.cards.g.GolgariRaiders.class)); + cards.add(new SetCardInfo("Gruesome Menagerie", 71, Rarity.RARE, mage.cards.g.GruesomeMenagerie.class)); cards.add(new SetCardInfo("Guild Summit", 41, Rarity.UNCOMMON, mage.cards.g.GuildSummit.class)); cards.add(new SetCardInfo("Haazda Marshal", 13, Rarity.UNCOMMON, mage.cards.h.HaazdaMarshal.class)); cards.add(new SetCardInfo("Hammer Dropper", 176, Rarity.COMMON, mage.cards.h.HammerDropper.class)); From 336ff7516dc1d2ca62799716e66ff9f6b43646d7 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Tue, 18 Sep 2018 21:03:07 -0400 Subject: [PATCH 041/140] Implemented Kraul Harpooner --- .../src/mage/cards/k/KraulHarpooner.java | 105 ++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 106 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/k/KraulHarpooner.java diff --git a/Mage.Sets/src/mage/cards/k/KraulHarpooner.java b/Mage.Sets/src/mage/cards/k/KraulHarpooner.java new file mode 100644 index 00000000000..fe9b199e7cf --- /dev/null +++ b/Mage.Sets/src/mage/cards/k/KraulHarpooner.java @@ -0,0 +1,105 @@ +package mage.cards.k; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.constants.SubType; +import mage.abilities.keyword.ReachAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.AbilityPredicate; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetPermanent; + +/** + * + * @author TheElk801 + */ +public final class KraulHarpooner extends CardImpl { + + private static final FilterPermanent filter = new FilterCreaturePermanent("creature without flying you don't control"); + + static { + filter.add(new ControllerPredicate(TargetController.NOT_YOU)); + filter.add(new AbilityPredicate(FlyingAbility.class)); + } + + public KraulHarpooner(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); + + this.subtype.add(SubType.INSECT); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // Reach + this.addAbility(ReachAbility.getInstance()); + + // Undergrowth — When Kraul Harpooner enters the battlefield, choose up to one target creature with flying you don't control. Kraul Harpooner gets +X/+0 until end of turn, where X is the number of creature cards in your graveyard, then you may have Kraul Harpooner fight that creature. + Ability ability = new EntersBattlefieldTriggeredAbility( + new KraulHarpoonerEffect(), false, + "Undergrowth — " + ); + ability.addTarget(new TargetPermanent(0, 1, filter, false)); + this.addAbility(ability); + } + + public KraulHarpooner(final KraulHarpooner card) { + super(card); + } + + @Override + public KraulHarpooner copy() { + return new KraulHarpooner(this); + } +} + +class KraulHarpoonerEffect extends OneShotEffect { + + public KraulHarpoonerEffect() { + super(Outcome.Benefit); + this.staticText = "choose up to one target creature with flying " + + "you don't control. {this} gets +X/+0 until end of turn, " + + "where X is the number of creature cards in your graveyard, " + + "then you may have {this} fight that creature."; + } + + public KraulHarpoonerEffect(final KraulHarpoonerEffect effect) { + super(effect); + } + + @Override + public KraulHarpoonerEffect copy() { + return new KraulHarpoonerEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent sourcePerm = game.getPermanent(source.getSourceId()); + Player player = game.getPlayer(source.getControllerId()); + if (sourcePerm == null || player == null) { + return false; + } + int xValue = player.getGraveyard().count(StaticFilters.FILTER_CARD_CREATURE, game); + game.addEffect(new BoostSourceEffect(xValue, 0, Duration.EndOfTurn), source); + Permanent creature = game.getPermanent(source.getFirstTarget()); + if (creature == null || !player.chooseUse(outcome, "Have " + sourcePerm.getLogName() + " fight " + creature.getLogName() + "?", source, game)) { + return true; + } + return creature.fight(sourcePerm, source, game); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 141ee9de689..8ad7ef198d7 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -124,6 +124,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Justice Strike", 182, Rarity.UNCOMMON, mage.cards.j.JusticeStrike.class)); cards.add(new SetCardInfo("Knight of Autumn", 183, Rarity.RARE, mage.cards.k.KnightOfAutumn.class)); cards.add(new SetCardInfo("Kraul Foragers", 134, Rarity.COMMON, mage.cards.k.KraulForagers.class)); + cards.add(new SetCardInfo("Kraul Harpooner", 136, Rarity.UNCOMMON, mage.cards.k.KraulHarpooner.class)); cards.add(new SetCardInfo("Lava Coil", 108, Rarity.UNCOMMON, mage.cards.l.LavaCoil.class)); cards.add(new SetCardInfo("Lazav, the Multifarious", 184, Rarity.MYTHIC, mage.cards.l.LazavTheMultifarious.class)); cards.add(new SetCardInfo("League Guildmage", 185, Rarity.UNCOMMON, mage.cards.l.LeagueGuildmage.class)); From a2f30079bbd6e43624664ae00bc0358bca7d9e2d Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 08:07:31 -0400 Subject: [PATCH 042/140] fixed Kraul Harpooner text --- Mage.Sets/src/mage/cards/k/KraulHarpooner.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/k/KraulHarpooner.java b/Mage.Sets/src/mage/cards/k/KraulHarpooner.java index fe9b199e7cf..d3a2e8575f2 100644 --- a/Mage.Sets/src/mage/cards/k/KraulHarpooner.java +++ b/Mage.Sets/src/mage/cards/k/KraulHarpooner.java @@ -31,7 +31,7 @@ import mage.target.TargetPermanent; */ public final class KraulHarpooner extends CardImpl { - private static final FilterPermanent filter = new FilterCreaturePermanent("creature without flying you don't control"); + private static final FilterPermanent filter = new FilterCreaturePermanent("creature with flying you don't control"); static { filter.add(new ControllerPredicate(TargetController.NOT_YOU)); From 8ae3c9862aaf5a10ddb514b50aaf414ad90ab4fa Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 11:54:27 -0400 Subject: [PATCH 043/140] updated GRN spoiler --- ...argoyleGuardian.java => GatekeeperGargoyle.java} | 10 +++++----- Mage.Sets/src/mage/cards/l/LedevChampion.java | 2 +- Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 2 +- Utils/mtg-cards-data.txt | 13 ++++++++++--- 4 files changed, 17 insertions(+), 10 deletions(-) rename Mage.Sets/src/mage/cards/g/{GargoyleGuardian.java => GatekeeperGargoyle.java} (85%) diff --git a/Mage.Sets/src/mage/cards/g/GargoyleGuardian.java b/Mage.Sets/src/mage/cards/g/GatekeeperGargoyle.java similarity index 85% rename from Mage.Sets/src/mage/cards/g/GargoyleGuardian.java rename to Mage.Sets/src/mage/cards/g/GatekeeperGargoyle.java index c54558ce270..bc1dc584880 100644 --- a/Mage.Sets/src/mage/cards/g/GargoyleGuardian.java +++ b/Mage.Sets/src/mage/cards/g/GatekeeperGargoyle.java @@ -19,7 +19,7 @@ import mage.filter.predicate.mageobject.SubtypePredicate; * * @author TheElk801 */ -public final class GargoyleGuardian extends CardImpl { +public final class GatekeeperGargoyle extends CardImpl { private static final FilterPermanent filter = new FilterControlledPermanent(); @@ -27,7 +27,7 @@ public final class GargoyleGuardian extends CardImpl { filter.add(new SubtypePredicate(SubType.GATE)); } - public GargoyleGuardian(UUID ownerId, CardSetInfo setInfo) { + public GatekeeperGargoyle(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{6}"); this.subtype.add(SubType.GARGOYLE); @@ -46,12 +46,12 @@ public final class GargoyleGuardian extends CardImpl { )); } - public GargoyleGuardian(final GargoyleGuardian card) { + public GatekeeperGargoyle(final GatekeeperGargoyle card) { super(card); } @Override - public GargoyleGuardian copy() { - return new GargoyleGuardian(this); + public GatekeeperGargoyle copy() { + return new GatekeeperGargoyle(this); } } diff --git a/Mage.Sets/src/mage/cards/l/LedevChampion.java b/Mage.Sets/src/mage/cards/l/LedevChampion.java index 51d9b6dfdbc..8c5d59ecaed 100644 --- a/Mage.Sets/src/mage/cards/l/LedevChampion.java +++ b/Mage.Sets/src/mage/cards/l/LedevChampion.java @@ -34,7 +34,7 @@ public final class LedevChampion extends CardImpl { public LedevChampion(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}{W}"); - this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.ELF); this.subtype.add(SubType.KNIGHT); this.power = new MageInt(2); this.toughness = new MageInt(2); diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 8ad7ef198d7..603aa7d8679 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -85,8 +85,8 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Flower // Flourish", 226, Rarity.UNCOMMON, mage.cards.f.FlowerFlourish.class)); cards.add(new SetCardInfo("Forest", 264, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Fresh-Faced Recruit", 216, Rarity.COMMON, mage.cards.f.FreshFacedRecruit.class)); - cards.add(new SetCardInfo("Gargoyle Guardian", 235, Rarity.UNCOMMON, mage.cards.g.GargoyleGuardian.class)); cards.add(new SetCardInfo("Garrison Sergeant", 172, Rarity.COMMON, mage.cards.g.GarrisonSergeant.class)); + cards.add(new SetCardInfo("Gatekeeper Gargoyle", 235, Rarity.UNCOMMON, mage.cards.g.GatekeeperGargoyle.class)); cards.add(new SetCardInfo("Gateway Plaza", 247, Rarity.COMMON, mage.cards.g.GatewayPlaza.class)); cards.add(new SetCardInfo("Generous Stray", 129, Rarity.COMMON, mage.cards.g.GenerousStray.class)); cards.add(new SetCardInfo("Gird for Battle", 12, Rarity.UNCOMMON, mage.cards.g.GirdForBattle.class)); diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 5da4331995e..12f2c2c01f5 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -34302,7 +34302,9 @@ Blade Instructor|Guilds of Ravnica|1|C|{2}{W}|Creature - Human Soldier|3|1|Mento Bounty Agent|Guilds of Ravnica|2|R|{1}{W}|Creature - Human Soldier|2|2|Vigilance${T}, Sacrifice Bounty Agent: Destroy target legendary permanent that's an artifact, creature, or enchantment.| Citywide Bust|Guilds of Ravnica|4|R|{1}{W}{W}|Sorcery|||Destroy all creatures with toughness 4 or greater.| Conclave Tribunal|Guilds of Ravnica|6|U|{3}{W}|Enchantment|||Convoke$When Conclave Tribunal enters the battlefield, exile target nonland permanent an opponent controls until Conclave Tribunal leaves the battlefield.| +Dawn of Hope|Guilds of Ravnica|8|R|{1}{W}|Enchantment|||Whenever you gain life, you may pay {2}. If you do, draw a card.${3}{W}: Create a 1/1 white Soldier creature token with lifelink.| Divine Visitation|Guilds of Ravnica|10|M|{3}{W}{W}|Enchantment|||If one or more creature tokens would be created under your control, that many 4/4 white Angel creature tokens with flying and vigilance are created instead.| +Flight of Equenauts|Guilds of Ravnica|11|U|{7}{W}|Creature - Human Knight|4|5|Convoke$Flying| Gird for Battle|Guilds of Ravnica|12|U|{W}|Sorcery|||Put a +1/+1 counter on each of up to two target creatures.| Haazda Marshal|Guilds of Ravnica|13|U|{W}|Creature - Human Soldier|1|1|Whenever Haazda Marshal and at least two other creatures attack, create a 1/1 white Solider creature token with lifelink.| Healer's Hawk|Guilds of Ravnica|14|C|{W}|Creature - Bird|1|1|Flying, lifelink| @@ -34348,6 +34350,7 @@ Midnight Reaper|Guilds of Ravnica|77|R|{2}{B}|Creature - Zombie Knight|3|2|Whene Moodmark Painter|Guilds of Ravnica|78|C|{2}{B}{B}|Creature - Human Shaman|2|3|Undergrowth — When Moodmark Painter enters the battlefield, target creature gains menace and gets +X/+0 until end of turn, where X is the number of creature cards in your graveyard.| Necrotic Wound|Guilds of Ravnica|79|U|{B}|Instant|||Undergrowth — Target creature gets -X/-X until end of turn, where X is the number of creature cards in your graveyard. If that creature would die this turn, exile it instead.| Never Happened|Guilds of Ravnica|80|C|{2}{B}|Sorcery|||Target opponent reveals their hand. You choose a nonland card from that player's graveyard or hand and exile it.| +Plaguecaster|Guilds of Ravnica|82|U|{2}{B}|Creature - Human Shaman|3|2|When Plaguecaster enters the battlefield, each player sacrifices a creature or planeswalker. Each player who can't discards a card.| Price of Fame|Guilds of Ravnica|83|U|{3}{B}|Instant|||This spell costs {2} less to cast if it targets a legendary creature.$Destroy target creature.$Surveil 2.| Ritual of Soot|Guilds of Ravnica|84|R|{2}{B}{B}|Sorcery|||Destroy all creatures with converted mana cost 3 or less.| Whispering Snitch|Guilds of Ravnica|90|U|{1}{B}|Creature - Vampire Rogue|1|3|Whenever you surveil for the first time each turn, Whispering Snitch deals 1 damage to each opponent and you gain 1 life.| @@ -34361,6 +34364,7 @@ Erratic Cyclops|Guilds of Ravnica|98|R|{3}{R}|Creature - Cyclops Shaman|0|8|Tram Experimental Frenzy|Guilds of Ravnica|99|R|{3}{R}|Enchantment|||You may look at the top card of your library any time.$You may play the top card of your library.$You can't play cards from your hand.${3}{R}: Destroy Experimental Frenzy.| Goblin Banneret|Guilds of Ravnica|102|U|{R}|Creature - Goblin Soldier|1|1|Mentor${1}{R}: Goblin Banneret gets +2/+0 until end of turn.| Goblin Cratermaker|Guilds of Ravnica|103|U|{1}{R}|Creature - Goblin Warrior|2|2|{1}, Sacrifice Goblin Cratermaker: Choose one —$• Goblin Cratermaker deals 2 damage to target creature.$• Destroy target colorless nonland permanent.| +Goblin Locksmith|Guilds of Ravnica|104|C|{1}{R}|Creature - Goblin Rogue|2|1|Whenever Goblin Locksmith attacks, creatures with defender can't block this turn.| Inescapable Blaze|Guilds of Ravnica|107|U|{4}{R}{R}|Instant|||This spell can't be countered.$Inescapable Flame deals 6 damage to any target.| Lava Coil|Guilds of Ravnica|108|U|{1}{R}|Sorcery|||Lava Coil deals 4 damage to target creature. If that creature would die this turn, exile it instead.| Legion Warboss|Guilds of Ravnica|109|R|{2}{R}|Creature - Goblin Soldier|2|2|Mentor$At the beginning of combat on your turn, create a 1/1 red Goblin creature token. That token gains haste until end of turn and attacks this combat if able.| @@ -34371,6 +34375,7 @@ Wojek Bodyguard|Guilds of Ravnica|120|C|{2}{R}|Creature - Human Soldier|3|3|Ment Affectionate Indrik|Guilds of Ravnica|121|U|{5}{G}|Creature - Beast|4|4|When Affectionate Indrik enters the battlefield, you may have it fight target creature you don't control.| Arboretum Elemental|Guilds of Ravnica|122|U|{7}{G}{G}|Creature - Elemental|7|5|Convoke$Hexproof| Beast Whisperer|Guilds of Ravnica|123|R|{2}{G}{G}|Creature - Elf Druid|2|3|Whenever you cast a creature spell, draw a card.| +Bounty of Might|Guilds of Ravnica|124|R|{4}{G}{G}|Instant|||Target creature gets +3/+3 until end of turn.$Target creature gets +3/+3 until end of turn.$Target creature gets +3/+3 until end of turn.| Circuitous Route|Guilds of Ravnica|125|U|{3}{G}|Sorcery|||Search your library for up to two basic land cards and/or Gate cards and put them onto the battlefield tapped, then shuffle your library.| District Guide|Guilds of Ravnica|128|U|{2}{G}|Creature - Elf Scout|2|2|When District Guide enters the battlefield, you may search your library for a basic land card or Gate card, reveal it, put it into your hand, then shuffle your library.| Generous Stray|Guilds of Ravnica|129|C|{2}{G}|Creature - Cat|1|2|When Generous Stray enters the battlefield, draw a card.| @@ -34389,7 +34394,7 @@ Artful Takedown|Guilds of Ravnica|151|C|{2}{U}{B}|Instant|||Choose one or both Assassin's Trophy|Guilds of Ravnica|152|R|{B}{G}|Instant|||Destroy target permanent an opponent controls. Its controller may search their library for a basic land card, put it onto the battlefield, then shuffle their library.| Aurelia, Exemplar of Justice|Guilds of Ravnica|153|M|{2}{R}{W}|Legendary Creature - Angel|2|5|Flying$Mentor$At the beginning of combat on your turn, choose up to one target creature you control. Until end of turn, that creature gets +2/+0, gains trample if it's red, and gains vigilance if it's white.| Beacon Bolt|Guilds of Ravnica|154|U|{1}{U}{R}|Sorcery|||Beacon Bolt deals damage to target creature equal to the total number of instant and sorcery cards you own in exile and in your graveyard.$Jump-start| -Boltsplicer Mage|Guilds of Ravnica|155|U|{U}{R}|Creature - Vedalken Wizard|2|2|Whenever you cast an instant or sorcery that targets only Boltsplicer Mage, if you control one or more creatures that the spell could target, choose one of them. Copy the spell and it targets the chosen creature.| +Beamsplitter Mage|Guilds of Ravnica|155|U|{U}{R}|Creature - Vedalken Wizard|2|2|Whenever you cast an instant or sorcery that targets only Beamsplitter Mage, if you control one or more creatures that the spell could target, choose one of them. Copy the spell and it targets the chosen creature.| Boros Challenger|Guilds of Ravnica|156|U|{R}{W}|Creature - Human Soldier|2|3|Mentor${2}{R}{W}: Boros Challenger gets +1/+1 until end of turn.| Camaraderie|Guilds of Ravnica|157|R|{4}{G}{W}|Sorcery|||You gain X life and draw X cards, where X is the number of creatures you control. Creatures you control get +1/+1 until end of turn.| Centaur Peacemaker|Guilds of Ravnica|158|C|{1}{G}{W}|Creature - Centaur Cleric|3|3|When Centaur Peacemaker enters the battlefield, each player gains 4 life.| @@ -34403,6 +34408,7 @@ Deafening Clarion|Guilds of Ravnica|165|R|{1}{R}{W}|Sorcery|||Choose one or both Dimir Spybug|Guilds of Ravnica|166|U|{U}{B}|Creature - Insect|1|1|Flying$Menace$Whenever you surveil, put a +1/+1 counter on Dimir Spybug.| Disinformation Campaign|Guilds of Ravnica|167|U|{1}{U}{B}|Enchantment|||When Disinformation Campaign enters the battlefield, you draw a card and each opponent discards a card.$Whenever you surveil, return Disinformation Campaign to its owner's hand.| Emmara, Soul of the Accord|Guilds of Ravnica|168|R|{G}{W}|Legendary Creature - Elf Cleric|2|2|Whenever Emmara, Soul of the Accord becomes tapped, create a 1/1 white Soldier creature token with lifelink.| +Erstwhile Trooper|Guilds of Ravnica|169|C|{1}{B}{G}|Creature - Zombie Soldier|2|2|Discard a creature card: Erstwhile Trooper gets +2/+2 and gains trample until end of turn. Activate this ability only once each turn.| Etrata, the Silencer|Guilds of Ravnica|170|R|{2}{U}{B}|Legendary Creature - Vampire Assassin|3|5|Etrata, the Silencer can't be blocked.$Whenever Etrata deals combat damage to a player, exile target creature that player controls and put a hit counter on that card. That player loses the game if they own three or more exiled cards with hit counters on them. Etrata's owner shuffles Etrata into their library.| Firemind's Research|Guilds of Ravnica|171|R|{U}{R}|Enchantment|||Whenever you cast an instant or sorcery spell, put a charge counter on Firemind's Research.${1}{U}, Remove two charge counters from Firemind's Research: Draw a card.${1}{R}, Remove five charge counters from Firemind's Research: It deals 5 damage to any target.| Garrison Sergeant|Guilds of Ravnica|172|C|{3}{R}{W}|Creature - Viashino Soldier|3|3|Garrison Sergeant has double strike as long as you control a Gate.| @@ -34419,7 +34425,7 @@ Justice Strike|Guilds of Ravnica|182|U|{R}{W}|Instant|||Target creature deals da Knight of Autumn|Guilds of Ravnica|183|R|{1}{G}{W}|Creature - Dryad Knight|2|1|When Knight of Autumn enters the battlefield, choose one —$• Put two +1/+1 counters on Knight of Autumn.$• Destroy target artifact or enchantment.$• You gain 4 life.| Lazav, the Multifarious|Guilds of Ravnica|184|M|{U}{B}|Legendary Creature - Shapeshifter|1|3|When Lazav, the Multifarious enters the battlefield, surveil 1.${X}: Lazav, the Multifarious becomes a copy of target creature card in your graveyard with converted mana cost X, except its name is Lazav, the Multifarious, it's legendary in addition to its other types, and it has this ability.| League Guildmage|Guilds of Ravnica|185|U|{U}{R}|Creature - Human Wizard|2|2|{3}{U}, {T}: Draw a card.${X}{R}, {T}: Copy target instant or sorcery spell you control with converted mana cost X. You may choose new targets for the copy.| -Ledev Champion|Guilds of Ravnica|186|U|{1}{G}{W}|Creature - Human Knight|2|2|Whenever Ledev Champion attacks, you may tap any number of untapped creatures you control. Ledev Champion gets +1/+1 until end of turn for each creature tapped this way.${3}{G}{W}: Create a 1/1 white soldier creature token with lifelink.| +Ledev Champion|Guilds of Ravnica|186|U|{1}{G}{W}|Creature - Elf Knight|2|2|Whenever Ledev Champion attacks, you may tap any number of untapped creatures you control. Ledev Champion gets +1/+1 until end of turn for each creature tapped this way.${3}{G}{W}: Create a 1/1 white soldier creature token with lifelink.| Legion Guildmage|Guilds of Ravnica|187|U|{R}{W}|Creature - Human Wizard|2|2|{5}{R}, {T}: Legion Guildmage deals 3 damage to each opponent.${2}{W}, {T}: Tap another target creature.| March of the Multitudes|Guilds of Ravnica|188|M|{X}{G}{W}{W}|Instant|||Convoke$Create X 1/1 white Soldier creature tokens with lifelink.| Mnemonic Betrayal|Guilds of Ravnica|189|M|{1}{U}{B}|Sorcery|||Exile all card from all opponents' graveyards. You may cast those cards this turn, and you may spend mana as though it were mana of any type to cast those spells. At the beginning of the next end step, if any of those cards remain exiled, return them to their owner's graveyards.$Exile Mnemonic Betrayal.| @@ -34473,9 +34479,10 @@ Resurgence|Guilds of Ravnica|229|R|{3}{R}{W}|Sorcery|||Creatures you control gai Statue|Guilds of Ravnica|230|U|{2}{B}{G}|Instant|||Destroy target artifact, creature, or enchantment.| Status|Guilds of Ravnica|230|U|{B/G}|Instant|||Target creature gets +1/+1 and gains deathtouch until end of turn.| Boros Locket|Guilds of Ravnica|231|C|{3}|Artifact|||{T}: Add {R} or {W}.${R/W}{R/W}{R/W}{R/W}, {T}, Sacrifice Boros Locket: Draw two cards.| +Chamber Sentry|Guilds of Ravnica|232|R|{X}|Artifact Creature - Construct|0|0|Chamber Sentry enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it.${X}, {T}, Remove X +1/+1 counters from Chamber Sentry: It deals X damage to any target.${W}{U}{B}{R}{G}: Return Chamber Sentry from your graveyard to your hand.| Chromatic Lantern|Guilds of Ravnica|233|R|{3}|Artifact|||Lands you control have "{T}: Add one mana of any color."${T}: Add one mana of any color.| Dimir Locket|Guilds of Ravnica|234|C|{3}|Artifact|||{T}: Add {U} or {B}.${U/B}{U/B}{U/B}{U/B}, {T}, Sacrifice Dimir Locket: Draw two cards.| -Gargoyle Guardian|Guilds of Ravnica|235|U|{6}|Artifact Creature - Gargoyle|3|3|Flying$Gargoyle Guardian enters the battlefield with a +1/+1 counter on it for each Gate you control.| +Gatekeeper Gargolye|Guilds of Ravnica|235|U|{6}|Artifact Creature - Gargoyle|3|3|Flying$Gargoyle Guardian enters the battlefield with a +1/+1 counter on it for each Gate you control.| Glaive of the Guildpact|Guilds of Ravnica|236|U|{2}|Artifact - Equipment|||Equipped creature gets +1/+0 for each Gate you control and has vigilance and menace.$Equip {3}| Golgari Locket|Guilds of Ravnica|237|C|{3}|Artifact|||{T}: Add {B} or {G}.${B/G}{B/G}{B/G}{B/G}, {T}, Sacrifice Golgari Locket: Draw two cards.| Izzet Locket|Guilds of Ravnica|238|C|{3}|Artifact|||{T}: Add {U} or {R}.${U/R}{U/R}{U/R}{U/R}, {T}, Sacrifice Izzet Locket: Draw two cards.| From 403dadf4f25b447cea049ebc3aa2893996ecd3c2 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 12:01:31 -0400 Subject: [PATCH 044/140] Implemented Dawn of Hope --- Mage.Sets/src/mage/cards/d/DawnOfHope.java | 49 ++++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 50 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/d/DawnOfHope.java diff --git a/Mage.Sets/src/mage/cards/d/DawnOfHope.java b/Mage.Sets/src/mage/cards/d/DawnOfHope.java new file mode 100644 index 00000000000..c65faba3be4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DawnOfHope.java @@ -0,0 +1,49 @@ +package mage.cards.d; + +import java.util.UUID; +import mage.abilities.common.GainLifeControllerTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.game.permanent.token.SoldierLifelinkToken; + +/** + * + * @author TheElk801 + */ +public final class DawnOfHope extends CardImpl { + + public DawnOfHope(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}"); + + // Whenever you gain life, you may pay {2}. If you do, draw a card. + this.addAbility(new GainLifeControllerTriggeredAbility( + new DoIfCostPaid( + new DrawCardSourceControllerEffect(1), + new GenericManaCost(2)), false + )); + + // {3}{W}: Create a 1/1 white Soldier creature token with lifelink. + this.addAbility(new SimpleActivatedAbility( + Zone.BATTLEFIELD, + new CreateTokenEffect(new SoldierLifelinkToken()), + new ManaCostsImpl("{3}{W}") + )); + } + + public DawnOfHope(final DawnOfHope card) { + super(card); + } + + @Override + public DawnOfHope copy() { + return new DawnOfHope(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 603aa7d8679..bdc7a2a70fc 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -58,6 +58,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Crackling Drake", 163, Rarity.UNCOMMON, mage.cards.c.CracklingDrake.class)); cards.add(new SetCardInfo("Creeping Chill", 66, Rarity.UNCOMMON, mage.cards.c.CreepingChill.class)); cards.add(new SetCardInfo("Darkblade Agent", 164, Rarity.COMMON, mage.cards.d.DarkbladeAgent.class)); + cards.add(new SetCardInfo("Dawn of Hope", 8, Rarity.RARE, mage.cards.d.DawnOfHope.class)); cards.add(new SetCardInfo("Deadly Visit", 68, Rarity.COMMON, mage.cards.d.DeadlyVisit.class)); cards.add(new SetCardInfo("Deafening Clarion", 165, Rarity.RARE, mage.cards.d.DeafeningClarion.class)); cards.add(new SetCardInfo("Dimir Guildgate", 245, Rarity.COMMON, mage.cards.d.DimirGuildgate.class)); From 8117fcf42d1178aebdfb83b64ae75a7794e8511b Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 12:06:39 -0400 Subject: [PATCH 045/140] Implemented ErstwhileTrooper --- .../src/mage/cards/e/ErstwhileTrooper.java | 58 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 59 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/e/ErstwhileTrooper.java diff --git a/Mage.Sets/src/mage/cards/e/ErstwhileTrooper.java b/Mage.Sets/src/mage/cards/e/ErstwhileTrooper.java new file mode 100644 index 00000000000..07146818834 --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/ErstwhileTrooper.java @@ -0,0 +1,58 @@ +package mage.cards.e; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.LimitedTimesPerTurnActivatedAbility; +import mage.abilities.costs.common.DiscardTargetCost; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.filter.StaticFilters; +import mage.target.common.TargetCardInHand; + +/** + * + * @author TheElk801 + */ +public final class ErstwhileTrooper extends CardImpl { + + public ErstwhileTrooper(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}{G}"); + + this.subtype.add(SubType.ZOMBIE); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Discard a creature card: Erstwhile Trooper gets +2/+2 and gains trample until end of turn. Activate this ability only once each turn. + Ability ability = new LimitedTimesPerTurnActivatedAbility( + Zone.BATTLEFIELD, + new BoostSourceEffect( + 2, 2, Duration.EndOfTurn + ).setText("{this} gets +2/+2"), + new DiscardTargetCost(new TargetCardInHand( + StaticFilters.FILTER_CARD_CREATURE_A + )) + ); + ability.addEffect(new GainAbilitySourceEffect( + TrampleAbility.getInstance(), Duration.EndOfTurn + ).setText("and gains trample until end of turn")); + this.addAbility(ability); + } + + public ErstwhileTrooper(final ErstwhileTrooper card) { + super(card); + } + + @Override + public ErstwhileTrooper copy() { + return new ErstwhileTrooper(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index bdc7a2a70fc..725c3cd1698 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -79,6 +79,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Emmara, Soul of the Accord", 168, Rarity.RARE, mage.cards.e.EmmaraSoulOfTheAccord.class)); cards.add(new SetCardInfo("Enhanced Surveillance", 40, Rarity.UNCOMMON, mage.cards.e.EnhancedSurveillance.class)); cards.add(new SetCardInfo("Erratic Cyclops", 98, Rarity.RARE, mage.cards.e.ErraticCyclops.class)); + cards.add(new SetCardInfo("Erstwhile Trooper", 169, Rarity.COMMON, mage.cards.e.ErstwhileTrooper.class)); cards.add(new SetCardInfo("Etrata, the Silencer", 170, Rarity.RARE, mage.cards.e.EtrataTheSilencer.class)); cards.add(new SetCardInfo("Expansion // Explosion", 224, Rarity.RARE, mage.cards.e.ExpansionExplosion.class)); cards.add(new SetCardInfo("Find // Finality", 225, Rarity.RARE, mage.cards.f.FindFinality.class)); From ad04a30aa59ad2162a8bc66bea53fb998bd3a764 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 12:07:29 -0400 Subject: [PATCH 046/140] Implemented Flight of Equenauts --- .../src/mage/cards/f/FlightOfEquenauts.java | 41 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 42 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/f/FlightOfEquenauts.java diff --git a/Mage.Sets/src/mage/cards/f/FlightOfEquenauts.java b/Mage.Sets/src/mage/cards/f/FlightOfEquenauts.java new file mode 100644 index 00000000000..57c3e935476 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FlightOfEquenauts.java @@ -0,0 +1,41 @@ +package mage.cards.f; + +import java.util.UUID; +import mage.MageInt; +import mage.constants.SubType; +import mage.abilities.keyword.ConvokeAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author TheElk801 + */ +public final class FlightOfEquenauts extends CardImpl { + + public FlightOfEquenauts(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{7}{W}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.KNIGHT); + this.power = new MageInt(4); + this.toughness = new MageInt(5); + + // Convoke + this.addAbility(new ConvokeAbility()); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + } + + public FlightOfEquenauts(final FlightOfEquenauts card) { + super(card); + } + + @Override + public FlightOfEquenauts copy() { + return new FlightOfEquenauts(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 725c3cd1698..5c7b18d4b07 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -84,6 +84,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Expansion // Explosion", 224, Rarity.RARE, mage.cards.e.ExpansionExplosion.class)); cards.add(new SetCardInfo("Find // Finality", 225, Rarity.RARE, mage.cards.f.FindFinality.class)); cards.add(new SetCardInfo("Firemind's Research", 171, Rarity.RARE, mage.cards.f.FiremindsResearch.class)); + cards.add(new SetCardInfo("Flight of Equenauts", 11, Rarity.UNCOMMON, mage.cards.f.FlightOfEquenauts.class)); cards.add(new SetCardInfo("Flower // Flourish", 226, Rarity.UNCOMMON, mage.cards.f.FlowerFlourish.class)); cards.add(new SetCardInfo("Forest", 264, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Fresh-Faced Recruit", 216, Rarity.COMMON, mage.cards.f.FreshFacedRecruit.class)); From 0e0673387ca5201f3e4c5eb77a7ec2f80a7ea383 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 12:10:32 -0400 Subject: [PATCH 047/140] Implemented Goblin Locksmith --- .../src/mage/cards/g/GoblinLocksmith.java | 51 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 52 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/g/GoblinLocksmith.java diff --git a/Mage.Sets/src/mage/cards/g/GoblinLocksmith.java b/Mage.Sets/src/mage/cards/g/GoblinLocksmith.java new file mode 100644 index 00000000000..9fa25f47df2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GoblinLocksmith.java @@ -0,0 +1,51 @@ +package mage.cards.g; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.effects.common.combat.CantBlockAllEffect; +import mage.abilities.keyword.DefenderAbility; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.AbilityPredicate; + +/** + * + * @author TheElk801 + */ +public final class GoblinLocksmith extends CardImpl { + + private static final FilterCreaturePermanent filter + = new FilterCreaturePermanent("creatures with defender"); + + static { + filter.add(new AbilityPredicate(DefenderAbility.class)); + } + + public GoblinLocksmith(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); + + this.subtype.add(SubType.GOBLIN); + this.subtype.add(SubType.ROGUE); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Whenever Goblin Locksmith attacks, creatures with defender can't block this turn. + this.addAbility(new AttacksTriggeredAbility( + new CantBlockAllEffect(filter, Duration.EndOfTurn), false + )); + } + + public GoblinLocksmith(final GoblinLocksmith card) { + super(card); + } + + @Override + public GoblinLocksmith copy() { + return new GoblinLocksmith(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 5c7b18d4b07..e0189769e24 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -98,6 +98,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Goblin Banneret", 102, Rarity.UNCOMMON, mage.cards.g.GoblinBanneret.class)); cards.add(new SetCardInfo("Goblin Cratermaker", 103, Rarity.UNCOMMON, mage.cards.g.GoblinCratermaker.class)); cards.add(new SetCardInfo("Goblin Electromancer", 174, Rarity.COMMON, mage.cards.g.GoblinElectromancer.class)); + cards.add(new SetCardInfo("Goblin Locksmith", 104, Rarity.COMMON, mage.cards.g.GoblinLocksmith.class)); cards.add(new SetCardInfo("Golgari Findbroker", 175, Rarity.UNCOMMON, mage.cards.g.GolgariFindbroker.class)); cards.add(new SetCardInfo("Golgari Guildgate", 248, Rarity.COMMON, mage.cards.g.GolgariGuildgate.class)); cards.add(new SetCardInfo("Golgari Guildgate", 249, Rarity.COMMON, mage.cards.g.GolgariGuildgate.class)); From d26a47dfaceee514a3db38d995289b0a2570d608 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 13:30:36 -0400 Subject: [PATCH 048/140] updated GRN spoiler and reprints --- Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 6 +++ Utils/mtg-cards-data.txt | 40 +++++++++++++++++++- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index e0189769e24..8662133c1db 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -46,6 +46,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Chance for Glory", 159, Rarity.MYTHIC, mage.cards.c.ChanceForGlory.class)); cards.add(new SetCardInfo("Charnel Troll", 160, Rarity.RARE, mage.cards.c.CharnelTroll.class)); cards.add(new SetCardInfo("Chemister's Insight", 32, Rarity.UNCOMMON, mage.cards.c.ChemistersInsight.class)); + cards.add(new SetCardInfo("Child of Night", 65, Rarity.COMMON, mage.cards.c.ChildOfNight.class)); cards.add(new SetCardInfo("Chromatic Lantern", 233, Rarity.RARE, mage.cards.c.ChromaticLantern.class)); cards.add(new SetCardInfo("Circuitous Route", 125, Rarity.UNCOMMON, mage.cards.c.CircuitousRoute.class)); cards.add(new SetCardInfo("Citywatch Sphinx", 33, Rarity.UNCOMMON, mage.cards.c.CitywatchSphinx.class)); @@ -57,8 +58,10 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Connive // Concoct", 222, Rarity.RARE, mage.cards.c.ConniveConcoct.class)); cards.add(new SetCardInfo("Crackling Drake", 163, Rarity.UNCOMMON, mage.cards.c.CracklingDrake.class)); cards.add(new SetCardInfo("Creeping Chill", 66, Rarity.UNCOMMON, mage.cards.c.CreepingChill.class)); + cards.add(new SetCardInfo("Crushing Canopy", 126, Rarity.COMMON, mage.cards.c.CrushingCanopy.class)); cards.add(new SetCardInfo("Darkblade Agent", 164, Rarity.COMMON, mage.cards.d.DarkbladeAgent.class)); cards.add(new SetCardInfo("Dawn of Hope", 8, Rarity.RARE, mage.cards.d.DawnOfHope.class)); + cards.add(new SetCardInfo("Dead Weight", 67, Rarity.COMMON, mage.cards.d.DeadWeight.class)); cards.add(new SetCardInfo("Deadly Visit", 68, Rarity.COMMON, mage.cards.d.DeadlyVisit.class)); cards.add(new SetCardInfo("Deafening Clarion", 165, Rarity.RARE, mage.cards.d.DeafeningClarion.class)); cards.add(new SetCardInfo("Dimir Guildgate", 245, Rarity.COMMON, mage.cards.d.DimirGuildgate.class)); @@ -139,6 +142,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Light of the Legion", 19, Rarity.RARE, mage.cards.l.LightOfTheLegion.class)); cards.add(new SetCardInfo("Lotleth Giant", 74, Rarity.UNCOMMON, mage.cards.l.LotlethGiant.class)); cards.add(new SetCardInfo("Loxodon Restorer", 20, Rarity.COMMON, mage.cards.l.LoxodonRestorer.class)); + cards.add(new SetCardInfo("Luminous Bonds", 21, Rarity.COMMON, mage.cards.l.LuminousBonds.class)); cards.add(new SetCardInfo("March of the Multitudes", 188, Rarity.MYTHIC, mage.cards.m.MarchOfTheMultitudes.class)); cards.add(new SetCardInfo("Mausoleum Secrets", 75, Rarity.RARE, mage.cards.m.MausoleumSecrets.class)); cards.add(new SetCardInfo("Maximize Altitude", 43, Rarity.COMMON, mage.cards.m.MaximizeAltitude.class)); @@ -174,6 +178,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Ral, Izzet Viceroy", 195, Rarity.MYTHIC, mage.cards.r.RalIzzetViceroy.class)); cards.add(new SetCardInfo("Response // Resurgence", 229, Rarity.RARE, mage.cards.r.ResponseResurgence.class)); cards.add(new SetCardInfo("Rhizome Lurcher", 196, Rarity.COMMON, mage.cards.r.RhizomeLurcher.class)); + cards.add(new SetCardInfo("Righteous Blow", 23, Rarity.COMMON, mage.cards.r.RighteousBlow.class)); cards.add(new SetCardInfo("Risk Factor", 113, Rarity.RARE, mage.cards.r.RiskFactor.class)); cards.add(new SetCardInfo("Ritual of Soot", 84, Rarity.RARE, mage.cards.r.RitualOfSoot.class)); cards.add(new SetCardInfo("Roc Charger", 24, Rarity.UNCOMMON, mage.cards.r.RocCharger.class)); @@ -210,6 +215,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Vraska's Stoneglare", 272, Rarity.RARE, mage.cards.v.VraskasStoneglare.class)); cards.add(new SetCardInfo("Vraska, Golgari Queen", 213, Rarity.MYTHIC, mage.cards.v.VraskaGolgariQueen.class)); cards.add(new SetCardInfo("Vraska, Regal Gorgon", 269, Rarity.MYTHIC, mage.cards.v.VraskaRegalGorgon.class)); + cards.add(new SetCardInfo("Wall of Mist", 58, Rarity.COMMON, mage.cards.w.WallOfMist.class)); cards.add(new SetCardInfo("Wand of Vertebrae", 242, Rarity.UNCOMMON, mage.cards.w.WandOfVertebrae.class)); cards.add(new SetCardInfo("Wary Okapi", 149, Rarity.COMMON, mage.cards.w.WaryOkapi.class)); cards.add(new SetCardInfo("Watcher in the Mist", 59, Rarity.COMMON, mage.cards.w.WatcherInTheMist.class)); diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 12f2c2c01f5..8705723c1de 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -34300,9 +34300,13 @@ Tobias Beckett|Star Wars|614|R|{3}{B}|Legendary Creature - Human Hunter|4|3|When Underground Forum|Star Wars|615|U||Land|||T: Add {1}.${1}, {T}: Add {B}, {R}, or {G}.${2}, {T}: Put a bounty counter on target creature.| Blade Instructor|Guilds of Ravnica|1|C|{2}{W}|Creature - Human Soldier|3|1|Mentor| Bounty Agent|Guilds of Ravnica|2|R|{1}{W}|Creature - Human Soldier|2|2|Vigilance${T}, Sacrifice Bounty Agent: Destroy target legendary permanent that's an artifact, creature, or enchantment.| +Candlelight Vigil|Guilds of Ravnica|3|C|{3}{W}|Enchantment - Aura|||Enchant creature$Enchanted creature gets +3/+2 and has vigilance.| Citywide Bust|Guilds of Ravnica|4|R|{1}{W}{W}|Sorcery|||Destroy all creatures with toughness 4 or greater.| +Collar the Culprit|Guilds of Ravnica|5|C|{3}{W}|Instant|||Destroy target creature with toughness 4 or greater.| Conclave Tribunal|Guilds of Ravnica|6|U|{3}{W}|Enchantment|||Convoke$When Conclave Tribunal enters the battlefield, exile target nonland permanent an opponent controls until Conclave Tribunal leaves the battlefield.| +Crush Contraband|Guilds of Ravnica|7|U|{3}{W}|Instant|||Choose one or both —$• Exile target artifact.$• Exile target enchantment.| Dawn of Hope|Guilds of Ravnica|8|R|{1}{W}|Enchantment|||Whenever you gain life, you may pay {2}. If you do, draw a card.${3}{W}: Create a 1/1 white Soldier creature token with lifelink.| +Demotion|Guilds of Ravnica|9|C|{W}|Enchantment - Aura|||Enchant creature$Enchanted creature can't block and its activated abilities can't be activated.| Divine Visitation|Guilds of Ravnica|10|M|{3}{W}{W}|Enchantment|||If one or more creature tokens would be created under your control, that many 4/4 white Angel creature tokens with flying and vigilance are created instead.| Flight of Equenauts|Guilds of Ravnica|11|U|{7}{W}|Creature - Human Knight|4|5|Convoke$Flying| Gird for Battle|Guilds of Ravnica|12|U|{W}|Sorcery|||Put a +1/+1 counter on each of up to two target creatures.| @@ -34310,15 +34314,24 @@ Haazda Marshal|Guilds of Ravnica|13|U|{W}|Creature - Human Soldier|1|1|Whenever Healer's Hawk|Guilds of Ravnica|14|C|{W}|Creature - Bird|1|1|Flying, lifelink| Hunted Witness|Guilds of Ravnica|15|C|{W}|Creature - Human|1|1|When Hunted Witness dies, create a 1/1 white Soldier creature token with lifelink.| Inspiring Unicorn|Guilds of Ravnica|16|C|{2}{W}{W}|Creature - Unicorn|2|2|Whenever Inspiring Unicorn attacks, creatures you control get +1/+1 until end of turn.| +Intrusive Packbeast|Guilds of Ravnica|17|C|{4}{W}|Creature - Beast|3|3|Vigilance$When Intrusive Packbeast enters the battlefield, tap up to two target creatures your opponents control.| Ledev Guardian|Guilds of Ravnica|18|C|{3}{W}|Creature - Human Knight|2|4|Convoke| Light of the Legion|Guilds of Ravnica|19|R|{4}{W}{W}|Creature - Angel|5|5|Flying$Mentor$When Light of the Legion dies, put a +1/+1 counter on each white creature you control.| Loxodon Restorer|Guilds of Ravnica|20|C|{4}{W}{W}|Creature - Elephant Cleric|3|4|Convoke$When Loxodon Restorer enters the battlefield, you gain 4 life.| +Luminous Bonds|Guilds of Ravnica|21|C|{2}{W}|Enchantment - Aura|||Enchant creature$Enchanted creature can't attack or block.| Parhelion Patrol|Guilds of Ravnica|22|C|{3}{W}|Creature - Human Knight|2|3|Flying, vigilance$Mentor| +Righteous Blow|Guilds of Ravnica|23|C|{W}|Instant|||Righteous Blow deals 2 damage to target attacking or blocking creature.| Roc Charger|Guilds of Ravnica|24|U|{2}{W}|Creature - Bird|1|3|Flying$Whenever Roc Charger attacks, target attacking creature without flying gains flying until end of turn.| +Skyline Scout|Guilds of Ravnica|25|C|{1}{W}|Creature - Human Scout|2|1|Whenever Skyline Scout attacks, you may pay {1}{W}. If you do, it gains flying until end of turn.| Sunhome Stalwart|Guilds of Ravnica|26|U|{1}{W}|Creature - Human Soldier|2|2|First strike$Mentor| +Sworn Companions|Guilds of Ravnica|27|C|{2}{W}|Sorcery|||Creature two 1/1 white Soldier creature tokens with lifelink.| +Take Heart|Guilds of Ravnica|28|C|{W}|Instant|||Target creature gets +2/+2 until end of turn. You gain 1 life for each attacking creature you control.| +Tenth District Guard|Guilds of Ravnica|29|C|{1}{W}|Creature - Human Soldier|2|2|When Tenth District Guard enters the battlefield, target creature gets +0/+1 until end of turn.| Venerated Loxodon|Guilds of Ravnica|30|R|{4}{W}|Creature - Elephant Cleric|4|4|Convoke$When Venerated Loxodon enters the battlefield, put a +1/+1 counter on each creature that convoked it.| +Capture Sphere|Guilds of Ravnica|31|C|{3}{U}|Enchantment - Aura|||Flash$Enchant creature$When Capture Sphere enters the battlefield, tap enchanted creature.$Enchanted creature doesn't untap during its controller's untap step.| Chemister's Insight|Guilds of Ravnica|32|U|{3}{U}|Instant|||Draw two cards.$Jump-start| Citywatch Sphinx|Guilds of Ravnica|33|U|{5}{U}|Creature - Sphinx|5|4|Flying$When Citywatch Sphinx dies, surveil 2.| +Dazzling Lights|Guilds of Ravnica|34|C|{U}|Instant|||Target creature gets -3/-0 until end of turn.$Surveil 2.| Devious Cover-up|Guilds of Ravnica|35|C|{2}{U}{U}|Instant|||Counter target spell. If that spell is countered this way, exile it instead of putting it into its owner's graveyard.$You may shuffle up to four target cards from your graveyard into your library.| Dimir Informant|Guilds of Ravnica|36|C|{2}{U}|Creature - Human Rogue|1|4|When Dimir Informant enters the battlefield, surveil 2.| Disdainful Stroke|Guilds of Ravnica|37|C|{1}{U}|Instant|||Counter target spell with converted mana cost 4 or greater.| @@ -34326,38 +34339,60 @@ Dream Eater|Guilds of Ravnica|38|M|{4}{U}{U}|Creature - Nightmare Sphinx|4|3|Fla Drowned Secrets|Guilds of Ravnica|39|R|{1}{U}|Enchantment|||Whenever you cast a blue spell, target player puts the top two cards if their library into their graveyard.| Enhanced Surveillance|Guilds of Ravnica|40|U|{1}{U}|Enchantment|||You may look at an additional two cards each time you surveil.$Exile Enhanced Surveillance: Shuffle your graveyard into your library.| Guild Summit|Guilds of Ravnica|41|U|{2}{U}|Enchantment|||When Guild Summit enters the battlefield, you may tap any number of untapped Gates you control. Draw a card for each Gate tapped this way.$Whenever a Gate enters the battlefield under your control, draw a card.| +Leapfrog|Guilds of Ravnica|42|C|{2}{U}|Creature - Frog|3|1|Leapfrog has flying as long as you've cast and instant or sorcery spell this turn.| Maximize Altitude|Guilds of Ravnica|43|C|{U}|Sorcery|||Target creature gets +1/+1 and gains flying until end of turn.$Jump-start| Mission Briefing|Guilds of Ravnica|44|R|{U}{U}|Instant|||Surveil 2, then choose an instant or sorcery card in your graveyard. You may cast that card this turn. If that card would be put into your graveyard this turn, exile it instead.| Murmuring Mystic|Guilds of Ravnica|45|U|{3}{U}|Creature - Human Wizard|1|5|Whenever you cast an instant or sorcery spell, create a 1/1 blue Bird Illusion creature token with flying.| +Muse Drake|Guilds of Ravnica|46|C|{3}{U}|Creature - Drake|1|3|Flying$When Muse Drake enters the battlefield, draw a card.| Narcomoeba|Guilds of Ravnica|47|R|{1}{U}|Creature - Illusion|1|1|Flying$When Narcomoeba is put into your graveyard from your library, you may put it onto the battlefield.| Nightveil Sprite|Guilds of Ravnica|48|U|{1}{U}|Creature - Faerie Rogue|1|2|Flying$Whenever Nightveil Sprite attacks, surveil 1.| Omnispell Adept|Guilds of Ravnica|49|R|{4}{U}|Creature - Human Wizard|3|4|{2}{U}, {T}: You may cast an instant or sorcery card from your hand without paying its mana cost.| Passwall Adept|Guilds of Ravnica|50|C|{1}{U}|Creature - Human Wizard|1|3|{2}{U}: Target creature can't be blocked this turn.| Quasiduplicate|Guilds of Ravnica|51|R|{1}{U}{U}|Sorcery|||Create a token that's a copy of target creature you control.$Jump-start| Radical Idea|Guilds of Ravnica|52|C|{1}{U}|Instant|||Draw a card.$Jump-start| +Selective Snare|Guilds of Ravnica|53|C|{X}{U}|Sorcery|||Return X target creatures of the creature type of your choice to their owner's hand.| Sinister Sabotage|Guilds of Ravnica|54|U|{1}{U}{U}|Instant|||Counter target spell.$Surveil 1.| Thoughtbound Phantasm|Guilds of Ravnica|55|U|{U}|Creature - Spirit|2|2|Defender$Whenever you surveil, put a +1/+1 counter on Thoughtbound Phantasm.$As long as Thoughtbound Phantasm has three or more +1/+1 counters on it, it can attack as though it didn't have defender.| Unexplained Disappearance|Guilds of Ravnica|56|C|{1}{U}|Instant|||Return target creature to its owner's hand.$Surveil 1.| +Vedalken Mesmerist|Guilds of Ravnica|57|C|{1}{U}|Creature - Vedalken Wizard|2|1|Whenever Vedalken Mesmerist attacks, target creature an opponent controls gets -2/-0 until end of turn.| +Wall of Mist|Guilds of Ravnica|58|C|{1}{U}|Creature - Wall|0|5|Defender| Watcher in the Mist|Guilds of Ravnica|59|C|{3}{U}{U}|Creature - Spirit|3|4|Flying$When Watcher in the Mist enters the battlefield, surveil 2.| +Wishcoin Crab|Guilds of Ravnica|60|C|{3}{U}|Creature - Crab|2|5|| +Barrier of Bones|Guilds of Ravnica|61|C|{B}|Creature - Skeleton Wall|0|3|Defender$When Barrier of Bones enters the battlefield, surveil 1.| +Bartizan Bats|Guilds of Ravnica|62|C|{3}{B}|Creature - Bat|3|1|Flying| Blood Operative|Guilds of Ravnica|63|R|{1}{B}{B}|Creature - Vampire Assassin|3|1|Lifelink$When Blood Operative enters the battlefield, you may exile target card from a graveyard.$Whenever you surveil, if Blood Operative is in your graveyard, you may pay 3 life. If you do, return Blood Operative to your hand.| +Burglar Rat|Guilds of Ravnica|64|C|{1}{B}|Creature - Rat|1|1|When Burglar Rat enters the battlefield, each opponent discards a card.| +Child of Night|Guilds of Ravnica|65|C|{1}{B}|Creature - Vampire|2|1|Lifelink| Creeping Chill|Guilds of Ravnica|66|U|{3}{B}|Sorcery|||Creeping Chill deals 3 damage to each opponent and you gain 3 life.$When Creeping Chill is put into your graveyard from your library, you may exile it. If you do, Creeping Chill deals 3 damage to each opponent and you gain 3 life.| +Dead Weight|Guilds of Ravnica|67|C|{B}|Enchantment - Aura|||Enchant creature$Enchanted creature gets -2/-2.| Deadly Visit|Guilds of Ravnica|68|C|{3}{B}{B}|Sorcery|||Destroy target creature.$Surveil 2.| Doom Whisperer|Guilds of Ravnica|69|M|{3}{B}{B}|Creature - Nightmare Demon|6|6|Flying, trample$Pay 2 life: Surveil 2.| +Douser of Lights|Guilds of Ravnica|70|C|{4}{B}|Creature - Horror|4|5|| Gruesome Menagerie|Guilds of Ravnica|71|R|{3}{B}{B}|Sorcery|||Choose a creature card with converted mana cost 1 in your graveyard, then do the same for creature cards with converted mana costs 2 and 3. Return those cards to the battlefield.| +Hired Poisoner|Guilds of Ravnica|72|C|{B}|Creature - Human Assassin|1|1|Deathtouch| +Kraul Swarm|Guilds of Ravnica|73|C|{4}{B}|Creature - Insect Warrior|4|1|Flying${2}{B}, Discard a creature card: Return Kraul Swarm from your graveyard to your hand.| Lotleth Giant|Guilds of Ravnica|74|U|{6}{B}|Creature - Zombie Giant|6|5|Undergrowth — When Lotleth Giant enters the battlefield, it deals 1 damage to target opponent for each creature card in your graveyard.| Mausoleum Secrets|Guilds of Ravnica|75|R|{1}{B}|Instant|||Undergrowth — Search your library for a black card with converted mana cost less than or equal to the number of creature cards in your graveyard, reveal it, put it into your hand, then shuffle your library.| +Mephitic Vapors|Guilds of Ravnica|76|C|{2}{B}|Sorcery|||All creatures get -1/-1 until end of turn.$Surveil 2.| Midnight Reaper|Guilds of Ravnica|77|R|{2}{B}|Creature - Zombie Knight|3|2|Whenever a nontoken creature you control dies, Midnight Reaper deals 1 damage to you and you draw a card.| Moodmark Painter|Guilds of Ravnica|78|C|{2}{B}{B}|Creature - Human Shaman|2|3|Undergrowth — When Moodmark Painter enters the battlefield, target creature gains menace and gets +X/+0 until end of turn, where X is the number of creature cards in your graveyard.| Necrotic Wound|Guilds of Ravnica|79|U|{B}|Instant|||Undergrowth — Target creature gets -X/-X until end of turn, where X is the number of creature cards in your graveyard. If that creature would die this turn, exile it instead.| Never Happened|Guilds of Ravnica|80|C|{2}{B}|Sorcery|||Target opponent reveals their hand. You choose a nonland card from that player's graveyard or hand and exile it.| -Plaguecaster|Guilds of Ravnica|82|U|{2}{B}|Creature - Human Shaman|3|2|When Plaguecaster enters the battlefield, each player sacrifices a creature or planeswalker. Each player who can't discards a card.| +Pilfering Imp|Guilds of Ravnica|81|C|{B}|Creature - Imp|||Flying${1}{B}, {T}, Sacrifice Pilfering Imp: Target opponent reveals their hand| +Plaguecrafter|Guilds of Ravnica|82|U|{2}{B}|Creature - Human Shaman|3|2|When Plaguecrafter enters the battlefield, each player sacrifices a creature or planeswalker. Each player who can't discards a card.| Price of Fame|Guilds of Ravnica|83|U|{3}{B}|Instant|||This spell costs {2} less to cast if it targets a legendary creature.$Destroy target creature.$Surveil 2.| Ritual of Soot|Guilds of Ravnica|84|R|{2}{B}{B}|Sorcery|||Destroy all creatures with converted mana cost 3 or less.| +Severed Strands|Guilds of Ravnica|85|C|{1}{B}|Sorcery|||As an additional cost to cast this spell, sacrifice a creature.$You gain life equal to that sacrificed creature's toughness. Destroy target creature an opponent controls.| +Spinal Centipede|Guilds of Ravnica|86|C|{2}{B}|Creature - Insect|3|2|When Spinal Centipede dies, put a +1/+1 counter on target creature you control.| +Undercity Necroklisk|Guilds of Ravnica|87|U|{3}{B}|Creature - Zombie Lizard|3|3|{1}, Sacrifice another creature: Put a +1/+1 counter on Undercity Necroklisk. It gains menace until end of turn. Activate this ability only any time you could cast a sorcery.| +Veiled Shade|Guilds of Ravnica|88|C|{2}{B}|Creature - Shade|2|2|{1}{B}: Veiled Shade gets +1/+1 until end of turn.| +Vicious Rumors|Guilds of Ravnica|89|C|{B}|Sorcery|||Vicious Rumors deals 1 damage to each opponent. Each opponent discards a card, the puts the top card of their library into their graveyard. You gain 1 life.| Whispering Snitch|Guilds of Ravnica|90|U|{1}{B}|Creature - Vampire Rogue|1|3|Whenever you surveil for the first time each turn, Whispering Snitch deals 1 damage to each opponent and you gain 1 life.| Arclight Phoenix|Guilds of Ravnica|91|M|{3}{R}|Creature - Phoenix|3|2|Flying, haste$At the beginning of combat on your turn, if you've cast three or more instant and sorcery spells this turn, you may return Arclight Phoenix from your graveyard to the battlefield.| Barging Sergeant|Guilds of Ravnica|92|C|{4}{R}|Creature - Minotaur Soldier|4|2|Haste$Mentor| Book Devourer|Guilds of Ravnica|93|U|{5}{R}|Creature - Beast|4|5|Trample$Whenever Book Devourer deals combat damage to a player, you may discard all the cards in your hand. If you do, draw that many cards.| Command the Storm|Guilds of Ravnica|94|C|{4}{R}|Instant|||Command the Storm deals 5 damage to target creature.| +Cosmotronic Wave|Guilds of Ravnica|95|C|{3}{B}|Sorcery|||Cosmotronic Wave deals 1 damage to each creature your opponents control. Creatures your opponents control can't block this turn.| Direct Current|Guilds of Ravnica|96|C|{1}{R}{R}|Sorcery|||Direct Current deals 2 damage to any target.$Jump-start| Electrostatic Field|Guilds of Ravnica|97|C|{1}{R}|Creature - Wall|0|4|Defender$When you cast an instant or sorcery spell, Electrostatic Field deals 1 damage to each opponent.| Erratic Cyclops|Guilds of Ravnica|98|R|{3}{R}|Creature - Cyclops Shaman|0|8|Trample$Whenever you cast an instant or sorcery spell, Erratic Cyclops gets +X/+0 until end of turn, where X is that spell's converted mana cost.| @@ -34377,6 +34412,7 @@ Arboretum Elemental|Guilds of Ravnica|122|U|{7}{G}{G}|Creature - Elemental|7|5|C Beast Whisperer|Guilds of Ravnica|123|R|{2}{G}{G}|Creature - Elf Druid|2|3|Whenever you cast a creature spell, draw a card.| Bounty of Might|Guilds of Ravnica|124|R|{4}{G}{G}|Instant|||Target creature gets +3/+3 until end of turn.$Target creature gets +3/+3 until end of turn.$Target creature gets +3/+3 until end of turn.| Circuitous Route|Guilds of Ravnica|125|U|{3}{G}|Sorcery|||Search your library for up to two basic land cards and/or Gate cards and put them onto the battlefield tapped, then shuffle your library.| +Crushing Canopy|Guilds of Ravnica|126|C|{2}{G}|Instant|||Choose one —$• Destroy target creature with flying.$• Destroy target enchantment.| District Guide|Guilds of Ravnica|128|U|{2}{G}|Creature - Elf Scout|2|2|When District Guide enters the battlefield, you may search your library for a basic land card or Gate card, reveal it, put it into your hand, then shuffle your library.| Generous Stray|Guilds of Ravnica|129|C|{2}{G}|Creature - Cat|1|2|When Generous Stray enters the battlefield, draw a card.| Golgari Raiders|Guilds of Ravnica|130|U|{3}{G}|Creature - Elf Warrior|0|0|Haste$Undergrowth — Golgari Raiders enters the battlefield with a +1/+1 counter on it for each creature card in your graveyard.| @@ -34482,7 +34518,7 @@ Boros Locket|Guilds of Ravnica|231|C|{3}|Artifact|||{T}: Add {R} or {W}.${R/W}{R Chamber Sentry|Guilds of Ravnica|232|R|{X}|Artifact Creature - Construct|0|0|Chamber Sentry enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it.${X}, {T}, Remove X +1/+1 counters from Chamber Sentry: It deals X damage to any target.${W}{U}{B}{R}{G}: Return Chamber Sentry from your graveyard to your hand.| Chromatic Lantern|Guilds of Ravnica|233|R|{3}|Artifact|||Lands you control have "{T}: Add one mana of any color."${T}: Add one mana of any color.| Dimir Locket|Guilds of Ravnica|234|C|{3}|Artifact|||{T}: Add {U} or {B}.${U/B}{U/B}{U/B}{U/B}, {T}, Sacrifice Dimir Locket: Draw two cards.| -Gatekeeper Gargolye|Guilds of Ravnica|235|U|{6}|Artifact Creature - Gargoyle|3|3|Flying$Gargoyle Guardian enters the battlefield with a +1/+1 counter on it for each Gate you control.| +Gatekeeper Gargoyle|Guilds of Ravnica|235|U|{6}|Artifact Creature - Gargoyle|3|3|Flying$Gargoyle Guardian enters the battlefield with a +1/+1 counter on it for each Gate you control.| Glaive of the Guildpact|Guilds of Ravnica|236|U|{2}|Artifact - Equipment|||Equipped creature gets +1/+0 for each Gate you control and has vigilance and menace.$Equip {3}| Golgari Locket|Guilds of Ravnica|237|C|{3}|Artifact|||{T}: Add {B} or {G}.${B/G}{B/G}{B/G}{B/G}, {T}, Sacrifice Golgari Locket: Draw two cards.| Izzet Locket|Guilds of Ravnica|238|C|{3}|Artifact|||{T}: Add {U} or {R}.${U/R}{U/R}{U/R}{U/R}, {T}, Sacrifice Izzet Locket: Draw two cards.| From c40f0cc85f82cad0db5205681ffe100a70123c88 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 13:38:16 -0400 Subject: [PATCH 049/140] Implemented Barrier of Bones --- .../src/mage/cards/b/BarrierOfBones.java | 44 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 45 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/b/BarrierOfBones.java diff --git a/Mage.Sets/src/mage/cards/b/BarrierOfBones.java b/Mage.Sets/src/mage/cards/b/BarrierOfBones.java new file mode 100644 index 00000000000..bde2f7fbf33 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BarrierOfBones.java @@ -0,0 +1,44 @@ +package mage.cards.b; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.keyword.SurveilEffect; +import mage.constants.SubType; +import mage.abilities.keyword.DefenderAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author TheElk801 + */ +public final class BarrierOfBones extends CardImpl { + + public BarrierOfBones(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}"); + + this.subtype.add(SubType.SKELETON); + this.subtype.add(SubType.WALL); + this.power = new MageInt(0); + this.toughness = new MageInt(3); + + // Defender + this.addAbility(DefenderAbility.getInstance()); + + // When Barrier of Bones enters the battlefield, surveil 1. + this.addAbility(new EntersBattlefieldTriggeredAbility( + new SurveilEffect(1), false + )); + } + + public BarrierOfBones(final BarrierOfBones card) { + super(card); + } + + @Override + public BarrierOfBones copy() { + return new BarrierOfBones(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 8662133c1db..a2a16fd6332 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -31,6 +31,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Attendant of Vraska", 271, Rarity.UNCOMMON, mage.cards.a.AttendantOfVraska.class)); cards.add(new SetCardInfo("Aurelia, Exemplar of Justice", 153, Rarity.MYTHIC, mage.cards.a.AureliaExemplarOfJustice.class)); cards.add(new SetCardInfo("Barging Sergeant", 92, Rarity.COMMON, mage.cards.b.BargingSergeant.class)); + cards.add(new SetCardInfo("Barrier of Bones", 61, Rarity.COMMON, mage.cards.b.BarrierOfBones.class)); cards.add(new SetCardInfo("Beacon Bolt", 154, Rarity.UNCOMMON, mage.cards.b.BeaconBolt.class)); cards.add(new SetCardInfo("Beast Whisperer", 123, Rarity.RARE, mage.cards.b.BeastWhisperer.class)); cards.add(new SetCardInfo("Blade Instructor", 1, Rarity.COMMON, mage.cards.b.BladeInstructor.class)); From 23a376ef42542e9dbf5b1fa45d8bd1e8f5248115 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 13:39:08 -0400 Subject: [PATCH 050/140] Implemented Bartizan Bats --- Mage.Sets/src/mage/cards/b/BartizanBats.java | 36 ++++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 37 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/b/BartizanBats.java diff --git a/Mage.Sets/src/mage/cards/b/BartizanBats.java b/Mage.Sets/src/mage/cards/b/BartizanBats.java new file mode 100644 index 00000000000..7f9efcaf93f --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BartizanBats.java @@ -0,0 +1,36 @@ +package mage.cards.b; + +import java.util.UUID; +import mage.MageInt; +import mage.constants.SubType; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author TheElk801 + */ +public final class BartizanBats extends CardImpl { + + public BartizanBats(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}"); + + this.subtype.add(SubType.BAT); + this.power = new MageInt(3); + this.toughness = new MageInt(1); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + } + + public BartizanBats(final BartizanBats card) { + super(card); + } + + @Override + public BartizanBats copy() { + return new BartizanBats(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index a2a16fd6332..0e1baa68be3 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -32,6 +32,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Aurelia, Exemplar of Justice", 153, Rarity.MYTHIC, mage.cards.a.AureliaExemplarOfJustice.class)); cards.add(new SetCardInfo("Barging Sergeant", 92, Rarity.COMMON, mage.cards.b.BargingSergeant.class)); cards.add(new SetCardInfo("Barrier of Bones", 61, Rarity.COMMON, mage.cards.b.BarrierOfBones.class)); + cards.add(new SetCardInfo("Bartizan Bats", 62, Rarity.COMMON, mage.cards.b.BartizanBats.class)); cards.add(new SetCardInfo("Beacon Bolt", 154, Rarity.UNCOMMON, mage.cards.b.BeaconBolt.class)); cards.add(new SetCardInfo("Beast Whisperer", 123, Rarity.RARE, mage.cards.b.BeastWhisperer.class)); cards.add(new SetCardInfo("Blade Instructor", 1, Rarity.COMMON, mage.cards.b.BladeInstructor.class)); From 2925c1e70c6edf071f14a391edf9e5363552b0cf Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 13:40:28 -0400 Subject: [PATCH 051/140] Implemented Burglar Rat --- Mage.Sets/src/mage/cards/b/BurglarRat.java | 44 ++++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 45 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/b/BurglarRat.java diff --git a/Mage.Sets/src/mage/cards/b/BurglarRat.java b/Mage.Sets/src/mage/cards/b/BurglarRat.java new file mode 100644 index 00000000000..f6efa16d72a --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BurglarRat.java @@ -0,0 +1,44 @@ +package mage.cards.b; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.common.discard.DiscardEachPlayerEffect; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.TargetController; + +/** + * + * @author TheElk801 + */ +public final class BurglarRat extends CardImpl { + + public BurglarRat(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); + + this.subtype.add(SubType.RAT); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // When Burglar Rat enters the battlefield, each opponent discards a card. + this.addAbility(new EntersBattlefieldTriggeredAbility( + new DiscardEachPlayerEffect( + new StaticValue(1), false, + TargetController.OPPONENT + ) + )); + } + + public BurglarRat(final BurglarRat card) { + super(card); + } + + @Override + public BurglarRat copy() { + return new BurglarRat(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 0e1baa68be3..fc7d57a0230 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -43,6 +43,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Boros Guildgate", 244, Rarity.COMMON, mage.cards.b.BorosGuildgate.class)); cards.add(new SetCardInfo("Boros Locket", 231, Rarity.COMMON, mage.cards.b.BorosLocket.class)); cards.add(new SetCardInfo("Bounty Agent", 2, Rarity.RARE, mage.cards.b.BountyAgent.class)); + cards.add(new SetCardInfo("Burglar Rat", 64, Rarity.COMMON, mage.cards.b.BurglarRat.class)); cards.add(new SetCardInfo("Camaraderie", 157, Rarity.RARE, mage.cards.c.Camaraderie.class)); cards.add(new SetCardInfo("Centaur Peacemaker", 158, Rarity.COMMON, mage.cards.c.CentaurPeacemaker.class)); cards.add(new SetCardInfo("Chance for Glory", 159, Rarity.MYTHIC, mage.cards.c.ChanceForGlory.class)); From ab58d6c9ce26439efc23a54e6fcb51b4ffcd2268 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 13:43:52 -0400 Subject: [PATCH 052/140] Implemented Douser of Lights --- .../src/mage/cards/d/DouserOfLights.java | 32 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 33 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/d/DouserOfLights.java diff --git a/Mage.Sets/src/mage/cards/d/DouserOfLights.java b/Mage.Sets/src/mage/cards/d/DouserOfLights.java new file mode 100644 index 00000000000..cc4b449eb53 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DouserOfLights.java @@ -0,0 +1,32 @@ +package mage.cards.d; + +import java.util.UUID; +import mage.MageInt; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author TheElk801 + */ +public final class DouserOfLights extends CardImpl { + + public DouserOfLights(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B}"); + + this.subtype.add(SubType.HORROR); + this.power = new MageInt(4); + this.toughness = new MageInt(5); + } + + public DouserOfLights(final DouserOfLights card) { + super(card); + } + + @Override + public DouserOfLights copy() { + return new DouserOfLights(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index fc7d57a0230..51a0fd5e8b2 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -79,6 +79,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("District Guide", 128, Rarity.UNCOMMON, mage.cards.d.DistrictGuide.class)); cards.add(new SetCardInfo("Divine Visitation", 10, Rarity.MYTHIC, mage.cards.d.DivineVisitation.class)); cards.add(new SetCardInfo("Doom Whisperer", 69, Rarity.MYTHIC, mage.cards.d.DoomWhisperer.class)); + cards.add(new SetCardInfo("Douser of Lights", 70, Rarity.COMMON, mage.cards.d.DouserOfLights.class)); cards.add(new SetCardInfo("Dream Eater", 38, Rarity.MYTHIC, mage.cards.d.DreamEater.class)); cards.add(new SetCardInfo("Drowned Secrets", 39, Rarity.RARE, mage.cards.d.DrownedSecrets.class)); cards.add(new SetCardInfo("Electrostatic Field", 97, Rarity.COMMON, mage.cards.e.ElectrostaticField.class)); From a63d8106e76bcbfc94b0a75a20249372461f15a7 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 13:44:28 -0400 Subject: [PATCH 053/140] Implemented Hired Poisoner --- Mage.Sets/src/mage/cards/h/HiredPoisoner.java | 37 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 38 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/h/HiredPoisoner.java diff --git a/Mage.Sets/src/mage/cards/h/HiredPoisoner.java b/Mage.Sets/src/mage/cards/h/HiredPoisoner.java new file mode 100644 index 00000000000..13a1d2a9f2c --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HiredPoisoner.java @@ -0,0 +1,37 @@ +package mage.cards.h; + +import java.util.UUID; +import mage.MageInt; +import mage.constants.SubType; +import mage.abilities.keyword.DeathtouchAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author TheElk801 + */ +public final class HiredPoisoner extends CardImpl { + + public HiredPoisoner(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.ASSASSIN); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Deathtouch + this.addAbility(DeathtouchAbility.getInstance()); + } + + public HiredPoisoner(final HiredPoisoner card) { + super(card); + } + + @Override + public HiredPoisoner copy() { + return new HiredPoisoner(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 51a0fd5e8b2..ba1d3b31005 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -117,6 +117,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Hammer Dropper", 176, Rarity.COMMON, mage.cards.h.HammerDropper.class)); cards.add(new SetCardInfo("Hatchery Spider", 132, Rarity.RARE, mage.cards.h.HatcherySpider.class)); cards.add(new SetCardInfo("Healer's Hawk", 14, Rarity.COMMON, mage.cards.h.HealersHawk.class)); + cards.add(new SetCardInfo("Hired Poisoner", 72, Rarity.COMMON, mage.cards.h.HiredPoisoner.class)); cards.add(new SetCardInfo("House Guildmage", 177, Rarity.UNCOMMON, mage.cards.h.HouseGuildmage.class)); cards.add(new SetCardInfo("Hunted Witness", 15, Rarity.COMMON, mage.cards.h.HuntedWitness.class)); cards.add(new SetCardInfo("Hypothesizzle", 178, Rarity.COMMON, mage.cards.h.Hypothesizzle.class)); From 9c6ffecb56d3e88d7343d8cc3ee61210f3793a65 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 13:51:04 -0400 Subject: [PATCH 054/140] Implemented Muse Drake --- Mage.Sets/src/mage/cards/m/MuseDrake.java | 43 ++++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 44 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/m/MuseDrake.java diff --git a/Mage.Sets/src/mage/cards/m/MuseDrake.java b/Mage.Sets/src/mage/cards/m/MuseDrake.java new file mode 100644 index 00000000000..fda50bc5a94 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MuseDrake.java @@ -0,0 +1,43 @@ +package mage.cards.m; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.constants.SubType; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author TheElk801 + */ +public final class MuseDrake extends CardImpl { + + public MuseDrake(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}"); + + this.subtype.add(SubType.DRAKE); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // When Muse Drake enters the battlefield, draw a card. + this.addAbility(new EntersBattlefieldTriggeredAbility( + new DrawCardSourceControllerEffect(1) + )); + } + + public MuseDrake(final MuseDrake card) { + super(card); + } + + @Override + public MuseDrake copy() { + return new MuseDrake(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index ba1d3b31005..bb11720b40c 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -159,6 +159,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Moodmark Painter", 78, Rarity.COMMON, mage.cards.m.MoodmarkPainter.class)); cards.add(new SetCardInfo("Mountain", 263, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Murmuring Mystic", 45, Rarity.UNCOMMON, mage.cards.m.MurmuringMystic.class)); + cards.add(new SetCardInfo("Muse Drake", 46, Rarity.COMMON, mage.cards.m.MuseDrake.class)); cards.add(new SetCardInfo("Narcomoeba", 47, Rarity.RARE, mage.cards.n.Narcomoeba.class)); cards.add(new SetCardInfo("Necrotic Wound", 79, Rarity.UNCOMMON, mage.cards.n.NecroticWound.class)); cards.add(new SetCardInfo("Never Happened", 80, Rarity.COMMON, mage.cards.n.NeverHappened.class)); From dc8285fff7ffcf89b0866636d7f0af5611b437f3 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 13:52:39 -0400 Subject: [PATCH 055/140] Implemented Spinal Centipede --- .../src/mage/cards/s/SpinalCentipede.java | 44 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 45 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SpinalCentipede.java diff --git a/Mage.Sets/src/mage/cards/s/SpinalCentipede.java b/Mage.Sets/src/mage/cards/s/SpinalCentipede.java new file mode 100644 index 00000000000..9d5073b48bf --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SpinalCentipede.java @@ -0,0 +1,44 @@ +package mage.cards.s; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.DiesTriggeredAbility; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.counters.CounterType; +import mage.target.common.TargetControlledCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class SpinalCentipede extends CardImpl { + + public SpinalCentipede(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); + + this.subtype.add(SubType.INSECT); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // When Spinal Centipede dies, put a +1/+1 counter on target creature you control. + Ability ability = new DiesTriggeredAbility(new AddCountersTargetEffect( + CounterType.P1P1.createInstance() + ), false); + ability.addTarget(new TargetControlledCreaturePermanent()); + this.addAbility(ability); + } + + public SpinalCentipede(final SpinalCentipede card) { + super(card); + } + + @Override + public SpinalCentipede copy() { + return new SpinalCentipede(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index bb11720b40c..810bf343e2c 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -198,6 +198,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Sinister Sabotage", 54, Rarity.UNCOMMON, mage.cards.s.SinisterSabotage.class)); cards.add(new SetCardInfo("Skyknight Legionnaire", 198, Rarity.COMMON, mage.cards.s.SkyknightLegionnaire.class)); cards.add(new SetCardInfo("Sonic Assault", 199, Rarity.COMMON, mage.cards.s.SonicAssault.class)); + cards.add(new SetCardInfo("Spinal Centipede", 86, Rarity.COMMON, mage.cards.s.SpinalCentipede.class)); cards.add(new SetCardInfo("Sprouting Renewal", 145, Rarity.UNCOMMON, mage.cards.s.SproutingRenewal.class)); cards.add(new SetCardInfo("Status // Statue", 230, Rarity.UNCOMMON, mage.cards.s.StatusStatue.class)); cards.add(new SetCardInfo("Steam Vents", 257, Rarity.RARE, mage.cards.s.SteamVents.class)); From fa81c94b3125eecb08d3cc3522404edc40f62f12 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 13:53:41 -0400 Subject: [PATCH 056/140] Implemented Sworn Companions --- .../src/mage/cards/s/SwornCompanions.java | 33 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 34 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SwornCompanions.java diff --git a/Mage.Sets/src/mage/cards/s/SwornCompanions.java b/Mage.Sets/src/mage/cards/s/SwornCompanions.java new file mode 100644 index 00000000000..52a743c21c5 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SwornCompanions.java @@ -0,0 +1,33 @@ +package mage.cards.s; + +import java.util.UUID; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.game.permanent.token.SoldierLifelinkToken; + +/** + * + * @author TheElk801 + */ +public final class SwornCompanions extends CardImpl { + + public SwornCompanions(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{W}"); + + // Creature two 1/1 white Soldier creature tokens with lifelink. + this.getSpellAbility().addEffect( + new CreateTokenEffect(new SoldierLifelinkToken(), 2) + ); + } + + public SwornCompanions(final SwornCompanions card) { + super(card); + } + + @Override + public SwornCompanions copy() { + return new SwornCompanions(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 810bf343e2c..fac275dc7aa 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -208,6 +208,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Swarm Guildmage", 201, Rarity.UNCOMMON, mage.cards.s.SwarmGuildmage.class)); cards.add(new SetCardInfo("Swathcutter Giant", 202, Rarity.UNCOMMON, mage.cards.s.SwathcutterGiant.class)); cards.add(new SetCardInfo("Swiftblade Vindicator", 203, Rarity.RARE, mage.cards.s.SwiftbladeVindicator.class)); + cards.add(new SetCardInfo("Sworn Companions", 27, Rarity.COMMON, mage.cards.s.SwornCompanions.class)); cards.add(new SetCardInfo("Tajic, Legion's Edge", 204, Rarity.RARE, mage.cards.t.TajicLegionsEdge.class)); cards.add(new SetCardInfo("Temple Garden", 258, Rarity.RARE, mage.cards.t.TempleGarden.class)); cards.add(new SetCardInfo("Thought Erasure", 206, Rarity.UNCOMMON, mage.cards.t.ThoughtErasure.class)); From 44b22f187e26e45eacbeaa6b41b686174a9a2ff7 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 13:54:52 -0400 Subject: [PATCH 057/140] Implemented Veiled Shade --- Mage.Sets/src/mage/cards/v/VeiledShade.java | 44 ++++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 45 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/v/VeiledShade.java diff --git a/Mage.Sets/src/mage/cards/v/VeiledShade.java b/Mage.Sets/src/mage/cards/v/VeiledShade.java new file mode 100644 index 00000000000..9a9e8df4a70 --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/VeiledShade.java @@ -0,0 +1,44 @@ +package mage.cards.v; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; + +/** + * + * @author TheElk801 + */ +public final class VeiledShade extends CardImpl { + + public VeiledShade(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); + + this.subtype.add(SubType.SHADE); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // {1}{B}: Veiled Shade gets +1/+1 until end of turn. + this.addAbility(new SimpleActivatedAbility( + Zone.BATTLEFIELD, + new BoostSourceEffect(1, 1, Duration.EndOfTurn), + new ManaCostsImpl("{1}{B}") + )); + } + + public VeiledShade(final VeiledShade card) { + super(card); + } + + @Override + public VeiledShade copy() { + return new VeiledShade(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index fac275dc7aa..25807b9f3c2 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -218,6 +218,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Undercity Uprising", 210, Rarity.COMMON, mage.cards.u.UndercityUprising.class)); cards.add(new SetCardInfo("Underrealm Lich", 211, Rarity.MYTHIC, mage.cards.u.UnderrealmLich.class)); cards.add(new SetCardInfo("Unexplained Disappearance", 56, Rarity.COMMON, mage.cards.u.UnexplainedDisappearance.class)); + cards.add(new SetCardInfo("Veiled Shade", 88, Rarity.COMMON, mage.cards.v.VeiledShade.class)); cards.add(new SetCardInfo("Venerated Loxodon", 30, Rarity.RARE, mage.cards.v.VeneratedLoxodon.class)); cards.add(new SetCardInfo("Vivid Revival", 148, Rarity.RARE, mage.cards.v.VividRevival.class)); cards.add(new SetCardInfo("Vraska's Stoneglare", 272, Rarity.RARE, mage.cards.v.VraskasStoneglare.class)); From bab501f343349cd440601ffa205f1b6a101e2062 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 13:55:27 -0400 Subject: [PATCH 058/140] Implemented Wishcoin Crab --- Mage.Sets/src/mage/cards/w/WishcoinCrab.java | 32 ++++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 33 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/w/WishcoinCrab.java diff --git a/Mage.Sets/src/mage/cards/w/WishcoinCrab.java b/Mage.Sets/src/mage/cards/w/WishcoinCrab.java new file mode 100644 index 00000000000..37c886fe7a0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WishcoinCrab.java @@ -0,0 +1,32 @@ +package mage.cards.w; + +import java.util.UUID; +import mage.MageInt; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author TheElk801 + */ +public final class WishcoinCrab extends CardImpl { + + public WishcoinCrab(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{U}"); + + this.subtype.add(SubType.CRAB); + this.power = new MageInt(2); + this.toughness = new MageInt(5); + } + + public WishcoinCrab(final WishcoinCrab card) { + super(card); + } + + @Override + public WishcoinCrab copy() { + return new WishcoinCrab(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 25807b9f3c2..dde5689d1bc 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -232,6 +232,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Wee Dragonauts", 214, Rarity.UNCOMMON, mage.cards.w.WeeDragonauts.class)); cards.add(new SetCardInfo("Whisper Agent", 220, Rarity.COMMON, mage.cards.w.WhisperAgent.class)); cards.add(new SetCardInfo("Whispering Snitch", 90, Rarity.UNCOMMON, mage.cards.w.WhisperingSnitch.class)); + cards.add(new SetCardInfo("Wishcoin Crab", 60, Rarity.COMMON, mage.cards.w.WishcoinCrab.class)); cards.add(new SetCardInfo("Wojek Bodyguard", 120, Rarity.COMMON, mage.cards.w.WojekBodyguard.class)); cards.add(new SetCardInfo("Worldsoul Colossus", 215, Rarity.UNCOMMON, mage.cards.w.WorldsoulColossus.class)); } From 06d108ae4cd2f78a164ff5cbaecdfe96d4113b86 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 14:32:06 -0400 Subject: [PATCH 059/140] updated GRN spoiler and reprints --- Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 11 +++-- Utils/mtg-cards-data.txt | 43 ++++++++++++++++---- 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index dde5689d1bc..a24eda745f6 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -82,7 +82,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Douser of Lights", 70, Rarity.COMMON, mage.cards.d.DouserOfLights.class)); cards.add(new SetCardInfo("Dream Eater", 38, Rarity.MYTHIC, mage.cards.d.DreamEater.class)); cards.add(new SetCardInfo("Drowned Secrets", 39, Rarity.RARE, mage.cards.d.DrownedSecrets.class)); - cards.add(new SetCardInfo("Electrostatic Field", 97, Rarity.COMMON, mage.cards.e.ElectrostaticField.class)); + cards.add(new SetCardInfo("Electrostatic Field", 97, Rarity.UNCOMMON, mage.cards.e.ElectrostaticField.class)); cards.add(new SetCardInfo("Emmara, Soul of the Accord", 168, Rarity.RARE, mage.cards.e.EmmaraSoulOfTheAccord.class)); cards.add(new SetCardInfo("Enhanced Surveillance", 40, Rarity.UNCOMMON, mage.cards.e.EnhancedSurveillance.class)); cards.add(new SetCardInfo("Erratic Cyclops", 98, Rarity.RARE, mage.cards.e.ErraticCyclops.class)); @@ -118,15 +118,17 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Hatchery Spider", 132, Rarity.RARE, mage.cards.h.HatcherySpider.class)); cards.add(new SetCardInfo("Healer's Hawk", 14, Rarity.COMMON, mage.cards.h.HealersHawk.class)); cards.add(new SetCardInfo("Hired Poisoner", 72, Rarity.COMMON, mage.cards.h.HiredPoisoner.class)); + cards.add(new SetCardInfo("Hitchclaw Recluse", 133, Rarity.COMMON, mage.cards.h.HitchclawRecluse.class)); cards.add(new SetCardInfo("House Guildmage", 177, Rarity.UNCOMMON, mage.cards.h.HouseGuildmage.class)); cards.add(new SetCardInfo("Hunted Witness", 15, Rarity.COMMON, mage.cards.h.HuntedWitness.class)); cards.add(new SetCardInfo("Hypothesizzle", 178, Rarity.COMMON, mage.cards.h.Hypothesizzle.class)); cards.add(new SetCardInfo("Impervious Greatwurm", 273, Rarity.MYTHIC, mage.cards.i.ImperviousGreatwurm.class)); cards.add(new SetCardInfo("Inescapable Blaze", 107, Rarity.UNCOMMON, mage.cards.i.InescapableBlaze.class)); - cards.add(new SetCardInfo("Inspiring Unicorn", 16, Rarity.COMMON, mage.cards.i.InspiringUnicorn.class)); cards.add(new SetCardInfo("Integrity // Intervention", 227, Rarity.UNCOMMON, mage.cards.i.IntegrityIntervention.class)); cards.add(new SetCardInfo("Invert // Invent", 228, Rarity.UNCOMMON, mage.cards.i.InvertInvent.class)); + cards.add(new SetCardInfo("Inspiring Unicorn", 16, Rarity.UNCOMMON, mage.cards.i.InspiringUnicorn.class)); cards.add(new SetCardInfo("Ionize", 179, Rarity.RARE, mage.cards.i.Ionize.class)); + cards.add(new SetCardInfo("Ironshell Beetle", 134, Rarity.COMMON, mage.cards.i.IronshellBeetle.class)); cards.add(new SetCardInfo("Island", 261, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Izoni, Thousand-Eyed", 180, Rarity.RARE, mage.cards.i.IzoniThousandEyed.class)); cards.add(new SetCardInfo("Izzet Guildgate", 251, Rarity.COMMON, mage.cards.i.IzzetGuildgate.class)); @@ -135,7 +137,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Join Shields", 181, Rarity.UNCOMMON, mage.cards.j.JoinShields.class)); cards.add(new SetCardInfo("Justice Strike", 182, Rarity.UNCOMMON, mage.cards.j.JusticeStrike.class)); cards.add(new SetCardInfo("Knight of Autumn", 183, Rarity.RARE, mage.cards.k.KnightOfAutumn.class)); - cards.add(new SetCardInfo("Kraul Foragers", 134, Rarity.COMMON, mage.cards.k.KraulForagers.class)); + cards.add(new SetCardInfo("Kraul Foragers", 135, Rarity.COMMON, mage.cards.k.KraulForagers.class)); cards.add(new SetCardInfo("Kraul Harpooner", 136, Rarity.UNCOMMON, mage.cards.k.KraulHarpooner.class)); cards.add(new SetCardInfo("Lava Coil", 108, Rarity.UNCOMMON, mage.cards.l.LavaCoil.class)); cards.add(new SetCardInfo("Lazav, the Multifarious", 184, Rarity.MYTHIC, mage.cards.l.LazavTheMultifarious.class)); @@ -148,6 +150,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Lotleth Giant", 74, Rarity.UNCOMMON, mage.cards.l.LotlethGiant.class)); cards.add(new SetCardInfo("Loxodon Restorer", 20, Rarity.COMMON, mage.cards.l.LoxodonRestorer.class)); cards.add(new SetCardInfo("Luminous Bonds", 21, Rarity.COMMON, mage.cards.l.LuminousBonds.class)); + cards.add(new SetCardInfo("Maniacal Rage", 110, Rarity.COMMON, mage.cards.m.ManiacalRage.class)); cards.add(new SetCardInfo("March of the Multitudes", 188, Rarity.MYTHIC, mage.cards.m.MarchOfTheMultitudes.class)); cards.add(new SetCardInfo("Mausoleum Secrets", 75, Rarity.RARE, mage.cards.m.MausoleumSecrets.class)); cards.add(new SetCardInfo("Maximize Altitude", 43, Rarity.COMMON, mage.cards.m.MaximizeAltitude.class)); @@ -175,6 +178,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Passwall Adept", 50, Rarity.COMMON, mage.cards.p.PasswallAdept.class)); cards.add(new SetCardInfo("Piston-Fist Cyclops", 217, Rarity.COMMON, mage.cards.p.PistonFistCyclops.class)); cards.add(new SetCardInfo("Plains", 260, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Prey Upon", 143, Rarity.COMMON, mage.cards.p.PreyUpon.class)); cards.add(new SetCardInfo("Price of Fame", 83, Rarity.UNCOMMON, mage.cards.p.PriceOfFame.class)); cards.add(new SetCardInfo("Quasiduplicate", 51, Rarity.RARE, mage.cards.q.Quasiduplicate.class)); cards.add(new SetCardInfo("Radical Idea", 52, Rarity.COMMON, mage.cards.r.RadicalIdea.class)); @@ -204,6 +208,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Steam Vents", 257, Rarity.RARE, mage.cards.s.SteamVents.class)); cards.add(new SetCardInfo("Sumala Woodshaper", 200, Rarity.COMMON, mage.cards.s.SumalaWoodshaper.class)); cards.add(new SetCardInfo("Sunhome Stalwart", 26, Rarity.UNCOMMON, mage.cards.s.SunhomeStalwart.class)); + cards.add(new SetCardInfo("Sure Strike", 118, Rarity.COMMON, mage.cards.s.SureStrike.class)); cards.add(new SetCardInfo("Swamp", 262, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Swarm Guildmage", 201, Rarity.UNCOMMON, mage.cards.s.SwarmGuildmage.class)); cards.add(new SetCardInfo("Swathcutter Giant", 202, Rarity.UNCOMMON, mage.cards.s.SwathcutterGiant.class)); diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 8705723c1de..b019a303850 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -34306,14 +34306,14 @@ Collar the Culprit|Guilds of Ravnica|5|C|{3}{W}|Instant|||Destroy target creatur Conclave Tribunal|Guilds of Ravnica|6|U|{3}{W}|Enchantment|||Convoke$When Conclave Tribunal enters the battlefield, exile target nonland permanent an opponent controls until Conclave Tribunal leaves the battlefield.| Crush Contraband|Guilds of Ravnica|7|U|{3}{W}|Instant|||Choose one or both —$• Exile target artifact.$• Exile target enchantment.| Dawn of Hope|Guilds of Ravnica|8|R|{1}{W}|Enchantment|||Whenever you gain life, you may pay {2}. If you do, draw a card.${3}{W}: Create a 1/1 white Soldier creature token with lifelink.| -Demotion|Guilds of Ravnica|9|C|{W}|Enchantment - Aura|||Enchant creature$Enchanted creature can't block and its activated abilities can't be activated.| +Demotion|Guilds of Ravnica|9|U|{W}|Enchantment - Aura|||Enchant creature$Enchanted creature can't block and its activated abilities can't be activated.| Divine Visitation|Guilds of Ravnica|10|M|{3}{W}{W}|Enchantment|||If one or more creature tokens would be created under your control, that many 4/4 white Angel creature tokens with flying and vigilance are created instead.| Flight of Equenauts|Guilds of Ravnica|11|U|{7}{W}|Creature - Human Knight|4|5|Convoke$Flying| Gird for Battle|Guilds of Ravnica|12|U|{W}|Sorcery|||Put a +1/+1 counter on each of up to two target creatures.| -Haazda Marshal|Guilds of Ravnica|13|U|{W}|Creature - Human Soldier|1|1|Whenever Haazda Marshal and at least two other creatures attack, create a 1/1 white Solider creature token with lifelink.| +Haazda Marshal|Guilds of Ravnica|13|U|{W}|Creature - Human Soldier|1|1|Whenever Haazda Marshal and at least two other creatures attack, create a 1/1 white Soldier creature token with lifelink.| Healer's Hawk|Guilds of Ravnica|14|C|{W}|Creature - Bird|1|1|Flying, lifelink| Hunted Witness|Guilds of Ravnica|15|C|{W}|Creature - Human|1|1|When Hunted Witness dies, create a 1/1 white Soldier creature token with lifelink.| -Inspiring Unicorn|Guilds of Ravnica|16|C|{2}{W}{W}|Creature - Unicorn|2|2|Whenever Inspiring Unicorn attacks, creatures you control get +1/+1 until end of turn.| +Inspiring Unicorn|Guilds of Ravnica|16|U|{2}{W}{W}|Creature - Unicorn|2|2|Whenever Inspiring Unicorn attacks, creatures you control get +1/+1 until end of turn.| Intrusive Packbeast|Guilds of Ravnica|17|C|{4}{W}|Creature - Beast|3|3|Vigilance$When Intrusive Packbeast enters the battlefield, tap up to two target creatures your opponents control.| Ledev Guardian|Guilds of Ravnica|18|C|{3}{W}|Creature - Human Knight|2|4|Convoke| Light of the Legion|Guilds of Ravnica|19|R|{4}{W}{W}|Creature - Angel|5|5|Flying$Mentor$When Light of the Legion dies, put a +1/+1 counter on each white creature you control.| @@ -34350,7 +34350,7 @@ Omnispell Adept|Guilds of Ravnica|49|R|{4}{U}|Creature - Human Wizard|3|4|{2}{U} Passwall Adept|Guilds of Ravnica|50|C|{1}{U}|Creature - Human Wizard|1|3|{2}{U}: Target creature can't be blocked this turn.| Quasiduplicate|Guilds of Ravnica|51|R|{1}{U}{U}|Sorcery|||Create a token that's a copy of target creature you control.$Jump-start| Radical Idea|Guilds of Ravnica|52|C|{1}{U}|Instant|||Draw a card.$Jump-start| -Selective Snare|Guilds of Ravnica|53|C|{X}{U}|Sorcery|||Return X target creatures of the creature type of your choice to their owner's hand.| +Selective Snare|Guilds of Ravnica|53|U|{X}{U}|Sorcery|||Return X target creatures of the creature type of your choice to their owner's hand.| Sinister Sabotage|Guilds of Ravnica|54|U|{1}{U}{U}|Instant|||Counter target spell.$Surveil 1.| Thoughtbound Phantasm|Guilds of Ravnica|55|U|{U}|Creature - Spirit|2|2|Defender$Whenever you surveil, put a +1/+1 counter on Thoughtbound Phantasm.$As long as Thoughtbound Phantasm has three or more +1/+1 counters on it, it can attack as though it didn't have defender.| Unexplained Disappearance|Guilds of Ravnica|56|C|{1}{U}|Instant|||Return target creature to its owner's hand.$Surveil 1.| @@ -34370,7 +34370,7 @@ Doom Whisperer|Guilds of Ravnica|69|M|{3}{B}{B}|Creature - Nightmare Demon|6|6|F Douser of Lights|Guilds of Ravnica|70|C|{4}{B}|Creature - Horror|4|5|| Gruesome Menagerie|Guilds of Ravnica|71|R|{3}{B}{B}|Sorcery|||Choose a creature card with converted mana cost 1 in your graveyard, then do the same for creature cards with converted mana costs 2 and 3. Return those cards to the battlefield.| Hired Poisoner|Guilds of Ravnica|72|C|{B}|Creature - Human Assassin|1|1|Deathtouch| -Kraul Swarm|Guilds of Ravnica|73|C|{4}{B}|Creature - Insect Warrior|4|1|Flying${2}{B}, Discard a creature card: Return Kraul Swarm from your graveyard to your hand.| +Kraul Swarm|Guilds of Ravnica|73|U|{4}{B}|Creature - Insect Warrior|4|1|Flying${2}{B}, Discard a creature card: Return Kraul Swarm from your graveyard to your hand.| Lotleth Giant|Guilds of Ravnica|74|U|{6}{B}|Creature - Zombie Giant|6|5|Undergrowth — When Lotleth Giant enters the battlefield, it deals 1 damage to target opponent for each creature card in your graveyard.| Mausoleum Secrets|Guilds of Ravnica|75|R|{1}{B}|Instant|||Undergrowth — Search your library for a black card with converted mana cost less than or equal to the number of creature cards in your graveyard, reveal it, put it into your hand, then shuffle your library.| Mephitic Vapors|Guilds of Ravnica|76|C|{2}{B}|Sorcery|||All creatures get -1/-1 until end of turn.$Surveil 2.| @@ -34378,13 +34378,13 @@ Midnight Reaper|Guilds of Ravnica|77|R|{2}{B}|Creature - Zombie Knight|3|2|Whene Moodmark Painter|Guilds of Ravnica|78|C|{2}{B}{B}|Creature - Human Shaman|2|3|Undergrowth — When Moodmark Painter enters the battlefield, target creature gains menace and gets +X/+0 until end of turn, where X is the number of creature cards in your graveyard.| Necrotic Wound|Guilds of Ravnica|79|U|{B}|Instant|||Undergrowth — Target creature gets -X/-X until end of turn, where X is the number of creature cards in your graveyard. If that creature would die this turn, exile it instead.| Never Happened|Guilds of Ravnica|80|C|{2}{B}|Sorcery|||Target opponent reveals their hand. You choose a nonland card from that player's graveyard or hand and exile it.| -Pilfering Imp|Guilds of Ravnica|81|C|{B}|Creature - Imp|||Flying${1}{B}, {T}, Sacrifice Pilfering Imp: Target opponent reveals their hand| +Pilfering Imp|Guilds of Ravnica|81|U|{B}|Creature - Imp|||Flying${1}{B}, {T}, Sacrifice Pilfering Imp: Target opponent reveals their hand| Plaguecrafter|Guilds of Ravnica|82|U|{2}{B}|Creature - Human Shaman|3|2|When Plaguecrafter enters the battlefield, each player sacrifices a creature or planeswalker. Each player who can't discards a card.| Price of Fame|Guilds of Ravnica|83|U|{3}{B}|Instant|||This spell costs {2} less to cast if it targets a legendary creature.$Destroy target creature.$Surveil 2.| Ritual of Soot|Guilds of Ravnica|84|R|{2}{B}{B}|Sorcery|||Destroy all creatures with converted mana cost 3 or less.| Severed Strands|Guilds of Ravnica|85|C|{1}{B}|Sorcery|||As an additional cost to cast this spell, sacrifice a creature.$You gain life equal to that sacrificed creature's toughness. Destroy target creature an opponent controls.| Spinal Centipede|Guilds of Ravnica|86|C|{2}{B}|Creature - Insect|3|2|When Spinal Centipede dies, put a +1/+1 counter on target creature you control.| -Undercity Necroklisk|Guilds of Ravnica|87|U|{3}{B}|Creature - Zombie Lizard|3|3|{1}, Sacrifice another creature: Put a +1/+1 counter on Undercity Necroklisk. It gains menace until end of turn. Activate this ability only any time you could cast a sorcery.| +Undercity Necrolisk|Guilds of Ravnica|87|U|{3}{B}|Creature - Zombie Lizard|3|3|{1}, Sacrifice another creature: Put a +1/+1 counter on Undercity Necrolisk. It gains menace until end of turn. Activate this ability only any time you could cast a sorcery.| Veiled Shade|Guilds of Ravnica|88|C|{2}{B}|Creature - Shade|2|2|{1}{B}: Veiled Shade gets +1/+1 until end of turn.| Vicious Rumors|Guilds of Ravnica|89|C|{B}|Sorcery|||Vicious Rumors deals 1 damage to each opponent. Each opponent discards a card, the puts the top card of their library into their graveyard. You gain 1 life.| Whispering Snitch|Guilds of Ravnica|90|U|{1}{B}|Creature - Vampire Rogue|1|3|Whenever you surveil for the first time each turn, Whispering Snitch deals 1 damage to each opponent and you gain 1 life.| @@ -34394,18 +34394,28 @@ Book Devourer|Guilds of Ravnica|93|U|{5}{R}|Creature - Beast|4|5|Trample$Wheneve Command the Storm|Guilds of Ravnica|94|C|{4}{R}|Instant|||Command the Storm deals 5 damage to target creature.| Cosmotronic Wave|Guilds of Ravnica|95|C|{3}{B}|Sorcery|||Cosmotronic Wave deals 1 damage to each creature your opponents control. Creatures your opponents control can't block this turn.| Direct Current|Guilds of Ravnica|96|C|{1}{R}{R}|Sorcery|||Direct Current deals 2 damage to any target.$Jump-start| -Electrostatic Field|Guilds of Ravnica|97|C|{1}{R}|Creature - Wall|0|4|Defender$When you cast an instant or sorcery spell, Electrostatic Field deals 1 damage to each opponent.| +Electrostatic Field|Guilds of Ravnica|97|U|{1}{R}|Creature - Wall|0|4|Defender$When you cast an instant or sorcery spell, Electrostatic Field deals 1 damage to each opponent.| Erratic Cyclops|Guilds of Ravnica|98|R|{3}{R}|Creature - Cyclops Shaman|0|8|Trample$Whenever you cast an instant or sorcery spell, Erratic Cyclops gets +X/+0 until end of turn, where X is that spell's converted mana cost.| Experimental Frenzy|Guilds of Ravnica|99|R|{3}{R}|Enchantment|||You may look at the top card of your library any time.$You may play the top card of your library.$You can't play cards from your hand.${3}{R}: Destroy Experimental Frenzy.| +Fearless Halberdier|Guilds of Ravnica|100|C|{2}{R}|Creature - Human Warrior|3|2|| +Fire Urchin|Guilds of Ravnica|101|C|{1}{R}|Creature - Elemental|1|3|Trample$Whenever you cast an instant or sorcery spell, Fire Urchin gets +1/+0 until end of turn.| Goblin Banneret|Guilds of Ravnica|102|U|{R}|Creature - Goblin Soldier|1|1|Mentor${1}{R}: Goblin Banneret gets +2/+0 until end of turn.| Goblin Cratermaker|Guilds of Ravnica|103|U|{1}{R}|Creature - Goblin Warrior|2|2|{1}, Sacrifice Goblin Cratermaker: Choose one —$• Goblin Cratermaker deals 2 damage to target creature.$• Destroy target colorless nonland permanent.| Goblin Locksmith|Guilds of Ravnica|104|C|{1}{R}|Creature - Goblin Rogue|2|1|Whenever Goblin Locksmith attacks, creatures with defender can't block this turn.| +Gravitic Punch|Guilds of Ravnica|105|C|{3}{R}|Sorcery|||Target creature you control deals damage equal to its power to target player.$Jump-start| Inescapable Blaze|Guilds of Ravnica|107|U|{4}{R}{R}|Instant|||This spell can't be countered.$Inescapable Flame deals 6 damage to any target.| Lava Coil|Guilds of Ravnica|108|U|{1}{R}|Sorcery|||Lava Coil deals 4 damage to target creature. If that creature would die this turn, exile it instead.| Legion Warboss|Guilds of Ravnica|109|R|{2}{R}|Creature - Goblin Soldier|2|2|Mentor$At the beginning of combat on your turn, create a 1/1 red Goblin creature token. That token gains haste until end of turn and attacks this combat if able.| +Maniacal Rage|Guilds of Ravnica|110|C|{1}{R}|Enchantment - Aura|||Enchant creature$Enchanted creature gets +2/+2 and can't block.| Maximize Velocity|Guilds of Ravnica|111|C|{R}|Sorcery|||Target creature gets +1/+1 and gains haste until end of turn.$Jump-start| +Ornery Goblin|Guilds of Ravnica|112|C|{1}{R}|Creature - Goblin Warrior|2|1|Whenever Ornery Goblin blocks or becomes blocked by a creature, Ornery Goblin deals 1 damage to that creature.| Risk Factor|Guilds of Ravnica|113|R|{2}{R}|Instant|||Target opponent may have Risk Factor deal 4 damage to them. If that player doesn't, you draw three cards.$Jump-start| +Rubblebelt Boar|Guilds of Ravnica|114|C|{3}{R}|Creature - Boar|3|3|When Rubblebelt Boar enters the battlefield, target creature gets +2/+0 until end of turn.| Runaway Steam-Kin|Guilds of Ravnica|115|R|{1}{R}|Creature - Elemental|1|1|Whenever you cast a red spell, if Runaway Steam-Kin has fewer than three +1/+1 counters on it, put a +1/+1 counter on Runaway Steam-Kin.$Remove three +1/+1 counters from Runaway Steam-Kin: Add {R}{R}{R}.| +Smelt-War Minotaur|Guilds of Ravnica|116|U|{2}{R}|Creature - Minotaur Warrior|2|3|Whenever you cast an instant or sorcery spell, target creature an opponent controls can't block this turn.| +Street Riot|Guilds of Ravnica|117|U|{4}{R}|Enchantment|||As long as it's your turn, creatures you control get +1/+0 and have trample.| +Sure Strike|Guilds of Ravnica|118|C|{1}{R}|Instant|||Target creature gets +3/+0 and gains first strike until end of turn.| +Torch Courier|Guilds of Ravnica|119|C|{R}|Creature - Goblin|1|1|Haste$Sacrifice Torch Courier: Another target creature gains haste until end of turn.| Wojek Bodyguard|Guilds of Ravnica|120|C|{2}{R}|Creature - Human Soldier|3|3|Mentor$Wojek Bodyguard can't attack or block alone.| Affectionate Indrik|Guilds of Ravnica|121|U|{5}{G}|Creature - Beast|4|4|When Affectionate Indrik enters the battlefield, you may have it fight target creature you don't control.| Arboretum Elemental|Guilds of Ravnica|122|U|{7}{G}{G}|Creature - Elemental|7|5|Convoke$Hexproof| @@ -34413,19 +34423,30 @@ Beast Whisperer|Guilds of Ravnica|123|R|{2}{G}{G}|Creature - Elf Druid|2|3|Whene Bounty of Might|Guilds of Ravnica|124|R|{4}{G}{G}|Instant|||Target creature gets +3/+3 until end of turn.$Target creature gets +3/+3 until end of turn.$Target creature gets +3/+3 until end of turn.| Circuitous Route|Guilds of Ravnica|125|U|{3}{G}|Sorcery|||Search your library for up to two basic land cards and/or Gate cards and put them onto the battlefield tapped, then shuffle your library.| Crushing Canopy|Guilds of Ravnica|126|C|{2}{G}|Instant|||Choose one —$• Destroy target creature with flying.$• Destroy target enchantment.| +Devkarin Dissident|Guilds of Ravnica|127|C|{1}{G}|Creature - Elf Warrior|2|2|{4}{G}: Devkarin Dissident gets +2/+2 until end of turn.| District Guide|Guilds of Ravnica|128|U|{2}{G}|Creature - Elf Scout|2|2|When District Guide enters the battlefield, you may search your library for a basic land card or Gate card, reveal it, put it into your hand, then shuffle your library.| Generous Stray|Guilds of Ravnica|129|C|{2}{G}|Creature - Cat|1|2|When Generous Stray enters the battlefield, draw a card.| Golgari Raiders|Guilds of Ravnica|130|U|{3}{G}|Creature - Elf Warrior|0|0|Haste$Undergrowth — Golgari Raiders enters the battlefield with a +1/+1 counter on it for each creature card in your graveyard.| +Grappling Sundew|Guilds of Ravnica|131|U|{1}{G}|Creature - Plant|0|4|Defender, reach${4}{G}: Grappling Sundew gains indestructible until end of turn.| Hatchery Spider|Guilds of Ravnica|132|R|{5}{G}{G}|Creature - Spider|5|7|Reach$Undergrowth — When you cast this spell, reveal the top X cards of your library, where X is the number of creature cards in your graveyard. You may put a green permanent card with converted mana cost X or less from among them onto the battlefield. Put the rest on the bottom of your library in a random order.| -Kraul Foragers|Guilds of Ravnica|134|C|{4}{G}|Creature - Insect Scout|4|4|Undergrowth — When Kraul Foragers enters the battlefield, you gain 1 life for each creature card in your graveyard.| +Hitchclaw Recluse|Guilds of Ravnica|133|C|{2}{G}|Creature - Spider|1|4|Reach| +Ironshell Beetle|Guilds of Ravnica|134|C|{1}{G}|Creature - Insect|1|1|When Ironshell Beetle enters the battlefield, put a +1/+1 counter on target creature.| +Kraul Foragers|Guilds of Ravnica|135|C|{4}{G}|Creature - Insect Scout|4|4|Undergrowth — When Kraul Foragers enters the battlefield, you gain 1 life for each creature card in your graveyard.| Kraul Harpooner|Guilds of Ravnica|136|U|{1}{G}|Creature - Insect Warrior|3|2|Reach$Undergrowth — When Kraul Harpooner enters the battlefield, choose up to one target creature with flying you don't control. Kraul Harpooner gets +X/+0 until end of turn, where X is the number of creature cards in your graveyard, then you may have Kraul Harpooner fight that creature.| Might of the Masses|Guilds of Ravnica|137|U|{G}|Instant|||Target creature gets +1/+1 until end of turn for each creature you control.| Nullhide Ferox|Guilds of Ravnica|138|M|{2}{G}{G}|Creature - Beast|6|6|Hexproof$You can't cast noncreature spells.${2}: Nullhide Ferox loses all abilities until end of turn. Any player may activate this ability.$If a spell or ability an opponent controls causes you to discard Nullhide Ferox, put it onto the battlefield instead of putting it into your graveyard.| +Pack's Favor|Guilds of Ravnica|139|C|{2}{G}|Instant|||Convoke$Target creature gets +3/+3 until end of turn.| +Pause for Reflection|Guilds of Ravnica|140|C|{2}{G}|Instant|||Convoke$Precent all combat damage that would be dealt this turn.| Pelt Collector|Guilds of Ravnica|141|R|{G}|Creature - Elf Warrior|1|1|Whenever another creature you control enters the battlefield or dies, if that creature's power is greater than Pelt Collector's, put a +1/+1 counter on Pelt Collector.$As long as Pelt Collector has three or more +1/+1 counters on it, it has trample.| +Portcullis Vine|Guilds of Ravnica|142|C|{G}|Creature - Plant Wall|0|3|Defender${2}, {T}, Sacrifice a creature with defender: Draw a card.| +Prey Upon|Guilds of Ravnica|143|C|{G}|Sorcery|||Target creature you control fights target creature you don't control.| Siege Wurm|Guilds of Ravnica|144|C|{5}{G}{G}|Creature - Wurm|5|5|Convoke$Trample| Sprouting Renewal|Guilds of Ravnica|145|U|{2}{G}|Sorcery|||Convoke$Choose one —$• Create a 2/2 green and white Elf Knight creature token with vigilance.$• Destroy target artifact or enchantment.| +Urban Utopia|Guilds of Ravnica|146|C|{1}{G}|Enchantment - Aura|||Enchant Land$When Urban Utopia enters the battlefield, draw a card.$Enchanted land has "{T}: Add one mana of any color."| +Vigorspore Wurm|Guilds of Ravnica|147|C|{5}{G}|Creature - Wurm|6|4|Undergrowth — When Vigorspore Wurm enters the battlefield, target creature gains vigilance and gets +X/+X until end of turn, where X is the number of creature cards in your graveyard.$Vigorspore Wurm can't be blocked by more than one creature.| Vivid Revival|Guilds of Ravnica|148|R|{4}{G}|Sorcery|||Return up to three target multicolor cards from your graveyard to your hand. Exile Vivid Revival.| Wary Okapi|Guilds of Ravnica|149|C|{2}{G}|Creature - Antelope|3|2|Vigilance| +Wild Ceratok|Guilds of Ravnica|150|C|{3}{G}|Creature - Rhino|4|3|| Artful Takedown|Guilds of Ravnica|151|C|{2}{U}{B}|Instant|||Choose one or both —$• Tap target creature.$• Target creature gets -2/-4 until end of turn.| Assassin's Trophy|Guilds of Ravnica|152|R|{B}{G}|Instant|||Destroy target permanent an opponent controls. Its controller may search their library for a basic land card, put it onto the battlefield, then shuffle their library.| Aurelia, Exemplar of Justice|Guilds of Ravnica|153|M|{2}{R}{W}|Legendary Creature - Angel|2|5|Flying$Mentor$At the beginning of combat on your turn, choose up to one target creature you control. Until end of turn, that creature gets +2/+0, gains trample if it's red, and gains vigilance if it's white.| @@ -34493,6 +34514,8 @@ Wee Dragonauts|Guilds of Ravnica|214|U|{1}{U}{R}|Creature - Faerie Wizard|1|3|Fl Worldsoul Colossus|Guilds of Ravnica|215|U|{X}{G}{W}|Creature - Elemental|0|0|Convoke$Worldsoul Colossus enters the battlefield with X +1/+1 counters on it.| Fresh-Faced Recruit|Guilds of Ravnica|216|C|{1}{R/W}|Creature - Human Soldier|2|1|As long as it's your turn, Fresh-Faced Recruit has first strike.| Piston-Fist Cyclops|Guilds of Ravnica|217|C|{1}{U/R}{U/R}|Creature - Cyclops|4|3|Defender$As long as you've cast an instant or sorcery spell this turn, Piston-Fist Cyclops can attack as though it didn't have defender.| +Pitiless Gorgon|Guilds of Ravnica|218|C|{1}{B/G}{B/G}|Creature - Gorgon|2|2|Deathtouch| +Vernadi Sheildmate|Guilds of Ravnica|219|C|{1}{G/W}|Creature - Human Soldier|2|2|Vigilance| Whisper Agent|Guilds of Ravnica|220|C|{1}{U/B}{U/B}|Creature - Human Rogue|3|2|Flash$When Whisper Agent enters the battlefield, surveil 1.| Assemble|Guilds of Ravnica|221|R|{4}{G}{W}|Instant|||Create three 2/2 green and white Elf Knight creature tokens with vigilance.| Assure|Guilds of Ravnica|221|R|{G/W}{G/W}|Instant|||Put a +1/+1 counter on target creature. It gains indestructible until end of turn.| @@ -34522,7 +34545,9 @@ Gatekeeper Gargoyle|Guilds of Ravnica|235|U|{6}|Artifact Creature - Gargoyle|3|3 Glaive of the Guildpact|Guilds of Ravnica|236|U|{2}|Artifact - Equipment|||Equipped creature gets +1/+0 for each Gate you control and has vigilance and menace.$Equip {3}| Golgari Locket|Guilds of Ravnica|237|C|{3}|Artifact|||{T}: Add {B} or {G}.${B/G}{B/G}{B/G}{B/G}, {T}, Sacrifice Golgari Locket: Draw two cards.| Izzet Locket|Guilds of Ravnica|238|C|{3}|Artifact|||{T}: Add {U} or {R}.${U/R}{U/R}{U/R}{U/R}, {T}, Sacrifice Izzet Locket: Draw two cards.| +Rampaging Monument|Guilds of Ravnica|239|U|{4}|Artifact Creature - Cleric|0|0|Trample$Rampaging Monument enters the battlefield with three +1/+1 counters on it.$Whenever you cast a multicolored spell, put a +1/+1 counter on Rampaging Monument.| Selesnya Locket|Guilds of Ravnica|240|C|{3}|Artifact|||{T}: Add {G} or {W}.${G/W}{G/W}{G/W}{G/W}, {T}, Sacrifice Selesnya Locket: Draw two cards.| +Silent Dart|Guilds of Ravnica|241|U|{1}|Artifact|||{4}, {T}, Sacrifice Silent Dart: It deals 3 damage to target creature.| Wand of Vertebrae|Guilds of Ravnica|242|U|{1}|Artifact|||{T}: Put the top card of your library into your graveyard.${2}, {T}, Exile Wand of Vertebrae: Shuffle up to five target cards from your graveyard into your library.| Boros Guildgate|Guilds of Ravnica|243|C||Land - Gate|||Boros Guildgate enters the battlefield tapped.${T}: Add {R} or {W}.| Dimir Guildgate|Guilds of Ravnica|245|C||Land - Gate|||Dimir Guildgate enters the battlefield tapped.${T}: Add {U} or {B}.| From b960f6d94ce5e0722db7eca29b85eeb5a6bad544 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 14:43:07 -0400 Subject: [PATCH 060/140] Implemented Devkarin Dissident --- .../src/mage/cards/d/DevkarinDissident.java | 45 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 46 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/d/DevkarinDissident.java diff --git a/Mage.Sets/src/mage/cards/d/DevkarinDissident.java b/Mage.Sets/src/mage/cards/d/DevkarinDissident.java new file mode 100644 index 00000000000..95b4baaba70 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DevkarinDissident.java @@ -0,0 +1,45 @@ +package mage.cards.d; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; + +/** + * + * @author TheElk801 + */ +public final class DevkarinDissident extends CardImpl { + + public DevkarinDissident(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); + + this.subtype.add(SubType.ELF); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // {4}{G}: Devkarin Dissident gets +2/+2 until end of turn. + this.addAbility(new SimpleActivatedAbility( + Zone.BATTLEFIELD, + new BoostSourceEffect(2, 2, Duration.EndOfTurn), + new ManaCostsImpl("{4}{G}") + )); + } + + public DevkarinDissident(final DevkarinDissident card) { + super(card); + } + + @Override + public DevkarinDissident copy() { + return new DevkarinDissident(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index a24eda745f6..f1e00041cb5 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -67,6 +67,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Dead Weight", 67, Rarity.COMMON, mage.cards.d.DeadWeight.class)); cards.add(new SetCardInfo("Deadly Visit", 68, Rarity.COMMON, mage.cards.d.DeadlyVisit.class)); cards.add(new SetCardInfo("Deafening Clarion", 165, Rarity.RARE, mage.cards.d.DeafeningClarion.class)); + cards.add(new SetCardInfo("Devkarin Dissident", 127, Rarity.COMMON, mage.cards.d.DevkarinDissident.class)); cards.add(new SetCardInfo("Dimir Guildgate", 245, Rarity.COMMON, mage.cards.d.DimirGuildgate.class)); cards.add(new SetCardInfo("Dimir Guildgate", 246, Rarity.COMMON, mage.cards.d.DimirGuildgate.class)); cards.add(new SetCardInfo("Dimir Informant", 36, Rarity.COMMON, mage.cards.d.DimirInformant.class)); From c8b6bad1d17e14b305aa422472ef60bbcb8afe84 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 14:44:01 -0400 Subject: [PATCH 061/140] Implemented Fearless Halberdier --- .../src/mage/cards/f/FearlessHalberdier.java | 33 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 34 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/f/FearlessHalberdier.java diff --git a/Mage.Sets/src/mage/cards/f/FearlessHalberdier.java b/Mage.Sets/src/mage/cards/f/FearlessHalberdier.java new file mode 100644 index 00000000000..c066ad4cbb9 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FearlessHalberdier.java @@ -0,0 +1,33 @@ +package mage.cards.f; + +import java.util.UUID; +import mage.MageInt; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author TheElk801 + */ +public final class FearlessHalberdier extends CardImpl { + + public FearlessHalberdier(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(3); + this.toughness = new MageInt(2); + } + + public FearlessHalberdier(final FearlessHalberdier card) { + super(card); + } + + @Override + public FearlessHalberdier copy() { + return new FearlessHalberdier(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index f1e00041cb5..20f00bfc04a 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -90,6 +90,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Erstwhile Trooper", 169, Rarity.COMMON, mage.cards.e.ErstwhileTrooper.class)); cards.add(new SetCardInfo("Etrata, the Silencer", 170, Rarity.RARE, mage.cards.e.EtrataTheSilencer.class)); cards.add(new SetCardInfo("Expansion // Explosion", 224, Rarity.RARE, mage.cards.e.ExpansionExplosion.class)); + cards.add(new SetCardInfo("Fearless Halberdier", 100, Rarity.COMMON, mage.cards.f.FearlessHalberdier.class)); cards.add(new SetCardInfo("Find // Finality", 225, Rarity.RARE, mage.cards.f.FindFinality.class)); cards.add(new SetCardInfo("Firemind's Research", 171, Rarity.RARE, mage.cards.f.FiremindsResearch.class)); cards.add(new SetCardInfo("Flight of Equenauts", 11, Rarity.UNCOMMON, mage.cards.f.FlightOfEquenauts.class)); From b572c6ce83f9fae8c7040c1a24024d5bb703f801 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 14:45:39 -0400 Subject: [PATCH 062/140] Implemented Pack's Favor --- Mage.Sets/src/mage/cards/p/PacksFavor.java | 39 ++++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 40 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/p/PacksFavor.java diff --git a/Mage.Sets/src/mage/cards/p/PacksFavor.java b/Mage.Sets/src/mage/cards/p/PacksFavor.java new file mode 100644 index 00000000000..8fe4c69a04e --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PacksFavor.java @@ -0,0 +1,39 @@ +package mage.cards.p; + +import java.util.UUID; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.keyword.ConvokeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class PacksFavor extends CardImpl { + + public PacksFavor(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{G}"); + + // Convoke + this.addAbility(new ConvokeAbility()); + + // Target creature gets +3/+3 until end of turn. + this.getSpellAbility().addEffect( + new BoostTargetEffect(3, 3, Duration.EndOfTurn) + ); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + public PacksFavor(final PacksFavor card) { + super(card); + } + + @Override + public PacksFavor copy() { + return new PacksFavor(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 20f00bfc04a..1f0b84193ec 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -176,6 +176,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Ochran Assassin", 194, Rarity.UNCOMMON, mage.cards.o.OchranAssassin.class)); cards.add(new SetCardInfo("Omnispell Adept", 49, Rarity.RARE, mage.cards.o.OmnispellAdept.class)); cards.add(new SetCardInfo("Overgrown Tomb", 253, Rarity.RARE, mage.cards.o.OvergrownTomb.class)); + cards.add(new SetCardInfo("Pack's Favor", 139, Rarity.COMMON, mage.cards.p.PacksFavor.class)); cards.add(new SetCardInfo("Parhelion Patrol", 22, Rarity.COMMON, mage.cards.p.ParhelionPatrol.class)); cards.add(new SetCardInfo("Passwall Adept", 50, Rarity.COMMON, mage.cards.p.PasswallAdept.class)); cards.add(new SetCardInfo("Piston-Fist Cyclops", 217, Rarity.COMMON, mage.cards.p.PistonFistCyclops.class)); From 0c55ba383ace24c71aa1ed42724606e04cb9422f Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 14:46:28 -0400 Subject: [PATCH 063/140] Implemented Pitiless Gorgon --- .../src/mage/cards/p/PitilessGorgon.java | 36 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 37 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/p/PitilessGorgon.java diff --git a/Mage.Sets/src/mage/cards/p/PitilessGorgon.java b/Mage.Sets/src/mage/cards/p/PitilessGorgon.java new file mode 100644 index 00000000000..62a499ddd62 --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PitilessGorgon.java @@ -0,0 +1,36 @@ +package mage.cards.p; + +import java.util.UUID; +import mage.MageInt; +import mage.constants.SubType; +import mage.abilities.keyword.DeathtouchAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author TheElk801 + */ +public final class PitilessGorgon extends CardImpl { + + public PitilessGorgon(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B/G}{B/G}"); + + this.subtype.add(SubType.GORGON); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Deathtouch + this.addAbility(DeathtouchAbility.getInstance()); + } + + public PitilessGorgon(final PitilessGorgon card) { + super(card); + } + + @Override + public PitilessGorgon copy() { + return new PitilessGorgon(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 1f0b84193ec..74808784af3 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -180,6 +180,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Parhelion Patrol", 22, Rarity.COMMON, mage.cards.p.ParhelionPatrol.class)); cards.add(new SetCardInfo("Passwall Adept", 50, Rarity.COMMON, mage.cards.p.PasswallAdept.class)); cards.add(new SetCardInfo("Piston-Fist Cyclops", 217, Rarity.COMMON, mage.cards.p.PistonFistCyclops.class)); + cards.add(new SetCardInfo("Pitiless Gorgon", 218, Rarity.COMMON, mage.cards.p.PitilessGorgon.class)); cards.add(new SetCardInfo("Plains", 260, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Prey Upon", 143, Rarity.COMMON, mage.cards.p.PreyUpon.class)); cards.add(new SetCardInfo("Price of Fame", 83, Rarity.UNCOMMON, mage.cards.p.PriceOfFame.class)); From a80ed1c66403cbd5bf011ecdfad187e7d60e85d4 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 14:48:14 -0400 Subject: [PATCH 064/140] Implemented Vernadi Shieldmate --- .../src/mage/cards/v/VernadiShieldmate.java | 37 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 38 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/v/VernadiShieldmate.java diff --git a/Mage.Sets/src/mage/cards/v/VernadiShieldmate.java b/Mage.Sets/src/mage/cards/v/VernadiShieldmate.java new file mode 100644 index 00000000000..37f95d9a57d --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/VernadiShieldmate.java @@ -0,0 +1,37 @@ +package mage.cards.v; + +import java.util.UUID; +import mage.MageInt; +import mage.constants.SubType; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author TheElk801 + */ +public final class VernadiShieldmate extends CardImpl { + + public VernadiShieldmate(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G/W}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Vigilance + this.addAbility(VigilanceAbility.getInstance()); + } + + public VernadiShieldmate(final VernadiShieldmate card) { + super(card); + } + + @Override + public VernadiShieldmate copy() { + return new VernadiShieldmate(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 74808784af3..99a4f7844f0 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -229,6 +229,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Unexplained Disappearance", 56, Rarity.COMMON, mage.cards.u.UnexplainedDisappearance.class)); cards.add(new SetCardInfo("Veiled Shade", 88, Rarity.COMMON, mage.cards.v.VeiledShade.class)); cards.add(new SetCardInfo("Venerated Loxodon", 30, Rarity.RARE, mage.cards.v.VeneratedLoxodon.class)); + cards.add(new SetCardInfo("Vernadi Shieldmate", 219, Rarity.COMMON, mage.cards.v.VernadiShieldmate.class)); cards.add(new SetCardInfo("Vivid Revival", 148, Rarity.RARE, mage.cards.v.VividRevival.class)); cards.add(new SetCardInfo("Vraska's Stoneglare", 272, Rarity.RARE, mage.cards.v.VraskasStoneglare.class)); cards.add(new SetCardInfo("Vraska, Golgari Queen", 213, Rarity.MYTHIC, mage.cards.v.VraskaGolgariQueen.class)); From 41dfc01fe5d2215124c85b29786f56707d5e0247 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 14:48:46 -0400 Subject: [PATCH 065/140] Implemented Wild Ceratok --- Mage.Sets/src/mage/cards/w/WildCeratok.java | 32 ++++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 33 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/w/WildCeratok.java diff --git a/Mage.Sets/src/mage/cards/w/WildCeratok.java b/Mage.Sets/src/mage/cards/w/WildCeratok.java new file mode 100644 index 00000000000..9d651116654 --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WildCeratok.java @@ -0,0 +1,32 @@ +package mage.cards.w; + +import java.util.UUID; +import mage.MageInt; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author TheElk801 + */ +public final class WildCeratok extends CardImpl { + + public WildCeratok(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}"); + + this.subtype.add(SubType.RHINO); + this.power = new MageInt(4); + this.toughness = new MageInt(3); + } + + public WildCeratok(final WildCeratok card) { + super(card); + } + + @Override + public WildCeratok copy() { + return new WildCeratok(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 99a4f7844f0..7ca3139f365 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -242,6 +242,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Wee Dragonauts", 214, Rarity.UNCOMMON, mage.cards.w.WeeDragonauts.class)); cards.add(new SetCardInfo("Whisper Agent", 220, Rarity.COMMON, mage.cards.w.WhisperAgent.class)); cards.add(new SetCardInfo("Whispering Snitch", 90, Rarity.UNCOMMON, mage.cards.w.WhisperingSnitch.class)); + cards.add(new SetCardInfo("Wild Ceratok", 150, Rarity.COMMON, mage.cards.w.WildCeratok.class)); cards.add(new SetCardInfo("Wishcoin Crab", 60, Rarity.COMMON, mage.cards.w.WishcoinCrab.class)); cards.add(new SetCardInfo("Wojek Bodyguard", 120, Rarity.COMMON, mage.cards.w.WojekBodyguard.class)); cards.add(new SetCardInfo("Worldsoul Colossus", 215, Rarity.UNCOMMON, mage.cards.w.WorldsoulColossus.class)); From e80da0b23ed16e8e2f3d567d6954bf1ff2a991d4 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 16:23:10 -0400 Subject: [PATCH 066/140] updated GRN spoiler --- Utils/mtg-cards-data.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index b019a303850..baaac838bf9 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -34403,6 +34403,7 @@ Goblin Banneret|Guilds of Ravnica|102|U|{R}|Creature - Goblin Soldier|1|1|Mentor Goblin Cratermaker|Guilds of Ravnica|103|U|{1}{R}|Creature - Goblin Warrior|2|2|{1}, Sacrifice Goblin Cratermaker: Choose one —$• Goblin Cratermaker deals 2 damage to target creature.$• Destroy target colorless nonland permanent.| Goblin Locksmith|Guilds of Ravnica|104|C|{1}{R}|Creature - Goblin Rogue|2|1|Whenever Goblin Locksmith attacks, creatures with defender can't block this turn.| Gravitic Punch|Guilds of Ravnica|105|C|{3}{R}|Sorcery|||Target creature you control deals damage equal to its power to target player.$Jump-start| +Hellkite Whelp|Guilds of Ravnica|106|U|{4}{R}|Creature - Dragon|3|34|Flying$Whenever Hellkite Whelp attacks, it deals 1 damage to target creature defending player controls.| Inescapable Blaze|Guilds of Ravnica|107|U|{4}{R}{R}|Instant|||This spell can't be countered.$Inescapable Flame deals 6 damage to any target.| Lava Coil|Guilds of Ravnica|108|U|{1}{R}|Sorcery|||Lava Coil deals 4 damage to target creature. If that creature would die this turn, exile it instead.| Legion Warboss|Guilds of Ravnica|109|R|{2}{R}|Creature - Goblin Soldier|2|2|Mentor$At the beginning of combat on your turn, create a 1/1 red Goblin creature token. That token gains haste until end of turn and attacks this combat if able.| @@ -34515,7 +34516,7 @@ Worldsoul Colossus|Guilds of Ravnica|215|U|{X}{G}{W}|Creature - Elemental|0|0|Co Fresh-Faced Recruit|Guilds of Ravnica|216|C|{1}{R/W}|Creature - Human Soldier|2|1|As long as it's your turn, Fresh-Faced Recruit has first strike.| Piston-Fist Cyclops|Guilds of Ravnica|217|C|{1}{U/R}{U/R}|Creature - Cyclops|4|3|Defender$As long as you've cast an instant or sorcery spell this turn, Piston-Fist Cyclops can attack as though it didn't have defender.| Pitiless Gorgon|Guilds of Ravnica|218|C|{1}{B/G}{B/G}|Creature - Gorgon|2|2|Deathtouch| -Vernadi Sheildmate|Guilds of Ravnica|219|C|{1}{G/W}|Creature - Human Soldier|2|2|Vigilance| +Vernadi Shieldmate|Guilds of Ravnica|219|C|{1}{G/W}|Creature - Human Soldier|2|2|Vigilance| Whisper Agent|Guilds of Ravnica|220|C|{1}{U/B}{U/B}|Creature - Human Rogue|3|2|Flash$When Whisper Agent enters the battlefield, surveil 1.| Assemble|Guilds of Ravnica|221|R|{4}{G}{W}|Instant|||Create three 2/2 green and white Elf Knight creature tokens with vigilance.| Assure|Guilds of Ravnica|221|R|{G/W}{G/W}|Instant|||Put a +1/+1 counter on target creature. It gains indestructible until end of turn.| From f90a30f947763254fa9ad5224fee3ff50795f3b6 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 16:25:33 -0400 Subject: [PATCH 067/140] Implemented Hellkite Whelp --- Mage.Sets/src/mage/cards/h/HellkiteWhelp.java | 57 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 58 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/h/HellkiteWhelp.java diff --git a/Mage.Sets/src/mage/cards/h/HellkiteWhelp.java b/Mage.Sets/src/mage/cards/h/HellkiteWhelp.java new file mode 100644 index 00000000000..a96308cbdba --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HellkiteWhelp.java @@ -0,0 +1,57 @@ +package mage.cards.h; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.constants.SubType; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.predicate.permanent.DefendingPlayerControlsPredicate; +import mage.target.TargetPermanent; + +/** + * + * @author TheElk801 + */ +public final class HellkiteWhelp extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("creature defending player controls"); + + static { + filter.add(new CardTypePredicate(CardType.CREATURE)); + filter.add(new DefendingPlayerControlsPredicate()); + } + + public HellkiteWhelp(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{R}"); + + this.subtype.add(SubType.DRAGON); + this.power = new MageInt(3); + this.toughness = new MageInt(34); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Whenever Hellkite Whelp attacks, it deals 1 damage to target creature defending player controls. + Ability ability = new AttacksTriggeredAbility( + new DamageTargetEffect(1, "it"), false + ); + ability.addTarget(new TargetPermanent(filter)); + this.addAbility(ability); + } + + public HellkiteWhelp(final HellkiteWhelp card) { + super(card); + } + + @Override + public HellkiteWhelp copy() { + return new HellkiteWhelp(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 7ca3139f365..ae2604fd991 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -119,6 +119,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Hammer Dropper", 176, Rarity.COMMON, mage.cards.h.HammerDropper.class)); cards.add(new SetCardInfo("Hatchery Spider", 132, Rarity.RARE, mage.cards.h.HatcherySpider.class)); cards.add(new SetCardInfo("Healer's Hawk", 14, Rarity.COMMON, mage.cards.h.HealersHawk.class)); + cards.add(new SetCardInfo("Hellkite Whelp", 106, Rarity.UNCOMMON, mage.cards.h.HellkiteWhelp.class)); cards.add(new SetCardInfo("Hired Poisoner", 72, Rarity.COMMON, mage.cards.h.HiredPoisoner.class)); cards.add(new SetCardInfo("Hitchclaw Recluse", 133, Rarity.COMMON, mage.cards.h.HitchclawRecluse.class)); cards.add(new SetCardInfo("House Guildmage", 177, Rarity.UNCOMMON, mage.cards.h.HouseGuildmage.class)); From c3d17025ed3f2ce583e439ebf608d292625126b7 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 16:33:31 -0400 Subject: [PATCH 068/140] Implemented Dazzling Lights --- .../src/mage/cards/d/DazzlingLights.java | 37 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 38 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/d/DazzlingLights.java diff --git a/Mage.Sets/src/mage/cards/d/DazzlingLights.java b/Mage.Sets/src/mage/cards/d/DazzlingLights.java new file mode 100644 index 00000000000..eb398cf7e6b --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DazzlingLights.java @@ -0,0 +1,37 @@ +package mage.cards.d; + +import java.util.UUID; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.keyword.SurveilEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class DazzlingLights extends CardImpl { + + public DazzlingLights(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{U}"); + + // Target creature gets -3/-0 until end of turn. + this.getSpellAbility().addEffect(new BoostTargetEffect(-3, 0, Duration.EndOfTurn)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + + // Surveil 2. + this.getSpellAbility().addEffect(new SurveilEffect(2)); + } + + public DazzlingLights(final DazzlingLights card) { + super(card); + } + + @Override + public DazzlingLights copy() { + return new DazzlingLights(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index ae2604fd991..918e40528e9 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -64,6 +64,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Crushing Canopy", 126, Rarity.COMMON, mage.cards.c.CrushingCanopy.class)); cards.add(new SetCardInfo("Darkblade Agent", 164, Rarity.COMMON, mage.cards.d.DarkbladeAgent.class)); cards.add(new SetCardInfo("Dawn of Hope", 8, Rarity.RARE, mage.cards.d.DawnOfHope.class)); + cards.add(new SetCardInfo("Dazzling Lights", 34, Rarity.COMMON, mage.cards.d.DazzlingLights.class)); cards.add(new SetCardInfo("Dead Weight", 67, Rarity.COMMON, mage.cards.d.DeadWeight.class)); cards.add(new SetCardInfo("Deadly Visit", 68, Rarity.COMMON, mage.cards.d.DeadlyVisit.class)); cards.add(new SetCardInfo("Deafening Clarion", 165, Rarity.RARE, mage.cards.d.DeafeningClarion.class)); From bd43f64842f5dff74ccb757c7d7b5367d298de2a Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 16:34:48 -0400 Subject: [PATCH 069/140] Implemented Fire Urchin --- Mage.Sets/src/mage/cards/f/FireUrchin.java | 46 ++++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 47 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/f/FireUrchin.java diff --git a/Mage.Sets/src/mage/cards/f/FireUrchin.java b/Mage.Sets/src/mage/cards/f/FireUrchin.java new file mode 100644 index 00000000000..1dcb78b5030 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FireUrchin.java @@ -0,0 +1,46 @@ +package mage.cards.f; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.constants.SubType; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.StaticFilters; + +/** + * + * @author TheElk801 + */ +public final class FireUrchin extends CardImpl { + + public FireUrchin(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); + + this.subtype.add(SubType.ELEMENTAL); + this.power = new MageInt(1); + this.toughness = new MageInt(3); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // Whenever you cast an instant or sorcery spell, Fire Urchin gets +1/+0 until end of turn. + this.addAbility(new SpellCastControllerTriggeredAbility( + new BoostSourceEffect(1, 0, Duration.EndOfTurn), + StaticFilters.FILTER_SPELL_AN_INSTANT_OR_SORCERY, false + )); + } + + public FireUrchin(final FireUrchin card) { + super(card); + } + + @Override + public FireUrchin copy() { + return new FireUrchin(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 918e40528e9..1f1f7eb606e 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -93,6 +93,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Expansion // Explosion", 224, Rarity.RARE, mage.cards.e.ExpansionExplosion.class)); cards.add(new SetCardInfo("Fearless Halberdier", 100, Rarity.COMMON, mage.cards.f.FearlessHalberdier.class)); cards.add(new SetCardInfo("Find // Finality", 225, Rarity.RARE, mage.cards.f.FindFinality.class)); + cards.add(new SetCardInfo("Fire Urchin", 101, Rarity.COMMON, mage.cards.f.FireUrchin.class)); cards.add(new SetCardInfo("Firemind's Research", 171, Rarity.RARE, mage.cards.f.FiremindsResearch.class)); cards.add(new SetCardInfo("Flight of Equenauts", 11, Rarity.UNCOMMON, mage.cards.f.FlightOfEquenauts.class)); cards.add(new SetCardInfo("Flower // Flourish", 226, Rarity.UNCOMMON, mage.cards.f.FlowerFlourish.class)); From 49abf639950248424f617e16c1ef6fa80a874628 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 16:37:01 -0400 Subject: [PATCH 070/140] Implemented Grappling Sundew --- .../src/mage/cards/g/GrapplingSundew.java | 55 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 56 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/g/GrapplingSundew.java diff --git a/Mage.Sets/src/mage/cards/g/GrapplingSundew.java b/Mage.Sets/src/mage/cards/g/GrapplingSundew.java new file mode 100644 index 00000000000..961af9c160b --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GrapplingSundew.java @@ -0,0 +1,55 @@ +package mage.cards.g; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.constants.SubType; +import mage.abilities.keyword.DefenderAbility; +import mage.abilities.keyword.IndestructibleAbility; +import mage.abilities.keyword.ReachAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; + +/** + * + * @author TheElk801 + */ +public final class GrapplingSundew extends CardImpl { + + public GrapplingSundew(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{G}"); + + this.subtype.add(SubType.PLANT); + this.power = new MageInt(0); + this.toughness = new MageInt(4); + + // Defender + this.addAbility(DefenderAbility.getInstance()); + + // Reach + this.addAbility(ReachAbility.getInstance()); + + // {4}{G}: Grappling Sundew gains indestructible until end of turn. + this.addAbility(new SimpleActivatedAbility( + Zone.BATTLEFIELD, + new GainAbilitySourceEffect( + IndestructibleAbility.getInstance(), + Duration.EndOfTurn + ), new ManaCostsImpl("{4}{G}") + )); + } + + public GrapplingSundew(final GrapplingSundew card) { + super(card); + } + + @Override + public GrapplingSundew copy() { + return new GrapplingSundew(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 1f1f7eb606e..ed1642bbd19 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -115,6 +115,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Golgari Guildgate", 249, Rarity.COMMON, mage.cards.g.GolgariGuildgate.class)); cards.add(new SetCardInfo("Golgari Locket", 237, Rarity.COMMON, mage.cards.g.GolgariLocket.class)); cards.add(new SetCardInfo("Golgari Raiders", 130, Rarity.UNCOMMON, mage.cards.g.GolgariRaiders.class)); + cards.add(new SetCardInfo("Grappling Sundew", 131, Rarity.UNCOMMON, mage.cards.g.GrapplingSundew.class)); cards.add(new SetCardInfo("Gruesome Menagerie", 71, Rarity.RARE, mage.cards.g.GruesomeMenagerie.class)); cards.add(new SetCardInfo("Guild Summit", 41, Rarity.UNCOMMON, mage.cards.g.GuildSummit.class)); cards.add(new SetCardInfo("Haazda Marshal", 13, Rarity.UNCOMMON, mage.cards.h.HaazdaMarshal.class)); From c9bc7ffaa0c01324724e8d0d3265094321c530a4 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 16:37:54 -0400 Subject: [PATCH 071/140] Implemented Pause for Reflection --- .../src/mage/cards/p/PauseForReflection.java | 35 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 36 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/p/PauseForReflection.java diff --git a/Mage.Sets/src/mage/cards/p/PauseForReflection.java b/Mage.Sets/src/mage/cards/p/PauseForReflection.java new file mode 100644 index 00000000000..cb347f93ed9 --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PauseForReflection.java @@ -0,0 +1,35 @@ +package mage.cards.p; + +import java.util.UUID; +import mage.abilities.effects.common.PreventAllDamageByAllPermanentsEffect; +import mage.abilities.keyword.ConvokeAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; + +/** + * + * @author TheElk801 + */ +public final class PauseForReflection extends CardImpl { + + public PauseForReflection(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{G}"); + + // Convoke + this.addAbility(new ConvokeAbility()); + + // Precent all combat damage that would be dealt this turn. + this.getSpellAbility().addEffect(new PreventAllDamageByAllPermanentsEffect(Duration.EndOfTurn, true)); + } + + public PauseForReflection(final PauseForReflection card) { + super(card); + } + + @Override + public PauseForReflection copy() { + return new PauseForReflection(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index ed1642bbd19..2e6099fa4c8 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -183,6 +183,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Pack's Favor", 139, Rarity.COMMON, mage.cards.p.PacksFavor.class)); cards.add(new SetCardInfo("Parhelion Patrol", 22, Rarity.COMMON, mage.cards.p.ParhelionPatrol.class)); cards.add(new SetCardInfo("Passwall Adept", 50, Rarity.COMMON, mage.cards.p.PasswallAdept.class)); + cards.add(new SetCardInfo("Pause for Reflection", 140, Rarity.COMMON, mage.cards.p.PauseForReflection.class)); cards.add(new SetCardInfo("Piston-Fist Cyclops", 217, Rarity.COMMON, mage.cards.p.PistonFistCyclops.class)); cards.add(new SetCardInfo("Pitiless Gorgon", 218, Rarity.COMMON, mage.cards.p.PitilessGorgon.class)); cards.add(new SetCardInfo("Plains", 260, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); From 170d51cef299a6f7f94005aec2912afde0d69d50 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 16:42:32 -0400 Subject: [PATCH 072/140] Implemented SIlent Dart --- .../src/mage/cards/r/RubblebeltBoar.java | 44 ++++++++++++++++++ Mage.Sets/src/mage/cards/s/SilentDart.java | 45 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 2 + 3 files changed, 91 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/r/RubblebeltBoar.java create mode 100644 Mage.Sets/src/mage/cards/s/SilentDart.java diff --git a/Mage.Sets/src/mage/cards/r/RubblebeltBoar.java b/Mage.Sets/src/mage/cards/r/RubblebeltBoar.java new file mode 100644 index 00000000000..e627e8674c4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RubblebeltBoar.java @@ -0,0 +1,44 @@ +package mage.cards.r; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class RubblebeltBoar extends CardImpl { + + public RubblebeltBoar(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}"); + + this.subtype.add(SubType.BOAR); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // When Rubblebelt Boar enters the battlefield, target creature gets +2/+0 until end of turn. + Ability ability = new EntersBattlefieldTriggeredAbility( + new BoostTargetEffect(2, 0, Duration.EndOfTurn) + ); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public RubblebeltBoar(final RubblebeltBoar card) { + super(card); + } + + @Override + public RubblebeltBoar copy() { + return new RubblebeltBoar(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SilentDart.java b/Mage.Sets/src/mage/cards/s/SilentDart.java new file mode 100644 index 00000000000..652d65c427c --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SilentDart.java @@ -0,0 +1,45 @@ +package mage.cards.s; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class SilentDart extends CardImpl { + + public SilentDart(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{1}"); + + // {4}, {T}, Sacrifice Silent Dart: It deals 3 damage to target creature. + Ability ability = new SimpleActivatedAbility( + Zone.BATTLEFIELD, + new DamageTargetEffect(3, "it"), + new GenericManaCost(4) + ); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public SilentDart(final SilentDart card) { + super(card); + } + + @Override + public SilentDart copy() { + return new SilentDart(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 2e6099fa4c8..afdc6eea643 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -202,12 +202,14 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Ritual of Soot", 84, Rarity.RARE, mage.cards.r.RitualOfSoot.class)); cards.add(new SetCardInfo("Roc Charger", 24, Rarity.UNCOMMON, mage.cards.r.RocCharger.class)); cards.add(new SetCardInfo("Rosemane Centaur", 197, Rarity.COMMON, mage.cards.r.RosemaneCentaur.class)); + cards.add(new SetCardInfo("Rubblebelt Boar", 114, Rarity.COMMON, mage.cards.r.RubblebeltBoar.class)); cards.add(new SetCardInfo("Runaway Steam-Kin", 115, Rarity.RARE, mage.cards.r.RunawaySteamKin.class)); cards.add(new SetCardInfo("Sacred Foundry", 254, Rarity.RARE, mage.cards.s.SacredFoundry.class)); cards.add(new SetCardInfo("Selesnya Guildgate", 255, Rarity.COMMON, mage.cards.s.SelesnyaGuildgate.class)); cards.add(new SetCardInfo("Selesnya Guildgate", 256, Rarity.COMMON, mage.cards.s.SelesnyaGuildgate.class)); cards.add(new SetCardInfo("Selesnya Locket", 240, Rarity.COMMON, mage.cards.s.SelesnyaLocket.class)); cards.add(new SetCardInfo("Siege Wurm", 144, Rarity.COMMON, mage.cards.s.SiegeWurm.class)); + cards.add(new SetCardInfo("Silent Dart", 241, Rarity.UNCOMMON, mage.cards.s.SilentDart.class)); cards.add(new SetCardInfo("Sinister Sabotage", 54, Rarity.UNCOMMON, mage.cards.s.SinisterSabotage.class)); cards.add(new SetCardInfo("Skyknight Legionnaire", 198, Rarity.COMMON, mage.cards.s.SkyknightLegionnaire.class)); cards.add(new SetCardInfo("Sonic Assault", 199, Rarity.COMMON, mage.cards.s.SonicAssault.class)); From 48e545390e33deb6eccfa860101a8c2e0c203801 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 16:46:43 -0400 Subject: [PATCH 073/140] Implemented Urban Utopia --- Mage.Sets/src/mage/cards/u/UrbanUtopia.java | 63 ++++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 64 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/u/UrbanUtopia.java diff --git a/Mage.Sets/src/mage/cards/u/UrbanUtopia.java b/Mage.Sets/src/mage/cards/u/UrbanUtopia.java new file mode 100644 index 00000000000..a6b67b50bb0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/u/UrbanUtopia.java @@ -0,0 +1,63 @@ +package mage.cards.u; + +import java.util.UUID; +import mage.constants.SubType; +import mage.target.common.TargetLandPermanent; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.constants.Outcome; +import mage.target.TargetPermanent; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.mana.AnyColorManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Zone; + +/** + * + * @author TheElk801 + */ +public final class UrbanUtopia extends CardImpl { + + public UrbanUtopia(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{G}"); + + this.subtype.add(SubType.AURA); + + // Enchant Land + TargetPermanent auraTarget = new TargetLandPermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // When Urban Utopia enters the battlefield, draw a card. + this.addAbility(new EntersBattlefieldTriggeredAbility( + new DrawCardSourceControllerEffect(1) + )); + + // Enchanted land has "{T}: Add one mana of any color." + this.addAbility(new SimpleStaticAbility( + Zone.BATTLEFIELD, + new GainAbilityAttachedEffect( + new AnyColorManaAbility(), AttachmentType.AURA + ).setText("Enchanted land has " + + "\"{T}: Add one mana of any color.\"") + )); + } + + public UrbanUtopia(final UrbanUtopia card) { + super(card); + } + + @Override + public UrbanUtopia copy() { + return new UrbanUtopia(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index afdc6eea643..f7a15336120 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -234,6 +234,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Undercity Uprising", 210, Rarity.COMMON, mage.cards.u.UndercityUprising.class)); cards.add(new SetCardInfo("Underrealm Lich", 211, Rarity.MYTHIC, mage.cards.u.UnderrealmLich.class)); cards.add(new SetCardInfo("Unexplained Disappearance", 56, Rarity.COMMON, mage.cards.u.UnexplainedDisappearance.class)); + cards.add(new SetCardInfo("Urban Utopia", 146, Rarity.COMMON, mage.cards.u.UrbanUtopia.class)); cards.add(new SetCardInfo("Veiled Shade", 88, Rarity.COMMON, mage.cards.v.VeiledShade.class)); cards.add(new SetCardInfo("Venerated Loxodon", 30, Rarity.RARE, mage.cards.v.VeneratedLoxodon.class)); cards.add(new SetCardInfo("Vernadi Shieldmate", 219, Rarity.COMMON, mage.cards.v.VernadiShieldmate.class)); From 79813d12248aa6273d1c7b020323c693900ccda3 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 17:00:30 -0400 Subject: [PATCH 074/140] Implemented Capture Sphere --- Mage.Sets/src/mage/cards/c/CaptureSphere.java | 57 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 58 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/CaptureSphere.java diff --git a/Mage.Sets/src/mage/cards/c/CaptureSphere.java b/Mage.Sets/src/mage/cards/c/CaptureSphere.java new file mode 100644 index 00000000000..57225284db4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CaptureSphere.java @@ -0,0 +1,57 @@ +package mage.cards.c; + +import java.util.UUID; +import mage.constants.SubType; +import mage.abilities.keyword.FlashAbility; +import mage.target.common.TargetCreaturePermanent; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.DontUntapInControllersUntapStepEnchantedEffect; +import mage.abilities.effects.common.TapEnchantedEffect; +import mage.constants.Outcome; +import mage.target.TargetPermanent; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; + +/** + * + * @author TheElk801 + */ +public final class CaptureSphere extends CardImpl { + + public CaptureSphere(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{U}"); + + this.subtype.add(SubType.AURA); + + // Flash + this.addAbility(FlashAbility.getInstance()); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // When Capture Sphere enters the battlefield, tap enchanted creature. + this.addAbility(new EntersBattlefieldTriggeredAbility(new TapEnchantedEffect())); + + // Enchanted creature doesn't untap during its controller's untap step. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new DontUntapInControllersUntapStepEnchantedEffect())); + } + + public CaptureSphere(final CaptureSphere card) { + super(card); + } + + @Override + public CaptureSphere copy() { + return new CaptureSphere(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index f7a15336120..c3981a0c3dc 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -45,6 +45,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Bounty Agent", 2, Rarity.RARE, mage.cards.b.BountyAgent.class)); cards.add(new SetCardInfo("Burglar Rat", 64, Rarity.COMMON, mage.cards.b.BurglarRat.class)); cards.add(new SetCardInfo("Camaraderie", 157, Rarity.RARE, mage.cards.c.Camaraderie.class)); + cards.add(new SetCardInfo("Capture Sphere", 31, Rarity.COMMON, mage.cards.c.CaptureSphere.class)); cards.add(new SetCardInfo("Centaur Peacemaker", 158, Rarity.COMMON, mage.cards.c.CentaurPeacemaker.class)); cards.add(new SetCardInfo("Chance for Glory", 159, Rarity.MYTHIC, mage.cards.c.ChanceForGlory.class)); cards.add(new SetCardInfo("Charnel Troll", 160, Rarity.RARE, mage.cards.c.CharnelTroll.class)); From 66c152a2e71465be09cf638513e0ec4b53a408b8 Mon Sep 17 00:00:00 2001 From: jmharmon <37360760+jmharmon@users.noreply.github.com> Date: Wed, 19 Sep 2018 14:00:47 -0700 Subject: [PATCH 075/140] Implement Chamber Sentry --- Mage.Sets/src/mage/cards/c/ChamberSentry.java | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/ChamberSentry.java diff --git a/Mage.Sets/src/mage/cards/c/ChamberSentry.java b/Mage.Sets/src/mage/cards/c/ChamberSentry.java new file mode 100644 index 00000000000..aa5ac14be9b --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/ChamberSentry.java @@ -0,0 +1,57 @@ +package mage.cards.c; + +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect; +import mage.abilities.keyword.SunburstAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.target.common.TargetAnyTarget; + +import java.util.UUID; + +/** + * + * @author jmharmon + */ + +public final class ChamberSentry extends CardImpl { + + public ChamberSentry(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT,CardType.CREATURE}, "{X}"); + + this.subtype.add(SubType.CONSTRUCT); + this.power = new MageInt(0); + this.toughness = new MageInt(0); + + // Chamber Sentry enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it. + this.addAbility(new SunburstAbility(this)); + + // {X}, {T}, Remove X +1/+1 counters from Chamber Sentry: It deals X damage to any target. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(new ManacostVariableValue()), new ManaCostsImpl("{X}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetAnyTarget()); + this.addAbility(ability); + + // {W}{U}{B}{R}{G}: Return Chamber Sentry from your graveyard to your hand. + this.addAbility(new SimpleActivatedAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), new ManaCostsImpl("{W}{U}{B}{R}{G}"))); + } + + public ChamberSentry(final ChamberSentry card) { + super(card); + } + + @Override + public ChamberSentry copy() { + return new ChamberSentry(this); + } +} From 1603f1fe2c1b971ad1c4d0d16a503768eef77f54 Mon Sep 17 00:00:00 2001 From: jmharmon <37360760+jmharmon@users.noreply.github.com> Date: Wed, 19 Sep 2018 14:03:51 -0700 Subject: [PATCH 076/140] Implement Chamber Sentry --- Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index f7a15336120..bc706b86ca0 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -46,6 +46,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Burglar Rat", 64, Rarity.COMMON, mage.cards.b.BurglarRat.class)); cards.add(new SetCardInfo("Camaraderie", 157, Rarity.RARE, mage.cards.c.Camaraderie.class)); cards.add(new SetCardInfo("Centaur Peacemaker", 158, Rarity.COMMON, mage.cards.c.CentaurPeacemaker.class)); + cards.add(new SetCardInfo("Chamber Sentry", 232, Rarity.RARE, mage.cards.c.ChamberSentry.class)); cards.add(new SetCardInfo("Chance for Glory", 159, Rarity.MYTHIC, mage.cards.c.ChanceForGlory.class)); cards.add(new SetCardInfo("Charnel Troll", 160, Rarity.RARE, mage.cards.c.CharnelTroll.class)); cards.add(new SetCardInfo("Chemister's Insight", 32, Rarity.UNCOMMON, mage.cards.c.ChemistersInsight.class)); From 4f4408b6a89fd49bb91a224d956b5bf3ce92cec2 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 17:06:20 -0400 Subject: [PATCH 077/140] Implemented Gravitic Punch --- Mage.Sets/src/mage/cards/g/GraviticPunch.java | 73 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 74 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/g/GraviticPunch.java diff --git a/Mage.Sets/src/mage/cards/g/GraviticPunch.java b/Mage.Sets/src/mage/cards/g/GraviticPunch.java new file mode 100644 index 00000000000..cfd36819b70 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GraviticPunch.java @@ -0,0 +1,73 @@ +package mage.cards.g; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.JumpStartAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetPlayer; +import mage.target.common.TargetControlledCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class GraviticPunch extends CardImpl { + + public GraviticPunch(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{R}"); + + // Target creature you control deals damage equal to its power to target player. + this.getSpellAbility().addEffect(new GraviticPunchEffect()); + this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent()); + this.getSpellAbility().addTarget(new TargetPlayer()); + + // Jump-start + this.addAbility(new JumpStartAbility(this)); + + } + + public GraviticPunch(final GraviticPunch card) { + super(card); + } + + @Override + public GraviticPunch copy() { + return new GraviticPunch(this); + } +} + +class GraviticPunchEffect extends OneShotEffect { + + public GraviticPunchEffect() { + super(Outcome.Benefit); + this.staticText = "Target creature you control deals damage " + + "equal to its power to target player."; + } + + public GraviticPunchEffect(final GraviticPunchEffect effect) { + super(effect); + } + + @Override + public GraviticPunchEffect copy() { + return new GraviticPunchEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent controlledCreature = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source)); + Player player = game.getPlayer(source.getTargets().get(1).getFirstTarget()); + if (player == null || controlledCreature == null) { + return false; + } + player.damage(controlledCreature.getPower().getValue(), controlledCreature.getId(), game, false, true); + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index c3981a0c3dc..7f7e2bba29a 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -117,6 +117,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Golgari Locket", 237, Rarity.COMMON, mage.cards.g.GolgariLocket.class)); cards.add(new SetCardInfo("Golgari Raiders", 130, Rarity.UNCOMMON, mage.cards.g.GolgariRaiders.class)); cards.add(new SetCardInfo("Grappling Sundew", 131, Rarity.UNCOMMON, mage.cards.g.GrapplingSundew.class)); + cards.add(new SetCardInfo("Gravitic Punch", 105, Rarity.COMMON, mage.cards.g.GraviticPunch.class)); cards.add(new SetCardInfo("Gruesome Menagerie", 71, Rarity.RARE, mage.cards.g.GruesomeMenagerie.class)); cards.add(new SetCardInfo("Guild Summit", 41, Rarity.UNCOMMON, mage.cards.g.GuildSummit.class)); cards.add(new SetCardInfo("Haazda Marshal", 13, Rarity.UNCOMMON, mage.cards.h.HaazdaMarshal.class)); From 99bbc4e820accfa9302cc4ce53dcb9db40ff0ec2 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 17:09:35 -0400 Subject: [PATCH 078/140] Implemented Intrusive Packbeast --- .../src/mage/cards/i/IntrusivePackbeast.java | 45 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 2 + 2 files changed, 47 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/i/IntrusivePackbeast.java diff --git a/Mage.Sets/src/mage/cards/i/IntrusivePackbeast.java b/Mage.Sets/src/mage/cards/i/IntrusivePackbeast.java new file mode 100644 index 00000000000..622ac416ae6 --- /dev/null +++ b/Mage.Sets/src/mage/cards/i/IntrusivePackbeast.java @@ -0,0 +1,45 @@ +package mage.cards.i; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.TapTargetEffect; +import mage.constants.SubType; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetOpponentsCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class IntrusivePackbeast extends CardImpl { + + public IntrusivePackbeast(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{W}"); + + this.subtype.add(SubType.BEAST); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Vigilance + this.addAbility(VigilanceAbility.getInstance()); + + // When Intrusive Packbeast enters the battlefield, tap up to two target creatures your opponents control. + Ability ability = new EntersBattlefieldTriggeredAbility(new TapTargetEffect()); + ability.addTarget(new TargetOpponentsCreaturePermanent(0, 2)); + this.addAbility(ability); + } + + public IntrusivePackbeast(final IntrusivePackbeast card) { + super(card); + } + + @Override + public IntrusivePackbeast copy() { + return new IntrusivePackbeast(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 7f7e2bba29a..1d7caf24984 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -133,8 +133,10 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Impervious Greatwurm", 273, Rarity.MYTHIC, mage.cards.i.ImperviousGreatwurm.class)); cards.add(new SetCardInfo("Inescapable Blaze", 107, Rarity.UNCOMMON, mage.cards.i.InescapableBlaze.class)); cards.add(new SetCardInfo("Integrity // Intervention", 227, Rarity.UNCOMMON, mage.cards.i.IntegrityIntervention.class)); + cards.add(new SetCardInfo("Intrusive Packbeast", 17, Rarity.COMMON, mage.cards.i.IntrusivePackbeast.class)); cards.add(new SetCardInfo("Invert // Invent", 228, Rarity.UNCOMMON, mage.cards.i.InvertInvent.class)); cards.add(new SetCardInfo("Inspiring Unicorn", 16, Rarity.UNCOMMON, mage.cards.i.InspiringUnicorn.class)); + cards.add(new SetCardInfo("Intrusive Packbeast", 17, Rarity.COMMON, mage.cards.i.IntrusivePackbeast.class)); cards.add(new SetCardInfo("Ionize", 179, Rarity.RARE, mage.cards.i.Ionize.class)); cards.add(new SetCardInfo("Ironshell Beetle", 134, Rarity.COMMON, mage.cards.i.IronshellBeetle.class)); cards.add(new SetCardInfo("Island", 261, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); From 444833955cebe63496b9a18f4a9be2e61675e4ce Mon Sep 17 00:00:00 2001 From: m-d-an Date: Wed, 19 Sep 2018 23:13:43 +0200 Subject: [PATCH 079/140] fixed a bug in the card Ionize (GRN), where the player was not able to select a target spell to counter --- Mage.Sets/src/mage/cards/i/Ionize.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/Mage.Sets/src/mage/cards/i/Ionize.java b/Mage.Sets/src/mage/cards/i/Ionize.java index 4c89881a47e..ac7a6c3d469 100644 --- a/Mage.Sets/src/mage/cards/i/Ionize.java +++ b/Mage.Sets/src/mage/cards/i/Ionize.java @@ -9,7 +9,9 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.game.Game; +import mage.game.stack.Spell; import mage.players.Player; +import mage.target.TargetSpell; /** * @@ -21,6 +23,7 @@ public final class Ionize extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{U}{R}"); // Counter target spell. Ionize deals 2 damage to that spell's controller. + this.getSpellAbility().addTarget(new TargetSpell()); this.getSpellAbility().addEffect(new IonizeEffect()); } @@ -53,11 +56,16 @@ class IonizeEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - Player player = game.getPlayer(game.getControllerId(source.getSourceId())); - new CounterTargetEffect().apply(game, source); - if (player == null) { - return false; + boolean result = false; + Spell spell = game.getStack().getSpell(source.getFirstTarget()); + if (spell != null) { + Player spellController = game.getPlayer(spell.getControllerId()); + + result = game.getStack().counter(source.getFirstTarget(), source.getSourceId(), game); + if (spellController != null) { + spellController.damage(2, source.getSourceId(), game, false, true); + } } - return player.damage(2, source.getSourceId(), game, false, true) > 0; + return result; } } From cd5b094271c8f7aed8345495f026f8cef51e0d03 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 17:15:24 -0400 Subject: [PATCH 080/140] Implemented Portcullis Vine --- .../src/mage/cards/p/PortcullisVine.java | 64 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 65 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/p/PortcullisVine.java diff --git a/Mage.Sets/src/mage/cards/p/PortcullisVine.java b/Mage.Sets/src/mage/cards/p/PortcullisVine.java new file mode 100644 index 00000000000..3d72e9e4d60 --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PortcullisVine.java @@ -0,0 +1,64 @@ +package mage.cards.p; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.constants.SubType; +import mage.abilities.keyword.DefenderAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.AbilityPredicate; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author TheElk801 + */ +public final class PortcullisVine extends CardImpl { + + private static final FilterControlledPermanent filter + = new FilterControlledCreaturePermanent("a creature with defender"); + + static { + filter.add(new AbilityPredicate(DefenderAbility.class)); + } + + public PortcullisVine(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}"); + + this.subtype.add(SubType.PLANT); + this.subtype.add(SubType.WALL); + this.power = new MageInt(0); + this.toughness = new MageInt(3); + + // Defender + this.addAbility(DefenderAbility.getInstance()); + + // {2}, {T}, Sacrifice a creature with defender: Draw a card. + Ability ability = new SimpleActivatedAbility( + new DrawCardSourceControllerEffect(1), new GenericManaCost(2) + ); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeTargetCost( + new TargetControlledPermanent(filter) + )); + this.addAbility(ability); + } + + public PortcullisVine(final PortcullisVine card) { + super(card); + } + + @Override + public PortcullisVine copy() { + return new PortcullisVine(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 1d7caf24984..371fdf4b692 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -191,6 +191,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Piston-Fist Cyclops", 217, Rarity.COMMON, mage.cards.p.PistonFistCyclops.class)); cards.add(new SetCardInfo("Pitiless Gorgon", 218, Rarity.COMMON, mage.cards.p.PitilessGorgon.class)); cards.add(new SetCardInfo("Plains", 260, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Portcullis Vine", 142, Rarity.COMMON, mage.cards.p.PortcullisVine.class)); cards.add(new SetCardInfo("Prey Upon", 143, Rarity.COMMON, mage.cards.p.PreyUpon.class)); cards.add(new SetCardInfo("Price of Fame", 83, Rarity.UNCOMMON, mage.cards.p.PriceOfFame.class)); cards.add(new SetCardInfo("Quasiduplicate", 51, Rarity.RARE, mage.cards.q.Quasiduplicate.class)); From 1e8734db8e49a7f4efcc88b8602ed1824a190716 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 17:17:47 -0400 Subject: [PATCH 081/140] Implemented Tenth District Guard --- .../src/mage/cards/t/TenthDistrictGuard.java | 45 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 46 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/t/TenthDistrictGuard.java diff --git a/Mage.Sets/src/mage/cards/t/TenthDistrictGuard.java b/Mage.Sets/src/mage/cards/t/TenthDistrictGuard.java new file mode 100644 index 00000000000..805039d8043 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TenthDistrictGuard.java @@ -0,0 +1,45 @@ +package mage.cards.t; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class TenthDistrictGuard extends CardImpl { + + public TenthDistrictGuard(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // When Tenth District Guard enters the battlefield, target creature gets +0/+1 until end of turn. + Ability ability = new EntersBattlefieldTriggeredAbility( + new BoostTargetEffect(0, 1, Duration.EndOfTurn) + ); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public TenthDistrictGuard(final TenthDistrictGuard card) { + super(card); + } + + @Override + public TenthDistrictGuard copy() { + return new TenthDistrictGuard(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 371fdf4b692..ed5459dc594 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -232,6 +232,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Sworn Companions", 27, Rarity.COMMON, mage.cards.s.SwornCompanions.class)); cards.add(new SetCardInfo("Tajic, Legion's Edge", 204, Rarity.RARE, mage.cards.t.TajicLegionsEdge.class)); cards.add(new SetCardInfo("Temple Garden", 258, Rarity.RARE, mage.cards.t.TempleGarden.class)); + cards.add(new SetCardInfo("Tenth District Guard", 29, Rarity.COMMON, mage.cards.t.TenthDistrictGuard.class)); cards.add(new SetCardInfo("Thought Erasure", 206, Rarity.UNCOMMON, mage.cards.t.ThoughtErasure.class)); cards.add(new SetCardInfo("Thoughtbound Phantasm", 55, Rarity.UNCOMMON, mage.cards.t.ThoughtboundPhantasm.class)); cards.add(new SetCardInfo("Trostani Discordant", 208, Rarity.MYTHIC, mage.cards.t.TrostaniDiscordant.class)); From b32b3d275e41a661ae17391efdf085f73e823904 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 17:19:00 -0400 Subject: [PATCH 082/140] Implemented Vedalken Mesmerist --- .../src/mage/cards/v/VedalkenMesmerist.java | 45 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 46 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/v/VedalkenMesmerist.java diff --git a/Mage.Sets/src/mage/cards/v/VedalkenMesmerist.java b/Mage.Sets/src/mage/cards/v/VedalkenMesmerist.java new file mode 100644 index 00000000000..ad7fe4d57ec --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/VedalkenMesmerist.java @@ -0,0 +1,45 @@ +package mage.cards.v; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.target.common.TargetOpponentsCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class VedalkenMesmerist extends CardImpl { + + public VedalkenMesmerist(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}"); + + this.subtype.add(SubType.VEDALKEN); + this.subtype.add(SubType.WIZARD); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Whenever Vedalken Mesmerist attacks, target creature an opponent controls gets -2/-0 until end of turn. + Ability ability = new AttacksTriggeredAbility( + new BoostTargetEffect(-2, 0, Duration.EndOfTurn), false + ); + ability.addTarget(new TargetOpponentsCreaturePermanent()); + this.addAbility(ability); + } + + public VedalkenMesmerist(final VedalkenMesmerist card) { + super(card); + } + + @Override + public VedalkenMesmerist copy() { + return new VedalkenMesmerist(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index ed5459dc594..499a7a7aea1 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -241,6 +241,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Underrealm Lich", 211, Rarity.MYTHIC, mage.cards.u.UnderrealmLich.class)); cards.add(new SetCardInfo("Unexplained Disappearance", 56, Rarity.COMMON, mage.cards.u.UnexplainedDisappearance.class)); cards.add(new SetCardInfo("Urban Utopia", 146, Rarity.COMMON, mage.cards.u.UrbanUtopia.class)); + cards.add(new SetCardInfo("Vedalken Mesmerist", 57, Rarity.COMMON, mage.cards.v.VedalkenMesmerist.class)); cards.add(new SetCardInfo("Veiled Shade", 88, Rarity.COMMON, mage.cards.v.VeiledShade.class)); cards.add(new SetCardInfo("Venerated Loxodon", 30, Rarity.RARE, mage.cards.v.VeneratedLoxodon.class)); cards.add(new SetCardInfo("Vernadi Shieldmate", 219, Rarity.COMMON, mage.cards.v.VernadiShieldmate.class)); From 509edbb10afb0345606ead88b25d5d0e56429f42 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 17:35:11 -0400 Subject: [PATCH 083/140] Implemented Mephitic Vapors --- .../src/mage/cards/m/MephiticVapors.java | 35 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 36 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/m/MephiticVapors.java diff --git a/Mage.Sets/src/mage/cards/m/MephiticVapors.java b/Mage.Sets/src/mage/cards/m/MephiticVapors.java new file mode 100644 index 00000000000..ec478c8d4ad --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MephiticVapors.java @@ -0,0 +1,35 @@ +package mage.cards.m; + +import java.util.UUID; +import mage.abilities.effects.common.continuous.BoostAllEffect; +import mage.abilities.effects.keyword.SurveilEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; + +/** + * + * @author TheElk801 + */ +public final class MephiticVapors extends CardImpl { + + public MephiticVapors(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{B}"); + + // All creatures get -1/-1 until end of turn. + this.getSpellAbility().addEffect(new BoostAllEffect(-1, -1, Duration.EndOfTurn)); + + // Surveil 2. + this.getSpellAbility().addEffect(new SurveilEffect(2)); + } + + public MephiticVapors(final MephiticVapors card) { + super(card); + } + + @Override + public MephiticVapors copy() { + return new MephiticVapors(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 499a7a7aea1..7f6d6b3caa6 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -165,6 +165,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Mausoleum Secrets", 75, Rarity.RARE, mage.cards.m.MausoleumSecrets.class)); cards.add(new SetCardInfo("Maximize Altitude", 43, Rarity.COMMON, mage.cards.m.MaximizeAltitude.class)); cards.add(new SetCardInfo("Maximize Velocity", 111, Rarity.COMMON, mage.cards.m.MaximizeVelocity.class)); + cards.add(new SetCardInfo("Mephitic Vapors", 76, Rarity.COMMON, mage.cards.m.MephiticVapors.class)); cards.add(new SetCardInfo("Midnight Reaper", 77, Rarity.RARE, mage.cards.m.MidnightReaper.class)); cards.add(new SetCardInfo("Might of the Masses", 137, Rarity.UNCOMMON, mage.cards.m.MightOfTheMasses.class)); cards.add(new SetCardInfo("Mission Briefing", 44, Rarity.RARE, mage.cards.m.MissionBriefing.class)); From 68f891ae1273e8edc19db8384bce67191ae3204f Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 17:36:53 -0400 Subject: [PATCH 084/140] Implemented Ornery Goblin --- Mage.Sets/src/mage/cards/o/OrneryGoblin.java | 40 ++++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 41 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/o/OrneryGoblin.java diff --git a/Mage.Sets/src/mage/cards/o/OrneryGoblin.java b/Mage.Sets/src/mage/cards/o/OrneryGoblin.java new file mode 100644 index 00000000000..7e56c1249a8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/o/OrneryGoblin.java @@ -0,0 +1,40 @@ +package mage.cards.o; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.BlocksOrBecomesBlockedTriggeredAbility; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author TheElk801 + */ +public final class OrneryGoblin extends CardImpl { + + public OrneryGoblin(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); + + this.subtype.add(SubType.GOBLIN); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Whenever Ornery Goblin blocks or becomes blocked by a creature, Ornery Goblin deals 1 damage to that creature. + this.addAbility(new BlocksOrBecomesBlockedTriggeredAbility( + new DamageTargetEffect(1, true, "that creature"), false + )); + } + + public OrneryGoblin(final OrneryGoblin card) { + super(card); + } + + @Override + public OrneryGoblin copy() { + return new OrneryGoblin(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 7f6d6b3caa6..63e32e0341c 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -184,6 +184,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Nullhide Ferox", 138, Rarity.MYTHIC, mage.cards.n.NullhideFerox.class)); cards.add(new SetCardInfo("Ochran Assassin", 194, Rarity.UNCOMMON, mage.cards.o.OchranAssassin.class)); cards.add(new SetCardInfo("Omnispell Adept", 49, Rarity.RARE, mage.cards.o.OmnispellAdept.class)); + cards.add(new SetCardInfo("Ornery Goblin", 112, Rarity.COMMON, mage.cards.o.OrneryGoblin.class)); cards.add(new SetCardInfo("Overgrown Tomb", 253, Rarity.RARE, mage.cards.o.OvergrownTomb.class)); cards.add(new SetCardInfo("Pack's Favor", 139, Rarity.COMMON, mage.cards.p.PacksFavor.class)); cards.add(new SetCardInfo("Parhelion Patrol", 22, Rarity.COMMON, mage.cards.p.ParhelionPatrol.class)); From 84d587868efc24e4f20fc71cc5d1a19097b91515 Mon Sep 17 00:00:00 2001 From: jmharmon <37360760+jmharmon@users.noreply.github.com> Date: Wed, 19 Sep 2018 14:38:55 -0700 Subject: [PATCH 085/140] Update ChamberSentry.java --- Mage.Sets/src/mage/cards/c/ChamberSentry.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/c/ChamberSentry.java b/Mage.Sets/src/mage/cards/c/ChamberSentry.java index aa5ac14be9b..3cb86b0e9ad 100644 --- a/Mage.Sets/src/mage/cards/c/ChamberSentry.java +++ b/Mage.Sets/src/mage/cards/c/ChamberSentry.java @@ -34,7 +34,7 @@ public final class ChamberSentry extends CardImpl { this.toughness = new MageInt(0); // Chamber Sentry enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it. - this.addAbility(new SunburstAbility(this)); + this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(), ColorsOfManaSpentToCastCount.getInstance(), true))); // {X}, {T}, Remove X +1/+1 counters from Chamber Sentry: It deals X damage to any target. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(new ManacostVariableValue()), new ManaCostsImpl("{X}")); From 7bf92cea1935fdd50ec3a03c8f7e37f7dd4a8c2f Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 17:47:39 -0400 Subject: [PATCH 086/140] Implemented Skyline Scout --- .../src/mage/cards/r/RampagingMonument.java | 53 +++++++++++++++++++ Mage.Sets/src/mage/cards/s/SkylineScout.java | 47 ++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 2 + 3 files changed, 102 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/r/RampagingMonument.java create mode 100644 Mage.Sets/src/mage/cards/s/SkylineScout.java diff --git a/Mage.Sets/src/mage/cards/r/RampagingMonument.java b/Mage.Sets/src/mage/cards/r/RampagingMonument.java new file mode 100644 index 00000000000..53658be8759 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RampagingMonument.java @@ -0,0 +1,53 @@ +package mage.cards.r; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.constants.SubType; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.counters.CounterType; +import mage.filter.StaticFilters; + +/** + * + * @author TheElk801 + */ +public final class RampagingMonument extends CardImpl { + + public RampagingMonument(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{4}"); + + this.subtype.add(SubType.CLERIC); + this.power = new MageInt(0); + this.toughness = new MageInt(0); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // Rampaging Monument enters the battlefield with three +1/+1 counters on it. + this.addAbility(new EntersBattlefieldAbility( + new AddCountersSourceEffect(CounterType.P1P1.createInstance(3)), + "{this} enters the battlefield with three +1/+1 counters on it" + )); + + // Whenever you cast a multicolored spell, put a +1/+1 counter on Rampaging Monument. + this.addAbility(new SpellCastControllerTriggeredAbility( + new AddCountersSourceEffect(CounterType.P1P1.createInstance()), + StaticFilters.FILTER_SPELL_A_MULTICOLORED, false + )); + } + + public RampagingMonument(final RampagingMonument card) { + super(card); + } + + @Override + public RampagingMonument copy() { + return new RampagingMonument(this); + } +} diff --git a/Mage.Sets/src/mage/cards/s/SkylineScout.java b/Mage.Sets/src/mage/cards/s/SkylineScout.java new file mode 100644 index 00000000000..6cbb0a41ac2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SkylineScout.java @@ -0,0 +1,47 @@ +package mage.cards.s; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DoIfCostPaid; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; + +/** + * + * @author TheElk801 + */ +public final class SkylineScout extends CardImpl { + + public SkylineScout(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{W}"); + + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.SCOUT); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Whenever Skyline Scout attacks, you may pay {1}{W}. If you do, it gains flying until end of turn. + this.addAbility(new AttacksTriggeredAbility(new DoIfCostPaid( + new GainAbilitySourceEffect( + FlyingAbility.getInstance(), + Duration.EndOfTurn + ), new ManaCostsImpl("{1}{W}") + ), false)); + } + + public SkylineScout(final SkylineScout card) { + super(card); + } + + @Override + public SkylineScout copy() { + return new SkylineScout(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 63e32e0341c..d0680b71c65 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -202,6 +202,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Ral's Staticaster", 268, Rarity.UNCOMMON, mage.cards.r.RalsStaticaster.class)); cards.add(new SetCardInfo("Ral, Caller of Storms", 265, Rarity.MYTHIC, mage.cards.r.RalCallerOfStorms.class)); cards.add(new SetCardInfo("Ral, Izzet Viceroy", 195, Rarity.MYTHIC, mage.cards.r.RalIzzetViceroy.class)); + cards.add(new SetCardInfo("Rampaging Monument", 239, Rarity.UNCOMMON, mage.cards.r.RampagingMonument.class)); cards.add(new SetCardInfo("Response // Resurgence", 229, Rarity.RARE, mage.cards.r.ResponseResurgence.class)); cards.add(new SetCardInfo("Rhizome Lurcher", 196, Rarity.COMMON, mage.cards.r.RhizomeLurcher.class)); cards.add(new SetCardInfo("Righteous Blow", 23, Rarity.COMMON, mage.cards.r.RighteousBlow.class)); @@ -219,6 +220,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Silent Dart", 241, Rarity.UNCOMMON, mage.cards.s.SilentDart.class)); cards.add(new SetCardInfo("Sinister Sabotage", 54, Rarity.UNCOMMON, mage.cards.s.SinisterSabotage.class)); cards.add(new SetCardInfo("Skyknight Legionnaire", 198, Rarity.COMMON, mage.cards.s.SkyknightLegionnaire.class)); + cards.add(new SetCardInfo("Skyline Scout", 25, Rarity.COMMON, mage.cards.s.SkylineScout.class)); cards.add(new SetCardInfo("Sonic Assault", 199, Rarity.COMMON, mage.cards.s.SonicAssault.class)); cards.add(new SetCardInfo("Spinal Centipede", 86, Rarity.COMMON, mage.cards.s.SpinalCentipede.class)); cards.add(new SetCardInfo("Sprouting Renewal", 145, Rarity.UNCOMMON, mage.cards.s.SproutingRenewal.class)); From c66536aed80cd4bc30361dba95b02c8e5a92e0a3 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 17:50:57 -0400 Subject: [PATCH 087/140] Implemented Smelt-War Minotaur --- .../src/mage/cards/s/SmeltWarMinotaur.java | 47 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 48 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SmeltWarMinotaur.java diff --git a/Mage.Sets/src/mage/cards/s/SmeltWarMinotaur.java b/Mage.Sets/src/mage/cards/s/SmeltWarMinotaur.java new file mode 100644 index 00000000000..0063190f201 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SmeltWarMinotaur.java @@ -0,0 +1,47 @@ +package mage.cards.s; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.common.combat.CantBlockTargetEffect; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.StaticFilters; +import mage.target.common.TargetOpponentsCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class SmeltWarMinotaur extends CardImpl { + + public SmeltWarMinotaur(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); + + this.subtype.add(SubType.MINOTAUR); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Whenever you cast an instant or sorcery spell, target creature an opponent controls can't block this turn. + Ability ability = new SpellCastControllerTriggeredAbility( + new CantBlockTargetEffect(Duration.EndOfTurn), + StaticFilters.FILTER_SPELLS_INSTANT_OR_SORCERY, false + ); + ability.addTarget(new TargetOpponentsCreaturePermanent()); + this.addAbility(ability); + } + + public SmeltWarMinotaur(final SmeltWarMinotaur card) { + super(card); + } + + @Override + public SmeltWarMinotaur copy() { + return new SmeltWarMinotaur(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index d0680b71c65..b8bb6fba946 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -221,6 +221,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Sinister Sabotage", 54, Rarity.UNCOMMON, mage.cards.s.SinisterSabotage.class)); cards.add(new SetCardInfo("Skyknight Legionnaire", 198, Rarity.COMMON, mage.cards.s.SkyknightLegionnaire.class)); cards.add(new SetCardInfo("Skyline Scout", 25, Rarity.COMMON, mage.cards.s.SkylineScout.class)); + cards.add(new SetCardInfo("Smelt-War Minotaur", 116, Rarity.UNCOMMON, mage.cards.s.SmeltWarMinotaur.class)); cards.add(new SetCardInfo("Sonic Assault", 199, Rarity.COMMON, mage.cards.s.SonicAssault.class)); cards.add(new SetCardInfo("Spinal Centipede", 86, Rarity.COMMON, mage.cards.s.SpinalCentipede.class)); cards.add(new SetCardInfo("Sprouting Renewal", 145, Rarity.UNCOMMON, mage.cards.s.SproutingRenewal.class)); From 0cc6f911f60bba35a5dd2c5a5d5e478b7100a1d2 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 18:00:38 -0400 Subject: [PATCH 088/140] Implemented Take Heart --- Mage.Sets/src/mage/cards/t/TakeHeart.java | 50 ++++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 51 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/t/TakeHeart.java diff --git a/Mage.Sets/src/mage/cards/t/TakeHeart.java b/Mage.Sets/src/mage/cards/t/TakeHeart.java new file mode 100644 index 00000000000..b57596a3632 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TakeHeart.java @@ -0,0 +1,50 @@ +package mage.cards.t; + +import java.util.UUID; +import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.permanent.AttackingPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class TakeHeart extends CardImpl { + + private static final FilterPermanent filter + = new FilterControlledCreaturePermanent(); + + static { + filter.add(new AttackingPredicate()); + } + + public TakeHeart(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{W}"); + + // Target creature gets +2/+2 until end of turn. You gain 1 life for each attacking creature you control. + this.getSpellAbility().addEffect( + new BoostTargetEffect(2, 2, Duration.EndOfTurn) + ); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + this.getSpellAbility().addEffect(new GainLifeEffect( + new PermanentsOnBattlefieldCount(filter) + ).setText("You gain 1 life for each attacking creature you control.")); + } + + public TakeHeart(final TakeHeart card) { + super(card); + } + + @Override + public TakeHeart copy() { + return new TakeHeart(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index b8bb6fba946..cc5475f3d54 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -236,6 +236,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Swiftblade Vindicator", 203, Rarity.RARE, mage.cards.s.SwiftbladeVindicator.class)); cards.add(new SetCardInfo("Sworn Companions", 27, Rarity.COMMON, mage.cards.s.SwornCompanions.class)); cards.add(new SetCardInfo("Tajic, Legion's Edge", 204, Rarity.RARE, mage.cards.t.TajicLegionsEdge.class)); + cards.add(new SetCardInfo("Take Heart", 28, Rarity.COMMON, mage.cards.t.TakeHeart.class)); cards.add(new SetCardInfo("Temple Garden", 258, Rarity.RARE, mage.cards.t.TempleGarden.class)); cards.add(new SetCardInfo("Tenth District Guard", 29, Rarity.COMMON, mage.cards.t.TenthDistrictGuard.class)); cards.add(new SetCardInfo("Thought Erasure", 206, Rarity.UNCOMMON, mage.cards.t.ThoughtErasure.class)); From 97a720e65c0e331498819388b0e2a15e9b13220f Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 18:06:56 -0400 Subject: [PATCH 089/140] Implemented Torch Courier --- Mage.Sets/src/mage/cards/t/TorchCourier.java | 62 ++++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 63 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/t/TorchCourier.java diff --git a/Mage.Sets/src/mage/cards/t/TorchCourier.java b/Mage.Sets/src/mage/cards/t/TorchCourier.java new file mode 100644 index 00000000000..24566bcde9e --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TorchCourier.java @@ -0,0 +1,62 @@ +package mage.cards.t; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.constants.SubType; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.target.TargetPermanent; + +/** + * + * @author TheElk801 + */ +public final class TorchCourier extends CardImpl { + + private static final FilterPermanent filter + = new FilterCreaturePermanent("another target creature"); + + static { + filter.add(new AnotherPredicate()); + } + + public TorchCourier(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}"); + + this.subtype.add(SubType.GOBLIN); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Haste + this.addAbility(HasteAbility.getInstance()); + + // Sacrifice Torch Courier: Another target creature gains haste until end of turn. + Ability ability = new SimpleActivatedAbility( + new GainAbilityTargetEffect( + HasteAbility.getInstance(), + Duration.EndOfTurn + ), new SacrificeSourceCost() + ); + ability.addTarget(new TargetPermanent(filter)); + this.addAbility(ability); + } + + public TorchCourier(final TorchCourier card) { + super(card); + } + + @Override + public TorchCourier copy() { + return new TorchCourier(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index cc5475f3d54..e411d626920 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -241,6 +241,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Tenth District Guard", 29, Rarity.COMMON, mage.cards.t.TenthDistrictGuard.class)); cards.add(new SetCardInfo("Thought Erasure", 206, Rarity.UNCOMMON, mage.cards.t.ThoughtErasure.class)); cards.add(new SetCardInfo("Thoughtbound Phantasm", 55, Rarity.UNCOMMON, mage.cards.t.ThoughtboundPhantasm.class)); + cards.add(new SetCardInfo("Torch Courier", 119, Rarity.COMMON, mage.cards.t.TorchCourier.class)); cards.add(new SetCardInfo("Trostani Discordant", 208, Rarity.MYTHIC, mage.cards.t.TrostaniDiscordant.class)); cards.add(new SetCardInfo("Truefire Captain", 209, Rarity.UNCOMMON, mage.cards.t.TruefireCaptain.class)); cards.add(new SetCardInfo("Undercity Uprising", 210, Rarity.COMMON, mage.cards.u.UndercityUprising.class)); From 3ca55d866cb9fc51ffffd1c47c73aa4dfeb4db45 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 18:07:34 -0400 Subject: [PATCH 090/140] updated GRN spoiler --- Utils/mtg-cards-data.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index baaac838bf9..327b1b66a4b 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -34392,7 +34392,7 @@ Arclight Phoenix|Guilds of Ravnica|91|M|{3}{R}|Creature - Phoenix|3|2|Flying, ha Barging Sergeant|Guilds of Ravnica|92|C|{4}{R}|Creature - Minotaur Soldier|4|2|Haste$Mentor| Book Devourer|Guilds of Ravnica|93|U|{5}{R}|Creature - Beast|4|5|Trample$Whenever Book Devourer deals combat damage to a player, you may discard all the cards in your hand. If you do, draw that many cards.| Command the Storm|Guilds of Ravnica|94|C|{4}{R}|Instant|||Command the Storm deals 5 damage to target creature.| -Cosmotronic Wave|Guilds of Ravnica|95|C|{3}{B}|Sorcery|||Cosmotronic Wave deals 1 damage to each creature your opponents control. Creatures your opponents control can't block this turn.| +Cosmotronic Wave|Guilds of Ravnica|95|C|{3}{R}|Sorcery|||Cosmotronic Wave deals 1 damage to each creature your opponents control. Creatures your opponents control can't block this turn.| Direct Current|Guilds of Ravnica|96|C|{1}{R}{R}|Sorcery|||Direct Current deals 2 damage to any target.$Jump-start| Electrostatic Field|Guilds of Ravnica|97|U|{1}{R}|Creature - Wall|0|4|Defender$When you cast an instant or sorcery spell, Electrostatic Field deals 1 damage to each opponent.| Erratic Cyclops|Guilds of Ravnica|98|R|{3}{R}|Creature - Cyclops Shaman|0|8|Trample$Whenever you cast an instant or sorcery spell, Erratic Cyclops gets +X/+0 until end of turn, where X is that spell's converted mana cost.| From f267152200a9f156f3a034f2f22f43e2ff6bf108 Mon Sep 17 00:00:00 2001 From: jmharmon <37360760+jmharmon@users.noreply.github.com> Date: Wed, 19 Sep 2018 15:26:01 -0700 Subject: [PATCH 091/140] Update ChamberSentry.java --- Mage.Sets/src/mage/cards/c/ChamberSentry.java | 78 ++++++++++++++++++- 1 file changed, 76 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/cards/c/ChamberSentry.java b/Mage.Sets/src/mage/cards/c/ChamberSentry.java index 3cb86b0e9ad..1cf6c1fd911 100644 --- a/Mage.Sets/src/mage/cards/c/ChamberSentry.java +++ b/Mage.Sets/src/mage/cards/c/ChamberSentry.java @@ -2,19 +2,27 @@ package mage.cards.c; import mage.MageInt; import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldAbility; import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.Cost; +import mage.abilities.costs.VariableCostImpl; +import mage.abilities.costs.common.RemoveCountersSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.ColorsOfManaSpentToCastCount; import mage.abilities.dynamicvalue.common.ManacostVariableValue; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect; -import mage.abilities.keyword.SunburstAbility; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SubType; import mage.constants.Zone; +import mage.counters.Counter; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.permanent.Permanent; import mage.target.common.TargetAnyTarget; import java.util.UUID; @@ -39,6 +47,7 @@ public final class ChamberSentry extends CardImpl { // {X}, {T}, Remove X +1/+1 counters from Chamber Sentry: It deals X damage to any target. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(new ManacostVariableValue()), new ManaCostsImpl("{X}")); ability.addCost(new TapSourceCost()); + ability.addCost(new ChamberSentryRemoveVariableCountersSourceCost(CounterType.P1P1.createInstance())); ability.addTarget(new TargetAnyTarget()); this.addAbility(ability); @@ -55,3 +64,68 @@ public final class ChamberSentry extends CardImpl { return new ChamberSentry(this); } } + +class ChamberSentryRemoveVariableCountersSourceCost extends VariableCostImpl { + + protected int minimalCountersToPay = 0; + private String counterName; + + public ChamberSentryRemoveVariableCountersSourceCost(Counter counter) { + this(counter, 0); + } + + public ChamberSentryRemoveVariableCountersSourceCost(Counter counter, String text) { + this(counter, 0,text); + } + + public ChamberSentryRemoveVariableCountersSourceCost(Counter counter, int minimalCountersToPay) { + this(counter, minimalCountersToPay, ""); + } + + public ChamberSentryRemoveVariableCountersSourceCost(Counter counter, int minimalCountersToPay, String text) { + super(counter.getName() + " counters to remove"); + this.minimalCountersToPay = minimalCountersToPay; + this.counterName = counter.getName(); + if (text == null || text.isEmpty()) { + this.text = "Remove X " + counterName + " counters from {this}"; + } else { + this.text = text; + } + } + + public ChamberSentryRemoveVariableCountersSourceCost(final ChamberSentryRemoveVariableCountersSourceCost cost) { + super(cost); + this.minimalCountersToPay = cost.minimalCountersToPay; + this.counterName = cost.counterName; + } + + @Override + public ChamberSentryRemoveVariableCountersSourceCost copy() { + return new ChamberSentryRemoveVariableCountersSourceCost(this); + } + + @Override + public Cost getFixedCostsFromAnnouncedValue(int xValue) { + return new RemoveCountersSourceCost(new Counter(counterName, xValue)); + } + + @Override + public int getMinValue(Ability source, Game game) { + return minimalCountersToPay; + } + + @Override + public int getMaxValue(Ability source, Game game) { + int maxValue = 0; + Permanent permanent = game.getPermanent(source.getSourceId()); + if (permanent != null) { + maxValue = permanent.getCounters(game).getCount(counterName); + } + return maxValue; + } + + @Override + public int announceXValue(Ability source, Game game) { + return source.getManaCostsToPay().getX(); + } +} From 9f73eebc55fe456c8e8a847b1658a78b9a920b22 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 20:36:36 -0400 Subject: [PATCH 092/140] updated GRN spoiler --- Utils/mtg-cards-data.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 327b1b66a4b..1b1e8315f25 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -34324,7 +34324,7 @@ Righteous Blow|Guilds of Ravnica|23|C|{W}|Instant|||Righteous Blow deals 2 damag Roc Charger|Guilds of Ravnica|24|U|{2}{W}|Creature - Bird|1|3|Flying$Whenever Roc Charger attacks, target attacking creature without flying gains flying until end of turn.| Skyline Scout|Guilds of Ravnica|25|C|{1}{W}|Creature - Human Scout|2|1|Whenever Skyline Scout attacks, you may pay {1}{W}. If you do, it gains flying until end of turn.| Sunhome Stalwart|Guilds of Ravnica|26|U|{1}{W}|Creature - Human Soldier|2|2|First strike$Mentor| -Sworn Companions|Guilds of Ravnica|27|C|{2}{W}|Sorcery|||Creature two 1/1 white Soldier creature tokens with lifelink.| +Sworn Companions|Guilds of Ravnica|27|C|{2}{W}|Sorcery|||Create two 1/1 white Soldier creature tokens with lifelink.| Take Heart|Guilds of Ravnica|28|C|{W}|Instant|||Target creature gets +2/+2 until end of turn. You gain 1 life for each attacking creature you control.| Tenth District Guard|Guilds of Ravnica|29|C|{1}{W}|Creature - Human Soldier|2|2|When Tenth District Guard enters the battlefield, target creature gets +0/+1 until end of turn.| Venerated Loxodon|Guilds of Ravnica|30|R|{4}{W}|Creature - Elephant Cleric|4|4|Convoke$When Venerated Loxodon enters the battlefield, put a +1/+1 counter on each creature that convoked it.| @@ -34378,7 +34378,7 @@ Midnight Reaper|Guilds of Ravnica|77|R|{2}{B}|Creature - Zombie Knight|3|2|Whene Moodmark Painter|Guilds of Ravnica|78|C|{2}{B}{B}|Creature - Human Shaman|2|3|Undergrowth — When Moodmark Painter enters the battlefield, target creature gains menace and gets +X/+0 until end of turn, where X is the number of creature cards in your graveyard.| Necrotic Wound|Guilds of Ravnica|79|U|{B}|Instant|||Undergrowth — Target creature gets -X/-X until end of turn, where X is the number of creature cards in your graveyard. If that creature would die this turn, exile it instead.| Never Happened|Guilds of Ravnica|80|C|{2}{B}|Sorcery|||Target opponent reveals their hand. You choose a nonland card from that player's graveyard or hand and exile it.| -Pilfering Imp|Guilds of Ravnica|81|U|{B}|Creature - Imp|||Flying${1}{B}, {T}, Sacrifice Pilfering Imp: Target opponent reveals their hand| +Pilfering Imp|Guilds of Ravnica|81|U|{B}|Creature - Imp|1|1|Flying${1}{B}, {T}, Sacrifice Pilfering Imp: Target opponent reveals their hand. You choose a nonland card from it. That player discards that card. Activate this ability only any time you could cast a sorcery.| Plaguecrafter|Guilds of Ravnica|82|U|{2}{B}|Creature - Human Shaman|3|2|When Plaguecrafter enters the battlefield, each player sacrifices a creature or planeswalker. Each player who can't discards a card.| Price of Fame|Guilds of Ravnica|83|U|{3}{B}|Instant|||This spell costs {2} less to cast if it targets a legendary creature.$Destroy target creature.$Surveil 2.| Ritual of Soot|Guilds of Ravnica|84|R|{2}{B}{B}|Sorcery|||Destroy all creatures with converted mana cost 3 or less.| @@ -34443,7 +34443,7 @@ Portcullis Vine|Guilds of Ravnica|142|C|{G}|Creature - Plant Wall|0|3|Defender${ Prey Upon|Guilds of Ravnica|143|C|{G}|Sorcery|||Target creature you control fights target creature you don't control.| Siege Wurm|Guilds of Ravnica|144|C|{5}{G}{G}|Creature - Wurm|5|5|Convoke$Trample| Sprouting Renewal|Guilds of Ravnica|145|U|{2}{G}|Sorcery|||Convoke$Choose one —$• Create a 2/2 green and white Elf Knight creature token with vigilance.$• Destroy target artifact or enchantment.| -Urban Utopia|Guilds of Ravnica|146|C|{1}{G}|Enchantment - Aura|||Enchant Land$When Urban Utopia enters the battlefield, draw a card.$Enchanted land has "{T}: Add one mana of any color."| +Urban Utopia|Guilds of Ravnica|146|C|{1}{G}|Enchantment - Aura|||Enchant land$When Urban Utopia enters the battlefield, draw a card.$Enchanted land has "{T}: Add one mana of any color."| Vigorspore Wurm|Guilds of Ravnica|147|C|{5}{G}|Creature - Wurm|6|4|Undergrowth — When Vigorspore Wurm enters the battlefield, target creature gains vigilance and gets +X/+X until end of turn, where X is the number of creature cards in your graveyard.$Vigorspore Wurm can't be blocked by more than one creature.| Vivid Revival|Guilds of Ravnica|148|R|{4}{G}|Sorcery|||Return up to three target multicolor cards from your graveyard to your hand. Exile Vivid Revival.| Wary Okapi|Guilds of Ravnica|149|C|{2}{G}|Creature - Antelope|3|2|Vigilance| From 6b21b0b6239a8ec29d43141f4aecd8b3b1cc5fd9 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 20:45:40 -0400 Subject: [PATCH 093/140] Implemented Cosmotronic Wave --- .../src/mage/cards/c/CosmotronicWave.java | 41 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 42 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/CosmotronicWave.java diff --git a/Mage.Sets/src/mage/cards/c/CosmotronicWave.java b/Mage.Sets/src/mage/cards/c/CosmotronicWave.java new file mode 100644 index 00000000000..18574f5cac6 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CosmotronicWave.java @@ -0,0 +1,41 @@ +package mage.cards.c; + +import java.util.UUID; +import mage.abilities.effects.common.DamageAllEffect; +import mage.abilities.effects.common.combat.CantBlockAllEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; +import mage.filter.common.FilterOpponentsCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class CosmotronicWave extends CardImpl { + + private static final FilterPermanent filter = new FilterOpponentsCreaturePermanent("creature your opponents control"); + + public CosmotronicWave(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{R}"); + + // Cosmotronic Wave deals 1 damage to each creature your opponents control. Creatures your opponents control can't block this turn. + this.getSpellAbility().addEffect(new DamageAllEffect(1, filter)); + this.getSpellAbility().addEffect(new CantBlockAllEffect( + StaticFilters.FILTER_OPPONENTS_PERMANENT_CREATURE, + Duration.EndOfTurn + )); + } + + public CosmotronicWave(final CosmotronicWave card) { + super(card); + } + + @Override + public CosmotronicWave copy() { + return new CosmotronicWave(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 21fa4eb58a7..5d9da5673f2 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -61,6 +61,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Conclave Guildmage", 162, Rarity.UNCOMMON, mage.cards.c.ConclaveGuildmage.class)); cards.add(new SetCardInfo("Conclave Tribunal", 6, Rarity.UNCOMMON, mage.cards.c.ConclaveTribunal.class)); cards.add(new SetCardInfo("Connive // Concoct", 222, Rarity.RARE, mage.cards.c.ConniveConcoct.class)); + cards.add(new SetCardInfo("Cosmotronic Wave", 95, Rarity.COMMON, mage.cards.c.CosmotronicWave.class)); cards.add(new SetCardInfo("Crackling Drake", 163, Rarity.UNCOMMON, mage.cards.c.CracklingDrake.class)); cards.add(new SetCardInfo("Creeping Chill", 66, Rarity.UNCOMMON, mage.cards.c.CreepingChill.class)); cards.add(new SetCardInfo("Crushing Canopy", 126, Rarity.COMMON, mage.cards.c.CrushingCanopy.class)); From cdeb1a321538073006de6f096d5fbd550f85c498 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 20:51:08 -0400 Subject: [PATCH 094/140] Implemented Kraul Swarm --- Mage.Sets/src/mage/cards/k/KraulSwarm.java | 56 ++++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 57 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/k/KraulSwarm.java diff --git a/Mage.Sets/src/mage/cards/k/KraulSwarm.java b/Mage.Sets/src/mage/cards/k/KraulSwarm.java new file mode 100644 index 00000000000..64b86f8ebec --- /dev/null +++ b/Mage.Sets/src/mage/cards/k/KraulSwarm.java @@ -0,0 +1,56 @@ +package mage.cards.k; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.DiscardTargetCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.ReturnSourceFromGraveyardToHandEffect; +import mage.constants.SubType; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.filter.StaticFilters; +import mage.target.common.TargetCardInHand; + +/** + * + * @author TheElk801 + */ +public final class KraulSwarm extends CardImpl { + + public KraulSwarm(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B}"); + + this.subtype.add(SubType.INSECT); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(4); + this.toughness = new MageInt(1); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // {2}{B}, Discard a creature card: Return Kraul Swarm from your graveyard to your hand. + Ability ability = new SimpleActivatedAbility( + Zone.GRAVEYARD, + new ReturnSourceFromGraveyardToHandEffect(), + new ManaCostsImpl("{2}{B}") + ); + ability.addCost(new DiscardTargetCost( + new TargetCardInHand(StaticFilters.FILTER_CARD_CREATURE_A) + )); + this.addAbility(ability); + } + + public KraulSwarm(final KraulSwarm card) { + super(card); + } + + @Override + public KraulSwarm copy() { + return new KraulSwarm(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 5d9da5673f2..92f31c3252e 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -151,6 +151,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Knight of Autumn", 183, Rarity.RARE, mage.cards.k.KnightOfAutumn.class)); cards.add(new SetCardInfo("Kraul Foragers", 135, Rarity.COMMON, mage.cards.k.KraulForagers.class)); cards.add(new SetCardInfo("Kraul Harpooner", 136, Rarity.UNCOMMON, mage.cards.k.KraulHarpooner.class)); + cards.add(new SetCardInfo("Kraul Swarm", 73, Rarity.UNCOMMON, mage.cards.k.KraulSwarm.class)); cards.add(new SetCardInfo("Lava Coil", 108, Rarity.UNCOMMON, mage.cards.l.LavaCoil.class)); cards.add(new SetCardInfo("Lazav, the Multifarious", 184, Rarity.MYTHIC, mage.cards.l.LazavTheMultifarious.class)); cards.add(new SetCardInfo("League Guildmage", 185, Rarity.UNCOMMON, mage.cards.l.LeagueGuildmage.class)); From 7988bdddb5ae45f79566b88d22cf4c6bc137730c Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 20:57:21 -0400 Subject: [PATCH 095/140] Implemented Street Riot --- Mage.Sets/src/mage/cards/s/StreetRiot.java | 55 ++++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 56 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/StreetRiot.java diff --git a/Mage.Sets/src/mage/cards/s/StreetRiot.java b/Mage.Sets/src/mage/cards/s/StreetRiot.java new file mode 100644 index 00000000000..47cfcea72ad --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/StreetRiot.java @@ -0,0 +1,55 @@ +package mage.cards.s; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.MyTurnCondition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.filter.StaticFilters; + +/** + * + * @author TheElk801 + */ +public final class StreetRiot extends CardImpl { + + public StreetRiot(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{R}"); + + // As long as it's your turn, creatures you control get +1/+0 and have trample. + Ability ability = new SimpleStaticAbility( + Zone.BATTLEFIELD, + new ConditionalContinuousEffect( + new BoostControlledEffect( + 1, 0, Duration.WhileOnBattlefield + ), MyTurnCondition.instance, + "As long as it's your turn, " + + "creatures you control get +1/+0" + )); + ability.addEffect(new ConditionalContinuousEffect( + new GainAbilityControlledEffect( + TrampleAbility.getInstance(), + Duration.WhileOnBattlefield, + StaticFilters.FILTER_CONTROLLED_CREATURES + ), MyTurnCondition.instance, "and have trample" + )); + this.addAbility(ability); + } + + public StreetRiot(final StreetRiot card) { + super(card); + } + + @Override + public StreetRiot copy() { + return new StreetRiot(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 92f31c3252e..91a77370aaf 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -230,6 +230,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Sprouting Renewal", 145, Rarity.UNCOMMON, mage.cards.s.SproutingRenewal.class)); cards.add(new SetCardInfo("Status // Statue", 230, Rarity.UNCOMMON, mage.cards.s.StatusStatue.class)); cards.add(new SetCardInfo("Steam Vents", 257, Rarity.RARE, mage.cards.s.SteamVents.class)); + cards.add(new SetCardInfo("Street Riot", 117, Rarity.UNCOMMON, mage.cards.s.StreetRiot.class)); cards.add(new SetCardInfo("Sumala Woodshaper", 200, Rarity.COMMON, mage.cards.s.SumalaWoodshaper.class)); cards.add(new SetCardInfo("Sunhome Stalwart", 26, Rarity.UNCOMMON, mage.cards.s.SunhomeStalwart.class)); cards.add(new SetCardInfo("Sure Strike", 118, Rarity.COMMON, mage.cards.s.SureStrike.class)); From 948de82e6d7371f8f8c6499f5f513a8be7b7f227 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 21:10:41 -0400 Subject: [PATCH 096/140] fixed a numbering issue --- Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 91a77370aaf..bdadd82e1fb 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -134,10 +134,9 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Hypothesizzle", 178, Rarity.COMMON, mage.cards.h.Hypothesizzle.class)); cards.add(new SetCardInfo("Impervious Greatwurm", 273, Rarity.MYTHIC, mage.cards.i.ImperviousGreatwurm.class)); cards.add(new SetCardInfo("Inescapable Blaze", 107, Rarity.UNCOMMON, mage.cards.i.InescapableBlaze.class)); - cards.add(new SetCardInfo("Integrity // Intervention", 227, Rarity.UNCOMMON, mage.cards.i.IntegrityIntervention.class)); - cards.add(new SetCardInfo("Intrusive Packbeast", 17, Rarity.COMMON, mage.cards.i.IntrusivePackbeast.class)); cards.add(new SetCardInfo("Invert // Invent", 228, Rarity.UNCOMMON, mage.cards.i.InvertInvent.class)); cards.add(new SetCardInfo("Inspiring Unicorn", 16, Rarity.UNCOMMON, mage.cards.i.InspiringUnicorn.class)); + cards.add(new SetCardInfo("Integrity // Intervention", 227, Rarity.UNCOMMON, mage.cards.i.IntegrityIntervention.class)); cards.add(new SetCardInfo("Intrusive Packbeast", 17, Rarity.COMMON, mage.cards.i.IntrusivePackbeast.class)); cards.add(new SetCardInfo("Ionize", 179, Rarity.RARE, mage.cards.i.Ionize.class)); cards.add(new SetCardInfo("Ironshell Beetle", 134, Rarity.COMMON, mage.cards.i.IronshellBeetle.class)); From 592f2798d7e8d817ee6108ef22c054904883e0e6 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 21:16:15 -0400 Subject: [PATCH 097/140] Implemented Leapfrog --- Mage.Sets/src/mage/cards/l/Leapfrog.java | 83 ++++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 84 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/l/Leapfrog.java diff --git a/Mage.Sets/src/mage/cards/l/Leapfrog.java b/Mage.Sets/src/mage/cards/l/Leapfrog.java new file mode 100644 index 00000000000..8e1006f6975 --- /dev/null +++ b/Mage.Sets/src/mage/cards/l/Leapfrog.java @@ -0,0 +1,83 @@ +package mage.cards.l; + +import java.util.List; +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.Condition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.stack.Spell; +import mage.watchers.common.SpellsCastWatcher; + +/** + * + * @author TheElk801 + */ +public final class Leapfrog extends CardImpl { + + public Leapfrog(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{U}"); + + this.subtype.add(SubType.FROG); + this.power = new MageInt(3); + this.toughness = new MageInt(1); + + // Leapfrog has flying as long as you've cast an instant or sorcery spell this turn. + this.addAbility(new SimpleStaticAbility( + Zone.BATTLEFIELD, + new ConditionalContinuousEffect( + new GainAbilitySourceEffect( + FlyingAbility.getInstance(), + Duration.WhileOnBattlefield + ), LeapfrogCondition.instance, + "{this} has flying as long as you've cast " + + "an instant or sorcery spell this turn." + ) + ), new SpellsCastWatcher()); + } + + public Leapfrog(final Leapfrog card) { + super(card); + } + + @Override + public Leapfrog copy() { + return new Leapfrog(this); + } +} + +enum LeapfrogCondition implements Condition { + instance; + + @Override + public boolean apply(Game game, Ability source) { + SpellsCastWatcher watcher + = (SpellsCastWatcher) game.getState().getWatchers().get( + SpellsCastWatcher.class.getSimpleName() + ); + if (watcher == null) { + return false; + } + List spells = watcher.getSpellsCastThisTurn(source.getControllerId()); + if (spells == null) { + return false; + } + for (Spell spell : spells) { + if (!spell.getSourceId().equals(source.getSourceId()) + && spell.isInstantOrSorcery()) { + return true; + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index bdadd82e1fb..1e523e817c1 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -154,6 +154,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Lava Coil", 108, Rarity.UNCOMMON, mage.cards.l.LavaCoil.class)); cards.add(new SetCardInfo("Lazav, the Multifarious", 184, Rarity.MYTHIC, mage.cards.l.LazavTheMultifarious.class)); cards.add(new SetCardInfo("League Guildmage", 185, Rarity.UNCOMMON, mage.cards.l.LeagueGuildmage.class)); + cards.add(new SetCardInfo("Leapfrog", 42, Rarity.COMMON, mage.cards.l.Leapfrog.class)); cards.add(new SetCardInfo("Ledev Champion", 186, Rarity.UNCOMMON, mage.cards.l.LedevChampion.class)); cards.add(new SetCardInfo("Ledev Guardian", 18, Rarity.COMMON, mage.cards.l.LedevGuardian.class)); cards.add(new SetCardInfo("Legion Guildmage", 187, Rarity.UNCOMMON, mage.cards.l.LegionGuildmage.class)); From 5adf163d2417ebbc2687419aba62deb6bd67ca67 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 21:25:19 -0400 Subject: [PATCH 098/140] Implemented Pilfering Imp --- Mage.Sets/src/mage/cards/p/PilferingImp.java | 59 ++++++++++++++++++++ Mage.Sets/src/mage/cards/t/Thoughtseize.java | 17 +----- Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 3 files changed, 63 insertions(+), 14 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/p/PilferingImp.java diff --git a/Mage.Sets/src/mage/cards/p/PilferingImp.java b/Mage.Sets/src/mage/cards/p/PilferingImp.java new file mode 100644 index 00000000000..94c9a9081b2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PilferingImp.java @@ -0,0 +1,59 @@ +package mage.cards.p; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.costs.common.SacrificeSourceCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect; +import mage.constants.SubType; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.StaticFilters; +import mage.target.common.TargetOpponent; + +/** + * + * @author TheElk801 + */ +public final class PilferingImp extends CardImpl { + + public PilferingImp(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{B}"); + + this.subtype.add(SubType.IMP); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // {1}{B}, {T}, Sacrifice Pilfering Imp: Target opponent reveals their hand. You choose a nonland card from it. That player discards that card. Activate this ability only any time you could cast a sorcery. + Ability ability = new ActivateAsSorceryActivatedAbility( + Zone.BATTLEFIELD, + new DiscardCardYouChooseTargetEffect( + StaticFilters.FILTER_CARD_NON_LAND, + TargetController.ANY + ), new ManaCostsImpl("{1}{B}") + ); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeSourceCost()); + ability.addTarget(new TargetOpponent()); + this.addAbility(ability); + } + + public PilferingImp(final PilferingImp card) { + super(card); + } + + @Override + public PilferingImp copy() { + return new PilferingImp(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/Thoughtseize.java b/Mage.Sets/src/mage/cards/t/Thoughtseize.java index c4d449f2fcd..3d78bf76be3 100644 --- a/Mage.Sets/src/mage/cards/t/Thoughtseize.java +++ b/Mage.Sets/src/mage/cards/t/Thoughtseize.java @@ -1,4 +1,3 @@ - package mage.cards.t; import java.util.UUID; @@ -8,9 +7,7 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.TargetController; -import mage.filter.FilterCard; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.StaticFilters; import mage.target.TargetPlayer; /** @@ -19,19 +16,12 @@ import mage.target.TargetPlayer; */ public final class Thoughtseize extends CardImpl { - private static final FilterCard filter = new FilterCard("nonland card"); - - static { - filter.add(Predicates.not(new CardTypePredicate(CardType.LAND))); - } - public Thoughtseize(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{B}"); - + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{B}"); // Target player reveals their hand. You choose a nonland card from it. That player discards that card. You lose 2 life. this.getSpellAbility().addTarget(new TargetPlayer()); - this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(filter, TargetController.ANY)); + this.getSpellAbility().addEffect(new DiscardCardYouChooseTargetEffect(StaticFilters.FILTER_CARD_NON_LAND, TargetController.ANY)); this.getSpellAbility().addEffect(new LoseLifeSourceControllerEffect(2)); } @@ -44,4 +34,3 @@ public final class Thoughtseize extends CardImpl { return new Thoughtseize(this); } } - diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 1e523e817c1..0fdc0da7d81 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -193,6 +193,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Parhelion Patrol", 22, Rarity.COMMON, mage.cards.p.ParhelionPatrol.class)); cards.add(new SetCardInfo("Passwall Adept", 50, Rarity.COMMON, mage.cards.p.PasswallAdept.class)); cards.add(new SetCardInfo("Pause for Reflection", 140, Rarity.COMMON, mage.cards.p.PauseForReflection.class)); + cards.add(new SetCardInfo("Pilfering Imp", 81, Rarity.UNCOMMON, mage.cards.p.PilferingImp.class)); cards.add(new SetCardInfo("Piston-Fist Cyclops", 217, Rarity.COMMON, mage.cards.p.PistonFistCyclops.class)); cards.add(new SetCardInfo("Pitiless Gorgon", 218, Rarity.COMMON, mage.cards.p.PitilessGorgon.class)); cards.add(new SetCardInfo("Plains", 260, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); From 3df16d577773c91eac0b7d5d16bcb91f8c7a7f67 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Wed, 19 Sep 2018 21:52:05 -0400 Subject: [PATCH 099/140] Implemented Vigorspore Wurm --- .../src/mage/cards/v/VigorsporeWurm.java | 69 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 70 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/v/VigorsporeWurm.java diff --git a/Mage.Sets/src/mage/cards/v/VigorsporeWurm.java b/Mage.Sets/src/mage/cards/v/VigorsporeWurm.java new file mode 100644 index 00000000000..5867f5eaf73 --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/VigorsporeWurm.java @@ -0,0 +1,69 @@ +package mage.cards.v; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; +import mage.abilities.effects.common.combat.CantBeBlockedByMoreThanOneSourceEffect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.VigilanceAbility; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.filter.StaticFilters; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class VigorsporeWurm extends CardImpl { + + public VigorsporeWurm(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{G}"); + + this.subtype.add(SubType.WURM); + this.power = new MageInt(6); + this.toughness = new MageInt(4); + + // Undergrowth — When Vigorspore Wurm enters the battlefield, target creature gains vigilance and gets +X/+X until end of turn, where X is the number of creature cards in your graveyard. + DynamicValue xValue = new CardsInControllerGraveyardCount( + StaticFilters.FILTER_CARD_CREATURE + ); + Ability ability = new EntersBattlefieldTriggeredAbility( + new GainAbilityTargetEffect( + VigilanceAbility.getInstance(), + Duration.EndOfTurn + ).setText("target creature gains vigilance"), + false, "Undergrowth — " + ); + ability.addEffect(new BoostTargetEffect( + xValue, xValue, Duration.EndOfTurn + ).setText("and gets +X/+X until end of turn, " + + "where X is the number of creature cards in your graveyard.")); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + + // Vigorspore Wurm can't be blocked by more than one creature. + this.addAbility(new SimpleStaticAbility( + Zone.BATTLEFIELD, + new CantBeBlockedByMoreThanOneSourceEffect() + )); + } + + public VigorsporeWurm(final VigorsporeWurm card) { + super(card); + } + + @Override + public VigorsporeWurm copy() { + return new VigorsporeWurm(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 0fdc0da7d81..8241985106d 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -257,6 +257,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Veiled Shade", 88, Rarity.COMMON, mage.cards.v.VeiledShade.class)); cards.add(new SetCardInfo("Venerated Loxodon", 30, Rarity.RARE, mage.cards.v.VeneratedLoxodon.class)); cards.add(new SetCardInfo("Vernadi Shieldmate", 219, Rarity.COMMON, mage.cards.v.VernadiShieldmate.class)); + cards.add(new SetCardInfo("Vigorspore Wurm", 147, Rarity.COMMON, mage.cards.v.VigorsporeWurm.class)); cards.add(new SetCardInfo("Vivid Revival", 148, Rarity.RARE, mage.cards.v.VividRevival.class)); cards.add(new SetCardInfo("Vraska's Stoneglare", 272, Rarity.RARE, mage.cards.v.VraskasStoneglare.class)); cards.add(new SetCardInfo("Vraska, Golgari Queen", 213, Rarity.MYTHIC, mage.cards.v.VraskaGolgariQueen.class)); From 7538a7b4f48950ac71560d1d029e36ee063b7ea8 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 20 Sep 2018 10:34:21 -0400 Subject: [PATCH 100/140] Implemented Severed Strands --- .../src/mage/cards/s/SeveredStrands.java | 40 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 41 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SeveredStrands.java diff --git a/Mage.Sets/src/mage/cards/s/SeveredStrands.java b/Mage.Sets/src/mage/cards/s/SeveredStrands.java new file mode 100644 index 00000000000..bf0d88fdbf2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SeveredStrands.java @@ -0,0 +1,40 @@ +package mage.cards.s; + +import java.util.UUID; +import mage.abilities.dynamicvalue.common.SacrificeCostCreaturesToughness; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetOpponentsCreaturePermanent; + +/** + * + * @author TheElk801 + */ +public final class SeveredStrands extends CardImpl { + + public SeveredStrands(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{B}"); + + // As an additional cost to cast this spell, sacrifice a creature. + // You gain life equal to the sacrificed creature's toughness. Destroy target creature an opponent controls. + this.getSpellAbility().addEffect(new GainLifeEffect( + new SacrificeCostCreaturesToughness(), + "You gain life equal to the " + + "sacrificed creature's toughness." + )); + this.getSpellAbility().addEffect(new DestroyTargetEffect()); + this.getSpellAbility().addTarget(new TargetOpponentsCreaturePermanent()); + } + + public SeveredStrands(final SeveredStrands card) { + super(card); + } + + @Override + public SeveredStrands copy() { + return new SeveredStrands(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 8241985106d..6fa66fd6f3e 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -220,6 +220,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Selesnya Guildgate", 255, Rarity.COMMON, mage.cards.s.SelesnyaGuildgate.class)); cards.add(new SetCardInfo("Selesnya Guildgate", 256, Rarity.COMMON, mage.cards.s.SelesnyaGuildgate.class)); cards.add(new SetCardInfo("Selesnya Locket", 240, Rarity.COMMON, mage.cards.s.SelesnyaLocket.class)); + cards.add(new SetCardInfo("Severed Strands", 85, Rarity.COMMON, mage.cards.s.SeveredStrands.class)); cards.add(new SetCardInfo("Siege Wurm", 144, Rarity.COMMON, mage.cards.s.SiegeWurm.class)); cards.add(new SetCardInfo("Silent Dart", 241, Rarity.UNCOMMON, mage.cards.s.SilentDart.class)); cards.add(new SetCardInfo("Sinister Sabotage", 54, Rarity.UNCOMMON, mage.cards.s.SinisterSabotage.class)); From 1bbcc14f77d3a06f401248afbf8df31732f64833 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 20 Sep 2018 10:44:09 -0400 Subject: [PATCH 101/140] Implemented Undercity Necrolisk --- .../src/mage/cards/u/UndercityNecrolisk.java | 69 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 70 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/u/UndercityNecrolisk.java diff --git a/Mage.Sets/src/mage/cards/u/UndercityNecrolisk.java b/Mage.Sets/src/mage/cards/u/UndercityNecrolisk.java new file mode 100644 index 00000000000..f1adb8461a8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/u/UndercityNecrolisk.java @@ -0,0 +1,69 @@ +package mage.cards.u; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.ActivateAsSorceryActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.MenaceAbility; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author TheElk801 + */ +public final class UndercityNecrolisk extends CardImpl { + + private static final FilterControlledPermanent filter + = new FilterControlledCreaturePermanent("another creature"); + + static { + filter.add(new AnotherPredicate()); + } + + public UndercityNecrolisk(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}"); + + this.subtype.add(SubType.ZOMBIE); + this.subtype.add(SubType.LIZARD); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // {1}, Sacrifice another creature: Put a +1/+1 counter on Undercity Necrolisk. It gains menace until end of turn. Activate this ability only any time you could cast a sorcery. + Ability ability = new ActivateAsSorceryActivatedAbility( + Zone.BATTLEFIELD, + new AddCountersSourceEffect(CounterType.P1P1.createInstance()), + new GenericManaCost(1) + ); + ability.addEffect(new GainAbilitySourceEffect( + new MenaceAbility(), + Duration.EndOfTurn + ).setText("It gains menace until end of turn.")); + ability.addCost(new SacrificeTargetCost( + new TargetControlledPermanent(filter) + )); + this.addAbility(ability); + } + + public UndercityNecrolisk(final UndercityNecrolisk card) { + super(card); + } + + @Override + public UndercityNecrolisk copy() { + return new UndercityNecrolisk(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 6fa66fd6f3e..6a38500eb9f 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -250,6 +250,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Torch Courier", 119, Rarity.COMMON, mage.cards.t.TorchCourier.class)); cards.add(new SetCardInfo("Trostani Discordant", 208, Rarity.MYTHIC, mage.cards.t.TrostaniDiscordant.class)); cards.add(new SetCardInfo("Truefire Captain", 209, Rarity.UNCOMMON, mage.cards.t.TruefireCaptain.class)); + cards.add(new SetCardInfo("Undercity Necrolisk", 87, Rarity.UNCOMMON, mage.cards.u.UndercityNecrolisk.class)); cards.add(new SetCardInfo("Undercity Uprising", 210, Rarity.COMMON, mage.cards.u.UndercityUprising.class)); cards.add(new SetCardInfo("Underrealm Lich", 211, Rarity.MYTHIC, mage.cards.u.UnderrealmLich.class)); cards.add(new SetCardInfo("Unexplained Disappearance", 56, Rarity.COMMON, mage.cards.u.UnexplainedDisappearance.class)); From 86cd6b31e95937f3eb2b0890e0fb3221d166e443 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 20 Sep 2018 10:57:56 -0400 Subject: [PATCH 102/140] Implemented Vicious Rumors --- Mage.Sets/src/mage/cards/v/ViciousRumors.java | 48 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 49 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/v/ViciousRumors.java diff --git a/Mage.Sets/src/mage/cards/v/ViciousRumors.java b/Mage.Sets/src/mage/cards/v/ViciousRumors.java new file mode 100644 index 00000000000..93690c0047f --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/ViciousRumors.java @@ -0,0 +1,48 @@ +package mage.cards.v; + +import java.util.UUID; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.common.DamagePlayersEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.common.PutTopCardOfLibraryIntoGraveEachPlayerEffect; +import mage.abilities.effects.common.discard.DiscardEachPlayerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.TargetController; + +/** + * + * @author TheElk801 + */ +public final class ViciousRumors extends CardImpl { + + public ViciousRumors(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{B}"); + + // Vicious Rumors deals 1 damage to each opponent. Each opponent discards a card, then puts the top card of their library into their graveyard. You gain 1 life. + this.getSpellAbility().addEffect( + new DamagePlayersEffect(1, TargetController.OPPONENT) + ); + this.getSpellAbility().addEffect(new DiscardEachPlayerEffect( + new StaticValue(1), false, + TargetController.OPPONENT + )); + this.getSpellAbility().addEffect( + new PutTopCardOfLibraryIntoGraveEachPlayerEffect( + 1, TargetController.OPPONENT + ).setText(", then puts the top card of their library " + + "into their graveyard.") + ); + this.getSpellAbility().addEffect(new GainLifeEffect(1)); + } + + public ViciousRumors(final ViciousRumors card) { + super(card); + } + + @Override + public ViciousRumors copy() { + return new ViciousRumors(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 6a38500eb9f..afb52a48c8b 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -259,6 +259,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Veiled Shade", 88, Rarity.COMMON, mage.cards.v.VeiledShade.class)); cards.add(new SetCardInfo("Venerated Loxodon", 30, Rarity.RARE, mage.cards.v.VeneratedLoxodon.class)); cards.add(new SetCardInfo("Vernadi Shieldmate", 219, Rarity.COMMON, mage.cards.v.VernadiShieldmate.class)); + cards.add(new SetCardInfo("Vicious Rumors", 89, Rarity.COMMON, mage.cards.v.ViciousRumors.class)); cards.add(new SetCardInfo("Vigorspore Wurm", 147, Rarity.COMMON, mage.cards.v.VigorsporeWurm.class)); cards.add(new SetCardInfo("Vivid Revival", 148, Rarity.RARE, mage.cards.v.VividRevival.class)); cards.add(new SetCardInfo("Vraska's Stoneglare", 272, Rarity.RARE, mage.cards.v.VraskasStoneglare.class)); From 76593ab3cf2e2c5fdd67e2948afd3c9746b57bc9 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 20 Sep 2018 11:06:48 -0400 Subject: [PATCH 103/140] updated GRN spoiler --- Mage.Sets/src/mage/cards/h/HellkiteWhelp.java | 2 +- Utils/mtg-cards-data.txt | 20 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Mage.Sets/src/mage/cards/h/HellkiteWhelp.java b/Mage.Sets/src/mage/cards/h/HellkiteWhelp.java index a96308cbdba..3baa8970d36 100644 --- a/Mage.Sets/src/mage/cards/h/HellkiteWhelp.java +++ b/Mage.Sets/src/mage/cards/h/HellkiteWhelp.java @@ -33,7 +33,7 @@ public final class HellkiteWhelp extends CardImpl { this.subtype.add(SubType.DRAGON); this.power = new MageInt(3); - this.toughness = new MageInt(34); + this.toughness = new MageInt(3); // Flying this.addAbility(FlyingAbility.getInstance()); diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 1b1e8315f25..7caa103b70c 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -34336,10 +34336,10 @@ Devious Cover-up|Guilds of Ravnica|35|C|{2}{U}{U}|Instant|||Counter target spell Dimir Informant|Guilds of Ravnica|36|C|{2}{U}|Creature - Human Rogue|1|4|When Dimir Informant enters the battlefield, surveil 2.| Disdainful Stroke|Guilds of Ravnica|37|C|{1}{U}|Instant|||Counter target spell with converted mana cost 4 or greater.| Dream Eater|Guilds of Ravnica|38|M|{4}{U}{U}|Creature - Nightmare Sphinx|4|3|Flash$Flying$When Dream Eater enters the battlefield, surveil 4. When you do, you may return target nonland permanent an opponent controls to its owner's hand.| -Drowned Secrets|Guilds of Ravnica|39|R|{1}{U}|Enchantment|||Whenever you cast a blue spell, target player puts the top two cards if their library into their graveyard.| +Drowned Secrets|Guilds of Ravnica|39|R|{1}{U}|Enchantment|||Whenever you cast a blue spell, target player puts the top two cards of their library into their graveyard.| Enhanced Surveillance|Guilds of Ravnica|40|U|{1}{U}|Enchantment|||You may look at an additional two cards each time you surveil.$Exile Enhanced Surveillance: Shuffle your graveyard into your library.| Guild Summit|Guilds of Ravnica|41|U|{2}{U}|Enchantment|||When Guild Summit enters the battlefield, you may tap any number of untapped Gates you control. Draw a card for each Gate tapped this way.$Whenever a Gate enters the battlefield under your control, draw a card.| -Leapfrog|Guilds of Ravnica|42|C|{2}{U}|Creature - Frog|3|1|Leapfrog has flying as long as you've cast and instant or sorcery spell this turn.| +Leapfrog|Guilds of Ravnica|42|C|{2}{U}|Creature - Frog|3|1|Leapfrog has flying as long as you've cast an instant or sorcery spell this turn.| Maximize Altitude|Guilds of Ravnica|43|C|{U}|Sorcery|||Target creature gets +1/+1 and gains flying until end of turn.$Jump-start| Mission Briefing|Guilds of Ravnica|44|R|{U}{U}|Instant|||Surveil 2, then choose an instant or sorcery card in your graveyard. You may cast that card this turn. If that card would be put into your graveyard this turn, exile it instead.| Murmuring Mystic|Guilds of Ravnica|45|U|{3}{U}|Creature - Human Wizard|1|5|Whenever you cast an instant or sorcery spell, create a 1/1 blue Bird Illusion creature token with flying.| @@ -34386,7 +34386,7 @@ Severed Strands|Guilds of Ravnica|85|C|{1}{B}|Sorcery|||As an additional cost to Spinal Centipede|Guilds of Ravnica|86|C|{2}{B}|Creature - Insect|3|2|When Spinal Centipede dies, put a +1/+1 counter on target creature you control.| Undercity Necrolisk|Guilds of Ravnica|87|U|{3}{B}|Creature - Zombie Lizard|3|3|{1}, Sacrifice another creature: Put a +1/+1 counter on Undercity Necrolisk. It gains menace until end of turn. Activate this ability only any time you could cast a sorcery.| Veiled Shade|Guilds of Ravnica|88|C|{2}{B}|Creature - Shade|2|2|{1}{B}: Veiled Shade gets +1/+1 until end of turn.| -Vicious Rumors|Guilds of Ravnica|89|C|{B}|Sorcery|||Vicious Rumors deals 1 damage to each opponent. Each opponent discards a card, the puts the top card of their library into their graveyard. You gain 1 life.| +Vicious Rumors|Guilds of Ravnica|89|C|{B}|Sorcery|||Vicious Rumors deals 1 damage to each opponent. Each opponent discards a card, then puts the top card of their library into their graveyard. You gain 1 life.| Whispering Snitch|Guilds of Ravnica|90|U|{1}{B}|Creature - Vampire Rogue|1|3|Whenever you surveil for the first time each turn, Whispering Snitch deals 1 damage to each opponent and you gain 1 life.| Arclight Phoenix|Guilds of Ravnica|91|M|{3}{R}|Creature - Phoenix|3|2|Flying, haste$At the beginning of combat on your turn, if you've cast three or more instant and sorcery spells this turn, you may return Arclight Phoenix from your graveyard to the battlefield.| Barging Sergeant|Guilds of Ravnica|92|C|{4}{R}|Creature - Minotaur Soldier|4|2|Haste$Mentor| @@ -34403,8 +34403,8 @@ Goblin Banneret|Guilds of Ravnica|102|U|{R}|Creature - Goblin Soldier|1|1|Mentor Goblin Cratermaker|Guilds of Ravnica|103|U|{1}{R}|Creature - Goblin Warrior|2|2|{1}, Sacrifice Goblin Cratermaker: Choose one —$• Goblin Cratermaker deals 2 damage to target creature.$• Destroy target colorless nonland permanent.| Goblin Locksmith|Guilds of Ravnica|104|C|{1}{R}|Creature - Goblin Rogue|2|1|Whenever Goblin Locksmith attacks, creatures with defender can't block this turn.| Gravitic Punch|Guilds of Ravnica|105|C|{3}{R}|Sorcery|||Target creature you control deals damage equal to its power to target player.$Jump-start| -Hellkite Whelp|Guilds of Ravnica|106|U|{4}{R}|Creature - Dragon|3|34|Flying$Whenever Hellkite Whelp attacks, it deals 1 damage to target creature defending player controls.| -Inescapable Blaze|Guilds of Ravnica|107|U|{4}{R}{R}|Instant|||This spell can't be countered.$Inescapable Flame deals 6 damage to any target.| +Hellkite Whelp|Guilds of Ravnica|106|U|{4}{R}|Creature - Dragon|3|3|Flying$Whenever Hellkite Whelp attacks, it deals 1 damage to target creature defending player controls.| +Inescapable Blaze|Guilds of Ravnica|107|U|{4}{R}{R}|Instant|||This spell can't be countered.$Inescapable Blaze deals 6 damage to any target.| Lava Coil|Guilds of Ravnica|108|U|{1}{R}|Sorcery|||Lava Coil deals 4 damage to target creature. If that creature would die this turn, exile it instead.| Legion Warboss|Guilds of Ravnica|109|R|{2}{R}|Creature - Goblin Soldier|2|2|Mentor$At the beginning of combat on your turn, create a 1/1 red Goblin creature token. That token gains haste until end of turn and attacks this combat if able.| Maniacal Rage|Guilds of Ravnica|110|C|{1}{R}|Enchantment - Aura|||Enchant creature$Enchanted creature gets +2/+2 and can't block.| @@ -34437,7 +34437,7 @@ Kraul Harpooner|Guilds of Ravnica|136|U|{1}{G}|Creature - Insect Warrior|3|2|Rea Might of the Masses|Guilds of Ravnica|137|U|{G}|Instant|||Target creature gets +1/+1 until end of turn for each creature you control.| Nullhide Ferox|Guilds of Ravnica|138|M|{2}{G}{G}|Creature - Beast|6|6|Hexproof$You can't cast noncreature spells.${2}: Nullhide Ferox loses all abilities until end of turn. Any player may activate this ability.$If a spell or ability an opponent controls causes you to discard Nullhide Ferox, put it onto the battlefield instead of putting it into your graveyard.| Pack's Favor|Guilds of Ravnica|139|C|{2}{G}|Instant|||Convoke$Target creature gets +3/+3 until end of turn.| -Pause for Reflection|Guilds of Ravnica|140|C|{2}{G}|Instant|||Convoke$Precent all combat damage that would be dealt this turn.| +Pause for Reflection|Guilds of Ravnica|140|C|{2}{G}|Instant|||Convoke$Prevent all combat damage that would be dealt this turn.| Pelt Collector|Guilds of Ravnica|141|R|{G}|Creature - Elf Warrior|1|1|Whenever another creature you control enters the battlefield or dies, if that creature's power is greater than Pelt Collector's, put a +1/+1 counter on Pelt Collector.$As long as Pelt Collector has three or more +1/+1 counters on it, it has trample.| Portcullis Vine|Guilds of Ravnica|142|C|{G}|Creature - Plant Wall|0|3|Defender${2}, {T}, Sacrifice a creature with defender: Draw a card.| Prey Upon|Guilds of Ravnica|143|C|{G}|Sorcery|||Target creature you control fights target creature you don't control.| @@ -34445,20 +34445,20 @@ Siege Wurm|Guilds of Ravnica|144|C|{5}{G}{G}|Creature - Wurm|5|5|Convoke$Trample Sprouting Renewal|Guilds of Ravnica|145|U|{2}{G}|Sorcery|||Convoke$Choose one —$• Create a 2/2 green and white Elf Knight creature token with vigilance.$• Destroy target artifact or enchantment.| Urban Utopia|Guilds of Ravnica|146|C|{1}{G}|Enchantment - Aura|||Enchant land$When Urban Utopia enters the battlefield, draw a card.$Enchanted land has "{T}: Add one mana of any color."| Vigorspore Wurm|Guilds of Ravnica|147|C|{5}{G}|Creature - Wurm|6|4|Undergrowth — When Vigorspore Wurm enters the battlefield, target creature gains vigilance and gets +X/+X until end of turn, where X is the number of creature cards in your graveyard.$Vigorspore Wurm can't be blocked by more than one creature.| -Vivid Revival|Guilds of Ravnica|148|R|{4}{G}|Sorcery|||Return up to three target multicolor cards from your graveyard to your hand. Exile Vivid Revival.| +Vivid Revival|Guilds of Ravnica|148|R|{4}{G}|Sorcery|||Return up to three target multicolored cards from your graveyard to your hand. Exile Vivid Revival.| Wary Okapi|Guilds of Ravnica|149|C|{2}{G}|Creature - Antelope|3|2|Vigilance| Wild Ceratok|Guilds of Ravnica|150|C|{3}{G}|Creature - Rhino|4|3|| Artful Takedown|Guilds of Ravnica|151|C|{2}{U}{B}|Instant|||Choose one or both —$• Tap target creature.$• Target creature gets -2/-4 until end of turn.| Assassin's Trophy|Guilds of Ravnica|152|R|{B}{G}|Instant|||Destroy target permanent an opponent controls. Its controller may search their library for a basic land card, put it onto the battlefield, then shuffle their library.| Aurelia, Exemplar of Justice|Guilds of Ravnica|153|M|{2}{R}{W}|Legendary Creature - Angel|2|5|Flying$Mentor$At the beginning of combat on your turn, choose up to one target creature you control. Until end of turn, that creature gets +2/+0, gains trample if it's red, and gains vigilance if it's white.| Beacon Bolt|Guilds of Ravnica|154|U|{1}{U}{R}|Sorcery|||Beacon Bolt deals damage to target creature equal to the total number of instant and sorcery cards you own in exile and in your graveyard.$Jump-start| -Beamsplitter Mage|Guilds of Ravnica|155|U|{U}{R}|Creature - Vedalken Wizard|2|2|Whenever you cast an instant or sorcery that targets only Beamsplitter Mage, if you control one or more creatures that the spell could target, choose one of them. Copy the spell and it targets the chosen creature.| +Beamsplitter Mage|Guilds of Ravnica|155|U|{U}{R}|Creature - Vedalken Wizard|2|2|Whenever you cast an instant or sorcery that targets only Beamsplitter Mage, if you control one or more creatures that spell could target, choose one of those creatures. Copy that spell. The copy targets the chosen creature.| Boros Challenger|Guilds of Ravnica|156|U|{R}{W}|Creature - Human Soldier|2|3|Mentor${2}{R}{W}: Boros Challenger gets +1/+1 until end of turn.| Camaraderie|Guilds of Ravnica|157|R|{4}{G}{W}|Sorcery|||You gain X life and draw X cards, where X is the number of creatures you control. Creatures you control get +1/+1 until end of turn.| Centaur Peacemaker|Guilds of Ravnica|158|C|{1}{G}{W}|Creature - Centaur Cleric|3|3|When Centaur Peacemaker enters the battlefield, each player gains 4 life.| Chance for Glory|Guilds of Ravnica|159|M|{1}{R}{W}|Instant|||Creatures you control gain indestructible. Take an extra turn after this one. At the beginning of that turn's end step, you lose the game.| Charnel Troll|Guilds of Ravnica|160|R|{1}{B}{G}|Creature - Troll|4|4|Trample$At the beginning of your upkeep, exile a creature card from your graveyard. If you do, put a +1/+1 counter on Charnel Troll. Otherwise sacrifice it.${B}{G}, Discard a creature card: Put a +1/+1 counter on Charnel Troll.| -Conclave Cavalier|Guilds of Ravnica|161|U|{G}{G}{W}{W}|Creature - Centaur Knight|4|4|Vigilance$When Conclave Cavalier dies, create two green and white 2/2 Elf Knight creature tokens with vigilance.| +Conclave Cavalier|Guilds of Ravnica|161|U|{G}{G}{W}{W}|Creature - Centaur Knight|4|4|Vigilance$When Conclave Cavalier dies, create two 2/2 green and white Elf Knight creature tokens with vigilance.| Conclave Guildmage|Guilds of Ravnica|162|U|{G}{W}|Creature - Elf Cleric|2|2|{G}, {T}: Creatures you control gain trample until end of turn.${5}{W}, {T}: Create a 2/2 green and white Elf Knight creature token with vigilance.| Crackling Drake|Guilds of Ravnica|163|U|{U}{U}{R}{R}|Creature - Drake|*|4|Flying$Crackling Drake's power is equal to the total number of instant and sorcery cards you own in exile and in your graveyard.$When Crackling Drake enters the battlefield, draw a card.| Darkblade Agent|Guilds of Ravnica|164|C|{1}{U}{B}|Creature - Human Assassin|2|3|As long as you've surveilled this turn, Darkblade Agent has deathtouch and "Whenever this creature deals combat damage to a player, draw a card."| @@ -34542,7 +34542,7 @@ Boros Locket|Guilds of Ravnica|231|C|{3}|Artifact|||{T}: Add {R} or {W}.${R/W}{R Chamber Sentry|Guilds of Ravnica|232|R|{X}|Artifact Creature - Construct|0|0|Chamber Sentry enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it.${X}, {T}, Remove X +1/+1 counters from Chamber Sentry: It deals X damage to any target.${W}{U}{B}{R}{G}: Return Chamber Sentry from your graveyard to your hand.| Chromatic Lantern|Guilds of Ravnica|233|R|{3}|Artifact|||Lands you control have "{T}: Add one mana of any color."${T}: Add one mana of any color.| Dimir Locket|Guilds of Ravnica|234|C|{3}|Artifact|||{T}: Add {U} or {B}.${U/B}{U/B}{U/B}{U/B}, {T}, Sacrifice Dimir Locket: Draw two cards.| -Gatekeeper Gargoyle|Guilds of Ravnica|235|U|{6}|Artifact Creature - Gargoyle|3|3|Flying$Gargoyle Guardian enters the battlefield with a +1/+1 counter on it for each Gate you control.| +Gatekeeper Gargoyle|Guilds of Ravnica|235|U|{6}|Artifact Creature - Gargoyle|3|3|Flying$Gatekeeper Gargoyle enters the battlefield with a +1/+1 counter on it for each Gate you control.| Glaive of the Guildpact|Guilds of Ravnica|236|U|{2}|Artifact - Equipment|||Equipped creature gets +1/+0 for each Gate you control and has vigilance and menace.$Equip {3}| Golgari Locket|Guilds of Ravnica|237|C|{3}|Artifact|||{T}: Add {B} or {G}.${B/G}{B/G}{B/G}{B/G}, {T}, Sacrifice Golgari Locket: Draw two cards.| Izzet Locket|Guilds of Ravnica|238|C|{3}|Artifact|||{T}: Add {U} or {R}.${U/R}{U/R}{U/R}{U/R}, {T}, Sacrifice Izzet Locket: Draw two cards.| From f16281e315b504f33854eccd1bd8ff7b79f24b05 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 20 Sep 2018 11:40:14 -0400 Subject: [PATCH 104/140] fixed Vigorspore Wurm boost not being locked in --- Mage.Sets/src/mage/cards/v/VigorsporeWurm.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/v/VigorsporeWurm.java b/Mage.Sets/src/mage/cards/v/VigorsporeWurm.java index 5867f5eaf73..71214ca815b 100644 --- a/Mage.Sets/src/mage/cards/v/VigorsporeWurm.java +++ b/Mage.Sets/src/mage/cards/v/VigorsporeWurm.java @@ -45,7 +45,7 @@ public final class VigorsporeWurm extends CardImpl { false, "Undergrowth — " ); ability.addEffect(new BoostTargetEffect( - xValue, xValue, Duration.EndOfTurn + xValue, xValue, Duration.EndOfTurn, true ).setText("and gets +X/+X until end of turn, " + "where X is the number of creature cards in your graveyard.")); ability.addTarget(new TargetCreaturePermanent()); From 8a77b6789cd3e63b91bd43c7cb71badb7b8380f5 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 20 Sep 2018 15:48:58 -0400 Subject: [PATCH 105/140] updated GRN spoiler --- Utils/mtg-cards-data.txt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 7caa103b70c..53c09ed0a13 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -34382,7 +34382,7 @@ Pilfering Imp|Guilds of Ravnica|81|U|{B}|Creature - Imp|1|1|Flying${1}{B}, {T}, Plaguecrafter|Guilds of Ravnica|82|U|{2}{B}|Creature - Human Shaman|3|2|When Plaguecrafter enters the battlefield, each player sacrifices a creature or planeswalker. Each player who can't discards a card.| Price of Fame|Guilds of Ravnica|83|U|{3}{B}|Instant|||This spell costs {2} less to cast if it targets a legendary creature.$Destroy target creature.$Surveil 2.| Ritual of Soot|Guilds of Ravnica|84|R|{2}{B}{B}|Sorcery|||Destroy all creatures with converted mana cost 3 or less.| -Severed Strands|Guilds of Ravnica|85|C|{1}{B}|Sorcery|||As an additional cost to cast this spell, sacrifice a creature.$You gain life equal to that sacrificed creature's toughness. Destroy target creature an opponent controls.| +Severed Strands|Guilds of Ravnica|85|C|{1}{B}|Sorcery|||As an additional cost to cast this spell, sacrifice a creature.$You gain life equal to the sacrificed creature's toughness. Destroy target creature an opponent controls.| Spinal Centipede|Guilds of Ravnica|86|C|{2}{B}|Creature - Insect|3|2|When Spinal Centipede dies, put a +1/+1 counter on target creature you control.| Undercity Necrolisk|Guilds of Ravnica|87|U|{3}{B}|Creature - Zombie Lizard|3|3|{1}, Sacrifice another creature: Put a +1/+1 counter on Undercity Necrolisk. It gains menace until end of turn. Activate this ability only any time you could cast a sorcery.| Veiled Shade|Guilds of Ravnica|88|C|{2}{B}|Creature - Shade|2|2|{1}{B}: Veiled Shade gets +1/+1 until end of turn.| @@ -34457,7 +34457,7 @@ Boros Challenger|Guilds of Ravnica|156|U|{R}{W}|Creature - Human Soldier|2|3|Men Camaraderie|Guilds of Ravnica|157|R|{4}{G}{W}|Sorcery|||You gain X life and draw X cards, where X is the number of creatures you control. Creatures you control get +1/+1 until end of turn.| Centaur Peacemaker|Guilds of Ravnica|158|C|{1}{G}{W}|Creature - Centaur Cleric|3|3|When Centaur Peacemaker enters the battlefield, each player gains 4 life.| Chance for Glory|Guilds of Ravnica|159|M|{1}{R}{W}|Instant|||Creatures you control gain indestructible. Take an extra turn after this one. At the beginning of that turn's end step, you lose the game.| -Charnel Troll|Guilds of Ravnica|160|R|{1}{B}{G}|Creature - Troll|4|4|Trample$At the beginning of your upkeep, exile a creature card from your graveyard. If you do, put a +1/+1 counter on Charnel Troll. Otherwise sacrifice it.${B}{G}, Discard a creature card: Put a +1/+1 counter on Charnel Troll.| +Charnel Troll|Guilds of Ravnica|160|R|{1}{B}{G}|Creature - Troll|4|4|Trample$At the beginning of your upkeep, exile a creature card from your graveyard. If you do, put a +1/+1 counter on Charnel Troll. Otherwise, sacrifice it.${B}{G}, Discard a creature card: Put a +1/+1 counter on Charnel Troll.| Conclave Cavalier|Guilds of Ravnica|161|U|{G}{G}{W}{W}|Creature - Centaur Knight|4|4|Vigilance$When Conclave Cavalier dies, create two 2/2 green and white Elf Knight creature tokens with vigilance.| Conclave Guildmage|Guilds of Ravnica|162|U|{G}{W}|Creature - Elf Cleric|2|2|{G}, {T}: Creatures you control gain trample until end of turn.${5}{W}, {T}: Create a 2/2 green and white Elf Knight creature token with vigilance.| Crackling Drake|Guilds of Ravnica|163|U|{U}{U}{R}{R}|Creature - Drake|*|4|Flying$Crackling Drake's power is equal to the total number of instant and sorcery cards you own in exile and in your graveyard.$When Crackling Drake enters the battlefield, draw a card.| @@ -34568,9 +34568,11 @@ Swamp|Guilds of Ravnica|262|C||Basic Land - Swamp|||({T}: Add {B}.)| Mountain|Guilds of Ravnica|263|C||Basic Land - Mountain|||({T}: Add {R}.)| Forest|Guilds of Ravnica|264|C||Basic Land - Forest|||({T}: Add {G}.)| Ral, Caller of Storms|Guilds of Ravnica|265|M|{4}{U}{R}|Legendary Planeswalker - Ral|4|+1: Draw a card.$-2: Ral, Caller of Storms deals 3 damage divided as you choose among one, two, or three targets.$-7: Draw seven cards. Ral, Caller of Storms deals 7 damage to each creature your opponents control.| -Ral's Dispersal|Guilds of Ravnica|266|R|{3}{U}{U}|Instant|||Return target creature to its owner's hand. You may search you library and/or graveyard for a card named Ral, Caller of Storms, reveal it, and put it into your hand. If you search your library this way, shuffle it.| +Ral's Dispersal|Guilds of Ravnica|266|R|{3}{U}{U}|Instant|||Return target creature to its owner's hand. You may search your library and/or graveyard for a card named Ral, Caller of Storms, reveal it, and put it into your hand. If you search your library this way, shuffle it.| +Precision Bolt|Guilds of Ravnica|267|C|{2}{R}|Sorcery|||Precision Bolt deals 3 damage to any target.| Ral's Staticaster|Guilds of Ravnica|268|U|{2}{U}{R}|Creature - Viashino Wizard|3|3|Trample$Whenever Ral's Staticaster attacks, if you control a Ral planeswalker, Ral's Staticaster gets +1/+0 for each card in your hand until end of turn.| Vraska, Regal Gorgon|Guilds of Ravnica|269|M|{5}{B}{G}|Legendary Planeswalker - Vraska|5|+2: Put a +1/+1 counter on up to one target creature. That creature gains menace until end of turn.$-3: Destroy target creature.$-10: For each creature card in your graveyard, put a +1/+1 counter on each creature you control.| +Kraul Raider|Guilds of Ravnica|270|C|{2}{B}|Creature - Insect Warrior|2|3|Menace| Attendant of Vraska|Guilds of Ravnica|271|U|{1}{B}{G}|Creature - Zombie Soldier|3|3|When Attendant of Vraska dies, if you control a Vraska planeswalker, you gain life equal to Attendant of Vraska's power.| -Vraska's Stoneglare|Guilds of Ravnica|272|R|{4}{B}{G}|Sorcery|||Destroy target creature. You gain life equal to its toughness. You may search your library and/or graveyard from a card named Vraska, Regal Gorgon, reveal it, and put it into your hand. If you search your library this way, shuffle it.| +Vraska's Stoneglare|Guilds of Ravnica|272|R|{4}{B}{G}|Sorcery|||Destroy target creature. You gain life equal to its toughness. You may search your library and/or graveyard for a card named Vraska, Regal Gorgon, reveal it, and put it into your hand. If you search your library this way, shuffle it.| Impervious Greatwurm|Guilds of Ravnica|273|M|{7}{G}{G}{G}|Creature - Wurm|16|16|Convoke$Indestructible| \ No newline at end of file From abeb6e207f59e3fe27db7ad5a712569e324220b5 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 20 Sep 2018 15:49:53 -0400 Subject: [PATCH 106/140] Implemented Kraul Raider --- Mage.Sets/src/mage/cards/k/KraulRaider.java | 37 ++++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 38 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/k/KraulRaider.java diff --git a/Mage.Sets/src/mage/cards/k/KraulRaider.java b/Mage.Sets/src/mage/cards/k/KraulRaider.java new file mode 100644 index 00000000000..74fd9eb2eb2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/k/KraulRaider.java @@ -0,0 +1,37 @@ +package mage.cards.k; + +import java.util.UUID; +import mage.MageInt; +import mage.constants.SubType; +import mage.abilities.keyword.MenaceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author TheElk801 + */ +public final class KraulRaider extends CardImpl { + + public KraulRaider(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{B}"); + + this.subtype.add(SubType.INSECT); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Menace + this.addAbility(new MenaceAbility()); + } + + public KraulRaider(final KraulRaider card) { + super(card); + } + + @Override + public KraulRaider copy() { + return new KraulRaider(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index afb52a48c8b..3dddb24360b 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -150,6 +150,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Knight of Autumn", 183, Rarity.RARE, mage.cards.k.KnightOfAutumn.class)); cards.add(new SetCardInfo("Kraul Foragers", 135, Rarity.COMMON, mage.cards.k.KraulForagers.class)); cards.add(new SetCardInfo("Kraul Harpooner", 136, Rarity.UNCOMMON, mage.cards.k.KraulHarpooner.class)); + cards.add(new SetCardInfo("Kraul Raider", 270, Rarity.COMMON, mage.cards.k.KraulRaider.class)); cards.add(new SetCardInfo("Kraul Swarm", 73, Rarity.UNCOMMON, mage.cards.k.KraulSwarm.class)); cards.add(new SetCardInfo("Lava Coil", 108, Rarity.UNCOMMON, mage.cards.l.LavaCoil.class)); cards.add(new SetCardInfo("Lazav, the Multifarious", 184, Rarity.MYTHIC, mage.cards.l.LazavTheMultifarious.class)); From 6031a16e530860a0a7361369925e8223fc093da7 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 20 Sep 2018 15:52:20 -0400 Subject: [PATCH 107/140] Implemented Precision Bolt --- Mage.Sets/src/mage/cards/p/PrecisionBolt.java | 32 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 33 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/p/PrecisionBolt.java diff --git a/Mage.Sets/src/mage/cards/p/PrecisionBolt.java b/Mage.Sets/src/mage/cards/p/PrecisionBolt.java new file mode 100644 index 00000000000..ae221c978ae --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PrecisionBolt.java @@ -0,0 +1,32 @@ +package mage.cards.p; + +import java.util.UUID; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetAnyTarget; + +/** + * + * @author TheElk801 + */ +public final class PrecisionBolt extends CardImpl { + + public PrecisionBolt(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{R}"); + + // Precision Bolt deals 3 damage to any target. + this.getSpellAbility().addEffect(new DamageTargetEffect(3)); + this.getSpellAbility().addTarget(new TargetAnyTarget()); + } + + public PrecisionBolt(final PrecisionBolt card) { + super(card); + } + + @Override + public PrecisionBolt copy() { + return new PrecisionBolt(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 3dddb24360b..feb87734c55 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -199,6 +199,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Pitiless Gorgon", 218, Rarity.COMMON, mage.cards.p.PitilessGorgon.class)); cards.add(new SetCardInfo("Plains", 260, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Portcullis Vine", 142, Rarity.COMMON, mage.cards.p.PortcullisVine.class)); + cards.add(new SetCardInfo("Precision Bolt", 267, Rarity.COMMON, mage.cards.p.PrecisionBolt.class)); cards.add(new SetCardInfo("Prey Upon", 143, Rarity.COMMON, mage.cards.p.PreyUpon.class)); cards.add(new SetCardInfo("Price of Fame", 83, Rarity.UNCOMMON, mage.cards.p.PriceOfFame.class)); cards.add(new SetCardInfo("Quasiduplicate", 51, Rarity.RARE, mage.cards.q.Quasiduplicate.class)); From 7f81fc64374ed6d7ea90ea072aac9baa4dd21024 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 20 Sep 2018 20:06:34 -0400 Subject: [PATCH 108/140] Implemented Devious Cover-up --- .../src/mage/cards/d/DeviousCoverUp.java | 83 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 84 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/d/DeviousCoverUp.java diff --git a/Mage.Sets/src/mage/cards/d/DeviousCoverUp.java b/Mage.Sets/src/mage/cards/d/DeviousCoverUp.java new file mode 100644 index 00000000000..6df5646a40a --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DeviousCoverUp.java @@ -0,0 +1,83 @@ +package mage.cards.d; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CounterTargetWithReplacementEffect; +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.constants.Zone; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetSpell; +import mage.target.common.TargetCardInYourGraveyard; +import mage.target.targetpointer.SecondTargetPointer; + +/** + * + * @author TheElk801 + */ +public final class DeviousCoverUp extends CardImpl { + + public DeviousCoverUp(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{2}{U}{U}"); + + // Counter target spell. If that spell is countered this way, exile it instead of putting it into its owner's graveyard. + this.getSpellAbility().addEffect(new CounterTargetWithReplacementEffect(Zone.EXILED)); + this.getSpellAbility().addTarget(new TargetSpell()); + + // You may shuffle up to four target cards from your graveyard into your library. + this.getSpellAbility().addEffect(new DeviousCoverUpEffect().setTargetPointer(new SecondTargetPointer())); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, 5)); + } + + public DeviousCoverUp(final DeviousCoverUp card) { + super(card); + } + + @Override + public DeviousCoverUp copy() { + return new DeviousCoverUp(this); + } +} + +class DeviousCoverUpEffect extends OneShotEffect { + + public DeviousCoverUpEffect() { + super(Outcome.Benefit); + this.staticText = "You may shuffle up to five target cards " + + "from your graveyard into your library."; + } + + public DeviousCoverUpEffect(final DeviousCoverUpEffect effect) { + super(effect); + } + + @Override + public DeviousCoverUpEffect copy() { + return new DeviousCoverUpEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getFirstTarget()); + if (player == null || !player.chooseUse(outcome, "Shuffle the targeted cards into your library?", source, game)) { + return false; + } + Cards cards = new CardsImpl(); + for (UUID targetId : targetPointer.getTargets(game, source)) { + Card card = game.getCard(targetId); + if (card != null) { + cards.add(card); + } + } + player.getLibrary().addAll(cards.getCards(game), game); + player.shuffleLibrary(source, game); + return true; + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index feb87734c55..62ce736e7ea 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -71,6 +71,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Dead Weight", 67, Rarity.COMMON, mage.cards.d.DeadWeight.class)); cards.add(new SetCardInfo("Deadly Visit", 68, Rarity.COMMON, mage.cards.d.DeadlyVisit.class)); cards.add(new SetCardInfo("Deafening Clarion", 165, Rarity.RARE, mage.cards.d.DeafeningClarion.class)); + cards.add(new SetCardInfo("Devious Cover-up", 35, Rarity.COMMON, mage.cards.d.DeviousCoverUp.class)); cards.add(new SetCardInfo("Devkarin Dissident", 127, Rarity.COMMON, mage.cards.d.DevkarinDissident.class)); cards.add(new SetCardInfo("Dimir Guildgate", 245, Rarity.COMMON, mage.cards.d.DimirGuildgate.class)); cards.add(new SetCardInfo("Dimir Guildgate", 246, Rarity.COMMON, mage.cards.d.DimirGuildgate.class)); From 18ba009667feb40fa226858f7197e253f11340a0 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Thu, 20 Sep 2018 20:43:12 -0400 Subject: [PATCH 109/140] Implemented Selective Snare --- .../src/mage/cards/s/SelectiveSnare.java | 70 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 71 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SelectiveSnare.java diff --git a/Mage.Sets/src/mage/cards/s/SelectiveSnare.java b/Mage.Sets/src/mage/cards/s/SelectiveSnare.java new file mode 100644 index 00000000000..61f62f5d605 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SelectiveSnare.java @@ -0,0 +1,70 @@ +package mage.cards.s; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.choices.Choice; +import mage.choices.ChoiceCreatureType; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetPermanent; +import mage.target.targetadjustment.TargetAdjuster; + +/** + * + * @author TheElk801 + */ +public final class SelectiveSnare extends CardImpl { + + public SelectiveSnare(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{X}{U}"); + + // Return X target creatures of the creature type of your choice to their owner's hand. + this.getSpellAbility().addEffect( + new ReturnToHandTargetEffect(true) + .setText("Return X target creatures of " + + "the creature type of your choice " + + "to their owner's hand") + ); + this.getSpellAbility().setTargetAdjuster(SelectiveSnareAdjuster.instance); + } + + public SelectiveSnare(final SelectiveSnare card) { + super(card); + } + + @Override + public SelectiveSnare copy() { + return new SelectiveSnare(this); + } +} + +enum SelectiveSnareAdjuster implements TargetAdjuster { + instance; + + @Override + public void adjustTargets(Ability ability, Game game) { + Player player = game.getPlayer(ability.getControllerId()); + if (player == null) { + return; + } + Choice choice = new ChoiceCreatureType(); + if (!player.choose(Outcome.Benefit, choice, game)) { + return; + } + SubType subType = SubType.byDescription(choice.getChoice()); + int xValue = ability.getManaCostsToPay().getX(); + FilterPermanent filter = new FilterCreaturePermanent(subType.toString() + " creatures"); + filter.add(new SubtypePredicate(subType)); + ability.getTargets().clear(); + ability.addTarget(new TargetPermanent(xValue, filter)); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 62ce736e7ea..c110f841320 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -220,6 +220,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Rubblebelt Boar", 114, Rarity.COMMON, mage.cards.r.RubblebeltBoar.class)); cards.add(new SetCardInfo("Runaway Steam-Kin", 115, Rarity.RARE, mage.cards.r.RunawaySteamKin.class)); cards.add(new SetCardInfo("Sacred Foundry", 254, Rarity.RARE, mage.cards.s.SacredFoundry.class)); + cards.add(new SetCardInfo("Selective Snare", 53, Rarity.UNCOMMON, mage.cards.s.SelectiveSnare.class)); cards.add(new SetCardInfo("Selesnya Guildgate", 255, Rarity.COMMON, mage.cards.s.SelesnyaGuildgate.class)); cards.add(new SetCardInfo("Selesnya Guildgate", 256, Rarity.COMMON, mage.cards.s.SelesnyaGuildgate.class)); cards.add(new SetCardInfo("Selesnya Locket", 240, Rarity.COMMON, mage.cards.s.SelesnyaLocket.class)); From 34f46b27f31537c89fc0dfa767bbfb11b9889c79 Mon Sep 17 00:00:00 2001 From: Miguel Sainz Jr Date: Fri, 21 Sep 2018 05:31:35 -0400 Subject: [PATCH 110/140] GRN - Add Card - Plaguecrafter - 082 --- Mage.Sets/src/mage/cards/p/Plaguecrafter.java | 94 +++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 95 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/p/Plaguecrafter.java diff --git a/Mage.Sets/src/mage/cards/p/Plaguecrafter.java b/Mage.Sets/src/mage/cards/p/Plaguecrafter.java new file mode 100644 index 00000000000..946ca6ff324 --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/Plaguecrafter.java @@ -0,0 +1,94 @@ +package mage.cards.p; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.SacrificeEffect; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.discard.DiscardTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.filter.FilterPermanent; +import mage.filter.StaticFilters; +import mage.filter.common.FilterCreatureOrPlaneswalkerPermanent; +import mage.filter.predicate.permanent.ControllerIdPredicate; +import mage.game.Game; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author themogwi + */ +public final class Plaguecrafter extends CardImpl { + + public Plaguecrafter(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{B}"); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.SHAMAN); + + this.power = new MageInt(3); + this.toughness = new MageInt(2); + + // When Plaguecrafter enters the battlefield. + // Each player sacrifices a creature or planeswalker. + // Each player who can't discards a card. + this.addAbility(new EntersBattlefieldTriggeredAbility(new PlaguecrafterEffect())); + } + + public Plaguecrafter(final Plaguecrafter card) { + super(card); + } + + @Override + public Plaguecrafter copy() { + return new Plaguecrafter(this); + } +} + + +class PlaguecrafterEffect extends OneShotEffect { + + public PlaguecrafterEffect() { + super(Outcome.Benefit); + this.staticText = "Each player sacrifices a creature or planeswalker. " + + "Each player who can't discards a card."; + } + + public PlaguecrafterEffect(final PlaguecrafterEffect effect) { + super(effect); + } + + @Override + public PlaguecrafterEffect copy() { + return new PlaguecrafterEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + game.getPlayers().forEach((playerId, player) -> { + if (!(player == null)) { + FilterPermanent filter = new FilterCreatureOrPlaneswalkerPermanent(); + filter.add(new ControllerIdPredicate(playerId)); + if (game.getBattlefield().getActivePermanents( + filter, source.getControllerId(), game + ).isEmpty()) { + Effect discardEffect = new DiscardTargetEffect(1); + discardEffect.setTargetPointer(new FixedTarget(playerId, game)); + discardEffect.apply(game, source); + } else { + Effect effect = new SacrificeEffect( + StaticFilters.FILTER_PERMANENT_CREATURE_OR_PLANESWALKER_A, 1, null + ); + effect.setTargetPointer(new FixedTarget(playerId, game)); + effect.apply(game, source); + } + } + }); + return true; + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index c110f841320..1132e478f50 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -198,6 +198,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Pilfering Imp", 81, Rarity.UNCOMMON, mage.cards.p.PilferingImp.class)); cards.add(new SetCardInfo("Piston-Fist Cyclops", 217, Rarity.COMMON, mage.cards.p.PistonFistCyclops.class)); cards.add(new SetCardInfo("Pitiless Gorgon", 218, Rarity.COMMON, mage.cards.p.PitilessGorgon.class)); + cards.add(new SetCardInfo("Plaguecrafter", 82, Rarity.UNCOMMON, mage.cards.p.Plaguecrafter.class)); cards.add(new SetCardInfo("Plains", 260, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Portcullis Vine", 142, Rarity.COMMON, mage.cards.p.PortcullisVine.class)); cards.add(new SetCardInfo("Precision Bolt", 267, Rarity.COMMON, mage.cards.p.PrecisionBolt.class)); From f831d5fcc570f3da6f7d61257016418739811b0b Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 21 Sep 2018 13:55:30 +0200 Subject: [PATCH 111/140] [GRN] Added Unmoored Ego. --- Mage.Sets/src/mage/cards/u/UnmooredEgo.java | 124 ++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 571 ++++++++++--------- 2 files changed, 410 insertions(+), 285 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/u/UnmooredEgo.java diff --git a/Mage.Sets/src/mage/cards/u/UnmooredEgo.java b/Mage.Sets/src/mage/cards/u/UnmooredEgo.java new file mode 100644 index 00000000000..8b09521818b --- /dev/null +++ b/Mage.Sets/src/mage/cards/u/UnmooredEgo.java @@ -0,0 +1,124 @@ +package mage.cards.u; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ChooseACardNameEffect; +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.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.NamePredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetCard; +import mage.target.common.TargetCardInLibrary; +import mage.target.common.TargetOpponent; + +/** + * + * @author LevelX2 + */ +public final class UnmooredEgo extends CardImpl { + + public UnmooredEgo(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{U}{B}"); + + // Choose a card name. Search target opponent's graveyard, hand, and library for up to four cards with that name and exile them. That player shuffles their library, then draws a card for each card exiled from their hand this way. + this.getSpellAbility().addEffect((new ChooseACardNameEffect(ChooseACardNameEffect.TypeOfName.ALL))); + this.getSpellAbility().addEffect(new UnmooredEgoEffect()); + this.getSpellAbility().addTarget(new TargetOpponent()); + } + + public UnmooredEgo(final UnmooredEgo card) { + super(card); + } + + @Override + public UnmooredEgo copy() { + return new UnmooredEgo(this); + } +} + +class UnmooredEgoEffect extends OneShotEffect { + + public UnmooredEgoEffect() { + super(Outcome.Benefit); + this.staticText = "Search target opponent's graveyard, hand, and library for up to four cards with that name and exile them. That player shuffles their library, then draws a card for each card exiled from their hand this way"; + } + + public UnmooredEgoEffect(final UnmooredEgoEffect effect) { + super(effect); + } + + @Override + public UnmooredEgoEffect copy() { + return new UnmooredEgoEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + String cardName = (String) game.getState().getValue(source.getSourceId().toString() + ChooseACardNameEffect.INFO_KEY); + Player controller = game.getPlayer(source.getControllerId()); + if (cardName != null && controller != null) { + int numberOfCardsStillToRemove = 4; + int numberOfCardsExiledFromHand = 0; + Player targetPlayer = game.getPlayer(getTargetPointer().getFirst(game, source)); + if (targetPlayer != null) { + FilterCard filter = new FilterCard("card named " + cardName); + filter.add(new NamePredicate(cardName)); + + // cards in Graveyard + int cardsCount = (cardName.isEmpty() ? 0 : targetPlayer.getGraveyard().count(filter, game)); + if (cardsCount > 0) { + filter.setMessage("card named " + cardName + " in the graveyard of " + targetPlayer.getName()); + TargetCard target = new TargetCard(Math.min(cardsCount, numberOfCardsStillToRemove), + Math.min(cardsCount, numberOfCardsStillToRemove), Zone.GRAVEYARD, filter); + if (controller.choose(Outcome.Exile, targetPlayer.getGraveyard(), target, game)) { + numberOfCardsStillToRemove -= target.getTargets().size(); + controller.moveCards(new CardsImpl(target.getTargets()), Zone.EXILED, source, game); + } + } + + // cards in Hand + if (numberOfCardsStillToRemove > 0) { + cardsCount = (cardName.isEmpty() ? 0 : targetPlayer.getHand().count(filter, game)); + filter.setMessage("card named " + cardName + " in the hand of " + targetPlayer.getName()); + TargetCard target = new TargetCard(0, Math.min(cardsCount, numberOfCardsStillToRemove), Zone.HAND, filter); + if (controller.choose(Outcome.Exile, targetPlayer.getHand(), target, game)) { + numberOfCardsExiledFromHand = target.getTargets().size(); + numberOfCardsStillToRemove -= target.getTargets().size(); + controller.moveCards(new CardsImpl(target.getTargets()), Zone.EXILED, source, game); + } + } + + // cards in Library + if (numberOfCardsStillToRemove > 0) { + Cards cardsInLibrary = new CardsImpl(); + cardsInLibrary.addAll(targetPlayer.getLibrary().getCards(game)); + cardsCount = (cardName.isEmpty() ? 0 : cardsInLibrary.count(filter, game)); + filter.setMessage("card named " + cardName + " in the library of " + targetPlayer.getLogName()); + TargetCardInLibrary targetLib = new TargetCardInLibrary(0, Math.min(cardsCount, numberOfCardsStillToRemove), filter); + if (controller.choose(Outcome.Exile, cardsInLibrary, targetLib, game)) { + controller.moveCards(new CardsImpl(targetLib.getTargets()), Zone.EXILED, source, game); + } + } + targetPlayer.shuffleLibrary(source, game); + + if (numberOfCardsExiledFromHand > 0) { + game.getState().applyEffects(game); + targetPlayer.drawCards(numberOfCardsExiledFromHand, game); + } + } + + return true; + } + + return false; + } + +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index c110f841320..51e7c4c4198 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -1,285 +1,286 @@ -package mage.sets; - -import mage.cards.ExpansionSet; -import mage.constants.Rarity; -import mage.constants.SetType; - -public final class GuildsOfRavnica extends ExpansionSet { - - private static final GuildsOfRavnica instance = new GuildsOfRavnica(); - - public static GuildsOfRavnica getInstance() { - return instance; - } - - private GuildsOfRavnica() { - super("Guilds of Ravnica", "GRN", ExpansionSet.buildDate(2018, 10, 5), SetType.EXPANSION); - this.blockName = "Guilds of Ravnica"; - this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; - this.numBoosterUncommon = 3; - this.numBoosterRare = 1; - this.ratioBoosterMythic = 8; - - cards.add(new SetCardInfo("Affectionate Indrik", 121, Rarity.UNCOMMON, mage.cards.a.AffectionateIndrik.class)); - cards.add(new SetCardInfo("Arboretum Elemental", 122, Rarity.UNCOMMON, mage.cards.a.ArboretumElemental.class)); - cards.add(new SetCardInfo("Arclight Phoenix", 91, Rarity.MYTHIC, mage.cards.a.ArclightPhoenix.class)); - cards.add(new SetCardInfo("Artful Takedown", 151, Rarity.COMMON, mage.cards.a.ArtfulTakedown.class)); - cards.add(new SetCardInfo("Assassin's Trophy", 152, Rarity.RARE, mage.cards.a.AssassinsTrophy.class)); - cards.add(new SetCardInfo("Assure // Assemble", 221, Rarity.RARE, mage.cards.a.AssureAssemble.class)); - cards.add(new SetCardInfo("Attendant of Vraska", 271, Rarity.UNCOMMON, mage.cards.a.AttendantOfVraska.class)); - cards.add(new SetCardInfo("Aurelia, Exemplar of Justice", 153, Rarity.MYTHIC, mage.cards.a.AureliaExemplarOfJustice.class)); - cards.add(new SetCardInfo("Barging Sergeant", 92, Rarity.COMMON, mage.cards.b.BargingSergeant.class)); - cards.add(new SetCardInfo("Barrier of Bones", 61, Rarity.COMMON, mage.cards.b.BarrierOfBones.class)); - cards.add(new SetCardInfo("Bartizan Bats", 62, Rarity.COMMON, mage.cards.b.BartizanBats.class)); - cards.add(new SetCardInfo("Beacon Bolt", 154, Rarity.UNCOMMON, mage.cards.b.BeaconBolt.class)); - cards.add(new SetCardInfo("Beast Whisperer", 123, Rarity.RARE, mage.cards.b.BeastWhisperer.class)); - cards.add(new SetCardInfo("Blade Instructor", 1, Rarity.COMMON, mage.cards.b.BladeInstructor.class)); - cards.add(new SetCardInfo("Blood Operative", 63, Rarity.RARE, mage.cards.b.BloodOperative.class)); - cards.add(new SetCardInfo("Book Devourer", 93, Rarity.UNCOMMON, mage.cards.b.BookDevourer.class)); - cards.add(new SetCardInfo("Boros Challenger", 156, Rarity.UNCOMMON, mage.cards.b.BorosChallenger.class)); - cards.add(new SetCardInfo("Boros Guildgate", 243, Rarity.COMMON, mage.cards.b.BorosGuildgate.class)); - cards.add(new SetCardInfo("Boros Guildgate", 244, Rarity.COMMON, mage.cards.b.BorosGuildgate.class)); - cards.add(new SetCardInfo("Boros Locket", 231, Rarity.COMMON, mage.cards.b.BorosLocket.class)); - cards.add(new SetCardInfo("Bounty Agent", 2, Rarity.RARE, mage.cards.b.BountyAgent.class)); - cards.add(new SetCardInfo("Burglar Rat", 64, Rarity.COMMON, mage.cards.b.BurglarRat.class)); - cards.add(new SetCardInfo("Camaraderie", 157, Rarity.RARE, mage.cards.c.Camaraderie.class)); - cards.add(new SetCardInfo("Capture Sphere", 31, Rarity.COMMON, mage.cards.c.CaptureSphere.class)); - cards.add(new SetCardInfo("Centaur Peacemaker", 158, Rarity.COMMON, mage.cards.c.CentaurPeacemaker.class)); - cards.add(new SetCardInfo("Chamber Sentry", 232, Rarity.RARE, mage.cards.c.ChamberSentry.class)); - cards.add(new SetCardInfo("Chance for Glory", 159, Rarity.MYTHIC, mage.cards.c.ChanceForGlory.class)); - cards.add(new SetCardInfo("Charnel Troll", 160, Rarity.RARE, mage.cards.c.CharnelTroll.class)); - cards.add(new SetCardInfo("Chemister's Insight", 32, Rarity.UNCOMMON, mage.cards.c.ChemistersInsight.class)); - cards.add(new SetCardInfo("Child of Night", 65, Rarity.COMMON, mage.cards.c.ChildOfNight.class)); - cards.add(new SetCardInfo("Chromatic Lantern", 233, Rarity.RARE, mage.cards.c.ChromaticLantern.class)); - cards.add(new SetCardInfo("Circuitous Route", 125, Rarity.UNCOMMON, mage.cards.c.CircuitousRoute.class)); - cards.add(new SetCardInfo("Citywatch Sphinx", 33, Rarity.UNCOMMON, mage.cards.c.CitywatchSphinx.class)); - cards.add(new SetCardInfo("Citywide Bust", 4, Rarity.RARE, mage.cards.c.CitywideBust.class)); - cards.add(new SetCardInfo("Command the Storm", 94, Rarity.COMMON, mage.cards.c.CommandTheStorm.class)); - cards.add(new SetCardInfo("Conclave Cavalier", 161, Rarity.UNCOMMON, mage.cards.c.ConclaveCavalier.class)); - cards.add(new SetCardInfo("Conclave Guildmage", 162, Rarity.UNCOMMON, mage.cards.c.ConclaveGuildmage.class)); - cards.add(new SetCardInfo("Conclave Tribunal", 6, Rarity.UNCOMMON, mage.cards.c.ConclaveTribunal.class)); - cards.add(new SetCardInfo("Connive // Concoct", 222, Rarity.RARE, mage.cards.c.ConniveConcoct.class)); - cards.add(new SetCardInfo("Cosmotronic Wave", 95, Rarity.COMMON, mage.cards.c.CosmotronicWave.class)); - cards.add(new SetCardInfo("Crackling Drake", 163, Rarity.UNCOMMON, mage.cards.c.CracklingDrake.class)); - cards.add(new SetCardInfo("Creeping Chill", 66, Rarity.UNCOMMON, mage.cards.c.CreepingChill.class)); - cards.add(new SetCardInfo("Crushing Canopy", 126, Rarity.COMMON, mage.cards.c.CrushingCanopy.class)); - cards.add(new SetCardInfo("Darkblade Agent", 164, Rarity.COMMON, mage.cards.d.DarkbladeAgent.class)); - cards.add(new SetCardInfo("Dawn of Hope", 8, Rarity.RARE, mage.cards.d.DawnOfHope.class)); - cards.add(new SetCardInfo("Dazzling Lights", 34, Rarity.COMMON, mage.cards.d.DazzlingLights.class)); - cards.add(new SetCardInfo("Dead Weight", 67, Rarity.COMMON, mage.cards.d.DeadWeight.class)); - cards.add(new SetCardInfo("Deadly Visit", 68, Rarity.COMMON, mage.cards.d.DeadlyVisit.class)); - cards.add(new SetCardInfo("Deafening Clarion", 165, Rarity.RARE, mage.cards.d.DeafeningClarion.class)); - cards.add(new SetCardInfo("Devious Cover-up", 35, Rarity.COMMON, mage.cards.d.DeviousCoverUp.class)); - cards.add(new SetCardInfo("Devkarin Dissident", 127, Rarity.COMMON, mage.cards.d.DevkarinDissident.class)); - cards.add(new SetCardInfo("Dimir Guildgate", 245, Rarity.COMMON, mage.cards.d.DimirGuildgate.class)); - cards.add(new SetCardInfo("Dimir Guildgate", 246, Rarity.COMMON, mage.cards.d.DimirGuildgate.class)); - cards.add(new SetCardInfo("Dimir Informant", 36, Rarity.COMMON, mage.cards.d.DimirInformant.class)); - cards.add(new SetCardInfo("Dimir Locket", 234, Rarity.COMMON, mage.cards.d.DimirLocket.class)); - cards.add(new SetCardInfo("Dimir Spybug", 166, Rarity.UNCOMMON, mage.cards.d.DimirSpybug.class)); - cards.add(new SetCardInfo("Direct Current", 96, Rarity.COMMON, mage.cards.d.DirectCurrent.class)); - cards.add(new SetCardInfo("Discovery // Dispersal", 223, Rarity.UNCOMMON, mage.cards.d.DiscoveryDispersal.class)); - cards.add(new SetCardInfo("Disdainful Stroke", 37, Rarity.COMMON, mage.cards.d.DisdainfulStroke.class)); - cards.add(new SetCardInfo("Disinformation Campaign", 167, Rarity.UNCOMMON, mage.cards.d.DisinformationCampaign.class)); - cards.add(new SetCardInfo("District Guide", 128, Rarity.UNCOMMON, mage.cards.d.DistrictGuide.class)); - cards.add(new SetCardInfo("Divine Visitation", 10, Rarity.MYTHIC, mage.cards.d.DivineVisitation.class)); - cards.add(new SetCardInfo("Doom Whisperer", 69, Rarity.MYTHIC, mage.cards.d.DoomWhisperer.class)); - cards.add(new SetCardInfo("Douser of Lights", 70, Rarity.COMMON, mage.cards.d.DouserOfLights.class)); - cards.add(new SetCardInfo("Dream Eater", 38, Rarity.MYTHIC, mage.cards.d.DreamEater.class)); - cards.add(new SetCardInfo("Drowned Secrets", 39, Rarity.RARE, mage.cards.d.DrownedSecrets.class)); - cards.add(new SetCardInfo("Electrostatic Field", 97, Rarity.UNCOMMON, mage.cards.e.ElectrostaticField.class)); - cards.add(new SetCardInfo("Emmara, Soul of the Accord", 168, Rarity.RARE, mage.cards.e.EmmaraSoulOfTheAccord.class)); - cards.add(new SetCardInfo("Enhanced Surveillance", 40, Rarity.UNCOMMON, mage.cards.e.EnhancedSurveillance.class)); - cards.add(new SetCardInfo("Erratic Cyclops", 98, Rarity.RARE, mage.cards.e.ErraticCyclops.class)); - cards.add(new SetCardInfo("Erstwhile Trooper", 169, Rarity.COMMON, mage.cards.e.ErstwhileTrooper.class)); - cards.add(new SetCardInfo("Etrata, the Silencer", 170, Rarity.RARE, mage.cards.e.EtrataTheSilencer.class)); - cards.add(new SetCardInfo("Expansion // Explosion", 224, Rarity.RARE, mage.cards.e.ExpansionExplosion.class)); - cards.add(new SetCardInfo("Fearless Halberdier", 100, Rarity.COMMON, mage.cards.f.FearlessHalberdier.class)); - cards.add(new SetCardInfo("Find // Finality", 225, Rarity.RARE, mage.cards.f.FindFinality.class)); - cards.add(new SetCardInfo("Fire Urchin", 101, Rarity.COMMON, mage.cards.f.FireUrchin.class)); - cards.add(new SetCardInfo("Firemind's Research", 171, Rarity.RARE, mage.cards.f.FiremindsResearch.class)); - cards.add(new SetCardInfo("Flight of Equenauts", 11, Rarity.UNCOMMON, mage.cards.f.FlightOfEquenauts.class)); - cards.add(new SetCardInfo("Flower // Flourish", 226, Rarity.UNCOMMON, mage.cards.f.FlowerFlourish.class)); - cards.add(new SetCardInfo("Forest", 264, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Fresh-Faced Recruit", 216, Rarity.COMMON, mage.cards.f.FreshFacedRecruit.class)); - cards.add(new SetCardInfo("Garrison Sergeant", 172, Rarity.COMMON, mage.cards.g.GarrisonSergeant.class)); - cards.add(new SetCardInfo("Gatekeeper Gargoyle", 235, Rarity.UNCOMMON, mage.cards.g.GatekeeperGargoyle.class)); - cards.add(new SetCardInfo("Gateway Plaza", 247, Rarity.COMMON, mage.cards.g.GatewayPlaza.class)); - cards.add(new SetCardInfo("Generous Stray", 129, Rarity.COMMON, mage.cards.g.GenerousStray.class)); - cards.add(new SetCardInfo("Gird for Battle", 12, Rarity.UNCOMMON, mage.cards.g.GirdForBattle.class)); - cards.add(new SetCardInfo("Glaive of the Guildpact", 236, Rarity.UNCOMMON, mage.cards.g.GlaiveOfTheGuildpact.class)); - cards.add(new SetCardInfo("Glowspore Shaman", 173, Rarity.UNCOMMON, mage.cards.g.GlowsporeShaman.class)); - cards.add(new SetCardInfo("Goblin Banneret", 102, Rarity.UNCOMMON, mage.cards.g.GoblinBanneret.class)); - cards.add(new SetCardInfo("Goblin Cratermaker", 103, Rarity.UNCOMMON, mage.cards.g.GoblinCratermaker.class)); - cards.add(new SetCardInfo("Goblin Electromancer", 174, Rarity.COMMON, mage.cards.g.GoblinElectromancer.class)); - cards.add(new SetCardInfo("Goblin Locksmith", 104, Rarity.COMMON, mage.cards.g.GoblinLocksmith.class)); - cards.add(new SetCardInfo("Golgari Findbroker", 175, Rarity.UNCOMMON, mage.cards.g.GolgariFindbroker.class)); - cards.add(new SetCardInfo("Golgari Guildgate", 248, Rarity.COMMON, mage.cards.g.GolgariGuildgate.class)); - cards.add(new SetCardInfo("Golgari Guildgate", 249, Rarity.COMMON, mage.cards.g.GolgariGuildgate.class)); - cards.add(new SetCardInfo("Golgari Locket", 237, Rarity.COMMON, mage.cards.g.GolgariLocket.class)); - cards.add(new SetCardInfo("Golgari Raiders", 130, Rarity.UNCOMMON, mage.cards.g.GolgariRaiders.class)); - cards.add(new SetCardInfo("Grappling Sundew", 131, Rarity.UNCOMMON, mage.cards.g.GrapplingSundew.class)); - cards.add(new SetCardInfo("Gravitic Punch", 105, Rarity.COMMON, mage.cards.g.GraviticPunch.class)); - cards.add(new SetCardInfo("Gruesome Menagerie", 71, Rarity.RARE, mage.cards.g.GruesomeMenagerie.class)); - cards.add(new SetCardInfo("Guild Summit", 41, Rarity.UNCOMMON, mage.cards.g.GuildSummit.class)); - cards.add(new SetCardInfo("Haazda Marshal", 13, Rarity.UNCOMMON, mage.cards.h.HaazdaMarshal.class)); - cards.add(new SetCardInfo("Hammer Dropper", 176, Rarity.COMMON, mage.cards.h.HammerDropper.class)); - cards.add(new SetCardInfo("Hatchery Spider", 132, Rarity.RARE, mage.cards.h.HatcherySpider.class)); - cards.add(new SetCardInfo("Healer's Hawk", 14, Rarity.COMMON, mage.cards.h.HealersHawk.class)); - cards.add(new SetCardInfo("Hellkite Whelp", 106, Rarity.UNCOMMON, mage.cards.h.HellkiteWhelp.class)); - cards.add(new SetCardInfo("Hired Poisoner", 72, Rarity.COMMON, mage.cards.h.HiredPoisoner.class)); - cards.add(new SetCardInfo("Hitchclaw Recluse", 133, Rarity.COMMON, mage.cards.h.HitchclawRecluse.class)); - cards.add(new SetCardInfo("House Guildmage", 177, Rarity.UNCOMMON, mage.cards.h.HouseGuildmage.class)); - cards.add(new SetCardInfo("Hunted Witness", 15, Rarity.COMMON, mage.cards.h.HuntedWitness.class)); - cards.add(new SetCardInfo("Hypothesizzle", 178, Rarity.COMMON, mage.cards.h.Hypothesizzle.class)); - cards.add(new SetCardInfo("Impervious Greatwurm", 273, Rarity.MYTHIC, mage.cards.i.ImperviousGreatwurm.class)); - cards.add(new SetCardInfo("Inescapable Blaze", 107, Rarity.UNCOMMON, mage.cards.i.InescapableBlaze.class)); - cards.add(new SetCardInfo("Invert // Invent", 228, Rarity.UNCOMMON, mage.cards.i.InvertInvent.class)); - cards.add(new SetCardInfo("Inspiring Unicorn", 16, Rarity.UNCOMMON, mage.cards.i.InspiringUnicorn.class)); - cards.add(new SetCardInfo("Integrity // Intervention", 227, Rarity.UNCOMMON, mage.cards.i.IntegrityIntervention.class)); - cards.add(new SetCardInfo("Intrusive Packbeast", 17, Rarity.COMMON, mage.cards.i.IntrusivePackbeast.class)); - cards.add(new SetCardInfo("Ionize", 179, Rarity.RARE, mage.cards.i.Ionize.class)); - cards.add(new SetCardInfo("Ironshell Beetle", 134, Rarity.COMMON, mage.cards.i.IronshellBeetle.class)); - cards.add(new SetCardInfo("Island", 261, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Izoni, Thousand-Eyed", 180, Rarity.RARE, mage.cards.i.IzoniThousandEyed.class)); - cards.add(new SetCardInfo("Izzet Guildgate", 251, Rarity.COMMON, mage.cards.i.IzzetGuildgate.class)); - cards.add(new SetCardInfo("Izzet Guildgate", 252, Rarity.COMMON, mage.cards.i.IzzetGuildgate.class)); - cards.add(new SetCardInfo("Izzet Locket", 238, Rarity.COMMON, mage.cards.i.IzzetLocket.class)); - cards.add(new SetCardInfo("Join Shields", 181, Rarity.UNCOMMON, mage.cards.j.JoinShields.class)); - cards.add(new SetCardInfo("Justice Strike", 182, Rarity.UNCOMMON, mage.cards.j.JusticeStrike.class)); - cards.add(new SetCardInfo("Knight of Autumn", 183, Rarity.RARE, mage.cards.k.KnightOfAutumn.class)); - cards.add(new SetCardInfo("Kraul Foragers", 135, Rarity.COMMON, mage.cards.k.KraulForagers.class)); - cards.add(new SetCardInfo("Kraul Harpooner", 136, Rarity.UNCOMMON, mage.cards.k.KraulHarpooner.class)); - cards.add(new SetCardInfo("Kraul Raider", 270, Rarity.COMMON, mage.cards.k.KraulRaider.class)); - cards.add(new SetCardInfo("Kraul Swarm", 73, Rarity.UNCOMMON, mage.cards.k.KraulSwarm.class)); - cards.add(new SetCardInfo("Lava Coil", 108, Rarity.UNCOMMON, mage.cards.l.LavaCoil.class)); - cards.add(new SetCardInfo("Lazav, the Multifarious", 184, Rarity.MYTHIC, mage.cards.l.LazavTheMultifarious.class)); - cards.add(new SetCardInfo("League Guildmage", 185, Rarity.UNCOMMON, mage.cards.l.LeagueGuildmage.class)); - cards.add(new SetCardInfo("Leapfrog", 42, Rarity.COMMON, mage.cards.l.Leapfrog.class)); - cards.add(new SetCardInfo("Ledev Champion", 186, Rarity.UNCOMMON, mage.cards.l.LedevChampion.class)); - cards.add(new SetCardInfo("Ledev Guardian", 18, Rarity.COMMON, mage.cards.l.LedevGuardian.class)); - cards.add(new SetCardInfo("Legion Guildmage", 187, Rarity.UNCOMMON, mage.cards.l.LegionGuildmage.class)); - cards.add(new SetCardInfo("Legion Warboss", 109, Rarity.RARE, mage.cards.l.LegionWarboss.class)); - cards.add(new SetCardInfo("Light of the Legion", 19, Rarity.RARE, mage.cards.l.LightOfTheLegion.class)); - cards.add(new SetCardInfo("Lotleth Giant", 74, Rarity.UNCOMMON, mage.cards.l.LotlethGiant.class)); - cards.add(new SetCardInfo("Loxodon Restorer", 20, Rarity.COMMON, mage.cards.l.LoxodonRestorer.class)); - cards.add(new SetCardInfo("Luminous Bonds", 21, Rarity.COMMON, mage.cards.l.LuminousBonds.class)); - cards.add(new SetCardInfo("Maniacal Rage", 110, Rarity.COMMON, mage.cards.m.ManiacalRage.class)); - cards.add(new SetCardInfo("March of the Multitudes", 188, Rarity.MYTHIC, mage.cards.m.MarchOfTheMultitudes.class)); - cards.add(new SetCardInfo("Mausoleum Secrets", 75, Rarity.RARE, mage.cards.m.MausoleumSecrets.class)); - cards.add(new SetCardInfo("Maximize Altitude", 43, Rarity.COMMON, mage.cards.m.MaximizeAltitude.class)); - cards.add(new SetCardInfo("Maximize Velocity", 111, Rarity.COMMON, mage.cards.m.MaximizeVelocity.class)); - cards.add(new SetCardInfo("Mephitic Vapors", 76, Rarity.COMMON, mage.cards.m.MephiticVapors.class)); - cards.add(new SetCardInfo("Midnight Reaper", 77, Rarity.RARE, mage.cards.m.MidnightReaper.class)); - cards.add(new SetCardInfo("Might of the Masses", 137, Rarity.UNCOMMON, mage.cards.m.MightOfTheMasses.class)); - cards.add(new SetCardInfo("Mission Briefing", 44, Rarity.RARE, mage.cards.m.MissionBriefing.class)); - cards.add(new SetCardInfo("Molderhulk", 190, Rarity.UNCOMMON, mage.cards.m.Molderhulk.class)); - cards.add(new SetCardInfo("Moodmark Painter", 78, Rarity.COMMON, mage.cards.m.MoodmarkPainter.class)); - cards.add(new SetCardInfo("Mountain", 263, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Murmuring Mystic", 45, Rarity.UNCOMMON, mage.cards.m.MurmuringMystic.class)); - cards.add(new SetCardInfo("Muse Drake", 46, Rarity.COMMON, mage.cards.m.MuseDrake.class)); - cards.add(new SetCardInfo("Narcomoeba", 47, Rarity.RARE, mage.cards.n.Narcomoeba.class)); - cards.add(new SetCardInfo("Necrotic Wound", 79, Rarity.UNCOMMON, mage.cards.n.NecroticWound.class)); - cards.add(new SetCardInfo("Never Happened", 80, Rarity.COMMON, mage.cards.n.NeverHappened.class)); - cards.add(new SetCardInfo("Nightveil Predator", 191, Rarity.UNCOMMON, mage.cards.n.NightveilPredator.class)); - cards.add(new SetCardInfo("Nightveil Sprite", 48, Rarity.UNCOMMON, mage.cards.n.NightveilSprite.class)); - cards.add(new SetCardInfo("Niv-Mizzet, Parun", 192, Rarity.RARE, mage.cards.n.NivMizzetParun.class)); - cards.add(new SetCardInfo("Notion Rain", 193, Rarity.COMMON, mage.cards.n.NotionRain.class)); - cards.add(new SetCardInfo("Nullhide Ferox", 138, Rarity.MYTHIC, mage.cards.n.NullhideFerox.class)); - cards.add(new SetCardInfo("Ochran Assassin", 194, Rarity.UNCOMMON, mage.cards.o.OchranAssassin.class)); - cards.add(new SetCardInfo("Omnispell Adept", 49, Rarity.RARE, mage.cards.o.OmnispellAdept.class)); - cards.add(new SetCardInfo("Ornery Goblin", 112, Rarity.COMMON, mage.cards.o.OrneryGoblin.class)); - cards.add(new SetCardInfo("Overgrown Tomb", 253, Rarity.RARE, mage.cards.o.OvergrownTomb.class)); - cards.add(new SetCardInfo("Pack's Favor", 139, Rarity.COMMON, mage.cards.p.PacksFavor.class)); - cards.add(new SetCardInfo("Parhelion Patrol", 22, Rarity.COMMON, mage.cards.p.ParhelionPatrol.class)); - cards.add(new SetCardInfo("Passwall Adept", 50, Rarity.COMMON, mage.cards.p.PasswallAdept.class)); - cards.add(new SetCardInfo("Pause for Reflection", 140, Rarity.COMMON, mage.cards.p.PauseForReflection.class)); - cards.add(new SetCardInfo("Pilfering Imp", 81, Rarity.UNCOMMON, mage.cards.p.PilferingImp.class)); - cards.add(new SetCardInfo("Piston-Fist Cyclops", 217, Rarity.COMMON, mage.cards.p.PistonFistCyclops.class)); - cards.add(new SetCardInfo("Pitiless Gorgon", 218, Rarity.COMMON, mage.cards.p.PitilessGorgon.class)); - cards.add(new SetCardInfo("Plains", 260, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Portcullis Vine", 142, Rarity.COMMON, mage.cards.p.PortcullisVine.class)); - cards.add(new SetCardInfo("Precision Bolt", 267, Rarity.COMMON, mage.cards.p.PrecisionBolt.class)); - cards.add(new SetCardInfo("Prey Upon", 143, Rarity.COMMON, mage.cards.p.PreyUpon.class)); - cards.add(new SetCardInfo("Price of Fame", 83, Rarity.UNCOMMON, mage.cards.p.PriceOfFame.class)); - cards.add(new SetCardInfo("Quasiduplicate", 51, Rarity.RARE, mage.cards.q.Quasiduplicate.class)); - cards.add(new SetCardInfo("Radical Idea", 52, Rarity.COMMON, mage.cards.r.RadicalIdea.class)); - cards.add(new SetCardInfo("Ral's Dispersal", 266, Rarity.RARE, mage.cards.r.RalsDispersal.class)); - cards.add(new SetCardInfo("Ral's Staticaster", 268, Rarity.UNCOMMON, mage.cards.r.RalsStaticaster.class)); - cards.add(new SetCardInfo("Ral, Caller of Storms", 265, Rarity.MYTHIC, mage.cards.r.RalCallerOfStorms.class)); - cards.add(new SetCardInfo("Ral, Izzet Viceroy", 195, Rarity.MYTHIC, mage.cards.r.RalIzzetViceroy.class)); - cards.add(new SetCardInfo("Rampaging Monument", 239, Rarity.UNCOMMON, mage.cards.r.RampagingMonument.class)); - cards.add(new SetCardInfo("Response // Resurgence", 229, Rarity.RARE, mage.cards.r.ResponseResurgence.class)); - cards.add(new SetCardInfo("Rhizome Lurcher", 196, Rarity.COMMON, mage.cards.r.RhizomeLurcher.class)); - cards.add(new SetCardInfo("Righteous Blow", 23, Rarity.COMMON, mage.cards.r.RighteousBlow.class)); - cards.add(new SetCardInfo("Risk Factor", 113, Rarity.RARE, mage.cards.r.RiskFactor.class)); - cards.add(new SetCardInfo("Ritual of Soot", 84, Rarity.RARE, mage.cards.r.RitualOfSoot.class)); - cards.add(new SetCardInfo("Roc Charger", 24, Rarity.UNCOMMON, mage.cards.r.RocCharger.class)); - cards.add(new SetCardInfo("Rosemane Centaur", 197, Rarity.COMMON, mage.cards.r.RosemaneCentaur.class)); - cards.add(new SetCardInfo("Rubblebelt Boar", 114, Rarity.COMMON, mage.cards.r.RubblebeltBoar.class)); - cards.add(new SetCardInfo("Runaway Steam-Kin", 115, Rarity.RARE, mage.cards.r.RunawaySteamKin.class)); - cards.add(new SetCardInfo("Sacred Foundry", 254, Rarity.RARE, mage.cards.s.SacredFoundry.class)); - cards.add(new SetCardInfo("Selective Snare", 53, Rarity.UNCOMMON, mage.cards.s.SelectiveSnare.class)); - cards.add(new SetCardInfo("Selesnya Guildgate", 255, Rarity.COMMON, mage.cards.s.SelesnyaGuildgate.class)); - cards.add(new SetCardInfo("Selesnya Guildgate", 256, Rarity.COMMON, mage.cards.s.SelesnyaGuildgate.class)); - cards.add(new SetCardInfo("Selesnya Locket", 240, Rarity.COMMON, mage.cards.s.SelesnyaLocket.class)); - cards.add(new SetCardInfo("Severed Strands", 85, Rarity.COMMON, mage.cards.s.SeveredStrands.class)); - cards.add(new SetCardInfo("Siege Wurm", 144, Rarity.COMMON, mage.cards.s.SiegeWurm.class)); - cards.add(new SetCardInfo("Silent Dart", 241, Rarity.UNCOMMON, mage.cards.s.SilentDart.class)); - cards.add(new SetCardInfo("Sinister Sabotage", 54, Rarity.UNCOMMON, mage.cards.s.SinisterSabotage.class)); - cards.add(new SetCardInfo("Skyknight Legionnaire", 198, Rarity.COMMON, mage.cards.s.SkyknightLegionnaire.class)); - cards.add(new SetCardInfo("Skyline Scout", 25, Rarity.COMMON, mage.cards.s.SkylineScout.class)); - cards.add(new SetCardInfo("Smelt-War Minotaur", 116, Rarity.UNCOMMON, mage.cards.s.SmeltWarMinotaur.class)); - cards.add(new SetCardInfo("Sonic Assault", 199, Rarity.COMMON, mage.cards.s.SonicAssault.class)); - cards.add(new SetCardInfo("Spinal Centipede", 86, Rarity.COMMON, mage.cards.s.SpinalCentipede.class)); - cards.add(new SetCardInfo("Sprouting Renewal", 145, Rarity.UNCOMMON, mage.cards.s.SproutingRenewal.class)); - cards.add(new SetCardInfo("Status // Statue", 230, Rarity.UNCOMMON, mage.cards.s.StatusStatue.class)); - cards.add(new SetCardInfo("Steam Vents", 257, Rarity.RARE, mage.cards.s.SteamVents.class)); - cards.add(new SetCardInfo("Street Riot", 117, Rarity.UNCOMMON, mage.cards.s.StreetRiot.class)); - cards.add(new SetCardInfo("Sumala Woodshaper", 200, Rarity.COMMON, mage.cards.s.SumalaWoodshaper.class)); - cards.add(new SetCardInfo("Sunhome Stalwart", 26, Rarity.UNCOMMON, mage.cards.s.SunhomeStalwart.class)); - cards.add(new SetCardInfo("Sure Strike", 118, Rarity.COMMON, mage.cards.s.SureStrike.class)); - cards.add(new SetCardInfo("Swamp", 262, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swarm Guildmage", 201, Rarity.UNCOMMON, mage.cards.s.SwarmGuildmage.class)); - cards.add(new SetCardInfo("Swathcutter Giant", 202, Rarity.UNCOMMON, mage.cards.s.SwathcutterGiant.class)); - cards.add(new SetCardInfo("Swiftblade Vindicator", 203, Rarity.RARE, mage.cards.s.SwiftbladeVindicator.class)); - cards.add(new SetCardInfo("Sworn Companions", 27, Rarity.COMMON, mage.cards.s.SwornCompanions.class)); - cards.add(new SetCardInfo("Tajic, Legion's Edge", 204, Rarity.RARE, mage.cards.t.TajicLegionsEdge.class)); - cards.add(new SetCardInfo("Take Heart", 28, Rarity.COMMON, mage.cards.t.TakeHeart.class)); - cards.add(new SetCardInfo("Temple Garden", 258, Rarity.RARE, mage.cards.t.TempleGarden.class)); - cards.add(new SetCardInfo("Tenth District Guard", 29, Rarity.COMMON, mage.cards.t.TenthDistrictGuard.class)); - cards.add(new SetCardInfo("Thought Erasure", 206, Rarity.UNCOMMON, mage.cards.t.ThoughtErasure.class)); - cards.add(new SetCardInfo("Thoughtbound Phantasm", 55, Rarity.UNCOMMON, mage.cards.t.ThoughtboundPhantasm.class)); - cards.add(new SetCardInfo("Torch Courier", 119, Rarity.COMMON, mage.cards.t.TorchCourier.class)); - cards.add(new SetCardInfo("Trostani Discordant", 208, Rarity.MYTHIC, mage.cards.t.TrostaniDiscordant.class)); - cards.add(new SetCardInfo("Truefire Captain", 209, Rarity.UNCOMMON, mage.cards.t.TruefireCaptain.class)); - cards.add(new SetCardInfo("Undercity Necrolisk", 87, Rarity.UNCOMMON, mage.cards.u.UndercityNecrolisk.class)); - cards.add(new SetCardInfo("Undercity Uprising", 210, Rarity.COMMON, mage.cards.u.UndercityUprising.class)); - cards.add(new SetCardInfo("Underrealm Lich", 211, Rarity.MYTHIC, mage.cards.u.UnderrealmLich.class)); - cards.add(new SetCardInfo("Unexplained Disappearance", 56, Rarity.COMMON, mage.cards.u.UnexplainedDisappearance.class)); - cards.add(new SetCardInfo("Urban Utopia", 146, Rarity.COMMON, mage.cards.u.UrbanUtopia.class)); - cards.add(new SetCardInfo("Vedalken Mesmerist", 57, Rarity.COMMON, mage.cards.v.VedalkenMesmerist.class)); - cards.add(new SetCardInfo("Veiled Shade", 88, Rarity.COMMON, mage.cards.v.VeiledShade.class)); - cards.add(new SetCardInfo("Venerated Loxodon", 30, Rarity.RARE, mage.cards.v.VeneratedLoxodon.class)); - cards.add(new SetCardInfo("Vernadi Shieldmate", 219, Rarity.COMMON, mage.cards.v.VernadiShieldmate.class)); - cards.add(new SetCardInfo("Vicious Rumors", 89, Rarity.COMMON, mage.cards.v.ViciousRumors.class)); - cards.add(new SetCardInfo("Vigorspore Wurm", 147, Rarity.COMMON, mage.cards.v.VigorsporeWurm.class)); - cards.add(new SetCardInfo("Vivid Revival", 148, Rarity.RARE, mage.cards.v.VividRevival.class)); - cards.add(new SetCardInfo("Vraska's Stoneglare", 272, Rarity.RARE, mage.cards.v.VraskasStoneglare.class)); - cards.add(new SetCardInfo("Vraska, Golgari Queen", 213, Rarity.MYTHIC, mage.cards.v.VraskaGolgariQueen.class)); - cards.add(new SetCardInfo("Vraska, Regal Gorgon", 269, Rarity.MYTHIC, mage.cards.v.VraskaRegalGorgon.class)); - cards.add(new SetCardInfo("Wall of Mist", 58, Rarity.COMMON, mage.cards.w.WallOfMist.class)); - cards.add(new SetCardInfo("Wand of Vertebrae", 242, Rarity.UNCOMMON, mage.cards.w.WandOfVertebrae.class)); - cards.add(new SetCardInfo("Wary Okapi", 149, Rarity.COMMON, mage.cards.w.WaryOkapi.class)); - cards.add(new SetCardInfo("Watcher in the Mist", 59, Rarity.COMMON, mage.cards.w.WatcherInTheMist.class)); - cards.add(new SetCardInfo("Watery Grave", 259, Rarity.RARE, mage.cards.w.WateryGrave.class)); - cards.add(new SetCardInfo("Wee Dragonauts", 214, Rarity.UNCOMMON, mage.cards.w.WeeDragonauts.class)); - cards.add(new SetCardInfo("Whisper Agent", 220, Rarity.COMMON, mage.cards.w.WhisperAgent.class)); - cards.add(new SetCardInfo("Whispering Snitch", 90, Rarity.UNCOMMON, mage.cards.w.WhisperingSnitch.class)); - cards.add(new SetCardInfo("Wild Ceratok", 150, Rarity.COMMON, mage.cards.w.WildCeratok.class)); - cards.add(new SetCardInfo("Wishcoin Crab", 60, Rarity.COMMON, mage.cards.w.WishcoinCrab.class)); - cards.add(new SetCardInfo("Wojek Bodyguard", 120, Rarity.COMMON, mage.cards.w.WojekBodyguard.class)); - cards.add(new SetCardInfo("Worldsoul Colossus", 215, Rarity.UNCOMMON, mage.cards.w.WorldsoulColossus.class)); - } -} +package mage.sets; + +import mage.cards.ExpansionSet; +import mage.constants.Rarity; +import mage.constants.SetType; + +public final class GuildsOfRavnica extends ExpansionSet { + + private static final GuildsOfRavnica instance = new GuildsOfRavnica(); + + public static GuildsOfRavnica getInstance() { + return instance; + } + + private GuildsOfRavnica() { + super("Guilds of Ravnica", "GRN", ExpansionSet.buildDate(2018, 10, 5), SetType.EXPANSION); + this.blockName = "Guilds of Ravnica"; + this.hasBoosters = true; + this.numBoosterLands = 1; + this.numBoosterCommon = 10; + this.numBoosterUncommon = 3; + this.numBoosterRare = 1; + this.ratioBoosterMythic = 8; + + cards.add(new SetCardInfo("Affectionate Indrik", 121, Rarity.UNCOMMON, mage.cards.a.AffectionateIndrik.class)); + cards.add(new SetCardInfo("Arboretum Elemental", 122, Rarity.UNCOMMON, mage.cards.a.ArboretumElemental.class)); + cards.add(new SetCardInfo("Arclight Phoenix", 91, Rarity.MYTHIC, mage.cards.a.ArclightPhoenix.class)); + cards.add(new SetCardInfo("Artful Takedown", 151, Rarity.COMMON, mage.cards.a.ArtfulTakedown.class)); + cards.add(new SetCardInfo("Assassin's Trophy", 152, Rarity.RARE, mage.cards.a.AssassinsTrophy.class)); + cards.add(new SetCardInfo("Assure // Assemble", 221, Rarity.RARE, mage.cards.a.AssureAssemble.class)); + cards.add(new SetCardInfo("Attendant of Vraska", 271, Rarity.UNCOMMON, mage.cards.a.AttendantOfVraska.class)); + cards.add(new SetCardInfo("Aurelia, Exemplar of Justice", 153, Rarity.MYTHIC, mage.cards.a.AureliaExemplarOfJustice.class)); + cards.add(new SetCardInfo("Barging Sergeant", 92, Rarity.COMMON, mage.cards.b.BargingSergeant.class)); + cards.add(new SetCardInfo("Barrier of Bones", 61, Rarity.COMMON, mage.cards.b.BarrierOfBones.class)); + cards.add(new SetCardInfo("Bartizan Bats", 62, Rarity.COMMON, mage.cards.b.BartizanBats.class)); + cards.add(new SetCardInfo("Beacon Bolt", 154, Rarity.UNCOMMON, mage.cards.b.BeaconBolt.class)); + cards.add(new SetCardInfo("Beast Whisperer", 123, Rarity.RARE, mage.cards.b.BeastWhisperer.class)); + cards.add(new SetCardInfo("Blade Instructor", 1, Rarity.COMMON, mage.cards.b.BladeInstructor.class)); + cards.add(new SetCardInfo("Blood Operative", 63, Rarity.RARE, mage.cards.b.BloodOperative.class)); + cards.add(new SetCardInfo("Book Devourer", 93, Rarity.UNCOMMON, mage.cards.b.BookDevourer.class)); + cards.add(new SetCardInfo("Boros Challenger", 156, Rarity.UNCOMMON, mage.cards.b.BorosChallenger.class)); + cards.add(new SetCardInfo("Boros Guildgate", 243, Rarity.COMMON, mage.cards.b.BorosGuildgate.class)); + cards.add(new SetCardInfo("Boros Guildgate", 244, Rarity.COMMON, mage.cards.b.BorosGuildgate.class)); + cards.add(new SetCardInfo("Boros Locket", 231, Rarity.COMMON, mage.cards.b.BorosLocket.class)); + cards.add(new SetCardInfo("Bounty Agent", 2, Rarity.RARE, mage.cards.b.BountyAgent.class)); + cards.add(new SetCardInfo("Burglar Rat", 64, Rarity.COMMON, mage.cards.b.BurglarRat.class)); + cards.add(new SetCardInfo("Camaraderie", 157, Rarity.RARE, mage.cards.c.Camaraderie.class)); + cards.add(new SetCardInfo("Capture Sphere", 31, Rarity.COMMON, mage.cards.c.CaptureSphere.class)); + cards.add(new SetCardInfo("Centaur Peacemaker", 158, Rarity.COMMON, mage.cards.c.CentaurPeacemaker.class)); + cards.add(new SetCardInfo("Chamber Sentry", 232, Rarity.RARE, mage.cards.c.ChamberSentry.class)); + cards.add(new SetCardInfo("Chance for Glory", 159, Rarity.MYTHIC, mage.cards.c.ChanceForGlory.class)); + cards.add(new SetCardInfo("Charnel Troll", 160, Rarity.RARE, mage.cards.c.CharnelTroll.class)); + cards.add(new SetCardInfo("Chemister's Insight", 32, Rarity.UNCOMMON, mage.cards.c.ChemistersInsight.class)); + cards.add(new SetCardInfo("Child of Night", 65, Rarity.COMMON, mage.cards.c.ChildOfNight.class)); + cards.add(new SetCardInfo("Chromatic Lantern", 233, Rarity.RARE, mage.cards.c.ChromaticLantern.class)); + cards.add(new SetCardInfo("Circuitous Route", 125, Rarity.UNCOMMON, mage.cards.c.CircuitousRoute.class)); + cards.add(new SetCardInfo("Citywatch Sphinx", 33, Rarity.UNCOMMON, mage.cards.c.CitywatchSphinx.class)); + cards.add(new SetCardInfo("Citywide Bust", 4, Rarity.RARE, mage.cards.c.CitywideBust.class)); + cards.add(new SetCardInfo("Command the Storm", 94, Rarity.COMMON, mage.cards.c.CommandTheStorm.class)); + cards.add(new SetCardInfo("Conclave Cavalier", 161, Rarity.UNCOMMON, mage.cards.c.ConclaveCavalier.class)); + cards.add(new SetCardInfo("Conclave Guildmage", 162, Rarity.UNCOMMON, mage.cards.c.ConclaveGuildmage.class)); + cards.add(new SetCardInfo("Conclave Tribunal", 6, Rarity.UNCOMMON, mage.cards.c.ConclaveTribunal.class)); + cards.add(new SetCardInfo("Connive // Concoct", 222, Rarity.RARE, mage.cards.c.ConniveConcoct.class)); + cards.add(new SetCardInfo("Cosmotronic Wave", 95, Rarity.COMMON, mage.cards.c.CosmotronicWave.class)); + cards.add(new SetCardInfo("Crackling Drake", 163, Rarity.UNCOMMON, mage.cards.c.CracklingDrake.class)); + cards.add(new SetCardInfo("Creeping Chill", 66, Rarity.UNCOMMON, mage.cards.c.CreepingChill.class)); + cards.add(new SetCardInfo("Crushing Canopy", 126, Rarity.COMMON, mage.cards.c.CrushingCanopy.class)); + cards.add(new SetCardInfo("Darkblade Agent", 164, Rarity.COMMON, mage.cards.d.DarkbladeAgent.class)); + cards.add(new SetCardInfo("Dawn of Hope", 8, Rarity.RARE, mage.cards.d.DawnOfHope.class)); + cards.add(new SetCardInfo("Dazzling Lights", 34, Rarity.COMMON, mage.cards.d.DazzlingLights.class)); + cards.add(new SetCardInfo("Dead Weight", 67, Rarity.COMMON, mage.cards.d.DeadWeight.class)); + cards.add(new SetCardInfo("Deadly Visit", 68, Rarity.COMMON, mage.cards.d.DeadlyVisit.class)); + cards.add(new SetCardInfo("Deafening Clarion", 165, Rarity.RARE, mage.cards.d.DeafeningClarion.class)); + cards.add(new SetCardInfo("Devious Cover-up", 35, Rarity.COMMON, mage.cards.d.DeviousCoverUp.class)); + cards.add(new SetCardInfo("Devkarin Dissident", 127, Rarity.COMMON, mage.cards.d.DevkarinDissident.class)); + cards.add(new SetCardInfo("Dimir Guildgate", 245, Rarity.COMMON, mage.cards.d.DimirGuildgate.class)); + cards.add(new SetCardInfo("Dimir Guildgate", 246, Rarity.COMMON, mage.cards.d.DimirGuildgate.class)); + cards.add(new SetCardInfo("Dimir Informant", 36, Rarity.COMMON, mage.cards.d.DimirInformant.class)); + cards.add(new SetCardInfo("Dimir Locket", 234, Rarity.COMMON, mage.cards.d.DimirLocket.class)); + cards.add(new SetCardInfo("Dimir Spybug", 166, Rarity.UNCOMMON, mage.cards.d.DimirSpybug.class)); + cards.add(new SetCardInfo("Direct Current", 96, Rarity.COMMON, mage.cards.d.DirectCurrent.class)); + cards.add(new SetCardInfo("Discovery // Dispersal", 223, Rarity.UNCOMMON, mage.cards.d.DiscoveryDispersal.class)); + cards.add(new SetCardInfo("Disdainful Stroke", 37, Rarity.COMMON, mage.cards.d.DisdainfulStroke.class)); + cards.add(new SetCardInfo("Disinformation Campaign", 167, Rarity.UNCOMMON, mage.cards.d.DisinformationCampaign.class)); + cards.add(new SetCardInfo("District Guide", 128, Rarity.UNCOMMON, mage.cards.d.DistrictGuide.class)); + cards.add(new SetCardInfo("Divine Visitation", 10, Rarity.MYTHIC, mage.cards.d.DivineVisitation.class)); + cards.add(new SetCardInfo("Doom Whisperer", 69, Rarity.MYTHIC, mage.cards.d.DoomWhisperer.class)); + cards.add(new SetCardInfo("Douser of Lights", 70, Rarity.COMMON, mage.cards.d.DouserOfLights.class)); + cards.add(new SetCardInfo("Dream Eater", 38, Rarity.MYTHIC, mage.cards.d.DreamEater.class)); + cards.add(new SetCardInfo("Drowned Secrets", 39, Rarity.RARE, mage.cards.d.DrownedSecrets.class)); + cards.add(new SetCardInfo("Electrostatic Field", 97, Rarity.UNCOMMON, mage.cards.e.ElectrostaticField.class)); + cards.add(new SetCardInfo("Emmara, Soul of the Accord", 168, Rarity.RARE, mage.cards.e.EmmaraSoulOfTheAccord.class)); + cards.add(new SetCardInfo("Enhanced Surveillance", 40, Rarity.UNCOMMON, mage.cards.e.EnhancedSurveillance.class)); + cards.add(new SetCardInfo("Erratic Cyclops", 98, Rarity.RARE, mage.cards.e.ErraticCyclops.class)); + cards.add(new SetCardInfo("Erstwhile Trooper", 169, Rarity.COMMON, mage.cards.e.ErstwhileTrooper.class)); + cards.add(new SetCardInfo("Etrata, the Silencer", 170, Rarity.RARE, mage.cards.e.EtrataTheSilencer.class)); + cards.add(new SetCardInfo("Expansion // Explosion", 224, Rarity.RARE, mage.cards.e.ExpansionExplosion.class)); + cards.add(new SetCardInfo("Fearless Halberdier", 100, Rarity.COMMON, mage.cards.f.FearlessHalberdier.class)); + cards.add(new SetCardInfo("Find // Finality", 225, Rarity.RARE, mage.cards.f.FindFinality.class)); + cards.add(new SetCardInfo("Fire Urchin", 101, Rarity.COMMON, mage.cards.f.FireUrchin.class)); + cards.add(new SetCardInfo("Firemind's Research", 171, Rarity.RARE, mage.cards.f.FiremindsResearch.class)); + cards.add(new SetCardInfo("Flight of Equenauts", 11, Rarity.UNCOMMON, mage.cards.f.FlightOfEquenauts.class)); + cards.add(new SetCardInfo("Flower // Flourish", 226, Rarity.UNCOMMON, mage.cards.f.FlowerFlourish.class)); + cards.add(new SetCardInfo("Forest", 264, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Fresh-Faced Recruit", 216, Rarity.COMMON, mage.cards.f.FreshFacedRecruit.class)); + cards.add(new SetCardInfo("Garrison Sergeant", 172, Rarity.COMMON, mage.cards.g.GarrisonSergeant.class)); + cards.add(new SetCardInfo("Gatekeeper Gargoyle", 235, Rarity.UNCOMMON, mage.cards.g.GatekeeperGargoyle.class)); + cards.add(new SetCardInfo("Gateway Plaza", 247, Rarity.COMMON, mage.cards.g.GatewayPlaza.class)); + cards.add(new SetCardInfo("Generous Stray", 129, Rarity.COMMON, mage.cards.g.GenerousStray.class)); + cards.add(new SetCardInfo("Gird for Battle", 12, Rarity.UNCOMMON, mage.cards.g.GirdForBattle.class)); + cards.add(new SetCardInfo("Glaive of the Guildpact", 236, Rarity.UNCOMMON, mage.cards.g.GlaiveOfTheGuildpact.class)); + cards.add(new SetCardInfo("Glowspore Shaman", 173, Rarity.UNCOMMON, mage.cards.g.GlowsporeShaman.class)); + cards.add(new SetCardInfo("Goblin Banneret", 102, Rarity.UNCOMMON, mage.cards.g.GoblinBanneret.class)); + cards.add(new SetCardInfo("Goblin Cratermaker", 103, Rarity.UNCOMMON, mage.cards.g.GoblinCratermaker.class)); + cards.add(new SetCardInfo("Goblin Electromancer", 174, Rarity.COMMON, mage.cards.g.GoblinElectromancer.class)); + cards.add(new SetCardInfo("Goblin Locksmith", 104, Rarity.COMMON, mage.cards.g.GoblinLocksmith.class)); + cards.add(new SetCardInfo("Golgari Findbroker", 175, Rarity.UNCOMMON, mage.cards.g.GolgariFindbroker.class)); + cards.add(new SetCardInfo("Golgari Guildgate", 248, Rarity.COMMON, mage.cards.g.GolgariGuildgate.class)); + cards.add(new SetCardInfo("Golgari Guildgate", 249, Rarity.COMMON, mage.cards.g.GolgariGuildgate.class)); + cards.add(new SetCardInfo("Golgari Locket", 237, Rarity.COMMON, mage.cards.g.GolgariLocket.class)); + cards.add(new SetCardInfo("Golgari Raiders", 130, Rarity.UNCOMMON, mage.cards.g.GolgariRaiders.class)); + cards.add(new SetCardInfo("Grappling Sundew", 131, Rarity.UNCOMMON, mage.cards.g.GrapplingSundew.class)); + cards.add(new SetCardInfo("Gravitic Punch", 105, Rarity.COMMON, mage.cards.g.GraviticPunch.class)); + cards.add(new SetCardInfo("Gruesome Menagerie", 71, Rarity.RARE, mage.cards.g.GruesomeMenagerie.class)); + cards.add(new SetCardInfo("Guild Summit", 41, Rarity.UNCOMMON, mage.cards.g.GuildSummit.class)); + cards.add(new SetCardInfo("Haazda Marshal", 13, Rarity.UNCOMMON, mage.cards.h.HaazdaMarshal.class)); + cards.add(new SetCardInfo("Hammer Dropper", 176, Rarity.COMMON, mage.cards.h.HammerDropper.class)); + cards.add(new SetCardInfo("Hatchery Spider", 132, Rarity.RARE, mage.cards.h.HatcherySpider.class)); + cards.add(new SetCardInfo("Healer's Hawk", 14, Rarity.COMMON, mage.cards.h.HealersHawk.class)); + cards.add(new SetCardInfo("Hellkite Whelp", 106, Rarity.UNCOMMON, mage.cards.h.HellkiteWhelp.class)); + cards.add(new SetCardInfo("Hired Poisoner", 72, Rarity.COMMON, mage.cards.h.HiredPoisoner.class)); + cards.add(new SetCardInfo("Hitchclaw Recluse", 133, Rarity.COMMON, mage.cards.h.HitchclawRecluse.class)); + cards.add(new SetCardInfo("House Guildmage", 177, Rarity.UNCOMMON, mage.cards.h.HouseGuildmage.class)); + cards.add(new SetCardInfo("Hunted Witness", 15, Rarity.COMMON, mage.cards.h.HuntedWitness.class)); + cards.add(new SetCardInfo("Hypothesizzle", 178, Rarity.COMMON, mage.cards.h.Hypothesizzle.class)); + cards.add(new SetCardInfo("Impervious Greatwurm", 273, Rarity.MYTHIC, mage.cards.i.ImperviousGreatwurm.class)); + cards.add(new SetCardInfo("Inescapable Blaze", 107, Rarity.UNCOMMON, mage.cards.i.InescapableBlaze.class)); + cards.add(new SetCardInfo("Invert // Invent", 228, Rarity.UNCOMMON, mage.cards.i.InvertInvent.class)); + cards.add(new SetCardInfo("Inspiring Unicorn", 16, Rarity.UNCOMMON, mage.cards.i.InspiringUnicorn.class)); + cards.add(new SetCardInfo("Integrity // Intervention", 227, Rarity.UNCOMMON, mage.cards.i.IntegrityIntervention.class)); + cards.add(new SetCardInfo("Intrusive Packbeast", 17, Rarity.COMMON, mage.cards.i.IntrusivePackbeast.class)); + cards.add(new SetCardInfo("Ionize", 179, Rarity.RARE, mage.cards.i.Ionize.class)); + cards.add(new SetCardInfo("Ironshell Beetle", 134, Rarity.COMMON, mage.cards.i.IronshellBeetle.class)); + cards.add(new SetCardInfo("Island", 261, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Izoni, Thousand-Eyed", 180, Rarity.RARE, mage.cards.i.IzoniThousandEyed.class)); + cards.add(new SetCardInfo("Izzet Guildgate", 251, Rarity.COMMON, mage.cards.i.IzzetGuildgate.class)); + cards.add(new SetCardInfo("Izzet Guildgate", 252, Rarity.COMMON, mage.cards.i.IzzetGuildgate.class)); + cards.add(new SetCardInfo("Izzet Locket", 238, Rarity.COMMON, mage.cards.i.IzzetLocket.class)); + cards.add(new SetCardInfo("Join Shields", 181, Rarity.UNCOMMON, mage.cards.j.JoinShields.class)); + cards.add(new SetCardInfo("Justice Strike", 182, Rarity.UNCOMMON, mage.cards.j.JusticeStrike.class)); + cards.add(new SetCardInfo("Knight of Autumn", 183, Rarity.RARE, mage.cards.k.KnightOfAutumn.class)); + cards.add(new SetCardInfo("Kraul Foragers", 135, Rarity.COMMON, mage.cards.k.KraulForagers.class)); + cards.add(new SetCardInfo("Kraul Harpooner", 136, Rarity.UNCOMMON, mage.cards.k.KraulHarpooner.class)); + cards.add(new SetCardInfo("Kraul Raider", 270, Rarity.COMMON, mage.cards.k.KraulRaider.class)); + cards.add(new SetCardInfo("Kraul Swarm", 73, Rarity.UNCOMMON, mage.cards.k.KraulSwarm.class)); + cards.add(new SetCardInfo("Lava Coil", 108, Rarity.UNCOMMON, mage.cards.l.LavaCoil.class)); + cards.add(new SetCardInfo("Lazav, the Multifarious", 184, Rarity.MYTHIC, mage.cards.l.LazavTheMultifarious.class)); + cards.add(new SetCardInfo("League Guildmage", 185, Rarity.UNCOMMON, mage.cards.l.LeagueGuildmage.class)); + cards.add(new SetCardInfo("Leapfrog", 42, Rarity.COMMON, mage.cards.l.Leapfrog.class)); + cards.add(new SetCardInfo("Ledev Champion", 186, Rarity.UNCOMMON, mage.cards.l.LedevChampion.class)); + cards.add(new SetCardInfo("Ledev Guardian", 18, Rarity.COMMON, mage.cards.l.LedevGuardian.class)); + cards.add(new SetCardInfo("Legion Guildmage", 187, Rarity.UNCOMMON, mage.cards.l.LegionGuildmage.class)); + cards.add(new SetCardInfo("Legion Warboss", 109, Rarity.RARE, mage.cards.l.LegionWarboss.class)); + cards.add(new SetCardInfo("Light of the Legion", 19, Rarity.RARE, mage.cards.l.LightOfTheLegion.class)); + cards.add(new SetCardInfo("Lotleth Giant", 74, Rarity.UNCOMMON, mage.cards.l.LotlethGiant.class)); + cards.add(new SetCardInfo("Loxodon Restorer", 20, Rarity.COMMON, mage.cards.l.LoxodonRestorer.class)); + cards.add(new SetCardInfo("Luminous Bonds", 21, Rarity.COMMON, mage.cards.l.LuminousBonds.class)); + cards.add(new SetCardInfo("Maniacal Rage", 110, Rarity.COMMON, mage.cards.m.ManiacalRage.class)); + cards.add(new SetCardInfo("March of the Multitudes", 188, Rarity.MYTHIC, mage.cards.m.MarchOfTheMultitudes.class)); + cards.add(new SetCardInfo("Mausoleum Secrets", 75, Rarity.RARE, mage.cards.m.MausoleumSecrets.class)); + cards.add(new SetCardInfo("Maximize Altitude", 43, Rarity.COMMON, mage.cards.m.MaximizeAltitude.class)); + cards.add(new SetCardInfo("Maximize Velocity", 111, Rarity.COMMON, mage.cards.m.MaximizeVelocity.class)); + cards.add(new SetCardInfo("Mephitic Vapors", 76, Rarity.COMMON, mage.cards.m.MephiticVapors.class)); + cards.add(new SetCardInfo("Midnight Reaper", 77, Rarity.RARE, mage.cards.m.MidnightReaper.class)); + cards.add(new SetCardInfo("Might of the Masses", 137, Rarity.UNCOMMON, mage.cards.m.MightOfTheMasses.class)); + cards.add(new SetCardInfo("Mission Briefing", 44, Rarity.RARE, mage.cards.m.MissionBriefing.class)); + cards.add(new SetCardInfo("Molderhulk", 190, Rarity.UNCOMMON, mage.cards.m.Molderhulk.class)); + cards.add(new SetCardInfo("Moodmark Painter", 78, Rarity.COMMON, mage.cards.m.MoodmarkPainter.class)); + cards.add(new SetCardInfo("Mountain", 263, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Murmuring Mystic", 45, Rarity.UNCOMMON, mage.cards.m.MurmuringMystic.class)); + cards.add(new SetCardInfo("Muse Drake", 46, Rarity.COMMON, mage.cards.m.MuseDrake.class)); + cards.add(new SetCardInfo("Narcomoeba", 47, Rarity.RARE, mage.cards.n.Narcomoeba.class)); + cards.add(new SetCardInfo("Necrotic Wound", 79, Rarity.UNCOMMON, mage.cards.n.NecroticWound.class)); + cards.add(new SetCardInfo("Never Happened", 80, Rarity.COMMON, mage.cards.n.NeverHappened.class)); + cards.add(new SetCardInfo("Nightveil Predator", 191, Rarity.UNCOMMON, mage.cards.n.NightveilPredator.class)); + cards.add(new SetCardInfo("Nightveil Sprite", 48, Rarity.UNCOMMON, mage.cards.n.NightveilSprite.class)); + cards.add(new SetCardInfo("Niv-Mizzet, Parun", 192, Rarity.RARE, mage.cards.n.NivMizzetParun.class)); + cards.add(new SetCardInfo("Notion Rain", 193, Rarity.COMMON, mage.cards.n.NotionRain.class)); + cards.add(new SetCardInfo("Nullhide Ferox", 138, Rarity.MYTHIC, mage.cards.n.NullhideFerox.class)); + cards.add(new SetCardInfo("Ochran Assassin", 194, Rarity.UNCOMMON, mage.cards.o.OchranAssassin.class)); + cards.add(new SetCardInfo("Omnispell Adept", 49, Rarity.RARE, mage.cards.o.OmnispellAdept.class)); + cards.add(new SetCardInfo("Ornery Goblin", 112, Rarity.COMMON, mage.cards.o.OrneryGoblin.class)); + cards.add(new SetCardInfo("Overgrown Tomb", 253, Rarity.RARE, mage.cards.o.OvergrownTomb.class)); + cards.add(new SetCardInfo("Pack's Favor", 139, Rarity.COMMON, mage.cards.p.PacksFavor.class)); + cards.add(new SetCardInfo("Parhelion Patrol", 22, Rarity.COMMON, mage.cards.p.ParhelionPatrol.class)); + cards.add(new SetCardInfo("Passwall Adept", 50, Rarity.COMMON, mage.cards.p.PasswallAdept.class)); + cards.add(new SetCardInfo("Pause for Reflection", 140, Rarity.COMMON, mage.cards.p.PauseForReflection.class)); + cards.add(new SetCardInfo("Pilfering Imp", 81, Rarity.UNCOMMON, mage.cards.p.PilferingImp.class)); + cards.add(new SetCardInfo("Piston-Fist Cyclops", 217, Rarity.COMMON, mage.cards.p.PistonFistCyclops.class)); + cards.add(new SetCardInfo("Pitiless Gorgon", 218, Rarity.COMMON, mage.cards.p.PitilessGorgon.class)); + cards.add(new SetCardInfo("Plains", 260, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Portcullis Vine", 142, Rarity.COMMON, mage.cards.p.PortcullisVine.class)); + cards.add(new SetCardInfo("Precision Bolt", 267, Rarity.COMMON, mage.cards.p.PrecisionBolt.class)); + cards.add(new SetCardInfo("Prey Upon", 143, Rarity.COMMON, mage.cards.p.PreyUpon.class)); + cards.add(new SetCardInfo("Price of Fame", 83, Rarity.UNCOMMON, mage.cards.p.PriceOfFame.class)); + cards.add(new SetCardInfo("Quasiduplicate", 51, Rarity.RARE, mage.cards.q.Quasiduplicate.class)); + cards.add(new SetCardInfo("Radical Idea", 52, Rarity.COMMON, mage.cards.r.RadicalIdea.class)); + cards.add(new SetCardInfo("Ral's Dispersal", 266, Rarity.RARE, mage.cards.r.RalsDispersal.class)); + cards.add(new SetCardInfo("Ral's Staticaster", 268, Rarity.UNCOMMON, mage.cards.r.RalsStaticaster.class)); + cards.add(new SetCardInfo("Ral, Caller of Storms", 265, Rarity.MYTHIC, mage.cards.r.RalCallerOfStorms.class)); + cards.add(new SetCardInfo("Ral, Izzet Viceroy", 195, Rarity.MYTHIC, mage.cards.r.RalIzzetViceroy.class)); + cards.add(new SetCardInfo("Rampaging Monument", 239, Rarity.UNCOMMON, mage.cards.r.RampagingMonument.class)); + cards.add(new SetCardInfo("Response // Resurgence", 229, Rarity.RARE, mage.cards.r.ResponseResurgence.class)); + cards.add(new SetCardInfo("Rhizome Lurcher", 196, Rarity.COMMON, mage.cards.r.RhizomeLurcher.class)); + cards.add(new SetCardInfo("Righteous Blow", 23, Rarity.COMMON, mage.cards.r.RighteousBlow.class)); + cards.add(new SetCardInfo("Risk Factor", 113, Rarity.RARE, mage.cards.r.RiskFactor.class)); + cards.add(new SetCardInfo("Ritual of Soot", 84, Rarity.RARE, mage.cards.r.RitualOfSoot.class)); + cards.add(new SetCardInfo("Roc Charger", 24, Rarity.UNCOMMON, mage.cards.r.RocCharger.class)); + cards.add(new SetCardInfo("Rosemane Centaur", 197, Rarity.COMMON, mage.cards.r.RosemaneCentaur.class)); + cards.add(new SetCardInfo("Rubblebelt Boar", 114, Rarity.COMMON, mage.cards.r.RubblebeltBoar.class)); + cards.add(new SetCardInfo("Runaway Steam-Kin", 115, Rarity.RARE, mage.cards.r.RunawaySteamKin.class)); + cards.add(new SetCardInfo("Sacred Foundry", 254, Rarity.RARE, mage.cards.s.SacredFoundry.class)); + cards.add(new SetCardInfo("Selective Snare", 53, Rarity.UNCOMMON, mage.cards.s.SelectiveSnare.class)); + cards.add(new SetCardInfo("Selesnya Guildgate", 255, Rarity.COMMON, mage.cards.s.SelesnyaGuildgate.class)); + cards.add(new SetCardInfo("Selesnya Guildgate", 256, Rarity.COMMON, mage.cards.s.SelesnyaGuildgate.class)); + cards.add(new SetCardInfo("Selesnya Locket", 240, Rarity.COMMON, mage.cards.s.SelesnyaLocket.class)); + cards.add(new SetCardInfo("Severed Strands", 85, Rarity.COMMON, mage.cards.s.SeveredStrands.class)); + cards.add(new SetCardInfo("Siege Wurm", 144, Rarity.COMMON, mage.cards.s.SiegeWurm.class)); + cards.add(new SetCardInfo("Silent Dart", 241, Rarity.UNCOMMON, mage.cards.s.SilentDart.class)); + cards.add(new SetCardInfo("Sinister Sabotage", 54, Rarity.UNCOMMON, mage.cards.s.SinisterSabotage.class)); + cards.add(new SetCardInfo("Skyknight Legionnaire", 198, Rarity.COMMON, mage.cards.s.SkyknightLegionnaire.class)); + cards.add(new SetCardInfo("Skyline Scout", 25, Rarity.COMMON, mage.cards.s.SkylineScout.class)); + cards.add(new SetCardInfo("Smelt-War Minotaur", 116, Rarity.UNCOMMON, mage.cards.s.SmeltWarMinotaur.class)); + cards.add(new SetCardInfo("Sonic Assault", 199, Rarity.COMMON, mage.cards.s.SonicAssault.class)); + cards.add(new SetCardInfo("Spinal Centipede", 86, Rarity.COMMON, mage.cards.s.SpinalCentipede.class)); + cards.add(new SetCardInfo("Sprouting Renewal", 145, Rarity.UNCOMMON, mage.cards.s.SproutingRenewal.class)); + cards.add(new SetCardInfo("Status // Statue", 230, Rarity.UNCOMMON, mage.cards.s.StatusStatue.class)); + cards.add(new SetCardInfo("Steam Vents", 257, Rarity.RARE, mage.cards.s.SteamVents.class)); + cards.add(new SetCardInfo("Street Riot", 117, Rarity.UNCOMMON, mage.cards.s.StreetRiot.class)); + cards.add(new SetCardInfo("Sumala Woodshaper", 200, Rarity.COMMON, mage.cards.s.SumalaWoodshaper.class)); + cards.add(new SetCardInfo("Sunhome Stalwart", 26, Rarity.UNCOMMON, mage.cards.s.SunhomeStalwart.class)); + cards.add(new SetCardInfo("Sure Strike", 118, Rarity.COMMON, mage.cards.s.SureStrike.class)); + cards.add(new SetCardInfo("Swamp", 262, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swarm Guildmage", 201, Rarity.UNCOMMON, mage.cards.s.SwarmGuildmage.class)); + cards.add(new SetCardInfo("Swathcutter Giant", 202, Rarity.UNCOMMON, mage.cards.s.SwathcutterGiant.class)); + cards.add(new SetCardInfo("Swiftblade Vindicator", 203, Rarity.RARE, mage.cards.s.SwiftbladeVindicator.class)); + cards.add(new SetCardInfo("Sworn Companions", 27, Rarity.COMMON, mage.cards.s.SwornCompanions.class)); + cards.add(new SetCardInfo("Tajic, Legion's Edge", 204, Rarity.RARE, mage.cards.t.TajicLegionsEdge.class)); + cards.add(new SetCardInfo("Take Heart", 28, Rarity.COMMON, mage.cards.t.TakeHeart.class)); + cards.add(new SetCardInfo("Temple Garden", 258, Rarity.RARE, mage.cards.t.TempleGarden.class)); + cards.add(new SetCardInfo("Tenth District Guard", 29, Rarity.COMMON, mage.cards.t.TenthDistrictGuard.class)); + cards.add(new SetCardInfo("Thought Erasure", 206, Rarity.UNCOMMON, mage.cards.t.ThoughtErasure.class)); + cards.add(new SetCardInfo("Thoughtbound Phantasm", 55, Rarity.UNCOMMON, mage.cards.t.ThoughtboundPhantasm.class)); + cards.add(new SetCardInfo("Torch Courier", 119, Rarity.COMMON, mage.cards.t.TorchCourier.class)); + cards.add(new SetCardInfo("Trostani Discordant", 208, Rarity.MYTHIC, mage.cards.t.TrostaniDiscordant.class)); + cards.add(new SetCardInfo("Truefire Captain", 209, Rarity.UNCOMMON, mage.cards.t.TruefireCaptain.class)); + cards.add(new SetCardInfo("Undercity Necrolisk", 87, Rarity.UNCOMMON, mage.cards.u.UndercityNecrolisk.class)); + cards.add(new SetCardInfo("Undercity Uprising", 210, Rarity.COMMON, mage.cards.u.UndercityUprising.class)); + cards.add(new SetCardInfo("Underrealm Lich", 211, Rarity.MYTHIC, mage.cards.u.UnderrealmLich.class)); + cards.add(new SetCardInfo("Unexplained Disappearance", 56, Rarity.COMMON, mage.cards.u.UnexplainedDisappearance.class)); + cards.add(new SetCardInfo("Unmoored Ego", 212, Rarity.RARE, mage.cards.u.UnmooredEgo.class)); + cards.add(new SetCardInfo("Urban Utopia", 146, Rarity.COMMON, mage.cards.u.UrbanUtopia.class)); + cards.add(new SetCardInfo("Vedalken Mesmerist", 57, Rarity.COMMON, mage.cards.v.VedalkenMesmerist.class)); + cards.add(new SetCardInfo("Veiled Shade", 88, Rarity.COMMON, mage.cards.v.VeiledShade.class)); + cards.add(new SetCardInfo("Venerated Loxodon", 30, Rarity.RARE, mage.cards.v.VeneratedLoxodon.class)); + cards.add(new SetCardInfo("Vernadi Shieldmate", 219, Rarity.COMMON, mage.cards.v.VernadiShieldmate.class)); + cards.add(new SetCardInfo("Vicious Rumors", 89, Rarity.COMMON, mage.cards.v.ViciousRumors.class)); + cards.add(new SetCardInfo("Vigorspore Wurm", 147, Rarity.COMMON, mage.cards.v.VigorsporeWurm.class)); + cards.add(new SetCardInfo("Vivid Revival", 148, Rarity.RARE, mage.cards.v.VividRevival.class)); + cards.add(new SetCardInfo("Vraska's Stoneglare", 272, Rarity.RARE, mage.cards.v.VraskasStoneglare.class)); + cards.add(new SetCardInfo("Vraska, Golgari Queen", 213, Rarity.MYTHIC, mage.cards.v.VraskaGolgariQueen.class)); + cards.add(new SetCardInfo("Vraska, Regal Gorgon", 269, Rarity.MYTHIC, mage.cards.v.VraskaRegalGorgon.class)); + cards.add(new SetCardInfo("Wall of Mist", 58, Rarity.COMMON, mage.cards.w.WallOfMist.class)); + cards.add(new SetCardInfo("Wand of Vertebrae", 242, Rarity.UNCOMMON, mage.cards.w.WandOfVertebrae.class)); + cards.add(new SetCardInfo("Wary Okapi", 149, Rarity.COMMON, mage.cards.w.WaryOkapi.class)); + cards.add(new SetCardInfo("Watcher in the Mist", 59, Rarity.COMMON, mage.cards.w.WatcherInTheMist.class)); + cards.add(new SetCardInfo("Watery Grave", 259, Rarity.RARE, mage.cards.w.WateryGrave.class)); + cards.add(new SetCardInfo("Wee Dragonauts", 214, Rarity.UNCOMMON, mage.cards.w.WeeDragonauts.class)); + cards.add(new SetCardInfo("Whisper Agent", 220, Rarity.COMMON, mage.cards.w.WhisperAgent.class)); + cards.add(new SetCardInfo("Whispering Snitch", 90, Rarity.UNCOMMON, mage.cards.w.WhisperingSnitch.class)); + cards.add(new SetCardInfo("Wild Ceratok", 150, Rarity.COMMON, mage.cards.w.WildCeratok.class)); + cards.add(new SetCardInfo("Wishcoin Crab", 60, Rarity.COMMON, mage.cards.w.WishcoinCrab.class)); + cards.add(new SetCardInfo("Wojek Bodyguard", 120, Rarity.COMMON, mage.cards.w.WojekBodyguard.class)); + cards.add(new SetCardInfo("Worldsoul Colossus", 215, Rarity.UNCOMMON, mage.cards.w.WorldsoulColossus.class)); + } +} From 753e44b1c915794fb20c32fc7e514edb1ac4dd05 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 21 Sep 2018 13:55:53 +0200 Subject: [PATCH 112/140] [GRN] Fixed a problem of Expansion // Explosion. --- Mage.Sets/src/mage/cards/e/ExpansionExplosion.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/e/ExpansionExplosion.java b/Mage.Sets/src/mage/cards/e/ExpansionExplosion.java index 4a8bc361fbe..1b6e4c74efa 100644 --- a/Mage.Sets/src/mage/cards/e/ExpansionExplosion.java +++ b/Mage.Sets/src/mage/cards/e/ExpansionExplosion.java @@ -40,7 +40,7 @@ public final class ExpansionExplosion extends SplitCard { // Expansion // Copy target instant or sorcery spell with converted mana cost 4 or less. You may choose new targets for the copy. this.getLeftHalfCard().getSpellAbility().addEffect(new CopyTargetSpellEffect()); - this.getSpellAbility().addTarget(new TargetSpell(filter)); + this.getLeftHalfCard().getSpellAbility().addTarget(new TargetSpell(filter)); // Explosion // Explosion deals X damage to any target. Target player draws X cards. From d1679035ed897af4cadaadfa43d6154daf803ff8 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Fri, 21 Sep 2018 13:09:53 -0400 Subject: [PATCH 113/140] Implemented Experimental Frenzy --- .../src/mage/cards/e/ExperimentalFrenzy.java | 133 ++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 134 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/e/ExperimentalFrenzy.java diff --git a/Mage.Sets/src/mage/cards/e/ExperimentalFrenzy.java b/Mage.Sets/src/mage/cards/e/ExperimentalFrenzy.java new file mode 100644 index 00000000000..2cee3f83b7d --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/ExperimentalFrenzy.java @@ -0,0 +1,133 @@ +package mage.cards.e; + +import java.util.UUID; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; +import mage.abilities.effects.common.DestroySourceEffect; +import mage.abilities.effects.common.continuous.PlayTheTopCardEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Layer; +import mage.constants.Outcome; +import mage.constants.SubLayer; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.players.Player; + +/** + * + * @author TheElk801 + */ +public final class ExperimentalFrenzy extends CardImpl { + + public ExperimentalFrenzy(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{R}"); + + // You may look at the top card of your library any time. + this.addAbility(new SimpleStaticAbility( + Zone.BATTLEFIELD, new ExperimentalFrenzyTopCardEffect() + )); + + // You may play the top card of your library. + this.addAbility(new SimpleStaticAbility( + Zone.BATTLEFIELD, new PlayTheTopCardEffect() + )); + + // You can't play cards from your hand. + this.addAbility(new SimpleStaticAbility( + Zone.BATTLEFIELD, new ExperimentalFrenzyRestrictionEffect() + )); + + // {3}{R}: Destroy Experimental Frenzy. + this.addAbility(new SimpleActivatedAbility( + new DestroySourceEffect(), new ManaCostsImpl("{3}{R}") + )); + } + + public ExperimentalFrenzy(final ExperimentalFrenzy card) { + super(card); + } + + @Override + public ExperimentalFrenzy copy() { + return new ExperimentalFrenzy(this); + } +} + +class ExperimentalFrenzyTopCardEffect extends ContinuousEffectImpl { + + public ExperimentalFrenzyTopCardEffect() { + super(Duration.WhileOnBattlefield, Layer.PlayerEffects, SubLayer.NA, Outcome.Benefit); + staticText = "You may look at the top card of your library any time."; + } + + public ExperimentalFrenzyTopCardEffect(final ExperimentalFrenzyTopCardEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return true; + } + Card topCard = controller.getLibrary().getFromTop(game); + if (topCard == null) { + return true; + } + MageObject obj = source.getSourceObject(game); + if (obj == null) { + return true; + } + controller.lookAtCards("Top card of " + obj.getIdName() + " controller's library", topCard, game); + return true; + } + + @Override + public ExperimentalFrenzyTopCardEffect copy() { + return new ExperimentalFrenzyTopCardEffect(this); + } +} + +class ExperimentalFrenzyRestrictionEffect extends ContinuousRuleModifyingEffectImpl { + + public ExperimentalFrenzyRestrictionEffect() { + super(Duration.WhileOnBattlefield, Outcome.Detriment); + this.staticText = "You can't play cards from your hand"; + } + + public ExperimentalFrenzyRestrictionEffect(final ExperimentalFrenzyRestrictionEffect effect) { + super(effect); + } + + @Override + public ExperimentalFrenzyRestrictionEffect copy() { + return new ExperimentalFrenzyRestrictionEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.PLAY_LAND + || event.getType() == GameEvent.EventType.CAST_SPELL; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + return event.getPlayerId().equals(source.getControllerId()) + && event.getZone() == Zone.HAND; + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 51e7c4c4198..df247a5bcb0 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -95,6 +95,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Erstwhile Trooper", 169, Rarity.COMMON, mage.cards.e.ErstwhileTrooper.class)); cards.add(new SetCardInfo("Etrata, the Silencer", 170, Rarity.RARE, mage.cards.e.EtrataTheSilencer.class)); cards.add(new SetCardInfo("Expansion // Explosion", 224, Rarity.RARE, mage.cards.e.ExpansionExplosion.class)); + cards.add(new SetCardInfo("Experimental Frenzy", 99, Rarity.RARE, mage.cards.e.ExperimentalFrenzy.class)); cards.add(new SetCardInfo("Fearless Halberdier", 100, Rarity.COMMON, mage.cards.f.FearlessHalberdier.class)); cards.add(new SetCardInfo("Find // Finality", 225, Rarity.RARE, mage.cards.f.FindFinality.class)); cards.add(new SetCardInfo("Fire Urchin", 101, Rarity.COMMON, mage.cards.f.FireUrchin.class)); From ec390ba5f786cd601005dde7db8cec339611b1bf Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Fri, 21 Sep 2018 14:47:37 -0400 Subject: [PATCH 114/140] Implemented Pelt Collector --- Mage.Sets/src/mage/cards/p/PeltCollector.java | 142 ++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 143 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/p/PeltCollector.java diff --git a/Mage.Sets/src/mage/cards/p/PeltCollector.java b/Mage.Sets/src/mage/cards/p/PeltCollector.java new file mode 100644 index 00000000000..a6674561596 --- /dev/null +++ b/Mage.Sets/src/mage/cards/p/PeltCollector.java @@ -0,0 +1,142 @@ +package mage.cards.p; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.SourceHasCounterCondition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.GainAbilitySourceEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author TheElk801 + */ +public final class PeltCollector extends CardImpl { + + public PeltCollector(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}"); + + this.subtype.add(SubType.ELF); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Whenever another creature you control enters the battlefield or dies, if that creature's power is greater than Pelt Collector's, put a +1/+1 counter on Pelt Collector. + this.addAbility(new PeltCollectorAbility()); + + // As long as Pelt Collector has three or more +1/+1 counters on it, it has trample. + this.addAbility(new SimpleStaticAbility( + Zone.BATTLEFIELD, + new ConditionalContinuousEffect( + new GainAbilitySourceEffect( + TrampleAbility.getInstance(), + Duration.WhileOnBattlefield + ), new SourceHasCounterCondition(CounterType.P1P1, 3), + "As long as {this} has three or more +1/+1 " + + "counters on it, it has trample." + ) + )); + } + + public PeltCollector(final PeltCollector card) { + super(card); + } + + @Override + public PeltCollector copy() { + return new PeltCollector(this); + } +} + +class PeltCollectorAbility extends TriggeredAbilityImpl { + + public PeltCollectorAbility() { + super(Zone.BATTLEFIELD, new PeltCollectorEffect()); + } + + public PeltCollectorAbility(PeltCollectorAbility ability) { + super(ability); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (event.getTargetId().equals(this.getSourceId())) { + return false; + } + Permanent triggeringCreature = game.getPermanentOrLKIBattlefield(event.getTargetId()); + Permanent sourceCreature = game.getPermanent(this.getSourceId()); + if (isPowerGreater(sourceCreature, triggeringCreature) + && triggeringCreature.isCreature() + && triggeringCreature.isControlledBy(this.getControllerId())) { + this.getEffects().get(0).setTargetPointer(new FixedTarget(event.getTargetId())); + return true; + } + return false; + } + + public static boolean isPowerGreater(Permanent sourceCreature, Permanent newCreature) { + return sourceCreature != null && newCreature != null + && newCreature.getPower().getValue() + > sourceCreature.getPower().getValue(); + } + + @Override + public String getRule() { + return "Whenever another creature you control enters the battlefield " + + "or dies, if that creature's power is greater than {this}'s, " + + "put a +1/+1 counter on {this}."; + } + + @Override + public PeltCollectorAbility copy() { + return new PeltCollectorAbility(this); + } +} + +class PeltCollectorEffect extends OneShotEffect { + + public PeltCollectorEffect() { + super(Outcome.BoostCreature); + } + + public PeltCollectorEffect(final PeltCollectorEffect effect) { + super(effect); + } + + @Override + public PeltCollectorEffect copy() { + return new PeltCollectorEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent triggeringCreature = game.getPermanentOrLKIBattlefield(getTargetPointer().getFirst(game, source)); + Permanent sourceCreature = game.getPermanent(source.getSourceId()); + if (!PeltCollectorAbility.isPowerGreater(sourceCreature, triggeringCreature)) { + return false; + } + return new AddCountersSourceEffect(CounterType.P1P1.createInstance()).apply(game, source); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index df247a5bcb0..658783bde57 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -196,6 +196,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Parhelion Patrol", 22, Rarity.COMMON, mage.cards.p.ParhelionPatrol.class)); cards.add(new SetCardInfo("Passwall Adept", 50, Rarity.COMMON, mage.cards.p.PasswallAdept.class)); cards.add(new SetCardInfo("Pause for Reflection", 140, Rarity.COMMON, mage.cards.p.PauseForReflection.class)); + cards.add(new SetCardInfo("Pelt Collector", 141, Rarity.RARE, mage.cards.p.PeltCollector.class)); cards.add(new SetCardInfo("Pilfering Imp", 81, Rarity.UNCOMMON, mage.cards.p.PilferingImp.class)); cards.add(new SetCardInfo("Piston-Fist Cyclops", 217, Rarity.COMMON, mage.cards.p.PistonFistCyclops.class)); cards.add(new SetCardInfo("Pitiless Gorgon", 218, Rarity.COMMON, mage.cards.p.PitilessGorgon.class)); From 1cc6a4e1bc3f7ff1e4cce7c8737c55336b4f54ad Mon Sep 17 00:00:00 2001 From: Ryan-Saklad <43081507+Ryan-Saklad@users.noreply.github.com> Date: Fri, 21 Sep 2018 16:47:46 -0400 Subject: [PATCH 115/140] Add files via upload --- Mage.Sets/src/mage/cards/b/BountyOfMight.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/b/BountyOfMight.java diff --git a/Mage.Sets/src/mage/cards/b/BountyOfMight.java b/Mage.Sets/src/mage/cards/b/BountyOfMight.java new file mode 100644 index 00000000000..27487009553 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BountyOfMight.java @@ -0,0 +1,49 @@ + +package mage.cards.b; + +import java.util.UUID; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.common.FilterCreaturePermanent; +import mage.target.common.TargetCreaturePermanent; +import mage.target.targetpointer.SecondTargetPointer; +import mage.target.targetpointer.ThirdTargetPointer; + +/** + * + * @author Ryan-Saklad + */ + +public final class BountyOfMight extends CardImpl { + + public BountyOfMight(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{G}{G}"); + + // Target creature gets +3/+3 until end of turn. + this.getSpellAbility().addEffect(new BoostTargetEffect(3, 3, Duration.EndOfTurn)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature (1st)"))); + // Target creature gets +3/+3 until end of turn. + Effect effect = new BoostTargetEffect(3, 3, Duration.EndOfTurn).setText("
Target creature gets +3/+3 until end of turn."); + effect.setTargetPointer(new SecondTargetPointer()); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature (2nd)"))); + // Target creature gets +3/+3 until end of turn. + effect = new BoostTargetEffect(3, 3, Duration.EndOfTurn).setText("
Target creature gets +3/+3 until end of turn."); + effect.setTargetPointer(new ThirdTargetPointer()); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature (3rd)"))); + } + + public BountyOfMight(final BountyOfMight card) { + super(card); + } + + @Override + public BountyOfMight copy() { + return new BountyOfMight(this); + } +} From 878a61bde2e22a85d367c0f9a93d6cc1adb24a07 Mon Sep 17 00:00:00 2001 From: Ryan-Saklad <43081507+Ryan-Saklad@users.noreply.github.com> Date: Fri, 21 Sep 2018 16:49:07 -0400 Subject: [PATCH 116/140] Add files via upload --- .../src/mage/cards/c/CandlelightVigil.java | 62 +++++++++++++++++++ .../src/mage/cards/c/CollarTheCulprit.java | 42 +++++++++++++ .../src/mage/cards/c/CrushContraband.java | 45 ++++++++++++++ 3 files changed, 149 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/CandlelightVigil.java create mode 100644 Mage.Sets/src/mage/cards/c/CollarTheCulprit.java create mode 100644 Mage.Sets/src/mage/cards/c/CrushContraband.java diff --git a/Mage.Sets/src/mage/cards/c/CandlelightVigil.java b/Mage.Sets/src/mage/cards/c/CandlelightVigil.java new file mode 100644 index 00000000000..5630faa6cfa --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CandlelightVigil.java @@ -0,0 +1,62 @@ + +package mage.cards.c; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author Ryan-Saklad + */ + +public final class Candlelight Vigil extends CardImpl { + + public Candlelight Vigil(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{W}"); + this.subtype.add(SubType.AURA); + + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // Enchanted creature gets +3/+2 and has vigilance. + Effect effect = new BoostEnchantedEffect(3, 2, Duration.WhileOnBattlefield); + effect.setText("Enchanted creature gets +3/+2"); + SimpleStaticAbility ability2 = new SimpleStaticAbility(Zone.BATTLEFIELD, effect); + effect = new GainAbilityAttachedEffect(VigilanceAbility.getInstance(), AttachmentType.AURA); + effect.setText("and has vigilance"); + ability2.addEffect(effect); + this.addAbility(ability2); + + } + + public Candlelight Vigil(final Candlelight Vigil card) { + super(card); + } + + @Override + public Candlelight Vigil copy() { + return new Candlelight Vigil(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/c/CollarTheCulprit.java b/Mage.Sets/src/mage/cards/c/CollarTheCulprit.java new file mode 100644 index 00000000000..0551082ab36 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CollarTheCulprit.java @@ -0,0 +1,42 @@ + +package mage.cards.c; + +import java.util.UUID; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.ToughnessPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * @author Ryan-Saklad + */ + +public final class CollarTheCulprit extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with toughness 4 or greater"); + + static { + filter.add(new ToughnessPredicate(ComparisonType.MORE_THAN, 3)); + } + + public CollarTheCulprit(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{W}"); + + // Destroy target creature with toughness 4 or greater. + this.getSpellAbility().addEffect(new DestroyTargetEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); + } + + public CollarTheCulprit(final CollarTheCulprit card) { + super(card); + } + + @Override + public CollarTheCulprit copy() { + return new CollarTheCulprit(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/c/CrushContraband.java b/Mage.Sets/src/mage/cards/c/CrushContraband.java new file mode 100644 index 00000000000..6cbe26f8dbb --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CrushContraband.java @@ -0,0 +1,45 @@ + +package mage.cards.c; + +import java.util.UUID; +import mage.abilities.Mode; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetArtifactPermanent; +import mage.target.common.TargetEnchantmentPermanent; + +/** + * + * @author Ryan-Saklad + */ + +public final class CrushContraband extends CardImpl { + + public CrushContraband(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{3}{W}"); + + // Choose one or both - Destroy target artifact; or Destroy target land. + this.getSpellAbility().getModes().setMinModes(1); + this.getSpellAbility().getModes().setMaxModes(2); + + this.getSpellAbility().addTarget(new TargetArtifactPermanent()); + this.getSpellAbility().addEffect(new ExileTargetEffect()); + + Mode mode1 = new Mode(); + mode1.getTargets().add(new TargetEnchantmentPermanent()); + mode1.getEffects().add(new ExileTargetEffect()); + this.getSpellAbility().addMode(mode1); + + } + + public CrushContraband(final CrushContraband card) { + super(card); + } + + @Override + public CrushContraband copy() { + return new CrushContraband(this); + } +} \ No newline at end of file From 2550f31f9ac5eb8c09110c0873ceffe16138ddff Mon Sep 17 00:00:00 2001 From: Ryan-Saklad <43081507+Ryan-Saklad@users.noreply.github.com> Date: Fri, 21 Sep 2018 16:49:41 -0400 Subject: [PATCH 117/140] Add files via upload --- Mage.Sets/src/mage/cards/d/Demotion.java | 51 ++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/d/Demotion.java diff --git a/Mage.Sets/src/mage/cards/d/Demotion.java b/Mage.Sets/src/mage/cards/d/Demotion.java new file mode 100644 index 00000000000..c3634273b84 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/Demotion.java @@ -0,0 +1,51 @@ + +package mage.cards.d; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.combat.CantBlockActivateAttachedEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.DefenderAbility; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author Ryan-Saklad + */ + +public final class Demotion extends CardImpl { + + public Demotion(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{W}"); + 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); + + // Enchanted creature can't block, and its activated abilities can't be activated. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBlockActivateAttachedEffect())); + + } + + public Demotion(final Demotion card) { + super(card); + } + + @Override + public Demotion copy() { + return new Demotion(this); + } +} \ No newline at end of file From 5fa5eea5ba10e7fdd2a6791bba9914e4ba2ecc82 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Fri, 21 Sep 2018 17:06:58 -0400 Subject: [PATCH 118/140] Revert "Adding cards" --- Mage.Sets/src/mage/cards/b/BountyOfMight.java | 49 --------------- .../src/mage/cards/c/CandlelightVigil.java | 62 ------------------- .../src/mage/cards/c/CollarTheCulprit.java | 42 ------------- .../src/mage/cards/c/CrushContraband.java | 45 -------------- Mage.Sets/src/mage/cards/d/Demotion.java | 51 --------------- 5 files changed, 249 deletions(-) delete mode 100644 Mage.Sets/src/mage/cards/b/BountyOfMight.java delete mode 100644 Mage.Sets/src/mage/cards/c/CandlelightVigil.java delete mode 100644 Mage.Sets/src/mage/cards/c/CollarTheCulprit.java delete mode 100644 Mage.Sets/src/mage/cards/c/CrushContraband.java delete mode 100644 Mage.Sets/src/mage/cards/d/Demotion.java diff --git a/Mage.Sets/src/mage/cards/b/BountyOfMight.java b/Mage.Sets/src/mage/cards/b/BountyOfMight.java deleted file mode 100644 index 27487009553..00000000000 --- a/Mage.Sets/src/mage/cards/b/BountyOfMight.java +++ /dev/null @@ -1,49 +0,0 @@ - -package mage.cards.b; - -import java.util.UUID; -import mage.abilities.effects.Effect; -import mage.abilities.effects.common.continuous.BoostTargetEffect; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.Duration; -import mage.filter.common.FilterCreaturePermanent; -import mage.target.common.TargetCreaturePermanent; -import mage.target.targetpointer.SecondTargetPointer; -import mage.target.targetpointer.ThirdTargetPointer; - -/** - * - * @author Ryan-Saklad - */ - -public final class BountyOfMight extends CardImpl { - - public BountyOfMight(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{G}{G}"); - - // Target creature gets +3/+3 until end of turn. - this.getSpellAbility().addEffect(new BoostTargetEffect(3, 3, Duration.EndOfTurn)); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature (1st)"))); - // Target creature gets +3/+3 until end of turn. - Effect effect = new BoostTargetEffect(3, 3, Duration.EndOfTurn).setText("
Target creature gets +3/+3 until end of turn."); - effect.setTargetPointer(new SecondTargetPointer()); - this.getSpellAbility().addEffect(effect); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature (2nd)"))); - // Target creature gets +3/+3 until end of turn. - effect = new BoostTargetEffect(3, 3, Duration.EndOfTurn).setText("
Target creature gets +3/+3 until end of turn."); - effect.setTargetPointer(new ThirdTargetPointer()); - this.getSpellAbility().addEffect(effect); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature (3rd)"))); - } - - public BountyOfMight(final BountyOfMight card) { - super(card); - } - - @Override - public BountyOfMight copy() { - return new BountyOfMight(this); - } -} diff --git a/Mage.Sets/src/mage/cards/c/CandlelightVigil.java b/Mage.Sets/src/mage/cards/c/CandlelightVigil.java deleted file mode 100644 index 5630faa6cfa..00000000000 --- a/Mage.Sets/src/mage/cards/c/CandlelightVigil.java +++ /dev/null @@ -1,62 +0,0 @@ - -package mage.cards.c; - -import java.util.UUID; -import mage.abilities.Ability; -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.effects.Effect; -import mage.abilities.effects.common.AttachEffect; -import mage.abilities.effects.common.continuous.BoostEnchantedEffect; -import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; -import mage.abilities.keyword.EnchantAbility; -import mage.abilities.keyword.VigilanceAbility; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.AttachmentType; -import mage.constants.CardType; -import mage.constants.SubType; -import mage.constants.Duration; -import mage.constants.Outcome; -import mage.constants.Zone; -import mage.target.TargetPermanent; -import mage.target.common.TargetCreaturePermanent; - -/** - * - * @author Ryan-Saklad - */ - -public final class Candlelight Vigil extends CardImpl { - - public Candlelight Vigil(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{W}"); - this.subtype.add(SubType.AURA); - - - // Enchant creature - TargetPermanent auraTarget = new TargetCreaturePermanent(); - this.getSpellAbility().addTarget(auraTarget); - this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); - Ability ability = new EnchantAbility(auraTarget.getTargetName()); - this.addAbility(ability); - - // Enchanted creature gets +3/+2 and has vigilance. - Effect effect = new BoostEnchantedEffect(3, 2, Duration.WhileOnBattlefield); - effect.setText("Enchanted creature gets +3/+2"); - SimpleStaticAbility ability2 = new SimpleStaticAbility(Zone.BATTLEFIELD, effect); - effect = new GainAbilityAttachedEffect(VigilanceAbility.getInstance(), AttachmentType.AURA); - effect.setText("and has vigilance"); - ability2.addEffect(effect); - this.addAbility(ability2); - - } - - public Candlelight Vigil(final Candlelight Vigil card) { - super(card); - } - - @Override - public Candlelight Vigil copy() { - return new Candlelight Vigil(this); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/c/CollarTheCulprit.java b/Mage.Sets/src/mage/cards/c/CollarTheCulprit.java deleted file mode 100644 index 0551082ab36..00000000000 --- a/Mage.Sets/src/mage/cards/c/CollarTheCulprit.java +++ /dev/null @@ -1,42 +0,0 @@ - -package mage.cards.c; - -import java.util.UUID; -import mage.abilities.effects.common.DestroyTargetEffect; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.ComparisonType; -import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.mageobject.ToughnessPredicate; -import mage.target.common.TargetCreaturePermanent; - -/** - * @author Ryan-Saklad - */ - -public final class CollarTheCulprit extends CardImpl { - - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with toughness 4 or greater"); - - static { - filter.add(new ToughnessPredicate(ComparisonType.MORE_THAN, 3)); - } - - public CollarTheCulprit(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{W}"); - - // Destroy target creature with toughness 4 or greater. - this.getSpellAbility().addEffect(new DestroyTargetEffect()); - this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); - } - - public CollarTheCulprit(final CollarTheCulprit card) { - super(card); - } - - @Override - public CollarTheCulprit copy() { - return new CollarTheCulprit(this); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/c/CrushContraband.java b/Mage.Sets/src/mage/cards/c/CrushContraband.java deleted file mode 100644 index 6cbe26f8dbb..00000000000 --- a/Mage.Sets/src/mage/cards/c/CrushContraband.java +++ /dev/null @@ -1,45 +0,0 @@ - -package mage.cards.c; - -import java.util.UUID; -import mage.abilities.Mode; -import mage.abilities.effects.common.ExileTargetEffect; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.target.common.TargetArtifactPermanent; -import mage.target.common.TargetEnchantmentPermanent; - -/** - * - * @author Ryan-Saklad - */ - -public final class CrushContraband extends CardImpl { - - public CrushContraband(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{3}{W}"); - - // Choose one or both - Destroy target artifact; or Destroy target land. - this.getSpellAbility().getModes().setMinModes(1); - this.getSpellAbility().getModes().setMaxModes(2); - - this.getSpellAbility().addTarget(new TargetArtifactPermanent()); - this.getSpellAbility().addEffect(new ExileTargetEffect()); - - Mode mode1 = new Mode(); - mode1.getTargets().add(new TargetEnchantmentPermanent()); - mode1.getEffects().add(new ExileTargetEffect()); - this.getSpellAbility().addMode(mode1); - - } - - public CrushContraband(final CrushContraband card) { - super(card); - } - - @Override - public CrushContraband copy() { - return new CrushContraband(this); - } -} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/d/Demotion.java b/Mage.Sets/src/mage/cards/d/Demotion.java deleted file mode 100644 index c3634273b84..00000000000 --- a/Mage.Sets/src/mage/cards/d/Demotion.java +++ /dev/null @@ -1,51 +0,0 @@ - -package mage.cards.d; - -import java.util.UUID; -import mage.abilities.Ability; -import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.effects.common.AttachEffect; -import mage.abilities.effects.common.combat.CantBlockActivateAttachedEffect; -import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; -import mage.abilities.keyword.DefenderAbility; -import mage.abilities.keyword.EnchantAbility; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.*; -import mage.target.TargetPermanent; -import mage.target.common.TargetCreaturePermanent; - -/** - * - * @author Ryan-Saklad - */ - -public final class Demotion extends CardImpl { - - public Demotion(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{W}"); - 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); - - // Enchanted creature can't block, and its activated abilities can't be activated. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBlockActivateAttachedEffect())); - - } - - public Demotion(final Demotion card) { - super(card); - } - - @Override - public Demotion copy() { - return new Demotion(this); - } -} \ No newline at end of file From 510273894180d0b6507218aebeb509608fffcbd9 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Fri, 21 Sep 2018 19:45:29 -0400 Subject: [PATCH 119/140] Revert "Revert "Adding cards"" This reverts commit 5fa5eea5ba10e7fdd2a6791bba9914e4ba2ecc82. --- Mage.Sets/src/mage/cards/b/BountyOfMight.java | 49 +++++++++++++++ .../src/mage/cards/c/CandlelightVigil.java | 62 +++++++++++++++++++ .../src/mage/cards/c/CollarTheCulprit.java | 42 +++++++++++++ .../src/mage/cards/c/CrushContraband.java | 45 ++++++++++++++ Mage.Sets/src/mage/cards/d/Demotion.java | 51 +++++++++++++++ 5 files changed, 249 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/b/BountyOfMight.java create mode 100644 Mage.Sets/src/mage/cards/c/CandlelightVigil.java create mode 100644 Mage.Sets/src/mage/cards/c/CollarTheCulprit.java create mode 100644 Mage.Sets/src/mage/cards/c/CrushContraband.java create mode 100644 Mage.Sets/src/mage/cards/d/Demotion.java diff --git a/Mage.Sets/src/mage/cards/b/BountyOfMight.java b/Mage.Sets/src/mage/cards/b/BountyOfMight.java new file mode 100644 index 00000000000..27487009553 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BountyOfMight.java @@ -0,0 +1,49 @@ + +package mage.cards.b; + +import java.util.UUID; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.common.FilterCreaturePermanent; +import mage.target.common.TargetCreaturePermanent; +import mage.target.targetpointer.SecondTargetPointer; +import mage.target.targetpointer.ThirdTargetPointer; + +/** + * + * @author Ryan-Saklad + */ + +public final class BountyOfMight extends CardImpl { + + public BountyOfMight(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{G}{G}"); + + // Target creature gets +3/+3 until end of turn. + this.getSpellAbility().addEffect(new BoostTargetEffect(3, 3, Duration.EndOfTurn)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature (1st)"))); + // Target creature gets +3/+3 until end of turn. + Effect effect = new BoostTargetEffect(3, 3, Duration.EndOfTurn).setText("
Target creature gets +3/+3 until end of turn."); + effect.setTargetPointer(new SecondTargetPointer()); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature (2nd)"))); + // Target creature gets +3/+3 until end of turn. + effect = new BoostTargetEffect(3, 3, Duration.EndOfTurn).setText("
Target creature gets +3/+3 until end of turn."); + effect.setTargetPointer(new ThirdTargetPointer()); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(new FilterCreaturePermanent("creature (3rd)"))); + } + + public BountyOfMight(final BountyOfMight card) { + super(card); + } + + @Override + public BountyOfMight copy() { + return new BountyOfMight(this); + } +} diff --git a/Mage.Sets/src/mage/cards/c/CandlelightVigil.java b/Mage.Sets/src/mage/cards/c/CandlelightVigil.java new file mode 100644 index 00000000000..5630faa6cfa --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CandlelightVigil.java @@ -0,0 +1,62 @@ + +package mage.cards.c; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continuous.BoostEnchantedEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author Ryan-Saklad + */ + +public final class Candlelight Vigil extends CardImpl { + + public Candlelight Vigil(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{W}"); + this.subtype.add(SubType.AURA); + + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // Enchanted creature gets +3/+2 and has vigilance. + Effect effect = new BoostEnchantedEffect(3, 2, Duration.WhileOnBattlefield); + effect.setText("Enchanted creature gets +3/+2"); + SimpleStaticAbility ability2 = new SimpleStaticAbility(Zone.BATTLEFIELD, effect); + effect = new GainAbilityAttachedEffect(VigilanceAbility.getInstance(), AttachmentType.AURA); + effect.setText("and has vigilance"); + ability2.addEffect(effect); + this.addAbility(ability2); + + } + + public Candlelight Vigil(final Candlelight Vigil card) { + super(card); + } + + @Override + public Candlelight Vigil copy() { + return new Candlelight Vigil(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/c/CollarTheCulprit.java b/Mage.Sets/src/mage/cards/c/CollarTheCulprit.java new file mode 100644 index 00000000000..0551082ab36 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CollarTheCulprit.java @@ -0,0 +1,42 @@ + +package mage.cards.c; + +import java.util.UUID; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.ComparisonType; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.ToughnessPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * @author Ryan-Saklad + */ + +public final class CollarTheCulprit extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with toughness 4 or greater"); + + static { + filter.add(new ToughnessPredicate(ComparisonType.MORE_THAN, 3)); + } + + public CollarTheCulprit(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{3}{W}"); + + // Destroy target creature with toughness 4 or greater. + this.getSpellAbility().addEffect(new DestroyTargetEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); + } + + public CollarTheCulprit(final CollarTheCulprit card) { + super(card); + } + + @Override + public CollarTheCulprit copy() { + return new CollarTheCulprit(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/c/CrushContraband.java b/Mage.Sets/src/mage/cards/c/CrushContraband.java new file mode 100644 index 00000000000..6cbe26f8dbb --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CrushContraband.java @@ -0,0 +1,45 @@ + +package mage.cards.c; + +import java.util.UUID; +import mage.abilities.Mode; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetArtifactPermanent; +import mage.target.common.TargetEnchantmentPermanent; + +/** + * + * @author Ryan-Saklad + */ + +public final class CrushContraband extends CardImpl { + + public CrushContraband(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{3}{W}"); + + // Choose one or both - Destroy target artifact; or Destroy target land. + this.getSpellAbility().getModes().setMinModes(1); + this.getSpellAbility().getModes().setMaxModes(2); + + this.getSpellAbility().addTarget(new TargetArtifactPermanent()); + this.getSpellAbility().addEffect(new ExileTargetEffect()); + + Mode mode1 = new Mode(); + mode1.getTargets().add(new TargetEnchantmentPermanent()); + mode1.getEffects().add(new ExileTargetEffect()); + this.getSpellAbility().addMode(mode1); + + } + + public CrushContraband(final CrushContraband card) { + super(card); + } + + @Override + public CrushContraband copy() { + return new CrushContraband(this); + } +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/d/Demotion.java b/Mage.Sets/src/mage/cards/d/Demotion.java new file mode 100644 index 00000000000..c3634273b84 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/Demotion.java @@ -0,0 +1,51 @@ + +package mage.cards.d; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.combat.CantBlockActivateAttachedEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.DefenderAbility; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.*; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author Ryan-Saklad + */ + +public final class Demotion extends CardImpl { + + public Demotion(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{W}"); + 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); + + // Enchanted creature can't block, and its activated abilities can't be activated. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBlockActivateAttachedEffect())); + + } + + public Demotion(final Demotion card) { + super(card); + } + + @Override + public Demotion copy() { + return new Demotion(this); + } +} \ No newline at end of file From a07847d421fa82c802d70c9d34985fe2c9d6882e Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Fri, 21 Sep 2018 19:51:59 -0400 Subject: [PATCH 120/140] fixed some errors --- .../src/mage/cards/c/CandlelightVigil.java | 17 +- Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 577 +++++++++--------- 2 files changed, 298 insertions(+), 296 deletions(-) diff --git a/Mage.Sets/src/mage/cards/c/CandlelightVigil.java b/Mage.Sets/src/mage/cards/c/CandlelightVigil.java index 5630faa6cfa..db7151ceeef 100644 --- a/Mage.Sets/src/mage/cards/c/CandlelightVigil.java +++ b/Mage.Sets/src/mage/cards/c/CandlelightVigil.java @@ -1,4 +1,3 @@ - package mage.cards.c; import java.util.UUID; @@ -25,14 +24,12 @@ import mage.target.common.TargetCreaturePermanent; * * @author Ryan-Saklad */ +public final class CandlelightVigil extends CardImpl { -public final class Candlelight Vigil extends CardImpl { - - public Candlelight Vigil(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{W}"); + public CandlelightVigil(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}"); this.subtype.add(SubType.AURA); - // Enchant creature TargetPermanent auraTarget = new TargetCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); @@ -51,12 +48,12 @@ public final class Candlelight Vigil extends CardImpl { } - public Candlelight Vigil(final Candlelight Vigil card) { + public CandlelightVigil(final CandlelightVigil card) { super(card); } @Override - public Candlelight Vigil copy() { - return new Candlelight Vigil(this); + public CandlelightVigil copy() { + return new CandlelightVigil(this); } -} \ No newline at end of file +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 658783bde57..74443d8ddd5 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -1,288 +1,293 @@ -package mage.sets; - -import mage.cards.ExpansionSet; -import mage.constants.Rarity; -import mage.constants.SetType; - -public final class GuildsOfRavnica extends ExpansionSet { - - private static final GuildsOfRavnica instance = new GuildsOfRavnica(); - - public static GuildsOfRavnica getInstance() { - return instance; - } - - private GuildsOfRavnica() { - super("Guilds of Ravnica", "GRN", ExpansionSet.buildDate(2018, 10, 5), SetType.EXPANSION); - this.blockName = "Guilds of Ravnica"; - this.hasBoosters = true; - this.numBoosterLands = 1; - this.numBoosterCommon = 10; - this.numBoosterUncommon = 3; - this.numBoosterRare = 1; - this.ratioBoosterMythic = 8; - - cards.add(new SetCardInfo("Affectionate Indrik", 121, Rarity.UNCOMMON, mage.cards.a.AffectionateIndrik.class)); - cards.add(new SetCardInfo("Arboretum Elemental", 122, Rarity.UNCOMMON, mage.cards.a.ArboretumElemental.class)); - cards.add(new SetCardInfo("Arclight Phoenix", 91, Rarity.MYTHIC, mage.cards.a.ArclightPhoenix.class)); - cards.add(new SetCardInfo("Artful Takedown", 151, Rarity.COMMON, mage.cards.a.ArtfulTakedown.class)); - cards.add(new SetCardInfo("Assassin's Trophy", 152, Rarity.RARE, mage.cards.a.AssassinsTrophy.class)); - cards.add(new SetCardInfo("Assure // Assemble", 221, Rarity.RARE, mage.cards.a.AssureAssemble.class)); - cards.add(new SetCardInfo("Attendant of Vraska", 271, Rarity.UNCOMMON, mage.cards.a.AttendantOfVraska.class)); - cards.add(new SetCardInfo("Aurelia, Exemplar of Justice", 153, Rarity.MYTHIC, mage.cards.a.AureliaExemplarOfJustice.class)); - cards.add(new SetCardInfo("Barging Sergeant", 92, Rarity.COMMON, mage.cards.b.BargingSergeant.class)); - cards.add(new SetCardInfo("Barrier of Bones", 61, Rarity.COMMON, mage.cards.b.BarrierOfBones.class)); - cards.add(new SetCardInfo("Bartizan Bats", 62, Rarity.COMMON, mage.cards.b.BartizanBats.class)); - cards.add(new SetCardInfo("Beacon Bolt", 154, Rarity.UNCOMMON, mage.cards.b.BeaconBolt.class)); - cards.add(new SetCardInfo("Beast Whisperer", 123, Rarity.RARE, mage.cards.b.BeastWhisperer.class)); - cards.add(new SetCardInfo("Blade Instructor", 1, Rarity.COMMON, mage.cards.b.BladeInstructor.class)); - cards.add(new SetCardInfo("Blood Operative", 63, Rarity.RARE, mage.cards.b.BloodOperative.class)); - cards.add(new SetCardInfo("Book Devourer", 93, Rarity.UNCOMMON, mage.cards.b.BookDevourer.class)); - cards.add(new SetCardInfo("Boros Challenger", 156, Rarity.UNCOMMON, mage.cards.b.BorosChallenger.class)); - cards.add(new SetCardInfo("Boros Guildgate", 243, Rarity.COMMON, mage.cards.b.BorosGuildgate.class)); - cards.add(new SetCardInfo("Boros Guildgate", 244, Rarity.COMMON, mage.cards.b.BorosGuildgate.class)); - cards.add(new SetCardInfo("Boros Locket", 231, Rarity.COMMON, mage.cards.b.BorosLocket.class)); - cards.add(new SetCardInfo("Bounty Agent", 2, Rarity.RARE, mage.cards.b.BountyAgent.class)); - cards.add(new SetCardInfo("Burglar Rat", 64, Rarity.COMMON, mage.cards.b.BurglarRat.class)); - cards.add(new SetCardInfo("Camaraderie", 157, Rarity.RARE, mage.cards.c.Camaraderie.class)); - cards.add(new SetCardInfo("Capture Sphere", 31, Rarity.COMMON, mage.cards.c.CaptureSphere.class)); - cards.add(new SetCardInfo("Centaur Peacemaker", 158, Rarity.COMMON, mage.cards.c.CentaurPeacemaker.class)); - cards.add(new SetCardInfo("Chamber Sentry", 232, Rarity.RARE, mage.cards.c.ChamberSentry.class)); - cards.add(new SetCardInfo("Chance for Glory", 159, Rarity.MYTHIC, mage.cards.c.ChanceForGlory.class)); - cards.add(new SetCardInfo("Charnel Troll", 160, Rarity.RARE, mage.cards.c.CharnelTroll.class)); - cards.add(new SetCardInfo("Chemister's Insight", 32, Rarity.UNCOMMON, mage.cards.c.ChemistersInsight.class)); - cards.add(new SetCardInfo("Child of Night", 65, Rarity.COMMON, mage.cards.c.ChildOfNight.class)); - cards.add(new SetCardInfo("Chromatic Lantern", 233, Rarity.RARE, mage.cards.c.ChromaticLantern.class)); - cards.add(new SetCardInfo("Circuitous Route", 125, Rarity.UNCOMMON, mage.cards.c.CircuitousRoute.class)); - cards.add(new SetCardInfo("Citywatch Sphinx", 33, Rarity.UNCOMMON, mage.cards.c.CitywatchSphinx.class)); - cards.add(new SetCardInfo("Citywide Bust", 4, Rarity.RARE, mage.cards.c.CitywideBust.class)); - cards.add(new SetCardInfo("Command the Storm", 94, Rarity.COMMON, mage.cards.c.CommandTheStorm.class)); - cards.add(new SetCardInfo("Conclave Cavalier", 161, Rarity.UNCOMMON, mage.cards.c.ConclaveCavalier.class)); - cards.add(new SetCardInfo("Conclave Guildmage", 162, Rarity.UNCOMMON, mage.cards.c.ConclaveGuildmage.class)); - cards.add(new SetCardInfo("Conclave Tribunal", 6, Rarity.UNCOMMON, mage.cards.c.ConclaveTribunal.class)); - cards.add(new SetCardInfo("Connive // Concoct", 222, Rarity.RARE, mage.cards.c.ConniveConcoct.class)); - cards.add(new SetCardInfo("Cosmotronic Wave", 95, Rarity.COMMON, mage.cards.c.CosmotronicWave.class)); - cards.add(new SetCardInfo("Crackling Drake", 163, Rarity.UNCOMMON, mage.cards.c.CracklingDrake.class)); - cards.add(new SetCardInfo("Creeping Chill", 66, Rarity.UNCOMMON, mage.cards.c.CreepingChill.class)); - cards.add(new SetCardInfo("Crushing Canopy", 126, Rarity.COMMON, mage.cards.c.CrushingCanopy.class)); - cards.add(new SetCardInfo("Darkblade Agent", 164, Rarity.COMMON, mage.cards.d.DarkbladeAgent.class)); - cards.add(new SetCardInfo("Dawn of Hope", 8, Rarity.RARE, mage.cards.d.DawnOfHope.class)); - cards.add(new SetCardInfo("Dazzling Lights", 34, Rarity.COMMON, mage.cards.d.DazzlingLights.class)); - cards.add(new SetCardInfo("Dead Weight", 67, Rarity.COMMON, mage.cards.d.DeadWeight.class)); - cards.add(new SetCardInfo("Deadly Visit", 68, Rarity.COMMON, mage.cards.d.DeadlyVisit.class)); - cards.add(new SetCardInfo("Deafening Clarion", 165, Rarity.RARE, mage.cards.d.DeafeningClarion.class)); - cards.add(new SetCardInfo("Devious Cover-up", 35, Rarity.COMMON, mage.cards.d.DeviousCoverUp.class)); - cards.add(new SetCardInfo("Devkarin Dissident", 127, Rarity.COMMON, mage.cards.d.DevkarinDissident.class)); - cards.add(new SetCardInfo("Dimir Guildgate", 245, Rarity.COMMON, mage.cards.d.DimirGuildgate.class)); - cards.add(new SetCardInfo("Dimir Guildgate", 246, Rarity.COMMON, mage.cards.d.DimirGuildgate.class)); - cards.add(new SetCardInfo("Dimir Informant", 36, Rarity.COMMON, mage.cards.d.DimirInformant.class)); - cards.add(new SetCardInfo("Dimir Locket", 234, Rarity.COMMON, mage.cards.d.DimirLocket.class)); - cards.add(new SetCardInfo("Dimir Spybug", 166, Rarity.UNCOMMON, mage.cards.d.DimirSpybug.class)); - cards.add(new SetCardInfo("Direct Current", 96, Rarity.COMMON, mage.cards.d.DirectCurrent.class)); - cards.add(new SetCardInfo("Discovery // Dispersal", 223, Rarity.UNCOMMON, mage.cards.d.DiscoveryDispersal.class)); - cards.add(new SetCardInfo("Disdainful Stroke", 37, Rarity.COMMON, mage.cards.d.DisdainfulStroke.class)); - cards.add(new SetCardInfo("Disinformation Campaign", 167, Rarity.UNCOMMON, mage.cards.d.DisinformationCampaign.class)); - cards.add(new SetCardInfo("District Guide", 128, Rarity.UNCOMMON, mage.cards.d.DistrictGuide.class)); - cards.add(new SetCardInfo("Divine Visitation", 10, Rarity.MYTHIC, mage.cards.d.DivineVisitation.class)); - cards.add(new SetCardInfo("Doom Whisperer", 69, Rarity.MYTHIC, mage.cards.d.DoomWhisperer.class)); - cards.add(new SetCardInfo("Douser of Lights", 70, Rarity.COMMON, mage.cards.d.DouserOfLights.class)); - cards.add(new SetCardInfo("Dream Eater", 38, Rarity.MYTHIC, mage.cards.d.DreamEater.class)); - cards.add(new SetCardInfo("Drowned Secrets", 39, Rarity.RARE, mage.cards.d.DrownedSecrets.class)); - cards.add(new SetCardInfo("Electrostatic Field", 97, Rarity.UNCOMMON, mage.cards.e.ElectrostaticField.class)); - cards.add(new SetCardInfo("Emmara, Soul of the Accord", 168, Rarity.RARE, mage.cards.e.EmmaraSoulOfTheAccord.class)); - cards.add(new SetCardInfo("Enhanced Surveillance", 40, Rarity.UNCOMMON, mage.cards.e.EnhancedSurveillance.class)); - cards.add(new SetCardInfo("Erratic Cyclops", 98, Rarity.RARE, mage.cards.e.ErraticCyclops.class)); - cards.add(new SetCardInfo("Erstwhile Trooper", 169, Rarity.COMMON, mage.cards.e.ErstwhileTrooper.class)); - cards.add(new SetCardInfo("Etrata, the Silencer", 170, Rarity.RARE, mage.cards.e.EtrataTheSilencer.class)); - cards.add(new SetCardInfo("Expansion // Explosion", 224, Rarity.RARE, mage.cards.e.ExpansionExplosion.class)); +package mage.sets; + +import mage.cards.ExpansionSet; +import mage.constants.Rarity; +import mage.constants.SetType; + +public final class GuildsOfRavnica extends ExpansionSet { + + private static final GuildsOfRavnica instance = new GuildsOfRavnica(); + + public static GuildsOfRavnica getInstance() { + return instance; + } + + private GuildsOfRavnica() { + super("Guilds of Ravnica", "GRN", ExpansionSet.buildDate(2018, 10, 5), SetType.EXPANSION); + this.blockName = "Guilds of Ravnica"; + this.hasBoosters = true; + this.numBoosterLands = 1; + this.numBoosterCommon = 10; + this.numBoosterUncommon = 3; + this.numBoosterRare = 1; + this.ratioBoosterMythic = 8; + + cards.add(new SetCardInfo("Affectionate Indrik", 121, Rarity.UNCOMMON, mage.cards.a.AffectionateIndrik.class)); + cards.add(new SetCardInfo("Arboretum Elemental", 122, Rarity.UNCOMMON, mage.cards.a.ArboretumElemental.class)); + cards.add(new SetCardInfo("Arclight Phoenix", 91, Rarity.MYTHIC, mage.cards.a.ArclightPhoenix.class)); + cards.add(new SetCardInfo("Artful Takedown", 151, Rarity.COMMON, mage.cards.a.ArtfulTakedown.class)); + cards.add(new SetCardInfo("Assassin's Trophy", 152, Rarity.RARE, mage.cards.a.AssassinsTrophy.class)); + cards.add(new SetCardInfo("Assure // Assemble", 221, Rarity.RARE, mage.cards.a.AssureAssemble.class)); + cards.add(new SetCardInfo("Attendant of Vraska", 271, Rarity.UNCOMMON, mage.cards.a.AttendantOfVraska.class)); + cards.add(new SetCardInfo("Aurelia, Exemplar of Justice", 153, Rarity.MYTHIC, mage.cards.a.AureliaExemplarOfJustice.class)); + cards.add(new SetCardInfo("Barging Sergeant", 92, Rarity.COMMON, mage.cards.b.BargingSergeant.class)); + cards.add(new SetCardInfo("Barrier of Bones", 61, Rarity.COMMON, mage.cards.b.BarrierOfBones.class)); + cards.add(new SetCardInfo("Bartizan Bats", 62, Rarity.COMMON, mage.cards.b.BartizanBats.class)); + cards.add(new SetCardInfo("Beacon Bolt", 154, Rarity.UNCOMMON, mage.cards.b.BeaconBolt.class)); + cards.add(new SetCardInfo("Beast Whisperer", 123, Rarity.RARE, mage.cards.b.BeastWhisperer.class)); + cards.add(new SetCardInfo("Blade Instructor", 1, Rarity.COMMON, mage.cards.b.BladeInstructor.class)); + cards.add(new SetCardInfo("Blood Operative", 63, Rarity.RARE, mage.cards.b.BloodOperative.class)); + cards.add(new SetCardInfo("Book Devourer", 93, Rarity.UNCOMMON, mage.cards.b.BookDevourer.class)); + cards.add(new SetCardInfo("Boros Challenger", 156, Rarity.UNCOMMON, mage.cards.b.BorosChallenger.class)); + cards.add(new SetCardInfo("Boros Guildgate", 243, Rarity.COMMON, mage.cards.b.BorosGuildgate.class)); + cards.add(new SetCardInfo("Boros Guildgate", 244, Rarity.COMMON, mage.cards.b.BorosGuildgate.class)); + cards.add(new SetCardInfo("Boros Locket", 231, Rarity.COMMON, mage.cards.b.BorosLocket.class)); + cards.add(new SetCardInfo("Bounty Agent", 2, Rarity.RARE, mage.cards.b.BountyAgent.class)); + cards.add(new SetCardInfo("Bounty of Might", 124, Rarity.RARE, mage.cards.b.BountyOfMight.class)); + cards.add(new SetCardInfo("Burglar Rat", 64, Rarity.COMMON, mage.cards.b.BurglarRat.class)); + cards.add(new SetCardInfo("Camaraderie", 157, Rarity.RARE, mage.cards.c.Camaraderie.class)); + cards.add(new SetCardInfo("Candlelight Vigil", 3, Rarity.COMMON, mage.cards.c.CandlelightVigil.class)); + cards.add(new SetCardInfo("Capture Sphere", 31, Rarity.COMMON, mage.cards.c.CaptureSphere.class)); + cards.add(new SetCardInfo("Centaur Peacemaker", 158, Rarity.COMMON, mage.cards.c.CentaurPeacemaker.class)); + cards.add(new SetCardInfo("Chamber Sentry", 232, Rarity.RARE, mage.cards.c.ChamberSentry.class)); + cards.add(new SetCardInfo("Chance for Glory", 159, Rarity.MYTHIC, mage.cards.c.ChanceForGlory.class)); + cards.add(new SetCardInfo("Charnel Troll", 160, Rarity.RARE, mage.cards.c.CharnelTroll.class)); + cards.add(new SetCardInfo("Chemister's Insight", 32, Rarity.UNCOMMON, mage.cards.c.ChemistersInsight.class)); + cards.add(new SetCardInfo("Child of Night", 65, Rarity.COMMON, mage.cards.c.ChildOfNight.class)); + cards.add(new SetCardInfo("Chromatic Lantern", 233, Rarity.RARE, mage.cards.c.ChromaticLantern.class)); + cards.add(new SetCardInfo("Circuitous Route", 125, Rarity.UNCOMMON, mage.cards.c.CircuitousRoute.class)); + cards.add(new SetCardInfo("Citywatch Sphinx", 33, Rarity.UNCOMMON, mage.cards.c.CitywatchSphinx.class)); + cards.add(new SetCardInfo("Citywide Bust", 4, Rarity.RARE, mage.cards.c.CitywideBust.class)); + cards.add(new SetCardInfo("Collar the Culprit", 5, Rarity.COMMON, mage.cards.c.CollarTheCulprit.class)); + cards.add(new SetCardInfo("Command the Storm", 94, Rarity.COMMON, mage.cards.c.CommandTheStorm.class)); + cards.add(new SetCardInfo("Conclave Cavalier", 161, Rarity.UNCOMMON, mage.cards.c.ConclaveCavalier.class)); + cards.add(new SetCardInfo("Conclave Guildmage", 162, Rarity.UNCOMMON, mage.cards.c.ConclaveGuildmage.class)); + cards.add(new SetCardInfo("Conclave Tribunal", 6, Rarity.UNCOMMON, mage.cards.c.ConclaveTribunal.class)); + cards.add(new SetCardInfo("Connive // Concoct", 222, Rarity.RARE, mage.cards.c.ConniveConcoct.class)); + cards.add(new SetCardInfo("Cosmotronic Wave", 95, Rarity.COMMON, mage.cards.c.CosmotronicWave.class)); + cards.add(new SetCardInfo("Crackling Drake", 163, Rarity.UNCOMMON, mage.cards.c.CracklingDrake.class)); + cards.add(new SetCardInfo("Creeping Chill", 66, Rarity.UNCOMMON, mage.cards.c.CreepingChill.class)); + cards.add(new SetCardInfo("Crush Contraband", 7, Rarity.UNCOMMON, mage.cards.c.CrushContraband.class)); + cards.add(new SetCardInfo("Crushing Canopy", 126, Rarity.COMMON, mage.cards.c.CrushingCanopy.class)); + cards.add(new SetCardInfo("Darkblade Agent", 164, Rarity.COMMON, mage.cards.d.DarkbladeAgent.class)); + cards.add(new SetCardInfo("Dawn of Hope", 8, Rarity.RARE, mage.cards.d.DawnOfHope.class)); + cards.add(new SetCardInfo("Dazzling Lights", 34, Rarity.COMMON, mage.cards.d.DazzlingLights.class)); + cards.add(new SetCardInfo("Dead Weight", 67, Rarity.COMMON, mage.cards.d.DeadWeight.class)); + cards.add(new SetCardInfo("Deadly Visit", 68, Rarity.COMMON, mage.cards.d.DeadlyVisit.class)); + cards.add(new SetCardInfo("Deafening Clarion", 165, Rarity.RARE, mage.cards.d.DeafeningClarion.class)); + cards.add(new SetCardInfo("Demotion", 9, Rarity.UNCOMMON, mage.cards.d.Demotion.class)); + cards.add(new SetCardInfo("Devious Cover-up", 35, Rarity.COMMON, mage.cards.d.DeviousCoverUp.class)); + cards.add(new SetCardInfo("Devkarin Dissident", 127, Rarity.COMMON, mage.cards.d.DevkarinDissident.class)); + cards.add(new SetCardInfo("Dimir Guildgate", 245, Rarity.COMMON, mage.cards.d.DimirGuildgate.class)); + cards.add(new SetCardInfo("Dimir Guildgate", 246, Rarity.COMMON, mage.cards.d.DimirGuildgate.class)); + cards.add(new SetCardInfo("Dimir Informant", 36, Rarity.COMMON, mage.cards.d.DimirInformant.class)); + cards.add(new SetCardInfo("Dimir Locket", 234, Rarity.COMMON, mage.cards.d.DimirLocket.class)); + cards.add(new SetCardInfo("Dimir Spybug", 166, Rarity.UNCOMMON, mage.cards.d.DimirSpybug.class)); + cards.add(new SetCardInfo("Direct Current", 96, Rarity.COMMON, mage.cards.d.DirectCurrent.class)); + cards.add(new SetCardInfo("Discovery // Dispersal", 223, Rarity.UNCOMMON, mage.cards.d.DiscoveryDispersal.class)); + cards.add(new SetCardInfo("Disdainful Stroke", 37, Rarity.COMMON, mage.cards.d.DisdainfulStroke.class)); + cards.add(new SetCardInfo("Disinformation Campaign", 167, Rarity.UNCOMMON, mage.cards.d.DisinformationCampaign.class)); + cards.add(new SetCardInfo("District Guide", 128, Rarity.UNCOMMON, mage.cards.d.DistrictGuide.class)); + cards.add(new SetCardInfo("Divine Visitation", 10, Rarity.MYTHIC, mage.cards.d.DivineVisitation.class)); + cards.add(new SetCardInfo("Doom Whisperer", 69, Rarity.MYTHIC, mage.cards.d.DoomWhisperer.class)); + cards.add(new SetCardInfo("Douser of Lights", 70, Rarity.COMMON, mage.cards.d.DouserOfLights.class)); + cards.add(new SetCardInfo("Dream Eater", 38, Rarity.MYTHIC, mage.cards.d.DreamEater.class)); + cards.add(new SetCardInfo("Drowned Secrets", 39, Rarity.RARE, mage.cards.d.DrownedSecrets.class)); + cards.add(new SetCardInfo("Electrostatic Field", 97, Rarity.UNCOMMON, mage.cards.e.ElectrostaticField.class)); + cards.add(new SetCardInfo("Emmara, Soul of the Accord", 168, Rarity.RARE, mage.cards.e.EmmaraSoulOfTheAccord.class)); + cards.add(new SetCardInfo("Enhanced Surveillance", 40, Rarity.UNCOMMON, mage.cards.e.EnhancedSurveillance.class)); + cards.add(new SetCardInfo("Erratic Cyclops", 98, Rarity.RARE, mage.cards.e.ErraticCyclops.class)); + cards.add(new SetCardInfo("Erstwhile Trooper", 169, Rarity.COMMON, mage.cards.e.ErstwhileTrooper.class)); + cards.add(new SetCardInfo("Etrata, the Silencer", 170, Rarity.RARE, mage.cards.e.EtrataTheSilencer.class)); + cards.add(new SetCardInfo("Expansion // Explosion", 224, Rarity.RARE, mage.cards.e.ExpansionExplosion.class)); cards.add(new SetCardInfo("Experimental Frenzy", 99, Rarity.RARE, mage.cards.e.ExperimentalFrenzy.class)); - cards.add(new SetCardInfo("Fearless Halberdier", 100, Rarity.COMMON, mage.cards.f.FearlessHalberdier.class)); - cards.add(new SetCardInfo("Find // Finality", 225, Rarity.RARE, mage.cards.f.FindFinality.class)); - cards.add(new SetCardInfo("Fire Urchin", 101, Rarity.COMMON, mage.cards.f.FireUrchin.class)); - cards.add(new SetCardInfo("Firemind's Research", 171, Rarity.RARE, mage.cards.f.FiremindsResearch.class)); - cards.add(new SetCardInfo("Flight of Equenauts", 11, Rarity.UNCOMMON, mage.cards.f.FlightOfEquenauts.class)); - cards.add(new SetCardInfo("Flower // Flourish", 226, Rarity.UNCOMMON, mage.cards.f.FlowerFlourish.class)); - cards.add(new SetCardInfo("Forest", 264, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Fresh-Faced Recruit", 216, Rarity.COMMON, mage.cards.f.FreshFacedRecruit.class)); - cards.add(new SetCardInfo("Garrison Sergeant", 172, Rarity.COMMON, mage.cards.g.GarrisonSergeant.class)); - cards.add(new SetCardInfo("Gatekeeper Gargoyle", 235, Rarity.UNCOMMON, mage.cards.g.GatekeeperGargoyle.class)); - cards.add(new SetCardInfo("Gateway Plaza", 247, Rarity.COMMON, mage.cards.g.GatewayPlaza.class)); - cards.add(new SetCardInfo("Generous Stray", 129, Rarity.COMMON, mage.cards.g.GenerousStray.class)); - cards.add(new SetCardInfo("Gird for Battle", 12, Rarity.UNCOMMON, mage.cards.g.GirdForBattle.class)); - cards.add(new SetCardInfo("Glaive of the Guildpact", 236, Rarity.UNCOMMON, mage.cards.g.GlaiveOfTheGuildpact.class)); - cards.add(new SetCardInfo("Glowspore Shaman", 173, Rarity.UNCOMMON, mage.cards.g.GlowsporeShaman.class)); - cards.add(new SetCardInfo("Goblin Banneret", 102, Rarity.UNCOMMON, mage.cards.g.GoblinBanneret.class)); - cards.add(new SetCardInfo("Goblin Cratermaker", 103, Rarity.UNCOMMON, mage.cards.g.GoblinCratermaker.class)); - cards.add(new SetCardInfo("Goblin Electromancer", 174, Rarity.COMMON, mage.cards.g.GoblinElectromancer.class)); - cards.add(new SetCardInfo("Goblin Locksmith", 104, Rarity.COMMON, mage.cards.g.GoblinLocksmith.class)); - cards.add(new SetCardInfo("Golgari Findbroker", 175, Rarity.UNCOMMON, mage.cards.g.GolgariFindbroker.class)); - cards.add(new SetCardInfo("Golgari Guildgate", 248, Rarity.COMMON, mage.cards.g.GolgariGuildgate.class)); - cards.add(new SetCardInfo("Golgari Guildgate", 249, Rarity.COMMON, mage.cards.g.GolgariGuildgate.class)); - cards.add(new SetCardInfo("Golgari Locket", 237, Rarity.COMMON, mage.cards.g.GolgariLocket.class)); - cards.add(new SetCardInfo("Golgari Raiders", 130, Rarity.UNCOMMON, mage.cards.g.GolgariRaiders.class)); - cards.add(new SetCardInfo("Grappling Sundew", 131, Rarity.UNCOMMON, mage.cards.g.GrapplingSundew.class)); - cards.add(new SetCardInfo("Gravitic Punch", 105, Rarity.COMMON, mage.cards.g.GraviticPunch.class)); - cards.add(new SetCardInfo("Gruesome Menagerie", 71, Rarity.RARE, mage.cards.g.GruesomeMenagerie.class)); - cards.add(new SetCardInfo("Guild Summit", 41, Rarity.UNCOMMON, mage.cards.g.GuildSummit.class)); - cards.add(new SetCardInfo("Haazda Marshal", 13, Rarity.UNCOMMON, mage.cards.h.HaazdaMarshal.class)); - cards.add(new SetCardInfo("Hammer Dropper", 176, Rarity.COMMON, mage.cards.h.HammerDropper.class)); - cards.add(new SetCardInfo("Hatchery Spider", 132, Rarity.RARE, mage.cards.h.HatcherySpider.class)); - cards.add(new SetCardInfo("Healer's Hawk", 14, Rarity.COMMON, mage.cards.h.HealersHawk.class)); - cards.add(new SetCardInfo("Hellkite Whelp", 106, Rarity.UNCOMMON, mage.cards.h.HellkiteWhelp.class)); - cards.add(new SetCardInfo("Hired Poisoner", 72, Rarity.COMMON, mage.cards.h.HiredPoisoner.class)); - cards.add(new SetCardInfo("Hitchclaw Recluse", 133, Rarity.COMMON, mage.cards.h.HitchclawRecluse.class)); - cards.add(new SetCardInfo("House Guildmage", 177, Rarity.UNCOMMON, mage.cards.h.HouseGuildmage.class)); - cards.add(new SetCardInfo("Hunted Witness", 15, Rarity.COMMON, mage.cards.h.HuntedWitness.class)); - cards.add(new SetCardInfo("Hypothesizzle", 178, Rarity.COMMON, mage.cards.h.Hypothesizzle.class)); - cards.add(new SetCardInfo("Impervious Greatwurm", 273, Rarity.MYTHIC, mage.cards.i.ImperviousGreatwurm.class)); - cards.add(new SetCardInfo("Inescapable Blaze", 107, Rarity.UNCOMMON, mage.cards.i.InescapableBlaze.class)); - cards.add(new SetCardInfo("Invert // Invent", 228, Rarity.UNCOMMON, mage.cards.i.InvertInvent.class)); - cards.add(new SetCardInfo("Inspiring Unicorn", 16, Rarity.UNCOMMON, mage.cards.i.InspiringUnicorn.class)); - cards.add(new SetCardInfo("Integrity // Intervention", 227, Rarity.UNCOMMON, mage.cards.i.IntegrityIntervention.class)); - cards.add(new SetCardInfo("Intrusive Packbeast", 17, Rarity.COMMON, mage.cards.i.IntrusivePackbeast.class)); - cards.add(new SetCardInfo("Ionize", 179, Rarity.RARE, mage.cards.i.Ionize.class)); - cards.add(new SetCardInfo("Ironshell Beetle", 134, Rarity.COMMON, mage.cards.i.IronshellBeetle.class)); - cards.add(new SetCardInfo("Island", 261, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Izoni, Thousand-Eyed", 180, Rarity.RARE, mage.cards.i.IzoniThousandEyed.class)); - cards.add(new SetCardInfo("Izzet Guildgate", 251, Rarity.COMMON, mage.cards.i.IzzetGuildgate.class)); - cards.add(new SetCardInfo("Izzet Guildgate", 252, Rarity.COMMON, mage.cards.i.IzzetGuildgate.class)); - cards.add(new SetCardInfo("Izzet Locket", 238, Rarity.COMMON, mage.cards.i.IzzetLocket.class)); - cards.add(new SetCardInfo("Join Shields", 181, Rarity.UNCOMMON, mage.cards.j.JoinShields.class)); - cards.add(new SetCardInfo("Justice Strike", 182, Rarity.UNCOMMON, mage.cards.j.JusticeStrike.class)); - cards.add(new SetCardInfo("Knight of Autumn", 183, Rarity.RARE, mage.cards.k.KnightOfAutumn.class)); - cards.add(new SetCardInfo("Kraul Foragers", 135, Rarity.COMMON, mage.cards.k.KraulForagers.class)); - cards.add(new SetCardInfo("Kraul Harpooner", 136, Rarity.UNCOMMON, mage.cards.k.KraulHarpooner.class)); - cards.add(new SetCardInfo("Kraul Raider", 270, Rarity.COMMON, mage.cards.k.KraulRaider.class)); - cards.add(new SetCardInfo("Kraul Swarm", 73, Rarity.UNCOMMON, mage.cards.k.KraulSwarm.class)); - cards.add(new SetCardInfo("Lava Coil", 108, Rarity.UNCOMMON, mage.cards.l.LavaCoil.class)); - cards.add(new SetCardInfo("Lazav, the Multifarious", 184, Rarity.MYTHIC, mage.cards.l.LazavTheMultifarious.class)); - cards.add(new SetCardInfo("League Guildmage", 185, Rarity.UNCOMMON, mage.cards.l.LeagueGuildmage.class)); - cards.add(new SetCardInfo("Leapfrog", 42, Rarity.COMMON, mage.cards.l.Leapfrog.class)); - cards.add(new SetCardInfo("Ledev Champion", 186, Rarity.UNCOMMON, mage.cards.l.LedevChampion.class)); - cards.add(new SetCardInfo("Ledev Guardian", 18, Rarity.COMMON, mage.cards.l.LedevGuardian.class)); - cards.add(new SetCardInfo("Legion Guildmage", 187, Rarity.UNCOMMON, mage.cards.l.LegionGuildmage.class)); - cards.add(new SetCardInfo("Legion Warboss", 109, Rarity.RARE, mage.cards.l.LegionWarboss.class)); - cards.add(new SetCardInfo("Light of the Legion", 19, Rarity.RARE, mage.cards.l.LightOfTheLegion.class)); - cards.add(new SetCardInfo("Lotleth Giant", 74, Rarity.UNCOMMON, mage.cards.l.LotlethGiant.class)); - cards.add(new SetCardInfo("Loxodon Restorer", 20, Rarity.COMMON, mage.cards.l.LoxodonRestorer.class)); - cards.add(new SetCardInfo("Luminous Bonds", 21, Rarity.COMMON, mage.cards.l.LuminousBonds.class)); - cards.add(new SetCardInfo("Maniacal Rage", 110, Rarity.COMMON, mage.cards.m.ManiacalRage.class)); - cards.add(new SetCardInfo("March of the Multitudes", 188, Rarity.MYTHIC, mage.cards.m.MarchOfTheMultitudes.class)); - cards.add(new SetCardInfo("Mausoleum Secrets", 75, Rarity.RARE, mage.cards.m.MausoleumSecrets.class)); - cards.add(new SetCardInfo("Maximize Altitude", 43, Rarity.COMMON, mage.cards.m.MaximizeAltitude.class)); - cards.add(new SetCardInfo("Maximize Velocity", 111, Rarity.COMMON, mage.cards.m.MaximizeVelocity.class)); - cards.add(new SetCardInfo("Mephitic Vapors", 76, Rarity.COMMON, mage.cards.m.MephiticVapors.class)); - cards.add(new SetCardInfo("Midnight Reaper", 77, Rarity.RARE, mage.cards.m.MidnightReaper.class)); - cards.add(new SetCardInfo("Might of the Masses", 137, Rarity.UNCOMMON, mage.cards.m.MightOfTheMasses.class)); - cards.add(new SetCardInfo("Mission Briefing", 44, Rarity.RARE, mage.cards.m.MissionBriefing.class)); - cards.add(new SetCardInfo("Molderhulk", 190, Rarity.UNCOMMON, mage.cards.m.Molderhulk.class)); - cards.add(new SetCardInfo("Moodmark Painter", 78, Rarity.COMMON, mage.cards.m.MoodmarkPainter.class)); - cards.add(new SetCardInfo("Mountain", 263, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Murmuring Mystic", 45, Rarity.UNCOMMON, mage.cards.m.MurmuringMystic.class)); - cards.add(new SetCardInfo("Muse Drake", 46, Rarity.COMMON, mage.cards.m.MuseDrake.class)); - cards.add(new SetCardInfo("Narcomoeba", 47, Rarity.RARE, mage.cards.n.Narcomoeba.class)); - cards.add(new SetCardInfo("Necrotic Wound", 79, Rarity.UNCOMMON, mage.cards.n.NecroticWound.class)); - cards.add(new SetCardInfo("Never Happened", 80, Rarity.COMMON, mage.cards.n.NeverHappened.class)); - cards.add(new SetCardInfo("Nightveil Predator", 191, Rarity.UNCOMMON, mage.cards.n.NightveilPredator.class)); - cards.add(new SetCardInfo("Nightveil Sprite", 48, Rarity.UNCOMMON, mage.cards.n.NightveilSprite.class)); - cards.add(new SetCardInfo("Niv-Mizzet, Parun", 192, Rarity.RARE, mage.cards.n.NivMizzetParun.class)); - cards.add(new SetCardInfo("Notion Rain", 193, Rarity.COMMON, mage.cards.n.NotionRain.class)); - cards.add(new SetCardInfo("Nullhide Ferox", 138, Rarity.MYTHIC, mage.cards.n.NullhideFerox.class)); - cards.add(new SetCardInfo("Ochran Assassin", 194, Rarity.UNCOMMON, mage.cards.o.OchranAssassin.class)); - cards.add(new SetCardInfo("Omnispell Adept", 49, Rarity.RARE, mage.cards.o.OmnispellAdept.class)); - cards.add(new SetCardInfo("Ornery Goblin", 112, Rarity.COMMON, mage.cards.o.OrneryGoblin.class)); - cards.add(new SetCardInfo("Overgrown Tomb", 253, Rarity.RARE, mage.cards.o.OvergrownTomb.class)); - cards.add(new SetCardInfo("Pack's Favor", 139, Rarity.COMMON, mage.cards.p.PacksFavor.class)); - cards.add(new SetCardInfo("Parhelion Patrol", 22, Rarity.COMMON, mage.cards.p.ParhelionPatrol.class)); - cards.add(new SetCardInfo("Passwall Adept", 50, Rarity.COMMON, mage.cards.p.PasswallAdept.class)); - cards.add(new SetCardInfo("Pause for Reflection", 140, Rarity.COMMON, mage.cards.p.PauseForReflection.class)); + cards.add(new SetCardInfo("Fearless Halberdier", 100, Rarity.COMMON, mage.cards.f.FearlessHalberdier.class)); + cards.add(new SetCardInfo("Find // Finality", 225, Rarity.RARE, mage.cards.f.FindFinality.class)); + cards.add(new SetCardInfo("Fire Urchin", 101, Rarity.COMMON, mage.cards.f.FireUrchin.class)); + cards.add(new SetCardInfo("Firemind's Research", 171, Rarity.RARE, mage.cards.f.FiremindsResearch.class)); + cards.add(new SetCardInfo("Flight of Equenauts", 11, Rarity.UNCOMMON, mage.cards.f.FlightOfEquenauts.class)); + cards.add(new SetCardInfo("Flower // Flourish", 226, Rarity.UNCOMMON, mage.cards.f.FlowerFlourish.class)); + cards.add(new SetCardInfo("Forest", 264, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Fresh-Faced Recruit", 216, Rarity.COMMON, mage.cards.f.FreshFacedRecruit.class)); + cards.add(new SetCardInfo("Garrison Sergeant", 172, Rarity.COMMON, mage.cards.g.GarrisonSergeant.class)); + cards.add(new SetCardInfo("Gatekeeper Gargoyle", 235, Rarity.UNCOMMON, mage.cards.g.GatekeeperGargoyle.class)); + cards.add(new SetCardInfo("Gateway Plaza", 247, Rarity.COMMON, mage.cards.g.GatewayPlaza.class)); + cards.add(new SetCardInfo("Generous Stray", 129, Rarity.COMMON, mage.cards.g.GenerousStray.class)); + cards.add(new SetCardInfo("Gird for Battle", 12, Rarity.UNCOMMON, mage.cards.g.GirdForBattle.class)); + cards.add(new SetCardInfo("Glaive of the Guildpact", 236, Rarity.UNCOMMON, mage.cards.g.GlaiveOfTheGuildpact.class)); + cards.add(new SetCardInfo("Glowspore Shaman", 173, Rarity.UNCOMMON, mage.cards.g.GlowsporeShaman.class)); + cards.add(new SetCardInfo("Goblin Banneret", 102, Rarity.UNCOMMON, mage.cards.g.GoblinBanneret.class)); + cards.add(new SetCardInfo("Goblin Cratermaker", 103, Rarity.UNCOMMON, mage.cards.g.GoblinCratermaker.class)); + cards.add(new SetCardInfo("Goblin Electromancer", 174, Rarity.COMMON, mage.cards.g.GoblinElectromancer.class)); + cards.add(new SetCardInfo("Goblin Locksmith", 104, Rarity.COMMON, mage.cards.g.GoblinLocksmith.class)); + cards.add(new SetCardInfo("Golgari Findbroker", 175, Rarity.UNCOMMON, mage.cards.g.GolgariFindbroker.class)); + cards.add(new SetCardInfo("Golgari Guildgate", 248, Rarity.COMMON, mage.cards.g.GolgariGuildgate.class)); + cards.add(new SetCardInfo("Golgari Guildgate", 249, Rarity.COMMON, mage.cards.g.GolgariGuildgate.class)); + cards.add(new SetCardInfo("Golgari Locket", 237, Rarity.COMMON, mage.cards.g.GolgariLocket.class)); + cards.add(new SetCardInfo("Golgari Raiders", 130, Rarity.UNCOMMON, mage.cards.g.GolgariRaiders.class)); + cards.add(new SetCardInfo("Grappling Sundew", 131, Rarity.UNCOMMON, mage.cards.g.GrapplingSundew.class)); + cards.add(new SetCardInfo("Gravitic Punch", 105, Rarity.COMMON, mage.cards.g.GraviticPunch.class)); + cards.add(new SetCardInfo("Gruesome Menagerie", 71, Rarity.RARE, mage.cards.g.GruesomeMenagerie.class)); + cards.add(new SetCardInfo("Guild Summit", 41, Rarity.UNCOMMON, mage.cards.g.GuildSummit.class)); + cards.add(new SetCardInfo("Haazda Marshal", 13, Rarity.UNCOMMON, mage.cards.h.HaazdaMarshal.class)); + cards.add(new SetCardInfo("Hammer Dropper", 176, Rarity.COMMON, mage.cards.h.HammerDropper.class)); + cards.add(new SetCardInfo("Hatchery Spider", 132, Rarity.RARE, mage.cards.h.HatcherySpider.class)); + cards.add(new SetCardInfo("Healer's Hawk", 14, Rarity.COMMON, mage.cards.h.HealersHawk.class)); + cards.add(new SetCardInfo("Hellkite Whelp", 106, Rarity.UNCOMMON, mage.cards.h.HellkiteWhelp.class)); + cards.add(new SetCardInfo("Hired Poisoner", 72, Rarity.COMMON, mage.cards.h.HiredPoisoner.class)); + cards.add(new SetCardInfo("Hitchclaw Recluse", 133, Rarity.COMMON, mage.cards.h.HitchclawRecluse.class)); + cards.add(new SetCardInfo("House Guildmage", 177, Rarity.UNCOMMON, mage.cards.h.HouseGuildmage.class)); + cards.add(new SetCardInfo("Hunted Witness", 15, Rarity.COMMON, mage.cards.h.HuntedWitness.class)); + cards.add(new SetCardInfo("Hypothesizzle", 178, Rarity.COMMON, mage.cards.h.Hypothesizzle.class)); + cards.add(new SetCardInfo("Impervious Greatwurm", 273, Rarity.MYTHIC, mage.cards.i.ImperviousGreatwurm.class)); + cards.add(new SetCardInfo("Inescapable Blaze", 107, Rarity.UNCOMMON, mage.cards.i.InescapableBlaze.class)); + cards.add(new SetCardInfo("Invert // Invent", 228, Rarity.UNCOMMON, mage.cards.i.InvertInvent.class)); + cards.add(new SetCardInfo("Inspiring Unicorn", 16, Rarity.UNCOMMON, mage.cards.i.InspiringUnicorn.class)); + cards.add(new SetCardInfo("Integrity // Intervention", 227, Rarity.UNCOMMON, mage.cards.i.IntegrityIntervention.class)); + cards.add(new SetCardInfo("Intrusive Packbeast", 17, Rarity.COMMON, mage.cards.i.IntrusivePackbeast.class)); + cards.add(new SetCardInfo("Ionize", 179, Rarity.RARE, mage.cards.i.Ionize.class)); + cards.add(new SetCardInfo("Ironshell Beetle", 134, Rarity.COMMON, mage.cards.i.IronshellBeetle.class)); + cards.add(new SetCardInfo("Island", 261, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Izoni, Thousand-Eyed", 180, Rarity.RARE, mage.cards.i.IzoniThousandEyed.class)); + cards.add(new SetCardInfo("Izzet Guildgate", 251, Rarity.COMMON, mage.cards.i.IzzetGuildgate.class)); + cards.add(new SetCardInfo("Izzet Guildgate", 252, Rarity.COMMON, mage.cards.i.IzzetGuildgate.class)); + cards.add(new SetCardInfo("Izzet Locket", 238, Rarity.COMMON, mage.cards.i.IzzetLocket.class)); + cards.add(new SetCardInfo("Join Shields", 181, Rarity.UNCOMMON, mage.cards.j.JoinShields.class)); + cards.add(new SetCardInfo("Justice Strike", 182, Rarity.UNCOMMON, mage.cards.j.JusticeStrike.class)); + cards.add(new SetCardInfo("Knight of Autumn", 183, Rarity.RARE, mage.cards.k.KnightOfAutumn.class)); + cards.add(new SetCardInfo("Kraul Foragers", 135, Rarity.COMMON, mage.cards.k.KraulForagers.class)); + cards.add(new SetCardInfo("Kraul Harpooner", 136, Rarity.UNCOMMON, mage.cards.k.KraulHarpooner.class)); + cards.add(new SetCardInfo("Kraul Raider", 270, Rarity.COMMON, mage.cards.k.KraulRaider.class)); + cards.add(new SetCardInfo("Kraul Swarm", 73, Rarity.UNCOMMON, mage.cards.k.KraulSwarm.class)); + cards.add(new SetCardInfo("Lava Coil", 108, Rarity.UNCOMMON, mage.cards.l.LavaCoil.class)); + cards.add(new SetCardInfo("Lazav, the Multifarious", 184, Rarity.MYTHIC, mage.cards.l.LazavTheMultifarious.class)); + cards.add(new SetCardInfo("League Guildmage", 185, Rarity.UNCOMMON, mage.cards.l.LeagueGuildmage.class)); + cards.add(new SetCardInfo("Leapfrog", 42, Rarity.COMMON, mage.cards.l.Leapfrog.class)); + cards.add(new SetCardInfo("Ledev Champion", 186, Rarity.UNCOMMON, mage.cards.l.LedevChampion.class)); + cards.add(new SetCardInfo("Ledev Guardian", 18, Rarity.COMMON, mage.cards.l.LedevGuardian.class)); + cards.add(new SetCardInfo("Legion Guildmage", 187, Rarity.UNCOMMON, mage.cards.l.LegionGuildmage.class)); + cards.add(new SetCardInfo("Legion Warboss", 109, Rarity.RARE, mage.cards.l.LegionWarboss.class)); + cards.add(new SetCardInfo("Light of the Legion", 19, Rarity.RARE, mage.cards.l.LightOfTheLegion.class)); + cards.add(new SetCardInfo("Lotleth Giant", 74, Rarity.UNCOMMON, mage.cards.l.LotlethGiant.class)); + cards.add(new SetCardInfo("Loxodon Restorer", 20, Rarity.COMMON, mage.cards.l.LoxodonRestorer.class)); + cards.add(new SetCardInfo("Luminous Bonds", 21, Rarity.COMMON, mage.cards.l.LuminousBonds.class)); + cards.add(new SetCardInfo("Maniacal Rage", 110, Rarity.COMMON, mage.cards.m.ManiacalRage.class)); + cards.add(new SetCardInfo("March of the Multitudes", 188, Rarity.MYTHIC, mage.cards.m.MarchOfTheMultitudes.class)); + cards.add(new SetCardInfo("Mausoleum Secrets", 75, Rarity.RARE, mage.cards.m.MausoleumSecrets.class)); + cards.add(new SetCardInfo("Maximize Altitude", 43, Rarity.COMMON, mage.cards.m.MaximizeAltitude.class)); + cards.add(new SetCardInfo("Maximize Velocity", 111, Rarity.COMMON, mage.cards.m.MaximizeVelocity.class)); + cards.add(new SetCardInfo("Mephitic Vapors", 76, Rarity.COMMON, mage.cards.m.MephiticVapors.class)); + cards.add(new SetCardInfo("Midnight Reaper", 77, Rarity.RARE, mage.cards.m.MidnightReaper.class)); + cards.add(new SetCardInfo("Might of the Masses", 137, Rarity.UNCOMMON, mage.cards.m.MightOfTheMasses.class)); + cards.add(new SetCardInfo("Mission Briefing", 44, Rarity.RARE, mage.cards.m.MissionBriefing.class)); + cards.add(new SetCardInfo("Molderhulk", 190, Rarity.UNCOMMON, mage.cards.m.Molderhulk.class)); + cards.add(new SetCardInfo("Moodmark Painter", 78, Rarity.COMMON, mage.cards.m.MoodmarkPainter.class)); + cards.add(new SetCardInfo("Mountain", 263, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Murmuring Mystic", 45, Rarity.UNCOMMON, mage.cards.m.MurmuringMystic.class)); + cards.add(new SetCardInfo("Muse Drake", 46, Rarity.COMMON, mage.cards.m.MuseDrake.class)); + cards.add(new SetCardInfo("Narcomoeba", 47, Rarity.RARE, mage.cards.n.Narcomoeba.class)); + cards.add(new SetCardInfo("Necrotic Wound", 79, Rarity.UNCOMMON, mage.cards.n.NecroticWound.class)); + cards.add(new SetCardInfo("Never Happened", 80, Rarity.COMMON, mage.cards.n.NeverHappened.class)); + cards.add(new SetCardInfo("Nightveil Predator", 191, Rarity.UNCOMMON, mage.cards.n.NightveilPredator.class)); + cards.add(new SetCardInfo("Nightveil Sprite", 48, Rarity.UNCOMMON, mage.cards.n.NightveilSprite.class)); + cards.add(new SetCardInfo("Niv-Mizzet, Parun", 192, Rarity.RARE, mage.cards.n.NivMizzetParun.class)); + cards.add(new SetCardInfo("Notion Rain", 193, Rarity.COMMON, mage.cards.n.NotionRain.class)); + cards.add(new SetCardInfo("Nullhide Ferox", 138, Rarity.MYTHIC, mage.cards.n.NullhideFerox.class)); + cards.add(new SetCardInfo("Ochran Assassin", 194, Rarity.UNCOMMON, mage.cards.o.OchranAssassin.class)); + cards.add(new SetCardInfo("Omnispell Adept", 49, Rarity.RARE, mage.cards.o.OmnispellAdept.class)); + cards.add(new SetCardInfo("Ornery Goblin", 112, Rarity.COMMON, mage.cards.o.OrneryGoblin.class)); + cards.add(new SetCardInfo("Overgrown Tomb", 253, Rarity.RARE, mage.cards.o.OvergrownTomb.class)); + cards.add(new SetCardInfo("Pack's Favor", 139, Rarity.COMMON, mage.cards.p.PacksFavor.class)); + cards.add(new SetCardInfo("Parhelion Patrol", 22, Rarity.COMMON, mage.cards.p.ParhelionPatrol.class)); + cards.add(new SetCardInfo("Passwall Adept", 50, Rarity.COMMON, mage.cards.p.PasswallAdept.class)); + cards.add(new SetCardInfo("Pause for Reflection", 140, Rarity.COMMON, mage.cards.p.PauseForReflection.class)); cards.add(new SetCardInfo("Pelt Collector", 141, Rarity.RARE, mage.cards.p.PeltCollector.class)); - cards.add(new SetCardInfo("Pilfering Imp", 81, Rarity.UNCOMMON, mage.cards.p.PilferingImp.class)); - cards.add(new SetCardInfo("Piston-Fist Cyclops", 217, Rarity.COMMON, mage.cards.p.PistonFistCyclops.class)); - cards.add(new SetCardInfo("Pitiless Gorgon", 218, Rarity.COMMON, mage.cards.p.PitilessGorgon.class)); - cards.add(new SetCardInfo("Plains", 260, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Portcullis Vine", 142, Rarity.COMMON, mage.cards.p.PortcullisVine.class)); - cards.add(new SetCardInfo("Precision Bolt", 267, Rarity.COMMON, mage.cards.p.PrecisionBolt.class)); - cards.add(new SetCardInfo("Prey Upon", 143, Rarity.COMMON, mage.cards.p.PreyUpon.class)); - cards.add(new SetCardInfo("Price of Fame", 83, Rarity.UNCOMMON, mage.cards.p.PriceOfFame.class)); - cards.add(new SetCardInfo("Quasiduplicate", 51, Rarity.RARE, mage.cards.q.Quasiduplicate.class)); - cards.add(new SetCardInfo("Radical Idea", 52, Rarity.COMMON, mage.cards.r.RadicalIdea.class)); - cards.add(new SetCardInfo("Ral's Dispersal", 266, Rarity.RARE, mage.cards.r.RalsDispersal.class)); - cards.add(new SetCardInfo("Ral's Staticaster", 268, Rarity.UNCOMMON, mage.cards.r.RalsStaticaster.class)); - cards.add(new SetCardInfo("Ral, Caller of Storms", 265, Rarity.MYTHIC, mage.cards.r.RalCallerOfStorms.class)); - cards.add(new SetCardInfo("Ral, Izzet Viceroy", 195, Rarity.MYTHIC, mage.cards.r.RalIzzetViceroy.class)); - cards.add(new SetCardInfo("Rampaging Monument", 239, Rarity.UNCOMMON, mage.cards.r.RampagingMonument.class)); - cards.add(new SetCardInfo("Response // Resurgence", 229, Rarity.RARE, mage.cards.r.ResponseResurgence.class)); - cards.add(new SetCardInfo("Rhizome Lurcher", 196, Rarity.COMMON, mage.cards.r.RhizomeLurcher.class)); - cards.add(new SetCardInfo("Righteous Blow", 23, Rarity.COMMON, mage.cards.r.RighteousBlow.class)); - cards.add(new SetCardInfo("Risk Factor", 113, Rarity.RARE, mage.cards.r.RiskFactor.class)); - cards.add(new SetCardInfo("Ritual of Soot", 84, Rarity.RARE, mage.cards.r.RitualOfSoot.class)); - cards.add(new SetCardInfo("Roc Charger", 24, Rarity.UNCOMMON, mage.cards.r.RocCharger.class)); - cards.add(new SetCardInfo("Rosemane Centaur", 197, Rarity.COMMON, mage.cards.r.RosemaneCentaur.class)); - cards.add(new SetCardInfo("Rubblebelt Boar", 114, Rarity.COMMON, mage.cards.r.RubblebeltBoar.class)); - cards.add(new SetCardInfo("Runaway Steam-Kin", 115, Rarity.RARE, mage.cards.r.RunawaySteamKin.class)); - cards.add(new SetCardInfo("Sacred Foundry", 254, Rarity.RARE, mage.cards.s.SacredFoundry.class)); - cards.add(new SetCardInfo("Selective Snare", 53, Rarity.UNCOMMON, mage.cards.s.SelectiveSnare.class)); - cards.add(new SetCardInfo("Selesnya Guildgate", 255, Rarity.COMMON, mage.cards.s.SelesnyaGuildgate.class)); - cards.add(new SetCardInfo("Selesnya Guildgate", 256, Rarity.COMMON, mage.cards.s.SelesnyaGuildgate.class)); - cards.add(new SetCardInfo("Selesnya Locket", 240, Rarity.COMMON, mage.cards.s.SelesnyaLocket.class)); - cards.add(new SetCardInfo("Severed Strands", 85, Rarity.COMMON, mage.cards.s.SeveredStrands.class)); - cards.add(new SetCardInfo("Siege Wurm", 144, Rarity.COMMON, mage.cards.s.SiegeWurm.class)); - cards.add(new SetCardInfo("Silent Dart", 241, Rarity.UNCOMMON, mage.cards.s.SilentDart.class)); - cards.add(new SetCardInfo("Sinister Sabotage", 54, Rarity.UNCOMMON, mage.cards.s.SinisterSabotage.class)); - cards.add(new SetCardInfo("Skyknight Legionnaire", 198, Rarity.COMMON, mage.cards.s.SkyknightLegionnaire.class)); - cards.add(new SetCardInfo("Skyline Scout", 25, Rarity.COMMON, mage.cards.s.SkylineScout.class)); - cards.add(new SetCardInfo("Smelt-War Minotaur", 116, Rarity.UNCOMMON, mage.cards.s.SmeltWarMinotaur.class)); - cards.add(new SetCardInfo("Sonic Assault", 199, Rarity.COMMON, mage.cards.s.SonicAssault.class)); - cards.add(new SetCardInfo("Spinal Centipede", 86, Rarity.COMMON, mage.cards.s.SpinalCentipede.class)); - cards.add(new SetCardInfo("Sprouting Renewal", 145, Rarity.UNCOMMON, mage.cards.s.SproutingRenewal.class)); - cards.add(new SetCardInfo("Status // Statue", 230, Rarity.UNCOMMON, mage.cards.s.StatusStatue.class)); - cards.add(new SetCardInfo("Steam Vents", 257, Rarity.RARE, mage.cards.s.SteamVents.class)); - cards.add(new SetCardInfo("Street Riot", 117, Rarity.UNCOMMON, mage.cards.s.StreetRiot.class)); - cards.add(new SetCardInfo("Sumala Woodshaper", 200, Rarity.COMMON, mage.cards.s.SumalaWoodshaper.class)); - cards.add(new SetCardInfo("Sunhome Stalwart", 26, Rarity.UNCOMMON, mage.cards.s.SunhomeStalwart.class)); - cards.add(new SetCardInfo("Sure Strike", 118, Rarity.COMMON, mage.cards.s.SureStrike.class)); - cards.add(new SetCardInfo("Swamp", 262, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swarm Guildmage", 201, Rarity.UNCOMMON, mage.cards.s.SwarmGuildmage.class)); - cards.add(new SetCardInfo("Swathcutter Giant", 202, Rarity.UNCOMMON, mage.cards.s.SwathcutterGiant.class)); - cards.add(new SetCardInfo("Swiftblade Vindicator", 203, Rarity.RARE, mage.cards.s.SwiftbladeVindicator.class)); - cards.add(new SetCardInfo("Sworn Companions", 27, Rarity.COMMON, mage.cards.s.SwornCompanions.class)); - cards.add(new SetCardInfo("Tajic, Legion's Edge", 204, Rarity.RARE, mage.cards.t.TajicLegionsEdge.class)); - cards.add(new SetCardInfo("Take Heart", 28, Rarity.COMMON, mage.cards.t.TakeHeart.class)); - cards.add(new SetCardInfo("Temple Garden", 258, Rarity.RARE, mage.cards.t.TempleGarden.class)); - cards.add(new SetCardInfo("Tenth District Guard", 29, Rarity.COMMON, mage.cards.t.TenthDistrictGuard.class)); - cards.add(new SetCardInfo("Thought Erasure", 206, Rarity.UNCOMMON, mage.cards.t.ThoughtErasure.class)); - cards.add(new SetCardInfo("Thoughtbound Phantasm", 55, Rarity.UNCOMMON, mage.cards.t.ThoughtboundPhantasm.class)); - cards.add(new SetCardInfo("Torch Courier", 119, Rarity.COMMON, mage.cards.t.TorchCourier.class)); - cards.add(new SetCardInfo("Trostani Discordant", 208, Rarity.MYTHIC, mage.cards.t.TrostaniDiscordant.class)); - cards.add(new SetCardInfo("Truefire Captain", 209, Rarity.UNCOMMON, mage.cards.t.TruefireCaptain.class)); - cards.add(new SetCardInfo("Undercity Necrolisk", 87, Rarity.UNCOMMON, mage.cards.u.UndercityNecrolisk.class)); - cards.add(new SetCardInfo("Undercity Uprising", 210, Rarity.COMMON, mage.cards.u.UndercityUprising.class)); - cards.add(new SetCardInfo("Underrealm Lich", 211, Rarity.MYTHIC, mage.cards.u.UnderrealmLich.class)); - cards.add(new SetCardInfo("Unexplained Disappearance", 56, Rarity.COMMON, mage.cards.u.UnexplainedDisappearance.class)); - cards.add(new SetCardInfo("Unmoored Ego", 212, Rarity.RARE, mage.cards.u.UnmooredEgo.class)); - cards.add(new SetCardInfo("Urban Utopia", 146, Rarity.COMMON, mage.cards.u.UrbanUtopia.class)); - cards.add(new SetCardInfo("Vedalken Mesmerist", 57, Rarity.COMMON, mage.cards.v.VedalkenMesmerist.class)); - cards.add(new SetCardInfo("Veiled Shade", 88, Rarity.COMMON, mage.cards.v.VeiledShade.class)); - cards.add(new SetCardInfo("Venerated Loxodon", 30, Rarity.RARE, mage.cards.v.VeneratedLoxodon.class)); - cards.add(new SetCardInfo("Vernadi Shieldmate", 219, Rarity.COMMON, mage.cards.v.VernadiShieldmate.class)); - cards.add(new SetCardInfo("Vicious Rumors", 89, Rarity.COMMON, mage.cards.v.ViciousRumors.class)); - cards.add(new SetCardInfo("Vigorspore Wurm", 147, Rarity.COMMON, mage.cards.v.VigorsporeWurm.class)); - cards.add(new SetCardInfo("Vivid Revival", 148, Rarity.RARE, mage.cards.v.VividRevival.class)); - cards.add(new SetCardInfo("Vraska's Stoneglare", 272, Rarity.RARE, mage.cards.v.VraskasStoneglare.class)); - cards.add(new SetCardInfo("Vraska, Golgari Queen", 213, Rarity.MYTHIC, mage.cards.v.VraskaGolgariQueen.class)); - cards.add(new SetCardInfo("Vraska, Regal Gorgon", 269, Rarity.MYTHIC, mage.cards.v.VraskaRegalGorgon.class)); - cards.add(new SetCardInfo("Wall of Mist", 58, Rarity.COMMON, mage.cards.w.WallOfMist.class)); - cards.add(new SetCardInfo("Wand of Vertebrae", 242, Rarity.UNCOMMON, mage.cards.w.WandOfVertebrae.class)); - cards.add(new SetCardInfo("Wary Okapi", 149, Rarity.COMMON, mage.cards.w.WaryOkapi.class)); - cards.add(new SetCardInfo("Watcher in the Mist", 59, Rarity.COMMON, mage.cards.w.WatcherInTheMist.class)); - cards.add(new SetCardInfo("Watery Grave", 259, Rarity.RARE, mage.cards.w.WateryGrave.class)); - cards.add(new SetCardInfo("Wee Dragonauts", 214, Rarity.UNCOMMON, mage.cards.w.WeeDragonauts.class)); - cards.add(new SetCardInfo("Whisper Agent", 220, Rarity.COMMON, mage.cards.w.WhisperAgent.class)); - cards.add(new SetCardInfo("Whispering Snitch", 90, Rarity.UNCOMMON, mage.cards.w.WhisperingSnitch.class)); - cards.add(new SetCardInfo("Wild Ceratok", 150, Rarity.COMMON, mage.cards.w.WildCeratok.class)); - cards.add(new SetCardInfo("Wishcoin Crab", 60, Rarity.COMMON, mage.cards.w.WishcoinCrab.class)); - cards.add(new SetCardInfo("Wojek Bodyguard", 120, Rarity.COMMON, mage.cards.w.WojekBodyguard.class)); - cards.add(new SetCardInfo("Worldsoul Colossus", 215, Rarity.UNCOMMON, mage.cards.w.WorldsoulColossus.class)); - } -} + cards.add(new SetCardInfo("Pilfering Imp", 81, Rarity.UNCOMMON, mage.cards.p.PilferingImp.class)); + cards.add(new SetCardInfo("Piston-Fist Cyclops", 217, Rarity.COMMON, mage.cards.p.PistonFistCyclops.class)); + cards.add(new SetCardInfo("Pitiless Gorgon", 218, Rarity.COMMON, mage.cards.p.PitilessGorgon.class)); + cards.add(new SetCardInfo("Plains", 260, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Portcullis Vine", 142, Rarity.COMMON, mage.cards.p.PortcullisVine.class)); + cards.add(new SetCardInfo("Precision Bolt", 267, Rarity.COMMON, mage.cards.p.PrecisionBolt.class)); + cards.add(new SetCardInfo("Prey Upon", 143, Rarity.COMMON, mage.cards.p.PreyUpon.class)); + cards.add(new SetCardInfo("Price of Fame", 83, Rarity.UNCOMMON, mage.cards.p.PriceOfFame.class)); + cards.add(new SetCardInfo("Quasiduplicate", 51, Rarity.RARE, mage.cards.q.Quasiduplicate.class)); + cards.add(new SetCardInfo("Radical Idea", 52, Rarity.COMMON, mage.cards.r.RadicalIdea.class)); + cards.add(new SetCardInfo("Ral's Dispersal", 266, Rarity.RARE, mage.cards.r.RalsDispersal.class)); + cards.add(new SetCardInfo("Ral's Staticaster", 268, Rarity.UNCOMMON, mage.cards.r.RalsStaticaster.class)); + cards.add(new SetCardInfo("Ral, Caller of Storms", 265, Rarity.MYTHIC, mage.cards.r.RalCallerOfStorms.class)); + cards.add(new SetCardInfo("Ral, Izzet Viceroy", 195, Rarity.MYTHIC, mage.cards.r.RalIzzetViceroy.class)); + cards.add(new SetCardInfo("Rampaging Monument", 239, Rarity.UNCOMMON, mage.cards.r.RampagingMonument.class)); + cards.add(new SetCardInfo("Response // Resurgence", 229, Rarity.RARE, mage.cards.r.ResponseResurgence.class)); + cards.add(new SetCardInfo("Rhizome Lurcher", 196, Rarity.COMMON, mage.cards.r.RhizomeLurcher.class)); + cards.add(new SetCardInfo("Righteous Blow", 23, Rarity.COMMON, mage.cards.r.RighteousBlow.class)); + cards.add(new SetCardInfo("Risk Factor", 113, Rarity.RARE, mage.cards.r.RiskFactor.class)); + cards.add(new SetCardInfo("Ritual of Soot", 84, Rarity.RARE, mage.cards.r.RitualOfSoot.class)); + cards.add(new SetCardInfo("Roc Charger", 24, Rarity.UNCOMMON, mage.cards.r.RocCharger.class)); + cards.add(new SetCardInfo("Rosemane Centaur", 197, Rarity.COMMON, mage.cards.r.RosemaneCentaur.class)); + cards.add(new SetCardInfo("Rubblebelt Boar", 114, Rarity.COMMON, mage.cards.r.RubblebeltBoar.class)); + cards.add(new SetCardInfo("Runaway Steam-Kin", 115, Rarity.RARE, mage.cards.r.RunawaySteamKin.class)); + cards.add(new SetCardInfo("Sacred Foundry", 254, Rarity.RARE, mage.cards.s.SacredFoundry.class)); + cards.add(new SetCardInfo("Selective Snare", 53, Rarity.UNCOMMON, mage.cards.s.SelectiveSnare.class)); + cards.add(new SetCardInfo("Selesnya Guildgate", 255, Rarity.COMMON, mage.cards.s.SelesnyaGuildgate.class)); + cards.add(new SetCardInfo("Selesnya Guildgate", 256, Rarity.COMMON, mage.cards.s.SelesnyaGuildgate.class)); + cards.add(new SetCardInfo("Selesnya Locket", 240, Rarity.COMMON, mage.cards.s.SelesnyaLocket.class)); + cards.add(new SetCardInfo("Severed Strands", 85, Rarity.COMMON, mage.cards.s.SeveredStrands.class)); + cards.add(new SetCardInfo("Siege Wurm", 144, Rarity.COMMON, mage.cards.s.SiegeWurm.class)); + cards.add(new SetCardInfo("Silent Dart", 241, Rarity.UNCOMMON, mage.cards.s.SilentDart.class)); + cards.add(new SetCardInfo("Sinister Sabotage", 54, Rarity.UNCOMMON, mage.cards.s.SinisterSabotage.class)); + cards.add(new SetCardInfo("Skyknight Legionnaire", 198, Rarity.COMMON, mage.cards.s.SkyknightLegionnaire.class)); + cards.add(new SetCardInfo("Skyline Scout", 25, Rarity.COMMON, mage.cards.s.SkylineScout.class)); + cards.add(new SetCardInfo("Smelt-War Minotaur", 116, Rarity.UNCOMMON, mage.cards.s.SmeltWarMinotaur.class)); + cards.add(new SetCardInfo("Sonic Assault", 199, Rarity.COMMON, mage.cards.s.SonicAssault.class)); + cards.add(new SetCardInfo("Spinal Centipede", 86, Rarity.COMMON, mage.cards.s.SpinalCentipede.class)); + cards.add(new SetCardInfo("Sprouting Renewal", 145, Rarity.UNCOMMON, mage.cards.s.SproutingRenewal.class)); + cards.add(new SetCardInfo("Status // Statue", 230, Rarity.UNCOMMON, mage.cards.s.StatusStatue.class)); + cards.add(new SetCardInfo("Steam Vents", 257, Rarity.RARE, mage.cards.s.SteamVents.class)); + cards.add(new SetCardInfo("Street Riot", 117, Rarity.UNCOMMON, mage.cards.s.StreetRiot.class)); + cards.add(new SetCardInfo("Sumala Woodshaper", 200, Rarity.COMMON, mage.cards.s.SumalaWoodshaper.class)); + cards.add(new SetCardInfo("Sunhome Stalwart", 26, Rarity.UNCOMMON, mage.cards.s.SunhomeStalwart.class)); + cards.add(new SetCardInfo("Sure Strike", 118, Rarity.COMMON, mage.cards.s.SureStrike.class)); + cards.add(new SetCardInfo("Swamp", 262, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swarm Guildmage", 201, Rarity.UNCOMMON, mage.cards.s.SwarmGuildmage.class)); + cards.add(new SetCardInfo("Swathcutter Giant", 202, Rarity.UNCOMMON, mage.cards.s.SwathcutterGiant.class)); + cards.add(new SetCardInfo("Swiftblade Vindicator", 203, Rarity.RARE, mage.cards.s.SwiftbladeVindicator.class)); + cards.add(new SetCardInfo("Sworn Companions", 27, Rarity.COMMON, mage.cards.s.SwornCompanions.class)); + cards.add(new SetCardInfo("Tajic, Legion's Edge", 204, Rarity.RARE, mage.cards.t.TajicLegionsEdge.class)); + cards.add(new SetCardInfo("Take Heart", 28, Rarity.COMMON, mage.cards.t.TakeHeart.class)); + cards.add(new SetCardInfo("Temple Garden", 258, Rarity.RARE, mage.cards.t.TempleGarden.class)); + cards.add(new SetCardInfo("Tenth District Guard", 29, Rarity.COMMON, mage.cards.t.TenthDistrictGuard.class)); + cards.add(new SetCardInfo("Thought Erasure", 206, Rarity.UNCOMMON, mage.cards.t.ThoughtErasure.class)); + cards.add(new SetCardInfo("Thoughtbound Phantasm", 55, Rarity.UNCOMMON, mage.cards.t.ThoughtboundPhantasm.class)); + cards.add(new SetCardInfo("Torch Courier", 119, Rarity.COMMON, mage.cards.t.TorchCourier.class)); + cards.add(new SetCardInfo("Trostani Discordant", 208, Rarity.MYTHIC, mage.cards.t.TrostaniDiscordant.class)); + cards.add(new SetCardInfo("Truefire Captain", 209, Rarity.UNCOMMON, mage.cards.t.TruefireCaptain.class)); + cards.add(new SetCardInfo("Undercity Necrolisk", 87, Rarity.UNCOMMON, mage.cards.u.UndercityNecrolisk.class)); + cards.add(new SetCardInfo("Undercity Uprising", 210, Rarity.COMMON, mage.cards.u.UndercityUprising.class)); + cards.add(new SetCardInfo("Underrealm Lich", 211, Rarity.MYTHIC, mage.cards.u.UnderrealmLich.class)); + cards.add(new SetCardInfo("Unexplained Disappearance", 56, Rarity.COMMON, mage.cards.u.UnexplainedDisappearance.class)); + cards.add(new SetCardInfo("Unmoored Ego", 212, Rarity.RARE, mage.cards.u.UnmooredEgo.class)); + cards.add(new SetCardInfo("Urban Utopia", 146, Rarity.COMMON, mage.cards.u.UrbanUtopia.class)); + cards.add(new SetCardInfo("Vedalken Mesmerist", 57, Rarity.COMMON, mage.cards.v.VedalkenMesmerist.class)); + cards.add(new SetCardInfo("Veiled Shade", 88, Rarity.COMMON, mage.cards.v.VeiledShade.class)); + cards.add(new SetCardInfo("Venerated Loxodon", 30, Rarity.RARE, mage.cards.v.VeneratedLoxodon.class)); + cards.add(new SetCardInfo("Vernadi Shieldmate", 219, Rarity.COMMON, mage.cards.v.VernadiShieldmate.class)); + cards.add(new SetCardInfo("Vicious Rumors", 89, Rarity.COMMON, mage.cards.v.ViciousRumors.class)); + cards.add(new SetCardInfo("Vigorspore Wurm", 147, Rarity.COMMON, mage.cards.v.VigorsporeWurm.class)); + cards.add(new SetCardInfo("Vivid Revival", 148, Rarity.RARE, mage.cards.v.VividRevival.class)); + cards.add(new SetCardInfo("Vraska's Stoneglare", 272, Rarity.RARE, mage.cards.v.VraskasStoneglare.class)); + cards.add(new SetCardInfo("Vraska, Golgari Queen", 213, Rarity.MYTHIC, mage.cards.v.VraskaGolgariQueen.class)); + cards.add(new SetCardInfo("Vraska, Regal Gorgon", 269, Rarity.MYTHIC, mage.cards.v.VraskaRegalGorgon.class)); + cards.add(new SetCardInfo("Wall of Mist", 58, Rarity.COMMON, mage.cards.w.WallOfMist.class)); + cards.add(new SetCardInfo("Wand of Vertebrae", 242, Rarity.UNCOMMON, mage.cards.w.WandOfVertebrae.class)); + cards.add(new SetCardInfo("Wary Okapi", 149, Rarity.COMMON, mage.cards.w.WaryOkapi.class)); + cards.add(new SetCardInfo("Watcher in the Mist", 59, Rarity.COMMON, mage.cards.w.WatcherInTheMist.class)); + cards.add(new SetCardInfo("Watery Grave", 259, Rarity.RARE, mage.cards.w.WateryGrave.class)); + cards.add(new SetCardInfo("Wee Dragonauts", 214, Rarity.UNCOMMON, mage.cards.w.WeeDragonauts.class)); + cards.add(new SetCardInfo("Whisper Agent", 220, Rarity.COMMON, mage.cards.w.WhisperAgent.class)); + cards.add(new SetCardInfo("Whispering Snitch", 90, Rarity.UNCOMMON, mage.cards.w.WhisperingSnitch.class)); + cards.add(new SetCardInfo("Wild Ceratok", 150, Rarity.COMMON, mage.cards.w.WildCeratok.class)); + cards.add(new SetCardInfo("Wishcoin Crab", 60, Rarity.COMMON, mage.cards.w.WishcoinCrab.class)); + cards.add(new SetCardInfo("Wojek Bodyguard", 120, Rarity.COMMON, mage.cards.w.WojekBodyguard.class)); + cards.add(new SetCardInfo("Worldsoul Colossus", 215, Rarity.UNCOMMON, mage.cards.w.WorldsoulColossus.class)); + } +} From cb138473e5a846b314b6f832fc1c73177df6c58e Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Fri, 21 Sep 2018 19:54:21 -0400 Subject: [PATCH 121/140] fixed Smelt-Ward Minotaur's name --- .../{SmeltWarMinotaur.java => SmeltWardMinotaur.java} | 10 +++++----- Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 2 +- Utils/mtg-cards-data.txt | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) rename Mage.Sets/src/mage/cards/s/{SmeltWarMinotaur.java => SmeltWardMinotaur.java} (82%) diff --git a/Mage.Sets/src/mage/cards/s/SmeltWarMinotaur.java b/Mage.Sets/src/mage/cards/s/SmeltWardMinotaur.java similarity index 82% rename from Mage.Sets/src/mage/cards/s/SmeltWarMinotaur.java rename to Mage.Sets/src/mage/cards/s/SmeltWardMinotaur.java index 0063190f201..d3cf7c4ca5f 100644 --- a/Mage.Sets/src/mage/cards/s/SmeltWarMinotaur.java +++ b/Mage.Sets/src/mage/cards/s/SmeltWardMinotaur.java @@ -17,9 +17,9 @@ import mage.target.common.TargetOpponentsCreaturePermanent; * * @author TheElk801 */ -public final class SmeltWarMinotaur extends CardImpl { +public final class SmeltWardMinotaur extends CardImpl { - public SmeltWarMinotaur(UUID ownerId, CardSetInfo setInfo) { + public SmeltWardMinotaur(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{R}"); this.subtype.add(SubType.MINOTAUR); @@ -36,12 +36,12 @@ public final class SmeltWarMinotaur extends CardImpl { this.addAbility(ability); } - public SmeltWarMinotaur(final SmeltWarMinotaur card) { + public SmeltWardMinotaur(final SmeltWardMinotaur card) { super(card); } @Override - public SmeltWarMinotaur copy() { - return new SmeltWarMinotaur(this); + public SmeltWardMinotaur copy() { + return new SmeltWardMinotaur(this); } } diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 74443d8ddd5..e8438b3573a 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -237,7 +237,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Sinister Sabotage", 54, Rarity.UNCOMMON, mage.cards.s.SinisterSabotage.class)); cards.add(new SetCardInfo("Skyknight Legionnaire", 198, Rarity.COMMON, mage.cards.s.SkyknightLegionnaire.class)); cards.add(new SetCardInfo("Skyline Scout", 25, Rarity.COMMON, mage.cards.s.SkylineScout.class)); - cards.add(new SetCardInfo("Smelt-War Minotaur", 116, Rarity.UNCOMMON, mage.cards.s.SmeltWarMinotaur.class)); + cards.add(new SetCardInfo("Smelt-Ward Minotaur", 116, Rarity.UNCOMMON, mage.cards.s.SmeltWardMinotaur.class)); cards.add(new SetCardInfo("Sonic Assault", 199, Rarity.COMMON, mage.cards.s.SonicAssault.class)); cards.add(new SetCardInfo("Spinal Centipede", 86, Rarity.COMMON, mage.cards.s.SpinalCentipede.class)); cards.add(new SetCardInfo("Sprouting Renewal", 145, Rarity.UNCOMMON, mage.cards.s.SproutingRenewal.class)); diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 53c09ed0a13..4859b6ceed0 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -34413,7 +34413,7 @@ Ornery Goblin|Guilds of Ravnica|112|C|{1}{R}|Creature - Goblin Warrior|2|1|Whene Risk Factor|Guilds of Ravnica|113|R|{2}{R}|Instant|||Target opponent may have Risk Factor deal 4 damage to them. If that player doesn't, you draw three cards.$Jump-start| Rubblebelt Boar|Guilds of Ravnica|114|C|{3}{R}|Creature - Boar|3|3|When Rubblebelt Boar enters the battlefield, target creature gets +2/+0 until end of turn.| Runaway Steam-Kin|Guilds of Ravnica|115|R|{1}{R}|Creature - Elemental|1|1|Whenever you cast a red spell, if Runaway Steam-Kin has fewer than three +1/+1 counters on it, put a +1/+1 counter on Runaway Steam-Kin.$Remove three +1/+1 counters from Runaway Steam-Kin: Add {R}{R}{R}.| -Smelt-War Minotaur|Guilds of Ravnica|116|U|{2}{R}|Creature - Minotaur Warrior|2|3|Whenever you cast an instant or sorcery spell, target creature an opponent controls can't block this turn.| +Smelt-Ward Minotaur|Guilds of Ravnica|116|U|{2}{R}|Creature - Minotaur Warrior|2|3|Whenever you cast an instant or sorcery spell, target creature an opponent controls can't block this turn.| Street Riot|Guilds of Ravnica|117|U|{4}{R}|Enchantment|||As long as it's your turn, creatures you control get +1/+0 and have trample.| Sure Strike|Guilds of Ravnica|118|C|{1}{R}|Instant|||Target creature gets +3/+0 and gains first strike until end of turn.| Torch Courier|Guilds of Ravnica|119|C|{R}|Creature - Goblin|1|1|Haste$Sacrifice Torch Courier: Another target creature gains haste until end of turn.| From fe524109249eb82e6518342408f9ee884f630c05 Mon Sep 17 00:00:00 2001 From: Miguel Sainz Jr Date: Fri, 21 Sep 2018 21:56:05 -0400 Subject: [PATCH 122/140] Card - Plaguecrafter - Fix order events occur --- Mage.Sets/src/mage/cards/p/Plaguecrafter.java | 66 +++++++++++++------ 1 file changed, 45 insertions(+), 21 deletions(-) diff --git a/Mage.Sets/src/mage/cards/p/Plaguecrafter.java b/Mage.Sets/src/mage/cards/p/Plaguecrafter.java index 946ca6ff324..acacd32026d 100644 --- a/Mage.Sets/src/mage/cards/p/Plaguecrafter.java +++ b/Mage.Sets/src/mage/cards/p/Plaguecrafter.java @@ -1,10 +1,12 @@ package mage.cards.p; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.effects.common.SacrificeEffect; +import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.discard.DiscardTargetEffect; @@ -13,11 +15,13 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; -import mage.filter.FilterPermanent; -import mage.filter.StaticFilters; -import mage.filter.common.FilterCreatureOrPlaneswalkerPermanent; -import mage.filter.predicate.permanent.ControllerIdPredicate; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetControlledPermanent; import mage.target.targetpointer.FixedTarget; /** @@ -70,25 +74,45 @@ class PlaguecrafterEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - game.getPlayers().forEach((playerId, player) -> { - if (!(player == null)) { - FilterPermanent filter = new FilterCreatureOrPlaneswalkerPermanent(); - filter.add(new ControllerIdPredicate(playerId)); - if (game.getBattlefield().getActivePermanents( - filter, source.getControllerId(), game - ).isEmpty()) { - Effect discardEffect = new DiscardTargetEffect(1); - discardEffect.setTargetPointer(new FixedTarget(playerId, game)); - discardEffect.apply(game, source); + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return false; + } + + List perms = new ArrayList<>(); + List cantSac = new ArrayList<>(); + + for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { + Player player = game.getPlayer(playerId); + if (player != null) { + FilterControlledPermanent filter = new FilterControlledPermanent(); + filter.add(Predicates.or( + new CardTypePredicate(CardType.CREATURE), + new CardTypePredicate(CardType.PLANESWALKER))); + TargetControlledPermanent target = new TargetControlledPermanent(1, 1, filter, true); + if (target.canChoose(player.getId(), game)) { + while (!target.isChosen() && player.canRespond()) { + player.choose(Outcome.Sacrifice, target, source.getSourceId(), game); + } + perms.addAll(target.getTargets()); } else { - Effect effect = new SacrificeEffect( - StaticFilters.FILTER_PERMANENT_CREATURE_OR_PLANESWALKER_A, 1, null - ); - effect.setTargetPointer(new FixedTarget(playerId, game)); - effect.apply(game, source); + cantSac.add(playerId); } } - }); + } + + for (UUID permID : perms) { + Permanent permanent = game.getPermanent(permID); + if (permanent != null) { + permanent.sacrifice(source.getSourceId(), game); + } + } + + for (UUID playerId : cantSac) { + Effect discardEffect = new DiscardTargetEffect(1); + discardEffect.setTargetPointer(new FixedTarget(playerId, game)); + discardEffect.apply(game, source); + } return true; } } \ No newline at end of file From 37a92e9ca198aa8c5411dc5af7888c93735e8760 Mon Sep 17 00:00:00 2001 From: Miguel Sainz Jr Date: Fri, 21 Sep 2018 21:57:39 -0400 Subject: [PATCH 123/140] Card - Plaguecrafter - Cleanup --- Mage.Sets/src/mage/cards/p/Plaguecrafter.java | 1 - 1 file changed, 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/p/Plaguecrafter.java b/Mage.Sets/src/mage/cards/p/Plaguecrafter.java index acacd32026d..2e0c97b14c4 100644 --- a/Mage.Sets/src/mage/cards/p/Plaguecrafter.java +++ b/Mage.Sets/src/mage/cards/p/Plaguecrafter.java @@ -6,7 +6,6 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; -import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.discard.DiscardTargetEffect; From 24536032cd7a18695ff459c965613bf642df3338 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Sat, 22 Sep 2018 10:06:40 -0400 Subject: [PATCH 124/140] Implemented Mnemonic Betrayal --- .../src/mage/cards/m/MnemonicBetrayal.java | 219 ++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + .../abilities/DelayedTriggeredAbility.java | 2 +- 3 files changed, 221 insertions(+), 1 deletion(-) create mode 100644 Mage.Sets/src/mage/cards/m/MnemonicBetrayal.java diff --git a/Mage.Sets/src/mage/cards/m/MnemonicBetrayal.java b/Mage.Sets/src/mage/cards/m/MnemonicBetrayal.java new file mode 100644 index 00000000000..b9a5f94619c --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MnemonicBetrayal.java @@ -0,0 +1,219 @@ +package mage.cards.m; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.DelayedTriggeredAbility; +import mage.abilities.effects.AsThoughEffectImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ExileSpellEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.constants.AsThoughEffectType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.players.Player; + +/** + * + * @author TheElk801 + */ +public final class MnemonicBetrayal extends CardImpl { + + public MnemonicBetrayal(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{U}{B}"); + + // Exile all cards from all opponents' graveyards. You may cast those cards this turn, and you may spend mana as though it were mana of any type to cast those spells. At the beginning of the next end step, if any of those cards remain exiled, return them to their owner's graveyards. + this.getSpellAbility().addEffect(new MnemonicBetrayalExileEffect()); + + // Exile Mnemonic Betrayal. + this.getSpellAbility().addEffect(ExileSpellEffect.getInstance()); + } + + public MnemonicBetrayal(final MnemonicBetrayal card) { + super(card); + } + + @Override + public MnemonicBetrayal copy() { + return new MnemonicBetrayal(this); + } +} + +class MnemonicBetrayalExileEffect extends OneShotEffect { + + public MnemonicBetrayalExileEffect() { + super(Outcome.Benefit); + this.staticText = "Exile all cards from all opponents' graveyards. " + + "You may cast those cards this turn, " + + "and you may spend mana as though it were mana of any type " + + "to cast those spells. At the beginning of the next end step, " + + "if any of those cards remain exiled, " + + "return them to their owner's graveyards."; + } + + public MnemonicBetrayalExileEffect(final MnemonicBetrayalExileEffect effect) { + super(effect); + } + + @Override + public MnemonicBetrayalExileEffect copy() { + return new MnemonicBetrayalExileEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller == null) { + return false; + } + Cards cards = new CardsImpl(); + Map cardMap = new HashMap(); + for (UUID playerId : game.getOpponents(source.getControllerId())) { + Player player = game.getPlayer(playerId); + if (player != null) { + cards.addAll(player.getGraveyard()); + } + } + for (Card card : cards.getCards(game)) { + cardMap.put(card.getId(), card.getZoneChangeCounter(game)); + game.addEffect(new MnemonicBetrayalCastFromExileEffect(card, game), source); + } + controller.moveCardsToExile(cards.getCards(game), source, game, true, source.getSourceId(), source.getSourceObjectIfItStillExists(game).getName()); + game.addDelayedTriggeredAbility(new MnemonicBetrayalDelayedTriggeredAbility(cards, cardMap)); + return true; + } +} + +class MnemonicBetrayalCastFromExileEffect extends AsThoughEffectImpl { + + private final Card card; + private final int zoneCounter; + + public MnemonicBetrayalCastFromExileEffect(Card card, Game game) { + super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.Custom, Outcome.Benefit); + this.card = card; + this.zoneCounter = card.getZoneChangeCounter(game) + 1; + } + + public MnemonicBetrayalCastFromExileEffect(final MnemonicBetrayalCastFromExileEffect effect) { + super(effect); + this.card = effect.card; + this.zoneCounter = effect.zoneCounter; + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public MnemonicBetrayalCastFromExileEffect copy() { + return new MnemonicBetrayalCastFromExileEffect(this); + } + + @Override + public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { + if (card.getZoneChangeCounter(game) != zoneCounter) { + this.discard(); + return false; + } + return objectId.equals(card.getId()) + && card.getZoneChangeCounter(game) == zoneCounter + && affectedControllerId.equals(source.getControllerId()); + } +} + +class MnemonicBetrayalDelayedTriggeredAbility extends DelayedTriggeredAbility { + + private final Cards cards; + private final Map cardMap = new HashMap(); + + public MnemonicBetrayalDelayedTriggeredAbility(Cards cards, Map cardMap) { + super(new MnemonicBetrayalReturnEffect(cards, cardMap)); + this.triggerOnlyOnce = true; + this.cards = cards; + this.cardMap.putAll(cardMap); + } + + public MnemonicBetrayalDelayedTriggeredAbility(final MnemonicBetrayalDelayedTriggeredAbility ability) { + super(ability); + this.cards = ability.cards.copy(); + this.cardMap.putAll(ability.cardMap); + } + + @Override + public MnemonicBetrayalDelayedTriggeredAbility copy() { + return new MnemonicBetrayalDelayedTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.END_TURN_STEP_PRE; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + return true; + } + + @Override + public boolean checkInterveningIfClause(Game game) { + return cards.stream().anyMatch((cardId) -> (game.getState().getZone(cardId) == Zone.EXILED + && game.getState().getZoneChangeCounter(cardId) == cardMap.getOrDefault(cardId, -5) + 1)); + } + + @Override + public String getRule() { + return "At the beginning of the next end step, " + + "if any of those cards remain exiled, " + + "return them to their owner's graveyards."; + } +} + +class MnemonicBetrayalReturnEffect extends OneShotEffect { + + private final Cards cards; + private final Map cardMap = new HashMap(); + + public MnemonicBetrayalReturnEffect(Cards cards, Map cardMap) { + super(Outcome.Benefit); + this.cards = cards; + this.cardMap.putAll(cardMap); + } + + public MnemonicBetrayalReturnEffect(final MnemonicBetrayalReturnEffect effect) { + super(effect); + this.cards = effect.cards.copy(); + this.cardMap.putAll(effect.cardMap); + } + + @Override + public MnemonicBetrayalReturnEffect copy() { + return new MnemonicBetrayalReturnEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + Cards cardsToReturn = new CardsImpl(); + for (Card card : cards.getCards(game)) { + if (game.getState().getZone(card.getId()) == Zone.EXILED + && card.getZoneChangeCounter(game) == cardMap.getOrDefault(card.getId(), -5) + 1) { + cardsToReturn.add(card); + } + } + return player.moveCards(cardsToReturn, Zone.GRAVEYARD, source, game); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index e8438b3573a..97ffae582bd 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -180,6 +180,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Midnight Reaper", 77, Rarity.RARE, mage.cards.m.MidnightReaper.class)); cards.add(new SetCardInfo("Might of the Masses", 137, Rarity.UNCOMMON, mage.cards.m.MightOfTheMasses.class)); cards.add(new SetCardInfo("Mission Briefing", 44, Rarity.RARE, mage.cards.m.MissionBriefing.class)); + cards.add(new SetCardInfo("Mnemonic Betrayal", 189, Rarity.MYTHIC, mage.cards.m.MnemonicBetrayal.class)); cards.add(new SetCardInfo("Molderhulk", 190, Rarity.UNCOMMON, mage.cards.m.Molderhulk.class)); cards.add(new SetCardInfo("Moodmark Painter", 78, Rarity.COMMON, mage.cards.m.MoodmarkPainter.class)); cards.add(new SetCardInfo("Mountain", 263, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); diff --git a/Mage/src/main/java/mage/abilities/DelayedTriggeredAbility.java b/Mage/src/main/java/mage/abilities/DelayedTriggeredAbility.java index 8748e25d3fb..739915cc4c2 100644 --- a/Mage/src/main/java/mage/abilities/DelayedTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/DelayedTriggeredAbility.java @@ -13,7 +13,7 @@ import mage.game.Game; public abstract class DelayedTriggeredAbility extends TriggeredAbilityImpl { private Duration duration; - private boolean triggerOnlyOnce; + protected boolean triggerOnlyOnce; public DelayedTriggeredAbility(Effect effect) { this(effect, Duration.EndOfGame); From 4c17a13bce27cb145d3776115289bd000310b375 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 22 Sep 2018 16:43:15 +0200 Subject: [PATCH 125/140] [GRN] Added Thief of Sanity. --- .../src/mage/cards/f/ForceProjection.java | 8 +- Mage.Sets/src/mage/cards/t/ThiefOfSanity.java | 260 ++++++++++++++++++ .../abilities/effects/AsThoughEffect.java | 2 +- .../abilities/effects/AsThoughEffectImpl.java | 9 +- .../abilities/effects/ContinuousEffects.java | 7 +- ...itiesAnyTimeYouCouldCastInstantEffect.java | 2 +- .../abilities/keyword/OfferingAbility.java | 2 +- 7 files changed, 274 insertions(+), 16 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/t/ThiefOfSanity.java diff --git a/Mage.Sets/src/mage/cards/f/ForceProjection.java b/Mage.Sets/src/mage/cards/f/ForceProjection.java index a29ec11982c..6770afe6c72 100644 --- a/Mage.Sets/src/mage/cards/f/ForceProjection.java +++ b/Mage.Sets/src/mage/cards/f/ForceProjection.java @@ -1,7 +1,6 @@ package mage.cards.f; import java.util.UUID; - import mage.abilities.Ability; import mage.abilities.TriggeredAbility; import mage.abilities.common.BecomesTargetTriggeredAbility; @@ -15,13 +14,11 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.SubType; -import mage.constants.Zone; import mage.filter.FilterSpell; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetControlledCreaturePermanent; -import mage.target.common.TargetCreaturePermanent; import mage.target.targetpointer.FixedTarget; /** @@ -32,7 +29,6 @@ public final class ForceProjection extends CardImpl { public ForceProjection(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{U}{U}"); - // Create a token that is a copy of target creature you control except that it is an Illusion in addition to its other types and gains "When this creature becomes the target of a spell, sacrifice it." this.getSpellAbility().addEffect(new ForceProjectionEffect()); @@ -56,8 +52,8 @@ class ForceProjectionEffect extends OneShotEffect { public ForceProjectionEffect() { super(Outcome.Copy); - this.staticText = "Create a token that is a copy of target creature you control except that it is an Illusion " + - "in addition to its other types and gains \"When this creature becomes the target of a spell, sacrifice it.\""; + this.staticText = "Create a token that is a copy of target creature you control except that it is an Illusion " + + "in addition to its other types and gains \"When this creature becomes the target of a spell, sacrifice it.\""; } public ForceProjectionEffect(final ForceProjectionEffect effect) { diff --git a/Mage.Sets/src/mage/cards/t/ThiefOfSanity.java b/Mage.Sets/src/mage/cards/t/ThiefOfSanity.java new file mode 100644 index 00000000000..f0db706fc49 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/ThiefOfSanity.java @@ -0,0 +1,260 @@ +package mage.cards.t; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; +import mage.MageInt; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.AsThoughEffectImpl; +import mage.abilities.effects.AsThoughManaEffect; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.constants.AsThoughEffectType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.ManaType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.game.ExileZone; +import mage.game.Game; +import mage.players.ManaPoolItem; +import mage.players.Player; +import mage.target.TargetCard; +import mage.target.targetpointer.FixedTarget; +import mage.util.CardUtil; + +/** + * + * @author LevelX2 + */ +public final class ThiefOfSanity extends CardImpl { + + protected static final String VALUE_PREFIX = "ExileZones"; + + public ThiefOfSanity(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{B}"); + + this.subtype.add(SubType.SPECTER); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + + // Whenever Thief of Sanity deals combat damage to a player, look at the top three cards of that player's library, exile one of them face down, then put the rest into their graveyard. For as long as that card remains exiled, you may look at it, you may cast it, and you may spend mana as though it were mana of any type to cast it. + this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility(new ThiefOfSanityEffect(), false, true)); + + Ability ability = new SimpleStaticAbility(Zone.ALL, new ThiefOfSanityLookEffect()); + ability.setRuleVisible(false); + this.addAbility(ability); + } + + public ThiefOfSanity(final ThiefOfSanity card) { + super(card); + } + + @Override + public ThiefOfSanity copy() { + return new ThiefOfSanity(this); + } +} + +class ThiefOfSanityEffect extends OneShotEffect { + + public ThiefOfSanityEffect() { + super(Outcome.Benefit); + this.staticText = "look at the top three cards of that player's library, exile one of them face down, then put the rest into their graveyard. For as long as that card remains exiled, you may look at it, you may cast it, and you may spend mana as though it were mana of any type to cast it"; + } + + public ThiefOfSanityEffect(final ThiefOfSanityEffect effect) { + super(effect); + } + + @Override + public ThiefOfSanityEffect copy() { + return new ThiefOfSanityEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Player damagedPlayer = game.getPlayer(getTargetPointer().getFirst(game, source)); + MageObject sourceObject = source.getSourceObject(game); + if (controller != null && damagedPlayer != null && sourceObject != null) { + Cards topCards = new CardsImpl(); + topCards.addAll(damagedPlayer.getLibrary().getTopCards(game, 3)); + TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("card to exile face down")); + if (controller.choose(outcome, topCards, target, game)) { + Card card = game.getCard(target.getFirstTarget()); + if (card != null) { + topCards.remove(card); + // move card to exile + UUID exileZoneId = CardUtil.getExileZoneId(game, source.getSourceId(), source.getSourceObjectZoneChangeCounter()); + card.setFaceDown(true, game); + if (controller.moveCardsToExile(card, source, game, false, exileZoneId, sourceObject.getIdName())) { + card.setFaceDown(true, game); + Set exileZones = (Set) game.getState().getValue(ThiefOfSanity.VALUE_PREFIX + source.getSourceId().toString()); + if (exileZones == null) { + exileZones = new HashSet<>(); + game.getState().setValue(ThiefOfSanity.VALUE_PREFIX + source.getSourceId().toString(), exileZones); + } + exileZones.add(exileZoneId); + // allow to cast the card + ContinuousEffect effect = new ThiefOfSanityCastFromExileEffect(); + effect.setTargetPointer(new FixedTarget(card.getId(), game)); + game.addEffect(effect, source); + // and you may spend mana as though it were mana of any color to cast it + effect = new ThiefOfSanitySpendAnyManaEffect(); + effect.setTargetPointer(new FixedTarget(card.getId(), game)); + game.addEffect(effect, source); + } + } + } + // put the rest into their graveyard + controller.moveCards(topCards, Zone.GRAVEYARD, source, game); + return true; + } + + return false; + } +} + +class ThiefOfSanityCastFromExileEffect extends AsThoughEffectImpl { + + public ThiefOfSanityCastFromExileEffect() { + super(AsThoughEffectType.PLAY_FROM_NOT_OWN_HAND_ZONE, Duration.Custom, Outcome.Benefit); + staticText = "You may cast that card for as long as it remains exiled, and you may spend mana as though it were mana of any color to cast that spell"; + } + + public ThiefOfSanityCastFromExileEffect(final ThiefOfSanityCastFromExileEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public ThiefOfSanityCastFromExileEffect copy() { + return new ThiefOfSanityCastFromExileEffect(this); + } + + @Override + public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { + UUID targetId = getTargetPointer().getFirst(game, source); + if (targetId == null) { + this.discard(); + } else if (objectId.equals(targetId) + && affectedControllerId.equals(source.getControllerId())) { + Card card = game.getCard(objectId); + // TODO: Allow to cast Zoetic Cavern face down + return card != null && !card.isLand(); + } + return false; + } +} + +class ThiefOfSanitySpendAnyManaEffect extends AsThoughEffectImpl implements AsThoughManaEffect { + + public ThiefOfSanitySpendAnyManaEffect() { + super(AsThoughEffectType.SPEND_OTHER_MANA, Duration.Custom, Outcome.Benefit); + staticText = "you may spend mana as though it were mana of any color to cast it"; + } + + public ThiefOfSanitySpendAnyManaEffect(final ThiefOfSanitySpendAnyManaEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public ThiefOfSanitySpendAnyManaEffect copy() { + return new ThiefOfSanitySpendAnyManaEffect(this); + } + + @Override + public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { + if (objectId.equals(((FixedTarget) getTargetPointer()).getTarget()) + && game.getState().getZoneChangeCounter(objectId) <= ((FixedTarget) getTargetPointer()).getZoneChangeCounter() + 1) { + + if (affectedControllerId.equals(source.getControllerId())) { + // if the card moved from exile to spell the zone change counter is increased by 1 + if (game.getState().getZoneChangeCounter(objectId) == ((FixedTarget) getTargetPointer()).getZoneChangeCounter() + 1) { + return true; + } + } + + } else if (((FixedTarget) getTargetPointer()).getTarget().equals(objectId)) { + // object has moved zone so effect can be discarted + this.discard(); + } + return false; + } + + @Override + public ManaType getAsThoughManaType(ManaType manaType, ManaPoolItem mana, UUID affectedControllerId, Ability source, Game game) { + return mana.getFirstAvailable(); + } +} + +class ThiefOfSanityLookEffect extends AsThoughEffectImpl { + + public ThiefOfSanityLookEffect() { + super(AsThoughEffectType.LOOK_AT_FACE_DOWN, Duration.EndOfGame, Outcome.Benefit); + staticText = "You may look at the cards exiled with {this}"; + } + + public ThiefOfSanityLookEffect(final ThiefOfSanityLookEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public ThiefOfSanityLookEffect copy() { + return new ThiefOfSanityLookEffect(this); + } + + @Override + public boolean applies(UUID objectId, Ability source, UUID affectedControllerId, Game game) { + if (affectedControllerId.equals(source.getControllerId()) && game.getState().getZone(objectId) == Zone.EXILED) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = source.getSourceObject(game); + if (controller != null && sourceObject != null) { + Card card = game.getCard(objectId); + if (card != null && card.isFaceDown(game)) { + Set exileZones = (Set) game.getState().getValue(ThiefOfSanity.VALUE_PREFIX + source.getSourceId().toString()); + if (exileZones != null) { + for (ExileZone exileZone : game.getExile().getExileZones()) { + if (exileZone.contains(objectId)) { + if (!exileZones.contains(exileZone.getId())) { + return false; + } + } + } + return true; + } + } + } + } + return false; + } +} diff --git a/Mage/src/main/java/mage/abilities/effects/AsThoughEffect.java b/Mage/src/main/java/mage/abilities/effects/AsThoughEffect.java index 44c7c14824a..1c58869db36 100644 --- a/Mage/src/main/java/mage/abilities/effects/AsThoughEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/AsThoughEffect.java @@ -12,7 +12,7 @@ import mage.game.Game; */ public interface AsThoughEffect extends ContinuousEffect { - boolean applies(UUID sourceId, Ability affectedAbility, Ability source, Game game); + boolean applies(UUID sourceId, Ability affectedAbility, Ability source, Game game, UUID playerId); boolean applies(UUID sourceId, Ability source, UUID affectedControllerId, Game game); diff --git a/Mage/src/main/java/mage/abilities/effects/AsThoughEffectImpl.java b/Mage/src/main/java/mage/abilities/effects/AsThoughEffectImpl.java index 020d995cce7..03ed5c0b3d9 100644 --- a/Mage/src/main/java/mage/abilities/effects/AsThoughEffectImpl.java +++ b/Mage/src/main/java/mage/abilities/effects/AsThoughEffectImpl.java @@ -1,4 +1,3 @@ - package mage.abilities.effects; import java.util.UUID; @@ -29,8 +28,12 @@ public abstract class AsThoughEffectImpl extends ContinuousEffectImpl implements } @Override - public boolean applies(UUID objectId, Ability affectedAbility, Ability source, Game game) { - return applies(objectId, source, affectedAbility.getControllerId(), game); + public boolean applies(UUID objectId, Ability affectedAbility, Ability source, Game game, UUID playerId) { + if (getAsThoughEffectType().equals(AsThoughEffectType.LOOK_AT_FACE_DOWN)) { + return applies(objectId, source, playerId, game); + } else { + return applies(objectId, source, affectedAbility.getControllerId(), game); + } } @Override diff --git a/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java b/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java index 0fd1aee39b3..2e9b42d980c 100644 --- a/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java +++ b/Mage/src/main/java/mage/abilities/effects/ContinuousEffects.java @@ -1,4 +1,3 @@ - package mage.abilities.effects; import java.io.Serializable; @@ -496,7 +495,7 @@ public class ContinuousEffects implements Serializable { if (effect.applies(objectId, ability, controllerId, game)) { return new MageObjectReference(ability.getSourceObject(game), game); } - } else if (effect.applies(objectId, affectedAbility, ability, game)) { + } else if (effect.applies(objectId, affectedAbility, ability, game, controllerId)) { return new MageObjectReference(ability.getSourceObject(game), game); } } @@ -512,7 +511,7 @@ public class ContinuousEffects implements Serializable { Set abilities = asThoughEffectsMap.get(AsThoughEffectType.SPEND_ONLY_MANA).getAbility(effect.getId()); for (Ability ability : abilities) { if ((affectedAbility == null && effect.applies(objectId, ability, controllerId, game)) - || effect.applies(objectId, affectedAbility, ability, game)) { + || effect.applies(objectId, affectedAbility, ability, game, controllerId)) { if (((AsThoughManaEffect) effect).getAsThoughManaType(manaType, mana, controllerId, ability, game) == null) { return null; } @@ -525,7 +524,7 @@ public class ContinuousEffects implements Serializable { Set abilities = asThoughEffectsMap.get(AsThoughEffectType.SPEND_OTHER_MANA).getAbility(effect.getId()); for (Ability ability : abilities) { if ((affectedAbility == null && effect.applies(objectId, ability, controllerId, game)) - || effect.applies(objectId, affectedAbility, ability, game)) { + || effect.applies(objectId, affectedAbility, ability, game, controllerId)) { ManaType usableManaType = ((AsThoughManaEffect) effect).getAsThoughManaType(manaType, mana, controllerId, ability, game); if (usableManaType != null) { return usableManaType; diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/ActivateAbilitiesAnyTimeYouCouldCastInstantEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/ActivateAbilitiesAnyTimeYouCouldCastInstantEffect.java index 4f76c81b722..d15adb8048b 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/ActivateAbilitiesAnyTimeYouCouldCastInstantEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/ActivateAbilitiesAnyTimeYouCouldCastInstantEffect.java @@ -43,7 +43,7 @@ public class ActivateAbilitiesAnyTimeYouCouldCastInstantEffect extends AsThoughE } @Override - public boolean applies(UUID objectId, Ability affectedAbility, Ability source, Game game) { + public boolean applies(UUID objectId, Ability affectedAbility, Ability source, Game game, UUID playerId) { return affectedAbility.isControlledBy(source.getControllerId()) && activatedAbility.isInstance(affectedAbility); } diff --git a/Mage/src/main/java/mage/abilities/keyword/OfferingAbility.java b/Mage/src/main/java/mage/abilities/keyword/OfferingAbility.java index 9a1de9fd982..6ce501563f3 100644 --- a/Mage/src/main/java/mage/abilities/keyword/OfferingAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/OfferingAbility.java @@ -104,7 +104,7 @@ class OfferingAsThoughEffect extends AsThoughEffectImpl { } @Override - public boolean applies(UUID sourceId, Ability affectedAbility, Ability source, Game game) { + public boolean applies(UUID sourceId, Ability affectedAbility, Ability source, Game game, UUID playerId) { if (sourceId.equals(source.getSourceId())) { Card card = game.getCard(sourceId); if (!card.isOwnedBy(source.getControllerId())) { From 24e090afc28312754ce37b1a48c1803d01197351 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 22 Sep 2018 16:46:20 +0200 Subject: [PATCH 126/140] [GRN] Added Thief of Sanity. --- Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index ad50005a8ca..dc00bed9cfc 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -258,6 +258,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Take Heart", 28, Rarity.COMMON, mage.cards.t.TakeHeart.class)); cards.add(new SetCardInfo("Temple Garden", 258, Rarity.RARE, mage.cards.t.TempleGarden.class)); cards.add(new SetCardInfo("Tenth District Guard", 29, Rarity.COMMON, mage.cards.t.TenthDistrictGuard.class)); + cards.add(new SetCardInfo("Thief of Sanity", 205, Rarity.RARE, mage.cards.t.ThiefOfSanity.class)); cards.add(new SetCardInfo("Thought Erasure", 206, Rarity.UNCOMMON, mage.cards.t.ThoughtErasure.class)); cards.add(new SetCardInfo("Thoughtbound Phantasm", 55, Rarity.UNCOMMON, mage.cards.t.ThoughtboundPhantasm.class)); cards.add(new SetCardInfo("Torch Courier", 119, Rarity.COMMON, mage.cards.t.TorchCourier.class)); From 12c43e2a5a5c6f2b1d3cf2c29975b3cecb227dd4 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Sat, 22 Sep 2018 11:15:57 -0400 Subject: [PATCH 127/140] Implemented Beamsplitter Mage --- .../src/mage/cards/b/BeamsplitterMage.java | 226 ++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 227 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/b/BeamsplitterMage.java diff --git a/Mage.Sets/src/mage/cards/b/BeamsplitterMage.java b/Mage.Sets/src/mage/cards/b/BeamsplitterMage.java new file mode 100644 index 00000000000..0cd6c16ea0b --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BeamsplitterMage.java @@ -0,0 +1,226 @@ +package mage.cards.b; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.OneShotEffect; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledPermanent; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.game.stack.Spell; +import mage.players.Player; +import mage.target.Target; +import mage.target.TargetPermanent; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author TheElk801 + */ +public final class BeamsplitterMage extends CardImpl { + + public BeamsplitterMage(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{U}{R}"); + + this.subtype.add(SubType.VEDALKEN); + this.subtype.add(SubType.WIZARD); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Whenever you cast an instant or sorcery spell that targets only Beamsplitter Mage, if you control one or more creatures that spell could target, choose one of those creatures. Copy that spell. The copy targets the chosen creature. + this.addAbility(new BeamsplitterMageTriggeredAbility()); + } + + public BeamsplitterMage(final BeamsplitterMage card) { + super(card); + } + + @Override + public BeamsplitterMage copy() { + return new BeamsplitterMage(this); + } +} + +class BeamsplitterMageTriggeredAbility extends TriggeredAbilityImpl { + + public BeamsplitterMageTriggeredAbility() { + super(Zone.BATTLEFIELD, new BeamsplitterMageEffect(), false); + } + + public BeamsplitterMageTriggeredAbility(final BeamsplitterMageTriggeredAbility ability) { + super(ability); + } + + @Override + public BeamsplitterMageTriggeredAbility copy() { + return new BeamsplitterMageTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.SPELL_CAST; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (event.getPlayerId().equals(this.getControllerId())) { + Spell spell = game.getStack().getSpell(event.getTargetId()); + if (!isControlledInstantOrSorcery(spell)) { + return false; + } + boolean targetsSource = false; + for (Ability ability : spell.getSpellAbilities()) { + for (UUID modeId : ability.getModes().getSelectedModes()) { + Mode mode = ability.getModes().get(modeId); + for (Target target : mode.getTargets()) { + if (!target.isNotTarget()) { + for (UUID targetId : target.getTargets()) { + if (targetId.equals(getSourceId())) { + targetsSource = true; + } else { + return false; + } + } + } + } + } + } + if (targetsSource) { + this.getEffects().get(0).setTargetPointer(new FixedTarget(spell.getId())); + return true; + } + } + return false; + } + + private boolean isControlledInstantOrSorcery(Spell spell) { + return spell != null + && (spell.isControlledBy(this.getControllerId())) + && (spell.isInstant() || spell.isSorcery()); + } + + @Override + public String getRule() { + return "Whenever you cast an instant or sorcery spell that targets " + + "only {this}, if you control one or more creatures " + + "that spell could target, choose one of those creatures. " + + "Copy that spell. The copy targets the chosen creature."; + } +} + +class BeamsplitterMageEffect extends OneShotEffect { + + public BeamsplitterMageEffect() { + super(Outcome.Detriment); + } + + public BeamsplitterMageEffect(final BeamsplitterMageEffect effect) { + super(effect); + } + + @Override + public BeamsplitterMageEffect copy() { + return new BeamsplitterMageEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Spell spell = game.getSpellOrLKIStack(this.getTargetPointer().getFirst(game, source)); + Player controller = game.getPlayer(source.getControllerId()); + if (spell != null && controller != null) { + // search the target that targets source + Target usedTarget = null; + setUsedTarget: + for (Ability ability : spell.getSpellAbilities()) { + for (UUID modeId : ability.getModes().getSelectedModes()) { + Mode mode = ability.getModes().get(modeId); + for (Target target : mode.getTargets()) { + if (!target.isNotTarget() && target.getFirstTarget().equals(source.getSourceId())) { + usedTarget = target.copy(); + usedTarget.clearChosen(); + break setUsedTarget; + } + } + } + } + if (usedTarget == null) { + return false; + } + FilterPermanent filter = new BeamsplitterMageFilter(usedTarget, source.getSourceId()); + Target target1 = new TargetPermanent(filter); + target1.setNotTarget(true); + if (controller.choose(outcome, target1, source.getSourceId(), game)) { + Permanent creature = game.getPermanent(target1.getFirstTarget()); + if (creature == null) { + return false; + } + Spell copy = spell.copySpell(source.getControllerId()); + game.getStack().push(copy); + setTarget: + for (UUID modeId : copy.getSpellAbility().getModes().getSelectedModes()) { + Mode mode = copy.getSpellAbility().getModes().get(modeId); + for (Target target : mode.getTargets()) { + if (target.getClass().equals(usedTarget.getClass())) { + target.clearChosen(); // For targets with Max > 1 we need to clear before the text is comapred + if (target.getMessage().equals(usedTarget.getMessage())) { + target.addTarget(creature.getId(), copy.getSpellAbility(), game, false); + break setTarget; + } + } + } + } + game.fireEvent(new GameEvent(GameEvent.EventType.COPIED_STACKOBJECT, copy.getId(), spell.getId(), source.getControllerId())); + String activateMessage = copy.getActivatedMessage(game); + if (activateMessage.startsWith(" casts ")) { + activateMessage = activateMessage.substring(6); + } + if (!game.isSimulation()) { + game.informPlayers(controller.getLogName() + activateMessage); + } + } + return true; + } + return false; + } +} + +class BeamsplitterMageFilter extends FilterControlledPermanent { + + private final Target target; + private final UUID notId; + + public BeamsplitterMageFilter(Target target, UUID notId) { + super("creature this spell could target"); + this.target = target; + this.notId = notId; + } + + public BeamsplitterMageFilter(final BeamsplitterMageFilter filter) { + super(filter); + this.target = filter.target; + this.notId = filter.notId; + } + + @Override + public BeamsplitterMageFilter copy() { + return new BeamsplitterMageFilter(this); + } + + @Override + public boolean match(Permanent permanent, UUID sourceId, UUID playerId, Game game) { + return super.match(permanent, game) + && permanent.isCreature() + && !permanent.getId().equals(notId) + && target.canTarget(permanent.getId(), game); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index ad50005a8ca..83260cff80c 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -34,6 +34,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Barrier of Bones", 61, Rarity.COMMON, mage.cards.b.BarrierOfBones.class)); cards.add(new SetCardInfo("Bartizan Bats", 62, Rarity.COMMON, mage.cards.b.BartizanBats.class)); cards.add(new SetCardInfo("Beacon Bolt", 154, Rarity.UNCOMMON, mage.cards.b.BeaconBolt.class)); + cards.add(new SetCardInfo("Beamsplitter Mage", 155, Rarity.UNCOMMON, mage.cards.b.BeamsplitterMage.class)); cards.add(new SetCardInfo("Beast Whisperer", 123, Rarity.RARE, mage.cards.b.BeastWhisperer.class)); cards.add(new SetCardInfo("Blade Instructor", 1, Rarity.COMMON, mage.cards.b.BladeInstructor.class)); cards.add(new SetCardInfo("Blood Operative", 63, Rarity.RARE, mage.cards.b.BloodOperative.class)); From 883751f30c8cb70f0e831821f5801babdcd45442 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 22 Sep 2018 17:26:06 +0200 Subject: [PATCH 128/140] [GRN] Added Thousand-Year Storm. --- .../src/mage/cards/t/ThousandYearStorm.java | 124 ++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + 2 files changed, 125 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/t/ThousandYearStorm.java diff --git a/Mage.Sets/src/mage/cards/t/ThousandYearStorm.java b/Mage.Sets/src/mage/cards/t/ThousandYearStorm.java new file mode 100644 index 00000000000..83c624009a2 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/ThousandYearStorm.java @@ -0,0 +1,124 @@ +package mage.cards.t; + +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.WatcherScope; +import mage.filter.common.FilterInstantOrSorcerySpell; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.stack.Spell; +import mage.watchers.Watcher; + +/** + * + * @author LevelX2 + */ +public final class ThousandYearStorm extends CardImpl { + + public ThousandYearStorm(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{4}{U}{R}"); + + // Whenever you cast an instant or sorcery spell, copy it for each other instant and sorcery spell you've cast before it this turn. You may choose new targets for the copies. + this.addAbility(new SpellCastControllerTriggeredAbility( + new ThousandYearStormEffect(), new FilterInstantOrSorcerySpell(), false, true + ), new ThousandYearWatcher()); + } + + public ThousandYearStorm(final ThousandYearStorm card) { + super(card); + } + + @Override + public ThousandYearStorm copy() { + return new ThousandYearStorm(this); + } +} + +class ThousandYearStormEffect extends OneShotEffect { + + public ThousandYearStormEffect() { + super(Outcome.Benefit); + this.staticText = "copy it for each other instant and sorcery spell you've cast before it this turn. You may choose new targets for the copies"; + } + + public ThousandYearStormEffect(final ThousandYearStormEffect effect) { + super(effect); + } + + @Override + public ThousandYearStormEffect copy() { + return new ThousandYearStormEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Spell spell = game.getSpellOrLKIStack(getTargetPointer().getFirst(game, source)); + if (spell != null) { + ThousandYearWatcher watcher = (ThousandYearWatcher) game.getState().getWatchers().get(ThousandYearWatcher.class.getSimpleName()); + if (watcher != null) { + int numberOfCopies = watcher.getAmountOfSpellsPlayerCastOnCurrentTurn(source.getControllerId()) - 1; + if (numberOfCopies > 0) { + for (int i = 0; i < numberOfCopies; i++) { + spell.createCopyOnStack(game, source, source.getControllerId(), true); + } + } + return true; + } + } + return false; + } +} + +class ThousandYearWatcher extends Watcher { + + private final Map amountOfInstantSorcerySpellsCastOnCurrentTurn = new HashMap<>(); + + public ThousandYearWatcher() { + super(ThousandYearWatcher.class.getSimpleName(), WatcherScope.GAME); + } + + public ThousandYearWatcher(final ThousandYearWatcher watcher) { + super(watcher); + for (Entry entry : watcher.amountOfInstantSorcerySpellsCastOnCurrentTurn.entrySet()) { + amountOfInstantSorcerySpellsCastOnCurrentTurn.put(entry.getKey(), entry.getValue()); + } + } + + @Override + public void watch(GameEvent event, Game game) { + if (event.getType() == GameEvent.EventType.SPELL_CAST) { + Spell spell = game.getSpellOrLKIStack(event.getTargetId()); + if (spell != null && spell.isInstantOrSorcery()) { + UUID playerId = event.getPlayerId(); + if (playerId != null) { + amountOfInstantSorcerySpellsCastOnCurrentTurn.putIfAbsent(playerId, 0); + amountOfInstantSorcerySpellsCastOnCurrentTurn.compute(playerId, (k, a) -> a + 1); + } + } + } + } + + @Override + public void reset() { + amountOfInstantSorcerySpellsCastOnCurrentTurn.clear(); + } + + public int getAmountOfSpellsPlayerCastOnCurrentTurn(UUID playerId) { + return amountOfInstantSorcerySpellsCastOnCurrentTurn.getOrDefault(playerId, 0); + } + + @Override + public ThousandYearWatcher copy() { + return new ThousandYearWatcher(this); + } + +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index 91cc6ffcbb1..cc70632a9ad 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -262,6 +262,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Thief of Sanity", 205, Rarity.RARE, mage.cards.t.ThiefOfSanity.class)); cards.add(new SetCardInfo("Thought Erasure", 206, Rarity.UNCOMMON, mage.cards.t.ThoughtErasure.class)); cards.add(new SetCardInfo("Thoughtbound Phantasm", 55, Rarity.UNCOMMON, mage.cards.t.ThoughtboundPhantasm.class)); + cards.add(new SetCardInfo("Thousand-Year Storm", 207, Rarity.MYTHIC, mage.cards.t.ThousandYearStorm.class)); cards.add(new SetCardInfo("Torch Courier", 119, Rarity.COMMON, mage.cards.t.TorchCourier.class)); cards.add(new SetCardInfo("Trostani Discordant", 208, Rarity.MYTHIC, mage.cards.t.TrostaniDiscordant.class)); cards.add(new SetCardInfo("Truefire Captain", 209, Rarity.UNCOMMON, mage.cards.t.TruefireCaptain.class)); From d9609e55f2c35f5815287298f4a839aa276311b5 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Sat, 22 Sep 2018 12:12:13 -0400 Subject: [PATCH 129/140] Added support for GRN guildgates in land slot --- Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 42 +++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index cc70632a9ad..1f387964b05 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -1,6 +1,12 @@ package mage.sets; +import java.util.ArrayList; +import java.util.List; import mage.cards.ExpansionSet; +import mage.cards.repository.CardCriteria; +import mage.cards.repository.CardInfo; +import mage.cards.repository.CardRepository; +import mage.constants.CardType; import mage.constants.Rarity; import mage.constants.SetType; @@ -16,11 +22,13 @@ public final class GuildsOfRavnica extends ExpansionSet { super("Guilds of Ravnica", "GRN", ExpansionSet.buildDate(2018, 10, 5), SetType.EXPANSION); this.blockName = "Guilds of Ravnica"; this.hasBoosters = true; - this.numBoosterLands = 1; + this.numBoosterSpecial = 1; + this.numBoosterLands = 0; this.numBoosterCommon = 10; this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 8; + this.maxCardNumberInBooster = 259; cards.add(new SetCardInfo("Affectionate Indrik", 121, Rarity.UNCOMMON, mage.cards.a.AffectionateIndrik.class)); cards.add(new SetCardInfo("Arboretum Elemental", 122, Rarity.UNCOMMON, mage.cards.a.ArboretumElemental.class)); @@ -295,4 +303,36 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Wojek Bodyguard", 120, Rarity.COMMON, mage.cards.w.WojekBodyguard.class)); cards.add(new SetCardInfo("Worldsoul Colossus", 215, Rarity.UNCOMMON, mage.cards.w.WorldsoulColossus.class)); } + + @Override + public List getCardsByRarity(Rarity rarity) { + if (rarity == Rarity.COMMON) { + List savedCardsInfos = savedCards.get(rarity); + if (savedCardsInfos == null) { + CardCriteria criteria = new CardCriteria(); + criteria.setCodes(this.code).notTypes(CardType.LAND); + criteria.rarities(rarity).doubleFaced(false); + savedCardsInfos = CardRepository.instance.findCards(criteria); + if (maxCardNumberInBooster != Integer.MAX_VALUE) { + savedCardsInfos.removeIf(next -> next.getCardNumberAsInt() > maxCardNumberInBooster); + } + criteria = new CardCriteria(); + // Gateway Plaza is a normal common: https://twitter.com/EliShffrn/status/1043156989218414593s + criteria.setCodes(this.code).nameExact("Gateway Plaza"); + savedCardsInfos.addAll(CardRepository.instance.findCards(criteria)); + savedCards.put(rarity, savedCardsInfos); + } + // Return a copy of the saved cards information, as not to modify the original. + return new ArrayList<>(savedCardsInfos); + } else { + return super.getCardsByRarity(rarity); + } + } + + @Override + public List getSpecialCommon() { + CardCriteria criteria = new CardCriteria(); + criteria.rarities(Rarity.COMMON).setCodes(this.code).name("Guildgate"); + return CardRepository.instance.findCards(criteria); + } } From 8aecd1ad4c69a82f1a2662469d99c8e06af34d5f Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Sat, 22 Sep 2018 13:02:14 -0400 Subject: [PATCH 130/140] Fixed Miraculous Recovery text --- Mage.Sets/src/mage/cards/m/MiraculousRecovery.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/Mage.Sets/src/mage/cards/m/MiraculousRecovery.java b/Mage.Sets/src/mage/cards/m/MiraculousRecovery.java index 5cbb1201d24..6e03b826a52 100644 --- a/Mage.Sets/src/mage/cards/m/MiraculousRecovery.java +++ b/Mage.Sets/src/mage/cards/m/MiraculousRecovery.java @@ -1,4 +1,3 @@ - package mage.cards.m; import java.util.UUID; @@ -10,10 +9,9 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.counters.CounterType; -import mage.filter.common.FilterCreatureCard; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; -import mage.target.Target; import mage.target.common.TargetCardInYourGraveyard; /** @@ -23,13 +21,13 @@ import mage.target.common.TargetCardInYourGraveyard; public final class MiraculousRecovery extends CardImpl { public MiraculousRecovery(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{4}{W}"); - + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{4}{W}"); // Return target creature card from your graveyard to the battlefield. Put a +1/+1 counter on it. this.getSpellAbility().addEffect(new ReturnFromGraveyardToBattlefieldTargetEffect()); - Target target = new TargetCardInYourGraveyard(new FilterCreatureCard()); - this.getSpellAbility().addTarget(target); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard( + StaticFilters.FILTER_CARD_CREATURE_YOUR_GRAVEYARD + )); this.getSpellAbility().addEffect(new MiraculousRecoveryEffect()); } @@ -64,7 +62,7 @@ class MiraculousRecoveryEffect extends OneShotEffect { // targetPointer can't be used because target moved from graveyard to battlefield Permanent permanent = game.getPermanent(source.getFirstTarget()); if (permanent != null) { - permanent.addCounters(CounterType.P1P1.createInstance(), source, game); + permanent.addCounters(CounterType.P1P1.createInstance(), source, game); } return false; } From 87fd7a2ab02818ce80a1001a314546ec356ca211 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 22 Sep 2018 19:25:10 +0200 Subject: [PATCH 131/140] [GRN] Added Guildmages' Forum. --- .../src/mage/cards/g/GuildmagesForum.java | 142 ++++++++++++++++++ Mage.Sets/src/mage/sets/GuildsOfRavnica.java | 1 + .../effects/mana/AddManaOfAnyColorEffect.java | 11 +- .../abilities/mana/AnyColorManaAbility.java | 10 +- 4 files changed, 160 insertions(+), 4 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/g/GuildmagesForum.java diff --git a/Mage.Sets/src/mage/cards/g/GuildmagesForum.java b/Mage.Sets/src/mage/cards/g/GuildmagesForum.java new file mode 100644 index 00000000000..1a1792352e0 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GuildmagesForum.java @@ -0,0 +1,142 @@ +package mage.cards.g; + +import java.util.UUID; +import mage.MageObject; +import mage.MageObjectReference; +import mage.abilities.Ability; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.mana.AnyColorManaAbility; +import mage.abilities.mana.ColorlessManaAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.WatcherScope; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.events.EntersTheBattlefieldEvent; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.permanent.Permanent; +import mage.game.stack.Spell; +import mage.watchers.Watcher; + +/** + * + * @author LevelX2 + */ +public final class GuildmagesForum extends CardImpl { + + public GuildmagesForum(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.LAND}, ""); + + // {T}: Add {C}. + this.addAbility(new ColorlessManaAbility()); + + // {1}, {T}: Add one mana of any color. If that mana is spent on a multicolored creature spell, that creature enters the battlefield with an additional +1/+1 counter on it. + Ability ability = new AnyColorManaAbility(new GenericManaCost(1), true); + ability.getEffects().get(0).setText("Add one mana of any color. If that mana is spent on a multicolored creature spell, that creature enters the battlefield with an additional +1/+1 counter on it"); + ability.addCost(new TapSourceCost()); + this.addAbility(ability, new GuildmagesForumWatcher(ability)); + } + + public GuildmagesForum(final GuildmagesForum card) { + super(card); + } + + @Override + public GuildmagesForum copy() { + return new GuildmagesForum(this); + } +} + +class GuildmagesForumWatcher extends Watcher { + + private final Ability source; + + GuildmagesForumWatcher(Ability source) { + super("GuildmagesForumWatcher", WatcherScope.CARD); + this.source = source; + } + + GuildmagesForumWatcher(final GuildmagesForumWatcher watcher) { + super(watcher); + this.source = watcher.source; + } + + @Override + public GuildmagesForumWatcher copy() { + return new GuildmagesForumWatcher(this); + } + + @Override + public void watch(GameEvent event, Game game) { + if (event.getType() == EventType.MANA_PAID) { + MageObject target = game.getObject(event.getTargetId()); + if (event.getSourceId() != null + && event.getSourceId().equals(this.getSourceId()) + && target != null && target.isCreature() && target.getColor(game).isMulticolored() + && event.getFlag()) { + if (target instanceof Spell) { + game.getState().addEffect(new GuildmagesForumEntersBattlefieldEffect( + new MageObjectReference(((Spell) target).getSourceId(), target.getZoneChangeCounter(game), game)), source); + } + } + } + } + + @Override + public void reset() { + super.reset(); + } + +} + +class GuildmagesForumEntersBattlefieldEffect extends ReplacementEffectImpl { + + private final MageObjectReference mor; + + public GuildmagesForumEntersBattlefieldEffect(MageObjectReference mor) { + super(Duration.EndOfTurn, Outcome.BoostCreature); + this.staticText = "If that mana is spent on a multicolored creature spell, that creature enters the battlefield with an additional +1/+1 counter on it"; + this.mor = mor; + } + + public GuildmagesForumEntersBattlefieldEffect(GuildmagesForumEntersBattlefieldEffect effect) { + super(effect); + this.mor = effect.mor; + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + Permanent permanent = ((EntersTheBattlefieldEvent) event).getTarget(); + return permanent != null && mor.refersTo(permanent, game); + } + + @Override + public boolean apply(Game game, Ability source) { + return false; + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + Permanent target = ((EntersTheBattlefieldEvent) event).getTarget(); + if (target != null) { + target.addCounters(CounterType.P1P1.createInstance(), source, game, event.getAppliedEffects()); + } + return false; + } + + @Override + public GuildmagesForumEntersBattlefieldEffect copy() { + return new GuildmagesForumEntersBattlefieldEffect(this); + } +} diff --git a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java index cc70632a9ad..7685729b563 100644 --- a/Mage.Sets/src/mage/sets/GuildsOfRavnica.java +++ b/Mage.Sets/src/mage/sets/GuildsOfRavnica.java @@ -130,6 +130,7 @@ public final class GuildsOfRavnica extends ExpansionSet { cards.add(new SetCardInfo("Gravitic Punch", 105, Rarity.COMMON, mage.cards.g.GraviticPunch.class)); cards.add(new SetCardInfo("Gruesome Menagerie", 71, Rarity.RARE, mage.cards.g.GruesomeMenagerie.class)); cards.add(new SetCardInfo("Guild Summit", 41, Rarity.UNCOMMON, mage.cards.g.GuildSummit.class)); + cards.add(new SetCardInfo("Guildmages' Forum", 250, Rarity.RARE, mage.cards.g.GuildmagesForum.class)); cards.add(new SetCardInfo("Haazda Marshal", 13, Rarity.UNCOMMON, mage.cards.h.HaazdaMarshal.class)); cards.add(new SetCardInfo("Hammer Dropper", 176, Rarity.COMMON, mage.cards.h.HammerDropper.class)); cards.add(new SetCardInfo("Hatchery Spider", 132, Rarity.RARE, mage.cards.h.HatcherySpider.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/mana/AddManaOfAnyColorEffect.java b/Mage/src/main/java/mage/abilities/effects/mana/AddManaOfAnyColorEffect.java index ae568822690..dc03549ea0f 100644 --- a/Mage/src/main/java/mage/abilities/effects/mana/AddManaOfAnyColorEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/mana/AddManaOfAnyColorEffect.java @@ -16,12 +16,17 @@ public class AddManaOfAnyColorEffect extends BasicManaEffect { protected final int amount; protected final ArrayList netMana = new ArrayList<>(); + protected final boolean setFlag; public AddManaOfAnyColorEffect() { this(1); } public AddManaOfAnyColorEffect(int amount) { + this(amount, false); + } + + public AddManaOfAnyColorEffect(int amount, boolean setFlag) { super(new Mana(0, 0, 0, 0, 0, 0, amount, 0)); this.amount = amount; netMana.add(Mana.GreenMana(amount)); @@ -30,12 +35,14 @@ public class AddManaOfAnyColorEffect extends BasicManaEffect { netMana.add(Mana.WhiteMana(amount)); netMana.add(Mana.RedMana(amount)); this.staticText = "add " + CardUtil.numberToText(amount) + " mana of any " + (amount > 1 ? "one " : "") + "color"; + this.setFlag = setFlag; } public AddManaOfAnyColorEffect(final AddManaOfAnyColorEffect effect) { super(effect); this.amount = effect.amount; this.netMana.addAll(effect.netMana); + this.setFlag = effect.setFlag; } @Override @@ -66,7 +73,9 @@ public class AddManaOfAnyColorEffect extends BasicManaEffect { ChoiceColor choice = new ChoiceColor(true, mes, game.getObject(source.getSourceId())); if (controller.choose(outcome, choice, game)) { if (choice.getColor() != null) { - return choice.getMana(amount); + Mana mana = choice.getMana(amount); + mana.setFlag(setFlag); + return mana; } } } diff --git a/Mage/src/main/java/mage/abilities/mana/AnyColorManaAbility.java b/Mage/src/main/java/mage/abilities/mana/AnyColorManaAbility.java index 8e0720750a2..e22d6b79a4f 100644 --- a/Mage/src/main/java/mage/abilities/mana/AnyColorManaAbility.java +++ b/Mage/src/main/java/mage/abilities/mana/AnyColorManaAbility.java @@ -1,4 +1,3 @@ - package mage.abilities.mana; import mage.Mana; @@ -8,13 +7,18 @@ import mage.abilities.effects.mana.AddManaOfAnyColorEffect; import mage.constants.Zone; public class AnyColorManaAbility extends ActivatedManaAbilityImpl { + public AnyColorManaAbility() { this(new TapSourceCost()); } public AnyColorManaAbility(Cost cost) { - super(Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(), cost); - this.netMana.add(new Mana(0,0,0,0,0,0,1, 0)); + this(cost, false); + } + + public AnyColorManaAbility(Cost cost, boolean setFlag) { + super(Zone.BATTLEFIELD, new AddManaOfAnyColorEffect(1, setFlag), cost); + this.netMana.add(new Mana(0, 0, 0, 0, 0, 0, 1, 0)); } public AnyColorManaAbility(final AnyColorManaAbility ability) { From 3e93a7100103a8993fd271f8f9c079da86da3df1 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 22 Sep 2018 19:39:20 +0200 Subject: [PATCH 132/140] [GRN] Some fixes to black cards.. --- Mage.Sets/src/mage/cards/p/PilferingImp.java | 4 +-- Mage.Sets/src/mage/cards/p/PriceOfFame.java | 1 + Mage.Sets/src/mage/cards/p/Pyroblast.java | 26 ++++++++----------- .../src/mage/cards/s/SeveredStrands.java | 5 ++++ Mage.Sets/src/mage/cards/v/ViciousRumors.java | 2 +- 5 files changed, 20 insertions(+), 18 deletions(-) diff --git a/Mage.Sets/src/mage/cards/p/PilferingImp.java b/Mage.Sets/src/mage/cards/p/PilferingImp.java index 94c9a9081b2..5b0340b6c34 100644 --- a/Mage.Sets/src/mage/cards/p/PilferingImp.java +++ b/Mage.Sets/src/mage/cards/p/PilferingImp.java @@ -8,11 +8,11 @@ import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.costs.mana.ManaCostsImpl; import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect; -import mage.constants.SubType; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SubType; import mage.constants.TargetController; import mage.constants.Zone; import mage.filter.StaticFilters; @@ -39,7 +39,7 @@ public final class PilferingImp extends CardImpl { Zone.BATTLEFIELD, new DiscardCardYouChooseTargetEffect( StaticFilters.FILTER_CARD_NON_LAND, - TargetController.ANY + TargetController.OPPONENT ), new ManaCostsImpl("{1}{B}") ); ability.addCost(new TapSourceCost()); diff --git a/Mage.Sets/src/mage/cards/p/PriceOfFame.java b/Mage.Sets/src/mage/cards/p/PriceOfFame.java index 1ea93d7af95..79f7737b9e6 100644 --- a/Mage.Sets/src/mage/cards/p/PriceOfFame.java +++ b/Mage.Sets/src/mage/cards/p/PriceOfFame.java @@ -5,6 +5,7 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.Condition; +import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.cost.SpellCostReductionSourceEffect; import mage.abilities.effects.keyword.SurveilEffect; import mage.cards.CardImpl; diff --git a/Mage.Sets/src/mage/cards/p/Pyroblast.java b/Mage.Sets/src/mage/cards/p/Pyroblast.java index 57fcd9944cd..3c61105ebda 100644 --- a/Mage.Sets/src/mage/cards/p/Pyroblast.java +++ b/Mage.Sets/src/mage/cards/p/Pyroblast.java @@ -1,4 +1,3 @@ - package mage.cards.p; import java.util.UUID; @@ -20,19 +19,18 @@ import mage.target.TargetSpell; * @author Plopman */ public final class Pyroblast extends CardImpl { - - public Pyroblast(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{R}"); + public Pyroblast(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{R}"); // Choose one - Counter target spell if it's blue; or destroy target permanent if it's blue. this.getSpellAbility().addEffect(new PyroblastCounterTargetEffect()); this.getSpellAbility().addTarget(new TargetSpell()); - + Mode mode = new Mode(); - mode.getEffects().add(new DestroyTargetEffect()); + mode.getEffects().add(new PyroblastDestroyTargetEffect()); mode.getTargets().add(new TargetPermanent()); - + this.getSpellAbility().addMode(mode); } @@ -64,7 +62,7 @@ class PyroblastCounterTargetEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Spell targetSpell = game.getStack().getSpell(source.getFirstTarget()); - if(targetSpell != null && targetSpell.getColor(game).isBlue()){ + if (targetSpell != null && targetSpell.getColor(game).isBlue()) { game.getStack().counter(source.getFirstTarget(), source.getSourceId(), game); } return true; @@ -77,21 +75,19 @@ class PyroblastCounterTargetEffect extends OneShotEffect { } +class PyroblastDestroyTargetEffect extends OneShotEffect { -class DestroyTargetEffect extends OneShotEffect { - - - public DestroyTargetEffect() { + public PyroblastDestroyTargetEffect() { super(Outcome.DestroyPermanent); } - public DestroyTargetEffect(final DestroyTargetEffect effect) { + public PyroblastDestroyTargetEffect(final PyroblastDestroyTargetEffect effect) { super(effect); } @Override - public DestroyTargetEffect copy() { - return new DestroyTargetEffect(this); + public PyroblastDestroyTargetEffect copy() { + return new PyroblastDestroyTargetEffect(this); } @Override diff --git a/Mage.Sets/src/mage/cards/s/SeveredStrands.java b/Mage.Sets/src/mage/cards/s/SeveredStrands.java index bf0d88fdbf2..a0e7278361b 100644 --- a/Mage.Sets/src/mage/cards/s/SeveredStrands.java +++ b/Mage.Sets/src/mage/cards/s/SeveredStrands.java @@ -1,12 +1,15 @@ package mage.cards.s; import java.util.UUID; +import mage.abilities.costs.common.SacrificeTargetCost; import mage.abilities.dynamicvalue.common.SacrificeCostCreaturesToughness; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetOpponentsCreaturePermanent; /** @@ -19,6 +22,8 @@ public final class SeveredStrands extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{1}{B}"); // As an additional cost to cast this spell, sacrifice a creature. + this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(1, 1, new FilterControlledCreaturePermanent("a creature"), true))); + // You gain life equal to the sacrificed creature's toughness. Destroy target creature an opponent controls. this.getSpellAbility().addEffect(new GainLifeEffect( new SacrificeCostCreaturesToughness(), diff --git a/Mage.Sets/src/mage/cards/v/ViciousRumors.java b/Mage.Sets/src/mage/cards/v/ViciousRumors.java index 93690c0047f..447886bd3cd 100644 --- a/Mage.Sets/src/mage/cards/v/ViciousRumors.java +++ b/Mage.Sets/src/mage/cards/v/ViciousRumors.java @@ -32,7 +32,7 @@ public final class ViciousRumors extends CardImpl { new PutTopCardOfLibraryIntoGraveEachPlayerEffect( 1, TargetController.OPPONENT ).setText(", then puts the top card of their library " - + "into their graveyard.") + + "into their graveyard") ); this.getSpellAbility().addEffect(new GainLifeEffect(1)); } From 95407414ffdfcb10fb4a083559466a1a7a69e663 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 22 Sep 2018 19:46:17 +0200 Subject: [PATCH 133/140] [GRN] Some fixes to blue cards. --- Mage.Sets/src/mage/cards/d/DeviousCoverUp.java | 4 ++-- Mage.Sets/src/mage/cards/r/RalsDispersal.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/cards/d/DeviousCoverUp.java b/Mage.Sets/src/mage/cards/d/DeviousCoverUp.java index 6df5646a40a..4bbb21daeb7 100644 --- a/Mage.Sets/src/mage/cards/d/DeviousCoverUp.java +++ b/Mage.Sets/src/mage/cards/d/DeviousCoverUp.java @@ -33,7 +33,7 @@ public final class DeviousCoverUp extends CardImpl { // You may shuffle up to four target cards from your graveyard into your library. this.getSpellAbility().addEffect(new DeviousCoverUpEffect().setTargetPointer(new SecondTargetPointer())); - this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, 5)); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0, 4)); } public DeviousCoverUp(final DeviousCoverUp card) { @@ -50,7 +50,7 @@ class DeviousCoverUpEffect extends OneShotEffect { public DeviousCoverUpEffect() { super(Outcome.Benefit); - this.staticText = "You may shuffle up to five target cards " + this.staticText = "You may shuffle up to four target cards " + "from your graveyard into your library."; } diff --git a/Mage.Sets/src/mage/cards/r/RalsDispersal.java b/Mage.Sets/src/mage/cards/r/RalsDispersal.java index 49bf949594a..4747d592aa0 100644 --- a/Mage.Sets/src/mage/cards/r/RalsDispersal.java +++ b/Mage.Sets/src/mage/cards/r/RalsDispersal.java @@ -28,7 +28,7 @@ public final class RalsDispersal extends CardImpl { // Return target creature to its owner's hand. You may search you library and/or graveyard for a card named Ral, Caller of Storms, reveal it, and put it in to your hand. If you search your library this way, shuffle it. this.getSpellAbility().addEffect(new ReturnToHandTargetEffect()); this.getSpellAbility().addEffect( - new SearchLibraryGraveyardPutInHandEffect(filter, false, false) + new SearchLibraryGraveyardPutInHandEffect(filter, false, true) ); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); } From 7c91226bf99a09e7ae153ddaa2265ab26353d4fb Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 22 Sep 2018 19:54:22 +0200 Subject: [PATCH 134/140] [GRN] Some fixes to colorless cards. --- Mage.Sets/src/mage/cards/c/ChamberSentry.java | 17 +++++++++-------- .../src/mage/cards/g/GlaiveOfTheGuildpact.java | 3 ++- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Mage.Sets/src/mage/cards/c/ChamberSentry.java b/Mage.Sets/src/mage/cards/c/ChamberSentry.java index 1cf6c1fd911..60c11825020 100644 --- a/Mage.Sets/src/mage/cards/c/ChamberSentry.java +++ b/Mage.Sets/src/mage/cards/c/ChamberSentry.java @@ -1,5 +1,6 @@ package mage.cards.c; +import java.util.UUID; import mage.MageInt; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldAbility; @@ -25,27 +26,27 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.common.TargetAnyTarget; -import java.util.UUID; - /** * * @author jmharmon */ - public final class ChamberSentry extends CardImpl { public ChamberSentry(UUID ownerId, CardSetInfo setInfo) { - super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT,CardType.CREATURE}, "{X}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{X}"); this.subtype.add(SubType.CONSTRUCT); this.power = new MageInt(0); this.toughness = new MageInt(0); // Chamber Sentry enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it. - this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(), ColorsOfManaSpentToCastCount.getInstance(), true))); + this.addAbility(new EntersBattlefieldAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance(), ColorsOfManaSpentToCastCount.getInstance(), true), + "with a +1/+1 counter on it for each color of mana spent to cast it")); // {X}, {T}, Remove X +1/+1 counters from Chamber Sentry: It deals X damage to any target. - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(new ManacostVariableValue()), new ManaCostsImpl("{X}")); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(new ManacostVariableValue()) + .setText("It deals X damage to any target"), + new ManaCostsImpl("{X}")); ability.addCost(new TapSourceCost()); ability.addCost(new ChamberSentryRemoveVariableCountersSourceCost(CounterType.P1P1.createInstance())); ability.addTarget(new TargetAnyTarget()); @@ -55,7 +56,7 @@ public final class ChamberSentry extends CardImpl { this.addAbility(new SimpleActivatedAbility(Zone.GRAVEYARD, new ReturnSourceFromGraveyardToHandEffect(), new ManaCostsImpl("{W}{U}{B}{R}{G}"))); } - public ChamberSentry(final ChamberSentry card) { + public ChamberSentry(final ChamberSentry card) { super(card); } @@ -75,7 +76,7 @@ class ChamberSentryRemoveVariableCountersSourceCost extends VariableCostImpl { } public ChamberSentryRemoveVariableCountersSourceCost(Counter counter, String text) { - this(counter, 0,text); + this(counter, 0, text); } public ChamberSentryRemoveVariableCountersSourceCost(Counter counter, int minimalCountersToPay) { diff --git a/Mage.Sets/src/mage/cards/g/GlaiveOfTheGuildpact.java b/Mage.Sets/src/mage/cards/g/GlaiveOfTheGuildpact.java index 58c62ade5d6..632d3e4f302 100644 --- a/Mage.Sets/src/mage/cards/g/GlaiveOfTheGuildpact.java +++ b/Mage.Sets/src/mage/cards/g/GlaiveOfTheGuildpact.java @@ -10,11 +10,11 @@ import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; import mage.abilities.keyword.EquipAbility; import mage.abilities.keyword.MenaceAbility; import mage.abilities.keyword.VigilanceAbility; -import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.AttachmentType; import mage.constants.CardType; +import mage.constants.SubType; import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledPermanent; @@ -52,6 +52,7 @@ public final class GlaiveOfTheGuildpact extends CardImpl { ability.addEffect(new GainAbilityAttachedEffect( new MenaceAbility(), AttachmentType.EQUIPMENT ).setText("and menace")); + this.addAbility(ability); // Equip {3} this.addAbility(new EquipAbility(3)); From fa88137e9e0df964f2468153ef61404c124e406b Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 22 Sep 2018 20:04:00 +0200 Subject: [PATCH 135/140] [GRN] Some fixes to green cards. --- Mage.Sets/src/mage/cards/k/KraulForagers.java | 5 +++-- Mage.Sets/src/mage/cards/n/NullhideFerox.java | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Mage.Sets/src/mage/cards/k/KraulForagers.java b/Mage.Sets/src/mage/cards/k/KraulForagers.java index ffb5e6200fb..46f375ee324 100644 --- a/Mage.Sets/src/mage/cards/k/KraulForagers.java +++ b/Mage.Sets/src/mage/cards/k/KraulForagers.java @@ -5,10 +5,11 @@ import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.dynamicvalue.common.CardsInControllerGraveyardCount; import mage.abilities.effects.common.GainLifeEffect; -import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.common.FilterCreatureCard; /** * @@ -26,7 +27,7 @@ public final class KraulForagers extends CardImpl { // Undergrowth — When Kraul Foragers enters the battlefield, you gain 1 life for each creature card in your graveyard. this.addAbility(new EntersBattlefieldTriggeredAbility( - new GainLifeEffect(new CardsInControllerGraveyardCount()), + new GainLifeEffect(new CardsInControllerGraveyardCount(new FilterCreatureCard())), false, "Undergrowth — " )); } diff --git a/Mage.Sets/src/mage/cards/n/NullhideFerox.java b/Mage.Sets/src/mage/cards/n/NullhideFerox.java index f4dc7c3a0fe..3f8a27f35fa 100644 --- a/Mage.Sets/src/mage/cards/n/NullhideFerox.java +++ b/Mage.Sets/src/mage/cards/n/NullhideFerox.java @@ -12,7 +12,6 @@ import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DiscardOntoBattlefieldEffect; import mage.abilities.effects.common.continuous.LoseAllAbilitiesTargetEffect; -import mage.constants.SubType; import mage.abilities.keyword.HexproofAbility; import mage.cards.Card; import mage.cards.CardImpl; @@ -20,6 +19,7 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; +import mage.constants.SubType; import mage.constants.TargetController; import mage.constants.Zone; import mage.game.Game; @@ -106,7 +106,7 @@ class NullhideFeroxLoseAbilitiesEffect extends OneShotEffect { public NullhideFeroxLoseAbilitiesEffect() { super(Outcome.Benefit); - this.staticText = "{this} loses all abilities until end of turn"; + this.staticText = "{this} loses all abilities until end of turn. Any player may activate this ability"; } public NullhideFeroxLoseAbilitiesEffect(final NullhideFeroxLoseAbilitiesEffect effect) { From 2952eb3e1a96af1b1d2db2186eb6be49e81dd9ef Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 22 Sep 2018 20:04:06 +0200 Subject: [PATCH 136/140] [GRN] Some fixes to green cards. --- Mage.Sets/src/mage/cards/v/VividRevival.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/v/VividRevival.java b/Mage.Sets/src/mage/cards/v/VividRevival.java index 830b6d585ac..267bf076bb8 100644 --- a/Mage.Sets/src/mage/cards/v/VividRevival.java +++ b/Mage.Sets/src/mage/cards/v/VividRevival.java @@ -16,7 +16,7 @@ import mage.target.common.TargetCardInYourGraveyard; */ public final class VividRevival extends CardImpl { - private static final FilterCard filter = new FilterCard("multicolored cards"); + private static final FilterCard filter = new FilterCard("multicolored cards from your graveyard"); static { filter.add(new MulticoloredPredicate()); From 83ef6e004b76bc76c4a8c37f86ff84b403f0bfb4 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 22 Sep 2018 20:46:30 +0200 Subject: [PATCH 137/140] [GRN] Some fixes to multicolored cards. --- Mage.Sets/src/mage/cards/c/ChanceForGlory.java | 2 +- Mage.Sets/src/mage/cards/d/DiscoveryDispersal.java | 2 +- Mage.Sets/src/mage/cards/g/GlowsporeShaman.java | 8 +++++--- Mage.Sets/src/mage/cards/i/IntegrityIntervention.java | 2 +- Mage.Sets/src/mage/cards/m/MnemonicBetrayal.java | 2 +- Mage.Sets/src/mage/cards/n/NotionRain.java | 4 ++-- Mage.Sets/src/mage/cards/r/ResponseResurgence.java | 6 +++--- Mage.Sets/src/mage/cards/r/RhizomeLurcher.java | 6 ++---- Mage.Sets/src/mage/cards/s/SumalaWoodshaper.java | 5 +++-- Mage.Sets/src/mage/cards/u/UndercityUprising.java | 5 +++-- Mage.Sets/src/mage/cards/v/VraskaGolgariQueen.java | 8 ++++---- Mage.Sets/src/mage/cards/v/VraskasStoneglare.java | 4 ++-- 12 files changed, 28 insertions(+), 26 deletions(-) diff --git a/Mage.Sets/src/mage/cards/c/ChanceForGlory.java b/Mage.Sets/src/mage/cards/c/ChanceForGlory.java index c630431bd6f..ab8c37fb8aa 100644 --- a/Mage.Sets/src/mage/cards/c/ChanceForGlory.java +++ b/Mage.Sets/src/mage/cards/c/ChanceForGlory.java @@ -21,7 +21,7 @@ public final class ChanceForGlory extends CardImpl { // Creatures you control gain indestructible. Take an extra turn after this one. At the beginning of that turn's end step, you lose the game. this.getSpellAbility().addEffect(new GainAbilityControlledEffect( IndestructibleAbility.getInstance(), Duration.EndOfGame - ).setText("Creatures you control gain indestructible.")); + ).setText("Creatures you control gain indestructible")); this.getSpellAbility().addEffect(new AddExtraTurnControllerEffect(true)); } diff --git a/Mage.Sets/src/mage/cards/d/DiscoveryDispersal.java b/Mage.Sets/src/mage/cards/d/DiscoveryDispersal.java index 762421895e5..6e57cee6652 100644 --- a/Mage.Sets/src/mage/cards/d/DiscoveryDispersal.java +++ b/Mage.Sets/src/mage/cards/d/DiscoveryDispersal.java @@ -54,7 +54,7 @@ public final class DiscoveryDispersal extends SplitCard { // Dispersal // Each opponent returns a nonland permanent they control with the highest converted mana cost among permanents they control to its owner’s hand, then discards a card. - this.getLeftHalfCard().getSpellAbility().addEffect(new DispersalEffect()); + this.getRightHalfCard().getSpellAbility().addEffect(new DispersalEffect()); } public DiscoveryDispersal(final DiscoveryDispersal card) { diff --git a/Mage.Sets/src/mage/cards/g/GlowsporeShaman.java b/Mage.Sets/src/mage/cards/g/GlowsporeShaman.java index 68b831134c2..3af42f354db 100644 --- a/Mage.Sets/src/mage/cards/g/GlowsporeShaman.java +++ b/Mage.Sets/src/mage/cards/g/GlowsporeShaman.java @@ -8,11 +8,11 @@ import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.PutOnLibraryTargetEffect; import mage.abilities.effects.common.PutTopCardOfLibraryIntoGraveControllerEffect; -import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; +import mage.constants.SubType; import mage.filter.common.FilterLandCard; import mage.game.Game; import mage.players.Player; @@ -35,9 +35,11 @@ public final class GlowsporeShaman extends CardImpl { this.toughness = new MageInt(1); // When Glowspore Shaman enters the battlefield, put the top three cards of your library into your graveyard. You may put a land card from your graveyard on top of your library. - this.addAbility(new EntersBattlefieldTriggeredAbility( + Ability ability = new EntersBattlefieldTriggeredAbility( new PutTopCardOfLibraryIntoGraveControllerEffect(3), false - )); + ); + ability.addEffect(new GlowsporeShamanEffect()); + this.addAbility(ability); } public GlowsporeShaman(final GlowsporeShaman card) { diff --git a/Mage.Sets/src/mage/cards/i/IntegrityIntervention.java b/Mage.Sets/src/mage/cards/i/IntegrityIntervention.java index 0948c19d2fd..f258e069e84 100644 --- a/Mage.Sets/src/mage/cards/i/IntegrityIntervention.java +++ b/Mage.Sets/src/mage/cards/i/IntegrityIntervention.java @@ -33,7 +33,7 @@ public final class IntegrityIntervention extends SplitCard { // Intervention // Intervention deals 3 damage to any target and you gain 3 life. this.getRightHalfCard().getSpellAbility().addEffect( - new DamageTargetEffect(3) + new DamageTargetEffect(3).setText("Intervention deals 3 damage to any target") ); this.getRightHalfCard().getSpellAbility().addEffect( new GainLifeEffect(3).setText("and you gain 3 life") diff --git a/Mage.Sets/src/mage/cards/m/MnemonicBetrayal.java b/Mage.Sets/src/mage/cards/m/MnemonicBetrayal.java index b9a5f94619c..809d0b4c26d 100644 --- a/Mage.Sets/src/mage/cards/m/MnemonicBetrayal.java +++ b/Mage.Sets/src/mage/cards/m/MnemonicBetrayal.java @@ -57,7 +57,7 @@ class MnemonicBetrayalExileEffect extends OneShotEffect { + "and you may spend mana as though it were mana of any type " + "to cast those spells. At the beginning of the next end step, " + "if any of those cards remain exiled, " - + "return them to their owner's graveyards."; + + "return them to their owner's graveyards"; } public MnemonicBetrayalExileEffect(final MnemonicBetrayalExileEffect effect) { diff --git a/Mage.Sets/src/mage/cards/n/NotionRain.java b/Mage.Sets/src/mage/cards/n/NotionRain.java index 171706396c1..c478038d132 100644 --- a/Mage.Sets/src/mage/cards/n/NotionRain.java +++ b/Mage.Sets/src/mage/cards/n/NotionRain.java @@ -19,11 +19,11 @@ public final class NotionRain extends CardImpl { // Surveil 2, then draw two cards. Rain of Notions deals 2 damage to you. this.getSpellAbility().addEffect( - new SurveilEffect(2).setText("Surveil 2,") + new SurveilEffect(2).setText("Surveil 2") ); this.getSpellAbility().addEffect( new DrawCardSourceControllerEffect(2) - .setText("then draw two cards.") + .setText(", then draw two cards") ); this.getSpellAbility().addEffect(new DamageControllerEffect(2)); } diff --git a/Mage.Sets/src/mage/cards/r/ResponseResurgence.java b/Mage.Sets/src/mage/cards/r/ResponseResurgence.java index 68f7c253e61..50ba39c10f4 100644 --- a/Mage.Sets/src/mage/cards/r/ResponseResurgence.java +++ b/Mage.Sets/src/mage/cards/r/ResponseResurgence.java @@ -34,21 +34,21 @@ public final class ResponseResurgence extends SplitCard { // Resurgence // Creatures you control gain first strike and vigilance until end of turn. After this main phase, there is an additional combat phase followed by an additional main phase. - this.getLeftHalfCard().getSpellAbility().addEffect( + this.getRightHalfCard().getSpellAbility().addEffect( new GainAbilityControlledEffect( FirstStrikeAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURE ).setText("Creatures you control gain first strike") ); - this.getLeftHalfCard().getSpellAbility().addEffect( + this.getRightHalfCard().getSpellAbility().addEffect( new GainAbilityControlledEffect( VigilanceAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURE ).setText("and vigilance until end of turn") ); - this.getLeftHalfCard().getSpellAbility().addEffect( + this.getRightHalfCard().getSpellAbility().addEffect( new AddCombatAndMainPhaseEffect() ); } diff --git a/Mage.Sets/src/mage/cards/r/RhizomeLurcher.java b/Mage.Sets/src/mage/cards/r/RhizomeLurcher.java index bfa45116495..63c0c7913ca 100644 --- a/Mage.Sets/src/mage/cards/r/RhizomeLurcher.java +++ b/Mage.Sets/src/mage/cards/r/RhizomeLurcher.java @@ -9,7 +9,6 @@ import mage.abilities.effects.common.counter.AddCountersSourceEffect; import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; -import mage.constants.AbilityWord; import mage.constants.CardType; import mage.counters.CounterType; import mage.filter.StaticFilters; @@ -35,10 +34,9 @@ public final class RhizomeLurcher extends CardImpl { new CardsInControllerGraveyardCount( StaticFilters.FILTER_CARD_CREATURE ), true - ), "with a number of +1/+1 counters on it equal to " - + "the number of creature cards in your graveyard" + ), null, "Undergrowth — {this} enters the battlefield with a number of +1/+1 counters on it equal to the number of creature cards in your graveyard.", + null ); - ability.setAbilityWord(AbilityWord.UNDERGROWTH); this.addAbility(ability); } diff --git a/Mage.Sets/src/mage/cards/s/SumalaWoodshaper.java b/Mage.Sets/src/mage/cards/s/SumalaWoodshaper.java index d5522821caa..258cf034675 100644 --- a/Mage.Sets/src/mage/cards/s/SumalaWoodshaper.java +++ b/Mage.Sets/src/mage/cards/s/SumalaWoodshaper.java @@ -5,10 +5,11 @@ import mage.MageInt; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; -import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; import mage.filter.FilterCard; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; @@ -39,7 +40,7 @@ public final class SumalaWoodshaper extends CardImpl { // When Sumala Woodshaper enters the battlefield, look at the top four cards of your library. You may reveal a creature or enchantment card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. this.addAbility(new EntersBattlefieldTriggeredAbility(new LookLibraryAndPickControllerEffect( - new StaticValue(4), false, new StaticValue(1), filter, false + new StaticValue(4), false, new StaticValue(1), filter, Zone.LIBRARY, false, true, false, Zone.HAND, false, false, false ), false)); } diff --git a/Mage.Sets/src/mage/cards/u/UndercityUprising.java b/Mage.Sets/src/mage/cards/u/UndercityUprising.java index 86eb2368340..da820f372b8 100644 --- a/Mage.Sets/src/mage/cards/u/UndercityUprising.java +++ b/Mage.Sets/src/mage/cards/u/UndercityUprising.java @@ -31,12 +31,13 @@ public final class UndercityUprising extends CardImpl { public UndercityUprising(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{B}{G}"); - // Creatures you control gain deathtouch until end of turn. Target creature you control fights target creature you don't control. + // Creatures you control gain deathtouch until end of turn. Then target creature you control fights target creature you don't control. this.getSpellAbility().addEffect(new GainAbilityControlledEffect( DeathtouchAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_CONTROLLED_CREATURES )); - this.getSpellAbility().addEffect(new FightTargetsEffect()); + this.getSpellAbility().addEffect(new FightTargetsEffect() + .setText("Then target creature you control fights target creature you don't control")); this.getSpellAbility().addTarget(new TargetControlledCreaturePermanent()); this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); } diff --git a/Mage.Sets/src/mage/cards/v/VraskaGolgariQueen.java b/Mage.Sets/src/mage/cards/v/VraskaGolgariQueen.java index 9f3646cdb0a..371c9c9d6ba 100644 --- a/Mage.Sets/src/mage/cards/v/VraskaGolgariQueen.java +++ b/Mage.Sets/src/mage/cards/v/VraskaGolgariQueen.java @@ -10,12 +10,12 @@ import mage.abilities.effects.common.DoIfCostPaid; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.GetEmblemEffect; -import mage.constants.SubType; -import mage.constants.SuperType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.ComparisonType; +import mage.constants.SubType; +import mage.constants.SuperType; import mage.filter.FilterPermanent; import mage.filter.common.FilterControlledPermanent; import mage.filter.common.FilterNonlandPermanent; @@ -53,11 +53,11 @@ public final class VraskaGolgariQueen extends CardImpl { new GainLifeEffect(1), new SacrificeTargetCost(new TargetControlledPermanent(filter1)) ); - effect.addEffect(new DrawCardSourceControllerEffect(1)); + effect.addEffect(new DrawCardSourceControllerEffect(1).setText("and draw a card")); this.addAbility(new LoyaltyAbility(effect, 2)); // -3: Destroy target nonland permanent with converted mana cost 3 or less. - Ability ability = new LoyaltyAbility(new DestroyTargetEffect()); + Ability ability = new LoyaltyAbility(new DestroyTargetEffect(), -3); ability.addTarget(new TargetPermanent(filter2)); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/v/VraskasStoneglare.java b/Mage.Sets/src/mage/cards/v/VraskasStoneglare.java index 71345f6e32e..853236eb458 100644 --- a/Mage.Sets/src/mage/cards/v/VraskasStoneglare.java +++ b/Mage.Sets/src/mage/cards/v/VraskasStoneglare.java @@ -34,7 +34,7 @@ public final class VraskasStoneglare extends CardImpl { this.getSpellAbility().addEffect(new VraskasStoneglareEffect()); this.getSpellAbility().addTarget(new TargetCreaturePermanent()); this.getSpellAbility().addEffect( - new SearchLibraryGraveyardPutInHandEffect(filter, false, false) + new SearchLibraryGraveyardPutInHandEffect(filter, false, true) ); } @@ -53,7 +53,7 @@ class VraskasStoneglareEffect extends OneShotEffect { public VraskasStoneglareEffect() { super(Outcome.Benefit); this.staticText = "Destroy target creature. " - + "You gain life equal to its toughness."; + + "You gain life equal to its toughness"; } public VraskasStoneglareEffect(final VraskasStoneglareEffect effect) { From b815c4c053a9360b3771851d3e4b4aaf16f1f897 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 22 Sep 2018 20:56:52 +0200 Subject: [PATCH 138/140] [GRN] Some fixes to red cards. --- Mage.Sets/src/mage/cards/e/ErraticCyclops.java | 4 ++-- Mage.Sets/src/mage/cards/g/GoblinCratermaker.java | 6 +++--- Mage.Sets/src/mage/cards/i/InescapableBlaze.java | 4 ++-- Mage.Sets/src/mage/cards/m/ManiacalRage.java | 10 +++++----- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Mage.Sets/src/mage/cards/e/ErraticCyclops.java b/Mage.Sets/src/mage/cards/e/ErraticCyclops.java index ab18fc9a074..c947544e2dc 100644 --- a/Mage.Sets/src/mage/cards/e/ErraticCyclops.java +++ b/Mage.Sets/src/mage/cards/e/ErraticCyclops.java @@ -4,12 +4,12 @@ import java.util.UUID; import mage.MageInt; import mage.abilities.TriggeredAbilityImpl; import mage.abilities.effects.common.continuous.BoostSourceEffect; -import mage.constants.SubType; import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; +import mage.constants.SubType; import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; @@ -78,7 +78,7 @@ class ErraticCyclopsTriggeredAbility extends TriggeredAbilityImpl { @Override public String getRule() { return "Whenever you cast an instant or sorcery spell, " - + "{this} gets +X/+X until end of turn, " + + "{this} gets +X/+0 until end of turn, " + "where X is that spell's converted mana cost"; } diff --git a/Mage.Sets/src/mage/cards/g/GoblinCratermaker.java b/Mage.Sets/src/mage/cards/g/GoblinCratermaker.java index e88dccd4cee..bfd07f08b78 100644 --- a/Mage.Sets/src/mage/cards/g/GoblinCratermaker.java +++ b/Mage.Sets/src/mage/cards/g/GoblinCratermaker.java @@ -9,10 +9,10 @@ import mage.abilities.costs.common.SacrificeSourceCost; import mage.abilities.costs.mana.GenericManaCost; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.DestroyTargetEffect; -import mage.constants.SubType; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SubType; import mage.filter.FilterPermanent; import mage.filter.common.FilterNonlandPermanent; import mage.filter.predicate.mageobject.ColorlessPredicate; @@ -40,7 +40,7 @@ public final class GoblinCratermaker extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(2); - // {1}, Sacrifice Goblin Cratermaker: Choose one — + // {1}, Sacrifice Goblin Cratermaker: Choose one — // • Goblin Cratermaker deals 2 damage to target creature. Ability ability = new SimpleActivatedAbility( new DamageTargetEffect(2), new GenericManaCost(1) @@ -51,7 +51,7 @@ public final class GoblinCratermaker extends CardImpl { // • Destroy target colorless nonland permanent. Mode mode = new Mode(); mode.getEffects().add(new DestroyTargetEffect()); - mode.getTargets().add(new TargetPermanent()); + mode.getTargets().add(new TargetPermanent(filter)); ability.addMode(mode); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/i/InescapableBlaze.java b/Mage.Sets/src/mage/cards/i/InescapableBlaze.java index ddb5da25ab9..2aa756c1baf 100644 --- a/Mage.Sets/src/mage/cards/i/InescapableBlaze.java +++ b/Mage.Sets/src/mage/cards/i/InescapableBlaze.java @@ -17,8 +17,8 @@ public final class InescapableBlaze extends CardImpl { public InescapableBlaze(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{4}{R}{R}"); - // This spell can't be countered. - this.addAbility(new CantBeCounteredAbility()); + // This spell can't be countered. + this.addAbility(new CantBeCounteredAbility().setRuleAtTheTop(true)); // Inescapable Flame deals 6 damage to any target. this.getSpellAbility().addEffect(new DamageTargetEffect(6)); diff --git a/Mage.Sets/src/mage/cards/m/ManiacalRage.java b/Mage.Sets/src/mage/cards/m/ManiacalRage.java index db697960197..703a6754163 100644 --- a/Mage.Sets/src/mage/cards/m/ManiacalRage.java +++ b/Mage.Sets/src/mage/cards/m/ManiacalRage.java @@ -1,4 +1,3 @@ - package mage.cards.m; import java.util.UUID; @@ -21,19 +20,20 @@ import mage.target.common.TargetCreaturePermanent; public final class ManiacalRage extends CardImpl { public ManiacalRage(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{R}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}"); this.subtype.add(SubType.AURA); - // Enchant creature TargetPermanent auraTarget = new TargetCreaturePermanent(); this.getSpellAbility().addTarget(auraTarget); this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); Ability ability = new EnchantAbility(auraTarget.getTargetName()); this.addAbility(ability); + // Enchanted creature gets +2/+2 and can't block. - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(2, 2, Duration.WhileOnBattlefield))); - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantBlockAttachedEffect(AttachmentType.AURA))); + ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(2, 2, Duration.WhileOnBattlefield)); + ability.addEffect(new CantBlockAttachedEffect(AttachmentType.AURA).setText("and can't block")); + this.addAbility(ability); } public ManiacalRage(final ManiacalRage card) { From 79635ff9a08767b63871c129fe42958016bf4b93 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Sat, 22 Sep 2018 15:01:30 -0400 Subject: [PATCH 139/140] updated Canadian Highlander points --- .../Mage.Deck.Constructed/src/mage/deck/CanadianHighlander.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/CanadianHighlander.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/CanadianHighlander.java index 33a0714909e..23f5c57f2fd 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/CanadianHighlander.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/CanadianHighlander.java @@ -21,7 +21,7 @@ public class CanadianHighlander extends Constructed { pointMap.put("Balance", 1); pointMap.put("Birthing Pod", 3); pointMap.put("Black Lotus", 7); - pointMap.put("Demonic Tutor", 4); + pointMap.put("Demonic Tutor", 3); pointMap.put("Dig Through Time", 1); pointMap.put("Enlightened Tutor", 1); pointMap.put("Fastbond", 1); From b7c5b3bd3609a554a504a6616c872a95f2c2b259 Mon Sep 17 00:00:00 2001 From: Evan Kranzler Date: Sat, 22 Sep 2018 15:02:59 -0400 Subject: [PATCH 140/140] updated Australian Highlander points --- .../Mage.Deck.Constructed/src/mage/deck/AusHighlander.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AusHighlander.java b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AusHighlander.java index 86a70116a24..112563f76d0 100644 --- a/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AusHighlander.java +++ b/Mage.Server.Plugins/Mage.Deck.Constructed/src/mage/deck/AusHighlander.java @@ -76,8 +76,6 @@ public class AusHighlander extends Constructed { pointMap.put("True-Name Nemesis", 1); pointMap.put("Umezawa’s Jitte", 1); pointMap.put("Wasteland", 1); - pointMap.put("Wheel of Fortune", 1); - pointMap.put("Worldly Tutor", 1); pointMap.put("Yawgmoth’s Bargain", 1); }