using System; using UnityEngine; public static class WalletManager { public static int Balance { get; private set; } /// /// Колбэк при любом изменении баланса. Аргумент - новый баланс. /// public static event Action OnBalanceChanged; /// /// Колбэк при увеличении баланса. Аргумент - на сколько увеличилось /// public static event Action OnBalanceAdd; /// /// Колбэк при попытке уменьшения баланса. Аргумент 1 - успешна ли попытка снятия; Аргумент 2 - на сколько мы пытались уменьшить баланс /// public static event Action OnPaymentAttempt; private static string BalancePrefsKey; public static void Initialize(WalletManagerConfig config) { BalancePrefsKey = config.BalancePrefsKey; if (config.KeepMoneyBetweenSessions) { Load(); } } public static void OnCoin() { AddMoney(SettingsManager.GetInt(SettingKey.ImpulsePrice, 10)); } public static void AddMoney(int amount) { Balance += amount; CountersSystem.Add(CountersSystem.CounterType.Revenue, amount); OnBalanceChanged?.Invoke(Balance); OnBalanceAdd?.Invoke(amount); Save(); } public static bool TryTakeMoney(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); } }