217 lines
8.2 KiB
C#
217 lines
8.2 KiB
C#
using RR.Common.Behaviour.ScriptableObjects;
|
||
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
|
||
}
|
||
}
|