sea-battle/Assets/Scripts/Settings/SettingsData.cs

483 lines
18 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>() { "Äåíü","Äåíü_2" ,"Íî÷ü" },
defaultIndex: 0));
settings.Add(new SettingOption(settingName: "Ðåæèì èãðû",
options: new List<string>() { "Êëàññèêà", "Ðàñòóùèå ïîëÿ", "Ðèôû" },
defaultIndex: 0));
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>() { "10", "20", "30", "40", "50" },
defaultIndex: 1)); // ïî óìîë÷àíèþ 20%
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.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.Panel,
panelId: 6));
settings.Add(new SettingOption(
settingName: "Çàäàòü öåíó èãðû ñ äðóãîì",
options: new List<string>() { "" },
defaultIndex: 0,
type: SettingType.Panel,
panelId: 7));
settings.Add(new SettingOption(
settingName: "Çàäàòü öåíó èìïóëüñà",
options: new List<string>() { "" },
defaultIndex: 0,
type: SettingType.Panel,
panelId: 8));
// Íàñòðîéêè-ýêøåíû (âûïîëíÿþòñÿ óäåðæàíèåì)
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)
{
int currentHash = GetDefaultsHash();
if (loaded.hash != currentHash)
{
// Õåø èçìåíèëñÿ — çíà÷èò äîáàâèëèñü/óäàëèëèñü íàñòðîéêè.
// Äåëàåì merge: ïîëüçîâàòåëüñêèå çíà÷åíèÿ ñîõðàíÿþòñÿ, íîâûå äîáàâëÿþòñÿ ñ äåôîëòîì.
Debug.Log($"[SettingsData] Õåø èçìåíèëñÿ ({loaded.hash} -> {currentHash}). Îáíîâëÿåì íàñòðîéêè...");
loaded = MergeWithDefaults(loaded, GetDefaults());
loaded.hash = currentHash;
TrySaveToFile(path, loaded);
}
return loaded;
}
var created = CreateGameSettings();
TrySaveToFile(path, created);
return created;
}
// Ñëèÿíèå çàãðóæåííûõ íàñòðîåê ñ äåôîëòàìè.
// Ïîëüçîâàòåëüñêèå çíà÷åíèÿ ñîõðàíÿþòñÿ, íîâûå íàñòðîéêè äîáàâëÿþòñÿ ñ defaultIndex, óäàë¸ííûå îòáðàñûâàþòñÿ.
private GameSettings MergeWithDefaults(GameSettings loaded, List<SettingOption> defaults)
{
var merged = new GameSettings();
merged.settings = new List<SettingOption>();
foreach (var def in defaults)
{
var existing = loaded.settings?.Find(s => s.settingName == def.settingName);
if (existing != null)
{
// Íàñòðîéêà óæå áûëà — áåð¸ì ïîëüçîâàòåëüñêèé chosenIndex, íî îáíîâëÿåì âñ¸ îñòàëüíîå èç äåôîëòà
int safeIndex = (existing.chosenIndex >= 0 && existing.chosenIndex < def.options.Count)
? existing.chosenIndex
: def.defaultIndex;
merged.settings.Add(new SettingOption(def.settingName, new List<string>(def.options), def.defaultIndex, def.type, def.panelId)
{
chosenIndex = safeIndex
});
}
else
{
// Íîâàÿ íàñòðîéêà — äîáàâëÿåì ñ äåôîëòíûì çíà÷åíèåì
Debug.Log($"[SettingsData] Íîâàÿ íàñòðîéêà: '{def.settingName}' (defaultIndex={def.defaultIndex})");
merged.settings.Add(new SettingOption(def.settingName, new List<string>(def.options), def.defaultIndex, def.type, def.panelId));
}
}
return merged;
}
// Ïîïûòêà çàãðóçèòü 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)
{
var defaults = CreateBuiltinDefaults();
int currentHash = ComputeHash(defaults);
if (loaded.hash != currentHash)
{
// Õåø èçìåíèëñÿ — äåëàåì merge, ïîëüçîâàòåëüñêèå çíà÷åíèÿ íå òðîãàåì
Debug.Log($"[SettingsData] Õåø èçìåíèëñÿ ({loaded.hash} -> {currentHash}). Îáíîâëÿåì íàñòðîéêè...");
loaded = MergeWithDefaultsStatic(loaded, defaults, currentHash);
SaveToFile(path, loaded);
}
return loaded;
}
var created = CreateGameSettingsFromDefaults();
SaveToFile(path, created);
return created;
}
// Ñòàòè÷åñêàÿ âåðñèÿ merge (èñïîëüçóåòñÿ êîãäà íåò ýêçåìïëÿðà SettingsData)
private static GameSettings MergeWithDefaultsStatic(GameSettings loaded, List<SettingOption> defaults, int newHash)
{
var merged = new GameSettings();
merged.settings = new List<SettingOption>();
merged.hash = newHash;
foreach (var def in defaults)
{
var existing = loaded.settings?.Find(s => s.settingName == def.settingName);
if (existing != null)
{
// Íàñòðîéêà óæå áûëà — ñîõðàíÿåì ïîëüçîâàòåëüñêèé chosenIndex
int safeIndex = (existing.chosenIndex >= 0 && existing.chosenIndex < def.options.Count)
? existing.chosenIndex
: def.defaultIndex;
merged.settings.Add(new SettingOption(def.settingName, new List<string>(def.options), def.defaultIndex, def.type, def.panelId)
{
chosenIndex = safeIndex
});
}
else
{
// Íîâàÿ íàñòðîéêà — äîáàâëÿåì ñ äåôîëòíûì çíà÷åíèåì
Debug.Log($"[SettingsData] Íîâàÿ íàñòðîéêà: '{def.settingName}' (defaultIndex={def.defaultIndex})");
merged.settings.Add(new SettingOption(def.settingName, new List<string>(def.options), def.defaultIndex, def.type, def.panelId));
}
}
return merged;
}
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();
}
}