Danro/Assets/Scripts/Managers/PaymentManager.cs

218 lines
8.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
{
/// <summary>
/// Менеджер системы оплаты. Управляет кредитами и интегрируется с ComWrapper.
/// </summary>
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<int> OnCreditsChanged;
public UnityEvent<int> OnCreditAdded;
public UnityEvent<int> OnCreditRemoved;
#region Unity Lifetime
public void Initialize()
{
if (Instance != null && Instance != this)
{
Destroy(gameObject);
return;
}
Instance = this;
DontDestroyOnLoad(gameObject);
// Инициализация событий
OnCreditsChanged ??= new UnityEvent<int>();
OnCreditAdded ??= new UnityEvent<int>();
OnCreditRemoved ??= new UnityEvent<int>();
// Загрузка кредитов из сохранений
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
/// <summary>
/// Обработчик добавления кредита из ComWrapper
/// </summary>
/// <param name="newCreditsCount">Новое количество кредитов</param>
private void HandleCreditAdded(int newCreditsCount)
{
CreditsCount = newCreditsCount;
OnCreditsChanged?.Invoke(CreditsCount);
OnCreditAdded?.Invoke(CreditsCount);
Debug.Log($"Кредит добавлен. Всего: {CreditsCount}", this);
}
/// <summary>
/// Обработчик удаления кредита из ComWrapper
/// </summary>
/// <param name="newCreditsCount">Новое количество кредитов</param>
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
/// <summary>
/// Проверяет, может ли игрок начать игру (есть ли кредиты или включена бесплатная игра)
/// </summary>
/// <returns>true если игрок может начать игру</returns>
public bool CanStartGame()
{
if (enableFreeGame)
{
GameManager.Logger?.Log("PaymentManager", "Бесплатная игра включена");
return true;
}
bool canStart = CreditsCount > 0;
GameManager.Logger?.Log("PaymentManager", $"Проверка возможности старта: {canStart} (кредиты: {CreditsCount})");
return canStart;
}
/// <summary>
/// Выполняет списание платы за запуск игры через ComWrapper.Pay()
/// </summary>
/// <returns>true если оплата прошла успешно</returns>
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;
}
/// <summary>
/// Добавляет кредиты вручную (для тестирования)
/// </summary>
/// <param name="amount">Количество кредитов</param>
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);
}
/// <summary>
/// Включает/выключает режим бесплатной игры
/// </summary>
/// <param name="enable">Включить/выключить</param>
public void SetFreePlayMode(bool enable)
{
enableFreeGame = enable;
GameManager.Logger?.Log("PaymentManager", $"Бесплатная игра: {enableFreeGame}");
}
/// <summary>
/// Получить текущее состояние режима бесплатной игры
/// </summary>
public bool IsFreePlayEnabled() => enableFreeGame;
public void SetFreePlay(bool freePlayEnabled)
{
enableFreeGame = freePlayEnabled;
}
#endregion
}
}