using System.Collections;
using System.IO;
using UnityEngine;
///
/// Система управления выдачей призов и ведения статистики игры.
/// Отвечает за процесс выдачи призов, подсчет запусков и наград.
///
public class PrizeSystem : MonoBehaviour
{
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.instance.GetSettingValue("Выдача призов при игре с ботом") == "Выдавать";
if (!settingEnabled) { Debug.Log("Выдача приза отключена в настройках"); return; }
if (prizing) { Debug.Log("Уже идет выдача приза. Не спамь кнопку."); 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.Special)
{
//GameManager.instance.stateMachine.ChangeState(new PrizeState());
PlayerPrefs.SetInt("NeedSpecialPrize", 1);
}
if (prizeType == PrizeType.Ticket)
{
instance.StartCoroutine(instance.TicketPrize(prize.Amount));
}
if (prizeType == PrizeType.Marbles)
{
instance.StartCoroutine(instance.MarblesPrize(prize.Amount));
}
}
//===========================end: PUBLIC API===========================//
#region Приватные методы
private IEnumerator HopperPrize(int amount)
{
for (int i = 0; i < amount; i++)
{
bool noPrizWhenError = SettingsManager.instance.GetSettingValue("Выдавать приз при ошибке") == "Выкл";
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);
}
}
}
private IEnumerator TicketPrize(int amount)
{
for (int i = 0; i < amount; i++)
{
Debug.Log($"Отдаю тикет {i+1}");
yield return null;
}
}
private IEnumerator MarblesPrize(int amount)
{
for (int i = 0; i < amount; i++)
{
Debug.Log($"Отдаю марблс {i + 1}");
yield return null;
}
}
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
}