using System.Collections; using System.IO; using System.Text; 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"; public static string HopperPrizeCounter = "HopperCounter"; public static string MarblesPrizeCounter = "MarblesCounter"; public static string TicketPrizeCounter = "TicketCounter"; public static string SpecialPrizeCounter = "SpecialCounter"; private static PrizeSystem instance; private static bool prizing = false; //===========================start: PUBLIC API===========================// 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; } else if (prizeType == PrizeType.Special) { PlayerPrefs.SetInt("NeedSpecialPrize", 1); } else { instance.StartCoroutine(instance.PrizingProcess(prize.Amount, prizeType)); } } //===========================end: PUBLIC API===========================// #region Приватные методы private IEnumerator PrizingProcess(int amount, PrizeType Type) { Debug.Log($"Выдача приза {Type}. Количество: {amount}"); prizing = true; 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; 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; 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); //Счетчики IncreasePrizeCounters(Type); } else { PlayerPrefs.SetInt(KeyVault.PRIZING_ERROR_REGISTRED, 1); SoundManager.instance.playClip(prizeErrorSound); } } } void IncreasePrizeCounters(PrizeType Type) { string prizeCounterKey = Type switch { PrizeType.Special => SpecialPrizeCounter, PrizeType.Marbles => MarblesPrizeCounter, PrizeType.Hopper => HopperPrizeCounter, PrizeType.Hopper2 => HopperPrizeCounter, PrizeType.Ticket => TicketPrizeCounter, _ => "none"}; string prizeCounterKeyNullable = prizeCounterKey + "Nullable"; PlayerPrefs.SetInt(prizeCounterKey, PlayerPrefs.GetInt(prizeCounterKey, 0) + 1); PlayerPrefs.SetInt(prizeCounterKeyNullable, PlayerPrefs.GetInt(prizeCounterKeyNullable, 0) + 1); } public static void ResetPrizeCounters() { PlayerPrefs.SetInt(HopperPrizeCounter + "Nullable", 0); PlayerPrefs.SetInt(MarblesPrizeCounter + "Nullable", 0); PlayerPrefs.SetInt(TicketPrizeCounter + "Nullable", 0); PlayerPrefs.SetInt(SpecialPrizeCounter + "Nullable", 0); } public static string GetPrizesCounterNullableString() { StringBuilder sb = new(); sb.Append($"Х: {PlayerPrefs.GetInt(HopperPrizeCounter + "Nullable", 0)}. "); sb.Append($"Т: {PlayerPrefs.GetInt(TicketPrizeCounter + "Nullable", 0)}. "); sb.Append($"М: {PlayerPrefs.GetInt(MarblesPrizeCounter + "Nullable", 0)}. "); sb.Append($"С: {PlayerPrefs.GetInt(SpecialPrizeCounter + "Nullable", 0)}. "); return sb.ToString(); } public static string GetPrizesCounterString() { StringBuilder sb = new(); sb.Append($"Х: {PlayerPrefs.GetInt(HopperPrizeCounter, 0)}. "); sb.Append($"Т: {PlayerPrefs.GetInt(TicketPrizeCounter, 0)}. "); sb.Append($"М: {PlayerPrefs.GetInt(MarblesPrizeCounter, 0)}. "); sb.Append($"С: {PlayerPrefs.GetInt(SpecialPrizeCounter, 0)}. "); return sb.ToString(); } void InitCounters() { if (!PlayerPrefs.HasKey(key_starts)) PlayerPrefs.SetInt(key_starts, 0); if (!PlayerPrefs.HasKey(key_startsNul)) PlayerPrefs.SetInt(key_startsNul, 0); } #endregion }