106 lines
2.9 KiB
C#
106 lines
2.9 KiB
C#
namespace AibisDream.SaveSystem
|
|
{
|
|
/// <summary>
|
|
/// 可存点被拒绝的原因,供日志与 UI 提示使用。
|
|
/// </summary>
|
|
public enum SavePointRejectReason
|
|
{
|
|
None,
|
|
Restoring,
|
|
GamePaused,
|
|
NoActiveNode,
|
|
StartNode,
|
|
FunctionNode,
|
|
NoAutoSave
|
|
}
|
|
|
|
/// <summary>
|
|
/// 可存点判定器。
|
|
/// <para>
|
|
/// P3 只搭框架:规则不是最终版,后续随 Yarn 节点 tags 整理和章节策略扩展而更新。
|
|
/// 当前所有 FixState 均放行,不可存状态由 Yarn 节点流程控制。
|
|
/// </para>
|
|
/// </summary>
|
|
public static class SavePointEvaluator
|
|
{
|
|
/// <summary>
|
|
/// 当前是否可以自动存档。
|
|
/// </summary>
|
|
public static bool CanAutoSave(out SavePointRejectReason reason)
|
|
{
|
|
if (SaveRestoreOrchestrator.IsRestoring)
|
|
{
|
|
reason = SavePointRejectReason.Restoring;
|
|
return false;
|
|
}
|
|
|
|
if (GameManager.Instance != null && GameManager.Instance.state.isInPause)
|
|
{
|
|
reason = SavePointRejectReason.GamePaused;
|
|
return false;
|
|
}
|
|
|
|
var (nodeName, tags) = DialogController.Instance != null
|
|
? DialogController.Instance.GetCurrentNodeContext()
|
|
: (null, null);
|
|
|
|
if (string.IsNullOrEmpty(nodeName))
|
|
{
|
|
reason = SavePointRejectReason.NoActiveNode;
|
|
return false;
|
|
}
|
|
|
|
if (nodeName == "Start")
|
|
{
|
|
reason = SavePointRejectReason.StartNode;
|
|
return false;
|
|
}
|
|
|
|
if (tags != null && IsTagPresent(tags, "function"))
|
|
{
|
|
reason = SavePointRejectReason.FunctionNode;
|
|
return false;
|
|
}
|
|
|
|
reason = SavePointRejectReason.None;
|
|
return true;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 当前是否可以手动存档。
|
|
/// 手动档 = 复制最近自动档,因此需要当前可自动存档且自动档存在。
|
|
/// </summary>
|
|
public static bool CanManualSave(out SavePointRejectReason reason)
|
|
{
|
|
if (!CanAutoSave(out reason))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if (!SlotDirectory.Exists(SlotIndex.Auto))
|
|
{
|
|
reason = SavePointRejectReason.NoAutoSave;
|
|
return false;
|
|
}
|
|
|
|
reason = SavePointRejectReason.None;
|
|
return true;
|
|
}
|
|
|
|
private static bool IsTagPresent(System.Collections.Generic.IReadOnlyList<string> tags, string tag)
|
|
{
|
|
if (tags == null) return false;
|
|
|
|
foreach (var t in tags)
|
|
{
|
|
if (t == tag)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|
|
}
|