diff --git a/Mage.Sets/src/mage/cards/k/KydeleChosenOfKruphix.java b/Mage.Sets/src/mage/cards/k/KydeleChosenOfKruphix.java index d5dd21b70d7..d84d9c78778 100644 --- a/Mage.Sets/src/mage/cards/k/KydeleChosenOfKruphix.java +++ b/Mage.Sets/src/mage/cards/k/KydeleChosenOfKruphix.java @@ -56,7 +56,7 @@ public class KydeleChosenOfKruphix extends CardImpl { public KydeleChosenOfKruphix(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{G}{U}"); - + this.supertype.add("Legendary"); this.subtype.add("Human"); this.subtype.add("Wizard"); @@ -135,6 +135,9 @@ class CardsDrawnThisTurnWatcher extends Watcher { } public int getNumCardsDrawnThisTurn(UUID playerId) { + if (cardsDrawnThisTurn.get(playerId) == null) { + return 0; + } return cardsDrawnThisTurn.get(playerId).size(); } @@ -142,6 +145,7 @@ class CardsDrawnThisTurnWatcher extends Watcher { public void reset() { super.reset(); cardsDrawnThisTurn.clear(); + } @Override diff --git a/Mage.Sets/src/mage/cards/l/LudevicNecroAlchemist.java b/Mage.Sets/src/mage/cards/l/LudevicNecroAlchemist.java new file mode 100644 index 00000000000..29901f2d75a --- /dev/null +++ b/Mage.Sets/src/mage/cards/l/LudevicNecroAlchemist.java @@ -0,0 +1,140 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.l; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfEndStepTriggeredAbility; +import mage.abilities.condition.Condition; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.PartnerAbility; +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.players.Player; +import mage.players.PlayerList; +import mage.watchers.common.PlayerLostLifeWatcher; + +/** + * + * @author spjspj + */ +public class LudevicNecroAlchemist extends CardImpl { + + public LudevicNecroAlchemist(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{U}{R}"); + + this.supertype.add("Legendary"); + this.subtype.add("Human"); + this.subtype.add("Wizard"); + this.power = new MageInt(1); + this.toughness = new MageInt(4); + + // At the beginning of each player's end step, that player may draw a card if a player other than you lost life this turn. + this.addAbility(new BeginningOfEndStepTriggeredAbility(Zone.BATTLEFIELD, new LudevicNecroAlchemistEffect(), TargetController.ANY, new LudevicNecroAlchemistCondition(), false)); + + // Partner + this.addAbility(PartnerAbility.getInstance()); + } + + public LudevicNecroAlchemist(final LudevicNecroAlchemist card) { + super(card); + } + + @Override + public LudevicNecroAlchemist copy() { + return new LudevicNecroAlchemist(this); + } +} + +class LudevicNecroAlchemistCondition implements Condition { + + @Override + public boolean apply(Game game, Ability source) { + PlayerLostLifeWatcher watcher = (PlayerLostLifeWatcher) game.getState().getWatchers().get("PlayerLostLifeWatcher"); + UUID player = game.getActivePlayerId(); + PlayerList playerList = game.getState().getPlayerList().copy(); + Player currentPlayer = null; + UUID sourcePlayerId = source.getControllerId(); + Player firstPlayer = null; + if (playerList != null) { + firstPlayer = playerList.getCurrent(game); + currentPlayer = playerList.getNext(game); + } + + while (watcher != null && currentPlayer != null) { + if (currentPlayer != null && currentPlayer.getId() != sourcePlayerId && watcher.getLiveLost(currentPlayer.getId()) > 0) { + return true; + } + if (currentPlayer == firstPlayer) { + return false; + } + currentPlayer = playerList.getNext(game); + } + return false; + } + + public String toString() { + return "if a player other than you lost life this turn"; + } +} + +class LudevicNecroAlchemistEffect extends OneShotEffect { + + public LudevicNecroAlchemistEffect() { + super(Outcome.DrawCard); + staticText = "that player may draw a card if a player other than you lost life this turn"; + } + + public LudevicNecroAlchemistEffect(final LudevicNecroAlchemistEffect effect) { + super(effect); + } + + @Override + public LudevicNecroAlchemistEffect copy() { + return new LudevicNecroAlchemistEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + UUID playerId = game.getActivePlayerId(); + if (playerId != null) { + Player player = game.getPlayer(playerId); + if (player != null && player.chooseUse(outcome, "Draw a card?", source, game)) { + player.drawCards(1, game); + return true; + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/Commander2016.java b/Mage.Sets/src/mage/sets/Commander2016.java index 28916fb02fa..037cf8817ed 100644 --- a/Mage.Sets/src/mage/sets/Commander2016.java +++ b/Mage.Sets/src/mage/sets/Commander2016.java @@ -34,7 +34,7 @@ import mage.constants.SetType; /** * - * @author fireshoes + * @author fireshoeS */ public class Commander2016 extends ExpansionSet { @@ -200,7 +200,7 @@ public class Commander2016 extends ExpansionSet { cards.add(new SetCardInfo("In Garruk's Wake", 113, Rarity.RARE, mage.cards.i.InGarruksWake.class)); cards.add(new SetCardInfo("Inspiring Call", 153, Rarity.UNCOMMON, mage.cards.i.InspiringCall.class)); cards.add(new SetCardInfo("Iroas, God of Victory", 205, Rarity.MYTHIC, mage.cards.i.IroasGodOfVictory.class)); - cards.add(new SetCardInfo("Ishai, Ojutai Dragonspeaker", 33, Rarity.MYTHIC, mage.cards.i.IshaiOjutaiDragonspeaker.class)); + cards.add(new SetCardInfo("Ishai, Ojutai Dragonspeaker", 33, Rarity.MYTHIC, mage.cards.i.IshaiOjutaiDragonspeaker.class)); cards.add(new SetCardInfo("Island", 340, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true))); cards.add(new SetCardInfo("Island", 341, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true))); cards.add(new SetCardInfo("Island", 342, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(null, true))); @@ -215,7 +215,7 @@ public class Commander2016 extends ExpansionSet { cards.add(new SetCardInfo("Keening Stone", 259, Rarity.RARE, mage.cards.k.KeeningStone.class)); cards.add(new SetCardInfo("Kodama's Reach", 155, Rarity.COMMON, mage.cards.k.KodamasReach.class)); cards.add(new SetCardInfo("Korozda Guildmage", 208, Rarity.UNCOMMON, mage.cards.k.KorozdaGuildmage.class)); - cards.add(new SetCardInfo("Kraum, Ludevic's Opus", 34, Rarity.RARE, mage.cards.k.KraumLudevicsOpus.class)); + cards.add(new SetCardInfo("Kraum, Ludevic's Opus", 34, Rarity.RARE, mage.cards.k.KraumLudevicsOpus.class)); cards.add(new SetCardInfo("Krosan Verge", 306, Rarity.UNCOMMON, mage.cards.k.KrosanVerge.class)); cards.add(new SetCardInfo("Kydele, Chosen of Kruphix", 35, Rarity.MYTHIC, mage.cards.k.KydeleChosenOfKruphix.class)); cards.add(new SetCardInfo("Kynaios and Tiro of Meletis", 36, Rarity.MYTHIC, mage.cards.k.KynaiosAndTiroOfMeletis.class)); @@ -223,6 +223,7 @@ public class Commander2016 extends ExpansionSet { cards.add(new SetCardInfo("Lavalanche", 209, Rarity.RARE, mage.cards.l.Lavalanche.class)); cards.add(new SetCardInfo("Lightning Greaves", 260, Rarity.UNCOMMON, mage.cards.l.LightningGreaves.class)); cards.add(new SetCardInfo("Loxodon Warhammer", 261, Rarity.UNCOMMON, mage.cards.l.LoxodonWarhammer.class)); + cards.add(new SetCardInfo("Ludevic, Necro-Alchemist", 37, Rarity.MYTHIC, mage.cards.l.LudevicNecroAlchemist.class)); cards.add(new SetCardInfo("Lurking Predators", 156, Rarity.RARE, mage.cards.l.LurkingPredators.class)); cards.add(new SetCardInfo("Magus of the Will", 14, Rarity.RARE, mage.cards.m.MagusOfTheWill.class)); cards.add(new SetCardInfo("Managorger Hydra", 157, Rarity.RARE, mage.cards.m.ManagorgerHydra.class));