using System.Text.Json.Serialization; namespace NeonSprawl.Server.Game.Quests; /// JSON body for GET /game/world/quest-definitions (NEO-115). public sealed class QuestDefinitionsListResponse { public const int CurrentSchemaVersion = 1; [JsonPropertyName("schemaVersion")] public int SchemaVersion { get; init; } = CurrentSchemaVersion; /// Loaded quests ordered by stable id (ordinal), matching . [JsonPropertyName("quests")] public required IReadOnlyList Quests { get; init; } } /// One row in the read-only quest definition projection. public sealed class QuestDefinitionJson { [JsonPropertyName("id")] public required string Id { get; init; } [JsonPropertyName("displayName")] public required string DisplayName { get; init; } [JsonPropertyName("prerequisiteQuestIds")] public required IReadOnlyList PrerequisiteQuestIds { get; init; } [JsonPropertyName("steps")] public required IReadOnlyList Steps { get; init; } } /// One step in the read-only quest definition projection. public sealed class QuestStepDefinitionJson { [JsonPropertyName("id")] public required string Id { get; init; } [JsonPropertyName("displayName")] public required string DisplayName { get; init; } [JsonPropertyName("objectives")] public required IReadOnlyList Objectives { get; init; } } /// One objective in the read-only quest definition projection (flat mirror of content). public sealed class QuestObjectiveDefinitionJson { [JsonPropertyName("id")] public required string Id { get; init; } [JsonPropertyName("kind")] public required string Kind { get; init; } [JsonPropertyName("itemId")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? ItemId { get; init; } [JsonPropertyName("quantity")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public int? Quantity { get; init; } [JsonPropertyName("recipeId")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? RecipeId { get; init; } [JsonPropertyName("encounterId")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? EncounterId { get; init; } }