Files
2026-10-16 23:33:13 -07:00

68 lines
2.1 KiB
C#

using System.Globalization;
using RadicadeServer.RecNet.Enums.Store;
namespace RadicadeServer.Utils
{
public sealed class RewardDayLedger
{
public string Day { get; set; } = string.Empty;
public bool FirstActivityPaid { get; set; }
public bool DailyChallengePaid { get; set; }
public int ActivityBoxes { get; set; }
}
public static class RewardDay
{
public const int ActivityBoxesPerDay = 12;
public const int BoxesPerDay = 1 + 1 + ActivityBoxesPerDay;
public static string DayKey(DateTime nowUtc) =>
nowUtc.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
public static RewardDayLedger For(RecNet.Progression.ProgressionJson json, DateTime nowUtc)
{
var day = DayKey(nowUtc);
var ledger = json.RewardDay;
if (ledger == null || !string.Equals(ledger.Day, day, StringComparison.Ordinal))
{
ledger = new RewardDayLedger { Day = day };
json.RewardDay = ledger;
}
return ledger;
}
public static RewardType CompletionType(RewardDayLedger ledger, RewardType claimed)
{
if (claimed == RewardType.PostQuestActivity) return RewardType.PostQuestActivity;
return ledger.FirstActivityPaid ? RewardType.PostGameActivity : RewardType.FirstActivityOfDay;
}
public static bool TryTakeFirstActivity(RewardDayLedger ledger)
{
if (ledger.FirstActivityPaid) return false;
ledger.FirstActivityPaid = true;
return true;
}
public static bool TryTakeActivityBox(RewardDayLedger ledger)
{
if (ledger.ActivityBoxes >= ActivityBoxesPerDay) return false;
ledger.ActivityBoxes++;
return true;
}
public static bool TryTakeDailyChallengeBox(RewardDayLedger ledger)
{
if (ledger.DailyChallengePaid) return false;
ledger.DailyChallengePaid = true;
return true;
}
public static RewardDayLedger NewDay(DateTime nowUtc) => new() { Day = DayKey(nowUtc) };
}
}