37 lines
1.5 KiB
C#
37 lines
1.5 KiB
C#
using UnityEngine;
|
||
using BaseGames.World;
|
||
using BaseGames.Player;
|
||
using BaseGames.Core.Save;
|
||
|
||
namespace BaseGames.Support.AntiSoftlock
|
||
{
|
||
/// <summary>
|
||
/// 硬性能力门禁(架构 16_SupportingModules §5.3)。
|
||
/// 在 AbilityGate 的基础上增加次级验证:检查玩家是否真正拾取了物理道具。
|
||
/// 当 _requirePhysicalValidation = true 时,还需要通过 _physicalPickupSwitchKey 确认。
|
||
/// </summary>
|
||
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;
|
||
}
|
||
}
|
||
}
|