using UnityEngine;
using UnityEngine.Events;
///
/// Хранит и управляет балансом кредитов обоих игроков.
/// Инициализируется всегда — независимо от режима ввода (клавиатура или COM).
/// COM-плата пишет монеты через CreditSystem.AddCredit(), а не напрямую в UI.
///
public class CreditSystem : MonoBehaviour
{
[SerializeField] private bool saveMoneyBetweenSessions;
// ── События ──────────────────────────────────────────────────────────────
/// Вызывается при добавлении кредита: (playerId, новый_баланс)
public static UnityEvent onCoinAdded;
/// Вызывается при списании кредита: (playerId, новый_баланс)
public static UnityEvent onCoinRemoved;
///
/// Вызывается один раз после инициализации — UI-компоненты подписываются здесь
/// на события монет. Срабатывает в обоих режимах (клавиатура и COM).
///
public static System.Action OnInitialize;
///
/// Вызывается когда Pay() не прошёл из-за нехватки средств (playerId).
/// UIManager подписывается и показывает панель "Пополните баланс".
///
public static event System.Action OnInsufficientFunds;
// ── Приватные данные ──────────────────────────────────────────────────────
private static int _creditsPlayer1;
private static int _creditsPlayer2;
// ── Инициализация ─────────────────────────────────────────────────────────
/// Вызывается из Inici.Start() всегда, независимо от режима ввода.
public void Initialize()
{
onCoinAdded = new UnityEvent();
onCoinRemoved = new UnityEvent();
if (!saveMoneyBetweenSessions)
{
PlayerPrefs.SetInt("Player1_Coins", 0);
PlayerPrefs.SetInt("Player2_Coins", 0);
}
_creditsPlayer1 = PlayerPrefs.GetInt("Player1_Coins", 0);
_creditsPlayer2 = PlayerPrefs.GetInt("Player2_Coins", 0);
OnInitialize?.Invoke();
}
// ── Публичный API ─────────────────────────────────────────────────────────
/// Добавляет кредиты игроку. Вызывается ComWrapper при получении COIN.
public static void AddCredit(int coins = 1, int playerId = 1)
{
if (playerId == 1)
{
_creditsPlayer1 += coins;
PlayerPrefs.SetInt("Player1_Coins", _creditsPlayer1);
onCoinAdded?.Invoke(playerId, _creditsPlayer1);
}
else if (playerId == 2)
{
_creditsPlayer2 += coins;
PlayerPrefs.SetInt("Player2_Coins", _creditsPlayer2);
onCoinAdded?.Invoke(playerId, _creditsPlayer2);
}
// Счётчики запусков для системы призов
PlayerPrefs.SetInt(PrizeSystem.key_starts, PlayerPrefs.GetInt(PrizeSystem.key_starts) + 1);
PlayerPrefs.SetInt(PrizeSystem.key_startsNul, PlayerPrefs.GetInt(PrizeSystem.key_startsNul) + 1);
}
/// Списывает кредиты за старт игры. Возвращает false если денег нет.
public static bool Pay(int coins = 1, int playerId = 1)
{
if (SettingsManager.instance.GetSettingValue("Бесплатная игра") == "Вкл") return true;
ref int credits = ref (playerId == 1 ? ref _creditsPlayer1 : ref _creditsPlayer2);
string key = playerId == 1 ? "Player1_Coins" : "Player2_Coins";
if (credits > 0)
{
credits -= coins;
PlayerPrefs.SetInt(key, credits);
onCoinRemoved?.Invoke(playerId, credits);
return true;
}
// Денег нет — сообщаем UIManager чтобы показал панель
OnInsufficientFunds?.Invoke(playerId);
return false;
}
/// Возвращает текущий баланс игрока.
public static int GetPlayerCredits(int playerId = 1)
{
return playerId == 1 ? _creditsPlayer1 : _creditsPlayer2;
}
}