Class GameServerSide

java.lang.Object
net.sf.colossus.game.Game
net.sf.colossus.server.GameServerSide
Direct Known Subclasses:
GameServerSideTestAccess

public class GameServerSide extends Game
Class Game gets and holds high-level data about a Titan game. This is the old design with the game information in the server. Some of the functionality here is supposed to be moved into the Game class which then can be shared between server and clients (the class, not the instances). Other parts should be moved into the Server class or elsewhere.
Author:
David Ripton, Bruce Sherrod, Romain Dolbeau
  • Field Details

    • LOGGER

      private static final Logger LOGGER
    • activePlayerNum

      private int activePlayerNum
    • lastRecruitTurnNumber

      private int lastRecruitTurnNumber
    • battleInProgress

      private boolean battleInProgress
    • summoning

      private boolean summoning
    • reinforcing

      private boolean reinforcing
    • acquiring

      private boolean acquiring
    • pointsScored

      private int pointsScored
    • turnCombatFinished

      private int turnCombatFinished
    • winner

      private Legion winner
    • engagementResult

      private String engagementResult
    • pendingAdvancePhase

      private boolean pendingAdvancePhase
    • loadingGame

      private boolean loadingGame
    • replayOngoing

      private boolean replayOngoing
    • server

      private Server server
    • attackerProposals

      private final Set<Proposal> attackerProposals
    • defenderProposals

      private final Set<Proposal> defenderProposals
    • colorPickOrder

      private final LinkedList<Player> colorPickOrder
    • colorsLeft

      private List<PlayerColor> colorsLeft
    • phaseAdvancer

      private final PhaseAdvancer phaseAdvancer
    • options

      private final Options options
    • hostingPlayerName

      private String hostingPlayerName
    • flagFilename

      private String flagFilename
    • notifyWebServer

      private INotifyWebServer notifyWebServer
    • startingWebClient

      private WebClient startingWebClient
    • whatNextManager

      private final WhatNextManager whatNextManager
    • history

      private History history
    • battleStrikeSS

      private final BattleStrikeServerSide battleStrikeSS
    • movementSS

      private final MovementServerSide movementSS
    • gameSaver

      private final GameSaving gameSaver
      The object that handles the Game Saving procedure
    • isFirstAutoSave

      private boolean isFirstAutoSave
      From the very first autosave file name, we derive the file where to store all the messages that are sent to the internal spectator client.
    • iscMessages

      private PrintWriter iscMessages
      The file where to send the spectator messages. Might/will be null when autosave disabled.
    • gameCounter

      private static int gameCounter
    • gameId

      private final String gameId
    • hotSeatMode

      private boolean hotSeatMode
    • cvbPlayer

      private Player cvbPlayer
    • waitForClientsMutex

      Object waitForClientsMutex
    • serverGotAll

      boolean serverGotAll
  • Constructor Details

    • GameServerSide

      public GameServerSide(WhatNextManager whatNextMgr, Options serverOptions, Variant variant)
      The normal constructor to be used everywhere
      Parameters:
      whatNextMgr - A WhatNextManager object which manages the main control flow which thing to do 'next' when this game is over.
      serverOptions - The server side options, initialized from the GetPlayers dialog and/or command line options.
      variant - Variant of this game
  • Method Details

    • makeNewGameServerSide

      static GameServerSide makeNewGameServerSide(Variant variant)
      Shortcut for UnitTests, to create a Game with dummy input objects on the fly.
    • newGameServerSide

      public static GameServerSide newGameServerSide(WhatNextManager whatNextMgr, Options serverOptions, Variant variant)
      For more complicated functional tests
      Parameters:
      whatNextMgr -
      serverOptions -
      variant -
      Returns:
    • setFlagFilename

      public void setFlagFilename(String flagFilename)
    • getHostingPlayer

      public String getHostingPlayer()
    • getPort

      private int getPort()
    • initServer

      private void initServer()
    • actOnWaitForClientsCompleted

      public void actOnWaitForClientsCompleted(boolean gotAll)
    • startServerAndWaitUntilNotifiedThatWaitForClientsCompleted

      private boolean startServerAndWaitUntilNotifiedThatWaitForClientsCompleted()
    • createLocalClients

      public void createLocalClients()
    • createLocalClient

      private void createLocalClient(PlayerServerSide player, boolean createGUI, String type)
    • createInternalDummyClient

      private void createInternalDummyClient()
    • storeLocalClient

      protected void storeLocalClient(String playerName, Client c)
    • updateCaretakerDisplaysFor

      private void updateCaretakerDisplaysFor(CreatureType type)
      Update the dead and available counts for a creature type on all clients.
    • updateCaretakerDisplays

      public void updateCaretakerDisplays()
      Update the dead and available counts for all creature types on all clients.
    • waitUntilGameFinishes

      protected void waitUntilGameFinishes()
    • cleanupWhenGameOver

      private void cleanupWhenGameOver()
    • clearFlags

      private void clearFlags()
    • addPlayersFromOptions

      private void addPlayersFromOptions()
    • startNewGameAndWaitUntilOver

      public boolean startNewGameAndWaitUntilOver(String hostingPlayer)
    • newGame

      boolean newGame(String hostingPlayer)
      Start a new game.
    • newGame2

      void newGame2()
    • sortPlayersDescendingTower

      private void sortPlayersDescendingTower()
      Temporary solution ... I do not know a better way how to do the sorting on players (type List) itself. I don't want to pull up the Comparator predicate, because ClientSide might have totally different idea of the right "order"...
    • nameIsTaken

      private boolean nameIsTaken(String name, Player checkedPlayer)
    • getUniqueName

      String getUniqueName(String name, Player player)
      If the name is taken, add random digits to the end.
    • findNetworkPlayer

      Player findNetworkPlayer(String playerName)
      Find a Player for a new remote client. If loading a game, this is the network player with a matching player name. If a new game, it's the first network player whose name is still set to
    • syncOptions

      private void syncOptions()
      Send all current game option values to all clients.
    • assignColors

      private void assignColors()
    • nextPickColor

      void nextPickColor()
    • makeNameByType

      private String makeNameByType(String templateName, String type)
    • assignColor

      void assignColor(Player player, PlayerColor color)
    • getNextColorPicker

      Player getNextColorPicker()
    • newGame3

      private void newGame3()
      Done picking player colors; proceed to start game.
    • assignTowers

      private void assignTowers()
      Randomize towers by rolling dice and rerolling ties.
    • getBalancedTowers

      static List<MasterHex> getBalancedTowers(int numPlayers, List<MasterHex> towerList)
      Return a list with a balanced order of numPlayer towers chosen from towerList, which must hold numeric strings.
    • getServer

      Server getServer()
    • createAndAddPlayer

      PlayerServerSide createAndAddPlayer(String name, String shortTypeName)
    • getActivePlayerNum

      int getActivePlayerNum()
    • getActivePlayer

      Player getActivePlayer()
    • makeMovementRoll

      private void makeMovementRoll()
    • getMovementRoll

      public int getMovementRoll()
      Overrides:
      getMovementRoll in class Game
    • getPlayerByNameIgnoreNull

      Player getPlayerByNameIgnoreNull(String playerName)
      Resolve playerName into Player object. Name might be null, then returns null.
      Parameters:
      playerName -
      Returns:
      The player object for given player name, null if name was null
    • getPlayerByName

      Player getPlayerByName(String playerName)
      Resolve playerName into Player object. Name must not be null. If no player for given name found, it would throw IllegalArgumentException (well, did earlier, at the moment (03/2012) replace with SEVERE error; exception would totally throw server thread out of the orbit...)
      Parameters:
      playerName -
      Returns:
      Player object for given name.
    • getPlayerByShortColor

      Player getPlayerByShortColor(String shortColor)
      NOTE: to be used only during loading a Game! Client side has a more sophisticated version that takes slain players and their inherited markers into account.
    • handlePlayerWithdrawal

      void handlePlayerWithdrawal(Player player)
      A player requested he wants to withdraw (or connection was lost, and server socket handling does withdraw then).
      Parameters:
      player - The player that wishes to withdraw from the game TODO Notify all players.
    • getWinner

      private Player getWinner()
    • checkForVictory

      void checkForVictory()
    • announceGameOver

      private void announceGameOver(boolean disposeFollows)
    • isLoadingGame

      boolean isLoadingGame()
    • isReplayOngoing

      boolean isReplayOngoing()
    • stopAllDueToFunctionalTestCompleted

      public void stopAllDueToFunctionalTestCompleted()
    • kickstartGame

      public void kickstartGame()
    • notifyTestCaseGameIsUpNow

      protected void notifyTestCaseGameIsUpNow()
    • advancePhase

      void advancePhase(Phase oldPhase, Player player)
      Advance to the next phase, only if the passed oldPhase and playerName are current.
    • setGameOver

      public void setGameOver(boolean gameOver, String message)
      Overrides:
      setGameOver in class Game
    • setupPhase

      private void setupPhase()
    • setupSplit

      private void setupSplit()
    • hotSeatModeChangeBoards

      private void hotSeatModeChangeBoards()
    • setupMove

      private void setupMove()
    • setupFight

      private void setupFight()
    • setupMuster

      private void setupMuster()
    • isAutoSavePoint

      private boolean isAutoSavePoint()
      So far, we do autosave only at begin of each players turn, i.e. when a split phase was just set up.
      Returns:
      Whether now is a time when autosave is due.
    • autoSave

      void autoSave()
    • getIscMessageFile

      public PrintWriter getIscMessageFile()
    • saveGameWithErrorHandling

      void saveGameWithErrorHandling(String filename, boolean autoSave)
    • loadGameAndWaitUntilOver

      public boolean loadGameAndWaitUntilOver(org.jdom.Element root)
    • loadGame

      public boolean loadGame(org.jdom.Element root)
    • createBattle

      public void createBattle(Legion attacker, Legion defender, BattleServerSide.LegionTags activeLegionTag, MasterHex engagementHex, BattlePhase battlePhase)
    • readLegion

      private void readLegion(org.jdom.Element leg, PlayerServerSide player) throws org.jdom.DataConversionException
      Throws:
      org.jdom.DataConversionException
    • loadGame2

      boolean loadGame2()
    • resyncBackupData

      private boolean resyncBackupData()
    • findEligibleRecruits

      List<CreatureType> findEligibleRecruits(Legion legion, MasterHex hex)
      Return a list of eligible recruits, as Creatures. TODO second parameter is probably superfluous
    • findEligibleRecruiters

      private List<CreatureType> findEligibleRecruiters(Legion legion, String recruitName)
      Return a list of eligible recruiter creatures.
    • anonymousRecruitLegal

      private boolean anonymousRecruitLegal(Legion legion, CreatureType recruit)
      Return true if this legion can recruit this recruit without disclosing a recruiter.
    • doRecruit

      void doRecruit(Legion legion, CreatureType recruit, CreatureType recruiter)
      Add recruit to legion.
    • editModeAddCreature

      public void editModeAddCreature(String markerId, String creatureName)
    • editModeRemoveCreature

      public void editModeRemoveCreature(String markerId, String creatureName)
    • editModeRelocateLegion

      public void editModeRelocateLegion(String markerId, String hexLabel)
    • acquireMaybe

      public void acquireMaybe(LegionServerSide legion, int scoreBeforeAdd, int pointsToAdd)
      If the legion can acquire (height < 7), find out which acquirable it might get for the pointsToAdd, and fire off the askAcquirable messages.
      Parameters:
      legion - Legion which earned the points and thus is entitled to get the acqirable
      scoreBeforeAdd - Score from which to start
      pointsToAdd - How many points were earned
    • dispose

      void dispose()
    • placeInitialLegion

      private void placeInitialLegion(PlayerServerSide player, String markerId)
    • hasConventionalMove

      public boolean hasConventionalMove(LegionServerSide legion, MasterHex hex, int roll, boolean ignoreFriends)
    • createSummonAngel

      void createSummonAngel(Legion attacker)
    • reinforce

      void reinforce(Legion legion)
      Called locally and from Battle.
    • doneReinforcing

      void doneReinforcing()
    • doSummon

      void doSummon(Summoning event)
      Handles summoning of a creature.
      Parameters:
      event - The summoning event (or null if summoning is to be skipped) TODO get rid of downcasts
    • getBattleSS

      BattleServerSide getBattleSS()
    • isBattleInProgress

      boolean isBattleInProgress()
    • getHistory

      History getHistory()
    • finishBattle

      void finishBattle(MasterHex masterHex, boolean attackerEntered, int points, int turnDone)
    • doSplit

      boolean doSplit(Legion parent, String childId, List<CreatureType> creaturesToSplit)
      Return true and call Server.didSplit() if the split succeeded. Return false if it failed.
    • doMove

      String doMove(Legion legion, MasterHex hex, EntrySide entrySide, boolean teleport, CreatureType teleportingLord)
      Move the legion to the hex if legal. Return a string telling the reason why it is illegal, or null if ok and move was done.
    • undoMove

      void undoMove(Legion legion)
    • engage

      void engage(MasterHex hex)
    • engage2

      private void engage2(MasterHex hex)
    • engage3

      private void engage3(MasterHex hex)
    • flee

      void flee(Legion legion)
    • concede

      void concede(Legion attacker)
    • doNotFlee

      void doNotFlee(Legion legion)
    • doNotConcede

      void doNotConcede(Legion legion)
      Used only for pre-battle attacker concession.
    • makeProposal

      void makeProposal(String playerName, String proposalString)
      playerName offers proposal.
    • fight

      void fight(MasterHex hex)
    • handleConcession

      private void handleConcession(Legion loser, Legion winner, boolean fled)
    • handleNegotiation

      private void handleNegotiation(Proposal results)
    • askAcquireAngel

      void askAcquireAngel(PlayerServerSide player, Legion legion, List<CreatureType> recruits)
    • doneAcquiringAngels

      void doneAcquiringAngels()
    • setEngagementResult

      private void setEngagementResult(String aResult, Legion winner, int aPoints, int aTurn)
    • checkEngagementDone

      private void checkEngagementDone()
    • gameShouldContinue

      public boolean gameShouldContinue()
    • getLegionByMarkerId

      public LegionServerSide getLegionByMarkerId(String markerId)
      Overrides:
      getLegionByMarkerId in class Game
    • getPlayerByMarkerId

      public Player getPlayerByMarkerId(String markerId)
    • getPlayerUsingColor

      private Player getPlayerUsingColor(String shortColor)
    • getStartingLegion

      private LegionServerSide getStartingLegion(String markerId, MasterHex hex, Player player)
    • mulligan

      int mulligan()
    • getOptions

      IOptions getOptions()
    • getOption

      boolean getOption(String optname)
    • getIntOption

      int getIntOption(String optname)
    • addCreatureEvent

      void addCreatureEvent(AddCreatureAction event, String reason)
    • removeCreatureEvent

      void removeCreatureEvent(Legion legion, CreatureType creature, String reason)
    • splitEvent

      void splitEvent(Legion parent, Legion child, List<CreatureType> splitoffs)
    • mergeEvent

      void mergeEvent(String splitoffId, String survivorId)
    • revealEvent

      void revealEvent(boolean allPlayers, List<Player> players, Legion legion, List<CreatureType> creatureNames, String reason)
    • playerElimEvent

      void playerElimEvent(Player player, Player slayer)
    • movementRollEvent

      void movementRollEvent(Player player, int roll)
    • legionMoveEvent

      void legionMoveEvent(Legion legion, MasterHex newHex, EntrySide entrySide, boolean teleport, CreatureType lord)
    • legionUndoMoveEvent

      void legionUndoMoveEvent(Legion legion)
    • recruitEvent

      void recruitEvent(Legion legion, CreatureType recruit, CreatureType recruiter)
    • undoRecruitEvent

      void undoRecruitEvent(Legion legion)
    • getNotifyWebServer

      INotifyWebServer getNotifyWebServer()
    • getBattleStrikeSS

      public BattleStrikeServerSide getBattleStrikeSS()