neon-sprawl/server/NeonSprawl.Server/Game/Encounters/EncounterDefinitionsWorldAp...

69 lines
2.6 KiB
C#

namespace NeonSprawl.Server.Game.Encounters;
/// <summary>Maps <c>GET /game/world/encounter-definitions</c> (NEO-103).</summary>
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<EncounterDefinitionJson>(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<EncounterRewardGrantJson>(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,
};
}
}