diff --git a/Mage.Sets/src/mage/sets/magic2015/BoonweaverGiant.java b/Mage.Sets/src/mage/sets/magic2015/BoonweaverGiant.java new file mode 100644 index 00000000000..15cc2caf8fa --- /dev/null +++ b/Mage.Sets/src/mage/sets/magic2015/BoonweaverGiant.java @@ -0,0 +1,153 @@ +/* + * 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.sets.magic2015; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetCardInHand; +import mage.target.common.TargetCardInLibrary; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author LevelX2 + */ +public class BoonweaverGiant extends CardImpl { + + public BoonweaverGiant(UUID ownerId) { + super(ownerId, 5, "Boonweaver Giant", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{6}{W}"); + this.expansionSetCode = "M15"; + this.subtype.add("Giant"); + this.subtype.add("Monk"); + + this.color.setWhite(true); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // When Boonweaver Giant enters the battlefield, you may search your graveyard, hand, + // and/or library for an Aura card and put it onto the battlefield attached to Boonweaver Giant. + // If you search your library this way, shuffle it. + this.addAbility(new EntersBattlefieldTriggeredAbility(new BoonweaverGiantEffect(), true)); + } + + public BoonweaverGiant(final BoonweaverGiant card) { + super(card); + } + + @Override + public BoonweaverGiant copy() { + return new BoonweaverGiant(this); + } +} + +class BoonweaverGiantEffect extends OneShotEffect { + + public BoonweaverGiantEffect() { + super(Outcome.UnboostCreature); + this.staticText = "you may search your graveyard, hand, and/or library for an Aura card and put it onto the battlefield attached to {this}. If you search your library this way, shuffle it."; + } + + public BoonweaverGiantEffect(final BoonweaverGiantEffect effect) { + super(effect); + } + + @Override + public BoonweaverGiantEffect copy() { + return new BoonweaverGiantEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player == null) { + return false; + } + + FilterCard filter = new FilterCard("Aura card"); + filter.add(new CardTypePredicate(CardType.ENCHANTMENT)); + filter.add(new SubtypePredicate("Aura")); + + Card card = null; + Zone zone = null; + if (player.chooseUse(Outcome.Neutral, "Search your graveyard for an Aura card?", game)) { + TargetCardInYourGraveyard target = new TargetCardInYourGraveyard(filter); + if (player.choose(Outcome.PutCardInPlay, player.getGraveyard(), target, game)) { + card = game.getCard(target.getFirstTarget()); + if (card != null) { + zone = Zone.GRAVEYARD; + } + } + } + if (player.chooseUse(Outcome.Neutral, "Search your Hand for an Aura card?", game)) { + TargetCardInHand target = new TargetCardInHand(filter); + if (player.choose(Outcome.PutCardInPlay, player.getHand(), target, game)) { + card = game.getCard(target.getFirstTarget()); + if (card != null) { + zone = Zone.HAND; + } + } + } + if (card == null) { + TargetCardInLibrary target = new TargetCardInLibrary(filter); + if (player.searchLibrary(target, game)) { + card = game.getCard(target.getFirstTarget()); + if (card != null) { + zone = Zone.LIBRARY; + } + } + player.shuffleLibrary(game); + } + if (card != null) { + Permanent permanent = game.getPermanent(source.getSourceId()); + if (permanent != null) { + game.getState().setValue("attachTo:" + card.getId(), permanent.getId()); + } + card.putOntoBattlefield(game, zone, source.getSourceId(), source.getControllerId()); + if (permanent != null) { + return permanent.addAttachment(card.getId(), game); + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/magic2015/ConstrictingSliver.java b/Mage.Sets/src/mage/sets/magic2015/ConstrictingSliver.java new file mode 100644 index 00000000000..820554d0105 --- /dev/null +++ b/Mage.Sets/src/mage/sets/magic2015/ConstrictingSliver.java @@ -0,0 +1,210 @@ +/* + * 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.sets.magic2015; + +import java.util.LinkedList; +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.abilities.effects.common.continious.GainAbilityAllEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.game.ExileZone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.ZoneChangeEvent; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class ConstrictingSliver extends CardImpl { + + private static final FilterCreaturePermanent filterTarget = new FilterCreaturePermanent("creature an opponent controls"); + + static { + filterTarget.add(new ControllerPredicate(TargetController.OPPONENT)); + } + + + public ConstrictingSliver(UUID ownerId) { + super(ownerId, 7, "Constricting Sliver", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{5}{W}"); + this.expansionSetCode = "M15"; + this.subtype.add("Sliver"); + + this.color.setWhite(true); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Sliver creatures you control have "When this creature enters the battlefield, you may exile target creature an opponent controls + // until this creature leaves the battlefield." + Ability ability = new EntersBattlefieldTriggeredAbility(new DamageTargetEffect(1), true); + ability.addTarget(new TargetCreaturePermanent(filterTarget)); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, + new GainAbilityAllEffect(ability, + Duration.WhileOnBattlefield, new FilterControlledCreaturePermanent("Sliver","Sliver creatures"), + "Sliver creatures you control have \"When this creature enters the battlefield, you may exile target creature an opponent controls until this creature leaves the battlefield.\""))); + // Implemented as triggered effect that doesn't uses the stack (implementation with watcher does not work correctly because if the returned creature + // has a DiesTriggeredAll ability it triggers for the battlefield leaving itself, what shouldn't happen) + // TODO: This has probably a problem if this leaves battlefield while other slivers have exiled creatures, they won't probably return but should I guess. + // so it should better be a kind of Exile effect with a duration + ability = new SimpleStaticAbility(Zone.BATTLEFIELD, + new GainAbilityAllEffect(new ConstrictingSliverReturnExiledCreatureAbility(), + Duration.WhileOnBattlefield, new FilterControlledCreaturePermanent("Sliver","Sliver creatures"),"")); + this.addAbility(ability); + + + } + + public ConstrictingSliver(final ConstrictingSliver card) { + super(card); + } + + @Override + public ConstrictingSliver copy() { + return new ConstrictingSliver(this); + } +} + +class ConstrictingSliverExileEffect extends OneShotEffect { + + public ConstrictingSliverExileEffect() { + super(Outcome.Benefit); + this.staticText = "you may exile target creature an opponent controls until this creature leaves the battlefield"; + } + + public ConstrictingSliverExileEffect(final ConstrictingSliverExileEffect effect) { + super(effect); + } + + @Override + public ConstrictingSliverExileEffect copy() { + return new ConstrictingSliverExileEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(source.getSourceId()); + // If the creature leaves the battlefield before its triggered ability resolves, + // the target creature won't be exiled. + if (permanent != null) { + return new ExileTargetEffect(source.getSourceId(), permanent.getLogName()).apply(game, source); + } + return false; + } +} +/** + * Returns the exiled card as creature leaves battlefield + * Uses no stack + * @author LevelX2 + */ + +class ConstrictingSliverReturnExiledCreatureAbility extends TriggeredAbilityImpl { + + public ConstrictingSliverReturnExiledCreatureAbility() { + super(Zone.BATTLEFIELD, new ConstrictingSliverReturnExiledCreatureEffect()); + this.usesStack = false; + this.setRuleVisible(false); + } + + public ConstrictingSliverReturnExiledCreatureAbility(final ConstrictingSliverReturnExiledCreatureAbility ability) { + super(ability); + } + + @Override + public ConstrictingSliverReturnExiledCreatureAbility copy() { + return new ConstrictingSliverReturnExiledCreatureAbility(this); + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (event.getType() == GameEvent.EventType.ZONE_CHANGE && event.getTargetId().equals(this.getSourceId())) { + ZoneChangeEvent zEvent = (ZoneChangeEvent) event; + if (zEvent.getFromZone() == Zone.BATTLEFIELD) { + return true; + } + } + return false; + } +} + +class ConstrictingSliverReturnExiledCreatureEffect extends OneShotEffect { + + public ConstrictingSliverReturnExiledCreatureEffect() { + super(Outcome.Benefit); + this.staticText = "Return exiled creatures"; + } + + public ConstrictingSliverReturnExiledCreatureEffect(final ConstrictingSliverReturnExiledCreatureEffect effect) { + super(effect); + } + + @Override + public ConstrictingSliverReturnExiledCreatureEffect copy() { + return new ConstrictingSliverReturnExiledCreatureEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + ExileZone exile = game.getExile().getExileZone(source.getSourceId()); + Card sourceCard = game.getCard(source.getSourceId()); + if (exile != null && sourceCard != null) { + LinkedList cards = new LinkedList<>(exile); + for (UUID cardId : cards) { + Card card = game.getCard(cardId); + card.moveToZone(Zone.BATTLEFIELD, source.getSourceId(), game, false); + game.informPlayers(new StringBuilder(sourceCard.getName()).append(": ").append(card.getName()).append(" returns to battlefield from exile").toString()); + } + exile.clear(); + return true; + } + + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/magic2015/DauntlessRiverMarshal.java b/Mage.Sets/src/mage/sets/magic2015/DauntlessRiverMarshal.java new file mode 100644 index 00000000000..3d81a970192 --- /dev/null +++ b/Mage.Sets/src/mage/sets/magic2015/DauntlessRiverMarshal.java @@ -0,0 +1,86 @@ +/* + * 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.sets.magic2015; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.TapTargetEffect; +import mage.abilities.effects.common.continious.BoostSourceWhileControlsEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class DauntlessRiverMarshal extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("an Island"); + + static { + filter.add(new SubtypePredicate("Island")); + + } + + public DauntlessRiverMarshal(UUID ownerId) { + super(ownerId, 8, "Dauntless River Marshal", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{W}"); + this.expansionSetCode = "M15"; + this.subtype.add("Human"); + this.subtype.add("Soldier"); + + this.color.setWhite(true); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Dauntless River Marshal gets +1/+1 as long as you control an Island. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostSourceWhileControlsEffect(filter, 1, 1))); + + // {3}{U}: Tap target creature. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new TapTargetEffect(), new ManaCostsImpl("{3}{U}")); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public DauntlessRiverMarshal(final DauntlessRiverMarshal card) { + super(card); + } + + @Override + public DauntlessRiverMarshal copy() { + return new DauntlessRiverMarshal(this); + } +} diff --git a/Mage.Sets/src/mage/sets/magic2015/DevouringLight.java b/Mage.Sets/src/mage/sets/magic2015/DevouringLight.java new file mode 100644 index 00000000000..d0c935142e7 --- /dev/null +++ b/Mage.Sets/src/mage/sets/magic2015/DevouringLight.java @@ -0,0 +1,52 @@ +/* + * 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.sets.magic2015; + +import java.util.UUID; + +/** + * + * @author LevelX2 + */ +public class DevouringLight extends mage.sets.ravnika.DevouringLight { + + public DevouringLight(UUID ownerId) { + super(ownerId); + this.cardNumber = 9; + this.expansionSetCode = "M15"; + } + + public DevouringLight(final DevouringLight card) { + super(card); + } + + @Override + public DevouringLight copy() { + return new DevouringLight(this); + } +} diff --git a/Mage.Sets/src/mage/sets/magic2015/EphemeralShields.java b/Mage.Sets/src/mage/sets/magic2015/EphemeralShields.java new file mode 100644 index 00000000000..23dd9b8fddb --- /dev/null +++ b/Mage.Sets/src/mage/sets/magic2015/EphemeralShields.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.sets.magic2015; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.common.continious.GainAbilityTargetEffect; +import mage.abilities.keyword.ConvokeAbility; +import mage.abilities.keyword.IndestructibleAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class EphemeralShields extends CardImpl { + + public EphemeralShields(UUID ownerId) { + super(ownerId, 11, "Ephemeral Shields", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{W}"); + this.expansionSetCode = "M15"; + + this.color.setWhite(true); + + // Convoke + this.addAbility(new ConvokeAbility()); + // Target creature gains indestructible until end of turn. + this.getSpellAbility().addEffect(new GainAbilityTargetEffect(IndestructibleAbility.getInstance(), Duration.EndOfTurn)); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + public EphemeralShields(final EphemeralShields card) { + super(card); + } + + @Override + public EphemeralShields copy() { + return new EphemeralShields(this); + } +} diff --git a/Mage.Sets/src/mage/sets/magic2015/FirstResponse.java b/Mage.Sets/src/mage/sets/magic2015/FirstResponse.java new file mode 100644 index 00000000000..11fcc27f89a --- /dev/null +++ b/Mage.Sets/src/mage/sets/magic2015/FirstResponse.java @@ -0,0 +1,99 @@ +/* + * 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.sets.magic2015; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.game.Game; +import mage.game.permanent.token.SoldierToken; +import mage.watchers.common.PlayerLostLifeWatcher; + +/** + * + * @author LevelX2 + */ +public class FirstResponse extends CardImpl { + + public FirstResponse(UUID ownerId) { + super(ownerId, 12, "First Response", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}"); + this.expansionSetCode = "M15"; + + this.color.setWhite(true); + + // At the beginning of each upkeep, if you lost life last turn, put a 1/1 white Soldier creature token onto the battlefield. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new FirstResponseEffect(), TargetController.ANY, false)); + + this.addWatcher(new PlayerLostLifeWatcher()); + + } + + public FirstResponse(final FirstResponse card) { + super(card); + } + + @Override + public FirstResponse copy() { + return new FirstResponse(this); + } +} + +class FirstResponseEffect extends OneShotEffect { + + public FirstResponseEffect() { + super(Outcome.PutCreatureInPlay); + this.staticText = "if you lost life last turn, put a 1/1 white Soldier creature token onto the battlefield"; + } + + public FirstResponseEffect(final FirstResponseEffect effect) { + super(effect); + } + + @Override + public FirstResponseEffect copy() { + return new FirstResponseEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + PlayerLostLifeWatcher watcher = (PlayerLostLifeWatcher) game.getState().getWatchers().get("PlayerLostLifeWatcher"); + if (watcher != null) { + if (watcher.getLiveLostLastTurn(source.getControllerId()) > 0) { + return new CreateTokenEffect(new SoldierToken("M15")).apply(game, source); + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/magic2015/HushwingGryff.java b/Mage.Sets/src/mage/sets/magic2015/HushwingGryff.java new file mode 100644 index 00000000000..f6945e1a827 --- /dev/null +++ b/Mage.Sets/src/mage/sets/magic2015/HushwingGryff.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.sets.magic2015; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.keyword.FlashAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; + +/** + * + * @author LevelX2 + */ +public class HushwingGryff extends CardImpl { + + public HushwingGryff(UUID ownerId) { + super(ownerId, 15, "Hushwing Gryff", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{W}"); + this.expansionSetCode = "M15"; + this.subtype.add("Hippogriff"); + + this.color.setWhite(true); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Flash + this.addAbility(FlashAbility.getInstance()); + // Flying + this.addAbility(FlyingAbility.getInstance()); + // Creatures entering the battlefield don't cause abilities to trigger. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new HushwingGryffEffect())); + } + + public HushwingGryff(final HushwingGryff card) { + super(card); + } + + @Override + public HushwingGryff copy() { + return new HushwingGryff(this); + } +} + +class HushwingGryffEffect extends ReplacementEffectImpl { + HushwingGryffEffect() { + super(Duration.WhileOnBattlefield, Outcome.Detriment, false); + staticText = "Creatures entering the battlefield don't cause abilities to trigger"; + } + + HushwingGryffEffect(final HushwingGryffEffect effect) { + super(effect); + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + return true; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD) { + Permanent p = game.getPermanent(event.getTargetId()); + if (p != null && p.getCardType().contains(CardType.CREATURE)) { + return true; + } + } + return false; + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public HushwingGryffEffect copy() { + return new HushwingGryffEffect(this); + } + +} \ No newline at end of file diff --git a/Mage.Sets/src/mage/sets/magic2015/MarkedByHonor.java b/Mage.Sets/src/mage/sets/magic2015/MarkedByHonor.java new file mode 100644 index 00000000000..a7eee0c5e8e --- /dev/null +++ b/Mage.Sets/src/mage/sets/magic2015/MarkedByHonor.java @@ -0,0 +1,88 @@ +/* + * 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.sets.magic2015; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.continious.BoostEnchantedEffect; +import mage.abilities.effects.common.continious.GainAbilityAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class MarkedByHonor extends CardImpl { + + public MarkedByHonor(UUID ownerId) { + super(ownerId, 17, "Marked by Honor", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{3}{W}"); + this.expansionSetCode = "M15"; + this.subtype.add("Aura"); + + this.color.setWhite(true); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // Enchanted creature gets +2/+2 and has vigilance. + Effect effect = new BoostEnchantedEffect(2, 2, Duration.WhileOnBattlefield); + effect.setText("Enchanted creature gets +2/+2"); + SimpleStaticAbility ability2 = new SimpleStaticAbility(Zone.BATTLEFIELD, effect); + effect = new GainAbilityAttachedEffect(VigilanceAbility.getInstance(), AttachmentType.AURA); + effect.setText("and has vigilance"); + ability2.addEffect(effect); + this.addAbility(ability2); + + } + + public MarkedByHonor(final MarkedByHonor card) { + super(card); + } + + @Override + public MarkedByHonor copy() { + return new MarkedByHonor(this); + } +} diff --git a/Mage.Sets/src/mage/sets/magic2015/ParagonOfNewDawns.java b/Mage.Sets/src/mage/sets/magic2015/ParagonOfNewDawns.java new file mode 100644 index 00000000000..9b5b3e64949 --- /dev/null +++ b/Mage.Sets/src/mage/sets/magic2015/ParagonOfNewDawns.java @@ -0,0 +1,97 @@ +/* + * 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.sets.magic2015; + +import java.util.UUID; +import mage.MageInt; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.continious.BoostControlledEffect; +import mage.abilities.effects.common.continious.GainAbilityTargetEffect; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.filter.predicate.permanent.AnotherPredicate; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class ParagonOfNewDawns extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("white creatures"); + private static final FilterCreaturePermanent filter2 = new FilterCreaturePermanent("Another white creature you control"); + + static { + filter.add(new ColorPredicate(ObjectColor.WHITE)); + filter.add(new ControllerPredicate(TargetController.YOU)); + filter2.add(new AnotherPredicate()); + filter2.add(new ColorPredicate(ObjectColor.WHITE)); + filter2.add(new ControllerPredicate(TargetController.YOU)); + } + + public ParagonOfNewDawns(UUID ownerId) { + super(ownerId, 23, "Paragon of New Dawns", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{3}{W}"); + this.expansionSetCode = "M15"; + this.subtype.add("Human"); + this.subtype.add("Soldier"); + + this.color.setWhite(true); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Other white creatures you control get +1/+1. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(1,1, Duration.WhileOnBattlefield, filter, true))); + // {W}, {T}: Another target white creature you control gains vigilance until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new GainAbilityTargetEffect(VigilanceAbility.getInstance(), Duration.EndOfTurn), new ManaCostsImpl("{W}")); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent(filter2)); + this.addAbility(ability); + } + + public ParagonOfNewDawns(final ParagonOfNewDawns card) { + super(card); + } + + @Override + public ParagonOfNewDawns copy() { + return new ParagonOfNewDawns(this); + } +} diff --git a/Mage.Sets/src/mage/sets/magic2015/PillarOfLight.java b/Mage.Sets/src/mage/sets/magic2015/PillarOfLight.java new file mode 100644 index 00000000000..b4dfcf7965c --- /dev/null +++ b/Mage.Sets/src/mage/sets/magic2015/PillarOfLight.java @@ -0,0 +1,71 @@ +/* + * 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.sets.magic2015; + +import java.util.UUID; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.Filter; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.ToughnessPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class PillarOfLight extends CardImpl { + + static private final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature with toughness 4 or greater"); + + static { + filter.add(new ToughnessPredicate(Filter.ComparisonType.GreaterThan, 3)); + } + + public PillarOfLight(UUID ownerId) { + super(ownerId, 24, "Pillar of Light", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{2}{W}"); + this.expansionSetCode = "M15"; + + this.color.setWhite(true); + + // Exile target creature with toughness 4 or greater. + this.getSpellAbility().addEffect(new ExileTargetEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); + } + + public PillarOfLight(final PillarOfLight card) { + super(card); + } + + @Override + public PillarOfLight copy() { + return new PillarOfLight(this); + } +} diff --git a/Mage.Sets/src/mage/sets/magic2015/ResoluteArchangel.java b/Mage.Sets/src/mage/sets/magic2015/ResoluteArchangel.java new file mode 100644 index 00000000000..8e11776cdf7 --- /dev/null +++ b/Mage.Sets/src/mage/sets/magic2015/ResoluteArchangel.java @@ -0,0 +1,115 @@ +/* + * 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.sets.magic2015; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.condition.Condition; +import mage.abilities.decorator.ConditionalOneShotEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author LevelX2 + */ +public class ResoluteArchangel extends CardImpl { + + public ResoluteArchangel(UUID ownerId) { + super(ownerId, 28, "Resolute Archangel", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{5}{W}{W}"); + this.expansionSetCode = "M15"; + this.subtype.add("Angel"); + + this.color.setWhite(true); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // When Resolute Angel enters the battlefield, if your life total is lower than your starting life total, it becomes equal to your starting life total. + this.addAbility(new EntersBattlefieldTriggeredAbility(new ConditionalOneShotEffect(new ResoluteArchangelEffect(), ControllerLifeLowerThanStrtingLife.getInstance(), + "if your life total is lower than your starting life total, it becomes equal to your starting life total"))); + } + + public ResoluteArchangel(final ResoluteArchangel card) { + super(card); + } + + @Override + public ResoluteArchangel copy() { + return new ResoluteArchangel(this); + } +} + +class ResoluteArchangelEffect extends OneShotEffect { + + public ResoluteArchangelEffect() { + super(Outcome.Benefit); + this.staticText = "if your life total is lower than your starting life total, it becomes equal to your starting life total"; + } + + public ResoluteArchangelEffect(final ResoluteArchangelEffect effect) { + super(effect); + } + + @Override + public ResoluteArchangelEffect copy() { + return new ResoluteArchangelEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + return false; + } +} + +class ControllerLifeLowerThanStrtingLife implements Condition { + + private static final ControllerLifeLowerThanStrtingLife fInstance = new ControllerLifeLowerThanStrtingLife(); + + public static Condition getInstance() { + return fInstance; + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + return controller.getLife() < game.getLife(); + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/magic2015/ReturnToTheRanks.java b/Mage.Sets/src/mage/sets/magic2015/ReturnToTheRanks.java new file mode 100644 index 00000000000..934bd14cd27 --- /dev/null +++ b/Mage.Sets/src/mage/sets/magic2015/ReturnToTheRanks.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.sets.magic2015; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.dynamicvalue.common.GetXValue; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect; +import mage.abilities.keyword.ConvokeAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.Filter; +import mage.filter.common.FilterCreatureCard; +import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; +import mage.game.Game; +import mage.target.common.TargetCardInYourGraveyard; + +/** + * + * @author LevelX2 + */ +public class ReturnToTheRanks extends CardImpl { + + private static final FilterCreatureCard filter = new FilterCreatureCard("creature cards with converted mana cost 2 or less from your graveyard"); + + static { + filter.add(new ConvertedManaCostPredicate(Filter.ComparisonType.LessThan, 3)); + } + + public ReturnToTheRanks(UUID ownerId) { + super(ownerId, 29, "Return to the Ranks", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{X}{W}{W}"); + this.expansionSetCode = "M15"; + + this.color.setWhite(true); + + // Convoke + this.addAbility(new ConvokeAbility()); + // Return X target creature cards with converted mana cost 2 or less from your graveyard to the battlefield. + Effect effect = new ReturnFromGraveyardToBattlefieldTargetEffect(); + effect.setText("Return X target creature cards with converted mana cost 2 or less from your graveyard to the battlefield"); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetCardInYourGraveyard(0,Integer.MAX_VALUE, filter)); + + } + + @Override + public void adjustTargets(Ability ability, Game game) { + for (Effect effect : ability.getEffects()) { + if (effect instanceof ReturnFromGraveyardToBattlefieldTargetEffect) { + int xValue = new GetXValue().calculate(game, ability); + ability.getTargets().clear(); + ability.addTarget(new TargetCardInYourGraveyard(xValue,xValue, new FilterCreatureCard("creature cards from your graveyard"))); + } + } + } + + public ReturnToTheRanks(final ReturnToTheRanks card) { + super(card); + } + + @Override + public ReturnToTheRanks copy() { + return new ReturnToTheRanks(this); + } +} diff --git a/Mage.Sets/src/mage/sets/magic2015/SanctifiedCharge.java b/Mage.Sets/src/mage/sets/magic2015/SanctifiedCharge.java new file mode 100644 index 00000000000..59c386ab17f --- /dev/null +++ b/Mage.Sets/src/mage/sets/magic2015/SanctifiedCharge.java @@ -0,0 +1,77 @@ +/* + * 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.sets.magic2015; + +import java.util.UUID; +import mage.ObjectColor; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.continious.BoostControlledEffect; +import mage.abilities.effects.common.continious.GainAbilityControlledEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.ColorPredicate; + +/** + * + * @author LevelX2 + */ +public class SanctifiedCharge extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("White creatures"); + + static { + filter.add(new ColorPredicate(ObjectColor.WHITE)); + } + + public SanctifiedCharge(UUID ownerId) { + super(ownerId, 30, "Sanctified Charge", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{4}{W}"); + this.expansionSetCode = "M15"; + + this.color.setWhite(true); + + // Creatures you control get +2/+1 until end of turn. White creatures you control also gain first strike until end of turn. + this.getSpellAbility().addEffect(new BoostControlledEffect(2, 1, Duration.EndOfTurn)); + Effect effect = new GainAbilityControlledEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn, filter); + effect.setText("White creatures you control also gain first strike until end of turn"); + this.getSpellAbility().addEffect(effect); + + } + + public SanctifiedCharge(final SanctifiedCharge card) { + super(card); + } + + @Override + public SanctifiedCharge copy() { + return new SanctifiedCharge(this); + } +} diff --git a/Mage.Sets/src/mage/sets/ravnika/DevouringLight.java b/Mage.Sets/src/mage/sets/ravnika/DevouringLight.java new file mode 100644 index 00000000000..8619d9f9229 --- /dev/null +++ b/Mage.Sets/src/mage/sets/ravnika/DevouringLight.java @@ -0,0 +1,65 @@ +/* + * 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.sets.ravnika; + +import java.util.UUID; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.abilities.keyword.ConvokeAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.target.common.TargetAttackingOrBlockingCreature; + +/** + * + * @author LevelX2 + */ +public class DevouringLight extends CardImpl { + + public DevouringLight(UUID ownerId) { + super(ownerId, 13, "Devouring Light", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{1}{W}{W}"); + this.expansionSetCode = "RAV"; + + this.color.setWhite(true); + + // Convoke + this.addAbility(new ConvokeAbility()); + // Exile target attacking or blocking creature. + this.getSpellAbility().addEffect(new ExileTargetEffect()); + this.getSpellAbility().addTarget(new TargetAttackingOrBlockingCreature()); + } + + public DevouringLight(final DevouringLight card) { + super(card); + } + + @Override + public DevouringLight copy() { + return new DevouringLight(this); + } +} diff --git a/Mage.Sets/src/mage/sets/returntoravnica/KnightlyValor.java b/Mage.Sets/src/mage/sets/returntoravnica/KnightlyValor.java index 26fea7fe6b9..38004186290 100644 --- a/Mage.Sets/src/mage/sets/returntoravnica/KnightlyValor.java +++ b/Mage.Sets/src/mage/sets/returntoravnica/KnightlyValor.java @@ -38,6 +38,7 @@ import mage.constants.Zone; import mage.abilities.Ability; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.AttachEffect; import mage.abilities.effects.common.CreateTokenEffect; import mage.abilities.effects.common.continious.BoostEnchantedEffect; @@ -72,9 +73,14 @@ public class KnightlyValor extends CardImpl { this.addAbility(new EntersBattlefieldTriggeredAbility(new CreateTokenEffect(new KnightToken()))); // Enchanted creature gets +2/+2 and has vigilance. - SimpleStaticAbility ability2 = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(2, 2, Duration.WhileOnBattlefield)); - ability2.addEffect(new GainAbilityAttachedEffect(VigilanceAbility.getInstance(), AttachmentType.AURA)); + Effect effect = new BoostEnchantedEffect(2, 2, Duration.WhileOnBattlefield); + effect.setText("Enchanted creature gets +2/+2"); + SimpleStaticAbility ability2 = new SimpleStaticAbility(Zone.BATTLEFIELD, effect); + effect = new GainAbilityAttachedEffect(VigilanceAbility.getInstance(), AttachmentType.AURA); + effect.setText("and has vigilance"); + ability2.addEffect(effect); this.addAbility(ability2); + } public KnightlyValor (final KnightlyValor card) { diff --git a/Mage.Sets/src/mage/sets/shardsofalara/WildNacatl.java b/Mage.Sets/src/mage/sets/shardsofalara/WildNacatl.java index 439349d8637..46dc1ca2ed1 100644 --- a/Mage.Sets/src/mage/sets/shardsofalara/WildNacatl.java +++ b/Mage.Sets/src/mage/sets/shardsofalara/WildNacatl.java @@ -61,7 +61,11 @@ public class WildNacatl extends CardImpl { this.subtype.add("Warrior"); this.power = new MageInt(1); this.toughness = new MageInt(1); + + // Wild Nacatl gets +1/+1 as long as you control a Mountain. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostSourceWhileControlsEffect(filter1, 1, 1))); + + // Wild Nacatl gets +1/+1 as long as you control a Plains. this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostSourceWhileControlsEffect(filter2, 1, 1))); } diff --git a/Mage.Sets/src/mage/sets/theros/ChainedToTheRocks.java b/Mage.Sets/src/mage/sets/theros/ChainedToTheRocks.java index a5d32299b34..832d37d6e66 100644 --- a/Mage.Sets/src/mage/sets/theros/ChainedToTheRocks.java +++ b/Mage.Sets/src/mage/sets/theros/ChainedToTheRocks.java @@ -151,7 +151,7 @@ class ChainedToTheRocksEffect extends OneShotEffect { // If Chained to the Rocks leaves the battlefield before its triggered ability resolves, // the target creature won't be exiled. if (permanent != null) { - return new ExileTargetEffect(source.getSourceId(), permanent.getName()).apply(game, source); + return new ExileTargetEffect(source.getSourceId(), permanent.getLogName()).apply(game, source); } return false; } diff --git a/Mage.Sets/src/mage/sets/theros/ObservantAlseid.java b/Mage.Sets/src/mage/sets/theros/ObservantAlseid.java index 01a415605d7..51f52f113ba 100644 --- a/Mage.Sets/src/mage/sets/theros/ObservantAlseid.java +++ b/Mage.Sets/src/mage/sets/theros/ObservantAlseid.java @@ -39,6 +39,7 @@ import mage.abilities.keyword.VigilanceAbility; import mage.cards.CardImpl; import mage.constants.AttachmentType; import mage.constants.CardType; +import mage.constants.Duration; import mage.constants.Rarity; import mage.constants.Zone; @@ -62,8 +63,10 @@ public class ObservantAlseid extends CardImpl { // Vigilance this.addAbility(VigilanceAbility.getInstance()); // Enchanted creature gets +2/+2 and has vigilance. - Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostEnchantedEffect(2,2)); - Effect effect = new GainAbilityAttachedEffect(VigilanceAbility.getInstance(), AttachmentType.AURA); + Effect effect = new BoostEnchantedEffect(2, 2, Duration.WhileOnBattlefield); + effect.setText("Enchanted creature gets +2/+2"); + Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect); + effect = new GainAbilityAttachedEffect(VigilanceAbility.getInstance(), AttachmentType.AURA); effect.setText("and has vigilance"); ability.addEffect(effect); this.addAbility(ability); diff --git a/Mage/src/mage/abilities/effects/common/continious/BoostSourceWhileControlsEffect.java b/Mage/src/mage/abilities/effects/common/continious/BoostSourceWhileControlsEffect.java index aceb2b785f9..d466a0ed9a4 100644 --- a/Mage/src/mage/abilities/effects/common/continious/BoostSourceWhileControlsEffect.java +++ b/Mage/src/mage/abilities/effects/common/continious/BoostSourceWhileControlsEffect.java @@ -45,16 +45,20 @@ import mage.game.permanent.Permanent; */ public class BoostSourceWhileControlsEffect extends WhileConditionContiniousEffect { - private int power; - private int toughness; - private String filterDescription; + private final int power; + private final int toughness; + private final String filterDescription; public BoostSourceWhileControlsEffect(FilterPermanent filter, int power, int toughness) { super(Duration.WhileOnBattlefield, Layer.PTChangingEffects_7, SubLayer.ModifyPT_7c, new ControlsPermanentCondition(filter), Outcome.BoostCreature); this.power = power; this.toughness = toughness; this.filterDescription = filter.getMessage(); - staticText = "{this} gets " + String.format("%1$+d/%2$+d", power, toughness) + " as long as you control a " + filterDescription; + staticText = "{this} gets " + + String.format("%1$+d/%2$+d", power, toughness) + + " as long as you control " + + (filterDescription.startsWith("an ") ? "":"a ") + + filterDescription; } public BoostSourceWhileControlsEffect(final BoostSourceWhileControlsEffect effect) { diff --git a/Mage/src/mage/game/permanent/token/SoldierToken.java b/Mage/src/mage/game/permanent/token/SoldierToken.java index dd6895cf77f..8cf3fa003f5 100644 --- a/Mage/src/mage/game/permanent/token/SoldierToken.java +++ b/Mage/src/mage/game/permanent/token/SoldierToken.java @@ -29,7 +29,6 @@ package mage.game.permanent.token; import mage.MageInt; -import mage.ObjectColor; import mage.constants.CardType; /** @@ -39,10 +38,13 @@ import mage.constants.CardType; public class SoldierToken extends Token { public SoldierToken() { + this("10E"); + } + public SoldierToken(String setCode) { super("Soldier", "1/1 white Soldier creature token"); - this.setOriginalExpansionSetCode("10E"); + this.setOriginalExpansionSetCode(setCode); cardType.add(CardType.CREATURE); - color = ObjectColor.WHITE; + color.setWhite(true); subtype.add("Soldier"); power = new MageInt(1); toughness = new MageInt(1); diff --git a/Mage/src/mage/watchers/common/PlayerLostLifeWatcher.java b/Mage/src/mage/watchers/common/PlayerLostLifeWatcher.java index 71c91aa75dd..267927d70e7 100644 --- a/Mage/src/mage/watchers/common/PlayerLostLifeWatcher.java +++ b/Mage/src/mage/watchers/common/PlayerLostLifeWatcher.java @@ -40,7 +40,7 @@ import mage.watchers.Watcher; /** - * Counts amount of life lost current turn by players. + * Counts amount of life lost current or last turn by players. * * * @author LevelX2 @@ -48,6 +48,7 @@ import mage.watchers.Watcher; public class PlayerLostLifeWatcher extends Watcher { private final Map amountOfLifeLostThisTurn = new HashMap<>(); + private final Map amountOfLifeLostLastTurn = new HashMap<>(); public PlayerLostLifeWatcher() { super("PlayerLostLifeWatcher", WatcherScope.GAME); @@ -87,8 +88,18 @@ public class PlayerLostLifeWatcher extends Watcher { return 0; } + public int getLiveLostLastTurn(UUID playerId) { + Integer amount = amountOfLifeLostLastTurn.get(playerId); + if (amount != null) { + return amount.intValue(); + } + return 0; + } + @Override public void reset() { + amountOfLifeLostLastTurn.clear(); + amountOfLifeLostLastTurn.putAll(amountOfLifeLostThisTurn); amountOfLifeLostThisTurn.clear(); } diff --git a/Utils/keywords.txt b/Utils/keywords.txt index 5e74b26d0d6..23d33d490e9 100644 --- a/Utils/keywords.txt +++ b/Utils/keywords.txt @@ -3,6 +3,7 @@ Basic landcycling|cost| Battle cry|new| Bloodthirst|number| Bushido|number| +Convoke|new| Cascade|new| Cumulative upkeep|cost| Cycling|cost|