Esempio n. 1
0
        public ResponseBase CreateGameSession(CreateGameSessionRequest createGameRequest)
        {
            var gameDetails = new GameSessionDetails
            {
                Name             = createGameRequest.Name,
                Owner            = createGameRequest.UserName,
                TotalPlayerCount = createGameRequest.MaxPlayers,
                TotalBotCount    = createGameRequest.MaxBots,
            };

            gameDetails.Players.Add(new PlayerDetails {
                ConnectionId = createGameRequest.ConnectionId, UserName = createGameRequest.UserName
            });

            if (createGameRequest.MaxPlayers == 1)
            {
                gameDetails.PlayerStarts = createGameRequest.PlayerStarts;
                gameDetails.Status       = GameStatus.Starting;
                this.gamesAdministrator.AddGame(gameDetails);

                var playerDetails = gameDetails.Players[0];
                return(new LaunchGameResponse(gameDetails.Status, gameDetails.Id, playerDetails.Id, playerDetails.ConnectionId));
            }
            else
            {
                gameDetails.Status = GameStatus.Open;
                this.waitingGameSessionsById.TryAdd(gameDetails.Id, gameDetails);
                return(new CreateGameSessionResponse(gameDetails.Id));
            }
        }
Esempio n. 2
0
        private GameManagerToken LaunchGame(GameSessionDetails gameSessionDetails)
        {
            if (gameSessionDetails == null)
            {
                throw new ArgumentNullException(nameof(gameSessionDetails));
            }

            var playerIds = new Queue <Guid>();

            var connectionIdsByPlayerId = new Dictionary <Guid, string>();

            gameSessionDetails.Players.ForEach(player =>
            {
                connectionIdsByPlayerId.Add(player.Id, player.ConnectionId);
                playerIds.Enqueue(player.Id);
            });

            var gameBoard      = new GameBoard(BoardSizes.Standard);
            var gameBoardQuery = new GameBoardQuery(gameBoard);

            Dictionary <Guid, IEventReceiver> eventReceiversByPlayerId = null;
            List <Bot> bots = null;

            if (gameSessionDetails.TotalBotCount > 0)
            {
                bots = new List <Bot>();
                eventReceiversByPlayerId = new Dictionary <Guid, IEventReceiver>();
                while (gameSessionDetails.TotalBotCount-- > 0)
                {
                    var bot = new Bot("Bot #" + (bots.Count + 1), gameSessionDetails.Id, this, gameBoardQuery);
                    bots.Add(bot);
                    eventReceiversByPlayerId.Add(bot.Id, bot);
                    playerIds.Enqueue(bot.Id);
                }
            }

            var eventSender = new EventSender(this.gameHubContext, connectionIdsByPlayerId, eventReceiversByPlayerId);

            var gameManager = new GameManager(
                gameSessionDetails.Id,
                gameSessionDetails.PlayerStarts ? new PlayerStartsNumberGenerator() : this.numberGenerator,
                gameBoard,
                new DevelopmentCardHolder(),
                new PlayerFactory(),
                eventSender,
                new GameOptions
            {
                Players           = gameSessionDetails.NumberOfPlayers,
                TurnTimeInSeconds = gameSessionDetails.TurnTimeoutInSeconds
            }
                );

            gameManager.SetIdGenerator(() => { return(playerIds.Dequeue()); });

            gameSessionDetails.Players.ForEach(player =>
            {
                gameManager.JoinGame(player.UserName);
            });

            if (bots != null)
            {
                bots.ForEach(bot =>
                {
                    gameManager.JoinGame(bot.Name);
                });
            }

            return(new GameManagerToken(gameManager, gameManager.StartGameAsync(), eventSender));
        }
Esempio n. 3
0
 public void AddGame(GameSessionDetails gameDetails)
 {
     this.gamesToLaunchById.TryAdd(gameDetails.Id, gameDetails);
 }