protected override BaseSerializer PerformAction(ClientConnection conn, BaseSerializer requestData) { RequestSerializer data = (RequestSerializer)requestData; ResponseSerializer resp = (ResponseSerializer)InitializeResponseSerializer(); resp.Status = "OK"; Lobby lobby = (Lobby)conn.Session.Get("joined-lobby"); Match game = lobby.Game; if (lobby.LobbyState != LobbyState.IDLE) { data.AddError(null, "INVALID_LOBBY_STATE", "Nie można usiąść w tym momencie gry"); data.ThrowException(); } try { var player = new Player((PlayerTag)data.PlaceTag, (string)conn.Session.Get("username")); game.AddPlayer(player); conn.Session.Set("player", player); Console.WriteLine("Player sat at " + data.PlaceTag + ": " + conn.Session.Get("username")); var broadcastData = new LobbySignalUserSatSerializer() { Signal = LobbySignalUserSatSerializer.SIGNAL_USER_SAT, PlaceTag = data.PlaceTag, Username = player.Name }; var broadcastWrapper = new StandardCommunicateSerializer() { CommunicateType = StandardCommunicateSerializer.TYPE_LOBBY_SIGNAL, Data = broadcastData.GetApiObject() }; lobby.Broadcast(broadcastWrapper.GetApiObject()); } catch (SeatTakenException) { data.AddError("PlaceTag", "SEAT_TAKEN", "Miejsce jest już zajęte"); data.ThrowException(); } catch (DuplicatedPlayerNameException) { data.AddError(null, "ALREADY_SEATED", "Użytkownik zajął już miejsce"); data.ThrowException(); } catch (WrongGameStateException) { data.AddError(null, "WRONG_GAME_STATE", "Nieprawidłowy stan gry dla tej operacji"); data.ThrowException(); } return(resp); }
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; } }