69 lines
2.6 KiB
C#
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,
|
|
};
|
|
}
|
|
}
|