diff --git a/Mage.Sets/src/mage/sets/homelands/Leeches.java b/Mage.Sets/src/mage/sets/homelands/Leeches.java index 3cdeeff2d8c..020ab395a8b 100644 --- a/Mage.Sets/src/mage/sets/homelands/Leeches.java +++ b/Mage.Sets/src/mage/sets/homelands/Leeches.java @@ -64,7 +64,6 @@ public class Leeches extends CardImpl { } } - class LeechesEffect extends OneShotEffect { public LeechesEffect() { @@ -91,7 +90,7 @@ class LeechesEffect extends OneShotEffect { int countPoisonCounters = targetPlayer.getCounters().getCount(CounterType.POISON); if (countPoisonCounters > 0) { - targetPlayer.getCounters().removeCounter(CounterType.POISON, countPoisonCounters); + targetPlayer.removeCounters(CounterType.POISON.getName(), countPoisonCounters, source, game); targetPlayer.damage(countPoisonCounters, source.getSourceId(), game, false, true); return true; } 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 be5d9f0eb03..ff8f1b33c98 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 @@ -1441,6 +1441,11 @@ public class TestPlayer implements Player { computerPlayer.addCounters(counter, game); } + @Override + public void removeCounters(String name, int amount, Ability source, Game game) { + computerPlayer.removeCounters(name, amount, source, game); + } + @Override public Abilities getAbilities() { return computerPlayer.getAbilities(); @@ -1927,12 +1932,12 @@ public class TestPlayer implements Player { public boolean getPassedUntilStackResolved() { return computerPlayer.getPassedUntilStackResolved(); } - + @Override public boolean getPassedUntilEndStepBeforeMyTurn() { return computerPlayer.getPassedUntilEndStepBeforeMyTurn(); } - + @Override public void revokePermissionToSeeHandCards() { computerPlayer.revokePermissionToSeeHandCards(); 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 e3296dfecdf..730e9a652e4 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 @@ -348,12 +348,11 @@ public class PlayerStub implements Player { return false; } - @Override public boolean getPassedAllTurns() { return false; } - + @Override public boolean getPassedUntilEndStepBeforeMyTurn() { return false; @@ -1019,6 +1018,11 @@ public class PlayerStub implements Player { } + @Override + public void removeCounters(String name, int amount, Ability source, Game game) { + + } + @Override public List getAttachments() { return null; @@ -1178,10 +1182,10 @@ public class PlayerStub implements Player { public UUID getCastSourceIdWithAlternateMana() { return null; } - + @Override public void setCastSourceIdWithAlternateMana(UUID sourceId, ManaCosts manaCosts, Costs costs) { - + } @Override diff --git a/Mage/src/main/java/mage/abilities/costs/common/PayLoyaltyCost.java b/Mage/src/main/java/mage/abilities/costs/common/PayLoyaltyCost.java index 7bbfbc2c5ab..5cb975d7b1f 100644 --- a/Mage/src/main/java/mage/abilities/costs/common/PayLoyaltyCost.java +++ b/Mage/src/main/java/mage/abilities/costs/common/PayLoyaltyCost.java @@ -69,7 +69,7 @@ public class PayLoyaltyCost extends CostImpl { if (amount > 0) { planeswalker.getCounters().addCounter(CounterType.LOYALTY.createInstance(amount)); } else if (amount < 0) { - planeswalker.getCounters().removeCounter(CounterType.LOYALTY, Math.abs(amount)); + planeswalker.removeCounters(CounterType.LOYALTY.getName(), Math.abs(amount), game); } planeswalker.addLoyaltyUsed(); this.paid = true; diff --git a/Mage/src/main/java/mage/abilities/costs/common/RemoveCounterCost.java b/Mage/src/main/java/mage/abilities/costs/common/RemoveCounterCost.java index 67a6d3324e3..38be9ace0eb 100644 --- a/Mage/src/main/java/mage/abilities/costs/common/RemoveCounterCost.java +++ b/Mage/src/main/java/mage/abilities/costs/common/RemoveCounterCost.java @@ -98,24 +98,22 @@ public class RemoveCounterCost extends CostImpl { if (counterTypeToRemove != null) { counterName = counterTypeToRemove.getName(); - } else { - if (permanent.getCounters().size() > 1 && counterTypeToRemove == null) { - Choice choice = new ChoiceImpl(true); - Set choices = new HashSet<>(); - for (Counter counter : permanent.getCounters().values()) { - if (permanent.getCounters().getCount(counter.getName()) > 0) { - choices.add(counter.getName()); - } + } else if (permanent.getCounters().size() > 1 && counterTypeToRemove == null) { + Choice choice = new ChoiceImpl(true); + Set choices = new HashSet<>(); + for (Counter counter : permanent.getCounters().values()) { + if (permanent.getCounters().getCount(counter.getName()) > 0) { + choices.add(counter.getName()); } - choice.setChoices(choices); - choice.setMessage("Choose a counter to remove from " + permanent.getLogName()); - controller.choose(Outcome.UnboostCreature, choice, game); - counterName = choice.getChoice(); - } else { - for (Counter counter : permanent.getCounters().values()) { - if (counter.getCount() > 0) { - counterName = counter.getName(); - } + } + choice.setChoices(choices); + choice.setMessage("Choose a counter to remove from " + permanent.getLogName()); + controller.choose(Outcome.UnboostCreature, choice, game); + counterName = choice.getChoice(); + } else { + for (Counter counter : permanent.getCounters().values()) { + if (counter.getCount() > 0) { + counterName = counter.getName(); } } } @@ -129,6 +127,7 @@ public class RemoveCounterCost extends CostImpl { } permanent.removeCounters(counterName, numberOfCountersSelected, game); if (permanent.getCounters().getCount(counterName) == 0) { + // this removes only the item with number = 0 from the collection permanent.getCounters().removeCounter(counterName); } countersRemoved += numberOfCountersSelected; diff --git a/Mage/src/main/java/mage/abilities/effects/common/RemoveAllCountersSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/RemoveAllCountersSourceEffect.java index abc70475f47..0327dd6dd65 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/RemoveAllCountersSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/RemoveAllCountersSourceEffect.java @@ -25,7 +25,6 @@ * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.abilities.effects.common; import mage.abilities.Ability; @@ -62,12 +61,11 @@ public class RemoveAllCountersSourceEffect extends OneShotEffect { @java.lang.Override public boolean apply(Game game, Ability source) { Permanent sourcePermanent = game.getPermanent(source.getSourceId()); - if(sourcePermanent != null) { + if (sourcePermanent != null) { int count = sourcePermanent.getCounters().getCount(counterType); - sourcePermanent.getCounters().removeCounter(counterType, count); + sourcePermanent.removeCounters(counterType.getName(), count, game); return true; } return false; } } - diff --git a/Mage/src/main/java/mage/players/Player.java b/Mage/src/main/java/mage/players/Player.java index 2efb446815a..9041719b65b 100644 --- a/Mage/src/main/java/mage/players/Player.java +++ b/Mage/src/main/java/mage/players/Player.java @@ -582,6 +582,8 @@ public interface Player extends MageItem, Copyable { void addCounters(Counter counter, Game game); + void removeCounters(String name, int amount, Ability source, Game game); + List getAttachments(); boolean addAttachment(UUID permanentId, Game game); diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java index d4cd42e36f9..dccd865a1a1 100644 --- a/Mage/src/main/java/mage/players/PlayerImpl.java +++ b/Mage/src/main/java/mage/players/PlayerImpl.java @@ -1839,6 +1839,18 @@ public abstract class PlayerImpl implements Player, Serializable { } } + @Override + public void removeCounters(String name, int amount, Ability source, Game game) { + for (int i = 0; i < amount; i++) { + counters.removeCounter(name, 1); + GameEvent event = GameEvent.getEvent(GameEvent.EventType.COUNTER_REMOVED, + getId(), (source == null ? null : source.getSourceId()), (source == null ? null : source.getControllerId())); + event.setData(name); + event.setAmount(1); + game.fireEvent(event); + } + } + protected boolean canDamage(MageObject source, Game game) { for (ProtectionAbility ability : abilities.getProtectionAbilities()) { if (!ability.canTarget(source, game)) {