From 933f094f6985106a2066be56b467d02802f9790f Mon Sep 17 00:00:00 2001 From: magenoxx Date: Tue, 1 May 2012 12:14:37 +0400 Subject: [PATCH] More careful fix for PlayerImpl.canPlay. Moved ThaliaGuardianOfThrabenTest to another package. --- .../ThaliaGuardianOfThrabenTest.java | 2 +- .../abilities/effects/ContinuousEffects.java | 25 +++++++++++++++++-- Mage/src/mage/players/PlayerImpl.java | 8 +++--- 3 files changed, 29 insertions(+), 6 deletions(-) rename Mage.Tests/src/test/java/org/mage/test/cards/{ => cost/modification}/ThaliaGuardianOfThrabenTest.java (96%) diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/ThaliaGuardianOfThrabenTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/cost/modification/ThaliaGuardianOfThrabenTest.java similarity index 96% rename from Mage.Tests/src/test/java/org/mage/test/cards/ThaliaGuardianOfThrabenTest.java rename to Mage.Tests/src/test/java/org/mage/test/cards/cost/modification/ThaliaGuardianOfThrabenTest.java index c45d4bc9466..7b5d8ae589f 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/ThaliaGuardianOfThrabenTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/cost/modification/ThaliaGuardianOfThrabenTest.java @@ -1,4 +1,4 @@ -package org.mage.test.cards; +package org.mage.test.cards.cost.modification; import mage.Constants; import org.junit.Test; diff --git a/Mage/src/mage/abilities/effects/ContinuousEffects.java b/Mage/src/mage/abilities/effects/ContinuousEffects.java index 50477087113..d08934d7705 100644 --- a/Mage/src/mage/abilities/effects/ContinuousEffects.java +++ b/Mage/src/mage/abilities/effects/ContinuousEffects.java @@ -219,6 +219,27 @@ public class ContinuousEffects implements Serializable { return replaceEffects; } + /** + * Filters out cost modification effects that are not active. + * + * @param game + * @return + */ + private List getApplicableCostModificationEffects(Game game) { + List costEffects = new ArrayList(); + + for (CostModificationEffect effect: costModificationEffects) { + Ability ability = costModificationEffects.getAbility(effect.getId()); + if (!(ability instanceof StaticAbility) || ability.isInUseableZone(game)) { + if (effect.getDuration() != Duration.OneUse || !effect.isUsed()) { + costEffects.add(effect); + } + } + } + + return costEffects; + } + public boolean asThough(UUID objectId, AsThoughEffectType type, Game game) { for (AsThoughEffect entry: asThoughEffects) { AsThoughEffect effect = entry; @@ -242,9 +263,9 @@ public class ContinuousEffects implements Serializable { * @return */ public void costModification ( Ability abilityToModify, Game game ) { - //List costEffects = getApplicableCostModificationEffects(game); + List costEffects = getApplicableCostModificationEffects(game); - for ( CostModificationEffect effect : costModificationEffects) { + for ( CostModificationEffect effect : costEffects) { if ( effect.applies(abilityToModify, costModificationEffects.getAbility(effect.getId()), game) ) { effect.apply(game, costModificationEffects.getAbility(effect.getId()), abilityToModify); } diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index 37f917a23f6..edf88e10206 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -481,7 +481,7 @@ public abstract class PlayerImpl> implements Player, Ser card.cast(game, fromZone, ability, playerId); Ability spellAbility = game.getStack().getSpell(ability.getId()).getSpellAbility(); - if (spellAbility.activate(game, noMana)) { + if (spellAbility.activate(game, noMana)) { for (KickerAbility kicker: card.getAbilities().getKickerAbilities()) { if (kicker.getCosts().canPay(ability.getSourceId(), playerId, game) && kicker.canChooseTarget(game)) kicker.activate(game, false); @@ -1190,9 +1190,10 @@ public abstract class PlayerImpl> implements Player, Ser protected boolean canPlay(ActivatedAbility ability, ManaOptions available, Game game) { if (!(ability instanceof ManaAbility) && ability.canActivate(playerId, game)) { - game.getContinuousEffects().costModification(ability, game); + Ability copy = ability.copy(); + game.getContinuousEffects().costModification(copy, game); - ManaOptions abilityOptions = ability.getManaCostsToPay().getOptions(); + ManaOptions abilityOptions = copy.getManaCostsToPay().getOptions(); if (abilityOptions.size() == 0) { return true; } @@ -1205,6 +1206,7 @@ public abstract class PlayerImpl> implements Player, Ser } } } + for (AlternativeCost cost: ability.getAlternativeCosts()) { if (cost.isAvailable(game, ability) && cost.canPay(ability.getSourceId(), playerId, game)) return true;