예제 #1
0
        /// <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);
                    }
                }
            }
        }
예제 #2
0
        /// <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 = "Неверный пароль!"
                        });
                    }
                }
            }
        }