neon-sprawl/server/NeonSprawl.Server/Game/Quests/QuestAcceptApi.cs

80 lines
2.9 KiB
C#

using NeonSprawl.Server.Game.Factions;
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;
/// <summary>Maps <c>POST /game/players/{{id}}/quests/{{questId}}/accept</c> (NEO-120).</summary>
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, IFactionStandingStore standingStore,
IReputationDeltaStore auditStore, 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,
standingStore,
auditStore,
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,
};
}
}