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 d765438da8c..3e27b580ae5 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 @@ -63,8 +63,11 @@ import java.util.ArrayList; import java.util.List; import java.util.UUID; import java.util.logging.Level; +import mage.client.util.CardsViewUtil; +import mage.game.command.Emblem; import mage.game.permanent.PermanentToken; import mage.game.permanent.token.Token; +import mage.view.EmblemView; import mage.view.PermanentView; import org.mage.plugins.card.images.CardDownloadData; import static org.mage.plugins.card.images.DownloadPictures.getTokenCardUrls; @@ -216,7 +219,8 @@ public class MageBook extends JComponent { if (showCardsOrTokens) { showCards(); } else { - showTokens(); + int numTokens = showTokens(); + showEmblems(numTokens); } } @@ -249,13 +253,13 @@ public class MageBook extends JComponent { jLayeredPane.repaint(); } - public void showTokens() { + public int showTokens() { jLayeredPane.removeAll(); addLeftRightPageButtons(); List tokens = getTokens(currentPage, currentSet); int size = tokens.size(); - + if (tokens != null && tokens.size() > 0) { Rectangle rectangle = new Rectangle(); rectangle.translate(OFFSET_X, OFFSET_Y); @@ -278,6 +282,53 @@ public class MageBook extends JComponent { jLayeredPane.repaint(); } + + return tokens.size(); + } + + public void showEmblems(int numTokens) { + List emblems = getEmblems(currentPage, currentSet, numTokens); + int size = emblems.size(); + System.out.println ("Size of origins in " + currentSet + " = " + emblems.size()); + + if (emblems != null && emblems.size() > 0) { + Rectangle rectangle = new Rectangle(); + rectangle.translate(OFFSET_X, OFFSET_Y); + // calculate the x offset of the second (right) page + int second_page_x = (conf.WIDTH - 2 * LEFT_RIGHT_PAGES_WIDTH) + - (cardDimensions.frameWidth + CardPosition.GAP_X) * conf.CARD_COLUMNS + CardPosition.GAP_X - OFFSET_X; + + // Already have numTokens tokens presented. Appending the emblems to the end of these. + numTokens = numTokens % conf.CARDS_PER_PAGE; + if (numTokens < conf.CARDS_PER_PAGE / 2) { + for (int z = 0; z < numTokens && z < conf.CARDS_PER_PAGE / 2; z++) { + rectangle = CardPosition.translatePosition(z, rectangle, conf); + } + } else { + rectangle.setLocation(second_page_x, OFFSET_Y); + for (int z = 0; z < numTokens - conf.CARDS_PER_PAGE / 2; z++) { + rectangle = CardPosition.translatePosition(z, rectangle, conf); + } + } + + int lastI = 0; + for (int i = 0; i < size && i + numTokens < conf.CARDS_PER_PAGE / 2; i++) { + Emblem emblem = emblems.get(i); + addEmblem(emblem, bigCard, null, rectangle); + rectangle = CardPosition.translatePosition(i + numTokens, rectangle, conf); + lastI++; + } + + if (size + numTokens > conf.CARDS_PER_PAGE / 2) { + for (int i = lastI; i < size && i + numTokens < conf.CARDS_PER_PAGE; i++) { + Emblem emblem = emblems.get(i); + addEmblem(emblem, bigCard, null, rectangle); + rectangle = CardPosition.translatePosition(i + numTokens - conf.CARDS_PER_PAGE / 2, rectangle, conf); + } + } + + jLayeredPane.repaint(); + } } private void addCard(CardView card, BigCard bigCard, UUID gameId, Rectangle rectangle) { @@ -314,6 +365,11 @@ public class MageBook extends JComponent { cardImg.setCardBounds(rectangle.x, rectangle.y, cardDimensions.frameWidth, cardDimensions.frameHeight); } + private void addEmblem(Emblem emblem, BigCard bigCard, UUID gameId, Rectangle rectangle) { + CardView cardView = new CardView(new EmblemView(emblem)); + addCard(cardView, bigCard, gameId, rectangle); + } + private List getCards(int page, String set) { CardCriteria criteria = new CardCriteria(); criteria.setCodes(set); @@ -333,17 +389,22 @@ public class MageBook extends JComponent { private List getTokens(int page, String set) { ArrayList allTokens = getTokenCardUrls(); ArrayList tokens = new ArrayList<>(); - + for (CardDownloadData token : allTokens) { if (token.getSet().equals(set)) { try { String className = token.getName(); className = className.replaceAll("[^a-zA-Z0-9]", ""); - className = className + "Token"; + className = "mage.game.permanent.token." + className + "Token"; if (token.getTokenClassName() != null && token.getTokenClassName().length() > 0) { - className = token.getTokenClassName(); + if (token.getTokenClassName().toLowerCase().matches(".*token.*")) { + className = token.getTokenClassName(); + className = "mage.game.permanent.token." + className; + } else if (token.getTokenClassName().toLowerCase().matches(".*emblem.*")) { + continue; + } } - Class c = Class.forName("mage.game.permanent.token." + className); + Class c = Class.forName(className); Constructor cons = c.getConstructor(); Object newToken = cons.newInstance(); if (newToken != null && newToken instanceof mage.game.permanent.token.Token) { @@ -379,6 +440,62 @@ public class MageBook extends JComponent { return tokens.subList(start, end); } + private List getEmblems(int page, String set, int numTokens) { + ArrayList allEmblems = getTokenCardUrls(); + ArrayList emblems = new ArrayList<>(); + + for (CardDownloadData emblem : allEmblems) { + if (emblem.getSet().equals(set)) { + try { + String className = emblem.getName(); + if (emblem.getTokenClassName() != null && emblem.getTokenClassName().length() > 0) { + if (emblem.getTokenClassName().toLowerCase().matches(".*emblem.*")) { + className = emblem.getTokenClassName(); + className = "mage.game.command.emblems." + className; + } + } else { + continue; + } + Class c = Class.forName(className); + Constructor cons = c.getConstructor(); + Object newEmblem = cons.newInstance(); + if (newEmblem != null && newEmblem instanceof mage.game.command.Emblem) { + ((Emblem) newEmblem).setExpansionSetCodeForImage(set); + + emblems.add((Emblem) newEmblem); + } + } catch (ClassNotFoundException ex) { + // Swallow exception + } catch (NoSuchMethodException ex) { + // Swallow exception + } catch (SecurityException ex) { + // Swallow exception + } catch (InstantiationException ex) { + // Swallow exception + } catch (IllegalAccessException ex) { + // Swallow exception + } catch (IllegalArgumentException ex) { + // Swallow exception + } catch (InvocationTargetException ex) { + // Swallow exception + } + } + } + int start = 0; + int end = emblems.size(); + + if ((page + 1) * conf.CARDS_PER_PAGE < numTokens + emblems.size()) { + end = (page + 1) * conf.CARDS_PER_PAGE - numTokens; + pageRight.setVisible(true); + } + + if (emblems.size() > conf.CARDS_PER_PAGE) { + pageLeft.setVisible(true); + pageRight.setVisible(true); + } + return emblems.subList(start, end); + } + private ImagePanel getImagePanel(String filename, ImagePanelStyle type) { try { InputStream is = this.getClass().getResourceAsStream(filename); diff --git a/Mage.Client/src/main/resources/card-pictures-tok.txt b/Mage.Client/src/main/resources/card-pictures-tok.txt index 390c7e92c0c..dd46dd0190d 100644 --- a/Mage.Client/src/main/resources/card-pictures-tok.txt +++ b/Mage.Client/src/main/resources/card-pictures-tok.txt @@ -45,43 +45,45 @@ #|Generate|TOK:PTC|Wolf|| #|Generate|TOK:PTC|Wurm|| #|Generate|TOK:WMCQ|Angel|| -|Generate|EMBLEM!:AKH|Emblem Gideon|| -|Generate|EMBLEM!:BFZ|Emblem Gideon|| -|Generate|EMBLEM!:BFZ|Emblem Kiora|| -|Generate|EMBLEM!:BFZ|Emblem Nixilis|| -|Generate|EMBLEM!:C14|Emblem Daretti| -|Generate|EMBLEM!:C14|Emblem Nixilis| -|Generate|EMBLEM!:C14|Emblem Teferi| -|Generate|EMBLEM!:C16|Emblem Daretti|| -|Generate|EMBLEM!:CNS|Emblem Dack Fayden||Emblem Dack| -|Generate|EMBLEM!:DTK|Emblem Narset|| -|Generate|EMBLEM!:EMA|Emblem Dack|| -|Generate|EMBLEM!:EMN|Emblem Liliana|| -|Generate|EMBLEM!:EMN|Emblem Tamiyo|| -|Generate|EMBLEM!:KLD|Emblem Chandra|| -|Generate|EMBLEM!:KLD|Emblem Dovin|| -|Generate|EMBLEM!:KLD|Emblem Nissa|| -|Generate|EMBLEM!:KTK|Emblem Sarkhan|| -|Generate|EMBLEM!:KTK|Emblem Sorin|| -|Generate|EMBLEM!:M15|Emblem Ajani|| -|Generate|EMBLEM!:M15|Emblem Garruk|| -|Generate|EMBLEM!:MM3|Emblem Domri|| -|Generate|EMBLEM!:ORI|Emblem Chandra|| -|Generate|EMBLEM!:ORI|Emblem Jace|| -|Generate|EMBLEM!:ORI|Emblem Liliana|| -|Generate|EMBLEM!:SOI|Emblem Arlinn|| -|Generate|EMBLEM!:SOI|Emblem Jace|| -|Generate|EMBLEM-:M13|Liliana of the Dark Realms||Emblem Liliana| -|Generate|EMBLEM-:THS|Elspeth, Suns Champion||Emblem Elspeth| -|Generate|EMBLEM:AVR|Tamiyo, the Moon Sage||Emblem Tamiyo| -|Generate|EMBLEM:BNG|Kiora, the Crashing Wave||Emblem Kiora| -|Generate|EMBLEM:DDI|Koth of the Hammer||Emblem Koth| -|Generate|EMBLEM:DDI|Venser, the Sojourner||Emblem Venser| -|Generate|EMBLEM:DKA|Sorin, Lord of Innistrad||Emblem Sorin| -|Generate|EMBLEM:GTC|Domri Rade||Emblem Domri| -|Generate|EMBLEM:M14|Garruk, Caller of Beasts||Emblem Garruk| -|Generate|EMBLEM:M14|Liliana of the Dark Realms||Emblem Liliana| -|Generate|EMBLEM:MMA|Elspeth, Knight Errant||Emblem Elspeth| +|Generate|EMBLEM!:AKH|Emblem Gideon|||GideonOfTheTrialsEmblem| +|Generate|EMBLEM!:BFZ|Emblem Gideon|||GideonAllyOfZendikarEmblem| +|Generate|EMBLEM!:BFZ|Emblem Kiora|||KioraMasterOfTheDepthsEmblem| +|Generate|EMBLEM!:BFZ|Emblem Nixilis|||ObNixilisReignitedEmblem| +|Generate|EMBLEM!:C14|Emblem Daretti|||DarettiScrapSavantEmblem| +|Generate|EMBLEM!:C14|Emblem Daretti||Emblem Daretti|DarettiScrapSavantEmblem| +|Generate|EMBLEM!:C14|Emblem Nixilis|||ObNixilisOfTheBlackOathEmblem| +|Generate|EMBLEM!:C14|Emblem Teferi|||TeferiTemporalArchmageEmblem| +|Generate|EMBLEM!:C16|Emblem Daretti|||DarettiScrapSavantEmblem| +|Generate|EMBLEM!:CNS|Emblem Dack Fayden||Emblem Dack|DackFaydenEmblem| +|Generate|EMBLEM!:DTK|Emblem Narset|||NarsetTranscendentEmblem| +|Generate|EMBLEM!:EMA|Emblem Dack Fayden||Emblem Dack|DackFaydenEmblem| +|Generate|EMBLEM!:EMN|Emblem Liliana|||LilianaTheLastHopeEmblem| +|Generate|EMBLEM!:EMN|Emblem Tamiyo|||TamiyoFieldResearcherEmblem| +|Generate|EMBLEM!:KLD|Emblem Chandra|||ChandraTorchOfDefianceEmblem| +|Generate|EMBLEM!:KLD|Emblem Dovin|||DovinBaanEmblem| +|Generate|EMBLEM!:KLD|Emblem Nissa|||NissaVitalForceEmblem| +|Generate|EMBLEM!:KLD|Emblem Tezzeret|||TezzeretTheSchemerEmblem| +|Generate|EMBLEM!:KTK|Emblem Sarkhan|||SarkhanTheDragonspeakerEmblem| +|Generate|EMBLEM!:KTK|Emblem Sorin|||SorinSolemnVisitorEmblem| +|Generate|EMBLEM!:M15|Emblem Ajani|||AjaniSteadfastEmblem| +|Generate|EMBLEM!:M15|Emblem Garruk|||GarrukApexPredatorEmblem| +|Generate|EMBLEM!:MM3|Emblem Domri|||DomriRadeEmblem| +|Generate|EMBLEM!:ORI|Emblem Chandra|||ChandraRoaringFlameEmblem| +|Generate|EMBLEM!:ORI|Emblem Jace|||JaceTelepathUnboundEmblem| +|Generate|EMBLEM!:ORI|Emblem Liliana|||LilianaDefiantNecromancerEmblem| +|Generate|EMBLEM!:SOI|Emblem Arlinn|||ArlinnEmbracedByTheMoonEmblem| +|Generate|EMBLEM!:SOI|Emblem Jace|||JaceUnravelerOfSecretsEmblem| +|Generate|EMBLEM-:THS|Elspeth, Suns Champion||Emblem Elspeth|ElspethSunsChampionEmblem| +|Generate|EMBLEM:AVR|Tamiyo, the Moon Sage||Emblem Tamiyo|TamiyoTheMoonSageEmblem| +|Generate|EMBLEM:BNG|Kiora, the Crashing Wave||Emblem Kiora|KioraEmblem| +|Generate|EMBLEM:DDI|Koth of the Hammer||Emblem Koth|KothOfTheHammerEmblem| +|Generate|EMBLEM:DDI|Venser, the Sojourner||Emblem Venser|VenserTheSojournerEmblem| +|Generate|EMBLEM:DKA|Sorin, Lord of Innistrad||Emblem Sorin|SorinLordOfInnistradEmblem| +|Generate|EMBLEM:GTC|Domri Rade||Emblem Domri|DomriRadeEmblem| +|Generate|EMBLEM:M13|Liliana of the Dark Realms||Emblem Liliana|LilianaOfTheDarkRealmsEmblem| +|Generate|EMBLEM:M14|Garruk, Caller of Beasts||Emblem Garruk|GarrukCallerOfBeastsEmblem| +|Generate|EMBLEM:M14|Liliana of the Dark Realms||Emblem Liliana|LilianaOfTheDarkRealmsEmblem| +|Generate|EMBLEM:MMA|Elspeth, Knight Errant||Emblem Elspeth|ElspethKnightErrantEmblem| |Generate|TOK:10E|Ape|||PongifyApeToken| |Generate|TOK:10E|Dragon|||DragonToken2| |Generate|TOK:10E|Goblin|||GoblinToken| @@ -242,7 +244,6 @@ |Generate|TOK:C13|Thopter|||ThopterToken| |Generate|TOK:C13|Thrull|||ThrullToken| |Generate|TOK:C13|Zombie|||ZombieToken| -|Generate|TOK:C13|Faerie|||CloudSpriteToken| |Generate|TOK:C14|Angel|||AngelToken| |Generate|TOK:C14|Ape|||PongifyApeToken| |Generate|TOK:C14|Beast|1||BeastToken| @@ -303,7 +304,6 @@ |Generate|TOK:C15|Spirit|2||TeysaEnvoyOfGhostsToken| |Generate|TOK:C15|Wolf|||WolfToken| |Generate|TOK:C15|Zombie|||ZombieToken| -|Generate|TOK:C15|Land Mine|||LandMineToken| |Generate|TOK:C16|Beast|| |Generate|TOK:C16|Bird|1| |Generate|TOK:C16|Bird|2| @@ -367,7 +367,6 @@ |Generate|TOK:CNS|Ogre|| |Generate|TOK:CNS|Spirit|||SpiritWhiteToken| |Generate|TOK:CNS|Squirrel|||SquirrelToken| -|Generate|TOK:CNS|Wall|||WallToken| |Generate|TOK:CNS|Wolf|||WolfToken| |Generate|TOK:CNS|Zombie|||ZombieToken| |Generate|TOK:CON|Angel|||AngelToken| diff --git a/Mage.Server.Plugins/Mage.Game.MomirDuel/src/mage/game/MomirDuel.java b/Mage.Server.Plugins/Mage.Game.MomirDuel/src/mage/game/MomirDuel.java index dc23a4364e8..a5f1ce81cf9 100644 --- a/Mage.Server.Plugins/Mage.Game.MomirDuel/src/mage/game/MomirDuel.java +++ b/Mage.Server.Plugins/Mage.Game.MomirDuel/src/mage/game/MomirDuel.java @@ -53,6 +53,7 @@ import mage.constants.SetType; import mage.constants.TimingRule; import mage.constants.Zone; import mage.game.command.Emblem; +import mage.game.command.emblems.MomirEmblem; import mage.game.match.MatchType; import mage.game.permanent.token.EmptyToken; import mage.game.turn.TurnMod; @@ -121,64 +122,3 @@ public class MomirDuel extends GameImpl { } } - -// faking Vanguard as an Emblem; need to come back to this and add a new type of CommandObject -class MomirEmblem extends Emblem { - - public MomirEmblem() { - setName("Emblem Momir Vig, Simic Visionary"); - setExpansionSetCodeForImage("DIS"); - // {X}, Discard a card: Put a token into play as a copy of a random creature card with converted mana cost X. Play this ability only any time you could play a sorcery and only once each turn. - LimitedTimesPerTurnActivatedAbility ability = new LimitedTimesPerTurnActivatedAbility(Zone.COMMAND, new MomirEffect(), new VariableManaCost()); - ability.addCost(new DiscardCardCost()); - ability.setTiming(TimingRule.SORCERY); - this.getAbilities().add(ability); - - } -} - -class MomirEffect extends OneShotEffect { - - public MomirEffect() { - super(Outcome.PutCreatureInPlay); - } - - public MomirEffect(MomirEffect effect) { - super(effect); - staticText = "Put a token into play as a copy of a random creature card with converted mana cost X"; - } - - @Override - public MomirEffect copy() { - return new MomirEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - int value = source.getManaCostsToPay().getX(); - // should this be random across card names, or card printings? - CardCriteria criteria = new CardCriteria().types(CardType.CREATURE).convertedManaCost(value); - List options = CardRepository.instance.findCards(criteria); - if (options == null || options.isEmpty()) { - game.informPlayers("No random creature card with converted mana cost of " + value + " was found."); - return false; - } - EmptyToken token = new EmptyToken(); // search for a non custom set creature - while (token.getName().isEmpty() && !options.isEmpty()) { - int index = RandomUtil.nextInt(options.size()); - ExpansionSet expansionSet = Sets.findSet(options.get(index).getSetCode()); - if (expansionSet == null || expansionSet.getSetType() == SetType.CUSTOM_SET) { - options.remove(index); - } else { - Card card = options.get(index).getCard(); - if (card != null) { - CardUtil.copyTo(token).from(card); - } else { - options.remove(index); - } - } - } - token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId(), false, false); - return true; - } -} diff --git a/Mage.Sets/src/mage/cards/a/AjaniSteadfast.java b/Mage.Sets/src/mage/cards/a/AjaniSteadfast.java index 11268235718..86c9a9df811 100644 --- a/Mage.Sets/src/mage/cards/a/AjaniSteadfast.java +++ b/Mage.Sets/src/mage/cards/a/AjaniSteadfast.java @@ -27,12 +27,9 @@ */ package mage.cards.a; -import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.Effect; -import mage.abilities.effects.PreventionEffectImpl; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; @@ -45,18 +42,13 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.TargetController; -import mage.constants.Zone; import mage.counters.CounterType; import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterPlaneswalkerPermanent; import mage.filter.predicate.permanent.AnotherPredicate; import mage.filter.predicate.permanent.ControllerPredicate; -import mage.game.Game; -import mage.game.command.Emblem; -import mage.game.events.GameEvent; -import mage.game.permanent.Permanent; +import mage.game.command.emblems.AjaniSteadfastEmblem; import mage.target.common.TargetCreaturePermanent; - import java.util.UUID; /** @@ -114,61 +106,3 @@ public class AjaniSteadfast extends CardImpl { return new AjaniSteadfast(this); } } - -class AjaniSteadfastEmblem extends Emblem { - - public AjaniSteadfastEmblem() { - setName("Emblem Ajani"); - this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, new AjaniSteadfastPreventEffect())); - this.setExpansionSetCodeForImage("M15"); - } -} - -class AjaniSteadfastPreventEffect extends PreventionEffectImpl { - - public AjaniSteadfastPreventEffect() { - super(Duration.EndOfGame); - this.staticText = "If a source would deal damage to you or a planeswalker you control, prevent all but 1 of that damage"; - consumable = false; - } - - public AjaniSteadfastPreventEffect(AjaniSteadfastPreventEffect effect) { - super(effect); - } - - @Override - public boolean replaceEvent(GameEvent event, Ability source, Game game) { - int damage = event.getAmount(); - if (damage > 1) { - amountToPrevent = damage - 1; - preventDamageAction(event, source, game); - } - return false; - } - - @Override - public boolean apply(Game game, Ability source) { - return true; - } - - @Override - public boolean applies(GameEvent event, Ability source, Game game) { - if (event.getType() == GameEvent.EventType.DAMAGE_PLAYER - && event.getTargetId().equals(source.getControllerId())) { - return super.applies(event, source, game); - } - - if (event.getType() == GameEvent.EventType.DAMAGE_PLANESWALKER) { - Permanent permanent = game.getPermanent(event.getTargetId()); - if (permanent != null && permanent.getControllerId().equals(source.getControllerId())) { - return super.applies(event, source, game); - } - } - return false; - } - - @Override - public AjaniSteadfastPreventEffect copy() { - return new AjaniSteadfastPreventEffect(this); - } -} diff --git a/Mage.Sets/src/mage/cards/a/ArlinnEmbracedByTheMoon.java b/Mage.Sets/src/mage/cards/a/ArlinnEmbracedByTheMoon.java index 74354be76a9..b53e662212c 100644 --- a/Mage.Sets/src/mage/cards/a/ArlinnEmbracedByTheMoon.java +++ b/Mage.Sets/src/mage/cards/a/ArlinnEmbracedByTheMoon.java @@ -27,32 +27,23 @@ */ package mage.cards.a; -import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.costs.common.TapSourceCost; -import mage.abilities.dynamicvalue.common.SourcePermanentPowerCount; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.TransformSourceEffect; import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; -import mage.abilities.keyword.HasteAbility; import mage.abilities.keyword.TrampleAbility; import mage.abilities.keyword.TransformAbility; 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.common.FilterCreaturePermanent; -import mage.game.command.Emblem; import mage.target.common.TargetCreatureOrPlayer; +import mage.game.command.emblems.ArlinnEmbracedByTheMoonEmblem; import java.util.UUID; /** @@ -101,23 +92,3 @@ public class ArlinnEmbracedByTheMoon extends CardImpl { return new ArlinnEmbracedByTheMoon(this); } } - -class ArlinnEmbracedByTheMoonEmblem extends Emblem { - - // "Creatures you control have haste and '{T}: This creature deals damage equal to its power to target creature or player.'" - public ArlinnEmbracedByTheMoonEmblem() { - this.setName("Emblem Arlinn"); - FilterPermanent filter = new FilterControlledCreaturePermanent("Creatures"); - GainAbilityControlledEffect effect = new GainAbilityControlledEffect(HasteAbility.getInstance(), Duration.EndOfGame, filter); - effect.setText("Creatures you control have haste"); - Ability ability = new SimpleStaticAbility(Zone.COMMAND, effect); - Effect effect2 = new DamageTargetEffect(new SourcePermanentPowerCount()); - effect2.setText("This creature deals damage equal to its power to target creature or player"); - Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect2, new TapSourceCost()); - ability2.addTarget(new TargetCreatureOrPlayer()); - effect = new GainAbilityControlledEffect(ability2, Duration.EndOfGame, filter); - effect.setText("and '{T}: This creature deals damage equal to its power to target creature or player"); - ability.addEffect(effect); - this.getAbilities().add(ability); - } -} diff --git a/Mage.Sets/src/mage/cards/a/AurraSingBaneOfJedi.java b/Mage.Sets/src/mage/cards/a/AurraSingBaneOfJedi.java index 48a502fe4ab..b59c9fd6fec 100644 --- a/Mage.Sets/src/mage/cards/a/AurraSingBaneOfJedi.java +++ b/Mage.Sets/src/mage/cards/a/AurraSingBaneOfJedi.java @@ -29,7 +29,6 @@ package mage.cards.a; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.LeavesBattlefieldAllTriggeredAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; @@ -37,22 +36,17 @@ import mage.abilities.effects.common.DamageControllerEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.GetEmblemTargetPlayerEffect; import mage.abilities.effects.common.SetPlayerLifeAllEffect; -import mage.abilities.effects.common.discard.DiscardControllerEffect; import mage.abilities.effects.common.discard.DiscardHandAllEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.TargetController; -import mage.constants.Zone; -import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.permanent.TokenPredicate; import mage.game.Game; -import mage.game.command.Emblem; import mage.game.permanent.Permanent; import mage.players.Player; +import mage.game.command.emblems.AurraSingBaneOfJediEmblem; import mage.target.TargetPlayer; import mage.target.common.TargetCreaturePermanent; @@ -155,18 +149,3 @@ class SacrificeAllEffect extends OneShotEffect { return new SacrificeAllEffect(this); } } - -class AurraSingBaneOfJediEmblem extends Emblem { - - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("a nontoken creature you control"); - - static { - filter.add(Predicates.not(new TokenPredicate())); - } - - // Whenever a nontoken creature you control leave the battlefied, discard a card." - public AurraSingBaneOfJediEmblem() { - this.setName("Emblem Aurra Sing, Bane of Jedi"); - getAbilities().add(new LeavesBattlefieldAllTriggeredAbility(Zone.COMMAND, new DiscardControllerEffect(1), filter, false)); - } -} diff --git a/Mage.Sets/src/mage/cards/c/ChandraRoaringFlame.java b/Mage.Sets/src/mage/cards/c/ChandraRoaringFlame.java index ec9268aa4bf..70c9c20334d 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraRoaringFlame.java +++ b/Mage.Sets/src/mage/cards/c/ChandraRoaringFlame.java @@ -29,19 +29,15 @@ package mage.cards.c; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; -import mage.constants.TargetController; -import mage.constants.Zone; import mage.game.Game; -import mage.game.command.Emblem; +import mage.game.command.emblems.ChandraRoaringFlameEmblem; import mage.players.Player; import mage.target.TargetPlayer; import mage.target.common.TargetCreaturePermanent; @@ -127,18 +123,3 @@ class ChandraRoaringFlameEmblemEffect extends OneShotEffect { return false; } } - -/** - * Emblem with "At the beginning of your upkeep, this emblem deals 3 damage to - * you." - */ -class ChandraRoaringFlameEmblem extends Emblem { - - public ChandraRoaringFlameEmblem() { - setName("Emblem Chandra"); - setExpansionSetCodeForImage("ORI"); - Effect effect = new DamageTargetEffect(3); - effect.setText("this emblem deals 3 damage to you"); - this.getAbilities().add(new BeginningOfUpkeepTriggeredAbility(Zone.COMMAND, effect, TargetController.YOU, false, true)); - } -} diff --git a/Mage.Sets/src/mage/cards/c/ChandraTorchOfDefiance.java b/Mage.Sets/src/mage/cards/c/ChandraTorchOfDefiance.java index 5098ab205f8..989d5829bda 100644 --- a/Mage.Sets/src/mage/cards/c/ChandraTorchOfDefiance.java +++ b/Mage.Sets/src/mage/cards/c/ChandraTorchOfDefiance.java @@ -32,9 +32,7 @@ import mage.Mana; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.dynamicvalue.common.StaticValue; -import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.BasicManaEffect; import mage.abilities.effects.common.DamagePlayersEffect; @@ -47,12 +45,10 @@ import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.TargetController; import mage.constants.Zone; -import mage.filter.FilterSpell; import mage.game.Game; -import mage.game.command.Emblem; import mage.players.Library; import mage.players.Player; -import mage.target.common.TargetCreatureOrPlayer; +import mage.game.command.emblems.ChandraTorchOfDefianceEmblem; import mage.target.common.TargetCreaturePermanent; import java.util.UUID; @@ -120,7 +116,7 @@ class ChandraTorchOfDefianceEffect extends OneShotEffect { if (card != null) { boolean exiledCardWasCast = false; controller.moveCardToExileWithInfo(card, source.getSourceId(), sourceObject.getIdName(), source.getSourceId(), game, Zone.LIBRARY, true); - if (!card.getManaCost().isEmpty()) + if (!card.getManaCost().isEmpty()) { if (controller.chooseUse(Outcome.Benefit, "Cast the card? (You still pay the costs)", source, game) && !card.isLand()) { // LinkedHashMap useableAbilities = controller.getUseableActivatedAbilities(card, Zone.EXILED, game); // for (ActivatedAbility ability : useableAbilities.values()) { @@ -129,6 +125,7 @@ class ChandraTorchOfDefianceEffect extends OneShotEffect { // controller.activateAbility(useableAbilities, game); exiledCardWasCast = controller.cast(card.getSpellAbility(), game, false); } + } if (!exiledCardWasCast) { new DamagePlayersEffect(Outcome.Damage, new StaticValue(2), TargetController.OPPONENT).apply(game, source); } @@ -139,16 +136,3 @@ class ChandraTorchOfDefianceEffect extends OneShotEffect { return false; } } - -class ChandraTorchOfDefianceEmblem extends Emblem { - - // You get an emblem with "Whenever you cast a spell, this emblem deals 5 damage to target creature or player." - public ChandraTorchOfDefianceEmblem() { - this.setName("Emblem Chandra"); - Effect effect = new DamageTargetEffect(5); - effect.setText("this emblem deals 5 damage to target creature or player"); - Ability ability = new SpellCastControllerTriggeredAbility(Zone.COMMAND, effect, new FilterSpell("a spell"), false, false); - ability.addTarget(new TargetCreatureOrPlayer()); - getAbilities().add(ability); - } -} diff --git a/Mage.Sets/src/mage/cards/d/DarettiScrapSavant.java b/Mage.Sets/src/mage/cards/d/DarettiScrapSavant.java index 68201fdf555..4d71accc63f 100644 --- a/Mage.Sets/src/mage/cards/d/DarettiScrapSavant.java +++ b/Mage.Sets/src/mage/cards/d/DarettiScrapSavant.java @@ -29,7 +29,6 @@ package mage.cards.d; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.CanBeYourCommanderAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; @@ -48,10 +47,7 @@ import mage.filter.FilterCard; import mage.filter.common.FilterArtifactCard; import mage.filter.common.FilterControlledArtifactPermanent; import mage.game.Game; -import mage.game.command.Emblem; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.game.events.ZoneChangeEvent; +import mage.game.command.emblems.DarettiScrapSavantEmblem; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.Target; @@ -59,7 +55,6 @@ import mage.target.common.TargetCardInYourGraveyard; import mage.target.common.TargetControlledPermanent; import mage.target.common.TargetDiscard; import mage.target.targetpointer.FixedTarget; - import java.util.UUID; /** @@ -173,55 +168,6 @@ class DarettiSacrificeEffect extends OneShotEffect { } } -class DarettiScrapSavantEmblem extends Emblem { - - // You get an emblem with "Whenever an artifact is put into your graveyard from the battlefield, return that card to the battlefield at the beginning of the next end step." - public DarettiScrapSavantEmblem() { - this.getAbilities().add(new DarettiScrapSavantTriggeredAbility()); - } -} - -class DarettiScrapSavantTriggeredAbility extends TriggeredAbilityImpl { - - DarettiScrapSavantTriggeredAbility() { - super(Zone.COMMAND, new DarettiScrapSavantEffect(), false); - } - - DarettiScrapSavantTriggeredAbility(final DarettiScrapSavantTriggeredAbility ability) { - super(ability); - } - - @Override - public DarettiScrapSavantTriggeredAbility copy() { - return new DarettiScrapSavantTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == EventType.ZONE_CHANGE; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - ZoneChangeEvent zEvent = (ZoneChangeEvent) event; - if (zEvent.getToZone() == Zone.GRAVEYARD - && zEvent.getFromZone() == Zone.BATTLEFIELD - && zEvent.getTarget().isArtifact() - && zEvent.getTarget().getOwnerId().equals(this.controllerId)) { - for (Effect effect : this.getEffects()) { - effect.setTargetPointer(new FixedTarget(zEvent.getTargetId())); - } - return true; - } - return false; - } - - @Override - public String getRule() { - return "Whenever an artifact is put into your graveyard from the battlefield, " + super.getRule(); - } -} - class DarettiScrapSavantEffect extends OneShotEffect { DarettiScrapSavantEffect() { diff --git a/Mage.Sets/src/mage/cards/d/DomriRade.java b/Mage.Sets/src/mage/cards/d/DomriRade.java index 9f2be0dc973..527f5a88264 100644 --- a/Mage.Sets/src/mage/cards/d/DomriRade.java +++ b/Mage.Sets/src/mage/cards/d/DomriRade.java @@ -31,29 +31,20 @@ import mage.MageObject; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.FightTargetsEffect; import mage.abilities.effects.common.GetEmblemEffect; -import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; -import mage.abilities.keyword.DoubleStrikeAbility; -import mage.abilities.keyword.HasteAbility; -import mage.abilities.keyword.HexproofAbility; -import mage.abilities.keyword.TrampleAbility; import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.CardsImpl; import mage.constants.CardType; -import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.FilterPermanent; -import mage.filter.common.FilterControlledCreaturePermanent; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.AnotherTargetPredicate; import mage.game.Game; -import mage.game.command.Emblem; +import mage.game.command.emblems.DomriRadeEmblem; import mage.players.Player; import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetCreaturePermanent; @@ -141,21 +132,3 @@ class DomriRadeEffect1 extends OneShotEffect { return false; } } - -class DomriRadeEmblem extends Emblem { - - // "Creatures you control have double strike, trample, hexproof and haste." - public DomriRadeEmblem() { - this.setName("Emblem Domri"); - FilterPermanent filter = new FilterControlledCreaturePermanent("Creatures"); - GainAbilityControlledEffect effect = new GainAbilityControlledEffect(DoubleStrikeAbility.getInstance(), Duration.EndOfGame, filter); - Ability ability = new SimpleStaticAbility(Zone.COMMAND, effect); - effect = new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.EndOfGame, filter); - ability.addEffect(effect); - effect = new GainAbilityControlledEffect(HexproofAbility.getInstance(), Duration.EndOfGame, filter); - ability.addEffect(effect); - effect = new GainAbilityControlledEffect(HasteAbility.getInstance(), Duration.EndOfGame, filter); - ability.addEffect(effect); - this.getAbilities().add(ability); - } -} diff --git a/Mage.Sets/src/mage/cards/d/DovinBaan.java b/Mage.Sets/src/mage/cards/d/DovinBaan.java index 24be763b9aa..388fdea1e21 100644 --- a/Mage.Sets/src/mage/cards/d/DovinBaan.java +++ b/Mage.Sets/src/mage/cards/d/DovinBaan.java @@ -30,10 +30,8 @@ package mage.cards.d; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.Effect; -import mage.abilities.effects.RestrictionUntapNotMoreThanEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.GetEmblemEffect; @@ -43,15 +41,11 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; -import mage.constants.Zone; -import mage.filter.common.FilterControlledPermanent; +import mage.game.command.emblems.DovinBaanEmblem; import mage.game.Game; -import mage.game.command.Emblem; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; -import mage.players.Player; import mage.target.common.TargetCreaturePermanent; - import java.util.UUID; /** @@ -126,34 +120,3 @@ class DovinBaanCantActivateAbilitiesEffect extends ContinuousRuleModifyingEffect return event.getSourceId().equals(this.getTargetPointer().getFirst(game, source)); } } - -class DovinBaanEmblem extends Emblem { - - DovinBaanEmblem() { - this.setName("Emblem Dovin"); - Ability ability = new SimpleStaticAbility(Zone.COMMAND, new DovinBaanCantUntapEffect()); - this.getAbilities().add(ability); - } -} - -class DovinBaanCantUntapEffect extends RestrictionUntapNotMoreThanEffect { - - DovinBaanCantUntapEffect() { - super(Duration.WhileOnBattlefield, 2, new FilterControlledPermanent()); - staticText = "Your opponents can't untap more than two permanents during their untap steps."; - } - - DovinBaanCantUntapEffect(final DovinBaanCantUntapEffect effect) { - super(effect); - } - - @Override - public boolean applies(Player player, Ability source, Game game) { - return game.getOpponents(source.getControllerId()).contains(player.getId()); - } - - @Override - public DovinBaanCantUntapEffect copy() { - return new DovinBaanCantUntapEffect(this); - } -} diff --git a/Mage.Sets/src/mage/cards/e/ElspethKnightErrant.java b/Mage.Sets/src/mage/cards/e/ElspethKnightErrant.java index 60485658da2..fec1037b54f 100644 --- a/Mage.Sets/src/mage/cards/e/ElspethKnightErrant.java +++ b/Mage.Sets/src/mage/cards/e/ElspethKnightErrant.java @@ -29,25 +29,18 @@ package mage.cards.e; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.Effects; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; -import mage.abilities.effects.common.continuous.GainAbilityAllEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.keyword.FlyingAbility; -import mage.abilities.keyword.IndestructibleAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.constants.Zone; -import mage.filter.common.FilterControlledPermanent; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.CardTypePredicate; -import mage.game.command.Emblem; +import mage.game.command.emblems.ElspethKnightErrantEmblem; import mage.game.permanent.token.SoldierToken; import mage.game.permanent.token.Token; import mage.target.common.TargetCreaturePermanent; @@ -97,20 +90,3 @@ public class ElspethKnightErrant extends CardImpl { } } - -class ElspethKnightErrantEmblem extends Emblem { - - public ElspethKnightErrantEmblem() { - this.setName("Emblem Elspeth"); - FilterControlledPermanent filter = new FilterControlledPermanent("Artifacts, creatures, enchantments, and lands you control"); - filter.add(Predicates.or( - new CardTypePredicate(CardType.ARTIFACT), - new CardTypePredicate(CardType.CREATURE), - new CardTypePredicate(CardType.ENCHANTMENT), - new CardTypePredicate(CardType.LAND))); - Effect effect = new GainAbilityAllEffect(IndestructibleAbility.getInstance(), Duration.WhileOnBattlefield, filter, false); - effect.setText("Artifacts, creatures, enchantments, and lands you control are indestructible"); - this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, effect)); - this.setExpansionSetCodeForImage("MMA"); - } -} diff --git a/Mage.Sets/src/mage/cards/e/ElspethSunsChampion.java b/Mage.Sets/src/mage/cards/e/ElspethSunsChampion.java index 9a0f1f8d4a7..9ab234134bc 100644 --- a/Mage.Sets/src/mage/cards/e/ElspethSunsChampion.java +++ b/Mage.Sets/src/mage/cards/e/ElspethSunsChampion.java @@ -27,25 +27,18 @@ */ package mage.cards.e; -import mage.abilities.Ability; import mage.constants.ComparisonType; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DestroyAllEffect; import mage.abilities.effects.common.GetEmblemEffect; -import mage.abilities.effects.common.continuous.BoostControlledEffect; -import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; -import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.mageobject.PowerPredicate; -import mage.game.command.Emblem; +import mage.game.command.emblems.ElspethSunsChampionEmblem; import mage.game.permanent.token.SoldierToken; import java.util.UUID; @@ -85,17 +78,3 @@ public class ElspethSunsChampion extends CardImpl { return new ElspethSunsChampion(this); } } - -// -7: You get an emblem with "Creatures you control get +2/+2 and have flying." -class ElspethSunsChampionEmblem extends Emblem { - - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures"); - - public ElspethSunsChampionEmblem() { - this.setName("Emblem Elspeth"); - Ability ability = new SimpleStaticAbility(Zone.COMMAND, new BoostControlledEffect(2, 2, Duration.EndOfGame, filter, false)); - ability.addEffect(new GainAbilityControlledEffect(FlyingAbility.getInstance(), Duration.EndOfGame, filter)); - this.getAbilities().add(ability); - - } -} diff --git a/Mage.Sets/src/mage/cards/g/GarrukApexPredator.java b/Mage.Sets/src/mage/cards/g/GarrukApexPredator.java index c033d4d025a..908bab85d70 100644 --- a/Mage.Sets/src/mage/cards/g/GarrukApexPredator.java +++ b/Mage.Sets/src/mage/cards/g/GarrukApexPredator.java @@ -30,16 +30,12 @@ package mage.cards.g; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.AttackedByCreatureTriggeredAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.effects.common.GetEmblemTargetPlayerEffect; -import mage.abilities.effects.common.continuous.BoostTargetEffect; -import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; -import mage.abilities.keyword.TrampleAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; @@ -47,12 +43,12 @@ import mage.filter.FilterPermanent; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.filter.predicate.permanent.AnotherPredicate; import mage.game.Game; -import mage.game.command.Emblem; import mage.game.permanent.Permanent; import mage.game.permanent.token.GarrukApexPredatorBeastToken; import mage.players.Player; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; +import mage.game.command.emblems.GarrukApexPredatorEmblem; import mage.target.common.TargetOpponent; /** @@ -134,21 +130,3 @@ class GarrukApexPredatorEffect3 extends OneShotEffect { return false; } } - -/** - * Emblem with "Whenever a creature attacks you, it gets +5/+5 and gains trample - * until end of turn." - */ -class GarrukApexPredatorEmblem extends Emblem { - - public GarrukApexPredatorEmblem() { - setName("Emblem Garruk"); - Effect effect = new BoostTargetEffect(5, 5, Duration.EndOfTurn); - effect.setText("it gets +5/+5"); - Ability ability = new AttackedByCreatureTriggeredAbility(Zone.COMMAND, effect, false, SetTargetPointer.PERMANENT); - effect = new GainAbilityTargetEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, - "and gains trample until end of turn"); - ability.addEffect(effect); - this.getAbilities().add(ability); - } -} diff --git a/Mage.Sets/src/mage/cards/g/GarrukCallerOfBeasts.java b/Mage.Sets/src/mage/cards/g/GarrukCallerOfBeasts.java index 06b88647913..fdaabe46af2 100644 --- a/Mage.Sets/src/mage/cards/g/GarrukCallerOfBeasts.java +++ b/Mage.Sets/src/mage/cards/g/GarrukCallerOfBeasts.java @@ -28,31 +28,24 @@ package mage.cards.g; import mage.ObjectColor; -import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.common.SpellCastControllerTriggeredAbility; -import mage.abilities.effects.Effect; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.PutPermanentOnBattlefieldEffect; import mage.abilities.effects.common.RevealLibraryPutIntoHandEffect; -import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.StaticFilters; import mage.filter.common.FilterCreatureCard; import mage.filter.predicate.mageobject.ColorPredicate; -import mage.game.command.Emblem; -import mage.target.common.TargetCardInLibrary; import java.util.UUID; +import mage.game.command.emblems.GarrukCallerOfBeastsEmblem; /** * - * @author LevelX2 + * @author LevelX2 import mage.game.command.emblems.GarrukCallerOfBeastsEmblem; */ public class GarrukCallerOfBeasts extends CardImpl { @@ -87,18 +80,4 @@ public class GarrukCallerOfBeasts extends CardImpl { public GarrukCallerOfBeasts copy() { return new GarrukCallerOfBeasts(this); } -} - -/** - * Emblem: "Whenever you cast a creature spell, you may search your library for - * a creature card, put it onto the battlefield, then shuffle your library." - */ -class GarrukCallerOfBeastsEmblem extends Emblem { - - public GarrukCallerOfBeastsEmblem() { - this.setName("Emblem Garruk"); - Effect effect = new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(new FilterCreatureCard("creature card")), false, true, Outcome.PutCreatureInPlay); - Ability ability = new SpellCastControllerTriggeredAbility(Zone.COMMAND, effect, StaticFilters.FILTER_SPELL_A_CREATURE, true, false); - this.getAbilities().add(ability); - } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/g/GideonAllyOfZendikar.java b/Mage.Sets/src/mage/cards/g/GideonAllyOfZendikar.java index 72cc0109b4f..08172090893 100644 --- a/Mage.Sets/src/mage/cards/g/GideonAllyOfZendikar.java +++ b/Mage.Sets/src/mage/cards/g/GideonAllyOfZendikar.java @@ -27,27 +27,23 @@ */ package mage.cards.g; -import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.PreventAllDamageToSourceEffect; import mage.abilities.effects.common.continuous.BecomesCreatureSourceEffect; -import mage.abilities.effects.common.continuous.BoostControlledEffect; -import mage.abilities.keyword.IndestructibleAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.constants.Zone; -import mage.game.command.Emblem; -import mage.game.permanent.token.Token; - +import mage.game.command.emblems.GideonAllyOfZendikarEmblem; import java.util.UUID; +import mage.MageInt; +import mage.abilities.keyword.IndestructibleAbility; +import mage.game.permanent.token.KnightAllyToken; +import mage.game.permanent.token.Token; /** * @@ -85,17 +81,6 @@ public class GideonAllyOfZendikar extends CardImpl { } } -class GideonAllyOfZendikarEmblem extends Emblem { - - public GideonAllyOfZendikarEmblem() { - this.setName("Emblem Gideon"); - BoostControlledEffect effect = new BoostControlledEffect(1, 1, Duration.EndOfGame); - Ability ability = new SimpleStaticAbility(Zone.COMMAND, effect); - this.getAbilities().add(ability); - this.setExpansionSetCodeForImage("BFZ"); - } -} - class GideonAllyOfZendikarToken extends Token { public GideonAllyOfZendikarToken() { @@ -110,16 +95,3 @@ class GideonAllyOfZendikarToken extends Token { addAbility(IndestructibleAbility.getInstance()); } } - -class KnightAllyToken extends Token { - - public KnightAllyToken() { - super("Knight Ally", "2/2 white Knight Ally creature token"); - cardType.add(CardType.CREATURE); - subtype.add("Knight"); - subtype.add("Ally"); - color.setWhite(true); - power = new MageInt(2); - toughness = new MageInt(2); - } -} diff --git a/Mage.Sets/src/mage/cards/j/JaceTelepathUnbound.java b/Mage.Sets/src/mage/cards/j/JaceTelepathUnbound.java index c6fd34c9e08..f18c7b78fb0 100644 --- a/Mage.Sets/src/mage/cards/j/JaceTelepathUnbound.java +++ b/Mage.Sets/src/mage/cards/j/JaceTelepathUnbound.java @@ -31,14 +31,12 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.common.SpellCastControllerTriggeredAbility; import mage.abilities.effects.AsThoughEffectImpl; import mage.abilities.effects.ContinuousEffect; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.ReplacementEffectImpl; import mage.abilities.effects.common.GetEmblemEffect; -import mage.abilities.effects.common.PutTopCardOfLibraryIntoGraveTargetEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.cards.Card; import mage.cards.CardImpl; @@ -48,16 +46,14 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Zone; -import mage.filter.FilterSpell; import mage.filter.common.FilterInstantOrSorceryCard; import mage.game.Game; -import mage.game.command.Emblem; import mage.game.events.GameEvent; +import mage.game.command.emblems.JaceTelepathUnboundEmblem; import mage.game.events.ZoneChangeEvent; import mage.players.Player; import mage.target.common.TargetCardInYourGraveyard; import mage.target.common.TargetCreaturePermanent; -import mage.target.common.TargetOpponent; import mage.target.targetpointer.FixedTarget; /** @@ -202,16 +198,3 @@ class JaceTelepathUnboundReplacementEffect extends ReplacementEffectImpl { && zEvent.getTargetId().equals(this.cardId); } } - -class JaceTelepathUnboundEmblem extends Emblem { - - // You get an emblem with "Whenever you cast a spell, target opponent puts the top five cards of his or her library into his or her graveyard". - public JaceTelepathUnboundEmblem() { - this.setName("Emblem Jace"); - Effect effect = new PutTopCardOfLibraryIntoGraveTargetEffect(5); - effect.setText("target opponent puts the top five cards of his or her library into his or her graveyard"); - Ability ability = new SpellCastControllerTriggeredAbility(Zone.COMMAND, effect, new FilterSpell("a spell"), false, false); - ability.addTarget(new TargetOpponent()); - getAbilities().add(ability); - } -} diff --git a/Mage.Sets/src/mage/cards/j/JaceUnravelerOfSecrets.java b/Mage.Sets/src/mage/cards/j/JaceUnravelerOfSecrets.java index 76081f445b6..6d14335ea12 100644 --- a/Mage.Sets/src/mage/cards/j/JaceUnravelerOfSecrets.java +++ b/Mage.Sets/src/mage/cards/j/JaceUnravelerOfSecrets.java @@ -27,14 +27,11 @@ */ package mage.cards.j; -import java.util.List; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.common.SpellCastOpponentTriggeredAbility; import mage.abilities.effects.Effect; -import mage.abilities.effects.common.CounterTargetEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.ReturnToHandTargetEffect; @@ -42,17 +39,12 @@ import mage.abilities.effects.keyword.ScryEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Zone; -import mage.filter.FilterSpell; -import mage.game.Game; -import mage.game.command.Emblem; -import mage.game.events.GameEvent; -import mage.game.stack.Spell; +import mage.game.command.emblems.JaceUnravelerOfSecretsEmblem; import mage.target.common.TargetCreaturePermanent; -import mage.target.targetpointer.FixedTarget; import mage.watchers.common.SpellsCastWatcher; /** + * import mage.game.command.emblems.JaceUnravelerOfSecretsEmblem; * * @author LevelX2 */ @@ -91,56 +83,3 @@ public class JaceUnravelerOfSecrets extends CardImpl { return new JaceUnravelerOfSecrets(this); } } - -/** - * Emblem: "Whenever an opponent casts his or her first spell each turn, counter - * that spell." - */ -class JaceUnravelerOfSecretsEmblem extends Emblem { - - public JaceUnravelerOfSecretsEmblem() { - this.setName("Emblem Jace"); - setExpansionSetCodeForImage("SOI"); - Effect effect = new CounterTargetEffect(); - effect.setText("counter that spell"); - this.getAbilities().add(new JaceUnravelerOfSecretsTriggeredAbility(effect, false)); - } -} - -class JaceUnravelerOfSecretsTriggeredAbility extends SpellCastOpponentTriggeredAbility { - - public JaceUnravelerOfSecretsTriggeredAbility(Effect effect, boolean optional) { - super(Zone.COMMAND, effect, new FilterSpell(), optional); - } - - public JaceUnravelerOfSecretsTriggeredAbility(SpellCastOpponentTriggeredAbility ability) { - super(ability); - } - - @Override - public SpellCastOpponentTriggeredAbility copy() { - return new JaceUnravelerOfSecretsTriggeredAbility(this); - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - if (super.checkTrigger(event, game)) { - SpellsCastWatcher watcher = (SpellsCastWatcher) game.getState().getWatchers().get(SpellsCastWatcher.class.getSimpleName()); - if (watcher != null) { - List spells = watcher.getSpellsCastThisTurn(event.getPlayerId()); - if (spells != null && spells.size() == 1) { - for (Effect effect : getEffects()) { - effect.setTargetPointer(new FixedTarget(event.getTargetId())); - } - return true; - } - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever an opponent casts his or her first spell each turn, counter that spell."; - } -} diff --git a/Mage.Sets/src/mage/cards/k/KioraMasterOfTheDepths.java b/Mage.Sets/src/mage/cards/k/KioraMasterOfTheDepths.java index ab1e72fa485..053fbb26163 100644 --- a/Mage.Sets/src/mage/cards/k/KioraMasterOfTheDepths.java +++ b/Mage.Sets/src/mage/cards/k/KioraMasterOfTheDepths.java @@ -31,7 +31,6 @@ import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; @@ -44,15 +43,14 @@ import mage.cards.Cards; import mage.cards.CardsImpl; import mage.constants.CardType; import mage.constants.Outcome; -import mage.constants.SetTargetPointer; import mage.constants.Zone; import mage.filter.common.FilterCreatureCard; import mage.filter.common.FilterCreaturePermanent; import mage.filter.common.FilterLandCard; import mage.filter.common.FilterLandPermanent; import mage.game.Game; -import mage.game.command.Emblem; import mage.game.permanent.Permanent; +import mage.game.command.emblems.KioraMasterOfTheDepthsEmblem; import mage.game.permanent.token.OctopusToken; import mage.players.Player; import mage.target.TargetCard; @@ -196,49 +194,3 @@ class KioraRevealEffect extends OneShotEffect { return false; } } - -class KioraMasterOfTheDepthsEmblem extends Emblem { - - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures"); - - public KioraMasterOfTheDepthsEmblem() { - this.setName("Emblem Kiora"); - - Ability ability = new EntersBattlefieldControlledTriggeredAbility(Zone.COMMAND, - new KioraFightEffect(), filter, true, SetTargetPointer.PERMANENT, - "Whenever a creature enters the battlefield under your control, you may have it fight target creature."); - ability.addTarget(new TargetCreaturePermanent()); - this.getAbilities().add(ability); - this.setExpansionSetCodeForImage("BFZ"); - } -} - -class KioraFightEffect extends OneShotEffect { - - KioraFightEffect() { - super(Outcome.Damage); - } - - KioraFightEffect(final KioraFightEffect effect) { - super(effect); - } - - @Override - public boolean apply(Game game, Ability source) { - Permanent triggeredCreature = game.getPermanent(getTargetPointer().getFirst(game, source)); - Permanent target = game.getPermanent(source.getFirstTarget()); - if (triggeredCreature != null - && target != null - && triggeredCreature.isCreature() - && target.isCreature()) { - triggeredCreature.fight(target, source, game); - return true; - } - return false; - } - - @Override - public KioraFightEffect copy() { - return new KioraFightEffect(this); - } -} diff --git a/Mage.Sets/src/mage/cards/k/KioraTheCrashingWave.java b/Mage.Sets/src/mage/cards/k/KioraTheCrashingWave.java index 73de5a06e47..1749a62ea2e 100644 --- a/Mage.Sets/src/mage/cards/k/KioraTheCrashingWave.java +++ b/Mage.Sets/src/mage/cards/k/KioraTheCrashingWave.java @@ -30,10 +30,8 @@ package mage.cards.k; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.BeginningOfEndStepTriggeredAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; import mage.abilities.effects.PreventionEffectImpl; -import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.continuous.PlayAdditionalLandsControllerEffect; @@ -42,17 +40,15 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.TargetController; -import mage.constants.Zone; import mage.filter.FilterPermanent; import mage.filter.predicate.permanent.ControllerPredicate; import mage.game.Game; -import mage.game.command.Emblem; import mage.game.events.DamageEvent; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; -import mage.game.permanent.token.KioraKrakenToken; import mage.target.TargetPermanent; import mage.util.CardUtil; +import mage.game.command.emblems.KioraEmblem; /** * @@ -155,16 +151,3 @@ class KioraPreventionEffect extends PreventionEffectImpl { return false; } } - -/** - * Emblem: "At the beginning of your end step, create a 9/9 blue Kraken creature - * token." - */ -class KioraEmblem extends Emblem { - - public KioraEmblem() { - this.setName("Emblem Kiora"); - Ability ability = new BeginningOfEndStepTriggeredAbility(Zone.COMMAND, new CreateTokenEffect(new KioraKrakenToken()), TargetController.YOU, null, false); - this.getAbilities().add(ability); - } -} diff --git a/Mage.Sets/src/mage/cards/k/KothOfTheHammer.java b/Mage.Sets/src/mage/cards/k/KothOfTheHammer.java index 474930fc33b..bf601081f7a 100644 --- a/Mage.Sets/src/mage/cards/k/KothOfTheHammer.java +++ b/Mage.Sets/src/mage/cards/k/KothOfTheHammer.java @@ -33,12 +33,7 @@ import mage.Mana; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.costs.common.TapSourceCost; import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount; -import mage.abilities.effects.ContinuousEffectImpl; -import mage.abilities.effects.common.DamageTargetEffect; import mage.abilities.effects.common.DynamicManaEffect; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.UntapTargetEffect; @@ -47,19 +42,12 @@ 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.TargetController; -import mage.constants.Zone; import mage.filter.common.FilterLandPermanent; +import mage.game.command.emblems.KothOfTheHammerEmblem; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.permanent.ControllerPredicate; -import mage.game.Game; -import mage.game.command.Emblem; -import mage.game.permanent.Permanent; import mage.game.permanent.token.Token; -import mage.target.common.TargetCreatureOrPlayer; import mage.target.common.TargetLandPermanent; /** @@ -117,56 +105,3 @@ class KothOfTheHammerToken extends Token { this.toughness = new MageInt(4); } } - -class KothOfTheHammerEmblem extends Emblem { - - // "Mountains you control have '{T}: This land deals 1 damage to target creature or player.'" - public KothOfTheHammerEmblem() { - this.setName("Emblem Koth"); - this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, new KothOfTheHammerThirdEffect())); - } -} - -class KothOfTheHammerThirdEffect extends ContinuousEffectImpl { - - public KothOfTheHammerThirdEffect() { - super(Duration.EndOfGame, Outcome.AddAbility); - staticText = "You get an emblem with \"Mountains you control have '{T}: This land deals 1 damage to target creature or player.'\""; - } - - public KothOfTheHammerThirdEffect(final KothOfTheHammerThirdEffect effect) { - super(effect); - } - - @Override - public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { - switch (layer) { - case AbilityAddingRemovingEffects_6: - if (sublayer == SubLayer.NA) { - for (Permanent permanent : game.getBattlefield().getActivePermanents(KothOfTheHammer.filterCount, source.getControllerId(), source.getSourceId(), game)) { - Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new TapSourceCost()); - ability.addTarget(new TargetCreatureOrPlayer()); - permanent.addAbility(ability, source.getSourceId(), game); - } - } - break; - } - return true; - } - - @Override - public boolean apply(Game game, Ability source) { - return false; - } - - @Override - public KothOfTheHammerThirdEffect copy() { - return new KothOfTheHammerThirdEffect(this); - } - - @Override - public boolean hasLayer(Layer layer) { - return layer == Layer.AbilityAddingRemovingEffects_6; - } - -} diff --git a/Mage.Sets/src/mage/cards/l/LilianaDefiantNecromancer.java b/Mage.Sets/src/mage/cards/l/LilianaDefiantNecromancer.java index 016ff509d3f..808a30a3b9f 100644 --- a/Mage.Sets/src/mage/cards/l/LilianaDefiantNecromancer.java +++ b/Mage.Sets/src/mage/cards/l/LilianaDefiantNecromancer.java @@ -30,30 +30,23 @@ package mage.cards.l; import mage.abilities.Ability; import mage.constants.ComparisonType; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.DiesCreatureTriggeredAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; import mage.abilities.costs.Cost; import mage.abilities.costs.common.PayVariableLoyaltyCost; -import mage.abilities.effects.Effect; -import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; import mage.abilities.effects.common.discard.DiscardEachPlayerEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.filter.FilterCard; import mage.filter.common.FilterCreatureCard; -import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; import mage.filter.predicate.mageobject.SupertypePredicate; +import mage.game.command.emblems.LilianaDefiantNecromancerEmblem; import mage.game.Game; -import mage.game.command.Emblem; import mage.target.common.TargetCardInYourGraveyard; -import mage.target.targetpointer.FixedTarget; import java.util.UUID; @@ -119,45 +112,3 @@ public class LilianaDefiantNecromancer extends CardImpl { return new LilianaDefiantNecromancer(this); } } - -class LilianaDefiantNecromancerEmblem extends Emblem { - - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a creature"); - - // You get an emblem with "Whenever a creature you control dies, return it to the battlefield under your control at the beginning of the next end step." - public LilianaDefiantNecromancerEmblem() { - this.setName("Emblem Liliana"); - Ability ability = new DiesCreatureTriggeredAbility(Zone.COMMAND, new LilianaDefiantNecromancerEmblemEffect(), false, filter, true); - this.getAbilities().add(ability); - } -} - -class LilianaDefiantNecromancerEmblemEffect extends OneShotEffect { - - LilianaDefiantNecromancerEmblemEffect() { - super(Outcome.PutCardInPlay); - this.staticText = "return it to the battlefield under your control at the beginning of the next end step"; - } - - LilianaDefiantNecromancerEmblemEffect(final LilianaDefiantNecromancerEmblemEffect effect) { - super(effect); - } - - @Override - public LilianaDefiantNecromancerEmblemEffect copy() { - return new LilianaDefiantNecromancerEmblemEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - Card card = game.getCard(getTargetPointer().getFirst(game, source)); - if (card != null) { - Effect effect = new ReturnFromGraveyardToBattlefieldTargetEffect(); - effect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game))); - effect.setText("return that card to the battlefield at the beginning of the next end step"); - game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(Zone.COMMAND, effect, TargetController.ANY), source); - return true; - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/l/LilianaOfTheDarkRealms.java b/Mage.Sets/src/mage/cards/l/LilianaOfTheDarkRealms.java index 96ec14246ab..46fa6485c17 100644 --- a/Mage.Sets/src/mage/cards/l/LilianaOfTheDarkRealms.java +++ b/Mage.Sets/src/mage/cards/l/LilianaOfTheDarkRealms.java @@ -28,17 +28,12 @@ package mage.cards.l; import java.util.UUID; -import mage.Mana; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.common.GetEmblemEffect; -import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; -import mage.abilities.mana.SimpleManaAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -47,13 +42,12 @@ import mage.constants.Layer; import mage.constants.Outcome; import mage.constants.SubLayer; import mage.constants.TargetController; -import mage.constants.Zone; import mage.filter.common.FilterLandCard; import mage.filter.common.FilterLandPermanent; import mage.filter.predicate.mageobject.SubtypePredicate; import mage.filter.predicate.permanent.ControllerPredicate; import mage.game.Game; -import mage.game.command.Emblem; +import mage.game.command.emblems.LilianaOfTheDarkRealmsEmblem; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetCardInLibrary; @@ -145,19 +139,3 @@ class LilianaOfTheDarkRealmsEffect extends ContinuousEffectImpl { return false; } } - -class LilianaOfTheDarkRealmsEmblem extends Emblem { - - private static final FilterLandPermanent filter = new FilterLandPermanent("Swamps"); - - static { - filter.add(new SubtypePredicate("Swamp")); - } - - public LilianaOfTheDarkRealmsEmblem() { - this.setName("Emblem Liliana"); - SimpleManaAbility manaAbility = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.BlackMana(4), new TapSourceCost()); - Ability ability = new SimpleStaticAbility(Zone.COMMAND, new GainAbilityControlledEffect(manaAbility, Duration.WhileOnBattlefield, filter)); - this.getAbilities().add(ability); - } -} diff --git a/Mage.Sets/src/mage/cards/l/LilianaTheLastHope.java b/Mage.Sets/src/mage/cards/l/LilianaTheLastHope.java index 47a5ea95603..48c7aef011f 100644 --- a/Mage.Sets/src/mage/cards/l/LilianaTheLastHope.java +++ b/Mage.Sets/src/mage/cards/l/LilianaTheLastHope.java @@ -30,12 +30,9 @@ package mage.cards.l; import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.BeginningOfEndStepTriggeredAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.PutTopCardOfLibraryIntoGraveControllerEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect; @@ -45,14 +42,10 @@ 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.FilterControlledCreaturePermanent; import mage.filter.common.FilterCreatureCard; -import mage.filter.predicate.mageobject.SubtypePredicate; import mage.game.Game; -import mage.game.command.Emblem; -import mage.game.permanent.token.ZombieToken; +import mage.game.command.emblems.LilianaTheLastHopeEmblem; import mage.players.Player; import mage.target.common.TargetCardInYourGraveyard; import mage.target.common.TargetCreaturePermanent; @@ -131,43 +124,3 @@ class LilianaTheLastHopeEffect extends OneShotEffect { return true; } } - -class LilianaTheLastHopeEmblem extends Emblem { - - public LilianaTheLastHopeEmblem() { - this.setName("Emblem Liliana"); - Ability ability = new BeginningOfEndStepTriggeredAbility(Zone.COMMAND, new CreateTokenEffect(new ZombieToken(), new LilianaZombiesCount()), - TargetController.YOU, null, false); - this.getAbilities().add(ability); - } -} - -class LilianaZombiesCount implements DynamicValue { - - private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent(); - - static { - filter.add(new SubtypePredicate("Zombie")); - } - - @Override - public int calculate(Game game, Ability sourceAbility, Effect effect) { - int amount = game.getBattlefield().countAll(filter, sourceAbility.getControllerId(), game) + 2; - return amount; - } - - @Override - public DynamicValue copy() { - return new LilianaZombiesCount(); - } - - @Override - public String toString() { - return "X"; - } - - @Override - public String getMessage() { - return "two plus the number of Zombies you control"; - } -} diff --git a/Mage.Sets/src/mage/cards/n/NarsetTranscendent.java b/Mage.Sets/src/mage/cards/n/NarsetTranscendent.java index df6d5e42266..ac8ba970327 100644 --- a/Mage.Sets/src/mage/cards/n/NarsetTranscendent.java +++ b/Mage.Sets/src/mage/cards/n/NarsetTranscendent.java @@ -33,9 +33,7 @@ import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ContinuousEffectImpl; -import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; @@ -52,7 +50,7 @@ import mage.constants.Outcome; import mage.constants.SubLayer; import mage.constants.Zone; import mage.game.Game; -import mage.game.command.Emblem; +import mage.game.command.emblems.NarsetTranscendentEmblem; import mage.game.events.GameEvent; import mage.game.stack.Spell; import mage.players.Player; @@ -220,62 +218,3 @@ class NarsetTranscendentGainReboundEffect extends ContinuousEffectImpl { } } } - -class NarsetTranscendentEmblem extends Emblem { - // "Your opponents can't cast noncreature spells. - - public NarsetTranscendentEmblem() { - - this.setName("Emblem Narset"); - - this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, new NarsetTranscendentCantCastEffect())); - } -} - -class NarsetTranscendentCantCastEffect extends ContinuousRuleModifyingEffectImpl { - - public NarsetTranscendentCantCastEffect() { - super(Duration.EndOfGame, Outcome.Benefit); - staticText = "Your opponents can't cast noncreature spells"; - } - - public NarsetTranscendentCantCastEffect(final NarsetTranscendentCantCastEffect effect) { - super(effect); - } - - @Override - public NarsetTranscendentCantCastEffect copy() { - return new NarsetTranscendentCantCastEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - return true; - } - - @Override - public String getInfoMessage(Ability source, GameEvent event, Game game) { - MageObject mageObject = game.getObject(source.getSourceId()); - if (mageObject != null) { - return "You can't cast can't cast noncreature spells (it is prevented by emblem of " + mageObject.getLogName() + ')'; - } - return null; - } - - @Override - public boolean checksEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.CAST_SPELL; - } - - @Override - public boolean applies(GameEvent event, Ability source, Game game) { - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null && controller.hasOpponent(event.getPlayerId(), game)) { - Card card = game.getCard(event.getSourceId()); - if (card != null && !card.isCreature()) { - return true; - } - } - return false; - } -} diff --git a/Mage.Sets/src/mage/cards/n/NissaVitalForce.java b/Mage.Sets/src/mage/cards/n/NissaVitalForce.java index 1d7efabcce1..6f8bb5156f2 100644 --- a/Mage.Sets/src/mage/cards/n/NissaVitalForce.java +++ b/Mage.Sets/src/mage/cards/n/NissaVitalForce.java @@ -29,11 +29,8 @@ package mage.cards.n; import java.util.UUID; import mage.MageInt; -import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.abilities.effects.common.UntapTargetEffect; @@ -44,15 +41,13 @@ import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; import mage.constants.TargetController; -import mage.constants.Zone; -import mage.filter.common.FilterControlledLandPermanent; import mage.filter.common.FilterLandPermanent; import mage.filter.common.FilterPermanentCard; import mage.filter.predicate.permanent.ControllerPredicate; -import mage.game.command.Emblem; import mage.game.permanent.token.Token; import mage.target.common.TargetCardInYourGraveyard; import mage.target.common.TargetLandPermanent; +import mage.game.command.emblems.NissaVitalForceEmblem; /** * @@ -109,14 +104,3 @@ class NissaVitalForceToken extends Token { this.addAbility(HasteAbility.getInstance()); } } - -class NissaVitalForceEmblem extends Emblem { - - // You get an emblem with "Whenever a land enters the battlefield under your control, you may draw a card." - public NissaVitalForceEmblem() { - this.setName("Emblem Nissa"); - Ability ability = new EntersBattlefieldAllTriggeredAbility(Zone.COMMAND, new DrawCardSourceControllerEffect(1), new FilterControlledLandPermanent("a land"), - true, null, true); - getAbilities().add(ability); - } -} diff --git a/Mage.Sets/src/mage/cards/o/ObNixilisOfTheBlackOath.java b/Mage.Sets/src/mage/cards/o/ObNixilisOfTheBlackOath.java index 5ad73cae2df..3bb76f85086 100644 --- a/Mage.Sets/src/mage/cards/o/ObNixilisOfTheBlackOath.java +++ b/Mage.Sets/src/mage/cards/o/ObNixilisOfTheBlackOath.java @@ -32,28 +32,18 @@ import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.CanBeYourCommanderAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.common.SimpleActivatedAbility; -import mage.abilities.costs.common.SacrificeTargetCost; -import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.dynamicvalue.DynamicValue; -import mage.abilities.dynamicvalue.common.SacrificeCostCreaturesPower; -import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; -import mage.abilities.effects.common.DrawCardSourceControllerEffect; -import mage.abilities.effects.common.GainLifeEffect; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.LoseLifeSourceControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Outcome; -import mage.constants.Zone; import mage.game.Game; -import mage.game.command.Emblem; import mage.game.permanent.token.DemonToken; import mage.players.Player; -import mage.target.common.TargetControlledCreaturePermanent; +import mage.game.command.emblems.ObNixilisOfTheBlackOathEmblem; /** * @@ -127,20 +117,3 @@ class ObNixilisOfTheBlackOathEffect1 extends OneShotEffect { } } - -class ObNixilisOfTheBlackOathEmblem extends Emblem { - - // You get an emblem with "{1}{B}, Sacrifice a creature: You gain X life and draw X cards, where X is the sacrificed creature's power." - public ObNixilisOfTheBlackOathEmblem() { - this.setName("Emblem Nixilis"); - DynamicValue xValue = new SacrificeCostCreaturesPower(); - Effect effect = new GainLifeEffect(xValue); - effect.setText("You gain X life"); - Ability ability = new SimpleActivatedAbility(Zone.COMMAND, effect, new ManaCostsImpl("{1}{B}")); - ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent())); - effect = new DrawCardSourceControllerEffect(xValue); - effect.setText("and draw X cards, where X is the sacrificed creature's power"); - ability.addEffect(effect); - this.getAbilities().add(ability); - } -} diff --git a/Mage.Sets/src/mage/cards/o/ObNixilisReignited.java b/Mage.Sets/src/mage/cards/o/ObNixilisReignited.java index 0ff4300421c..e4c36efdb5f 100644 --- a/Mage.Sets/src/mage/cards/o/ObNixilisReignited.java +++ b/Mage.Sets/src/mage/cards/o/ObNixilisReignited.java @@ -29,7 +29,6 @@ package mage.cards.o; import java.util.UUID; import mage.abilities.LoyaltyAbility; -import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DestroyTargetEffect; @@ -39,11 +38,7 @@ import mage.abilities.effects.common.LoseLifeSourceControllerEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Zone; -import mage.game.Game; -import mage.game.command.Emblem; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; +import mage.game.command.emblems.ObNixilisReignitedEmblem; import mage.target.common.TargetCreaturePermanent; import mage.target.common.TargetOpponent; @@ -90,44 +85,3 @@ public class ObNixilisReignited extends CardImpl { return new ObNixilisReignited(this); } } - -class ObNixilisReignitedEmblem extends Emblem { - - public ObNixilisReignitedEmblem() { - setName("Emblem Nixilis"); - - this.getAbilities().add(new ObNixilisEmblemTriggeredAbility(new LoseLifeSourceControllerEffect(2), false)); - this.setExpansionSetCodeForImage("BFZ"); - } -} - -class ObNixilisEmblemTriggeredAbility extends TriggeredAbilityImpl { - - public ObNixilisEmblemTriggeredAbility(Effect effect, boolean optional) { - super(Zone.COMMAND, effect, optional); - } - - public ObNixilisEmblemTriggeredAbility(final ObNixilisEmblemTriggeredAbility ability) { - super(ability); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == EventType.DREW_CARD; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - return event.getPlayerId() != null; - } - - @Override - public String getRule() { - return "Whenever a player draws a card, you lose 2 life."; - } - - @Override - public ObNixilisEmblemTriggeredAbility copy() { - return new ObNixilisEmblemTriggeredAbility(this); - } -} diff --git a/Mage.Sets/src/mage/cards/o/ObiWanKenobi.java b/Mage.Sets/src/mage/cards/o/ObiWanKenobi.java index 23803932888..e4766ba3ab2 100644 --- a/Mage.Sets/src/mage/cards/o/ObiWanKenobi.java +++ b/Mage.Sets/src/mage/cards/o/ObiWanKenobi.java @@ -31,28 +31,22 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.TapTargetEffect; -import mage.abilities.effects.common.continuous.BoostControlledEffect; -import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; import mage.abilities.effects.common.continuous.GainProtectionFromColorTargetEffect; -import mage.abilities.keyword.FirstStrikeAbility; -import mage.abilities.keyword.LifelinkAbility; import mage.abilities.keyword.VigilanceAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Duration; -import mage.constants.Zone; -import mage.game.command.Emblem; +import mage.game.command.emblems.ObiWanKenobiEmblem; import mage.target.common.TargetCreaturePermanent; /** * - * @author Styxo + * @author Styxo import mage.game.command.emblems.ObiWanKenobiEmblem; */ public class ObiWanKenobi extends CardImpl { @@ -91,23 +85,3 @@ public class ObiWanKenobi extends CardImpl { return new ObiWanKenobi(this); } } - -class ObiWanKenobiEmblem extends Emblem { - - // Creatures you control get +1/+1 and have vigilance, first strike, and lifelink - public ObiWanKenobiEmblem() { - this.setName("Emblem Obi-Wan Kenobi"); - this.setExpansionSetCodeForImage("SWS"); - Ability ability = new SimpleStaticAbility(Zone.COMMAND, new BoostControlledEffect(1, 1, Duration.EndOfGame)); - Effect effect = new GainAbilityControlledEffect(VigilanceAbility.getInstance(), Duration.EndOfGame); - effect.setText("and have vigilance"); - ability.addEffect(effect); - effect = new GainAbilityControlledEffect(FirstStrikeAbility.getInstance(), Duration.WhileOnBattlefield); - effect.setText(", first strike"); - ability.addEffect(effect); - effect = new GainAbilityControlledEffect(LifelinkAbility.getInstance(), Duration.WhileOnBattlefield); - effect.setText("and lifelink."); - ability.addEffect(effect); - getAbilities().add(ability); - } -} diff --git a/Mage.Sets/src/mage/cards/s/SarkhanTheDragonspeaker.java b/Mage.Sets/src/mage/cards/s/SarkhanTheDragonspeaker.java index 38f49b9315d..9436b8539d5 100644 --- a/Mage.Sets/src/mage/cards/s/SarkhanTheDragonspeaker.java +++ b/Mage.Sets/src/mage/cards/s/SarkhanTheDragonspeaker.java @@ -32,15 +32,11 @@ import mage.MageObjectReference; import mage.ObjectColor; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.BeginningOfDrawTriggeredAbility; -import mage.abilities.common.BeginningOfEndStepTriggeredAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; import mage.abilities.effects.ContinuousEffectImpl; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DamageTargetEffect; -import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.GetEmblemEffect; -import mage.abilities.effects.common.discard.DiscardHandControllerEffect; import mage.abilities.keyword.FlyingAbility; import mage.abilities.keyword.HasteAbility; import mage.abilities.keyword.IndestructibleAbility; @@ -48,11 +44,12 @@ import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.*; import mage.game.Game; -import mage.game.command.Emblem; +import mage.game.command.emblems.SarkhanTheDragonspeakerEmblem; import mage.game.permanent.Permanent; import mage.target.common.TargetCreaturePermanent; /** + * import mage.game.command.emblems.SarkhanTheDragonspeakerEmblem; * * @author emerald000 */ @@ -156,14 +153,3 @@ class SarkhanTheDragonspeakerEffect extends ContinuousEffectImpl { return layer == Layer.PTChangingEffects_7 || layer == Layer.AbilityAddingRemovingEffects_6 || layer == Layer.ColorChangingEffects_5 || layer == Layer.TypeChangingEffects_4; } } - -class SarkhanTheDragonspeakerEmblem extends Emblem { - - SarkhanTheDragonspeakerEmblem() { - setName("Emblem Sarkhan"); - this.setExpansionSetCodeForImage("KTK"); - - this.getAbilities().add(new BeginningOfDrawTriggeredAbility(Zone.COMMAND, new DrawCardSourceControllerEffect(2), TargetController.YOU, false)); - this.getAbilities().add(new BeginningOfEndStepTriggeredAbility(Zone.COMMAND, new DiscardHandControllerEffect(), TargetController.YOU, null, false)); - } -} diff --git a/Mage.Sets/src/mage/cards/s/SorinLordOfInnistrad.java b/Mage.Sets/src/mage/cards/s/SorinLordOfInnistrad.java index 802904d610b..06a7af26191 100644 --- a/Mage.Sets/src/mage/cards/s/SorinLordOfInnistrad.java +++ b/Mage.Sets/src/mage/cards/s/SorinLordOfInnistrad.java @@ -31,27 +31,24 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.GetEmblemEffect; -import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.cards.Card; 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.filter.FilterPermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.game.Game; -import mage.game.command.Emblem; -import mage.game.permanent.Permanent; import mage.game.permanent.token.SorinLordOfInnistradVampireToken; -import mage.players.Player; +import mage.game.command.emblems.SorinLordOfInnistradEmblem; import mage.target.TargetPermanent; +import mage.game.permanent.Permanent; +import mage.players.Player; /** * @@ -95,16 +92,6 @@ public class SorinLordOfInnistrad extends CardImpl { } } -class SorinLordOfInnistradEmblem extends Emblem { - - public SorinLordOfInnistradEmblem() { - this.setName("Emblem Sorin"); - BoostControlledEffect effect = new BoostControlledEffect(1, 0, Duration.EndOfGame); - Ability ability = new SimpleStaticAbility(Zone.COMMAND, effect); - this.getAbilities().add(ability); - } -} - class SorinLordOfInnistradEffect extends OneShotEffect { public SorinLordOfInnistradEffect() { diff --git a/Mage.Sets/src/mage/cards/s/SorinSolemnVisitor.java b/Mage.Sets/src/mage/cards/s/SorinSolemnVisitor.java index 78a2d8b5013..7411f993e2d 100644 --- a/Mage.Sets/src/mage/cards/s/SorinSolemnVisitor.java +++ b/Mage.Sets/src/mage/cards/s/SorinSolemnVisitor.java @@ -28,25 +28,20 @@ package mage.cards.s; import java.util.UUID; -import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.GetEmblemEffect; -import mage.abilities.effects.common.SacrificeEffect; import mage.abilities.effects.common.continuous.BoostControlledEffect; import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; import mage.abilities.keyword.LifelinkAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.game.command.emblems.SorinSolemnVisitorEmblem; import mage.constants.Duration; -import mage.constants.TargetController; -import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; -import mage.game.command.Emblem; import mage.game.permanent.token.SorinSolemnVisitorVampireToken; /** @@ -86,17 +81,4 @@ public class SorinSolemnVisitor extends CardImpl { public SorinSolemnVisitor copy() { return new SorinSolemnVisitor(this); } -} - -/** - * Emblem: "At the beginning of each opponent's upkeep, that player sacrifices a - * creature." - */ -class SorinSolemnVisitorEmblem extends Emblem { - - public SorinSolemnVisitorEmblem() { - this.setName("Emblem Sorin"); - Ability ability = new BeginningOfUpkeepTriggeredAbility(Zone.COMMAND, new SacrificeEffect(new FilterCreaturePermanent(), 1, "that player"), TargetController.OPPONENT, false, true); - this.getAbilities().add(ability); - } -} +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/cards/t/TamiyoFieldResearcher.java b/Mage.Sets/src/mage/cards/t/TamiyoFieldResearcher.java index b4960aaaa0b..9e71e2efb16 100644 --- a/Mage.Sets/src/mage/cards/t/TamiyoFieldResearcher.java +++ b/Mage.Sets/src/mage/cards/t/TamiyoFieldResearcher.java @@ -35,25 +35,22 @@ import mage.abilities.Ability; import mage.abilities.DelayedTriggeredAbility; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.TapTargetEffect; -import mage.abilities.effects.common.continuous.CastFromHandWithoutPayingManaCostEffect; 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.filter.FilterPermanent; -import static mage.filter.StaticFilters.FILTER_PERMANENT_CREATURES; +import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.game.Game; -import mage.game.command.Emblem; +import mage.game.command.emblems.TamiyoFieldResearcherEmblem; import mage.game.events.DamagedEvent; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; @@ -81,7 +78,7 @@ public class TamiyoFieldResearcher extends CardImpl { // +1: Choose up to two target creatures. Until your next turn, whenever either of those creatures deals combat damage, you draw a card. Ability ability = new LoyaltyAbility(new TamiyoFieldResearcherEffect1(), 1); - ability.addTarget(new TargetCreaturePermanent(0, 2, FILTER_PERMANENT_CREATURES, false)); + ability.addTarget(new TargetCreaturePermanent(0, 2, new FilterCreaturePermanent("creatures"), false)); this.addAbility(ability); // -2: Tap up to two target nonland permanents. They don't untap during their controller's next untap step. @@ -188,14 +185,3 @@ class TamiyoFieldResearcherDelayedTriggeredAbility extends DelayedTriggeredAbili return "Until your next turn, whenever either of those creatures deals combat damage, you draw a card."; } } - -class TamiyoFieldResearcherEmblem extends Emblem { - // You may cast nonland cards from your hand without paying their mana costs. - - public TamiyoFieldResearcherEmblem() { - - this.setName("Emblem Tamiyo"); - - this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, new CastFromHandWithoutPayingManaCostEffect())); - } -} diff --git a/Mage.Sets/src/mage/cards/t/TamiyoTheMoonSage.java b/Mage.Sets/src/mage/cards/t/TamiyoTheMoonSage.java index a9f4b970bed..7c554621eb0 100644 --- a/Mage.Sets/src/mage/cards/t/TamiyoTheMoonSage.java +++ b/Mage.Sets/src/mage/cards/t/TamiyoTheMoonSage.java @@ -31,29 +31,19 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.common.PutCardIntoGraveFromAnywhereAllTriggeredAbility; -import mage.abilities.common.SimpleStaticAbility; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.GetEmblemEffect; -import mage.abilities.effects.common.ReturnToHandTargetEffect; import mage.abilities.effects.common.TapTargetEffect; -import mage.abilities.effects.common.continuous.MaximumHandSizeControllerEffect; -import mage.abilities.effects.common.continuous.MaximumHandSizeControllerEffect.HandSizeModification; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.Duration; -import mage.constants.SetTargetPointer; -import mage.constants.TargetController; -import mage.constants.Zone; -import mage.filter.FilterCard; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.permanent.TappedPredicate; import mage.game.Game; -import mage.game.command.Emblem; +import mage.game.command.emblems.TamiyoTheMoonSageEmblem; import mage.target.Target; import mage.target.TargetPermanent; import mage.target.TargetPlayer; @@ -129,15 +119,3 @@ class TappedCreaturesControlledByTargetCount implements DynamicValue { * Emblem with "You have no maximum hand size" and "Whenever a card is put into * your graveyard from anywhere, you may return it to your hand." */ -class TamiyoTheMoonSageEmblem extends Emblem { - - public TamiyoTheMoonSageEmblem() { - this.setName("Emblem Tamiyo"); - Ability ability = new SimpleStaticAbility(Zone.COMMAND, new MaximumHandSizeControllerEffect(Integer.MAX_VALUE, Duration.EndOfGame, HandSizeModification.SET)); - this.getAbilities().add(ability); - Effect effect = new ReturnToHandTargetEffect(); - effect.setText("return it to your hand"); - this.getAbilities().add(new PutCardIntoGraveFromAnywhereAllTriggeredAbility( - Zone.COMMAND, effect, true, new FilterCard("a card"), TargetController.YOU, SetTargetPointer.CARD)); - } -} diff --git a/Mage.Sets/src/mage/cards/t/TeferiTemporalArchmage.java b/Mage.Sets/src/mage/cards/t/TeferiTemporalArchmage.java index 5926cc3ef18..c9e21ed2452 100644 --- a/Mage.Sets/src/mage/cards/t/TeferiTemporalArchmage.java +++ b/Mage.Sets/src/mage/cards/t/TeferiTemporalArchmage.java @@ -31,19 +31,17 @@ import java.util.UUID; import mage.abilities.LoyaltyAbility; import mage.abilities.common.CanBeYourCommanderAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.common.SimpleStaticAbility; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; import mage.abilities.effects.common.UntapTargetEffect; -import mage.abilities.effects.common.continuous.ActivateAbilitiesAnyTimeYouCouldCastInstantEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.Zone; import mage.filter.FilterCard; import mage.filter.FilterPermanent; -import mage.game.command.Emblem; +import mage.game.command.emblems.TeferiTemporalArchmageEmblem; import mage.target.TargetPermanent; /** @@ -84,12 +82,3 @@ public class TeferiTemporalArchmage extends CardImpl { return new TeferiTemporalArchmage(this); } } - -class TeferiTemporalArchmageEmblem extends Emblem { - - // "You may activate loyalty abilities of planeswalkers you control on any player's turn any time you could cast an instant." - public TeferiTemporalArchmageEmblem() { - this.setName("Emblem Teferi"); - this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, new ActivateAbilitiesAnyTimeYouCouldCastInstantEffect(LoyaltyAbility.class, "loyalty abilities of planeswalkers you control on any player's turn"))); - } -} diff --git a/Mage.Sets/src/mage/cards/t/TezzeretTheSchemer.java b/Mage.Sets/src/mage/cards/t/TezzeretTheSchemer.java index 0950c31ff1b..b85407a217a 100644 --- a/Mage.Sets/src/mage/cards/t/TezzeretTheSchemer.java +++ b/Mage.Sets/src/mage/cards/t/TezzeretTheSchemer.java @@ -53,6 +53,7 @@ import mage.game.permanent.token.EtheriumCellToken; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; +import mage.game.command.emblems.TezzeretTheSchemerEmblem; /** * @author JRHerlehy */ @@ -90,18 +91,3 @@ public class TezzeretTheSchemer extends CardImpl { } } -class TezzeretTheSchemerEmblem extends Emblem { - - public TezzeretTheSchemerEmblem() { - this.setName("Emblem Tezzeret"); - - Effect effect = new AddCardTypeTargetEffect(CardType.CREATURE, Duration.EndOfGame); - effect.setText("target artifact you control becomes an artifact creature"); - Ability ability = new BeginningOfCombatTriggeredAbility(Zone.COMMAND, effect, TargetController.YOU, false, true); - effect = new SetPowerToughnessTargetEffect(5, 5, Duration.EndOfGame); - effect.setText("with base power and toughness 5/5"); - ability.addEffect(effect); - ability.addTarget(new TargetPermanent(new FilterControlledArtifactPermanent())); - this.getAbilities().add(ability); - } -} diff --git a/Mage.Sets/src/mage/cards/v/VenserTheSojourner.java b/Mage.Sets/src/mage/cards/v/VenserTheSojourner.java index 8ae6f18af80..16207988d03 100644 --- a/Mage.Sets/src/mage/cards/v/VenserTheSojourner.java +++ b/Mage.Sets/src/mage/cards/v/VenserTheSojourner.java @@ -31,12 +31,10 @@ import java.util.UUID; import mage.MageObject; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; -import mage.abilities.TriggeredAbilityImpl; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; -import mage.abilities.effects.common.ExileTargetEffect; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.ReturnToBattlefieldUnderYourControlTargetEffect; import mage.abilities.effects.common.combat.CantBeBlockedAllEffect; @@ -48,15 +46,11 @@ import mage.constants.Outcome; import mage.constants.TargetController; import mage.constants.Zone; import mage.filter.FilterPermanent; -import mage.filter.FilterSpell; import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.other.OwnerPredicate; import mage.game.Game; -import mage.game.command.Emblem; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; +import mage.game.command.emblems.VenserTheSojournerEmblem; import mage.game.permanent.Permanent; -import mage.game.stack.Spell; import mage.players.Player; import mage.target.Target; import mage.target.TargetPermanent; @@ -146,69 +140,3 @@ class VenserTheSojournerEffect extends OneShotEffect { } } - -/** - * Emblem: "Whenever you cast a spell, exile target permanent." - */ -class VenserTheSojournerEmblem extends Emblem { - - public VenserTheSojournerEmblem() { - this.setName("Emblem Venser"); - Ability ability = new VenserTheSojournerSpellCastTriggeredAbility(new ExileTargetEffect(), false); - Target target = new TargetPermanent(); - ability.addTarget(target); - this.getAbilities().add(ability); - } -} - -class VenserTheSojournerSpellCastTriggeredAbility extends TriggeredAbilityImpl { - - private static final FilterSpell spellCard = new FilterSpell("a spell"); - protected FilterSpell filter; - - /** - * If true, the source that triggered the ability will be set as target to - * effect. - */ - protected boolean rememberSource = false; - - public VenserTheSojournerSpellCastTriggeredAbility(Effect effect, boolean optional) { - super(Zone.COMMAND, effect, optional); - this.filter = spellCard; - } - - public VenserTheSojournerSpellCastTriggeredAbility(final VenserTheSojournerSpellCastTriggeredAbility ability) { - super(ability); - filter = ability.filter; - this.rememberSource = ability.rememberSource; - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == 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 (spell != null && filter.match(spell, game)) { - if (rememberSource) { - this.getEffects().get(0).setTargetPointer(new FixedTarget(spell.getId())); - } - return true; - } - } - return false; - } - - @Override - public String getRule() { - return "Whenever you cast a spell, exile target permanent."; - } - - @Override - public VenserTheSojournerSpellCastTriggeredAbility copy() { - return new VenserTheSojournerSpellCastTriggeredAbility(this); - } -} diff --git a/Mage.Sets/src/mage/cards/y/YodaJediMaster.java b/Mage.Sets/src/mage/cards/y/YodaJediMaster.java index e07fb2e615d..f6a0616f5c1 100644 --- a/Mage.Sets/src/mage/cards/y/YodaJediMaster.java +++ b/Mage.Sets/src/mage/cards/y/YodaJediMaster.java @@ -31,7 +31,6 @@ import java.util.UUID; import mage.abilities.Ability; import mage.abilities.LoyaltyAbility; import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; -import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.Effect; @@ -39,23 +38,18 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.GetEmblemEffect; import mage.abilities.effects.common.LookLibraryAndPickControllerEffect; import mage.abilities.effects.common.ReturnToBattlefieldUnderYourControlTargetEffect; -import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; -import mage.abilities.effects.common.continuous.GainAbilityControllerEffect; -import mage.abilities.keyword.HexproofAbility; 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.FilterCard; import mage.filter.FilterPermanent; -import mage.filter.common.FilterCreaturePermanent; import mage.filter.predicate.other.OwnerPredicate; +import mage.game.command.emblems.YodaEmblem; import mage.filter.predicate.permanent.AnotherPredicate; import mage.game.Game; -import mage.game.command.Emblem; import mage.game.permanent.Permanent; import mage.target.TargetPermanent; import mage.target.targetpointer.FixedTarget; @@ -138,18 +132,3 @@ class YodaJediMasterEffect extends OneShotEffect { return new YodaJediMasterEffect(this); } } - -class YodaEmblem extends Emblem { - - // You get an emblem with "Hexproof, you and your creatures have." - public YodaEmblem() { - this.setName("Emblem Yoda, Jedi Master"); - Effect effect = new GainAbilityControllerEffect(HexproofAbility.getInstance(), Duration.EndOfGame); - effect.setText("Hexproof, you"); - Ability ability = new SimpleStaticAbility(Zone.COMMAND, effect); - effect = new GainAbilityControlledEffect(HexproofAbility.getInstance(), Duration.EndOfGame, new FilterCreaturePermanent()); - effect.setText(" you and your creatures have"); - ability.addEffect(effect); - getAbilities().add(ability); - } -} diff --git a/Mage/src/main/java/mage/game/command/emblems/AjaniSteadfastEmblem.java b/Mage/src/main/java/mage/game/command/emblems/AjaniSteadfastEmblem.java new file mode 100644 index 00000000000..fbc69a78e32 --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/AjaniSteadfastEmblem.java @@ -0,0 +1,100 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.PreventionEffectImpl; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.command.Emblem; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; + +/** + * + * @author spjspj + */ +public class AjaniSteadfastEmblem extends Emblem { + + public AjaniSteadfastEmblem() { + setName("Emblem Ajani"); + this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, new AjaniSteadfastPreventEffect())); + this.setExpansionSetCodeForImage("M15"); + } +} + +class AjaniSteadfastPreventEffect extends PreventionEffectImpl { + + public AjaniSteadfastPreventEffect() { + super(Duration.EndOfGame); + this.staticText = "If a source would deal damage to you or a planeswalker you control, prevent all but 1 of that damage"; + consumable = false; + } + + public AjaniSteadfastPreventEffect(AjaniSteadfastPreventEffect effect) { + super(effect); + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + int damage = event.getAmount(); + if (damage > 1) { + amountToPrevent = damage - 1; + preventDamageAction(event, source, game); + } + return false; + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (event.getType() == GameEvent.EventType.DAMAGE_PLAYER + && event.getTargetId().equals(source.getControllerId())) { + return super.applies(event, source, game); + } + + if (event.getType() == GameEvent.EventType.DAMAGE_PLANESWALKER) { + Permanent permanent = game.getPermanent(event.getTargetId()); + if (permanent != null && permanent.getControllerId().equals(source.getControllerId())) { + return super.applies(event, source, game); + } + } + return false; + } + + @Override + public AjaniSteadfastPreventEffect copy() { + return new AjaniSteadfastPreventEffect(this); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/ArlinnEmbracedByTheMoonEmblem.java b/Mage/src/main/java/mage/game/command/emblems/ArlinnEmbracedByTheMoonEmblem.java new file mode 100644 index 00000000000..e2d7472777f --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/ArlinnEmbracedByTheMoonEmblem.java @@ -0,0 +1,68 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.dynamicvalue.common.SourcePermanentPowerCount; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.HasteAbility; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.game.command.Emblem; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author spjspj + */ +public class ArlinnEmbracedByTheMoonEmblem extends Emblem { + // "Creatures you control have haste and '{T}: This creature deals damage equal to its power to target creature or player.'" + + public ArlinnEmbracedByTheMoonEmblem() { + this.setName("Emblem Arlinn"); + FilterPermanent filter = new FilterControlledCreaturePermanent("Creatures"); + GainAbilityControlledEffect effect = new GainAbilityControlledEffect(HasteAbility.getInstance(), Duration.EndOfGame, filter); + effect.setText("Creatures you control have haste"); + Ability ability = new SimpleStaticAbility(Zone.COMMAND, effect); + Effect effect2 = new DamageTargetEffect(new SourcePermanentPowerCount()); + effect2.setText("This creature deals damage equal to its power to target creature or player"); + Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect2, new TapSourceCost()); + ability2.addTarget(new TargetCreatureOrPlayer()); + effect = new GainAbilityControlledEffect(ability2, Duration.EndOfGame, filter); + effect.setText("and '{T}: This creature deals damage equal to its power to target creature or player"); + ability.addEffect(effect); + this.getAbilities().add(ability); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/AurraSingBaneOfJediEmblem.java b/Mage/src/main/java/mage/game/command/emblems/AurraSingBaneOfJediEmblem.java new file mode 100644 index 00000000000..72e59708e40 --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/AurraSingBaneOfJediEmblem.java @@ -0,0 +1,55 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.common.LeavesBattlefieldAllTriggeredAbility; +import mage.abilities.effects.common.discard.DiscardControllerEffect; +import mage.constants.Zone; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.permanent.TokenPredicate; +import mage.game.command.Emblem; + +/** + * + * @author spjspj + */ +public class AurraSingBaneOfJediEmblem extends Emblem { + + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("a nontoken creature you control"); + + static { + filter.add(Predicates.not(new TokenPredicate())); + } + + // Whenever a nontoken creature you control leaves the battlefied, discard a card. + public AurraSingBaneOfJediEmblem() { + this.setName("Emblem Aurra Sing, Bane of Jedi"); + getAbilities().add(new LeavesBattlefieldAllTriggeredAbility(Zone.COMMAND, new DiscardControllerEffect(1), filter, false)); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/ChandraRoaringFlameEmblem.java b/Mage/src/main/java/mage/game/command/emblems/ChandraRoaringFlameEmblem.java new file mode 100644 index 00000000000..80501b1c51e --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/ChandraRoaringFlameEmblem.java @@ -0,0 +1,55 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.game.command.Emblem; + +/** + * + * @author spjspj + */ +public class ChandraRoaringFlameEmblem extends Emblem { + + /** + * Emblem with "At the beginning of your upkeep, this emblem deals 3 damage + * to you." + */ + + public ChandraRoaringFlameEmblem() { + setName("Emblem Chandra"); + setExpansionSetCodeForImage("ORI"); + Effect effect = new DamageTargetEffect(3); + effect.setText("this emblem deals 3 damage to you"); + this.getAbilities().add(new BeginningOfUpkeepTriggeredAbility(Zone.COMMAND, effect, TargetController.YOU, false, true)); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/ChandraTorchOfDefianceEmblem.java b/Mage/src/main/java/mage/game/command/emblems/ChandraTorchOfDefianceEmblem.java new file mode 100644 index 00000000000..de17acdc38f --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/ChandraTorchOfDefianceEmblem.java @@ -0,0 +1,54 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.Ability; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.constants.Zone; +import mage.filter.FilterSpell; +import mage.game.command.Emblem; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author spjspj + */ +public class ChandraTorchOfDefianceEmblem extends Emblem { + + // You get an emblem with "Whenever you cast a spell, this emblem deals 5 damage to target creature or player." + public ChandraTorchOfDefianceEmblem() { + this.setName("Emblem Chandra"); + Effect effect = new DamageTargetEffect(5); + effect.setText("this emblem deals 5 damage to target creature or player"); + Ability ability = new SpellCastControllerTriggeredAbility(Zone.COMMAND, effect, new FilterSpell("a spell"), false, false); + ability.addTarget(new TargetCreatureOrPlayer()); + getAbilities().add(ability); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/DackFaydenEmblem.java b/Mage/src/main/java/mage/game/command/emblems/DackFaydenEmblem.java new file mode 100644 index 00000000000..2a1b54ef49c --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/DackFaydenEmblem.java @@ -0,0 +1,172 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.SpellAbility; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.Effect; +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.command.Emblem; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.permanent.Permanent; +import mage.game.stack.Spell; +import mage.players.Player; +import mage.target.Target; +import mage.target.targetpointer.FixedTargets; + +/** + * + * @author spjspj + */ +public class DackFaydenEmblem extends Emblem { + + public DackFaydenEmblem() { + this.setName("Emblem Dack"); + this.getAbilities().add(new DackFaydenEmblemTriggeredAbility()); + } +} + +class DackFaydenEmblemTriggeredAbility extends TriggeredAbilityImpl { + + DackFaydenEmblemTriggeredAbility() { + super(Zone.COMMAND, new DackFaydenEmblemEffect(), false); + } + + DackFaydenEmblemTriggeredAbility(final DackFaydenEmblemTriggeredAbility ability) { + super(ability); + } + + @Override + public DackFaydenEmblemTriggeredAbility copy() { + return new DackFaydenEmblemTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.SPELL_CAST; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + boolean returnValue = false; + List targetedPermanentIds = new ArrayList<>(0); + Player player = game.getPlayer(this.getControllerId()); + if (player != null) { + if (event.getPlayerId().equals(this.getControllerId())) { + Spell spell = game.getStack().getSpell(event.getTargetId()); + if (spell != null) { + SpellAbility spellAbility = spell.getSpellAbility(); + for (Target target : spellAbility.getTargets()) { + if (!target.isNotTarget()) { + for (UUID targetId : target.getTargets()) { + if (game.getBattlefield().containsPermanent(targetId)) { + returnValue = true; + targetedPermanentIds.add(targetId); + } + } + } + } + for (Effect effect : spellAbility.getEffects()) { + for (UUID targetId : effect.getTargetPointer().getTargets(game, spellAbility)) { + if (game.getBattlefield().containsPermanent(targetId)) { + returnValue = true; + targetedPermanentIds.add(targetId); + } + } + } + } + } + } + for (Effect effect : this.getEffects()) { + if (effect instanceof DackFaydenEmblemEffect) { + DackFaydenEmblemEffect dackEffect = (DackFaydenEmblemEffect) effect; + List permanents = new ArrayList<>(); + for (UUID permanentId : targetedPermanentIds) { + Permanent permanent = game.getPermanent(permanentId); + if (permanent != null) { + permanents.add(permanent); + } + } + + dackEffect.setTargets(permanents, game); + } + } + return returnValue; + } + + @Override + public String getRule() { + return "Whenever you cast a spell that targets one or more permanents, gain control of those permanents."; + } +} + +class DackFaydenEmblemEffect extends ContinuousEffectImpl { + + protected FixedTargets fixedTargets; + + DackFaydenEmblemEffect() { + super(Duration.EndOfGame, Layer.ControlChangingEffects_2, SubLayer.NA, Outcome.GainControl); + this.staticText = "gain control of those permanents"; + } + + DackFaydenEmblemEffect(final DackFaydenEmblemEffect effect) { + super(effect); + this.fixedTargets = effect.fixedTargets; + } + + @Override + public DackFaydenEmblemEffect copy() { + return new DackFaydenEmblemEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + for (UUID permanentId : fixedTargets.getTargets(game, source)) { + Permanent permanent = game.getPermanent(permanentId); + if (permanent != null) { + permanent.changeControllerId(source.getControllerId(), game); + } + } + return true; + } + + public void setTargets(List targetedPermanents, Game game) { + this.fixedTargets = new FixedTargets(targetedPermanents, game); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/DarettiScrapSavantEmblem.java b/Mage/src/main/java/mage/game/command/emblems/DarettiScrapSavantEmblem.java new file mode 100644 index 00000000000..1e37bf8c611 --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/DarettiScrapSavantEmblem.java @@ -0,0 +1,132 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; +import mage.cards.Card; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.command.Emblem; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.events.ZoneChangeEvent; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author spjspj + */ +public class DarettiScrapSavantEmblem extends Emblem { + // You get an emblem with "Whenever an artifact is put into your graveyard from the battlefield, return that card to the battlefield at the beginning of the next end step." + + public DarettiScrapSavantEmblem() { + setName("Emblem Daretti"); + this.setExpansionSetCodeForImage("C14"); + + + this.getAbilities().add(new DarettiScrapSavantTriggeredAbility()); + } +} + +class DarettiScrapSavantTriggeredAbility extends TriggeredAbilityImpl { + + DarettiScrapSavantTriggeredAbility() { + super(Zone.COMMAND, new DarettiScrapSavantEffect(), false); + } + + DarettiScrapSavantTriggeredAbility(final DarettiScrapSavantTriggeredAbility ability) { + super(ability); + } + + @Override + public DarettiScrapSavantTriggeredAbility copy() { + return new DarettiScrapSavantTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.ZONE_CHANGE; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + ZoneChangeEvent zEvent = (ZoneChangeEvent) event; + if (zEvent.getToZone() == Zone.GRAVEYARD + && zEvent.getFromZone() == Zone.BATTLEFIELD + && zEvent.getTarget().isArtifact() + && zEvent.getTarget().getOwnerId().equals(this.controllerId)) { + for (Effect effect : this.getEffects()) { + effect.setTargetPointer(new FixedTarget(zEvent.getTargetId())); + } + return true; + } + return false; + } + + @Override + public String getRule() { + return "Whenever an artifact is put into your graveyard from the battlefield, " + super.getRule(); + } +} + +class DarettiScrapSavantEffect extends OneShotEffect { + + DarettiScrapSavantEffect() { + super(Outcome.PutCardInPlay); + this.staticText = "return that card to the battlefield at the beginning of the next end step"; + } + + DarettiScrapSavantEffect(final DarettiScrapSavantEffect effect) { + super(effect); + } + + @Override + public DarettiScrapSavantEffect copy() { + return new DarettiScrapSavantEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Card card = game.getCard(getTargetPointer().getFirst(game, source)); + if (card != null && game.getState().getZone(card.getId()) == Zone.GRAVEYARD) { + Effect effect = new ReturnFromGraveyardToBattlefieldTargetEffect(); + effect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game))); + effect.setText("return that card to the battlefield at the beginning of the next end step"); + game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(Zone.COMMAND, effect, TargetController.ANY), source); + return true; + } + return false; + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/DomriRadeEmblem.java b/Mage/src/main/java/mage/game/command/emblems/DomriRadeEmblem.java new file mode 100644 index 00000000000..481858a0502 --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/DomriRadeEmblem.java @@ -0,0 +1,63 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.DoubleStrikeAbility; +import mage.abilities.keyword.HasteAbility; +import mage.abilities.keyword.HexproofAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.game.command.Emblem; + +/** + * + * @author spjspj + */ +public class DomriRadeEmblem extends Emblem { + // "Creatures you control have double strike, trample, hexproof and haste." + + public DomriRadeEmblem() { + this.setName("Emblem Domri"); + FilterPermanent filter = new FilterControlledCreaturePermanent("Creatures"); + GainAbilityControlledEffect effect = new GainAbilityControlledEffect(DoubleStrikeAbility.getInstance(), Duration.EndOfGame, filter); + Ability ability = new SimpleStaticAbility(Zone.COMMAND, effect); + effect = new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.EndOfGame, filter); + ability.addEffect(effect); + effect = new GainAbilityControlledEffect(HexproofAbility.getInstance(), Duration.EndOfGame, filter); + ability.addEffect(effect); + effect = new GainAbilityControlledEffect(HasteAbility.getInstance(), Duration.EndOfGame, filter); + ability.addEffect(effect); + this.getAbilities().add(ability); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/DovinBaanEmblem.java b/Mage/src/main/java/mage/game/command/emblems/DovinBaanEmblem.java new file mode 100644 index 00000000000..6df0e451c2f --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/DovinBaanEmblem.java @@ -0,0 +1,73 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.RestrictionUntapNotMoreThanEffect; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.filter.common.FilterControlledPermanent; +import mage.game.Game; +import mage.game.command.Emblem; +import mage.players.Player; + +/** + * + * @author spjspj + */ +public class DovinBaanEmblem extends Emblem { + + public DovinBaanEmblem() { + this.setName("Emblem Dovin"); + Ability ability = new SimpleStaticAbility(Zone.COMMAND, new DovinBaanCantUntapEffect()); + this.getAbilities().add(ability); + } +} + +class DovinBaanCantUntapEffect extends RestrictionUntapNotMoreThanEffect { + + DovinBaanCantUntapEffect() { + super(Duration.WhileOnBattlefield, 2, new FilterControlledPermanent()); + staticText = "Your opponents can't untap more than two permanents during their untap steps."; + } + + DovinBaanCantUntapEffect(final DovinBaanCantUntapEffect effect) { + super(effect); + } + + @Override + public boolean applies(Player player, Ability source, Game game) { + return game.getOpponents(source.getControllerId()).contains(player.getId()); + } + + @Override + public DovinBaanCantUntapEffect copy() { + return new DovinBaanCantUntapEffect(this); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/ElspethKnightErrantEmblem.java b/Mage/src/main/java/mage/game/command/emblems/ElspethKnightErrantEmblem.java new file mode 100644 index 00000000000..41e24fb0942 --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/ElspethKnightErrantEmblem.java @@ -0,0 +1,61 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.GainAbilityAllEffect; +import mage.abilities.keyword.IndestructibleAbility; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.command.Emblem; + +/** + * + * @author spjspj + */ +public class ElspethKnightErrantEmblem extends Emblem { + + public ElspethKnightErrantEmblem() { + this.setName("Emblem Elspeth"); + FilterControlledPermanent filter = new FilterControlledPermanent("Artifacts, creatures, enchantments, and lands you control"); + filter.add(Predicates.or( + new CardTypePredicate(CardType.ARTIFACT), + new CardTypePredicate(CardType.CREATURE), + new CardTypePredicate(CardType.ENCHANTMENT), + new CardTypePredicate(CardType.LAND))); + Effect effect = new GainAbilityAllEffect(IndestructibleAbility.getInstance(), Duration.WhileOnBattlefield, filter, false); + effect.setText("Artifacts, creatures, enchantments, and lands you control are indestructible"); + this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, effect)); + this.setExpansionSetCodeForImage("MMA"); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/ElspethSunsChampionEmblem.java b/Mage/src/main/java/mage/game/command/emblems/ElspethSunsChampionEmblem.java new file mode 100644 index 00000000000..20ad19457ae --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/ElspethSunsChampionEmblem.java @@ -0,0 +1,56 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.command.Emblem; + +/** + * + * @author spjspj + */ +public class ElspethSunsChampionEmblem extends Emblem { + // -7: You get an emblem with "Creatures you control get +2/+2 and have flying." + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures"); + + public ElspethSunsChampionEmblem() { + this.setName("Emblem Elspeth"); + Ability ability = new SimpleStaticAbility(Zone.COMMAND, new BoostControlledEffect(2, 2, Duration.EndOfGame, filter, false)); + ability.addEffect(new GainAbilityControlledEffect(FlyingAbility.getInstance(), Duration.EndOfGame, filter)); + this.getAbilities().add(ability); + + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/GarrukApexPredatorEmblem.java b/Mage/src/main/java/mage/game/command/emblems/GarrukApexPredatorEmblem.java new file mode 100644 index 00000000000..a111599a32f --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/GarrukApexPredatorEmblem.java @@ -0,0 +1,62 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.Ability; +import mage.abilities.common.AttackedByCreatureTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.BoostTargetEffect; +import mage.abilities.effects.common.continuous.GainAbilityTargetEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.constants.Duration; +import mage.constants.SetTargetPointer; +import mage.constants.Zone; +import mage.game.command.Emblem; + +/** + * + * @author spjspj + */ +public class GarrukApexPredatorEmblem extends Emblem { + + /** + * Emblem with "Whenever a creature attacks you, it gets +5/+5 and gains + * trample until end of turn." + */ + + public GarrukApexPredatorEmblem() { + setName("Emblem Garruk"); + Effect effect = new BoostTargetEffect(5, 5, Duration.EndOfTurn); + effect.setText("it gets +5/+5"); + Ability ability = new AttackedByCreatureTriggeredAbility(Zone.COMMAND, effect, false, SetTargetPointer.PERMANENT); + effect = new GainAbilityTargetEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, + "and gains trample until end of turn"); + ability.addEffect(effect); + this.getAbilities().add(ability); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/GarrukCallerOfBeastsEmblem.java b/Mage/src/main/java/mage/game/command/emblems/GarrukCallerOfBeastsEmblem.java new file mode 100644 index 00000000000..7c2e5395bf8 --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/GarrukCallerOfBeastsEmblem.java @@ -0,0 +1,58 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.Ability; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.StaticFilters; +import mage.filter.common.FilterCreatureCard; +import mage.game.command.Emblem; +import mage.target.common.TargetCardInLibrary; + +/** + * + * @author spjspj + */ +public class GarrukCallerOfBeastsEmblem extends Emblem { + + /** + * Emblem: "Whenever you cast a creature spell, you may search your library + * for a creature card, put it onto the battlefield, then shuffle your + * library." + */ + public GarrukCallerOfBeastsEmblem() { + this.setName("Emblem Garruk"); + Effect effect = new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(new FilterCreatureCard("creature card")), false, true, Outcome.PutCreatureInPlay); + Ability ability = new SpellCastControllerTriggeredAbility(Zone.COMMAND, effect, StaticFilters.FILTER_SPELL_A_CREATURE, true, false); + this.getAbilities().add(ability); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/GideonAllyOfZendikarEmblem.java b/Mage/src/main/java/mage/game/command/emblems/GideonAllyOfZendikarEmblem.java new file mode 100644 index 00000000000..375283f7983 --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/GideonAllyOfZendikarEmblem.java @@ -0,0 +1,50 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.game.command.Emblem; + +/** + * + * @author spjspj + */ +public class GideonAllyOfZendikarEmblem extends Emblem { + + public GideonAllyOfZendikarEmblem() { + this.setName("Emblem Gideon"); + BoostControlledEffect effect = new BoostControlledEffect(1, 1, Duration.EndOfGame); + Ability ability = new SimpleStaticAbility(Zone.COMMAND, effect); + this.getAbilities().add(ability); + this.setExpansionSetCodeForImage("BFZ"); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/GideonOfTheTrialsEmblem.java b/Mage/src/main/java/mage/game/command/emblems/GideonOfTheTrialsEmblem.java new file mode 100644 index 00000000000..1a167019db8 --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/GideonOfTheTrialsEmblem.java @@ -0,0 +1,92 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.common.FilterPlaneswalkerPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.Game; +import mage.game.command.Emblem; +import mage.game.events.GameEvent; + +/** + * + * @author spjspj + */ +public class GideonOfTheTrialsEmblem extends Emblem { + + public GideonOfTheTrialsEmblem() { + this.setName("Emblem - Gideon of the Trials"); + Ability ability = new SimpleStaticAbility(Zone.COMMAND, new GideonOfTheTrialsCantLoseEffect()); + this.getAbilities().add(ability); + } +} + +class GideonOfTheTrialsCantLoseEffect extends ContinuousRuleModifyingEffectImpl { + + private static final FilterPlaneswalkerPermanent filter = new FilterPlaneswalkerPermanent("a Gideon planeswalker"); + + static { + filter.add(new SubtypePredicate("Gideon")); + } + + public GideonOfTheTrialsCantLoseEffect() { + super(Duration.EndOfGame, Outcome.Benefit); + staticText = "As long as you control a Gideon planeswalker, you can't lose the game and your opponents can't win the game"; + } + + public GideonOfTheTrialsCantLoseEffect(final GideonOfTheTrialsCantLoseEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if ((event.getType() == GameEvent.EventType.WINS && game.getOpponents(source.getControllerId()).contains(event.getPlayerId())) + || (event.getType() == GameEvent.EventType.LOSES && event.getPlayerId().equals(source.getControllerId()))) { + if (game.getBattlefield().contains(filter, source.getControllerId(), 1, game)) { + return true; + } + } + return false; + } + + @Override + public GideonOfTheTrialsCantLoseEffect copy() { + return new GideonOfTheTrialsCantLoseEffect(this); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/JaceTelepathUnboundEmblem.java b/Mage/src/main/java/mage/game/command/emblems/JaceTelepathUnboundEmblem.java new file mode 100644 index 00000000000..d7d9b323650 --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/JaceTelepathUnboundEmblem.java @@ -0,0 +1,54 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.Ability; +import mage.abilities.common.SpellCastControllerTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.PutTopCardOfLibraryIntoGraveTargetEffect; +import mage.constants.Zone; +import mage.filter.FilterSpell; +import mage.game.command.Emblem; +import mage.target.common.TargetOpponent; + +/** + * + * @author spjspj + */ +public class JaceTelepathUnboundEmblem extends Emblem { + // You get an emblem with "Whenever you cast a spell, target opponent puts the top five cards of his or her library into his or her graveyard". + + public JaceTelepathUnboundEmblem() { + this.setName("Emblem Jace"); + Effect effect = new PutTopCardOfLibraryIntoGraveTargetEffect(5); + effect.setText("target opponent puts the top five cards of his or her library into his or her graveyard"); + Ability ability = new SpellCastControllerTriggeredAbility(Zone.COMMAND, effect, new FilterSpell("a spell"), false, false); + ability.addTarget(new TargetOpponent()); + getAbilities().add(ability); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/JaceUnravelerOfSecretsEmblem.java b/Mage/src/main/java/mage/game/command/emblems/JaceUnravelerOfSecretsEmblem.java new file mode 100644 index 00000000000..197d25f7940 --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/JaceUnravelerOfSecretsEmblem.java @@ -0,0 +1,98 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import java.util.List; +import mage.abilities.common.SpellCastOpponentTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.CounterTargetEffect; +import mage.constants.Zone; +import mage.filter.FilterSpell; +import mage.game.Game; +import mage.game.command.Emblem; +import mage.game.events.GameEvent; +import mage.game.stack.Spell; +import mage.target.targetpointer.FixedTarget; +import mage.watchers.common.SpellsCastWatcher; + +/** + * + * @author spjspj + */ +public class JaceUnravelerOfSecretsEmblem extends Emblem { + + /** + * Emblem: "Whenever an opponent casts his or her first spell each turn, + * counter that spell." + */ + public JaceUnravelerOfSecretsEmblem() { + this.setName("Emblem Jace"); + setExpansionSetCodeForImage("SOI"); + Effect effect = new CounterTargetEffect(); + effect.setText("counter that spell"); + this.getAbilities().add(new JaceUnravelerOfSecretsTriggeredAbility(effect, false)); + } +} + +class JaceUnravelerOfSecretsTriggeredAbility extends SpellCastOpponentTriggeredAbility { + + public JaceUnravelerOfSecretsTriggeredAbility(Effect effect, boolean optional) { + super(Zone.COMMAND, effect, new FilterSpell(), optional); + } + + public JaceUnravelerOfSecretsTriggeredAbility(SpellCastOpponentTriggeredAbility ability) { + super(ability); + } + + @Override + public SpellCastOpponentTriggeredAbility copy() { + return new JaceUnravelerOfSecretsTriggeredAbility(this); + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (super.checkTrigger(event, game)) { + SpellsCastWatcher watcher = (SpellsCastWatcher) game.getState().getWatchers().get(SpellsCastWatcher.class.getSimpleName()); + if (watcher != null) { + List spells = watcher.getSpellsCastThisTurn(event.getPlayerId()); + if (spells != null && spells.size() == 1) { + for (Effect effect : getEffects()) { + effect.setTargetPointer(new FixedTarget(event.getTargetId())); + } + return true; + } + } + } + return false; + } + + @Override + public String getRule() { + return "Whenever an opponent casts his or her first spell each turn, counter that spell."; + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/KioraEmblem.java b/Mage/src/main/java/mage/game/command/emblems/KioraEmblem.java new file mode 100644 index 00000000000..4ac9cb90b74 --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/KioraEmblem.java @@ -0,0 +1,54 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfEndStepTriggeredAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.game.command.Emblem; +import mage.game.permanent.token.KioraKrakenToken; + +/** + * + * @author spjspj + */ +public class KioraEmblem extends Emblem { + + /** + * Emblem: "At the beginning of your end step, create a 9/9 blue Kraken + * creature token." + */ + + public KioraEmblem() { + this.setName("Emblem Kiora"); + Ability ability = new BeginningOfEndStepTriggeredAbility(Zone.COMMAND, new CreateTokenEffect(new KioraKrakenToken()), TargetController.YOU, null, false); + this.getAbilities().add(ability); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/KioraMasterOfTheDepthsEmblem.java b/Mage/src/main/java/mage/game/command/emblems/KioraMasterOfTheDepthsEmblem.java new file mode 100644 index 00000000000..a7eed657d6b --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/KioraMasterOfTheDepthsEmblem.java @@ -0,0 +1,90 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldControlledTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.constants.Outcome; +import mage.constants.SetTargetPointer; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.game.command.Emblem; +import mage.game.permanent.Permanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author spjspj + */ +public class KioraMasterOfTheDepthsEmblem extends Emblem { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures"); + + public KioraMasterOfTheDepthsEmblem() { + this.setName("Emblem Kiora"); + + Ability ability = new EntersBattlefieldControlledTriggeredAbility(Zone.COMMAND, + new KioraFightEffect(), filter, true, SetTargetPointer.PERMANENT, + "Whenever a creature enters the battlefield under your control, you may have it fight target creature."); + ability.addTarget(new TargetCreaturePermanent()); + this.getAbilities().add(ability); + this.setExpansionSetCodeForImage("BFZ"); + } +} + +class KioraFightEffect extends OneShotEffect { + + KioraFightEffect() { + super(Outcome.Damage); + } + + KioraFightEffect(final KioraFightEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent triggeredCreature = game.getPermanent(getTargetPointer().getFirst(game, source)); + Permanent target = game.getPermanent(source.getFirstTarget()); + if (triggeredCreature != null + && target != null + && triggeredCreature.isCreature() + && target.isCreature()) { + triggeredCreature.fight(target, source, game); + return true; + } + return false; + } + + @Override + public KioraFightEffect copy() { + return new KioraFightEffect(this); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/KothOfTheHammerEmblem.java b/Mage/src/main/java/mage/game/command/emblems/KothOfTheHammerEmblem.java new file mode 100644 index 00000000000..67c125adfd5 --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/KothOfTheHammerEmblem.java @@ -0,0 +1,113 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.constants.Duration; +import mage.constants.Layer; +import static mage.constants.Layer.AbilityAddingRemovingEffects_6; +import mage.constants.Outcome; +import mage.constants.SubLayer; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.game.Game; +import mage.game.command.Emblem; +import mage.game.permanent.Permanent; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author spjspj + */ +public class KothOfTheHammerEmblem extends Emblem { + // "Mountains you control have '{T}: This land deals 1 damage to target creature or player.'" + + public KothOfTheHammerEmblem() { + this.setName("Emblem Koth"); + this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, new KothOfTheHammerThirdEffect())); + } +} + +class KothOfTheHammerThirdEffect extends ContinuousEffectImpl { + + static final FilterLandPermanent mountains = new FilterLandPermanent("Mountain you control"); + + static { + mountains.add(new SubtypePredicate("Mountain")); + mountains.add(new ControllerPredicate(TargetController.YOU)); + } + + public KothOfTheHammerThirdEffect() { + super(Duration.EndOfGame, Outcome.AddAbility); + staticText = "You get an emblem with \"Mountains you control have '{T}: This land deals 1 damage to target creature or player.'\""; + } + + public KothOfTheHammerThirdEffect(final KothOfTheHammerThirdEffect effect) { + super(effect); + } + + @Override + public boolean apply(Layer layer, SubLayer sublayer, Ability source, Game game) { + switch (layer) { + case AbilityAddingRemovingEffects_6: + if (sublayer == SubLayer.NA) { + for (Permanent permanent : game.getBattlefield().getActivePermanents(mountains, source.getControllerId(), source.getSourceId(), game)) { + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(1), new TapSourceCost()); + ability.addTarget(new TargetCreatureOrPlayer()); + permanent.addAbility(ability, source.getSourceId(), game); + } + } + break; + } + return true; + } + + @Override + public boolean apply(Game game, Ability source) { + return false; + } + + @Override + public KothOfTheHammerThirdEffect copy() { + return new KothOfTheHammerThirdEffect(this); + } + + @Override + public boolean hasLayer(Layer layer) { + return layer == Layer.AbilityAddingRemovingEffects_6; + } + +} diff --git a/Mage/src/main/java/mage/game/command/emblems/LilianaDefiantNecromancerEmblem.java b/Mage/src/main/java/mage/game/command/emblems/LilianaDefiantNecromancerEmblem.java new file mode 100644 index 00000000000..a5c99a7d712 --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/LilianaDefiantNecromancerEmblem.java @@ -0,0 +1,89 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.Ability; +import mage.abilities.common.DiesCreatureTriggeredAbility; +import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; +import mage.cards.Card; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.game.command.Emblem; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author spjspj + */ +public class LilianaDefiantNecromancerEmblem extends Emblem { + // You get an emblem with "Whenever a creature you control dies, return it to the battlefield under your control at the beginning of the next end step." + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("a creature"); + + public LilianaDefiantNecromancerEmblem() { + this.setName("Emblem Liliana"); + Ability ability = new DiesCreatureTriggeredAbility(Zone.COMMAND, new LilianaDefiantNecromancerEmblemEffect(), false, filter, true); + this.getAbilities().add(ability); + } +} + +class LilianaDefiantNecromancerEmblemEffect extends OneShotEffect { + + LilianaDefiantNecromancerEmblemEffect() { + super(Outcome.PutCardInPlay); + this.staticText = "return it to the battlefield under your control at the beginning of the next end step"; + } + + LilianaDefiantNecromancerEmblemEffect(final LilianaDefiantNecromancerEmblemEffect effect) { + super(effect); + } + + @Override + public LilianaDefiantNecromancerEmblemEffect copy() { + return new LilianaDefiantNecromancerEmblemEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Card card = game.getCard(getTargetPointer().getFirst(game, source)); + if (card != null) { + Effect effect = new ReturnFromGraveyardToBattlefieldTargetEffect(); + effect.setTargetPointer(new FixedTarget(card.getId(), card.getZoneChangeCounter(game))); + effect.setText("return that card to the battlefield at the beginning of the next end step"); + game.addDelayedTriggeredAbility(new AtTheBeginOfNextEndStepDelayedTriggeredAbility(Zone.COMMAND, effect, TargetController.ANY), source); + return true; + } + return false; + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/LilianaOfTheDarkRealmsEmblem.java b/Mage/src/main/java/mage/game/command/emblems/LilianaOfTheDarkRealmsEmblem.java new file mode 100644 index 00000000000..c7231a43660 --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/LilianaOfTheDarkRealmsEmblem.java @@ -0,0 +1,60 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.Mana; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.mana.SimpleManaAbility; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.command.Emblem; + +/** + * + * @author spjspj + */ +public class LilianaOfTheDarkRealmsEmblem extends Emblem { + + private static final FilterLandPermanent filter = new FilterLandPermanent("Swamps"); + + static { + filter.add(new SubtypePredicate("Swamp")); + } + + public LilianaOfTheDarkRealmsEmblem() { + this.setName("Emblem Liliana"); + SimpleManaAbility manaAbility = new SimpleManaAbility(Zone.BATTLEFIELD, Mana.BlackMana(4), new TapSourceCost()); + Ability ability = new SimpleStaticAbility(Zone.COMMAND, new GainAbilityControlledEffect(manaAbility, Duration.WhileOnBattlefield, filter)); + this.getAbilities().add(ability); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/LilianaTheLastHopeEmblem.java b/Mage/src/main/java/mage/game/command/emblems/LilianaTheLastHopeEmblem.java new file mode 100644 index 00000000000..aa52f16db0b --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/LilianaTheLastHopeEmblem.java @@ -0,0 +1,85 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfEndStepTriggeredAbility; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.Game; +import mage.game.command.Emblem; +import mage.game.permanent.token.ZombieToken; + +/** + * + * @author spjspj + */ +public class LilianaTheLastHopeEmblem extends Emblem { + + public LilianaTheLastHopeEmblem() { + this.setName("Emblem Liliana"); + Ability ability = new BeginningOfEndStepTriggeredAbility(Zone.COMMAND, new CreateTokenEffect(new ZombieToken(), new LilianaZombiesCount()), + TargetController.YOU, null, false); + this.getAbilities().add(ability); + } +} + +class LilianaZombiesCount implements DynamicValue { + + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent(); + + static { + filter.add(new SubtypePredicate("Zombie")); + } + + @Override + public int calculate(Game game, Ability sourceAbility, Effect effect) { + int amount = game.getBattlefield().countAll(filter, sourceAbility.getControllerId(), game) + 2; + return amount; + } + + @Override + public DynamicValue copy() { + return new LilianaZombiesCount(); + } + + @Override + public String toString() { + return "X"; + } + + @Override + public String getMessage() { + return "two plus the number of Zombies you control"; + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/MomirEmblem.java b/Mage/src/main/java/mage/game/command/emblems/MomirEmblem.java new file mode 100644 index 00000000000..4cae958c65e --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/MomirEmblem.java @@ -0,0 +1,116 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import java.util.List; +import mage.abilities.Ability; +import mage.abilities.common.LimitedTimesPerTurnActivatedAbility; +import mage.abilities.costs.common.DiscardCardCost; +import mage.abilities.costs.mana.VariableManaCost; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.ExpansionSet; +import mage.cards.Sets; +import mage.cards.repository.CardCriteria; +import mage.cards.repository.CardInfo; +import mage.cards.repository.CardRepository; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SetType; +import mage.constants.TimingRule; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.command.Emblem; +import mage.game.permanent.token.EmptyToken; +import mage.util.CardUtil; +import mage.util.RandomUtil; + +/** + * + * @author spjspj + */ +public class MomirEmblem extends Emblem { + // Faking Vanguard as an Emblem; need to come back to this and add a new type of CommandObject + + public MomirEmblem() { + setName("Emblem Momir Vig, Simic Visionary"); + setExpansionSetCodeForImage("DIS"); + // {X}, Discard a card: Put a token into play as a copy of a random creature card with converted mana cost X. Play this ability only any time you could play a sorcery and only once each turn. + LimitedTimesPerTurnActivatedAbility ability = new LimitedTimesPerTurnActivatedAbility(Zone.COMMAND, new MomirEffect(), new VariableManaCost()); + ability.addCost(new DiscardCardCost()); + ability.setTiming(TimingRule.SORCERY); + this.getAbilities().add(ability); + + } +} + +class MomirEffect extends OneShotEffect { + + public MomirEffect() { + super(Outcome.PutCreatureInPlay); + } + + public MomirEffect(MomirEffect effect) { + super(effect); + staticText = "Put a token into play as a copy of a random creature card with converted mana cost X"; + } + + @Override + public MomirEffect copy() { + return new MomirEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + int value = source.getManaCostsToPay().getX(); + // should this be random across card names, or card printings? + CardCriteria criteria = new CardCriteria().types(CardType.CREATURE).convertedManaCost(value); + List options = CardRepository.instance.findCards(criteria); + if (options == null || options.isEmpty()) { + game.informPlayers("No random creature card with converted mana cost of " + value + " was found."); + return false; + } + EmptyToken token = new EmptyToken(); // search for a non custom set creature + while (token.getName().isEmpty() && !options.isEmpty()) { + int index = RandomUtil.nextInt(options.size()); + ExpansionSet expansionSet = Sets.findSet(options.get(index).getSetCode()); + if (expansionSet == null || expansionSet.getSetType() == SetType.CUSTOM_SET) { + options.remove(index); + } else { + Card card = options.get(index).getCard(); + if (card != null) { + CardUtil.copyTo(token).from(card); + } else { + options.remove(index); + } + } + } + token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId(), false, false); + return true; + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/NarsetTranscendentEmblem.java b/Mage/src/main/java/mage/game/command/emblems/NarsetTranscendentEmblem.java new file mode 100644 index 00000000000..d41e4084cc7 --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/NarsetTranscendentEmblem.java @@ -0,0 +1,104 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; +import mage.cards.Card; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.command.Emblem; +import mage.game.events.GameEvent; +import mage.players.Player; + +/** + * + * @author spjspj + */ +public class NarsetTranscendentEmblem extends Emblem { + + // "Your opponents can't cast noncreature spells. + public NarsetTranscendentEmblem() { + + this.setName("Emblem Narset"); + + this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, new NarsetTranscendentCantCastEffect())); + } +} + +class NarsetTranscendentCantCastEffect extends ContinuousRuleModifyingEffectImpl { + + public NarsetTranscendentCantCastEffect() { + super(Duration.EndOfGame, Outcome.Benefit); + staticText = "Your opponents can't cast noncreature spells"; + } + + public NarsetTranscendentCantCastEffect(final NarsetTranscendentCantCastEffect effect) { + super(effect); + } + + @Override + public NarsetTranscendentCantCastEffect copy() { + return new NarsetTranscendentCantCastEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public String getInfoMessage(Ability source, GameEvent event, Game game) { + MageObject mageObject = game.getObject(source.getSourceId()); + if (mageObject != null) { + return "You can't cast can't cast noncreature spells (it is prevented by emblem of " + mageObject.getLogName() + ')'; + } + return null; + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.CAST_SPELL; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null && controller.hasOpponent(event.getPlayerId(), game)) { + Card card = game.getCard(event.getSourceId()); + if (card != null && !card.isCreature()) { + return true; + } + } + return false; + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/NissaVitalForceEmblem.java b/Mage/src/main/java/mage/game/command/emblems/NissaVitalForceEmblem.java new file mode 100644 index 00000000000..99e73756c41 --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/NissaVitalForceEmblem.java @@ -0,0 +1,50 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldAllTriggeredAbility; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.constants.Zone; +import mage.filter.common.FilterControlledLandPermanent; +import mage.game.command.Emblem; + +/** + * + * @author spjspj + */ +public class NissaVitalForceEmblem extends Emblem { + // You get an emblem with "Whenever a land enters the battlefield under your control, you may draw a card." + + public NissaVitalForceEmblem() { + this.setName("Emblem Nissa"); + Ability ability = new EntersBattlefieldAllTriggeredAbility(Zone.COMMAND, new DrawCardSourceControllerEffect(1), new FilterControlledLandPermanent("a land"), + true, null, true); + getAbilities().add(ability); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/ObNixilisOfTheBlackOathEmblem.java b/Mage/src/main/java/mage/game/command/emblems/ObNixilisOfTheBlackOathEmblem.java new file mode 100644 index 00000000000..9b45cf007d8 --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/ObNixilisOfTheBlackOathEmblem.java @@ -0,0 +1,62 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.SacrificeCostCreaturesPower; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.constants.Zone; +import mage.game.command.Emblem; +import mage.target.common.TargetControlledCreaturePermanent; + +/** + * + * @author spjspj + */ +public class ObNixilisOfTheBlackOathEmblem extends Emblem { + + // You get an emblem with "{1}{B}, Sacrifice a creature: You gain X life and draw X cards, where X is the sacrificed creature's power." + public ObNixilisOfTheBlackOathEmblem() { + this.setName("Emblem Nixilis"); + DynamicValue xValue = new SacrificeCostCreaturesPower(); + Effect effect = new GainLifeEffect(xValue); + effect.setText("You gain X life"); + Ability ability = new SimpleActivatedAbility(Zone.COMMAND, effect, new ManaCostsImpl("{1}{B}")); + ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent())); + effect = new DrawCardSourceControllerEffect(xValue); + effect.setText("and draw X cards, where X is the sacrificed creature's power"); + ability.addEffect(effect); + this.getAbilities().add(ability); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/ObNixilisReignitedEmblem.java b/Mage/src/main/java/mage/game/command/emblems/ObNixilisReignitedEmblem.java new file mode 100644 index 00000000000..78a6297451a --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/ObNixilisReignitedEmblem.java @@ -0,0 +1,82 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.LoseLifeSourceControllerEffect; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.command.Emblem; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; + +/** + * + * @author spjspj + */ +public class ObNixilisReignitedEmblem extends Emblem { + + public ObNixilisReignitedEmblem() { + setName("Emblem Nixilis"); + + this.getAbilities().add(new ObNixilisEmblemTriggeredAbility(new LoseLifeSourceControllerEffect(2), false)); + this.setExpansionSetCodeForImage("BFZ"); + } +} + +class ObNixilisEmblemTriggeredAbility extends TriggeredAbilityImpl { + + public ObNixilisEmblemTriggeredAbility(Effect effect, boolean optional) { + super(Zone.COMMAND, effect, optional); + } + + public ObNixilisEmblemTriggeredAbility(final ObNixilisEmblemTriggeredAbility ability) { + super(ability); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.DREW_CARD; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + return event.getPlayerId() != null; + } + + @Override + public String getRule() { + return "Whenever a player draws a card, you lose 2 life."; + } + + @Override + public ObNixilisEmblemTriggeredAbility copy() { + return new ObNixilisEmblemTriggeredAbility(this); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/ObiWanKenobiEmblem.java b/Mage/src/main/java/mage/game/command/emblems/ObiWanKenobiEmblem.java new file mode 100644 index 00000000000..7cd4449311f --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/ObiWanKenobiEmblem.java @@ -0,0 +1,64 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.abilities.keyword.LifelinkAbility; +import mage.abilities.keyword.VigilanceAbility; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.game.command.Emblem; + +/** + * + * @author spjspj + */ +public class ObiWanKenobiEmblem extends Emblem { + + // Creatures you control get +1/+1 and have vigilance, first strike, and lifelink + public ObiWanKenobiEmblem() { + this.setName("Emblem Obi-Wan Kenobi"); + this.setExpansionSetCodeForImage("SWS"); + Ability ability = new SimpleStaticAbility(Zone.COMMAND, new BoostControlledEffect(1, 1, Duration.EndOfGame)); + Effect effect = new GainAbilityControlledEffect(VigilanceAbility.getInstance(), Duration.EndOfGame); + effect.setText("and have vigilance"); + ability.addEffect(effect); + effect = new GainAbilityControlledEffect(FirstStrikeAbility.getInstance(), Duration.WhileOnBattlefield); + effect.setText(", first strike"); + ability.addEffect(effect); + effect = new GainAbilityControlledEffect(LifelinkAbility.getInstance(), Duration.WhileOnBattlefield); + effect.setText("and lifelink."); + ability.addEffect(effect); + getAbilities().add(ability); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/SarkhanTheDragonspeakerEmblem.java b/Mage/src/main/java/mage/game/command/emblems/SarkhanTheDragonspeakerEmblem.java new file mode 100644 index 00000000000..a4851382a3b --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/SarkhanTheDragonspeakerEmblem.java @@ -0,0 +1,51 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.common.BeginningOfDrawTriggeredAbility; +import mage.abilities.common.BeginningOfEndStepTriggeredAbility; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.discard.DiscardHandControllerEffect; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.game.command.Emblem; + +/** + * + * @author spjspj + */ +public class SarkhanTheDragonspeakerEmblem extends Emblem { + + public SarkhanTheDragonspeakerEmblem() { + setName("Emblem Sarkhan"); + this.setExpansionSetCodeForImage("KTK"); + + this.getAbilities().add(new BeginningOfDrawTriggeredAbility(Zone.COMMAND, new DrawCardSourceControllerEffect(2), TargetController.YOU, false)); + this.getAbilities().add(new BeginningOfEndStepTriggeredAbility(Zone.COMMAND, new DiscardHandControllerEffect(), TargetController.YOU, null, false)); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/SorinLordOfInnistradEmblem.java b/Mage/src/main/java/mage/game/command/emblems/SorinLordOfInnistradEmblem.java new file mode 100644 index 00000000000..91162f6d1bf --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/SorinLordOfInnistradEmblem.java @@ -0,0 +1,49 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.game.command.Emblem; + +/** + * + * @author spjspj + */ +public class SorinLordOfInnistradEmblem extends Emblem { + + public SorinLordOfInnistradEmblem() { + this.setName("Emblem Sorin"); + BoostControlledEffect effect = new BoostControlledEffect(1, 0, Duration.EndOfGame); + Ability ability = new SimpleStaticAbility(Zone.COMMAND, effect); + this.getAbilities().add(ability); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/SorinSolemnVisitorEmblem.java b/Mage/src/main/java/mage/game/command/emblems/SorinSolemnVisitorEmblem.java new file mode 100644 index 00000000000..4aa35ee8b0d --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/SorinSolemnVisitorEmblem.java @@ -0,0 +1,54 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.effects.common.SacrificeEffect; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.command.Emblem; + +/** + * + * @author spjspj + */ +public class SorinSolemnVisitorEmblem extends Emblem { + + /** + * Emblem: "At the beginning of each opponent's upkeep, that player + * sacrifices a creature." + */ + + public SorinSolemnVisitorEmblem() { + this.setName("Emblem Sorin"); + Ability ability = new BeginningOfUpkeepTriggeredAbility(Zone.COMMAND, new SacrificeEffect(new FilterCreaturePermanent(), 1, "that player"), TargetController.OPPONENT, false, true); + this.getAbilities().add(ability); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/TamiyoFieldResearcherEmblem.java b/Mage/src/main/java/mage/game/command/emblems/TamiyoFieldResearcherEmblem.java new file mode 100644 index 00000000000..9216727a16c --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/TamiyoFieldResearcherEmblem.java @@ -0,0 +1,48 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ** + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continuous.CastFromHandWithoutPayingManaCostEffect; +import mage.constants.Zone; +import mage.game.command.Emblem; + +/* + * + * Author: spjspj + */ +public class TamiyoFieldResearcherEmblem extends Emblem { + // You may cast nonland cards from your hand without paying their mana costs. + + public TamiyoFieldResearcherEmblem() { + + this.setName("Emblem Tamiyo"); + + this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, new CastFromHandWithoutPayingManaCostEffect())); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/TamiyoTheMoonSageEmblem.java b/Mage/src/main/java/mage/game/command/emblems/TamiyoTheMoonSageEmblem.java new file mode 100644 index 00000000000..53f009216ef --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/TamiyoTheMoonSageEmblem.java @@ -0,0 +1,64 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + ** + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.Ability; +import mage.abilities.common.PutCardIntoGraveFromAnywhereAllTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.ReturnToHandTargetEffect; +import mage.abilities.effects.common.continuous.MaximumHandSizeControllerEffect; +import mage.abilities.effects.common.continuous.MaximumHandSizeControllerEffect.HandSizeModification; +import mage.constants.Duration; +import mage.constants.SetTargetPointer; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.game.command.Emblem; + +/** + * + * @author spjspj + */ +public class TamiyoTheMoonSageEmblem extends Emblem { + + /** + * Emblem with "You have no maximum hand size" and "Whenever a card is put + * into your graveyard from anywhere, you may return it to your hand." + */ + + public TamiyoTheMoonSageEmblem() { + this.setName("Emblem Tamiyo"); + Ability ability = new SimpleStaticAbility(Zone.COMMAND, new MaximumHandSizeControllerEffect(Integer.MAX_VALUE, Duration.EndOfGame, HandSizeModification.SET)); + this.getAbilities().add(ability); + Effect effect = new ReturnToHandTargetEffect(); + effect.setText("return it to your hand"); + this.getAbilities().add(new PutCardIntoGraveFromAnywhereAllTriggeredAbility( + Zone.COMMAND, effect, true, new FilterCard("a card"), TargetController.YOU, SetTargetPointer.CARD)); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/TeferiTemporalArchmageEmblem.java b/Mage/src/main/java/mage/game/command/emblems/TeferiTemporalArchmageEmblem.java new file mode 100644 index 00000000000..f45397ca14f --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/TeferiTemporalArchmageEmblem.java @@ -0,0 +1,47 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.LoyaltyAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continuous.ActivateAbilitiesAnyTimeYouCouldCastInstantEffect; +import mage.constants.Zone; +import mage.game.command.Emblem; + +/** + * + * @author spjspj + */ +public class TeferiTemporalArchmageEmblem extends Emblem { + // "You may activate loyalty abilities of planeswalkers you control on any player's turn any time you could cast an instant." + + public TeferiTemporalArchmageEmblem() { + this.setName("Emblem Teferi"); + this.getAbilities().add(new SimpleStaticAbility(Zone.COMMAND, new ActivateAbilitiesAnyTimeYouCouldCastInstantEffect(LoyaltyAbility.class, "loyalty abilities of planeswalkers you control on any player's turn"))); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/TezzeretTheSchemerEmblem.java b/Mage/src/main/java/mage/game/command/emblems/TezzeretTheSchemerEmblem.java new file mode 100644 index 00000000000..82cab888b4a --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/TezzeretTheSchemerEmblem.java @@ -0,0 +1,61 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfCombatTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.AddCardTypeTargetEffect; +import mage.abilities.effects.common.continuous.SetPowerToughnessTargetEffect; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterControlledArtifactPermanent; +import mage.game.command.Emblem; +import mage.target.TargetPermanent; + +/** + * + * @author spjspj + */ +public class TezzeretTheSchemerEmblem extends Emblem { + + public TezzeretTheSchemerEmblem() { + this.setName("Emblem Tezzeret"); + + Effect effect = new AddCardTypeTargetEffect(CardType.CREATURE, Duration.EndOfGame); + effect.setText("target artifact you control becomes an artifact creature"); + Ability ability = new BeginningOfCombatTriggeredAbility(Zone.COMMAND, effect, TargetController.YOU, false, true); + effect = new SetPowerToughnessTargetEffect(5, 5, Duration.EndOfGame); + effect.setText("with base power and toughness 5/5"); + ability.addEffect(effect); + ability.addTarget(new TargetPermanent(new FilterControlledArtifactPermanent())); + this.getAbilities().add(ability); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/VenserTheSojournerEmblem.java b/Mage/src/main/java/mage/game/command/emblems/VenserTheSojournerEmblem.java new file mode 100644 index 00000000000..5cb7aacd42d --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/VenserTheSojournerEmblem.java @@ -0,0 +1,114 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.constants.Zone; +import mage.filter.FilterSpell; +import mage.game.Game; +import mage.game.command.Emblem; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.stack.Spell; +import mage.target.Target; +import mage.target.TargetPermanent; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author spjspj + */ +public class VenserTheSojournerEmblem extends Emblem { + + /** + * Emblem: "Whenever you cast a spell, exile target permanent." + */ + + public VenserTheSojournerEmblem() { + this.setName("Emblem Venser"); + Ability ability = new VenserTheSojournerSpellCastTriggeredAbility(new ExileTargetEffect(), false); + Target target = new TargetPermanent(); + ability.addTarget(target); + this.getAbilities().add(ability); + } +} + +class VenserTheSojournerSpellCastTriggeredAbility extends TriggeredAbilityImpl { + + private static final FilterSpell spellCard = new FilterSpell("a spell"); + protected FilterSpell filter; + + /** + * If true, the source that triggered the ability will be set as target to + * effect. + */ + protected boolean rememberSource = false; + + public VenserTheSojournerSpellCastTriggeredAbility(Effect effect, boolean optional) { + super(Zone.COMMAND, effect, optional); + this.filter = spellCard; + } + + public VenserTheSojournerSpellCastTriggeredAbility(final VenserTheSojournerSpellCastTriggeredAbility ability) { + super(ability); + filter = ability.filter; + this.rememberSource = ability.rememberSource; + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == 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 (spell != null && filter.match(spell, game)) { + if (rememberSource) { + this.getEffects().get(0).setTargetPointer(new FixedTarget(spell.getId())); + } + return true; + } + } + return false; + } + + @Override + public String getRule() { + return "Whenever you cast a spell, exile target permanent."; + } + + @Override + public VenserTheSojournerSpellCastTriggeredAbility copy() { + return new VenserTheSojournerSpellCastTriggeredAbility(this); + } +} diff --git a/Mage/src/main/java/mage/game/command/emblems/YodaEmblem.java b/Mage/src/main/java/mage/game/command/emblems/YodaEmblem.java new file mode 100644 index 00000000000..eed2a734d16 --- /dev/null +++ b/Mage/src/main/java/mage/game/command/emblems/YodaEmblem.java @@ -0,0 +1,58 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ..AS IS.. AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.game.command.emblems; + +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.effects.common.continuous.GainAbilityControllerEffect; +import mage.abilities.keyword.HexproofAbility; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.command.Emblem; + +/** + * + * @author spjspj + */ +public class YodaEmblem extends Emblem { + // You get an emblem with "Hexproof, you and your creatures have." + + public YodaEmblem() { + this.setName("Emblem Yoda, Jedi Master"); + Effect effect = new GainAbilityControllerEffect(HexproofAbility.getInstance(), Duration.EndOfGame); + effect.setText("Hexproof, you"); + Ability ability = new SimpleStaticAbility(Zone.COMMAND, effect); + effect = new GainAbilityControlledEffect(HexproofAbility.getInstance(), Duration.EndOfGame, new FilterCreaturePermanent()); + effect.setText(" you and your creatures have"); + ability.addEffect(effect); + getAbilities().add(ability); + } +}