diff --git a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java index 501f2afa37c..c8f1fc17810 100644 --- a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java +++ b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java @@ -1469,8 +1469,8 @@ public class TestPlayer implements Player { } @Override - public void addCounters(Counter counter, Game game) { - computerPlayer.addCounters(counter, game); + public boolean addCounters(Counter counter, Game game) { + return computerPlayer.addCounters(counter, game); } @Override diff --git a/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java b/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java index 415722e9c59..9a601cb185c 100644 --- a/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java +++ b/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java @@ -34,7 +34,6 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; - import mage.MageObject; import mage.abilities.Abilities; import mage.abilities.Ability; @@ -210,19 +209,20 @@ public class PlayerStub implements Player { return false; } - @Override - public void setCanPaySacrificeCostFilter(FilterPermanent filter) { - } + @Override + public void setCanPaySacrificeCostFilter(FilterPermanent filter) { + } - @Override - public FilterPermanent getSacrificeCostFilter() { - return null; - } + @Override + public FilterPermanent getSacrificeCostFilter() { + return null; + } + + @Override + public boolean canPaySacrificeCost(Permanent permanent, UUID sourceId, UUID controllerId, Game game) { + return false; + } - @Override - public boolean canPaySacrificeCost(Permanent permanent, UUID sourceId, UUID controllerId, Game game) { - return false; - } @Override public void setLifeTotalCanChange(boolean lifeTotalCanChange) { @@ -1019,8 +1019,8 @@ public class PlayerStub implements Player { } @Override - public void addCounters(Counter counter, Game game) { - + public boolean addCounters(Counter counter, Game game) { + return true; } @Override diff --git a/Mage/src/main/java/mage/cards/MeldCard.java b/Mage/src/main/java/mage/cards/MeldCard.java index cb124cfc31c..d49cc2c53fc 100644 --- a/Mage/src/main/java/mage/cards/MeldCard.java +++ b/Mage/src/main/java/mage/cards/MeldCard.java @@ -331,30 +331,36 @@ public abstract class MeldCard extends CardImpl { } @Override - public void addCounters(Counter counter, Game game, ArrayList appliedEffects) { + public boolean addCounters(Counter counter, Game game, ArrayList appliedEffects) { if (this.isMelded()) { - super.addCounters(counter, game, appliedEffects); + return super.addCounters(counter, game, appliedEffects); } else { + // can this really happen? + boolean returnState = true; if (topLastZoneChangeCounter == topHalfCard.getZoneChangeCounter(game)) { - topHalfCard.addCounters(counter, game, appliedEffects); + returnState |= topHalfCard.addCounters(counter, game, appliedEffects); } if (bottomLastZoneChangeCounter == bottomHalfCard.getZoneChangeCounter(game)) { - bottomHalfCard.addCounters(counter, game, appliedEffects); + returnState |= bottomHalfCard.addCounters(counter, game, appliedEffects); } + return returnState; } } @Override - public void addCounters(String name, int amount, Game game, ArrayList appliedEffects) { + public boolean addCounters(String name, int amount, Game game, ArrayList appliedEffects) { if (this.isMelded()) { - super.addCounters(name, amount, game, appliedEffects); + return super.addCounters(name, amount, game, appliedEffects); } else { + // can this really happen? + boolean returnState = true; if (topLastZoneChangeCounter == topHalfCard.getZoneChangeCounter(game)) { - topHalfCard.addCounters(name, amount, game, appliedEffects); + returnState |= topHalfCard.addCounters(name, amount, game, appliedEffects); } if (bottomLastZoneChangeCounter == bottomHalfCard.getZoneChangeCounter(game)) { - bottomHalfCard.addCounters(name, amount, game, appliedEffects); + returnState |= bottomHalfCard.addCounters(name, amount, game, appliedEffects); } + return returnState; } } } diff --git a/Mage/src/main/java/mage/game/permanent/PermanentMeld.java b/Mage/src/main/java/mage/game/permanent/PermanentMeld.java index 337ac11f011..36d4f336b0b 100644 --- a/Mage/src/main/java/mage/game/permanent/PermanentMeld.java +++ b/Mage/src/main/java/mage/game/permanent/PermanentMeld.java @@ -1,173 +1,176 @@ -/* - * 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.game.permanent; - -import java.util.ArrayList; -import java.util.UUID; -import mage.cards.Card; -import mage.cards.CardsImpl; -import mage.cards.MeldCard; -import mage.constants.Zone; -import mage.game.Game; -import mage.game.events.ZoneChangeEvent; -import mage.players.Player; - -/** - * - * @author emerald000 - */ -public class PermanentMeld extends PermanentCard { - - public PermanentMeld(Card card, UUID controllerId, Game game) { - super(card, controllerId, game); - } - - @Override - public int getConvertedManaCost() { - if (this.isCopy()) { - return 0; - } else { - return this.getCard().getConvertedManaCost(); - } - } - - @Override - public boolean moveToZone(Zone toZone, UUID sourceId, Game game, boolean flag, ArrayList appliedEffects) { - ZoneChangeEvent event = new ZoneChangeEvent(this.getId(), sourceId, this.getOwnerId(), Zone.BATTLEFIELD, toZone, appliedEffects); - if (!game.replaceEvent(event)) { - Player controller = game.getPlayer(this.getControllerId()); - if (controller != null) { - controller.removeFromBattlefield(this, game); - updateZoneChangeCounter(game); - MeldCard meldCard = (MeldCard) this.getCard(); - Card topHalfCard = meldCard.getTopHalfCard(); - Card bottomHalfCard = meldCard.getBottomHalfCard(); - switch (event.getToZone()) { - case GRAVEYARD: - game.getPlayer(this.getOwnerId()).putInGraveyard(topHalfCard, game, true); - game.getPlayer(this.getOwnerId()).putInGraveyard(bottomHalfCard, game, true); - break; - case HAND: - game.getPlayer(this.getOwnerId()).getHand().add(topHalfCard); - game.getPlayer(this.getOwnerId()).getHand().add(bottomHalfCard); - break; - case EXILED: - game.getExile().getPermanentExile().add(topHalfCard); - game.getExile().getPermanentExile().add(bottomHalfCard); - break; - case LIBRARY: - CardsImpl cardsToMove = new CardsImpl(); - cardsToMove.add(topHalfCard); - cardsToMove.add(bottomHalfCard); - if (flag) { - controller.putCardsOnTopOfLibrary(cardsToMove, game, null, true); - } else { - controller.putCardsOnBottomOfLibrary(cardsToMove, game, null, true); - } - break; - default: - return false; - } - meldCard.setMelded(false); - game.setZone(topHalfCard.getId(), event.getToZone()); - game.setZone(bottomHalfCard.getId(), event.getToZone()); - meldCard.setTopLastZoneChangeCounter(topHalfCard.getZoneChangeCounter(game)); - meldCard.setBottomLastZoneChangeCounter(bottomHalfCard.getZoneChangeCounter(game)); - game.addSimultaneousEvent(event); - return true; - } - } - return false; - } - - @Override - public boolean moveToExile(UUID exileId, String name, UUID sourceId, Game game, ArrayList appliedEffects) { - ZoneChangeEvent event = new ZoneChangeEvent(this.getId(), sourceId, this.getOwnerId(), Zone.BATTLEFIELD, Zone.EXILED, appliedEffects); - if (!game.replaceEvent(event)) { - Player controller = game.getPlayer(this.getControllerId()); - if (controller != null) { - controller.removeFromBattlefield(this, game); - updateZoneChangeCounter(game); - MeldCard meldCard = (MeldCard) this.getCard(); - Card topHalfCard = meldCard.getTopHalfCard(); - Card bottomHalfCard = meldCard.getBottomHalfCard(); - switch (event.getToZone()) { - case GRAVEYARD: - game.getPlayer(this.getOwnerId()).putInGraveyard(topHalfCard, game, true); - game.getPlayer(this.getOwnerId()).putInGraveyard(bottomHalfCard, game, true); - break; - case HAND: - game.getPlayer(this.getOwnerId()).getHand().add(topHalfCard); - game.getPlayer(this.getOwnerId()).getHand().add(bottomHalfCard); - break; - case EXILED: - if (exileId == null) { - game.getExile().getPermanentExile().add(topHalfCard); - game.getExile().getPermanentExile().add(bottomHalfCard); - } else { - game.getExile().createZone(exileId, name).add(topHalfCard); - game.getExile().getExileZone(exileId).add(bottomHalfCard); - } - break; - case LIBRARY: - CardsImpl cardsToMove = new CardsImpl(); - cardsToMove.add(topHalfCard); - cardsToMove.add(bottomHalfCard); - if (event.getFlag()) { - controller.putCardsOnTopOfLibrary(cardsToMove, game, null, true); - } else { - controller.putCardsOnBottomOfLibrary(cardsToMove, game, null, true); - } - break; - default: - return false; - } - meldCard.setMelded(false); - game.setZone(meldCard.getId(), Zone.OUTSIDE); - game.setZone(topHalfCard.getId(), event.getToZone()); - game.setZone(bottomHalfCard.getId(), event.getToZone()); - meldCard.setTopLastZoneChangeCounter(topHalfCard.getZoneChangeCounter(game)); - meldCard.setBottomLastZoneChangeCounter(bottomHalfCard.getZoneChangeCounter(game)); - game.addSimultaneousEvent(event); - return true; - } - } - return false; - } - - @Override - public void addCounters(String name, int amount, Game game, ArrayList appliedEffects) { - MeldCard meldCard = (MeldCard) this.getCard(); - if (meldCard.isMelded()) { - super.addCounters(name, amount, game, appliedEffects); - } else { - meldCard.getTopHalfCard().addCounters(name, amount, game, appliedEffects); - meldCard.getBottomHalfCard().addCounters(name, amount, game, appliedEffects); - } - } -} +/* + * 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.game.permanent; + +import java.util.ArrayList; +import java.util.UUID; +import mage.cards.Card; +import mage.cards.CardsImpl; +import mage.cards.MeldCard; +import mage.constants.Zone; +import mage.game.Game; +import mage.game.events.ZoneChangeEvent; +import mage.players.Player; + +/** + * + * @author emerald000 + */ +public class PermanentMeld extends PermanentCard { + + public PermanentMeld(Card card, UUID controllerId, Game game) { + super(card, controllerId, game); + } + + @Override + public int getConvertedManaCost() { + if (this.isCopy()) { + return 0; + } else { + return this.getCard().getConvertedManaCost(); + } + } + + @Override + public boolean moveToZone(Zone toZone, UUID sourceId, Game game, boolean flag, ArrayList appliedEffects) { + ZoneChangeEvent event = new ZoneChangeEvent(this.getId(), sourceId, this.getOwnerId(), Zone.BATTLEFIELD, toZone, appliedEffects); + if (!game.replaceEvent(event)) { + Player controller = game.getPlayer(this.getControllerId()); + if (controller != null) { + controller.removeFromBattlefield(this, game); + updateZoneChangeCounter(game); + MeldCard meldCard = (MeldCard) this.getCard(); + Card topHalfCard = meldCard.getTopHalfCard(); + Card bottomHalfCard = meldCard.getBottomHalfCard(); + switch (event.getToZone()) { + case GRAVEYARD: + game.getPlayer(this.getOwnerId()).putInGraveyard(topHalfCard, game, true); + game.getPlayer(this.getOwnerId()).putInGraveyard(bottomHalfCard, game, true); + break; + case HAND: + game.getPlayer(this.getOwnerId()).getHand().add(topHalfCard); + game.getPlayer(this.getOwnerId()).getHand().add(bottomHalfCard); + break; + case EXILED: + game.getExile().getPermanentExile().add(topHalfCard); + game.getExile().getPermanentExile().add(bottomHalfCard); + break; + case LIBRARY: + CardsImpl cardsToMove = new CardsImpl(); + cardsToMove.add(topHalfCard); + cardsToMove.add(bottomHalfCard); + if (flag) { + controller.putCardsOnTopOfLibrary(cardsToMove, game, null, true); + } else { + controller.putCardsOnBottomOfLibrary(cardsToMove, game, null, true); + } + break; + default: + return false; + } + meldCard.setMelded(false); + game.setZone(topHalfCard.getId(), event.getToZone()); + game.setZone(bottomHalfCard.getId(), event.getToZone()); + meldCard.setTopLastZoneChangeCounter(topHalfCard.getZoneChangeCounter(game)); + meldCard.setBottomLastZoneChangeCounter(bottomHalfCard.getZoneChangeCounter(game)); + game.addSimultaneousEvent(event); + return true; + } + } + return false; + } + + @Override + public boolean moveToExile(UUID exileId, String name, UUID sourceId, Game game, ArrayList appliedEffects) { + ZoneChangeEvent event = new ZoneChangeEvent(this.getId(), sourceId, this.getOwnerId(), Zone.BATTLEFIELD, Zone.EXILED, appliedEffects); + if (!game.replaceEvent(event)) { + Player controller = game.getPlayer(this.getControllerId()); + if (controller != null) { + controller.removeFromBattlefield(this, game); + updateZoneChangeCounter(game); + MeldCard meldCard = (MeldCard) this.getCard(); + Card topHalfCard = meldCard.getTopHalfCard(); + Card bottomHalfCard = meldCard.getBottomHalfCard(); + switch (event.getToZone()) { + case GRAVEYARD: + game.getPlayer(this.getOwnerId()).putInGraveyard(topHalfCard, game, true); + game.getPlayer(this.getOwnerId()).putInGraveyard(bottomHalfCard, game, true); + break; + case HAND: + game.getPlayer(this.getOwnerId()).getHand().add(topHalfCard); + game.getPlayer(this.getOwnerId()).getHand().add(bottomHalfCard); + break; + case EXILED: + if (exileId == null) { + game.getExile().getPermanentExile().add(topHalfCard); + game.getExile().getPermanentExile().add(bottomHalfCard); + } else { + game.getExile().createZone(exileId, name).add(topHalfCard); + game.getExile().getExileZone(exileId).add(bottomHalfCard); + } + break; + case LIBRARY: + CardsImpl cardsToMove = new CardsImpl(); + cardsToMove.add(topHalfCard); + cardsToMove.add(bottomHalfCard); + if (event.getFlag()) { + controller.putCardsOnTopOfLibrary(cardsToMove, game, null, true); + } else { + controller.putCardsOnBottomOfLibrary(cardsToMove, game, null, true); + } + break; + default: + return false; + } + meldCard.setMelded(false); + game.setZone(meldCard.getId(), Zone.OUTSIDE); + game.setZone(topHalfCard.getId(), event.getToZone()); + game.setZone(bottomHalfCard.getId(), event.getToZone()); + meldCard.setTopLastZoneChangeCounter(topHalfCard.getZoneChangeCounter(game)); + meldCard.setBottomLastZoneChangeCounter(bottomHalfCard.getZoneChangeCounter(game)); + game.addSimultaneousEvent(event); + return true; + } + } + return false; + } + + @Override + public boolean addCounters(String name, int amount, Game game, ArrayList appliedEffects) { + MeldCard meldCard = (MeldCard) this.getCard(); + if (meldCard.isMelded()) { + return super.addCounters(name, amount, game, appliedEffects); + } else { + // can this really happen? + boolean returnState = true; + returnState |= meldCard.getTopHalfCard().addCounters(name, amount, game, appliedEffects); + returnState |= meldCard.getBottomHalfCard().addCounters(name, amount, game, appliedEffects); + return returnState; + } + } +} diff --git a/Mage/src/main/java/mage/players/Player.java b/Mage/src/main/java/mage/players/Player.java index a17340faa77..72cdb89893b 100644 --- a/Mage/src/main/java/mage/players/Player.java +++ b/Mage/src/main/java/mage/players/Player.java @@ -134,7 +134,7 @@ public interface Player extends MageItem, Copyable { boolean canPayLifeCost(); void setCanPaySacrificeCostFilter(FilterPermanent filter); - + FilterPermanent getSacrificeCostFilter(); boolean canPaySacrificeCost(Permanent permanent, UUID sourceId, UUID controllerId, Game game); @@ -583,7 +583,7 @@ public interface Player extends MageItem, Copyable { LinkedHashMap getUseableActivatedAbilities(MageObject object, Zone zone, Game game); - void addCounters(Counter counter, Game game); + boolean addCounters(Counter counter, Game game); void removeCounters(String name, int amount, Ability source, Game game); diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java index 8cb9f10dc80..67c344afbb6 100644 --- a/Mage/src/main/java/mage/players/PlayerImpl.java +++ b/Mage/src/main/java/mage/players/PlayerImpl.java @@ -1837,7 +1837,8 @@ public abstract class PlayerImpl implements Player, Serializable { } @Override - public void addCounters(Counter counter, Game game) { + public boolean addCounters(Counter counter, Game game) { + boolean returnState = true; int amount = counter.getCount(); for (int i = 0; i < amount; i++) { Counter eventCounter = counter.copy(); @@ -1845,8 +1846,11 @@ public abstract class PlayerImpl implements Player, Serializable { if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.ADD_COUNTER, playerId, playerId, counter.getName(), counter.getCount()))) { counters.addCounter(eventCounter); game.fireEvent(GameEvent.getEvent(EventType.COUNTER_ADDED, playerId, playerId, counter.getName(), counter.getCount())); + } else { + returnState = false; } } + return returnState; } @Override