private Task ClientOnPlayerBetted(BigInteger roomId, Address player, BigInteger bet)
        {
            if (roomId != this.gameState.RoomId)
            {
                return(Task.CompletedTask);
            }

            GameState.PlayerState playerState = this.gameState.Players.FirstOrDefault(state => state.Address == player);
            if (playerState == null)
            {
                return(Task.CompletedTask);
            }

            playerState.Bet = (int)bet;
            this.StateChanged?.Invoke();
            return(Task.CompletedTask);
        }
        private Task ClientOnPlayerReadyForNextRoundChanged(BigInteger roomId, Address player, bool ready)
        {
            if (roomId != this.gameState.RoomId)
            {
                return(Task.CompletedTask);
            }

            GameState.PlayerState playerState = this.gameState.Players.FirstOrDefault(state => state.Address == player);
            if (playerState == null)
            {
                return(Task.CompletedTask);
            }

            playerState.ReadyForNextRound = ready;
            this.StateChanged?.Invoke();
            return(Task.CompletedTask);
        }
        private Task ClientOnGameRoundResultsAnnounced(BigInteger roomId, BigInteger dealerOutcome, Address[] players, BigInteger[] playerOutcome)
        {
            if (roomId != this.gameState.RoomId)
            {
                return(Task.CompletedTask);
            }

            this.gameState.Dealer.Outcome = (int)dealerOutcome;
            for (int i = 0; i < players.Length; i++)
            {
                GameState.PlayerState playerState = this.gameState.Players.First(ps => ps.Address == players[i]);
                playerState.Outcome = (int)playerOutcome[i];
            }

            this.StateChanged?.Invoke();
            return(Task.CompletedTask);
        }
        private void UpdatePlayerView(
            Func <PlayerView> getPlayerViewFunc,
            Action <PlayerView> setPlayerViewAction,
            Vector3 position,
            GameState.PlayerState playerState,
            string playerName,
            bool isDealer
            )
        {
            GameObject playerViewGO;

            if (getPlayerViewFunc() == null)
            {
                playerViewGO = Instantiate(this.PrefabsContainer.PlayerViewPrefab, this.GameFieldContainer.transform);
                setPlayerViewAction(playerViewGO.GetComponent <PlayerView>());
            }
            else
            {
                playerViewGO = getPlayerViewFunc().gameObject;
            }

            playerViewGO.GetComponent <RectTransform>().anchoredPosition = position;
            PlayerView playerView = getPlayerViewFunc();

            if (this.GameStateController.GameState.Stage == GameStage.Ended)
            {
                playerName += $" ({FormatMonetaryValueAsRichText(playerState.Outcome)})";
            }

            playerView.UIContainer.BetContainer.SetActive(playerState.Bet > 0);
            playerView.UIContainer.BetValue.text = playerState.Bet.ToString();

            playerView.UIContainer.PlayerName.text = playerName;
            playerView.UIContainer.ActivePlayerMarker.SetActive(
                !isDealer &&
                this.GameStateController.GameState.Stage == GameStage.PlayersTurn &&
                this.GameStateController.GameState.CurrentPlayer == playerState.Address
                );
            playerView.UIContainer.SelfPlayerMarker.SetActive(
                playerState.Address == this.GameStateController.Client.Address
                );

            bool showScore = playerState.Hand != null && playerState.Hand.Length != 0;

            playerView.UIContainer.HandScoreContainer.SetActive(showScore);
            playerView.UIContainer.ReadyForNextRoundMarker.SetActive(false);
            playerView.UIContainer.NotReadyForNextRoundMarker.SetActive(false);
            if (showScore)
            {
                playerView.SetCards(playerState.Hand, this.PrefabsContainer);

                int softScore, hardScore;
                BlackjackRules.CalculateHandScore(playerState.Hand, out softScore, out hardScore);

                string scoreText = softScore == hardScore?softScore.ToString() : softScore + "/" + hardScore;

                playerView.UIContainer.HandScore.text  = scoreText;
                playerView.UIContainer.HandScore.color = hardScore > 21 ? new Color(0.65f, 0, 0) : Color.black;
                playerView.UIContainer.BlackjackLabelContainer.SetActive(playerState.Hand.Length == 2 && hardScore == 21);

                if (!isDealer && this.GameStateController.GameState.Stage == GameStage.Ended)
                {
                    playerView.UIContainer.ReadyForNextRoundMarker.SetActive(playerState.ReadyForNextRound);
                    playerView.UIContainer.NotReadyForNextRoundMarker.SetActive(!playerState.ReadyForNextRound);
                }
            }
            else
            {
                playerView.SetCards(Array.Empty <Card>(), this.PrefabsContainer);
                playerView.UIContainer.BlackjackLabelContainer.SetActive(false);
            }
        }