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; }
/// Minimum-standing gates for quest accept; omitted when the quest has no rules (NEO-140).
[JsonPropertyName("factionGateRules")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public IReadOnlyList? FactionGateRules { get; init; }
}
/// One faction gate rule in the read-only quest definition projection (NEO-140).
public sealed class QuestFactionGateRuleJson
{
[JsonPropertyName("factionId")]
public required string FactionId { get; init; }
[JsonPropertyName("minStanding")]
public int MinStanding { 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; }
}