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,
};
}
}