Beispiel #1
0
        public void EnableStatsText(long?prevHighScore)
        {
            Assert.IsTrue(rankCheckDelay > 1, "trying to check too often");
            GetComponent <Image>().sprite = researchWorldBackground;
            starsObject.SetActive(false);
            statsObject.SetActive(true);

            target1 = target2 = this.prevHighScore = prevHighScore ?? 0; // this means highscore is viewable regardless of finish flag

            LastStatsRank = null;
            OnRankStaled?.Invoke(); // request a rank at first
        }
Beispiel #2
0
        public void Update()
        {
            Assert.IsFalse(starsObject.activeSelf && statsObject.activeSelf);
            bool valid = AttachedValidity?.Invoke() ?? true;

            if (!valid)
            {
                return;
            }

            double score = 0;

            foreach (var Source in AttachedSources)
            {
                score += Source.Invoke();
            }
            Assert.IsTrue(score >= 0, "cannot have negative score");

            if (score > latestValidScore)
            {
                displayedScoreCol = higherScoreCol;
                ResetRemindCycle();
            }
            else if (score < latestValidScore)
            {
                displayedScoreCol = lowerScoreCol;
                ResetRemindCycle();
            }
            displayedScore = (long)score;

            //////////////////////////////////////////
            // stars may be disabled by e.g. tutorial
            if (starsDisabled)
            {
                return;
            }
            latestValidScore = score;
            displayedStars   = 0;
            if (AttachedSatisfied?.Invoke() ?? false)
            {
                displayedStars += 1;
                if (displayedScore >= target1)
                {
                    displayedStars += 1;
                    if (displayedScore >= target2)
                    {
                        displayedStars += 1;
                    }
                }

                int prevHighestStars = HighestStars;
                HighestStars = Math.Max(HighestStars, displayedStars);
                long prevHighestScore = HighestScore;
                HighestScore = Math.Max(HighestScore, displayedScore);
                // do not set off events yet if finish is disabled
                if (prevHighestStars == 0 && HighestStars > 0)
                {
                    OnOneStarAchieved?.Invoke();
                }
                // always call OnThreeStarsAchieved second
                if (prevHighestStars <= 2 && HighestStars == 3)
                {
                    OnThreeStarsAchieved?.Invoke();
                }
                if (HighestScore > prevHighestScore)
                {
                    OnHighestScoreBroken?.Invoke();
                    if (statsObject.activeSelf)
                    {
                        OnRankStaled?.Invoke();
                    }
                    lastHighScoreTime = Time.time;
                    SaveDescription();
                }
                displayedScoreCol = Color.Lerp(displayedScoreCol, defaultScoreCol, .5f * Time.deltaTime);
            }
            else
            {
                displayedScore    = 0;
                displayedScoreCol = Color.Lerp(displayedScoreCol, unsatisfiedScoreCol, 5f * Time.deltaTime);
            }
            if (statsObject.activeSelf)
            {
                scoreTargetText.text    = target2.ToString("N0");
                scoreTargetImage.sprite = trophySprite;
                scoreTargetImage.rectTransform.sizeDelta = new Vector2(70, 45);
            }
            else
            {
                scoreTargetText.text    = (displayedStars < 2? target1:target2).ToString("N0");
                scoreTargetImage.sprite = displayedStars < 2? targetSprite1:targetSprite2;
                scoreTargetImage.rectTransform.sizeDelta = new Vector2(70, 48); // magic numbers lol
            }
            star1.SetBool("Filled", displayedStars >= 1);
            star2.SetBool("Filled", displayedStars >= 2);
            star3.SetBool("Filled", displayedStars == 3);

            // periodically flash the highest score if needed
            if ((displayedStars == 0 && HighestStars > 0) || (displayedStars > 0 && displayedScore < HighestScore))
            {
                StartReminding();
            }
            else
            {
                EndReminding();
            }
            // periodically request a new rank + median after long enough wait
            if (statsObject.activeSelf && Time.time > lastHighScoreTime + rankCheckDelay)
            {
                OnRankStaled?.Invoke();
                lastHighScoreTime = Time.time;
            }
        }