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 static SaveData CreateDefault() { return new SaveData(); } public void EnsureLists() { ownedUnitIds ??= new List(); bannerPoolIds ??= new List(); } } }