using System.Collections; using RR.Common.Managers; using RR.Game2D.Core.Managers; using UnityEngine; /// /// Система управления выдачей призов и ведения статистики игры. /// Отвечает за процесс выдачи призов, подсчет запусков и наград. /// public class PrizeSystem : MonoBehaviour { private static PrizeSystem Instance { get; set; } private static Coroutine prizeCoroutine; private static bool _prizing = false; public static readonly string key_starts = "STARTS"; public static readonly string key_startsNul = "STARTSNUL"; public static readonly string key_prizesgiven = "PRIZESGIVEN"; public static readonly string key_prizesgivenNul = "PRIZESGIVENNUL"; [SerializeField] AudioClip prizeErrorSound; //===========================start: PUBLIC API===========================// /// /// Инициализирует систему призов и счетчики статистики. /// Должен быть вызван один раз при запуске приложения. /// /// /// Выполняет: /// - Установку статического экземпляра (singleton) /// - Инициализацию счетчиков в PlayerPrefs если они отсутствуют /// - Подготовку системы к работе /// public void Initialize() { if (Instance != null && Instance != this) { Destroy(gameObject); return; } Instance = this; DontDestroyOnLoad(gameObject); InitCounters(); } /// /// Запускает процесс выдачи физического приза игроку. /// Проверяет настройки и текущее состояние перед началом выдачи. /// /// /// Условия для выдачи приза: /// - В настройках включена выдача призов при игре с ботом /// - В данный момент не выполняется другая выдача приза /// /// Процесс выдачи: /// - Включает мотор хопера /// - Ожидает подтверждения выдачи от датчиков (10 сек таймаут) /// - Выключает мотор по завершению /// - Обновляет счетчики выданных призов /// - Воспроизводит звук ошибки при неудаче /// public static void GivePrize() { // bool settingEnabled = SettingsManager.instance.GetSettingValue("Выдача призов при игре с ботом") == "Выдавать"; // // if (!settingEnabled) { DebugWindow.Message("Выдача приза отключена в настройках"); return; } if (_prizing) { GameManager.Logger.Log("PrizeSystem", "Уже идет выдача приза. Не спамь кнопку."); return; } // // DebugWindow.Message("Выдаю приз"); if (prizeCoroutine != null) Instance.StopCoroutine(prizeCoroutine); prizeCoroutine = Instance.StartCoroutine(Instance.Prize()); } //===========================end: PUBLIC API===========================// #region Приватные методы private IEnumerator Prize() { _prizing = true; // DebugWindow.Message("Начинаю выдачу"); const float timeout = 10; //сек ComWrapper.Send("301");//включаем мотор float startTime = Time.time; bool success = false; PlayerPrefs.SetInt("PrizeGivenBuffer", 0);//На всякий случай подготовка буфера //проверить где он пишется while (Time.time - startTime < timeout) { if (PlayerPrefs.GetInt("PrizeGivenBuffer", 0) == 1) { success = true; IncreasePrizeCounters(); break; } yield return null; } //Выключаем мотор ComWrapper.Send("300"); // DebugWindow.Message("Закончил. Успех: " + success); _prizing = false; if (!success) AudioManager.Instance.PlaySfx(prizeErrorSound); } private static void IncreasePrizeCounters() { PlayerPrefs.SetInt(key_prizesgiven, PlayerPrefs.GetInt(key_prizesgiven) + 1); PlayerPrefs.SetInt(key_prizesgivenNul, PlayerPrefs.GetInt(key_prizesgivenNul) + 1); } private static void InitCounters() { if (!PlayerPrefs.HasKey(key_starts)) PlayerPrefs.SetInt(key_starts, 0); if (!PlayerPrefs.HasKey(key_startsNul)) PlayerPrefs.SetInt(key_startsNul, 0); if (!PlayerPrefs.HasKey(key_prizesgiven)) PlayerPrefs.SetInt(key_prizesgiven, 0); if (!PlayerPrefs.HasKey(key_prizesgivenNul)) PlayerPrefs.SetInt(key_prizesgivenNul, 0); } #endregion }