Files
DeviantMobile-Rohan/Assets/Scripts/Rewards/RewardsManager.cs

207 lines
7.1 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using System;
public class RewardsManager : MonoBehaviour {
public Slider levelBar; //Slider showing the level based on XP
public TMP_Text XP_show; // Reference to the XP TextMeshPro component
public TMP_Text level_value; // Reference to the level TextMeshPro component
public TMP_Text rank_value; // Reference to the rank TextMeshPro component
public TMP_Text rank_level_UI; // Reference to the InputField component
int current_level;
int x_value;
// References to PLAYERPREFS Key for the Player's Rewards Data
private const string player_RewardsData = "Player_RewardsData";
private PlayerData playerData; // List of character information
//Loads and updates XP at component creation.
private void Awake(){
// Load player data and update text field immediately upon component creation
LoadAndUpdateXP();
}
//Loads and updates XP when component becomes enabled.
private void OnEnable(){
// Load player data and update text field when component becomes enabled
LoadAndUpdateXP();
}
//Loads PlayerData and updates the XP text field.
private void LoadAndUpdateXP(){
// Load player data
PlayerData retrieved_playerData = LoadPlayerData();
int player_xp = retrieved_playerData.xp;
if (player_xp < 0){
player_xp = 0;
retrieved_playerData.xp = 0;
SavePlayerData(retrieved_playerData);
}
// Update the text field
UpdateTextMeshProValue(player_xp.ToString());
}
//Initializes PlayerData, sets up UI text, and subscribes to InputField change events.
private void Start(){
// If already there's rewards data saved
if (PlayerPrefs.HasKey(player_RewardsData)){
playerData = LoadPlayerData();
}else{ //no rewards data saved, start somewhere, save and load
playerData = new PlayerData { xp = 0, rank = "Bronze", prevRank = "Bronze", overall_matches = 0, win_streak = 0, loss_streak = 0, overall_wins = 0, overall_losses = 0, rank_level = 1, prevrank_level = 1,
rank_game = 0, eliminations = 0, deaths = 0, revives = 0 };
SavePlayerData(playerData); //Saves the player's mission_progress data
playerData = LoadPlayerData();
}
if (playerData.rank != playerData.prevRank){
Debug.Log("There has been change in the Rank");
}
rank_level_UI.text = "Level " + playerData.rank_level;
rank_value.text = playerData.rank;
}
// Function called whenever the value of the InputField changes
private void UpdateTextMeshProValue(string newValue){
// Update the TextMeshPro text with the new value
if (int.Parse(newValue) != 0){
StartCoroutine(AnimateTextMeshProValue(newValue));
}else{
XP_show.text = newValue;
}
//There is an alternative way of doing this
int intValue = int.Parse(newValue);
// Define level ranges
int[] levelRanges = { 100, 2650, 3900, 4750, 5600, 6350, 7100, 7850, 8150, 8600, 9050, 9500, 9950, 10400, 10850,
11300, 11750, 12200, 12350, 12500, 12650, 12800, 12950, 13100, 13250, 13400, 13550, 13700, 13850, 14000,
14150, 14300, 14450, 14600, 14750, 14900, 15050, 15200, 15350, 15500, 15650, 15800, 15950, 16100, 16250,
16400, 16550, 16700, 16850, 17000, 17150, 17300, 17450, 17600, 17750, 17900, 18000 };
for (int i = 0; i < levelRanges.Length; i++){
if (intValue <= levelRanges[i]){
if (intValue < 100){
current_level = i + 1;
}
// if (intValue == levelRanges[i]){
if (intValue == levelRanges[i]){
current_level = i + 1;
}
if ((intValue != levelRanges[i]) && !(intValue < 100)){
current_level = i;
}
break;
}
}
if (current_level != 1){
//Create animation
StartCoroutine(Animate_LevelValue(current_level.ToString()));
}else{
level_value.text = current_level.ToString();
}
x_value = Mathf.Clamp(current_level, 1, 58);
float normalizedValue = Mathf.Clamp01((float)x_value / 58f);
// Set the normalized value to the Slider
if (current_level != 0){
levelBar.StartCoroutine(AnimateSliderValue(normalizedValue));
}else{
levelBar.value = normalizedValue;
}
}
// Create Slider animation coroutine
private IEnumerator AnimateSliderValue(float targetValue){
float animationDuration = 1.0f; // You can adjust the duration of the animation
float startValue = 0;
for (float t = 0f; t < 1.0f; t += Time.deltaTime / animationDuration)
{
float animatedValue = Mathf.Lerp(startValue, targetValue, t);
levelBar.value = animatedValue;
yield return null;
}
levelBar.value = targetValue;
}
// Create XP text Animation
private IEnumerator AnimateTextMeshProValue(string targetValue){
int targetIntValue = int.Parse(targetValue);
float animationDuration = 1.0f; // You can adjust the duration of the animation
for (float t = 0f; t < 1.0f; t += Time.deltaTime / animationDuration){
int animatedValue = Mathf.RoundToInt(Mathf.Lerp(0, targetIntValue, t));
XP_show.text = animatedValue.ToString();
yield return null;
}
XP_show.text = targetValue;
// The rest of your original code
int intValue = targetIntValue;
int[] levelRanges = { /* your level ranges here */ };
for (int i = 0; i < levelRanges.Length; i++){
// Your existing level calculation logic here
}
level_value.text = current_level.ToString();
}
// Animates changing Level value
private IEnumerator Animate_LevelValue(string targetValue){
int targetIntValue = int.Parse(targetValue);
float animationDuration = 1.0f; // You can adjust the duration of the animation
for (float t = 0f; t < 1.0f; t += Time.deltaTime / animationDuration){
int animatedValue = Mathf.RoundToInt(Mathf.Lerp(0, targetIntValue, t));
level_value.text = animatedValue.ToString();
yield return null;
}
level_value.text = targetValue;
}
// ** PLAYERPREFS used in this script
//Saves PlayerData to PlayerPrefs.
private void SavePlayerData(PlayerData data){
string jsonData = JsonUtility.ToJson(data);
PlayerPrefs.SetString(player_RewardsData, jsonData); // Details stored as "PlayerData"
PlayerPrefs.Save();
}
//Load player data from PlayerPrefs
PlayerData LoadPlayerData(){
string jsonData = PlayerPrefs.GetString(player_RewardsData, "{}"); // Details were stored as "PlayerData"
return JsonUtility.FromJson<PlayerData>(jsonData);
}
}