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 }
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; } }