using System; using System.Collections.Generic; using System.Linq; namespace Vanguard.Battle { /// /// Счётчик причин блокировки: анимация, оверлей, контекстное меню. /// Ввод возвращается только когда снята последняя причина. /// public sealed class InputLockService { private readonly Dictionary _reasons = new Dictionary(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 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); } } }