qstbak/FatePaths/Questionable.FatePaths/AssemblyFateDefinitionLoader.cs
2026-08-17 20:29:32 +10:00

41 lines
1.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Security.Cryptography;
using System.Threading;
using Questionable.Model.IO;
using Questionable.Model.Questing;
namespace Questionable.FatePaths;
internal static class AssemblyFateDefinitionLoader
{
private static readonly Lazy<IReadOnlyDictionary<ushort, FateDefinition>> Definitions = new Lazy<IReadOnlyDictionary<ushort, FateDefinition>>(LoadDefinitions, LazyThreadSafetyMode.ExecutionAndPublication);
internal static TimeSpan? DecodeDuration { get; private set; }
internal static Stream FateDefinitionSchema => typeof(AssemblyFateDefinitionLoader).Assembly.GetManifestResourceStream("Questionable.FatePaths.FateDefinitionSchema");
internal static IReadOnlyDictionary<ushort, FateDefinition> GetDefinitions()
{
return Definitions.Value;
}
private static IReadOnlyDictionary<ushort, FateDefinition> LoadDefinitions()
{
Stopwatch stopwatch = Stopwatch.StartNew();
using Stream stream = typeof(AssemblyFateDefinitionLoader).Assembly.GetManifestResourceStream("Questionable.FatePaths.FateBundle");
byte[] array = PathBundleSecret.Key();
List<KeyValuePair<string, FateDefinition>> list = PathBundle.Deserialize<FateDefinition>(stream, array);
CryptographicOperations.ZeroMemory(array);
Dictionary<ushort, FateDefinition> dictionary = new Dictionary<ushort, FateDefinition>(list.Count);
foreach (var (s, value) in list)
{
dictionary[ushort.Parse(s, CultureInfo.InvariantCulture)] = value;
}
DecodeDuration = stopwatch.Elapsed;
return dictionary;
}
}