using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace AibisDream.SaveSystem
{
///
/// 快照 section 的稳定字符串 id。
/// 用于 JSON key、Provider 注册与反序列化,避免使用 AssemblyQualifiedName。
///
public static class SnapshotProviderIds
{
public const string Environment = "env";
public const string Actor = "actor";
public const string Audio = "audio";
public const string Timeline = "timeline";
public const string Screen = "screen";
public const string PlayTool = "playTool";
public const string Showcase = "showcase";
public const string Subway = "subway";
public const string PunchTape = "punchTape";
public const string Fix = "fix";
public const string FixPanel = "fixPanel";
public const string BodyModule = "bodyModule";
public const string Eye = "eye";
///
/// P1 应参与 Capture 的 provider 清单。
/// 据此告警缺失项;不含深度维修。
/// scene 与 macro 已提升到 根对象,由框架直管。
///
public static readonly string[] RequiredForCapture =
{
Environment, Actor, Audio, Timeline, Subway, Fix, Showcase, PlayTool, Screen
};
}
///
/// 运行时登记全部 。
/// Capture/Restore 时按 迭代;
/// 不使用「谁注册了谁才存」的隐式行为,RequiredForCapture 用于显式校验。
///
public static class SnapshotRegistry
{
private static readonly Dictionary Providers = new();
private static bool _initialized;
/// 幂等初始化:注册 P1 所需的全部 Provider。
public static void EnsureInitialized()
{
if (_initialized) return;
_initialized = true;
Register(new EnvironmentSnapshotProvider());
Register(new ActorSnapshotProvider());
Register(new AudioSnapshotProvider());
Register(new TimelineSnapshotProvider());
Register(new SubwaySnapshotProvider());
Register(new PunchTapeSnapshotProvider());
Register(new FixSnapshotProvider());
Register(new FixPanelSnapshotProvider());
Register(new BodyModuleSnapshotProvider());
Register(new EyeSnapshotProvider());
Register(new ShowcaseSnapshotProvider());
Register(new PlayToolSnapshotProvider());
Register(new ScreenSnapshotProvider());
}
/// 注册 provider;同 SaveId 后者覆盖前者。
public static void Register(ISnapshotProvider provider)
{
if (provider == null) return;
Providers[provider.SaveId] = provider;
}
public static void Unregister(string saveId)
{
Providers.Remove(saveId);
}
public static bool TryGet(string saveId, out ISnapshotProvider provider)
{
return Providers.TryGetValue(saveId, out provider);
}
/// 按 RestoreOrder 升序返回,供还原流水线使用。
public static IReadOnlyList GetOrderedProviders()
{
return Providers.Values.OrderBy(p => p.RestoreOrder).ToList();
}
///
/// 校验 ;
/// 缺失时 LogWarning 但不阻断 Capture。
///
public static void ValidateRequiredProviders()
{
foreach (var saveId in SnapshotProviderIds.RequiredForCapture)
{
if (!Providers.ContainsKey(saveId))
{
Debug.LogWarning($"[SnapshotRegistry] 缺少快照 provider: {saveId}");
}
}
}
}
}