Ejemplo n.º 1
0
        protected override BaseSerializer PerformAction(ClientConnection conn, BaseSerializer requestData)
        {
            RequestSerializer  data = (RequestSerializer)requestData;
            ResponseSerializer resp = (ResponseSerializer)InitializeResponseSerializer();

            resp.Status = "OK";
            resp.Color  = data.Color;
            resp.Height = data.Height;
            resp.X      = data.X;
            resp.XX     = data.XX;

            Lobby lobby = (Lobby)conn.Session.Get("joined-lobby");
            Match game  = lobby.Game;

            if (lobby.LobbyState != LobbyState.IN_GAME)
            {
                data.AddError(null, "INVALID_LOBBY_STATE", "Nie można licytować w tym stanie lobby");
                data.ThrowException();
            }

            string username = (string)conn.Session.Get("username");

            int playerIndex = game.PlayerList.FindIndex(x => { return(username == x.Name); });

            // gdy nie ma takiego gracza przy stole => wywal wyjątek
            if (playerIndex == -1)
            {
                data.AddError("PlayerUsername", "INVALID_PLAYER", "Nie ma takiego gracza");
                data.ThrowException();
            }

            var player   = game.PlayerList[playerIndex];
            var contract = new Contract((ContractHeight)data.Height, (ContractColor)data.Color, player.Tag, data.X, data.XX);

            if (!game.CheckAddBid(contract))
            {
                data.AddError(null, "INVALID_CONTRACT", "Nie można zalicytować kontraktu");
                data.ThrowException();
            }
            game.AddBid(contract);

            Console.WriteLine(username + "> Bid: " + contract.ToString());

            // Broadcast do pozostałych graczy
            var broadcastData = new LobbySignalNewBidSerializer()
            {
                Signal   = LobbySignalNewBidSerializer.SIGNAL_NEW_BID,
                Username = username,
                PlaceTag = (int)player.Tag,
                Color    = data.Color,
                Height   = data.Height,
                X        = data.X,
                XX       = data.XX
            };
            var broadcastWrapper = new StandardCommunicateSerializer()
            {
                CommunicateType = StandardCommunicateSerializer.TYPE_LOBBY_SIGNAL,
                Data            = broadcastData.GetApiObject()
            };

            lobby.Broadcast(broadcastWrapper.GetApiObject());

            // Broadcast o przepasowaniu całej licytacji, nowe rozdanie
            if (game.CurrentBidding.IsEnd() && game.CurrentBidding.HighestContract.ContractColor == ContractColor.NONE)
            {
                game.GameState = GameState.BIDDING;
                game.StartBidding();

                var bData = new LobbySignalGameStartedNextBiddingSerializer()
                {
                    Signal = LobbySignalGameStartedNextBiddingSerializer.SIGNAL_GAME_STARTED_NEXT_BIDDING,

                    PointsNSAboveLine = game.PointsNS[1],
                    PointsNSBelowLine = game.PointsNS[0],
                    PointsWEAboveLine = game.PointsWE[1],
                    PointsWEBelowLine = game.PointsWE[0],

                    RoundsNS = game.RoundsNS,
                    RoundsWE = game.RoundsWE
                };
                var bWrapper = new StandardCommunicateSerializer()
                {
                    CommunicateType = StandardCommunicateSerializer.TYPE_LOBBY_SIGNAL,
                    Data            = bData.GetApiObject()
                };
                lobby.Broadcast(bWrapper.GetApiObject());
            }

            return(resp);
        }
Ejemplo n.º 2
0
        private void HandleLobbySignal(JObject signalData)
        {
            var signalName = (string)signalData.GetValue("signal");

            // start gry
            if (signalName == PlayerClickedGameStartSerializer.SIGNAL_PLAYER_READY)
            {
                var serializer = new PlayerClickedGameStartSerializer(signalData);
                serializer.Validate();

                Game.Start();
                SendGetHandRequest = true;
            }
            else if (signalName == LobbySignalNewBidSerializer.SIGNAL_NEW_BID)
            {
                var serializer = new LobbySignalNewBidSerializer(signalData);
                serializer.Validate();

                try {
                    var contract = new Contract(
                        (ContractHeight)serializer.Height,
                        (ContractColor)serializer.Color,
                        (PlayerTag)serializer.PlaceTag,
                        serializer.X,
                        serializer.XX
                        );
                    Game.AddBid(contract);
                } catch (WrongBidException) {
                    // TODO: Pobrać całą licytację jeszcze raz
                }
            }
            // Użytkownik usiadł na wybranym miejscu
            else if (signalName == LobbySignalUserSatSerializer.SIGNAL_USER_SAT)
            {
                var serializer = new LobbySignalUserSatSerializer(signalData);
                serializer.Validate();

                if (serializer.Username != Username)
                {
                    Game.AddPlayer(new Player((PlayerTag)serializer.PlaceTag, serializer.Username));
                }
            }
            else if (signalName == LobbySignalUserSittedOutSerializer.SIGNAL_USER_SITTED_OUT)
            {
                var serializer = new LobbySignalUserSittedOutSerializer(signalData);
                serializer.Validate();

                var player = Game.GetPlayerAt((PlayerTag)serializer.PlaceTag);
                Game.RemovePlayer(player);
            }
            else if (signalName == PutCardSignalSerializer.SIGNAL_USER_PUT_CARD)
            {
                var serializer = new PutCardSignalSerializer(signalData);
                serializer.Validate();

                if (serializer.Username != Username)
                {
                    Game.CurrentGame.NextCard(new Card((CardFigure)serializer.CardFigure, (CardColor)serializer.CardColor, (PlayerTag)serializer.OwnerPosition));
                }
            }
            // Następna licytacja
            else if (signalName == LobbySignalGameStartedNextBiddingSerializer.SIGNAL_GAME_STARTED_NEXT_BIDDING)
            {
                var serializer = new LobbySignalGameStartedNextBiddingSerializer(signalData);

                Game.ClearPlayerHands();
                MyCards.Clear();
                if (GrandpaCards != null)
                {
                    GrandpaCards.Clear();
                }
                GrandpaCards       = null;
                SendGetHandRequest = true;

                if (Game.GameState != GameState.BIDDING)
                {
                    Game.GameState = GameState.BIDDING;
                    Game.StartBidding();
                }
            }
            else if (signalName == LobbySignalGameFinishedSerializer.SIGNAL_GAME_FINISHED)
            {
                var serializer = new LobbySignalGameFinishedSerializer(signalData);

                Game.ClearPlayerHands();
                if (MyCards != null)
                {
                    MyCards.Clear();
                }
                if (GrandpaCards != null)
                {
                    GrandpaCards.Clear();
                }
                GrandpaCards = null;

                Game.GameState = GameState.GAME_FINISHED;
            }
        }