using System.Collections.Generic; using System.Linq; using InterfaceOff.MainMenu; using UnityEngine; using UnityEngine.UI; namespace InterfaceOff.WorldScene { [System.Serializable] public struct PlayerScore { public string PlayerName; public float Score; } public class ScoreTracker : MonoBehaviour { [field: SerializeField] private bool GameAngliaVersion { get; set; } [field: SerializeField] private Text ScoreText { get; set; } [field: SerializeField] private Text FinalScoreText { get; set; } [field: SerializeField] private WindowSpawner Spawner { get; set; } [field: SerializeField] private GameObject LeaderboardObject { get; set; } [field: SerializeField] private GameObject LeaderboardEntryPrefab { get; set; } [field: SerializeField] private InputField PlayerTextNameInput { get; set; } [field: SerializeField] private Button IDRKWhatToCallThis { get; set; } private static List PlayerScores { get; } = new(); private static ScoreTracker Instance { get; set; } private string CurrentPlayerName { get; set; } = string.Empty; private bool StoredCurrentScore = false; private float Score; public static float CurrentScore() { if (DebugUtils.IsNull(Instance)) { return 0; } return Instance.Score; } private void RepaintLeaderboard() { foreach (Transform child in LeaderboardObject.transform) { Destroy(child.gameObject); } PlayerScore[] scores = PlayerScores .OrderByDescending(playerScore => playerScore.Score) .Take(10) .ToArray(); for (int idx = 0; idx < scores.Length; idx++) { GameObject go = Instantiate(LeaderboardEntryPrefab, LeaderboardObject.transform); RectTransform rect = go.GetComponent(); Text entryText = go.GetComponent(); entryText.text = $"[{scores[idx].PlayerName}] - {scores[idx].Score}"; rect.anchoredPosition = new Vector2(0, 220 - ((idx + 1) * 40)); } } private void Awake() { RepaintLeaderboard(); Instance = this; } private void Update() { if (Spawner.AutoSpawn) { StoredCurrentScore = false; Score = Time.timeSinceLevelLoad * DifficultyManager.DifficultyEffect; ScoreText.text = $"Score: {Score:F1}"; } else { FinalScoreText.text = $"Your final score is: {Score:F1}"; ScoreText.text = null; } } public void AddCurrentScoreToLeaderboard() { if (CurrentPlayerName != string.Empty && !StoredCurrentScore) { PlayerScore score = new(); score.PlayerName = CurrentPlayerName; score.Score = CurrentScore(); StoredCurrentScore = true; PlayerScores.Add(score); RepaintLeaderboard(); PlayerTextNameInput.interactable = false; IDRKWhatToCallThis.interactable = false; Debug.Log($"Added score [{score.PlayerName} | {score.Score:F1}]"); } } public void SetPlayerName(string input) => CurrentPlayerName = input; } }