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