49 lines
1.5 KiB
C#
49 lines
1.5 KiB
C#
using System.Threading.Tasks;
|
|
using UnityEngine;
|
|
using BaseGames.Core.Events;
|
|
|
|
namespace BaseGames.Core.Save
|
|
{
|
|
public class EmergencySaveService : MonoBehaviour
|
|
{
|
|
public const int EmergencySlot = 99;
|
|
|
|
[SerializeField] private float _intervalSeconds = 120f;
|
|
[SerializeField] private SaveManager _saveManager;
|
|
[SerializeField] private BoolEventChannelSO _onGameplayActive;
|
|
|
|
private bool _gameplayActive;
|
|
private float _timer;
|
|
private readonly CompositeDisposable _subscriptions = new();
|
|
|
|
private void OnEnable()
|
|
{
|
|
_onGameplayActive?.Subscribe(OnGameplayActiveChanged).AddTo(_subscriptions);
|
|
}
|
|
|
|
private void OnDisable() => _subscriptions.Clear();
|
|
|
|
private void OnGameplayActiveChanged(bool value) => _gameplayActive = value;
|
|
|
|
private void Update()
|
|
{
|
|
if (!_gameplayActive || _saveManager == null) return;
|
|
_timer += Time.deltaTime;
|
|
if (_timer >= _intervalSeconds)
|
|
{
|
|
_timer = 0f;
|
|
_ = _saveManager.SaveAsync(EmergencySlot);
|
|
}
|
|
}
|
|
|
|
public bool HasEmergencySave()
|
|
=> _saveManager != null && _saveManager.SlotExists(EmergencySlot);
|
|
|
|
public async Task PromoteToSlot(int targetSlot)
|
|
{
|
|
if (_saveManager == null) return;
|
|
await _saveManager.PromoteEmergencyToSlotAsync(targetSlot, EmergencySlot);
|
|
}
|
|
}
|
|
}
|