Danro/Assets/Scripts/Managers/PrizeSystemManager.cs
Danil Iarosh 6da2812c8e
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
feat: add hopper prize system, prize error display, levitator component
Система выдачи призов хоппером:
- PrizeSystemManager теперь читает enableHopper из настройки prizes.giveSmallPrize
  вместо захардкоженного SerializeField (реагирует на изменения в реальном времени)
- LevelFinish: исправлен ключ настройки на prizes.giveSmallPrize
- Добавлен HopperCheckController для тестирования выдачи приза кнопкой в настройках
- Проверка датчика хоппера перенесена в ComDeviceClient (2-й бит INPUT)
- PrizeGivenBuffer заменён с PlayerPrefs на потокобезопасный Interlocked-буфер
  (исправлен краш при вызове PlayerPrefs из фонового потока платы)
- Добавлен PrizeSystem.OnPrizeResult (Action<bool>) — событие результата выдачи

Отображение ошибки выдачи приза:
- Добавлен PrizeErrorDisplay — UI-компонент, подписанный на OnPrizeResult
- Зависит от настройки prizes.showPrizeError (реагирует на изменения в реальном времени)

QR-коды:
- PrizeSystemManager подписан на изменение prizes.phoneNumber — QR-коды
  перегенерируются автоматически при смене номера
- WinBannerController показывает QR-коды только при включённой prizes.giveBigPrize

Прочее:
- Добавлен Levitator — компонент плавной левитации объекта (высота, скорость, плавность)
- Настройки: группы поддержки/тестов реорганизованы, добавлена кнопка btn.hopper_test
2026-03-06 16:47:40 +03:00

124 lines
4.6 KiB
C#

using System.Collections.Generic;
using RR.Common.Controls;
using UnityEngine;
using RR.Common.Utility;
using RR.Common.Settings;
namespace RR.Common.Managers
{
public class PrizeSystemManager : MonoBehaviour
{
public static PrizeSystemManager Instance { get; private set; }
[Header("Настройки выдачи призов")]
[SerializeField] private bool givePrizes = true;
private bool _enableHopper;
[Header("Настройки генерации QR-кодов")]
[SerializeField] private List<QRCodeInfo> qrCodes = new();
private readonly List<Texture2D> generatedQRCodes = new();
[SerializeField] private string _phoneNumberMask = "+7XXXXXXXXXX";
// [SerializeField] private string telegramLinkPrefix = "https://t.me/";
// [SerializeField] private string whatsappLinkPrefix = "https://wa.me/";
private string _phoneNumber = string.Empty;
public void Initialize()
{
if (Instance != null && Instance != this)
{
Destroy(gameObject);
return;
}
Instance = this;
DontDestroyOnLoad(gameObject);
Debug.Log(givePrizes
? "Prize System Initialized: Prizes will be given."
: "Prize System Initialized: Prizes will NOT be given.");
// Получаем состояние хоппера из настроек
var settings = SettingsManager.Instance;
_enableHopper = settings != null && settings.GetBool("prizes.giveSmallPrize");
Debug.Log(_enableHopper ? "Hopper is enabled for prize dispensing." : "Hopper is disabled.");
// Получаем номер телефона из новой системы настроек (если он есть)
RefreshPhoneNumber(settings);
GenerateQRCodes();
// Подписываемся на изменение номера телефона для перегенерации QR-кодов
if (settings != null)
settings.OnSettingChanged += OnSettingChanged;
}
private void OnDestroy()
{
var settings = SettingsManager.Instance;
if (settings != null)
settings.OnSettingChanged -= OnSettingChanged;
}
private void OnSettingChanged(string key, SettingValue value)
{
if (key == "prizes.giveSmallPrize")
{
_enableHopper = value.b;
Debug.Log(_enableHopper
? "[PrizeSystemManager] Хоппер включён."
: "[PrizeSystemManager] Хоппер выключен.");
return;
}
if (key == "prizes.phoneNumber")
{
RefreshPhoneNumber(SettingsManager.Instance);
GenerateQRCodes();
Debug.Log($"[PrizeSystemManager] Номер телефона изменён, QR-коды перегенерированы: {_phoneNumber}");
}
}
private void RefreshPhoneNumber(SettingsManager settings)
{
_phoneNumber = settings?.GetString("prizes.phoneNumber") ?? string.Empty;
_phoneNumber = PhoneNumberUtils.ValidatePhoneNumber(_phoneNumber);
_phoneNumber = PhoneNumberUtils.ApplyPhoneMask(_phoneNumber, _phoneNumberMask);
}
public void GivePrize()
{
if (_enableHopper)
PrizeSystem.GivePrize();
else
Debug.Log("Hopper is disabled. Prize dispensing skipped.");
}
public Texture2D[] GetQRCodes()
{
return generatedQRCodes.ToArray();
}
private void GenerateQRCodes()
{
// Очищаем предыдущие QR-коды
if (generatedQRCodes.Count > 0) generatedQRCodes.Clear();
foreach (QRCodeInfo data in qrCodes)
{
if (!data.generateQRCode) continue;
string fullLink = data.GetFullLink(_phoneNumber);
Texture2D qrTexture = QRMaker.MakeTexture(fullLink,
8,
true,
QRCodeInfo.GetColor(data.darkColor),
QRCodeInfo.GetColor(data.lightColor));
generatedQRCodes.Add(qrTexture);
Debug.Log($"Generated QR Code for link: {fullLink}");
}
}
}
}