public async Task <IActionResult> Join([FromBody] JoinGameSessionRequest request)
        {
            _logger.LogInformation("Received request to create player {PlayerName} and join game with code {JoinCode}", request.PlayerName, request.JoinCode);
            var joinGameResponse = await _gameSessionService.JoinNewPlayerToGameAsync(request.PlayerName, request.JoinCode);

            return(Ok(joinGameResponse));
        }
Beispiel #2
0
        public bool?JoinGameSession(JoinGameSessionRequest joinGameRequest, out JoinGameResponse[] responses)
        {
            responses = null;
            if (!this.waitingGameSessionsById.ContainsKey(joinGameRequest.GameId))
            {
                return(null);
            }

            var gameDetails = this.waitingGameSessionsById[joinGameRequest.GameId];

            if (gameDetails.NumberOfSlots == 0 || gameDetails.Status != GameStatus.Open)
            {
                responses = new[] { new JoinGameResponse(gameDetails.Status) };
                return(false);
            }

            gameDetails.Players.Add(new PlayerDetails {
                ConnectionId = joinGameRequest.ConnectionId, UserName = joinGameRequest.UserName
            });
            if (gameDetails.NumberOfSlots == 0)
            {
                gameDetails.Status = GameStatus.Starting;
                this.waitingGameSessionsById.TryRemove(gameDetails.Id, out var gd);
                this.startingGamesById.TryAdd(gameDetails.Id, gameDetails);
                this.startingGames.Enqueue(gameDetails);
                gameDetails.LaunchTime = DateTime.Now;
            }

            responses = new LaunchGameResponse[gameDetails.NumberOfPlayers];
            for (var index = 0; index < gameDetails.Players.Count; index++)
            {
                var playerDetails = gameDetails.Players[index];
                responses[index] = new LaunchGameResponse(
                    gameDetails.Status, gameDetails.Id, playerDetails.Id, playerDetails.ConnectionId);
            }

            return(true);
        }