using System.Collections; using System.IO; 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(); } public static void GivePrize(Prize prize) { bool settingEnabled = SettingsManager.GetBool("Prizing", false); if (!settingEnabled) { Debug.Log("Выдача приза отключена в настройках"); return; } if (prizing) { Debug.LogError("Уже идет выдача приза. Не спамь кнопку."); return; } Debug.Log($"Поступил заказ приз: {prize}"); PrizeType prizeType = prize.PrizeType; if (prizeType == PrizeType.None) { Debug.Log("Пустой приз. Возврат."); return; } if (prizeType == PrizeType.Hopper) { Debug.Log($"Хоппер в количестве {prize.Amount}"); instance.StartCoroutine(instance.HopperPrize(prize.Amount)); } if (prizeType == PrizeType.Hopper2) { Debug.Log($"Хоппер2 в количестве {prize.Amount}"); instance.StartCoroutine(instance.HopperPrize(prize.Amount));//ТУТ БУДЕТ АЛГОРИТМ ДЛЯ 2 ХОППЕРА } if (prizeType == PrizeType.Special) { //GameManager.instance.stateMachine.ChangeState(new PrizeState()); PlayerPrefs.SetInt("NeedSpecialPrize", 1); } if (prizeType == PrizeType.Ticket) { instance.StartCoroutine(instance.HopperPrize(prize.Amount)); } if (prizeType == PrizeType.Marbles) { instance.StartCoroutine(instance.HopperPrize(prize.Amount)); } } //===========================end: PUBLIC API===========================// #region Приватные методы private IEnumerator HopperPrize(int amount) { for (int i = 0; i < amount; i++) { bool noPrizWhenError = SettingsManager.GetBool("PrizingWhenError", true); bool errorRegistred = PlayerPrefs.GetInt(KeyVault.PRIZING_ERROR_REGISTRED, 0) == 1; if (errorRegistred && noPrizWhenError) yield break; prizing = true; float timeout = 10; //сек Debug.Log("Начинаю выдачу 303"); ComWrapper.Send("303");//включаем мотор float startTime = Time.time; bool success = false; PlayerPrefs.SetInt("PrizeGivenBuffer", 0);//подготовка буфера while (Time.time - startTime < timeout) { if (PlayerPrefs.GetInt("PrizeGivenBuffer", 0) == 1) { Debug.Log("Считан приз"); success = true; IncreasePrizeCounters(); break; } yield return null; } //Выключаем мотор Debug.Log("Выключаю мотор"); ComWrapper.Send("302"); Debug.Log("Закончил. Успех: " + success); prizing = false; if (success) { int prizesCount = PlayerPrefs.GetInt(KeyVault.PRIZES_AVAILABLE); prizesCount = Mathf.Clamp(prizesCount - 1, 0, 9999); PlayerPrefs.SetInt(KeyVault.PRIZES_AVAILABLE, prizesCount); } else { PlayerPrefs.SetInt(KeyVault.PRIZING_ERROR_REGISTRED, 1); SoundManager.instance.playClip(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 }