/// <summary> /// Процедура, выполняющаяся при выходе из игры одного из игроков /// </summary> /// <param name="source"></param> private void LeaveHandler(SBRemoteClient source) { lock (_syncRoot) { if (this.State != GameState.Idle) { Player p = _a.Client == source ? _a : _b; Player o = _a.Client == source ? _b : _a; if (o.Client.State == KnownClientState.InGame) { o.Client.Send(new MsgChatMessage() { Text = "Ваш противник покинул игру!" }); } source.SetState(KnownClientState.Free); if (_a.Client.State != KnownClientState.InGame && _b.Client.State != KnownClientState.InGame) { this.SetState(GameState.Idle); } } } }
/// <summary> /// Начало игры /// </summary> /// <param name="c"></param> /// <param name="opponentId"></param> /// <param name="password"></param> private void BeginGameHandler(SBRemoteClient c, Guid opponentId, string password) { SBRemoteClient opponent; if (c.State == KnownClientState.Free || c.State == KnownClientState.Ready) { using (_knownClients.Read()) { if (!_knownClients.Object.TryGetValue(opponentId, out opponent)) { opponent = null; } } if (opponent != null) { if (opponent.Password == password) { c.SetState(KnownClientState.InGame); opponent.SetState(KnownClientState.InGame); var g = new SBGame(c, opponent); g.OnScoreChanged += gc => GameScoreChangedHalder(gc); g.OnGameFinished += () => GameFinishedHandler(g); using (_games.Write()) { _games.Object.Add(g.Id, g); } this.SendToAll(new MsgNewGame() { Id = g.Id, PlayerA = g.PlayerA, PlayerB = g.PlayerB }); } else { c.Send(new MsgChatMessage() { Text = "Неверный пароль!" }); } } } }