From 68dc1fdce9d8525c5c20281e721fa7e997895b91 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 26 Mar 2023 19:36:41 +0800 Subject: [PATCH] refactor ManaShards - remove Mana Shards as countertype --- forge-game/src/main/java/forge/game/Game.java | 2 +- .../src/main/java/forge/game/GameEntity.java | 6 +--- .../effects/CountersProliferateEffect.java | 2 -- .../java/forge/game/card/CounterEnumType.java | 1 - .../java/forge/game/cost/CostPayShards.java | 5 ++-- .../event/GameEventPlayerShardsChanged.java | 27 +++++++++++++++++ .../forge/game/event/IGameEventVisitor.java | 2 ++ .../main/java/forge/game/player/Player.java | 30 +++++++++---------- .../java/forge/game/player/PlayerView.java | 7 +++++ .../forge/trackable/TrackableProperty.java | 1 + .../src/forge/adventure/scene/DuelScene.java | 3 +- .../screens/match/views/VPlayerPanel.java | 4 +-- .../gui/control/FControlGameEventHandler.java | 5 ++++ .../java/forge/player/HumanCostDecision.java | 2 +- .../src/main/java/forge/player/HumanPlay.java | 3 +- 15 files changed, 66 insertions(+), 34 deletions(-) create mode 100644 forge-game/src/main/java/forge/game/event/GameEventPlayerShardsChanged.java diff --git a/forge-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java index 4c7fa6d0a43..461768656ee 100644 --- a/forge-game/src/main/java/forge/game/Game.java +++ b/forge-game/src/main/java/forge/game/Game.java @@ -297,7 +297,7 @@ public class Game { pl.setStartingHandSize(psc.getStartingHand()); if (psc.getManaShards() > 0) { - pl.setCounters(CounterEnumType.MANASHARDS, psc.getManaShards(), true); + pl.setNumManaShards(psc.getManaShards()); } int teamNum = psc.getTeamNumber(); if (teamNum == -1) { diff --git a/forge-game/src/main/java/forge/game/GameEntity.java b/forge-game/src/main/java/forge/game/GameEntity.java index 90db4ec3e17..8396405f6ed 100644 --- a/forge-game/src/main/java/forge/game/GameEntity.java +++ b/forge-game/src/main/java/forge/game/GameEntity.java @@ -19,7 +19,6 @@ package forge.game; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; import org.apache.commons.lang3.tuple.Pair; @@ -281,10 +280,7 @@ public abstract class GameEntity extends GameObject implements IIdentifiable { // Counters! public boolean hasCounters() { - if (counters.isEmpty()) - return false; - int size = counters.entrySet().stream().filter(ct -> !ct.getKey().is(CounterEnumType.MANASHARDS)).collect(Collectors.toList()).size(); - return size > 0; + return !counters.isEmpty(); } // get all counters from a card diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersProliferateEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersProliferateEffect.java index 93548cbc65d..4070a304802 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersProliferateEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersProliferateEffect.java @@ -65,8 +65,6 @@ public class CountersProliferateEffect extends SpellAbilityEffect { GameEntityCounterTable table = new GameEntityCounterTable(); for (final GameEntity ge : result) { for (final CounterType ct : ge.getCounters().keySet()) { - if (ct.is(CounterEnumType.MANASHARDS)) - continue; ge.addCounter(ct, 1, p, table); } } diff --git a/forge-game/src/main/java/forge/game/card/CounterEnumType.java b/forge-game/src/main/java/forge/game/card/CounterEnumType.java index 9f6e8ee3059..0502b07a6e3 100644 --- a/forge-game/src/main/java/forge/game/card/CounterEnumType.java +++ b/forge-game/src/main/java/forge/game/card/CounterEnumType.java @@ -394,7 +394,6 @@ public enum CounterEnumType { POISON("POISN"), TICKET("TICKET"), - MANASHARDS("MANASHARDS"), //Adventure-specific mechanic // Keyword Counters /* diff --git a/forge-game/src/main/java/forge/game/cost/CostPayShards.java b/forge-game/src/main/java/forge/game/cost/CostPayShards.java index b8634951fcc..df62fdb2b0f 100644 --- a/forge-game/src/main/java/forge/game/cost/CostPayShards.java +++ b/forge-game/src/main/java/forge/game/cost/CostPayShards.java @@ -19,7 +19,6 @@ package forge.game.cost; import com.google.common.base.Strings; import forge.game.card.Card; -import forge.game.card.CounterEnumType; import forge.game.player.Player; import forge.game.spellability.SpellAbility; @@ -47,7 +46,7 @@ public class CostPayShards extends CostPart { @Override public Integer getMaxAmountX(final SpellAbility ability, final Player payer, final boolean effect) { - return payer.getCounters(CounterEnumType.MANASHARDS); + return payer.getNumManaShards(); } /* @@ -83,7 +82,7 @@ public class CostPayShards extends CostPart { */ @Override public final boolean canPay(final SpellAbility ability, final Player payer, final boolean effect) { - return payer.getCounters(CounterEnumType.MANASHARDS) >= this.getAbilityAmount(ability); + return payer.getNumManaShards() >= this.getAbilityAmount(ability); } @Override diff --git a/forge-game/src/main/java/forge/game/event/GameEventPlayerShardsChanged.java b/forge-game/src/main/java/forge/game/event/GameEventPlayerShardsChanged.java new file mode 100644 index 00000000000..4ff56fc6bae --- /dev/null +++ b/forge-game/src/main/java/forge/game/event/GameEventPlayerShardsChanged.java @@ -0,0 +1,27 @@ +package forge.game.event; + +import forge.game.player.Player; +import forge.util.Lang; +import forge.util.TextUtil; + +public class GameEventPlayerShardsChanged extends GameEvent { + public final Player player; + public final int oldShards; + public final int newShards; + + public GameEventPlayerShardsChanged(Player who, int oldValue, int newValue) { + player = who; + oldShards = oldValue; + newShards = newValue; + } + + @Override + public T visit(IGameEventVisitor visitor) { + return visitor.visit(this); + } + + @Override + public String toString() { + return TextUtil.concatWithSpace(Lang.getInstance().getPossesive(player.getName()),"shards changed:", String.valueOf(oldShards),"->", String.valueOf(newShards)); + } +} diff --git a/forge-game/src/main/java/forge/game/event/IGameEventVisitor.java b/forge-game/src/main/java/forge/game/event/IGameEventVisitor.java index 8c579f6805e..905fcb4b170 100644 --- a/forge-game/src/main/java/forge/game/event/IGameEventVisitor.java +++ b/forge-game/src/main/java/forge/game/event/IGameEventVisitor.java @@ -37,6 +37,7 @@ public interface IGameEventVisitor { T visit(GameEventPlayerCounters event); T visit(GameEventPlayerPoisoned event); T visit(GameEventPlayerPriority event); + T visit(GameEventPlayerShardsChanged event); T visit(GameEventPlayerStatsChanged event); T visit(GameEventRandomLog event); T visit(GameEventRollDie event); @@ -90,6 +91,7 @@ public interface IGameEventVisitor { public T visit(GameEventPlayerCounters event) { return null; } public T visit(GameEventPlayerPoisoned event) { return null; } public T visit(GameEventPlayerPriority event) { return null; } + public T visit(GameEventPlayerShardsChanged event) { return null; } public T visit(GameEventPlayerStatsChanged event) { return null; } public T visit(GameEventRandomLog event) { return null; } public T visit(GameEventRollDie event) { return null; } diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 13759edaa84..40fe3146859 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -33,6 +33,7 @@ import java.util.NavigableMap; import java.util.Set; import java.util.SortedSet; +import forge.game.event.*; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; @@ -78,18 +79,6 @@ import forge.game.card.CardUtil; import forge.game.card.CardZoneTable; import forge.game.card.CounterEnumType; import forge.game.card.CounterType; -import forge.game.event.GameEventCardSacrificed; -import forge.game.event.GameEventLandPlayed; -import forge.game.event.GameEventManaBurn; -import forge.game.event.GameEventMulligan; -import forge.game.event.GameEventPlayerControl; -import forge.game.event.GameEventPlayerCounters; -import forge.game.event.GameEventPlayerDamaged; -import forge.game.event.GameEventPlayerLivesChanged; -import forge.game.event.GameEventPlayerPoisoned; -import forge.game.event.GameEventPlayerStatsChanged; -import forge.game.event.GameEventShuffle; -import forge.game.event.GameEventSurveil; import forge.game.keyword.Companion; import forge.game.keyword.Keyword; import forge.game.keyword.KeywordCollection; @@ -162,6 +151,7 @@ public class Player extends GameEntity implements Comparable { private int lifeGainedThisTurn; private int lifeGainedTimesThisTurn; private int lifeGainedByTeamThisTurn; + private int numManaShards; private int numPowerSurgeLands; private int numLibrarySearchedOwn; //The number of times this player has searched his library private int numDrawnThisTurn; @@ -662,17 +652,17 @@ public class Player extends GameEntity implements Comparable { } public final boolean canPayShards(final int shardPayment) { - int cnt = getCounters(CounterEnumType.MANASHARDS); + int cnt = getNumManaShards(); return cnt >= shardPayment; } public final int loseShards(int lostShards) { - int cnt = getCounters(CounterEnumType.MANASHARDS); + int cnt = getNumManaShards(); if (lostShards > cnt) { return -1; } cnt -= lostShards; - this.setCounters(CounterEnumType.MANASHARDS, cnt, true); + this.setNumManaShards(cnt); return cnt; } @@ -2299,6 +2289,16 @@ public class Player extends GameEntity implements Comparable { lifeLostLastTurn = n; } + public final int getNumManaShards() { + return numManaShards; + } + public final void setNumManaShards(final int n) { + int old = numManaShards; + numManaShards = n; + view.updateNumManaShards(this); + game.fireEvent(new GameEventPlayerShardsChanged(this, old, numManaShards)); + } + @Override public int compareTo(Player o) { if (o == null) { diff --git a/forge-game/src/main/java/forge/game/player/PlayerView.java b/forge-game/src/main/java/forge/game/player/PlayerView.java index f812e577c04..93dd02159b7 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerView.java +++ b/forge-game/src/main/java/forge/game/player/PlayerView.java @@ -294,6 +294,13 @@ public class PlayerView extends GameEntityView { set(TrackableProperty.NumLandThisTurn, p.getLandsPlayedThisTurn()); } + public int getNumManaShards() { + return get(TrackableProperty.NumManaShards); + } + void updateNumManaShards(Player p) { + set(TrackableProperty.NumManaShards, p.getNumManaShards()); + } + public int getNumDrawnThisTurn() { return get(TrackableProperty.NumDrawnThisTurn); } diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index 96d9b42fa00..3e89a4dcd06 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -191,6 +191,7 @@ public enum TrackableProperty { MaxLandPlay(TrackableTypes.IntegerType), HasUnlimitedLandPlay(TrackableTypes.BooleanType), NumLandThisTurn(TrackableTypes.IntegerType), + NumManaShards(TrackableTypes.IntegerType), NumDrawnThisTurn(TrackableTypes.IntegerType), AdditionalVote(TrackableTypes.IntegerType), OptionalAdditionalVote(TrackableTypes.IntegerType), diff --git a/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java index 936e35e565d..380038140ab 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java @@ -23,7 +23,6 @@ import forge.deck.Deck; import forge.deck.DeckProxy; import forge.game.GameRules; import forge.game.GameType; -import forge.game.card.CounterEnumType; import forge.game.player.Player; import forge.game.player.RegisteredPlayer; import forge.gamemodes.match.HostedMatch; @@ -96,7 +95,7 @@ public class DuelScene extends ForgeScene { //TODO: Progress towards applicable Adventure quests also needs to be reported here. List humans = hostedMatch.getHumanControllers(); if (humans.size() == 1) { - Current.player().setShards(humans.get(0).getPlayer().getCounters(CounterEnumType.MANASHARDS)); + Current.player().setShards(humans.get(0).getPlayer().getNumManaShards()); } } catch (Exception e) { e.printStackTrace(); diff --git a/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java b/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java index b07a87251c6..63378ec9596 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java @@ -468,7 +468,7 @@ public class VPlayerPanel extends FContainer { private int energyCounters = player.getCounters(CounterEnumType.ENERGY); private int experienceCounters = player.getCounters(CounterEnumType.EXPERIENCE); private int ticketCounters = player.getCounters(CounterEnumType.TICKET); - private int manaShards = player.getCounters(CounterEnumType.MANASHARDS); + private int manaShards = player.getNumManaShards(); private String lifeStr = String.valueOf(life); private LifeLabel() { @@ -497,7 +497,7 @@ public class VPlayerPanel extends FContainer { energyCounters = player.getCounters(CounterEnumType.ENERGY); experienceCounters = player.getCounters(CounterEnumType.EXPERIENCE); - manaShards = player.getCounters(CounterEnumType.MANASHARDS); + manaShards = player.getNumManaShards(); //when gui player loses life, vibrate device for a length of time based on amount of life lost if (vibrateDuration > 0 && MatchController.instance.isLocalPlayer(player) && diff --git a/forge-gui/src/main/java/forge/gui/control/FControlGameEventHandler.java b/forge-gui/src/main/java/forge/gui/control/FControlGameEventHandler.java index d6ac9125cb5..341c1a94119 100644 --- a/forge-gui/src/main/java/forge/gui/control/FControlGameEventHandler.java +++ b/forge-gui/src/main/java/forge/gui/control/FControlGameEventHandler.java @@ -483,6 +483,11 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { return processPlayer(event.player, livesUpdate); } + @Override + public Void visit(final GameEventPlayerShardsChanged event) { + return processPlayer(event.player, livesUpdate); + } + @Override public Void visit(GameEventManaBurn event) { return processPlayer(event.player, livesUpdate); diff --git a/forge-gui/src/main/java/forge/player/HumanCostDecision.java b/forge-gui/src/main/java/forge/player/HumanCostDecision.java index 69f0dcaf8b8..4d44841ba6c 100644 --- a/forge-gui/src/main/java/forge/player/HumanCostDecision.java +++ b/forge-gui/src/main/java/forge/player/HumanCostDecision.java @@ -594,7 +594,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { Integer c = cost.getAbilityAmount(ability); if (player.canPayShards(c) && - confirmAction(cost, Localizer.getInstance().getMessage("lblPayShardsConfirm", cost.toString(), String.valueOf(player.getCounters(CounterEnumType.MANASHARDS)), "{M} (Mana Shards)"))) { + confirmAction(cost, Localizer.getInstance().getMessage("lblPayShardsConfirm", cost.toString(), String.valueOf(player.getNumManaShards()), "{M} (Mana Shards)"))) { return PaymentDecision.number(c); } return null; diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index 8adf2994cb7..15d81f2c81a 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -457,10 +457,9 @@ public class HumanPlay { } else if (part instanceof CostPayShards) { - CounterType counterType = CounterType.get(CounterEnumType.MANASHARDS); int amount = part.getAbilityAmount(sourceAbility); - if (!mandatory && !p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantSpendNTargetTypeCounter", String.valueOf(amount), counterType.getName()), sourceAbility)) { + if (!mandatory && !p.getController().confirmPayment(part, Localizer.getInstance().getMessage("lblDoYouWantPay") + " " + amount + " {M}?", sourceAbility)) { return false; }