Files
unity-application/Assets/Common/Scripts/MinigameActivityScreen.cs
Dries Van Schuylenbergh dfc69ddd76 Resolve WES-99 "Cc refactor"
2023-03-14 10:56:42 +00:00

143 lines
4.3 KiB
C#

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