65 lines
3.3 KiB
C#
65 lines
3.3 KiB
C#
using Microsoft.Extensions.Configuration;
|
|
using Microsoft.Extensions.Hosting;
|
|
using Microsoft.Extensions.Options;
|
|
using NeonSprawl.Server.Game.Encounters;
|
|
using NeonSprawl.Server.Game.Factions;
|
|
using NeonSprawl.Server.Game.Skills;
|
|
|
|
namespace NeonSprawl.Server.Game.Contracts;
|
|
|
|
/// <summary>DI registration for the fail-fast contract template catalog (NEO-145).</summary>
|
|
public static class ContractCatalogServiceCollectionExtensions
|
|
{
|
|
/// <summary>Binds <see cref="ContentPathsOptions"/> and registers <see cref="ContractTemplateCatalog"/> and <see cref="IContractTemplateRegistry"/> as singletons.</summary>
|
|
public static IServiceCollection AddContractTemplateCatalog(this IServiceCollection services, IConfiguration configuration)
|
|
{
|
|
services.AddOptions<ContentPathsOptions>()
|
|
.Bind(configuration.GetSection(ContentPathsOptions.SectionName));
|
|
|
|
services.AddSingleton<ContractTemplateCatalog>(sp =>
|
|
{
|
|
var hostEnv = sp.GetRequiredService<IHostEnvironment>();
|
|
var opts = sp.GetRequiredService<IOptions<ContentPathsOptions>>().Value;
|
|
var encounterCatalog = sp.GetRequiredService<EncounterDefinitionCatalog>();
|
|
var skillCatalog = sp.GetRequiredService<SkillDefinitionCatalog>();
|
|
var factionCatalog = sp.GetRequiredService<FactionDefinitionCatalog>();
|
|
var logger = sp.GetRequiredService<ILoggerFactory>()
|
|
.CreateLogger("NeonSprawl.Server.Game.Contracts.ContractCatalog");
|
|
|
|
var contractsDir = ContractCatalogPathResolution.ResolveContractsDirectory(
|
|
opts.ContractsDirectory,
|
|
hostEnv.ContentRootPath);
|
|
var contractTemplateSchemaPath = ContractCatalogPathResolution.ResolveContractTemplateSchemaPath(
|
|
contractsDir,
|
|
opts.ContractTemplateSchemaPath,
|
|
hostEnv.ContentRootPath);
|
|
var rewardGrantRowSchemaPath = ContractCatalogPathResolution.ResolveRewardGrantRowSchemaPath(contractsDir);
|
|
var questSkillXpGrantSchemaPath = ContractCatalogPathResolution.ResolveQuestSkillXpGrantSchemaPath(contractsDir);
|
|
var questRewardBundleSchemaPath = ContractCatalogPathResolution.ResolveQuestRewardBundleSchemaPath(contractsDir);
|
|
var factionGateRuleSchemaPath = ContractCatalogPathResolution.ResolveFactionGateRuleSchemaPath(contractsDir);
|
|
var reputationGrantRowSchemaPath = ContractCatalogPathResolution.ResolveReputationGrantRowSchemaPath(contractsDir);
|
|
|
|
var knownEncounterIds = encounterCatalog.ById.Keys.ToHashSet(StringComparer.Ordinal);
|
|
var knownFactionIds = factionCatalog.ById.Keys.ToHashSet(StringComparer.Ordinal);
|
|
|
|
return ContractTemplateCatalogLoader.Load(
|
|
contractsDir,
|
|
contractTemplateSchemaPath,
|
|
rewardGrantRowSchemaPath,
|
|
questSkillXpGrantSchemaPath,
|
|
questRewardBundleSchemaPath,
|
|
factionGateRuleSchemaPath,
|
|
reputationGrantRowSchemaPath,
|
|
knownEncounterIds,
|
|
knownFactionIds,
|
|
skillCatalog.ById,
|
|
logger);
|
|
});
|
|
|
|
services.AddSingleton<IContractTemplateRegistry>(sp =>
|
|
new ContractTemplateRegistry(sp.GetRequiredService<ContractTemplateCatalog>()));
|
|
|
|
return services;
|
|
}
|
|
}
|