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-сцены
108 lines
3.5 KiB
C#
108 lines
3.5 KiB
C#
using System;
|
||
using UnityEngine;
|
||
using RR.Common.Controls;
|
||
using RR.Common.UI;
|
||
|
||
namespace RR.Common.Prizes
|
||
{
|
||
/// <summary>
|
||
/// Исполнитель приза «Витрина».
|
||
/// Показывает модальное окно с выбором ячейки, затем открывает её
|
||
/// через <see cref="PrizeStandController"/>. Количество ячеек берётся из <see cref="LevelPrizeConfig"/>.
|
||
/// </summary>
|
||
public class PrizeStandPrize : PrizeBase
|
||
{
|
||
public override PrizeType Type => PrizeType.PrizeStand;
|
||
public override bool IsGiving => _isGiving;
|
||
|
||
private readonly Func<PrizeStandModal> _resolveModal;
|
||
private bool _isGiving;
|
||
private PrizeStandModal _activeModal;
|
||
|
||
/// <param name="resolveModal">Делегат для поиска модального окна в текущих сценах.</param>
|
||
public PrizeStandPrize(Func<PrizeStandModal> resolveModal)
|
||
{
|
||
_resolveModal = resolveModal;
|
||
}
|
||
|
||
public override void Execute(MonoBehaviour host, LevelPrizeConfig config)
|
||
{
|
||
if (_isGiving)
|
||
{
|
||
Debug.LogWarning("[PrizeStandPrize] Уже идёт выдача.");
|
||
return;
|
||
}
|
||
|
||
_isGiving = true;
|
||
|
||
// Отписываемся от предыдущего модального окна, если было
|
||
if (_activeModal != null)
|
||
_activeModal.OnBoxSelected -= OnBoxSelected;
|
||
|
||
_activeModal = _resolveModal?.Invoke();
|
||
|
||
if (_activeModal != null)
|
||
{
|
||
_activeModal.OnBoxSelected += OnBoxSelected;
|
||
_activeModal.Show(config.prizeStandBoxCount);
|
||
}
|
||
else
|
||
{
|
||
Debug.LogError("[PrizeStandPrize] PrizeStandModal не найден на сцене.");
|
||
_isGiving = false;
|
||
InvokeResult(false);
|
||
}
|
||
}
|
||
|
||
private async void OnBoxSelected(int boxNumber)
|
||
{
|
||
// Отписываемся сразу после выбора
|
||
if (_activeModal != null)
|
||
{
|
||
_activeModal.OnBoxSelected -= OnBoxSelected;
|
||
_activeModal = null;
|
||
}
|
||
|
||
if (boxNumber <= 0)
|
||
{
|
||
_isGiving = false;
|
||
InvokeResult(false);
|
||
return;
|
||
}
|
||
|
||
PrizeStandController stand = ComSystemManager.GetPrizeStandController();
|
||
if (stand == null)
|
||
{
|
||
Debug.LogError("[PrizeStandPrize] Витрина не подключена.");
|
||
_isGiving = false;
|
||
InvokeResult(false);
|
||
return;
|
||
}
|
||
|
||
bool success = false;
|
||
|
||
void OnResult(bool s, string m)
|
||
{
|
||
stand.OpeningFinished -= OnResult;
|
||
success = s;
|
||
if (!s) Debug.LogWarning($"[PrizeStandPrize] Ошибка: {m}");
|
||
}
|
||
|
||
stand.OpeningFinished += OnResult;
|
||
|
||
try
|
||
{
|
||
await stand.OpenBoxAsync(boxNumber);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
Debug.LogError($"[PrizeStandPrize] Исключение: {ex.Message}");
|
||
stand.OpeningFinished -= OnResult;
|
||
}
|
||
|
||
_isGiving = false;
|
||
InvokeResult(success);
|
||
}
|
||
}
|
||
}
|