From 3a76d33635ec37c27efab4a7907e767115ce6073 Mon Sep 17 00:00:00 2001 From: "marcin.sciesinski" Date: Wed, 17 Mar 2021 05:04:03 -0700 Subject: [PATCH] Cleaned up the GameState sending warnings, but also fixed tests double-modifiers issue --- .../java/com/gempukku/lotro/common/Phase.java | 28 ++++++---- .../communication/GameStateListener.java | 2 + .../lotro/communication/UserFeedback.java | 2 - .../game/state/GameCommunicationChannel.java | 6 ++ .../gempukku/lotro/game/state/GameState.java | 7 ++- .../lotro/game/DefaultUserFeedback.java | 14 ----- .../lotro/game/LotroGameMediator.java | 9 +-- .../lotro/at/IndividualCardAtTest.java | 55 +++++++++++++++++++ 8 files changed, 88 insertions(+), 35 deletions(-) diff --git a/gemp-lotr/gemp-lotr-common/src/main/java/com/gempukku/lotro/common/Phase.java b/gemp-lotr/gemp-lotr-common/src/main/java/com/gempukku/lotro/common/Phase.java index 70b85d9be..2d0bf0a01 100644 --- a/gemp-lotr/gemp-lotr-common/src/main/java/com/gempukku/lotro/common/Phase.java +++ b/gemp-lotr/gemp-lotr-common/src/main/java/com/gempukku/lotro/common/Phase.java @@ -1,23 +1,25 @@ package com.gempukku.lotro.common; public enum Phase { - PUT_RING_BEARER("Put Ring-bearer", false), - PLAY_STARTING_FELLOWSHIP("Play starting fellowship", false), - FELLOWSHIP("Fellowship", true), - SHADOW("Shadow", true), - MANEUVER("Maneuver", true), - ARCHERY("Archery", true), - ASSIGNMENT("Assignment", true), - SKIRMISH("Skirmish", true), - REGROUP("Regroup", true), - BETWEEN_TURNS("Between turns", false); + PUT_RING_BEARER("Put Ring-bearer", false, false), + PLAY_STARTING_FELLOWSHIP("Play starting fellowship", false, true), + FELLOWSHIP("Fellowship", true, true), + SHADOW("Shadow", true, true), + MANEUVER("Maneuver", true, true), + ARCHERY("Archery", true, true), + ASSIGNMENT("Assignment", true, true), + SKIRMISH("Skirmish", true, true), + REGROUP("Regroup", true, true), + BETWEEN_TURNS("Between turns", false, false); private String humanReadable; private boolean realPhase; + private boolean cardsAffectGame; - private Phase(String humanReadable, boolean realPhase) { + Phase(String humanReadable, boolean realPhase, boolean cardsAffectGame) { this.humanReadable = humanReadable; this.realPhase = realPhase; + this.cardsAffectGame = cardsAffectGame; } public String getHumanReadable() { @@ -27,4 +29,8 @@ public enum Phase { public boolean isRealPhase() { return realPhase; } + + public boolean isCardsAffectGame() { + return cardsAffectGame; + } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/communication/GameStateListener.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/communication/GameStateListener.java index 8deb52e2e..f1ff85400 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/communication/GameStateListener.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/communication/GameStateListener.java @@ -55,4 +55,6 @@ public interface GameStateListener { public void cardActivated(String playerPerforming, PhysicalCard card); public void decisionRequired(String playerId, AwaitingDecision awaitingDecision); + + public void sendWarning(String playerId, String warning); } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/communication/UserFeedback.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/communication/UserFeedback.java index e3352627a..aeb7649b0 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/communication/UserFeedback.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/communication/UserFeedback.java @@ -5,7 +5,5 @@ import com.gempukku.lotro.logic.decisions.AwaitingDecision; public interface UserFeedback { public void sendAwaitingDecision(String playerId, AwaitingDecision awaitingDecision); - public void sendWarning(String playerId, String warning); - public boolean hasPendingDecisions(); } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameCommunicationChannel.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameCommunicationChannel.java index a638b7fac..8ff6d70cd 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameCommunicationChannel.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameCommunicationChannel.java @@ -187,6 +187,12 @@ public class GameCommunicationChannel implements GameStateListener, LongPollable appendEvent(new GameEvent(DECISION).awaitingDecision(decision).participantId(playerId)); } + @Override + public void sendWarning(String playerId, String warning) { + if (playerId.equals(_self)) + appendEvent(new GameEvent(SEND_WARNING).message(warning)); + } + public List consumeGameEvents() { updateLastAccess(); List result = _events; diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameState.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameState.java index 9cd572e85..73524bf05 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameState.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/GameState.java @@ -489,7 +489,7 @@ public class GameState { listener.cardCreated(card); } - if (_currentPhase != Phase.PUT_RING_BEARER) { + if (_currentPhase.isCardsAffectGame()) { if (zone.isInPlay()) if (card.getBlueprint().getCardType() != CardType.SITE || (getCurrentPhase() != Phase.PLAY_STARTING_FELLOWSHIP && getCurrentSite() == card)) startAffecting(game, card); @@ -1041,4 +1041,9 @@ public class GameState { for (GameStateListener listener : getAllGameStateListeners()) listener.sendGameStats(gameStats); } + + public void sendWarning(String player, String warning) { + for (GameStateListener listener : getAllGameStateListeners()) + listener.sendWarning(player, warning); + } } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/DefaultUserFeedback.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/DefaultUserFeedback.java index c4740869a..509f4ae8e 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/DefaultUserFeedback.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/DefaultUserFeedback.java @@ -10,7 +10,6 @@ import java.util.Set; public class DefaultUserFeedback implements UserFeedback { private Map _awaitingDecisionMap = new HashMap(); - private Map _warnings = new HashMap(); private LotroGame _game; @@ -33,24 +32,11 @@ public class DefaultUserFeedback implements UserFeedback { _game.getGameState().playerDecisionStarted(playerId, awaitingDecision); } - @Override - public void sendWarning(String playerId, String warning) { - _warnings.put(playerId, warning); - } - @Override public boolean hasPendingDecisions() { return _awaitingDecisionMap.size() > 0; } - public String consumeWarning(String playerId) { - return _warnings.remove(playerId); - } - - public boolean hasWarning(String playerId) { - return _warnings.containsKey(playerId); - } - public Set getUsersPendingDecision() { return _awaitingDecisionMap.keySet(); } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/LotroGameMediator.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/LotroGameMediator.java index ee87bfd9a..3a82427a1 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/LotroGameMediator.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/game/LotroGameMediator.java @@ -301,8 +301,7 @@ public class LotroGameMediator { } public void cancel(Player player) { - if (!_cancellable) - _userFeedback.sendWarning(player.getName(), "You can't cancel this game"); + _lotroGame.getGameState().sendWarning(player.getName(), "You can't cancel this game"); String playerId = player.getName(); _writeLock.lock(); @@ -336,7 +335,7 @@ public class LotroGameMediator { } catch (DecisionResultInvalidException decisionResultInvalidException) { // Participant provided wrong answer - send a warning message, and ask again for the same decision - _userFeedback.sendWarning(playerName, decisionResultInvalidException.getWarningMessage()); + _lotroGame.getGameState().sendWarning(playerName, decisionResultInvalidException.getWarningMessage()); _userFeedback.sendAwaitingDecision(playerName, awaitingDecision); } catch (RuntimeException runtimeException) { LOG.error("Error processing game decision", runtimeException); @@ -384,10 +383,6 @@ public class LotroGameMediator { for (GameEvent gameEvent : communicationChannel.consumeGameEvents()) visitor.visitGameEvent(gameEvent); - String warning = _userFeedback.consumeWarning(playerName); - if (warning != null) - visitor.visitGameEvent(new GameEvent(GameEvent.Type.SEND_WARNING).message(warning)); - Map secondsLeft = new HashMap(); for (Map.Entry playerClock : _playerClocks.entrySet()) { String playerClockName = playerClock.getKey(); diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/IndividualCardAtTest.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/IndividualCardAtTest.java index 4a5c888a8..728656315 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/IndividualCardAtTest.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/at/IndividualCardAtTest.java @@ -1410,4 +1410,59 @@ public class IndividualCardAtTest extends AbstractAtTest { System.out.println(); } + + @Test + public void FarinStrengthBoostWhileSkirmishingOrc() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + initializeSimplestGame(); + + // Farin, Dwarven Emissary; 5 strength, "while skirmishing an Orc, Farin is strength +2" + final PhysicalCardImpl farin = createCard(P1, "1_11"); + _game.getGameState().addCardToZone(_game, farin, Zone.FREE_CHARACTERS); + + //Orc Scouting Band, 8 strength + final PhysicalCardImpl orc = createCard(P2, "1_270"); + _game.getGameState().addCardToZone(_game, orc, Zone.SHADOW_CHARACTERS); + + skipMulligans(); + + _game.getGameState().setTwilight(10); + + playerDecided(P1, ""); + + // Pass in shadow + playerDecided(P2, ""); + + //Pass in maneuver + playerDecided(P1, ""); + playerDecided(P2, ""); + + //Pass in archery + playerDecided(P1, ""); + playerDecided(P2, ""); + + //Pass in assignment + playerDecided(P1, ""); + playerDecided(P2, ""); + + // assign Farin to an Orc + playerDecided(P1, farin.getCardId() + " " + orc.getCardId()); + + //Farin's strength is still the base of 5 + assertEquals(5, _game.getModifiersQuerying().getStrength(_game, farin)); + + //Choose to resolve Farin's skirmish + playerDecided(P1, "" + farin.getCardId()); + + //This test fails. Farin has two instances of the ModifyStrength modifier applied for some reason, + // which puts him at 9 strength instead of the expected 7. + assertEquals(5 + 2, _game.getModifiersQuerying().getStrength(_game, farin)); + + playerDecided(P1, ""); + playerDecided(P2, ""); + + // If the above test is commented out, then Farin wins the skirmish and applies skirmish wounds to the Orc + assertEquals(1, _game.getGameState().getWounds(farin)); + assertEquals(0, _game.getGameState().getWounds(orc)); + } }