using System.Collections; using RR.Common.Managers; using UnityEngine; /// /// Система управления выдачей призов и ведения статистики игры. /// Отвечает за процесс выдачи призов, подсчет запусков и наград. /// public class PrizeSystem : MonoBehaviour { [SerializeField] AudioClip prizeErrorSound; public static string key_starts = "STARTS"; public static string key_startsNul = "STARTSNUL"; public static string key_prizesgiven = "PRIZESGIVEN"; public static string key_prizesgivenNul = "PRIZESGIVENNUL"; private static PrizeSystem instance; private static Coroutine prizeCoroutine; private static bool prizing = false; //===========================start: PUBLIC API===========================// /// /// Инициализирует систему призов и счетчики статистики. /// Должен быть вызван один раз при запуске приложения. /// /// /// Выполняет: /// - Установку статического экземпляра (singleton) /// - Инициализацию счетчиков в PlayerPrefs если они отсутствуют /// - Подготовку системы к работе /// public void Initialize() { instance = this; InitCounters(); } /// /// Запускает процесс выдачи физического приза игроку. /// Проверяет настройки и текущее состояние перед началом выдачи. /// /// /// Условия для выдачи приза: /// - В настройках включена выдача призов при игре с ботом /// - В данный момент не выполняется другая выдача приза /// /// Процесс выдачи: /// - Включает мотор хопера /// - Ожидает подтверждения выдачи от датчиков (10 сек таймаут) /// - Выключает мотор по завершению /// - Обновляет счетчики выданных призов /// - Воспроизводит звук ошибки при неудаче /// public static void GivePrize() { // bool settingEnabled = SettingsManager.instance.GetSettingValue("Выдача призов при игре с ботом") == "Выдавать"; bool settingEnabled = true; if (!settingEnabled) { Debug.Log("Выдача приза отключена в настройках"); return; } if (prizing) { Debug.Log("Уже идет выдача приза. Не спамь кнопку."); return; } Debug.Log("Выдаю приз"); if (prizeCoroutine != null) instance.StopCoroutine(prizeCoroutine); prizeCoroutine = instance.StartCoroutine(instance.Prize()); } //===========================end: PUBLIC API===========================// #region Приватные методы private IEnumerator Prize() { prizing = true; Debug.Log("Начинаю выдачу"); 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"); Debug.Log("Закончил. Успех: " + success); prizing = false; if (!success) AudioManager.Instance.PlaySfx(prizeErrorSound); } void IncreasePrizeCounters() { PlayerPrefs.SetInt(key_prizesgiven, PlayerPrefs.GetInt(key_prizesgiven) + 1); PlayerPrefs.SetInt(key_prizesgivenNul, PlayerPrefs.GetInt(key_prizesgivenNul) + 1); } 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 }