sea-battle/Assets/Scripts/Settings/SettingsData.cs
2026-01-09 08:45:22 +03:00

343 lines
12 KiB
C#

using System.Collections.Generic;
using UnityEngine;
using System.IO;
[CreateAssetMenu(fileName = "SettingsData", menuName = "Settings/SettingsData", order = 0)]
public class SettingsData : ScriptableObject
{
[Tooltip("Ñïèñîê äåôîëòíûõ íàñòðîåê, áóäåò èñïîëüçîâàí ïðè ïåðâîì çàïóñêå èëè ïðè ñáðîñå")]
public List<SettingOption> defaultSettings = new List<SettingOption>();
public List<SettingOption> GetDefaults()
{
if (defaultSettings != null && defaultSettings.Count > 0)
return defaultSettings;
// fallback: âîçâðàùàåì âñòðîåííûå äåôîëòû
return CreateBuiltinDefaults();
}
// Ñîçäà¸ò íîâûé GameSettings (êëîíèðîâàííûé) íà îñíîâå defaultSettings èëè âñòðàèâàåìûõ äåôîëòîâ
public GameSettings CreateGameSettings()
{
var defaults = GetDefaults();
var gs = new GameSettings();
gs.settings = new List<SettingOption>();
foreach (var s in defaults)
{
gs.settings.Add(new SettingOption(s.settingName, new List<string>(s.options), s.defaultIndex, s.type, s.panelId));
}
gs.hash = ComputeHash(gs.settings);
return gs;
}
// Ñîçäà¸ò GameSettings íà îñíîâå âñòðîåííûõ äåôîëòîâ (ñòàòè÷åñêèé helper)
public static GameSettings CreateGameSettingsFromDefaults()
{
var defaults = CreateBuiltinDefaults();
var gs = new GameSettings();
gs.settings = new List<SettingOption>();
foreach (var s in defaults)
{
gs.settings.Add(new SettingOption(s.settingName, new List<string>(s.options), s.defaultIndex, s.type, s.panelId));
}
gs.hash = ComputeHash(gs.settings);
return gs;
}
private static int ComputeHash(List<SettingOption> settings)
{
var sb = new System.Text.StringBuilder();
foreach (var option in settings)
{
sb.Append(option.settingName);
foreach (var o in option.options)
{
sb.Append(o);
}
}
return sb.ToString().GetHashCode();
}
public static List<SettingOption> CreateBuiltinDefaults()
{
List<SettingOption> settings = new List<SettingOption>();
settings.Add(new SettingOption(settingName: "Ãðîìêîñòü ìóçûêè",
options: new List<string>() { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" },
defaultIndex: 1));
settings.Add(new SettingOption(settingName: "Ãðîìêîñòü ýôôåêòîâ",
options: new List<string>() { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" },
defaultIndex: 8));
settings.Add(new SettingOption(settingName: "Ãðîìêîñòü ãîëîñà",
options: new List<string>() { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" },
defaultIndex: 8));
settings.Add(new SettingOption(settingName: "QR-êîä äëÿ ñâÿçè",
options: new List<string>() { "Telegram", "WhatsApp" ,"Âñ¸"},
defaultIndex: 0));
settings.Add(new SettingOption(settingName: "Èãðîâàÿ òåìà",
options: new List<string>() { "Äåíü", "Íî÷ü" },
defaultIndex: 0));
settings.Add(new SettingOption(settingName: "Âûäà÷à ïðèçîâ ïðè èãðå ñ áîòîì",
options: new List<string>() { "Âûäàâàòü", "Íå âûäàâàòü" },
defaultIndex: 0,
type: SettingType.Svitcher));
settings.Add(new SettingOption(settingName: "Áåñïëàòíàÿ èãðà",
options: new List<string>() { "Âêë", "Âûêë" },
defaultIndex: 1,
type: SettingType.Svitcher));
settings.Add(new SettingOption(settingName: "Ïîêàçûâàòü êîíòàêòû àäìèíèñòðàöèè",
options: new List<string>() { "Âêë", "Âûêë" },
defaultIndex: 0,
type: SettingType.Svitcher));
settings.Add(new SettingOption(settingName: "Áûñòðàÿ ïðîâåðêà",
options: new List<string>() { "Âêë", "Âûêë" },
defaultIndex: 1,
type: SettingType.Svitcher));
settings.Add(new SettingOption(settingName: "Áûñòðàÿ ïðîâåðêà íàëè÷èÿ ïðèçà",
options: new List<string>() { "Âêë", "Âûêë" },
defaultIndex: 1,
type: SettingType.Svitcher));
settings.Add(new SettingOption(settingName: "Âûäàâàòü ïðèç ïðè îøèáêå",
options: new List<string>() { "Âêë", "Âûêë" },
defaultIndex: 1,
type: SettingType.Svitcher));
settings.Add(new SettingOption(settingName: "Âûâîä îøèáêè âûäà÷è â ìåíþ",
options: new List<string>() { "Âêë", "Âûêë" },
defaultIndex: 1,
type: SettingType.Svitcher));
settings.Add(new SettingOption(settingName: "Âûâîä èíôîðìàöèè î ñóïåðïðèçå â ìåíþ",
options: new List<string>() { "Âêë", "Âûêë" },
defaultIndex: 1,
type: SettingType.Svitcher));
// Íàñòðîéêè-ïàíåëè (îòêðûâàþòñÿ óäåðæàíèåì)
settings.Add(new SettingOption(
settingName: "Ââåñòè íîìåð òåëåôîíà òåõ-ïîääåðæêè",
options: new List<string>() { "" },
defaultIndex: 0,
type: SettingType.Panel,
panelId: 0));
settings.Add(new SettingOption(
settingName: "Ââåñòè íîìåð äëÿ ñâÿçè â WhatsApp",
options: new List<string>() { "" },
defaultIndex: 0,
type: SettingType.Panel,
panelId: 1));
settings.Add(new SettingOption(
settingName: "Ââåñòè íîìåð äëÿ ñâÿçè â Telegram",
options: new List<string>() { "" },
defaultIndex: 0,
type: SettingType.Panel,
panelId: 2));
settings.Add(new SettingOption(
settingName: "Çàäàòü ÷àñîòó âûäà÷è ñïåöèàëüíîãî ïðèçà",
options: new List<string>() { "" },
defaultIndex: 0,
type: SettingType.Panel,
panelId: 3));
settings.Add(new SettingOption(
settingName: "Çàäàòü ñóïåðïðèç",
options: new List<string>() { "" },
defaultIndex: 0,
type: SettingType.Panel,
panelId: 4));
settings.Add(new SettingOption(
settingName: "Íàñòðîéêà ïåðñîíàæà",
options: new List<string>() { "" },
defaultIndex: 0,
type: SettingType.Panel,
panelId: 5));
// Íàñòðîéêè-ýêøåíû (âûïîëíÿþòñÿ óäåðæàíèåì)
settings.Add(new SettingOption(
settingName: "Ñáðîñèòü ñ÷åò÷èê ìîíåò",
options: new List<string>() { "" },
defaultIndex: 0,
type: SettingType.Action,
panelId: 100));
settings.Add(new SettingOption(
settingName: "Ñáðîñ ñòàòèñòèêè ïðèçîâ",
options: new List<string>() { "" },
defaultIndex: 0,
type: SettingType.Action,
panelId: 101));
settings.Add(new SettingOption(
settingName: "Ñáðîñ ïðîãðåññà äî ñóïåðïðèçà",
options: new List<string>() { "" },
defaultIndex: 0,
type: SettingType.Action,
panelId: 102));
return settings;
}
// Ïîïûòêà çàãðóçèòü GameSettings èç JSON-ôàéëà. Âîçâðàùàåò null ïðè îøèáêå/îòñóòñòâèè ôàéëà.
public GameSettings TryLoadFromFile(string path)
{
try
{
if (!File.Exists(path)) return null;
string json = File.ReadAllText(path, System.Text.Encoding.UTF8);
var gs = JsonUtility.FromJson<GameSettings>(json);
return gs;
}
catch (System.Exception e)
{
Debug.LogWarning($"SettingsData.TryLoadFromFile failed: {e.Message}");
return null;
}
}
// Ïîïûòêà ñîõðàíèòü GameSettings â ôàéë. Âîçâðàùàåò true ïðè óñïåõå.
public bool TrySaveToFile(string path, GameSettings gs)
{
try
{
if (gs == null) return false;
string json = JsonUtility.ToJson(gs);
File.WriteAllText(path, json, System.Text.Encoding.UTF8);
return true;
}
catch (System.Exception e)
{
Debug.LogError($"SettingsData.TrySaveToFile failed: {e.Message}");
return false;
}
}
// Çàãðóçèòü èç ôàéëà èëè ñîçäàòü äåôîëòíûé GameSettings è ñîõðàíèòü åãî
public GameSettings LoadOrCreateFromFile(string path)
{
var loaded = TryLoadFromFile(path);
if (loaded != null) return loaded;
var created = CreateGameSettings();
TrySaveToFile(path, created);
return created;
}
// Ïîïûòêà çàãðóçèòü GameSettings èç ôàéëà (ñòàòè÷åñêàÿ, íå òðåáóåò ýêçåìïëÿðà SettingsData)
public static GameSettings LoadFromFile(string path)
{
try
{
if (!File.Exists(path)) return null;
string json = File.ReadAllText(path, System.Text.Encoding.UTF8);
var gs = JsonUtility.FromJson<GameSettings>(json);
return gs;
}
catch (System.Exception e)
{
Debug.LogWarning($"SettingsData.LoadFromFile failed: {e.Message}");
return null;
}
}
// Ñîõðàíèòü GameSettings â ôàéë (ñòàòè÷åñêàÿ âåðñèÿ)
public static bool SaveToFile(string path, GameSettings gs)
{
try
{
if (gs == null) return false;
string json = JsonUtility.ToJson(gs);
File.WriteAllText(path, json, System.Text.Encoding.UTF8);
return true;
}
catch (System.Exception e)
{
Debug.LogError($"SettingsData.SaveToFile failed: {e.Message}");
return false;
}
}
// Ñòàòè÷åñêàÿ ðåàëèçàöèÿ LoadOrCreate: ïûòàåòñÿ çàãðóçèòü, èíà÷å ñîçäà¸ò èç âñòðîåííûõ äåôîëòîâ è ñîõðàíÿåò
public static GameSettings LoadOrCreateFromFileStatic(string path)
{
var loaded = LoadFromFile(path);
if (loaded != null) return loaded;
var created = CreateGameSettingsFromDefaults();
SaveToFile(path, created);
return created;
}
const string DefaultFileName = "settings.json";
public static string GetDefaultFilePath()
{
return Path.Combine(Application.persistentDataPath, DefaultFileName);
}
// Îáåðòêè: ñòàòè÷åñêèå âåðñèè, èñïîëüçóþùèå ïóòü ïî óìîë÷àíèþ
public static GameSettings LoadFromDefaultPath()
{
return LoadFromFile(GetDefaultFilePath());
}
public static bool SaveToDefaultPath(GameSettings gs)
{
return SaveToFile(GetDefaultFilePath(), gs);
}
public static GameSettings LoadOrCreateFromFileDefault()
{
return LoadOrCreateFromFileStatic(GetDefaultFilePath());
}
// Ýêçåìïëÿðíûå îá¸ðòêè (ðàáîòàþò ÷åðåç ýòîò ScriptableObject)
public GameSettings TryLoadFromDefaultPath()
{
return TryLoadFromFile(GetDefaultFilePath());
}
public bool TrySaveToDefaultPath(GameSettings gs)
{
return TrySaveToFile(GetDefaultFilePath(), gs);
}
public GameSettings LoadOrCreateFromDefaultPath()
{
return LoadOrCreateFromFile(GetDefaultFilePath());
}
// Âîçâðàùàåò õåø äåôîëòîâ (÷òîáû íå ñîçäàâàòü GameSettings â ìåíåäæåðå)
public int GetDefaultsHash()
{
return ComputeHash(GetDefaults());
}
// Instance wrapper äëÿ ñîõðàíåíèÿ GameSettings â ïóòü ïî óìîë÷àíèþ
public bool SaveGameSettings(GameSettings gs)
{
return TrySaveToDefaultPath(gs);
}
// Instance wrapper äëÿ çàãðóçêè GameSettings èç ïóòè ïî óìîë÷àíèþ
public GameSettings LoadGameSettings()
{
return TryLoadFromDefaultPath();
}
// Instance wrapper LoadOrCreate
public GameSettings LoadOrCreateGameSettings()
{
return LoadOrCreateFromDefaultPath();
}
}