From bec11804f550b3ba4d7f203032f28c3974d86ec7 Mon Sep 17 00:00:00 2001 From: Samuel Sandeen Date: Sat, 3 Sep 2016 16:52:41 -0400 Subject: [PATCH] Make the handling of counters more consistent. This dramatically reduces the code duplication around counters handling. --- .../commander/SkullbriarTheWalkingGrave.java | 73 +++++++++++++++++++ .../common/CountersSourceCount.java | 2 +- .../counter/AddCountersTargetEffect.java | 4 +- Mage/src/main/java/mage/cards/Card.java | 4 - Mage/src/main/java/mage/cards/CardImpl.java | 45 ++++-------- Mage/src/main/java/mage/cards/MeldCard.java | 17 ----- .../java/mage/game/permanent/Permanent.java | 2 - .../mage/game/permanent/PermanentImpl.java | 45 +----------- .../mage/game/permanent/PermanentMeld.java | 14 ---- Mage/src/main/java/mage/game/stack/Spell.java | 11 --- .../main/java/mage/players/PlayerImpl.java | 33 ++++++--- 11 files changed, 116 insertions(+), 134 deletions(-) create mode 100644 Mage.Sets/src/mage/sets/commander/SkullbriarTheWalkingGrave.java diff --git a/Mage.Sets/src/mage/sets/commander/SkullbriarTheWalkingGrave.java b/Mage.Sets/src/mage/sets/commander/SkullbriarTheWalkingGrave.java new file mode 100644 index 00000000000..316cb3fc9ac --- /dev/null +++ b/Mage.Sets/src/mage/sets/commander/SkullbriarTheWalkingGrave.java @@ -0,0 +1,73 @@ +/* + * 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.commander; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.DealsCombatDamageToAPlayerTriggeredAbility; +import mage.abilities.effects.common.counter.AddCountersSourceEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.cards.repository.CardRepository; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.counters.CounterType; + +/** + * + * @author anonymous + */ +public class SkullbriarTheWalkingGrave extends CardImpl { + + public SkullbriarTheWalkingGrave(UUID ownerId) { + super(ownerId, 227, "Skullbriar, the Walking Grave", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{B}{G}"); + this.expansionSetCode = "CMD"; + this.supertype.add("Legendary"); + this.subtype.add("Zombie"); + this.subtype.add("Elemental"); + this.power = new MageInt(1); + this.toughness = new MageInt(1); + + // Haste + this.addAbility(HasteAbility.getInstance()); + // Whenever Skullbriar, the Walking Grave deals combat damage to a player, put a +1/+1 counter on it. + this.addAbility(new DealsCombatDamageToAPlayerTriggeredAbility( + new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false)); + // Counters remain on Skullbriar as it moves to any zone other than a player's hand or library. + + } + + public SkullbriarTheWalkingGrave(final SkullbriarTheWalkingGrave card) { + super(card); + } + + @Override + public SkullbriarTheWalkingGrave copy() { + return new SkullbriarTheWalkingGrave(this); + } +} diff --git a/Mage/src/main/java/mage/abilities/dynamicvalue/common/CountersSourceCount.java b/Mage/src/main/java/mage/abilities/dynamicvalue/common/CountersSourceCount.java index d132ed29a60..53c1a7f2c64 100644 --- a/Mage/src/main/java/mage/abilities/dynamicvalue/common/CountersSourceCount.java +++ b/Mage/src/main/java/mage/abilities/dynamicvalue/common/CountersSourceCount.java @@ -23,7 +23,7 @@ public class CountersSourceCount implements DynamicValue { public int calculate(Game game, Ability sourceAbility, Effect effect) { Permanent permanent = game.getPermanentOrLKIBattlefield(sourceAbility.getSourceId()); if (permanent != null) { - return permanent.getCounters().getCount(counter); + return permanent.getCounters(game).getCount(counter); } return 0; } diff --git a/Mage/src/main/java/mage/abilities/effects/common/counter/AddCountersTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/counter/AddCountersTargetEffect.java index 12ed557e84f..529100514bb 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/counter/AddCountersTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/counter/AddCountersTargetEffect.java @@ -145,7 +145,9 @@ public class AddCountersTargetEffect extends OneShotEffect { sb.append("s"); } sb.append(" on "); - + + + Target target = mode.getTargets().get(0); if (target.getNumberOfTargets() == 0) { sb.append("up to "); diff --git a/Mage/src/main/java/mage/cards/Card.java b/Mage/src/main/java/mage/cards/Card.java index 13895bc84c0..b5525dc669f 100644 --- a/Mage/src/main/java/mage/cards/Card.java +++ b/Mage/src/main/java/mage/cards/Card.java @@ -155,10 +155,6 @@ public interface Card extends MageObject { Counters getCounters(GameState state); - boolean addCounters(String name, int amount, Game game); - - boolean addCounters(String name, int amount, Game game, ArrayList appliedEffects); - boolean addCounters(Counter counter, Game game); boolean addCounters(Counter counter, Game game, ArrayList appliedEffects); diff --git a/Mage/src/main/java/mage/cards/CardImpl.java b/Mage/src/main/java/mage/cards/CardImpl.java index a0c23ef525c..ebe0e0aa52c 100644 --- a/Mage/src/main/java/mage/cards/CardImpl.java +++ b/Mage/src/main/java/mage/cards/CardImpl.java @@ -664,31 +664,11 @@ public abstract class CardImpl extends MageObjectImpl implements Card { return state.getCardState(this.objectId).getCounters(); } - @Override - public boolean addCounters(String name, int amount, Game game) { - return addCounters(name, amount, game, null); - } - - @Override - public boolean addCounters(String name, int amount, Game game, ArrayList appliedEffects) { - boolean returnCode = true; - GameEvent countersEvent = GameEvent.getEvent(GameEvent.EventType.ADD_COUNTERS, objectId, ownerId, name, amount); - countersEvent.setAppliedEffects(appliedEffects); - if (!game.replaceEvent(countersEvent)) { - for (int i = 0; i < countersEvent.getAmount(); i++) { - GameEvent event = GameEvent.getEvent(GameEvent.EventType.ADD_COUNTER, objectId, ownerId, name, 1); - event.setAppliedEffects(appliedEffects); - if (!game.replaceEvent(event)) { - getCounters(game).addCounter(name, 1); - game.fireEvent(GameEvent.getEvent(GameEvent.EventType.COUNTER_ADDED, objectId, ownerId, name, 1)); - } else { - returnCode = false; - } - } - } else { - returnCode = false; - } - return returnCode; + /** + * @return The controller if available otherwise the owner. + */ + protected UUID getControllerOrOwner() { + return ownerId; } @Override @@ -699,22 +679,27 @@ public abstract class CardImpl extends MageObjectImpl implements Card { @Override public boolean addCounters(Counter counter, Game game, ArrayList appliedEffects) { boolean returnCode = true; - GameEvent countersEvent = GameEvent.getEvent(GameEvent.EventType.ADD_COUNTERS, objectId, ownerId, counter.getName(), counter.getCount()); + GameEvent countersEvent = GameEvent.getEvent(GameEvent.EventType.ADD_COUNTERS, objectId, getControllerOrOwner(), counter.getName(), counter.getCount()); countersEvent.setAppliedEffects(appliedEffects); if (!game.replaceEvent(countersEvent)) { int amount = countersEvent.getAmount(); + int finalAmount = amount; for (int i = 0; i < amount; i++) { Counter eventCounter = counter.copy(); - eventCounter.remove(amount - 1); - GameEvent event = GameEvent.getEvent(GameEvent.EventType.ADD_COUNTER, objectId, ownerId, counter.getName(), 1); + eventCounter.remove(eventCounter.getCount() - 1); + GameEvent event = GameEvent.getEvent(GameEvent.EventType.ADD_COUNTER, objectId, getControllerOrOwner(), counter.getName(), 1); event.setAppliedEffects(appliedEffects); if (!game.replaceEvent(event)) { getCounters(game).addCounter(eventCounter); - game.fireEvent(GameEvent.getEvent(GameEvent.EventType.COUNTER_ADDED, objectId, ownerId, counter.getName(), 1)); + game.fireEvent(GameEvent.getEvent(GameEvent.EventType.COUNTER_ADDED, objectId, getControllerOrOwner(), counter.getName(), 1)); } else { + finalAmount--; returnCode = false; } } + if(finalAmount > 0) { + game.fireEvent(GameEvent.getEvent(GameEvent.EventType.COUNTERS_ADDED, objectId, getControllerOrOwner(), counter.getName(), amount)); + } } else { returnCode = false; } @@ -725,7 +710,7 @@ public abstract class CardImpl extends MageObjectImpl implements Card { public void removeCounters(String name, int amount, Game game) { for (int i = 0; i < amount; i++) { getCounters(game).removeCounter(name, 1); - GameEvent event = GameEvent.getEvent(GameEvent.EventType.COUNTER_REMOVED, objectId, ownerId); + GameEvent event = GameEvent.getEvent(GameEvent.EventType.COUNTER_REMOVED, objectId, getControllerOrOwner()); event.setData(name); game.fireEvent(event); } diff --git a/Mage/src/main/java/mage/cards/MeldCard.java b/Mage/src/main/java/mage/cards/MeldCard.java index d49cc2c53fc..d7ccc2d6578 100644 --- a/Mage/src/main/java/mage/cards/MeldCard.java +++ b/Mage/src/main/java/mage/cards/MeldCard.java @@ -346,21 +346,4 @@ public abstract class MeldCard extends CardImpl { return returnState; } } - - @Override - public boolean addCounters(String name, int amount, Game game, ArrayList appliedEffects) { - if (this.isMelded()) { - return super.addCounters(name, amount, game, appliedEffects); - } else { - // can this really happen? - boolean returnState = true; - if (topLastZoneChangeCounter == topHalfCard.getZoneChangeCounter(game)) { - returnState |= topHalfCard.addCounters(name, amount, game, appliedEffects); - } - if (bottomLastZoneChangeCounter == bottomHalfCard.getZoneChangeCounter(game)) { - returnState |= bottomHalfCard.addCounters(name, amount, game, appliedEffects); - } - return returnState; - } - } } diff --git a/Mage/src/main/java/mage/game/permanent/Permanent.java b/Mage/src/main/java/mage/game/permanent/Permanent.java index 56670bc3fae..a9718c49a3b 100644 --- a/Mage/src/main/java/mage/game/permanent/Permanent.java +++ b/Mage/src/main/java/mage/game/permanent/Permanent.java @@ -104,8 +104,6 @@ public interface Permanent extends Card, Controllable { void setSecondCardFace(Card card); - Counters getCounters(); - List getAttachments(); UUID getAttachedTo(); diff --git a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java index 501dca7d47c..5ff27625d02 100644 --- a/Mage/src/main/java/mage/game/permanent/PermanentImpl.java +++ b/Mage/src/main/java/mage/game/permanent/PermanentImpl.java @@ -323,11 +323,6 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { getAbilities().clear(); } - @Override - public Counters getCounters() { - return counters; - } - @Override public Counters getCounters(Game game) { return counters; @@ -339,44 +334,8 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { } @Override - public boolean addCounters(Counter counter, Game game, ArrayList appliedEffects) { - boolean returnCode = true; - GameEvent countersEvent = GameEvent.getEvent(GameEvent.EventType.ADD_COUNTERS, objectId, controllerId, counter.getName(), counter.getCount()); - countersEvent.setAppliedEffects(appliedEffects); - if (!game.replaceEvent(countersEvent)) { - int amount = countersEvent.getAmount(); - for (int i = 0; i < amount; i++) { - Counter eventCounter = counter.copy(); - eventCounter.remove(eventCounter.getCount() - 1); - GameEvent event = GameEvent.getEvent(GameEvent.EventType.ADD_COUNTER, objectId, controllerId, counter.getName(), 1); - event.setAppliedEffects(appliedEffects); - if (!game.replaceEvent(event)) { - counters.addCounter(eventCounter); - game.fireEvent(GameEvent.getEvent(GameEvent.EventType.COUNTER_ADDED, objectId, controllerId, counter.getName(), 1)); - } else { - returnCode = false; - } - } - game.fireEvent(GameEvent.getEvent(GameEvent.EventType.COUNTERS_ADDED, objectId, controllerId, counter.getName(), amount)); - } else { - returnCode = false; - } - return returnCode; - } - - @Override - public void removeCounters(String name, int amount, Game game) { - for (int i = 0; i < amount; i++) { - counters.removeCounter(name, 1); - GameEvent event = GameEvent.getEvent(GameEvent.EventType.COUNTER_REMOVED, objectId, controllerId); - event.setData(name); - game.fireEvent(event); - } - } - - @Override - public void removeCounters(Counter counter, Game game) { - removeCounters(counter.getName(), counter.getCount(), game); + protected UUID getControllerOrOwner() { + return controllerId; } @Override diff --git a/Mage/src/main/java/mage/game/permanent/PermanentMeld.java b/Mage/src/main/java/mage/game/permanent/PermanentMeld.java index 36d4f336b0b..6bd0f13116a 100644 --- a/Mage/src/main/java/mage/game/permanent/PermanentMeld.java +++ b/Mage/src/main/java/mage/game/permanent/PermanentMeld.java @@ -159,18 +159,4 @@ public class PermanentMeld extends PermanentCard { } 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/game/stack/Spell.java b/Mage/src/main/java/mage/game/stack/Spell.java index 9a1b8eebbb0..85e4b2bb860 100644 --- a/Mage/src/main/java/mage/game/stack/Spell.java +++ b/Mage/src/main/java/mage/game/stack/Spell.java @@ -826,7 +826,6 @@ public class Spell extends StackObjImpl implements Card { @Override public Counters getCounters(Game game) { - return card.getCounters(game); } @@ -835,16 +834,6 @@ public class Spell extends StackObjImpl implements Card { return card.getCounters(state); } - @Override - public boolean addCounters(String name, int amount, Game game) { - return card.addCounters(name, amount, game); - } - - @Override - public boolean addCounters(String name, int amount, Game game, ArrayList appliedEffects) { - return card.addCounters(name, amount, game, appliedEffects); - } - @Override public boolean addCounters(Counter counter, Game game) { return card.addCounters(counter, game); diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java index 67c344afbb6..02bb023242b 100644 --- a/Mage/src/main/java/mage/players/PlayerImpl.java +++ b/Mage/src/main/java/mage/players/PlayerImpl.java @@ -1838,19 +1838,30 @@ public abstract class PlayerImpl implements Player, Serializable { @Override 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(); - eventCounter.remove(amount - 1); - 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; + boolean returnCode = true; + GameEvent countersEvent = GameEvent.getEvent(EventType.ADD_COUNTERS, playerId, playerId, counter.getName(), counter.getCount()); + if (!game.replaceEvent(countersEvent)) { + int amount = countersEvent.getAmount(); + int finalAmount = amount; + for (int i = 0; i < amount; i++) { + Counter eventCounter = counter.copy(); + eventCounter.remove(amount - 1); + GameEvent event = GameEvent.getEvent(EventType.ADD_COUNTER, playerId, playerId, counter.getName(), 1); + if (!game.replaceEvent(event)) { + getCounters().addCounter(eventCounter); + game.fireEvent(GameEvent.getEvent(EventType.COUNTER_ADDED, playerId, playerId, counter.getName(), 1)); + } else { + finalAmount--; + returnCode = false; + } } + if(finalAmount > 0) { + game.fireEvent(GameEvent.getEvent(EventType.COUNTERS_ADDED, playerId, playerId, counter.getName(), amount)); + } + } else { + returnCode = false; } - return returnState; + return returnCode; } @Override