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