using System.Collections.Generic;
public static class GameDataManager
private static string saveFile = Application.persistentDataPath + $"/mycogamedata.json";
private static SaveGameData saveGameData = new();
public static bool Save()
saveGameData = new SaveGameData
CurrentScene = StaticGameData.Scene.ToString(),
CurrentPosition = StaticGameData.Position,
CurrentRotation = StaticGameData.Rotation,
Characters = new List<CharacterSaveGameData>(),
ActivePartyMembers = new List<string>(),
foreach (var (_, Value) in StaticGameData.Characters)
CharacterSaveGameData character = new(Value.Name, Value.Health, Value.WeaponPoints, Value.MagicPoints,
Value.Strength, Value.Dexterity, Value.Intelligence, Value.Willpower, Value.Vitality, Value.Fortitude);
foreach (var ability in Value.Abilities)
character.Abilities.Add(ability.abilityName);
saveGameData.Characters.Add(character);
foreach (var character in StaticGameData.ActiveParty)
saveGameData.ActivePartyMembers.Add(character.Name);
foreach (string name in Enum.GetNames(typeof(FlagsEnum)))
saveGameData.Flags.Add(new Flag(name, false));
foreach (var (Name, Value) in StaticGameData.Flags)
saveGameData.Flags.Find(c => c.Name == Name).Value = Value;
public static bool Load()
var abilitiesArray = Resources.LoadAll<AbilityScriptableObject>("All Abilities");
foreach (var item in abilitiesArray)
StaticGameData.Abilities.Add(item.name, item);
if (Enum.TryParse(saveGameData.CurrentScene, out SceneEnum scene))
StaticGameData.Scene = scene;
Debug.Log("Error parsing saved Scene Enum");
StaticGameData.Position = saveGameData.CurrentPosition;
StaticGameData.Rotation = saveGameData.CurrentRotation;
StaticGameData.Characters.Clear();
for (int i = 0; i < saveGameData.Characters.Count; i++)
var ch = saveGameData.Characters[i];
PlayerCharacter character = new(ch.Name, ch.Health, ch.WeaponPoints, ch.MagicPoints, ch.Strength,
ch.Dexterity, ch.Intelligence, ch.Willpower, ch.Vitality, ch.Fortitude);
foreach (var name in ch.Abilities)
character.Abilities.Add(StaticGameData.Abilities[name]);
StaticGameData.Characters.Add(ch.Name, character);
StaticGameData.ActiveParty.Clear();
foreach (var character in saveGameData.ActivePartyMembers)
StaticGameData.ActiveParty.Add(StaticGameData.Characters[character]);
if (!StaticGameData.ActiveParty.Any(c => c.Name == "Myco"))
StaticGameData.ActiveParty.Add(StaticGameData.Characters["Myco"]);
foreach (string name in Enum.GetNames(typeof(FlagsEnum)))
if (!StaticGameData.Flags.ContainsKey(name))
StaticGameData.Flags.Add(name, false);
StaticGameData.Flags.Clear();
for (int i = 0; i < saveGameData.Flags.Count; i++)
var fl = saveGameData.Flags[i];
if (StaticGameData.Flags.ContainsKey(fl.Name))
StaticGameData.Flags[fl.Name] = fl.Value;
StaticGameData.Flags.Add(fl.Name, fl.Value);
public static void ResetSave()
if (File.Exists(saveFile))
StaticGameData.LastEncounterName = "";
StaticGameData.Abilities.Clear();
private static void FirstTimeSaveCreation()
StaticGameData.Scene = SceneEnum.HerzstadtVillage;
StaticGameData.Position = new Vector3(-45f, 0f, -45f);
StaticGameData.Rotation = Quaternion.Euler(0f, -135f, 0f);
StaticGameData.Characters.Clear();
PlayerCharacter myco = new("Myco", 300, 10, 10, 8, 10, 12, 10, 12, 12);
myco.Abilities.Add(StaticGameData.Abilities["Strike Tone"]);
myco.Abilities.Add(StaticGameData.Abilities["Resonance"]);
myco.Abilities.Add(StaticGameData.Abilities["Restore Spore"]);
StaticGameData.Characters.Add("Myco", myco);
PlayerCharacter condy = new("Condy", 375, 10, 10, 12, 10, 10, 12, 14, 15);
condy.Abilities.Add(StaticGameData.Abilities["Spade Spear"]);
condy.Abilities.Add(StaticGameData.Abilities["Quarry Break"]);
condy.Abilities.Add(StaticGameData.Abilities["Mineral Mail"]);
StaticGameData.Characters.Add("Condy", condy);
PlayerCharacter thysa = new("Thysa", 275, 10, 10, 10, 15, 10, 13, 12, 10);
thysa.Abilities.Add(StaticGameData.Abilities["Soul Saber"]);
thysa.Abilities.Add(StaticGameData.Abilities["Phototaxis"]);
thysa.Abilities.Add(StaticGameData.Abilities["Soul Dance"]);
StaticGameData.Characters.Add("Thysa", thysa);
PlayerCharacter lago = new("Lago", 350, 10, 10, 15, 12, 8, 10, 12, 12);
lago.Abilities.Add(StaticGameData.Abilities["Krumphau"]);
lago.Abilities.Add(StaticGameData.Abilities["Ignis Ensis"]);
lago.Abilities.Add(StaticGameData.Abilities["Arbor Rampart"]);
StaticGameData.Characters.Add("Lago", lago);
StaticGameData.ActiveParty.Clear();
StaticGameData.ActiveParty.Add(myco);
StaticGameData.Flags.Clear();
private static bool ReadFile()
if (File.Exists(saveFile))
string fileContents = File.ReadAllText(saveFile);
saveGameData = JsonConvert.DeserializeObject<SaveGameData>(fileContents);
Debug.Log($"{saveFile} does not exist, creating default file");
private static bool WriteFile()
string jsonString = JsonConvert.SerializeObject(saveGameData, Formatting.Indented, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore });
File.WriteAllText(saveFile, jsonString);
Debug.Log(ex.ToString());