Files
WordConnect/Assets/WordConnectGameToolkit/Scripts/Popups/Daily/DailyBonus.cs

217 lines
7.0 KiB
C#

// // ©2015 - 2025 Candy Smith
// // All rights reserved
// // Redistribution of this software is strictly not allowed.
// // Copy of this software can be obtained from unity asset store only.
// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
// // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// // THE SOFTWARE.
using System;
using System.Linq;
using UnityEngine;
using WordsToolkit.Scripts.Settings;
namespace WordsToolkit.Scripts.Popups.Daily
{
public class DailyBonus : PopupWithCurrencyLabel
{
[SerializeField]
public DayHandle[] dayHandles;
// Instance of the custom scriptable object that stores daily bonus settings
private DailyBonusSettings settings;
private int rewardStreak;
public DayHandle[] daysPrefabs;
public Transform dayHandlesParent;
private int days;
// This method is automatically called when the script becomes enabled
public void OnEnable()
{
// Load daily bonus settings
settings = LoadSettings("Settings/DailyBonusSettings");
days = settings.rewards.Length;
// Update the reward streak count and store it
rewardStreak = UpdateRewardStreak();
// Update each day handle based on the current reward streak
UpdateDayHandles(rewardStreak);
}
// Loads and returns daily bonus settings stored at the specified path
public DailyBonusSettings LoadSettings(string path)
{
return Resources.Load<DailyBonusSettings>(path);
}
// Checks the last reward date and the current date
// to determine and update the reward streak
public int UpdateRewardStreak()
{
var today = DateTime.Today;
var lastRewardDate = DateTime.Parse(PlayerPrefs.GetString("DailyBonusDay", today.Subtract(TimeSpan.FromDays(1)).ToString()));
if (today > lastRewardDate)
{
var rewardStreak = GetRewardStreak() + 1;
PlayerPrefs.SetString("DailyBonusDay", today.ToString());
PlayerPrefs.SetInt("RewardStreak", rewardStreak = (int)Mathf.Repeat(rewardStreak, dayHandles.Length));
return rewardStreak;
}
return GetRewardStreak();
}
// Updates the status of each day handle in the scene
// according to the current reward streak
public void UpdateDayHandles(int rewardStreak)
{
dayHandles = new DayHandle[days];
for (var i = 0; i < days; i++)
{
var status = i < rewardStreak ? EDailyStatus.passed : i == rewardStreak ? EDailyStatus.current : EDailyStatus.locked;
var dayHandle = Instantiate(daysPrefabs[(int)status], dayHandlesParent);
dayHandles[i] = dayHandle;
dayHandle.name = $"Day_{i + 1}";
dayHandle.SetDay(i + 1, settings.rewards[i]);
// Set status after setting the day to ensure proper icon display
dayHandle.SetStatus(status);
}
}
// Gets and returns the reward streak count from player preferences
public int GetRewardStreak()
{
return PlayerPrefs.GetInt("RewardStreak", -1);
}
public override void Close()
{
StopInteration();
closeButton.interactable = false;
var resource = dayHandles[rewardStreak].RewardData.resource;
var dayHandle = dayHandles.First(i => i.DailyStatus == EDailyStatus.current);
resource.AddAnimated(dayHandles[rewardStreak].RewardData.count, dayHandle.transform.position, animationSourceObject: null, callback: () =>
{
base.Close();
});
}
#if UNITY_EDITOR
[ContextMenu("Test - Reset Daily Bonus")]
private void TestResetDailyBonus()
{
CleanupDayHandles();
PlayerPrefs.DeleteKey("DailyBonusDay");
PlayerPrefs.DeleteKey("RewardStreak");
Debug.Log("Daily bonus data reset!");
if (Application.isPlaying)
{
OnEnable();
}
}
[ContextMenu("Test - Set Day 1")]
private void TestSetDay1()
{
SetTestDay(0);
}
[ContextMenu("Test - Set Day 2")]
private void TestSetDay2()
{
SetTestDay(1);
}
[ContextMenu("Test - Set Day 3")]
private void TestSetDay3()
{
SetTestDay(2);
}
[ContextMenu("Test - Set Day 4")]
private void TestSetDay4()
{
SetTestDay(3);
}
[ContextMenu("Test - Set Day 5")]
private void TestSetDay5()
{
SetTestDay(4);
}
[ContextMenu("Test - Set Day 6")]
private void TestSetDay6()
{
SetTestDay(5);
}
[ContextMenu("Test - Set Day 7")]
private void TestSetDay7()
{
SetTestDay(6);
}
private void SetTestDay(int day)
{
if (settings == null)
{
settings = LoadSettings("Settings/DailyBonusSettings");
}
if (settings != null && day < settings.rewards.Length)
{
// Clean up existing day handles before setting new ones
CleanupDayHandles();
PlayerPrefs.SetInt("RewardStreak", day);
PlayerPrefs.SetString("DailyBonusDay", DateTime.Today.ToString());
Debug.Log($"Set daily bonus to day {day + 1}");
if (Application.isPlaying)
{
OnEnable();
}
}
else
{
Debug.LogWarning($"Cannot set day {day + 1}. Settings not found or day out of range.");
}
}
private void CleanupDayHandles()
{
if (dayHandles != null)
{
for (int i = 0; i < dayHandles.Length; i++)
{
if (dayHandles[i] != null)
{
if (Application.isPlaying)
{
Destroy(dayHandles[i].gameObject);
}
else
{
DestroyImmediate(dayHandles[i].gameObject);
}
}
}
dayHandles = null;
}
}
#endif
}
}