Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
- добавлена новая система призов: PrizeBase, PrizeType, PrizeDatabase, LevelPrizeConfig и реализации для hopper, QR-кода, отсутствия приза и стойки с призом - добавлена конфигурация призов уровней через `prizes.json` и связанная логика загрузки/обработки в менеджерах игры - расширен UI главного меню и настроек уровней: добавлены LevelSettingsModal, LevelPrizeSettingsModal, QRCodeModal и PrizeStandModal - обновлена навигация модальных окон и связанный UI-код: ModalManager, MainMenu, RulesModal, PauseMenu, PrizeErrorDisplay, UIRowPointer и WinBannerController - доработаны настройки и генерация UI-элементов: обновлены SettingsDatabase, SettingsUIGenerator, SettingUIItem, ValueSelectorRow и editor drawer для настроек - обновлены и добавлены UI-prefab'ы для кнопок, строк настроек, панели групп и кнопки настроек уровня - обновлены сцены `MainMenu` и `Level UI` под новый флоу настройки уровней, выбора призов и отображения модалок - добавлены файлы лаунчера в `StreamingAssets`, включая `RRLauncher.exe`, служебные meta-файлы и документацию - улучшено логирование через FileLogger и удален устаревший код лицензирования - удалены больше неиспользуемые файлы: `Licensing.cs`, `SteppedSlider.cs` и recovery-сцены
127 lines
4.7 KiB
C#
127 lines
4.7 KiB
C#
using System.Collections.Generic;
|
||
using System.IO;
|
||
using UnityEngine;
|
||
|
||
namespace RR.Common.Prizes
|
||
{
|
||
/// <summary>
|
||
/// Хранилище призов за уровни. Загружает и сохраняет конфигурацию в JSON-файл.
|
||
/// Если файла нет — создаёт новый с пустым списком (нет призов ни за один уровень).
|
||
/// </summary>
|
||
public class PrizeDatabase
|
||
{
|
||
private const string FileName = "prizes.json";
|
||
|
||
private readonly Dictionary<string, LevelPrizeConfig> _configs = new();
|
||
private string _filePath;
|
||
|
||
/// <summary>Путь к JSON-файлу.</summary>
|
||
public string FilePath => _filePath;
|
||
|
||
// ────────────── Загрузка / сохранение ──────────────
|
||
|
||
/// <summary>
|
||
/// Загружает конфигурацию из JSON-файла рядом с исполняемым файлом.
|
||
/// Если файл отсутствует — создаёт пустой.
|
||
/// </summary>
|
||
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<PrizesFileData>(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}");
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Сохраняет текущую конфигурацию в JSON-файл.
|
||
/// </summary>
|
||
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}");
|
||
}
|
||
|
||
// ────────────── Чтение ──────────────
|
||
|
||
/// <summary>
|
||
/// Возвращает конфигурацию приза для указанного уровня.
|
||
/// Если для уровня нет записи — возвращает <see cref="PrizeType.None"/>.
|
||
/// </summary>
|
||
public LevelPrizeConfig GetConfig(string level)
|
||
{
|
||
return _configs.TryGetValue(level, out var config) ? config : new LevelPrizeConfig();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Проверяет, есть ли запись для указанного уровня.
|
||
/// </summary>
|
||
public bool HasConfig(string level) => _configs.ContainsKey(level);
|
||
|
||
/// <summary>
|
||
/// Все записи (только для чтения).
|
||
/// </summary>
|
||
public IReadOnlyDictionary<string, LevelPrizeConfig> GetAll() => _configs;
|
||
|
||
// ────────────── Запись ──────────────
|
||
|
||
/// <summary>
|
||
/// Устанавливает конфигурацию приза для уровня и сохраняет файл.
|
||
/// </summary>
|
||
public void SetConfig(string level, LevelPrizeConfig config)
|
||
{
|
||
_configs[level] = config;
|
||
Save();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Удаляет запись для уровня (приз = None) и сохраняет файл.
|
||
/// </summary>
|
||
public void RemoveConfig(string level)
|
||
{
|
||
if (_configs.Remove(level))
|
||
Save();
|
||
}
|
||
|
||
/// <summary>
|
||
/// Очищает все записи и сохраняет пустой файл.
|
||
/// </summary>
|
||
public void Clear()
|
||
{
|
||
_configs.Clear();
|
||
Save();
|
||
}
|
||
}
|
||
}
|
||
|