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-сцены
73 lines
2.4 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|