From d5c75cd1b3ea324780aa328a4f0d6c4ddfb6633b Mon Sep 17 00:00:00 2001 From: emerald000 Date: Sat, 13 May 2017 18:53:35 -0400 Subject: [PATCH] Fixed New Perspectives to use a CostModificationEffect. Remove CyclingCost and WrapperCost that are now unused. --- .../src/mage/cards/n/NewPerspectives.java | 72 +++++------ .../mage/abilities/costs/WrapperCost.java | 41 ------ .../abilities/costs/common/CyclingCost.java | 119 ------------------ .../abilities/keyword/CyclingAbility.java | 11 +- .../main/java/mage/game/events/GameEvent.java | 1 - ...CardsCycledOrDiscardedThisTurnWatcher.java | 16 +-- 6 files changed, 37 insertions(+), 223 deletions(-) delete mode 100644 Mage/src/main/java/mage/abilities/costs/WrapperCost.java delete mode 100644 Mage/src/main/java/mage/abilities/costs/common/CyclingCost.java diff --git a/Mage.Sets/src/mage/cards/n/NewPerspectives.java b/Mage.Sets/src/mage/cards/n/NewPerspectives.java index fdd28604a6..e20f12f555 100644 --- a/Mage.Sets/src/mage/cards/n/NewPerspectives.java +++ b/Mage.Sets/src/mage/cards/n/NewPerspectives.java @@ -29,25 +29,21 @@ package mage.cards.n; import java.util.UUID; import mage.abilities.Ability; +import mage.abilities.ActivatedAbility; import mage.abilities.common.EntersBattlefieldTriggeredAbility; import mage.abilities.common.SimpleStaticAbility; -import mage.abilities.condition.Condition; -import mage.abilities.condition.common.CardsInHandCondition; -import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.decorator.ConditionalReplacementEffect; -import mage.abilities.effects.ReplacementEffectImpl; +import mage.abilities.costs.common.DiscardSourceCost; import mage.abilities.effects.common.DrawCardSourceControllerEffect; +import mage.abilities.effects.common.cost.CostModificationEffectImpl; +import mage.abilities.keyword.CyclingAbility; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; -import mage.constants.ComparisonType; +import mage.constants.CostModificationType; import mage.constants.Duration; import mage.constants.Outcome; import mage.constants.Zone; import mage.game.Game; -import mage.game.events.CostEvent; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; import mage.players.Player; /** @@ -60,14 +56,10 @@ public class NewPerspectives extends CardImpl { super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{5}{U}"); // When New Perspectives enters the battlefield, draw three cards. - this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(3), false)); + this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(3))); // As long as you have seven or more cards in hand, you may pay {0} rather than pay cycling costs. - Condition condition = new CardsInHandCondition(ComparisonType.MORE_THAN, 6); - Ability ability = new SimpleStaticAbility(Zone.BATTLEFIELD, - new ConditionalReplacementEffect( - new PerspectivesReplaceCylcingCosts(), condition)); - this.addAbility(ability); + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new NewPerspectivesCostModificationEffect())); } public NewPerspectives(final NewPerspectives card) { @@ -80,48 +72,42 @@ public class NewPerspectives extends CardImpl { } } -class PerspectivesReplaceCylcingCosts extends ReplacementEffectImpl { +class NewPerspectivesCostModificationEffect extends CostModificationEffectImpl { - public PerspectivesReplaceCylcingCosts() { - super(Duration.WhileOnBattlefield, Outcome.Benefit); - staticText = "As long as you have seven or more cards in hand, you may pay {0} rather than pay cycling costs"; + NewPerspectivesCostModificationEffect() { + super(Duration.Custom, Outcome.Benefit, CostModificationType.SET_COST); + this.staticText = "As long as you have seven or more cards in hand, you may pay {0} rather than pay cycling costs"; } - public PerspectivesReplaceCylcingCosts(final PerspectivesReplaceCylcingCosts effect) { + NewPerspectivesCostModificationEffect(final NewPerspectivesCostModificationEffect effect) { super(effect); } @Override - public PerspectivesReplaceCylcingCosts copy() { - return new PerspectivesReplaceCylcingCosts(this); + public boolean applies(Ability abilityToModify, Ability source, Game game) { + Player controller = game.getPlayer(abilityToModify.getControllerId()); + return controller != null + && controller.getId().equals(source.getControllerId()) + && abilityToModify instanceof CyclingAbility + && controller.getHand().size() >= 7; } @Override - public boolean apply(Game game, Ability source) { - return true; - } - - @Override - public boolean replaceEvent(GameEvent event, Ability source, Game game) { - if (event.getType() == EventType.CAN_PAY_CYCLE_COST) { - ((CostEvent) event).setCost(new ManaCostsImpl<>("{0}")); - return false; - } - Player controller = game.getPlayer(source.getControllerId()); - if (controller != null && controller.chooseUse(outcome, "Pay {0} rather than normal cycling costs?", source, game)) { - ((CostEvent) event).setCost(new ManaCostsImpl<>("{0}")); + public boolean apply(Game game, Ability source, Ability abilityToModify) { + Player controller = game.getPlayer(abilityToModify.getControllerId()); + if (controller != null) { + if ((abilityToModify instanceof ActivatedAbility && ((ActivatedAbility) abilityToModify).isCheckPlayableMode()) || controller.chooseUse(Outcome.PlayForFree, "Pay {0} to cycle?", source, game)) { + abilityToModify.getCosts().clear(); + abilityToModify.getManaCostsToPay().clear(); + abilityToModify.getCosts().add(new DiscardSourceCost()); + } + return true; } return false; } @Override - public boolean checksEventType(GameEvent event, Game game) { - return event.getType() == EventType.PAY_CYCLE_COST || event.getType() == EventType.CAN_PAY_CYCLE_COST; + public NewPerspectivesCostModificationEffect copy() { + return new NewPerspectivesCostModificationEffect(this); } - - @Override - public boolean applies(GameEvent event, Ability source, Game game) { - return event.getPlayerId().equals(source.getControllerId()); - } - } diff --git a/Mage/src/main/java/mage/abilities/costs/WrapperCost.java b/Mage/src/main/java/mage/abilities/costs/WrapperCost.java deleted file mode 100644 index c9714a8acf..0000000000 --- a/Mage/src/main/java/mage/abilities/costs/WrapperCost.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2017 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.costs; - -import java.io.Serializable; - -/** - * Some Cost act like wrappers hiding real costs inside - * - * @author noxx - */ -public interface WrapperCost extends Serializable { - - Cost getOriginalCost(); - -} diff --git a/Mage/src/main/java/mage/abilities/costs/common/CyclingCost.java b/Mage/src/main/java/mage/abilities/costs/common/CyclingCost.java deleted file mode 100644 index ebcbdfd00d..0000000000 --- a/Mage/src/main/java/mage/abilities/costs/common/CyclingCost.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright 2017 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.costs.common; - -import mage.abilities.Ability; -import mage.abilities.costs.Cost; -import mage.abilities.costs.WrapperCost; -import mage.game.Game; -import mage.game.events.CostEvent; -import mage.game.events.GameEvent; -import mage.target.Targets; - -import java.util.UUID; - -/** - * Cycling Cost to interact with cards like 'New Perspectives' - */ -public class CyclingCost implements Cost, WrapperCost { - - protected Cost cost; - - public CyclingCost(Cost cost) { - this.cost = cost; - } - - public CyclingCost(final CyclingCost cost) { - this.cost = cost.cost.copy(); - } - - @Override - public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana) { - return pay(ability, game, sourceId, controllerId, noMana, cost); - } - - @Override - public boolean canPay(Ability ability, UUID sourceId, UUID controllerId, Game game) { - CostEvent costEvent = new CostEvent(GameEvent.EventType.CAN_PAY_CYCLE_COST, sourceId, sourceId, controllerId, cost); - game.replaceEvent(costEvent); - return cost.canPay(ability, sourceId, controllerId, game) || costEvent.getCost().canPay(ability, sourceId, controllerId, game); - } - - @Override - public boolean pay(Ability ability, Game game, UUID sourceId, UUID controllerId, boolean noMana, Cost costToPay) { - CostEvent costEvent = new CostEvent(GameEvent.EventType.PAY_CYCLE_COST, sourceId, sourceId, controllerId, cost); - game.replaceEvent(costEvent); - cost = costEvent.getCost(); - return cost.pay(ability, game, sourceId, controllerId, noMana, cost); - } - - @Override - public String getText() { - return cost.getText(); - } - - @Override - public void setText(String text) { - cost.setText(text); - } - - @Override - public Targets getTargets() { - return cost.getTargets(); - } - - @Override - public boolean isPaid() { - return cost.isPaid(); - } - - @Override - public void clearPaid() { - cost.clearPaid(); - } - - @Override - public void setPaid() { - cost.setPaid(); - } - - @Override - public UUID getId() { - return cost.getId(); - } - - @Override - public Cost copy() { - return new CyclingCost(this); - } - - @Override - public Cost getOriginalCost() { - return this.cost; - } -} \ No newline at end of file diff --git a/Mage/src/main/java/mage/abilities/keyword/CyclingAbility.java b/Mage/src/main/java/mage/abilities/keyword/CyclingAbility.java index dba43008be..b348fe58a2 100644 --- a/Mage/src/main/java/mage/abilities/keyword/CyclingAbility.java +++ b/Mage/src/main/java/mage/abilities/keyword/CyclingAbility.java @@ -27,21 +27,14 @@ */ package mage.abilities.keyword; -import java.util.UUID; -import mage.abilities.Ability; import mage.abilities.ActivatedAbilityImpl; import mage.abilities.costs.Cost; -import mage.abilities.costs.common.CyclingCost; import mage.abilities.costs.common.DiscardSourceCost; import mage.abilities.costs.mana.ManaCost; import mage.abilities.effects.common.DrawCardSourceControllerEffect; import mage.abilities.effects.common.search.SearchLibraryPutInHandEffect; import mage.constants.Zone; import mage.filter.FilterCard; -import mage.game.Game; -import mage.game.events.CostEvent; -import mage.game.events.GameEvent; -import mage.target.Targets; import mage.target.common.TargetCardInLibrary; /** @@ -54,14 +47,14 @@ public class CyclingAbility extends ActivatedAbilityImpl { private final String text; public CyclingAbility(Cost cost) { - super(Zone.HAND, new DrawCardSourceControllerEffect(1), new CyclingCost(cost)); + super(Zone.HAND, new DrawCardSourceControllerEffect(1), cost); this.addCost(new DiscardSourceCost()); this.cost = cost; this.text = "Cycling"; } public CyclingAbility(Cost cost, FilterCard filter, String text) { - super(Zone.HAND, new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true, true), new CyclingCost(cost)); + super(Zone.HAND, new SearchLibraryPutInHandEffect(new TargetCardInLibrary(filter), true, true), cost); this.addCost(new DiscardSourceCost()); this.cost = cost; this.text = text; diff --git a/Mage/src/main/java/mage/game/events/GameEvent.java b/Mage/src/main/java/mage/game/events/GameEvent.java index 4c020434eb..8dbf55f645 100644 --- a/Mage/src/main/java/mage/game/events/GameEvent.java +++ b/Mage/src/main/java/mage/game/events/GameEvent.java @@ -95,7 +95,6 @@ public class GameEvent implements Serializable { DISCARD_CARD, DISCARDED_CARD, CYCLE_CARD, CYCLED_CARD, - PAY_CYCLE_COST, CAN_PAY_CYCLE_COST, CLASH, CLASHED, DAMAGE_PLAYER, /* DAMAGED_PLAYER diff --git a/Mage/src/main/java/mage/watchers/common/CardsCycledOrDiscardedThisTurnWatcher.java b/Mage/src/main/java/mage/watchers/common/CardsCycledOrDiscardedThisTurnWatcher.java index cdee6623c1..5ed5bc021d 100644 --- a/Mage/src/main/java/mage/watchers/common/CardsCycledOrDiscardedThisTurnWatcher.java +++ b/Mage/src/main/java/mage/watchers/common/CardsCycledOrDiscardedThisTurnWatcher.java @@ -31,7 +31,6 @@ import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.UUID; - import mage.cards.Card; import mage.cards.Cards; import mage.cards.CardsImpl; @@ -62,15 +61,12 @@ public class CardsCycledOrDiscardedThisTurnWatcher extends Watcher { @Override public void watch(GameEvent event, Game game) { - if (event.getType() == GameEvent.EventType.PAY_CYCLE_COST - || event.getType() == GameEvent.EventType.DISCARDED_CARD) { - if (event.getPlayerId() != null) { - Card card = game.getCard(event.getTargetId()); - if (card != null) { - Cards c = getCardsCycledOrDiscardedThisTurn(event.getPlayerId()); - c.add(card); - cycledOrDiscardedCardsThisTurn.put(event.getPlayerId(), c); - } + if (event.getType() == GameEvent.EventType.DISCARDED_CARD && event.getPlayerId() != null) { + Card card = game.getCard(event.getTargetId()); + if (card != null) { + Cards c = getCardsCycledOrDiscardedThisTurn(event.getPlayerId()); + c.add(card); + cycledOrDiscardedCardsThisTurn.put(event.getPlayerId(), c); } } }