Danro/Assets/Scripts/Prizes/PrizeDatabase.cs
Danil Iarosh a40b761c81
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
feat(prizes, ui): add configurable level prize flow and launcher assets
- добавлена новая система призов:
  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-сцены
2026-03-16 08:15:36 +03:00

127 lines
4.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();
}
}
}