Подробные изменения: - Добавлена система призовых уровней и выдачи призов с QR-контуром Telegram, шаблоном сообщения и генерацией QR без внешних библиотек. - Доработаны сервисные настройки: действия кнопок, модальные окна, ввод с джойстика/клавиатуры, статистика, настройки призов и маршрутизация QR. - Переработаны gameplay HUD и overlay-панели на UI Toolkit со спрайтовыми плашками, DEV BUILD-статистикой, экраном продолжения и экраном результата приза. - Исправлены сценарии смерти, GameOver, продолжения игры, начисления очков за высоту и перехода в главное меню. - Перенесены UI-шаблоны из Resources в Assets/UI, подключена Addressables-загрузка шаблонов настроек и standalone-стили для MainMenuModals. - Добавлены EditMode/PlayMode тесты для призов, QR, arcade input, UI-модалок, scene flow, HUD и gameplay-сессии. - Обновлены сцены, настройки Addressables, service settings database, документация и дорожная карта. Проверки: - Targeted EditMode QR/UI/settings: 23/23 passed - Targeted UI templates/EditMode: 17/17 passed - MainMenuUxmlTests: 3/3 passed - Full EditMode: 129/129 passed - PlayMode: 6/6 passed - Runtime Addressables template load check: loaded=5 - Unity Console после финального refresh: 0 errors
66 lines
2.1 KiB
C#
66 lines
2.1 KiB
C#
using System;
|
|
using DanroJump.Gameplay;
|
|
using DanroJump.Settings;
|
|
|
|
namespace DanroJump.Prizes
|
|
{
|
|
/// <summary>
|
|
/// Базовый сервис призового решения. Пока использует сервисные флаги призов,
|
|
/// позже сюда подключатся таблицы уровней, QR и аппаратная витрина.
|
|
/// </summary>
|
|
public sealed class PrizeFlowService : IPrizeFlowService
|
|
{
|
|
private readonly IReadOnlyServiceSettings settings;
|
|
|
|
public PrizeFlowService([Zenject.InjectOptional] IReadOnlyServiceSettings settings = null)
|
|
{
|
|
this.settings = settings;
|
|
}
|
|
|
|
public event Action<PrizeFlowResult> PrizeFlowStarted;
|
|
|
|
public PrizeFlowResult LastResult { get; private set; }
|
|
|
|
public PrizeFlowResult EvaluateCompletedSession(GameplaySession session)
|
|
{
|
|
var score = session?.Score ?? 0;
|
|
var rewardKind = ResolveRewardKind(score);
|
|
return new PrizeFlowResult(
|
|
rewardKind,
|
|
score,
|
|
session?.Coins ?? 0,
|
|
session?.MaxRunHeight ?? 0f);
|
|
}
|
|
|
|
public PrizeFlowResult StartPrizeFlow(GameplaySession session)
|
|
{
|
|
LastResult = EvaluateCompletedSession(session);
|
|
PrizeFlowStarted?.Invoke(LastResult);
|
|
return LastResult;
|
|
}
|
|
|
|
private PrizeRewardKind ResolveRewardKind(int score)
|
|
{
|
|
if (settings == null)
|
|
{
|
|
return PrizeRewardKind.None;
|
|
}
|
|
|
|
var levels = PrizeLevelTable.FromJson(settings.GetString(ServiceSettingsKeys.PrizeLevels));
|
|
if (levels.Count > 0)
|
|
{
|
|
return levels.ResolveRewardKind(score);
|
|
}
|
|
|
|
if (settings.GetBool(ServiceSettingsKeys.GiveBigPrize))
|
|
{
|
|
return PrizeRewardKind.Big;
|
|
}
|
|
|
|
return settings.GetBool(ServiceSettingsKeys.GiveSmallPrize)
|
|
? PrizeRewardKind.Small
|
|
: PrizeRewardKind.None;
|
|
}
|
|
}
|
|
}
|