using System; using System.Collections.Generic; using System.Linq; using TMPro; using UnityEngine; using UnityEngine.UI; /// /// Manager infopage for the Minigames /// public class MinigameActivityScreen : MonoBehaviour { /// /// Reference to the Minigames /// public MinigameList minigameList; /// /// Title Display /// public TMP_Text title; /// /// Description Display /// public TMP_Text description; /// /// Image Display (Thumbnail) /// public Image gameImage; /// /// PlayButton to get to the Minigame /// public Button button; /// /// Control explanation for the Display /// public TMP_Text controls; /// /// Reference to the Minigame progress /// private PersistentDataController.SavedMinigameProgress progress; /// /// Reference to the users-high-scores container object /// public Transform userContainer; /// /// Prefab for the high-score-entries /// public GameObject prefab; /// /// Reference to the ranking title /// public GameObject rankingTitle; /// /// Sets the infopage for a given minigame /// void Start() { PersistentDataController.GetInstance().Load(); GenerateContent(); GenerateHighScores(); } /// /// Generates all content except for the HighScores /// private void GenerateContent() { // Get current minigame int index = minigameList.currentMinigameIndex; Minigame minigame = minigameList.minigames[index]; // Set main screen title.text = minigame.title; description.text = minigame.description; gameImage.sprite = minigame.thumbnail; controls.text = minigame.controls; // Add click if (minigame.themeList != null) { button.onClick.AddListener(() => SystemController.GetInstance().LoadNextScene("Common/Scenes/ThemeSelectionScreen")); } else { button.onClick.AddListener(() => SystemController.GetInstance().LoadNextScene(minigame.minigameEntryPoint)); } } /// /// Sets the High Scores (Top 3) /// /// /// TODO: Maybe write a getter for the sorted scores as this is just a copy of the logic implemented in SpellingBee/.../GameController /// private void GenerateHighScores() { // Get current minigame int index = minigameList.currentMinigameIndex; Minigame minigame = minigameList.minigames[index]; List> allScores = new List>(); foreach (User user in UserList.GetUsers()) { // Get user's progress for this minigame progress = user.GetMinigameProgress(minigame.index); if (progress != null) { // Add scores to dictionary List scores = progress.highestScores; foreach (Score score in scores) { allScores.Add(new Tuple(user.GetUsername(), user.GetAvatar(), score)); } } } rankingTitle.SetActive(allScores.Count > 0); // Sort allScores based on Score.scoreValue allScores.Sort((a, b) => b.Item3.scoreValue.CompareTo(a.Item3.scoreValue)); // Instantiate scoreboard entries foreach (Tuple tup in allScores.Take(3)) { string username = tup.Item1; Sprite sprite = tup.Item2; Score score = tup.Item3; GameObject instance = GameObject.Instantiate(prefab, userContainer); instance.transform.Find("Title").GetComponent().text = username; instance.transform.Find("Avatar").GetComponent().sprite = sprite; instance.transform.Find("Score").GetComponent().text = score.scoreValue.ToString(); } } }