using System.Text.Json.Serialization; namespace NeonSprawl.Server.Game.Quests; /// JSON body for GET /game/players/{{id}}/quest-progress (NEO-119). public sealed class QuestProgressListResponse { public const int CurrentSchemaVersion = 1; [JsonPropertyName("schemaVersion")] public int SchemaVersion { get; init; } = CurrentSchemaVersion; [JsonPropertyName("playerId")] public required string PlayerId { get; init; } /// Per-player rows ordered by catalog quest id (ordinal). [JsonPropertyName("quests")] public required IReadOnlyList Quests { get; init; } } /// Authoritative per-player progress for one quest definition. public sealed class QuestProgressRowJson { [JsonPropertyName("questId")] public required string QuestId { get; init; } /// not_started, active, or completed. [JsonPropertyName("status")] public required string Status { get; init; } [JsonPropertyName("currentStepIndex")] public int CurrentStepIndex { get; init; } /// Objective id → accumulated count for the current step only. [JsonPropertyName("objectiveCounters")] public required IReadOnlyDictionary ObjectiveCounters { get; init; } [JsonPropertyName("completedAt")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public DateTimeOffset? CompletedAt { get; init; } /// Grant snapshot when is completed and delivery was recorded (NEO-129). [JsonPropertyName("completionRewardSummary")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public QuestCompletionRewardSummaryJson? CompletionRewardSummary { get; init; } } /// Item + skill XP grants applied on first-time quest completion (NEO-129). public sealed class QuestCompletionRewardSummaryJson { [JsonPropertyName("itemGrants")] public required IReadOnlyList ItemGrants { get; init; } [JsonPropertyName("skillXpGrants")] public required IReadOnlyList SkillXpGrants { get; init; } } /// One item grant line in . public sealed class QuestItemGrantJson { [JsonPropertyName("itemId")] public required string ItemId { get; init; } [JsonPropertyName("quantity")] public required int Quantity { get; init; } } /// One skill XP grant line in . public sealed class QuestSkillXpGrantJson { [JsonPropertyName("skillId")] public required string SkillId { get; init; } [JsonPropertyName("amount")] public required int Amount { get; init; } }