using System.Diagnostics.CodeAnalysis; namespace NeonSprawl.Server.Game.Encounters; /// Adapter over (NEO-102). public sealed class EncounterDefinitionRegistry(EncounterDefinitionCatalog catalog) : IEncounterDefinitionRegistry { private readonly IReadOnlyList _definitionsInIdOrder = BuildDefinitionsInIdOrder(catalog); /// public bool TryGetDefinition(string? encounterId, [NotNullWhen(true)] out EncounterDefRow? definition) { if (encounterId is null) { definition = null; return false; } return catalog.TryGetEncounter(encounterId, out definition); } /// public bool TryNormalizeKnown(string? rawEncounterId, [NotNullWhen(true)] out string normalized) { if (rawEncounterId is null) { normalized = string.Empty; return false; } normalized = rawEncounterId.Trim().ToLowerInvariant(); if (normalized.Length == 0) { normalized = string.Empty; return false; } return catalog.TryGetEncounter(normalized, out _); } /// public IReadOnlyList GetDefinitionsInIdOrder() => _definitionsInIdOrder; private static List BuildDefinitionsInIdOrder(EncounterDefinitionCatalog catalog) { string[] ids = [.. catalog.ById.Keys.OrderBy(k => k, StringComparer.Ordinal)]; var list = new List(ids.Length); foreach (var id in ids) { list.Add(catalog.ById[id]); } return list; } }