From cad645e1c5588fbd127df6ab77ae5e95297fa511 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Wed, 6 Dec 2017 14:54:14 +0100 Subject: [PATCH 001/164] Implemented Callous Oppressor --- .../src/mage/cards/c/CallousOppressor.java | 160 ++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/CallousOppressor.java diff --git a/Mage.Sets/src/mage/cards/c/CallousOppressor.java b/Mage.Sets/src/mage/cards/c/CallousOppressor.java new file mode 100644 index 00000000000..f9d9bb0d601 --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CallousOppressor.java @@ -0,0 +1,160 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.c; + +import java.util.LinkedHashSet; +import java.util.UUID; +import java.util.stream.Collectors; +import mage.MageInt; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.common.AsEntersBattlefieldAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.SkipUntapOptionalAbility; +import mage.abilities.condition.common.SourceTappedCondition; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.GainControlTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.choices.Choice; +import mage.choices.ChoiceImpl; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.ChosenSubtypePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetCreaturePermanent; +import mage.target.common.TargetOpponent; +import mage.util.CardUtil; + +/** + * + * @author L_J + */ +public class CallousOppressor extends CardImpl { + + public CallousOppressor(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{U}{U}"); + this.subtype.add(SubType.CEPHALID); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // You may choose not to untap Callous Oppressor during your untap step. + this.addAbility(new SkipUntapOptionalAbility()); + + // As Callous Oppressor enters the battlefield, an opponent chooses a creature type. + this.addAbility(new AsEntersBattlefieldAbility(new OpponentChooseCreatureTypeEffect())); + + // {T}: Gain control of target creature that isn't of the chosen type for as long as Callous Oppressor remains tapped. + FilterCreaturePermanent filter = new FilterCreaturePermanent("creature that isn't of the chosen type"); + filter.add(Predicates.not(new ChosenSubtypePredicate(this.getId()))); + ConditionalContinuousEffect effect = new ConditionalContinuousEffect( + new GainControlTargetEffect(Duration.OneUse), + SourceTappedCondition.instance, + "Gain control of target creature for as long as Callous Oppressor remains tapped"); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent(filter)); + this.addAbility(ability); + } + + public CallousOppressor(final CallousOppressor card) { + super(card); + } + + @Override + public CallousOppressor copy() { + return new CallousOppressor(this); + } +} + +class OpponentChooseCreatureTypeEffect extends OneShotEffect { + + public OpponentChooseCreatureTypeEffect() { + super(Outcome.Benefit); + staticText = "an opponent chooses a creature type"; + } + + public OpponentChooseCreatureTypeEffect(final OpponentChooseCreatureTypeEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject mageObject = game.getPermanentEntering(source.getSourceId()); + if (mageObject == null) { + mageObject = game.getObject(source.getSourceId()); + } + if (controller != null) { + TargetOpponent target = new TargetOpponent(true); + if (target.canChoose(source.getSourceId(), controller.getId(), game)) { + while (!target.isChosen() && target.canChoose(controller.getId(), game) && controller.canRespond()) { + controller.chooseTarget(outcome, target, source, game); + } + } else { + return false; + } + Player opponent = game.getPlayer(target.getFirstTarget()); + if (opponent != null && mageObject != null) { + Choice typeChoice = new ChoiceImpl(true); + typeChoice.setMessage("Choose creature type"); + typeChoice.setChoices(SubType.getCreatureTypes(false).stream().map(SubType::toString).collect(Collectors.toCollection(LinkedHashSet::new))); + while (!opponent.choose(outcome, typeChoice, game)) { + if (!opponent.canRespond()) { + return false; + } + } + if (typeChoice.getChoice() == null) { + return false; + } + if (!game.isSimulation()) { + game.informPlayers(mageObject.getName() + ": " + opponent.getLogName() + " has chosen " + typeChoice.getChoice()); + } + game.getState().setValue(mageObject.getId() + "_type", SubType.byDescription(typeChoice.getChoice())); + if (mageObject instanceof Permanent) { + ((Permanent) mageObject).addInfo("chosen type", CardUtil.addToolTipMarkTags("Chosen type: " + typeChoice.getChoice()), game); + } + } + } + return false; + } + + @Override + public OpponentChooseCreatureTypeEffect copy() { + return new OpponentChooseCreatureTypeEffect(this); + } + +} From f7b747bcdb17357d449d6af2c3068cddd467789b Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Wed, 6 Dec 2017 14:54:56 +0100 Subject: [PATCH 002/164] Implemented Doom Cannon --- Mage.Sets/src/mage/cards/d/DoomCannon.java | 79 ++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/d/DoomCannon.java diff --git a/Mage.Sets/src/mage/cards/d/DoomCannon.java b/Mage.Sets/src/mage/cards/d/DoomCannon.java new file mode 100644 index 00000000000..33ae3a9b366 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DoomCannon.java @@ -0,0 +1,79 @@ +/* + * 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.d; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.AsEntersBattlefieldAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.ChooseCreatureTypeEffect; +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.Zone; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.mageobject.ChosenSubtypePredicate; +import mage.target.common.TargetControlledCreaturePermanent; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author L_J + */ +public class DoomCannon extends CardImpl { + + public DoomCannon(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{6}"); + + // As Doom Cannon enters the battlefield, choose a creature type. + this.addAbility(new AsEntersBattlefieldAbility(new ChooseCreatureTypeEffect(Outcome.Sacrifice))); + + // {3}, {T}, Sacrifice a creature of the chosen type: Doom Cannon deals 3 damage to target creature or player. + FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("a creature of the chosen type"); + filter.add(new ChosenSubtypePredicate(this.getId())); + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(3), new GenericManaCost(3)); + ability.addCost(new TapSourceCost()); + ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(filter))); + ability.addTarget(new TargetCreatureOrPlayer()); + this.addAbility(ability); + } + + public DoomCannon(final DoomCannon card) { + super(card); + } + + @Override + public DoomCannon copy() { + return new DoomCannon(this); + } +} From a703e52939bd6d0491c71fd6b8a05459439d974d Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Wed, 6 Dec 2017 14:55:54 +0100 Subject: [PATCH 003/164] Implemented Entrails Feaster --- .../src/mage/cards/e/EntrailsFeaster.java | 124 ++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/e/EntrailsFeaster.java diff --git a/Mage.Sets/src/mage/cards/e/EntrailsFeaster.java b/Mage.Sets/src/mage/cards/e/EntrailsFeaster.java new file mode 100644 index 00000000000..f796d7ba7eb --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/EntrailsFeaster.java @@ -0,0 +1,124 @@ +/* + * 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.e; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.common.FilterCreatureCard; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetCardInGraveyard; + +/** + * + * @author L_J + */ +public class EntrailsFeaster extends CardImpl { + + public EntrailsFeaster(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{B}"); + this.subtype.add(SubType.ZOMBIE); + this.subtype.add(SubType.CAT); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // At the beginning of your upkeep, you may exile a creature card from a graveyard. If you do, put a +1/+1 counter on Entrails Feaster. If you don't, tap Entrails Feaster. + Ability ability = new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new EntrailsFeasterEffect(), TargetController.YOU, false); + this.addAbility(ability); + + } + + public EntrailsFeaster(final EntrailsFeaster card) { + super(card); + } + + @Override + public EntrailsFeaster copy() { + return new EntrailsFeaster(this); + } +} + +class EntrailsFeasterEffect extends OneShotEffect { + + private static final FilterCreatureCard filter = new FilterCreatureCard("creature card from a graveyard"); + + public EntrailsFeasterEffect() { + super(Outcome.Detriment); + this.staticText = "you may exile a creature card from a graveyard. If you do, put a +1/+1 counter on {this}. If you don't, tap {this}"; + } + + public EntrailsFeasterEffect(final EntrailsFeasterEffect effect) { + super(effect); + } + + @Override + public EntrailsFeasterEffect copy() { + return new EntrailsFeasterEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null && source.getSourceId() != null) { + Permanent sourceObject = (Permanent) source.getSourceObjectIfItStillExists(game); + TargetCardInGraveyard target = new TargetCardInGraveyard(filter); + target.setNotTarget(true); + if (target.canChoose(source.getSourceId(), controller.getId(), game) && controller.chooseUse(outcome, "Exile a creature card from a graveyard?", source, game)) { + if (controller.choose(Outcome.Exile, target, source.getId(), game)) { + Card cardChosen = game.getCard(target.getFirstTarget()); + if (cardChosen != null) { + controller.moveCardToExileWithInfo(cardChosen, null, "", source.getSourceId(), game, Zone.GRAVEYARD, true); + if (sourceObject != null) { + sourceObject.getCounters(game).addCounter(CounterType.P1P1.createInstance()); + game.informPlayers(controller.getLogName() + " puts a +1/+1 counter on " + sourceObject.getName()); + } + } + } else if (sourceObject != null) { + sourceObject.tap(game); + } + } else if (sourceObject != null) { + sourceObject.tap(game); + } + return true; + } + return false; + } +} From c98c638e179aa48d06fb48ad588249cc0808c6ed Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Wed, 6 Dec 2017 14:56:55 +0100 Subject: [PATCH 004/164] Implemented Kamahl's Summons --- .../src/mage/cards/k/KamahlsSummons.java | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/k/KamahlsSummons.java diff --git a/Mage.Sets/src/mage/cards/k/KamahlsSummons.java b/Mage.Sets/src/mage/cards/k/KamahlsSummons.java new file mode 100644 index 00000000000..a259d5289a3 --- /dev/null +++ b/Mage.Sets/src/mage/cards/k/KamahlsSummons.java @@ -0,0 +1,121 @@ +/* + * 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.k; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.filter.FilterCard; +import mage.filter.common.FilterCreatureCard; +import mage.game.Game; +import mage.game.permanent.token.BearToken; +import mage.game.permanent.token.Token; +import mage.players.Player; +import mage.target.common.TargetCardInHand; + +/** + * + * @author L_J + */ +public class KamahlsSummons extends CardImpl { + + public KamahlsSummons(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{G}"); + + // Each player may reveal any number of creature cards from his or her hand. Then each player creates a 2/2 green Bear creature token for each card he or she revealed this way. + getSpellAbility().addEffect(new KamahlsSummonsEffect()); + } + + public KamahlsSummons(final KamahlsSummons card) { + super(card); + } + + @Override + public KamahlsSummons copy() { + return new KamahlsSummons(this); + } +} + +class KamahlsSummonsEffect extends OneShotEffect { + + private static final FilterCard filter = new FilterCreatureCard(); + + public KamahlsSummonsEffect() { + super(Outcome.Benefit); + this.staticText = "Each player may reveal any number of creature cards from his or her hand. Then each player creates a 2/2 green Bear creature token for each card he or she revealed this way"; + } + + public KamahlsSummonsEffect(final KamahlsSummonsEffect effect) { + super(effect); + } + + @Override + public KamahlsSummonsEffect copy() { + return new KamahlsSummonsEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = game.getObject(source.getSourceId()); + if (controller != null && sourceObject != null) { + Map revealedCards = new HashMap<>(); + for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { + Player player = game.getPlayer(playerId); + if (player != null) { + if (player.getHand().count(filter, game) > 0) { + TargetCardInHand target = new TargetCardInHand(0, Integer.MAX_VALUE, filter); + if (player.choose(outcome, target, source.getSourceId(), game)) { + Cards cards = new CardsImpl(target.getTargets()); + controller.revealCards(sourceObject.getIdName(), cards, game); + revealedCards.put(playerId, target.getTargets().size()); + } + } + } + } + Token token = new BearToken(); + for (UUID playerId : revealedCards.keySet()) { + int value = revealedCards.get(playerId); + if (value > 0) { + token.putOntoBattlefield(value, game, source.getSourceId(), playerId); + } + } + return true; + } + return false; + } +} From d1bed7a5329a7e86737b322a7a372baee8100d30 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Wed, 6 Dec 2017 14:58:07 +0100 Subject: [PATCH 005/164] Implemented Shieldmage Elder --- .../src/mage/cards/s/ShieldmageElder.java | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/ShieldmageElder.java diff --git a/Mage.Sets/src/mage/cards/s/ShieldmageElder.java b/Mage.Sets/src/mage/cards/s/ShieldmageElder.java new file mode 100644 index 00000000000..63c56953458 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/ShieldmageElder.java @@ -0,0 +1,96 @@ +/* + * 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.s; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapTargetCost; +import mage.abilities.effects.common.PreventDamageByTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.permanent.TappedPredicate; +import mage.target.TargetSpell; +import mage.target.common.TargetControlledPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author L_J + */ +public class ShieldmageElder extends CardImpl { + + private static final FilterControlledPermanent filter1 = new FilterControlledPermanent("untapped Clerics you control"); + + static { + filter1.add(Predicates.not(new TappedPredicate())); + filter1.add(new SubtypePredicate(SubType.CLERIC)); + } + private static final FilterControlledPermanent filter2 = new FilterControlledPermanent("untapped Wizards you control"); + + static { + filter2.add(Predicates.not(new TappedPredicate())); + filter2.add(new SubtypePredicate(SubType.WIZARD)); + } + + public ShieldmageElder(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{5}{W}"); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.CLERIC); + this.subtype.add(SubType.WIZARD); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Tap two untapped Clerics you control: Prevent all damage target creature would deal this turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PreventDamageByTargetEffect(Duration.EndOfTurn), new TapTargetCost(new TargetControlledPermanent(2, 2, filter1, false))); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + + // Tap two untapped Wizards you control: Prevent all damage target spell would deal this turn. + Ability ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PreventDamageByTargetEffect(Duration.EndOfTurn), new TapTargetCost(new TargetControlledPermanent(2, 2, filter2, false))); + ability2.addTarget(new TargetSpell()); + this.addAbility(ability2); + } + + public ShieldmageElder(final ShieldmageElder card) { + super(card); + } + + @Override + public ShieldmageElder copy() { + return new ShieldmageElder(this); + } +} From dcce07cfdcf1e1f9a7f0de0ebdfc3ed739500919 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Wed, 6 Dec 2017 15:00:09 +0100 Subject: [PATCH 006/164] Implemented Butcher Orgg --- .../ControllerDivideCombatDamageAbility.java | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 Mage/src/main/java/mage/abilities/common/ControllerDivideCombatDamageAbility.java diff --git a/Mage/src/main/java/mage/abilities/common/ControllerDivideCombatDamageAbility.java b/Mage/src/main/java/mage/abilities/common/ControllerDivideCombatDamageAbility.java new file mode 100644 index 00000000000..aceae25cf31 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/common/ControllerDivideCombatDamageAbility.java @@ -0,0 +1,67 @@ +/* + * Copyright 2011 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.abilities.common; + +import mage.abilities.MageSingleton; +import mage.abilities.StaticAbility; + +import java.io.ObjectStreamException; + +import mage.constants.AbilityType; +import mage.constants.Zone; + +/** + * @author L_J + */ +public class ControllerDivideCombatDamageAbility extends StaticAbility implements MageSingleton { + + private static final ControllerDivideCombatDamageAbility instance = new ControllerDivideCombatDamageAbility(); + + private Object readResolve() throws ObjectStreamException { + return instance; + } + + public static ControllerDivideCombatDamageAbility getInstance() { + return instance; + } + + private ControllerDivideCombatDamageAbility() { + super(AbilityType.STATIC, Zone.BATTLEFIELD); + } + + @Override + public String getRule() { + return "You may assign {this}'s combat damage divided as you choose among defending player and/or any number of creatures he or she controls."; + } + + @Override + public ControllerDivideCombatDamageAbility copy() { + return instance; + } + +} From 0e60bcb7fa2155644ab6914c2590caeaba402cec Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Wed, 6 Dec 2017 15:00:27 +0100 Subject: [PATCH 007/164] Implemented Butcher Orgg --- Mage.Sets/src/mage/cards/b/ButcherOrgg.java | 63 +++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/b/ButcherOrgg.java diff --git a/Mage.Sets/src/mage/cards/b/ButcherOrgg.java b/Mage.Sets/src/mage/cards/b/ButcherOrgg.java new file mode 100644 index 00000000000..f12cd58780a --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/ButcherOrgg.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.cards.b; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.ControllerDivideCombatDamageAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +/** + * + * @author L_J + */ +public class ButcherOrgg extends CardImpl { + + public ButcherOrgg(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{R}{R}{R}"); + this.subtype.add(SubType.ORGG); + + this.power = new MageInt(6); + this.toughness = new MageInt(6); + + // You may assign Butcher Orgg's combat damage divided as you choose among defending player and/or any number of creatures he or she controls. + this.addAbility(ControllerDivideCombatDamageAbility.getInstance()); + } + + public ButcherOrgg(final ButcherOrgg card) { + super(card); + } + + @Override + public ButcherOrgg copy() { + return new ButcherOrgg(this); + } +} From c3747b353a3cb056786e9ebf4ab251c8b60af4eb Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Wed, 6 Dec 2017 15:03:04 +0100 Subject: [PATCH 008/164] Implemented cards --- Mage.Sets/src/mage/sets/Onslaught.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Mage.Sets/src/mage/sets/Onslaught.java b/Mage.Sets/src/mage/sets/Onslaught.java index 8e76f69828b..daf0abe761b 100644 --- a/Mage.Sets/src/mage/sets/Onslaught.java +++ b/Mage.Sets/src/mage/sets/Onslaught.java @@ -62,9 +62,11 @@ public class Onslaught extends ExpansionSet { cards.add(new SetCardInfo("Break Open", 190, Rarity.COMMON, mage.cards.b.BreakOpen.class)); cards.add(new SetCardInfo("Brightstone Ritual", 191, Rarity.COMMON, mage.cards.b.BrightstoneRitual.class)); cards.add(new SetCardInfo("Broodhatch Nantuko", 250, Rarity.UNCOMMON, mage.cards.b.BroodhatchNantuko.class)); + cards.add(new SetCardInfo("Butcher Orgg", 192, Rarity.RARE, mage.cards.b.ButcherOrgg.class)); cards.add(new SetCardInfo("Cabal Archon", 129, Rarity.UNCOMMON, mage.cards.c.CabalArchon.class)); cards.add(new SetCardInfo("Cabal Executioner", 130, Rarity.UNCOMMON, mage.cards.c.CabalExecutioner.class)); cards.add(new SetCardInfo("Cabal Slaver", 131, Rarity.UNCOMMON, mage.cards.c.CabalSlaver.class)); + cards.add(new SetCardInfo("Callous Oppressor", 72, Rarity.RARE, mage.cards.c.CallousOppressor.class)); cards.add(new SetCardInfo("Catapult Master", 10, Rarity.RARE, mage.cards.c.CatapultMaster.class)); cards.add(new SetCardInfo("Catapult Squad", 11, Rarity.UNCOMMON, mage.cards.c.CatapultSquad.class)); cards.add(new SetCardInfo("Centaur Glade", 251, Rarity.UNCOMMON, mage.cards.c.CentaurGlade.class)); @@ -102,6 +104,7 @@ public class Onslaught extends ExpansionSet { cards.add(new SetCardInfo("Dispersing Orb", 80, Rarity.UNCOMMON, mage.cards.d.DispersingOrb.class)); cards.add(new SetCardInfo("Disruptive Pitmage", 81, Rarity.COMMON, mage.cards.d.DisruptivePitmage.class)); cards.add(new SetCardInfo("Dive Bomber", 26, Rarity.COMMON, mage.cards.d.DiveBomber.class)); + cards.add(new SetCardInfo("Doom Cannon", 307, Rarity.RARE, mage.cards.d.DoomCannon.class)); cards.add(new SetCardInfo("Doomed Necromancer", 140, Rarity.RARE, mage.cards.d.DoomedNecromancer.class)); cards.add(new SetCardInfo("Doubtless One", 27, Rarity.UNCOMMON, mage.cards.d.DoubtlessOne.class)); cards.add(new SetCardInfo("Dragon Roost", 198, Rarity.RARE, mage.cards.d.DragonRoost.class)); @@ -117,6 +120,7 @@ public class Onslaught extends ExpansionSet { cards.add(new SetCardInfo("Elvish Warrior", 260, Rarity.COMMON, mage.cards.e.ElvishWarrior.class)); cards.add(new SetCardInfo("Embermage Goblin", 200, Rarity.UNCOMMON, mage.cards.e.EmbermageGoblin.class)); cards.add(new SetCardInfo("Enchantress's Presence", 261, Rarity.RARE, mage.cards.e.EnchantresssPresence.class)); + cards.add(new SetCardInfo("Entrails Feaster", 143, Rarity.RARE, mage.cards.e.EntrailsFeaster.class)); cards.add(new SetCardInfo("Erratic Explosion", 201, Rarity.COMMON, mage.cards.e.ErraticExplosion.class)); cards.add(new SetCardInfo("Essence Fracture", 82, Rarity.UNCOMMON, mage.cards.e.EssenceFracture.class)); cards.add(new SetCardInfo("Everglove Courier", 262, Rarity.UNCOMMON, mage.cards.e.EvergloveCourier.class)); @@ -186,6 +190,7 @@ public class Onslaught extends ExpansionSet { cards.add(new SetCardInfo("Ixidor, Reality Sculptor", 89, Rarity.RARE, mage.cards.i.IxidorRealitySculptor.class)); cards.add(new SetCardInfo("Jareth, Leonine Titan", 43, Rarity.RARE, mage.cards.j.JarethLeonineTitan.class)); cards.add(new SetCardInfo("Kamahl, Fist of Krosa", 268, Rarity.RARE, mage.cards.k.KamahlFistOfKrosa.class)); + cards.add(new SetCardInfo("Kamahl's Summons", 269, Rarity.UNCOMMON, mage.cards.k.KamahlsSummons.class)); cards.add(new SetCardInfo("Krosan Colossus", 270, Rarity.RARE, mage.cards.k.KrosanColossus.class)); cards.add(new SetCardInfo("Krosan Groundshaker", 271, Rarity.UNCOMMON, mage.cards.k.KrosanGroundshaker.class)); cards.add(new SetCardInfo("Krosan Tusker", 272, Rarity.COMMON, mage.cards.k.KrosanTusker.class)); @@ -266,6 +271,7 @@ public class Onslaught extends ExpansionSet { cards.add(new SetCardInfo("Shaleskin Bruiser", 226, Rarity.UNCOMMON, mage.cards.s.ShaleskinBruiser.class)); cards.add(new SetCardInfo("Shared Triumph", 53, Rarity.RARE, mage.cards.s.SharedTriumph.class)); cards.add(new SetCardInfo("Shepherd of Rot", 168, Rarity.COMMON, mage.cards.s.ShepherdOfRot.class)); + cards.add(new SetCardInfo("Shieldmage Elder", 54, Rarity.UNCOMMON, mage.cards.s.ShieldmageElder.class)); cards.add(new SetCardInfo("Shock", 227, Rarity.COMMON, mage.cards.s.Shock.class)); cards.add(new SetCardInfo("Sigil of the New Dawn", 55, Rarity.RARE, mage.cards.s.SigilOfTheNewDawn.class)); cards.add(new SetCardInfo("Silent Specter", 169, Rarity.RARE, mage.cards.s.SilentSpecter.class)); From 47ef2a4ce421d8fbc8edbdc298fb278dae7c0179 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Wed, 6 Dec 2017 16:31:36 +0100 Subject: [PATCH 009/164] Implemented Butcher Orgg (partially) Option to divide damage while being a blocker doesn't work for some reason --- .../java/mage/game/combat/CombatGroup.java | 103 +++++++++++++++++- 1 file changed, 101 insertions(+), 2 deletions(-) diff --git a/Mage/src/main/java/mage/game/combat/CombatGroup.java b/Mage/src/main/java/mage/game/combat/CombatGroup.java index 44a4e52f383..ffa79a34737 100644 --- a/Mage/src/main/java/mage/game/combat/CombatGroup.java +++ b/Mage/src/main/java/mage/game/combat/CombatGroup.java @@ -34,6 +34,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; import mage.abilities.common.ControllerAssignCombatDamageToBlockersAbility; +import mage.abilities.common.ControllerDivideCombatDamageAbility; import mage.abilities.common.DamageAsThoughNotBlockedAbility; import mage.abilities.keyword.CantBlockAloneAbility; import mage.abilities.keyword.DeathtouchAbility; @@ -41,6 +42,7 @@ import mage.abilities.keyword.DoubleStrikeAbility; import mage.abilities.keyword.FirstStrikeAbility; import mage.abilities.keyword.TrampleAbility; import mage.constants.Outcome; +import mage.filter.StaticFilters; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; @@ -140,12 +142,31 @@ public class CombatGroup implements Serializable, Copyable { public void assignDamageToBlockers(boolean first, Game game) { if (!attackers.isEmpty() && (!first || hasFirstOrDoubleStrike(game))) { + Permanent attacker = game.getPermanent(attackers.get(0)); + if (attacker.getAbilities().containsKey(ControllerDivideCombatDamageAbility.getInstance().getId())) { // for handling Butcher Orgg + Player player = game.getPlayer(attacker.getControllerId()); + for (Permanent defensiveFormation : game.getBattlefield().getAllActivePermanents(defendingPlayerId)) { // for handling Defensive Formation + if (defensiveFormation.getAbilities().containsKey(ControllerAssignCombatDamageToBlockersAbility.getInstance().getId())) { + player = game.getPlayer(defendingPlayerId); + break; + } + } + if (player.chooseUse(Outcome.Damage, "Do you wish to divide " + attacker.getLogName() + "'s combat damage among defending player and/or any number of defending creatures?", null, game)) { + butcherOrggDamage(attacker, player, first, game); + return; + } + } if (blockers.isEmpty()) { unblockedDamage(first, game); } else { - Permanent attacker = game.getPermanent(attackers.get(0)); - if (attacker.getAbilities().containsKey(DamageAsThoughNotBlockedAbility.getInstance().getId())) { + if (attacker.getAbilities().containsKey(DamageAsThoughNotBlockedAbility.getInstance().getId())) { // for handling creatures like Thorn Elemental Player player = game.getPlayer(attacker.getControllerId()); + for (Permanent defensiveFormation : game.getBattlefield().getAllActivePermanents(defendingPlayerId)) { // for handling Defensive Formation + if (defensiveFormation.getAbilities().containsKey(ControllerAssignCombatDamageToBlockersAbility.getInstance().getId())) { + player = game.getPlayer(defendingPlayerId); + break; + } + } if (player.chooseUse(Outcome.Damage, "Do you wish to assign damage for " + attacker.getLogName() + " as though it weren't blocked?", null, game)) { blocked = false; unblockedDamage(first, game); @@ -162,6 +183,28 @@ public class CombatGroup implements Serializable, Copyable { public void assignDamageToAttackers(boolean first, Game game) { if (!blockers.isEmpty() && (!first || hasFirstOrDoubleStrike(game))) { + // this never comes up for some reason + boolean altDamageMethod = false; + for (UUID blockerId : blockers) { + Permanent blocker = game.getPermanent(blockerId); + if (blocker.getAbilities().containsKey(ControllerDivideCombatDamageAbility.getInstance().getId())) { // for handling Butcher Orgg + Player player = game.getPlayer(blocker.getControllerId()); + for (Permanent defensiveFormation : game.getBattlefield().getAllActivePermanents(defendingPlayerId)) { // for handling Defensive Formation + if (defensiveFormation.getAbilities().containsKey(ControllerAssignCombatDamageToBlockersAbility.getInstance().getId())) { + player = game.getPlayer(defendingPlayerId); + break; + } + } + if (player.chooseUse(Outcome.Damage, "Do you wish to divide " + blocker.getLogName() + "'s combat damage among defending player and/or any number of defending creatures?", null, game)) { Permanent attacker = game.getPermanent(attackers.get(0)); + butcherOrggDamage(blocker, player, first, game); + altDamageMethod = true; + continue; + } + } + } + if (altDamageMethod) { + return; + } if (attackers.size() == 1) { singleAttackerDamage(first, game); } else { @@ -226,6 +269,62 @@ public class CombatGroup implements Serializable, Copyable { } } + private void butcherOrggDamage(Permanent attacker, Player player, boolean first, Game game) { + if (!(blocked && blockers.isEmpty()) && (!first || hasFirstOrDoubleStrike(game))) { + if (attacker == null) { + return; + } + int damage = getDamageValueFromPermanent(attacker, game); + if (canDamage(attacker, first)) { + // must be set before attacker damage marking because of effects like Test of Faith + Map blockerPower = new HashMap<>(); + for (UUID blockerId : blockerOrder) { + Permanent blocker = game.getPermanent(blockerId); + if (canDamage(blocker, first)) { + if (blocker.getBlocking() == 1) { // blocking several creatures handled separately + blockerPower.put(blockerId, getDamageValueFromPermanent(blocker, game)); + } + } + } + Map assigned = new HashMap<>(); + for (Permanent defendingCreature : game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, defendingPlayerId, game)) { + if (defendingCreature != null) { + if (!(damage > 0)) { + break; + } + int damageAssigned = 0; + damageAssigned = player.getAmount(0, damage, "Assign damage to " + defendingCreature.getName(), game); + assigned.put(defendingCreature.getId(), damageAssigned); + damage -= damageAssigned; + } + } + if (damage > 0) { + defenderDamage(attacker, damage, game); + } + // possibly remove? + for (UUID blockerId : blockerOrder) { + Integer power = blockerPower.get(blockerId); + if (power != null) { + // might be missing canDamage condition? + attacker.markDamage(power, blockerId, game, true, true); + } + } + for (Map.Entry entry : assigned.entrySet()) { + Permanent defendingCreature = game.getPermanent(entry.getKey()); + defendingCreature.markDamage(entry.getValue(), attacker.getId(), game, true, true); + } + } else { + // possibly remove? + for (UUID blockerId : blockerOrder) { + Permanent blocker = game.getPermanent(blockerId); + if (canDamage(blocker, first)) { + attacker.markDamage(getDamageValueFromPermanent(blocker, game), blocker.getId(), game, true, true); + } + } + } + } + } + private void singleBlockerDamage(boolean first, Game game) { //TODO: handle banding Permanent blocker = game.getPermanent(blockers.get(0)); From b48c37ea8f7e373280fa24426e9caf8a09371c1f Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Wed, 6 Dec 2017 17:02:49 +0100 Subject: [PATCH 010/164] Defensive Formation slight cleanup --- .../java/mage/game/combat/CombatGroup.java | 66 +++++++------------ 1 file changed, 25 insertions(+), 41 deletions(-) diff --git a/Mage/src/main/java/mage/game/combat/CombatGroup.java b/Mage/src/main/java/mage/game/combat/CombatGroup.java index ffa79a34737..8c164d0b486 100644 --- a/Mage/src/main/java/mage/game/combat/CombatGroup.java +++ b/Mage/src/main/java/mage/game/combat/CombatGroup.java @@ -144,13 +144,7 @@ public class CombatGroup implements Serializable, Copyable { if (!attackers.isEmpty() && (!first || hasFirstOrDoubleStrike(game))) { Permanent attacker = game.getPermanent(attackers.get(0)); if (attacker.getAbilities().containsKey(ControllerDivideCombatDamageAbility.getInstance().getId())) { // for handling Butcher Orgg - Player player = game.getPlayer(attacker.getControllerId()); - for (Permanent defensiveFormation : game.getBattlefield().getAllActivePermanents(defendingPlayerId)) { // for handling Defensive Formation - if (defensiveFormation.getAbilities().containsKey(ControllerAssignCombatDamageToBlockersAbility.getInstance().getId())) { - player = game.getPlayer(defendingPlayerId); - break; - } - } + Player player = game.getPlayer(defenderControlsDefensiveFormation(game) ? defendingPlayerId : attacker.getControllerId()); if (player.chooseUse(Outcome.Damage, "Do you wish to divide " + attacker.getLogName() + "'s combat damage among defending player and/or any number of defending creatures?", null, game)) { butcherOrggDamage(attacker, player, first, game); return; @@ -160,13 +154,7 @@ public class CombatGroup implements Serializable, Copyable { unblockedDamage(first, game); } else { if (attacker.getAbilities().containsKey(DamageAsThoughNotBlockedAbility.getInstance().getId())) { // for handling creatures like Thorn Elemental - Player player = game.getPlayer(attacker.getControllerId()); - for (Permanent defensiveFormation : game.getBattlefield().getAllActivePermanents(defendingPlayerId)) { // for handling Defensive Formation - if (defensiveFormation.getAbilities().containsKey(ControllerAssignCombatDamageToBlockersAbility.getInstance().getId())) { - player = game.getPlayer(defendingPlayerId); - break; - } - } + Player player = game.getPlayer(defenderControlsDefensiveFormation(game) ? defendingPlayerId : attacker.getControllerId()); if (player.chooseUse(Outcome.Damage, "Do you wish to assign damage for " + attacker.getLogName() + " as though it weren't blocked?", null, game)) { blocked = false; unblockedDamage(first, game); @@ -188,13 +176,7 @@ public class CombatGroup implements Serializable, Copyable { for (UUID blockerId : blockers) { Permanent blocker = game.getPermanent(blockerId); if (blocker.getAbilities().containsKey(ControllerDivideCombatDamageAbility.getInstance().getId())) { // for handling Butcher Orgg - Player player = game.getPlayer(blocker.getControllerId()); - for (Permanent defensiveFormation : game.getBattlefield().getAllActivePermanents(defendingPlayerId)) { // for handling Defensive Formation - if (defensiveFormation.getAbilities().containsKey(ControllerAssignCombatDamageToBlockersAbility.getInstance().getId())) { - player = game.getPlayer(defendingPlayerId); - break; - } - } + Player player = game.getPlayer(defenderControlsDefensiveFormation(game) ? defendingPlayerId : blocker.getControllerId()); // the difference should only rarely come up if (player.chooseUse(Outcome.Damage, "Do you wish to divide " + blocker.getLogName() + "'s combat damage among defending player and/or any number of defending creatures?", null, game)) { Permanent attacker = game.getPermanent(attackers.get(0)); butcherOrggDamage(blocker, player, first, game); altDamageMethod = true; @@ -343,13 +325,7 @@ public class CombatGroup implements Serializable, Copyable { if (lethalDamage >= damage) { blocker.markDamage(damage, attacker.getId(), game, true, true); } else { - Player player = game.getPlayer(attacker.getControllerId()); - for (Permanent defensiveFormation : game.getBattlefield().getAllActivePermanents(defendingPlayerId)) { // for handling Defensive Formation - if (defensiveFormation.getAbilities().containsKey(ControllerAssignCombatDamageToBlockersAbility.getInstance().getId())) { - player = game.getPlayer(defendingPlayerId); - break; - } - } + Player player = game.getPlayer(defenderControlsDefensiveFormation(game) ? defendingPlayerId : attacker.getControllerId()); int damageAssigned = player.getAmount(lethalDamage, damage, "Assign damage to " + blocker.getName(), game); blocker.markDamage(damageAssigned, attacker.getId(), game, true, true); damage -= damageAssigned; @@ -377,12 +353,9 @@ public class CombatGroup implements Serializable, Copyable { } boolean oldRuleDamage = false; Player player = game.getPlayer(attacker.getControllerId()); - for (Permanent defensiveFormation : game.getBattlefield().getAllActivePermanents(defendingPlayerId)) { // for handling Defensive Formation - if (defensiveFormation.getAbilities().containsKey(ControllerAssignCombatDamageToBlockersAbility.getInstance().getId())) { - player = game.getPlayer(defendingPlayerId); - oldRuleDamage = true; - break; - } + if (defenderControlsDefensiveFormation(game)) { + player = game.getPlayer(defendingPlayerId); + oldRuleDamage = true; } int damage = getDamageValueFromPermanent(attacker, game); if (canDamage(attacker, first)) { @@ -590,13 +563,14 @@ public class CombatGroup implements Serializable, Copyable { if (blockers.isEmpty()) { return; } - Player player = game.getPlayer(playerId); - for (Permanent defensiveFormation : game.getBattlefield().getAllActivePermanents(defendingPlayerId)) { // for handling Defensive Formation - if (defensiveFormation.getAbilities().containsKey(ControllerAssignCombatDamageToBlockersAbility.getInstance().getId())) { - player = game.getPlayer(defendingPlayerId); - break; - } - } + Player player = game.getPlayer(defenderControlsDefensiveFormation(game) ? defendingPlayerId : playerId); + //~ Player player = game.getPlayer(playerId); + //~ for (Permanent defensiveFormation : game.getBattlefield().getAllActivePermanents(defendingPlayerId)) { // for handling Defensive Formation + //~ if (defensiveFormation.getAbilities().containsKey(ControllerAssignCombatDamageToBlockersAbility.getInstance().getId())) { + //~ player = game.getPlayer(defendingPlayerId); + //~ break; + //~ } + //~ } List blockerList = new ArrayList<>(blockers); blockerOrder.clear(); while (player.canRespond()) { @@ -819,4 +793,14 @@ public class CombatGroup implements Serializable, Copyable { } return false; } + + public boolean defenderControlsDefensiveFormation(Game game) { + // for handling Defensive Formation + for (Permanent defensiveFormation : game.getBattlefield().getAllActivePermanents(defendingPlayerId)) { + if (defensiveFormation.getAbilities().containsKey(ControllerAssignCombatDamageToBlockersAbility.getInstance().getId())) { + return true; + } + } + return false; + } } From 16513408fce9fe54e6f5f9d56c9f859c2bccf838 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Wed, 6 Dec 2017 17:05:30 +0100 Subject: [PATCH 011/164] Cleanup #2 --- Mage/src/main/java/mage/game/combat/CombatGroup.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Mage/src/main/java/mage/game/combat/CombatGroup.java b/Mage/src/main/java/mage/game/combat/CombatGroup.java index 8c164d0b486..9cdf03ebf25 100644 --- a/Mage/src/main/java/mage/game/combat/CombatGroup.java +++ b/Mage/src/main/java/mage/game/combat/CombatGroup.java @@ -564,13 +564,6 @@ public class CombatGroup implements Serializable, Copyable { return; } Player player = game.getPlayer(defenderControlsDefensiveFormation(game) ? defendingPlayerId : playerId); - //~ Player player = game.getPlayer(playerId); - //~ for (Permanent defensiveFormation : game.getBattlefield().getAllActivePermanents(defendingPlayerId)) { // for handling Defensive Formation - //~ if (defensiveFormation.getAbilities().containsKey(ControllerAssignCombatDamageToBlockersAbility.getInstance().getId())) { - //~ player = game.getPlayer(defendingPlayerId); - //~ break; - //~ } - //~ } List blockerList = new ArrayList<>(blockers); blockerOrder.clear(); while (player.canRespond()) { From edd07d4f80443df5edd68f0beb3c676ad060a287 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Wed, 6 Dec 2017 19:46:13 +0100 Subject: [PATCH 012/164] Implemented Butcher Orgg (the missing bits) --- .../java/mage/game/combat/CombatGroup.java | 81 ++++++++++++------- 1 file changed, 51 insertions(+), 30 deletions(-) diff --git a/Mage/src/main/java/mage/game/combat/CombatGroup.java b/Mage/src/main/java/mage/game/combat/CombatGroup.java index 9cdf03ebf25..eabeb9bbcc2 100644 --- a/Mage/src/main/java/mage/game/combat/CombatGroup.java +++ b/Mage/src/main/java/mage/game/combat/CombatGroup.java @@ -9,7 +9,7 @@ * * 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. + * provided with the distribution.i * * 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 @@ -143,12 +143,9 @@ public class CombatGroup implements Serializable, Copyable { public void assignDamageToBlockers(boolean first, Game game) { if (!attackers.isEmpty() && (!first || hasFirstOrDoubleStrike(game))) { Permanent attacker = game.getPermanent(attackers.get(0)); - if (attacker.getAbilities().containsKey(ControllerDivideCombatDamageAbility.getInstance().getId())) { // for handling Butcher Orgg - Player player = game.getPlayer(defenderControlsDefensiveFormation(game) ? defendingPlayerId : attacker.getControllerId()); - if (player.chooseUse(Outcome.Damage, "Do you wish to divide " + attacker.getLogName() + "'s combat damage among defending player and/or any number of defending creatures?", null, game)) { - butcherOrggDamage(attacker, player, first, game); - return; - } + if (isButcherOrgg(attacker, attacker.getControllerId(), first, game, true)) { + game.informPlayers("test one"); + return; } if (blockers.isEmpty()) { unblockedDamage(first, game); @@ -171,20 +168,17 @@ public class CombatGroup implements Serializable, Copyable { public void assignDamageToAttackers(boolean first, Game game) { if (!blockers.isEmpty() && (!first || hasFirstOrDoubleStrike(game))) { - // this never comes up for some reason + // this should only come up if Butcher Orgg is granted the ability to block multiple blockers - warning: untested boolean altDamageMethod = false; for (UUID blockerId : blockers) { Permanent blocker = game.getPermanent(blockerId); - if (blocker.getAbilities().containsKey(ControllerDivideCombatDamageAbility.getInstance().getId())) { // for handling Butcher Orgg - Player player = game.getPlayer(defenderControlsDefensiveFormation(game) ? defendingPlayerId : blocker.getControllerId()); // the difference should only rarely come up - if (player.chooseUse(Outcome.Damage, "Do you wish to divide " + blocker.getLogName() + "'s combat damage among defending player and/or any number of defending creatures?", null, game)) { Permanent attacker = game.getPermanent(attackers.get(0)); - butcherOrggDamage(blocker, player, first, game); - altDamageMethod = true; - continue; - } + if (isButcherOrgg(blocker, blocker.getControllerId(), first, game, false)) { + game.informPlayers("test two"); + altDamageMethod = true; } } if (altDamageMethod) { + // this could be necessary to remake in the future (banding with Butcher Orgg?) return; } if (attackers.size() == 1) { @@ -251,7 +245,7 @@ public class CombatGroup implements Serializable, Copyable { } } - private void butcherOrggDamage(Permanent attacker, Player player, boolean first, Game game) { + private void butcherOrggDamage(Permanent attacker, Player player, boolean first, Game game, boolean isAttacking) { if (!(blocked && blockers.isEmpty()) && (!first || hasFirstOrDoubleStrike(game))) { if (attacker == null) { return; @@ -283,12 +277,16 @@ public class CombatGroup implements Serializable, Copyable { if (damage > 0) { defenderDamage(attacker, damage, game); } - // possibly remove? - for (UUID blockerId : blockerOrder) { - Integer power = blockerPower.get(blockerId); - if (power != null) { - // might be missing canDamage condition? - attacker.markDamage(power, blockerId, game, true, true); + if (isAttacking) { + for (UUID blockerId : blockerOrder) { + Integer power = blockerPower.get(blockerId); + if (power != null) { + // might be missing canDamage condition? + Permanent blocker = game.getPermanent(blockerId); + if (!isButcherOrgg(blocker, blocker.getControllerId(), first, game, false)) { + attacker.markDamage(power, blockerId, game, true, true); + } + } } } for (Map.Entry entry : assigned.entrySet()) { @@ -296,11 +294,14 @@ public class CombatGroup implements Serializable, Copyable { defendingCreature.markDamage(entry.getValue(), attacker.getId(), game, true, true); } } else { - // possibly remove? - for (UUID blockerId : blockerOrder) { - Permanent blocker = game.getPermanent(blockerId); - if (canDamage(blocker, first)) { - attacker.markDamage(getDamageValueFromPermanent(blocker, game), blocker.getId(), game, true, true); + if (isAttacking) { + for (UUID blockerId : blockerOrder) { + Permanent blocker = game.getPermanent(blockerId); + if (canDamage(blocker, first)) { + if (!isButcherOrgg(blocker, blocker.getControllerId(), first, game, false)) { + attacker.markDamage(getDamageValueFromPermanent(blocker, game), blocker.getId(), game, true, true); + } + } } } } @@ -339,7 +340,9 @@ public class CombatGroup implements Serializable, Copyable { } if (canDamage(blocker, first)) { if (blocker.getBlocking() == 1) { // blocking several creatures handled separately - attacker.markDamage(blockerDamage, blocker.getId(), game, true, true); + if (!isButcherOrgg(blocker, blocker.getControllerId(), first, game, false)) { + attacker.markDamage(blockerDamage, blocker.getId(), game, true, true); + } } } } @@ -409,7 +412,11 @@ public class CombatGroup implements Serializable, Copyable { for (UUID blockerId : blockerOrder) { Integer power = blockerPower.get(blockerId); if (power != null) { - attacker.markDamage(power, blockerId, game, true, true); + // might be missing canDamage condition? + Permanent blocker = game.getPermanent(blockerId); + if (!isButcherOrgg(blocker, blocker.getControllerId(), first, game, false)) { + attacker.markDamage(power, blockerId, game, true, true); + } } } for (Map.Entry entry : assigned.entrySet()) { @@ -420,7 +427,9 @@ public class CombatGroup implements Serializable, Copyable { for (UUID blockerId : blockerOrder) { Permanent blocker = game.getPermanent(blockerId); if (canDamage(blocker, first)) { - attacker.markDamage(getDamageValueFromPermanent(blocker, game), blocker.getId(), game, true, true); + if (!isButcherOrgg(blocker, blocker.getControllerId(), first, game, false)) { + attacker.markDamage(getDamageValueFromPermanent(blocker, game), blocker.getId(), game, true, true); + } } } } @@ -796,4 +805,16 @@ public class CombatGroup implements Serializable, Copyable { } return false; } + + public boolean isButcherOrgg(Permanent creature, UUID playerId, boolean first, Game game, boolean isAttacking) { + // for handling Butcher Orgg + if (creature.getAbilities().containsKey(ControllerDivideCombatDamageAbility.getInstance().getId())) { + Player player = game.getPlayer(defenderControlsDefensiveFormation(game) ? defendingPlayerId : playerId); + if (player.chooseUse(Outcome.Damage, "Do you wish to divide " + creature.getLogName() + "'s combat damage among defending player and/or any number of defending creatures?", null, game)) { + butcherOrggDamage(creature, player, first, game, isAttacking); + return true; + } + } + return false; + } } From c6e69868faa84f5ec3f33df34ff4d7764471cd56 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Wed, 6 Dec 2017 19:50:06 +0100 Subject: [PATCH 013/164] Test message cleanup --- Mage/src/main/java/mage/game/combat/CombatGroup.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Mage/src/main/java/mage/game/combat/CombatGroup.java b/Mage/src/main/java/mage/game/combat/CombatGroup.java index eabeb9bbcc2..403aab9154d 100644 --- a/Mage/src/main/java/mage/game/combat/CombatGroup.java +++ b/Mage/src/main/java/mage/game/combat/CombatGroup.java @@ -9,7 +9,7 @@ * * 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.i + * 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 @@ -144,7 +144,6 @@ public class CombatGroup implements Serializable, Copyable { if (!attackers.isEmpty() && (!first || hasFirstOrDoubleStrike(game))) { Permanent attacker = game.getPermanent(attackers.get(0)); if (isButcherOrgg(attacker, attacker.getControllerId(), first, game, true)) { - game.informPlayers("test one"); return; } if (blockers.isEmpty()) { @@ -173,7 +172,6 @@ public class CombatGroup implements Serializable, Copyable { for (UUID blockerId : blockers) { Permanent blocker = game.getPermanent(blockerId); if (isButcherOrgg(blocker, blocker.getControllerId(), first, game, false)) { - game.informPlayers("test two"); altDamageMethod = true; } } From 5fec04935d11fd2559609cb0f27ebbe68e6ad2df Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Wed, 6 Dec 2017 20:31:54 +0100 Subject: [PATCH 014/164] Optimization edit for assignDamageToBlockers --- Mage/src/main/java/mage/game/combat/CombatGroup.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Mage/src/main/java/mage/game/combat/CombatGroup.java b/Mage/src/main/java/mage/game/combat/CombatGroup.java index 403aab9154d..d4a5bf7c4d6 100644 --- a/Mage/src/main/java/mage/game/combat/CombatGroup.java +++ b/Mage/src/main/java/mage/game/combat/CombatGroup.java @@ -142,13 +142,12 @@ public class CombatGroup implements Serializable, Copyable { public void assignDamageToBlockers(boolean first, Game game) { if (!attackers.isEmpty() && (!first || hasFirstOrDoubleStrike(game))) { - Permanent attacker = game.getPermanent(attackers.get(0)); - if (isButcherOrgg(attacker, attacker.getControllerId(), first, game, true)) { - return; - } if (blockers.isEmpty()) { unblockedDamage(first, game); - } else { + return; + } + Permanent attacker = game.getPermanent(attackers.get(0)); + if (!isButcherOrgg(attacker, attacker.getControllerId(), first, game, true)) { if (attacker.getAbilities().containsKey(DamageAsThoughNotBlockedAbility.getInstance().getId())) { // for handling creatures like Thorn Elemental Player player = game.getPlayer(defenderControlsDefensiveFormation(game) ? defendingPlayerId : attacker.getControllerId()); if (player.chooseUse(Outcome.Damage, "Do you wish to assign damage for " + attacker.getLogName() + " as though it weren't blocked?", null, game)) { From e1fdc3093a5f041930e6091b0d22ee85a8455030 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Wed, 6 Dec 2017 21:30:33 +0100 Subject: [PATCH 015/164] Some other edits + small fix for Defensive Formation --- .../java/mage/game/combat/CombatGroup.java | 51 +++++++++---------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/Mage/src/main/java/mage/game/combat/CombatGroup.java b/Mage/src/main/java/mage/game/combat/CombatGroup.java index d4a5bf7c4d6..ba67ca8cfc0 100644 --- a/Mage/src/main/java/mage/game/combat/CombatGroup.java +++ b/Mage/src/main/java/mage/game/combat/CombatGroup.java @@ -142,23 +142,24 @@ public class CombatGroup implements Serializable, Copyable { public void assignDamageToBlockers(boolean first, Game game) { if (!attackers.isEmpty() && (!first || hasFirstOrDoubleStrike(game))) { - if (blockers.isEmpty()) { - unblockedDamage(first, game); - return; - } Permanent attacker = game.getPermanent(attackers.get(0)); if (!isButcherOrgg(attacker, attacker.getControllerId(), first, game, true)) { - if (attacker.getAbilities().containsKey(DamageAsThoughNotBlockedAbility.getInstance().getId())) { // for handling creatures like Thorn Elemental - Player player = game.getPlayer(defenderControlsDefensiveFormation(game) ? defendingPlayerId : attacker.getControllerId()); - if (player.chooseUse(Outcome.Damage, "Do you wish to assign damage for " + attacker.getLogName() + " as though it weren't blocked?", null, game)) { - blocked = false; - unblockedDamage(first, game); - } - } - if (blockers.size() == 1) { - singleBlockerDamage(first, game); + if (blockers.isEmpty()) { + unblockedDamage(first, game); + return; } else { - multiBlockerDamage(first, game); + Player player = game.getPlayer(defenderControlsDefensiveFormation(game) ? defendingPlayerId : attacker.getControllerId()); + if (attacker.getAbilities().containsKey(DamageAsThoughNotBlockedAbility.getInstance().getId())) { // for handling creatures like Thorn Elemental + if (player.chooseUse(Outcome.Damage, "Do you wish to assign damage for " + attacker.getLogName() + " as though it weren't blocked?", null, game)) { + blocked = false; + unblockedDamage(first, game); + } + } + if (blockers.size() == 1) { + singleBlockerDamage(player, first, game); + } else { + multiBlockerDamage(player, first, game); + } } } } @@ -305,7 +306,7 @@ public class CombatGroup implements Serializable, Copyable { } } - private void singleBlockerDamage(boolean first, Game game) { + private void singleBlockerDamage(Player player, boolean first, Game game) { //TODO: handle banding Permanent blocker = game.getPermanent(blockers.get(0)); Permanent attacker = game.getPermanent(attackers.get(0)); @@ -323,7 +324,6 @@ public class CombatGroup implements Serializable, Copyable { if (lethalDamage >= damage) { blocker.markDamage(damage, attacker.getId(), game, true, true); } else { - Player player = game.getPlayer(defenderControlsDefensiveFormation(game) ? defendingPlayerId : attacker.getControllerId()); int damageAssigned = player.getAmount(lethalDamage, damage, "Assign damage to " + blocker.getName(), game); blocker.markDamage(damageAssigned, attacker.getId(), game, true, true); damage -= damageAssigned; @@ -345,18 +345,13 @@ public class CombatGroup implements Serializable, Copyable { } } - private void multiBlockerDamage(boolean first, Game game) { + private void multiBlockerDamage(Player player, boolean first, Game game) { //TODO: handle banding Permanent attacker = game.getPermanent(attackers.get(0)); if (attacker == null) { return; } - boolean oldRuleDamage = false; - Player player = game.getPlayer(attacker.getControllerId()); - if (defenderControlsDefensiveFormation(game)) { - player = game.getPlayer(defendingPlayerId); - oldRuleDamage = true; - } + boolean oldRuleDamage = (player.getId() == defendingPlayerId); int damage = getDamageValueFromPermanent(attacker, game); if (canDamage(attacker, first)) { // must be set before attacker damage marking because of effects like Test of Faith @@ -382,9 +377,13 @@ public class CombatGroup implements Serializable, Copyable { lethalDamage = blocker.getToughness().getValue() - blocker.getDamage(); } if (lethalDamage >= damage) { - assigned.put(blockerId, damage); - damage = 0; - break; + if (!oldRuleDamage) { + assigned.put(blockerId, damage); + damage = 0; + break; + } else if (damage == 0) { + break; + } } int damageAssigned = 0; if (!oldRuleDamage) { From d8daec11d4239a1dd0f3ad9d7513d72c31aea3ae Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Thu, 7 Dec 2017 01:04:31 +0100 Subject: [PATCH 016/164] Fixed Butcher Orgg handling attackers/blockers leaving combat --- Mage/src/main/java/mage/game/combat/CombatGroup.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Mage/src/main/java/mage/game/combat/CombatGroup.java b/Mage/src/main/java/mage/game/combat/CombatGroup.java index ba67ca8cfc0..50f1d778594 100644 --- a/Mage/src/main/java/mage/game/combat/CombatGroup.java +++ b/Mage/src/main/java/mage/game/combat/CombatGroup.java @@ -244,7 +244,7 @@ public class CombatGroup implements Serializable, Copyable { } private void butcherOrggDamage(Permanent attacker, Player player, boolean first, Game game, boolean isAttacking) { - if (!(blocked && blockers.isEmpty()) && (!first || hasFirstOrDoubleStrike(game))) { + if (!((blocked && blockers.isEmpty() && isAttacking) || (attackers.isEmpty() && !isAttacking)) && (!first || hasFirstOrDoubleStrike(game))) { if (attacker == null) { return; } @@ -806,9 +806,12 @@ public class CombatGroup implements Serializable, Copyable { // for handling Butcher Orgg if (creature.getAbilities().containsKey(ControllerDivideCombatDamageAbility.getInstance().getId())) { Player player = game.getPlayer(defenderControlsDefensiveFormation(game) ? defendingPlayerId : playerId); - if (player.chooseUse(Outcome.Damage, "Do you wish to divide " + creature.getLogName() + "'s combat damage among defending player and/or any number of defending creatures?", null, game)) { - butcherOrggDamage(creature, player, first, game, isAttacking); - return true; + // 10/4/2004 If it is blocked but then all of its blockers are removed before combat damage is assigned, then it won’t be able to deal combat damage and you won’t be able to use its ability. + if (!((blocked && blockers.isEmpty() && isAttacking) || (attackers.isEmpty() && !isAttacking))) { + if (player.chooseUse(Outcome.Damage, "Do you wish to divide " + creature.getLogName() + "'s combat damage among defending player and/or any number of defending creatures?", null, game)) { + butcherOrggDamage(creature, player, first, game, isAttacking); + return true; + } } } return false; From 117514a0a93d915e377a5a84d0c8d2ea26934440 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Thu, 7 Dec 2017 05:32:00 +0400 Subject: [PATCH 017/164] Fixed #4226 - wrong ability text in Drakestown Forgotten --- Mage.Sets/src/mage/cards/d/DrakestownForgotten.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/d/DrakestownForgotten.java b/Mage.Sets/src/mage/cards/d/DrakestownForgotten.java index a74dc5d4fdf..8e3fb9424c3 100644 --- a/Mage.Sets/src/mage/cards/d/DrakestownForgotten.java +++ b/Mage.Sets/src/mage/cards/d/DrakestownForgotten.java @@ -65,7 +65,7 @@ public class DrakestownForgotten extends CardImpl { CounterType.P1P1.createInstance(), new CardsInAllGraveyardsCount(new FilterCreatureCard()), false), - "with X +1/+1 counters on it, where X is the number of other creatures on the battlefield")); + "with X +1/+1 counters on it, where X is the number of creature cards in all graveyards")); // {2}{B}, Remove a +1/+1 counter from Drakestown Forgotten: Target creature gets -1/-1 until end of turn. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new BoostTargetEffect(-1, -1, Duration.EndOfTurn), new ManaCostsImpl<>("{2}{B}")); From 230233659b3c19fa9578b7d3fa65762da47e5d0f Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Thu, 7 Dec 2017 11:13:27 +0100 Subject: [PATCH 018/164] Some naming changes, Butcher Orgg first strike fix --- .../java/mage/game/combat/CombatGroup.java | 151 +++++++++--------- 1 file changed, 78 insertions(+), 73 deletions(-) diff --git a/Mage/src/main/java/mage/game/combat/CombatGroup.java b/Mage/src/main/java/mage/game/combat/CombatGroup.java index 50f1d778594..7ad9391ceac 100644 --- a/Mage/src/main/java/mage/game/combat/CombatGroup.java +++ b/Mage/src/main/java/mage/game/combat/CombatGroup.java @@ -143,7 +143,7 @@ public class CombatGroup implements Serializable, Copyable { public void assignDamageToBlockers(boolean first, Game game) { if (!attackers.isEmpty() && (!first || hasFirstOrDoubleStrike(game))) { Permanent attacker = game.getPermanent(attackers.get(0)); - if (!isButcherOrgg(attacker, attacker.getControllerId(), first, game, true)) { + if (!assignsDefendingPlayerAndOrDefendingCreaturesDividedDamage(attacker, attacker.getControllerId(), first, game, true)) { if (blockers.isEmpty()) { unblockedDamage(first, game); return; @@ -167,11 +167,11 @@ public class CombatGroup implements Serializable, Copyable { public void assignDamageToAttackers(boolean first, Game game) { if (!blockers.isEmpty() && (!first || hasFirstOrDoubleStrike(game))) { - // this should only come up if Butcher Orgg is granted the ability to block multiple blockers - warning: untested + // this should only come up if Butcher Orgg is granted the ability to block multiple blockers boolean altDamageMethod = false; for (UUID blockerId : blockers) { Permanent blocker = game.getPermanent(blockerId); - if (isButcherOrgg(blocker, blocker.getControllerId(), first, game, false)) { + if (assignsDefendingPlayerAndOrDefendingCreaturesDividedDamage(blocker, blocker.getControllerId(), first, game, false)) { altDamageMethod = true; } } @@ -243,69 +243,6 @@ public class CombatGroup implements Serializable, Copyable { } } - private void butcherOrggDamage(Permanent attacker, Player player, boolean first, Game game, boolean isAttacking) { - if (!((blocked && blockers.isEmpty() && isAttacking) || (attackers.isEmpty() && !isAttacking)) && (!first || hasFirstOrDoubleStrike(game))) { - if (attacker == null) { - return; - } - int damage = getDamageValueFromPermanent(attacker, game); - if (canDamage(attacker, first)) { - // must be set before attacker damage marking because of effects like Test of Faith - Map blockerPower = new HashMap<>(); - for (UUID blockerId : blockerOrder) { - Permanent blocker = game.getPermanent(blockerId); - if (canDamage(blocker, first)) { - if (blocker.getBlocking() == 1) { // blocking several creatures handled separately - blockerPower.put(blockerId, getDamageValueFromPermanent(blocker, game)); - } - } - } - Map assigned = new HashMap<>(); - for (Permanent defendingCreature : game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, defendingPlayerId, game)) { - if (defendingCreature != null) { - if (!(damage > 0)) { - break; - } - int damageAssigned = 0; - damageAssigned = player.getAmount(0, damage, "Assign damage to " + defendingCreature.getName(), game); - assigned.put(defendingCreature.getId(), damageAssigned); - damage -= damageAssigned; - } - } - if (damage > 0) { - defenderDamage(attacker, damage, game); - } - if (isAttacking) { - for (UUID blockerId : blockerOrder) { - Integer power = blockerPower.get(blockerId); - if (power != null) { - // might be missing canDamage condition? - Permanent blocker = game.getPermanent(blockerId); - if (!isButcherOrgg(blocker, blocker.getControllerId(), first, game, false)) { - attacker.markDamage(power, blockerId, game, true, true); - } - } - } - } - for (Map.Entry entry : assigned.entrySet()) { - Permanent defendingCreature = game.getPermanent(entry.getKey()); - defendingCreature.markDamage(entry.getValue(), attacker.getId(), game, true, true); - } - } else { - if (isAttacking) { - for (UUID blockerId : blockerOrder) { - Permanent blocker = game.getPermanent(blockerId); - if (canDamage(blocker, first)) { - if (!isButcherOrgg(blocker, blocker.getControllerId(), first, game, false)) { - attacker.markDamage(getDamageValueFromPermanent(blocker, game), blocker.getId(), game, true, true); - } - } - } - } - } - } - } - private void singleBlockerDamage(Player player, boolean first, Game game) { //TODO: handle banding Permanent blocker = game.getPermanent(blockers.get(0)); @@ -337,7 +274,7 @@ public class CombatGroup implements Serializable, Copyable { } if (canDamage(blocker, first)) { if (blocker.getBlocking() == 1) { // blocking several creatures handled separately - if (!isButcherOrgg(blocker, blocker.getControllerId(), first, game, false)) { + if (!assignsDefendingPlayerAndOrDefendingCreaturesDividedDamage(blocker, blocker.getControllerId(), first, game, false)) { attacker.markDamage(blockerDamage, blocker.getId(), game, true, true); } } @@ -410,7 +347,7 @@ public class CombatGroup implements Serializable, Copyable { if (power != null) { // might be missing canDamage condition? Permanent blocker = game.getPermanent(blockerId); - if (!isButcherOrgg(blocker, blocker.getControllerId(), first, game, false)) { + if (!assignsDefendingPlayerAndOrDefendingCreaturesDividedDamage(blocker, blocker.getControllerId(), first, game, false)) { attacker.markDamage(power, blockerId, game, true, true); } } @@ -423,7 +360,7 @@ public class CombatGroup implements Serializable, Copyable { for (UUID blockerId : blockerOrder) { Permanent blocker = game.getPermanent(blockerId); if (canDamage(blocker, first)) { - if (!isButcherOrgg(blocker, blocker.getControllerId(), first, game, false)) { + if (!assignsDefendingPlayerAndOrDefendingCreaturesDividedDamage(blocker, blocker.getControllerId(), first, game, false)) { attacker.markDamage(getDamageValueFromPermanent(blocker, game), blocker.getId(), game, true, true); } } @@ -431,6 +368,73 @@ public class CombatGroup implements Serializable, Copyable { } } + private void defendingPlayerAndOrDefendingCreaturesDividedDamage(Permanent attacker, Player player, boolean first, Game game, boolean isAttacking) { + // for handling Butcher Orgg + if (!((blocked && blockers.isEmpty() && isAttacking) || (attackers.isEmpty() && !isAttacking))) { + if (attacker == null) { + return; + } + int damage = getDamageValueFromPermanent(attacker, game); + if (canDamage(attacker, first)) { + // must be set before attacker damage marking because of effects like Test of Faith + Map blockerPower = new HashMap<>(); + for (UUID blockerId : blockerOrder) { + Permanent blocker = game.getPermanent(blockerId); + if (canDamage(blocker, first)) { + if (blocker.getBlocking() == 1) { // blocking several creatures handled separately + blockerPower.put(blockerId, getDamageValueFromPermanent(blocker, game)); + } + } + } + Map assigned = new HashMap<>(); + for (Permanent defendingCreature : game.getBattlefield().getAllActivePermanents(StaticFilters.FILTER_PERMANENT_CREATURE, defendingPlayerId, game)) { + if (defendingCreature != null) { + if (!(damage > 0)) { + break; + } + int damageAssigned = 0; + damageAssigned = player.getAmount(0, damage, "Assign damage to " + defendingCreature.getName(), game); + assigned.put(defendingCreature.getId(), damageAssigned); + damage -= damageAssigned; + } + } + if (damage > 0) { + Player defendingPlayer = game.getPlayer(defendingPlayerId); + if (defendingPlayer.isInGame()) { + defendingPlayer.damage(damage, attacker.getId(), game, true, true); + } + } + if (isAttacking) { + for (UUID blockerId : blockerOrder) { + Integer power = blockerPower.get(blockerId); + if (power != null) { + // might be missing canDamage condition? + Permanent blocker = game.getPermanent(blockerId); + if (!assignsDefendingPlayerAndOrDefendingCreaturesDividedDamage(blocker, blocker.getControllerId(), first, game, false)) { + attacker.markDamage(power, blockerId, game, true, true); + } + } + } + } + for (Map.Entry entry : assigned.entrySet()) { + Permanent defendingCreature = game.getPermanent(entry.getKey()); + defendingCreature.markDamage(entry.getValue(), attacker.getId(), game, true, true); + } + } else { + if (isAttacking) { + for (UUID blockerId : blockerOrder) { + Permanent blocker = game.getPermanent(blockerId); + if (canDamage(blocker, first)) { + if (!assignsDefendingPlayerAndOrDefendingCreaturesDividedDamage(blocker, blocker.getControllerId(), first, game, false)) { + attacker.markDamage(getDamageValueFromPermanent(blocker, game), blocker.getId(), game, true, true); + } + } + } + } + } + } + } + /** * Damages attacking creatures by a creature that blocked several ones * Damages only attackers as blocker was damage in @@ -802,14 +806,15 @@ public class CombatGroup implements Serializable, Copyable { return false; } - public boolean isButcherOrgg(Permanent creature, UUID playerId, boolean first, Game game, boolean isAttacking) { + public boolean assignsDefendingPlayerAndOrDefendingCreaturesDividedDamage(Permanent creature, UUID playerId, boolean first, Game game, boolean isAttacking) { // for handling Butcher Orgg if (creature.getAbilities().containsKey(ControllerDivideCombatDamageAbility.getInstance().getId())) { Player player = game.getPlayer(defenderControlsDefensiveFormation(game) ? defendingPlayerId : playerId); // 10/4/2004 If it is blocked but then all of its blockers are removed before combat damage is assigned, then it won’t be able to deal combat damage and you won’t be able to use its ability. - if (!((blocked && blockers.isEmpty() && isAttacking) || (attackers.isEmpty() && !isAttacking))) { - if (player.chooseUse(Outcome.Damage, "Do you wish to divide " + creature.getLogName() + "'s combat damage among defending player and/or any number of defending creatures?", null, game)) { - butcherOrggDamage(creature, player, first, game, isAttacking); + // (same principle should apply if it's blocking and its blocked attacker is removed from combat) + if (!((blocked && blockers.isEmpty() && isAttacking) || (attackers.isEmpty() && !isAttacking)) && canDamage(creature, first)) { + if (player.chooseUse(Outcome.Damage, "Do you wish to assign " + creature.getLogName() + "'s combat damage divided among defending player and/or any number of defending creatures?", null, game)) { + defendingPlayerAndOrDefendingCreaturesDividedDamage(creature, player, first, game, isAttacking); return true; } } From b16f50cd7279f8e6bee684c90ad974abc9166610 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Thu, 7 Dec 2017 21:28:42 +0100 Subject: [PATCH 019/164] Entrails Feaster fixes --- Mage.Sets/src/mage/cards/e/EntrailsFeaster.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/cards/e/EntrailsFeaster.java b/Mage.Sets/src/mage/cards/e/EntrailsFeaster.java index f796d7ba7eb..a446dd82ad2 100644 --- a/Mage.Sets/src/mage/cards/e/EntrailsFeaster.java +++ b/Mage.Sets/src/mage/cards/e/EntrailsFeaster.java @@ -105,10 +105,10 @@ class EntrailsFeasterEffect extends OneShotEffect { if (controller.choose(Outcome.Exile, target, source.getId(), game)) { Card cardChosen = game.getCard(target.getFirstTarget()); if (cardChosen != null) { - controller.moveCardToExileWithInfo(cardChosen, null, "", source.getSourceId(), game, Zone.GRAVEYARD, true); + controller.moveCardsToExile(cardChosen, source, game, true, null, ""); if (sourceObject != null) { sourceObject.getCounters(game).addCounter(CounterType.P1P1.createInstance()); - game.informPlayers(controller.getLogName() + " puts a +1/+1 counter on " + sourceObject.getName()); + game.informPlayers(controller.getLogName() + " puts a +1/+1 counter on " + sourceObject.getLogName()); } } } else if (sourceObject != null) { From 73504fd3c1c9ab3e06e887bae8598fbfb4689761 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Thu, 7 Dec 2017 21:58:30 +0100 Subject: [PATCH 020/164] Implemented Glyph of Life --- Mage.Sets/src/mage/cards/g/GlyphOfLife.java | 148 ++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/g/GlyphOfLife.java diff --git a/Mage.Sets/src/mage/cards/g/GlyphOfLife.java b/Mage.Sets/src/mage/cards/g/GlyphOfLife.java new file mode 100644 index 00000000000..69abf3dc790 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GlyphOfLife.java @@ -0,0 +1,148 @@ +/* + * 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.g; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.DelayedTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.InfoEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.DamagedCreatureEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author fireshoes & L_J + */ +public class GlyphOfLife extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Wall creature"); + + static { + filter.add(new SubtypePredicate(SubType.WALL)); + } + + public GlyphOfLife(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{W}"); + + // Choose target Wall creature. Whenever that creature is dealt damage by an attacking creature this turn, you gain that much life. + this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); + this.getSpellAbility().addEffect(new InfoEffect("Choose target Wall creature")); + this.getSpellAbility().addEffect(new CreateDelayedTriggeredAbilityEffect(new GlyphOfLifeTriggeredAbility())); + } + + public GlyphOfLife(final GlyphOfLife card) { + super(card); + } + + @Override + public GlyphOfLife copy() { + return new GlyphOfLife(this); + } +} + +class GlyphOfLifeTriggeredAbility extends DelayedTriggeredAbility { + + public GlyphOfLifeTriggeredAbility() { + super(new GlyphOfLifeGainLifeEffect(), Duration.EndOfTurn, false); + } + + public GlyphOfLifeTriggeredAbility(final GlyphOfLifeTriggeredAbility effect) { + super(effect); + } + + @Override + public GlyphOfLifeTriggeredAbility copy() { + return new GlyphOfLifeTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.DAMAGED_CREATURE; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (event.getTargetId().equals(this.getFirstTarget())) { + DamagedCreatureEvent damageEvent = (DamagedCreatureEvent) event; + Permanent attackingCreature = game.getPermanentOrLKIBattlefield(damageEvent.getSourceId()); + if (attackingCreature != null && attackingCreature.isCreature() && attackingCreature.isAttacking()) { + this.getEffects().get(0).setValue("damageAmount", event.getAmount()); + return true; + } + } + return false; + } + + @Override + public String getRule() { + return "Whenever that creature is dealt damage by an attacking creature this turn, " + super.getRule(); + } +} + +class GlyphOfLifeGainLifeEffect extends OneShotEffect { + + public GlyphOfLifeGainLifeEffect() { + super(Outcome.GainLife); + staticText = "you gain that much life"; + } + + public GlyphOfLifeGainLifeEffect(final GlyphOfLifeGainLifeEffect effect) { + super(effect); + } + + @Override + public GlyphOfLifeGainLifeEffect copy() { + return new GlyphOfLifeGainLifeEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + player.gainLife((Integer) this.getValue("damageAmount"), game); + } + return true; + } + +} From 887fec53019b6a520132c2f6638a91b0ac4b3f9c Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Thu, 7 Dec 2017 21:59:42 +0100 Subject: [PATCH 021/164] Implemented Glyph of Life --- Mage.Sets/src/mage/sets/Legends.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage.Sets/src/mage/sets/Legends.java b/Mage.Sets/src/mage/sets/Legends.java index 53bd34f1b5b..b180b62b5c4 100644 --- a/Mage.Sets/src/mage/sets/Legends.java +++ b/Mage.Sets/src/mage/sets/Legends.java @@ -129,6 +129,7 @@ public class Legends extends ExpansionSet { cards.add(new SetCardInfo("Giant Strength", 147, Rarity.COMMON, mage.cards.g.GiantStrength.class)); cards.add(new SetCardInfo("Giant Turtle", 102, Rarity.COMMON, mage.cards.g.GiantTurtle.class)); cards.add(new SetCardInfo("Glyph of Destruction", 148, Rarity.COMMON, mage.cards.g.GlyphOfDestruction.class)); + cards.add(new SetCardInfo("Glyph of Life", 184, Rarity.COMMON, mage.cards.g.GlyphOfLife.class)); cards.add(new SetCardInfo("Gravity Sphere", 149, Rarity.RARE, mage.cards.g.GravitySphere.class)); cards.add(new SetCardInfo("Great Defender", 185, Rarity.UNCOMMON, mage.cards.g.GreatDefender.class)); cards.add(new SetCardInfo("Greater Realm of Preservation", 187, Rarity.UNCOMMON, mage.cards.g.GreaterRealmOfPreservation.class)); From 33cdada012448cba44566f1e0aa19249089713e7 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Thu, 7 Dec 2017 22:46:24 +0100 Subject: [PATCH 022/164] Callous Oppressor fix --- .../src/mage/cards/c/CallousOppressor.java | 50 ++++++++++++++----- 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/Mage.Sets/src/mage/cards/c/CallousOppressor.java b/Mage.Sets/src/mage/cards/c/CallousOppressor.java index f9d9bb0d601..63acbd3c2e1 100644 --- a/Mage.Sets/src/mage/cards/c/CallousOppressor.java +++ b/Mage.Sets/src/mage/cards/c/CallousOppressor.java @@ -51,8 +51,6 @@ import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Zone; import mage.filter.common.FilterCreaturePermanent; -import mage.filter.predicate.Predicates; -import mage.filter.predicate.mageobject.ChosenSubtypePredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; @@ -76,17 +74,15 @@ public class CallousOppressor extends CardImpl { this.addAbility(new SkipUntapOptionalAbility()); // As Callous Oppressor enters the battlefield, an opponent chooses a creature type. - this.addAbility(new AsEntersBattlefieldAbility(new OpponentChooseCreatureTypeEffect())); + this.addAbility(new AsEntersBattlefieldAbility(new CallousOppressorChooseCreatureTypeEffect())); // {T}: Gain control of target creature that isn't of the chosen type for as long as Callous Oppressor remains tapped. - FilterCreaturePermanent filter = new FilterCreaturePermanent("creature that isn't of the chosen type"); - filter.add(Predicates.not(new ChosenSubtypePredicate(this.getId()))); ConditionalContinuousEffect effect = new ConditionalContinuousEffect( new GainControlTargetEffect(Duration.OneUse), SourceTappedCondition.instance, - "Gain control of target creature for as long as Callous Oppressor remains tapped"); + "Gain control of target creature for as long as {this} remains tapped"); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, effect, new TapSourceCost()); - ability.addTarget(new TargetCreaturePermanent(filter)); + ability.addTarget(new TargetCreaturePermanent(new CallousOppressorFilter())); this.addAbility(ability); } @@ -100,14 +96,43 @@ public class CallousOppressor extends CardImpl { } } -class OpponentChooseCreatureTypeEffect extends OneShotEffect { +class CallousOppressorFilter extends FilterCreaturePermanent { + + public CallousOppressorFilter() { + super("creature that isn't of the chosen type"); + } + + public CallousOppressorFilter(final CallousOppressorFilter filter) { + super(filter); + } + + @Override + public CallousOppressorFilter copy() { + return new CallousOppressorFilter(this); + } + + @Override + public boolean match(Permanent permanent, UUID sourceId, UUID playerId, Game game) { + if (super.match(permanent, sourceId, playerId, game)) { + SubType subtype = (SubType) game.getState().getValue(sourceId + "_type"); + if (subtype != null && permanent.hasSubtype(subtype, game)) { + return false; + } + return true; + } + return false; + } + +} - public OpponentChooseCreatureTypeEffect() { +class CallousOppressorChooseCreatureTypeEffect extends OneShotEffect { + + public CallousOppressorChooseCreatureTypeEffect() { super(Outcome.Benefit); staticText = "an opponent chooses a creature type"; } - public OpponentChooseCreatureTypeEffect(final OpponentChooseCreatureTypeEffect effect) { + public CallousOppressorChooseCreatureTypeEffect(final CallousOppressorChooseCreatureTypeEffect effect) { super(effect); } @@ -147,14 +172,15 @@ class OpponentChooseCreatureTypeEffect extends OneShotEffect { if (mageObject instanceof Permanent) { ((Permanent) mageObject).addInfo("chosen type", CardUtil.addToolTipMarkTags("Chosen type: " + typeChoice.getChoice()), game); } + return true; } } return false; } @Override - public OpponentChooseCreatureTypeEffect copy() { - return new OpponentChooseCreatureTypeEffect(this); + public CallousOppressorChooseCreatureTypeEffect copy() { + return new CallousOppressorChooseCreatureTypeEffect(this); } } From a2840cd148ae203991498e3ed86bbc9fa0203e94 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Thu, 7 Dec 2017 22:49:18 +0100 Subject: [PATCH 023/164] Doom Cannon fix --- Mage.Sets/src/mage/cards/d/DoomCannon.java | 36 +++++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/Mage.Sets/src/mage/cards/d/DoomCannon.java b/Mage.Sets/src/mage/cards/d/DoomCannon.java index 33ae3a9b366..383bf31b35b 100644 --- a/Mage.Sets/src/mage/cards/d/DoomCannon.java +++ b/Mage.Sets/src/mage/cards/d/DoomCannon.java @@ -39,10 +39,12 @@ import mage.abilities.effects.common.DamageTargetEffect; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; +import mage.constants.SubType; import mage.constants.Outcome; import mage.constants.Zone; import mage.filter.common.FilterControlledCreaturePermanent; -import mage.filter.predicate.mageobject.ChosenSubtypePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; import mage.target.common.TargetControlledCreaturePermanent; import mage.target.common.TargetCreatureOrPlayer; @@ -59,11 +61,9 @@ public class DoomCannon extends CardImpl { this.addAbility(new AsEntersBattlefieldAbility(new ChooseCreatureTypeEffect(Outcome.Sacrifice))); // {3}, {T}, Sacrifice a creature of the chosen type: Doom Cannon deals 3 damage to target creature or player. - FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("a creature of the chosen type"); - filter.add(new ChosenSubtypePredicate(this.getId())); Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DamageTargetEffect(3), new GenericManaCost(3)); ability.addCost(new TapSourceCost()); - ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(filter))); + ability.addCost(new SacrificeTargetCost(new TargetControlledCreaturePermanent(new DoomCannonFilter()))); ability.addTarget(new TargetCreatureOrPlayer()); this.addAbility(ability); } @@ -77,3 +77,31 @@ public class DoomCannon extends CardImpl { return new DoomCannon(this); } } + +class DoomCannonFilter extends FilterControlledCreaturePermanent { + + public DoomCannonFilter() { + super("a creature of the chosen type"); + } + + public DoomCannonFilter(final DoomCannonFilter filter) { + super(filter); + } + + @Override + public DoomCannonFilter copy() { + return new DoomCannonFilter(this); + } + + @Override + public boolean match(Permanent permanent, UUID sourceId, UUID playerId, Game game) { + if (super.match(permanent, sourceId, playerId, game)) { + SubType subtype = (SubType) game.getState().getValue(sourceId + "_type"); + if (subtype != null && permanent.hasSubtype(subtype, game)) { + return true; + } + } + return false; + } + +} From 2f9536e11a94305ea889351db8df64c58bae966b Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Mon, 11 Dec 2017 17:20:34 +0100 Subject: [PATCH 024/164] Implemented Ashnod's Cylix --- Mage.Sets/src/mage/cards/a/AshnodsCylix.java | 125 +++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/a/AshnodsCylix.java diff --git a/Mage.Sets/src/mage/cards/a/AshnodsCylix.java b/Mage.Sets/src/mage/cards/a/AshnodsCylix.java new file mode 100644 index 00000000000..fd11615bf38 --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AshnodsCylix.java @@ -0,0 +1,125 @@ +/* + * 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.a; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.Cost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.OneShotEffect; +import mage.cards.Card; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.cards.CardsImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.Target; +import mage.target.TargetCard; +import mage.target.TargetPlayer; + +/** + * + * @author L_J + */ +public class AshnodsCylix extends CardImpl { + + public AshnodsCylix(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{2}"); + + // {3}, {T}: Target player looks at the top three cards of his or her library, puts one of them back on top of his or her library, then exiles the rest. + SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AshnodsCylixEffect(), new GenericManaCost(3)); + ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetPlayer()); + this.addAbility(ability); + } + + public AshnodsCylix(final AshnodsCylix card) { + super(card); + } + + @Override + public AshnodsCylix copy() { + return new AshnodsCylix(this); + } +} + +class AshnodsCylixEffect extends OneShotEffect { + + AshnodsCylixEffect() { + super(Outcome.Benefit); + this.staticText = "Target player looks at the top three cards of his or her library, puts one of them back on top of his or her library, then exiles the rest"; + } + + AshnodsCylixEffect(final AshnodsCylixEffect effect) { + super(effect); + } + + @Override + public AshnodsCylixEffect copy() { + return new AshnodsCylixEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getFirstTarget()); + if (player == null) { + return false; + } + Cards cards = new CardsImpl(); + int count = Math.min(player.getLibrary().size(), 3); + for (int i = 0; i < count; i++) { + Card card = player.getLibrary().removeFromTop(game); + if (card != null) { + cards.add(card); + } + } + //~ player.revealCards(source.getSourceObject(game).getIdName(), cards, game); + TargetCard target = new TargetCard(Zone.LIBRARY, new FilterCard("card to put on top of your library")); + if (player.choose(Outcome.DrawCard, cards, target, game)) { + Card card = cards.get(target.getFirstTarget(), game); + if (card != null) { + cards.remove(card); + player.getLibrary().putOnTop(card, game); + game.informPlayers(source.getSourceObject(game).getIdName() + ": " + player.getLogName() + " puts a card on top of his or her library"); + } + } + for (UUID cardId : cards) { + Card card = game.getCard(cardId); + card.moveToExile(null, "", source.getSourceId(), game); + } + return true; + } +} From e80217304b6cc47ba935cff06a1f9c8f706acc29 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Mon, 11 Dec 2017 17:21:23 +0100 Subject: [PATCH 025/164] Implemented Soldevi Steam Beast --- .../src/mage/cards/s/SoldeviSteamBeast.java | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SoldeviSteamBeast.java diff --git a/Mage.Sets/src/mage/cards/s/SoldeviSteamBeast.java b/Mage.Sets/src/mage/cards/s/SoldeviSteamBeast.java new file mode 100644 index 00000000000..41c9a6c84ed --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SoldeviSteamBeast.java @@ -0,0 +1,74 @@ +/* + * 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.s; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BecomesTappedSourceTriggeredAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.common.GainLifeTargetEffect; +import mage.abilities.effects.common.RegenerateSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.target.common.TargetOpponent; + +/** + * + * @author L_J + */ +public class SoldeviSteamBeast extends CardImpl { + + public SoldeviSteamBeast(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{5}"); + this.subtype.add(SubType.BEAST); + this.power = new MageInt(4); + this.toughness = new MageInt(2); + + // Whenever Soldevi Steam Beast becomes tapped, target opponent gains 2 life. + Ability ability = new BecomesTappedSourceTriggeredAbility(new GainLifeTargetEffect(2)); + ability.addTarget(new TargetOpponent()); + this.addAbility(ability); + + // {2}: Regenerate Soldevi Steam Beast. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new RegenerateSourceEffect(), new GenericManaCost(3))); + } + + public SoldeviSteamBeast(final SoldeviSteamBeast card) { + super(card); + } + + @Override + public SoldeviSteamBeast copy() { + return new SoldeviSteamBeast(this); + } +} From 927692d51448f3845d5252fa3ff61af95fb76440 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Mon, 11 Dec 2017 17:21:59 +0100 Subject: [PATCH 026/164] Implemented Stromgald Spy --- Mage.Sets/src/mage/cards/s/StromgaldSpy.java | 106 +++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/StromgaldSpy.java diff --git a/Mage.Sets/src/mage/cards/s/StromgaldSpy.java b/Mage.Sets/src/mage/cards/s/StromgaldSpy.java new file mode 100644 index 00000000000..082fe025195 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/StromgaldSpy.java @@ -0,0 +1,106 @@ +/* + * 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.s; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AttacksAndIsNotBlockedTriggeredAbility; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.abilities.effects.common.continuous.AssignNoCombatDamageSourceEffect; +import mage.constants.SubType; +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.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author L_J + */ +public class StromgaldSpy extends CardImpl { + + public StromgaldSpy(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}"); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.ROGUE); + this.power = new MageInt(2); + this.toughness = new MageInt(4); + + // Whenever Stromgald Spy attacks and isn't blocked, you may have defending player play with his or her hand revealed for as long as Stromgald Spy remains on the battlefield. If you do, Stromgald Spy assigns no combat damage this turn. + Ability ability = new AttacksAndIsNotBlockedTriggeredAbility(new StromgaldSpyEffect(), true, true); + ability.addEffect(new AssignNoCombatDamageSourceEffect(Duration.EndOfTurn, true)); + this.addAbility(ability); + } + + public StromgaldSpy(final StromgaldSpy card) { + super(card); + } + + @Override + public StromgaldSpy copy() { + return new StromgaldSpy(this); + } +} + +class StromgaldSpyEffect extends ContinuousEffectImpl { + + public StromgaldSpyEffect() { + super(Duration.WhileOnBattlefield, Layer.PlayerEffects, SubLayer.NA, Outcome.Detriment); + this.staticText = "you may have defending player play with his or her hand revealed for as long as Stromgald Spy remains on the battlefield"; + } + + public StromgaldSpyEffect(final StromgaldSpyEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent sourcePermanent = game.getPermanent(source.getSourceId()); + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null && sourcePermanent != null) { + Player defender = game.getPlayer(this.getTargetPointer().getFirst(game, source)); + if (defender != null) { + defender.revealCards(defender.getName() + "'s hand cards", defender.getHand(), game, false); + } + return true; + } + return false; + } + + @Override + public StromgaldSpyEffect copy() { + return new StromgaldSpyEffect(this); + } +} From 67983d755f332a56c69315228bb6dcdad99aab49 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Mon, 11 Dec 2017 17:22:58 +0100 Subject: [PATCH 027/164] Implemented Ashnod's Cylix --- Mage.Sets/src/mage/sets/MastersEditionII.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage.Sets/src/mage/sets/MastersEditionII.java b/Mage.Sets/src/mage/sets/MastersEditionII.java index cafbc870abb..ec1bba35f8f 100644 --- a/Mage.Sets/src/mage/sets/MastersEditionII.java +++ b/Mage.Sets/src/mage/sets/MastersEditionII.java @@ -77,6 +77,7 @@ public class MastersEditionII extends ExpansionSet { cards.add(new SetCardInfo("Armor of Faith", 4, Rarity.COMMON, mage.cards.a.ArmorOfFaith.class)); cards.add(new SetCardInfo("Armor Thrull", 77, Rarity.COMMON, ArmorThrull.class)); cards.add(new SetCardInfo("Ashen Ghoul", 78, Rarity.UNCOMMON, mage.cards.a.AshenGhoul.class)); + cards.add(new SetCardInfo("Ashnod's Cylix", 203, Rarity.RARE, mage.cards.a.AshnodsCylix.class)); cards.add(new SetCardInfo("Aurochs", 153, Rarity.COMMON, mage.cards.a.Aurochs.class)); cards.add(new SetCardInfo("Aysen Bureaucrats", 6, Rarity.COMMON, mage.cards.a.AysenBureaucrats.class)); cards.add(new SetCardInfo("Aysen Crusader", 7, Rarity.UNCOMMON, mage.cards.a.AysenCrusader.class)); From e4215cc1efb492d6eddc3a909b174237fa9ca00f Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Mon, 11 Dec 2017 17:24:45 +0100 Subject: [PATCH 028/164] Implemented cards --- Mage.Sets/src/mage/sets/Alliances.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Mage.Sets/src/mage/sets/Alliances.java b/Mage.Sets/src/mage/sets/Alliances.java index e97dda21691..a2f06f874ed 100644 --- a/Mage.Sets/src/mage/sets/Alliances.java +++ b/Mage.Sets/src/mage/sets/Alliances.java @@ -46,6 +46,7 @@ public class Alliances extends ExpansionSet { cards.add(new SetCardInfo("Agent of Stromgald", 95, Rarity.COMMON, AgentOfStromgald.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Arcane Denial", 32, Rarity.COMMON, mage.cards.a.ArcaneDenial.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Arcane Denial", 33, Rarity.COMMON, mage.cards.a.ArcaneDenial.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Ashnod's Cylix", 158, Rarity.RARE, mage.cards.a.AshnodsCylix.class)); cards.add(new SetCardInfo("Astrolabe", 159, Rarity.COMMON, mage.cards.a.Astrolabe.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Astrolabe", 160, Rarity.COMMON, mage.cards.a.Astrolabe.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Balduvian Dead", 1, Rarity.UNCOMMON, mage.cards.b.BalduvianDead.class)); @@ -153,6 +154,8 @@ public class Alliances extends ExpansionSet { cards.add(new SetCardInfo("Soldevi Heretic", 50, Rarity.COMMON, mage.cards.s.SoldeviHeretic.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Soldevi Sage", 51, Rarity.COMMON, SoldeviSage.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Soldevi Sage", 52, Rarity.COMMON, SoldeviSage.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Soldevi Steam Beast", 177, Rarity.COMMON, mage.cards.s.SoldeviSteamBeast.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Soldevi Steam Beast", 178, Rarity.COMMON, mage.cards.s.SoldeviSteamBeast.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Soldier of Fortune", 117, Rarity.UNCOMMON, mage.cards.s.SoldierOfFortune.class)); cards.add(new SetCardInfo("Sol Grail", 173, Rarity.UNCOMMON, mage.cards.s.SolGrail.class)); cards.add(new SetCardInfo("Stench of Decay", 27, Rarity.COMMON, mage.cards.s.StenchOfDecay.class, NON_FULL_USE_VARIOUS)); @@ -162,6 +165,7 @@ public class Alliances extends ExpansionSet { cards.add(new SetCardInfo("Storm Crow", 55, Rarity.COMMON, mage.cards.s.StormCrow.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Storm Shaman", 118, Rarity.COMMON, StormShaman.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Storm Shaman", 119, Rarity.UNCOMMON, StormShaman.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Stromgald Spy", 29, Rarity.UNCOMMON, mage.cards.s.StromgaldSpy.class)); cards.add(new SetCardInfo("Surge of Strength", 197, Rarity.UNCOMMON, mage.cards.s.SurgeOfStrength.class)); cards.add(new SetCardInfo("Sustaining Spirit", 151, Rarity.RARE, mage.cards.s.SustainingSpirit.class)); cards.add(new SetCardInfo("Swamp Mosquito", 30, Rarity.COMMON, SwampMosquito.class, NON_FULL_USE_VARIOUS)); From dca59519341176865ccfc776541e78dcd4407dc0 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Wed, 13 Dec 2017 11:55:31 +0100 Subject: [PATCH 029/164] Implemented Seeker --- Mage.Sets/src/mage/cards/s/Seeker.java | 91 ++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/Seeker.java diff --git a/Mage.Sets/src/mage/cards/s/Seeker.java b/Mage.Sets/src/mage/cards/s/Seeker.java new file mode 100644 index 00000000000..012a0ea0153 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/Seeker.java @@ -0,0 +1,91 @@ +/* + * 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.s; + +import java.util.UUID; +import mage.ObjectColor; +import mage.abilities.Ability; +import mage.abilities.common.SimpleEvasionAbility; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.effects.common.combat.CantBeBlockedByCreaturesAttachedEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.AttachmentType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 & L_J + */ +public class Seeker extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("except by artifact creatures and/or white creatures"); + + static { + filter.add(Predicates.not( + Predicates.or( + Predicates.and(new CardTypePredicate(CardType.ARTIFACT), new CardTypePredicate(CardType.CREATURE)), + Predicates.and(new CardTypePredicate(CardType.CREATURE), new ColorPredicate(ObjectColor.WHITE) + )))); + } + + public Seeker(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{W}{W}"); + this.subtype.add(SubType.AURA); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.BoostCreature)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // Enchanted creature can't be blocked except by artifact creatures and/or white creatures. + this.addAbility(new SimpleEvasionAbility(new CantBeBlockedByCreaturesAttachedEffect(Duration.WhileOnBattlefield, filter, AttachmentType.AURA))); + + } + + public Seeker(final Seeker card) { + super(card); + } + + @Override + public Seeker copy() { + return new Seeker(this); + } +} From 92f9d5e9f29e6a4820e33227f08613485572c9bd Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Wed, 13 Dec 2017 11:56:32 +0100 Subject: [PATCH 030/164] Implemented Seeker --- Mage.Sets/src/mage/sets/Legends.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage.Sets/src/mage/sets/Legends.java b/Mage.Sets/src/mage/sets/Legends.java index b180b62b5c4..849c78e2fec 100644 --- a/Mage.Sets/src/mage/sets/Legends.java +++ b/Mage.Sets/src/mage/sets/Legends.java @@ -233,6 +233,7 @@ public class Legends extends ExpansionSet { cards.add(new SetCardInfo("Rubinia Soulsinger", 296, Rarity.RARE, mage.cards.r.RubiniaSoulsinger.class)); cards.add(new SetCardInfo("Rust", 49, Rarity.COMMON, mage.cards.r.Rust.class)); cards.add(new SetCardInfo("Sea Kings' Blessing", 75, Rarity.UNCOMMON, mage.cards.s.SeaKingsBlessing.class)); + cards.add(new SetCardInfo("Seeker", 204, Rarity.UNCOMMON, mage.cards.s.Seeker.class)); cards.add(new SetCardInfo("Segovian Leviathan", 76, Rarity.UNCOMMON, mage.cards.s.SegovianLeviathan.class)); cards.add(new SetCardInfo("Sentinel", 239, Rarity.RARE, mage.cards.s.Sentinel.class)); cards.add(new SetCardInfo("Serpent Generator", 240, Rarity.RARE, mage.cards.s.SerpentGenerator.class)); From af19f49710e5b06a9aeb66966aaa972e47199929 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Wed, 13 Dec 2017 11:57:31 +0100 Subject: [PATCH 031/164] Implemented Seeker --- Mage.Sets/src/mage/sets/FourthEdition.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage.Sets/src/mage/sets/FourthEdition.java b/Mage.Sets/src/mage/sets/FourthEdition.java index 263ec33b0d7..126a1999819 100644 --- a/Mage.Sets/src/mage/sets/FourthEdition.java +++ b/Mage.Sets/src/mage/sets/FourthEdition.java @@ -319,6 +319,7 @@ public class FourthEdition extends ExpansionSet { cards.add(new SetCardInfo("Scavenging Ghoul", 43, Rarity.UNCOMMON, mage.cards.s.ScavengingGhoul.class)); cards.add(new SetCardInfo("Scryb Sprites", 154, Rarity.COMMON, mage.cards.s.ScrybSprites.class)); cards.add(new SetCardInfo("Sea Serpent", 98, Rarity.COMMON, mage.cards.s.SeaSerpent.class)); + cards.add(new SetCardInfo("Seeker", 299, Rarity.COMMON, mage.cards.s.Seeker.class)); cards.add(new SetCardInfo("Segovian Leviathan", 99, Rarity.UNCOMMON, mage.cards.s.SegovianLeviathan.class)); cards.add(new SetCardInfo("Sengir Vampire", 44, Rarity.UNCOMMON, mage.cards.s.SengirVampire.class)); cards.add(new SetCardInfo("Serra Angel", 300, Rarity.UNCOMMON, mage.cards.s.SerraAngel.class)); From b77d67524eb7a0a03072f504e84b882ab8c85d52 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 16 Dec 2017 15:53:47 +0100 Subject: [PATCH 032/164] Implemented Flint Golem --- Mage.Sets/src/mage/cards/f/FlintGolem.java | 99 ++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/f/FlintGolem.java diff --git a/Mage.Sets/src/mage/cards/f/FlintGolem.java b/Mage.Sets/src/mage/cards/f/FlintGolem.java new file mode 100644 index 00000000000..ed99556a940 --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FlintGolem.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.cards.f; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BecomesBlockedByCreatureTriggeredAbility; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author fireshoes & L_J + */ +public class FlintGolem extends CardImpl { + + public FlintGolem(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{4}"); + this.subtype.add(SubType.GOLEM); + this.power = new MageInt(2); + this.toughness = new MageInt(3); + + // Whenever Flint Golem becomes blocked, defending player puts the top three cards of his or her library into his or her graveyard. + this.addAbility(new BecomesBlockedByCreatureTriggeredAbility(new FlintGolemEffect(), false)); + } + + public FlintGolem(final FlintGolem card) { + super(card); + } + + @Override + public FlintGolem copy() { + return new FlintGolem(this); + } +} + +class FlintGolemEffect extends OneShotEffect { + + public FlintGolemEffect() { + super(Outcome.Detriment); + this.staticText = "defending player puts the top three cards of his or her library into his or her graveyard"; + } + + public FlintGolemEffect(final FlintGolemEffect effect) { + super(effect); + } + + @Override + public FlintGolemEffect copy() { + return new FlintGolemEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent blockingCreature = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (blockingCreature != null) { + Player opponent = game.getPlayer(blockingCreature.getControllerId()); + if (opponent != null) { + opponent.moveCards(opponent.getLibrary().getTopCards(game, 3), Zone.GRAVEYARD, source, game); + return true; + } + } + return false; + } +} From be4dcf41bdecb3b3a146e3bb21b172b7468a6b1f Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 16 Dec 2017 15:54:27 +0100 Subject: [PATCH 033/164] Implemented Fog Patch --- Mage.Sets/src/mage/cards/f/FogPatch.java | 103 +++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/f/FogPatch.java diff --git a/Mage.Sets/src/mage/cards/f/FogPatch.java b/Mage.Sets/src/mage/cards/f/FogPatch.java new file mode 100644 index 00000000000..9baada1501f --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/FogPatch.java @@ -0,0 +1,103 @@ +/* + * 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.f; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.CastOnlyDuringPhaseStepSourceAbility; +import mage.abilities.effects.OneShotEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.PhaseStep; +import mage.game.Game; +import mage.game.combat.CombatGroup; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author L_J + */ +public class FogPatch extends CardImpl { + + public FogPatch(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{G}"); + + // Cast Fog Patch only during the declare blockers step. + this.addAbility(new CastOnlyDuringPhaseStepSourceAbility(null, PhaseStep.DECLARE_BLOCKERS, null, "Cast {this} only during the declare blockers step")); + + // Attacking creatures become blocked. + this.getSpellAbility().addEffect(new FogPatchEffect()); + } + + public FogPatch(final FogPatch card) { + super(card); + } + + @Override + public FogPatch copy() { + return new FogPatch(this); + } +} + +class FogPatchEffect extends OneShotEffect { + + public FogPatchEffect() { + super(Outcome.Benefit); + this.staticText = "Attacking creatures become blocked"; + } + + public FogPatchEffect(final FogPatchEffect effect) { + super(effect); + } + + @Override + public FogPatchEffect copy() { + return new FogPatchEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + for (UUID attackers : game.getCombat().getAttackers()) { + Permanent attacker = game.getPermanent(attackers); + if (attacker != null) { + CombatGroup combatGroup = game.getCombat().findGroup(attacker.getId()); + if (combatGroup != null) { + combatGroup.setBlocked(true); + } + } + } + return true; + } + return false; + } +} From b71976c124adffd0b169e002b86269a3efe94c48 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 16 Dec 2017 15:55:12 +0100 Subject: [PATCH 034/164] Implemented Harvest Mage --- Mage.Sets/src/mage/cards/h/HarvestMage.java | 132 ++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/h/HarvestMage.java diff --git a/Mage.Sets/src/mage/cards/h/HarvestMage.java b/Mage.Sets/src/mage/cards/h/HarvestMage.java new file mode 100644 index 00000000000..8c0aee8aaf6 --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HarvestMage.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.cards.h; + +import java.util.UUID; +import mage.MageInt; +import mage.MageObject; +import mage.Mana; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.DiscardTargetCost; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.AddManaOfAnyColorEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.common.FilterControlledPermanent; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.events.ManaEvent; +import mage.game.permanent.Permanent; +import mage.target.common.TargetCardInHand; + +/** + * + * @author L_J + */ +public class HarvestMage extends CardImpl { + + public HarvestMage(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}"); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.SPELLSHAPER); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {G}, {T}, Discard a card: Until end of turn, if you tap a land for mana, it produces one mana of a color of your choice instead of any other type and amount. + SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new HarvestMageReplacementEffect(), new ManaCostsImpl("{G}")); + ability.addCost(new TapSourceCost()); + ability.addCost(new DiscardTargetCost(new TargetCardInHand())); + this.addAbility(ability); + } + + public HarvestMage(final HarvestMage card) { + super(card); + } + + @Override + public HarvestMage copy() { + return new HarvestMage(this); + } +} + +class HarvestMageReplacementEffect extends ReplacementEffectImpl { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent(); + + HarvestMageReplacementEffect() { + super(Duration.EndOfTurn, Outcome.Neutral); + staticText = "Until end of turn, if you tap a land for mana, it produces one mana of a color of your choice instead of any other type and amount"; + } + + HarvestMageReplacementEffect(final HarvestMageReplacementEffect effect) { + super(effect); + } + + @Override + public HarvestMageReplacementEffect copy() { + return new HarvestMageReplacementEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + ManaEvent manaEvent = (ManaEvent) event; + Mana mana = manaEvent.getMana(); + new AddManaOfAnyColorEffect().apply(game,source); + mana.setToMana(new Mana(0,0,0,0,0,0,0,0)); + return true; + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == EventType.TAPPED_FOR_MANA; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + MageObject mageObject = game.getObject(event.getSourceId()); + if (mageObject != null && mageObject.isLand()) { + Permanent land = game.getPermanent(event.getSourceId()); + return land != null && filter.match(land, game); + } + return false; + } +} From f54b7fd07f77831316d74f38a45acc0e5bd4d263 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 16 Dec 2017 15:55:54 +0100 Subject: [PATCH 035/164] Implemented Mana Cache --- Mage.Sets/src/mage/cards/m/ManaCache.java | 148 ++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/m/ManaCache.java diff --git a/Mage.Sets/src/mage/cards/m/ManaCache.java b/Mage.Sets/src/mage/cards/m/ManaCache.java new file mode 100644 index 00000000000..e5976b259bf --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/ManaCache.java @@ -0,0 +1,148 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.m; + +import java.util.UUID; +import mage.Mana; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbility; +import mage.abilities.common.OnEventTriggeredAbility; +import mage.abilities.costs.common.RemoveCountersSourceCost; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.BasicManaEffect; +import mage.abilities.mana.ActivatedManaAbilityImpl; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.PhaseStep; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledLandPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.permanent.TappedPredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author L_J + */ +public class ManaCache extends CardImpl { + + public ManaCache(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{R}{R}"); + + // At the beginning of each player's end step, put a charge counter on Mana Cache for each untapped land that player controls. + TriggeredAbility ability = new OnEventTriggeredAbility(GameEvent.EventType.END_TURN_STEP_PRE, "beginning of each player's end step", true, new ManaCacheEffect()); + this.addAbility(ability); + + // Remove a charge counter from Mana Cache: Add {C} to your mana pool. Any player may activate this ability but only during his or her turn before the end step. + this.addAbility(new ManaCacheManaAbility()); + } + + public ManaCache(final ManaCache card) { + super(card); + } + + @Override + public ManaCache copy() { + return new ManaCache(this); + } +} + +class ManaCacheEffect extends OneShotEffect { + + private static final FilterPermanent filter = new FilterControlledLandPermanent(); + static { + filter.add(Predicates.not(new TappedPredicate())); + } + + public ManaCacheEffect() { + super(Outcome.Damage); + this.staticText = "put a charge counter on {this} for each untapped land that player controls"; + } + + @Override + public Effect copy() { + return new ManaCacheEffect(); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(game.getActivePlayerId()); + Permanent sourcePermanent = game.getPermanent(source.getSourceId()); + if (player != null && sourcePermanent != null) { + int controlledUntappedLands = game.getBattlefield().countAll(filter, game.getActivePlayerId(), game); + sourcePermanent.addCounters(CounterType.CHARGE.createInstance(controlledUntappedLands), source, game); + return true; + } + return false; + } +} + +class ManaCacheManaAbility extends ActivatedManaAbilityImpl { + + public ManaCacheManaAbility() { + super(Zone.BATTLEFIELD, new BasicManaEffect(Mana.ColorlessMana(1)), new RemoveCountersSourceCost(CounterType.CHARGE.createInstance(1))); + this.netMana.add(new Mana(0,0,0,0,0,0,0,1)); + } + + public ManaCacheManaAbility(final ManaCacheManaAbility ability) { + super(ability); + } + + @Override + public boolean canActivate(UUID playerId, Game game) { + if (!super.hasMoreActivationsThisTurn(game) || !(condition == null || condition.apply(game, this))) { + return false; + } + Player player = game.getPlayer(playerId); + if (player != null && playerId == game.getActivePlayerId() && game.getStep().getType().isBefore(PhaseStep.END_TURN)) { + if (costs.canPay(this, sourceId, playerId, game)) { + this.setControllerId(playerId); + return true; + } + } + return false; + } + + @Override + public ManaCacheManaAbility copy() { + return new ManaCacheManaAbility(this); + } + + @Override + public String getRule() { + return super.getRule() + " Any player may activate this ability but only during his or her turn before the end step."; + } +} From 22cfd70abbbe3dcf66ed15fa6095f324e704339d Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 16 Dec 2017 15:56:27 +0100 Subject: [PATCH 036/164] Implemented Mogg Toady --- Mage.Sets/src/mage/cards/m/MoggToady.java | 150 ++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/m/MoggToady.java diff --git a/Mage.Sets/src/mage/cards/m/MoggToady.java b/Mage.Sets/src/mage/cards/m/MoggToady.java new file mode 100644 index 00000000000..be59454a951 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MoggToady.java @@ -0,0 +1,150 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.m; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.RestrictionEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * + * @author emerald000 & L_J + */ +public class MoggToady extends CardImpl { + + public MoggToady(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{R}"); + this.subtype.add(SubType.GOBLIN); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Mogg Toady can't attack unless you control more creatures than defending player. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new MoggToadyCantAttackEffect())); + + // Mogg Toady can't block unless you control more creatures than attacking player. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new MoggToadyCantBlockEffect())); + } + + public MoggToady(final MoggToady card) { + super(card); + } + + @Override + public MoggToady copy() { + return new MoggToady(this); + } +} + +class MoggToadyCantAttackEffect extends RestrictionEffect { + + MoggToadyCantAttackEffect() { + super(Duration.WhileOnBattlefield); + staticText = "{this} can't attack unless you control more creatures than defending player"; + } + + MoggToadyCantAttackEffect(final MoggToadyCantAttackEffect effect) { + super(effect); + } + + @Override + public boolean applies(Permanent permanent, Ability source, Game game) { + return permanent.getId().equals(source.getSourceId()); + } + + @Override + public boolean canAttack(Permanent attacker, UUID defenderId, Ability source, Game game) { + UUID defendingPlayerId; + Player defender = game.getPlayer(defenderId); + if (defender == null) { + Permanent permanent = game.getPermanent(defenderId); + if (permanent != null) { + defendingPlayerId = permanent.getControllerId(); + } + else { + return false; + } + } + else { + defendingPlayerId = defenderId; + } + if (defendingPlayerId != null) { + return game.getBattlefield().countAll(new FilterControlledCreaturePermanent(), source.getControllerId(), game) > game.getBattlefield().countAll(new FilterControlledCreaturePermanent(), defendingPlayerId, game); + } + else { + return true; + } + } + + @Override + public MoggToadyCantAttackEffect copy() { + return new MoggToadyCantAttackEffect(this); + } +} + +class MoggToadyCantBlockEffect extends RestrictionEffect { + + MoggToadyCantBlockEffect() { + super(Duration.WhileOnBattlefield); + staticText = "{this} can't block unless you control more creatures than attacking player"; + } + + MoggToadyCantBlockEffect(final MoggToadyCantBlockEffect effect) { + super(effect); + } + + @Override + public MoggToadyCantBlockEffect copy() { + return new MoggToadyCantBlockEffect(this); + } + + @Override + public boolean canBlock(Permanent attacker, Permanent blocker, Ability source, Game game) { + UUID attackingPlayerId = attacker.getControllerId(); + if (attackingPlayerId != null) { + return game.getBattlefield().countAll(new FilterControlledCreaturePermanent(), source.getControllerId(), game) > game.getBattlefield().countAll(new FilterControlledCreaturePermanent(), attackingPlayerId, game); + } + return true; + } + + @Override + public boolean applies(Permanent permanent, Ability source, Game game) { + return permanent.getId().equals(source.getSourceId()); + } +} From 7a3a1fd20fa63ed1204232f93b8484d183c2c459 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 16 Dec 2017 15:57:11 +0100 Subject: [PATCH 037/164] Implemented Mossdog --- Mage.Sets/src/mage/cards/m/Mossdog.java | 103 ++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/m/Mossdog.java diff --git a/Mage.Sets/src/mage/cards/m/Mossdog.java b/Mage.Sets/src/mage/cards/m/Mossdog.java new file mode 100644 index 00000000000..728b242230e --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/Mossdog.java @@ -0,0 +1,103 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.m; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; + +/** + * + * @author fireshoes & L_J + */ +public class Mossdog extends CardImpl { + + public Mossdog(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{G}"); + this.subtype.add(SubType.PLANT); + this.subtype.add(SubType.HOUND); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Whenever Mossdog becomes the target of a spell or ability an opponent controls, put a +1/+1 counter on Mossdog. + this.addAbility(new MossdogAbility()); + } + + public Mossdog(final Mossdog card) { + super(card); + } + + @Override + public Mossdog copy() { + return new Mossdog(this); + } +} + +class MossdogAbility extends TriggeredAbilityImpl { + + public MossdogAbility() { + super(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false); + } + + public MossdogAbility(final MossdogAbility ability) { + super(ability); + } + + @Override + public MossdogAbility copy() { + return new MossdogAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.TARGETED; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + if (event.getTargetId().equals(this.getSourceId()) && game.getOpponents(this.controllerId).contains(event.getPlayerId())) { + return true; + } + return false; + } + + @Override + public String getRule() { + return "Whenever {this} becomes the target of a spell or ability an opponent controls, put a +1/+1 counter on {this}."; + } +} From 83d71a46cb0c1915e69947670ebd91522418a2cb Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 16 Dec 2017 15:58:03 +0100 Subject: [PATCH 038/164] Implemented Rupture --- Mage.Sets/src/mage/cards/r/Rupture.java | 116 ++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/r/Rupture.java diff --git a/Mage.Sets/src/mage/cards/r/Rupture.java b/Mage.Sets/src/mage/cards/r/Rupture.java new file mode 100644 index 00000000000..d504b53365e --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/Rupture.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.cards.r; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DamageEverythingEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.AbilityPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetControlledCreaturePermanent; + +/** + * + * @author L_J + */ +public class Rupture extends CardImpl { + + public Rupture(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{R}"); + + // Sacrifice a creature. Rupture deals damage equal to that creature's power to each creature without flying and each player. + this.getSpellAbility().addEffect(new RuptureEffect()); + } + + public Rupture(final Rupture card) { + super(card); + } + + @Override + public Rupture copy() { + return new Rupture(this); + } +} + +class RuptureEffect extends OneShotEffect { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature without flying"); + + static { + filter.add(Predicates.not(new AbilityPredicate(FlyingAbility.class))); + } + + public RuptureEffect() { + super(Outcome.Damage); + staticText = "Sacrifice a creature. Rupture deals damage equal to that creature's power to each creature without flying and each player"; + } + + public RuptureEffect(final RuptureEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { + int power = 0; + TargetControlledCreaturePermanent target = new TargetControlledCreaturePermanent(1, 1, new FilterControlledCreaturePermanent("creature to sacrifice"), true); + if (target.canChoose(source.getSourceId(), player.getId(), game)) { + while (!target.isChosen() && target.canChoose(player.getId(), game) && player.canRespond()) { + player.chooseTarget(Outcome.Sacrifice, target, source, game); + } + Permanent permanent = game.getPermanent(target.getFirstTarget()); + if (permanent != null) { + power = permanent.getPower().getValue(); + permanent.sacrifice(source.getSourceId(), game); + } + } + if (power > 0) { + new DamageEverythingEffect(power, filter).apply(game, source); + } + return true; + } + return false; + } + + @Override + public RuptureEffect copy() { + return new RuptureEffect(this); + } +} From 4e82e2110fa147210055b7c4bfb0862f27e43db3 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 16 Dec 2017 15:59:04 +0100 Subject: [PATCH 039/164] Implemented Sivvi's Valor --- Mage.Sets/src/mage/cards/s/SivvisValor.java | 140 ++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SivvisValor.java diff --git a/Mage.Sets/src/mage/cards/s/SivvisValor.java b/Mage.Sets/src/mage/cards/s/SivvisValor.java new file mode 100644 index 00000000000..c63a2b21f14 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SivvisValor.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.s; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.costs.AlternativeCostSourceAbility; +import mage.abilities.costs.Cost; +import mage.abilities.costs.common.TapTargetCost; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.events.DamageEvent; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.filter.predicate.permanent.TappedPredicate; +import mage.target.common.TargetControlledPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author L_J + */ +public class SivvisValor extends CardImpl { + + private static final FilterPermanent filter = new FilterPermanent("If you control a Plains"); + private static final FilterControlledCreaturePermanent filterCreature = new FilterControlledCreaturePermanent("untapped creature you control"); + + static { + filter.add(new SubtypePredicate(SubType.PLAINS)); + filterCreature.add(Predicates.not(new TappedPredicate())); + } + + public SivvisValor(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{W}"); + + // If you control a Plains, you may tap an untapped creature you control rather than pay Sivvi's Valor's mana cost. + Cost cost = new TapTargetCost(new TargetControlledPermanent(1,1,filterCreature,false)); + cost.setText(" tap an untapped creature you control"); + this.addAbility(new AlternativeCostSourceAbility(cost, new PermanentsOnTheBattlefieldCondition(filter))); + + // All damage that would be dealt to target creature this turn is dealt to you instead. + this.getSpellAbility().addEffect(new SivvisValorEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + } + + public SivvisValor(final SivvisValor card) { + super(card); + } + + @Override + public SivvisValor copy() { + return new SivvisValor(this); + } +} + +class SivvisValorEffect extends ReplacementEffectImpl { + + public SivvisValorEffect() { + super(Duration.EndOfTurn, Outcome.RedirectDamage); + staticText = "All damage that would be dealt to target creature this turn is dealt to you instead"; + } + + public SivvisValorEffect(final SivvisValorEffect effect) { + super(effect); + } + + @Override + public SivvisValorEffect copy() { + return new SivvisValorEffect(this); + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DAMAGE_CREATURE; + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + Player controller = game.getPlayer(source.getControllerId()); + DamageEvent damageEvent = (DamageEvent) event; + if (controller != null) { + controller.damage(damageEvent.getAmount(), damageEvent.getSourceId(), game, damageEvent.isCombatDamage(), damageEvent.isPreventable(), damageEvent.getAppliedEffects()); + return true; + } + return false; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + Player controller = game.getPlayer(source.getControllerId()); + DamageEvent damageEvent = (DamageEvent) event; + Permanent targetPermanent = game.getPermanent(source.getFirstTarget()); + if (controller != null && targetPermanent != null) { + return targetPermanent.getId() == damageEvent.getTargetId(); + } + return false; + } +} From b0349ba6cae7b5277be602b2aa6d81f83900dc2f Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 16 Dec 2017 15:59:45 +0100 Subject: [PATCH 040/164] Implemented Topple --- Mage.Sets/src/mage/cards/t/Topple.java | 129 +++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/t/Topple.java diff --git a/Mage.Sets/src/mage/cards/t/Topple.java b/Mage.Sets/src/mage/cards/t/Topple.java new file mode 100644 index 00000000000..6b1a3ab0f53 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/Topple.java @@ -0,0 +1,129 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ + +package mage.cards.t; + +import java.util.List; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.TargetPermanent; + +/** + * + * @author L_J + */ +public class Topple extends CardImpl { + + public Topple (UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{W}"); + + // Exile target creature with the greatest power among creatures on the battlefield. + this.getSpellAbility().addEffect(new ExileTargetEffect()); + this.getSpellAbility().addTarget(new ToppleTargetCreature()); + } + + public Topple (final Topple card) { + super(card); + } + + @Override + public Topple copy() { + return new Topple(this); + } +} + +class ToppleTargetCreature extends TargetPermanent { + + public ToppleTargetCreature() { + super(); + filter.add(new CardTypePredicate(CardType.CREATURE)); + setTargetName("creature with the greatest power among creatures on the battlefield"); + } + + public ToppleTargetCreature(final ToppleTargetCreature target) { + super(target); + } + + @Override + public boolean canTarget(UUID controllerId, UUID id, Ability source, Game game) { + if (super.canTarget(controllerId, id, source, game)) { + int maxPower = 0; + for (Permanent permanent : game.getBattlefield().getActivePermanents(filter, source.getControllerId(), source.getId(), game)) { + if (permanent.getPower().getValue() > maxPower) { + maxPower = permanent.getPower().getValue(); + } + } + Permanent targetPermanent = game.getPermanent(id); + if (targetPermanent != null) { + return targetPermanent.getPower().getValue() == maxPower; + } + } + return false; + } + + @Override + public Set possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) { + int maxPower = 0; + List activePermanents = game.getBattlefield().getActivePermanents(filter, sourceControllerId, sourceId, game); + Set possibleTargets = new HashSet<>(); + MageObject targetSource = game.getObject(sourceId); + for (Permanent permanent : activePermanents) { + if (permanent.getPower().getValue() > maxPower) { + maxPower = permanent.getPower().getValue(); + } + } + for (Permanent permanent : activePermanents) { + if (!targets.containsKey(permanent.getId()) && permanent.canBeTargetedBy(targetSource, sourceControllerId, game)) { + if (permanent.getPower().getValue() == maxPower) { + possibleTargets.add(permanent.getId()); + } + } + } + return possibleTargets; + } + + @Override + public boolean canChoose(UUID sourceId, UUID sourceControllerId, Game game) { + return !possibleTargets(sourceId, sourceControllerId, game).isEmpty(); + } + + @Override + public ToppleTargetCreature copy() { + return new ToppleTargetCreature(this); + } +} From c4094d07494227905877f8d93ea9dc73ff9ce064 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 16 Dec 2017 16:00:28 +0100 Subject: [PATCH 041/164] Implemented Wild Mammoth --- Mage.Sets/src/mage/cards/w/WildMammoth.java | 139 ++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/w/WildMammoth.java diff --git a/Mage.Sets/src/mage/cards/w/WildMammoth.java b/Mage.Sets/src/mage/cards/w/WildMammoth.java new file mode 100644 index 00000000000..bd0f5bf9083 --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WildMammoth.java @@ -0,0 +1,139 @@ +/* + * 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.w; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.GainControlTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.filter.FilterPermanent; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author L_J + */ +public class WildMammoth extends CardImpl { + + public WildMammoth(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{G}"); + this.subtype.add(SubType.ELEPHANT); + this.power = new MageInt(3); + this.toughness = new MageInt(4); + + // At the beginning of your upkeep, if a player controls more creatures than each other player, the player who controls the most creatures gains control of Wild Mammoth. + this.addAbility(new BeginningOfUpkeepTriggeredAbility(new WildMammothEffect(), TargetController.YOU, false)); + } + + public WildMammoth(final WildMammoth card) { + super(card); + } + + @Override + public WildMammoth copy() { + return new WildMammoth(this); + } +} + +class WildMammothEffect extends OneShotEffect { + + public WildMammothEffect() { + super(Outcome.GainControl); + this.staticText = "if a player controls more creatures than each other player, the player who controls the most creatures gains control of {this}"; + } + + public WildMammothEffect(final WildMammothEffect effect) { + super(effect); + } + + @Override + public WildMammothEffect copy() { + return new WildMammothEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + Permanent sourcePermanent = game.getPermanent(source.getSourceId()); + if (sourcePermanent != null) { + Player newController = null; + int maxCreatures = 0; + boolean tie = false; + FilterPermanent filter = new FilterPermanent(); + filter.add(new CardTypePredicate(CardType.CREATURE)); + + for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) { + Player player = game.getPlayer(playerId); + if (player != null) { + int value = game.getBattlefield().countAll(filter, playerId, game); + if (value > maxCreatures) { + maxCreatures = value; + } + } + } + for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) { + Player player = game.getPlayer(playerId); + if (player != null) { + int value = game.getBattlefield().countAll(filter, playerId, game); + if (value == maxCreatures) { + if (newController == null) { + newController = player; + } else { + tie = true; + } + } + } + } + + if (!controller.equals(newController) && !tie && newController != null) { + ContinuousEffect effect = new GainControlTargetEffect(Duration.Custom, newController.getId()); + effect.setTargetPointer(new FixedTarget(sourcePermanent, game)); + game.addEffect(effect, source); + } + } + return true; + } + return false; + + } +} From 1ed70db679f726ed5eea06637dcf3861ff1dca33 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 16 Dec 2017 16:01:05 +0100 Subject: [PATCH 042/164] Implemented cards --- Mage.Sets/src/mage/sets/Nemesis.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/Nemesis.java b/Mage.Sets/src/mage/sets/Nemesis.java index f05a4909d36..a1fb5595e93 100644 --- a/Mage.Sets/src/mage/sets/Nemesis.java +++ b/Mage.Sets/src/mage/sets/Nemesis.java @@ -88,6 +88,7 @@ public class Nemesis extends ExpansionSet { cards.add(new SetCardInfo("Eye of Yawgmoth", 129, Rarity.RARE, mage.cards.e.EyeOfYawgmoth.class)); cards.add(new SetCardInfo("Fanatical Devotion", 8, Rarity.COMMON, mage.cards.f.FanaticalDevotion.class)); cards.add(new SetCardInfo("Flame Rift", 80, Rarity.COMMON, mage.cards.f.FlameRift.class)); + cards.add(new SetCardInfo("Flint Golem", 130, Rarity.UNCOMMON, mage.cards.f.FlintGolem.class)); cards.add(new SetCardInfo("Flowstone Armor", 131, Rarity.UNCOMMON, mage.cards.f.FlowstoneArmor.class)); cards.add(new SetCardInfo("Flowstone Crusher", 81, Rarity.COMMON, mage.cards.f.FlowstoneCrusher.class)); cards.add(new SetCardInfo("Flowstone Overseer", 82, Rarity.RARE, mage.cards.f.FlowstoneOverseer.class)); @@ -96,6 +97,8 @@ public class Nemesis extends ExpansionSet { cards.add(new SetCardInfo("Flowstone Surge", 85, Rarity.UNCOMMON, mage.cards.f.FlowstoneSurge.class)); cards.add(new SetCardInfo("Flowstone Thopter", 132, Rarity.UNCOMMON, mage.cards.f.FlowstoneThopter.class)); cards.add(new SetCardInfo("Flowstone Wall", 86, Rarity.COMMON, mage.cards.f.FlowstoneWall.class)); + cards.add(new SetCardInfo("Fog Patch", 104, Rarity.COMMON, mage.cards.f.FogPatch.class)); + cards.add(new SetCardInfo("Harvest Mage", 105, Rarity.COMMON, mage.cards.h.HarvestMage.class)); cards.add(new SetCardInfo("Infiltrate", 33, Rarity.COMMON, mage.cards.i.Infiltrate.class)); cards.add(new SetCardInfo("Jolting Merfolk", 34, Rarity.UNCOMMON, mage.cards.j.JoltingMerfolk.class)); cards.add(new SetCardInfo("Kill Switch", 133, Rarity.RARE, mage.cards.k.KillSwitch.class)); @@ -109,12 +112,15 @@ public class Nemesis extends ExpansionSet { cards.add(new SetCardInfo("Lawbringer", 10, Rarity.COMMON, mage.cards.l.Lawbringer.class)); cards.add(new SetCardInfo("Lightbringer", 11, Rarity.COMMON, mage.cards.l.Lightbringer.class)); cards.add(new SetCardInfo("Lin Sivvi, Defiant Hero", 12, Rarity.RARE, mage.cards.l.LinSivviDefiantHero.class)); + cards.add(new SetCardInfo("Mana Cache", 92, Rarity.RARE, mage.cards.m.ManaCache.class)); cards.add(new SetCardInfo("Massacre", 58, Rarity.UNCOMMON, mage.cards.m.Massacre.class)); cards.add(new SetCardInfo("Mind Slash", 59, Rarity.UNCOMMON, mage.cards.m.MindSlash.class)); cards.add(new SetCardInfo("Mind Swords", 60, Rarity.COMMON, mage.cards.m.MindSwords.class)); cards.add(new SetCardInfo("Mogg Alarm", 93, Rarity.UNCOMMON, mage.cards.m.MoggAlarm.class)); - cards.add(new SetCardInfo("Moggcatcher", 96, Rarity.RARE, mage.cards.m.Moggcatcher.class)); cards.add(new SetCardInfo("Mogg Salvage", 94, Rarity.UNCOMMON, mage.cards.m.MoggSalvage.class)); + cards.add(new SetCardInfo("Mogg Toady", 95, Rarity.COMMON, mage.cards.m.MoggToady.class)); + cards.add(new SetCardInfo("Moggcatcher", 96, Rarity.RARE, mage.cards.m.Moggcatcher.class)); + cards.add(new SetCardInfo("Mossdog", 106, Rarity.COMMON, mage.cards.m.Mossdog.class)); cards.add(new SetCardInfo("Murderous Betrayal", 61, Rarity.RARE, mage.cards.m.MurderousBetrayal.class)); cards.add(new SetCardInfo("Nesting Wurm", 107, Rarity.UNCOMMON, mage.cards.n.NestingWurm.class)); cards.add(new SetCardInfo("Netter en-Dal", 13, Rarity.COMMON, mage.cards.n.NetterEnDal.class)); @@ -146,6 +152,7 @@ public class Nemesis extends ExpansionSet { cards.add(new SetCardInfo("Rising Waters", 38, Rarity.RARE, mage.cards.r.RisingWaters.class)); cards.add(new SetCardInfo("Rootwater Commando", 39, Rarity.COMMON, mage.cards.r.RootwaterCommando.class)); cards.add(new SetCardInfo("Rootwater Thief", 40, Rarity.RARE, mage.cards.r.RootwaterThief.class)); + cards.add(new SetCardInfo("Rupture", 97, Rarity.UNCOMMON, mage.cards.r.Rupture.class)); cards.add(new SetCardInfo("Rusting Golem", 138, Rarity.UNCOMMON, mage.cards.r.RustingGolem.class)); cards.add(new SetCardInfo("Saproling Burst", 113, Rarity.RARE, mage.cards.s.SaprolingBurst.class)); cards.add(new SetCardInfo("Saproling Cluster", 114, Rarity.RARE, mage.cards.s.SaprolingCluster.class)); @@ -159,6 +166,7 @@ public class Nemesis extends ExpansionSet { cards.add(new SetCardInfo("Silkenfist Fighter", 19, Rarity.COMMON, mage.cards.s.SilkenfistFighter.class)); cards.add(new SetCardInfo("Silkenfist Order", 20, Rarity.UNCOMMON, mage.cards.s.SilkenfistOrder.class)); cards.add(new SetCardInfo("Sivvi's Ruse", 21, Rarity.UNCOMMON, mage.cards.s.SivvisRuse.class)); + cards.add(new SetCardInfo("Sivvi's Valor", 22, Rarity.RARE, mage.cards.s.SivvisValor.class)); cards.add(new SetCardInfo("Skyshroud Behemoth", 116, Rarity.RARE, mage.cards.s.SkyshroudBehemoth.class)); cards.add(new SetCardInfo("Skyshroud Claim", 117, Rarity.COMMON, mage.cards.s.SkyshroudClaim.class)); cards.add(new SetCardInfo("Skyshroud Cutter", 118, Rarity.COMMON, mage.cards.s.SkyshroudCutter.class)); @@ -179,6 +187,7 @@ public class Nemesis extends ExpansionSet { cards.add(new SetCardInfo("Submerge", 48, Rarity.UNCOMMON, mage.cards.s.Submerge.class)); cards.add(new SetCardInfo("Tangle Wire", 139, Rarity.RARE, mage.cards.t.TangleWire.class)); cards.add(new SetCardInfo("Terrain Generator", 143, Rarity.UNCOMMON, mage.cards.t.TerrainGenerator.class)); + cards.add(new SetCardInfo("Topple", 24, Rarity.COMMON, mage.cards.t.Topple.class)); cards.add(new SetCardInfo("Treetop Bracers", 123, Rarity.COMMON, mage.cards.t.TreetopBracers.class)); cards.add(new SetCardInfo("Trickster Mage", 49, Rarity.COMMON, mage.cards.t.TricksterMage.class)); cards.add(new SetCardInfo("Vicious Hunger", 74, Rarity.COMMON, mage.cards.v.ViciousHunger.class)); @@ -186,6 +195,7 @@ public class Nemesis extends ExpansionSet { cards.add(new SetCardInfo("Voice of Truth", 25, Rarity.UNCOMMON, mage.cards.v.VoiceOfTruth.class)); cards.add(new SetCardInfo("Volrath the Fallen", 75, Rarity.RARE, mage.cards.v.VolrathTheFallen.class)); cards.add(new SetCardInfo("Wandering Eye", 50, Rarity.COMMON, mage.cards.w.WanderingEye.class)); + cards.add(new SetCardInfo("Wild Mammoth", 124, Rarity.UNCOMMON, mage.cards.w.WildMammoth.class)); cards.add(new SetCardInfo("Woodripper", 125, Rarity.UNCOMMON, mage.cards.w.Woodripper.class)); } } From d0691d8d95399f9de8b0d9430f23f7b90452610d Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 16 Dec 2017 20:01:32 +0100 Subject: [PATCH 043/164] Tiny edit --- Mage.Sets/src/mage/cards/w/WildMammoth.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage.Sets/src/mage/cards/w/WildMammoth.java b/Mage.Sets/src/mage/cards/w/WildMammoth.java index bd0f5bf9083..3deee0822d3 100644 --- a/Mage.Sets/src/mage/cards/w/WildMammoth.java +++ b/Mage.Sets/src/mage/cards/w/WildMammoth.java @@ -120,6 +120,7 @@ class WildMammothEffect extends OneShotEffect { newController = player; } else { tie = true; + break; } } } From 982c17892151c9226209bde038db94b080f03c72 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 17 Dec 2017 14:46:24 +0100 Subject: [PATCH 044/164] Added DoUnlessTargetPlayerOrTargetsControllerPaysEffect --- ...etPlayerOrTargetsControllerPaysEffect.java | 158 ++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 Mage/src/main/java/mage/abilities/effects/common/DoUnlessTargetPlayerOrTargetsControllerPaysEffect.java diff --git a/Mage/src/main/java/mage/abilities/effects/common/DoUnlessTargetPlayerOrTargetsControllerPaysEffect.java b/Mage/src/main/java/mage/abilities/effects/common/DoUnlessTargetPlayerOrTargetsControllerPaysEffect.java new file mode 100644 index 00000000000..12d698b5274 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/DoUnlessTargetPlayerOrTargetsControllerPaysEffect.java @@ -0,0 +1,158 @@ +/* + * 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.abilities.effects.common; + +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.costs.Cost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.Effect; +import mage.abilities.effects.Effects; +import mage.abilities.effects.OneShotEffect; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.util.CardUtil; + +/** + * + * @author MarcoMarin & L_J + */ +public class DoUnlessTargetPlayerOrTargetsControllerPaysEffect extends OneShotEffect { + + protected Effects executingEffects = new Effects(); + private Cost cost; + private DynamicValue genericMana; + private String chooseUseText; + + public DoUnlessTargetPlayerOrTargetsControllerPaysEffect(Effect effect, Cost cost) { + this(effect, cost, null); + } + + public DoUnlessTargetPlayerOrTargetsControllerPaysEffect(Effect effect, Cost cost, String chooseUseText) { + super(Outcome.Detriment); + this.executingEffects.add(effect); + this.cost = cost; + this.chooseUseText = chooseUseText; + } + + public DoUnlessTargetPlayerOrTargetsControllerPaysEffect(Effect effect, DynamicValue genericMana) { + super(Outcome.Detriment); + this.executingEffects.add(effect); + this.genericMana = genericMana; + } + + public DoUnlessTargetPlayerOrTargetsControllerPaysEffect(final DoUnlessTargetPlayerOrTargetsControllerPaysEffect effect) { + super(effect); + this.executingEffects = effect.executingEffects.copy(); + if (effect.cost != null) { + this.cost = effect.cost.copy(); + } + if (effect.genericMana != null) { + this.genericMana = effect.genericMana.copy(); + } + this.chooseUseText = effect.chooseUseText; + } + + public void addEffect(Effect effect) { + executingEffects.add(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player targetController = game.getPlayer(source.getFirstTarget()); + Permanent targetPermanent = game.getPermanent(source.getFirstTarget()); + if (targetPermanent != null) { + targetController = game.getPlayer(targetPermanent.getControllerId()); + } + if (targetController != null) { + MageObject sourceObject = game.getObject(source.getSourceId()); + if (targetController != null && sourceObject != null) { + Cost costToPay; + if (cost != null) { + costToPay = cost.copy(); + } else { + costToPay = new GenericManaCost(genericMana.calculate(game, source, this)); + } + String message; + if (chooseUseText == null) { + String effectText = executingEffects.getText(source.getModes().getMode()); + message = "Pay " + costToPay.getText() + " to prevent (" + effectText.substring(0, effectText.length() - 1) + ")?"; + } else { + message = chooseUseText; + } + message = CardUtil.replaceSourceName(message, sourceObject.getName()); + boolean result = true; + boolean doEffect = true; + + // check if targetController is willing to pay + if (costToPay.canPay(source, source.getSourceId(), targetController.getId(), game) && targetController.chooseUse(Outcome.Detriment, message, source, game)) { + costToPay.clearPaid(); + if (costToPay.pay(source, game, source.getSourceId(), targetController.getId(), false, null)) { + if (!game.isSimulation()) { + game.informPlayers(targetController.getLogName() + " pays the cost to prevent the effect"); + } + doEffect = false; + } + } + + // do the effects if not paid + if (doEffect) { + for (Effect effect : executingEffects) { + effect.setTargetPointer(this.targetPointer); + if (effect instanceof OneShotEffect) { + result &= effect.apply(game, source); + } else { + game.addEffect((ContinuousEffect) effect, source); + } + } + } + return result; + } + } + return false; + } + + @Override + public String getText(Mode mode) { + if (!staticText.isEmpty()) { + return staticText; + } + String effectsText = executingEffects.getText(mode); + return effectsText.substring(0, effectsText.length() - 1) + " unless its controller pays " + (cost != null ? cost.getText() : "{X}"); + } + + @Override + public DoUnlessTargetPlayerOrTargetsControllerPaysEffect copy() { + return new DoUnlessTargetPlayerOrTargetsControllerPaysEffect(this); + } +} From 8539ffc92835e4d6276ef04ce5486b95cc6a4390 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 17 Dec 2017 14:48:06 +0100 Subject: [PATCH 045/164] Implemented Excise --- Mage.Sets/src/mage/cards/e/Excise.java | 68 ++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/e/Excise.java diff --git a/Mage.Sets/src/mage/cards/e/Excise.java b/Mage.Sets/src/mage/cards/e/Excise.java new file mode 100644 index 00000000000..e9220d5bb67 --- /dev/null +++ b/Mage.Sets/src/mage/cards/e/Excise.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.cards.e; + +import java.util.UUID; +import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.effects.common.DoUnlessTargetPlayerOrTargetsControllerPaysEffect; +import mage.abilities.effects.common.ExileTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.AttackingPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author L_J + */ +public class Excise extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("attacking creature"); + static { + filter.add(new AttackingPredicate()); + } + + public Excise(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{X}{W}"); + + // Excise target nonwhite attacking creature unless its controller pays {X}. + this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); + this.getSpellAbility().addEffect(new DoUnlessTargetPlayerOrTargetsControllerPaysEffect(new ExileTargetEffect(), new ManacostVariableValue())); + } + + public Excise(final Excise card) { + super(card); + } + + @Override + public Excise copy() { + return new Excise(this); + } +} From 23b7fb775a926a9afa44623679bdaa3251997db4 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 17 Dec 2017 14:50:30 +0100 Subject: [PATCH 046/164] Implemented Flay --- Mage.Sets/src/mage/cards/f/Flay.java | 65 ++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/f/Flay.java diff --git a/Mage.Sets/src/mage/cards/f/Flay.java b/Mage.Sets/src/mage/cards/f/Flay.java new file mode 100644 index 00000000000..e9cc5561a0a --- /dev/null +++ b/Mage.Sets/src/mage/cards/f/Flay.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.cards.f; + +import java.util.UUID; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DoUnlessTargetPlayerOrTargetsControllerPaysEffect; +import mage.abilities.effects.common.discard.DiscardTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.TargetPlayer; + +/** + * + * @author L_J + */ +public class Flay extends CardImpl { + + public Flay(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{B}"); + + // Target player discards a card at random. Then that player discards another card at random unless he or she pays {1}. + this.getSpellAbility().addEffect(new DiscardTargetEffect(1, true)); + Effect effect = new DoUnlessTargetPlayerOrTargetsControllerPaysEffect(new DiscardTargetEffect(1, true), new ManaCostsImpl("{1}")); + effect.setText("Then that player discards another card at random unless he or she pays {1}"); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetPlayer()); + } + + public Flay(final Flay card) { + super(card); + } + + @Override + public Flay copy() { + return new Flay(this); + } +} From 7d043fc6e4c2bcfc02e48d424d0bf8d7116d7c28 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 17 Dec 2017 14:51:24 +0100 Subject: [PATCH 047/164] Implemented Rhystic Deluge --- Mage.Sets/src/mage/cards/RhysticDeluge.java | 66 +++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/RhysticDeluge.java diff --git a/Mage.Sets/src/mage/cards/RhysticDeluge.java b/Mage.Sets/src/mage/cards/RhysticDeluge.java new file mode 100644 index 00000000000..4434da3ec3b --- /dev/null +++ b/Mage.Sets/src/mage/cards/RhysticDeluge.java @@ -0,0 +1,66 @@ +/* + * 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.r; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DoUnlessTargetPlayerOrTargetsControllerPaysEffect; +import mage.abilities.effects.common.TapTargetEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Zone; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author L_J + */ +public class RhysticDeluge extends CardImpl { + + public RhysticDeluge(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{2}{U}"); + + // {U}: Tap target creature unless its controller pays {1}. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DoUnlessTargetPlayerOrTargetsControllerPaysEffect(new TapTargetEffect(), new ManaCostsImpl("{1}")), new ManaCostsImpl("{U}")); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public RhysticDeluge(final RhysticDeluge card) { + super(card); + } + + @Override + public RhysticDeluge copy() { + return new RhysticDeluge(this); + } +} From 23e33b41e13dee95cde5ec048a14aa8e28b005a2 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 17 Dec 2017 14:51:43 +0100 Subject: [PATCH 048/164] Moved Rhystic Deluge --- Mage.Sets/src/mage/cards/{ => r}/RhysticDeluge.java | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Mage.Sets/src/mage/cards/{ => r}/RhysticDeluge.java (100%) diff --git a/Mage.Sets/src/mage/cards/RhysticDeluge.java b/Mage.Sets/src/mage/cards/r/RhysticDeluge.java similarity index 100% rename from Mage.Sets/src/mage/cards/RhysticDeluge.java rename to Mage.Sets/src/mage/cards/r/RhysticDeluge.java From 36052f513d5d4f4c6c2840403d8c61161bf47b4b Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 17 Dec 2017 14:52:13 +0100 Subject: [PATCH 049/164] Implemented Rhystic Scrying --- .../src/mage/cards/r/RhysticScrying.java | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/r/RhysticScrying.java diff --git a/Mage.Sets/src/mage/cards/r/RhysticScrying.java b/Mage.Sets/src/mage/cards/r/RhysticScrying.java new file mode 100644 index 00000000000..5b19673103a --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RhysticScrying.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.cards.r; + +import java.util.UUID; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.costs.Cost; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author L_J + */ +public class RhysticScrying extends CardImpl { + + public RhysticScrying(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{U}{U}"); + + // Draw three cards. Then, if any player pays {2}, discard three cards. + this.getSpellAbility().addEffect(new DrawCardSourceControllerEffect(3)); + this.getSpellAbility().addEffect(new RhysticScryingEffect()); + } + + public RhysticScrying(final RhysticScrying card) { + super(card); + } + + @Override + public RhysticScrying copy() { + return new RhysticScrying(this); + } +} + +class RhysticScryingEffect extends OneShotEffect { + + public RhysticScryingEffect() { + super(Outcome.Benefit); + this.staticText = "Then, if any player pays {2}, discard three cards"; + } + + public RhysticScryingEffect(final RhysticScryingEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + MageObject sourceObject = game.getObject(source.getSourceId()); + if (controller != null && sourceObject != null) { + boolean result = true; + boolean doEffect = false; + Cost cost = new GenericManaCost(3); + // check if any player is willing to pay + for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { + Player player = game.getPlayer(playerId); + if (player != null && cost.canPay(source, source.getSourceId(), player.getId(), game) && player.chooseUse(Outcome.Detriment, "Pay " + cost.getText() + " for " + sourceObject.getLogName() + "?", source, game)) { + cost.clearPaid(); + if (cost.pay(source, game, source.getSourceId(), player.getId(), false, null)) { + if (!game.isSimulation()) { + game.informPlayers(player.getLogName() + " pays the cost for " + sourceObject.getLogName()); + } + doEffect = true; + } + } + } + // do the effects if anybody paid + if (doEffect) { + controller.discard(3, false, source, game); + } + return result; + } + return false; + } + + @Override + public RhysticScryingEffect copy() { + return new RhysticScryingEffect(this); + } +} From 88bbf8d91717a610b2b5476b6979ecb95846cf2e Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 17 Dec 2017 15:49:00 +0100 Subject: [PATCH 050/164] Implemented Rhystic Shield --- Mage.Sets/src/mage/cards/r/RhysticShield.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/r/RhysticShield.java diff --git a/Mage.Sets/src/mage/cards/r/RhysticShield.java b/Mage.Sets/src/mage/cards/r/RhysticShield.java new file mode 100644 index 00000000000..ad8e47187f9 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RhysticShield.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.cards.r; + +import java.util.UUID; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DoUnlessAnyPlayerPaysEffect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.filter.StaticFilters; + +/** + * + * @author L_J + */ +public class RhysticShield extends CardImpl { + + public RhysticShield(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{W}"); + + // Creatures you control get +0/+1 until end of turn. They get an additional +0/+2 until end of turn unless any player pays {2}. + this.getSpellAbility().addEffect(new BoostControlledEffect(0, 1, Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURE, false)); + Effect effect = new DoUnlessAnyPlayerPaysEffect(new BoostControlledEffect(0, 2, Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURE, false), new ManaCostsImpl("{2}")); + effect.setText("They get an additional +0/+2 until end of turn unless any player pays {2}"); + this.getSpellAbility().addEffect(effect); + } + + public RhysticShield(final RhysticShield card) { + super(card); + } + + @Override + public RhysticShield copy() { + return new RhysticShield(this); + } +} From 848a9993a69a100ac459ad2d3c7f0c05c135a2f1 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 17 Dec 2017 15:49:38 +0100 Subject: [PATCH 051/164] Implemented Rhystic Syphon --- Mage.Sets/src/mage/cards/r/RhysticSyphon.java | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/r/RhysticSyphon.java diff --git a/Mage.Sets/src/mage/cards/r/RhysticSyphon.java b/Mage.Sets/src/mage/cards/r/RhysticSyphon.java new file mode 100644 index 00000000000..9435deb09fb --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RhysticSyphon.java @@ -0,0 +1,66 @@ +/* + * 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.r; + +import java.util.UUID; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DoUnlessTargetPlayerOrTargetsControllerPaysEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.common.LoseLifeTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.TargetPlayer; + +/** + * + * @author L_J + */ +public class RhysticSyphon extends CardImpl { + + public RhysticSyphon(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{B}{B}"); + + // Unless target player pays {3}, he or she loses 5 life and you gain 5 life. + DoUnlessTargetPlayerOrTargetsControllerPaysEffect effect = new DoUnlessTargetPlayerOrTargetsControllerPaysEffect(new LoseLifeTargetEffect(5), new ManaCostsImpl("{3}")); + effect.addEffect(new GainLifeEffect(5)); + effect.setText("Unless target player pays {3}, he or she loses 5 life and you gain 5 life"); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetPlayer()); + } + + public RhysticSyphon(final RhysticSyphon card) { + super(card); + } + + @Override + public RhysticSyphon copy() { + return new RhysticSyphon(this); + } +} From 9f4b63017f2069f52add132fb432408d5962c56d Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 17 Dec 2017 15:50:20 +0100 Subject: [PATCH 052/164] Implemented Thresher Beast --- Mage.Sets/src/mage/cards/t/ThresherBeast.java | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/t/ThresherBeast.java diff --git a/Mage.Sets/src/mage/cards/t/ThresherBeast.java b/Mage.Sets/src/mage/cards/t/ThresherBeast.java new file mode 100644 index 00000000000..032bebd53a1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/ThresherBeast.java @@ -0,0 +1,103 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.t; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.BecomesBlockedByCreatureTriggeredAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.SacrificeEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.filter.StaticFilters; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author L_J + */ +public class ThresherBeast extends CardImpl { + + public ThresherBeast(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{3}{G}{G}"); + this.subtype.add(SubType.BEAST); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Whenever Thresher Beast becomes blocked, defending player sacrifices a land. + this.addAbility(new BecomesBlockedByCreatureTriggeredAbility(new ThresherBeastEffect(), false)); + } + + public ThresherBeast(final ThresherBeast card) { + super(card); + } + + @Override + public ThresherBeast copy() { + return new ThresherBeast(this); + } +} + +class ThresherBeastEffect extends OneShotEffect { + + public ThresherBeastEffect() { + super(Outcome.Discard); + this.staticText = "defending player sacrifices a land"; + } + + public ThresherBeastEffect(final ThresherBeastEffect effect) { + super(effect); + } + + @Override + public ThresherBeastEffect copy() { + return new ThresherBeastEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent blockingCreature = game.getPermanent(getTargetPointer().getFirst(game, source)); + if (blockingCreature != null) { + Player opponent = game.getPlayer(blockingCreature.getControllerId()); + if (opponent != null) { + Effect effect = new SacrificeEffect(StaticFilters.FILTER_LAND, 1, ""); + effect.setTargetPointer(new FixedTarget(opponent.getId())); + return effect.apply(game, source); + } + } + return false; + } +} From d5b948973aec1544e87a12775e3d7c6d143a142b Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 17 Dec 2017 15:51:22 +0100 Subject: [PATCH 053/164] Implemented Wing Storm --- Mage.Sets/src/mage/cards/w/WingStorm.java | 105 ++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/w/WingStorm.java diff --git a/Mage.Sets/src/mage/cards/w/WingStorm.java b/Mage.Sets/src/mage/cards/w/WingStorm.java new file mode 100644 index 00000000000..425fc90473a --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WingStorm.java @@ -0,0 +1,105 @@ +/* + * 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.w; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.AbilityPredicate; +import mage.game.Game; +import mage.players.Player; + +/** + * + * @author LevelX2 & L_J + */ +public class WingStorm extends CardImpl { + + public WingStorm(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{G}"); + + // Wing Storm deals damage to each player equal to twice the number of creatures with flying that player controls. + this.getSpellAbility().addEffect(new WingStormEffect()); + } + + public WingStorm(final WingStorm card) { + super(card); + } + + @Override + public WingStorm copy() { + return new WingStorm(this); + } +} + +class WingStormEffect extends OneShotEffect { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); + + static { + filter.add(new AbilityPredicate(FlyingAbility.class)); + } + + public WingStormEffect() { + super(Outcome.Benefit); + this.staticText = "{this} deals damage to each player equal to twice the number of creatures with flying that player controls"; + } + + public WingStormEffect(final WingStormEffect effect) { + super(effect); + } + + @Override + public WingStormEffect copy() { + return new WingStormEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { + int amount = game.getBattlefield().countAll(filter, playerId, game); + if (amount > 0) { + Player player = game.getPlayer(playerId); + if (player != null) { + player.damage(amount * 2, source.getSourceId(), game, false, true); + } + } + } + return true; + } + return false; + } +} From 5a36a4d47ec7d2b30a753d38938719f97b072ce1 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 17 Dec 2017 15:54:05 +0100 Subject: [PATCH 054/164] Implemented cards --- Mage.Sets/src/mage/sets/Prophecy.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Mage.Sets/src/mage/sets/Prophecy.java b/Mage.Sets/src/mage/sets/Prophecy.java index 9f3172aa2f7..0727299f8dc 100644 --- a/Mage.Sets/src/mage/sets/Prophecy.java +++ b/Mage.Sets/src/mage/sets/Prophecy.java @@ -86,10 +86,12 @@ public class Prophecy extends ExpansionSet { cards.add(new SetCardInfo("Endbringer's Revel", 63, Rarity.UNCOMMON, mage.cards.e.EndbringersRevel.class)); cards.add(new SetCardInfo("Entangler", 7, Rarity.UNCOMMON, mage.cards.e.Entangler.class)); cards.add(new SetCardInfo("Excavation", 33, Rarity.UNCOMMON, mage.cards.e.Excavation.class)); + cards.add(new SetCardInfo("Excise", 8, Rarity.COMMON, mage.cards.e.Excise.class)); cards.add(new SetCardInfo("Fault Riders", 88, Rarity.COMMON, mage.cards.f.FaultRiders.class)); cards.add(new SetCardInfo("Fen Stalker", 64, Rarity.COMMON, mage.cards.f.FenStalker.class)); cards.add(new SetCardInfo("Fickle Efreet", 89, Rarity.RARE, mage.cards.f.FickleEfreet.class)); cards.add(new SetCardInfo("Flameshot", 90, Rarity.UNCOMMON, mage.cards.f.Flameshot.class)); + cards.add(new SetCardInfo("Flay", 65, Rarity.COMMON, mage.cards.f.Flay.class)); cards.add(new SetCardInfo("Flowering Field", 9, Rarity.UNCOMMON, mage.cards.f.FloweringField.class)); cards.add(new SetCardInfo("Foil", 34, Rarity.UNCOMMON, mage.cards.f.Foil.class)); cards.add(new SetCardInfo("Forgotten Harvest", 114, Rarity.RARE, mage.cards.f.ForgottenHarvest.class)); @@ -133,7 +135,11 @@ public class Prophecy extends ExpansionSet { cards.add(new SetCardInfo("Reveille Squad", 18, Rarity.UNCOMMON, mage.cards.r.ReveilleSquad.class)); cards.add(new SetCardInfo("Rhystic Cave", 142, Rarity.UNCOMMON, mage.cards.r.RhysticCave.class)); cards.add(new SetCardInfo("Rhystic Circle", 19, Rarity.COMMON, mage.cards.r.RhysticCircle.class)); + cards.add(new SetCardInfo("Rhystic Deluge", 43, Rarity.COMMON, mage.cards.r.RhysticDeluge.class)); + cards.add(new SetCardInfo("Rhystic Scrying", 44, Rarity.UNCOMMON, mage.cards.r.RhysticScrying.class)); + cards.add(new SetCardInfo("Rhystic Shield", 20, Rarity.COMMON, mage.cards.r.RhysticShield.class)); cards.add(new SetCardInfo("Rhystic Study", 45, Rarity.COMMON, mage.cards.r.RhysticStudy.class)); + cards.add(new SetCardInfo("Rhystic Syphon", 76, Rarity.UNCOMMON, mage.cards.r.RhysticSyphon.class)); cards.add(new SetCardInfo("Rhystic Tutor", 77, Rarity.RARE, mage.cards.r.RhysticTutor.class)); cards.add(new SetCardInfo("Ribbon Snake", 46, Rarity.COMMON, mage.cards.r.RibbonSnake.class)); cards.add(new SetCardInfo("Rib Cage Spider", 121, Rarity.COMMON, mage.cards.r.RibCageSpider.class)); @@ -156,6 +162,7 @@ public class Prophecy extends ExpansionSet { cards.add(new SetCardInfo("Sunken Field", 51, Rarity.UNCOMMON, mage.cards.s.SunkenField.class)); cards.add(new SetCardInfo("Sword Dancer", 25, Rarity.UNCOMMON, mage.cards.s.SwordDancer.class)); cards.add(new SetCardInfo("Task Mage Assembly", 105, Rarity.RARE, mage.cards.t.TaskMageAssembly.class)); + cards.add(new SetCardInfo("Thresher Beast", 128, Rarity.COMMON, mage.cards.t.ThresherBeast.class)); cards.add(new SetCardInfo("Thrive", 129, Rarity.COMMON, mage.cards.t.Thrive.class)); cards.add(new SetCardInfo("Trenching Steed", 26, Rarity.COMMON, mage.cards.t.TrenchingSteed.class)); cards.add(new SetCardInfo("Troubled Healer", 27, Rarity.COMMON, mage.cards.t.TroubledHealer.class)); @@ -170,6 +177,7 @@ public class Prophecy extends ExpansionSet { cards.add(new SetCardInfo("Whipstitched Zombie", 81, Rarity.COMMON, mage.cards.w.WhipstitchedZombie.class)); cards.add(new SetCardInfo("Wild Might", 134, Rarity.COMMON, mage.cards.w.WildMight.class)); cards.add(new SetCardInfo("Windscouter", 53, Rarity.UNCOMMON, mage.cards.w.Windscouter.class)); + cards.add(new SetCardInfo("Wing Storm", 135, Rarity.UNCOMMON, mage.cards.w.WingStorm.class)); cards.add(new SetCardInfo("Wintermoon Mesa", 143, Rarity.RARE, mage.cards.w.WintermoonMesa.class)); cards.add(new SetCardInfo("Withdraw", 54, Rarity.COMMON, mage.cards.w.Withdraw.class)); cards.add(new SetCardInfo("Zerapa Minotaur", 108, Rarity.COMMON, mage.cards.z.ZerapaMinotaur.class)); From 5c48d549161d666edec577d73ffacee0d14ec51e Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 17 Dec 2017 16:02:46 +0100 Subject: [PATCH 055/164] Rhystic Scrying payment cost fix --- Mage.Sets/src/mage/cards/r/RhysticScrying.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/r/RhysticScrying.java b/Mage.Sets/src/mage/cards/r/RhysticScrying.java index 5b19673103a..f558aa0e119 100644 --- a/Mage.Sets/src/mage/cards/r/RhysticScrying.java +++ b/Mage.Sets/src/mage/cards/r/RhysticScrying.java @@ -83,7 +83,7 @@ class RhysticScryingEffect extends OneShotEffect { if (controller != null && sourceObject != null) { boolean result = true; boolean doEffect = false; - Cost cost = new GenericManaCost(3); + Cost cost = new GenericManaCost(2); // check if any player is willing to pay for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) { Player player = game.getPlayer(playerId); From aa7231bec0472824781b970e76caa618bcd4fcdc Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 17 Dec 2017 19:41:22 +0100 Subject: [PATCH 056/164] Expanded DoUnlessTargetPlayerOrTargetsControllerPaysEffect --- ...sTargetPlayerOrTargetsControllerPaysEffect.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Mage/src/main/java/mage/abilities/effects/common/DoUnlessTargetPlayerOrTargetsControllerPaysEffect.java b/Mage/src/main/java/mage/abilities/effects/common/DoUnlessTargetPlayerOrTargetsControllerPaysEffect.java index 12d698b5274..5876210895c 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DoUnlessTargetPlayerOrTargetsControllerPaysEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/DoUnlessTargetPlayerOrTargetsControllerPaysEffect.java @@ -50,6 +50,7 @@ import mage.util.CardUtil; public class DoUnlessTargetPlayerOrTargetsControllerPaysEffect extends OneShotEffect { protected Effects executingEffects = new Effects(); + private Effect otherwiseEffect; private Cost cost; private DynamicValue genericMana; private String chooseUseText; @@ -59,8 +60,13 @@ public class DoUnlessTargetPlayerOrTargetsControllerPaysEffect extends OneShotEf } public DoUnlessTargetPlayerOrTargetsControllerPaysEffect(Effect effect, Cost cost, String chooseUseText) { + this(effect, null, cost, chooseUseText); + } + + public DoUnlessTargetPlayerOrTargetsControllerPaysEffect(Effect effect, Effect otherwiseEffect, Cost cost, String chooseUseText) { super(Outcome.Detriment); this.executingEffects.add(effect); + this.otherwiseEffect = otherwiseEffect; this.cost = cost; this.chooseUseText = chooseUseText; } @@ -74,6 +80,7 @@ public class DoUnlessTargetPlayerOrTargetsControllerPaysEffect extends OneShotEf public DoUnlessTargetPlayerOrTargetsControllerPaysEffect(final DoUnlessTargetPlayerOrTargetsControllerPaysEffect effect) { super(effect); this.executingEffects = effect.executingEffects.copy(); + this.otherwiseEffect = effect.otherwiseEffect; if (effect.cost != null) { this.cost = effect.cost.copy(); } @@ -135,6 +142,13 @@ public class DoUnlessTargetPlayerOrTargetsControllerPaysEffect extends OneShotEf game.addEffect((ContinuousEffect) effect, source); } } + } else if (otherwiseEffect != null) { + otherwiseEffect.setTargetPointer(this.targetPointer); + if (otherwiseEffect instanceof OneShotEffect) { + result &= otherwiseEffect.apply(game, source); + } else { + game.addEffect((ContinuousEffect) otherwiseEffect, source); + } } return result; } From 63b50ea140f464d6754f6b18f5d6bd48d243a87d Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 17 Dec 2017 19:42:33 +0100 Subject: [PATCH 057/164] Implemented Rhystic Lightning --- .../src/mage/cards/r/RhysticLightning.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/r/RhysticLightning.java diff --git a/Mage.Sets/src/mage/cards/r/RhysticLightning.java b/Mage.Sets/src/mage/cards/r/RhysticLightning.java new file mode 100644 index 00000000000..83d3f35dae1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/r/RhysticLightning.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.cards.r; + +import java.util.UUID; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DoUnlessTargetPlayerOrTargetsControllerPaysEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.target.common.TargetCreatureOrPlayer; + +/** + * + * @author L_J + */ +public class RhysticLightning extends CardImpl { + + public RhysticLightning(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{2}{R}"); + + // Rhystic Lightning deals 4 damage to target creature or player unless that creature's controller or that player pays {2}. If he or she does, Rhystic Lightning deals 2 damage to the creature or player. + Effect effect = new DoUnlessTargetPlayerOrTargetsControllerPaysEffect(new DamageTargetEffect(4), new DamageTargetEffect(2), new ManaCostsImpl("{2}"), + "Pay {2} to have {this} deal 2 damage instead of 4 damage?"); + effect.setText("{this} deals 4 damage to target creature or player unless that creature's controller or that player pays {2}. If he or she does, {this} deals 2 damage to the creature or player"); + this.getSpellAbility().addEffect(effect); + this.getSpellAbility().addTarget(new TargetCreatureOrPlayer()); + } + + public RhysticLightning(final RhysticLightning card) { + super(card); + } + + @Override + public RhysticLightning copy() { + return new RhysticLightning(this); + } +} From ca18060b7d9c7c9d49e1856b8b372cb7325a34ab Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 17 Dec 2017 19:44:02 +0100 Subject: [PATCH 058/164] Implemented Keldon Battlewagon --- .../src/mage/cards/k/KeldonBattlewagon.java | 169 ++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/k/KeldonBattlewagon.java diff --git a/Mage.Sets/src/mage/cards/k/KeldonBattlewagon.java b/Mage.Sets/src/mage/cards/k/KeldonBattlewagon.java new file mode 100644 index 00000000000..e65943b01fc --- /dev/null +++ b/Mage.Sets/src/mage/cards/k/KeldonBattlewagon.java @@ -0,0 +1,169 @@ + /* + * 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.k; + +import java.util.List; +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.common.CantBlockAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.common.delayed.AtTheEndOfCombatDelayedTriggeredAbility; +import mage.abilities.costs.Cost; +import mage.abilities.costs.CostImpl; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect; +import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.permanent.TappedPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.target.common.TargetControlledPermanent; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author jeffwadsworth & L_J + */ +public class KeldonBattlewagon extends CardImpl { + + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("an untapped creature you control"); + static { + filter.add(Predicates.not(new TappedPredicate())); + } + + public KeldonBattlewagon(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{5}"); + this.subtype.add(SubType.JUGGERNAUT); + this.power = new MageInt(0); + this.toughness = new MageInt(3); + + // Trample + this.addAbility(TrampleAbility.getInstance()); + + // Keldon Battlewagon can't block. + this.addAbility(new CantBlockAbility()); + + // When Keldon Battlewagon attacks, sacrifice it at end of combat. + this.addAbility(new AttacksTriggeredAbility(new CreateDelayedTriggeredAbilityEffect(new AtTheEndOfCombatDelayedTriggeredAbility(new SacrificeSourceEffect())), false)); + + // Tap an untapped creature you control: Keldon Battlewagon gets +X/+0 until end of turn, where X is the power of the creature tapped this way. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new KeldonBattlewagonBoostEffect(), new KeldonBattlewagonCost(new TargetControlledPermanent(filter)))); + + } + + public KeldonBattlewagon(final KeldonBattlewagon card) { + super(card); + } + + @Override + public KeldonBattlewagon copy() { + return new KeldonBattlewagon(this); + } +} + +class KeldonBattlewagonCost extends CostImpl { + + TargetControlledPermanent target; + + public KeldonBattlewagonCost(TargetControlledPermanent target) { + this.target = target; + this.text = "Tap an untapped creature you control"; + } + + public KeldonBattlewagonCost(final KeldonBattlewagonCost cost) { + super(cost); + this.target = cost.target.copy(); + } + + @Override + public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana, Cost costToPay) { + if (target.choose(Outcome.Tap, controllerId, sourceId, game)) { + for (UUID targetId: (List)target.getTargets()) { + Permanent permanent = game.getPermanent(targetId); + if (permanent == null) + return false; + paid |= permanent.tap(game); + for (Effect effect : ability.getEffects()) { + effect.setTargetPointer(new FixedTarget(permanent.getId())); + } + } + } + return paid; + } + + @Override + public boolean canPay(Ability ability, UUID sourceId, UUID controllerId, Game game) { + return target.canChoose(controllerId, game); + } + + @Override + public KeldonBattlewagonCost copy() { + return new KeldonBattlewagonCost(this); + } +} + +class KeldonBattlewagonBoostEffect extends OneShotEffect { + + public KeldonBattlewagonBoostEffect() { + super(Outcome.BoostCreature); + staticText = "{this} gets +X/+0 until end of turn, where X is the power of the creature tapped this way"; + } + + public KeldonBattlewagonBoostEffect(KeldonBattlewagonBoostEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent KeldonBattlewagon = game.getPermanent(source.getSourceId()); + Permanent tappedCreature = game.getPermanentOrLKIBattlefield(this.targetPointer.getFirst(game, source)); + if (tappedCreature != null && KeldonBattlewagon != null) { + int amount = tappedCreature.getPower().getValue(); + game.addEffect(new BoostSourceEffect(amount, 0, Duration.EndOfTurn), source); + } + return true; + } + + @Override + public KeldonBattlewagonBoostEffect copy() { + return new KeldonBattlewagonBoostEffect(this); + } +} From d001fafaeddbd518a6060c3478d1afc68b641352 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 17 Dec 2017 19:45:26 +0100 Subject: [PATCH 059/164] Implemented Rhystic Lightning and Keldon Battlewagon --- Mage.Sets/src/mage/sets/Prophecy.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Mage.Sets/src/mage/sets/Prophecy.java b/Mage.Sets/src/mage/sets/Prophecy.java index 0727299f8dc..5e29e9f37cd 100644 --- a/Mage.Sets/src/mage/sets/Prophecy.java +++ b/Mage.Sets/src/mage/sets/Prophecy.java @@ -106,6 +106,7 @@ public class Prophecy extends ExpansionSet { cards.add(new SetCardInfo("Jolrael, Empress of Beasts", 115, Rarity.RARE, mage.cards.j.JolraelEmpressOfBeasts.class)); cards.add(new SetCardInfo("Jolrael's Favor", 116, Rarity.COMMON, mage.cards.j.JolraelsFavor.class)); cards.add(new SetCardInfo("Keldon Arsonist", 92, Rarity.UNCOMMON, mage.cards.k.KeldonArsonist.class)); + cards.add(new SetCardInfo("Keldon Battlewagon", 139, Rarity.RARE, mage.cards.k.KeldonBattlewagon.class)); cards.add(new SetCardInfo("Keldon Berserker", 93, Rarity.COMMON, mage.cards.k.KeldonBerserker.class)); cards.add(new SetCardInfo("Keldon Firebombers", 94, Rarity.RARE, mage.cards.k.KeldonFirebombers.class)); cards.add(new SetCardInfo("Latulla, Keldon Overseer", 95, Rarity.RARE, mage.cards.l.LatullaKeldonOverseer.class)); @@ -136,6 +137,7 @@ public class Prophecy extends ExpansionSet { cards.add(new SetCardInfo("Rhystic Cave", 142, Rarity.UNCOMMON, mage.cards.r.RhysticCave.class)); cards.add(new SetCardInfo("Rhystic Circle", 19, Rarity.COMMON, mage.cards.r.RhysticCircle.class)); cards.add(new SetCardInfo("Rhystic Deluge", 43, Rarity.COMMON, mage.cards.r.RhysticDeluge.class)); + cards.add(new SetCardInfo("Rhystic Lightning", 99, Rarity.COMMON, mage.cards.r.RhysticLightning.class)); cards.add(new SetCardInfo("Rhystic Scrying", 44, Rarity.UNCOMMON, mage.cards.r.RhysticScrying.class)); cards.add(new SetCardInfo("Rhystic Shield", 20, Rarity.COMMON, mage.cards.r.RhysticShield.class)); cards.add(new SetCardInfo("Rhystic Study", 45, Rarity.COMMON, mage.cards.r.RhysticStudy.class)); From 860909408d8ca1f513245594fd32ba6a48f4ee53 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 17 Dec 2017 23:03:54 +0100 Subject: [PATCH 060/164] Minor improvement --- .../DoUnlessTargetPlayerOrTargetsControllerPaysEffect.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage/src/main/java/mage/abilities/effects/common/DoUnlessTargetPlayerOrTargetsControllerPaysEffect.java b/Mage/src/main/java/mage/abilities/effects/common/DoUnlessTargetPlayerOrTargetsControllerPaysEffect.java index 5876210895c..79aeee1d2e8 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DoUnlessTargetPlayerOrTargetsControllerPaysEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/DoUnlessTargetPlayerOrTargetsControllerPaysEffect.java @@ -96,8 +96,8 @@ public class DoUnlessTargetPlayerOrTargetsControllerPaysEffect extends OneShotEf @Override public boolean apply(Game game, Ability source) { - Player targetController = game.getPlayer(source.getFirstTarget()); - Permanent targetPermanent = game.getPermanent(source.getFirstTarget()); + Player targetController = game.getPlayer(this.getTargetPointer().getFirst(game, source)); + Permanent targetPermanent = game.getPermanent(this.getTargetPointer().getFirst(game, source)); if (targetPermanent != null) { targetController = game.getPlayer(targetPermanent.getControllerId()); } From e9e7034c72bdd5bf12e2e3800653ad277e9fa84f Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 17 Dec 2017 23:16:26 +0100 Subject: [PATCH 061/164] Implemented Shrouded Serpent --- .../src/mage/cards/s/ShroudedSerpent.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/ShroudedSerpent.java diff --git a/Mage.Sets/src/mage/cards/s/ShroudedSerpent.java b/Mage.Sets/src/mage/cards/s/ShroudedSerpent.java new file mode 100644 index 00000000000..7730f739d74 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/ShroudedSerpent.java @@ -0,0 +1,72 @@ +/* + * 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.s; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DoUnlessTargetPlayerOrTargetsControllerPaysEffect; +import mage.abilities.effects.common.combat.CantBeBlockedByAllSourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SetTargetPointer; +import mage.constants.Duration; +import mage.filter.common.FilterCreaturePermanent; + +/** + * + * @author L_J + */ +public class ShroudedSerpent extends CardImpl { + + public ShroudedSerpent(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{U}{U}{U}"); + this.subtype.add(SubType.SERPENT); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Whenever Shrouded Serpent attacks, defending player may pay {4}. If he or she doesn't, Shrouded Serpent can't be blocked this turn. + this.addAbility(new AttacksTriggeredAbility( + new DoUnlessTargetPlayerOrTargetsControllerPaysEffect(new CantBeBlockedByAllSourceEffect(new FilterCreaturePermanent(), Duration.EndOfCombat), new ManaCostsImpl("{4}")), + false, + "Whenever {this} attacks, defending player may pay {4}. If he or she doesn't, {this} can't be blocked this turn.", + SetTargetPointer.PLAYER)); + } + + public ShroudedSerpent(final ShroudedSerpent card) { + super(card); + } + + @Override + public ShroudedSerpent copy() { + return new ShroudedSerpent(this); + } +} From fc580f16ac8a6ef0a178750e917bde5b3ef70feb Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 17 Dec 2017 23:17:24 +0100 Subject: [PATCH 062/164] Implemented Shrouded Serpent --- Mage.Sets/src/mage/sets/Prophecy.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage.Sets/src/mage/sets/Prophecy.java b/Mage.Sets/src/mage/sets/Prophecy.java index 5e29e9f37cd..1683668a27c 100644 --- a/Mage.Sets/src/mage/sets/Prophecy.java +++ b/Mage.Sets/src/mage/sets/Prophecy.java @@ -151,6 +151,7 @@ public class Prophecy extends ExpansionSet { cards.add(new SetCardInfo("Scoria Cat", 101, Rarity.UNCOMMON, mage.cards.s.ScoriaCat.class)); cards.add(new SetCardInfo("Searing Wind", 103, Rarity.RARE, mage.cards.s.SearingWind.class)); cards.add(new SetCardInfo("Shield Dancer", 23, Rarity.UNCOMMON, mage.cards.s.ShieldDancer.class)); + cards.add(new SetCardInfo("Shrouded Serpent", 47, Rarity.RARE, mage.cards.s.ShroudedSerpent.class)); cards.add(new SetCardInfo("Silt Crawler", 123, Rarity.COMMON, mage.cards.s.SiltCrawler.class)); cards.add(new SetCardInfo("Snag", 124, Rarity.UNCOMMON, mage.cards.s.Snag.class)); cards.add(new SetCardInfo("Spiketail Drake", 48, Rarity.UNCOMMON, mage.cards.s.SpiketailDrake.class)); From 8bc9ae15437132579557445393132fe8142b0d20 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Mon, 18 Dec 2017 03:12:41 +0100 Subject: [PATCH 063/164] Implemented Infinity Elemental --- .../src/mage/cards/i/InfinityElemental.java | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/i/InfinityElemental.java diff --git a/Mage.Sets/src/mage/cards/i/InfinityElemental.java b/Mage.Sets/src/mage/cards/i/InfinityElemental.java new file mode 100644 index 00000000000..f9e425f80d1 --- /dev/null +++ b/Mage.Sets/src/mage/cards/i/InfinityElemental.java @@ -0,0 +1,95 @@ +/* + * 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.i; + +import java.util.Objects; +import java.util.UUID; +import mage.MageInt; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +/** + * + * @author L_J + */ +public class InfinityElemental extends CardImpl { + + private class MaxMageInt extends MageInt { + + private boolean isInfinite = true; + + public MaxMageInt() { + super(Integer.MAX_VALUE); + } + + @Override + public MaxMageInt copy() { + if (Objects.equals(this, EmptyMageInt)) { + return this; + } + return new MaxMageInt(); + } + + @Override + public void setValue(int value) { + this.boostedValue = value; + this.isInfinite = false; + } + + @Override + public void boostValue(int amount) { + if (!isInfinite) { + this.boostedValue += amount; + } + } + + @Override + public void resetToBaseValue() { + this.boostedValue = this.baseValueModified; + this.isInfinite = true; + } + }; + + public InfinityElemental(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{R}{R}{R}"); + this.subtype.add(SubType.ELEMENTAL); + this.power = new MaxMageInt(); + this.toughness = new MageInt(5); + } + + public InfinityElemental(final InfinityElemental card) { + super(card); + } + + @Override + public InfinityElemental copy() { + return new InfinityElemental(this); + } +} From 9963a5ddf8f4bfa8b5604f32005b95040d7fa007 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Mon, 18 Dec 2017 03:15:36 +0100 Subject: [PATCH 064/164] Implemented Infinity Elemental --- Mage.Sets/src/mage/sets/Unstable.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage.Sets/src/mage/sets/Unstable.java b/Mage.Sets/src/mage/sets/Unstable.java index d7ecad68d42..82f53b7b454 100644 --- a/Mage.Sets/src/mage/sets/Unstable.java +++ b/Mage.Sets/src/mage/sets/Unstable.java @@ -62,6 +62,7 @@ public class Unstable extends ExpansionSet { cards.add(new SetCardInfo("Ground Pounder", 110, Rarity.COMMON, mage.cards.g.GroundPounder.class)); cards.add(new SetCardInfo("Hammer Helper", 85, Rarity.COMMON, mage.cards.h.HammerHelper.class)); cards.add(new SetCardInfo("Hydradoodle", 112, Rarity.RARE, mage.cards.h.Hydradoodle.class)); + cards.add(new SetCardInfo("Infinity Elemental", 88, Rarity.MYTHIC, mage.cards.i.InfinityElemental.class)); cards.add(new SetCardInfo("Inhumaniac", 59, Rarity.UNCOMMON, mage.cards.i.Inhumaniac.class)); cards.add(new SetCardInfo("Island", 213, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.UNH_FULL_ART_BASIC, false))); cards.add(new SetCardInfo("Krark's Other Thumb", 151, Rarity.UNCOMMON, mage.cards.k.KrarksOtherThumb.class)); From ae4e244c3fbb076700b15efae34309e2d0722ad3 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Mon, 18 Dec 2017 09:09:07 +0100 Subject: [PATCH 065/164] Implemented Infinity Elemental --- Utils/mtg-cards-data.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index 113a6e90685..c74f1e0d65b 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -32764,3 +32764,4 @@ Wall of Fortune|Unstable|50|C|{1}{U}|Artifact Creature - Wall|0|4|Defender$You m Wild Crocodile|Unstable|125|C|{1}{G}|Host Creature - Crocodile|1|1|When this creature enters the battlefield, search your library for a basic land card, reveal it, put it into your hand, then shuffle your library.| Willing Test Subject|Unstable|126|C|{2}{G}|Creature- Spider Monkey Scientist|2|2|Reach$Whenever you roll a 4 or higher on a die, put a +1/+1 counter on Willing Test Subject.$6: Roll a six-sided die.| Garbage Elemental|Unstable|82|U|{4}{R}|Creature - Elemental|3|2|Battle cry (Whenever this creature attacks, each other attacking creature gets +1/+0 until end of turn.)$When Garbage Elemental enters the battlefield, roll two six-sided dice. Create a number of 1/1 red Goblin creature tokens equal to the difference between those results.| +Infinity Elemental|Unstable|88|M|{4}{R}{R}{R}|Creature - Elemental|2147483647|5|| From 9f515368c107ac191b8bf386eb5488543e9ffb09 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Mon, 18 Dec 2017 09:32:15 +0100 Subject: [PATCH 066/164] Verify workaround MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Verify fails without the ∞ symbol at power for Infinity Elemental --- Utils/mtg-cards-data.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/Utils/mtg-cards-data.txt b/Utils/mtg-cards-data.txt index c74f1e0d65b..113a6e90685 100644 --- a/Utils/mtg-cards-data.txt +++ b/Utils/mtg-cards-data.txt @@ -32764,4 +32764,3 @@ Wall of Fortune|Unstable|50|C|{1}{U}|Artifact Creature - Wall|0|4|Defender$You m Wild Crocodile|Unstable|125|C|{1}{G}|Host Creature - Crocodile|1|1|When this creature enters the battlefield, search your library for a basic land card, reveal it, put it into your hand, then shuffle your library.| Willing Test Subject|Unstable|126|C|{2}{G}|Creature- Spider Monkey Scientist|2|2|Reach$Whenever you roll a 4 or higher on a die, put a +1/+1 counter on Willing Test Subject.$6: Roll a six-sided die.| Garbage Elemental|Unstable|82|U|{4}{R}|Creature - Elemental|3|2|Battle cry (Whenever this creature attacks, each other attacking creature gets +1/+0 until end of turn.)$When Garbage Elemental enters the battlefield, roll two six-sided dice. Create a number of 1/1 red Goblin creature tokens equal to the difference between those results.| -Infinity Elemental|Unstable|88|M|{4}{R}{R}{R}|Creature - Elemental|2147483647|5|| From 920432d2d400b6dc82bdac5bc4b07cdcc7dd6f01 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Mon, 18 Dec 2017 21:22:15 +0100 Subject: [PATCH 067/164] Implemented Branded Brawlers --- .../src/mage/cards/b/BrandedBrawlers.java | 122 ++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/b/BrandedBrawlers.java diff --git a/Mage.Sets/src/mage/cards/b/BrandedBrawlers.java b/Mage.Sets/src/mage/cards/b/BrandedBrawlers.java new file mode 100644 index 00000000000..83553cefb51 --- /dev/null +++ b/Mage.Sets/src/mage/cards/b/BrandedBrawlers.java @@ -0,0 +1,122 @@ +/* + * 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.b; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.RestrictionEffect; +import mage.abilities.effects.common.combat.CantAttackIfDefenderControlsPermanent; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.permanent.TappedPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * @author L_J + */ +public class BrandedBrawlers extends CardImpl { + + static final private FilterLandPermanent filter = new FilterLandPermanent("an untapped land"); + static { + filter.add(Predicates.not(new TappedPredicate())); + } + + final static private String rule = "{this} can't block if you control an untapped land"; + + public BrandedBrawlers(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{R}"); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Branded Brawlers can't attack if defending player controls an untapped land. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackIfDefenderControlsPermanent(filter))); + + // Branded Brawlers can't block if you control an untapped land. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BrandedBrawlersCantBlockEffect(filter))); + } + + public BrandedBrawlers(final BrandedBrawlers card) { + super(card); + } + + @Override + public BrandedBrawlers copy() { + return new BrandedBrawlers(this); + } +} + +class BrandedBrawlersCantBlockEffect extends RestrictionEffect { + + private final FilterPermanent filter; + + public BrandedBrawlersCantBlockEffect(FilterPermanent filter) { + super(Duration.WhileOnBattlefield); + this.filter = filter; + staticText = new StringBuilder("{this} can't attack if you control ").append(filter.getMessage()).toString(); + } + + public BrandedBrawlersCantBlockEffect(final BrandedBrawlersCantBlockEffect effect) { + super(effect); + this.filter = effect.filter; + } + + @Override + public boolean applies(Permanent permanent, Ability source, Game game) { + return permanent.getId().equals(source.getSourceId()); + } + + @Override + public boolean canBlock(Permanent attacker, Permanent blocker, Ability source, Game game) { + Player player = game.getPlayer(blocker.getControllerId()); + if (player != null) { + if (game.getBattlefield().countAll(filter, player.getId(), game) > 0) { + return false; + } + } + return true; + } + + @Override + public BrandedBrawlersCantBlockEffect copy() { + return new BrandedBrawlersCantBlockEffect(this); + } + +} From bc728d31f3aae5c01a3d6dcfb6f17da95fdf8541 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Mon, 18 Dec 2017 21:22:49 +0100 Subject: [PATCH 068/164] Implemented Veteran Brawlers --- .../src/mage/cards/v/VeteranBrawlers.java | 122 ++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/v/VeteranBrawlers.java diff --git a/Mage.Sets/src/mage/cards/v/VeteranBrawlers.java b/Mage.Sets/src/mage/cards/v/VeteranBrawlers.java new file mode 100644 index 00000000000..1ab3d12c248 --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/VeteranBrawlers.java @@ -0,0 +1,122 @@ +/* + * 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.v; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.RestrictionEffect; +import mage.abilities.effects.common.combat.CantAttackIfDefenderControlsPermanent; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.Zone; +import mage.filter.FilterPermanent; +import mage.filter.common.FilterLandPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.permanent.TappedPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; + +/** + * @author L_J + */ +public class VeteranBrawlers extends CardImpl { + + static final private FilterLandPermanent filter = new FilterLandPermanent("an untapped land"); + static { + filter.add(Predicates.not(new TappedPredicate())); + } + + final static private String rule = "{this} can't block if you control an untapped land"; + + public VeteranBrawlers(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Veteran Brawlers can't attack if defending player controls an untapped land. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new CantAttackIfDefenderControlsPermanent(filter))); + + // Veteran Brawlers can't block if you control an untapped land. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new VeteranBrawlersCantBlockEffect(filter))); + } + + public VeteranBrawlers(final VeteranBrawlers card) { + super(card); + } + + @Override + public VeteranBrawlers copy() { + return new VeteranBrawlers(this); + } +} + +class VeteranBrawlersCantBlockEffect extends RestrictionEffect { + + private final FilterPermanent filter; + + public VeteranBrawlersCantBlockEffect(FilterPermanent filter) { + super(Duration.WhileOnBattlefield); + this.filter = filter; + staticText = new StringBuilder("{this} can't attack if you control ").append(filter.getMessage()).toString(); + } + + public VeteranBrawlersCantBlockEffect(final VeteranBrawlersCantBlockEffect effect) { + super(effect); + this.filter = effect.filter; + } + + @Override + public boolean applies(Permanent permanent, Ability source, Game game) { + return permanent.getId().equals(source.getSourceId()); + } + + @Override + public boolean canBlock(Permanent attacker, Permanent blocker, Ability source, Game game) { + Player player = game.getPlayer(blocker.getControllerId()); + if (player != null) { + if (game.getBattlefield().countAll(filter, player.getId(), game) > 0) { + return false; + } + } + return true; + } + + @Override + public VeteranBrawlersCantBlockEffect copy() { + return new VeteranBrawlersCantBlockEffect(this); + } + +} From e6b15f65d8a472abe6183a60d51a8653466ac9b1 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Mon, 18 Dec 2017 21:23:51 +0100 Subject: [PATCH 069/164] Implemented Branded Brawlers and Veteran Brawlers --- Mage.Sets/src/mage/sets/Prophecy.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Mage.Sets/src/mage/sets/Prophecy.java b/Mage.Sets/src/mage/sets/Prophecy.java index 1683668a27c..9d65ff6399e 100644 --- a/Mage.Sets/src/mage/sets/Prophecy.java +++ b/Mage.Sets/src/mage/sets/Prophecy.java @@ -68,6 +68,7 @@ public class Prophecy extends ExpansionSet { cards.add(new SetCardInfo("Blessed Wind", 4, Rarity.RARE, mage.cards.b.BlessedWind.class)); cards.add(new SetCardInfo("Bog Elemental", 57, Rarity.RARE, mage.cards.b.BogElemental.class)); cards.add(new SetCardInfo("Bog Glider", 58, Rarity.COMMON, mage.cards.b.BogGlider.class)); + cards.add(new SetCardInfo("Branded Brawlers", 84, Rarity.COMMON, mage.cards.b.BrandedBrawlers.class)); cards.add(new SetCardInfo("Calming Verse", 110, Rarity.COMMON, mage.cards.c.CalmingVerse.class)); cards.add(new SetCardInfo("Celestial Convergence", 5, Rarity.RARE, mage.cards.c.CelestialConvergence.class)); cards.add(new SetCardInfo("Chilling Apparition", 59, Rarity.UNCOMMON, mage.cards.c.ChillingApparition.class)); @@ -171,6 +172,7 @@ public class Prophecy extends ExpansionSet { cards.add(new SetCardInfo("Troubled Healer", 27, Rarity.COMMON, mage.cards.t.TroubledHealer.class)); cards.add(new SetCardInfo("Troublesome Spirit", 52, Rarity.RARE, mage.cards.t.TroublesomeSpirit.class)); cards.add(new SetCardInfo("Verdant Field", 130, Rarity.UNCOMMON, mage.cards.v.VerdantField.class)); + cards.add(new SetCardInfo("Veteran Brawlers", 106, Rarity.RARE, mage.cards.v.VeteranBrawlers.class)); cards.add(new SetCardInfo("Vintara Elephant", 131, Rarity.COMMON, mage.cards.v.VintaraElephant.class)); cards.add(new SetCardInfo("Vintara Snapper", 132, Rarity.UNCOMMON, mage.cards.v.VintaraSnapper.class)); cards.add(new SetCardInfo("Vitalizing Wind", 133, Rarity.RARE, mage.cards.v.VitalizingWind.class)); From eae526e3b393db69fecabd2009541f6da2e814e1 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Mon, 18 Dec 2017 22:16:14 +0100 Subject: [PATCH 070/164] Added Verify exception for Infinity Elemental --- Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index 574e5b627fc..2f5cef23786 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -33,6 +33,7 @@ public class VerifyCardDataTest { // power-toughness skipListCreate("PT"); skipListAddName("PT", "Garbage Elemental"); // UST + skipListAddName("PT", "Infinity Elemental"); // UST // color skipListCreate("COLOR"); From 4a6ff5593edbd6982503b5757d64ebbce2574f1c Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Tue, 19 Dec 2017 01:40:44 +0100 Subject: [PATCH 071/164] More edits --- .../DoUnlessTargetPlayerOrTargetsControllerPaysEffect.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage/src/main/java/mage/abilities/effects/common/DoUnlessTargetPlayerOrTargetsControllerPaysEffect.java b/Mage/src/main/java/mage/abilities/effects/common/DoUnlessTargetPlayerOrTargetsControllerPaysEffect.java index 79aeee1d2e8..47f064ea6fb 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DoUnlessTargetPlayerOrTargetsControllerPaysEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/DoUnlessTargetPlayerOrTargetsControllerPaysEffect.java @@ -97,7 +97,7 @@ public class DoUnlessTargetPlayerOrTargetsControllerPaysEffect extends OneShotEf @Override public boolean apply(Game game, Ability source) { Player targetController = game.getPlayer(this.getTargetPointer().getFirst(game, source)); - Permanent targetPermanent = game.getPermanent(this.getTargetPointer().getFirst(game, source)); + Permanent targetPermanent = game.getPermanentOrLKIBattlefield(this.getTargetPointer().getFirst(game, source)); if (targetPermanent != null) { targetController = game.getPlayer(targetPermanent.getControllerId()); } From 1ae892c63ffc9f67f6f2bda04258983a98a5e7c8 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Tue, 19 Dec 2017 01:56:20 +0100 Subject: [PATCH 072/164] Implemented Death Charmer --- Mage.Sets/src/mage/cards/d/DeathCharmer.java | 66 ++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/d/DeathCharmer.java diff --git a/Mage.Sets/src/mage/cards/d/DeathCharmer.java b/Mage.Sets/src/mage/cards/d/DeathCharmer.java new file mode 100644 index 00000000000..d8873abbae4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/d/DeathCharmer.java @@ -0,0 +1,66 @@ +/* + * 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.d; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.DealsCombatDamageToACreatureTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DoUnlessTargetPlayerOrTargetsControllerPaysEffect; +import mage.abilities.effects.common.LoseLifeTargetControllerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +/** + * + * @author L_J + */ +public class DeathCharmer extends CardImpl { + + public DeathCharmer(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{B}"); + this.subtype.add(SubType.WORM); + this.subtype.add(SubType.MERCENARY); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Whenever Death Charmer deals combat damage to a creature, that creature's controller loses 2 life unless he or she pays {2}. + this.addAbility(new DealsCombatDamageToACreatureTriggeredAbility(new DoUnlessTargetPlayerOrTargetsControllerPaysEffect(new LoseLifeTargetControllerEffect(2), new ManaCostsImpl("{2}")), false, true)); + } + + public DeathCharmer(final DeathCharmer card) { + super(card); + } + + @Override + public DeathCharmer copy() { + return new DeathCharmer(this); + } +} From fe5231730ba978d2198fc00e9223f7585e63894d Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Tue, 19 Dec 2017 01:57:38 +0100 Subject: [PATCH 073/164] Implemented Hollow Warrior --- Mage.Sets/src/mage/cards/h/HollowWarrior.java | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/h/HollowWarrior.java diff --git a/Mage.Sets/src/mage/cards/h/HollowWarrior.java b/Mage.Sets/src/mage/cards/h/HollowWarrior.java new file mode 100644 index 00000000000..fc39cb4e1be --- /dev/null +++ b/Mage.Sets/src/mage/cards/h/HollowWarrior.java @@ -0,0 +1,109 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.h; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.costs.common.TapTargetCost; +import mage.abilities.effects.PayCostToAttackBlockEffectImpl; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.Zone; +import mage.filter.common.FilterControlledCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.permanent.AttackingPredicate; +import mage.filter.predicate.permanent.BlockingPredicate; +import mage.filter.predicate.permanent.TappedPredicate; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author L_J + */ +public class HollowWarrior extends CardImpl { + + public HollowWarrior(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT,CardType.CREATURE},"{4}"); + this.subtype.add(SubType.GOLEM); + this.subtype.add(SubType.WARRIOR); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Hollow Warrior can't attack or block unless you tap an untapped creature you control not declared as an attacking or blocking creature this combat. (This cost is paid as attackers are declared.) + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new HollowWarriorCostToAttackBlockEffect())); + + } + + public HollowWarrior(final HollowWarrior card) { + super(card); + } + + @Override + public HollowWarrior copy() { + return new HollowWarrior(this); + } +} + +class HollowWarriorCostToAttackBlockEffect extends PayCostToAttackBlockEffectImpl { + + private static final FilterControlledCreaturePermanent filter = new FilterControlledCreaturePermanent("an untapped creature you control not declared as an attacking or blocking creature"); + static { + filter.add(Predicates.not(new AttackingPredicate())); + filter.add(Predicates.not(new BlockingPredicate())); + filter.add(Predicates.not(new TappedPredicate())); + } + + HollowWarriorCostToAttackBlockEffect() { + super(Duration.WhileOnBattlefield, Outcome.Detriment, RestrictType.ATTACK_AND_BLOCK, + new TapTargetCost(new TargetControlledPermanent(filter))); + staticText = "{this} can't attack or block unless you tap an untapped creature you control not declared as an attacking or blocking creature this combat (This cost is paid as attackers are declared.)"; + } + + HollowWarriorCostToAttackBlockEffect(HollowWarriorCostToAttackBlockEffect effect) { + super(effect); + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + return source.getSourceId().equals(event.getSourceId()); + } + + @Override + public HollowWarriorCostToAttackBlockEffect copy() { + return new HollowWarriorCostToAttackBlockEffect(this); + } + +} From ee06dccca714cca26aed8a6c53ae90506d53a591 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Tue, 19 Dec 2017 01:58:19 +0100 Subject: [PATCH 074/164] Implemented Mirror Strike --- Mage.Sets/src/mage/cards/m/MirrorStrike.java | 131 +++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/m/MirrorStrike.java diff --git a/Mage.Sets/src/mage/cards/m/MirrorStrike.java b/Mage.Sets/src/mage/cards/m/MirrorStrike.java new file mode 100644 index 00000000000..5d9e5191041 --- /dev/null +++ b/Mage.Sets/src/mage/cards/m/MirrorStrike.java @@ -0,0 +1,131 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.m; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.events.DamageEvent; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.permanent.UnblockedPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author L_J + */ +public class MirrorStrike extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("unblocked creature"); + + static { + filter.add(new UnblockedPredicate()); + } + + public MirrorStrike(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{3}{W}"); + + // All combat damage that would be dealt to you this turn by target unblocked creature is dealt to its controller instead. + this.getSpellAbility().addEffect(new MirrorStrikeEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent(filter)); + } + + public MirrorStrike(final MirrorStrike card) { + super(card); + } + + @Override + public MirrorStrike copy() { + return new MirrorStrike(this); + } +} + +class MirrorStrikeEffect extends ReplacementEffectImpl { + + public MirrorStrikeEffect() { + super(Duration.EndOfTurn, Outcome.RedirectDamage); + staticText = "All combat damage that would be dealt to you this turn by target unblocked creature is dealt to its controller instead"; + } + + public MirrorStrikeEffect(final MirrorStrikeEffect effect) { + super(effect); + } + + @Override + public MirrorStrikeEffect copy() { + return new MirrorStrikeEffect(this); + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DAMAGE_PLAYER; + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + Player controller = game.getPlayer(source.getControllerId()); + DamageEvent damageEvent = (DamageEvent) event; + if (controller != null) { + Permanent targetPermanent = game.getPermanent(source.getFirstTarget()); + if (targetPermanent != null) { + Player targetsController = game.getPlayer(targetPermanent.getControllerId()); + if (targetsController != null) { + targetsController.damage(damageEvent.getAmount(), damageEvent.getSourceId(), game, damageEvent.isCombatDamage(), damageEvent.isPreventable(), damageEvent.getAppliedEffects()); + return true; + } + } + } + return false; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + Player controller = game.getPlayer(source.getControllerId()); + DamageEvent damageEvent = (DamageEvent) event; + Permanent targetPermanent = game.getPermanent(source.getFirstTarget()); + if (controller != null && targetPermanent != null) { + return (damageEvent.isCombatDamage() && controller.getId() == damageEvent.getTargetId() && targetPermanent.getId() == damageEvent.getSourceId()); + } + return false; + } +} From 7adc04f8942e3463ae82099ed9865954bcc09a6d Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Tue, 19 Dec 2017 01:59:08 +0100 Subject: [PATCH 075/164] Implemented Soul Charmer --- Mage.Sets/src/mage/cards/s/SoulCharmer.java | 66 +++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SoulCharmer.java diff --git a/Mage.Sets/src/mage/cards/s/SoulCharmer.java b/Mage.Sets/src/mage/cards/s/SoulCharmer.java new file mode 100644 index 00000000000..9602b4ffc6a --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SoulCharmer.java @@ -0,0 +1,66 @@ +/* + * 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.s; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.DealsCombatDamageToACreatureTriggeredAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DoUnlessTargetPlayerOrTargetsControllerPaysEffect; +import mage.abilities.effects.common.GainLifeEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; + +/** + * + * @author L_J + */ +public class SoulCharmer extends CardImpl { + + public SoulCharmer(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}"); + this.subtype.add(SubType.HUMAN); + this.subtype.add(SubType.REBEL); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Whenever Soul Charmer deals combat damage to a creature, you gain 2 life unless he or she pays {2}. + this.addAbility(new DealsCombatDamageToACreatureTriggeredAbility(new DoUnlessTargetPlayerOrTargetsControllerPaysEffect(new GainLifeEffect(2), new ManaCostsImpl("{2}")), false, true)); + } + + public SoulCharmer(final SoulCharmer card) { + super(card); + } + + @Override + public SoulCharmer copy() { + return new SoulCharmer(this); + } +} From 45b79319579243b81c55d17c06fe0149198d4ad3 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Tue, 19 Dec 2017 02:01:01 +0100 Subject: [PATCH 076/164] Implemented more cards --- Mage.Sets/src/mage/sets/Prophecy.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Mage.Sets/src/mage/sets/Prophecy.java b/Mage.Sets/src/mage/sets/Prophecy.java index 9d65ff6399e..5fa54206277 100644 --- a/Mage.Sets/src/mage/sets/Prophecy.java +++ b/Mage.Sets/src/mage/sets/Prophecy.java @@ -78,6 +78,7 @@ public class Prophecy extends ExpansionSet { cards.add(new SetCardInfo("Coffin Puppets", 60, Rarity.RARE, mage.cards.c.CoffinPuppets.class)); cards.add(new SetCardInfo("Copper-Leaf Angel", 137, Rarity.RARE, mage.cards.c.CopperLeafAngel.class)); cards.add(new SetCardInfo("Darba", 111, Rarity.UNCOMMON, mage.cards.d.Darba.class)); + cards.add(new SetCardInfo("Death Charmer", 61, Rarity.COMMON, mage.cards.d.DeathCharmer.class)); cards.add(new SetCardInfo("Denying Wind", 32, Rarity.RARE, mage.cards.d.DenyingWind.class)); cards.add(new SetCardInfo("Despoil", 62, Rarity.COMMON, mage.cards.d.Despoil.class)); cards.add(new SetCardInfo("Devastate", 87, Rarity.COMMON, mage.cards.d.Devastate.class)); @@ -101,6 +102,7 @@ public class Prophecy extends ExpansionSet { cards.add(new SetCardInfo("Gulf Squid", 35, Rarity.COMMON, mage.cards.g.GulfSquid.class)); cards.add(new SetCardInfo("Hazy Homunculus", 36, Rarity.COMMON, mage.cards.h.HazyHomunculus.class)); cards.add(new SetCardInfo("Heightened Awareness", 37, Rarity.RARE, mage.cards.h.HeightenedAwareness.class)); + cards.add(new SetCardInfo("Hollow Warrior", 138, Rarity.UNCOMMON, mage.cards.h.HollowWarrior.class)); cards.add(new SetCardInfo("Infernal Genesis", 68, Rarity.RARE, mage.cards.i.InfernalGenesis.class)); cards.add(new SetCardInfo("Inflame", 91, Rarity.COMMON, mage.cards.i.Inflame.class)); cards.add(new SetCardInfo("Jeweled Spirit", 12, Rarity.RARE, mage.cards.j.JeweledSpirit.class)); @@ -120,6 +122,7 @@ public class Prophecy extends ExpansionSet { cards.add(new SetCardInfo("Marsh Boa", 118, Rarity.COMMON, mage.cards.m.MarshBoa.class)); cards.add(new SetCardInfo("Mercenary Informer", 15, Rarity.RARE, mage.cards.m.MercenaryInformer.class)); cards.add(new SetCardInfo("Mine Bearer", 16, Rarity.COMMON, mage.cards.m.MineBearer.class)); + cards.add(new SetCardInfo("Mirror Strike", 17, Rarity.UNCOMMON, mage.cards.m.MirrorStrike.class)); cards.add(new SetCardInfo("Mungha Wurm", 119, Rarity.RARE, mage.cards.m.MunghaWurm.class)); cards.add(new SetCardInfo("Nakaya Shade", 69, Rarity.UNCOMMON, mage.cards.n.NakayaShade.class)); cards.add(new SetCardInfo("Noxious Field", 70, Rarity.UNCOMMON, mage.cards.n.NoxiousField.class)); @@ -155,6 +158,7 @@ public class Prophecy extends ExpansionSet { cards.add(new SetCardInfo("Shrouded Serpent", 47, Rarity.RARE, mage.cards.s.ShroudedSerpent.class)); cards.add(new SetCardInfo("Silt Crawler", 123, Rarity.COMMON, mage.cards.s.SiltCrawler.class)); cards.add(new SetCardInfo("Snag", 124, Rarity.UNCOMMON, mage.cards.s.Snag.class)); + cards.add(new SetCardInfo("Soul Charmer", 24, Rarity.COMMON, mage.cards.s.SoulCharmer.class)); cards.add(new SetCardInfo("Spiketail Drake", 48, Rarity.UNCOMMON, mage.cards.s.SpiketailDrake.class)); cards.add(new SetCardInfo("Spiketail Hatchling", 49, Rarity.COMMON, mage.cards.s.SpiketailHatchling.class)); cards.add(new SetCardInfo("Spitting Spider", 125, Rarity.UNCOMMON, mage.cards.s.SpittingSpider.class)); From 20dc4a2f28a6fe222424c9a4a9fbcc98d1f0675d Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Tue, 19 Dec 2017 12:48:11 +0100 Subject: [PATCH 077/164] Implemented Glittering Lion --- .../src/mage/cards/g/GlitteringLion.java | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/g/GlitteringLion.java diff --git a/Mage.Sets/src/mage/cards/g/GlitteringLion.java b/Mage.Sets/src/mage/cards/g/GlitteringLion.java new file mode 100644 index 00000000000..4ecf4f220e7 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GlitteringLion.java @@ -0,0 +1,102 @@ +/* + * 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.g; + +import java.io.ObjectStreamException; +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.MageSingleton; +import mage.abilities.StaticAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.InfoEffect; +import mage.abilities.effects.common.PreventAllDamageToSourceEffect; +import mage.abilities.effects.common.continuous.LoseAbilitySourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.TargetController; +import mage.constants.Zone; + +/** + * + * @author L_J + */ +public class GlitteringLion extends CardImpl { + + public GlitteringLion(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{W}"); + this.subtype.add(SubType.CAT); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // Prevent all damage that would be dealt to Glittering Lion. + this.addAbility(GlitteringLionAbility.getInstance()); + // {3}: Until end of turn, Glittering Lion loses "Prevent all damage that would be dealt to Glittering Lion." Any player may activate this ability. + SimpleActivatedAbility ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new LoseAbilitySourceEffect(GlitteringLionAbility.getInstance(), Duration.EndOfTurn).setText("Until end of turn, {this} loses \"Prevent all damage that would be dealt to {this}.\""), new ManaCostsImpl("{3}")); + ability2.setMayActivate(TargetController.ANY); + ability2.addEffect(new InfoEffect("Any player may activate this ability")); + this.addAbility(ability2); + } + + public GlitteringLion(final GlitteringLion card) { + super(card); + } + + @Override + public GlitteringLion copy() { + return new GlitteringLion(this); + } + +} + +class GlitteringLionAbility extends StaticAbility { + + private static final GlitteringLionAbility instance = new GlitteringLionAbility(); + + private Object readResolve() throws ObjectStreamException { + return instance; + } + + public static GlitteringLionAbility getInstance() { + return instance; + } + + public GlitteringLionAbility() { + super(Zone.BATTLEFIELD, new PreventAllDamageToSourceEffect(Duration.WhileOnBattlefield)); + } + + @Override + public GlitteringLionAbility copy() { + return instance; + } + +} From ca25f5cad2a29bc7559a9982c6eaa08fecd04324 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Tue, 19 Dec 2017 12:49:38 +0100 Subject: [PATCH 078/164] Implemented Glittering Lynx --- .../src/mage/cards/g/GlitteringLynx.java | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/g/GlitteringLynx.java diff --git a/Mage.Sets/src/mage/cards/g/GlitteringLynx.java b/Mage.Sets/src/mage/cards/g/GlitteringLynx.java new file mode 100644 index 00000000000..3c2269fb482 --- /dev/null +++ b/Mage.Sets/src/mage/cards/g/GlitteringLynx.java @@ -0,0 +1,102 @@ +/* + * 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.g; + +import java.io.ObjectStreamException; +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.MageSingleton; +import mage.abilities.StaticAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.InfoEffect; +import mage.abilities.effects.common.PreventAllDamageToSourceEffect; +import mage.abilities.effects.common.continuous.LoseAbilitySourceEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.TargetController; +import mage.constants.Zone; + +/** + * + * @author L_J + */ +public class GlitteringLynx extends CardImpl { + + public GlitteringLynx(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{W}"); + this.subtype.add(SubType.CAT); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Prevent all damage that would be dealt to Glittering Lynx. + this.addAbility(GlitteringLynxAbility.getInstance()); + // {2}: Until end of turn, Glittering Lynx loses "Prevent all damage that would be dealt to Glittering Lynx." Any player may activate this ability. + SimpleActivatedAbility ability2 = new SimpleActivatedAbility(Zone.BATTLEFIELD, new LoseAbilitySourceEffect(GlitteringLynxAbility.getInstance(), Duration.EndOfTurn).setText("Until end of turn, {this} loses \"Prevent all damage that would be dealt to {this}.\""), new ManaCostsImpl("{2}")); + ability2.setMayActivate(TargetController.ANY); + ability2.addEffect(new InfoEffect("Any player may activate this ability")); + this.addAbility(ability2); + } + + public GlitteringLynx(final GlitteringLynx card) { + super(card); + } + + @Override + public GlitteringLynx copy() { + return new GlitteringLynx(this); + } + +} + +class GlitteringLynxAbility extends StaticAbility { + + private static final GlitteringLynxAbility instance = new GlitteringLynxAbility(); + + private Object readResolve() throws ObjectStreamException { + return instance; + } + + public static GlitteringLynxAbility getInstance() { + return instance; + } + + public GlitteringLynxAbility() { + super(Zone.BATTLEFIELD, new PreventAllDamageToSourceEffect(Duration.WhileOnBattlefield)); + } + + @Override + public GlitteringLynxAbility copy() { + return instance; + } + +} From 33dd84bf5c2d4de54d1c789b819565eafb1384f5 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Tue, 19 Dec 2017 12:51:44 +0100 Subject: [PATCH 079/164] Implemented Wall of Vipers --- Mage.Sets/src/mage/cards/w/WallOfVipers.java | 83 ++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/w/WallOfVipers.java diff --git a/Mage.Sets/src/mage/cards/w/WallOfVipers.java b/Mage.Sets/src/mage/cards/w/WallOfVipers.java new file mode 100644 index 00000000000..caa2f077e9b --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WallOfVipers.java @@ -0,0 +1,83 @@ +/* + * 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.w; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DestroySourceEffect; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.InfoEffect; +import mage.abilities.keyword.DefenderAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterAttackingCreature; +import mage.filter.predicate.permanent.BlockedByIdPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author BursegSardaukar & L_J + */ +public class WallOfVipers extends CardImpl { + + public WallOfVipers(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{2}{B}"); + this.subtype.add(SubType.SNAKE); + this.subtype.add(SubType.WALL); + this.power = new MageInt(2); + this.toughness = new MageInt(4); + + // Defender + this.addAbility(DefenderAbility.getInstance()); + + // {3}: Destroy Wall of Vipers and target creature it's blocking. Any player may activate this ability. + FilterAttackingCreature filter = new FilterAttackingCreature("creature it's blocking"); + filter.add(new BlockedByIdPredicate(this.getId())); + SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroySourceEffect(), new ManaCostsImpl("{3}")); + ability.addEffect(new DestroyTargetEffect(" and target creature it's blocking")); + ability.addTarget(new TargetCreaturePermanent(filter)); + ability.setMayActivate(TargetController.ANY); + ability.addEffect(new InfoEffect("Any player may activate this ability")); + this.addAbility(ability); + } + + public WallOfVipers(final WallOfVipers card) { + super(card); + } + + @Override + public WallOfVipers copy() { + return new WallOfVipers(this); + } +} From c457bb47c74082df3ebcb6c5635cf4dee72159b7 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Tue, 19 Dec 2017 15:28:46 +0100 Subject: [PATCH 080/164] Implemented more cards --- Mage.Sets/src/mage/sets/Prophecy.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Mage.Sets/src/mage/sets/Prophecy.java b/Mage.Sets/src/mage/sets/Prophecy.java index 5fa54206277..25bd32e66ce 100644 --- a/Mage.Sets/src/mage/sets/Prophecy.java +++ b/Mage.Sets/src/mage/sets/Prophecy.java @@ -97,6 +97,8 @@ public class Prophecy extends ExpansionSet { cards.add(new SetCardInfo("Flowering Field", 9, Rarity.UNCOMMON, mage.cards.f.FloweringField.class)); cards.add(new SetCardInfo("Foil", 34, Rarity.UNCOMMON, mage.cards.f.Foil.class)); cards.add(new SetCardInfo("Forgotten Harvest", 114, Rarity.RARE, mage.cards.f.ForgottenHarvest.class)); + cards.add(new SetCardInfo("Glittering Lion", 10, Rarity.UNCOMMON, mage.cards.g.GlitteringLion.class)); + cards.add(new SetCardInfo("Glittering Lynx", 11, Rarity.COMMON, mage.cards.g.GlitteringLynx.class)); cards.add(new SetCardInfo("Greel's Caress", 67, Rarity.COMMON, mage.cards.g.GreelsCaress.class)); cards.add(new SetCardInfo("Greel, Mind Raker", 66, Rarity.RARE, mage.cards.g.GreelMindRaker.class)); cards.add(new SetCardInfo("Gulf Squid", 35, Rarity.COMMON, mage.cards.g.GulfSquid.class)); @@ -180,6 +182,7 @@ public class Prophecy extends ExpansionSet { cards.add(new SetCardInfo("Vintara Elephant", 131, Rarity.COMMON, mage.cards.v.VintaraElephant.class)); cards.add(new SetCardInfo("Vintara Snapper", 132, Rarity.UNCOMMON, mage.cards.v.VintaraSnapper.class)); cards.add(new SetCardInfo("Vitalizing Wind", 133, Rarity.RARE, mage.cards.v.VitalizingWind.class)); + cards.add(new SetCardInfo("Wall of Vipers", 80, Rarity.UNCOMMON, mage.cards.w.WallOfVipers.class)); cards.add(new SetCardInfo("Well of Discovery", 140, Rarity.RARE, mage.cards.w.WellOfDiscovery.class)); cards.add(new SetCardInfo("Well of Life", 141, Rarity.UNCOMMON, mage.cards.w.WellOfLife.class)); cards.add(new SetCardInfo("Whip Sergeant", 107, Rarity.UNCOMMON, mage.cards.w.WhipSergeant.class)); From dff74cce5a30a9fe4179f0518fbb71f30160256a Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Tue, 19 Dec 2017 23:43:21 +0100 Subject: [PATCH 081/164] Removed Infinity Elemental --- Mage.Sets/src/mage/sets/Unstable.java | 1 - 1 file changed, 1 deletion(-) diff --git a/Mage.Sets/src/mage/sets/Unstable.java b/Mage.Sets/src/mage/sets/Unstable.java index 82f53b7b454..d7ecad68d42 100644 --- a/Mage.Sets/src/mage/sets/Unstable.java +++ b/Mage.Sets/src/mage/sets/Unstable.java @@ -62,7 +62,6 @@ public class Unstable extends ExpansionSet { cards.add(new SetCardInfo("Ground Pounder", 110, Rarity.COMMON, mage.cards.g.GroundPounder.class)); cards.add(new SetCardInfo("Hammer Helper", 85, Rarity.COMMON, mage.cards.h.HammerHelper.class)); cards.add(new SetCardInfo("Hydradoodle", 112, Rarity.RARE, mage.cards.h.Hydradoodle.class)); - cards.add(new SetCardInfo("Infinity Elemental", 88, Rarity.MYTHIC, mage.cards.i.InfinityElemental.class)); cards.add(new SetCardInfo("Inhumaniac", 59, Rarity.UNCOMMON, mage.cards.i.Inhumaniac.class)); cards.add(new SetCardInfo("Island", 213, Rarity.LAND, mage.cards.basiclands.Island.class, new CardGraphicInfo(FrameStyle.UNH_FULL_ART_BASIC, false))); cards.add(new SetCardInfo("Krark's Other Thumb", 151, Rarity.UNCOMMON, mage.cards.k.KrarksOtherThumb.class)); From e69dbe2adf65291a306753b874b04cbbfe38ff87 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Tue, 19 Dec 2017 23:44:25 +0100 Subject: [PATCH 082/164] Removed Infinity Elemental --- .../src/mage/cards/i/InfinityElemental.java | 95 ------------------- 1 file changed, 95 deletions(-) delete mode 100644 Mage.Sets/src/mage/cards/i/InfinityElemental.java diff --git a/Mage.Sets/src/mage/cards/i/InfinityElemental.java b/Mage.Sets/src/mage/cards/i/InfinityElemental.java deleted file mode 100644 index f9e425f80d1..00000000000 --- a/Mage.Sets/src/mage/cards/i/InfinityElemental.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * 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.i; - -import java.util.Objects; -import java.util.UUID; -import mage.MageInt; -import mage.cards.CardImpl; -import mage.cards.CardSetInfo; -import mage.constants.CardType; -import mage.constants.SubType; - -/** - * - * @author L_J - */ -public class InfinityElemental extends CardImpl { - - private class MaxMageInt extends MageInt { - - private boolean isInfinite = true; - - public MaxMageInt() { - super(Integer.MAX_VALUE); - } - - @Override - public MaxMageInt copy() { - if (Objects.equals(this, EmptyMageInt)) { - return this; - } - return new MaxMageInt(); - } - - @Override - public void setValue(int value) { - this.boostedValue = value; - this.isInfinite = false; - } - - @Override - public void boostValue(int amount) { - if (!isInfinite) { - this.boostedValue += amount; - } - } - - @Override - public void resetToBaseValue() { - this.boostedValue = this.baseValueModified; - this.isInfinite = true; - } - }; - - public InfinityElemental(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{4}{R}{R}{R}"); - this.subtype.add(SubType.ELEMENTAL); - this.power = new MaxMageInt(); - this.toughness = new MageInt(5); - } - - public InfinityElemental(final InfinityElemental card) { - super(card); - } - - @Override - public InfinityElemental copy() { - return new InfinityElemental(this); - } -} From 29c9ce696dc9ba6b517ab168091e422c8fbc1ffe Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Wed, 20 Dec 2017 00:20:27 +0100 Subject: [PATCH 083/164] Included overflow check methods --- Mage/src/main/java/mage/game/Game.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Mage/src/main/java/mage/game/Game.java b/Mage/src/main/java/mage/game/Game.java index 3956dd24b7b..af57f22d9c8 100644 --- a/Mage/src/main/java/mage/game/Game.java +++ b/Mage/src/main/java/mage/game/Game.java @@ -466,4 +466,8 @@ public interface Game extends MageItem, Serializable { UUID getMonarchId(); void setMonarchId(Ability source, UUID monarchId); + + int addWithOverflowCheck(int base, int increment); + + int subtractWithOverflowCheck(int base, int decrement); } From 35bbe20b95fff211a81608afd61c16167fd134b1 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Wed, 20 Dec 2017 00:21:44 +0100 Subject: [PATCH 084/164] Included overflow check methods --- Mage/src/main/java/mage/game/GameImpl.java | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Mage/src/main/java/mage/game/GameImpl.java b/Mage/src/main/java/mage/game/GameImpl.java index 9e07a84e340..b37590f40a6 100644 --- a/Mage/src/main/java/mage/game/GameImpl.java +++ b/Mage/src/main/java/mage/game/GameImpl.java @@ -3000,4 +3000,25 @@ public abstract class GameImpl implements Game, Serializable { } } + @Override + public int addWithOverflowCheck(int base, int increment) { + long result = ((long) base) + increment; + if (result > Integer.MAX_VALUE) { + return Integer.MAX_VALUE; + } else if (result < Integer.MIN_VALUE) { + return Integer.MIN_VALUE; + } + return base + increment; + } + + @Override + public int subtractWithOverflowCheck(int base, int decrement) { + long result = ((long) base) - decrement; + if (result > Integer.MAX_VALUE) { + return Integer.MAX_VALUE; + } else if (result < Integer.MIN_VALUE) { + return Integer.MIN_VALUE; + } + return base - decrement; + } } From 40561e900a67718a622de2b50e191e59f6f0352c Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Wed, 20 Dec 2017 00:29:36 +0100 Subject: [PATCH 085/164] Included overflow check methods --- Mage/src/main/java/mage/players/PlayerImpl.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java index 423aee4372d..c130af8cb0a 100644 --- a/Mage/src/main/java/mage/players/PlayerImpl.java +++ b/Mage/src/main/java/mage/players/PlayerImpl.java @@ -1748,7 +1748,8 @@ public abstract class PlayerImpl implements Player, Serializable { } GameEvent event = new GameEvent(GameEvent.EventType.LOSE_LIFE, playerId, playerId, playerId, amount, atCombat); if (!game.replaceEvent(event)) { - this.life -= event.getAmount(); + // this.life -= event.getAmount(); + this.life = game.subtractWithOverflowCheck(this.life, event.getAmount()); if (!game.isSimulation()) { game.informPlayers(this.getLogName() + " loses " + event.getAmount() + " life"); } @@ -1777,7 +1778,10 @@ public abstract class PlayerImpl implements Player, Serializable { } GameEvent event = new GameEvent(GameEvent.EventType.GAIN_LIFE, playerId, playerId, playerId, amount, false); if (!game.replaceEvent(event)) { - this.life += event.getAmount(); + // TODO: lock life at Integer.MAX_VALUE if reached, until it's set to a different amount + // (https://magic.wizards.com/en/articles/archive/news/unstable-faqawaslfaqpaftidawabiajtbt-2017-12-06 - "infinite" life total stays infinite no matter how much is gained or lost) + // this.life += event.getAmount(); + this.life = game.addWithOverflowCheck(this.life, event.getAmount()); if (!game.isSimulation()) { game.informPlayers(this.getLogName() + " gains " + event.getAmount() + " life"); } From bf6939f45b4bf465b5b7f657a96465b1a91c7b6e Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Wed, 20 Dec 2017 00:31:31 +0100 Subject: [PATCH 086/164] Included overflow check methods --- Mage/src/main/java/mage/game/permanent/PermanentImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java index a5e5b9d59c1..34659ec7841 100644 --- a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java +++ b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java @@ -887,7 +887,8 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { addCounters(CounterType.M1M1.createInstance(actualDamage), damageSourceAbility, game); } } else { - this.damage += actualDamage; + // this.damage += actualDamage; + this.damage = game.addWithOverflowCheck(this.damage, actualDamage); } game.fireEvent(new DamagedCreatureEvent(objectId, sourceId, controllerId, actualDamage, combat)); return actualDamage; From 24200738957d2a071e00a29e1ef9409a2acf8726 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Wed, 20 Dec 2017 00:35:26 +0100 Subject: [PATCH 087/164] Changed integer amount declaration --- Mage.Sets/src/mage/cards/p/PersonalIncarnation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/p/PersonalIncarnation.java b/Mage.Sets/src/mage/cards/p/PersonalIncarnation.java index 63ff9fa5de2..a9cdf4be71a 100644 --- a/Mage.Sets/src/mage/cards/p/PersonalIncarnation.java +++ b/Mage.Sets/src/mage/cards/p/PersonalIncarnation.java @@ -128,7 +128,7 @@ class PersonalIncarnationLoseHalfLifeEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Player player = game.getPlayer(game.getOwnerId(source.getSourceId())); if (player != null) { - int amount = (player.getLife() + 1) / 2; + Integer amount = (int) Math.ceil(player.getLife() / 2f); if (amount > 0) { player.loseLife(amount, game, false); return true; From 75ee0c27bb5ba981b67829c80f7cb65539cbc2a8 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Fri, 22 Dec 2017 20:30:24 +0100 Subject: [PATCH 088/164] Fix for Wall of Vipers --- Mage.Sets/src/mage/cards/w/WallOfVipers.java | 42 +++++++++++++++++--- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/Mage.Sets/src/mage/cards/w/WallOfVipers.java b/Mage.Sets/src/mage/cards/w/WallOfVipers.java index caa2f077e9b..25025cd38bb 100644 --- a/Mage.Sets/src/mage/cards/w/WallOfVipers.java +++ b/Mage.Sets/src/mage/cards/w/WallOfVipers.java @@ -41,13 +41,15 @@ import mage.constants.CardType; import mage.constants.SubType; import mage.constants.TargetController; import mage.constants.Zone; -import mage.filter.common.FilterAttackingCreature; -import mage.filter.predicate.permanent.BlockedByIdPredicate; +import mage.filter.common.FilterCreaturePermanent; +import mage.game.Game; +import mage.game.combat.CombatGroup; +import mage.game.permanent.Permanent; import mage.target.common.TargetCreaturePermanent; /** * - * @author BursegSardaukar & L_J + * @author L_J */ public class WallOfVipers extends CardImpl { @@ -62,11 +64,9 @@ public class WallOfVipers extends CardImpl { this.addAbility(DefenderAbility.getInstance()); // {3}: Destroy Wall of Vipers and target creature it's blocking. Any player may activate this ability. - FilterAttackingCreature filter = new FilterAttackingCreature("creature it's blocking"); - filter.add(new BlockedByIdPredicate(this.getId())); SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DestroySourceEffect(), new ManaCostsImpl("{3}")); ability.addEffect(new DestroyTargetEffect(" and target creature it's blocking")); - ability.addTarget(new TargetCreaturePermanent(filter)); + ability.addTarget(new TargetCreaturePermanent(new WallOfVipersFilter())); ability.setMayActivate(TargetController.ANY); ability.addEffect(new InfoEffect("Any player may activate this ability")); this.addAbility(ability); @@ -81,3 +81,33 @@ public class WallOfVipers extends CardImpl { return new WallOfVipers(this); } } + +class WallOfVipersFilter extends FilterCreaturePermanent { + + public WallOfVipersFilter() { + super("creature it's blocking"); + } + + public WallOfVipersFilter(final WallOfVipersFilter filter) { + super(filter); + } + + @Override + public WallOfVipersFilter copy() { + return new WallOfVipersFilter(this); + } + + @Override + public boolean match(Permanent permanent, UUID sourceId, UUID playerId, Game game) { + if (super.match(permanent, sourceId, playerId, game)) { + SubType subtype = (SubType) game.getState().getValue(sourceId + "_type"); + for (CombatGroup combatGroup : game.getCombat().getGroups()) { + if (combatGroup.getBlockers().contains(sourceId) && combatGroup.getAttackers().contains(permanent.getId())) { + return true; + } + } + } + return false; + } + +} From 6e1c177eca25f8d32253579a9f426f7d69a2a049 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Fri, 22 Dec 2017 20:31:50 +0100 Subject: [PATCH 089/164] Text fix --- Mage.Sets/src/mage/cards/w/WallOfVipers.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/w/WallOfVipers.java b/Mage.Sets/src/mage/cards/w/WallOfVipers.java index 25025cd38bb..00dbc28da6c 100644 --- a/Mage.Sets/src/mage/cards/w/WallOfVipers.java +++ b/Mage.Sets/src/mage/cards/w/WallOfVipers.java @@ -85,7 +85,7 @@ public class WallOfVipers extends CardImpl { class WallOfVipersFilter extends FilterCreaturePermanent { public WallOfVipersFilter() { - super("creature it's blocking"); + super("creature {this} is blocking"); } public WallOfVipersFilter(final WallOfVipersFilter filter) { From d0f74c9f9d68d4a3d62eaa9a992f8e26ad397bc7 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Fri, 22 Dec 2017 22:06:34 +0100 Subject: [PATCH 090/164] Overflow check --- Mage.Sets/src/mage/cards/i/InsultInjury.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/i/InsultInjury.java b/Mage.Sets/src/mage/cards/i/InsultInjury.java index b4c272be79c..3e22fc7d0da 100644 --- a/Mage.Sets/src/mage/cards/i/InsultInjury.java +++ b/Mage.Sets/src/mage/cards/i/InsultInjury.java @@ -88,7 +88,7 @@ class InsultDoubleDamageEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(event.getAmount() * 2); + event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); return false; } } From 27f0f04d52aa6923e4cae7d429748003e9e950c5 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Fri, 22 Dec 2017 22:07:42 +0100 Subject: [PATCH 091/164] Overflow check --- Mage.Sets/src/mage/cards/a/AngrathsMarauders.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/a/AngrathsMarauders.java b/Mage.Sets/src/mage/cards/a/AngrathsMarauders.java index e6e12b2eec5..b7d3baf22f0 100644 --- a/Mage.Sets/src/mage/cards/a/AngrathsMarauders.java +++ b/Mage.Sets/src/mage/cards/a/AngrathsMarauders.java @@ -106,7 +106,7 @@ class AngrathsMaraudersEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(2 * event.getAmount()); + event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); return false; } } From 78bf442674f93c740670c93f1b439fbaa879825e Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Fri, 22 Dec 2017 22:08:31 +0100 Subject: [PATCH 092/164] Overflow check --- Mage.Sets/src/mage/cards/g/GiselaBladeOfGoldnight.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/cards/g/GiselaBladeOfGoldnight.java b/Mage.Sets/src/mage/cards/g/GiselaBladeOfGoldnight.java index 7556ea36dea..ff0cd7caa0c 100644 --- a/Mage.Sets/src/mage/cards/g/GiselaBladeOfGoldnight.java +++ b/Mage.Sets/src/mage/cards/g/GiselaBladeOfGoldnight.java @@ -124,7 +124,7 @@ class GiselaBladeOfGoldnightDoubleDamageEffect extends ReplacementEffectImpl { if (event.getTargetId().equals(source.getControllerId())) { preventDamage(event, source, source.getControllerId(), game); } else if (game.getOpponents(source.getControllerId()).contains(event.getTargetId())) { - event.setAmount(event.getAmount() * 2); + event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); } break; case DAMAGE_CREATURE: @@ -134,7 +134,7 @@ class GiselaBladeOfGoldnightDoubleDamageEffect extends ReplacementEffectImpl { if (permanent.getControllerId().equals(source.getControllerId())) { preventDamage(event, source, permanent.getId(), game); } else if (game.getOpponents(source.getControllerId()).contains(permanent.getControllerId())) { - event.setAmount(event.getAmount() * 2); + event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); } } } From 123190bfa3db370864fe6476a331d07d4bde63a0 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Fri, 22 Dec 2017 22:10:34 +0100 Subject: [PATCH 093/164] Overflow check --- Mage.Sets/src/mage/cards/d/DictateOfTheTwinGods.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/cards/d/DictateOfTheTwinGods.java b/Mage.Sets/src/mage/cards/d/DictateOfTheTwinGods.java index 8e4814dbcd9..bdc2dac7a71 100644 --- a/Mage.Sets/src/mage/cards/d/DictateOfTheTwinGods.java +++ b/Mage.Sets/src/mage/cards/d/DictateOfTheTwinGods.java @@ -115,13 +115,13 @@ class DictateOfTheTwinGodsEffect extends ReplacementEffectImpl { if (damageEvent.getType() == EventType.DAMAGE_PLAYER) { Player targetPlayer = game.getPlayer(event.getTargetId()); if (targetPlayer != null) { - targetPlayer.damage(damageEvent.getAmount() * 2, damageEvent.getSourceId(), game, damageEvent.isCombatDamage(), damageEvent.isPreventable(), event.getAppliedEffects()); + targetPlayer.damage(game.addWithOverflowCheck(damageEvent.getAmount(), damageEvent.getAmount()), damageEvent.getSourceId(), game, damageEvent.isCombatDamage(), damageEvent.isPreventable(), event.getAppliedEffects()); return true; } } else { Permanent targetPermanent = game.getPermanent(event.getTargetId()); if (targetPermanent != null) { - targetPermanent.damage(damageEvent.getAmount() * 2, damageEvent.getSourceId(), game, damageEvent.isCombatDamage(), damageEvent.isPreventable(), event.getAppliedEffects()); + targetPermanent.damage(game.addWithOverflowCheck(damageEvent.getAmount(), damageEvent.getAmount()), damageEvent.getSourceId(), game, damageEvent.isCombatDamage(), damageEvent.isPreventable(), event.getAppliedEffects()); return true; } } From 536f9732e429532b1856c9a3ec78a5955b6c0c66 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Fri, 22 Dec 2017 22:11:45 +0100 Subject: [PATCH 094/164] Overflow check --- Mage.Sets/src/mage/cards/f/FurnaceOfRath.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/f/FurnaceOfRath.java b/Mage.Sets/src/mage/cards/f/FurnaceOfRath.java index 5bc4655be51..41e06785d73 100644 --- a/Mage.Sets/src/mage/cards/f/FurnaceOfRath.java +++ b/Mage.Sets/src/mage/cards/f/FurnaceOfRath.java @@ -99,7 +99,7 @@ class FurnaceOfRathEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(2 * event.getAmount()); + event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); return false; } } From bf8cd69f80a415b0025ef5641f33c4ab245713f0 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Fri, 22 Dec 2017 22:13:10 +0100 Subject: [PATCH 095/164] Overflow check --- Mage.Sets/src/mage/cards/d/DesperateGambit.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/d/DesperateGambit.java b/Mage.Sets/src/mage/cards/d/DesperateGambit.java index 1272b4c7291..6e4f4b2f880 100644 --- a/Mage.Sets/src/mage/cards/d/DesperateGambit.java +++ b/Mage.Sets/src/mage/cards/d/DesperateGambit.java @@ -129,7 +129,7 @@ class DesperateGambitEffect extends PreventionEffectImpl { if (controller != null && object != null) { if (super.applies(event, source, game) && event instanceof DamageEvent && event.getAmount() > 0) { if (wonFlip) { - event.setAmount(event.getAmount() * 2); + event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); this.discard(); } else { preventDamageAction(event, source, game); From 031eda86ab9f515d2d0cabd8081e70ee5291bcf1 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Fri, 22 Dec 2017 22:14:23 +0100 Subject: [PATCH 096/164] Overflow check --- Mage.Sets/src/mage/cards/i/ImpulsiveManeuvers.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/i/ImpulsiveManeuvers.java b/Mage.Sets/src/mage/cards/i/ImpulsiveManeuvers.java index dd8af49bc75..7fc226aa004 100644 --- a/Mage.Sets/src/mage/cards/i/ImpulsiveManeuvers.java +++ b/Mage.Sets/src/mage/cards/i/ImpulsiveManeuvers.java @@ -121,7 +121,7 @@ class ImpulsiveManeuversEffect extends PreventionEffectImpl { DamageEvent damageEvent = (DamageEvent) event; if (damageEvent.isCombatDamage()) { if (wonFlip) { - event.setAmount(event.getAmount() * 2); + event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); this.discard(); } else { preventDamageAction(event, source, game); From 977f3d4e0c507394d0a4f57ae181f957efc4276e Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Fri, 22 Dec 2017 22:15:32 +0100 Subject: [PATCH 097/164] Overflow check --- Mage.Sets/src/mage/cards/g/GratuitousViolence.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/g/GratuitousViolence.java b/Mage.Sets/src/mage/cards/g/GratuitousViolence.java index 2465d48dde0..7dab860ff64 100644 --- a/Mage.Sets/src/mage/cards/g/GratuitousViolence.java +++ b/Mage.Sets/src/mage/cards/g/GratuitousViolence.java @@ -106,7 +106,7 @@ class GratuitousViolenceReplacementEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(2 * event.getAmount()); + event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); return false; } } From 77cbeb39136e7e57f80f0ea1aa5012a8512859a2 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Fri, 22 Dec 2017 22:16:35 +0100 Subject: [PATCH 098/164] Overflow check --- Mage.Sets/src/mage/cards/o/Overblaze.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/cards/o/Overblaze.java b/Mage.Sets/src/mage/cards/o/Overblaze.java index c1092570c8d..836f1d1fce1 100644 --- a/Mage.Sets/src/mage/cards/o/Overblaze.java +++ b/Mage.Sets/src/mage/cards/o/Overblaze.java @@ -104,8 +104,8 @@ class FireServantEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(event.getAmount() * 2); + event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); return false; } -} \ No newline at end of file +} From 3584e66712fc0444baea60cd2c8fc772d57b1685 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Fri, 22 Dec 2017 22:17:16 +0100 Subject: [PATCH 099/164] Overflow check --- Mage.Sets/src/mage/cards/a/AnthemOfRakdos.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/a/AnthemOfRakdos.java b/Mage.Sets/src/mage/cards/a/AnthemOfRakdos.java index 068b806cfb4..46e3457cb37 100644 --- a/Mage.Sets/src/mage/cards/a/AnthemOfRakdos.java +++ b/Mage.Sets/src/mage/cards/a/AnthemOfRakdos.java @@ -110,7 +110,7 @@ class AnthemOfRakdosHellbentEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(event.getAmount() * 2); + event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); return false; } } From 1ab224f046568b7659f127b3b1f85dc67bc2701d Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Fri, 22 Dec 2017 22:18:09 +0100 Subject: [PATCH 100/164] Overflow check --- Mage.Sets/src/mage/cards/b/BitterFeud.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/b/BitterFeud.java b/Mage.Sets/src/mage/cards/b/BitterFeud.java index 5297a739da0..e97d01e2306 100644 --- a/Mage.Sets/src/mage/cards/b/BitterFeud.java +++ b/Mage.Sets/src/mage/cards/b/BitterFeud.java @@ -194,7 +194,7 @@ class BitterFeudEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(event.getAmount() * 2); + event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); return false; } } From 9e45d962e943c79cfabca6641d1f79cfeda047ea Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Fri, 22 Dec 2017 22:18:51 +0100 Subject: [PATCH 101/164] Overflow check --- Mage.Sets/src/mage/cards/q/QuestForPureFlame.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/q/QuestForPureFlame.java b/Mage.Sets/src/mage/cards/q/QuestForPureFlame.java index 4ac5e7ce402..90cf5b24b1d 100644 --- a/Mage.Sets/src/mage/cards/q/QuestForPureFlame.java +++ b/Mage.Sets/src/mage/cards/q/QuestForPureFlame.java @@ -137,7 +137,7 @@ class QuestForPureFlameEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(event.getAmount() * 2); + event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); return false; } } From a5fc384644eb367cbde908b59cc7366014d2fcde Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Fri, 22 Dec 2017 22:19:59 +0100 Subject: [PATCH 102/164] Overflow check --- Mage.Sets/src/mage/cards/i/InquisitorsFlail.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/i/InquisitorsFlail.java b/Mage.Sets/src/mage/cards/i/InquisitorsFlail.java index fe38f01aba4..7cb40b89162 100644 --- a/Mage.Sets/src/mage/cards/i/InquisitorsFlail.java +++ b/Mage.Sets/src/mage/cards/i/InquisitorsFlail.java @@ -126,7 +126,7 @@ class InquisitorsFlailEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(event.getAmount() * 2); + event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); return false; } From f4b66f4de3def7d521d6cfeeff76d0b13809aa75 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Fri, 22 Dec 2017 22:21:32 +0100 Subject: [PATCH 103/164] Overflow check --- Mage.Sets/src/mage/cards/g/GoldnightCastigator.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/cards/g/GoldnightCastigator.java b/Mage.Sets/src/mage/cards/g/GoldnightCastigator.java index 9411b61bbfd..b461de60e8e 100644 --- a/Mage.Sets/src/mage/cards/g/GoldnightCastigator.java +++ b/Mage.Sets/src/mage/cards/g/GoldnightCastigator.java @@ -118,14 +118,14 @@ class GoldnightCastigatorDoubleDamageEffect extends ReplacementEffectImpl { switch (event.getType()) { case DAMAGE_PLAYER: if (event.getTargetId().equals(source.getControllerId())) { - event.setAmount(event.getAmount() * 2); + event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); } break; case DAMAGE_CREATURE: Permanent permanent = game.getPermanent(event.getTargetId()); if (permanent != null) { if (permanent.getId().equals(source.getSourceId())) { - event.setAmount(event.getAmount() * 2); + event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); } } } From 76a4d07b05d4e0a11232876dee3a3f3a036e4aa8 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Fri, 22 Dec 2017 22:22:52 +0100 Subject: [PATCH 104/164] Overflow check --- Mage.Sets/src/mage/cards/c/CurseOfBloodletting.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/cards/c/CurseOfBloodletting.java b/Mage.Sets/src/mage/cards/c/CurseOfBloodletting.java index 941df4792e3..156ef33fa17 100644 --- a/Mage.Sets/src/mage/cards/c/CurseOfBloodletting.java +++ b/Mage.Sets/src/mage/cards/c/CurseOfBloodletting.java @@ -112,8 +112,8 @@ class CurseOfBloodlettingEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(event.getAmount() * 2); + event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); return false; } -} \ No newline at end of file +} From ed490950cfbd21c02a49f6eb62e9b23bd1398d72 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Fri, 22 Dec 2017 22:23:39 +0100 Subject: [PATCH 105/164] Overflow check --- Mage.Sets/src/mage/cards/f/FireServant.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/f/FireServant.java b/Mage.Sets/src/mage/cards/f/FireServant.java index e0eadfc9574..b084bb2631d 100644 --- a/Mage.Sets/src/mage/cards/f/FireServant.java +++ b/Mage.Sets/src/mage/cards/f/FireServant.java @@ -111,7 +111,7 @@ class FireServantEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(event.getAmount() * 2); + event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); return false; } From d9c6e53877c4733b5ba392c190fe0b20d564d827 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Fri, 22 Dec 2017 22:28:52 +0100 Subject: [PATCH 106/164] Overflow check --- Mage.Sets/src/mage/cards/p/PyromancersSwath.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/p/PyromancersSwath.java b/Mage.Sets/src/mage/cards/p/PyromancersSwath.java index 84c83333cb7..4e012805316 100644 --- a/Mage.Sets/src/mage/cards/p/PyromancersSwath.java +++ b/Mage.Sets/src/mage/cards/p/PyromancersSwath.java @@ -105,7 +105,7 @@ class PyromancersSwathReplacementEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(event.getAmount() + 2); + event.setAmount(game.addWithOverflowCheck(event.getAmount(), 2)); return false; } From 3a74a44a2710f1196b9a463b05b0dd83f7d4c06c Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Fri, 22 Dec 2017 22:30:57 +0100 Subject: [PATCH 107/164] Overflow check --- Mage.Sets/src/mage/cards/e/EmbermawHellion.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/e/EmbermawHellion.java b/Mage.Sets/src/mage/cards/e/EmbermawHellion.java index 641091b6fc6..d56d7c9a1c6 100644 --- a/Mage.Sets/src/mage/cards/e/EmbermawHellion.java +++ b/Mage.Sets/src/mage/cards/e/EmbermawHellion.java @@ -120,7 +120,7 @@ class EmbermawHellionEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(event.getAmount() + 1); + event.setAmount(game.addWithOverflowCheck(event.getAmount(), 1)); return false; } From 18661c2c4d01bdb9010069c5391e37c670fe483e Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Fri, 22 Dec 2017 22:33:05 +0100 Subject: [PATCH 108/164] Overflow check --- Mage.Sets/src/mage/cards/p/PyromancersGauntlet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/p/PyromancersGauntlet.java b/Mage.Sets/src/mage/cards/p/PyromancersGauntlet.java index 1a2c6717ff2..7f9cdbe2025 100644 --- a/Mage.Sets/src/mage/cards/p/PyromancersGauntlet.java +++ b/Mage.Sets/src/mage/cards/p/PyromancersGauntlet.java @@ -103,7 +103,7 @@ class PyromancersGauntletReplacementEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(event.getAmount() + 2); + event.setAmount(game.addWithOverflowCheck(event.getAmount(), 2)); return false; } From 02cb7145f2b23dea73b1b1ebe02db066cb3d054e Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Fri, 22 Dec 2017 22:45:28 +0100 Subject: [PATCH 109/164] Overflow check --- Mage.Sets/src/mage/cards/p/Phthisis.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/p/Phthisis.java b/Mage.Sets/src/mage/cards/p/Phthisis.java index 06f54043326..b3c8fff54b1 100644 --- a/Mage.Sets/src/mage/cards/p/Phthisis.java +++ b/Mage.Sets/src/mage/cards/p/Phthisis.java @@ -91,7 +91,7 @@ class PhthisisEffect extends OneShotEffect { if (creature != null) { Player controller = game.getPlayer(creature.getControllerId()); if (controller != null) { - int lifeLoss = creature.getPower().getValue() + creature.getToughness().getValue(); + int lifeLoss = game.addWithOverflowCheck(creature.getPower().getValue(), creature.getToughness().getValue()); creature.destroy(source.getSourceId(), game, false); // the life loss happens also if the creature is indestructible or regenerated (legal targets) controller.loseLife(lifeLoss, game, false); From 3fc7f0c513001f6859156585f7ad4efe1d6fadf1 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Fri, 22 Dec 2017 22:47:42 +0100 Subject: [PATCH 110/164] Overflow check --- Mage.Sets/src/mage/cards/f/FarrelsMantle.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/f/FarrelsMantle.java b/Mage.Sets/src/mage/cards/f/FarrelsMantle.java index 380f184ab96..b2eee44e85f 100644 --- a/Mage.Sets/src/mage/cards/f/FarrelsMantle.java +++ b/Mage.Sets/src/mage/cards/f/FarrelsMantle.java @@ -126,7 +126,8 @@ class FarrelsMantleEffect extends OneShotEffect{ @Override public boolean apply(Game game, Ability source) { Permanent perm = game.getPermanent(source.getSourceId()); - DamageTargetEffect dmgEffect = new DamageTargetEffect(2+perm.getPower().getValue()); + int damage = game.addWithOverflowCheck(perm.getPower().getValue(), 2); + DamageTargetEffect dmgEffect = new DamageTargetEffect(damage); return dmgEffect.apply(game, source); } } From 8e2b397f1dfeda591441aaa00a24e88f648faeca Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Fri, 22 Dec 2017 22:49:12 +0100 Subject: [PATCH 111/164] Overflow check --- Mage.Sets/src/mage/cards/s/Sentinel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/s/Sentinel.java b/Mage.Sets/src/mage/cards/s/Sentinel.java index 1c67461fe41..d5d2518b1fe 100644 --- a/Mage.Sets/src/mage/cards/s/Sentinel.java +++ b/Mage.Sets/src/mage/cards/s/Sentinel.java @@ -105,7 +105,7 @@ class SentinelEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); Permanent targetPermanent = game.getPermanentOrLKIBattlefield(targetPointer.getFirst(game, source)); if (controller != null && targetPermanent != null) { - int newToughness = targetPermanent.getPower().getValue() + 1; + int newToughness = game.addWithOverflowCheck(targetPermanent.getPower().getValue(), 1); game.addEffect(new SetToughnessSourceEffect(new StaticValue(newToughness), Duration.Custom, SubLayer.SetPT_7b), source); return true; } From c0fb7b5cf08ff3a783e7d708ba0ab396839a9e64 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Fri, 22 Dec 2017 22:50:37 +0100 Subject: [PATCH 112/164] Overflow check --- Mage.Sets/src/mage/cards/p/PredatorsRapport.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/p/PredatorsRapport.java b/Mage.Sets/src/mage/cards/p/PredatorsRapport.java index b2f8c3f5754..989e0258ed3 100644 --- a/Mage.Sets/src/mage/cards/p/PredatorsRapport.java +++ b/Mage.Sets/src/mage/cards/p/PredatorsRapport.java @@ -72,7 +72,7 @@ class TargetPermanentPowerPlusToughnessCount implements DynamicValue { public int calculate(Game game, Ability sourceAbility, Effect effect) { Permanent sourcePermanent = game.getPermanent(sourceAbility.getFirstTarget()); if (sourcePermanent != null) { - return sourcePermanent.getPower().getValue() + sourcePermanent.getToughness().getValue(); + return game.addWithOverflowCheck(sourcePermanent.getPower().getValue(), sourcePermanent.getToughness().getValue()); } return 0; } From 95bde33ddb986b98095ff594e253d9021648b598 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Fri, 22 Dec 2017 22:54:25 +0100 Subject: [PATCH 113/164] Overflow check --- Mage.Sets/src/mage/cards/d/Dracoplasm.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/cards/d/Dracoplasm.java b/Mage.Sets/src/mage/cards/d/Dracoplasm.java index e378fc79986..48d56455f1f 100644 --- a/Mage.Sets/src/mage/cards/d/Dracoplasm.java +++ b/Mage.Sets/src/mage/cards/d/Dracoplasm.java @@ -131,8 +131,8 @@ class DracoplasmEffect extends ReplacementEffectImpl { for (UUID targetId : target.getTargets()) { Permanent targetCreature = game.getPermanent(targetId); if (targetCreature != null && targetCreature.sacrifice(source.getSourceId(), game)) { - power += targetCreature.getPower().getValue(); - toughness += targetCreature.getToughness().getValue(); + power = game.addWithOverflowCheck(power, targetCreature.getPower().getValue()); + toughness = game.addWithOverflowCheck(toughness, targetCreature.getToughness().getValue()); } } ContinuousEffect effect = new SetPowerToughnessSourceEffect(power, toughness, Duration.Custom, SubLayer.SetPT_7b); @@ -141,4 +141,4 @@ class DracoplasmEffect extends ReplacementEffectImpl { } return false; } -} \ No newline at end of file +} From e4326184c2e984a67199bac974dfbbc353bf416e Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Fri, 22 Dec 2017 23:02:11 +0100 Subject: [PATCH 114/164] 4ED Seeker numbering fix --- Mage.Sets/src/mage/sets/FourthEdition.java | 610 ++++++++++----------- 1 file changed, 305 insertions(+), 305 deletions(-) diff --git a/Mage.Sets/src/mage/sets/FourthEdition.java b/Mage.Sets/src/mage/sets/FourthEdition.java index 126a1999819..d4dfa9e5d7b 100644 --- a/Mage.Sets/src/mage/sets/FourthEdition.java +++ b/Mage.Sets/src/mage/sets/FourthEdition.java @@ -53,362 +53,362 @@ public class FourthEdition extends ExpansionSet { this.numBoosterUncommon = 3; this.numBoosterRare = 1; this.ratioBoosterMythic = 0; - cards.add(new SetCardInfo("Abomination", 1, Rarity.UNCOMMON, mage.cards.a.Abomination.class)); + cards.add(new SetCardInfo("Abomination", 117, Rarity.UNCOMMON, mage.cards.a.Abomination.class)); + cards.add(new SetCardInfo("Animate Dead", 118, Rarity.UNCOMMON, mage.cards.a.AnimateDead.class)); + cards.add(new SetCardInfo("Ashes to Ashes", 119, Rarity.UNCOMMON, mage.cards.a.AshesToAshes.class)); + cards.add(new SetCardInfo("Bad Moon", 120, Rarity.RARE, mage.cards.b.BadMoon.class)); + cards.add(new SetCardInfo("Black Knight", 121, Rarity.UNCOMMON, mage.cards.b.BlackKnight.class)); + cards.add(new SetCardInfo("Blight", 122, Rarity.UNCOMMON, mage.cards.b.Blight.class)); + cards.add(new SetCardInfo("Bog Imp", 123, Rarity.COMMON, mage.cards.b.BogImp.class)); + cards.add(new SetCardInfo("Bog Wraith", 124, Rarity.UNCOMMON, mage.cards.b.BogWraith.class)); + cards.add(new SetCardInfo("Carrion Ants", 125, Rarity.UNCOMMON, mage.cards.c.CarrionAnts.class)); + cards.add(new SetCardInfo("Cosmic Horror", 126, Rarity.RARE, mage.cards.c.CosmicHorror.class)); + cards.add(new SetCardInfo("Cursed Land", 127, Rarity.UNCOMMON, mage.cards.c.CursedLand.class)); + cards.add(new SetCardInfo("Cyclopean Mummy", 128, Rarity.COMMON, mage.cards.c.CyclopeanMummy.class)); + cards.add(new SetCardInfo("Dark Ritual", 129, Rarity.COMMON, mage.cards.d.DarkRitual.class)); + cards.add(new SetCardInfo("Deathgrip", 130, Rarity.UNCOMMON, mage.cards.d.Deathgrip.class)); + cards.add(new SetCardInfo("Deathlace", 131, Rarity.RARE, mage.cards.d.Deathlace.class)); + cards.add(new SetCardInfo("Drain Life", 132, Rarity.COMMON, mage.cards.d.DrainLife.class)); + cards.add(new SetCardInfo("Drudge Skeletons", 133, Rarity.COMMON, mage.cards.d.DrudgeSkeletons.class)); + cards.add(new SetCardInfo("El-Hajjaj", 134, Rarity.RARE, mage.cards.e.ElHajjaj.class)); + cards.add(new SetCardInfo("Erg Raiders", 135, Rarity.COMMON, mage.cards.e.ErgRaiders.class)); + cards.add(new SetCardInfo("Evil Presence", 136, Rarity.UNCOMMON, mage.cards.e.EvilPresence.class)); + cards.add(new SetCardInfo("Fear", 137, Rarity.COMMON, mage.cards.f.Fear.class)); + cards.add(new SetCardInfo("Frozen Shade", 138, Rarity.COMMON, mage.cards.f.FrozenShade.class)); + cards.add(new SetCardInfo("Gloom", 139, Rarity.UNCOMMON, mage.cards.g.Gloom.class)); + cards.add(new SetCardInfo("Greed", 140, Rarity.RARE, mage.cards.g.Greed.class)); + cards.add(new SetCardInfo("Howl from Beyond", 141, Rarity.COMMON, mage.cards.h.HowlFromBeyond.class)); + cards.add(new SetCardInfo("Hypnotic Specter", 142, Rarity.UNCOMMON, mage.cards.h.HypnoticSpecter.class)); + cards.add(new SetCardInfo("Junún Efreet", 143, Rarity.UNCOMMON, mage.cards.j.JununEfreet.class)); + cards.add(new SetCardInfo("Lord of the Pit", 144, Rarity.RARE, mage.cards.l.LordOfThePit.class)); + cards.add(new SetCardInfo("Lost Soul", 145, Rarity.COMMON, mage.cards.l.LostSoul.class)); + cards.add(new SetCardInfo("Marsh Gas", 146, Rarity.COMMON, mage.cards.m.MarshGas.class)); + cards.add(new SetCardInfo("Mind Twist", 147, Rarity.RARE, mage.cards.m.MindTwist.class)); + cards.add(new SetCardInfo("Murk Dwellers", 148, Rarity.COMMON, mage.cards.m.MurkDwellers.class)); + cards.add(new SetCardInfo("Nether Shadow", 149, Rarity.RARE, mage.cards.n.NetherShadow.class)); + cards.add(new SetCardInfo("Nightmare", 150, Rarity.RARE, mage.cards.n.Nightmare.class)); + cards.add(new SetCardInfo("Paralyze", 151, Rarity.COMMON, mage.cards.p.Paralyze.class)); + cards.add(new SetCardInfo("Pestilence", 152, Rarity.COMMON, mage.cards.p.Pestilence.class)); + cards.add(new SetCardInfo("Pit Scorpion", 153, Rarity.COMMON, mage.cards.p.PitScorpion.class)); + cards.add(new SetCardInfo("Plague Rats", 154, Rarity.COMMON, mage.cards.p.PlagueRats.class)); + cards.add(new SetCardInfo("Rag Man", 155, Rarity.RARE, mage.cards.r.RagMan.class)); + cards.add(new SetCardInfo("Raise Dead", 156, Rarity.COMMON, mage.cards.r.RaiseDead.class)); + cards.add(new SetCardInfo("Royal Assassin", 157, Rarity.RARE, mage.cards.r.RoyalAssassin.class)); + cards.add(new SetCardInfo("Scathe Zombies", 158, Rarity.COMMON, mage.cards.s.ScatheZombies.class)); + cards.add(new SetCardInfo("Scavenging Ghoul", 159, Rarity.UNCOMMON, mage.cards.s.ScavengingGhoul.class)); + cards.add(new SetCardInfo("Sengir Vampire", 160, Rarity.UNCOMMON, mage.cards.s.SengirVampire.class)); + cards.add(new SetCardInfo("Simulacrum", 161, Rarity.UNCOMMON, mage.cards.s.Simulacrum.class)); + cards.add(new SetCardInfo("Sorceress Queen", 162, Rarity.RARE, mage.cards.s.SorceressQueen.class)); + cards.add(new SetCardInfo("Spirit Shackle", 163, Rarity.UNCOMMON, mage.cards.s.SpiritShackle.class)); + cards.add(new SetCardInfo("Terror", 164, Rarity.COMMON, mage.cards.t.Terror.class)); + cards.add(new SetCardInfo("Uncle Istvan", 165, Rarity.UNCOMMON, mage.cards.u.UncleIstvan.class)); + cards.add(new SetCardInfo("Unholy Strength", 166, Rarity.COMMON, mage.cards.u.UnholyStrength.class)); + cards.add(new SetCardInfo("Vampire Bats", 167, Rarity.COMMON, mage.cards.v.VampireBats.class)); + cards.add(new SetCardInfo("Wall of Bone", 168, Rarity.UNCOMMON, mage.cards.w.WallOfBone.class)); + cards.add(new SetCardInfo("Warp Artifact", 169, Rarity.RARE, mage.cards.w.WarpArtifact.class)); + cards.add(new SetCardInfo("Weakness", 170, Rarity.COMMON, mage.cards.w.Weakness.class)); + cards.add(new SetCardInfo("Will-o'-the-Wisp", 171, Rarity.RARE, mage.cards.w.WillOTheWisp.class)); + cards.add(new SetCardInfo("Word of Binding", 172, Rarity.COMMON, mage.cards.w.WordOfBinding.class)); + cards.add(new SetCardInfo("Xenic Poltergeist", 173, Rarity.RARE, mage.cards.x.XenicPoltergeist.class)); + cards.add(new SetCardInfo("Zombie Master", 174, Rarity.RARE, mage.cards.z.ZombieMaster.class)); cards.add(new SetCardInfo("Air Elemental", 59, Rarity.UNCOMMON, mage.cards.a.AirElemental.class)); - cards.add(new SetCardInfo("Alabaster Potion", 251, Rarity.COMMON, mage.cards.a.AlabasterPotion.class)); - cards.add(new SetCardInfo("Aladdin's Lamp", 309, Rarity.RARE, mage.cards.a.AladdinsLamp.class)); - cards.add(new SetCardInfo("Aladdin's Ring", 310, Rarity.RARE, mage.cards.a.AladdinsRing.class)); - cards.add(new SetCardInfo("Ali Baba", 193, Rarity.UNCOMMON, mage.cards.a.AliBaba.class)); - cards.add(new SetCardInfo("Amrou Kithkin", 252, Rarity.COMMON, mage.cards.a.AmrouKithkin.class)); - cards.add(new SetCardInfo("Amulet of Kroog", 311, Rarity.COMMON, mage.cards.a.AmuletOfKroog.class)); - cards.add(new SetCardInfo("Angry Mob", 253, Rarity.UNCOMMON, mage.cards.a.AngryMob.class)); cards.add(new SetCardInfo("Animate Artifact", 60, Rarity.UNCOMMON, mage.cards.a.AnimateArtifact.class)); - cards.add(new SetCardInfo("Animate Dead", 2, Rarity.UNCOMMON, mage.cards.a.AnimateDead.class)); - cards.add(new SetCardInfo("Animate Wall", 254, Rarity.RARE, mage.cards.a.AnimateWall.class)); - cards.add(new SetCardInfo("Ankh of Mishra", 312, Rarity.RARE, mage.cards.a.AnkhOfMishra.class)); cards.add(new SetCardInfo("Apprentice Wizard", 61, Rarity.COMMON, mage.cards.a.ApprenticeWizard.class)); - cards.add(new SetCardInfo("Armageddon", 255, Rarity.RARE, mage.cards.a.Armageddon.class)); - cards.add(new SetCardInfo("Armageddon Clock", 313, Rarity.RARE, mage.cards.a.ArmageddonClock.class)); - cards.add(new SetCardInfo("Ashes to Ashes", 3, Rarity.UNCOMMON, mage.cards.a.AshesToAshes.class)); - cards.add(new SetCardInfo("Ashnod's Battle Gear", 314, Rarity.UNCOMMON, mage.cards.a.AshnodsBattleGear.class)); - cards.add(new SetCardInfo("Aspect of Wolf", 117, Rarity.RARE, mage.cards.a.AspectOfWolf.class)); cards.add(new SetCardInfo("Backfire", 62, Rarity.UNCOMMON, mage.cards.b.Backfire.class)); - cards.add(new SetCardInfo("Bad Moon", 4, Rarity.RARE, mage.cards.b.BadMoon.class)); - cards.add(new SetCardInfo("Balance", 256, Rarity.RARE, mage.cards.b.Balance.class)); - cards.add(new SetCardInfo("Ball Lightning", 194, Rarity.RARE, mage.cards.b.BallLightning.class)); - cards.add(new SetCardInfo("Bird Maiden", 195, Rarity.COMMON, mage.cards.b.BirdMaiden.class)); - cards.add(new SetCardInfo("Birds of Paradise", 118, Rarity.RARE, mage.cards.b.BirdsOfParadise.class)); - cards.add(new SetCardInfo("Black Knight", 5, Rarity.UNCOMMON, mage.cards.b.BlackKnight.class)); - cards.add(new SetCardInfo("Black Mana Battery", 316, Rarity.RARE, mage.cards.b.BlackManaBattery.class)); - cards.add(new SetCardInfo("Black Vise", 317, Rarity.UNCOMMON, mage.cards.b.BlackVise.class)); - cards.add(new SetCardInfo("Black Ward", 258, Rarity.UNCOMMON, mage.cards.b.BlackWard.class)); - cards.add(new SetCardInfo("Blessing", 259, Rarity.RARE, mage.cards.b.Blessing.class)); - cards.add(new SetCardInfo("Blight", 6, Rarity.UNCOMMON, mage.cards.b.Blight.class)); - cards.add(new SetCardInfo("Blood Lust", 196, Rarity.COMMON, mage.cards.b.BloodLust.class)); cards.add(new SetCardInfo("Blue Elemental Blast", 63, Rarity.COMMON, mage.cards.b.BlueElementalBlast.class)); - cards.add(new SetCardInfo("Blue Mana Battery", 318, Rarity.RARE, mage.cards.b.BlueManaBattery.class)); - cards.add(new SetCardInfo("Blue Ward", 260, Rarity.UNCOMMON, mage.cards.b.BlueWard.class)); - cards.add(new SetCardInfo("Bog Imp", 7, Rarity.COMMON, mage.cards.b.BogImp.class)); - cards.add(new SetCardInfo("Bog Wraith", 8, Rarity.UNCOMMON, mage.cards.b.BogWraith.class)); - cards.add(new SetCardInfo("Bottle of Suleiman", 319, Rarity.RARE, mage.cards.b.BottleOfSuleiman.class)); - cards.add(new SetCardInfo("Brainwash", 261, Rarity.COMMON, mage.cards.b.Brainwash.class)); - cards.add(new SetCardInfo("Brass Man", 320, Rarity.UNCOMMON, mage.cards.b.BrassMan.class)); - cards.add(new SetCardInfo("Brothers of Fire", 197, Rarity.COMMON, mage.cards.b.BrothersOfFire.class)); - cards.add(new SetCardInfo("Burrowing", 198, Rarity.UNCOMMON, mage.cards.b.Burrowing.class)); - cards.add(new SetCardInfo("Carnivorous Plant", 119, Rarity.COMMON, mage.cards.c.CarnivorousPlant.class)); - cards.add(new SetCardInfo("Carrion Ants", 9, Rarity.UNCOMMON, mage.cards.c.CarrionAnts.class)); - cards.add(new SetCardInfo("Castle", 262, Rarity.UNCOMMON, mage.cards.c.Castle.class)); - cards.add(new SetCardInfo("Cave People", 199, Rarity.UNCOMMON, mage.cards.c.CavePeople.class)); - cards.add(new SetCardInfo("Celestial Prism", 322, Rarity.UNCOMMON, mage.cards.c.CelestialPrism.class)); - cards.add(new SetCardInfo("Channel", 120, Rarity.UNCOMMON, mage.cards.c.Channel.class)); - cards.add(new SetCardInfo("Chaoslace", 200, Rarity.RARE, mage.cards.c.Chaoslace.class)); - cards.add(new SetCardInfo("Circle of Protection: Artifacts", 263, Rarity.COMMON, mage.cards.c.CircleOfProtectionArtifacts.class)); - cards.add(new SetCardInfo("Circle of Protection: Black", 264, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlack.class)); - cards.add(new SetCardInfo("Circle of Protection: Blue", 265, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class)); - cards.add(new SetCardInfo("Circle of Protection: Green", 266, Rarity.COMMON, mage.cards.c.CircleOfProtectionGreen.class)); - cards.add(new SetCardInfo("Circle of Protection: Red", 267, Rarity.COMMON, mage.cards.c.CircleOfProtectionRed.class)); - cards.add(new SetCardInfo("Circle of Protection: White", 268, Rarity.COMMON, mage.cards.c.CircleOfProtectionWhite.class)); - cards.add(new SetCardInfo("Clay Statue", 323, Rarity.COMMON, mage.cards.c.ClayStatue.class)); - cards.add(new SetCardInfo("Clockwork Avian", 324, Rarity.RARE, mage.cards.c.ClockworkAvian.class)); - cards.add(new SetCardInfo("Clockwork Beast", 325, Rarity.RARE, mage.cards.c.ClockworkBeast.class)); - cards.add(new SetCardInfo("Cockatrice", 121, Rarity.RARE, mage.cards.c.Cockatrice.class)); - cards.add(new SetCardInfo("Colossus of Sardia", 326, Rarity.RARE, mage.cards.c.ColossusOfSardia.class)); - cards.add(new SetCardInfo("Conservator", 327, Rarity.UNCOMMON, mage.cards.c.Conservator.class)); cards.add(new SetCardInfo("Control Magic", 64, Rarity.UNCOMMON, mage.cards.c.ControlMagic.class)); - cards.add(new SetCardInfo("Conversion", 269, Rarity.UNCOMMON, mage.cards.c.Conversion.class)); - cards.add(new SetCardInfo("Coral Helm", 328, Rarity.RARE, mage.cards.c.CoralHelm.class)); - cards.add(new SetCardInfo("Cosmic Horror", 10, Rarity.RARE, mage.cards.c.CosmicHorror.class)); cards.add(new SetCardInfo("Counterspell", 65, Rarity.UNCOMMON, mage.cards.c.Counterspell.class)); - cards.add(new SetCardInfo("Craw Wurm", 122, Rarity.COMMON, mage.cards.c.CrawWurm.class)); cards.add(new SetCardInfo("Creature Bond", 66, Rarity.COMMON, mage.cards.c.CreatureBond.class)); - cards.add(new SetCardInfo("Crimson Manticore", 201, Rarity.RARE, mage.cards.c.CrimsonManticore.class)); - cards.add(new SetCardInfo("Crumble", 123, Rarity.UNCOMMON, mage.cards.c.Crumble.class)); - cards.add(new SetCardInfo("Crusade", 270, Rarity.RARE, mage.cards.c.Crusade.class)); - cards.add(new SetCardInfo("Crystal Rod", 329, Rarity.UNCOMMON, mage.cards.c.CrystalRod.class)); - cards.add(new SetCardInfo("Cursed Land", 11, Rarity.UNCOMMON, mage.cards.c.CursedLand.class)); - cards.add(new SetCardInfo("Cursed Rack", 330, Rarity.UNCOMMON, mage.cards.c.CursedRack.class)); - cards.add(new SetCardInfo("Cyclopean Mummy", 12, Rarity.COMMON, mage.cards.c.CyclopeanMummy.class)); - cards.add(new SetCardInfo("Dancing Scimitar", 331, Rarity.RARE, mage.cards.d.DancingScimitar.class)); - cards.add(new SetCardInfo("Dark Ritual", 13, Rarity.COMMON, mage.cards.d.DarkRitual.class)); - cards.add(new SetCardInfo("Deathgrip", 14, Rarity.UNCOMMON, mage.cards.d.Deathgrip.class)); - cards.add(new SetCardInfo("Deathlace", 15, Rarity.RARE, mage.cards.d.Deathlace.class)); - cards.add(new SetCardInfo("Death Ward", 271, Rarity.COMMON, mage.cards.d.DeathWard.class)); - cards.add(new SetCardInfo("Desert Twister", 124, Rarity.UNCOMMON, mage.cards.d.DesertTwister.class)); - cards.add(new SetCardInfo("Detonate", 202, Rarity.UNCOMMON, mage.cards.d.Detonate.class)); - cards.add(new SetCardInfo("Diabolic Machine", 332, Rarity.UNCOMMON, mage.cards.d.DiabolicMachine.class)); - cards.add(new SetCardInfo("Dingus Egg", 333, Rarity.RARE, mage.cards.d.DingusEgg.class)); - cards.add(new SetCardInfo("Disenchant", 272, Rarity.COMMON, mage.cards.d.Disenchant.class)); - cards.add(new SetCardInfo("Disintegrate", 203, Rarity.COMMON, mage.cards.d.Disintegrate.class)); - cards.add(new SetCardInfo("Disrupting Scepter", 334, Rarity.RARE, mage.cards.d.DisruptingScepter.class)); - cards.add(new SetCardInfo("Divine Transformation", 273, Rarity.UNCOMMON, mage.cards.d.DivineTransformation.class)); - cards.add(new SetCardInfo("Dragon Engine", 335, Rarity.RARE, mage.cards.d.DragonEngine.class)); - cards.add(new SetCardInfo("Dragon Whelp", 204, Rarity.UNCOMMON, mage.cards.d.DragonWhelp.class)); - cards.add(new SetCardInfo("Drain Life", 16, Rarity.COMMON, mage.cards.d.DrainLife.class)); - cards.add(new SetCardInfo("Drudge Skeletons", 17, Rarity.COMMON, mage.cards.d.DrudgeSkeletons.class)); - cards.add(new SetCardInfo("Durkwood Boars", 125, Rarity.COMMON, mage.cards.d.DurkwoodBoars.class)); - cards.add(new SetCardInfo("Dwarven Warriors", 205, Rarity.COMMON, mage.cards.d.DwarvenWarriors.class)); - cards.add(new SetCardInfo("Earth Elemental", 206, Rarity.UNCOMMON, mage.cards.e.EarthElemental.class)); - cards.add(new SetCardInfo("Earthquake", 207, Rarity.RARE, mage.cards.e.Earthquake.class)); - cards.add(new SetCardInfo("Ebony Horse", 336, Rarity.RARE, mage.cards.e.EbonyHorse.class)); - cards.add(new SetCardInfo("El-Hajjaj", 18, Rarity.RARE, mage.cards.e.ElHajjaj.class)); - cards.add(new SetCardInfo("Elder Land Wurm", 274, Rarity.RARE, mage.cards.e.ElderLandWurm.class)); - cards.add(new SetCardInfo("Elven Riders", 126, Rarity.UNCOMMON, mage.cards.e.ElvenRiders.class)); - cards.add(new SetCardInfo("Elvish Archers", 127, Rarity.RARE, mage.cards.e.ElvishArchers.class)); cards.add(new SetCardInfo("Energy Flux", 68, Rarity.UNCOMMON, mage.cards.e.EnergyFlux.class)); cards.add(new SetCardInfo("Energy Tap", 69, Rarity.COMMON, mage.cards.e.EnergyTap.class)); - cards.add(new SetCardInfo("Erg Raiders", 19, Rarity.COMMON, mage.cards.e.ErgRaiders.class)); - cards.add(new SetCardInfo("Eternal Warrior", 208, Rarity.COMMON, mage.cards.e.EternalWarrior.class)); - cards.add(new SetCardInfo("Evil Presence", 20, Rarity.UNCOMMON, mage.cards.e.EvilPresence.class)); - cards.add(new SetCardInfo("Eye for an Eye", 275, Rarity.RARE, mage.cards.e.EyeForAnEye.class)); - cards.add(new SetCardInfo("Fear", 21, Rarity.COMMON, mage.cards.f.Fear.class)); cards.add(new SetCardInfo("Feedback", 71, Rarity.UNCOMMON, mage.cards.f.Feedback.class)); - cards.add(new SetCardInfo("Fellwar Stone", 337, Rarity.UNCOMMON, mage.cards.f.FellwarStone.class)); - cards.add(new SetCardInfo("Fireball", 210, Rarity.COMMON, mage.cards.f.Fireball.class)); - cards.add(new SetCardInfo("Firebreathing", 211, Rarity.COMMON, mage.cards.f.Firebreathing.class)); - cards.add(new SetCardInfo("Fire Elemental", 209, Rarity.UNCOMMON, mage.cards.f.FireElemental.class)); - cards.add(new SetCardInfo("Fissure", 212, Rarity.COMMON, mage.cards.f.Fissure.class)); - cards.add(new SetCardInfo("Flashfires", 213, Rarity.UNCOMMON, mage.cards.f.Flashfires.class)); cards.add(new SetCardInfo("Flight", 72, Rarity.COMMON, mage.cards.f.Flight.class)); cards.add(new SetCardInfo("Flood", 73, Rarity.COMMON, mage.cards.f.Flood.class)); - cards.add(new SetCardInfo("Flying Carpet", 338, Rarity.RARE, mage.cards.f.FlyingCarpet.class)); - cards.add(new SetCardInfo("Fog", 128, Rarity.COMMON, mage.cards.f.Fog.class)); - cards.add(new SetCardInfo("Force of Nature", 129, Rarity.RARE, mage.cards.f.ForceOfNature.class)); - cards.add(new SetCardInfo("Forest", 175, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forest", 176, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Forest", 177, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Frozen Shade", 22, Rarity.COMMON, mage.cards.f.FrozenShade.class)); - cards.add(new SetCardInfo("Fungusaur", 130, Rarity.RARE, mage.cards.f.Fungusaur.class)); - cards.add(new SetCardInfo("Gaea's Liege", 131, Rarity.RARE, mage.cards.g.GaeasLiege.class)); cards.add(new SetCardInfo("Gaseous Form", 74, Rarity.COMMON, mage.cards.g.GaseousForm.class)); cards.add(new SetCardInfo("Ghost Ship", 75, Rarity.UNCOMMON, mage.cards.g.GhostShip.class)); - cards.add(new SetCardInfo("Giant Growth", 132, Rarity.COMMON, mage.cards.g.GiantGrowth.class)); - cards.add(new SetCardInfo("Giant Spider", 133, Rarity.COMMON, mage.cards.g.GiantSpider.class)); - cards.add(new SetCardInfo("Giant Strength", 214, Rarity.COMMON, mage.cards.g.GiantStrength.class)); cards.add(new SetCardInfo("Giant Tortoise", 76, Rarity.COMMON, mage.cards.g.GiantTortoise.class)); - cards.add(new SetCardInfo("Glasses of Urza", 339, Rarity.UNCOMMON, mage.cards.g.GlassesOfUrza.class)); - cards.add(new SetCardInfo("Gloom", 23, Rarity.UNCOMMON, mage.cards.g.Gloom.class)); - cards.add(new SetCardInfo("Goblin Balloon Brigade", 215, Rarity.UNCOMMON, mage.cards.g.GoblinBalloonBrigade.class)); - cards.add(new SetCardInfo("Goblin King", 216, Rarity.RARE, mage.cards.g.GoblinKing.class)); - cards.add(new SetCardInfo("Grapeshot Catapult", 340, Rarity.COMMON, mage.cards.g.GrapeshotCatapult.class)); - cards.add(new SetCardInfo("Gray Ogre", 218, Rarity.COMMON, mage.cards.g.GrayOgre.class)); - cards.add(new SetCardInfo("Greed", 24, Rarity.RARE, mage.cards.g.Greed.class)); - cards.add(new SetCardInfo("Green Mana Battery", 341, Rarity.RARE, mage.cards.g.GreenManaBattery.class)); - cards.add(new SetCardInfo("Green Ward", 277, Rarity.UNCOMMON, mage.cards.g.GreenWard.class)); - cards.add(new SetCardInfo("Grizzly Bears", 134, Rarity.COMMON, mage.cards.g.GrizzlyBears.class)); - cards.add(new SetCardInfo("Healing Salve", 278, Rarity.COMMON, mage.cards.h.HealingSalve.class)); - cards.add(new SetCardInfo("Hill Giant", 219, Rarity.COMMON, mage.cards.h.HillGiant.class)); - cards.add(new SetCardInfo("Holy Armor", 279, Rarity.COMMON, mage.cards.h.HolyArmor.class)); - cards.add(new SetCardInfo("Holy Strength", 280, Rarity.COMMON, mage.cards.h.HolyStrength.class)); - cards.add(new SetCardInfo("Howl from Beyond", 25, Rarity.COMMON, mage.cards.h.HowlFromBeyond.class)); - cards.add(new SetCardInfo("Howling Mine", 343, Rarity.RARE, mage.cards.h.HowlingMine.class)); cards.add(new SetCardInfo("Hurkyl's Recall", 77, Rarity.RARE, mage.cards.h.HurkylsRecall.class)); - cards.add(new SetCardInfo("Hurloon Minotaur", 220, Rarity.COMMON, mage.cards.h.HurloonMinotaur.class)); - cards.add(new SetCardInfo("Hurricane", 135, Rarity.UNCOMMON, mage.cards.h.Hurricane.class)); - cards.add(new SetCardInfo("Hurr Jackal", 221, Rarity.RARE, mage.cards.h.HurrJackal.class)); - cards.add(new SetCardInfo("Hypnotic Specter", 26, Rarity.UNCOMMON, mage.cards.h.HypnoticSpecter.class)); - cards.add(new SetCardInfo("Immolation", 222, Rarity.COMMON, mage.cards.i.Immolation.class)); - cards.add(new SetCardInfo("Inferno", 223, Rarity.RARE, mage.cards.i.Inferno.class)); - cards.add(new SetCardInfo("Instill Energy", 136, Rarity.UNCOMMON, mage.cards.i.InstillEnergy.class)); - cards.add(new SetCardInfo("Ironclaw Orcs", 224, Rarity.COMMON, mage.cards.i.IronclawOrcs.class)); - cards.add(new SetCardInfo("Ironroot Treefolk", 137, Rarity.COMMON, mage.cards.i.IronrootTreefolk.class)); - cards.add(new SetCardInfo("Iron Star", 344, Rarity.UNCOMMON, mage.cards.i.IronStar.class)); - cards.add(new SetCardInfo("Island", 178, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island", 179, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Island", 180, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Island Fish Jasconius", 78, Rarity.RARE, mage.cards.i.IslandFishJasconius.class)); - cards.add(new SetCardInfo("Island Sanctuary", 281, Rarity.RARE, mage.cards.i.IslandSanctuary.class)); - cards.add(new SetCardInfo("Ivory Cup", 345, Rarity.UNCOMMON, mage.cards.i.IvoryCup.class)); - cards.add(new SetCardInfo("Ivory Tower", 346, Rarity.RARE, mage.cards.i.IvoryTower.class)); - cards.add(new SetCardInfo("Jade Monolith", 347, Rarity.RARE, mage.cards.j.JadeMonolith.class)); - cards.add(new SetCardInfo("Jandor's Saddlebags", 348, Rarity.RARE, mage.cards.j.JandorsSaddlebags.class)); - cards.add(new SetCardInfo("Jayemdae Tome", 349, Rarity.RARE, mage.cards.j.JayemdaeTome.class)); cards.add(new SetCardInfo("Jump", 79, Rarity.COMMON, mage.cards.j.Jump.class)); - cards.add(new SetCardInfo("Junún Efreet", 27, Rarity.UNCOMMON, mage.cards.j.JununEfreet.class)); - cards.add(new SetCardInfo("Karma", 282, Rarity.UNCOMMON, mage.cards.k.Karma.class)); - cards.add(new SetCardInfo("Keldon Warlord", 225, Rarity.UNCOMMON, mage.cards.k.KeldonWarlord.class)); - cards.add(new SetCardInfo("Killer Bees", 138, Rarity.UNCOMMON, mage.cards.k.KillerBees.class)); - cards.add(new SetCardInfo("Kismet", 283, Rarity.UNCOMMON, mage.cards.k.Kismet.class)); - cards.add(new SetCardInfo("Kormus Bell", 350, Rarity.RARE, mage.cards.k.KormusBell.class)); - cards.add(new SetCardInfo("Land Leeches", 139, Rarity.COMMON, mage.cards.l.LandLeeches.class)); - cards.add(new SetCardInfo("Land Tax", 284, Rarity.RARE, mage.cards.l.LandTax.class)); cards.add(new SetCardInfo("Leviathan", 80, Rarity.RARE, mage.cards.l.Leviathan.class)); - cards.add(new SetCardInfo("Ley Druid", 140, Rarity.UNCOMMON, mage.cards.l.LeyDruid.class)); - cards.add(new SetCardInfo("Library of Leng", 351, Rarity.UNCOMMON, mage.cards.l.LibraryOfLeng.class)); - cards.add(new SetCardInfo("Lifeforce", 141, Rarity.UNCOMMON, mage.cards.l.Lifeforce.class)); - cards.add(new SetCardInfo("Lifelace", 142, Rarity.RARE, mage.cards.l.Lifelace.class)); cards.add(new SetCardInfo("Lifetap", 81, Rarity.UNCOMMON, mage.cards.l.Lifetap.class)); - cards.add(new SetCardInfo("Lightning Bolt", 226, Rarity.COMMON, mage.cards.l.LightningBolt.class)); - cards.add(new SetCardInfo("Living Artifact", 143, Rarity.RARE, mage.cards.l.LivingArtifact.class)); - cards.add(new SetCardInfo("Living Lands", 144, Rarity.RARE, mage.cards.l.LivingLands.class)); - cards.add(new SetCardInfo("Llanowar Elves", 145, Rarity.COMMON, mage.cards.l.LlanowarElves.class)); cards.add(new SetCardInfo("Lord of Atlantis", 82, Rarity.RARE, mage.cards.l.LordOfAtlantis.class)); - cards.add(new SetCardInfo("Lord of the Pit", 28, Rarity.RARE, mage.cards.l.LordOfThePit.class)); - cards.add(new SetCardInfo("Lost Soul", 29, Rarity.COMMON, mage.cards.l.LostSoul.class)); - cards.add(new SetCardInfo("Lure", 146, Rarity.UNCOMMON, mage.cards.l.Lure.class)); - cards.add(new SetCardInfo("Magnetic Mountain", 227, Rarity.RARE, mage.cards.m.MagneticMountain.class)); cards.add(new SetCardInfo("Mahamoti Djinn", 84, Rarity.RARE, mage.cards.m.MahamotiDjinn.class)); - cards.add(new SetCardInfo("Manabarbs", 230, Rarity.RARE, mage.cards.m.Manabarbs.class)); - cards.add(new SetCardInfo("Mana Clash", 228, Rarity.RARE, mage.cards.m.ManaClash.class)); - cards.add(new SetCardInfo("Mana Flare", 229, Rarity.RARE, mage.cards.m.ManaFlare.class)); cards.add(new SetCardInfo("Mana Short", 85, Rarity.RARE, mage.cards.m.ManaShort.class)); - cards.add(new SetCardInfo("Mana Vault", 352, Rarity.RARE, mage.cards.m.ManaVault.class)); - cards.add(new SetCardInfo("Marsh Gas", 30, Rarity.COMMON, mage.cards.m.MarshGas.class)); - cards.add(new SetCardInfo("Marsh Viper", 147, Rarity.COMMON, mage.cards.m.MarshViper.class)); - cards.add(new SetCardInfo("Meekstone", 353, Rarity.RARE, mage.cards.m.Meekstone.class)); cards.add(new SetCardInfo("Merfolk of the Pearl Trident", 86, Rarity.COMMON, mage.cards.m.MerfolkOfThePearlTrident.class)); - cards.add(new SetCardInfo("Millstone", 354, Rarity.RARE, mage.cards.m.Millstone.class)); cards.add(new SetCardInfo("Mind Bomb", 87, Rarity.UNCOMMON, mage.cards.m.MindBomb.class)); - cards.add(new SetCardInfo("Mind Twist", 31, Rarity.RARE, mage.cards.m.MindTwist.class)); - cards.add(new SetCardInfo("Mishra's Factory", 181, Rarity.UNCOMMON, mage.cards.m.MishrasFactory.class)); - cards.add(new SetCardInfo("Mons's Goblin Raiders", 231, Rarity.COMMON, mage.cards.m.MonssGoblinRaiders.class)); - cards.add(new SetCardInfo("Morale", 288, Rarity.COMMON, mage.cards.m.Morale.class)); - cards.add(new SetCardInfo("Mountain", 182, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 183, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Mountain", 184, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Murk Dwellers", 32, Rarity.COMMON, mage.cards.m.MurkDwellers.class)); - cards.add(new SetCardInfo("Nafs Asp", 148, Rarity.COMMON, NafsAsp.class)); - cards.add(new SetCardInfo("Nether Shadow", 33, Rarity.RARE, mage.cards.n.NetherShadow.class)); - cards.add(new SetCardInfo("Nevinyrral's Disk", 356, Rarity.RARE, mage.cards.n.NevinyrralsDisk.class)); - cards.add(new SetCardInfo("Nightmare", 34, Rarity.RARE, mage.cards.n.Nightmare.class)); - cards.add(new SetCardInfo("Northern Paladin", 287, Rarity.RARE, mage.cards.n.NorthernPaladin.class)); - cards.add(new SetCardInfo("Oasis", 185, Rarity.UNCOMMON, mage.cards.o.Oasis.class)); - cards.add(new SetCardInfo("Obsianus Golem", 357, Rarity.UNCOMMON, mage.cards.o.ObsianusGolem.class)); - cards.add(new SetCardInfo("Onulet", 358, Rarity.RARE, mage.cards.o.Onulet.class)); - cards.add(new SetCardInfo("Orcish Artillery", 232, Rarity.UNCOMMON, mage.cards.o.OrcishArtillery.class)); - cards.add(new SetCardInfo("Orcish Oriflamme", 233, Rarity.UNCOMMON, mage.cards.o.OrcishOriflamme.class)); - cards.add(new SetCardInfo("Ornithopter", 359, Rarity.UNCOMMON, mage.cards.o.Ornithopter.class)); - cards.add(new SetCardInfo("Osai Vultures", 288, Rarity.UNCOMMON, mage.cards.o.OsaiVultures.class)); - cards.add(new SetCardInfo("Paralyze", 35, Rarity.COMMON, mage.cards.p.Paralyze.class)); - cards.add(new SetCardInfo("Pearled Unicorn", 289, Rarity.COMMON, mage.cards.p.PearledUnicorn.class)); - cards.add(new SetCardInfo("Personal Incarnation", 290, Rarity.RARE, mage.cards.p.PersonalIncarnation.class)); - cards.add(new SetCardInfo("Pestilence", 36, Rarity.COMMON, mage.cards.p.Pestilence.class)); cards.add(new SetCardInfo("Phantasmal Forces", 88, Rarity.UNCOMMON, mage.cards.p.PhantasmalForces.class)); cards.add(new SetCardInfo("Phantasmal Terrain", 89, Rarity.COMMON, mage.cards.p.PhantasmalTerrain.class)); cards.add(new SetCardInfo("Phantom Monster", 90, Rarity.UNCOMMON, mage.cards.p.PhantomMonster.class)); - cards.add(new SetCardInfo("Piety", 291, Rarity.COMMON, Piety.class)); cards.add(new SetCardInfo("Pirate Ship", 91, Rarity.RARE, mage.cards.p.PirateShip.class)); - cards.add(new SetCardInfo("Pit Scorpion", 37, Rarity.COMMON, mage.cards.p.PitScorpion.class)); - cards.add(new SetCardInfo("Plague Rats", 38, Rarity.COMMON, mage.cards.p.PlagueRats.class)); - cards.add(new SetCardInfo("Plains", 186, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Plains", 187, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Plains", 188, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); cards.add(new SetCardInfo("Power Sink", 93, Rarity.COMMON, mage.cards.p.PowerSink.class)); - cards.add(new SetCardInfo("Power Surge", 234, Rarity.RARE, mage.cards.p.PowerSurge.class)); - cards.add(new SetCardInfo("Pradesh Gypsies", 149, Rarity.COMMON, mage.cards.p.PradeshGypsies.class)); - cards.add(new SetCardInfo("Primal Clay", 360, Rarity.RARE, mage.cards.p.PrimalClay.class)); cards.add(new SetCardInfo("Prodigal Sorcerer", 94, Rarity.COMMON, mage.cards.p.ProdigalSorcerer.class)); cards.add(new SetCardInfo("Psionic Entity", 95, Rarity.RARE, mage.cards.p.PsionicEntity.class)); cards.add(new SetCardInfo("Psychic Venom", 96, Rarity.COMMON, mage.cards.p.PsychicVenom.class)); - cards.add(new SetCardInfo("Purelace", 293, Rarity.RARE, mage.cards.p.Purelace.class)); - cards.add(new SetCardInfo("Pyrotechnics", 235, Rarity.UNCOMMON, mage.cards.p.Pyrotechnics.class)); - cards.add(new SetCardInfo("Radjan Spirit", 150, Rarity.UNCOMMON, mage.cards.r.RadjanSpirit.class)); - cards.add(new SetCardInfo("Rag Man", 39, Rarity.RARE, mage.cards.r.RagMan.class)); - cards.add(new SetCardInfo("Raise Dead", 40, Rarity.COMMON, mage.cards.r.RaiseDead.class)); - cards.add(new SetCardInfo("Red Elemental Blast", 236, Rarity.COMMON, mage.cards.r.RedElementalBlast.class)); - cards.add(new SetCardInfo("Red Mana Battery", 361, Rarity.RARE, mage.cards.r.RedManaBattery.class)); - cards.add(new SetCardInfo("Red Ward", 294, Rarity.UNCOMMON, mage.cards.r.RedWard.class)); - cards.add(new SetCardInfo("Regeneration", 152, Rarity.COMMON, mage.cards.r.Regeneration.class)); - cards.add(new SetCardInfo("Reverse Damage", 295, Rarity.RARE, mage.cards.r.ReverseDamage.class)); - cards.add(new SetCardInfo("Righteousness", 296, Rarity.RARE, mage.cards.r.Righteousness.class)); - cards.add(new SetCardInfo("Rod of Ruin", 362, Rarity.UNCOMMON, mage.cards.r.RodOfRuin.class)); - cards.add(new SetCardInfo("Royal Assassin", 41, Rarity.RARE, mage.cards.r.RoyalAssassin.class)); - cards.add(new SetCardInfo("Samite Healer", 297, Rarity.COMMON, mage.cards.s.SamiteHealer.class)); - cards.add(new SetCardInfo("Sandstorm", 153, Rarity.COMMON, mage.cards.s.Sandstorm.class)); - cards.add(new SetCardInfo("Savannah Lions", 298, Rarity.RARE, mage.cards.s.SavannahLions.class)); - cards.add(new SetCardInfo("Scathe Zombies", 42, Rarity.COMMON, mage.cards.s.ScatheZombies.class)); - cards.add(new SetCardInfo("Scavenging Ghoul", 43, Rarity.UNCOMMON, mage.cards.s.ScavengingGhoul.class)); - cards.add(new SetCardInfo("Scryb Sprites", 154, Rarity.COMMON, mage.cards.s.ScrybSprites.class)); cards.add(new SetCardInfo("Sea Serpent", 98, Rarity.COMMON, mage.cards.s.SeaSerpent.class)); - cards.add(new SetCardInfo("Seeker", 299, Rarity.COMMON, mage.cards.s.Seeker.class)); cards.add(new SetCardInfo("Segovian Leviathan", 99, Rarity.UNCOMMON, mage.cards.s.SegovianLeviathan.class)); - cards.add(new SetCardInfo("Sengir Vampire", 44, Rarity.UNCOMMON, mage.cards.s.SengirVampire.class)); - cards.add(new SetCardInfo("Serra Angel", 300, Rarity.UNCOMMON, mage.cards.s.SerraAngel.class)); - cards.add(new SetCardInfo("Shanodin Dryads", 155, Rarity.COMMON, mage.cards.s.ShanodinDryads.class)); - cards.add(new SetCardInfo("Shapeshifter", 363, Rarity.UNCOMMON, mage.cards.s.Shapeshifter.class)); - cards.add(new SetCardInfo("Shatter", 237, Rarity.COMMON, mage.cards.s.Shatter.class)); - cards.add(new SetCardInfo("Shivan Dragon", 238, Rarity.RARE, mage.cards.s.ShivanDragon.class)); - cards.add(new SetCardInfo("Simulacrum", 45, Rarity.UNCOMMON, mage.cards.s.Simulacrum.class)); cards.add(new SetCardInfo("Sindbad", 100, Rarity.UNCOMMON, mage.cards.s.Sindbad.class)); cards.add(new SetCardInfo("Siren's Call", 101, Rarity.UNCOMMON, mage.cards.s.SirensCall.class)); - cards.add(new SetCardInfo("Sisters of the Flame", 239, Rarity.COMMON, mage.cards.s.SistersOfTheFlame.class)); - cards.add(new SetCardInfo("Smoke", 240, Rarity.RARE, mage.cards.s.Smoke.class)); - cards.add(new SetCardInfo("Sorceress Queen", 46, Rarity.RARE, mage.cards.s.SorceressQueen.class)); - cards.add(new SetCardInfo("Soul Net", 364, Rarity.UNCOMMON, mage.cards.s.SoulNet.class)); cards.add(new SetCardInfo("Spell Blast", 103, Rarity.COMMON, mage.cards.s.SpellBlast.class)); - cards.add(new SetCardInfo("Spirit Link", 301, Rarity.UNCOMMON, mage.cards.s.SpiritLink.class)); - cards.add(new SetCardInfo("Spirit Shackle", 47, Rarity.UNCOMMON, mage.cards.s.SpiritShackle.class)); cards.add(new SetCardInfo("Stasis", 104, Rarity.RARE, mage.cards.s.Stasis.class)); cards.add(new SetCardInfo("Steal Artifact", 105, Rarity.UNCOMMON, mage.cards.s.StealArtifact.class)); - cards.add(new SetCardInfo("Stone Giant", 241, Rarity.UNCOMMON, mage.cards.s.StoneGiant.class)); - cards.add(new SetCardInfo("Stone Rain", 242, Rarity.COMMON, mage.cards.s.StoneRain.class)); - cards.add(new SetCardInfo("Stream of Life", 156, Rarity.COMMON, mage.cards.s.StreamOfLife.class)); - cards.add(new SetCardInfo("Strip Mine", 189, Rarity.UNCOMMON, mage.cards.s.StripMine.class)); - cards.add(new SetCardInfo("Sunglasses of Urza", 365, Rarity.RARE, mage.cards.s.SunglassesOfUrza.class)); cards.add(new SetCardInfo("Sunken City", 106, Rarity.COMMON, mage.cards.s.SunkenCity.class)); - cards.add(new SetCardInfo("Swamp", 190, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swamp", 191, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swamp", 192, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); - cards.add(new SetCardInfo("Swords to Plowshares", 302, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class)); - cards.add(new SetCardInfo("Sylvan Library", 157, Rarity.RARE, mage.cards.s.SylvanLibrary.class)); - cards.add(new SetCardInfo("Tawnos's Wand", 366, Rarity.UNCOMMON, mage.cards.t.TawnossWand.class)); - cards.add(new SetCardInfo("Tawnos's Weaponry", 367, Rarity.UNCOMMON, mage.cards.t.TawnossWeaponry.class)); - cards.add(new SetCardInfo("Terror", 48, Rarity.COMMON, mage.cards.t.Terror.class)); - cards.add(new SetCardInfo("Tetravus", 368, Rarity.RARE, mage.cards.t.Tetravus.class)); - cards.add(new SetCardInfo("The Brute", 244, Rarity.COMMON, mage.cards.t.TheBrute.class)); - cards.add(new SetCardInfo("The Hive", 369, Rarity.RARE, mage.cards.t.TheHive.class)); - cards.add(new SetCardInfo("The Rack", 370, Rarity.UNCOMMON, mage.cards.t.TheRack.class)); - cards.add(new SetCardInfo("Thicket Basilisk", 158, Rarity.UNCOMMON, mage.cards.t.ThicketBasilisk.class)); cards.add(new SetCardInfo("Thoughtlace", 107, Rarity.RARE, mage.cards.t.Thoughtlace.class)); - cards.add(new SetCardInfo("Throne of Bone", 371, Rarity.UNCOMMON, mage.cards.t.ThroneOfBone.class)); cards.add(new SetCardInfo("Time Elemental", 108, Rarity.RARE, mage.cards.t.TimeElemental.class)); - cards.add(new SetCardInfo("Titania's Song", 160, Rarity.RARE, mage.cards.t.TitaniasSong.class)); - cards.add(new SetCardInfo("Tranquility", 161, Rarity.COMMON, mage.cards.t.Tranquility.class)); - cards.add(new SetCardInfo("Triskelion", 372, Rarity.RARE, mage.cards.t.Triskelion.class)); - cards.add(new SetCardInfo("Tsunami", 162, Rarity.UNCOMMON, mage.cards.t.Tsunami.class)); - cards.add(new SetCardInfo("Tundra Wolves", 303, Rarity.COMMON, mage.cards.t.TundraWolves.class)); - cards.add(new SetCardInfo("Tunnel", 245, Rarity.UNCOMMON, mage.cards.t.Tunnel.class)); cards.add(new SetCardInfo("Twiddle", 109, Rarity.COMMON, mage.cards.t.Twiddle.class)); - cards.add(new SetCardInfo("Uncle Istvan", 49, Rarity.UNCOMMON, mage.cards.u.UncleIstvan.class)); - cards.add(new SetCardInfo("Unholy Strength", 50, Rarity.COMMON, mage.cards.u.UnholyStrength.class)); cards.add(new SetCardInfo("Unstable Mutation", 110, Rarity.COMMON, mage.cards.u.UnstableMutation.class)); cards.add(new SetCardInfo("Unsummon", 111, Rarity.COMMON, mage.cards.u.Unsummon.class)); - cards.add(new SetCardInfo("Untamed Wilds", 163, Rarity.UNCOMMON, mage.cards.u.UntamedWilds.class)); - cards.add(new SetCardInfo("Uthden Troll", 246, Rarity.UNCOMMON, mage.cards.u.UthdenTroll.class)); - cards.add(new SetCardInfo("Vampire Bats", 51, Rarity.COMMON, mage.cards.v.VampireBats.class)); - cards.add(new SetCardInfo("Venom", 164, Rarity.COMMON, mage.cards.v.Venom.class)); - cards.add(new SetCardInfo("Verduran Enchantress", 165, Rarity.RARE, mage.cards.v.VerduranEnchantress.class)); cards.add(new SetCardInfo("Volcanic Eruption", 112, Rarity.RARE, mage.cards.v.VolcanicEruption.class)); cards.add(new SetCardInfo("Wall of Air", 113, Rarity.UNCOMMON, mage.cards.w.WallOfAir.class)); - cards.add(new SetCardInfo("Wall of Bone", 52, Rarity.UNCOMMON, mage.cards.w.WallOfBone.class)); - cards.add(new SetCardInfo("Wall of Brambles", 166, Rarity.UNCOMMON, mage.cards.w.WallOfBrambles.class)); - cards.add(new SetCardInfo("Wall of Fire", 248, Rarity.UNCOMMON, mage.cards.w.WallOfFire.class)); - cards.add(new SetCardInfo("Wall of Ice", 167, Rarity.UNCOMMON, mage.cards.w.WallOfIce.class)); - cards.add(new SetCardInfo("Wall of Spears", 374, Rarity.COMMON, mage.cards.w.WallOfSpears.class)); - cards.add(new SetCardInfo("Wall of Stone", 249, Rarity.UNCOMMON, mage.cards.w.WallOfStone.class)); - cards.add(new SetCardInfo("Wall of Swords", 305, Rarity.UNCOMMON, mage.cards.w.WallOfSwords.class)); cards.add(new SetCardInfo("Wall of Water", 114, Rarity.UNCOMMON, mage.cards.w.WallOfWater.class)); - cards.add(new SetCardInfo("Wall of Wood", 168, Rarity.COMMON, mage.cards.w.WallOfWood.class)); - cards.add(new SetCardInfo("Wanderlust", 169, Rarity.UNCOMMON, mage.cards.w.Wanderlust.class)); - cards.add(new SetCardInfo("War Mammoth", 170, Rarity.COMMON, mage.cards.w.WarMammoth.class)); - cards.add(new SetCardInfo("Warp Artifact", 53, Rarity.RARE, mage.cards.w.WarpArtifact.class)); cards.add(new SetCardInfo("Water Elemental", 115, Rarity.UNCOMMON, mage.cards.w.WaterElemental.class)); - cards.add(new SetCardInfo("Weakness", 54, Rarity.COMMON, mage.cards.w.Weakness.class)); - cards.add(new SetCardInfo("Web", 171, Rarity.RARE, mage.cards.w.Web.class)); - cards.add(new SetCardInfo("Whirling Dervish", 172, Rarity.UNCOMMON, mage.cards.w.WhirlingDervish.class)); - cards.add(new SetCardInfo("White Knight", 306, Rarity.UNCOMMON, mage.cards.w.WhiteKnight.class)); - cards.add(new SetCardInfo("White Mana Battery", 375, Rarity.RARE, mage.cards.w.WhiteManaBattery.class)); - cards.add(new SetCardInfo("White Ward", 307, Rarity.UNCOMMON, mage.cards.w.WhiteWard.class)); - cards.add(new SetCardInfo("Wild Growth", 173, Rarity.COMMON, mage.cards.w.WildGrowth.class)); - cards.add(new SetCardInfo("Will-o'-the-Wisp", 55, Rarity.RARE, mage.cards.w.WillOTheWisp.class)); - cards.add(new SetCardInfo("Winds of Change", 250, Rarity.RARE, mage.cards.w.WindsOfChange.class)); - cards.add(new SetCardInfo("Winter Blast", 174, Rarity.UNCOMMON, mage.cards.w.WinterBlast.class)); - cards.add(new SetCardInfo("Winter Orb", 376, Rarity.RARE, mage.cards.w.WinterOrb.class)); - cards.add(new SetCardInfo("Wooden Sphere", 377, Rarity.UNCOMMON, mage.cards.w.WoodenSphere.class)); - cards.add(new SetCardInfo("Word of Binding", 56, Rarity.COMMON, mage.cards.w.WordOfBinding.class)); - cards.add(new SetCardInfo("Wrath of God", 308, Rarity.RARE, mage.cards.w.WrathOfGod.class)); - cards.add(new SetCardInfo("Xenic Poltergeist", 57, Rarity.RARE, mage.cards.x.XenicPoltergeist.class)); - cards.add(new SetCardInfo("Yotian Soldier", 378, Rarity.COMMON, mage.cards.y.YotianSoldier.class)); cards.add(new SetCardInfo("Zephyr Falcon", 116, Rarity.COMMON, mage.cards.z.ZephyrFalcon.class)); - cards.add(new SetCardInfo("Zombie Master", 58, Rarity.RARE, mage.cards.z.ZombieMaster.class)); + cards.add(new SetCardInfo("Aspect of Wolf", 233, Rarity.RARE, mage.cards.a.AspectOfWolf.class)); + cards.add(new SetCardInfo("Birds of Paradise", 234, Rarity.RARE, mage.cards.b.BirdsOfParadise.class)); + cards.add(new SetCardInfo("Carnivorous Plant", 235, Rarity.COMMON, mage.cards.c.CarnivorousPlant.class)); + cards.add(new SetCardInfo("Channel", 236, Rarity.UNCOMMON, mage.cards.c.Channel.class)); + cards.add(new SetCardInfo("Cockatrice", 237, Rarity.RARE, mage.cards.c.Cockatrice.class)); + cards.add(new SetCardInfo("Craw Wurm", 238, Rarity.COMMON, mage.cards.c.CrawWurm.class)); + cards.add(new SetCardInfo("Crumble", 239, Rarity.UNCOMMON, mage.cards.c.Crumble.class)); + cards.add(new SetCardInfo("Desert Twister", 240, Rarity.UNCOMMON, mage.cards.d.DesertTwister.class)); + cards.add(new SetCardInfo("Durkwood Boars", 241, Rarity.COMMON, mage.cards.d.DurkwoodBoars.class)); + cards.add(new SetCardInfo("Elven Riders", 242, Rarity.UNCOMMON, mage.cards.e.ElvenRiders.class)); + cards.add(new SetCardInfo("Elvish Archers", 243, Rarity.RARE, mage.cards.e.ElvishArchers.class)); + cards.add(new SetCardInfo("Fog", 244, Rarity.COMMON, mage.cards.f.Fog.class)); + cards.add(new SetCardInfo("Force of Nature", 245, Rarity.RARE, mage.cards.f.ForceOfNature.class)); + cards.add(new SetCardInfo("Fungusaur", 246, Rarity.RARE, mage.cards.f.Fungusaur.class)); + cards.add(new SetCardInfo("Gaea's Liege", 247, Rarity.RARE, mage.cards.g.GaeasLiege.class)); + cards.add(new SetCardInfo("Giant Growth", 248, Rarity.COMMON, mage.cards.g.GiantGrowth.class)); + cards.add(new SetCardInfo("Giant Spider", 249, Rarity.COMMON, mage.cards.g.GiantSpider.class)); + cards.add(new SetCardInfo("Grizzly Bears", 250, Rarity.COMMON, mage.cards.g.GrizzlyBears.class)); + cards.add(new SetCardInfo("Hurricane", 251, Rarity.UNCOMMON, mage.cards.h.Hurricane.class)); + cards.add(new SetCardInfo("Instill Energy", 252, Rarity.UNCOMMON, mage.cards.i.InstillEnergy.class)); + cards.add(new SetCardInfo("Ironroot Treefolk", 253, Rarity.COMMON, mage.cards.i.IronrootTreefolk.class)); + cards.add(new SetCardInfo("Killer Bees", 254, Rarity.UNCOMMON, mage.cards.k.KillerBees.class)); + cards.add(new SetCardInfo("Land Leeches", 255, Rarity.COMMON, mage.cards.l.LandLeeches.class)); + cards.add(new SetCardInfo("Ley Druid", 256, Rarity.UNCOMMON, mage.cards.l.LeyDruid.class)); + cards.add(new SetCardInfo("Lifeforce", 257, Rarity.UNCOMMON, mage.cards.l.Lifeforce.class)); + cards.add(new SetCardInfo("Lifelace", 258, Rarity.RARE, mage.cards.l.Lifelace.class)); + cards.add(new SetCardInfo("Living Artifact", 259, Rarity.RARE, mage.cards.l.LivingArtifact.class)); + cards.add(new SetCardInfo("Living Lands", 260, Rarity.RARE, mage.cards.l.LivingLands.class)); + cards.add(new SetCardInfo("Llanowar Elves", 261, Rarity.COMMON, mage.cards.l.LlanowarElves.class)); + cards.add(new SetCardInfo("Lure", 262, Rarity.UNCOMMON, mage.cards.l.Lure.class)); + cards.add(new SetCardInfo("Marsh Viper", 263, Rarity.COMMON, mage.cards.m.MarshViper.class)); + cards.add(new SetCardInfo("Nafs Asp", 264, Rarity.COMMON, NafsAsp.class)); + cards.add(new SetCardInfo("Pradesh Gypsies", 265, Rarity.COMMON, mage.cards.p.PradeshGypsies.class)); + cards.add(new SetCardInfo("Radjan Spirit", 266, Rarity.UNCOMMON, mage.cards.r.RadjanSpirit.class)); + cards.add(new SetCardInfo("Regeneration", 268, Rarity.COMMON, mage.cards.r.Regeneration.class)); + cards.add(new SetCardInfo("Sandstorm", 269, Rarity.COMMON, mage.cards.s.Sandstorm.class)); + cards.add(new SetCardInfo("Scryb Sprites", 270, Rarity.COMMON, mage.cards.s.ScrybSprites.class)); + cards.add(new SetCardInfo("Shanodin Dryads", 271, Rarity.COMMON, mage.cards.s.ShanodinDryads.class)); + cards.add(new SetCardInfo("Stream of Life", 272, Rarity.COMMON, mage.cards.s.StreamOfLife.class)); + cards.add(new SetCardInfo("Sylvan Library", 273, Rarity.RARE, mage.cards.s.SylvanLibrary.class)); + cards.add(new SetCardInfo("Thicket Basilisk", 274, Rarity.UNCOMMON, mage.cards.t.ThicketBasilisk.class)); + cards.add(new SetCardInfo("Titania's Song", 276, Rarity.RARE, mage.cards.t.TitaniasSong.class)); + cards.add(new SetCardInfo("Tranquility", 277, Rarity.COMMON, mage.cards.t.Tranquility.class)); + cards.add(new SetCardInfo("Tsunami", 278, Rarity.UNCOMMON, mage.cards.t.Tsunami.class)); + cards.add(new SetCardInfo("Untamed Wilds", 279, Rarity.UNCOMMON, mage.cards.u.UntamedWilds.class)); + cards.add(new SetCardInfo("Venom", 280, Rarity.COMMON, mage.cards.v.Venom.class)); + cards.add(new SetCardInfo("Verduran Enchantress", 281, Rarity.RARE, mage.cards.v.VerduranEnchantress.class)); + cards.add(new SetCardInfo("Wall of Brambles", 282, Rarity.UNCOMMON, mage.cards.w.WallOfBrambles.class)); + cards.add(new SetCardInfo("Wall of Ice", 283, Rarity.UNCOMMON, mage.cards.w.WallOfIce.class)); + cards.add(new SetCardInfo("Wall of Wood", 284, Rarity.COMMON, mage.cards.w.WallOfWood.class)); + cards.add(new SetCardInfo("Wanderlust", 285, Rarity.UNCOMMON, mage.cards.w.Wanderlust.class)); + cards.add(new SetCardInfo("War Mammoth", 286, Rarity.COMMON, mage.cards.w.WarMammoth.class)); + cards.add(new SetCardInfo("Web", 287, Rarity.RARE, mage.cards.w.Web.class)); + cards.add(new SetCardInfo("Whirling Dervish", 288, Rarity.UNCOMMON, mage.cards.w.WhirlingDervish.class)); + cards.add(new SetCardInfo("Wild Growth", 289, Rarity.COMMON, mage.cards.w.WildGrowth.class)); + cards.add(new SetCardInfo("Winter Blast", 290, Rarity.UNCOMMON, mage.cards.w.WinterBlast.class)); + cards.add(new SetCardInfo("Forest", 376, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 377, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Forest", 378, Rarity.LAND, mage.cards.basiclands.Forest.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 367, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 368, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Island", 369, Rarity.LAND, mage.cards.basiclands.Island.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mishra's Factory", 361, Rarity.UNCOMMON, mage.cards.m.MishrasFactory.class)); + cards.add(new SetCardInfo("Mountain", 373, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 374, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Mountain", 375, Rarity.LAND, mage.cards.basiclands.Mountain.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Oasis", 362, Rarity.UNCOMMON, mage.cards.o.Oasis.class)); + cards.add(new SetCardInfo("Plains", 364, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 365, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Plains", 366, Rarity.LAND, mage.cards.basiclands.Plains.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Strip Mine", 363, Rarity.UNCOMMON, mage.cards.s.StripMine.class)); + cards.add(new SetCardInfo("Swamp", 370, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 371, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Swamp", 372, Rarity.LAND, mage.cards.basiclands.Swamp.class, NON_FULL_USE_VARIOUS)); + cards.add(new SetCardInfo("Ali Baba", 175, Rarity.UNCOMMON, mage.cards.a.AliBaba.class)); + cards.add(new SetCardInfo("Ball Lightning", 176, Rarity.RARE, mage.cards.b.BallLightning.class)); + cards.add(new SetCardInfo("Bird Maiden", 177, Rarity.COMMON, mage.cards.b.BirdMaiden.class)); + cards.add(new SetCardInfo("Blood Lust", 178, Rarity.COMMON, mage.cards.b.BloodLust.class)); + cards.add(new SetCardInfo("Brothers of Fire", 179, Rarity.COMMON, mage.cards.b.BrothersOfFire.class)); + cards.add(new SetCardInfo("Burrowing", 180, Rarity.UNCOMMON, mage.cards.b.Burrowing.class)); + cards.add(new SetCardInfo("Cave People", 181, Rarity.UNCOMMON, mage.cards.c.CavePeople.class)); + cards.add(new SetCardInfo("Chaoslace", 182, Rarity.RARE, mage.cards.c.Chaoslace.class)); + cards.add(new SetCardInfo("Crimson Manticore", 183, Rarity.RARE, mage.cards.c.CrimsonManticore.class)); + cards.add(new SetCardInfo("Detonate", 184, Rarity.UNCOMMON, mage.cards.d.Detonate.class)); + cards.add(new SetCardInfo("Disintegrate", 185, Rarity.COMMON, mage.cards.d.Disintegrate.class)); + cards.add(new SetCardInfo("Dragon Whelp", 186, Rarity.UNCOMMON, mage.cards.d.DragonWhelp.class)); + cards.add(new SetCardInfo("Dwarven Warriors", 187, Rarity.COMMON, mage.cards.d.DwarvenWarriors.class)); + cards.add(new SetCardInfo("Earth Elemental", 188, Rarity.UNCOMMON, mage.cards.e.EarthElemental.class)); + cards.add(new SetCardInfo("Earthquake", 189, Rarity.RARE, mage.cards.e.Earthquake.class)); + cards.add(new SetCardInfo("Eternal Warrior", 190, Rarity.COMMON, mage.cards.e.EternalWarrior.class)); + cards.add(new SetCardInfo("Fire Elemental", 191, Rarity.UNCOMMON, mage.cards.f.FireElemental.class)); + cards.add(new SetCardInfo("Fireball", 192, Rarity.COMMON, mage.cards.f.Fireball.class)); + cards.add(new SetCardInfo("Firebreathing", 193, Rarity.COMMON, mage.cards.f.Firebreathing.class)); + cards.add(new SetCardInfo("Fissure", 194, Rarity.COMMON, mage.cards.f.Fissure.class)); + cards.add(new SetCardInfo("Flashfires", 195, Rarity.UNCOMMON, mage.cards.f.Flashfires.class)); + cards.add(new SetCardInfo("Giant Strength", 196, Rarity.COMMON, mage.cards.g.GiantStrength.class)); + cards.add(new SetCardInfo("Goblin Balloon Brigade", 197, Rarity.UNCOMMON, mage.cards.g.GoblinBalloonBrigade.class)); + cards.add(new SetCardInfo("Goblin King", 198, Rarity.RARE, mage.cards.g.GoblinKing.class)); + cards.add(new SetCardInfo("Gray Ogre", 200, Rarity.COMMON, mage.cards.g.GrayOgre.class)); + cards.add(new SetCardInfo("Hill Giant", 201, Rarity.COMMON, mage.cards.h.HillGiant.class)); + cards.add(new SetCardInfo("Hurloon Minotaur", 202, Rarity.COMMON, mage.cards.h.HurloonMinotaur.class)); + cards.add(new SetCardInfo("Hurr Jackal", 203, Rarity.RARE, mage.cards.h.HurrJackal.class)); + cards.add(new SetCardInfo("Immolation", 204, Rarity.COMMON, mage.cards.i.Immolation.class)); + cards.add(new SetCardInfo("Inferno", 205, Rarity.RARE, mage.cards.i.Inferno.class)); + cards.add(new SetCardInfo("Ironclaw Orcs", 206, Rarity.COMMON, mage.cards.i.IronclawOrcs.class)); + cards.add(new SetCardInfo("Keldon Warlord", 207, Rarity.UNCOMMON, mage.cards.k.KeldonWarlord.class)); + cards.add(new SetCardInfo("Lightning Bolt", 208, Rarity.COMMON, mage.cards.l.LightningBolt.class)); + cards.add(new SetCardInfo("Magnetic Mountain", 209, Rarity.RARE, mage.cards.m.MagneticMountain.class)); + cards.add(new SetCardInfo("Mana Clash", 210, Rarity.RARE, mage.cards.m.ManaClash.class)); + cards.add(new SetCardInfo("Mana Flare", 211, Rarity.RARE, mage.cards.m.ManaFlare.class)); + cards.add(new SetCardInfo("Manabarbs", 212, Rarity.RARE, mage.cards.m.Manabarbs.class)); + cards.add(new SetCardInfo("Mons's Goblin Raiders", 213, Rarity.COMMON, mage.cards.m.MonssGoblinRaiders.class)); + cards.add(new SetCardInfo("Orcish Artillery", 214, Rarity.UNCOMMON, mage.cards.o.OrcishArtillery.class)); + cards.add(new SetCardInfo("Orcish Oriflamme", 215, Rarity.UNCOMMON, mage.cards.o.OrcishOriflamme.class)); + cards.add(new SetCardInfo("Power Surge", 216, Rarity.RARE, mage.cards.p.PowerSurge.class)); + cards.add(new SetCardInfo("Pyrotechnics", 217, Rarity.UNCOMMON, mage.cards.p.Pyrotechnics.class)); + cards.add(new SetCardInfo("Red Elemental Blast", 218, Rarity.COMMON, mage.cards.r.RedElementalBlast.class)); + cards.add(new SetCardInfo("Shatter", 219, Rarity.COMMON, mage.cards.s.Shatter.class)); + cards.add(new SetCardInfo("Shivan Dragon", 220, Rarity.RARE, mage.cards.s.ShivanDragon.class)); + cards.add(new SetCardInfo("Sisters of the Flame", 221, Rarity.COMMON, mage.cards.s.SistersOfTheFlame.class)); + cards.add(new SetCardInfo("Smoke", 222, Rarity.RARE, mage.cards.s.Smoke.class)); + cards.add(new SetCardInfo("Stone Giant", 223, Rarity.UNCOMMON, mage.cards.s.StoneGiant.class)); + cards.add(new SetCardInfo("Stone Rain", 224, Rarity.COMMON, mage.cards.s.StoneRain.class)); + cards.add(new SetCardInfo("The Brute", 226, Rarity.COMMON, mage.cards.t.TheBrute.class)); + cards.add(new SetCardInfo("Tunnel", 227, Rarity.UNCOMMON, mage.cards.t.Tunnel.class)); + cards.add(new SetCardInfo("Uthden Troll", 228, Rarity.UNCOMMON, mage.cards.u.UthdenTroll.class)); + cards.add(new SetCardInfo("Wall of Fire", 230, Rarity.UNCOMMON, mage.cards.w.WallOfFire.class)); + cards.add(new SetCardInfo("Wall of Stone", 231, Rarity.UNCOMMON, mage.cards.w.WallOfStone.class)); + cards.add(new SetCardInfo("Winds of Change", 232, Rarity.RARE, mage.cards.w.WindsOfChange.class)); + cards.add(new SetCardInfo("Alabaster Potion", 1, Rarity.COMMON, mage.cards.a.AlabasterPotion.class)); + cards.add(new SetCardInfo("Amrou Kithkin", 2, Rarity.COMMON, mage.cards.a.AmrouKithkin.class)); + cards.add(new SetCardInfo("Angry Mob", 3, Rarity.UNCOMMON, mage.cards.a.AngryMob.class)); + cards.add(new SetCardInfo("Animate Wall", 4, Rarity.RARE, mage.cards.a.AnimateWall.class)); + cards.add(new SetCardInfo("Armageddon", 5, Rarity.RARE, mage.cards.a.Armageddon.class)); + cards.add(new SetCardInfo("Balance", 6, Rarity.RARE, mage.cards.b.Balance.class)); + cards.add(new SetCardInfo("Black Ward", 8, Rarity.UNCOMMON, mage.cards.b.BlackWard.class)); + cards.add(new SetCardInfo("Blessing", 9, Rarity.RARE, mage.cards.b.Blessing.class)); + cards.add(new SetCardInfo("Blue Ward", 10, Rarity.UNCOMMON, mage.cards.b.BlueWard.class)); + cards.add(new SetCardInfo("Brainwash", 11, Rarity.COMMON, mage.cards.b.Brainwash.class)); + cards.add(new SetCardInfo("Castle", 12, Rarity.UNCOMMON, mage.cards.c.Castle.class)); + cards.add(new SetCardInfo("Circle of Protection: Artifacts", 13, Rarity.COMMON, mage.cards.c.CircleOfProtectionArtifacts.class)); + cards.add(new SetCardInfo("Circle of Protection: Black", 14, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlack.class)); + cards.add(new SetCardInfo("Circle of Protection: Blue", 15, Rarity.COMMON, mage.cards.c.CircleOfProtectionBlue.class)); + cards.add(new SetCardInfo("Circle of Protection: Green", 16, Rarity.COMMON, mage.cards.c.CircleOfProtectionGreen.class)); + cards.add(new SetCardInfo("Circle of Protection: Red", 17, Rarity.COMMON, mage.cards.c.CircleOfProtectionRed.class)); + cards.add(new SetCardInfo("Circle of Protection: White", 18, Rarity.COMMON, mage.cards.c.CircleOfProtectionWhite.class)); + cards.add(new SetCardInfo("Conversion", 19, Rarity.UNCOMMON, mage.cards.c.Conversion.class)); + cards.add(new SetCardInfo("Crusade", 20, Rarity.RARE, mage.cards.c.Crusade.class)); + cards.add(new SetCardInfo("Death Ward", 21, Rarity.COMMON, mage.cards.d.DeathWard.class)); + cards.add(new SetCardInfo("Disenchant", 22, Rarity.COMMON, mage.cards.d.Disenchant.class)); + cards.add(new SetCardInfo("Divine Transformation", 23, Rarity.UNCOMMON, mage.cards.d.DivineTransformation.class)); + cards.add(new SetCardInfo("Elder Land Wurm", 24, Rarity.RARE, mage.cards.e.ElderLandWurm.class)); + cards.add(new SetCardInfo("Eye for an Eye", 25, Rarity.RARE, mage.cards.e.EyeForAnEye.class)); + cards.add(new SetCardInfo("Green Ward", 27, Rarity.UNCOMMON, mage.cards.g.GreenWard.class)); + cards.add(new SetCardInfo("Healing Salve", 28, Rarity.COMMON, mage.cards.h.HealingSalve.class)); + cards.add(new SetCardInfo("Holy Armor", 29, Rarity.COMMON, mage.cards.h.HolyArmor.class)); + cards.add(new SetCardInfo("Holy Strength", 30, Rarity.COMMON, mage.cards.h.HolyStrength.class)); + cards.add(new SetCardInfo("Island Sanctuary", 31, Rarity.RARE, mage.cards.i.IslandSanctuary.class)); + cards.add(new SetCardInfo("Karma", 32, Rarity.UNCOMMON, mage.cards.k.Karma.class)); + cards.add(new SetCardInfo("Kismet", 33, Rarity.UNCOMMON, mage.cards.k.Kismet.class)); + cards.add(new SetCardInfo("Land Tax", 34, Rarity.RARE, mage.cards.l.LandTax.class)); + cards.add(new SetCardInfo("Northern Paladin", 37, Rarity.RARE, mage.cards.n.NorthernPaladin.class)); + cards.add(new SetCardInfo("Osai Vultures", 38, Rarity.UNCOMMON, mage.cards.o.OsaiVultures.class)); + cards.add(new SetCardInfo("Pearled Unicorn", 39, Rarity.COMMON, mage.cards.p.PearledUnicorn.class)); + cards.add(new SetCardInfo("Personal Incarnation", 40, Rarity.RARE, mage.cards.p.PersonalIncarnation.class)); + cards.add(new SetCardInfo("Piety", 41, Rarity.COMMON, Piety.class)); + cards.add(new SetCardInfo("Purelace", 43, Rarity.RARE, mage.cards.p.Purelace.class)); + cards.add(new SetCardInfo("Red Ward", 44, Rarity.UNCOMMON, mage.cards.r.RedWard.class)); + cards.add(new SetCardInfo("Reverse Damage", 45, Rarity.RARE, mage.cards.r.ReverseDamage.class)); + cards.add(new SetCardInfo("Righteousness", 46, Rarity.RARE, mage.cards.r.Righteousness.class)); + cards.add(new SetCardInfo("Samite Healer", 47, Rarity.COMMON, mage.cards.s.SamiteHealer.class)); + cards.add(new SetCardInfo("Savannah Lions", 48, Rarity.RARE, mage.cards.s.SavannahLions.class)); + cards.add(new SetCardInfo("Seeker", 49, Rarity.COMMON, mage.cards.s.Seeker.class)); + cards.add(new SetCardInfo("Serra Angel", 50, Rarity.UNCOMMON, mage.cards.s.SerraAngel.class)); + cards.add(new SetCardInfo("Spirit Link", 51, Rarity.UNCOMMON, mage.cards.s.SpiritLink.class)); + cards.add(new SetCardInfo("Swords to Plowshares", 52, Rarity.UNCOMMON, mage.cards.s.SwordsToPlowshares.class)); + cards.add(new SetCardInfo("Tundra Wolves", 53, Rarity.COMMON, mage.cards.t.TundraWolves.class)); + cards.add(new SetCardInfo("Wall of Swords", 55, Rarity.UNCOMMON, mage.cards.w.WallOfSwords.class)); + cards.add(new SetCardInfo("White Knight", 56, Rarity.UNCOMMON, mage.cards.w.WhiteKnight.class)); + cards.add(new SetCardInfo("White Ward", 57, Rarity.UNCOMMON, mage.cards.w.WhiteWard.class)); + cards.add(new SetCardInfo("Wrath of God", 58, Rarity.RARE, mage.cards.w.WrathOfGod.class)); + cards.add(new SetCardInfo("Aladdin's Lamp", 291, Rarity.RARE, mage.cards.a.AladdinsLamp.class)); + cards.add(new SetCardInfo("Aladdin's Ring", 292, Rarity.RARE, mage.cards.a.AladdinsRing.class)); + cards.add(new SetCardInfo("Amulet of Kroog", 293, Rarity.COMMON, mage.cards.a.AmuletOfKroog.class)); + cards.add(new SetCardInfo("Ankh of Mishra", 294, Rarity.RARE, mage.cards.a.AnkhOfMishra.class)); + cards.add(new SetCardInfo("Armageddon Clock", 295, Rarity.RARE, mage.cards.a.ArmageddonClock.class)); + cards.add(new SetCardInfo("Ashnod's Battle Gear", 296, Rarity.UNCOMMON, mage.cards.a.AshnodsBattleGear.class)); + cards.add(new SetCardInfo("Black Mana Battery", 298, Rarity.RARE, mage.cards.b.BlackManaBattery.class)); + cards.add(new SetCardInfo("Black Vise", 299, Rarity.UNCOMMON, mage.cards.b.BlackVise.class)); + cards.add(new SetCardInfo("Blue Mana Battery", 300, Rarity.RARE, mage.cards.b.BlueManaBattery.class)); + cards.add(new SetCardInfo("Bottle of Suleiman", 301, Rarity.RARE, mage.cards.b.BottleOfSuleiman.class)); + cards.add(new SetCardInfo("Brass Man", 302, Rarity.UNCOMMON, mage.cards.b.BrassMan.class)); + cards.add(new SetCardInfo("Celestial Prism", 304, Rarity.UNCOMMON, mage.cards.c.CelestialPrism.class)); + cards.add(new SetCardInfo("Clay Statue", 305, Rarity.COMMON, mage.cards.c.ClayStatue.class)); + cards.add(new SetCardInfo("Clockwork Avian", 306, Rarity.RARE, mage.cards.c.ClockworkAvian.class)); + cards.add(new SetCardInfo("Clockwork Beast", 307, Rarity.RARE, mage.cards.c.ClockworkBeast.class)); + cards.add(new SetCardInfo("Colossus of Sardia", 308, Rarity.RARE, mage.cards.c.ColossusOfSardia.class)); + cards.add(new SetCardInfo("Conservator", 309, Rarity.UNCOMMON, mage.cards.c.Conservator.class)); + cards.add(new SetCardInfo("Coral Helm", 310, Rarity.RARE, mage.cards.c.CoralHelm.class)); + cards.add(new SetCardInfo("Crystal Rod", 311, Rarity.UNCOMMON, mage.cards.c.CrystalRod.class)); + cards.add(new SetCardInfo("Cursed Rack", 312, Rarity.UNCOMMON, mage.cards.c.CursedRack.class)); + cards.add(new SetCardInfo("Dancing Scimitar", 313, Rarity.RARE, mage.cards.d.DancingScimitar.class)); + cards.add(new SetCardInfo("Diabolic Machine", 314, Rarity.UNCOMMON, mage.cards.d.DiabolicMachine.class)); + cards.add(new SetCardInfo("Dingus Egg", 315, Rarity.RARE, mage.cards.d.DingusEgg.class)); + cards.add(new SetCardInfo("Disrupting Scepter", 316, Rarity.RARE, mage.cards.d.DisruptingScepter.class)); + cards.add(new SetCardInfo("Dragon Engine", 317, Rarity.RARE, mage.cards.d.DragonEngine.class)); + cards.add(new SetCardInfo("Ebony Horse", 318, Rarity.RARE, mage.cards.e.EbonyHorse.class)); + cards.add(new SetCardInfo("Fellwar Stone", 319, Rarity.UNCOMMON, mage.cards.f.FellwarStone.class)); + cards.add(new SetCardInfo("Flying Carpet", 320, Rarity.RARE, mage.cards.f.FlyingCarpet.class)); + cards.add(new SetCardInfo("Glasses of Urza", 321, Rarity.UNCOMMON, mage.cards.g.GlassesOfUrza.class)); + cards.add(new SetCardInfo("Grapeshot Catapult", 322, Rarity.COMMON, mage.cards.g.GrapeshotCatapult.class)); + cards.add(new SetCardInfo("Green Mana Battery", 323, Rarity.RARE, mage.cards.g.GreenManaBattery.class)); + cards.add(new SetCardInfo("Howling Mine", 325, Rarity.RARE, mage.cards.h.HowlingMine.class)); + cards.add(new SetCardInfo("Iron Star", 326, Rarity.UNCOMMON, mage.cards.i.IronStar.class)); + cards.add(new SetCardInfo("Ivory Cup", 327, Rarity.UNCOMMON, mage.cards.i.IvoryCup.class)); + cards.add(new SetCardInfo("Ivory Tower", 328, Rarity.RARE, mage.cards.i.IvoryTower.class)); + cards.add(new SetCardInfo("Jade Monolith", 329, Rarity.RARE, mage.cards.j.JadeMonolith.class)); + cards.add(new SetCardInfo("Jandor's Saddlebags", 330, Rarity.RARE, mage.cards.j.JandorsSaddlebags.class)); + cards.add(new SetCardInfo("Jayemdae Tome", 331, Rarity.RARE, mage.cards.j.JayemdaeTome.class)); + cards.add(new SetCardInfo("Kormus Bell", 332, Rarity.RARE, mage.cards.k.KormusBell.class)); + cards.add(new SetCardInfo("Library of Leng", 333, Rarity.UNCOMMON, mage.cards.l.LibraryOfLeng.class)); + cards.add(new SetCardInfo("Mana Vault", 334, Rarity.RARE, mage.cards.m.ManaVault.class)); + cards.add(new SetCardInfo("Meekstone", 335, Rarity.RARE, mage.cards.m.Meekstone.class)); + cards.add(new SetCardInfo("Millstone", 336, Rarity.RARE, mage.cards.m.Millstone.class)); + cards.add(new SetCardInfo("Nevinyrral's Disk", 338, Rarity.RARE, mage.cards.n.NevinyrralsDisk.class)); + cards.add(new SetCardInfo("Obsianus Golem", 339, Rarity.UNCOMMON, mage.cards.o.ObsianusGolem.class)); + cards.add(new SetCardInfo("Onulet", 340, Rarity.RARE, mage.cards.o.Onulet.class)); + cards.add(new SetCardInfo("Ornithopter", 341, Rarity.UNCOMMON, mage.cards.o.Ornithopter.class)); + cards.add(new SetCardInfo("Primal Clay", 342, Rarity.RARE, mage.cards.p.PrimalClay.class)); + cards.add(new SetCardInfo("Red Mana Battery", 343, Rarity.RARE, mage.cards.r.RedManaBattery.class)); + cards.add(new SetCardInfo("Rod of Ruin", 344, Rarity.UNCOMMON, mage.cards.r.RodOfRuin.class)); + cards.add(new SetCardInfo("Shapeshifter", 345, Rarity.UNCOMMON, mage.cards.s.Shapeshifter.class)); + cards.add(new SetCardInfo("Soul Net", 346, Rarity.UNCOMMON, mage.cards.s.SoulNet.class)); + cards.add(new SetCardInfo("Sunglasses of Urza", 347, Rarity.RARE, mage.cards.s.SunglassesOfUrza.class)); + cards.add(new SetCardInfo("Tawnos's Wand", 348, Rarity.UNCOMMON, mage.cards.t.TawnossWand.class)); + cards.add(new SetCardInfo("Tawnos's Weaponry", 349, Rarity.UNCOMMON, mage.cards.t.TawnossWeaponry.class)); + cards.add(new SetCardInfo("Tetravus", 350, Rarity.RARE, mage.cards.t.Tetravus.class)); + cards.add(new SetCardInfo("The Hive", 351, Rarity.RARE, mage.cards.t.TheHive.class)); + cards.add(new SetCardInfo("The Rack", 352, Rarity.UNCOMMON, mage.cards.t.TheRack.class)); + cards.add(new SetCardInfo("Throne of Bone", 353, Rarity.UNCOMMON, mage.cards.t.ThroneOfBone.class)); + cards.add(new SetCardInfo("Triskelion", 354, Rarity.RARE, mage.cards.t.Triskelion.class)); + cards.add(new SetCardInfo("Wall of Spears", 356, Rarity.COMMON, mage.cards.w.WallOfSpears.class)); + cards.add(new SetCardInfo("White Mana Battery", 357, Rarity.RARE, mage.cards.w.WhiteManaBattery.class)); + cards.add(new SetCardInfo("Winter Orb", 358, Rarity.RARE, mage.cards.w.WinterOrb.class)); + cards.add(new SetCardInfo("Wooden Sphere", 359, Rarity.UNCOMMON, mage.cards.w.WoodenSphere.class)); + cards.add(new SetCardInfo("Yotian Soldier", 360, Rarity.COMMON, mage.cards.y.YotianSoldier.class)); + cards.add(new SetCardInfo("Morale", 36, Rarity.COMMON, mage.cards.m.Morale.class)); } } From a80030e8aaa12f854c0fc868b48ffec85bf8a98c Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sat, 23 Dec 2017 19:38:18 +0400 Subject: [PATCH 115/164] Added new christmas logo (auto-enabled from december 15 to january 15) --- .../src/main/java/mage/client/MageFrame.java | 32 +++++++++++++++--- .../main/resources/label-xmage-christmas.png | Bin 0 -> 144578 bytes 2 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 Mage.Client/src/main/resources/label-xmage-christmas.png diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index dfa734f1afc..7df4a984ff0 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -429,17 +429,41 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { } } + private boolean isChrismasTime(){ + // from december 15 to january 15 + Calendar cal = Calendar.getInstance(); + int currentYear = cal.get(Calendar.YEAR); + Date currentTime = cal.getTime(); + + Date chrisFrom = new GregorianCalendar(currentYear, Calendar.DECEMBER, 15).getTime(); + Date chrisTo = new GregorianCalendar(currentYear + 1, Calendar.JANUARY, 15 + 1).getTime(); + + return currentTime.after(chrisFrom) && currentTime.before(chrisTo); + } + private void addMageLabel() { if (liteMode || grayMode) { return; } - String filename = "/label-xmage.png"; + + String filename; + float ratio; + if (isChrismasTime()){ + // chrismass logo + LOGGER.info("Yo Ho Ho, Merry Christmas and a Happy New Year"); + filename = "/label-xmage-christmas.png"; + ratio = 539.0f / 318.0f; + }else{ + // standard logo + filename = "/label-xmage.png"; + ratio = 509.0f / 288.0f; + } + try { InputStream is = this.getClass().getResourceAsStream(filename); - - float ratio = 1179.0f / 678.0f; - titleRectangle = new Rectangle(540, (int) (640 / ratio)); if (is != null) { + titleRectangle = new Rectangle(540, (int) (640 / ratio)); + BufferedImage image = ImageIO.read(is); //ImageIcon resized = new ImageIcon(image.getScaledInstance(titleRectangle.width, titleRectangle.height, java.awt.Image.SCALE_SMOOTH)); title = new JLabel(); diff --git a/Mage.Client/src/main/resources/label-xmage-christmas.png b/Mage.Client/src/main/resources/label-xmage-christmas.png new file mode 100644 index 0000000000000000000000000000000000000000..2f7ad1e9ddde128d9ef39d1f96f2852fc40efe3c GIT binary patch literal 144578 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

9*s=fTl@*6NVr+4iRgl!-?5mQvG8cV}bd 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 UC|I-O00KTwRCJW<5Vq0(54SCQuK)l5 literal 0 HcmV?d00001 From 42d3d558fffb7965628fdce07b443120ed3c5393 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sat, 23 Dec 2017 19:48:00 +0400 Subject: [PATCH 116/164] little fix --- .../main/resources/label-xmage-christmas.png | Bin 144578 -> 144481 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Mage.Client/src/main/resources/label-xmage-christmas.png b/Mage.Client/src/main/resources/label-xmage-christmas.png index 2f7ad1e9ddde128d9ef39d1f96f2852fc40efe3c..92edd1ee6c0d99c3ec32d8c48ac6c8e03ca0b5a8 100644 GIT binary patch delta 138603 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 Vn(@ZSyF$S0vXO;hwSjx={{S~t3^o7& delta 138693 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

36IjoeNYIf#= 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 O@LauOs#k@+74<(P*l_y* From 66acc1c1e845d7e85940ce48bcd66d40737bd9d8 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 23 Dec 2017 18:54:43 +0100 Subject: [PATCH 117/164] [RIX] Added 6 cards. --- .../mage/cards/a/AngrathMinotaurPirate.java | 5 +- Mage.Sets/src/mage/cards/a/AngrathsFury.java | 81 +++++++++++++++++ .../mage/cards/a/ArlinnEmbracedByTheMoon.java | 8 +- Mage.Sets/src/mage/cards/s/SwabGoblin.java | 60 +++++++++++++ .../src/mage/cards/v/VampireChampion.java | 65 ++++++++++++++ .../mage/cards/v/VraskaSchemingGorgon.java | 90 +++++++++++++++++++ .../src/mage/cards/v/VraskasConquistador.java | 85 ++++++++++++++++++ Mage.Sets/src/mage/cards/v/VraskasScorn.java | 72 +++++++++++++++ Mage.Sets/src/mage/sets/RivalsOfIxalan.java | 6 ++ ...CombatDamageToAPlayerTriggeredAbility.java | 16 +++- .../java/mage/abilities/effects/Effect.java | 22 +++-- .../mage/abilities/effects/EffectImpl.java | 23 +++-- 12 files changed, 508 insertions(+), 25 deletions(-) create mode 100644 Mage.Sets/src/mage/cards/a/AngrathsFury.java create mode 100644 Mage.Sets/src/mage/cards/s/SwabGoblin.java create mode 100644 Mage.Sets/src/mage/cards/v/VampireChampion.java create mode 100644 Mage.Sets/src/mage/cards/v/VraskaSchemingGorgon.java create mode 100644 Mage.Sets/src/mage/cards/v/VraskasConquistador.java create mode 100644 Mage.Sets/src/mage/cards/v/VraskasScorn.java diff --git a/Mage.Sets/src/mage/cards/a/AngrathMinotaurPirate.java b/Mage.Sets/src/mage/cards/a/AngrathMinotaurPirate.java index 6cf617b6e4b..e685f257608 100644 --- a/Mage.Sets/src/mage/cards/a/AngrathMinotaurPirate.java +++ b/Mage.Sets/src/mage/cards/a/AngrathMinotaurPirate.java @@ -69,7 +69,7 @@ public class AngrathMinotaurPirate extends CardImpl { // +2: Angrath, Minotaur Pirate deals 1 damage to target opponent and each creature that player controls. Effects effects1 = new Effects(); effects1.add(new DamageTargetEffect(1)); - effects1.add(new DamageAllControlledTargetEffect(1, new FilterCreaturePermanent())); + effects1.add(new DamageAllControlledTargetEffect(1, new FilterCreaturePermanent()).setText("and each creature that player controls")); LoyaltyAbility ability1 = new LoyaltyAbility(effects1, +2); ability1.addTarget(new TargetOpponent()); this.addAbility(ability1); @@ -77,7 +77,8 @@ public class AngrathMinotaurPirate extends CardImpl { // -3: Return target Pirate card from your graveyard to the battlefield. FilterCard filterPirateCard = new FilterCreatureCard("pirate card from your graveyard"); filterPirateCard.add(new SubtypePredicate(SubType.PIRATE)); - Ability ability2 = new LoyaltyAbility(new ReturnFromGraveyardToBattlefieldTargetEffect(), -3); + Ability ability2 = new LoyaltyAbility(new ReturnFromGraveyardToBattlefieldTargetEffect() + .setText("Return target Pirate card from your graveyard to the battlefield"), -3); ability2.addTarget(new TargetCardInYourGraveyard(filterPirateCard)); this.addAbility(ability2); diff --git a/Mage.Sets/src/mage/cards/a/AngrathsFury.java b/Mage.Sets/src/mage/cards/a/AngrathsFury.java new file mode 100644 index 00000000000..3141cb58d4b --- /dev/null +++ b/Mage.Sets/src/mage/cards/a/AngrathsFury.java @@ -0,0 +1,81 @@ +/* + * 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.a; + +import java.util.UUID; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.search.SearchLibraryGraveyardPutInHandEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.NamePredicate; +import mage.target.TargetPlayer; +import mage.target.common.TargetCreaturePermanent; +import mage.target.targetpointer.SecondTargetPointer; + +/** + * + * @author LevelX2 + */ +public class AngrathsFury extends CardImpl { + + private final static FilterCard filter = new FilterCard("Angrath, Minotaur Pirate"); + + static { + filter.add(new NamePredicate(filter.getMessage())); + } + + public AngrathsFury(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{B}{R}"); + + // Destroy target creature. + this.getSpellAbility().addEffect(new DestroyTargetEffect()); + this.getSpellAbility().addTarget(new TargetCreaturePermanent()); + + // Angrath's Fury deals 3 damage to target player. + this.getSpellAbility().addEffect(new DamageTargetEffect(3).setTargetPointer(new SecondTargetPointer()) + .setText("{this} deals 3 damage to target player")); + this.getSpellAbility().addTarget(new TargetPlayer()); + + // You may search your library and/or graveyard for a card named Angrath, Minotaur Pirate, reveal it, and put it into your hand. If you search your library this way, shuffle it. + this.getSpellAbility().addEffect(new SearchLibraryGraveyardPutInHandEffect(filter) + .setText("You may search your library and/or graveyard for a card named Angrath, Minotaur Pirate, reveal it, and put it into your hand. If you search your library this way, shuffle it")); + + } + + public AngrathsFury(final AngrathsFury card) { + super(card); + } + + @Override + public AngrathsFury copy() { + return new AngrathsFury(this); + } +} diff --git a/Mage.Sets/src/mage/cards/a/ArlinnEmbracedByTheMoon.java b/Mage.Sets/src/mage/cards/a/ArlinnEmbracedByTheMoon.java index 2904b7e803b..793ed6ffbd3 100644 --- a/Mage.Sets/src/mage/cards/a/ArlinnEmbracedByTheMoon.java +++ b/Mage.Sets/src/mage/cards/a/ArlinnEmbracedByTheMoon.java @@ -43,7 +43,7 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.SubType; import mage.constants.SuperType; -import mage.filter.common.FilterCreaturePermanent; +import mage.filter.StaticFilters; import mage.game.command.emblems.ArlinnEmbracedByTheMoonEmblem; import mage.target.common.TargetCreatureOrPlayer; @@ -53,8 +53,6 @@ import mage.target.common.TargetCreatureOrPlayer; */ public class ArlinnEmbracedByTheMoon extends CardImpl { - private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Creatures you control"); - public ArlinnEmbracedByTheMoon(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, ""); this.addSuperType(SuperType.LEGENDARY); @@ -66,10 +64,10 @@ public class ArlinnEmbracedByTheMoon extends CardImpl { this.transformable = true; // +1: Creatures you control get +1/+1 and gain trample until end of turn. - Effect effect = new BoostControlledEffect(1, 1, Duration.EndOfTurn, filter); + Effect effect = new BoostControlledEffect(1, 1, Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURE); effect.setText("Creatures you control get +1/+1"); LoyaltyAbility ability = new LoyaltyAbility(effect, 1); - effect = new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, filter); + effect = new GainAbilityControlledEffect(TrampleAbility.getInstance(), Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURE); effect.setText("and gain trample until end of turn"); ability.addEffect(effect); this.addAbility(ability); diff --git a/Mage.Sets/src/mage/cards/s/SwabGoblin.java b/Mage.Sets/src/mage/cards/s/SwabGoblin.java new file mode 100644 index 00000000000..69705ad8f5f --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SwabGoblin.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.cards.s; + +import java.util.UUID; +import mage.MageInt; +import mage.constants.SubType; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author LevelX2 + */ +public class SwabGoblin extends CardImpl { + + public SwabGoblin(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{R}"); + + this.subtype.add(SubType.GOBLIN); + this.subtype.add(SubType.PIRATE); + this.power = new MageInt(2); + this.toughness = new MageInt(2); + } + + public SwabGoblin(final SwabGoblin card) { + super(card); + } + + @Override + public SwabGoblin copy() { + return new SwabGoblin(this); + } +} diff --git a/Mage.Sets/src/mage/cards/v/VampireChampion.java b/Mage.Sets/src/mage/cards/v/VampireChampion.java new file mode 100644 index 00000000000..95bb4358c93 --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/VampireChampion.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.cards.v; + +import java.util.UUID; +import mage.MageInt; +import mage.constants.SubType; +import mage.abilities.keyword.DeathtouchAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; + +/** + * + * @author LevelX2 + */ +public class VampireChampion extends CardImpl { + + public VampireChampion(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{B}"); + + this.subtype.add(SubType.VAMPIRE); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(3); + this.toughness = new MageInt(3); + + // Deathtouch + this.addAbility(DeathtouchAbility.getInstance()); + + } + + public VampireChampion(final VampireChampion card) { + super(card); + } + + @Override + public VampireChampion copy() { + return new VampireChampion(this); + } +} diff --git a/Mage.Sets/src/mage/cards/v/VraskaSchemingGorgon.java b/Mage.Sets/src/mage/cards/v/VraskaSchemingGorgon.java new file mode 100644 index 00000000000..fc7abafc50d --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/VraskaSchemingGorgon.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.cards.v; + +import java.util.UUID; +import mage.abilities.LoyaltyAbility; +import mage.abilities.TriggeredAbility; +import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.common.PlanswalkerEntersWithLoyalityCountersAbility; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DestroyTargetEffect; +import mage.abilities.effects.common.LoseGameTargetPlayerEffect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.effects.common.continuous.GainAbilityControlledEffect; +import mage.abilities.keyword.DeathtouchAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.filter.StaticFilters; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class VraskaSchemingGorgon extends CardImpl { + + public VraskaSchemingGorgon(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.PLANESWALKER}, "{4}{B}{B}"); + + this.addSuperType(SuperType.LEGENDARY); + this.subtype.add(SubType.VRASKA); + this.addAbility(new PlanswalkerEntersWithLoyalityCountersAbility(5)); + + // +2: Creatures you control get +1/+0 until end of turn. + Effect effect = new BoostControlledEffect(1, 0, Duration.EndOfTurn, StaticFilters.FILTER_PERMANENT_CREATURE); + effect.setText("Creatures you control get +1/+0"); + this.addAbility(new LoyaltyAbility(effect, 2)); + + // -3: Destroy target creature. + LoyaltyAbility loyaltyAbility = new LoyaltyAbility(new DestroyTargetEffect(), -3); + loyaltyAbility.addTarget(new TargetCreaturePermanent()); + this.addAbility(loyaltyAbility); + + // -10: Until end of turn, creatures you control gain deathtouch and "Whenever this creature deals damage to an opponent, that player loses the game." + loyaltyAbility = new LoyaltyAbility(new GainAbilityControlledEffect(DeathtouchAbility.getInstance(), Duration.EndOfTurn) + .setText("Until end of turn, creatures you control gain deathtouch"), -10); + TriggeredAbility triggeredAbility = new DealsCombatDamageToAPlayerTriggeredAbility(new LoseGameTargetPlayerEffect(), false, true, true); + loyaltyAbility.addEffect(new GainAbilityControlledEffect(triggeredAbility, Duration.EndOfTurn) + .setText("and \"Whenever this creature deals damage to an opponent, that player loses the game.\"")); + this.addAbility(loyaltyAbility); + } + + public VraskaSchemingGorgon(final VraskaSchemingGorgon card) { + super(card); + } + + @Override + public VraskaSchemingGorgon copy() { + return new VraskaSchemingGorgon(this); + } +} diff --git a/Mage.Sets/src/mage/cards/v/VraskasConquistador.java b/Mage.Sets/src/mage/cards/v/VraskasConquistador.java new file mode 100644 index 00000000000..95c9dbc2c12 --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/VraskasConquistador.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.cards.v; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.TriggeredAbility; +import mage.abilities.common.AttacksOrBlocksTriggeredAbility; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.decorator.ConditionalTriggeredAbility; +import mage.abilities.effects.common.GainLifeEffect; +import mage.abilities.effects.common.LoseLifeTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetOpponent; + +/** + * + * @author LevelX2 + */ +public class VraskasConquistador extends CardImpl { + + private static final FilterControlledPermanent filter = new FilterControlledPermanent(); + + static { + filter.add(new CardTypePredicate(CardType.PLANESWALKER)); + filter.add(new SubtypePredicate(SubType.VRASKA)); + } + + public VraskasConquistador(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{1}{B}"); + + this.subtype.add(SubType.VAMPIRE); + this.subtype.add(SubType.SOLDIER); + this.power = new MageInt(2); + this.toughness = new MageInt(1); + + // Whenever Vraska's Conquistador attacks or blocks, if you control a Vraska planeswalker, target opponent loses 2 life and you gain 2 life. + TriggeredAbility ability = new AttacksOrBlocksTriggeredAbility(new LoseLifeTargetEffect(2), false); + ability.addEffect(new GainLifeEffect(2).setText("and you gain 2 life")); + ability.addTarget(new TargetOpponent()); + this.addAbility(new ConditionalTriggeredAbility( + ability, new PermanentsOnTheBattlefieldCondition(filter), + "Whenever {this} attacks or blocks, if you control a Vraska planeswalker, target opponent loses 2 life and you gain 2 life.")); + } + + public VraskasConquistador(final VraskasConquistador card) { + super(card); + } + + @Override + public VraskasConquistador copy() { + return new VraskasConquistador(this); + } +} diff --git a/Mage.Sets/src/mage/cards/v/VraskasScorn.java b/Mage.Sets/src/mage/cards/v/VraskasScorn.java new file mode 100644 index 00000000000..b99ce79d7fe --- /dev/null +++ b/Mage.Sets/src/mage/cards/v/VraskasScorn.java @@ -0,0 +1,72 @@ +/* + * 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.v; + +import java.util.UUID; +import mage.abilities.effects.common.LoseLifeTargetEffect; +import mage.abilities.effects.common.search.SearchLibraryGraveyardPutInHandEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.NamePredicate; +import mage.target.common.TargetOpponent; + +/** + * + * @author LevelX2 + */ +public class VraskasScorn extends CardImpl { + + private final static FilterCard filter = new FilterCard("Vraska, Scheming Gorgon"); + + static { + filter.add(new NamePredicate(filter.getMessage())); + } + + public VraskasScorn(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{B}{B}"); + + // Target opponent loses 4 life. + this.getSpellAbility().addEffect(new LoseLifeTargetEffect(4)); + this.getSpellAbility().addTarget(new TargetOpponent()); + + // You may search your library and/or graveyard for a card named Vraska, Scheming Gorgon, reveal it, and put it into your hand. If you search your library this way, shuffle it. + this.getSpellAbility().addEffect(new SearchLibraryGraveyardPutInHandEffect(filter) + .setText("You may search your library and/or graveyard for a card named Vraska, Scheming Gorgon, reveal it, and put it into your hand. If you search your library this way, shuffle it")); + } + + public VraskasScorn(final VraskasScorn card) { + super(card); + } + + @Override + public VraskasScorn copy() { + return new VraskasScorn(this); + } +} diff --git a/Mage.Sets/src/mage/sets/RivalsOfIxalan.java b/Mage.Sets/src/mage/sets/RivalsOfIxalan.java index 2274507ae97..1ae458ab901 100644 --- a/Mage.Sets/src/mage/sets/RivalsOfIxalan.java +++ b/Mage.Sets/src/mage/sets/RivalsOfIxalan.java @@ -56,6 +56,7 @@ public class RivalsOfIxalan extends ExpansionSet { this.ratioBoosterMythic = 8; cards.add(new SetCardInfo("Angrath's Ambusher", 202, Rarity.UNCOMMON, mage.cards.a.AngrathsAmbusher.class)); + cards.add(new SetCardInfo("Angrath's Fury", 204, Rarity.RARE, mage.cards.a.AngrathsFury.class)); cards.add(new SetCardInfo("Angrath, Minotaur Pirate", 201, Rarity.MYTHIC, mage.cards.a.AngrathMinotaurPirate.class)); cards.add(new SetCardInfo("Brass's Bounty", 94, Rarity.RARE, mage.cards.b.BrasssBounty.class)); cards.add(new SetCardInfo("Cinder Barrens", 205, Rarity.RARE, mage.cards.c.CinderBarrens.class)); @@ -63,7 +64,12 @@ public class RivalsOfIxalan extends ExpansionSet { cards.add(new SetCardInfo("Ghalta, Primal Hunger", 130, Rarity.RARE, mage.cards.g.GhaltaPrimalHunger.class)); cards.add(new SetCardInfo("Silvergill Adept", 53, Rarity.UNCOMMON, mage.cards.s.SilvergillAdept.class)); cards.add(new SetCardInfo("Storm the Vault", 173, Rarity.RARE, mage.cards.s.StormTheVault.class)); + cards.add(new SetCardInfo("Swab Goblin", 203, Rarity.COMMON, mage.cards.s.SwabGoblin.class)); + cards.add(new SetCardInfo("Vampire Champion", 198, Rarity.COMMON, mage.cards.v.VampireChampion.class)); cards.add(new SetCardInfo("Vault of Catlacan", 173, Rarity.RARE, mage.cards.v.VaultOfCatlacan.class)); cards.add(new SetCardInfo("Vona's Hunger", 90, Rarity.RARE, mage.cards.v.VonasHunger.class)); + cards.add(new SetCardInfo("Vraska's Conquistador", 199, Rarity.UNCOMMON, mage.cards.v.VraskasConquistador.class)); + cards.add(new SetCardInfo("Vraska's Scorn", 200, Rarity.RARE, mage.cards.v.VraskasScorn.class)); + cards.add(new SetCardInfo("Vraska, Scheming Gorgon", 197, Rarity.MYTHIC, mage.cards.v.VraskaSchemingGorgon.class)); } } diff --git a/Mage/src/main/java/mage/abilities/common/DealsCombatDamageToAPlayerTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/DealsCombatDamageToAPlayerTriggeredAbility.java index c13f59afbbd..392df68ec1f 100644 --- a/Mage/src/main/java/mage/abilities/common/DealsCombatDamageToAPlayerTriggeredAbility.java +++ b/Mage/src/main/java/mage/abilities/common/DealsCombatDamageToAPlayerTriggeredAbility.java @@ -33,6 +33,7 @@ import mage.constants.Zone; import mage.game.Game; import mage.game.events.DamagedPlayerEvent; import mage.game.events.GameEvent; +import mage.players.Player; import mage.target.targetpointer.FixedTarget; /** @@ -43,14 +44,20 @@ public class DealsCombatDamageToAPlayerTriggeredAbility extends TriggeredAbility protected boolean setTargetPointer; protected String text; + protected boolean onlyOpponents; public DealsCombatDamageToAPlayerTriggeredAbility(Effect effect, boolean optional) { this(effect, optional, false); } public DealsCombatDamageToAPlayerTriggeredAbility(Effect effect, boolean optional, boolean setTargetPointer) { + this(effect, optional, setTargetPointer, false); + } + + public DealsCombatDamageToAPlayerTriggeredAbility(Effect effect, boolean optional, boolean setTargetPointer, boolean onlyOpponents) { super(Zone.BATTLEFIELD, effect, optional); this.setTargetPointer = setTargetPointer; + this.onlyOpponents = onlyOpponents; } public DealsCombatDamageToAPlayerTriggeredAbility(Effect effect, boolean optional, String text, boolean setTargetPointer) { @@ -63,6 +70,7 @@ public class DealsCombatDamageToAPlayerTriggeredAbility extends TriggeredAbility super(ability); this.text = ability.text; this.setTargetPointer = ability.setTargetPointer; + this.onlyOpponents = ability.onlyOpponents; } @Override @@ -79,6 +87,12 @@ public class DealsCombatDamageToAPlayerTriggeredAbility extends TriggeredAbility public boolean checkTrigger(GameEvent event, Game game) { if (event.getSourceId().equals(getSourceId()) && ((DamagedPlayerEvent) event).isCombatDamage()) { + if (onlyOpponents) { + Player controller = game.getPlayer(getControllerId()); + if (controller == null || !controller.hasOpponent(event.getPlayerId(), game)) { + return false; + } + } if (setTargetPointer) { for (Effect effect : this.getAllEffects()) { effect.setTargetPointer(new FixedTarget(event.getPlayerId())); @@ -93,7 +107,7 @@ public class DealsCombatDamageToAPlayerTriggeredAbility extends TriggeredAbility @Override public String getRule() { if (text == null || text.isEmpty()) { - return "Whenever {this} deals combat damage to a player, " + super.getRule(); + return "Whenever {this} deals combat damage to " + (onlyOpponents ? "an opponent, " : "a player, ") + super.getRule(); } return text; } diff --git a/Mage/src/main/java/mage/abilities/effects/Effect.java b/Mage/src/main/java/mage/abilities/effects/Effect.java index 17234c7f9dc..fc98f40a947 100644 --- a/Mage/src/main/java/mage/abilities/effects/Effect.java +++ b/Mage/src/main/java/mage/abilities/effects/Effect.java @@ -24,16 +24,15 @@ * 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.abilities.effects; import java.io.Serializable; import java.util.UUID; -import mage.constants.EffectType; -import mage.constants.Outcome; import mage.abilities.Ability; import mage.abilities.Mode; +import mage.constants.EffectType; +import mage.constants.Outcome; import mage.game.Game; import mage.target.targetpointer.TargetPointer; @@ -44,18 +43,31 @@ import mage.target.targetpointer.TargetPointer; public interface Effect extends Serializable { UUID getId(); + void newId(); + String getText(Mode mode); + Effect setText(String staticText); + boolean apply(Game game, Ability source); + Outcome getOutcome(); + void setOutcome(Outcome outcome); + EffectType getEffectType(); - void setTargetPointer(TargetPointer targetPointer); + + Effect setTargetPointer(TargetPointer targetPointer); + TargetPointer getTargetPointer(); + void setValue(String key, Object value); + Object getValue(String key); + void setApplyEffectsAfter(); + boolean applyEffectsAfter(); Effect copy(); diff --git a/Mage/src/main/java/mage/abilities/effects/EffectImpl.java b/Mage/src/main/java/mage/abilities/effects/EffectImpl.java index 91f82ddaa98..ccc7f08f3d8 100644 --- a/Mage/src/main/java/mage/abilities/effects/EffectImpl.java +++ b/Mage/src/main/java/mage/abilities/effects/EffectImpl.java @@ -24,20 +24,18 @@ * 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.abilities.effects; -import mage.constants.EffectType; -import mage.constants.Outcome; -import mage.abilities.MageSingleton; -import mage.abilities.Mode; -import mage.target.targetpointer.FirstTargetPointer; -import mage.target.targetpointer.TargetPointer; - import java.util.HashMap; import java.util.Map; import java.util.UUID; +import mage.abilities.MageSingleton; +import mage.abilities.Mode; +import mage.constants.EffectType; +import mage.constants.Outcome; +import mage.target.targetpointer.FirstTargetPointer; +import mage.target.targetpointer.TargetPointer; /** * @@ -106,8 +104,9 @@ public abstract class EffectImpl implements Effect { } @Override - public void setTargetPointer(TargetPointer targetPointer) { + public Effect setTargetPointer(TargetPointer targetPointer) { this.targetPointer = targetPointer; + return this; } @Override @@ -141,8 +140,8 @@ public abstract class EffectImpl implements Effect { } /** - * If set, the game.applyEffects() method will be called to apply the effects before the - * next effect (of the same ability) will resolve. + * If set, the game.applyEffects() method will be called to apply the + * effects before the next effect (of the same ability) will resolve. */ @Override public void setApplyEffectsAfter() { From 3df4af2104c9ab7f47cf0877f84e11da0f1d1d4c Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 23 Dec 2017 19:27:47 +0100 Subject: [PATCH 118/164] [RIX] Added Tetzimoc, Primal Death. --- .../src/mage/cards/t/TetzimocPrimalDeath.java | 99 +++++++++++++++++++ Mage.Sets/src/mage/sets/RivalsOfIxalan.java | 1 + .../main/java/mage/counters/CounterType.java | 1 + 3 files changed, 101 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/t/TetzimocPrimalDeath.java diff --git a/Mage.Sets/src/mage/cards/t/TetzimocPrimalDeath.java b/Mage.Sets/src/mage/cards/t/TetzimocPrimalDeath.java new file mode 100644 index 00000000000..751f6f6b3aa --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TetzimocPrimalDeath.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.cards.t; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.ActivateIfConditionActivatedAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.condition.common.MyTurnCondition; +import mage.abilities.costs.common.RevealSourceFromYourHandCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.DestroyAllEffect; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.abilities.keyword.DeathtouchAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.SuperType; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.permanent.ControllerPredicate; +import mage.filter.predicate.permanent.CounterPredicate; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class TetzimocPrimalDeath extends CardImpl { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creature your opponents control with a prey counter on it"); + + static { + filter.add(new ControllerPredicate(TargetController.OPPONENT)); + filter.add(new CounterPredicate(CounterType.PREY)); + } + + public TetzimocPrimalDeath(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{B}{B}"); + + this.addSuperType(SuperType.LEGENDARY); + this.subtype.add(SubType.ELDER); + this.subtype.add(SubType.DINOSAUR); + this.power = new MageInt(6); + this.toughness = new MageInt(6); + + // Deathtouch + this.addAbility(DeathtouchAbility.getInstance()); + + // {B}, Reveal Tetzimoc, Primal Death from your hand: Put a prey counter on target creature. Activate this ability only during your turn. + Ability ability = new ActivateIfConditionActivatedAbility(Zone.HAND, new AddCountersTargetEffect(CounterType.PREY.createInstance()), new ManaCostsImpl("{B}"), MyTurnCondition.instance); + ability.addTarget(new TargetCreaturePermanent()); + ability.addCost(new RevealSourceFromYourHandCost()); + this.addAbility(ability); + + // When Tetzimoc, Primal Death enters the battlefield, destroy each creature your opponents control with a prey counter on it. + this.addAbility(new EntersBattlefieldTriggeredAbility( + new DestroyAllEffect(filter).setText("destroy each creature your opponents control with a prey counter on it"), false)); + + } + + public TetzimocPrimalDeath(final TetzimocPrimalDeath card) { + super(card); + } + + @Override + public TetzimocPrimalDeath copy() { + return new TetzimocPrimalDeath(this); + } +} diff --git a/Mage.Sets/src/mage/sets/RivalsOfIxalan.java b/Mage.Sets/src/mage/sets/RivalsOfIxalan.java index 1ae458ab901..07d371a63c5 100644 --- a/Mage.Sets/src/mage/sets/RivalsOfIxalan.java +++ b/Mage.Sets/src/mage/sets/RivalsOfIxalan.java @@ -65,6 +65,7 @@ public class RivalsOfIxalan extends ExpansionSet { cards.add(new SetCardInfo("Silvergill Adept", 53, Rarity.UNCOMMON, mage.cards.s.SilvergillAdept.class)); cards.add(new SetCardInfo("Storm the Vault", 173, Rarity.RARE, mage.cards.s.StormTheVault.class)); cards.add(new SetCardInfo("Swab Goblin", 203, Rarity.COMMON, mage.cards.s.SwabGoblin.class)); + cards.add(new SetCardInfo("Tetzimoc, Primal Death", 86, Rarity.RARE, mage.cards.t.TetzimocPrimalDeath.class)); cards.add(new SetCardInfo("Vampire Champion", 198, Rarity.COMMON, mage.cards.v.VampireChampion.class)); cards.add(new SetCardInfo("Vault of Catlacan", 173, Rarity.RARE, mage.cards.v.VaultOfCatlacan.class)); cards.add(new SetCardInfo("Vona's Hunger", 90, Rarity.RARE, mage.cards.v.VonasHunger.class)); diff --git a/Mage/src/main/java/mage/counters/CounterType.java b/Mage/src/main/java/mage/counters/CounterType.java index 82c783d3a75..769412a3849 100644 --- a/Mage/src/main/java/mage/counters/CounterType.java +++ b/Mage/src/main/java/mage/counters/CounterType.java @@ -107,6 +107,7 @@ public enum CounterType { POLYP("polyp"), POISON("poison"), PRESSURE("pressure"), + PREY("prey"), REPAIR("repair"), QUEST("quest"), SCREAM("scream"), From 3a6974c0b013594a449c6d5f98a832f832465ce2 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 19:42:02 +0100 Subject: [PATCH 119/164] NullPointerException fix --- .../Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java index f281d360e21..b4055ba53f8 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java @@ -489,7 +489,9 @@ public class ComputerPlayer6 extends ComputerPlayer /*implements Player*/ { maxSeconds = 3600; } logger.debug("maxThink: " + maxSeconds + " seconds "); - return task.get(maxSeconds, TimeUnit.SECONDS); + if (task.get(maxSeconds, TimeUnit.SECONDS) != null) { + return task.get(maxSeconds, TimeUnit.SECONDS); + } } catch (TimeoutException e) { logger.info("simulating - timed out"); task.cancel(true); From ab3128975acb158ec1b3b27e7e115ce73295a858 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:01:35 +0100 Subject: [PATCH 120/164] Overflow check methods in CardUtil --- Mage/src/main/java/mage/util/CardUtil.java | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Mage/src/main/java/mage/util/CardUtil.java b/Mage/src/main/java/mage/util/CardUtil.java index 301a26e83f2..bdc5e2a1b52 100644 --- a/Mage/src/main/java/mage/util/CardUtil.java +++ b/Mage/src/main/java/mage/util/CardUtil.java @@ -509,4 +509,24 @@ public final class CardUtil { } } + public static int addWithOverflowCheck(int base, int increment) { + long result = ((long) base) + increment; + if (result > Integer.MAX_VALUE) { + return Integer.MAX_VALUE; + } else if (result < Integer.MIN_VALUE) { + return Integer.MIN_VALUE; + } + return base + increment; + } + + public static int subtractWithOverflowCheck(int base, int decrement) { + long result = ((long) base) - decrement; + if (result > Integer.MAX_VALUE) { + return Integer.MAX_VALUE; + } else if (result < Integer.MIN_VALUE) { + return Integer.MIN_VALUE; + } + return base - decrement; + } + } From 2bb4f07df2a6c1dd7c0f010c9b26fb8a81526af1 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:17:53 +0100 Subject: [PATCH 121/164] CardUtil overflow --- Mage/src/main/java/mage/players/PlayerImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java index a9914519a39..64c9fde58e0 100644 --- a/Mage/src/main/java/mage/players/PlayerImpl.java +++ b/Mage/src/main/java/mage/players/PlayerImpl.java @@ -1760,7 +1760,7 @@ public abstract class PlayerImpl implements Player, Serializable { GameEvent event = new GameEvent(GameEvent.EventType.LOSE_LIFE, playerId, playerId, playerId, amount, atCombat); if (!game.replaceEvent(event)) { // this.life -= event.getAmount(); - this.life = game.subtractWithOverflowCheck(this.life, event.getAmount()); + this.life = CardUtil.subtractWithOverflowCheck(this.life, event.getAmount()); if (!game.isSimulation()) { game.informPlayers(this.getLogName() + " loses " + event.getAmount() + " life"); } @@ -1792,7 +1792,7 @@ public abstract class PlayerImpl implements Player, Serializable { // TODO: lock life at Integer.MAX_VALUE if reached, until it's set to a different amount // (https://magic.wizards.com/en/articles/archive/news/unstable-faqawaslfaqpaftidawabiajtbt-2017-12-06 - "infinite" life total stays infinite no matter how much is gained or lost) // this.life += event.getAmount(); - this.life = game.addWithOverflowCheck(this.life, event.getAmount()); + this.life = CardUtil.addWithOverflowCheck(this.life, event.getAmount()); if (!game.isSimulation()) { game.informPlayers(this.getLogName() + " gains " + event.getAmount() + " life"); } From 88e421918e7b8306a49ac63a8ba0f601aa77877c Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:19:33 +0100 Subject: [PATCH 122/164] CardUtil overflow --- Mage/src/main/java/mage/game/permanent/PermanentImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java index 34659ec7841..95c27b3c634 100644 --- a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java +++ b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java @@ -56,6 +56,7 @@ import mage.game.permanent.token.SquirrelToken; import mage.game.stack.Spell; import mage.game.stack.StackObject; import mage.players.Player; +import mage.util.CardUtil; import mage.util.GameLog; import mage.util.ThreadLocalStringBuilder; @@ -888,7 +889,7 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { } } else { // this.damage += actualDamage; - this.damage = game.addWithOverflowCheck(this.damage, actualDamage); + this.damage = CardUtil.addWithOverflowCheck(this.damage, actualDamage); } game.fireEvent(new DamagedCreatureEvent(objectId, sourceId, controllerId, actualDamage, combat)); return actualDamage; From c9fb762d28d4268295951455a5439572c339b731 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:30:19 +0100 Subject: [PATCH 123/164] CardUtil overflow --- Mage.Sets/src/mage/cards/a/AngrathsMarauders.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/a/AngrathsMarauders.java b/Mage.Sets/src/mage/cards/a/AngrathsMarauders.java index b7d3baf22f0..5c1a49af5e5 100644 --- a/Mage.Sets/src/mage/cards/a/AngrathsMarauders.java +++ b/Mage.Sets/src/mage/cards/a/AngrathsMarauders.java @@ -41,6 +41,7 @@ import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; +import mage.util.CardUtil; /** * @@ -106,7 +107,7 @@ class AngrathsMaraudersEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); + event.setAmount(CardUtil.addWithOverflowCheck(event.getAmount(), event.getAmount())); return false; } } From 6314d0b3584eada9a391bafc8ea513e812c111cf Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:30:52 +0100 Subject: [PATCH 124/164] CardUtil overflow --- Mage.Sets/src/mage/cards/a/AnthemOfRakdos.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/a/AnthemOfRakdos.java b/Mage.Sets/src/mage/cards/a/AnthemOfRakdos.java index 46e3457cb37..c3ec17a4179 100644 --- a/Mage.Sets/src/mage/cards/a/AnthemOfRakdos.java +++ b/Mage.Sets/src/mage/cards/a/AnthemOfRakdos.java @@ -44,6 +44,7 @@ import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; +import mage.util.CardUtil; /** * @author JotaPeRL @@ -110,7 +111,7 @@ class AnthemOfRakdosHellbentEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); + event.setAmount(CardUtil.addWithOverflowCheck(event.getAmount(), event.getAmount())); return false; } } From 51431c4e1b67f5c4a95285aed3e4e67ec2bab3c6 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:31:38 +0100 Subject: [PATCH 125/164] CardUtil overflow --- Mage.Sets/src/mage/cards/b/BitterFeud.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/b/BitterFeud.java b/Mage.Sets/src/mage/cards/b/BitterFeud.java index e97d01e2306..e7d64955514 100644 --- a/Mage.Sets/src/mage/cards/b/BitterFeud.java +++ b/Mage.Sets/src/mage/cards/b/BitterFeud.java @@ -47,6 +47,7 @@ import mage.game.permanent.Permanent; import mage.game.stack.StackObject; import mage.players.Player; import mage.target.TargetPlayer; +import mage.util.CardUtil; /** * @@ -194,7 +195,7 @@ class BitterFeudEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); + event.setAmount(CardUtil.addWithOverflowCheck(event.getAmount(), event.getAmount())); return false; } } From ae6eb7f19eae062d80fef4ffd52b96b9d3bbcdce Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:32:47 +0100 Subject: [PATCH 126/164] CardUtil overflow --- Mage.Sets/src/mage/cards/c/CurseOfBloodletting.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/cards/c/CurseOfBloodletting.java b/Mage.Sets/src/mage/cards/c/CurseOfBloodletting.java index 156ef33fa17..14a92b7d164 100644 --- a/Mage.Sets/src/mage/cards/c/CurseOfBloodletting.java +++ b/Mage.Sets/src/mage/cards/c/CurseOfBloodletting.java @@ -27,6 +27,7 @@ */ package mage.cards.c; +import java.util.UUID; import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ReplacementEffectImpl; @@ -39,8 +40,7 @@ import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.target.TargetPlayer; - -import java.util.UUID; +import mage.util.CardUtil; /** * @@ -112,7 +112,7 @@ class CurseOfBloodlettingEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); + event.setAmount(CardUtil.addWithOverflowCheck(event.getAmount(), event.getAmount())); return false; } From efe2331ec4e3a3da05b0f9ac9dbfa2369aef7c9c Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:34:00 +0100 Subject: [PATCH 127/164] CardUtil overflow --- Mage.Sets/src/mage/cards/d/DesperateGambit.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/d/DesperateGambit.java b/Mage.Sets/src/mage/cards/d/DesperateGambit.java index 6e4f4b2f880..3dde02e293d 100644 --- a/Mage.Sets/src/mage/cards/d/DesperateGambit.java +++ b/Mage.Sets/src/mage/cards/d/DesperateGambit.java @@ -49,6 +49,7 @@ import mage.filter.FilterObject; import mage.filter.predicate.permanent.ControllerPredicate; import mage.players.Player; import mage.target.TargetSource; +import mage.util.CardUtil; /** * @@ -129,7 +130,7 @@ class DesperateGambitEffect extends PreventionEffectImpl { if (controller != null && object != null) { if (super.applies(event, source, game) && event instanceof DamageEvent && event.getAmount() > 0) { if (wonFlip) { - event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); + event.setAmount(CardUtil.addWithOverflowCheck(event.getAmount(), event.getAmount())); this.discard(); } else { preventDamageAction(event, source, game); From 4f8bcc3ce6a9c0dbb990ccc8bd8d30c2a5e3182a Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:35:13 +0100 Subject: [PATCH 128/164] CardUtil overflow --- Mage.Sets/src/mage/cards/d/DictateOfTheTwinGods.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/cards/d/DictateOfTheTwinGods.java b/Mage.Sets/src/mage/cards/d/DictateOfTheTwinGods.java index bdc2dac7a71..8b57e8b53a2 100644 --- a/Mage.Sets/src/mage/cards/d/DictateOfTheTwinGods.java +++ b/Mage.Sets/src/mage/cards/d/DictateOfTheTwinGods.java @@ -44,6 +44,7 @@ import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; import mage.game.permanent.Permanent; import mage.players.Player; +import mage.util.CardUtil; /** * @@ -115,13 +116,13 @@ class DictateOfTheTwinGodsEffect extends ReplacementEffectImpl { if (damageEvent.getType() == EventType.DAMAGE_PLAYER) { Player targetPlayer = game.getPlayer(event.getTargetId()); if (targetPlayer != null) { - targetPlayer.damage(game.addWithOverflowCheck(damageEvent.getAmount(), damageEvent.getAmount()), damageEvent.getSourceId(), game, damageEvent.isCombatDamage(), damageEvent.isPreventable(), event.getAppliedEffects()); + targetPlayer.damage(CardUtil.addWithOverflowCheck(damageEvent.getAmount(), damageEvent.getAmount()), damageEvent.getSourceId(), game, damageEvent.isCombatDamage(), damageEvent.isPreventable(), event.getAppliedEffects()); return true; } } else { Permanent targetPermanent = game.getPermanent(event.getTargetId()); if (targetPermanent != null) { - targetPermanent.damage(game.addWithOverflowCheck(damageEvent.getAmount(), damageEvent.getAmount()), damageEvent.getSourceId(), game, damageEvent.isCombatDamage(), damageEvent.isPreventable(), event.getAppliedEffects()); + targetPermanent.damage(CardUtil.addWithOverflowCheck(damageEvent.getAmount(), damageEvent.getAmount()), damageEvent.getSourceId(), game, damageEvent.isCombatDamage(), damageEvent.isPreventable(), event.getAppliedEffects()); return true; } } From 43cffd10549696fe8e7e44f4a06730f182bf251b Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:37:10 +0100 Subject: [PATCH 129/164] CardUtil overflow --- Mage.Sets/src/mage/cards/d/Dracoplasm.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/cards/d/Dracoplasm.java b/Mage.Sets/src/mage/cards/d/Dracoplasm.java index 48d56455f1f..1ccf4cfbe01 100644 --- a/Mage.Sets/src/mage/cards/d/Dracoplasm.java +++ b/Mage.Sets/src/mage/cards/d/Dracoplasm.java @@ -50,6 +50,7 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.Target; import mage.target.common.TargetControlledPermanent; +import mage.util.CardUtil; /** * @@ -131,8 +132,8 @@ class DracoplasmEffect extends ReplacementEffectImpl { for (UUID targetId : target.getTargets()) { Permanent targetCreature = game.getPermanent(targetId); if (targetCreature != null && targetCreature.sacrifice(source.getSourceId(), game)) { - power = game.addWithOverflowCheck(power, targetCreature.getPower().getValue()); - toughness = game.addWithOverflowCheck(toughness, targetCreature.getToughness().getValue()); + power = CardUtil.addWithOverflowCheck(power, targetCreature.getPower().getValue()); + toughness = CardUtil.addWithOverflowCheck(toughness, targetCreature.getToughness().getValue()); } } ContinuousEffect effect = new SetPowerToughnessSourceEffect(power, toughness, Duration.Custom, SubLayer.SetPT_7b); From 331428b1aeee9cac2d19afbaa6ab838bc991a76e Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:37:51 +0100 Subject: [PATCH 130/164] CardUtil overflow --- Mage.Sets/src/mage/cards/e/EmbermawHellion.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/e/EmbermawHellion.java b/Mage.Sets/src/mage/cards/e/EmbermawHellion.java index d56d7c9a1c6..9a7957cf5f3 100644 --- a/Mage.Sets/src/mage/cards/e/EmbermawHellion.java +++ b/Mage.Sets/src/mage/cards/e/EmbermawHellion.java @@ -44,6 +44,7 @@ import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; +import mage.util.CardUtil; /** * @@ -120,7 +121,7 @@ class EmbermawHellionEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(game.addWithOverflowCheck(event.getAmount(), 1)); + event.setAmount(CardUtil.addWithOverflowCheck(event.getAmount(), 1)); return false; } From a35ee6837f37ba17e55df027540940aab5a7eb52 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:38:52 +0100 Subject: [PATCH 131/164] CardUtil overflow --- Mage.Sets/src/mage/cards/f/FarrelsMantle.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/f/FarrelsMantle.java b/Mage.Sets/src/mage/cards/f/FarrelsMantle.java index b2eee44e85f..e24f2981817 100644 --- a/Mage.Sets/src/mage/cards/f/FarrelsMantle.java +++ b/Mage.Sets/src/mage/cards/f/FarrelsMantle.java @@ -48,6 +48,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.TargetPermanent; import mage.target.common.TargetCreaturePermanent; +import mage.util.CardUtil; /** * @@ -126,7 +127,7 @@ class FarrelsMantleEffect extends OneShotEffect{ @Override public boolean apply(Game game, Ability source) { Permanent perm = game.getPermanent(source.getSourceId()); - int damage = game.addWithOverflowCheck(perm.getPower().getValue(), 2); + int damage = CardUtil.addWithOverflowCheck(perm.getPower().getValue(), 2); DamageTargetEffect dmgEffect = new DamageTargetEffect(damage); return dmgEffect.apply(game, source); } From c0423d96562ebd4ae1efe5aa24f283d1eed5a28a Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:39:45 +0100 Subject: [PATCH 132/164] CardUtil overflow --- Mage.Sets/src/mage/cards/f/FireServant.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/f/FireServant.java b/Mage.Sets/src/mage/cards/f/FireServant.java index b084bb2631d..2349f1b97b0 100644 --- a/Mage.Sets/src/mage/cards/f/FireServant.java +++ b/Mage.Sets/src/mage/cards/f/FireServant.java @@ -43,6 +43,7 @@ import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.stack.StackObject; +import mage.util.CardUtil; /** * @@ -111,7 +112,7 @@ class FireServantEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); + event.setAmount(CardUtil.addWithOverflowCheck(event.getAmount(), event.getAmount())); return false; } From 8acc38e24c7041a5d02342d3f54f18a48693a76b Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:40:51 +0100 Subject: [PATCH 133/164] CardUtil overflow --- Mage.Sets/src/mage/cards/f/FurnaceOfRath.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/f/FurnaceOfRath.java b/Mage.Sets/src/mage/cards/f/FurnaceOfRath.java index 41e06785d73..9b8d485b31b 100644 --- a/Mage.Sets/src/mage/cards/f/FurnaceOfRath.java +++ b/Mage.Sets/src/mage/cards/f/FurnaceOfRath.java @@ -39,6 +39,7 @@ import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; +import mage.util.CardUtil; /** * @@ -99,7 +100,7 @@ class FurnaceOfRathEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); + event.setAmount(CardUtil.addWithOverflowCheck(event.getAmount(), event.getAmount())); return false; } } From 8ea40bc385c929fcd7917586391b90a08b7c6166 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:41:44 +0100 Subject: [PATCH 134/164] CardUtil overflow --- Mage.Sets/src/mage/cards/g/GiselaBladeOfGoldnight.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/cards/g/GiselaBladeOfGoldnight.java b/Mage.Sets/src/mage/cards/g/GiselaBladeOfGoldnight.java index ff0cd7caa0c..812edd6216d 100644 --- a/Mage.Sets/src/mage/cards/g/GiselaBladeOfGoldnight.java +++ b/Mage.Sets/src/mage/cards/g/GiselaBladeOfGoldnight.java @@ -41,6 +41,7 @@ import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; import mage.game.permanent.Permanent; +import mage.util.CardUtil; /** * @author noxx @@ -124,7 +125,7 @@ class GiselaBladeOfGoldnightDoubleDamageEffect extends ReplacementEffectImpl { if (event.getTargetId().equals(source.getControllerId())) { preventDamage(event, source, source.getControllerId(), game); } else if (game.getOpponents(source.getControllerId()).contains(event.getTargetId())) { - event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); + event.setAmount(CardUtil.addWithOverflowCheck(event.getAmount(), event.getAmount())); } break; case DAMAGE_CREATURE: @@ -134,7 +135,7 @@ class GiselaBladeOfGoldnightDoubleDamageEffect extends ReplacementEffectImpl { if (permanent.getControllerId().equals(source.getControllerId())) { preventDamage(event, source, permanent.getId(), game); } else if (game.getOpponents(source.getControllerId()).contains(permanent.getControllerId())) { - event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); + event.setAmount(CardUtil.addWithOverflowCheck(event.getAmount(), event.getAmount())); } } } From fbe280bf91154869cdc2a1893d4adfc1b0916d49 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:43:12 +0100 Subject: [PATCH 135/164] CardUtil overflow --- Mage.Sets/src/mage/cards/g/GoldnightCastigator.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Mage.Sets/src/mage/cards/g/GoldnightCastigator.java b/Mage.Sets/src/mage/cards/g/GoldnightCastigator.java index b461de60e8e..5f173392257 100644 --- a/Mage.Sets/src/mage/cards/g/GoldnightCastigator.java +++ b/Mage.Sets/src/mage/cards/g/GoldnightCastigator.java @@ -45,6 +45,7 @@ import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; import mage.game.permanent.Permanent; +import mage.util.CardUtil; /** * @@ -118,14 +119,14 @@ class GoldnightCastigatorDoubleDamageEffect extends ReplacementEffectImpl { switch (event.getType()) { case DAMAGE_PLAYER: if (event.getTargetId().equals(source.getControllerId())) { - event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); + event.setAmount(CardUtil.addWithOverflowCheck(event.getAmount(), event.getAmount())); } break; case DAMAGE_CREATURE: Permanent permanent = game.getPermanent(event.getTargetId()); if (permanent != null) { if (permanent.getId().equals(source.getSourceId())) { - event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); + event.setAmount(CardUtil.addWithOverflowCheck(event.getAmount(), event.getAmount())); } } } From 17e5bbbd5450ff2cc39b1b4581a36492c53c65d3 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:43:57 +0100 Subject: [PATCH 136/164] CardUtil overflow --- Mage.Sets/src/mage/cards/g/GratuitousViolence.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/g/GratuitousViolence.java b/Mage.Sets/src/mage/cards/g/GratuitousViolence.java index 7dab860ff64..dea9322ecda 100644 --- a/Mage.Sets/src/mage/cards/g/GratuitousViolence.java +++ b/Mage.Sets/src/mage/cards/g/GratuitousViolence.java @@ -40,6 +40,7 @@ import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; +import mage.util.CardUtil; /** * @@ -106,7 +107,7 @@ class GratuitousViolenceReplacementEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); + event.setAmount(CardUtil.addWithOverflowCheck(event.getAmount(), event.getAmount())); return false; } } From 67d495e1cebe88f40ef50a180284926dbc1aac10 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:45:21 +0100 Subject: [PATCH 137/164] CardUtil overflow --- Mage.Sets/src/mage/cards/i/ImpulsiveManeuvers.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/i/ImpulsiveManeuvers.java b/Mage.Sets/src/mage/cards/i/ImpulsiveManeuvers.java index 7fc226aa004..d94fce17a22 100644 --- a/Mage.Sets/src/mage/cards/i/ImpulsiveManeuvers.java +++ b/Mage.Sets/src/mage/cards/i/ImpulsiveManeuvers.java @@ -46,6 +46,7 @@ import mage.game.permanent.Permanent; import mage.filter.StaticFilters; import mage.filter.predicate.permanent.ControllerPredicate; import mage.players.Player; +import mage.util.CardUtil; /** * @@ -121,7 +122,7 @@ class ImpulsiveManeuversEffect extends PreventionEffectImpl { DamageEvent damageEvent = (DamageEvent) event; if (damageEvent.isCombatDamage()) { if (wonFlip) { - event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); + event.setAmount(CardUtil.addWithOverflowCheck(event.getAmount(), event.getAmount())); this.discard(); } else { preventDamageAction(event, source, game); From a098b12d3c6f104d6ab745043ba8a92e13d6d12d Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:46:28 +0100 Subject: [PATCH 138/164] CardUtil overflow --- Mage.Sets/src/mage/cards/i/InquisitorsFlail.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/i/InquisitorsFlail.java b/Mage.Sets/src/mage/cards/i/InquisitorsFlail.java index 7cb40b89162..9b9d3189d19 100644 --- a/Mage.Sets/src/mage/cards/i/InquisitorsFlail.java +++ b/Mage.Sets/src/mage/cards/i/InquisitorsFlail.java @@ -45,6 +45,7 @@ import mage.game.events.DamageCreatureEvent; import mage.game.events.DamageEvent; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; +import mage.util.CardUtil; /** * @author nantuko @@ -126,7 +127,7 @@ class InquisitorsFlailEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); + event.setAmount(CardUtil.addWithOverflowCheck(event.getAmount(), event.getAmount())); return false; } From b10bb83727c5c9a03b4b5bb8506eda26d392d7be Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:47:24 +0100 Subject: [PATCH 139/164] CardUtil overflow --- Mage.Sets/src/mage/cards/i/InsultInjury.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/i/InsultInjury.java b/Mage.Sets/src/mage/cards/i/InsultInjury.java index 3e22fc7d0da..7ecd9561c18 100644 --- a/Mage.Sets/src/mage/cards/i/InsultInjury.java +++ b/Mage.Sets/src/mage/cards/i/InsultInjury.java @@ -19,6 +19,7 @@ import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.TargetPlayer; import mage.target.common.TargetCreaturePermanent; +import mage.util.CardUtil; /** * @author Stravant @@ -88,7 +89,7 @@ class InsultDoubleDamageEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); + event.setAmount(CardUtil.addWithOverflowCheck(event.getAmount(), event.getAmount())); return false; } } From 2643f552e4c6f9dacb51978c9401486a20bae0ba Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:49:39 +0100 Subject: [PATCH 140/164] CardUtil overflow --- Mage.Sets/src/mage/cards/o/Overblaze.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Mage.Sets/src/mage/cards/o/Overblaze.java b/Mage.Sets/src/mage/cards/o/Overblaze.java index 836f1d1fce1..db7811c296c 100644 --- a/Mage.Sets/src/mage/cards/o/Overblaze.java +++ b/Mage.Sets/src/mage/cards/o/Overblaze.java @@ -27,6 +27,7 @@ */ package mage.cards.o; +import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.ReplacementEffectImpl; import mage.abilities.keyword.SpliceOntoArcaneAbility; @@ -39,8 +40,7 @@ import mage.constants.SubType; import mage.game.Game; import mage.game.events.GameEvent; import mage.target.TargetPermanent; - -import java.util.UUID; +import mage.util.CardUtil; /** * @@ -104,7 +104,7 @@ class FireServantEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); + event.setAmount(CardUtil.addWithOverflowCheck(event.getAmount(), event.getAmount())); return false; } From c7db369effdca082d0284b11be0bbf9f5d0e6651 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:50:52 +0100 Subject: [PATCH 141/164] CardUtil overflow --- Mage.Sets/src/mage/cards/p/Phthisis.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/p/Phthisis.java b/Mage.Sets/src/mage/cards/p/Phthisis.java index b3c8fff54b1..c60f351223d 100644 --- a/Mage.Sets/src/mage/cards/p/Phthisis.java +++ b/Mage.Sets/src/mage/cards/p/Phthisis.java @@ -40,6 +40,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetCreaturePermanent; +import mage.util.CardUtil; /** * @@ -91,7 +92,7 @@ class PhthisisEffect extends OneShotEffect { if (creature != null) { Player controller = game.getPlayer(creature.getControllerId()); if (controller != null) { - int lifeLoss = game.addWithOverflowCheck(creature.getPower().getValue(), creature.getToughness().getValue()); + int lifeLoss = CardUtil.addWithOverflowCheck(creature.getPower().getValue(), creature.getToughness().getValue()); creature.destroy(source.getSourceId(), game, false); // the life loss happens also if the creature is indestructible or regenerated (legal targets) controller.loseLife(lifeLoss, game, false); From 34282dbd724789d31964c2803349cf7d17c8f0a4 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:51:41 +0100 Subject: [PATCH 142/164] CardUtil overflow --- Mage.Sets/src/mage/cards/p/PredatorsRapport.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/p/PredatorsRapport.java b/Mage.Sets/src/mage/cards/p/PredatorsRapport.java index 989e0258ed3..4374bbf5347 100644 --- a/Mage.Sets/src/mage/cards/p/PredatorsRapport.java +++ b/Mage.Sets/src/mage/cards/p/PredatorsRapport.java @@ -38,6 +38,7 @@ import mage.constants.CardType; import mage.game.Game; import mage.game.permanent.Permanent; import mage.target.common.TargetControlledCreaturePermanent; +import mage.util.CardUtil; /** * @@ -72,7 +73,7 @@ class TargetPermanentPowerPlusToughnessCount implements DynamicValue { public int calculate(Game game, Ability sourceAbility, Effect effect) { Permanent sourcePermanent = game.getPermanent(sourceAbility.getFirstTarget()); if (sourcePermanent != null) { - return game.addWithOverflowCheck(sourcePermanent.getPower().getValue(), sourcePermanent.getToughness().getValue()); + return CardUtil.addWithOverflowCheck(sourcePermanent.getPower().getValue(), sourcePermanent.getToughness().getValue()); } return 0; } From 88e89b1f7814c385684d260630d8965c4d393b8a Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:52:54 +0100 Subject: [PATCH 143/164] CardUtil overflow --- Mage.Sets/src/mage/cards/p/PyromancersGauntlet.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/p/PyromancersGauntlet.java b/Mage.Sets/src/mage/cards/p/PyromancersGauntlet.java index 7f9cdbe2025..1282b111719 100644 --- a/Mage.Sets/src/mage/cards/p/PyromancersGauntlet.java +++ b/Mage.Sets/src/mage/cards/p/PyromancersGauntlet.java @@ -42,6 +42,7 @@ import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.game.stack.Spell; +import mage.util.CardUtil; /** * @@ -103,7 +104,7 @@ class PyromancersGauntletReplacementEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(game.addWithOverflowCheck(event.getAmount(), 2)); + event.setAmount(CardUtil.addWithOverflowCheck(event.getAmount(), 2)); return false; } From 628ae05f54a38594fbad9e3cbf218161f82a33f0 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:53:27 +0100 Subject: [PATCH 144/164] CardUtil overflow --- Mage.Sets/src/mage/cards/p/PyromancersSwath.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/p/PyromancersSwath.java b/Mage.Sets/src/mage/cards/p/PyromancersSwath.java index 4e012805316..933c587e750 100644 --- a/Mage.Sets/src/mage/cards/p/PyromancersSwath.java +++ b/Mage.Sets/src/mage/cards/p/PyromancersSwath.java @@ -39,6 +39,7 @@ import mage.cards.CardSetInfo; import mage.constants.*; import mage.game.Game; import mage.game.events.GameEvent; +import mage.util.CardUtil; /** * @@ -105,7 +106,7 @@ class PyromancersSwathReplacementEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(game.addWithOverflowCheck(event.getAmount(), 2)); + event.setAmount(CardUtil.addWithOverflowCheck(event.getAmount(), 2)); return false; } From 6dc7d6e403236be19d2c62e45f9558db0d694c4b Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:54:12 +0100 Subject: [PATCH 145/164] CardUtil overflow --- Mage.Sets/src/mage/cards/q/QuestForPureFlame.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/q/QuestForPureFlame.java b/Mage.Sets/src/mage/cards/q/QuestForPureFlame.java index 90cf5b24b1d..de563d27acc 100644 --- a/Mage.Sets/src/mage/cards/q/QuestForPureFlame.java +++ b/Mage.Sets/src/mage/cards/q/QuestForPureFlame.java @@ -45,6 +45,7 @@ import mage.counters.CounterType; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; +import mage.util.CardUtil; /** * @@ -137,7 +138,7 @@ class QuestForPureFlameEffect extends ReplacementEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { - event.setAmount(game.addWithOverflowCheck(event.getAmount(), event.getAmount())); + event.setAmount(CardUtil.addWithOverflowCheck(event.getAmount(), event.getAmount())); return false; } } From 2174f4d303b156a35b25c772f2598432ece62780 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:55:39 +0100 Subject: [PATCH 146/164] CardUtil overflow --- Mage.Sets/src/mage/cards/s/Sentinel.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/s/Sentinel.java b/Mage.Sets/src/mage/cards/s/Sentinel.java index d5d2518b1fe..c3c630145d5 100644 --- a/Mage.Sets/src/mage/cards/s/Sentinel.java +++ b/Mage.Sets/src/mage/cards/s/Sentinel.java @@ -51,6 +51,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetCreaturePermanent; +import mage.util.CardUtil; /** * @@ -105,7 +106,7 @@ class SentinelEffect extends OneShotEffect { Player controller = game.getPlayer(source.getControllerId()); Permanent targetPermanent = game.getPermanentOrLKIBattlefield(targetPointer.getFirst(game, source)); if (controller != null && targetPermanent != null) { - int newToughness = game.addWithOverflowCheck(targetPermanent.getPower().getValue(), 1); + int newToughness = CardUtil.addWithOverflowCheck(targetPermanent.getPower().getValue(), 1); game.addEffect(new SetToughnessSourceEffect(new StaticValue(newToughness), Duration.Custom, SubLayer.SetPT_7b), source); return true; } From c4334ef0436227a25885dec3b88d3fbb111e064b Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:58:31 +0100 Subject: [PATCH 147/164] Moved overflow check method to CardUtil --- Mage/src/main/java/mage/game/GameImpl.java | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/Mage/src/main/java/mage/game/GameImpl.java b/Mage/src/main/java/mage/game/GameImpl.java index f755e673343..7b5e10477b5 100644 --- a/Mage/src/main/java/mage/game/GameImpl.java +++ b/Mage/src/main/java/mage/game/GameImpl.java @@ -3000,26 +3000,4 @@ public abstract class GameImpl implements Game, Serializable { fireEvent(new GameEvent(GameEvent.EventType.BECOMES_MONARCH, monarchId, source == null ? null : source.getSourceId(), monarchId)); } } - - @Override - public int addWithOverflowCheck(int base, int increment) { - long result = ((long) base) + increment; - if (result > Integer.MAX_VALUE) { - return Integer.MAX_VALUE; - } else if (result < Integer.MIN_VALUE) { - return Integer.MIN_VALUE; - } - return base + increment; - } - - @Override - public int subtractWithOverflowCheck(int base, int decrement) { - long result = ((long) base) - decrement; - if (result > Integer.MAX_VALUE) { - return Integer.MAX_VALUE; - } else if (result < Integer.MIN_VALUE) { - return Integer.MIN_VALUE; - } - return base - decrement; - } } From 688e0658b7f4e269c4d5ac65144b907572761dc0 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sat, 23 Dec 2017 23:58:40 +0100 Subject: [PATCH 148/164] Moved overflow check method to CardUtil --- Mage/src/main/java/mage/game/Game.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Mage/src/main/java/mage/game/Game.java b/Mage/src/main/java/mage/game/Game.java index af57f22d9c8..3956dd24b7b 100644 --- a/Mage/src/main/java/mage/game/Game.java +++ b/Mage/src/main/java/mage/game/Game.java @@ -466,8 +466,4 @@ public interface Game extends MageItem, Serializable { UUID getMonarchId(); void setMonarchId(Ability source, UUID monarchId); - - int addWithOverflowCheck(int base, int increment); - - int subtractWithOverflowCheck(int base, int decrement); } From c5054e34c7f8214a6a7f29d4f51f7d1960582833 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 24 Dec 2017 00:30:12 +0100 Subject: [PATCH 149/164] Added controller option of applying damage --- Mage.Sets/src/mage/cards/c/ChannelHarm.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Mage.Sets/src/mage/cards/c/ChannelHarm.java b/Mage.Sets/src/mage/cards/c/ChannelHarm.java index df072718ee6..9123edb2340 100644 --- a/Mage.Sets/src/mage/cards/c/ChannelHarm.java +++ b/Mage.Sets/src/mage/cards/c/ChannelHarm.java @@ -41,6 +41,7 @@ import mage.game.Controllable; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; +import mage.players.Player; import mage.target.common.TargetCreaturePermanent; /** @@ -90,11 +91,14 @@ class ChannelHarmEffect extends PreventionEffectImpl { @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { + Player sourceController = game.getPlayer(source.getControllerId()); PreventionEffectData preventionData = preventDamageAction(event, source, game); if (preventionData.getPreventedDamage() > 0) { Permanent targetCreature = game.getPermanent(source.getFirstTarget()); if (targetCreature != null) { - targetCreature.damage(preventionData.getPreventedDamage(), source.getSourceId(), game, false, true); + if (sourceController != null && sourceController.chooseUse(outcome, "Would you like to have " + preventionData.getPreventedDamage() + " damage dealt to " + targetCreature.getLogName() + "?", source, game)) { + targetCreature.damage(preventionData.getPreventedDamage(), source.getSourceId(), game, false, true); + } } } return true; From 6f8aec173d7d91b6ef684882c19b8a8c390cead2 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 24 Dec 2017 00:36:56 +0100 Subject: [PATCH 150/164] [RIX] Added 2 cards. --- Mage.Sets/src/mage/cards/c/CaptainsHook.java | 90 ++++++++++++ .../src/mage/cards/t/TheImmortalSun.java | 129 ++++++++++++++++++ Mage.Sets/src/mage/sets/RivalsOfIxalan.java | 2 + .../effects/common/DestroyEquippedEffect.java | 51 +++++++ 4 files changed, 272 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/c/CaptainsHook.java create mode 100644 Mage.Sets/src/mage/cards/t/TheImmortalSun.java create mode 100644 Mage/src/main/java/mage/abilities/effects/common/DestroyEquippedEffect.java diff --git a/Mage.Sets/src/mage/cards/c/CaptainsHook.java b/Mage.Sets/src/mage/cards/c/CaptainsHook.java new file mode 100644 index 00000000000..20df6b3c6cf --- /dev/null +++ b/Mage.Sets/src/mage/cards/c/CaptainsHook.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.cards.c; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.common.UnattachedTriggeredAbility; +import mage.abilities.costs.mana.GenericManaCost; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.DestroyEquippedEffect; +import mage.abilities.effects.common.continuous.AddCardSubtypeAttachedEffect; +import mage.abilities.effects.common.continuous.BoostEquippedEffect; +import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect; +import mage.abilities.keyword.EquipAbility; +import mage.abilities.keyword.MenaceAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.AttachmentType; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.SubType; +import mage.constants.Zone; + +/** + * + * @author LevelX2 + */ +public class CaptainsHook extends CardImpl { + + public CaptainsHook(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{3}"); + + this.subtype.add(SubType.EQUIPMENT); + + // Equipped creature gets +2/+0 + Effect effect = new BoostEquippedEffect(2, 0); + effect.setText("Equipped creature gets +2/+0"); + Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, effect); + // has menace, + effect = new GainAbilityAttachedEffect(new MenaceAbility(), AttachmentType.EQUIPMENT); + effect.setText(", has menace"); + ability.addEffect(effect); + //, and is a Pirate in addition to its other creature types + effect = new AddCardSubtypeAttachedEffect(SubType.PIRATE, Duration.WhileOnBattlefield, AttachmentType.EQUIPMENT); + effect.setText(", and is a Pirate in addition to its other creature types"); + ability.addEffect(effect); + this.addAbility(ability); + // Whenever Captain's Hook becomes unattached from a permanent, destroy that permanent. + this.addAbility(new UnattachedTriggeredAbility(new DestroyEquippedEffect(), false)); + + // Equip {1} + this.addAbility(new EquipAbility(Outcome.BoostCreature, new GenericManaCost(1))); + } + + public CaptainsHook(final CaptainsHook card) { + super(card); + } + + @Override + public CaptainsHook copy() { + return new CaptainsHook(this); + } +} diff --git a/Mage.Sets/src/mage/cards/t/TheImmortalSun.java b/Mage.Sets/src/mage/cards/t/TheImmortalSun.java new file mode 100644 index 00000000000..96d723723e8 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TheImmortalSun.java @@ -0,0 +1,129 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.t; + +import java.util.Optional; +import java.util.UUID; +import mage.MageObject; +import mage.abilities.Ability; +import mage.abilities.LoyaltyAbility; +import mage.abilities.common.BeginningOfDrawTriggeredAbility; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ContinuousRuleModifyingEffectImpl; +import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.continuous.BoostControlledEffect; +import mage.abilities.effects.common.cost.SpellsCostReductionControllerEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.SuperType; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.FilterCard; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; + +/** + * + * @author LevelX2 + */ +public class TheImmortalSun extends CardImpl { + + public TheImmortalSun(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{6}"); + + this.addSuperType(SuperType.LEGENDARY); + + // Players can't activate loyalty abilities of planeswalkers. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new TheImmortalSunCantActivateEffect())); + // At the beginning of your draw step, draw an additional card. + this.addAbility(new BeginningOfDrawTriggeredAbility(new DrawCardSourceControllerEffect(1), TargetController.YOU, false)); + // Spells you cast cost {1} less to cast. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new SpellsCostReductionControllerEffect(new FilterCard("Spells you cast"), 1))); + // Creatures you control get +1/+1. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new BoostControlledEffect(1, 1, Duration.WhileOnBattlefield))); + } + + public TheImmortalSun(final TheImmortalSun card) { + super(card); + } + + @Override + public TheImmortalSun copy() { + return new TheImmortalSun(this); + } +} + +class TheImmortalSunCantActivateEffect extends ContinuousRuleModifyingEffectImpl { + + public TheImmortalSunCantActivateEffect() { + super(Duration.WhileOnBattlefield, Outcome.Detriment); + staticText = "Players can't activate loyalty abilities of planeswalkers"; + } + + public TheImmortalSunCantActivateEffect(final TheImmortalSunCantActivateEffect effect) { + super(effect); + } + + @Override + public TheImmortalSunCantActivateEffect copy() { + return new TheImmortalSunCantActivateEffect(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 activate loyalty abilities of planeswalkers (" + mageObject.getIdName() + ")."; + } + return null; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (event.getType() == GameEvent.EventType.ACTIVATE_ABILITY) { + Permanent permanent = game.getPermanentOrLKIBattlefield(event.getSourceId()); + if (permanent == null) { + return false; + } + if (permanent.isPlaneswalker()) { + Optional ability = game.getAbility(event.getTargetId(), event.getSourceId()); + return ability.isPresent() && (ability.get() instanceof LoyaltyAbility); + } + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/RivalsOfIxalan.java b/Mage.Sets/src/mage/sets/RivalsOfIxalan.java index 07d371a63c5..710c3994e78 100644 --- a/Mage.Sets/src/mage/sets/RivalsOfIxalan.java +++ b/Mage.Sets/src/mage/sets/RivalsOfIxalan.java @@ -59,6 +59,7 @@ public class RivalsOfIxalan extends ExpansionSet { cards.add(new SetCardInfo("Angrath's Fury", 204, Rarity.RARE, mage.cards.a.AngrathsFury.class)); cards.add(new SetCardInfo("Angrath, Minotaur Pirate", 201, Rarity.MYTHIC, mage.cards.a.AngrathMinotaurPirate.class)); cards.add(new SetCardInfo("Brass's Bounty", 94, Rarity.RARE, mage.cards.b.BrasssBounty.class)); + cards.add(new SetCardInfo("Captain's Hook", 177, Rarity.RARE, mage.cards.c.CaptainsHook.class)); cards.add(new SetCardInfo("Cinder Barrens", 205, Rarity.RARE, mage.cards.c.CinderBarrens.class)); cards.add(new SetCardInfo("Evolving Wilds", 186, Rarity.RARE, mage.cards.e.EvolvingWilds.class)); cards.add(new SetCardInfo("Ghalta, Primal Hunger", 130, Rarity.RARE, mage.cards.g.GhaltaPrimalHunger.class)); @@ -66,6 +67,7 @@ public class RivalsOfIxalan extends ExpansionSet { cards.add(new SetCardInfo("Storm the Vault", 173, Rarity.RARE, mage.cards.s.StormTheVault.class)); cards.add(new SetCardInfo("Swab Goblin", 203, Rarity.COMMON, mage.cards.s.SwabGoblin.class)); cards.add(new SetCardInfo("Tetzimoc, Primal Death", 86, Rarity.RARE, mage.cards.t.TetzimocPrimalDeath.class)); + cards.add(new SetCardInfo("The Immortal Sun", 180, Rarity.MYTHIC, mage.cards.t.TheImmortalSun.class)); cards.add(new SetCardInfo("Vampire Champion", 198, Rarity.COMMON, mage.cards.v.VampireChampion.class)); cards.add(new SetCardInfo("Vault of Catlacan", 173, Rarity.RARE, mage.cards.v.VaultOfCatlacan.class)); cards.add(new SetCardInfo("Vona's Hunger", 90, Rarity.RARE, mage.cards.v.VonasHunger.class)); diff --git a/Mage/src/main/java/mage/abilities/effects/common/DestroyEquippedEffect.java b/Mage/src/main/java/mage/abilities/effects/common/DestroyEquippedEffect.java new file mode 100644 index 00000000000..6d833155850 --- /dev/null +++ b/Mage/src/main/java/mage/abilities/effects/common/DestroyEquippedEffect.java @@ -0,0 +1,51 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package mage.abilities.effects.common; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.OneShotEffect; +import mage.constants.Outcome; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * + * @author LevelX2 + */ +public class DestroyEquippedEffect extends OneShotEffect { + + public DestroyEquippedEffect() { + super(Outcome.DestroyPermanent); + staticText = "destroy that permanent"; + } + + public DestroyEquippedEffect(final DestroyEquippedEffect effect) { + super(effect); + } + + @Override + public DestroyEquippedEffect copy() { + return new DestroyEquippedEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent equipment = game.getPermanent(source.getSourceId()); + if (equipment != null && equipment.getAttachedTo() != null) { + UUID uuid = getTargetPointer().getFirst(game, source); + Permanent permanent = game.getPermanent(uuid); + if (permanent == null) { + permanent = game.getPermanent(equipment.getAttachedTo()); + } + if (permanent != null) { + return permanent.destroy(source.getSourceId(), game, false); + } + } + return false; + } + +} From cfadfe9942ecba5a04c836c23fab542af89b05d2 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 24 Dec 2017 01:07:35 +0100 Subject: [PATCH 151/164] * Fixed a problem that subtypes were still present (e.g. for spell cost reduction) for cards cast face down (fixes #4277). --- .../cards/abilities/keywords/MorphTest.java | 37 +++++++++++++++++++ .../mage/abilities/keyword/MorphAbility.java | 1 + 2 files changed, 38 insertions(+) diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/MorphTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/MorphTest.java index b4a15d9b529..8c8733d57dc 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/MorphTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/MorphTest.java @@ -816,4 +816,41 @@ public class MorphTest extends CardTestPlayerBase { assertPermanentCount(playerA, "", 0); } + + /** + * The Ur-Dragon reduces cost of face down morph Dragons Simple to reproduce + * - Dragons with Morph/Megamorph such as Quicksilver Dragon cost {2} to + * play face-down instead of the normal {3}. Other non-Dragon morph costs + * are unchanged. + */ + @Test + public void testNoCostReductionOfFaceDownCastCreature() { + /* + Quicksilver Dragon {4}{U}{U} + Creature - Dragon + 5/5 + Flying + {U}: If target spell has only one target and that target is Quicksilver Dragon, change that spell's target to another creature. + Morph {4}{U} + */ + addCard(Zone.HAND, playerA, "Quicksilver Dragon"); + addCard(Zone.BATTLEFIELD, playerA, "Island", 3); + + // Eminence - As long as The Ur-Dragon is in the command zone or on the battlefield, other Dragon spells you cast cost {1} less to cast. + // Flying + // Whenever one or more Dragons you control attack, draw that many cards, then you may put a permanent card from your hand onto the battlefield + addCard(Zone.BATTLEFIELD, playerA, "The Ur-Dragon", 1); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Quicksilver Dragon"); + setChoice(playerA, "Yes"); // cast it face down as 2/2 creature + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertPermanentCount(playerA, "", 1); + assertHandCount(playerA, 0); + + assertTappedCount("Island", true, 3); + + } } diff --git a/Mage/src/main/java/mage/abilities/keyword/MorphAbility.java b/Mage/src/main/java/mage/abilities/keyword/MorphAbility.java index dfe545198cd..46714d92439 100644 --- a/Mage/src/main/java/mage/abilities/keyword/MorphAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/MorphAbility.java @@ -230,6 +230,7 @@ public class MorphAbility extends StaticAbility implements AlternativeSourceCost spellColor.setGreen(false); spellColor.setWhite(false); spellColor.setBlue(false); + spell.getSubtype(game).clear(); } else { spell.setFaceDown(false, game); } From 6c93ce9c27d874a1df36693570318bdeae9c46ff Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 24 Dec 2017 11:08:49 +0100 Subject: [PATCH 152/164] * Mox Diamond - Fixed that the handling of token copys (e.g. by Mirrorworks) did not work correctly. --- Mage.Sets/src/mage/cards/m/MoxDiamond.java | 38 +++----- .../mage/test/cards/copy/MirrorworksTest.java | 94 +++++++++++++++++++ 2 files changed, 109 insertions(+), 23 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/copy/MirrorworksTest.java diff --git a/Mage.Sets/src/mage/cards/m/MoxDiamond.java b/Mage.Sets/src/mage/cards/m/MoxDiamond.java index 8049ee94235..adc3c8950ce 100644 --- a/Mage.Sets/src/mage/cards/m/MoxDiamond.java +++ b/Mage.Sets/src/mage/cards/m/MoxDiamond.java @@ -34,7 +34,6 @@ import mage.abilities.costs.Cost; import mage.abilities.costs.common.DiscardTargetCost; import mage.abilities.effects.ReplacementEffectImpl; import mage.abilities.mana.AnyColorManaAbility; -import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -44,7 +43,7 @@ import mage.constants.Zone; import mage.filter.common.FilterLandCard; 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.TargetCardInHand; @@ -55,7 +54,7 @@ import mage.target.common.TargetCardInHand; public class MoxDiamond extends CardImpl { public MoxDiamond(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ARTIFACT},"{0}"); + super(ownerId, setInfo, new CardType[]{CardType.ARTIFACT}, "{0}"); // If Mox Diamond would enter the battlefield, you may discard a land card instead. If you do, put Mox Diamond onto the battlefield. If you don't, put it into its owner's graveyard. this.addAbility(new SimpleStaticAbility(Zone.ALL, new MoxDiamondReplacementEffect())); @@ -95,43 +94,36 @@ class MoxDiamondReplacementEffect extends ReplacementEffectImpl { } @Override - public boolean replaceEvent(GameEvent event, Ability source, Game game) { - Player player = game.getPlayer(source.getControllerId()); - if (player != null){ + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + Player player = game.getPlayer(source.getControllerId()); + if (player != null) { TargetCardInHand target = new TargetCardInHand(new FilterLandCard()); Cost cost = new DiscardTargetCost(target); - if (cost.canPay(source, source.getSourceId(), source.getControllerId(), game) && - player.chooseUse(outcome, "Discard land? (Otherwise Mox Diamond goes to graveyard)", source, game) && - player.chooseTarget(Outcome.Discard, target, source, game)){ + if (cost.canPay(source, source.getSourceId(), source.getControllerId(), game) + && player.chooseUse(outcome, "Discard land? (Otherwise Mox Diamond goes to graveyard)", source, game) + && player.chooseTarget(Outcome.Discard, target, source, game)) { player.discard(game.getCard(target.getFirstTarget()), source, game); return false; - } - else{ - Card card = game.getCard(event.getTargetId()); - if (card != null) { - player.moveCards(card, Zone.GRAVEYARD, source, game); + } else { + Permanent permanent = game.getPermanent(event.getTargetId()); + if (permanent != null) { + player.moveCards(permanent, Zone.GRAVEYARD, source, game); } return true; } - + } return false; } @Override public boolean checksEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.ZONE_CHANGE; + return event.getType() == GameEvent.EventType.ENTERS_THE_BATTLEFIELD; } @Override public boolean applies(GameEvent event, Ability source, Game game) { - if (source.getSourceId().equals(event.getTargetId())) { - ZoneChangeEvent zEvent = (ZoneChangeEvent) event; - if(zEvent.getToZone() == Zone.BATTLEFIELD){ - return true; - } - } - return false; + return source.getSourceId().equals(event.getTargetId()); } } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/copy/MirrorworksTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/copy/MirrorworksTest.java new file mode 100644 index 00000000000..792a371bc99 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/copy/MirrorworksTest.java @@ -0,0 +1,94 @@ +/* + * 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 org.mage.test.cards.copy; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class MirrorworksTest extends CardTestPlayerBase { + + /** + * If you play Mox Diamond, with Mirrorworks in play, and create a token + * copy, and you have no lands in hand, the Mox will enter the battlefield + * as usual instead of the graveyard. + */ + @Test + public void TestCopyWithoutLand() { + addCard(Zone.HAND, playerA, "Mountain", 1); + addCard(Zone.BATTLEFIELD, playerA, "Island", 2); + + // If Mox Diamond would enter the battlefield, you may discard a land card instead. If you do, put Mox Diamond onto the battlefield. If you don't, put it into its owner's graveyard. + // {T}: Add one mana of any color to your mana pool. + addCard(Zone.HAND, playerA, "Mox Diamond", 1); // Artifact {0} + + // Whenever another nontoken artifact enters the battlefield under your control, you may pay {2}. + // If you do, create a token that's a copy of that artifact. + addCard(Zone.BATTLEFIELD, playerA, "Mirrorworks", 1); // Artifact {5} + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Mox Diamond"); + setChoice(playerA, "Yes"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertPermanentCount(playerA, "Mox Diamond", 1); + assertTappedCount("Island", true, 2); + assertGraveyardCount(playerA, "Mountain", 1); + + } + + @Test + public void TestCorrectCopy() { + addCard(Zone.HAND, playerA, "Mountain", 2); + addCard(Zone.BATTLEFIELD, playerA, "Island", 2); + + // If Mox Diamond would enter the battlefield, you may discard a land card instead. If you do, put Mox Diamond onto the battlefield. If you don't, put it into its owner's graveyard. + // {T}: Add one mana of any color to your mana pool. + addCard(Zone.HAND, playerA, "Mox Diamond", 1); // Artifact {0} + + // Whenever another nontoken artifact enters the battlefield under your control, you may pay {2}. + // If you do, create a token that's a copy of that artifact. + addCard(Zone.BATTLEFIELD, playerA, "Mirrorworks", 1); // Artifact {5} + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Mox Diamond"); + setChoice(playerA, "Yes"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertPermanentCount(playerA, "Mox Diamond", 2); + assertGraveyardCount(playerA, "Mountain", 2); + + } +} From 1d2132648ba0e16f557a680a54fd2c7bff3f1d96 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 24 Dec 2017 11:23:33 +0100 Subject: [PATCH 153/164] * Augur of Bolas - Fixed a problem with AI that can't choose the card from libraray. --- Mage.Sets/src/mage/cards/a/AugurOfBolas.java | 5 +-- .../abilities/enters/AugurOfBolasTest.java | 39 +++++++++++++++++++ 2 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/abilities/enters/AugurOfBolasTest.java diff --git a/Mage.Sets/src/mage/cards/a/AugurOfBolas.java b/Mage.Sets/src/mage/cards/a/AugurOfBolas.java index e0e3b2b31dd..5d626a7210f 100644 --- a/Mage.Sets/src/mage/cards/a/AugurOfBolas.java +++ b/Mage.Sets/src/mage/cards/a/AugurOfBolas.java @@ -44,7 +44,6 @@ import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.game.Game; import mage.players.Player; -import mage.target.Target; import mage.target.TargetCard; /** @@ -113,8 +112,8 @@ class AugurOfBolasEffect extends OneShotEffect { if (number == 1) { card = topCards.getCards(new FilterInstantOrSorceryCard(), source.getSourceId(), source.getControllerId(), game).iterator().next(); } else { - Target target = new TargetCard(Zone.LIBRARY, new FilterInstantOrSorceryCard()); - controller.chooseTarget(outcome, target, source, game); + TargetCard target = new TargetCard(Zone.LIBRARY, new FilterInstantOrSorceryCard()); + controller.chooseTarget(outcome, topCards, target, source, game); card = topCards.get(target.getFirstTarget(), game); } if (card != null) { diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/enters/AugurOfBolasTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/enters/AugurOfBolasTest.java new file mode 100644 index 00000000000..f8530873451 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/enters/AugurOfBolasTest.java @@ -0,0 +1,39 @@ +package org.mage.test.cards.abilities.enters; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author LevelX2 + */ +public class AugurOfBolasTest extends CardTestPlayerBase { + + /* + Aether Figment {1}{U} + Creature - Illusion + 1/1 + Kicker {3} (You may pay an additional as you cast this spell.) + Aether Figment can't be blocked. + If Aether Figment was kicked, it enters the battlefield with two +1/+1 counters on it. + */ + @Test + public void testEnteringWithCounters() { + addCard(Zone.LIBRARY, playerA, "Lightning Bolt", 3); + skipInitShuffling(); + addCard(Zone.BATTLEFIELD, playerA, "Island", 2); + // When Augur of Bolas enters the battlefield, look at the top three cards of your library. + // You may reveal an instant or sorcery card from among them and put it into your hand. Put the rest on the bottom of your library in any order. + addCard(Zone.HAND, playerA, "Augur of Bolas"); // Creature {1}{U} + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Augur of Bolas"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertPermanentCount(playerA, "Augur of Bolas", 1); + assertHandCount(playerA, "Lightning Bolt", 1); + } +} From ac7e6e0f86c52837e89f1c377af7b00a9e520e88 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 24 Dec 2017 13:05:28 +0100 Subject: [PATCH 154/164] * Blatant Thievery - Fixed a problem of AI target handling. --- .../src/mage/cards/b/BlatantThievery.java | 131 +++--------------- .../test/multiplayer/BlatantThieveryTest.java | 93 +++++++++++++ 2 files changed, 111 insertions(+), 113 deletions(-) create mode 100644 Mage.Tests/src/test/java/org/mage/test/multiplayer/BlatantThieveryTest.java diff --git a/Mage.Sets/src/mage/cards/b/BlatantThievery.java b/Mage.Sets/src/mage/cards/b/BlatantThievery.java index bd64506d75c..85c0c6b8645 100644 --- a/Mage.Sets/src/mage/cards/b/BlatantThievery.java +++ b/Mage.Sets/src/mage/cards/b/BlatantThievery.java @@ -28,7 +28,6 @@ package mage.cards.b; import java.util.*; -import mage.MageObject; import mage.abilities.Ability; import mage.abilities.SpellAbility; import mage.abilities.effects.ContinuousEffect; @@ -40,8 +39,10 @@ import mage.constants.CardType; import mage.constants.Duration; import mage.constants.Outcome; import mage.filter.FilterPermanent; +import mage.filter.predicate.permanent.ControllerIdPredicate; import mage.game.Game; -import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.Target; import mage.target.TargetPermanent; import mage.target.targetpointer.FixedTarget; @@ -52,7 +53,7 @@ import mage.target.targetpointer.FixedTarget; public class BlatantThievery extends CardImpl { public BlatantThievery(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{4}{U}{U}{U}"); + super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{4}{U}{U}{U}"); // For each opponent, gain control of target permanent that player controls. this.getSpellAbility().addEffect(new BlatantThieveryEffect()); @@ -66,7 +67,15 @@ public class BlatantThievery extends CardImpl { public void adjustTargets(Ability ability, Game game) { if (ability instanceof SpellAbility) { ability.getTargets().clear(); - ability.addTarget(new BlatantThieveryTarget(game.getOpponents(ability.getControllerId()).size())); + for (UUID opponentId : game.getOpponents(ability.getControllerId())) { + Player opponent = game.getPlayer(opponentId); + if (opponent != null) { + FilterPermanent filter = new FilterPermanent("Permanent of player " + opponent.getName()); + filter.add(new ControllerIdPredicate(opponentId)); + TargetPermanent targetPermanent = new TargetPermanent(filter); + ability.addTarget(targetPermanent); + } + } } } @@ -94,117 +103,13 @@ class BlatantThieveryEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - for (UUID targetId : getTargetPointer().getTargets(game, source)) { - ContinuousEffect effect = new GainControlTargetEffect(Duration.EndOfGame); - effect.setTargetPointer(new FixedTarget(targetId)); - game.addEffect(effect, source); - } - return true; - } -} - -class BlatantThieveryTarget extends TargetPermanent { - - Map targetOpponent = new HashMap<>(); - - public BlatantThieveryTarget(int opponents) { - super(opponents, opponents, new FilterPermanent("a permanent for each opponent"), false); - } - - public BlatantThieveryTarget(final BlatantThieveryTarget target) { - super(target); - this.targetOpponent.putAll(target.targetOpponent); - } - - @Override - public boolean canTarget(UUID controllerId, UUID objectId, Ability source, Game game) { - Permanent targetObject = game.getPermanent(objectId); - if (targetObject == null || !game.getOpponents(source.getControllerId()).contains(targetObject.getControllerId())) { - return false; - } - // If a permanent changes controller after being targeted but before this spell resolves, you won't gain control of that permanent. - if (targetOpponent.containsKey(objectId)) { - if (!targetOpponent.get(objectId).equals(targetObject.getControllerId())) { - return false; - } - } else { - // if already a target from this opponent exists, another can't be target - if (targetOpponent.values().contains(targetObject.getControllerId())) { - return false; - } - } - return super.canTarget(controllerId, objectId, source, game); - } - - @Override - public Set possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) { - Set opponents = new HashSet<>(); - for (UUID targetId : getTargets()) { - Permanent oldTargets = game.getPermanent(targetId); - if (oldTargets != null) { - opponents.add(oldTargets.getControllerId()); - } - } - Set possibleTargets = new HashSet<>(); - MageObject mageObject = game.getObject(sourceId); - if (mageObject == null) { - return possibleTargets; - } - for (UUID opponentId : game.getOpponents(sourceControllerId)) { - if (opponents.contains(opponentId)) { - // Target for this opponent already selected - continue; - } - for (Permanent permanent : game.getBattlefield().getAllActivePermanents(opponentId)) { - if (permanent.canBeTargetedBy(mageObject, sourceControllerId, game)) { - possibleTargets.add(permanent.getId()); - } - } - } - return possibleTargets; - } - - @Override - public boolean canChoose(UUID sourceId, UUID sourceControllerId, Game game) { - for (UUID opponentId : game.getOpponents(sourceControllerId)) { - boolean targetAvailable = false; - for (Permanent permanent : game.getBattlefield().getAllActivePermanents(opponentId)) { - if (!targets.containsKey(permanent.getId())) { - MageObject mageObject = game.getObject(sourceId); - if (mageObject != null && permanent.canBeTargetedBy(mageObject, sourceControllerId, game)) { - targetAvailable = true; - break; - } - - } else { - targetAvailable = true; - break; - } - } - if (!targetAvailable) { - return false; + for (Target target : source.getTargets()) { + if (target.getFirstTarget() != null) { + ContinuousEffect effect = new GainControlTargetEffect(Duration.EndOfGame); + effect.setTargetPointer(new FixedTarget(target.getFirstTarget())); + game.addEffect(effect, source); } } return true; } - - @Override - public void addTarget(UUID objectId, int amount, Ability source, Game game, boolean skipEvent) { - Permanent targetObject = game.getPermanent(objectId); - if (targetObject != null) { - targetOpponent.put(objectId, targetObject.getControllerId()); - } - super.addTarget(objectId, amount, source, game, skipEvent); - } - - @Override - public void remove(UUID id) { - super.remove(id); - targetOpponent.remove(id); - } - - @Override - public BlatantThieveryTarget copy() { - return new BlatantThieveryTarget(this); - } } diff --git a/Mage.Tests/src/test/java/org/mage/test/multiplayer/BlatantThieveryTest.java b/Mage.Tests/src/test/java/org/mage/test/multiplayer/BlatantThieveryTest.java new file mode 100644 index 00000000000..a5447b94b15 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/multiplayer/BlatantThieveryTest.java @@ -0,0 +1,93 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.mage.test.multiplayer; + +import java.io.FileNotFoundException; +import mage.constants.MultiplayerAttackOption; +import mage.constants.PhaseStep; +import mage.constants.RangeOfInfluence; +import mage.constants.Zone; +import mage.game.FreeForAll; +import mage.game.Game; +import mage.game.GameException; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestMultiPlayerBase; + +/** + * + * @author LevelX2 + */ +public class BlatantThieveryTest extends CardTestMultiPlayerBase { + + @Override + protected Game createNewGameAndPlayers() throws GameException, FileNotFoundException { + Game game = new FreeForAll(MultiplayerAttackOption.MULTIPLE, RangeOfInfluence.ALL, 0, 20); + // Player order: A -> D -> C -> B + playerA = createPlayer(game, playerA, "PlayerA"); + playerB = createPlayer(game, playerB, "PlayerB"); + playerC = createPlayer(game, playerC, "PlayerC"); + playerD = createPlayer(game, playerD, "PlayerD"); + return game; + } + + @Test + public void NormalTest() { + // For each opponent, gain control of target permanent that player controls. + addCard(Zone.HAND, playerA, "Blatant Thievery"); // Sorcery {4}{U}{U}{U} + addCard(Zone.BATTLEFIELD, playerA, "Island", 7); + + // Player order: A -> D -> C -> B + addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 2); + addCard(Zone.BATTLEFIELD, playerC, "Walking Corpse", 2); + addCard(Zone.BATTLEFIELD, playerD, "Pillarfield Ox", 2); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Blatant Thievery"); + addTarget(playerA, "Silvercoat Lion"); + addTarget(playerA, "Walking Corpse"); + addTarget(playerA, "Pillarfield Ox"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertPermanentCount(playerA, "Silvercoat Lion", 1); + assertPermanentCount(playerA, "Walking Corpse", 1); + assertPermanentCount(playerA, "Pillarfield Ox", 1); + assertPermanentCount(playerB, "Silvercoat Lion", 1); + assertPermanentCount(playerC, "Walking Corpse", 1); + assertPermanentCount(playerD, "Pillarfield Ox", 1); + } + + @Test + public void ControlChangeTest() { + // For each opponent, gain control of target permanent that player controls. + addCard(Zone.HAND, playerA, "Blatant Thievery"); // Sorcery {4}{U}{U}{U} + addCard(Zone.BATTLEFIELD, playerA, "Island", 7); + + addCard(Zone.HAND, playerB, "Act of Aggression"); // Instant {3}{M}{M} + addCard(Zone.BATTLEFIELD, playerB, "Mountain", 5); + + // Player order: A -> D -> C -> B + addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1); + addCard(Zone.BATTLEFIELD, playerC, "Walking Corpse", 1); + addCard(Zone.BATTLEFIELD, playerD, "Pillarfield Ox", 1); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Blatant Thievery"); + addTarget(playerA, "Silvercoat Lion"); + addTarget(playerA, "Walking Corpse"); + addTarget(playerA, "Pillarfield Ox"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Act of Aggression", "Pillarfield Ox", "Blatant Thievery"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertGraveyardCount(playerA, "Blatant Thievery", 1); + assertGraveyardCount(playerB, "Act of Aggression", 1); + + assertPermanentCount(playerA, "Silvercoat Lion", 1); + assertPermanentCount(playerA, "Walking Corpse", 1); + assertPermanentCount(playerB, "Pillarfield Ox", 1); + } +} From bb7f0b5a2aea280bc9ed931577b088256eb563fb Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 24 Dec 2017 16:00:39 +0100 Subject: [PATCH 155/164] Implemented Last Rites --- Mage.Sets/src/mage/cards/l/LastRites.java | 118 ++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/l/LastRites.java diff --git a/Mage.Sets/src/mage/cards/l/LastRites.java b/Mage.Sets/src/mage/cards/l/LastRites.java new file mode 100644 index 00000000000..ea05312b0a6 --- /dev/null +++ b/Mage.Sets/src/mage/cards/l/LastRites.java @@ -0,0 +1,118 @@ +/* + * 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.abilities.Ability; +import mage.abilities.dynamicvalue.common.StaticValue; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.cards.Cards; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.TargetController; +import mage.filter.FilterCard; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.game.Game; +import mage.players.Player; +import mage.target.TargetCard; +import mage.target.TargetPlayer; +import mage.target.common.TargetCardInHand; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author L_J + */ +public class LastRites extends CardImpl { + + public LastRites(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{2}{B}"); + + // Discard any number of cards. Target player reveals his or her hand, then you choose a nonland card from it for each card discarded this way. That player discards those cards. + this.getSpellAbility().addEffect(new LastRitesEffect()); + this.getSpellAbility().addTarget(new TargetPlayer()); + + } + + public LastRites(final LastRites card) { + super(card); + } + + @Override + public LastRites copy() { + return new LastRites(this); + } +} + +class LastRitesEffect extends OneShotEffect { + + LastRitesEffect() { + super(Outcome.Discard); + this.staticText = "Discard any number of cards. Target player reveals his or her hand, then you choose a nonland card from it for each card discarded this way. That player discards those cards"; + } + + LastRitesEffect(final LastRitesEffect effect) { + super(effect); + } + + @Override + public LastRitesEffect copy() { + return new LastRitesEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Player targetPlayer = game.getPlayer(this.getTargetPointer().getFirst(game, source)); + if (controller != null && targetPlayer != null) { + Cards cardsInHand = controller.getHand().copy(); + TargetCard target = new TargetCardInHand(0, cardsInHand.size(), new FilterCard("cards to discard")); + controller.chooseTarget(outcome, cardsInHand, target, source, game); + int discardCount = target.getTargets().size(); + if (discardCount > 0) { + if (targetPlayer != null) { + FilterCard filter = new FilterCard((discardCount > 1 ? "" : "a") + " nonland card" + (discardCount > 1 ? "s" : "")); + filter.add(Predicates.not(new CardTypePredicate(CardType.LAND))); + StaticValue discardValue = new StaticValue(discardCount); + Effect effect = new DiscardCardYouChooseTargetEffect(discardValue, filter, TargetController.ANY); + effect.setTargetPointer(new FixedTarget(targetPlayer.getId())); + effect.apply(game, source); + } else { + return false; + } + } + return true; + } + return false; + } +} From b6f889068bb9b0c2559d38294263d03a013f7aae Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 24 Dec 2017 16:01:39 +0100 Subject: [PATCH 156/164] Implemented Last Rites --- Mage.Sets/src/mage/sets/Odyssey.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage.Sets/src/mage/sets/Odyssey.java b/Mage.Sets/src/mage/sets/Odyssey.java index 7900768d2b5..5644b9dbd01 100644 --- a/Mage.Sets/src/mage/sets/Odyssey.java +++ b/Mage.Sets/src/mage/sets/Odyssey.java @@ -206,6 +206,7 @@ public class Odyssey extends ExpansionSet { cards.add(new SetCardInfo("Krosan Avenger", 247, Rarity.COMMON, mage.cards.k.KrosanAvenger.class)); cards.add(new SetCardInfo("Krosan Beast", 248, Rarity.RARE, mage.cards.k.KrosanBeast.class)); cards.add(new SetCardInfo("Laquatus's Creativity", 88, Rarity.UNCOMMON, mage.cards.l.LaquatussCreativity.class)); + cards.add(new SetCardInfo("Last Rites", 146, Rarity.COMMON, mage.cards.l.LastRites.class)); cards.add(new SetCardInfo("Lava Blister", 200, Rarity.UNCOMMON, mage.cards.l.LavaBlister.class)); cards.add(new SetCardInfo("Leaf Dancer", 249, Rarity.COMMON, mage.cards.l.LeafDancer.class)); cards.add(new SetCardInfo("Lieutenant Kirtar", 29, Rarity.RARE, mage.cards.l.LieutenantKirtar.class)); From 56ae68409558c032552076857e366c979d85f18f Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 24 Dec 2017 16:02:30 +0100 Subject: [PATCH 157/164] Implemented Last Rites --- Mage.Sets/src/mage/sets/PDSGraveborn.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage.Sets/src/mage/sets/PDSGraveborn.java b/Mage.Sets/src/mage/sets/PDSGraveborn.java index 91192951d84..77e28025420 100644 --- a/Mage.Sets/src/mage/sets/PDSGraveborn.java +++ b/Mage.Sets/src/mage/sets/PDSGraveborn.java @@ -62,6 +62,7 @@ public class PDSGraveborn extends ExpansionSet { cards.add(new SetCardInfo("Faceless Butcher", 3, Rarity.COMMON, mage.cards.f.FacelessButcher.class)); cards.add(new SetCardInfo("Hidden Horror", 2, Rarity.UNCOMMON, mage.cards.h.HiddenHorror.class)); cards.add(new SetCardInfo("Inkwell Leviathan", 10, Rarity.RARE, mage.cards.i.InkwellLeviathan.class)); + cards.add(new SetCardInfo("Last Rites", 21, Rarity.COMMON, mage.cards.l.LastRites.class)); cards.add(new SetCardInfo("Polluted Mire", 26, Rarity.COMMON, mage.cards.p.PollutedMire.class)); cards.add(new SetCardInfo("Putrid Imp", 1, Rarity.COMMON, mage.cards.p.PutridImp.class)); cards.add(new SetCardInfo("Reanimate", 15, Rarity.UNCOMMON, mage.cards.r.Reanimate.class)); From de640d059c70a4e5c6cef83e1b87011738381e5b Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 24 Dec 2017 16:06:15 +0100 Subject: [PATCH 158/164] Last Rites fix --- Mage.Sets/src/mage/cards/l/LastRites.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Mage.Sets/src/mage/cards/l/LastRites.java b/Mage.Sets/src/mage/cards/l/LastRites.java index ea05312b0a6..151775f5e1a 100644 --- a/Mage.Sets/src/mage/cards/l/LastRites.java +++ b/Mage.Sets/src/mage/cards/l/LastRites.java @@ -33,6 +33,7 @@ import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.Effect; import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.discard.DiscardCardYouChooseTargetEffect; +import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.cards.Cards; @@ -100,6 +101,12 @@ class LastRitesEffect extends OneShotEffect { controller.chooseTarget(outcome, cardsInHand, target, source, game); int discardCount = target.getTargets().size(); if (discardCount > 0) { + for (UUID cardId : target.getTargets()) { + Card card = game.getCard(cardId); + if (card != null) { + controller.discard(card, source, game); + } + } if (targetPlayer != null) { FilterCard filter = new FilterCard((discardCount > 1 ? "" : "a") + " nonland card" + (discardCount > 1 ? "s" : "")); filter.add(Predicates.not(new CardTypePredicate(CardType.LAND))); From 8d65d2a2fd11e3108d359ae9c6424a4cc1d18844 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 24 Dec 2017 16:27:04 +0100 Subject: [PATCH 159/164] Implemented Spiritual Focus --- .../src/mage/cards/s/SpiritualFocus.java | 140 ++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/s/SpiritualFocus.java diff --git a/Mage.Sets/src/mage/cards/s/SpiritualFocus.java b/Mage.Sets/src/mage/cards/s/SpiritualFocus.java new file mode 100644 index 00000000000..5e14d68ba20 --- /dev/null +++ b/Mage.Sets/src/mage/cards/s/SpiritualFocus.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.s; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.TriggeredAbilityImpl; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.GainLifeEffect; +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.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.permanent.Permanent; +import mage.game.stack.StackObject; +import mage.players.Player; + +/** + * + * @author L_J + */ +public class SpiritualFocus extends CardImpl { + + public SpiritualFocus(UUID ownerId, CardSetInfo setInfo) { + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}"); + + // Whenever a spell or ability an opponent controls causes you to discard a card, you gain 2 life and you may draw a card. + this.addAbility(new SpiritualFocusTriggeredAbility()); + } + + public SpiritualFocus(final SpiritualFocus card) { + super(card); + } + + @Override + public SpiritualFocus copy() { + return new SpiritualFocus(this); + } +} + +class SpiritualFocusTriggeredAbility extends TriggeredAbilityImpl { + + public SpiritualFocusTriggeredAbility() { + super(Zone.BATTLEFIELD, new GainLifeEffect(2), false); + this.addEffect(new SpiritualFocusDrawCardEffect()); + } + + public SpiritualFocusTriggeredAbility(final SpiritualFocusTriggeredAbility ability) { + super(ability); + } + + @Override + public SpiritualFocusTriggeredAbility copy() { + return new SpiritualFocusTriggeredAbility(this); + } + + @Override + public boolean checkEventType(GameEvent event, Game game) { + return event.getType() == EventType.DISCARDED_CARD; + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + StackObject stackObject = game.getStack().getStackObject(event.getSourceId()); + if (stackObject != null) { + if (game.getOpponents(this.getControllerId()).contains(stackObject.getControllerId())) { + Permanent permanent = game.getPermanent(getSourceId()); + if (permanent != null) { + if (permanent.getControllerId() == event.getPlayerId()) { + return true; + } + } + } + } + return false; + } + + @Override + public String getRule() { + return "Whenever a spell or ability an opponent controls causes you to discard a card, you gain 2 life and you may draw a card."; + } +} + +class SpiritualFocusDrawCardEffect extends OneShotEffect { + + public SpiritualFocusDrawCardEffect() { + super(Outcome.DrawCard); + } + + public SpiritualFocusDrawCardEffect(final SpiritualFocusDrawCardEffect effect) { + super(effect); + } + + @Override + public SpiritualFocusDrawCardEffect copy() { + return new SpiritualFocusDrawCardEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(source.getSourceId()); + Player player = game.getPlayer(source.getControllerId()); + if (player != null && permanent != null) { + if (player.chooseUse(outcome, "Draw a card (" + permanent.getLogName() + ')', source, game)) { + player.drawCards(1, game); + } + return true; + } + return false; + } +} From 9c0f1c8db0e8705b8eef9a39c5667aac19277018 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 24 Dec 2017 16:27:59 +0100 Subject: [PATCH 160/164] Implemented Spiritual Focus --- Mage.Sets/src/mage/sets/MercadianMasques.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage.Sets/src/mage/sets/MercadianMasques.java b/Mage.Sets/src/mage/sets/MercadianMasques.java index 92bb4bc0ab8..df71e3b1794 100644 --- a/Mage.Sets/src/mage/sets/MercadianMasques.java +++ b/Mage.Sets/src/mage/sets/MercadianMasques.java @@ -311,6 +311,7 @@ public class MercadianMasques extends ExpansionSet { cards.add(new SetCardInfo("Soul Channeling", 163, Rarity.COMMON, mage.cards.s.SoulChanneling.class)); cards.add(new SetCardInfo("Specter's Wail", 164, Rarity.COMMON, mage.cards.s.SpectersWail.class)); cards.add(new SetCardInfo("Spidersilk Armor", 273, Rarity.COMMON, mage.cards.s.SpidersilkArmor.class)); + cards.add(new SetCardInfo("Spiritual Focus", 49, Rarity.RARE, mage.cards.s.SpiritualFocus.class)); cards.add(new SetCardInfo("Spontaneous Generation", 274, Rarity.RARE, mage.cards.s.SpontaneousGeneration.class)); cards.add(new SetCardInfo("Squall", 275, Rarity.COMMON, mage.cards.s.Squall.class)); cards.add(new SetCardInfo("Squallmonger", 276, Rarity.UNCOMMON, mage.cards.s.Squallmonger.class)); From e46c4ed7bc68ede4cb8c16bd5f7fc3694d2d2b95 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 24 Dec 2017 20:02:36 +0100 Subject: [PATCH 161/164] Implemented Treacherous Link --- .../src/mage/cards/t/TreacherousLink.java | 133 ++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/t/TreacherousLink.java diff --git a/Mage.Sets/src/mage/cards/t/TreacherousLink.java b/Mage.Sets/src/mage/cards/t/TreacherousLink.java new file mode 100644 index 00000000000..f5b7ed121f4 --- /dev/null +++ b/Mage.Sets/src/mage/cards/t/TreacherousLink.java @@ -0,0 +1,133 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.cards.t; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.effects.common.AttachEffect; +import mage.abilities.keyword.EnchantAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.DamageEvent; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.TargetPermanent; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author L_J + */ +public class TreacherousLink extends CardImpl { + + public TreacherousLink(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{B}"); + this.subtype.add(SubType.AURA); + + // Enchant creature + TargetPermanent auraTarget = new TargetCreaturePermanent(); + this.getSpellAbility().addTarget(auraTarget); + this.getSpellAbility().addEffect(new AttachEffect(Outcome.Detriment)); + Ability ability = new EnchantAbility(auraTarget.getTargetName()); + this.addAbility(ability); + + // All damage that would be dealt to enchanted creature is dealt to its controller instead. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new TreacherousLinkEffect())); + } + + public TreacherousLink(final TreacherousLink card) { + super(card); + } + + @Override + public TreacherousLink copy() { + return new TreacherousLink(this); + } +} + +class TreacherousLinkEffect extends ReplacementEffectImpl { + + public TreacherousLinkEffect() { + super(Duration.WhileOnBattlefield, Outcome.RedirectDamage); + staticText = "All damage that would be dealt to enchanted creature is dealt to its controller instead"; + } + + public TreacherousLinkEffect(final TreacherousLinkEffect effect) { + super(effect); + } + + @Override + public TreacherousLinkEffect copy() { + return new TreacherousLinkEffect(this); + } + + @Override + public boolean checksEventType(GameEvent event, Game game) { + return event.getType() == GameEvent.EventType.DAMAGE_CREATURE; + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + DamageEvent damageEvent = (DamageEvent) event; + Permanent enchantedCreature = game.getPermanentOrLKIBattlefield(damageEvent.getTargetId()); + Player controller = game.getPlayer(enchantedCreature.getControllerId()); + if (enchantedCreature != null && controller != null) { + controller.damage(damageEvent.getAmount(), damageEvent.getSourceId(), game, damageEvent.isCombatDamage(), damageEvent.isPreventable(), damageEvent.getAppliedEffects()); + return true; + } + return false; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + Permanent enchantment = game.getPermanentOrLKIBattlefield(source.getSourceId()); + Player controller = game.getPlayer(source.getControllerId()); + DamageEvent damageEvent = (DamageEvent) event; + if (controller != null && enchantment != null) { + Permanent enchantedCreature = game.getPermanentOrLKIBattlefield(enchantment.getAttachedTo()); + if (enchantedCreature != null) { + return enchantedCreature.getId() == damageEvent.getTargetId(); + } + } + return false; + } +} From a772e73e2aa55642d7e327d0d1d704b60d733098 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 24 Dec 2017 20:03:48 +0100 Subject: [PATCH 162/164] Implemented Treacherous Link --- Mage.Sets/src/mage/sets/UrzasLegacy.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage.Sets/src/mage/sets/UrzasLegacy.java b/Mage.Sets/src/mage/sets/UrzasLegacy.java index cadbddbd38a..af5b0ab5375 100644 --- a/Mage.Sets/src/mage/sets/UrzasLegacy.java +++ b/Mage.Sets/src/mage/sets/UrzasLegacy.java @@ -175,6 +175,7 @@ public class UrzasLegacy extends ExpansionSet { cards.add(new SetCardInfo("Ticking Gnomes", 136, Rarity.UNCOMMON, mage.cards.t.TickingGnomes.class)); cards.add(new SetCardInfo("Tinker", 45, Rarity.UNCOMMON, mage.cards.t.Tinker.class)); cards.add(new SetCardInfo("Tragic Poet", 24, Rarity.COMMON, mage.cards.t.TragicPoet.class)); + cards.add(new SetCardInfo("Treacherous Link", 71, Rarity.UNCOMMON, mage.cards.t.TreacherousLink.class)); cards.add(new SetCardInfo("Treefolk Mystic", 114, Rarity.COMMON, mage.cards.t.TreefolkMystic.class)); cards.add(new SetCardInfo("Treetop Village", 143, Rarity.UNCOMMON, mage.cards.t.TreetopVillage.class)); cards.add(new SetCardInfo("Unearth", 72, Rarity.COMMON, mage.cards.u.Unearth.class)); From 3c27550937ed24b3bb101189cda7489fb5a8bcd7 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 24 Dec 2017 21:47:03 +0100 Subject: [PATCH 163/164] Implemented Walking Sponge --- Mage.Sets/src/mage/cards/w/WalkingSponge.java | 134 ++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 Mage.Sets/src/mage/cards/w/WalkingSponge.java diff --git a/Mage.Sets/src/mage/cards/w/WalkingSponge.java b/Mage.Sets/src/mage/cards/w/WalkingSponge.java new file mode 100644 index 00000000000..0bc3b9fbbad --- /dev/null +++ b/Mage.Sets/src/mage/cards/w/WalkingSponge.java @@ -0,0 +1,134 @@ +/* + * 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.w; + +import java.util.LinkedHashSet; +import java.util.Set; +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.ContinuousEffect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.continuous.LoseAbilityTargetEffect; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.cards.CardImpl; +import mage.cards.CardSetInfo; +import mage.choices.ChoiceImpl; +import mage.constants.CardType; +import mage.constants.SubType; +import mage.constants.Duration; +import mage.constants.Outcome; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author L_J + */ +public class WalkingSponge extends CardImpl { + + public WalkingSponge(UUID ownerId, CardSetInfo setInfo) { + super(ownerId,setInfo,new CardType[]{CardType.CREATURE},"{1}{U}"); + this.subtype.add(SubType.SPONGE); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // {T}: Target creature loses your choice of flying, first strike, or trample until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new WalkingSpongeEffect(), new TapSourceCost()); + ability.addTarget(new TargetCreaturePermanent()); + this.addAbility(ability); + } + + public WalkingSponge(final WalkingSponge card) { + super(card); + } + + @Override + public WalkingSponge copy() { + return new WalkingSponge(this); + } +} + +class WalkingSpongeEffect extends OneShotEffect { + + WalkingSpongeEffect() { + super(Outcome.Benefit); + this.staticText = "Target creature loses your choice of flying, first strike, or trample until end of turn"; + } + + WalkingSpongeEffect(final WalkingSpongeEffect effect) { + super(effect); + } + + @Override + public WalkingSpongeEffect copy() { + return new WalkingSpongeEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player player = game.getPlayer(source.getControllerId()); + Permanent permanent = game.getPermanent(source.getSourceId()); + if (player != null || permanent != null) { + ChoiceImpl chooseAbility = new ChoiceImpl(); + chooseAbility.setMessage("What ability do you wish to remove? (default is Flying)"); + Set choice = new LinkedHashSet<>(); + choice.add("Flying"); + choice.add("First strike"); + choice.add("Trample"); + chooseAbility.setChoices(choice); + // since the player can't pick "no ability", let's default to the first option + Ability ability = FlyingAbility.getInstance(); + + if (player.choose(Outcome.UnboostCreature, chooseAbility, game)) { + String chosenAbility = chooseAbility.getChoice(); + // if (chosenAbility.equals("Flying")) { + // ability = FlyingAbility.getInstance(); + // } + if (chosenAbility.equals("First strike")) { + ability = FirstStrikeAbility.getInstance(); + } + else if (chosenAbility.equals("Trample")) { + ability = TrampleAbility.getInstance(); + } + } + game.informPlayers(player.getLogName() + " has chosen " + ability.getRule()); + ContinuousEffect effect = new LoseAbilityTargetEffect(ability, Duration.EndOfTurn); + game.addEffect(effect, source); + return true; + } + return false; + } +} From fe5ff0becaa139db21b4e77a254623f4da0c9ca3 Mon Sep 17 00:00:00 2001 From: Zzooouhh Date: Sun, 24 Dec 2017 21:47:49 +0100 Subject: [PATCH 164/164] Implemented Walking Sponge --- Mage.Sets/src/mage/sets/UrzasLegacy.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Mage.Sets/src/mage/sets/UrzasLegacy.java b/Mage.Sets/src/mage/sets/UrzasLegacy.java index af5b0ab5375..38b8dff7ede 100644 --- a/Mage.Sets/src/mage/sets/UrzasLegacy.java +++ b/Mage.Sets/src/mage/sets/UrzasLegacy.java @@ -184,6 +184,7 @@ public class UrzasLegacy extends ExpansionSet { cards.add(new SetCardInfo("Viashino Heretic", 95, Rarity.UNCOMMON, mage.cards.v.ViashinoHeretic.class)); cards.add(new SetCardInfo("Viashino Sandscout", 96, Rarity.COMMON, mage.cards.v.ViashinoSandscout.class)); cards.add(new SetCardInfo("Vigilant Drake", 46, Rarity.COMMON, mage.cards.v.VigilantDrake.class)); + cards.add(new SetCardInfo("Walking Sponge", 47, Rarity.UNCOMMON, mage.cards.w.WalkingSponge.class)); cards.add(new SetCardInfo("Weatherseed Elf", 115, Rarity.COMMON, mage.cards.w.WeatherseedElf.class)); cards.add(new SetCardInfo("Weatherseed Faeries", 48, Rarity.COMMON, mage.cards.w.WeatherseedFaeries.class)); cards.add(new SetCardInfo("Weatherseed Treefolk", 116, Rarity.RARE, mage.cards.w.WeatherseedTreefolk.class));