diff --git a/Mage.Sets/src/mage/sets/coldsnap/ZurTheEnchanter.java b/Mage.Sets/src/mage/sets/coldsnap/ZurTheEnchanter.java new file mode 100644 index 0000000000..e8e8f9db64 --- /dev/null +++ b/Mage.Sets/src/mage/sets/coldsnap/ZurTheEnchanter.java @@ -0,0 +1,84 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.coldsnap; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.AttacksTriggeredAbility; +import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.Filter; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.predicate.mageobject.ConvertedManaCostPredicate; +import mage.target.common.TargetCardInLibrary; + +/** + * + * @author LevelX2 + */ +public class ZurTheEnchanter extends CardImpl<ZurTheEnchanter> { + + private static final FilterCard filter = new FilterCard("enchantment card with converted mana cost 3 or less"); + + static { + filter.add(new CardTypePredicate(CardType.ENCHANTMENT)); + filter.add(new ConvertedManaCostPredicate(Filter.ComparisonType.LessThan, 4)); + } + + public ZurTheEnchanter(UUID ownerId) { + super(ownerId, 135, "Zur the Enchanter", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{W}{U}{B}"); + this.expansionSetCode = "CSP"; + this.supertype.add("Legendary"); + this.subtype.add("Human"); + this.subtype.add("Wizard"); + + this.color.setBlue(true); + this.color.setBlack(true); + this.color.setWhite(true); + this.power = new MageInt(1); + this.toughness = new MageInt(4); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // Whenever Zur the Enchanter attacks, you may search your library for an enchantment card with converted mana cost 3 or less and put it onto the battlefield. If you do, shuffle your library. + this.addAbility(new AttacksTriggeredAbility(new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(filter), false), true)); + } + + public ZurTheEnchanter(final ZurTheEnchanter card) { + super(card); + } + + @Override + public ZurTheEnchanter copy() { + return new ZurTheEnchanter(this); + } +} diff --git a/Mage.Sets/src/mage/sets/elspethvstezzeret/AngelOfSalvation.java b/Mage.Sets/src/mage/sets/elspethvstezzeret/AngelOfSalvation.java new file mode 100644 index 0000000000..a50419dbec --- /dev/null +++ b/Mage.Sets/src/mage/sets/elspethvstezzeret/AngelOfSalvation.java @@ -0,0 +1,78 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.elspethvstezzeret; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.effects.common.PreventDamageTargetAmountEffect; +import mage.abilities.keyword.ConvokeAbility; +import mage.abilities.keyword.FlashAbility; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.target.common.TargetCreatureOrPlayerAmount; + +/** + * + * @author LevelX2 + */ +public class AngelOfSalvation extends CardImpl<AngelOfSalvation> { + + public AngelOfSalvation(UUID ownerId) { + super(ownerId, 20, "Angel of Salvation", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{6}{W}{W}"); + this.expansionSetCode = "DDF"; + this.subtype.add("Angel"); + + this.color.setWhite(true); + this.power = new MageInt(5); + this.toughness = new MageInt(5); + + // Flash; convoke + this.addAbility(FlashAbility.getInstance()); + this.addAbility(new ConvokeAbility()); + // Flying + this.addAbility(FlyingAbility.getInstance()); + // When Angel of Salvation enters the battlefield, prevent the next 5 damage that would be dealt this turn to any number of target creatures and/or players, divided as you choose. + Ability ability = new EntersBattlefieldTriggeredAbility(new PreventDamageTargetAmountEffect(Duration.EndOfTurn, 5)); + ability.addTarget(new TargetCreatureOrPlayerAmount(5)); + this.addAbility(ability); + } + + public AngelOfSalvation(final AngelOfSalvation card) { + super(card); + } + + @Override + public AngelOfSalvation copy() { + return new AngelOfSalvation(this); + } +} diff --git a/Mage.Sets/src/mage/sets/elspethvstezzeret/AssemblyWorker.java b/Mage.Sets/src/mage/sets/elspethvstezzeret/AssemblyWorker.java new file mode 100644 index 0000000000..e22432aea0 --- /dev/null +++ b/Mage.Sets/src/mage/sets/elspethvstezzeret/AssemblyWorker.java @@ -0,0 +1,52 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.elspethvstezzeret; + +import java.util.UUID; + +/** + * + * @author LevelX2 + */ +public class AssemblyWorker extends mage.sets.timespiral.AssemblyWorker { + + public AssemblyWorker(UUID ownerId) { + super(ownerId); + this.cardNumber = 45; + this.expansionSetCode = "DDF"; + } + + public AssemblyWorker(final AssemblyWorker card) { + super(card); + } + + @Override + public AssemblyWorker copy() { + return new AssemblyWorker(this); + } +} diff --git a/Mage.Sets/src/mage/sets/elspethvstezzeret/ClockworkHydra.java b/Mage.Sets/src/mage/sets/elspethvstezzeret/ClockworkHydra.java new file mode 100644 index 0000000000..307bb41653 --- /dev/null +++ b/Mage.Sets/src/mage/sets/elspethvstezzeret/ClockworkHydra.java @@ -0,0 +1,52 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.elspethvstezzeret; + +import java.util.UUID; + +/** + * + * @author LevelX2 + */ +public class ClockworkHydra extends mage.sets.timespiral.ClockworkHydra { + + public ClockworkHydra(UUID ownerId) { + super(ownerId); + this.cardNumber = 55; + this.expansionSetCode = "DDF"; + } + + public ClockworkHydra(final ClockworkHydra card) { + super(card); + } + + @Override + public ClockworkHydra copy() { + return new ClockworkHydra(this); + } +} diff --git a/Mage.Sets/src/mage/sets/elspethvstezzeret/EnergyChamber.java b/Mage.Sets/src/mage/sets/elspethvstezzeret/EnergyChamber.java new file mode 100644 index 0000000000..0b9c2e1344 --- /dev/null +++ b/Mage.Sets/src/mage/sets/elspethvstezzeret/EnergyChamber.java @@ -0,0 +1,89 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.elspethvstezzeret; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.common.BeginningOfUpkeepTriggeredAbility; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.FilterPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.target.TargetPermanent; + +/** + * + * @author LevelX2 + */ +public class EnergyChamber extends CardImpl<EnergyChamber> { + + private static final FilterPermanent filter = new FilterPermanent("target artifact creature"); + private static final FilterPermanent filter2 = new FilterPermanent("noncreature artifact"); + + static { + filter.add(new CardTypePredicate(CardType.ARTIFACT)); + filter.add(new CardTypePredicate(CardType.CREATURE)); + filter2.add(new CardTypePredicate(CardType.ARTIFACT)); + filter2.add(Predicates.not(new CardTypePredicate(CardType.CREATURE))); + } + + public EnergyChamber(UUID ownerId) { + super(ownerId, 64, "Energy Chamber", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT}, "{2}"); + this.expansionSetCode = "DDF"; + + // At the beginning of your upkeep, choose one - Put a +1/+1 counter on target artifact creature; + Ability ability = new BeginningOfUpkeepTriggeredAbility(Zone.BATTLEFIELD, new AddCountersTargetEffect(CounterType.P1P1.createInstance(), Outcome.BoostCreature), TargetController.YOU, false); + ability.addTarget(new TargetPermanent(filter)); + + // or put a charge counter on target noncreature artifact. + Mode mode = new Mode(); + mode.getEffects().add(new AddCountersTargetEffect(CounterType.CHARGE.createInstance(), Outcome.BoostCreature)); + mode.getTargets().add(new TargetPermanent(filter2)); + ability.addMode(mode); + + this.addAbility(ability); + + } + + public EnergyChamber(final EnergyChamber card) { + super(card); + } + + @Override + public EnergyChamber copy() { + return new EnergyChamber(this); + } +} diff --git a/Mage.Sets/src/mage/sets/elspethvstezzeret/Foil.java b/Mage.Sets/src/mage/sets/elspethvstezzeret/Foil.java new file mode 100644 index 0000000000..d0a3da6886 --- /dev/null +++ b/Mage.Sets/src/mage/sets/elspethvstezzeret/Foil.java @@ -0,0 +1,52 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.elspethvstezzeret; + +import java.util.UUID; + +/** + * + * @author LevelX2 + */ +public class Foil extends mage.sets.prophecy.Foil { + + public Foil(UUID ownerId) { + super(ownerId); + this.cardNumber = 70; + this.expansionSetCode = "DDF"; + } + + public Foil(final Foil card) { + super(card); + } + + @Override + public Foil copy() { + return new Foil(this); + } +} diff --git a/Mage.Sets/src/mage/sets/elspethvstezzeret/RazorBarrier.java b/Mage.Sets/src/mage/sets/elspethvstezzeret/RazorBarrier.java new file mode 100644 index 0000000000..41cbc9b5d5 --- /dev/null +++ b/Mage.Sets/src/mage/sets/elspethvstezzeret/RazorBarrier.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.sets.elspethvstezzeret; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.effects.common.continious.GainAbilityTargetEffect; +import mage.abilities.keyword.ProtectionAbility; +import mage.cards.CardImpl; +import mage.choices.ChoiceColorOrArtifact; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.CardTypePredicate; +import mage.filter.predicate.mageobject.ColorPredicate; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.Target; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author LevelX2 + */ +public class RazorBarrier extends CardImpl<RazorBarrier> { + + public RazorBarrier(UUID ownerId) { + super(ownerId, 26, "Razor Barrier", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{1}{W}"); + this.expansionSetCode = "DDF"; + + this.color.setWhite(true); + + // Target permanent you control gains protection from artifacts or from the color of your choice until end of turn. + this.getSpellAbility().addEffect(new RazorBarrierEffect(Duration.EndOfTurn)); + Target target = new TargetControlledPermanent(); + target.setRequired(true); + this.getSpellAbility().addTarget(target); + } + + public RazorBarrier(final RazorBarrier card) { + super(card); + } + + @Override + public RazorBarrier copy() { + return new RazorBarrier(this); + } +} + +class RazorBarrierEffect extends GainAbilityTargetEffect { + + public RazorBarrierEffect(Duration duration) { + super(new ProtectionAbility(new FilterCard()), duration); + staticText = "Target permanent you control gains protection from artifacts or from the color of your choice until end of turn"; + } + + public RazorBarrierEffect(final RazorBarrierEffect effect) { + super(effect); + } + + @Override + public RazorBarrierEffect copy() { + return new RazorBarrierEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null) { + FilterCard protectionFilter = new FilterCard(); + ChoiceColorOrArtifact choice = new ChoiceColorOrArtifact(); + if (controller.choose(outcome, choice, game)) { + if (choice.isArtifactSelected()) { + protectionFilter.add(new CardTypePredicate(CardType.ARTIFACT)); + } else { + protectionFilter.add(new ColorPredicate(choice.getColor())); + } + + protectionFilter.setMessage(choice.getChoice()); + ((ProtectionAbility) ability).setFilter(protectionFilter); + Permanent creature = game.getPermanent(source.getFirstTarget()); + if (creature != null) { + creature.addAbility(ability, source.getSourceId(), game); + return true; + } + } + } + return false; + } + +} diff --git a/Mage.Sets/src/mage/sets/elspethvstezzeret/RusticClachan.java b/Mage.Sets/src/mage/sets/elspethvstezzeret/RusticClachan.java new file mode 100644 index 0000000000..7b1cc4b2ef --- /dev/null +++ b/Mage.Sets/src/mage/sets/elspethvstezzeret/RusticClachan.java @@ -0,0 +1,77 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.elspethvstezzeret; + +import java.util.UUID; +import mage.abilities.common.AsEntersBattlefieldAbility; +import mage.abilities.costs.common.RevealTargetFromHandCost; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.effects.common.TapSourceUnlessPaysEffect; +import mage.abilities.keyword.ReinforceAbility; +import mage.abilities.mana.WhiteManaAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.common.TargetCardInHand; + +/** + * + * @author LevelX2 + */ +public class RusticClachan extends CardImpl<RusticClachan> { + + private static final FilterCard filter = new FilterCard("a Kithkin card from your hand"); + + static { + filter.add(new SubtypePredicate("Kithkin")); + } + + public RusticClachan(UUID ownerId) { + super(ownerId, 34, "Rustic Clachan", Rarity.RARE, new CardType[]{CardType.LAND}, ""); + this.expansionSetCode = "DDF"; + + // As Rustic Clachan enters the battlefield, you may reveal a Kithkin card from your hand. If you don't, Rustic Clachan enters the battlefield tapped. + this.addAbility(new AsEntersBattlefieldAbility(new TapSourceUnlessPaysEffect(new RevealTargetFromHandCost(new TargetCardInHand(filter))), "you may reveal a Kithkin card from your hand. If you don't, {this} enters the battlefield tapped")); + + // {tap}: Add {W} to your mana pool. + this.addAbility(new WhiteManaAbility()); + // Reinforce 1-{1}{W} + this.addAbility(new ReinforceAbility(1, new ManaCostsImpl("{1}{W}"))); + } + + public RusticClachan(final RusticClachan card) { + super(card); + } + + @Override + public RusticClachan copy() { + return new RusticClachan(this); + } +} diff --git a/Mage.Sets/src/mage/sets/elspethvstezzeret/SerratedBiskelion.java b/Mage.Sets/src/mage/sets/elspethvstezzeret/SerratedBiskelion.java new file mode 100644 index 0000000000..0ec7f71f6b --- /dev/null +++ b/Mage.Sets/src/mage/sets/elspethvstezzeret/SerratedBiskelion.java @@ -0,0 +1,73 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.elspethvstezzeret; + +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.common.counter.AddCountersSourceEffect; +import mage.abilities.effects.common.counter.AddCountersTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.target.common.TargetCreaturePermanent; + +/** + * + * @author LevelX2 + */ +public class SerratedBiskelion extends CardImpl<SerratedBiskelion> { + + public SerratedBiskelion(UUID ownerId) { + super(ownerId, 46, "Serrated Biskelion", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}"); + this.expansionSetCode = "DDF"; + this.subtype.add("Construct"); + + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // {tap}: Put a -1/-1 counter on Serrated Biskelion and a -1/-1 counter on target creature. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.M1M1.createInstance(), true), new TapSourceCost()); + ability.addEffect(new AddCountersTargetEffect(CounterType.M1M1.createInstance())); + ability.addTarget(new TargetCreaturePermanent(true)); + this.addAbility(ability); + } + + public SerratedBiskelion(final SerratedBiskelion card) { + super(card); + } + + @Override + public SerratedBiskelion copy() { + return new SerratedBiskelion(this); + } +} diff --git a/Mage.Sets/src/mage/sets/elspethvstezzeret/StormfrontRiders.java b/Mage.Sets/src/mage/sets/elspethvstezzeret/StormfrontRiders.java new file mode 100644 index 0000000000..88c0362a77 --- /dev/null +++ b/Mage.Sets/src/mage/sets/elspethvstezzeret/StormfrontRiders.java @@ -0,0 +1,52 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.elspethvstezzeret; + +import java.util.UUID; + +/** + * + * @author LevelX2 + */ +public class StormfrontRiders extends mage.sets.planarchaos.StormfrontRiders { + + public StormfrontRiders(UUID ownerId) { + super(ownerId); + this.cardNumber = 17; + this.expansionSetCode = "DDF"; + } + + public StormfrontRiders(final StormfrontRiders card) { + super(card); + } + + @Override + public StormfrontRiders copy() { + return new StormfrontRiders(this); + } +} diff --git a/Mage.Sets/src/mage/sets/elspethvstezzeret/SwellOfCourage.java b/Mage.Sets/src/mage/sets/elspethvstezzeret/SwellOfCourage.java new file mode 100644 index 0000000000..f74b6ab624 --- /dev/null +++ b/Mage.Sets/src/mage/sets/elspethvstezzeret/SwellOfCourage.java @@ -0,0 +1,67 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.elspethvstezzeret; + +import java.util.UUID; +import mage.abilities.costs.mana.ManaCostsImpl; +import mage.abilities.dynamicvalue.common.GetXValue; +import mage.abilities.dynamicvalue.common.ManacostVariableValue; +import mage.abilities.effects.common.continious.BoostControlledEffect; +import mage.abilities.keyword.ReinforceAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; + +/** + * + * @author LevelX2 + */ +public class SwellOfCourage extends CardImpl<SwellOfCourage> { + + public SwellOfCourage(UUID ownerId) { + super(ownerId, 31, "Swell of Courage", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{3}{W}{W}"); + this.expansionSetCode = "DDF"; + + this.color.setWhite(true); + + // Creatures you control get +2/+2 until end of turn. + this.getSpellAbility().addEffect(new BoostControlledEffect(2,2, Duration.EndOfTurn)); + // Reinforce X-{X}{W}{W} + this.addAbility(new ReinforceAbility(new ManacostVariableValue(), new ManaCostsImpl("{X}{W}{W}"))); + } + + public SwellOfCourage(final SwellOfCourage card) { + super(card); + } + + @Override + public SwellOfCourage copy() { + return new SwellOfCourage(this); + } +} diff --git a/Mage.Sets/src/mage/sets/elspethvstezzeret/SynodCenturion.java b/Mage.Sets/src/mage/sets/elspethvstezzeret/SynodCenturion.java new file mode 100644 index 0000000000..ecf92e6f11 --- /dev/null +++ b/Mage.Sets/src/mage/sets/elspethvstezzeret/SynodCenturion.java @@ -0,0 +1,100 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.elspethvstezzeret; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.StateTriggeredAbility; +import mage.abilities.effects.common.SacrificeSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; + +/** + * + * @author LevelX2 + */ +public class SynodCenturion extends CardImpl<SynodCenturion> { + + public SynodCenturion(UUID ownerId) { + super(ownerId, 53, "Synod Centurion", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{4}"); + this.expansionSetCode = "DDF"; + this.subtype.add("Construct"); + + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // When you control no other artifacts, sacrifice Synod Centurion. + this.addAbility(new SynodCenturionStateTriggeredAbility()); + } + + public SynodCenturion(final SynodCenturion card) { + super(card); + } + + @Override + public SynodCenturion copy() { + return new SynodCenturion(this); + } + + class SynodCenturionStateTriggeredAbility extends StateTriggeredAbility<SynodCenturionStateTriggeredAbility> { + + public SynodCenturionStateTriggeredAbility() { + super(Zone.BATTLEFIELD, new SacrificeSourceEffect()); + } + + public SynodCenturionStateTriggeredAbility(final SynodCenturionStateTriggeredAbility ability) { + super(ability); + } + + @Override + public SynodCenturionStateTriggeredAbility copy() { + return new SynodCenturionStateTriggeredAbility(this); + } + + @Override + public boolean checkTrigger(GameEvent event, Game game) { + for (Permanent perm : game.getBattlefield().getAllActivePermanents(controllerId)) { + if (!perm.getId().equals(this.getSourceId()) && perm.getCardType().contains(CardType.ARTIFACT)) { + return false; + } + } + return true; + } + + @Override + public String getRule() { + return "When you control no other artifacts, sacrifice {this}."; + } + + } +} diff --git a/Mage.Sets/src/mage/sets/fifthdawn/EnergyChamber.java b/Mage.Sets/src/mage/sets/fifthdawn/EnergyChamber.java new file mode 100644 index 0000000000..5cdcbb7352 --- /dev/null +++ b/Mage.Sets/src/mage/sets/fifthdawn/EnergyChamber.java @@ -0,0 +1,52 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.fifthdawn; + +import java.util.UUID; + +/** + * + * @author LevelX2 + */ +public class EnergyChamber extends mage.sets.elspethvstezzeret.EnergyChamber { + + public EnergyChamber(UUID ownerId) { + super(ownerId); + this.cardNumber = 117; + this.expansionSetCode = "5DN"; + } + + public EnergyChamber(final EnergyChamber card) { + super(card); + } + + @Override + public EnergyChamber copy() { + return new EnergyChamber(this); + } +} diff --git a/Mage.Sets/src/mage/sets/fifthdawn/SynodCenturion.java b/Mage.Sets/src/mage/sets/fifthdawn/SynodCenturion.java new file mode 100644 index 0000000000..77e1f1717b --- /dev/null +++ b/Mage.Sets/src/mage/sets/fifthdawn/SynodCenturion.java @@ -0,0 +1,52 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.fifthdawn; + +import java.util.UUID; + +/** + * + * @author LevelX2 + */ +public class SynodCenturion extends mage.sets.elspethvstezzeret.SynodCenturion { + + public SynodCenturion(UUID ownerId) { + super(ownerId); + this.cardNumber = 161; + this.expansionSetCode = "5DN"; + } + + public SynodCenturion(final SynodCenturion card) { + super(card); + } + + @Override + public SynodCenturion copy() { + return new SynodCenturion(this); + } +} diff --git a/Mage.Sets/src/mage/sets/futuresight/AngelOfSalvation.java b/Mage.Sets/src/mage/sets/futuresight/AngelOfSalvation.java new file mode 100644 index 0000000000..06f59ee83c --- /dev/null +++ b/Mage.Sets/src/mage/sets/futuresight/AngelOfSalvation.java @@ -0,0 +1,52 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.futuresight; + +import java.util.UUID; + +/** + * + * @author LevelX2 + */ +public class AngelOfSalvation extends mage.sets.elspethvstezzeret.AngelOfSalvation { + + public AngelOfSalvation(UUID ownerId) { + super(ownerId); + this.cardNumber = 1; + this.expansionSetCode = "FUT"; + } + + public AngelOfSalvation(final AngelOfSalvation card) { + super(card); + } + + @Override + public AngelOfSalvation copy() { + return new AngelOfSalvation(this); + } +} diff --git a/Mage.Sets/src/mage/sets/lorwyn/AuntiesHovel.java b/Mage.Sets/src/mage/sets/lorwyn/AuntiesHovel.java index 065ffdeed5..2810963eb1 100644 --- a/Mage.Sets/src/mage/sets/lorwyn/AuntiesHovel.java +++ b/Mage.Sets/src/mage/sets/lorwyn/AuntiesHovel.java @@ -46,7 +46,7 @@ import mage.target.common.TargetCardInHand; */ public class AuntiesHovel extends CardImpl<AuntiesHovel> { - private static final FilterCard filter = new FilterCard("a Goblin from your hand"); + private static final FilterCard filter = new FilterCard("a Goblin card from your hand"); static { filter.add(new SubtypePredicate("Goblin")); } diff --git a/Mage.Sets/src/mage/sets/magic2011/PhylacteryLich.java b/Mage.Sets/src/mage/sets/magic2011/PhylacteryLich.java index f767d4c906..d3cc5da153 100644 --- a/Mage.Sets/src/mage/sets/magic2011/PhylacteryLich.java +++ b/Mage.Sets/src/mage/sets/magic2011/PhylacteryLich.java @@ -96,8 +96,9 @@ public class PhylacteryLich extends CardImpl<PhylacteryLich> { @Override public boolean checkTrigger(GameEvent event, Game game) { for (Permanent perm: game.getBattlefield().getAllActivePermanents(controllerId)) { - if (perm.getCounters().getCount("phylactery") > 0) + if (perm.getCounters().getCount("phylactery") > 0) { return false; + } } return true; } diff --git a/Mage.Sets/src/mage/sets/mirrodin/RazorBarrier.java b/Mage.Sets/src/mage/sets/mirrodin/RazorBarrier.java new file mode 100644 index 0000000000..49b8783748 --- /dev/null +++ b/Mage.Sets/src/mage/sets/mirrodin/RazorBarrier.java @@ -0,0 +1,52 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.mirrodin; + +import java.util.UUID; + +/** + * + * @author LevelX2 + */ +public class RazorBarrier extends mage.sets.elspethvstezzeret.RazorBarrier { + + public RazorBarrier(UUID ownerId) { + super(ownerId); + this.cardNumber = 17; + this.expansionSetCode = "MRD"; + } + + public RazorBarrier(final RazorBarrier card) { + super(card); + } + + @Override + public RazorBarrier copy() { + return new RazorBarrier(this); + } +} diff --git a/Mage.Sets/src/mage/sets/morningtide/RusticClachan.java b/Mage.Sets/src/mage/sets/morningtide/RusticClachan.java new file mode 100644 index 0000000000..3e023e7d99 --- /dev/null +++ b/Mage.Sets/src/mage/sets/morningtide/RusticClachan.java @@ -0,0 +1,52 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.morningtide; + +import java.util.UUID; + +/** + * + * @author LevelX2 + */ +public class RusticClachan extends mage.sets.elspethvstezzeret.RusticClachan { + + public RusticClachan(UUID ownerId) { + super(ownerId); + this.cardNumber = 150; + this.expansionSetCode = "MOR"; + } + + public RusticClachan(final RusticClachan card) { + super(card); + } + + @Override + public RusticClachan copy() { + return new RusticClachan(this); + } +} diff --git a/Mage.Sets/src/mage/sets/morningtide/SwellOfCourage.java b/Mage.Sets/src/mage/sets/morningtide/SwellOfCourage.java new file mode 100644 index 0000000000..efc78a0d2c --- /dev/null +++ b/Mage.Sets/src/mage/sets/morningtide/SwellOfCourage.java @@ -0,0 +1,52 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.morningtide; + +import java.util.UUID; + +/** + * + * @author LevelX2 + */ +public class SwellOfCourage extends mage.sets.elspethvstezzeret.SwellOfCourage { + + public SwellOfCourage(UUID ownerId) { + super(ownerId); + this.cardNumber = 26; + this.expansionSetCode = "MOR"; + } + + public SwellOfCourage(final SwellOfCourage card) { + super(card); + } + + @Override + public SwellOfCourage copy() { + return new SwellOfCourage(this); + } +} diff --git a/Mage.Sets/src/mage/sets/planarchaos/StormfrontRiders.java b/Mage.Sets/src/mage/sets/planarchaos/StormfrontRiders.java new file mode 100644 index 0000000000..3af1b91b1c --- /dev/null +++ b/Mage.Sets/src/mage/sets/planarchaos/StormfrontRiders.java @@ -0,0 +1,87 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.planarchaos; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.common.ZoneChangeAllTriggeredAbility; +import mage.abilities.effects.common.CreateTokenEffect; +import mage.abilities.effects.common.ReturnToHandChosenControlledPermanentEffect; +import mage.abilities.keyword.FlyingAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; +import mage.constants.Zone; +import mage.filter.common.FilterControlledPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.other.OwnerPredicate; +import mage.game.permanent.token.SoldierToken; + +/** + * + * @author LevelX2 + */ +public class StormfrontRiders extends CardImpl<StormfrontRiders> { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent(); + + static { + filter.add(new OwnerPredicate(TargetController.YOU)); + } + + public StormfrontRiders(UUID ownerId) { + super(ownerId, 20, "Stormfront Riders", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{4}{W}"); + this.expansionSetCode = "PLC"; + this.subtype.add("Human"); + this.subtype.add("Soldier"); + + this.color.setWhite(true); + this.power = new MageInt(4); + this.toughness = new MageInt(3); + + // Flying + this.addAbility(FlyingAbility.getInstance()); + // When Stormfront Riders enters the battlefield, return two creatures you control to their owner's hand. + this.addAbility(new EntersBattlefieldTriggeredAbility(new ReturnToHandChosenControlledPermanentEffect(new FilterControlledPermanent("creatures you control"), 2))); + // Whenever Stormfront Riders or another creature is returned to your hand from the battlefield, put a 1/1 white Soldier creature token onto the battlefield. + this.addAbility(new ZoneChangeAllTriggeredAbility(Zone.BATTLEFIELD, Zone.BATTLEFIELD, Zone.HAND, new CreateTokenEffect(new SoldierToken()), + filter,"Whenever {this} or another creature is returned to your hand from the battlefield, ", false)); + + } + + public StormfrontRiders(final StormfrontRiders card) { + super(card); + } + + @Override + public StormfrontRiders copy() { + return new StormfrontRiders(this); + } +} diff --git a/Mage.Sets/src/mage/sets/prophecy/Foil.java b/Mage.Sets/src/mage/sets/prophecy/Foil.java new file mode 100644 index 0000000000..d470c1937c --- /dev/null +++ b/Mage.Sets/src/mage/sets/prophecy/Foil.java @@ -0,0 +1,78 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.prophecy; + +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.costs.AlternativeCostSourceAbility; +import mage.abilities.costs.common.DiscardTargetCost; +import mage.abilities.effects.common.CounterTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.FilterCard; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.TargetSpell; +import mage.target.common.TargetCardInHand; + +/** + * + * @author LevelX2 + */ +public class Foil extends CardImpl<Foil> { + + private static final FilterCard filter = new FilterCard("an Island card"); + static { + filter.add(new SubtypePredicate("Island")); + } + + public Foil(UUID ownerId) { + super(ownerId, 34, "Foil", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{2}{U}{U}"); + this.expansionSetCode = "PCY"; + + this.color.setBlue(true); + + // You may discard an Island card and another card rather than pay Foil's mana cost. + Ability ability = new AlternativeCostSourceAbility(new DiscardTargetCost(new TargetCardInHand(filter))); + ability.addCost(new DiscardTargetCost(new TargetCardInHand(new FilterCard("another card")))); + this.addAbility(ability); + + // Counter target spell. + this.getSpellAbility().addEffect(new CounterTargetEffect()); + this.getSpellAbility().addTarget(new TargetSpell()); + } + + public Foil(final Foil card) { + super(card); + } + + @Override + public Foil copy() { + return new Foil(this); + } +} diff --git a/Mage.Sets/src/mage/sets/timespiral/AssemblyWorker.java b/Mage.Sets/src/mage/sets/timespiral/AssemblyWorker.java new file mode 100644 index 0000000000..c4844ab9b1 --- /dev/null +++ b/Mage.Sets/src/mage/sets/timespiral/AssemblyWorker.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.sets.timespiral; + +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.common.counter.AddCountersTargetEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.filter.common.FilterCreaturePermanent; +import mage.filter.predicate.mageobject.SubtypePredicate; +import mage.target.TargetPermanent; + +/** + * + * @author LevelX2 + */ +public class AssemblyWorker extends CardImpl<AssemblyWorker> { + + private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("Assembly-Worker creature"); + + static { + filter.add(new SubtypePredicate("Assembly-Worker")); + } + + public AssemblyWorker(UUID ownerId) { + super(ownerId, 248, "Assembly-Worker", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{3}"); + this.expansionSetCode = "TSP"; + this.subtype.add("Assembly-Worker"); + + this.power = new MageInt(2); + this.toughness = new MageInt(2); + + // {tap}: Target Assembly-Worker creature gets +1/+1 until end of turn. + Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersTargetEffect(CounterType.P1P1.createInstance()), new TapSourceCost()); + ability.addTarget(new TargetPermanent(filter, true)); + this.addAbility(ability); + } + + public AssemblyWorker(final AssemblyWorker card) { + super(card); + } + + @Override + public AssemblyWorker copy() { + return new AssemblyWorker(this); + } +} diff --git a/Mage.Sets/src/mage/sets/timespiral/ClockworkHydra.java b/Mage.Sets/src/mage/sets/timespiral/ClockworkHydra.java new file mode 100644 index 0000000000..ae535510c9 --- /dev/null +++ b/Mage.Sets/src/mage/sets/timespiral/ClockworkHydra.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.sets.timespiral; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.Ability; +import mage.abilities.common.AttacksOrBlocksTriggeredAbility; +import mage.abilities.common.EntersBattlefieldAbility; +import mage.abilities.common.SimpleActivatedAbility; +import mage.abilities.costs.common.TapSourceCost; +import mage.abilities.effects.Effect; +import mage.abilities.effects.OneShotEffect; +import mage.abilities.effects.common.DamageTargetEffect; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Outcome; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.counters.CounterType; +import mage.game.Game; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.Target; +import mage.target.common.TargetCreatureOrPlayer; +import mage.target.targetpointer.FixedTarget; + +/** + * + * @author LevelX2 + */ +public class ClockworkHydra extends CardImpl<ClockworkHydra> { + + public ClockworkHydra(UUID ownerId) { + super(ownerId, 253, "Clockwork Hydra", Rarity.UNCOMMON, new CardType[]{CardType.ARTIFACT, CardType.CREATURE}, "{5}"); + this.expansionSetCode = "TSP"; + this.subtype.add("Hydra"); + this.power = new MageInt(0); + this.toughness = new MageInt(0); + + // Clockwork Hydra enters the battlefield with four +1/+1 counters on it. + Effect effect = new AddCountersSourceEffect(CounterType.P1P1.createInstance(4)); + effect.setText("with four +1/+1 counters on it"); + this.addAbility(new EntersBattlefieldAbility(effect)); + // Whenever Clockwork Hydra attacks or blocks, remove a +1/+1 counter from it. If you do, Clockwork Hydra deals 1 damage to target creature or player. + this.addAbility(new AttacksOrBlocksTriggeredAbility(new ClockworkHydraEffect(), false)); + + // {tap}: Put a +1/+1 counter on Clockwork Hydra. + this.addAbility(new SimpleActivatedAbility(Zone.BATTLEFIELD, new AddCountersSourceEffect(CounterType.P1P1.createInstance(), true), new TapSourceCost())); + } + + public ClockworkHydra(final ClockworkHydra card) { + super(card); + } + + @Override + public ClockworkHydra copy() { + return new ClockworkHydra(this); + } + +} + +class ClockworkHydraEffect extends OneShotEffect<ClockworkHydraEffect> { + + public ClockworkHydraEffect() { + super(Outcome.Damage); + this.staticText = "remove a +1/+1 counter from it. If you do, {this} deals 1 damage to target creature or player"; + } + + public ClockworkHydraEffect(final ClockworkHydraEffect effect) { + super(effect); + } + + @Override + public ClockworkHydraEffect copy() { + return new ClockworkHydraEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Permanent permanent = game.getPermanent(source.getSourceId()); + Player controller = game.getPlayer(source.getControllerId()); + if (controller != null && permanent != null && permanent.getCounters().getCount(CounterType.P1P1) > 0) { + permanent.removeCounters(CounterType.P1P1.createInstance(), game); + Target target = new TargetCreatureOrPlayer(true); + if (controller.chooseTarget(outcome, target, source, game)) { + Effect effect = new DamageTargetEffect(1); + effect.setTargetPointer(new FixedTarget(target.getFirstTarget())); + return effect.apply(game, source); + } + return true; + } + return false; + } +} diff --git a/Mage.Sets/src/mage/sets/weatherlight/SerratedBiskelion.java b/Mage.Sets/src/mage/sets/weatherlight/SerratedBiskelion.java new file mode 100644 index 0000000000..e2d3a75541 --- /dev/null +++ b/Mage.Sets/src/mage/sets/weatherlight/SerratedBiskelion.java @@ -0,0 +1,52 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.weatherlight; + +import java.util.UUID; + +/** + * + * @author LevelX2 + */ +public class SerratedBiskelion extends mage.sets.elspethvstezzeret.SerratedBiskelion { + + public SerratedBiskelion(UUID ownerId) { + super(ownerId); + this.cardNumber = 156; + this.expansionSetCode = "WTH"; + } + + public SerratedBiskelion(final SerratedBiskelion card) { + super(card); + } + + @Override + public SerratedBiskelion copy() { + return new SerratedBiskelion(this); + } +} diff --git a/Mage/src/mage/abilities/costs/AlternativeCostSourceAbility.java b/Mage/src/mage/abilities/costs/AlternativeCostSourceAbility.java index 5a731088ad..d9acc404ee 100644 --- a/Mage/src/mage/abilities/costs/AlternativeCostSourceAbility.java +++ b/Mage/src/mage/abilities/costs/AlternativeCostSourceAbility.java @@ -156,7 +156,7 @@ public class AlternativeCostSourceAbility extends StaticAbility<AlternativeCostS sb.append(alternativeCost.getText(false)); remarkText = alternativeCost.getReminderText(); } else { - sb.append(" and/or ").append(alternativeCost.getText(true)); + sb.append(" and ").append(alternativeCost.getText(true)); } ++numberCosts; } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/AttackingCreatureCount.java b/Mage/src/mage/abilities/dynamicvalue/common/AttackingCreatureCount.java index 437f522faf..3a276ebf5e 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/AttackingCreatureCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/AttackingCreatureCount.java @@ -77,6 +77,6 @@ public class AttackingCreatureCount implements DynamicValue { @Override public String toString() { - return "1"; + return "X"; } } diff --git a/Mage/src/mage/abilities/effects/common/PreventDamageTargetAmountEffect.java b/Mage/src/mage/abilities/effects/common/PreventDamageTargetAmountEffect.java new file mode 100644 index 0000000000..21f278b593 --- /dev/null +++ b/Mage/src/mage/abilities/effects/common/PreventDamageTargetAmountEffect.java @@ -0,0 +1,145 @@ +/* + * 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 java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import mage.abilities.Ability; +import mage.abilities.Mode; +import mage.abilities.effects.PreventionEffectImpl; +import mage.constants.Duration; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.permanent.Permanent; +import mage.players.Player; +import mage.target.Target; +import mage.target.common.TargetCreatureOrPlayerAmount; + +/** + * + * @author LevelX2 + */ + +public class PreventDamageTargetAmountEffect extends PreventionEffectImpl<PreventDamageTargetAmountEffect> { + + private final int amount; + private final Map<UUID, Integer> targetAmountMap = new HashMap<>(); + + public PreventDamageTargetAmountEffect(Duration duration, int amount) { + super(duration); + this.amount = amount; + } + + public PreventDamageTargetAmountEffect(final PreventDamageTargetAmountEffect effect) { + super(effect); + this.amount = effect.amount; + } + + @Override + public PreventDamageTargetAmountEffect copy() { + return new PreventDamageTargetAmountEffect(this); + } + + @Override + public void init(Ability source, Game game) { + super.init(source, game); + Target target = source.getTargets().get(0); + Permanent sourcePermanent = game.getPermanentOrLKIBattlefield(source.getSourceId()); + if (target instanceof TargetCreatureOrPlayerAmount && sourcePermanent != null) { + TargetCreatureOrPlayerAmount multiTarget = (TargetCreatureOrPlayerAmount) target; + for (UUID targetId: multiTarget.getTargets()) { + Player player = null; + Permanent permanent = game.getPermanent(targetId); + if (permanent == null) { + player = game.getPlayer(targetId); + } + targetAmountMap.put(targetId, multiTarget.getTargetAmount(targetId)); + StringBuilder sb = new StringBuilder(sourcePermanent.getName()).append(": Prevent the next "); + sb.append(multiTarget.getTargetAmount(targetId)).append(" damage to "); + if (player != null) { + sb.append(player.getName()); + } else if (permanent != null) { + sb.append(permanent.getName()); + } + game.informPlayers(sb.toString()); + + } + } + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + int targetAmount = targetAmountMap.get(event.getTargetId()); + GameEvent preventEvent = new GameEvent(GameEvent.EventType.PREVENT_DAMAGE, source.getFirstTarget(), source.getSourceId(), source.getControllerId(), event.getAmount(), false); + if (!game.replaceEvent(preventEvent)) { + if (event.getAmount() >= targetAmount) { + int damage = targetAmount; + event.setAmount(event.getAmount() - targetAmount); + targetAmountMap.remove(event.getTargetId()); + game.fireEvent(GameEvent.getEvent(GameEvent.EventType.PREVENTED_DAMAGE, source.getFirstTarget(), source.getSourceId(), source.getControllerId(), damage)); + } else { + int damage = event.getAmount(); + event.setAmount(0); + targetAmountMap.put(event.getTargetId(), targetAmount -= damage); + game.fireEvent(GameEvent.getEvent(GameEvent.EventType.PREVENTED_DAMAGE, source.getFirstTarget(), source.getSourceId(), source.getControllerId(), damage)); + } + if (targetAmountMap.isEmpty()) { + this.used = true; + } + } + return false; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (!used && super.applies(event, source, game) && targetAmountMap.containsKey(event.getTargetId())) { + return true; + } + return false; + } + + @Override + public String getText(Mode mode) { + // prevent the next 5 damage that would be dealt this turn to any number of target creatures and/or players, divided as you choose + StringBuilder sb = new StringBuilder(); + sb.append("Prevent the next ").append(amount).append(" damage that would be dealt "); + if (duration.equals(Duration.EndOfTurn)) { + sb.append("this turn "); + } + sb.append("to any number of target creatures and/or players, divided as you choose"); + return sb.toString(); + } + +} diff --git a/Mage/src/mage/abilities/effects/common/ReturnToHandChosenControlledPermanentEffect.java b/Mage/src/mage/abilities/effects/common/ReturnToHandChosenControlledPermanentEffect.java index a7ba5f6bc8..fe5c561409 100644 --- a/Mage/src/mage/abilities/effects/common/ReturnToHandChosenControlledPermanentEffect.java +++ b/Mage/src/mage/abilities/effects/common/ReturnToHandChosenControlledPermanentEffect.java @@ -27,6 +27,8 @@ */ package mage.abilities.effects.common; +import java.util.List; +import java.util.UUID; import mage.abilities.Ability; import mage.abilities.effects.OneShotEffect; import mage.constants.Outcome; @@ -36,6 +38,7 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetControlledPermanent; +import mage.util.CardUtil; /** * @@ -43,17 +46,23 @@ import mage.target.common.TargetControlledPermanent; */ public class ReturnToHandChosenControlledPermanentEffect extends OneShotEffect<ReturnToHandChosenControlledPermanentEffect> { - private FilterControlledPermanent filter; + private final FilterControlledPermanent filter; + private int number; public ReturnToHandChosenControlledPermanentEffect(FilterControlledPermanent filter) { + this(filter, 1); + } + public ReturnToHandChosenControlledPermanentEffect(FilterControlledPermanent filter, int number) { super(Outcome.ReturnToHand); this.filter = filter; - this.staticText = "return a " + filter.getMessage() + " to its owner's hand"; + this.number = number; + this.staticText = getText(); } public ReturnToHandChosenControlledPermanentEffect(final ReturnToHandChosenControlledPermanentEffect effect) { super(effect); this.filter = effect.filter; + this.number = effect.number; } @Override @@ -65,19 +74,30 @@ public class ReturnToHandChosenControlledPermanentEffect extends OneShotEffect<R public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); if (player != null) { - TargetControlledPermanent target = new TargetControlledPermanent(filter); - target.setNotTarget(true); + TargetControlledPermanent target = new TargetControlledPermanent(number, number, filter, true); target.setRequired(true); if (player.choose(this.outcome, target, source.getSourceId(), game)) { - Permanent permanent = game.getPermanent(target.getFirstTarget()); - if (permanent != null) { - game.informPlayers(player.getName() + " returns " + permanent.getName() + " to his or her hand."); - return permanent.moveToZone(Zone.HAND, source.getId(), game, false); + for (UUID targetCreatureId : (List<UUID>)target.getTargets()) { + Permanent permanent = game.getPermanent(targetCreatureId); + if (permanent != null) { + player.moveCardToHandWithInfo(permanent, source.getSourceId(), game, Zone.BATTLEFIELD); + } } } return true; } return false; } - + + private String getText() { + StringBuilder sb = new StringBuilder("return "); + sb.append(CardUtil.numberToText(number, "a")); + sb.append(" ").append(filter.getMessage()); + if (number > 1) { + sb.append(" to its owner's hand"); + } else { + sb.append(" to their owner's hand"); + } + return sb.toString(); + } } diff --git a/Mage/src/mage/abilities/keyword/ReinforceAbility.java b/Mage/src/mage/abilities/keyword/ReinforceAbility.java index a1a634d8af..9a4e5f4696 100644 --- a/Mage/src/mage/abilities/keyword/ReinforceAbility.java +++ b/Mage/src/mage/abilities/keyword/ReinforceAbility.java @@ -4,23 +4,30 @@ package mage.abilities.keyword; import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.costs.Cost; import mage.abilities.costs.common.DiscardSourceCost; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.common.counter.AddCountersTargetEffect; import mage.constants.Zone; import mage.counters.CounterType; import mage.target.common.TargetCreaturePermanent; public class ReinforceAbility extends SimpleActivatedAbility { - private int count; + private DynamicValue count; private Cost cost; public ReinforceAbility(int count, Cost cost) { - super(Zone.HAND, new AddCountersTargetEffect(CounterType.P1P1.createInstance(count)), cost); + this(new StaticValue(count), cost); + } + + public ReinforceAbility(DynamicValue count, Cost cost) { + super(Zone.HAND, new AddCountersTargetEffect(CounterType.P1P1.createInstance(0), count), cost); this.addCost(new DiscardSourceCost()); this.addTarget(new TargetCreaturePermanent()); this.cost = cost.copy(); this.count = count; } + public ReinforceAbility(final ReinforceAbility ability) { super(ability); this.cost = ability.cost.copy(); @@ -34,6 +41,11 @@ public class ReinforceAbility extends SimpleActivatedAbility { @Override public String getRule() { - return "Reinforce " + count + " - " + cost.getText(); + StringBuilder sb = new StringBuilder("Reinforce "); + sb.append(count.toString()).append(" - "); + sb.append(cost.getText()); + sb.append(" <i>(").append(cost.getText()).append("Discard this card: Put "); + sb.append(count.toString()).append(" +1/+1 counters on target creature."); + return sb.toString(); } } diff --git a/Mage/src/mage/target/TargetAmount.java b/Mage/src/mage/target/TargetAmount.java index 1a22b943bd..9c83080c5f 100644 --- a/Mage/src/mage/target/TargetAmount.java +++ b/Mage/src/mage/target/TargetAmount.java @@ -128,7 +128,7 @@ public abstract class TargetAmount<T extends TargetAmount<T>> extends TargetImpl @Override public List<T> getTargetOptions(Ability source, Game game) { - List<T> options = new ArrayList<T>(); + List<T> options = new ArrayList<>(); Set<UUID> possibleTargets = possibleTargets(source.getSourceId(), source.getControllerId(), game); addTargets(this, possibleTargets, options, source, game); @@ -146,7 +146,7 @@ public abstract class TargetAmount<T extends TargetAmount<T>> extends TargetImpl t.addTarget(targetId, n, source, game, true); if (t.remainingAmount > 0) { if (targets.size() > 1) { - Set<UUID> newTargets = new HashSet<UUID>(); + Set<UUID> newTargets = new HashSet<>(); for (UUID newTarget: targets) { if (!newTarget.equals(targetId)) { newTargets.add(newTarget); diff --git a/Mage/src/mage/target/common/TargetCreatureOrPlayerAmount.java b/Mage/src/mage/target/common/TargetCreatureOrPlayerAmount.java index ef6bd182eb..b5327623fa 100644 --- a/Mage/src/mage/target/common/TargetCreatureOrPlayerAmount.java +++ b/Mage/src/mage/target/common/TargetCreatureOrPlayerAmount.java @@ -164,7 +164,7 @@ public class TargetCreatureOrPlayerAmount extends TargetAmount<TargetCreatureOrP @Override public Set<UUID> possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) { - Set<UUID> possibleTargets = new HashSet<UUID>(); + Set<UUID> possibleTargets = new HashSet<>(); MageObject targetSource = game.getObject(sourceId); for (UUID playerId: game.getPlayer(sourceControllerId).getInRange()) { Player player = game.getPlayer(playerId); @@ -182,7 +182,7 @@ public class TargetCreatureOrPlayerAmount extends TargetAmount<TargetCreatureOrP @Override public Set<UUID> possibleTargets(UUID sourceControllerId, Game game) { - Set<UUID> possibleTargets = new HashSet<UUID>(); + Set<UUID> possibleTargets = new HashSet<>(); for (UUID playerId: game.getPlayer(sourceControllerId).getInRange()) { Player player = game.getPlayer(playerId); if (player != null && filter.match(player, game)) { diff --git a/Utils/BlockedFlyerTrace.txt b/Utils/BlockedFlyerTrace.txt index 1039ab50a8..e57e0a65a8 100644 --- a/Utils/BlockedFlyerTrace.txt +++ b/Utils/BlockedFlyerTrace.txt @@ -144,103 +144,72 @@ ERROR [2013-07-01 15:46 [59:945]] TraceUtil[pool-3-thread-7]: [935461d9-1835-46f ERROR [2013-07-01 15:46 [59:945]] TraceUtil[pool-3-thread-7]: [935461d9-1835-46f1-aa75-45e37a018161] test_zone: LIBRARY ERROR [2013-07-01 15:46 [59:945]] TraceUtil[pool-3-thread-7]: [935461d9-1835-46f1-aa75-45e37a018161] -WARN [2014-02-18 20:36 [55:460]] TraceUtil[pool-2-thread-66]: Found creature with intimidate blocked by non artifact not sharing color creature -ERROR [2014-02-18 20:36 [55:461]] Tracing game state... -ERROR [2014-02-18 20:36 [55:462]] Asphodel Wanderer could block Warchanter of Mogis -ERROR [2014-02-18 20:36 [55:462]] -ERROR [2014-02-18 20:36 [55:463]] Attacker abilities: -ERROR [2014-02-18 20:36 [55:464]] Cast Warchanter of Mogis, id=96c1f6b5-8e44-41e3-87db-c8075c1a06eb -ERROR [2014-02-18 20:36 [55:465]] <i>Inspired</i> - Whenever {this} becomes untapped, Target creature you control gains Intimidate until end of turn., id=06cac06c-89d3-4779-806c-397f8f369d6c -ERROR [2014-02-18 20:36 [55:465]] Intimidate, id=16012faf-5584-42f2-bc49-fa30f1f54b7b -ERROR [2014-02-18 20:36 [55:466]] Blocker abilities: -ERROR [2014-02-18 20:36 [55:466]] Cast Asphodel Wanderer, id=25f47911-e597-4745-add6-22796e32705c -ERROR [2014-02-18 20:36 [55:467]] {2}{B}: Regenerate {this}., id=6e76d7c4-38d0-49d0-804d-7c401ff784ec -ERROR [2014-02-18 20:36 [55:473]] -ERROR [2014-02-18 20:36 [55:474]] Flying ability id: 87c77737-7d0e-45d4-aab6-9d164b30e555 -ERROR [2014-02-18 20:36 [55:475]] Reach ability id: 4b9f81ca-6448-4c44-8894-d1f8db7bdd17 -ERROR [2014-02-18 20:36 [55:475]] -ERROR [2014-02-18 20:36 [55:476]] Restriction effects: -ERROR [2014-02-18 20:36 [55:477]] mage.abilities.keyword.FlyingEffect@1a1f2f4e -ERROR [2014-02-18 20:36 [55:477]] id=dc298313-227c-4aca-a530-649686ecf004 -ERROR [2014-02-18 20:36 [55:478]] applies to attacker=false -ERROR [2014-02-18 20:36 [55:479]] applies to blocker=false -ERROR [2014-02-18 20:36 [55:500]] mage.abilities.effects.common.combat.UnblockableSourceEffect@83b38cb -ERROR [2014-02-18 20:36 [55:500]] id=e1e6fb76-2acd-4f3c-84e8-bff03a088263 -ERROR [2014-02-18 20:36 [55:501]] applies to attacker=true -ERROR [2014-02-18 20:36 [55:502]] applies to blocker=false -ERROR [2014-02-18 20:36 [55:503]] mage.abilities.effects.common.combat.UnblockableAttachedEffect@7993f5ef -ERROR [2014-02-18 20:36 [55:503]] id=97fb7fae-c2ee-4edb-8694-e432065433e2 -ERROR [2014-02-18 20:36 [55:504]] applies to attacker=false -ERROR [2014-02-18 20:36 [55:505]] applies to blocker=false -ERROR [2014-02-18 20:36 [55:505]] mage.abilities.effects.common.combat.UnblockableAttachedEffect@51758ff6 -ERROR [2014-02-18 20:36 [55:506]] id=a88699ee-44dd-4506-87fd-ea45160f0149 -ERROR [2014-02-18 20:36 [55:507]] applies to attacker=false -ERROR [2014-02-18 20:36 [55:507]] applies to blocker=false -ERROR [2014-02-18 20:36 [55:514]] mage.abilities.keyword.IntimidateEffect@a120547 -ERROR [2014-02-18 20:36 [55:515]] id=f884b7e8-2cfb-473f-942e-c34089276cd1 -ERROR [2014-02-18 20:36 [55:515]] applies to attacker=true -ERROR [2014-02-18 20:36 [55:516]] applies to blocker=false - - -ERROR [2014-02-18 20:36 [55:517]] instanceof StaticAbility: true, ability=Flying -ERROR [2014-02-18 20:36 [55:517]] usable zone: false, ability=Flying -ERROR [2014-02-18 20:36 [55:518]] zone: BATTLEFIELD -ERROR [2014-02-18 20:36 [55:519]] object: null -ERROR [2014-02-18 20:36 [55:538]] test_zone: null - -ERROR [2014-02-18 20:36 [55:539]] instanceof StaticAbility: true, ability={this} is unblockable. -ERROR [2014-02-18 20:36 [55:540]] usable zone: false, ability={this} is unblockable. -ERROR [2014-02-18 20:36 [55:540]] zone: BATTLEFIELD -ERROR [2014-02-18 20:36 [55:541]] object: mage.sets.bornofthegods.FlitterstepEidolon@3386337c -ERROR [2014-02-18 20:36 [55:542]] contains ability: true -ERROR [2014-02-18 20:36 [55:542]] test_zone: LIBRARY - -ERROR [2014-02-18 20:36 [55:543]] instanceof StaticAbility: true, ability=Enchanted creature gets +1/+1. Enchanted creature is unblockable. -ERROR [2014-02-18 20:36 [55:549]] usable zone: false, ability=Enchanted creature gets +1/+1. Enchanted creature is unblockable. -ERROR [2014-02-18 20:36 [55:550]] zone: BATTLEFIELD -ERROR [2014-02-18 20:36 [55:551]] object: mage.sets.bornofthegods.FlitterstepEidolon@3386337c -ERROR [2014-02-18 20:36 [55:552]] contains ability: true -ERROR [2014-02-18 20:36 [55:553]] test_zone: LIBRARY - -ERROR [2014-02-18 20:36 [55:553]] instanceof StaticAbility: true, ability=Enchanted creature is unblockable. -ERROR [2014-02-18 20:36 [55:554]] usable zone: false, ability=Enchanted creature is unblockable. -ERROR [2014-02-18 20:36 [55:555]] zone: BATTLEFIELD -ERROR [2014-02-18 20:36 [55:556]] object: mage.sets.theros.AqueousForm@3580a9bb -ERROR [2014-02-18 20:36 [55:556]] contains ability: true -ERROR [2014-02-18 20:36 [55:582]] test_zone: OUTSIDE - -ERROR [2014-02-18 20:36 [55:583]] ability=Intimidate, applies_to_attacker=true -ERROR [2014-02-18 20:36 [55:583]] instanceof StaticAbility: true, ability=Flying -ERROR [2014-02-18 20:36 [55:584]] usable zone: false, ability=Flying -ERROR [2014-02-18 20:36 [55:585]] zone: BATTLEFIELD -ERROR [2014-02-18 20:36 [55:585]] object: null -ERROR [2014-02-18 20:36 [55:586]] test_zone: null - -ERROR [2014-02-18 20:36 [55:587]] instanceof StaticAbility: true, ability={this} is unblockable. -ERROR [2014-02-18 20:36 [55:587]] usable zone: false, ability={this} is unblockable. -ERROR [2014-02-18 20:36 [55:588]] zone: BATTLEFIELD -ERROR [2014-02-18 20:36 [55:589]] object: mage.sets.bornofthegods.FlitterstepEidolon@3386337c -ERROR [2014-02-18 20:36 [55:589]] contains ability: true -ERROR [2014-02-18 20:36 [55:590]] test_zone: LIBRARY - -ERROR [2014-02-18 20:36 [55:591]] instanceof StaticAbility: true, ability=Enchanted creature gets +1/+1. Enchanted creature is unblockable. -ERROR [2014-02-18 20:36 [55:591]] usable zone: false, ability=Enchanted creature gets +1/+1. Enchanted creature is unblockable. -ERROR [2014-02-18 20:36 [55:592]] zone: BATTLEFIELD -ERROR [2014-02-18 20:36 [55:593]] object: mage.sets.bornofthegods.FlitterstepEidolon@3386337c -ERROR [2014-02-18 20:36 [55:593]] contains ability: true -ERROR [2014-02-18 20:36 [55:603]] test_zone: LIBRARY - -ERROR [2014-02-18 20:36 [55:604]] instanceof StaticAbility: true, ability=Enchanted creature is unblockable. -ERROR [2014-02-18 20:36 [55:605]] usable zone: false, ability=Enchanted creature is unblockable. -ERROR [2014-02-18 20:36 [55:605]] zone: BATTLEFIELD -ERROR [2014-02-18 20:36 [55:606]] object: mage.sets.theros.AqueousForm@3580a9bb -ERROR [2014-02-18 20:36 [55:606]] contains ability: true -ERROR [2014-02-18 20:36 [55:607]] test_zone: OUTSIDE - -ERROR [2014-02-18 20:36 [55:608]] instanceof StaticAbility: true, ability=Intimidate -ERROR [2014-02-18 20:36 [55:608]] usable zone: false, ability=Intimidate -ERROR [2014-02-18 20:36 [55:609]] zone: BATTLEFIELD -ERROR [2014-02-18 20:36 [55:609]] object: Warchanter of Mogis-BNG -ERROR [2014-02-18 20:36 [55:610]] contains ability: true -ERROR [2014-02-18 20:36 [55:610]] test_zone: BATTLEFIELD -ERROR [2014-02-18 20:36 [55:611]] \ No newline at end of file +ERROR [2014-02-22 11:59 [46:811]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] Tracing game state... +ERROR [2014-02-22 11:59 [46:812]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] Hopeful Eidolon could block Lifebane Zombie +ERROR [2014-02-22 11:59 [46:813]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] +ERROR [2014-02-22 11:59 [46:813]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] Attacker abilities: +ERROR [2014-02-22 11:59 [46:814]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] Cast Lifebane Zombie, id=c795314b-69b9-41c2-9f4b-4082eedf31da +ERROR [2014-02-22 11:59 [46:814]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] Intimidate, id=e26a7967-9a37-4523-b389-3a4173847831 +ERROR [2014-02-22 11:59 [46:815]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] When {this} enters the battlefield, Target opponent reveals his or her hand. You choose a green or white creature card from it and exile that card., id=8963ba91-b592-4005-bcf3-384994f6ffb4 +ERROR [2014-02-22 11:59 [46:815]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] Blocker abilities: +ERROR [2014-02-22 11:59 [46:816]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] Cast Hopeful Eidolon, id=be90bc65-328a-49e6-9e92-2a79597a7476 +ERROR [2014-02-22 11:59 [46:816]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] , id=49e05f50-a805-40ed-ace9-2b3ee8fa9840 +ERROR [2014-02-22 11:59 [46:817]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] Cast Hopeful Eidolon using bestow, id=19fb1ec2-615c-4d51-96c1-d47d5bafc814 +ERROR [2014-02-22 11:59 [46:817]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] Lifelink <i>(Damage dealt by this creature also causes you to gain that much life.)</i>, id=a1615f43-e2f2-46f7-9d71-ed694be1e244 +ERROR [2014-02-22 11:59 [46:818]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] Enchanted creature gets +1/+1 and has lifelink., id=74667379-ea0e-4296-affe-aa3cc739bb20 +ERROR [2014-02-22 11:59 [46:818]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] Protection from Black, id=96702e91-2ad9-4bac-aa61-5f8285634b54 +ERROR [2014-02-22 11:59 [46:819]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] +ERROR [2014-02-22 11:59 [46:819]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] Flying ability id: af646a89-23b6-48c9-98dc-fc73dabe39a9 +ERROR [2014-02-22 11:59 [46:820]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] Reach ability id: b9161eb7-32c3-4969-9752-e3fcae2f1b85 +ERROR [2014-02-22 11:59 [46:823]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] Intimidate ability id: e26a7967-9a37-4523-b389-3a4173847831 +ERROR [2014-02-22 11:59 [46:824]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] +ERROR [2014-02-22 11:59 [46:824]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] Restriction effects: +ERROR [2014-02-22 11:59 [46:825]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] mage.abilities.keyword.FlyingEffect@59f32851 +ERROR [2014-02-22 11:59 [46:826]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] id=772a740e-e0de-4f2e-ac9f-60b9f5a1c88c +ERROR [2014-02-22 11:59 [46:826]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] applies to attacker=false +ERROR [2014-02-22 11:59 [46:827]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] applies to blocker=false +ERROR [2014-02-22 11:59 [46:827]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] mage.abilities.keyword.UnleashRestrictionEffect@6acf55a8 +ERROR [2014-02-22 11:59 [46:828]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] id=305f2174-0ebb-409b-b6a0-4fb63e722222 +ERROR [2014-02-22 11:59 [46:828]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] applies to attacker=false +ERROR [2014-02-22 11:59 [46:829]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] applies to blocker=false +ERROR [2014-02-22 11:59 [46:829]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] mage.abilities.keyword.UnleashRestrictionEffect@31943951 +ERROR [2014-02-22 11:59 [46:830]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] id=31a81585-aee6-40ae-8a76-e676cec52bda +ERROR [2014-02-22 11:59 [46:830]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] applies to attacker=false +ERROR [2014-02-22 11:59 [46:831]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] applies to blocker=false +ERROR [2014-02-22 11:59 [46:831]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] mage.abilities.keyword.UnleashRestrictionEffect@39290267 +ERROR [2014-02-22 11:59 [46:832]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] id=275a48cb-fba0-4fb8-b2fb-c98cbadd78e6 +ERROR [2014-02-22 11:59 [46:832]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] applies to attacker=false +ERROR [2014-02-22 11:59 [46:833]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] applies to blocker=false +ERROR [2014-02-22 11:59 [46:834]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] mage.abilities.keyword.UnleashRestrictionEffect@47b5d63a +ERROR [2014-02-22 11:59 [46:834]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] id=8f00cf34-7635-4592-8d23-0f427e00cee9 +ERROR [2014-02-22 11:59 [46:835]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] applies to attacker=false +ERROR [2014-02-22 11:59 [46:835]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] applies to blocker=false +ERROR [2014-02-22 11:59 [46:836]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] effect=mage.abilities.keyword.FlyingEffect@59f32851 id=772a740e-e0de-4f2e-ac9f-60b9f5a1c88c +ERROR [2014-02-22 11:59 [46:836]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] instanceof StaticAbility: true, ability=Flying +ERROR [2014-02-22 11:59 [46:837]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] usable zone: false, ability=Flying +ERROR [2014-02-22 11:59 [46:837]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] zone: BATTLEFIELD +ERROR [2014-02-22 11:59 [46:838]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] object: null +ERROR [2014-02-22 11:59 [46:838]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] test_zone: null +ERROR [2014-02-22 11:59 [46:839]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] effect=mage.abilities.keyword.UnleashRestrictionEffect@6acf55a8 id=305f2174-0ebb-409b-b6a0-4fb63e722222 +ERROR [2014-02-22 11:59 [46:839]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] ability=Unleash <i>(You may have this creature enter the battlefield with a +1/+1 counter on it. It can't block as long as it has a +1/+1 counter on it.)</i>, applies_to_attacker=false +ERROR [2014-02-22 11:59 [46:840]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] effect=mage.abilities.keyword.UnleashRestrictionEffect@31943951 id=31a81585-aee6-40ae-8a76-e676cec52bda +ERROR [2014-02-22 11:59 [46:840]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] ability=Unleash <i>(You may have this creature enter the battlefield with a +1/+1 counter on it. It can't block as long as it has a +1/+1 counter on it.)</i>, applies_to_attacker=false +ERROR [2014-02-22 11:59 [46:841]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] effect=mage.abilities.keyword.UnleashRestrictionEffect@39290267 id=275a48cb-fba0-4fb8-b2fb-c98cbadd78e6 +ERROR [2014-02-22 11:59 [46:842]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] ability=Unleash <i>(You may have this creature enter the battlefield with a +1/+1 counter on it. It can't block as long as it has a +1/+1 counter on it.)</i>, applies_to_attacker=false +ERROR [2014-02-22 11:59 [46:842]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] effect=mage.abilities.keyword.UnleashRestrictionEffect@47b5d63a id=8f00cf34-7635-4592-8d23-0f427e00cee9 +ERROR [2014-02-22 11:59 [46:843]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] ability=Unleash <i>(You may have this creature enter the battlefield with a +1/+1 counter on it. It can't block as long as it has a +1/+1 counter on it.)</i>, applies_to_attacker=false +ERROR [2014-02-22 11:59 [46:843]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] effect=mage.abilities.keyword.FlyingEffect@59f32851 id=772a740e-e0de-4f2e-ac9f-60b9f5a1c88c +ERROR [2014-02-22 11:59 [46:850]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] instanceof StaticAbility: true, ability=Flying +ERROR [2014-02-22 11:59 [46:850]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] usable zone: false, ability=Flying +ERROR [2014-02-22 11:59 [46:851]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] zone: BATTLEFIELD +ERROR [2014-02-22 11:59 [46:852]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] object: null +ERROR [2014-02-22 11:59 [46:852]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] test_zone: null +ERROR [2014-02-22 11:59 [46:853]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] effect=mage.abilities.keyword.UnleashRestrictionEffect@6acf55a8 id=305f2174-0ebb-409b-b6a0-4fb63e722222 +ERROR [2014-02-22 11:59 [46:853]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] ability=Unleash <i>(You may have this creature enter the battlefield with a +1/+1 counter on it. It can't block as long as it has a +1/+1 counter on it.)</i>, applies_to_attacker=false +ERROR [2014-02-22 11:59 [46:854]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] effect=mage.abilities.keyword.UnleashRestrictionEffect@31943951 id=31a81585-aee6-40ae-8a76-e676cec52bda +ERROR [2014-02-22 11:59 [46:854]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] ability=Unleash <i>(You may have this creature enter the battlefield with a +1/+1 counter on it. It can't block as long as it has a +1/+1 counter on it.)</i>, applies_to_attacker=false +ERROR [2014-02-22 11:59 [46:855]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] effect=mage.abilities.keyword.UnleashRestrictionEffect@39290267 id=275a48cb-fba0-4fb8-b2fb-c98cbadd78e6 +ERROR [2014-02-22 11:59 [46:855]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] ability=Unleash <i>(You may have this creature enter the battlefield with a +1/+1 counter on it. It can't block as long as it has a +1/+1 counter on it.)</i>, applies_to_attacker=false +ERROR [2014-02-22 11:59 [46:855]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] effect=mage.abilities.keyword.UnleashRestrictionEffect@47b5d63a id=8f00cf34-7635-4592-8d23-0f427e00cee9 +ERROR [2014-02-22 11:59 [46:856]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177] ability=Unleash <i>(You may have this creature enter the battlefield with a +1/+1 counter on it. It can't block as long as it has a +1/+1 counter on it.)</i>, applies_to_attacker=false +ERROR [2014-02-22 11:59 [46:856]] TraceUtil[pool-2-thread-55]: [f5702a4c-cc77-43ec-98bc-d8ace2b2c177]