private boolean InnerStartGame() {
      // crate all machine players
      int currentIndex = 0;
      for (int i = 0; i < computerizedPlayers; i++) {
        AutomaticPlayer newMachinePlayer = new AutomaticPlayer();
        while (isNameAlreadyExists("Machine Player " + currentIndex)) {
          currentIndex++;
        }
        newMachinePlayer.setName("Machine Player " + currentIndex);
        currentIndex++;
        players.add(newMachinePlayer);
      }
      // all players have joined. we need to start the game
      gameLogic = new MonopolyGameLogic(useAutomaticDiceRoll);
      // Create the event Handler & register to the events
      listener =
          new GameStateChangedEventListener() {

            @Override
            public void gameStateChanged(GameStateChangedEvent evt) {
              HandleState(evt);
            }
          };
      gameLogic
          .getStateManager()
          .registerToGameChangedEvent(GameStateChangedEventListener.class, listener);
      if (!gameLogic.initGame(players)) {
        return false;
      }
      try {
        if (!gameLogic.startGame(false)) {
          return false;
        }
      } catch (Exception ex) {
        return false;
      }

      return true;
    }
    /**
     * Write the new state to the console
     *
     * @param newState - the new state
     * @param message - the message triggered with the new state
     */
    private void HandleState(GameStateChangedEvent evt) {
      switch (evt.getNewState()) {
        case Starting:
          EventImpl startGameEvent =
              new EventImpl(gameName, events.size() + 1, ServerEvents.GameStart);
          events.add(startGameEvent);
          break;
        case GameOver:
          GameStateChangedToPlayerActionEvent finishEvent =
              (GameStateChangedToPlayerActionEvent) evt;
          EventImpl gameWinnerEvent =
              new EventImpl(
                  gameName,
                  events.size() + 1,
                  ServerEvents.GameWinner,
                  finishEvent.getPlayer().getName(),
                  finishEvent.getPlayer().getBoardPosition());
          EventImpl gameOverEvent =
              new EventImpl(gameName, events.size() + 2, ServerEvents.GameOver);
          events.add(gameWinnerEvent);
          events.add(gameOverEvent);
          gameLogic.getStateManager().unregisterFromGameChangedEvent(listener);
          gameManager.SignalGameEnded();
          break;
        case PlayerLost:
          GameStateChangedToPlayerActionEvent playerLostInnerEvent =
              (GameStateChangedToPlayerActionEvent) evt;
          EventImpl playerLostEvent =
              new EventImpl(
                  gameName,
                  events.size() + 1,
                  ServerEvents.PlayerLost,
                  playerLostInnerEvent.getPlayer().getName(),
                  playerLostInnerEvent.getPlayer().getBoardPosition());
          events.add(playerLostEvent);
          break;
        case PlayerResigned:
          GameStateChangedToPlayerActionEvent playerResignedInnerEvent =
              (GameStateChangedToPlayerActionEvent) evt;
          EventImpl playerResignedEvent =
              new EventImpl(
                  gameName,
                  events.size() + 1,
                  ServerEvents.PlayerResigned,
                  playerResignedInnerEvent.getPlayer().getName(),
                  playerResignedInnerEvent.getPlayer().getBoardPosition());
          events.add(playerResignedEvent);
          break;
        case PromptPlayerForRollingDice:
          GameStateChangedToPromptPlayerActionEvent waitingForRollEvent =
              (GameStateChangedToPromptPlayerActionEvent) evt;
          int rolleventid = events.size() + 1;
          EventImpl promptDiceEvent =
              new EventImpl(
                  gameName,
                  rolleventid,
                  ServerEvents.PromptPlayerToRollDice,
                  waitingForRollEvent.getPlayer().getName(),
                  waitingForRollEvent.getPlayer().getBoardPosition(),
                  DEFAULT_TIMEOUT);
          events.add(promptDiceEvent);
          UserPrompt.Init(
              waitingForRollEvent.GetEventHandler(), rolleventid, waitingForRollEvent.getPlayer());
          Timer rollDiceTimeoutTimer = new Timer();
          rollDiceTimeoutTimer.schedule(new UserPromptTimerTask(rolleventid), DEFAULT_TIMEOUT);
          break;
        case PlayerRolling:
          GameStateChangedToPlayerRollingEvent rollingEvent =
              (GameStateChangedToPlayerRollingEvent) evt;
          EventImpl diceEvent =
              new EventImpl(
                  gameName,
                  events.size() + 1,
                  ServerEvents.DiceRoll,
                  rollingEvent.getPlayer().getName(),
                  rollingEvent.getDiceThrowResult(),
                  rollingEvent.getPlayer().getBoardPosition());
          events.add(diceEvent);
          break;
        case PlayerMoving:
          GameStateChangedToPlayerMovingEvent movingInnerEvent =
              (GameStateChangedToPlayerMovingEvent) evt;
          // move the player on the board
          if (movingInnerEvent.getDestinationCell().getType().compareTo("Jail") == 0
              && movingInnerEvent.getPlayer().isInJail()) {
            EventImpl goToJailEvent =
                new EventImpl(
                    gameName,
                    events.size() + 1,
                    ServerEvents.GoToJail,
                    movingInnerEvent.getPlayer().getName(),
                    movingInnerEvent.getPlayer().getBoardPosition());
            events.add(goToJailEvent);
          }

          EventImpl movingEvent =
              new EventImpl(
                  gameName,
                  events.size() + 1,
                  ServerEvents.Move,
                  movingInnerEvent.getPlayer().getName(),
                  movingInnerEvent.getOriginCell(),
                  movingInnerEvent.getDestinationCell());

          events.add(movingEvent);
          break;
        case PlayerPassedStartSquare:
          GameStateChangedToPlayerActionEvent playerPassedStartInnerEvent =
              (GameStateChangedToPlayerActionEvent) evt;
          EventImpl playerPassedStartEvent =
              new EventImpl(
                  gameName,
                  events.size() + 1,
                  ServerEvents.PassedStartSquare,
                  playerPassedStartInnerEvent.getPlayer().getName(),
                  playerPassedStartInnerEvent.getPlayer().getBoardPosition(),
                  DEFAULT_TIMEOUT);
          events.add(playerPassedStartEvent);
          break;
        case PlayerLandedOnStartSquare:
          GameStateChangedToPlayerActionEvent playerLandedOnStartInnerEvent =
              (GameStateChangedToPlayerActionEvent) evt;
          EventImpl playerLandedOnStartEvent =
              new EventImpl(
                  gameName,
                  events.size() + 1,
                  ServerEvents.LandedOnStartSquare,
                  playerLandedOnStartInnerEvent.getPlayer().getName(),
                  playerLandedOnStartInnerEvent.getPlayer().getBoardPosition(),
                  DEFAULT_TIMEOUT);
          events.add(playerLandedOnStartEvent);
          break;
        case PlayerBuying:
          GameStateChangedToPlayerBuyingEvent buyingEvent =
              (GameStateChangedToPlayerBuyingEvent) evt;
          EventImpl assetBoughtEvent =
              new EventImpl(
                  gameName,
                  events.size() + 1,
                  ServerEvents.AssetBought,
                  buyingEvent.getPlayer().getName(),
                  buyingEvent.getCell().getID());
          events.add(assetBoughtEvent);
          break;
        case PromptPlayerForBuying:
          GameStateChangedToPromptPlayerBuyingEvent promptBuyingInnerEvent =
              (GameStateChangedToPromptPlayerBuyingEvent) evt;
          int eventid = events.size() + 1;
          EventImpl promptBuyingEvent =
              new EventImpl(
                  gameName,
                  eventid,
                  ServerEvents.PromptPlayerToBuyAsset,
                  promptBuyingInnerEvent.getPlayer().getName(),
                  promptBuyingInnerEvent.getCell().getID(),
                  DEFAULT_TIMEOUT);
          events.add(promptBuyingEvent);
          UserPrompt.Init(
              promptBuyingInnerEvent.GetEventHandler(),
              eventid,
              promptBuyingInnerEvent.getPlayer());
          Timer buyTimeoutTimer = new Timer();
          buyTimeoutTimer.schedule(new UserPromptTimerTask(eventid), DEFAULT_TIMEOUT);
          break;
        case PlayerBuilding:
          GameStateChangedToPlayerBuildingEvent buildingEvent =
              (GameStateChangedToPlayerBuildingEvent) evt;
          EventImpl houseBoughtEvent =
              new EventImpl(
                  gameName,
                  events.size() + 1,
                  ServerEvents.HouseBought,
                  buildingEvent.getPlayer().getName(),
                  buildingEvent.getCity().getID());
          events.add(houseBoughtEvent);
          break;
        case PromptPlayerForBuilding:
          GameStateChangedToPromptPlayerBuildingEvent promptBuildingInnerEvent =
              (GameStateChangedToPromptPlayerBuildingEvent) evt;
          int buildeventid = events.size() + 1;
          EventImpl promptBuildingEvent =
              new EventImpl(
                  gameName,
                  buildeventid,
                  ServerEvents.PromptPlayerToBuyHouse,
                  promptBuildingInnerEvent.getPlayer().getName(),
                  promptBuildingInnerEvent.getCity().getID(),
                  DEFAULT_TIMEOUT);
          events.add(promptBuildingEvent);
          UserPrompt.Init(
              promptBuildingInnerEvent.GetEventHandler(),
              buildeventid,
              promptBuildingInnerEvent.getPlayer());
          Timer buildTimeoutTimer = new Timer();
          buildTimeoutTimer.schedule(new UserPromptTimerTask(buildeventid), DEFAULT_TIMEOUT);
          break;
        case PlayerDrewCard:
          GameStateChangedToPlayerDrewCardEvent drewCardEvent =
              (GameStateChangedToPlayerDrewCardEvent) evt;
          int eventType;
          if (drewCardEvent.getDeck().getType().compareTo("Community Chest") == 0)
            eventType = ServerEvents.WarrantCard;
          else if (drewCardEvent.getCard().getType().compareTo("Jail Pass") == 0)
            eventType = ServerEvents.GetOutOfJailCard;
          else eventType = ServerEvents.SurpriseCard;

          EventImpl cardEvent =
              new EventImpl(
                  gameName,
                  events.size() + 1,
                  eventType,
                  drewCardEvent.getPlayer().getName(),
                  drewCardEvent.getCard().getMessage(),
                  drewCardEvent.getPlayer().getBoardPosition());
          events.add(cardEvent);
          break;
        case PlayerGettingOutOfJail:
          GameStateChangedToPlayerGettingOutOfJailEvent outOfJailEvent =
              (GameStateChangedToPlayerGettingOutOfJailEvent) evt;
          EventImpl outOfJailCardEvent =
              new EventImpl(
                  gameName,
                  events.size() + 1,
                  ServerEvents.PlayerUsedGetOutOfJailCard,
                  outOfJailEvent.getPlayer().getName(),
                  outOfJailEvent.getPlayer().getBoardPosition());
          events.add(outOfJailCardEvent);
          break;
        case PlayerPayment:
          GameStateChangedToPlayerPaymentsEvent payEvent =
              (GameStateChangedToPlayerPaymentsEvent) evt;

          boolean isPaymentToOrFromTreasury = payEvent.GetOtherParicipiant() == null;
          boolean isPaymemtFromBank =
              payEvent.GetOtherParicipiant() == null
                  && payEvent.GetMoneyTransactionDirection()
                      == MoneyTransactionDirection.GettingPaid;
          String paymentToPlayerName = "";
          String paymentFromPlayerName = "";
          if (payEvent.GetMoneyTransactionDirection() == MoneyTransactionDirection.GettingPaid) {
            paymentToPlayerName = payEvent.getPlayer().getName();
            if (payEvent.GetOtherParicipiant() != null)
              paymentFromPlayerName = payEvent.GetOtherParicipiant().getName();
          } else {
            paymentFromPlayerName = payEvent.getPlayer().getName();
            if (payEvent.GetOtherParicipiant() != null)
              paymentToPlayerName = payEvent.GetOtherParicipiant().getName();
          }

          int paymentAmount = payEvent.getAmount();

          EventImpl paymentEvent =
              new EventImpl(
                  gameName,
                  events.size() + 1,
                  ServerEvents.Payment,
                  paymentFromPlayerName,
                  isPaymentToOrFromTreasury,
                  !isPaymemtFromBank,
                  paymentToPlayerName,
                  paymentAmount,
                  payEvent.getPlayer().getBoardPosition());
          events.add(paymentEvent);
          break;
      }
    }