internal void SetColour(int playerIndex)
 {
     ColouredPart.color = ColourFetcher.GetColour(playerIndex);
     name = "PADDLE_" + playerIndex;
 }
    /// <summary>
    /// Sets the values of the burger
    /// </summary>
    /// <param name="customer">The complaints</param>
    /// <param name="tip">How much top was given</param>
    /// <param name="totalScore">Score achieved for this burger</param>
    /// <param name="playerIndex">Index of the player who made the burger</param>
    internal void Initialise(List <BurgerComplaint> complaints, int tip, int totalScore, int playerIndex, string customerName)
    {
        Sprite bread = null;

        _complaints = complaints;

        // display tip
        for (int i = 0; i < TipsRenderers.Length; i++)
        {
            TipsRenderers[i].gameObject.SetActive((tip) >= ((i + 1) * 10));
        }

        StarImage.sprite     = LicenseToGrillController.Instance.StarImages[((totalScore + 19) / 20)];
        ColourBar.color      = ColourFetcher.GetColour(playerIndex);
        TxtCustomerName.text = customerName;

        // display burger
        var index   = 0;
        var message = "";

        foreach (var item in complaints)
        {
            // add to the message
            if (message.Length > 0)
            {
                message += ", ";
            }
            message += (message.Length > 0) ? item.ErrorMessage().ToLower() : item.ErrorMessage();

            if (item.GetSprite() != null)
            {
                // if bread, add both parts
                if (item.ErrorMessage().ToLower().Contains("bread"))
                {
                    bread = LicenseToGrillController.Instance.BreadTop[item.GetSpriteIndex()];
                }

                // show the image
                ElementRenderers[index].sprite = item.GetSprite();

                ElementRenderers[index].color = item.GetColour();
                ElementRenderers[index].gameObject.SetActive(true);
                index++;
            }
        }

        // update message if flawless
        if (complaints.Count == 0)
        {
            message = MessageFetcher.GetPerfectBurgerMessage();
        }

        // format message
        TxtDescription.text = TextFormatter.GetBurgerReviewString(message);

        // show heading based on score
        TxtTitle.text = GetHeading_(totalScore);

        // add second part of bread
        if (bread)
        {
            // show the image
            ElementRenderers[index].sprite = bread;

            ElementRenderers[index].color = Color.white;
            ElementRenderers[index].gameObject.SetActive(true);
            index++;
        }

        // hide unused elements
        for (; index < ElementRenderers.Length; index++)
        {
            ElementRenderers[index].gameObject.SetActive(false);
        }
    }
    // Start is called before the first frame update
    void Start()
    {
        Instance = this;

        // fade in
        EndFader.GetComponentInChildren <Image>().sprite = PlayerManagerScript.Instance.GetFaderImage();
        EndFader.StartFade(1, 0, FadeInComplete);

        // load all jokes - must be done in Start, not constructor (as Resources must be loaded after script starts)
        _jokeManager = new JokeManager();

        // create players
        SpawnPlayers_();

        // find components
        _cards   = FindObjectsOfType <CardScript>();
        _players = FindObjectsOfType <PunchlineBlingInputHandler>().OrderBy(p => p.GetPlayerIndex()).ToArray();

        // set all players as not active
        for (int i = 0; i < _players.Length; i++)
        {
            _players[i].ActivePlayer(false, 0);
        }

        // initialise the notepad texts
        for (var i = 0; i < NoteBookTexts.Length; i++)
        {
            NoteBookTexts[i].text = "";
        }

        // hide end UI
        PnlTotalPoints.SetActive(false);

        // configure the points display controls
        for (int i = 0; i < _players.Length; i++)
        {
            var images = PlayerDisplays[i].GetComponentsInChildren <Image>();
            images[0].color  = ColourFetcher.GetColour(i);
            images[1].sprite = CharacterIcons[_players[i].GetCharacterIndex()];

            // set player name on display
            var txts = PlayerDisplays[i].GetComponentsInChildren <Text>();
            txts[0].text = _players[i].GetPlayerName();
        }

        // hide unused controls
        for (int i = _players.Length; i < PlayerDisplays.Length; i++)
        {
            PlayerDisplays[i].gameObject.SetActive(false);
        }

        CreateCards_();

        // set up the timers
        _overallLimit = (TimeLimit)gameObject.AddComponent(typeof(TimeLimit));
        _playerLimit  = (TimeLimit)gameObject.AddComponent(typeof(TimeLimit));

        _overallLimit.Initialise(300, OverallTickCallback, OverallTimeoutCallback);
        _playerLimit.Initialise(20, PlayerTickCallback, PlayerTimeoutCallback);

        SpinWheel.Initialise(_players.ToList());

        List <GenericInputHandler> genericPlayers = _players.ToList <GenericInputHandler>();

        PauseGameHandler.Instance.Initialise(genericPlayers, QuitGame_);
    }
 /// <summary>
 /// Sets the colour of the suit details to match the players colour
 /// </summary>
 /// <param name="playerIndex"></param>
 /// <param name="characterIndex"></param>
 internal void SetPlayerColour(int playerIndex, int characterIndex)
 {
     _playerIndex         = playerIndex;
     _colourDetails.color = ColourFetcher.GetColour(playerIndex);
     _playerSprite.sprite = IdleImages[characterIndex];
 }
    /// <summary>
    /// Show the canvases and scores for each players
    /// </summary>
    IEnumerator ShowResults_()
    {
        _ended = true;

        // add bonus points for quickest lap
        if (_currentBestLapPlayer > -1)
        {
            _players[_currentBestLapPlayer].AddPoints(FASTEST_LAP_BONUS);
        }

        yield return(new WaitForSeconds(2f));

        Leaderboard.SetActive(false);
        Gallery.SetActive(true);

        foreach (var player in _players)
        {
            // hide all frames at start
            InitialiseFrames_();
            yield return(new WaitForSeconds(1));

            TxtGalleryPlayerName.text = player.GetPlayerName();

            // get data
            var laps       = player.GetLaps();
            var scores     = player.GetLapScores();
            var times      = player.GetLapTimes();
            var accuracies = player.GetLapAccuracies();

            for (int i = 0; i < laps.Count; i++)
            {
                // initialise frames
                GalleryFrames[i].Rosette.color = ColourFetcher.GetColour(player.GetPlayerIndex());
                GalleryFrames[i].gameObject.SetActive(true);

                // get trail positions for this lap
                var x      = 100 * (i + 1) + 3;
                var tuples = laps[i].Select(t => t.Item1 + new Vector3(-x, 0, 0)).ToList();
                tuples.RemoveAt(0);
                tuples.RemoveAt(tuples.Count - 1);

                // set position of trail
                TrailRenderers[i].transform.localPosition = new Vector3(tuples.Last().x + (100 * (i + 1)), tuples.Last().y, -0.1f);

                // set colour of trail
                TrailRenderers[i].startColor = ColourFetcher.GetColour(player.GetPlayerIndex());
                TrailRenderers[i].endColor   = ColourFetcher.GetColour(player.GetPlayerIndex());

                // dsplay trail data
                TrailRenderers[i].Clear();
                TrailRenderers[i].AddPositions(tuples.ToArray());

                // create lap time string
                var lapTimeDisplay = "Not complete";
                if (i < times.Count)
                {
                    var ms = times[i];

                    // calculate time components
                    int seconds      = (int)(ms / 1000f);
                    int milliseconds = (int)((ms - (seconds * 1000f)));

                    lapTimeDisplay = $"{seconds.ToString("00")}.{milliseconds.ToString("000")} seconds";
                }

                // display data on
                GalleryFrames[i].TxtLapAccuracy.text = i >= accuracies.Count ? "" : Math.Round(accuracies[i] * 100, 1) + "%";
                GalleryFrames[i].TxtLapTime.text     = lapTimeDisplay;
                GalleryFrames[i].TxtLapPoints.text   = i >= scores.Count ? "" : scores[i].ToString();
                yield return(new WaitForSeconds(1));

                // show gallery sign
                GalleryFrames[i].PictureSign.gameObject.SetActive(true);
                yield return(new WaitForSeconds(1));

                // check if there is data for this
                if (i < scores.Count)
                {
                    // display points for this lap on a rosette
                    GalleryFrames[i].Rosette.gameObject.SetActive(true);
                    yield return(new WaitForSeconds(1));

                    // if accuracy bonus was earned, display a second rosette
                    if (accuracies[i] > CarControllerScript.ACCURACY_BONUS_THRESHOLD)
                    {
                        GalleryFrames[i].AccuracyBonusRosette.gameObject.SetActive(true);
                        yield return(new WaitForSeconds(1));
                    }

                    // if this was the fastest lap of the game, show a rosette for this
                    if (_currentBestLap == times[i] && _currentBestLapPlayer == player.GetPlayerIndex())
                    {
                        GalleryFrames[i].FastestLapRosette.gameObject.SetActive(true);
                        yield return(new WaitForSeconds(1));
                    }
                }
            }

            // show total points
            TxtTotalPoints.text = "Total: " + player.GetPoints() + "  points";
            yield return(new WaitForSeconds(3));

            TxtTotalPoints.text = "";
        }

        // wait before end
        yield return(new WaitForSeconds(1));

        StartCoroutine(Complete_());
    }