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); } }
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); }