using System.Diagnostics.CodeAnalysis;
namespace NeonSprawl.Server.Game.Npc;
/// Adapter over (NEO-89).
public sealed class NpcBehaviorDefinitionRegistry(NpcBehaviorDefinitionCatalog catalog) : INpcBehaviorDefinitionRegistry
{
private readonly IReadOnlyList _definitionsInIdOrder = BuildDefinitionsInIdOrder(catalog);
///
public bool TryGetDefinition(string? behaviorId, [NotNullWhen(true)] out NpcBehaviorDefRow? definition)
{
if (behaviorId is null)
{
definition = null;
return false;
}
return catalog.TryGetBehavior(behaviorId, out definition);
}
///
public bool TryNormalizeKnown(string? rawBehaviorId, [NotNullWhen(true)] out string normalized)
{
if (rawBehaviorId is null)
{
normalized = string.Empty;
return false;
}
normalized = rawBehaviorId.Trim().ToLowerInvariant();
if (normalized.Length == 0)
{
normalized = string.Empty;
return false;
}
return catalog.TryGetBehavior(normalized, out _);
}
///
public IReadOnlyList GetDefinitionsInIdOrder() => _definitionsInIdOrder;
private static IReadOnlyList BuildDefinitionsInIdOrder(NpcBehaviorDefinitionCatalog 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;
}
}