From 5010ef9dbe7b8062a398731e256592696aeeeb31 Mon Sep 17 00:00:00 2001 From: magenoxx Date: Fri, 12 Aug 2011 00:35:54 +0400 Subject: [PATCH] ConditionalStaticAbility. New implementation of Sejiri Merfolk. --- .../mage/sets/worldwake/SejiriMerfolk.java | 14 +-- Mage/src/mage/abilities/Ability.java | 5 +- Mage/src/mage/abilities/AbilityImpl.java | 2 +- .../decorator/ConditionalStaticAbility.java | 86 +++++++++++++++++++ .../abilities/effects/ContinuousEffects.java | 23 +++-- Mage/src/mage/game/stack/StackAbility.java | 4 +- 6 files changed, 110 insertions(+), 24 deletions(-) create mode 100644 Mage/src/mage/abilities/decorator/ConditionalStaticAbility.java diff --git a/Mage.Sets/src/mage/sets/worldwake/SejiriMerfolk.java b/Mage.Sets/src/mage/sets/worldwake/SejiriMerfolk.java index 856dd34ab5e..2beb175401a 100644 --- a/Mage.Sets/src/mage/sets/worldwake/SejiriMerfolk.java +++ b/Mage.Sets/src/mage/sets/worldwake/SejiriMerfolk.java @@ -33,9 +33,12 @@ import mage.Constants.CardType; import mage.Constants.Rarity; import mage.Constants.Zone; import mage.MageInt; +import mage.abilities.Ability; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.condition.common.ControlsPermanent; import mage.abilities.decorator.ConditionalContinousEffect; +import mage.abilities.decorator.ConditionalStaticAbility; +import mage.abilities.effects.Effect; import mage.abilities.effects.common.continious.GainAbilitySourceEffect; import mage.abilities.keyword.FirstStrikeAbility; import mage.abilities.keyword.LifelinkAbility; @@ -48,7 +51,7 @@ import mage.filter.common.FilterLandPermanent; */ public class SejiriMerfolk extends CardImpl { - private static final String rule = "As long as you control a Plains, Sejiri Merfolk has first strike and lifelink"; + private static final String rule = "As long as you control a Plains, Sejiri Merfolk has first strike and lifelink."; private static final FilterLandPermanent filter = new FilterLandPermanent("a Plains"); static { @@ -65,12 +68,9 @@ public class SejiriMerfolk extends CardImpl { this.power = new MageInt(2); this.toughness = new MageInt(1); - SimpleStaticAbility ability = new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilitySourceEffect(FirstStrikeAbility.getInstance(), Constants.Duration.WhileOnBattlefield)); - ability.addEffect(new GainAbilitySourceEffect(LifelinkAbility.getInstance(), Constants.Duration.WhileOnBattlefield)); - - this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, - new ConditionalContinousEffect(new GainAbilitySourceEffect(ability, Constants.Duration.WhileOnBattlefield), - new ControlsPermanent(filter), rule))); + Ability ability = new ConditionalStaticAbility(Zone.BATTLEFIELD, new GainAbilitySourceEffect(LifelinkAbility.getInstance()), new ControlsPermanent(filter), rule); + ability.addEffect(new GainAbilitySourceEffect(FirstStrikeAbility.getInstance())); + this.addAbility(ability); } public SejiriMerfolk(final SejiriMerfolk card) { diff --git a/Mage/src/mage/abilities/Ability.java b/Mage/src/mage/abilities/Ability.java index b35a66d61b1..b1e2249ae89 100644 --- a/Mage/src/mage/abilities/Ability.java +++ b/Mage/src/mage/abilities/Ability.java @@ -190,11 +190,12 @@ public interface Ability extends Serializable { /** * Retrieves the effects of the specified {@link EffectType type} that are * put into place by the resolution of this ability. - * + * + * @param game * @param effectType The {@link EffectType type} to search for. * @return All {@link Effects} of the given {@link EffectType}. */ - public Effects getEffects(EffectType effectType); + public Effects getEffects(Game game, EffectType effectType); /** * Adds an effect to this ability. diff --git a/Mage/src/mage/abilities/AbilityImpl.java b/Mage/src/mage/abilities/AbilityImpl.java index c36b5ee66cc..1dd7768d7ef 100644 --- a/Mage/src/mage/abilities/AbilityImpl.java +++ b/Mage/src/mage/abilities/AbilityImpl.java @@ -263,7 +263,7 @@ public abstract class AbilityImpl> implements Ability { } @Override - public Effects getEffects(EffectType effectType) { + public Effects getEffects(Game game, EffectType effectType) { Effects typedEffects = new Effects(); for (Effect effect: getEffects()) { if (effect.getEffectType() == effectType) { diff --git a/Mage/src/mage/abilities/decorator/ConditionalStaticAbility.java b/Mage/src/mage/abilities/decorator/ConditionalStaticAbility.java new file mode 100644 index 00000000000..2fb5b853bdd --- /dev/null +++ b/Mage/src/mage/abilities/decorator/ConditionalStaticAbility.java @@ -0,0 +1,86 @@ +/* +* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without modification, are +* permitted provided that the following conditions are met: +* +* 1. Redistributions of source code must retain the above copyright notice, this list of +* conditions and the following disclaimer. +* +* 2. Redistributions in binary form must reproduce the above copyright notice, this list +* of conditions and the following disclaimer in the documentation and/or other materials +* provided with the distribution. +* +* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED +* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR +* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* The views and conclusions contained in the software and documentation are those of the +* authors and should not be interpreted as representing official policies, either expressed +* or implied, of BetaSteward_at_googlemail.com. +*/ + +package mage.abilities.decorator; + +import mage.Constants; +import mage.Constants.Zone; +import mage.abilities.StaticAbility; +import mage.abilities.condition.Condition; +import mage.abilities.effects.Effect; +import mage.abilities.effects.Effects; +import mage.game.Game; + +/** + * + * @author nantuko + */ +public class ConditionalStaticAbility extends StaticAbility { + + private Condition condition; + private String staticText = ""; + + private static final Effects emptyEffects = new Effects(); + + public ConditionalStaticAbility(Zone zone, Effect effect, Condition condition, String rule) { + super(zone, effect); + this.condition = condition; + this.staticText = rule; + } + + public ConditionalStaticAbility(ConditionalStaticAbility ability) { + super(ability); + this.condition = ability.condition; + this.staticText = ability.staticText; + } + + @Override + public Effects getEffects(Game game, Constants.EffectType effectType) { + if (!condition.apply(game, this)) { + return emptyEffects; + } + Effects typedEffects = new Effects(); + for (Effect effect: getEffects()) { + if (effect.getEffectType() == effectType) { + typedEffects.add(effect); + } + } + return typedEffects; + } + + @Override + public ConditionalStaticAbility copy() { + return new ConditionalStaticAbility(this); + } + + @Override + public String getRule() { + return staticText; + } + +} diff --git a/Mage/src/mage/abilities/effects/ContinuousEffects.java b/Mage/src/mage/abilities/effects/ContinuousEffects.java index 2b76ab5c5ca..30431938d73 100644 --- a/Mage/src/mage/abilities/effects/ContinuousEffects.java +++ b/Mage/src/mage/abilities/effects/ContinuousEffects.java @@ -210,7 +210,7 @@ public class ContinuousEffects implements Serializable { for (Card card: game.getCards()) { if (game.getZone(card.getId()) == Zone.HAND || game.getZone(card.getId()) == Zone.GRAVEYARD) { for (Ability ability: card.getAbilities().getStaticAbilities(game.getZone(card.getId()))) { - for (Effect effect: ability.getEffects(EffectType.CONTINUOUS)) { + for (Effect effect: ability.getEffects(game, EffectType.CONTINUOUS)) { layerEffects.add((ContinuousEffect) effect); abilityMap.put(effect.getId(), ability); } @@ -219,7 +219,7 @@ public class ContinuousEffects implements Serializable { } for (Permanent permanent: game.getBattlefield().getAllPermanents()) { for (Ability ability: permanent.getAbilities().getStaticAbilities(Zone.BATTLEFIELD)) { - for (Effect effect: ability.getEffects(EffectType.CONTINUOUS)) { + for (Effect effect: ability.getEffects(game, EffectType.CONTINUOUS)) { layerEffects.add((ContinuousEffect) effect); abilityMap.put(effect.getId(), ability); } @@ -243,7 +243,7 @@ public class ContinuousEffects implements Serializable { //get all applicable Requirement effects on the battlefield for (Permanent perm: game.getBattlefield().getActivePermanents(permanent.getControllerId(), game)) { for (StaticAbility ability: perm.getAbilities().getStaticAbilities(Zone.BATTLEFIELD)) { - for (Effect effect: ability.getEffects(EffectType.REQUIREMENT)) { + for (Effect effect: ability.getEffects(game, EffectType.REQUIREMENT)) { if (((RequirementEffect)effect).applies(permanent, ability, game)) { effects.add((RequirementEffect) effect); abilityMap.put(effect.getId(), ability); @@ -263,7 +263,7 @@ public class ContinuousEffects implements Serializable { //get all applicable Restriction effects on the battlefield for (Permanent perm: game.getBattlefield().getActivePermanents(permanent.getControllerId(), game)) { for (StaticAbility ability: perm.getAbilities().getStaticAbilities(Zone.BATTLEFIELD)) { - for (Effect effect: ability.getEffects(EffectType.RESTRICTION)) { + for (Effect effect: ability.getEffects(game, EffectType.RESTRICTION)) { if (((RestrictionEffect)effect).applies(permanent, ability, game)) { effects.add((RestrictionEffect) effect); abilityMap.put(effect.getId(), ability); @@ -292,14 +292,14 @@ public class ContinuousEffects implements Serializable { for (Card card: game.getCards()) { if (game.getZone(card.getId()) == Zone.HAND || game.getZone(card.getId()) == Zone.GRAVEYARD) { for (Ability ability: card.getAbilities().getStaticAbilities(game.getZone(card.getId()))) { - for (Effect effect: ability.getEffects(EffectType.REPLACEMENT)) { + for (Effect effect: ability.getEffects(game, EffectType.REPLACEMENT)) { ReplacementEffect rEffect = (ReplacementEffect) effect; if (rEffect.applies(event, ability, game)) { replaceEffects.add(rEffect); abilityMap.put(rEffect.getId(), ability); } } - for (Effect effect: ability.getEffects(EffectType.PREVENTION)) { + for (Effect effect: ability.getEffects(game, EffectType.PREVENTION)) { ReplacementEffect rEffect = (ReplacementEffect) effect; if (rEffect.applies(event, ability, game)) { replaceEffects.add(rEffect); @@ -312,14 +312,14 @@ public class ContinuousEffects implements Serializable { //get all applicable Replacement effects on the battlefield for (Permanent permanent: game.getBattlefield().getAllPermanents()) { for (Ability ability: permanent.getAbilities().getStaticAbilities(Zone.BATTLEFIELD)) { - for (Effect effect: ability.getEffects(EffectType.REPLACEMENT)) { + for (Effect effect: ability.getEffects(game, EffectType.REPLACEMENT)) { ReplacementEffect rEffect = (ReplacementEffect) effect; if (rEffect.applies(event, ability, game)) { replaceEffects.add(rEffect); abilityMap.put(rEffect.getId(), ability); } } - for (Effect effect: ability.getEffects(EffectType.PREVENTION)) { + for (Effect effect: ability.getEffects(game, EffectType.PREVENTION)) { ReplacementEffect rEffect = (ReplacementEffect) effect; if (rEffect.applies(event, ability, game)) { replaceEffects.add(rEffect); @@ -349,7 +349,7 @@ public class ContinuousEffects implements Serializable { public boolean asThough(UUID objectId, AsThoughEffectType type, Game game) { for (Permanent permanent: game.getBattlefield().getAllPermanents()) { for (Ability ability: permanent.getAbilities().getStaticAbilities(Zone.BATTLEFIELD)) { - for (Effect effect: ability.getEffects(EffectType.ASTHOUGH)) { + for (Effect effect: ability.getEffects(game, EffectType.ASTHOUGH)) { AsThoughEffect rEffect = (AsThoughEffect) effect; if (rEffect.applies(objectId, ability, game)) { return true; @@ -373,8 +373,7 @@ public class ContinuousEffects implements Serializable { /** * Inspects all {@link Permanent permanent's} {@link Ability abilities} on the battlefied * for {@link CostModificationEffect cost modification effects} and applies them if necessary. - * - * @param objectId + * * @param abilityToModify * @param game * @return @@ -382,7 +381,7 @@ public class ContinuousEffects implements Serializable { public void costModification ( Ability abilityToModify, Game game ) { for ( Permanent permanent : game.getBattlefield().getAllPermanents() ) { for ( Ability ability : permanent.getAbilities().getStaticAbilities(Zone.BATTLEFIELD) ) { - for ( Effect effect : ability.getEffects(EffectType.COSTMODIFICATION) ) { + for ( Effect effect : ability.getEffects(game, EffectType.COSTMODIFICATION) ) { CostModificationEffect rEffect = (CostModificationEffect)effect; if ( rEffect.applies(abilityToModify, ability, game) ) { rEffect.apply(game, ability, abilityToModify); diff --git a/Mage/src/mage/game/stack/StackAbility.java b/Mage/src/mage/game/stack/StackAbility.java index 92c52ce7360..e3b8c60447c 100644 --- a/Mage/src/mage/game/stack/StackAbility.java +++ b/Mage/src/mage/game/stack/StackAbility.java @@ -180,8 +180,8 @@ public class StackAbility implements StackObject, Ability { } @Override - public Effects getEffects(EffectType effectType) { - return ability.getEffects(effectType); + public Effects getEffects(Game game, EffectType effectType) { + return ability.getEffects(game, effectType); } @Override