using System.Text.Json.Serialization; namespace NeonSprawl.Server.Game.Encounters; /// JSON body for GET /game/world/encounter-definitions (NEO-103). public sealed class EncounterDefinitionsListResponse { public const int CurrentSchemaVersion = 1; [JsonPropertyName("schemaVersion")] public int SchemaVersion { get; init; } = CurrentSchemaVersion; /// Loaded encounters ordered by stable id (ordinal), matching . [JsonPropertyName("encounters")] public required IReadOnlyList Encounters { get; init; } } /// One row in the read-only encounter definition projection. public sealed class EncounterDefinitionJson { [JsonPropertyName("id")] public required string Id { get; init; } [JsonPropertyName("displayName")] public required string DisplayName { get; init; } [JsonPropertyName("completionCriteria")] public required EncounterCompletionCriteriaJson CompletionCriteria { get; init; } [JsonPropertyName("requiredNpcInstanceIds")] public required IReadOnlyList RequiredNpcInstanceIds { get; init; } [JsonPropertyName("rewardTable")] public required EncounterRewardTableJson RewardTable { get; init; } } /// Completion rule summary for one encounter row. public sealed class EncounterCompletionCriteriaJson { [JsonPropertyName("kind")] public required string Kind { get; init; } } /// Nested reward table summary linked from an encounter row. public sealed class EncounterRewardTableJson { [JsonPropertyName("id")] public required string Id { get; init; } [JsonPropertyName("displayName")] public required string DisplayName { get; init; } [JsonPropertyName("fixedGrants")] public required IReadOnlyList FixedGrants { get; init; } } /// One deterministic item grant in a nested reward table summary. public sealed class EncounterRewardGrantJson { [JsonPropertyName("itemId")] public required string ItemId { get; init; } [JsonPropertyName("quantity")] public required int Quantity { get; init; } }