using System.Collections.Generic; using System.IO; using UnityEngine; namespace RR.Common.Prizes { /// /// Хранилище призов за уровни. Загружает и сохраняет конфигурацию в JSON-файл. /// Если файла нет — создаёт новый с пустым списком (нет призов ни за один уровень). /// public class PrizeDatabase { private const string FileName = "prizes.json"; private readonly Dictionary _configs = new(); private string _filePath; /// Путь к JSON-файлу. public string FilePath => _filePath; // ────────────── Загрузка / сохранение ────────────── /// /// Загружает конфигурацию из JSON-файла рядом с исполняемым файлом. /// Если файл отсутствует — создаёт пустой. /// public void Load() { string root = Directory.GetParent(Application.dataPath)?.ToString() ?? Application.dataPath; _filePath = Path.Combine(root, FileName); _configs.Clear(); if (File.Exists(_filePath)) { string json = File.ReadAllText(_filePath); var data = JsonUtility.FromJson(json); if (data?.levels != null) { foreach (PrizeLevelEntry entry in data.levels) { if (!string.IsNullOrEmpty(entry.level)) _configs[entry.level] = entry.config ?? new LevelPrizeConfig(); } } Debug.Log($"[PrizeDatabase] Загружено {_configs.Count} записей из {_filePath}"); } else { Save(); Debug.Log($"[PrizeDatabase] Файл не найден — создан пустой: {_filePath}"); } } /// /// Сохраняет текущую конфигурацию в JSON-файл. /// public void Save() { if (string.IsNullOrEmpty(_filePath)) return; var data = new PrizesFileData(); foreach (var kvp in _configs) data.levels.Add(new PrizeLevelEntry { level = kvp.Key, config = kvp.Value }); string json = JsonUtility.ToJson(data, true); File.WriteAllText(_filePath, json); Debug.Log($"[PrizeDatabase] Сохранено {_configs.Count} записей в {_filePath}"); } // ────────────── Чтение ────────────── /// /// Возвращает конфигурацию приза для указанного уровня. /// Если для уровня нет записи — возвращает . /// public LevelPrizeConfig GetConfig(string level) { return _configs.TryGetValue(level, out var config) ? config : new LevelPrizeConfig(); } /// /// Проверяет, есть ли запись для указанного уровня. /// public bool HasConfig(string level) => _configs.ContainsKey(level); /// /// Все записи (только для чтения). /// public IReadOnlyDictionary GetAll() => _configs; // ────────────── Запись ────────────── /// /// Устанавливает конфигурацию приза для уровня и сохраняет файл. /// public void SetConfig(string level, LevelPrizeConfig config) { _configs[level] = config; Save(); } /// /// Удаляет запись для уровня (приз = None) и сохраняет файл. /// public void RemoveConfig(string level) { if (_configs.Remove(level)) Save(); } /// /// Очищает все записи и сохраняет пустой файл. /// public void Clear() { _configs.Clear(); Save(); } } }