using Microsoft.Extensions.Options; using NeonSprawl.Server.Game.Items; using NeonSprawl.Server.Game.Skills; namespace NeonSprawl.Server.Game.Encounters; /// DI registration for the fail-fast encounter + reward-table catalogs and registries (NEO-101, NEO-102). public static class EncounterCatalogServiceCollectionExtensions { /// Binds and registers encounter + reward-table catalog singletons and registries. public static IServiceCollection AddEncounterAndRewardCatalogs(this IServiceCollection services, IConfiguration configuration) { services.AddOptions() .Bind(configuration.GetSection(ContentPathsOptions.SectionName)); services.AddSingleton(sp => { var hostEnv = sp.GetRequiredService(); var opts = sp.GetRequiredService>().Value; var itemCatalog = sp.GetRequiredService(); var logger = sp.GetRequiredService() .CreateLogger("NeonSprawl.Server.Game.Encounters.RewardTableCatalog"); var rewardTablesDir = RewardTableCatalogPathResolution.ResolveRewardTablesDirectory( opts.RewardTablesDirectory, hostEnv.ContentRootPath); var rewardTableSchemaPath = RewardTableCatalogPathResolution.ResolveRewardTableDefSchemaPath( rewardTablesDir, opts.RewardTableDefSchemaPath, hostEnv.ContentRootPath); var rewardGrantRowSchemaPath = RewardTableCatalogPathResolution.ResolveRewardGrantRowSchemaPath( rewardTablesDir, opts.RewardGrantRowSchemaPath, hostEnv.ContentRootPath); var knownItemIds = itemCatalog.ById.Keys.ToHashSet(StringComparer.Ordinal); return RewardTableDefinitionCatalogLoader.Load( rewardTablesDir, rewardTableSchemaPath, rewardGrantRowSchemaPath, knownItemIds, logger); }); services.AddSingleton(sp => { var hostEnv = sp.GetRequiredService(); var opts = sp.GetRequiredService>().Value; var rewardTableCatalog = sp.GetRequiredService(); var logger = sp.GetRequiredService() .CreateLogger("NeonSprawl.Server.Game.Encounters.EncounterCatalog"); var encountersDir = EncounterCatalogPathResolution.ResolveEncountersDirectory( opts.EncountersDirectory, hostEnv.ContentRootPath); var encounterDefSchemaPath = EncounterCatalogPathResolution.ResolveEncounterDefSchemaPath( encountersDir, opts.EncounterDefSchemaPath, hostEnv.ContentRootPath); var knownRewardTableIds = rewardTableCatalog.ById.Keys.ToHashSet(StringComparer.Ordinal); return EncounterDefinitionCatalogLoader.Load( encountersDir, encounterDefSchemaPath, knownRewardTableIds, logger); }); services.AddSingleton(sp => new EncounterDefinitionRegistry(sp.GetRequiredService())); services.AddSingleton(sp => new RewardTableDefinitionRegistry(sp.GetRequiredService())); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); return services; } }