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