182 lines
6.2 KiB
C#
182 lines
6.2 KiB
C#
using System.Collections;
|
||
using System.IO;
|
||
using System.Text;
|
||
using UnityEngine;
|
||
|
||
/// <summary>
|
||
/// Система управления выдачей призов и ведения статистики игры.
|
||
/// Отвечает за процесс выдачи призов, подсчет запусков и наград.
|
||
/// </summary>
|
||
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
|
||
}
|