79 lines
2.9 KiB
C#
79 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,
|
|
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,
|
|
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,
|
|
};
|
|
}
|
|
}
|