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; } }