VanguardReMaster/client/Assets/Vanguard/Runtime/Battle/InputLockService.cs

67 lines
1.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
namespace Vanguard.Battle
{
/// <summary>
/// Счётчик причин блокировки: анимация, оверлей, контекстное меню.
/// Ввод возвращается только когда снята последняя причина.
/// </summary>
public sealed class InputLockService
{
private readonly Dictionary<string, int> _reasons =
new Dictionary<string, int>(StringComparer.Ordinal);
public bool IsLocked => _reasons.Count > 0;
public string Describe() =>
_reasons.Count == 0
? "none"
: string.Join(",", _reasons.Select(pair => pair.Key + "=" + pair.Value));
public event Action<bool> Changed;
public void Acquire(string reason)
{
if (string.IsNullOrEmpty(reason))
return;
var wasLocked = _reasons.Count > 0;
_reasons.TryGetValue(reason, out var count);
_reasons[reason] = count + 1;
if (!wasLocked)
Changed?.Invoke(true);
}
public void Release(string reason)
{
if (string.IsNullOrEmpty(reason))
return;
if (!_reasons.TryGetValue(reason, out var count))
return;
if (count > 1)
{
_reasons[reason] = count - 1;
return;
}
_reasons.Remove(reason);
if (_reasons.Count == 0)
Changed?.Invoke(false);
}
public void ReleaseAll()
{
if (_reasons.Count == 0)
return;
_reasons.Clear();
Changed?.Invoke(false);
}
}
}