using NeonSprawl.Server.Game.Items; using NeonSprawl.Server.Game.Mastery; using NeonSprawl.Server.Game.PositionState; using NeonSprawl.Server.Game.Rewards; using NeonSprawl.Server.Game.Skills; namespace NeonSprawl.Server.Game.Quests; /// Maps POST /game/players/{{id}}/quests/{{questId}}/accept (NEO-120). public static class QuestAcceptApi { public static WebApplication MapQuestAcceptApi(this WebApplication app) { app.MapPost( "/game/players/{id}/quests/{questId}/accept", (string id, string questId, QuestAcceptRequest? body, IPositionStateStore positions, IQuestDefinitionRegistry questRegistry, IPlayerQuestStateStore progressStore, IPlayerInventoryStore inventoryStore, IItemDefinitionRegistry itemRegistry, ISkillDefinitionRegistry skillRegistry, IPlayerSkillProgressionStore skillProgressionStore, ISkillLevelCurve levelCurve, PerkUnlockEngine perkUnlockEngine, IPlayerPerkStateStore perkStore, IRewardDeliveryStore deliveryStore, TimeProvider timeProvider) => { if (body is not null && body.SchemaVersion != 0 && body.SchemaVersion != QuestAcceptRequest.CurrentSchemaVersion) { return Results.BadRequest(); } var trimmedId = id.Trim(); if (trimmedId.Length == 0 || !positions.TryGetPosition(trimmedId, out _)) { return Results.NotFound(); } var result = QuestStateOperations.TryAccept( trimmedId, questId, questRegistry, progressStore, inventoryStore, itemRegistry, skillRegistry, skillProgressionStore, levelCurve, perkUnlockEngine, perkStore, deliveryStore, timeProvider); return Results.Json(MapResponse(trimmedId, deliveryStore, result)); }); return app; } internal static QuestAcceptResponse MapResponse( string playerId, IRewardDeliveryStore deliveryStore, QuestStateOperationResult result) { QuestProgressRowJson? quest = null; if (result.Snapshot is { } snapshot) { quest = QuestProgressApi.MapQuestProgressRow(playerId, snapshot, deliveryStore); } return new QuestAcceptResponse { Accepted = result.Success, ReasonCode = result.ReasonCode, Quest = quest, }; } }