108 lines
3.0 KiB
C#
108 lines
3.0 KiB
C#
using System;
|
|
using System.Text;
|
|
using TMPro;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
|
|
namespace Watermelon
|
|
{
|
|
public sealed class TimerRewardsHolder : RewardsHolder
|
|
{
|
|
private const string DEFAULT_BUTTON_TEXT = "FREE";
|
|
private const float MINIMUM_BUTTON_WIDTH = 270f;
|
|
|
|
[Group("Settings")]
|
|
[SerializeField] string saveID = "";
|
|
|
|
[Group("Settings"), Space]
|
|
[SerializeField] Button button;
|
|
|
|
[Group("Settings")]
|
|
[SerializeField] TMP_Text timerText;
|
|
[Group("Settings")]
|
|
[SerializeField] int timerDurationInMinutes;
|
|
|
|
private SimpleLongSave save;
|
|
private DateTime timerStartTime;
|
|
|
|
private StringBuilder sb;
|
|
|
|
private void Start()
|
|
{
|
|
if (string.IsNullOrEmpty(saveID))
|
|
{
|
|
Debug.LogError($"[TimerRewardsHolder] saveID is empty on '{gameObject.name}'. Assign a unique ID in the Inspector.", gameObject);
|
|
return;
|
|
}
|
|
|
|
InitializeComponents();
|
|
|
|
save = SaveController.GetSaveObject<SimpleLongSave>($"TimerProduct_{saveID}");
|
|
|
|
timerStartTime = DateTime.FromBinary(save.Value);
|
|
|
|
sb = new StringBuilder();
|
|
|
|
button.onClick.AddListener(OnButtonClicked);
|
|
}
|
|
|
|
private string FormatTimer(TimeSpan timeSpan)
|
|
{
|
|
sb.Clear();
|
|
|
|
if (timeSpan.Hours > 0)
|
|
{
|
|
sb.Append(timeSpan.Hours);
|
|
sb.Append(':');
|
|
}
|
|
|
|
sb.Append(timeSpan.Minutes.ToString("00"));
|
|
sb.Append(':');
|
|
sb.Append(timeSpan.Seconds.ToString("00"));
|
|
|
|
return sb.ToString();
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
TimeSpan timer = DateTime.Now - timerStartTime;
|
|
TimeSpan duration = TimeSpan.FromMinutes(timerDurationInMinutes);
|
|
|
|
if (timer > duration)
|
|
{
|
|
button.enabled = true;
|
|
timerText.text = DEFAULT_BUTTON_TEXT;
|
|
}
|
|
else
|
|
{
|
|
button.enabled = false;
|
|
timerText.text = FormatTimer(duration - timer);
|
|
|
|
float preferredWidth = timerText.preferredWidth;
|
|
if (preferredWidth < MINIMUM_BUTTON_WIDTH) preferredWidth = MINIMUM_BUTTON_WIDTH;
|
|
|
|
timerText.rectTransform.sizeDelta = timerText.rectTransform.sizeDelta.SetX(preferredWidth + 5);
|
|
button.image.rectTransform.sizeDelta = button.image.rectTransform.sizeDelta.SetX(preferredWidth + 10);
|
|
}
|
|
}
|
|
|
|
public bool IsAvailable()
|
|
{
|
|
TimeSpan timer = DateTime.Now - timerStartTime;
|
|
TimeSpan duration = TimeSpan.FromMinutes(timerDurationInMinutes);
|
|
|
|
return timer > duration;
|
|
}
|
|
|
|
private void OnButtonClicked()
|
|
{
|
|
save.Value = DateTime.Now.ToBinary();
|
|
timerStartTime = DateTime.Now;
|
|
|
|
rewardSet.ApplyReward();
|
|
|
|
SaveController.MarkAsSaveIsRequired();
|
|
}
|
|
}
|
|
}
|