From 34668ba5d9589a71e7061bdba3213602f225c966 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 18 Jun 2016 11:34:39 +0200 Subject: [PATCH] Fresh Meat, Caller of the Claw - Fixed problem with watchers using the same internal name. --- .../mage/sets/legions/CallerOfTheClaw.java | 7 +-- .../src/mage/sets/newphyrexia/FreshMeat.java | 60 ++----------------- .../watchers/common/CreaturesDiedWatcher.java | 17 ++++++ 3 files changed, 26 insertions(+), 58 deletions(-) diff --git a/Mage.Sets/src/mage/sets/legions/CallerOfTheClaw.java b/Mage.Sets/src/mage/sets/legions/CallerOfTheClaw.java index b1f7f440a77..576fc5d4dbd 100644 --- a/Mage.Sets/src/mage/sets/legions/CallerOfTheClaw.java +++ b/Mage.Sets/src/mage/sets/legions/CallerOfTheClaw.java @@ -86,7 +86,7 @@ class CallerOfTheClawWatcher extends Watcher { private int creaturesCount = 0; public CallerOfTheClawWatcher() { - super("YourCreaturesDied", WatcherScope.PLAYER); + super(CallerOfTheClawWatcher.class.getName(), WatcherScope.PLAYER); condition = true; } @@ -107,7 +107,7 @@ class CallerOfTheClawWatcher extends Watcher { @Override public void watch(GameEvent event, Game game) { if (event.getType() == GameEvent.EventType.ZONE_CHANGE && ((ZoneChangeEvent) event).isDiesEvent()) { - Permanent card = (Permanent)game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD); + Permanent card = (Permanent) game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD); if (card != null && card.getOwnerId().equals(this.controllerId) && card.getCardType().contains(CardType.CREATURE) && !(card instanceof PermanentToken)) { creaturesCount++; } @@ -123,7 +123,6 @@ class CallerOfTheClawWatcher extends Watcher { class CallerOfTheClawDynamicValue implements DynamicValue { - @Override public CallerOfTheClawDynamicValue copy() { return new CallerOfTheClawDynamicValue(); @@ -141,7 +140,7 @@ class CallerOfTheClawDynamicValue implements DynamicValue { @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { - CallerOfTheClawWatcher watcher = (CallerOfTheClawWatcher) game.getState().getWatchers().get("YourCreaturesDied", sourceAbility.getControllerId()); + CallerOfTheClawWatcher watcher = (CallerOfTheClawWatcher) game.getState().getWatchers().get(CallerOfTheClawWatcher.class.getName(), sourceAbility.getControllerId()); if (watcher != null) { return watcher.getCreaturesCount(); } diff --git a/Mage.Sets/src/mage/sets/newphyrexia/FreshMeat.java b/Mage.Sets/src/mage/sets/newphyrexia/FreshMeat.java index e3d8b953a1c..35d5919d656 100644 --- a/Mage.Sets/src/mage/sets/newphyrexia/FreshMeat.java +++ b/Mage.Sets/src/mage/sets/newphyrexia/FreshMeat.java @@ -27,25 +27,17 @@ */ package mage.sets.newphyrexia; -import mage.MageObject; +import java.util.UUID; import mage.abilities.Ability; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.effects.Effect; import mage.abilities.effects.common.CreateTokenEffect; -import mage.cards.Card; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Rarity; -import mage.constants.WatcherScope; -import mage.constants.Zone; import mage.game.Game; -import mage.game.events.GameEvent; -import mage.game.events.GameEvent.EventType; -import mage.game.events.ZoneChangeEvent; import mage.game.permanent.token.BeastToken; -import mage.watchers.Watcher; - -import java.util.UUID; +import mage.watchers.common.CreaturesDiedWatcher; /** * @@ -57,8 +49,8 @@ public class FreshMeat extends CardImpl { super(ownerId, 109, "Fresh Meat", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{3}{G}"); this.expansionSetCode = "NPH"; - - this.getSpellAbility().addWatcher(new FreshMeatWatcher()); + // Put a 3/3 green Beast creature token onto the battlefield for each creature put into your graveyard from the battlefield this turn. + this.getSpellAbility().addWatcher(new CreaturesDiedWatcher()); this.getSpellAbility().addEffect(new CreateTokenEffect(new BeastToken(), new FreshMeatDynamicValue())); } @@ -72,53 +64,13 @@ public class FreshMeat extends CardImpl { } } -class FreshMeatWatcher extends Watcher { - - private int creaturesCount = 0; - - public FreshMeatWatcher() { - super("YourCreaturesDied", WatcherScope.PLAYER); - condition = true; - } - - public FreshMeatWatcher(final FreshMeatWatcher watcher) { - super(watcher); - this.creaturesCount = watcher.creaturesCount; - } - - @Override - public FreshMeatWatcher copy() { - return new FreshMeatWatcher(this); - } - - public int getCreaturesCount() { - return creaturesCount; - } - - @Override - public void watch(GameEvent event, Game game) { - if (event.getType() == EventType.ZONE_CHANGE && ((ZoneChangeEvent) event).isDiesEvent()) { - MageObject card = game.getLastKnownInformation(event.getTargetId(), Zone.BATTLEFIELD); - if (card != null && ((Card)card).getOwnerId().equals(this.controllerId) && card.getCardType().contains(CardType.CREATURE)) { - creaturesCount++; - } - } - } - - @Override - public void reset() { - super.reset(); - creaturesCount = 0; - } -} - class FreshMeatDynamicValue implements DynamicValue { @Override public int calculate(Game game, Ability sourceAbility, Effect effect) { - FreshMeatWatcher watcher = (FreshMeatWatcher) game.getState().getWatchers().get("YourCreaturesDied", sourceAbility.getControllerId()); + CreaturesDiedWatcher watcher = (CreaturesDiedWatcher) game.getState().getWatchers().get("CreaturesDiedWatcher"); if (watcher != null) { - return watcher.getCreaturesCount(); + return watcher.getAmountOfCreaturesDiesThisTurn(sourceAbility.getControllerId()); } return 0; } diff --git a/Mage/src/main/java/mage/watchers/common/CreaturesDiedWatcher.java b/Mage/src/main/java/mage/watchers/common/CreaturesDiedWatcher.java index 23198a8e295..12daad0fc01 100644 --- a/Mage/src/main/java/mage/watchers/common/CreaturesDiedWatcher.java +++ b/Mage/src/main/java/mage/watchers/common/CreaturesDiedWatcher.java @@ -27,6 +27,8 @@ */ package mage.watchers.common; +import java.util.HashMap; +import java.util.UUID; import mage.constants.CardType; import mage.constants.WatcherScope; import mage.game.Game; @@ -41,6 +43,7 @@ import mage.watchers.Watcher; public class CreaturesDiedWatcher extends Watcher { private int amountOfCreaturesThatDied; + private final HashMap amountOfCreaturesThatDiedByController = new HashMap<>(); public CreaturesDiedWatcher() { super("CreaturesDiedWatcher", WatcherScope.GAME); @@ -49,6 +52,7 @@ public class CreaturesDiedWatcher extends Watcher { public CreaturesDiedWatcher(final CreaturesDiedWatcher watcher) { super(watcher); this.amountOfCreaturesThatDied = watcher.amountOfCreaturesThatDied; + this.amountOfCreaturesThatDiedByController.putAll(watcher.amountOfCreaturesThatDiedByController); } @Override @@ -57,6 +61,11 @@ public class CreaturesDiedWatcher extends Watcher { ZoneChangeEvent zEvent = (ZoneChangeEvent) event; if (zEvent.isDiesEvent() && zEvent.getTarget() != null && zEvent.getTarget().getCardType().contains(CardType.CREATURE)) { amountOfCreaturesThatDied++; + int amount = 0; + if (amountOfCreaturesThatDiedByController.containsKey(zEvent.getTarget().getControllerId())) { + amount = amountOfCreaturesThatDiedByController.get(zEvent.getTarget().getControllerId()); + } + amountOfCreaturesThatDiedByController.put(zEvent.getTarget().getControllerId(), amount + 1); } } } @@ -64,12 +73,20 @@ public class CreaturesDiedWatcher extends Watcher { @Override public void reset() { amountOfCreaturesThatDied = 0; + amountOfCreaturesThatDiedByController.clear(); } public int getAmountOfCreaturesDiesThisTurn() { return amountOfCreaturesThatDied; } + public int getAmountOfCreaturesDiesThisTurn(UUID playerId) { + if (amountOfCreaturesThatDiedByController.containsKey(playerId)) { + return amountOfCreaturesThatDiedByController.get(playerId); + } + return 0; + } + @Override public CreaturesDiedWatcher copy() { return new CreaturesDiedWatcher(this);