Danro/Assets/Scripts/Prizes/HopperPrize.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

73 lines
2.4 KiB
C#

using System.Collections;
using UnityEngine;
using RR.Common.Controls;
using RR.Game2D.Core.Managers;
namespace RR.Common.Prizes
{
/// <summary>
/// Исполнитель приза «Хоппер».
/// Выдаёт капсулы последовательно. Количество и задержка берутся из <see cref="LevelPrizeConfig"/>.
/// Делегирует низкоуровневую работу в <see cref="PrizeSystem"/>.
/// </summary>
public class HopperPrize : PrizeBase
{
public override PrizeType Type => PrizeType.Hopper;
public override bool IsGiving => _isGiving;
private bool _isGiving;
private Coroutine _coroutine;
public override void Execute(MonoBehaviour host, LevelPrizeConfig config)
{
if (_isGiving || PrizeSystem.IsPrizing)
{
GameManager.Logger?.Log("HopperPrize", "Уже идёт выдача приза.");
return;
}
int count = Mathf.Max(1, config.hopperCapsuleCount);
float delay = Mathf.Max(0f, config.hopperDelayBetweenCapsules);
if (_coroutine != null) host.StopCoroutine(_coroutine);
_coroutine = host.StartCoroutine(DispenseSequence(count, delay));
}
private IEnumerator DispenseSequence(int count, float delay)
{
_isGiving = true;
int dispensed = 0;
for (int i = 0; i < count; i++)
{
while (PrizeSystem.IsPrizing) yield return null;
bool? result = null;
void OnResult(bool success) => result = success;
PrizeSystem.OnPrizeResult += OnResult;
PrizeSystem.GivePrize();
while (result == null) yield return null;
PrizeSystem.OnPrizeResult -= OnResult;
if (result == true)
{
dispensed++;
}
else
{
Debug.LogWarning($"[HopperPrize] Ошибка капсулы {i + 1}/{count}. Прерываю.");
break;
}
if (i < count - 1 && delay > 0)
yield return new WaitForSecondsRealtime(delay);
}
_isGiving = false;
InvokeResult(dispensed == count);
}
}
}