using System; using System.Collections.Generic; using System.IO; using UnityEngine; namespace KernelPanic.Meta { /// /// Provides save and load contracts for persistent meta progression. /// public sealed class SaveService { private const string SaveFileName = "kernel-panic-save.json"; public string SavePath => Path.Combine(Application.persistentDataPath, SaveFileName); public void Save(SaveData data) { data ??= new SaveData(); data.EnsureLists(); string directory = Path.GetDirectoryName(SavePath); if (!string.IsNullOrEmpty(directory)) { Directory.CreateDirectory(directory); } string json = JsonUtility.ToJson(data, true); File.WriteAllText(SavePath, json); } public SaveData Load() { if (!File.Exists(SavePath)) { return SaveData.CreateDefault(); } try { SaveData data = JsonUtility.FromJson(File.ReadAllText(SavePath)); data ??= SaveData.CreateDefault(); data.EnsureLists(); return data; } catch (Exception ex) { Debug.LogWarning($"Save file could not be loaded; starting fresh. {ex.Message}"); return SaveData.CreateDefault(); } } } /// /// Stores persistent progression data for serialization. /// [Serializable] public sealed class SaveData { public bool starterChosen; public List ownedUnitIds = new(); public List bannerPoolIds = new(); public List cardLoadouts = new(); public static SaveData CreateDefault() { return new SaveData(); } public void EnsureLists() { ownedUnitIds ??= new List(); bannerPoolIds ??= new List(); cardLoadouts ??= new List(); for (int i = 0; i < cardLoadouts.Count; i++) { cardLoadouts[i] ??= new CardLoadoutSaveEntry(); cardLoadouts[i].EnsureLists(); } } } [Serializable] public sealed class CardLoadoutSaveEntry { public string distroId; public List equippedCardIds = new(); public void EnsureLists() { equippedCardIds ??= new List(); } } }