using System.Diagnostics.CodeAnalysis; namespace NeonSprawl.Server.Game.Combat; /// Adapter over (NEO-79). public sealed class AbilityDefinitionRegistry(AbilityDefinitionCatalog catalog) : IAbilityDefinitionRegistry { private readonly IReadOnlyList _definitionsInIdOrder = BuildDefinitionsInIdOrder(catalog); /// public bool TryGetDefinition(string? abilityId, [NotNullWhen(true)] out AbilityDefRow? definition) { if (abilityId is null) { definition = null; return false; } return catalog.TryGetAbility(abilityId, out definition); } /// public bool TryNormalizeKnown(string rawAbilityId, [NotNullWhen(true)] out string normalized) { normalized = rawAbilityId.Trim().ToLowerInvariant(); if (normalized.Length == 0) { normalized = string.Empty; return false; } return catalog.TryGetAbility(normalized, out _); } /// public IReadOnlyList GetDefinitionsInIdOrder() => _definitionsInIdOrder; private static IReadOnlyList BuildDefinitionsInIdOrder(AbilityDefinitionCatalog catalog) { var ids = catalog.ById.Keys.OrderBy(k => k, StringComparer.Ordinal).ToArray(); var list = new List(ids.Length); foreach (var id in ids) { list.Add(catalog.ById[id]); } return list; } }