using System; using System.Collections.Generic; using System.IO; using System.Numerics; using System.Text; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using UnityEngine; public class BazookaManager : MonoBehaviour { public static BazookaManager Instance; private bool firstLoadDone = false; public JObject saveFile = new() { ["version"] = "1" }; public List iconCache = new(); void Awake() { if (Instance == null) { Instance = this; DontDestroyOnLoad(gameObject); if (!firstLoadDone) { try { var oldSave = Path.Join(Application.persistentDataPath, OldSavefileEncryption.BAZOOKA_MANAGER_FILE_KEY + ".dat"); var newSave = Path.Join(Application.persistentDataPath, "savefile.json"); if (File.Exists(oldSave) && !File.Exists(newSave)) { File.WriteAllBytes(newSave, Encoding.UTF8.GetBytes(OldSavefileEncryption.DecryptRaw(File.ReadAllBytes(oldSave)))); File.Delete(oldSave); } } catch { } firstLoadDone = true; var save = LoadObject("savefile"); var cache = LoadArray("cache"); if (save != null) { if (save["version"] != null && (save["version"].ToString() == "0" || save["version"].ToString() == "1")) { saveFile = save; if (saveFile["version"].ToString() == "0") { if (saveFile["bird"]["customIcon"]["data"] != null) { var data = saveFile["bird"]["customIcon"]["data"]; var customData = GetCustomBirdIconData(); saveFile["bird"]["customIcon"]["data"].Parent.Remove(); foreach (var icon in data) if (icon["uuid"].ToString() != null) customData.Purchased.Add(icon["uuid"].ToString()); SetCustomBirdIconData(customData); } saveFile["version"] = "1"; Save("savefile", saveFile); } } } if (cache != null) { var tempIconCache = cache.ToObject>() ?? new List(); foreach (var icon in tempIconCache) { iconCache.Add(new MarketplaceIcon { Data = icon.Data.Substring(0, icon.Data.Length - 128), ID = icon.ID }); } } } } else { Destroy(gameObject); } } void OnApplicationQuit() { Save("savefile", saveFile); var cacheIcons = new JArray(); foreach (var icon in iconCache) cacheIcons.Add(new JObject { ["data"] = icon.Data + Tools.Sha512Sum(Convert.FromBase64String(icon.Data)), ["id"] = icon.ID }); Save("cache", cacheIcons); } void OnApplicationPause(bool pause) { if (pause) { Save("savefile", saveFile); var cacheIcons = new JArray(); foreach (var icon in iconCache) cacheIcons.Add(new JObject { ["data"] = icon.Data + Tools.Sha512Sum(Convert.FromBase64String(icon.Data)), ["id"] = icon.ID }); Save("cache", cacheIcons); } } public JObject LoadObject(string saveName) { string path = Path.Join(Application.persistentDataPath, saveName + ".json"); if (!File.Exists(path)) { return null; } else { try { var tempSaveFile = JObject.Parse(File.ReadAllText(path)); if (tempSaveFile != null) return tempSaveFile; } catch (Exception e) { Debug.LogWarning("Failed to load save file: " + e); } } return null; } public JArray LoadArray(string saveName) { string path = Path.Join(Application.persistentDataPath, saveName + ".json"); if (!File.Exists(path)) { return null; } else { try { var tempSaveFile = JArray.Parse(File.ReadAllText(path)); if (tempSaveFile != null) return tempSaveFile; } catch (Exception e) { Debug.LogWarning("Failed to load save file: " + e); } } return null; } public void Save(string saveName, JObject save) { string path = Path.Join(Application.persistentDataPath, saveName + ".json"); var encoded = Encoding.UTF8.GetBytes(save.ToString(Formatting.Indented)); if (encoded == null) return; using var fileStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None); fileStream.Write(encoded, 0, encoded.Length); fileStream.Flush(true); } public void Save(string saveName, JArray save) { string path = Path.Join(Application.persistentDataPath, saveName + ".json"); var encoded = Encoding.UTF8.GetBytes(save.ToString(Formatting.Indented)); if (encoded == null) return; using var fileStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None); fileStream.Write(encoded, 0, encoded.Length); fileStream.Flush(true); } public void ResetSave() { saveFile = new JObject { ["version"] = "1" }; Save("savefile", saveFile); } //Random stuff public void SetLikedPosts(JArray value) { saveFile["likedPosts"] = value; } public JArray GetLikedPosts() { if (saveFile["likedPosts"] == null) return new JArray(); return JArray.Parse(saveFile["likedPosts"].ToString()); } //Bird stuff public void SetBirdIcon(int value) { if (saveFile["bird"] == null) saveFile["bird"] = new JObject(); saveFile["bird"]["icon"] = value; } public void UnsetBirdIcon() { if (saveFile["bird"] == null) return; if (saveFile["bird"]["icon"] == null) return; (saveFile["bird"] as JObject)?.Remove("icon"); } public int GetBirdIcon() { if (saveFile["bird"] == null) return 1; if (saveFile["bird"]["icon"] == null) return 1; return int.Parse(saveFile["bird"]["icon"].ToString()); } public void SetBirdOverlay(int value) { if (saveFile["bird"] == null) saveFile["bird"] = new JObject(); saveFile["bird"]["overlay"] = value; } public void UnsetBirdOverlay() { if (saveFile["bird"] == null) return; if (saveFile["bird"]["overlay"] == null) return; (saveFile["bird"] as JObject)?.Remove("overlay"); } public int GetBirdOverlay() { if (saveFile["bird"] == null) return 0; if (saveFile["bird"]["overlay"] == null) return 0; return int.Parse(saveFile["bird"]["overlay"].ToString()); } public void SetCustomBirdIconData(MarketplaceIconStorageType value) { if (saveFile["bird"] == null) saveFile["bird"] = new JObject(); saveFile["bird"]["customIcon"] = JObject.FromObject(value); } public void UnsetCustomBirdIconData() { if (saveFile["bird"] == null) return; if (saveFile["bird"]["customIcon"] == null) return; (saveFile["bird"] as JObject)?.Remove("customIcon"); } public MarketplaceIconStorageType GetCustomBirdIconData() { if (saveFile["bird"] == null) return new(); if (saveFile["bird"]["customIcon"] == null) return new(); return saveFile["bird"]["customIcon"].ToObject(); } //Settings stuff public void SetSettingFullScreen(bool value) { if (saveFile["settings"] == null) saveFile["settings"] = new JObject(); saveFile["settings"]["fullScreen"] = value; } public bool GetSettingFullScreen() { if (saveFile["settings"] == null) return true; if (saveFile["settings"]["fullScreen"] == null) return true; return bool.Parse(saveFile["settings"]["fullScreen"].ToString()); } public void SetSettingShowFPS(bool value) { if (saveFile["settings"] == null) saveFile["settings"] = new JObject(); saveFile["settings"]["showFps"] = value; } public bool GetSettingShowFPS() { if (saveFile["settings"] == null) return false; if (saveFile["settings"]["showFps"] == null) return false; return bool.Parse(saveFile["settings"]["showFps"].ToString()); } public void SetSettingVsync(bool value) { if (saveFile["settings"] == null) saveFile["settings"] = new JObject(); saveFile["settings"]["vsync"] = value; } public bool GetSettingVsync() { if (saveFile["settings"] == null) return true; if (saveFile["settings"]["vsync"] == null) return true; return bool.Parse(saveFile["settings"]["vsync"].ToString()); } public void SetSettingHideSocials(bool value) { if (saveFile["settings"] == null) saveFile["settings"] = new JObject(); saveFile["settings"]["hideSocials"] = value; } public bool? GetSettingHideSocials() { if (saveFile["settings"] == null) return null; if (saveFile["settings"]["hideSocials"] == null) return null; return bool.Parse(saveFile["settings"]["hideSocials"].ToString()); } public void SetSettingRandomMusic(bool value) { if (saveFile["settings"] == null) saveFile["settings"] = new JObject(); saveFile["settings"]["randomMusic"] = value; } public bool GetSettingRandomMusic() { if (saveFile["settings"] == null) return true; if (saveFile["settings"]["randomMusic"] == null) return true; return bool.Parse(saveFile["settings"]["randomMusic"].ToString()); } public void SetSettingMusicVolume(float value) { if (saveFile["settings"] == null) saveFile["settings"] = new JObject(); saveFile["settings"]["musicVolume"] = value; } public float GetSettingMusicVolume() { if (saveFile["settings"] == null) return 1f; if (saveFile["settings"]["musicVolume"] == null) return 1f; return float.Parse(saveFile["settings"]["musicVolume"].ToString()); } public void SetSettingSFXVolume(float value) { if (saveFile["settings"] == null) saveFile["settings"] = new JObject(); saveFile["settings"]["sfxVolume"] = value; } public float GetSettingSFXVolume() { if (saveFile["settings"] == null) return 1f; if (saveFile["settings"]["sfxVolume"] == null) return 1f; return float.Parse(saveFile["settings"]["sfxVolume"].ToString()); } public void SetColorSettingBackground(JArray value) { if (saveFile["settings"] == null) saveFile["settings"] = new JObject(); if (saveFile["settings"]["colors"] == null) saveFile["settings"]["colors"] = new JObject(); saveFile["settings"]["colors"]["background"] = value; } public JArray GetColorSettingBackground() { if (saveFile["settings"] == null) return new JArray(58, 58, 58); if (saveFile["settings"]["colors"] == null) return new JArray(58, 58, 58); if (saveFile["settings"]["colors"]["background"] == null) return new JArray(58, 58, 58); return JArray.Parse(saveFile["settings"]["colors"]["background"].ToString()); } public void SetColorSettingMenuBackground(JArray value) { if (saveFile["settings"] == null) saveFile["settings"] = new JObject(); if (saveFile["settings"]["colors"] == null) saveFile["settings"]["colors"] = new JObject(); saveFile["settings"]["colors"]["menuBackground"] = value; } public JArray GetColorSettingMenuBackground() { if (saveFile["settings"] == null) return new JArray(24, 24, 24); if (saveFile["settings"]["colors"] == null) return new JArray(24, 24, 24); if (saveFile["settings"]["colors"]["menuBackground"] == null) return new JArray(24, 24, 24); return JArray.Parse(saveFile["settings"]["colors"]["menuBackground"].ToString()); } public void SetColorSettingButton(JArray value) { if (saveFile["settings"] == null) saveFile["settings"] = new JObject(); if (saveFile["settings"]["colors"] == null) saveFile["settings"]["colors"] = new JObject(); saveFile["settings"]["colors"]["button"] = value; } public JArray GetColorSettingButton() { if (saveFile["settings"] == null) return new JArray(255, 255, 255); if (saveFile["settings"]["colors"] == null) return new JArray(255, 255, 255); if (saveFile["settings"]["colors"]["button"] == null) return new JArray(255, 255, 255); return JArray.Parse(saveFile["settings"]["colors"]["button"].ToString()); } public void SetColorSettingText(JArray value) { if (saveFile["settings"] == null) saveFile["settings"] = new JObject(); if (saveFile["settings"]["colors"] == null) saveFile["settings"]["colors"] = new JObject(); saveFile["settings"]["colors"]["text"] = value; } public JArray GetColorSettingText() { if (saveFile["settings"] == null) return new JArray(255, 255, 255); if (saveFile["settings"]["colors"] == null) return new JArray(255, 255, 255); if (saveFile["settings"]["colors"]["text"] == null) return new JArray(255, 255, 255); return JArray.Parse(saveFile["settings"]["colors"]["text"].ToString()); } public void SetColorSettingButtonContent(JArray value) { if (saveFile["settings"] == null) saveFile["settings"] = new JObject(); if (saveFile["settings"]["colors"] == null) saveFile["settings"]["colors"] = new JObject(); saveFile["settings"]["colors"]["buttonColor"] = value; } public JArray GetColorSettingButtonContent() { if (saveFile["settings"] == null) return new JArray(0, 0, 0); if (saveFile["settings"]["colors"] == null) return new JArray(0, 0, 0); if (saveFile["settings"]["colors"]["buttonColor"] == null) return new JArray(0, 0, 0); return JArray.Parse(saveFile["settings"]["colors"]["buttonColor"].ToString()); } public void SetColorSettingIcon(JArray value) { if (saveFile["settings"] == null) saveFile["settings"] = new JObject(); if (saveFile["settings"]["colors"] == null) saveFile["settings"]["colors"] = new JObject(); saveFile["settings"]["colors"]["icon"] = value; } public JArray GetColorSettingIcon() { if (saveFile["settings"] == null) return new JArray(255, 255, 255); if (saveFile["settings"]["colors"] == null) return new JArray(255, 255, 255); if (saveFile["settings"]["colors"]["icon"] == null) return new JArray(255, 255, 255); return JArray.Parse(saveFile["settings"]["colors"]["icon"].ToString()); } public void UnsetColorSettingIcon() { if (saveFile["settings"] == null) return; if (saveFile["settings"]["colors"] == null) return; if (saveFile["settings"]["colors"]["icon"] == null) return; (saveFile["settings"]["colors"] as JObject)?.Remove("icon"); } public void SetColorSettingOverlay(JArray value) { if (saveFile["settings"] == null) saveFile["settings"] = new JObject(); if (saveFile["settings"]["colors"] == null) saveFile["settings"]["colors"] = new JObject(); saveFile["settings"]["colors"]["overlay"] = value; } public JArray GetColorSettingOverlay() { if (saveFile["settings"] == null) return new JArray(255, 255, 255); if (saveFile["settings"]["colors"] == null) return new JArray(255, 255, 255); if (saveFile["settings"]["colors"]["overlay"] == null) return new JArray(255, 255, 255); return JArray.Parse(saveFile["settings"]["colors"]["overlay"].ToString()); } public void UnsetColorSettingOverlay() { if (saveFile["settings"] == null) return; if (saveFile["settings"]["colors"] == null) return; if (saveFile["settings"]["colors"]["overlay"] == null) return; (saveFile["settings"]["colors"] as JObject)?.Remove("overlay"); } //Account stuff public void SetAccountSession(string value) { if (saveFile["account"] == null) saveFile["account"] = new JObject(); saveFile["account"]["session"] = value; } public string GetAccountSession() { if (saveFile["account"] == null) return null; if (saveFile["account"]["session"] == null) return null; return saveFile["account"]["session"].ToString(); } public void UnsetAccountSession() { if (saveFile["account"] == null) return; (saveFile["account"] as JObject)?.Remove("session"); } public void SetAccountName(string value) { if (saveFile["account"] == null) saveFile["account"] = new JObject(); saveFile["account"]["name"] = value; } public string GetAccountName() { if (saveFile["account"] == null) return null; if (saveFile["account"]["name"] == null) return null; return saveFile["account"]["name"].ToString(); } public void UnsetAccountName() { if (saveFile["account"] == null) return; (saveFile["account"] as JObject)?.Remove("name"); } public void SetAccountID(BigInteger value) { if (saveFile["account"] == null) saveFile["account"] = new JObject(); saveFile["account"]["id"] = value.ToString(); } public BigInteger? GetAccountID() { if (saveFile["account"] == null) return null; if (saveFile["account"]["id"] == null) return null; return BigInteger.Parse(saveFile["account"]["id"].ToString()); } public void UnsetAccountID() { if (saveFile["account"] == null) return; (saveFile["account"] as JObject)?.Remove("id"); } //Game store stuff public void SetGameStoreHighScore(BigInteger value) { if (saveFile["gameStore"] == null) saveFile["gameStore"] = new JObject(); saveFile["gameStore"]["highScore"] = value.ToString(); } public BigInteger GetGameStoreHighScore() { if (saveFile["gameStore"] == null) return 0; if (saveFile["gameStore"]["highScore"] == null) return 0; return BigInteger.Parse(saveFile["gameStore"]["highScore"].ToString()); } public void UnsetGameStoreHighScore() { if (saveFile["gameStore"] == null) return; (saveFile["gameStore"] as JObject)?.Remove("highScore"); } public void SetGameStoreTotalAttepts(BigInteger value) { if (saveFile["gameStore"] == null) saveFile["gameStore"] = new JObject(); saveFile["gameStore"]["totalAttempts"] = value.ToString(); } public BigInteger GetGameStoreTotalAttepts() { if (saveFile["gameStore"] == null) return 0; if (saveFile["gameStore"]["totalAttempts"] == null) return 0; return BigInteger.Parse(saveFile["gameStore"]["totalAttempts"].ToString()); } public void UnsetGameStoreTotalAttepts() { if (saveFile["gameStore"] == null) return; (saveFile["gameStore"] as JObject)?.Remove("totalAttempts"); } public void SetGameStoreTotalNormalBerries(BigInteger value) { if (saveFile["gameStore"] == null) saveFile["gameStore"] = new JObject(); saveFile["gameStore"]["totalNormalBerries"] = value.ToString(); } public BigInteger GetGameStoreTotalNormalBerries() { if (saveFile["gameStore"] == null) return 0; if (saveFile["gameStore"]["totalNormalBerries"] == null) return 0; return BigInteger.Parse(saveFile["gameStore"]["totalNormalBerries"].ToString()); } public void UnsetGameStoreTotalNormalBerries() { if (saveFile["gameStore"] == null) return; (saveFile["gameStore"] as JObject)?.Remove("totalNormalBerries"); } public void SetGameStoreTotalPoisonBerries(BigInteger value) { if (saveFile["gameStore"] == null) saveFile["gameStore"] = new JObject(); saveFile["gameStore"]["totalPoisonBerries"] = value.ToString(); } public BigInteger GetGameStoreTotalPoisonBerries() { if (saveFile["gameStore"] == null) return 0; if (saveFile["gameStore"]["totalPoisonBerries"] == null) return 0; return BigInteger.Parse(saveFile["gameStore"]["totalPoisonBerries"].ToString()); } public void UnsetGameStoreTotalPoisonBerries() { if (saveFile["gameStore"] == null) return; (saveFile["gameStore"] as JObject)?.Remove("totalPoisonBerries"); } public void SetGameStoreTotalSlowBerries(BigInteger value) { if (saveFile["gameStore"] == null) saveFile["gameStore"] = new JObject(); saveFile["gameStore"]["totalSlowBerries"] = value.ToString(); } public BigInteger GetGameStoreTotalSlowBerries() { if (saveFile["gameStore"] == null) return 0; if (saveFile["gameStore"]["totalSlowBerries"] == null) return 0; return BigInteger.Parse(saveFile["gameStore"]["totalSlowBerries"].ToString()); } public void UnsetGameStoreTotalSlowBerries() { if (saveFile["gameStore"] == null) return; (saveFile["gameStore"] as JObject)?.Remove("totalSlowBerries"); } public void SetGameStoreTotalUltraBerries(BigInteger value) { if (saveFile["gameStore"] == null) saveFile["gameStore"] = new JObject(); saveFile["gameStore"]["totalUltraBerries"] = value.ToString(); } public BigInteger GetGameStoreTotalUltraBerries() { if (saveFile["gameStore"] == null) return 0; if (saveFile["gameStore"]["totalUltraBerries"] == null) return 0; return BigInteger.Parse(saveFile["gameStore"]["totalUltraBerries"].ToString()); } public void UnsetGameStoreTotalUltraBerries() { if (saveFile["gameStore"] == null) return; (saveFile["gameStore"] as JObject)?.Remove("totalUltraBerries"); } public void SetGameStoreTotalSpeedyBerries(BigInteger value) { if (saveFile["gameStore"] == null) saveFile["gameStore"] = new JObject(); saveFile["gameStore"]["totalSpeedyBerries"] = value.ToString(); } public BigInteger GetGameStoreTotalSpeedyBerries() { if (saveFile["gameStore"] == null) return 0; if (saveFile["gameStore"]["totalSpeedyBerries"] == null) return 0; return BigInteger.Parse(saveFile["gameStore"]["totalSpeedyBerries"].ToString()); } public void UnsetGameStoreTotalSpeedyBerries() { if (saveFile["gameStore"] == null) return; (saveFile["gameStore"] as JObject)?.Remove("totalSpeedyBerries"); } public void SetGameStoreTotalCoinBerries(BigInteger value) { if (saveFile["gameStore"] == null) saveFile["gameStore"] = new JObject(); saveFile["gameStore"]["totalCoinBerries"] = value.ToString(); } public BigInteger GetGameStoreTotalCoinBerries() { if (saveFile["gameStore"] == null) return 0; if (saveFile["gameStore"]["totalCoinBerries"] == null) return 0; return BigInteger.Parse(saveFile["gameStore"]["totalCoinBerries"].ToString()); } public void UnsetGameStoreTotalCoinBerries() { if (saveFile["gameStore"] == null) return; (saveFile["gameStore"] as JObject)?.Remove("totalCoinBerries"); } public void SetGameStoreTotalRandomBerries(BigInteger value) { if (saveFile["gameStore"] == null) saveFile["gameStore"] = new JObject(); saveFile["gameStore"]["totalRandomBerries"] = value.ToString(); } public BigInteger GetGameStoreTotalRandomBerries() { if (saveFile["gameStore"] == null) return 0; if (saveFile["gameStore"]["totalRandomBerries"] == null) return 0; return BigInteger.Parse(saveFile["gameStore"]["totalRandomBerries"].ToString()); } public void UnsetGameStoreTotalRandomBerries() { if (saveFile["gameStore"] == null) return; (saveFile["gameStore"] as JObject)?.Remove("totalRandomBerries"); } public void SetGameStoreTotalAntiBerries(BigInteger value) { if (saveFile["gameStore"] == null) saveFile["gameStore"] = new JObject(); saveFile["gameStore"]["totalAntiBerries"] = value.ToString(); } public BigInteger GetGameStoreTotalAntiBerries() { if (saveFile["gameStore"] == null) return 0; if (saveFile["gameStore"]["totalAntiBerries"] == null) return 0; return BigInteger.Parse(saveFile["gameStore"]["totalAntiBerries"].ToString()); } public void UnsetGameStoreTotalAntiBerries() { if (saveFile["gameStore"] == null) return; (saveFile["gameStore"] as JObject)?.Remove("totalAntiBerries"); } public void SetGameStoreTotalGoldenBerries(BigInteger value) { if (saveFile["gameStore"] == null) saveFile["gameStore"] = new JObject(); saveFile["gameStore"]["totalGoldenBerries"] = value.ToString(); } public BigInteger GetGameStoreTotalGoldenBerries() { if (saveFile["gameStore"] == null) return 0; if (saveFile["gameStore"]["totalGoldenBerries"] == null) return 0; return BigInteger.Parse(saveFile["gameStore"]["totalGoldenBerries"].ToString()); } public void UnsetGameStoreTotalGoldenBerries() { if (saveFile["gameStore"] == null) return; (saveFile["gameStore"] as JObject)?.Remove("totalGoldenBerries"); } }