using System.Collections; using TMPro; using UnityEngine; using UnityEngine.UI; namespace BulletHellTemplate { public class CurrencyDisplay : MonoBehaviour { [Header("Currency Settings")] public string currencyID; public TextMeshProUGUI currencyAmount; public Image currencyIcon; [Header("Recharge UI (only used if isRechargeable is true)")] public bool isRechargeable; public TextMeshProUGUI rechargeAmount; public TextMeshProUGUI nextRechargeTime; private Currency _currencyData; private float timeLeftForNextCharge = 0f; private bool isAtMax = false; private void OnEnable() { MonetizationManager.OnCurrencyChanged += UpdateCurrencyDisplay; ForceUpdateCurrency(); } private void OnDisable() { MonetizationManager.OnCurrencyChanged -= UpdateCurrencyDisplay; } private void Start() { StartCoroutine(InitializeCurrencyDisplay()); } private IEnumerator InitializeCurrencyDisplay() { while (MonetizationManager.Singleton == null) yield return null; foreach (Currency item in MonetizationManager.Singleton.currencies) { if (item != null && item.coinID == currencyID) { _currencyData = item; break; } } if (_currencyData != null && currencyIcon != null) currencyIcon.sprite = _currencyData.icon; ForceUpdateCurrency(); if (isRechargeable && _currencyData != null && _currencyData.isRechargeableCurrency) { float chunkDuration = GetSecondsByScale(_currencyData.rechargeableTime, _currencyData.rechargeableTimeScale); int current = MonetizationManager.GetCurrency(currencyID); if (_currencyData.useMaxAmount && current >= _currencyData.maxAmount && !_currencyData.canExceedMaxValue) { timeLeftForNextCharge = 0; isAtMax = true; } else { timeLeftForNextCharge = chunkDuration; isAtMax = false; } } UpdateRechargeUI(true); } private void Update() { if (!isRechargeable || _currencyData == null || !_currencyData.isRechargeableCurrency) return; if (isAtMax) return; timeLeftForNextCharge -= Time.deltaTime; if (timeLeftForNextCharge <= 0f) { bool reachedMax = RechargeablesManager.Singleton.ApplyAllPendingCharges(_currencyData); ForceUpdateCurrency(); if (reachedMax) { isAtMax = true; timeLeftForNextCharge = 0f; } else { float chunkDuration = GetSecondsByScale(_currencyData.rechargeableTime, _currencyData.rechargeableTimeScale); timeLeftForNextCharge = chunkDuration; } } UpdateRechargeUI(); } public void ForceUpdateCurrency() { UpdateCurrencyDisplay(currencyID, MonetizationManager.GetCurrency(currencyID)); } private void UpdateCurrencyDisplay(string changedCurrency, int amount) { if (changedCurrency == currencyID && currencyAmount != null) currencyAmount.text = amount.ToString(); } private void UpdateRechargeUI(bool forceShow = false) { if (_currencyData == null || !_currencyData.isRechargeableCurrency || !isRechargeable) { if (rechargeAmount) rechargeAmount.gameObject.SetActive(false); if (nextRechargeTime) nextRechargeTime.gameObject.SetActive(false); return; } if (rechargeAmount) rechargeAmount.gameObject.SetActive(true); if (nextRechargeTime) nextRechargeTime.gameObject.SetActive(true); int current = MonetizationManager.GetCurrency(currencyID); if (_currencyData.useMaxAmount && current >= _currencyData.maxAmount && !_currencyData.canExceedMaxValue) { if (rechargeAmount) rechargeAmount.text = ""; if (nextRechargeTime) nextRechargeTime.text = ""; return; } else { if (rechargeAmount) rechargeAmount.text = $"+{_currencyData.rechargeAmount}"; } if (nextRechargeTime) { if (timeLeftForNextCharge <= 0) nextRechargeTime.text = "0s"; else nextRechargeTime.text = $"{Mathf.CeilToInt(timeLeftForNextCharge)}s"; } } private float GetSecondsByScale(float timeValue, rechargeableTimeScale scale) { switch (scale) { case rechargeableTimeScale.Seconds: return timeValue; case rechargeableTimeScale.Minutes: return timeValue * 60f; case rechargeableTimeScale.Hours: return timeValue * 3600f; default: return timeValue; } } } }