using System;
using UnityEngine;
using Yarn.Unity;
namespace AibisDream.SaveSystem
{
///
/// 从运行时组装 (纯内存,不写盘)。
///
/// 流程:元数据 → 锚点 → Yarn 变量 → 各 Provider.Capture。
/// 宏观信息(scene/macro)由对应 Provider 写入 sections,不再额外汇总到顶层。
///
///
public static class SnapshotCapture
{
/// 捕获当前完整快照。调用前需已注册全部 provider。
public static SaveSnapshot Capture(YarnVariableStorage storage)
{
SnapshotRegistry.ValidateRequiredProviders();
var snapshot = new SaveSnapshot
{
gameVersion = Application.version,
savedAt = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
};
CaptureAnchor(snapshot);
CaptureYarnVariables(storage, snapshot);
foreach (var provider in SnapshotRegistry.GetOrderedProviders())
{
var dto = provider.Capture();
if (dto == null) continue;
snapshot.sections[provider.SaveId] = dto;
}
return snapshot;
}
private static void CaptureAnchor(SaveSnapshot snapshot)
{
var dialog = DialogController.Instance;
if (dialog == null) return;
var (nodeName, _) = dialog.GetCurrentNodeContext();
var yarnProject = dialog.DialogueRunner?.YarnProject;
var projectId = yarnProject != null ? yarnProject.name : string.Empty;
snapshot.anchor = new AnchorSnapshot
{
yarnProjectId = projectId,
nodeName = nodeName ?? string.Empty
};
}
private static void CaptureYarnVariables(YarnVariableStorage storage, SaveSnapshot snapshot)
{
var (floats, strings, bools) = storage.GetAllVariables();
snapshot.yarnVariables = new YarnVariablesSnapshot
{
floats = floats ?? new(),
strings = strings ?? new(),
bools = bools ?? new()
};
}
}
}