diff --git a/Mage.Sets/src/mage/sets/innistrad/IntangibleVirtue.java b/Mage.Sets/src/mage/sets/innistrad/IntangibleVirtue.java new file mode 100644 index 00000000000..86add0f622a --- /dev/null +++ b/Mage.Sets/src/mage/sets/innistrad/IntangibleVirtue.java @@ -0,0 +1,70 @@ +/* + * 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.innistrad; + +import java.util.UUID; +import mage.Constants; +import mage.Constants.CardType; +import mage.Constants.Rarity; +import mage.Constants.Zone; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.common.continious.BoostControlledEffect; +import mage.abilities.effects.common.continious.GainAbilityControlledEffect; +import mage.abilities.keyword.VigilanceAbility; +import mage.cards.CardImpl; +import mage.filter.common.FilterToken; + +/** + * + * @author BetaSteward + */ +public class IntangibleVirtue extends CardImpl { + + private final static FilterToken filter = FilterToken.getDefault(); + + public IntangibleVirtue(UUID ownerId) { + super(ownerId, 19, "Intangible Virtue", Rarity.UNCOMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}"); + this.expansionSetCode = "ISD"; + + this.color.setWhite(true); + + // Creature tokens you control get +1/+1 and have vigilance. + this.addAbility(new SimpleStaticAbility(Constants.Zone.BATTLEFIELD, new BoostControlledEffect(1, 1, Constants.Duration.WhileOnBattlefield, filter))); + this.addAbility(new SimpleStaticAbility(Constants.Zone.BATTLEFIELD, new GainAbilityControlledEffect(VigilanceAbility.getInstance(), Constants.Duration.WhileOnBattlefield, filter))); + + } + + public IntangibleVirtue(final IntangibleVirtue card) { + super(card); + } + + @Override + public IntangibleVirtue copy() { + return new IntangibleVirtue(this); + } +} diff --git a/Mage.Sets/src/mage/sets/innistrad/StonySilence.java b/Mage.Sets/src/mage/sets/innistrad/StonySilence.java new file mode 100644 index 00000000000..c01dea77afc --- /dev/null +++ b/Mage.Sets/src/mage/sets/innistrad/StonySilence.java @@ -0,0 +1,109 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.innistrad; + +import java.util.UUID; +import mage.Constants.CardType; +import mage.Constants.Duration; +import mage.Constants.Outcome; +import mage.Constants.Rarity; +import mage.Constants.Zone; +import mage.abilities.Ability; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.effects.ReplacementEffectImpl; +import mage.cards.CardImpl; +import mage.game.Game; +import mage.game.events.GameEvent; +import mage.game.events.GameEvent.EventType; +import mage.game.permanent.Permanent; + +/** + * + * @author BetaSteward + */ +public class StonySilence extends CardImpl { + + public StonySilence(UUID ownerId) { + super(ownerId, 36, "Stony Silence", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}"); + this.expansionSetCode = "ISD"; + + this.color.setWhite(true); + + // Activated abilities of artifacts can't be activated. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new StonySilenceEffect())); + + } + + public StonySilence(final StonySilence card) { + super(card); + } + + @Override + public StonySilence copy() { + return new StonySilence(this); + } +} + +class StonySilenceEffect extends ReplacementEffectImpl { + + public StonySilenceEffect() { + super(Duration.WhileOnBattlefield, Outcome.Detriment); + staticText = "Activated abilities of artifacts can't be activated"; + } + + public StonySilenceEffect(final StonySilenceEffect effect) { + super(effect); + } + + @Override + public boolean apply(Game game, Ability source) { + return true; + } + + @Override + public StonySilenceEffect copy() { + return new StonySilenceEffect(this); + } + + @Override + public boolean replaceEvent(GameEvent event, Ability source, Game game) { + return true; + } + + @Override + public boolean applies(GameEvent event, Ability source, Game game) { + if (event.getType() == EventType.ACTIVATE_ABILITY) { + Permanent artifact = game.getPermanent(event.getSourceId()); + if (artifact != null && artifact.getCardType().contains(CardType.ARTIFACT)) { + return true; + } + } + return false; + } + +} diff --git a/Mage/src/mage/filter/common/FilterToken.java b/Mage/src/mage/filter/common/FilterToken.java new file mode 100644 index 00000000000..7f8d9f804e3 --- /dev/null +++ b/Mage/src/mage/filter/common/FilterToken.java @@ -0,0 +1,76 @@ +/* +* Copyright 2011 BetaSteward_at_googlemail.com. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without modification, are +* permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, this list of +* conditions and the following disclaimer. +* +* 2. Redistributions in binary form must reproduce the above copyright notice, this list +* of conditions and the following disclaimer in the documentation and/or other materials +* provided with the distribution. +* +* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED +* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR +* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* The views and conclusions contained in the software and documentation are those of the +* authors and should not be interpreted as representing official policies, either expressed +* or implied, of BetaSteward_at_googlemail.com. +*/ + +package mage.filter.common; + +import mage.Constants.CardType; +import mage.filter.FilterPermanent; +import mage.game.permanent.Permanent; +import mage.game.permanent.PermanentToken; + +/** + * + * @author BetaSteward_at_googlemail.com + */ +public class FilterToken> extends FilterCreaturePermanent> { + + protected static FilterToken defaultFilter = new FilterToken(); + + public FilterToken() { + this("creature token"); + } + + public FilterToken(String name) { + super(name); + } + + public FilterToken(final FilterToken filter) { + super(filter); + } + + public static FilterToken getDefault() { + return defaultFilter; + } + + @Override + public boolean match(Permanent permanent) { + if (!(permanent instanceof PermanentToken)) + return notFilter; + if (!super.match(permanent)) + return notFilter; + + return !notFilter; + } + + @Override + public FilterToken copy() { + if (this == defaultFilter) + return this; + return new FilterToken(this); + } +} diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index f220ee06cd0..474ad673dfd 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -510,41 +510,43 @@ public abstract class PlayerImpl> implements Player, Ser } protected boolean playManaAbility(ManaAbility ability, Game game) { - int bookmark = game.bookmarkState(); - if (ability.activate(game, false)) { - ability.resolve(game); - game.removeBookmark(bookmark); - return true; - } - game.restoreState(bookmark); + if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.ACTIVATE_ABILITY, ability.getId(), ability.getSourceId(), playerId))) { + int bookmark = game.bookmarkState(); + if (ability.activate(game, false)) { + ability.resolve(game); + game.removeBookmark(bookmark); + return true; + } + game.restoreState(bookmark); + } return false; } protected boolean playAbility(ActivatedAbility ability, Game game) { - //20091005 - 602.2a - if (ability.isUsesStack()) { - if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.ACTIVATE_ABILITY, ability.getId(), ability.getSourceId(), playerId))) { - int bookmark = game.bookmarkState(); - ability.newId(); - game.getStack().push(new StackAbility(ability, playerId)); - String message = ability.getActivatedMessage(game); - if (ability.activate(game, false)) { - game.fireEvent(GameEvent.getEvent(GameEvent.EventType.ACTIVATED_ABILITY, ability.getId(), ability.getSourceId(), playerId)); - game.fireInformEvent(name + message); - game.removeBookmark(bookmark); - return true; - } - game.restoreState(bookmark); - } - } else { - int bookmark = game.bookmarkState(); - if (ability.activate(game, false)) { - ability.resolve(game); - game.removeBookmark(bookmark); - return true; - } - game.restoreState(bookmark); - } + //20091005 - 602.2a + if (ability.isUsesStack()) { + if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.ACTIVATE_ABILITY, ability.getId(), ability.getSourceId(), playerId))) { + int bookmark = game.bookmarkState(); + ability.newId(); + game.getStack().push(new StackAbility(ability, playerId)); + String message = ability.getActivatedMessage(game); + if (ability.activate(game, false)) { + game.fireEvent(GameEvent.getEvent(GameEvent.EventType.ACTIVATED_ABILITY, ability.getId(), ability.getSourceId(), playerId)); + game.fireInformEvent(name + message); + game.removeBookmark(bookmark); + return true; + } + game.restoreState(bookmark); + } + } else { + int bookmark = game.bookmarkState(); + if (ability.activate(game, false)) { + ability.resolve(game); + game.removeBookmark(bookmark); + return true; + } + game.restoreState(bookmark); + } return false; }