Exemplo n.º 1
0
        private void MatchMakerService()
        {
            var queuedUsers = _gameServer.RegistredUsers.ToList().Where(user => user.UserState == UserState.Queued).ToList();

            Log.Info($"{queuedUsers.Count} users queued for matchmaking.");

            for (int i = 0; i < _maxGamesPerCall && queuedUsers.Count > 1; i++)
            {
                var player1 = queuedUsers.ElementAt(0);
                var player2 = queuedUsers.ElementAt(1);
                queuedUsers.RemoveRange(0, 2);

                _gameServer.ChangeUserState(player1, UserState.Invited);
                _gameServer.ChangeUserState(player2, UserState.Invited);

                var gameId    = Index;
                var matchgame = new MatchGame(_gameServer, gameId, player1, player2);
                if (_matchGames.TryAdd(gameId, matchgame))
                {
                    matchgame.Initialize();
                }
                else
                {
                    Log.Error($"Couldn't add [GameId:{gameId}] match game with {player1.AccountName} and {player2.AccountName}.");
                }
            }
        }
Exemplo n.º 2
0
        private void ProcessGameResponse(int dataPacketId, string dataPacketToken, GameResponse gameResponse)
        {
            var userInfoData = UserById(dataPacketId);

            Log.Info($"GameResponse:{gameResponse.GameResponseType} from {userInfoData?.AccountName}, {gameResponse.RequestState}");

            if (userInfoData == null || gameResponse.RequestState != RequestState.Success)
            {
                Stop();
                return;
            }

            switch (gameResponse.GameResponseType)
            {
            case GameResponseType.Invitation:

                _gameServer.ChangeUserState(userInfoData, UserState.Prepared);
                userInfoData.Connection.Send(DataPacketBuilder.RequestServerGamePreparation(_id, _token, _gameId), Encoding.UTF8);
                break;

            case GameResponseType.Preparation:

                var gameResponsePreparation = JsonConvert.DeserializeObject <GameResponsePreparation>(gameResponse.GameResponseData);
                userInfoData.DeckType = gameResponsePreparation.DeckType;
                userInfoData.DeckData = gameResponsePreparation.DeckData;
                _gameServer.ChangeUserState(userInfoData, UserState.InGame);
                if (_player1.UserState == UserState.InGame && _player2.UserState == UserState.InGame)
                {
                    _player1.Connection.Send(DataPacketBuilder.RequestServerGameStart(_id, _token, _gameId, _player1, _player2), Encoding.UTF8);
                    _player2.Connection.Send(DataPacketBuilder.RequestServerGameStart(_id, _token, _gameId, _player1, _player2), Encoding.UTF8);
                    Thread.Sleep(500);
                    Start();
                }
                break;

            case GameResponseType.PowerOption:
                //ProcessPowerOptionsData();
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }