namespace NeonSprawl.Server.Game.Quests;
/// Maps GET /game/world/quest-definitions (NEO-115).
public static class QuestDefinitionsWorldApi
{
public static WebApplication MapQuestDefinitionsWorldApi(this WebApplication app)
{
app.MapGet(
"/game/world/quest-definitions",
(IQuestDefinitionRegistry questRegistry) =>
{
var defs = questRegistry.GetDefinitionsInIdOrder();
var quests = new List(defs.Count);
foreach (var d in defs)
{
quests.Add(
new QuestDefinitionJson
{
Id = d.Id,
DisplayName = d.DisplayName,
PrerequisiteQuestIds = d.PrerequisiteQuestIds,
Steps = MapSteps(d.Steps),
});
}
return Results.Json(
new QuestDefinitionsListResponse
{
SchemaVersion = QuestDefinitionsListResponse.CurrentSchemaVersion,
Quests = quests,
});
});
return app;
}
private static List MapSteps(IReadOnlyList steps)
{
var list = new List(steps.Count);
foreach (var step in steps)
{
list.Add(
new QuestStepDefinitionJson
{
Id = step.Id,
DisplayName = step.DisplayName,
Objectives = MapObjectives(step.Objectives),
});
}
return list;
}
private static List MapObjectives(IReadOnlyList objectives)
{
var list = new List(objectives.Count);
foreach (var objective in objectives)
{
list.Add(MapObjective(objective));
}
return list;
}
private static QuestObjectiveDefinitionJson MapObjective(QuestObjectiveDefRow objective) =>
objective.Kind switch
{
"gather_item" or "inventory_has_item" => new QuestObjectiveDefinitionJson
{
Id = objective.Id,
Kind = objective.Kind,
ItemId = objective.ItemId,
Quantity = objective.Quantity,
},
"craft_recipe" => new QuestObjectiveDefinitionJson
{
Id = objective.Id,
Kind = objective.Kind,
RecipeId = objective.RecipeId,
Quantity = objective.Quantity,
},
"encounter_complete" => new QuestObjectiveDefinitionJson
{
Id = objective.Id,
Kind = objective.Kind,
EncounterId = objective.EncounterId,
},
_ => new QuestObjectiveDefinitionJson
{
Id = objective.Id,
Kind = objective.Kind,
ItemId = objective.ItemId,
Quantity = objective.Quantity,
RecipeId = objective.RecipeId,
EncounterId = objective.EncounterId,
},
};
}