138 lines
4.5 KiB
C#
138 lines
4.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using TMPro;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
/// <summary>
|
|
/// Abstract class for all minigame-gameEndedPanels
|
|
/// </summary>
|
|
public abstract class AbstractGameEndedPanel : MonoBehaviour
|
|
{
|
|
/// <summary>
|
|
/// The index of minigame that needs a GameEndedPanel
|
|
/// </summary>
|
|
protected abstract MinigameIndex minigameIndex
|
|
{
|
|
get;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Reference to the scoreboard entries container
|
|
/// </summary>
|
|
public Transform scoreboardEntriesContainer;
|
|
|
|
/// <summary>
|
|
/// The GameObjects representing the letters
|
|
/// </summary>
|
|
private List<GameObject> scoreboardEntries = new List<GameObject>();
|
|
|
|
/// <summary>
|
|
/// Reference to the ScoreboardEntry prefab
|
|
/// </summary>
|
|
public GameObject scoreboardEntry;
|
|
|
|
/// <summary>
|
|
/// Sets the scoreboard
|
|
/// </summary>
|
|
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<Tuple<string, Score>> allScores = new List<Tuple<string, Score>>();
|
|
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<Score> scores = progress.highestScores;
|
|
foreach (Score score in scores)
|
|
{
|
|
allScores.Add(new Tuple<string, Score>(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<string, Score> 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<Image>().sprite = UserList.GetUserByUsername(username).GetAvatar();
|
|
|
|
// Set the player name
|
|
entry.transform.Find("PlayerName").GetComponent<TMP_Text>().text = username;
|
|
|
|
// Set the score
|
|
entry.transform.Find("Score").GetComponent<TMP_Text>().text = score.scoreValue.ToString();
|
|
|
|
// Set the rank
|
|
entry.transform.Find("Rank").GetComponent<TMP_Text>().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<TMP_Text>().text = formatted;
|
|
|
|
|
|
// Alternating colors looks nice
|
|
if (rank % 2 == 0)
|
|
{
|
|
Image image = entry.transform.GetComponent<Image>();
|
|
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>();
|
|
image.color = new Color(247 / 255f, 173 / 255f, 25 / 255f, 1f);
|
|
entry.transform.Find("PlayerName").GetComponent<TMP_Text>().color = new Color(5 / 255f, 63 / 255f, 92 / 255f, 1f);
|
|
entry.transform.Find("Score").GetComponent<TMP_Text>().color = new Color(5 / 255f, 63 / 255f, 92 / 255f, 1f);
|
|
entry.transform.Find("Ago").GetComponent<TMP_Text>().color = new Color(5 / 255f, 63 / 255f, 92 / 255f, 1f);
|
|
}
|
|
|
|
rank++;
|
|
}
|
|
}
|
|
}
|