namespace NeonSprawl.Server.Game.Encounters; /// Maps GET /game/world/encounter-definitions (NEO-103). public static class EncounterDefinitionsWorldApi { public static WebApplication MapEncounterDefinitionsWorldApi(this WebApplication app) { app.MapGet( "/game/world/encounter-definitions", (IEncounterDefinitionRegistry encounterRegistry, IRewardTableDefinitionRegistry rewardTableRegistry) => { var defs = encounterRegistry.GetDefinitionsInIdOrder(); var encounters = new List(defs.Count); foreach (var d in defs) { if (!rewardTableRegistry.TryGetDefinition(d.RewardTableId, out var rewardTable) || rewardTable is null) { throw new InvalidOperationException( $"Encounter definition '{d.Id}' references reward table '{d.RewardTableId}' that is not in the loaded catalog."); } encounters.Add( new EncounterDefinitionJson { Id = d.Id, DisplayName = d.DisplayName, CompletionCriteria = new EncounterCompletionCriteriaJson { Kind = d.CompletionCriteriaKind, }, RequiredNpcInstanceIds = d.RequiredNpcInstanceIds, RewardTable = MapRewardTable(rewardTable), }); } return Results.Json( new EncounterDefinitionsListResponse { SchemaVersion = EncounterDefinitionsListResponse.CurrentSchemaVersion, Encounters = encounters, }); }); return app; } private static EncounterRewardTableJson MapRewardTable(RewardTableDefRow rewardTable) { var grants = new List(rewardTable.FixedGrants.Count); foreach (var grant in rewardTable.FixedGrants) { grants.Add( new EncounterRewardGrantJson { ItemId = grant.ItemId, Quantity = grant.Quantity, }); } return new EncounterRewardTableJson { Id = rewardTable.Id, DisplayName = rewardTable.DisplayName, FixedGrants = grants, }; } }