using System; using System.Collections.Generic; using System.Linq; using TMPro; using UnityEngine; using UnityEngine.UI; /// /// Abstract class for all minigame-gameEndedPanels /// public abstract class AbstractGameEndedPanel : MonoBehaviour { /// /// The index of minigame that needs a GameEndedPanel /// protected abstract MinigameIndex minigameIndex { get; } /// /// Reference to the scoreboard entries container /// public Transform scoreboardEntriesContainer; /// /// The GameObjects representing the letters /// private List scoreboardEntries = new List(); /// /// Reference to the ScoreboardEntry prefab /// public GameObject scoreboardEntry; /// /// Sets the scoreboard /// protected void SetScoreBoard() { // Clean the previous scoreboard entries for (int i = 0; i < scoreboardEntries.Count; i++) { Destroy(scoreboardEntries[i]); } scoreboardEntries.Clear(); // Instantiate new entries // Get all scores from all users List> allScores = new List>(); foreach (User user in UserList.GetUsers()) { // Get user's progress for this minigame var progress = user.GetMinigameProgress(minigameIndex); if (progress != null) { // Add scores to dictionary List scores = progress.highestScores; foreach (Score score in scores) { allScores.Add(new Tuple(user.GetUsername(), score)); } } } // Sort allScores based on Score.scoreValue allScores.Sort((a, b) => b.Item2.scoreValue.CompareTo(a.Item2.scoreValue)); // Instantiate scoreboard entries int rank = 1; foreach (Tuple tup in allScores.Take(10)) { string username = tup.Item1; Score score = tup.Item2; GameObject entry = Instantiate(scoreboardEntry, scoreboardEntriesContainer); scoreboardEntries.Add(entry); // Set the player icon entry.transform.Find("Image").GetComponent().sprite = UserList.GetUserByUsername(username).GetAvatar(); // Set the player name entry.transform.Find("PlayerName").GetComponent().text = username; // Set the score entry.transform.Find("Score").GetComponent().text = score.scoreValue.ToString(); // Set the rank entry.transform.Find("Rank").GetComponent().text = rank.ToString(); // Set the ago // Convert the score.time to Datetime DateTime time = DateTime.Parse(score.time); DateTime currentTime = DateTime.Now; TimeSpan diff = currentTime.Subtract(time); string formatted; if (diff.Days > 0) { formatted = $"{diff.Days}d "; } else if (diff.Hours > 0) { formatted = $"{diff.Hours}u "; } else if (diff.Minutes > 0) { formatted = $"{diff.Minutes}m "; } else { formatted = "nu"; } entry.transform.Find("Ago").GetComponent().text = formatted; // Alternating colors looks nice if (rank % 2 == 0) { Image image = entry.transform.GetComponent(); image.color = new Color(image.color.r, image.color.g, image.color.b, 0f); } // Make new score stand out if (diff.TotalSeconds < 1) { Image image = entry.transform.GetComponent(); image.color = new Color(247 / 255f, 173 / 255f, 25 / 255f, 1f); entry.transform.Find("PlayerName").GetComponent().color = new Color(5 / 255f, 63 / 255f, 92 / 255f, 1f); entry.transform.Find("Score").GetComponent().color = new Color(5 / 255f, 63 / 255f, 92 / 255f, 1f); entry.transform.Find("Ago").GetComponent().color = new Color(5 / 255f, 63 / 255f, 92 / 255f, 1f); } rank++; } } }