using UnityEngine; using BaseGames.World; using BaseGames.Player; using BaseGames.Core.Save; namespace BaseGames.Support.AntiSoftlock { /// /// 硬性能力门禁(架构 16_SupportingModules §5.3)。 /// 在 AbilityGate 的基础上增加次级验证:检查玩家是否真正拾取了物理道具。 /// 当 _requirePhysicalValidation = true 时,还需要通过 _physicalPickupSwitchKey 确认。 /// public class HardAbilityGate : AbilityGate { [Header("HardAbilityGate 设置")] [Tooltip("是否还要求物理拾取验证(需要 EventChains.WorldFlags 中对应 Key = true)")] [SerializeField] private bool _requirePhysicalValidation = false; [Tooltip("物理拾取验证 Flag Key(需 EventChains.WorldFlags[key] == true)")] [SerializeField] private string _physicalPickupSwitchKey; [Header("引用")] [SerializeField] private GameSaveManager _saveManager; protected override bool EvaluateAccess() { if (!base.EvaluateAccess()) return false; if (!_requirePhysicalValidation) return true; // 次级检查:物理拾取确认 if (string.IsNullOrEmpty(_physicalPickupSwitchKey)) return true; var save = _saveManager != null ? _saveManager.Data : null; if (save?.EventChains?.WorldFlags == null) return false; return save.EventChains.WorldFlags.TryGetValue(_physicalPickupSwitchKey, out bool val) && val; } } }