using System.Collections.Generic; using System.Linq; using UnityEngine; namespace BulletHellTemplate { /// /// Handles saving and loading of purchased items data using PlayerPrefs. /// This class does not apply any logic or validation. Only persists data. /// public static partial class PlayerSave { private static List purchasedCharacters = new(); private static List purchasedIcons = new(); private static List purchasedFrames = new(); private static List purchasedShopItems = new(); private static List purchasedInventoryItems = new(); private const string KeyCharacters = "PurchasedCharacters"; private const string KeyIcons = "PurchasedIcons"; private const string KeyFrames = "PurchasedFrames"; private const string KeyShopItems = "PurchasedShopItems"; private const string KeyInventoryItems = "PurchasedInventoryItems"; /// /// Loads all purchased items from PlayerPrefs into memory. /// public static void LoadAllPurchased() { purchasedCharacters = LoadList(KeyCharacters)?.purchasedCharacters ?? new(); purchasedIcons = LoadList(KeyIcons)?.purchasedIcons ?? new(); purchasedFrames = LoadList(KeyFrames)?.purchasedFrames ?? new(); purchasedShopItems = LoadList(KeyShopItems)?.purchasedShopItems ?? new(); purchasedInventoryItems = LoadList(KeyInventoryItems)?.purchasedInventoryItems ?? new(); } /// /// Saves all purchased items to PlayerPrefs. /// public static void SaveAllPurchased() { SaveList(KeyCharacters, new PurchasedCharacterList(purchasedCharacters)); SaveList(KeyIcons, new PurchasedIconList(purchasedIcons)); SaveList(KeyFrames, new PurchasedFrameList(purchasedFrames)); SaveList(KeyShopItems, new PurchasedShopItemList(purchasedShopItems)); SaveList(KeyInventoryItems, new PurchasedInventoryItemList(purchasedInventoryItems)); PlayerPrefs.Save(); } public static void ClearAllPurchased() { purchasedCharacters.Clear(); purchasedIcons.Clear(); purchasedFrames.Clear(); purchasedShopItems.Clear(); purchasedInventoryItems.Clear(); } // Setters – used only by logic handlers like OfflinePurchasesHandler public static void SetCharacters(List list) => purchasedCharacters = list; public static void SetIcons(List list) => purchasedIcons = list; public static void SetFrames(List list) => purchasedFrames = list; public static void SetShopItems(List list) => purchasedShopItems = list; public static void SetInventoryItems(List list) => purchasedInventoryItems = list; // Adders – for appending from external logic (not validated here) public static void AddCharacter(PurchasedCharacter c) { purchasedCharacters.Add(c); SaveAllPurchased(); } public static void AddIcon(PurchasedIcon i) { purchasedIcons.Add(i); SaveAllPurchased(); } public static void AddFrame(PurchasedFrame f) { purchasedFrames.Add(f); SaveAllPurchased(); } public static void AddShopItem(PurchasedShopItem s) { purchasedShopItems.Add(s); SaveAllPurchased(); } public static void AddInventoryItem(PurchasedInventoryItem i) { purchasedInventoryItems.Add(i); SaveAllPurchased(); } // Getters public static List GetCharacters() => new(purchasedCharacters); public static List GetIcons() => new(purchasedIcons); public static List GetFrames() => new(purchasedFrames); public static List GetShopItems() => new(purchasedShopItems); public static List GetInventoryItems() => new(purchasedInventoryItems); // Checkers public static bool IsCharacterPurchased(string id) => purchasedCharacters.Any(c => c.characterId == id); public static bool IsIconPurchased(string id) => purchasedIcons.Any(i => i.iconId == id); public static bool IsFramePurchased(string id) => purchasedFrames.Any(f => f.frameId == id); public static bool IsShopItemPurchased(string id) => purchasedShopItems.Any(s => s.itemId == id); public static bool IsInventoryItemPurchased(string id) => purchasedInventoryItems.Any(i => i.itemId == id); // Internal JSON helpers private static T LoadList(string key) where T : class { var json = PlayerPrefs.GetString(key, null); return string.IsNullOrEmpty(json) ? null : JsonUtility.FromJson(json); } private static void SaveList(string key, T list) { string json = JsonUtility.ToJson(list); PlayerPrefs.SetString(key, json); } public static void WipePurchasedCache() { PlayerPrefs.DeleteKey("PurchasedCharacters"); PlayerPrefs.DeleteKey("PurchasedIcons"); PlayerPrefs.DeleteKey("PurchasedFrames"); PlayerPrefs.DeleteKey("PurchasedShopItems"); PlayerPrefs.DeleteKey("PurchasedInventoryItems"); ClearAllPurchased(); PlayerPrefs.Save(); } } }