using RR.Common.Behaviour.ScriptableObjects; using RR.Common.Controls; using RR.Game2D.Core.Managers; using UnityEngine; using UnityEngine.Events; using UnityEngine.InputSystem; namespace RR.Common.Managers { /// /// Менеджер системы оплаты. Управляет кредитами и интегрируется с ComWrapper. /// public class PaymentManager : MonoBehaviour { public static PaymentManager Instance { get; private set; } [Header("Настройки")] [SerializeField] private bool saveMoneyBetweenSessions = false; [SerializeField] private bool enableFreeGame = false; [Header("Управление")] [SerializeField] private InputActionReference addCreditAction; [Header("Состояние")] public int CreditsCount { get; private set; } // События для уведомления других систем public UnityEvent OnCreditsChanged; public UnityEvent OnCreditAdded; public UnityEvent OnCreditRemoved; #region Unity Lifetime public void Initialize() { if (Instance != null && Instance != this) { Destroy(gameObject); return; } Instance = this; DontDestroyOnLoad(gameObject); // Инициализация событий OnCreditsChanged ??= new UnityEvent(); OnCreditAdded ??= new UnityEvent(); OnCreditRemoved ??= new UnityEvent(); // Загрузка кредитов из сохранений if (!saveMoneyBetweenSessions) { PlayerPrefs.SetInt("CoinsCount", 0); } CreditsCount = PlayerPrefs.GetInt("CoinsCount", 0); // Подписка на события ComWrapper ComWrapper.OnCreditAdded?.AddListener(HandleCreditAdded); ComWrapper.OnCreditRemoved?.AddListener(HandleCreditRemoved); // Привязка действия добавления кредита (для тестирования) if (addCreditAction != null) { addCreditAction.action.performed += AddCreditsManually; addCreditAction.action.Enable(); } SettingsManager manager = SettingsManager.Instance; if (manager != null) { manager.OnSettingsLoaded += SetFreePlay; manager.OnSettingsSaved += SetFreePlay; } Debug.Log($"Инициализирован. Кредиты: {CreditsCount}, Бесплатная игра: {enableFreeGame}", this); } // Если не инициализируется в GameManager, инициализировать тут // private void Awake() // { // Initialize(); // } private void OnDestroy() { // Отписка от событий ComWrapper ComWrapper.OnCreditAdded?.RemoveListener(HandleCreditAdded); ComWrapper.OnCreditRemoved?.RemoveListener(HandleCreditRemoved); // Отключение действия добавления кредита if (addCreditAction == null) return; addCreditAction.action.performed -= AddCreditsManually; addCreditAction.action.Disable(); SettingsManager manager = SettingsManager.Instance; if (manager == null) return; manager.OnSettingsLoaded -= SetFreePlay; manager.OnSettingsSaved -= SetFreePlay; } #endregion #region Private Methods /// /// Обработчик добавления кредита из ComWrapper /// /// Новое количество кредитов private void HandleCreditAdded(int newCreditsCount) { CreditsCount = newCreditsCount; OnCreditsChanged?.Invoke(CreditsCount); OnCreditAdded?.Invoke(CreditsCount); Debug.Log($"Кредит добавлен. Всего: {CreditsCount}", this); } /// /// Обработчик удаления кредита из ComWrapper /// /// Новое количество кредитов private void HandleCreditRemoved(int newCreditsCount) { CreditsCount = newCreditsCount; OnCreditsChanged?.Invoke(CreditsCount); OnCreditRemoved?.Invoke(CreditsCount); Debug.Log($"Кредит удален. Осталось: {CreditsCount}", this); } private void SetFreePlay() { if (SettingsManager.Instance == null) return; GameSettings currentSettings = SettingsManager.Instance.GetCurrentGameSettings(); enableFreeGame = currentSettings.isFreeGame; Debug.Log($"Бесплатная игра установлена из настроек: {enableFreeGame}", this); } #endregion #region Public API /// /// Проверяет, может ли игрок начать игру (есть ли кредиты или включена бесплатная игра) /// /// true если игрок может начать игру public bool CanStartGame() { if (enableFreeGame) { GameManager.Logger?.Log("PaymentManager", "Бесплатная игра включена"); return true; } bool canStart = CreditsCount > 0; GameManager.Logger?.Log("PaymentManager", $"Проверка возможности старта: {canStart} (кредиты: {CreditsCount})"); return canStart; } /// /// Выполняет списание платы за запуск игры через ComWrapper.Pay() /// /// true если оплата прошла успешно public bool ProcessPayment(int amount = 1) { if (enableFreeGame) { GameManager.Logger?.Log("PaymentManager", "Оплата пропущена - бесплатная игра"); return true; } bool paymentSuccess = ComWrapper.Pay(amount); Debug.Log(paymentSuccess ? "Оплата успешна" : "Оплата не прошла - недостаточно кредитов", this); return paymentSuccess; } /// /// Добавляет кредиты вручную (для тестирования) /// /// Количество кредитов public static void AddCreditsManually(int amount = 1) { for (int i = 0; i < amount; i++) { ComWrapper.AddCredit(); } } private static void AddCreditsManually(InputAction.CallbackContext context) { AddCreditsManually(); // OnCreditAdded?.Invoke(CreditsCount); // OnCreditsChanged?.Invoke(CreditsCount); } /// /// Включает/выключает режим бесплатной игры /// /// Включить/выключить public void SetFreePlayMode(bool enable) { enableFreeGame = enable; GameManager.Logger?.Log("PaymentManager", $"Бесплатная игра: {enableFreeGame}"); } /// /// Получить текущее состояние режима бесплатной игры /// public bool IsFreePlayEnabled() => enableFreeGame; public void SetFreePlay(bool freePlayEnabled) { enableFreeGame = freePlayEnabled; } #endregion } }