sea-battle-vr/Assets/Scripts/Common/WalletManager.cs

88 lines
2.2 KiB
C#

using System;
using UnityEngine;
public static class WalletManager
{
public static int Balance { get; private set; }
/// <summary>
/// Колбэк при любом изменении баланса. Аргумент - новый баланс.
/// </summary>
public static event Action<int> OnBalanceChanged;
/// <summary>
/// Колбэк при увеличении баланса. Аргумент - на сколько увеличилось
/// </summary>
public static event Action<int> OnBalanceAdd;
/// <summary>
/// Колбэк при попытке уменьшения баланса. Аргумент 1 - успешна ли попытка снятия; Аргумент 2 - на сколько мы пытались уменьшить баланс
/// </summary>
public static event Action<bool, int> OnPaymentAttempt;
private static string BalancePrefsKey;
public static void Initialize(WalletManagerConfig config)
{
BalancePrefsKey = config.BalancePrefsKey;
if (config.KeepMoneyBetweenSessions)
{
Load();
}
}
public static void AddMoney(int amount)
{
Balance += amount;
OnBalanceChanged?.Invoke(Balance);
OnBalanceAdd?.Invoke(amount);
Save();
}
public static bool TakeMoney(int amount)
{
bool success = default;
if (amount < 0)
{
Debug.LogError("Попытка снять отрицательную сумму");
return false;
}
if (Balance - amount >= 0)
{
success = true;
Balance -= amount;
OnBalanceChanged?.Invoke(Balance);
}
else
{
success = false;
}
OnPaymentAttempt?.Invoke(success, amount);
Save();
return success;
}
public static void ResetBalance()
{
Balance = 0;
OnBalanceChanged?.Invoke(Balance);
Save();
}
private static void Save() => PlayerPrefs.SetInt(BalancePrefsKey, Balance);
private static void Load()
{
Balance = PlayerPrefs.GetInt(BalancePrefsKey, 0);
OnBalanceChanged?.Invoke(Balance);
}
}