From b859c764d07cdfd5e11a553dff4b8aefea47f786 Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Thu, 1 Sep 2011 13:29:59 +0000 Subject: [PATCH] Win/lose conditions --- .../gempukku/lotro/cards/AbstractAlly.java | 5 ++ .../lotro/cards/AbstractCompanion.java | 5 ++ .../cards/AbstractLotroCardBlueprint.java | 5 ++ .../lotro/game/LotroCardBlueprint.java | 2 + .../gempukku/lotro/game/state/GameState.java | 21 +++++++ .../gempukku/lotro/game/state/LotroGame.java | 4 ++ .../lotro/logic/timing/DefaultLotroGame.java | 29 ++++++++-- .../logic/timing/GameResultListener.java | 7 +++ .../gempukku/lotro/logic/timing/RuleSet.java | 2 + .../lotro/logic/timing/TurnProcedure.java | 2 +- .../timing/rules/LoseConditionsRule.java | 57 +++++++++++++++++++ .../logic/timing/rules/WinConditionRule.java | 47 +++++++++++++++ .../com/gempukku/lotro/LotroGameMediator.java | 2 +- 13 files changed, 181 insertions(+), 7 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/GameResultListener.java create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/LoseConditionsRule.java create mode 100644 gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/WinConditionRule.java diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractAlly.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractAlly.java index d8416edb8..6c3a1c35f 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractAlly.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractAlly.java @@ -73,4 +73,9 @@ public class AbstractAlly extends AbstractLotroCardBlueprint { public int getVitality() { return _vitality; } + + @Override + public int getResistance() { + return 0; + } } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractCompanion.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractCompanion.java index 835502638..ae5a4831d 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractCompanion.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractCompanion.java @@ -83,4 +83,9 @@ public abstract class AbstractCompanion extends AbstractLotroCardBlueprint { public final int getVitality() { return _vitality; } + + @Override + public int getResistance() { + return 6; + } } diff --git a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractLotroCardBlueprint.java b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractLotroCardBlueprint.java index 11c89cff4..0282b1074 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractLotroCardBlueprint.java +++ b/gemp-lotr/gemp-lotr-cards/src/main/java/com/gempukku/lotro/cards/AbstractLotroCardBlueprint.java @@ -96,6 +96,11 @@ public abstract class AbstractLotroCardBlueprint implements LotroCardBlueprint { throw new UnsupportedOperationException("This method should not be called on this card"); } + @Override + public int getResistance() { + throw new UnsupportedOperationException("This method should not be called on this card"); + } + @Override public int getSiteNumber() { throw new UnsupportedOperationException("This method should not be called on this card"); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroCardBlueprint.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroCardBlueprint.java index 53495c809..94e2565f4 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroCardBlueprint.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/LotroCardBlueprint.java @@ -32,6 +32,8 @@ public interface LotroCardBlueprint { public int getVitality(); + public int getResistance(); + public Modifier getAlwaysOnEffect(PhysicalCard self); public List getRequiredIsAboutToActions(LotroGame lotroGame, Effect effect, EffectResult effectResult, PhysicalCard self); 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 8496fa6fe..8ee272ce5 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 @@ -37,6 +37,9 @@ public class GameState { private Map _gameStateListeners = new HashMap(); + private String _winnerPlayerId; + private Set _losers = new HashSet(); + private int _nextCardId = 0; private int nextCardId() { @@ -58,6 +61,24 @@ public class GameState { } } + public void setWinnerPlayerId(String winnerPlayerId) { + _winnerPlayerId = winnerPlayerId; + } + + public String setLoserPlayerId(String loserPlayerId) { + _losers.add(loserPlayerId); + if (_losers.size() + 1 == _playerOrder.getAllPlayers().size()) { + List allPlayers = new LinkedList(_playerOrder.getAllPlayers()); + allPlayers.removeAll(_losers); + return allPlayers.get(0); + } + return null; + } + + public String getWinnerPlayerId() { + return _winnerPlayerId; + } + private void addPlayerCards(String playerId, List cards, LotroCardBlueprintLibrary library) { for (String blueprintId : cards) { LotroCardBlueprint card = library.getLotroCardBlueprint(blueprintId); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/LotroGame.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/LotroGame.java index 53a116374..285ce65a0 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/LotroGame.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/game/state/LotroGame.java @@ -15,4 +15,8 @@ public interface LotroGame { public ActionsEnvironment getActionsEnvironment(); public UserFeedback getUserFeedback(); + + public void playerWon(String currentPlayerId); + + public void playerLost(String currentPlayerId); } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/DefaultLotroGame.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/DefaultLotroGame.java index 43057e9d6..58d25fc0a 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/DefaultLotroGame.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/DefaultLotroGame.java @@ -13,10 +13,7 @@ import com.gempukku.lotro.logic.modifiers.ModifiersLogic; import com.gempukku.lotro.logic.modifiers.ModifiersQuerying; import com.gempukku.lotro.logic.vo.LotroDeck; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; +import java.util.*; public class DefaultLotroGame implements LotroGame { private GameState _gameState; @@ -27,8 +24,10 @@ public class DefaultLotroGame implements LotroGame { private ActionStack _actionStack; private Map _gameStateListeners = new HashMap(); + private GameResultListener _gameResultListener; - public DefaultLotroGame(Map decks, UserFeedback userFeedback, final LotroCardBlueprintLibrary library) { + public DefaultLotroGame(Map decks, UserFeedback userFeedback, GameResultListener gameResultListener, final LotroCardBlueprintLibrary library) { + _gameResultListener = gameResultListener; _actionStack = new ActionStack(); _actionsEnvironment = new DefaultActionsEnvironment(this, decks.keySet(), _actionStack); @@ -72,6 +71,26 @@ public class DefaultLotroGame implements LotroGame { _turnProcedure.carryOutPendingActionsUntilDecisionNeeded(); } + @Override + public void playerWon(String currentPlayerId) { + _gameState.setWinnerPlayerId(currentPlayerId); + if (_gameResultListener != null) { + Set losers = new HashSet(_gameState.getPlayerOrder().getAllPlayers()); + losers.remove(currentPlayerId); + _gameResultListener.gameFinished(currentPlayerId, losers); + } + } + + @Override + public void playerLost(String currentPlayerId) { + String winner = _gameState.setLoserPlayerId(currentPlayerId); + if (winner != null && _gameResultListener != null) { + Set losers = new HashSet(_gameState.getPlayerOrder().getAllPlayers()); + losers.remove(winner); + _gameResultListener.gameFinished(winner, losers); + } + } + @Override public GameState getGameState() { return _gameState; diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/GameResultListener.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/GameResultListener.java new file mode 100644 index 000000000..a6154ee47 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/GameResultListener.java @@ -0,0 +1,7 @@ +package com.gempukku.lotro.logic.timing; + +import java.util.Set; + +public interface GameResultListener { + public void gameFinished(String winnerPlayerId, Set loserPlayerIds); +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/RuleSet.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/RuleSet.java index 5d848d4fb..f0748b39d 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/RuleSet.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/RuleSet.java @@ -26,5 +26,7 @@ public class RuleSet { new CharacterDeathRule(_actionsEnvironment).applyRule(); new SanctuaryRule(_actionsEnvironment).applyRule(); + + new WinConditionRule(_actionsEnvironment).applyRule(); } } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/TurnProcedure.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/TurnProcedure.java index f0d5b06a3..0fa95ac09 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/TurnProcedure.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/TurnProcedure.java @@ -36,7 +36,7 @@ public class TurnProcedure { } public void carryOutPendingActionsUntilDecisionNeeded() { - while (!_userFeedback.hasPendingDecisions()) { + while (!_userFeedback.hasPendingDecisions() && _game.getGameState().getWinnerPlayerId() == null) { if (_actionStack.isEmpty()) { if (_playedGameProcess) { _gameProcess = _gameProcess.getNextProcess(); diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/LoseConditionsRule.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/LoseConditionsRule.java new file mode 100644 index 000000000..b4fdb7745 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/LoseConditionsRule.java @@ -0,0 +1,57 @@ +package com.gempukku.lotro.logic.timing.rules; + +import com.gempukku.lotro.common.Keyword; +import com.gempukku.lotro.filters.Filters; +import com.gempukku.lotro.game.AbstractActionProxy; +import com.gempukku.lotro.game.PhysicalCard; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.game.state.actions.DefaultActionsEnvironment; +import com.gempukku.lotro.logic.actions.CostToEffectAction; +import com.gempukku.lotro.logic.timing.Action; +import com.gempukku.lotro.logic.timing.EffectResult; +import com.gempukku.lotro.logic.timing.UnrespondableEffect; + +import java.util.Collections; +import java.util.List; + +public class LoseConditionsRule { + private DefaultActionsEnvironment _actionsEnvironment; + + public LoseConditionsRule(DefaultActionsEnvironment actionsEnvironment) { + _actionsEnvironment = actionsEnvironment; + } + + public void applyRule() { + _actionsEnvironment.addAlwaysOnActionProxy( + new AbstractActionProxy() { + @Override + public List getRequiredWhenActions(LotroGame game, EffectResult effectResult) { + if (!Filters.canSpot(game.getGameState(), game.getModifiersQuerying(), Filters.keyword(Keyword.RING_BEARER))) { + CostToEffectAction action = new CostToEffectAction(null, null, "Losing the game due to Ring-Bearer being killed"); + action.addEffect( + new UnrespondableEffect() { + @Override + public void playEffect(LotroGame game) { + game.playerLost(game.getGameState().getCurrentPlayerId()); + } + }); + return Collections.singletonList(action); + } + PhysicalCard ringBearer = Filters.findFirstActive(game.getGameState(), game.getModifiersQuerying(), Filters.keyword(Keyword.RING_BEARER)); + int ringBearerResistance = ringBearer.getBlueprint().getResistance(); + if (game.getGameState().getBurdens(game.getGameState().getCurrentPlayerId()) >= ringBearerResistance) { + CostToEffectAction action = new CostToEffectAction(null, null, "Losing the game due to Ring-Bearer corruption"); + action.addEffect( + new UnrespondableEffect() { + @Override + public void playEffect(LotroGame game) { + game.playerLost(game.getGameState().getCurrentPlayerId()); + } + }); + return Collections.singletonList(action); + } + return null; + } + }); + } +} diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/WinConditionRule.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/WinConditionRule.java new file mode 100644 index 000000000..b36ce2ef1 --- /dev/null +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/rules/WinConditionRule.java @@ -0,0 +1,47 @@ +package com.gempukku.lotro.logic.timing.rules; + +import com.gempukku.lotro.common.Phase; +import com.gempukku.lotro.game.AbstractActionProxy; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.game.state.actions.DefaultActionsEnvironment; +import com.gempukku.lotro.logic.actions.CostToEffectAction; +import com.gempukku.lotro.logic.timing.Action; +import com.gempukku.lotro.logic.timing.Effect; +import com.gempukku.lotro.logic.timing.EffectResult; +import com.gempukku.lotro.logic.timing.UnrespondableEffect; + +import java.util.Collections; +import java.util.List; + +public class WinConditionRule { + private DefaultActionsEnvironment _actionsEnvironment; + + public WinConditionRule(DefaultActionsEnvironment actionsEnvironment) { + _actionsEnvironment = actionsEnvironment; + } + + public void applyRule() { + _actionsEnvironment.addAlwaysOnActionProxy( + new AbstractActionProxy() { + @Override + public List getRequiredIsAboutToActions(final LotroGame lotroGame, Effect effect, EffectResult effectResult) { + if (effectResult.getType() == EffectResult.Type.START_OF_PHASE + && lotroGame.getGameState().getCurrentPhase() == Phase.REGROUP + && lotroGame.getGameState().getCurrentSiteNumber() == 9) { + CostToEffectAction action = new CostToEffectAction(null, null, "Winning the game"); + action.addEffect( + new UnrespondableEffect() { + @Override + public void playEffect(LotroGame game) { + game.playerWon(lotroGame.getGameState().getCurrentPlayerId()); + } + }); + return Collections.singletonList(action); + } + + return null; + } + } + ); + } +} diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/LotroGameMediator.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/LotroGameMediator.java index 3f92e11fe..ba840a251 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/LotroGameMediator.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/LotroGameMediator.java @@ -33,7 +33,7 @@ public class LotroGameMediator { participantSet.add(participantId); decks.put(participantId, participant.getDeck()); } - _lotroGame = new DefaultLotroGame(decks, _userFeedback, library); + _lotroGame = new DefaultLotroGame(decks, _userFeedback, null, library); } public synchronized String produceCardInfo(String participantId, int cardId) {