Exemplo n.º 1
0
        private void SocketHandler_GetGameState(Messages.GetGameState msg, NetworkStream stream,
                                                BinaryReader streamReader, BinaryWriter streamWriter)
        {
            var game = FindGame(msg.PlayerID);

            if (game == null)
            {
                var errMsg = new Messages.Error("Couldn't find game with ID " + msg.PlayerID);
                Try(() => Messages.Base.Write(errMsg, streamWriter),
                    "sending 'unknown game ID' error");
                return;
            }

            byte[][] recentMoves = new byte[game.AllMoves.Count - msg.LastKnownMovement][];
            for (int i = 0; i < recentMoves.Length; ++i)
            {
                recentMoves[i] = game.AllMoves[i + msg.LastKnownMovement];
            }

            var gameMsg = new Messages.GameState(game.BoardState, recentMoves,
                                                 game.MatchState, game.Player1ID, game.Player2ID);

            if (!Try(() => Messages.Base.Write(gameMsg, streamWriter),
                     "telling game state"))
            {
                return;
            }

            //If the game is over, make sure the player acknowledges that fact.
            if (gameMsg.MatchState.IsGameOver())
            {
                Messages.Base _acknowledgeMsg = null;
                if (!Try(() => _acknowledgeMsg = Messages.Base.Read(streamReader),
                         "Getting acknowledgement from client in 'CheckOpponentFound'"))
                {
                    return;
                }
                if (!(_acknowledgeMsg is Messages.Acknowledge))
                {
                    Try(() => { throw new Exception("Expected Acknowledgement, got " + _acknowledgeMsg.Type); },
                        "casting message to acknowledgement");
                }

                //Remove the game from various data structures.
                lock (lock_finishedGames)
                    finishedGamesByUnacknowledgedPlayer.Remove(msg.PlayerID);
                lock (lock_activeGames)
                    activeGames.Remove(game);
            }
        }
Exemplo n.º 2
0
        public static Base Read(BinaryReader reader)
        {
            Base b = null;

            var type = (Types)reader.ReadByte();

            switch (type)
            {
            case Types.Error: b = new Error(null); break;

            case Types.Acknowledge: b = new Acknowledge(); break;

            case Types.FindGame: b = new FindGame(null, 0); break;

            case Types.SuccessfullyInQueue: b = new SuccessfullyInQueue(0); break;

            case Types.CheckOpponentFound: b = new CheckOpponentFound(0); break;

            case Types.FoundOpponent: b = new FoundOpponent(null, 0, false); break;

            case Types.NewBoard: b = new NewBoard(null, MatchStates.Tie); break;

            case Types.GetGameState: b = new GetGameState(0, 0); break;

            case Types.GameState: b = new GameState(null, null, MatchStates.Tie, 0, 0); break;

            case Types.MakeMove: b = new MakeMove(0, null, null, MatchStates.Tie); break;

            case Types.ForfeitGame: b = new ForfeitGame(0); break;

            default: throw new NotImplementedException(type.ToString());
            }

            b.Deserialize(reader);

            return(b);
        }