Beispiel #1
0
        public async Task ExitGame(GameIdModel model)
        {
            var game = GetGame(model.GameId);

            var playerWhoLeft  = game.GetPlayerByUserId(GetUserIdByCurrentConnectionId());
            var opponentPlayer = game.GetOpponentPlayer(playerWhoLeft);

            var message = new PlayerHasLeftGameMessage
            {
                GameId   = game.Id,
                UserName = playerWhoLeft.Name,
                TeamId   = playerWhoLeft.TeamId
            };

            game.ChatMessages.Add(message);

            await SendMessageToClientsAsync("PlayerHasLeftGame", GetAllConnectionsByUsersIds(new List <string>()
            {
                opponentPlayer.UserId
            }), message);

            game.PlayerLeft(playerWhoLeft);

            if (!opponentPlayer.HasUserLeftTheGame)
            {
                await SendGameStatusToPlayer(game, opponentPlayer);
            }
        }
Beispiel #2
0
        public async Task PlayerWantsToRematch(GameIdModel model)
        {
            var game = GetGame(model.GameId);

            if (!game.IsGameOver())
            {
                throw new Exception("Game is not over");
            }
            if (game.HasAnyPlayerLeft())
            {
                throw new Exception("Opponent has left");
            }

            var playerWhoWantsToRematch = game.GetPlayerByUserId(GetUserIdByCurrentConnectionId());
            var opponentPlayer          = game.GetOpponentPlayer(playerWhoWantsToRematch);
            var allPlayersConnections   = GetAllConnectionsByUsersIds(game.GetPlayersUsersIds());

            playerWhoWantsToRematch.WantsToRematch = true;

            var message = new PlayerWantsRematchMessage
            {
                GameId   = game.Id,
                UserName = playerWhoWantsToRematch.Name,
                TeamId   = playerWhoWantsToRematch.TeamId
            };

            game.ChatMessages.Add(message);

            await SendMessageToClientsAsync("PlayerWantsRematch", allPlayersConnections, message);

            if (game.IsReadyForRematch())
            {
                var rematchGame = new GameModel();
                rematchGame.SetFirstPlayer(playerWhoWantsToRematch.TeamId, playerWhoWantsToRematch.Name, playerWhoWantsToRematch.UserId);
                rematchGame.SetSecondPlayer(opponentPlayer.Name, opponentPlayer.UserId);

                rematchGame.Start();

                _games.Add(rematchGame);

                await SendGameStatusToAllPlayers(rematchGame);
            }
        }