using System.Text.Json.Serialization; namespace NeonSprawl.Server.Game.Crafting; /// POST body for POST /game/players/{{id}}/craft (NEO-70). public sealed class PlayerCraftRequest { public const int CurrentSchemaVersion = 1; [JsonPropertyName("schemaVersion")] public int SchemaVersion { get; init; } [JsonPropertyName("recipeId")] public required string RecipeId { get; init; } /// Optional batch count; defaults to 1 when omitted. [JsonPropertyName("quantity")] public int? Quantity { get; init; } } /// POST response — promoted wire shape (NEO-70). public sealed class CraftResponse { public const int CurrentSchemaVersion = 1; [JsonPropertyName("schemaVersion")] public int SchemaVersion { get; init; } = CurrentSchemaVersion; [JsonPropertyName("success")] public bool Success { get; init; } [JsonPropertyName("reasonCode")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? ReasonCode { get; init; } [JsonPropertyName("inputsConsumed")] public required IReadOnlyList InputsConsumed { get; init; } [JsonPropertyName("outputsGranted")] public required IReadOnlyList OutputsGranted { get; init; } [JsonPropertyName("xpGrantSummary")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public CraftXpGrantSummaryJson? XpGrantSummary { get; init; } } /// One scaled input consumed or output granted on successful craft. public sealed class CraftIoAppliedJson { [JsonPropertyName("itemId")] public required string ItemId { get; init; } [JsonPropertyName("quantity")] public int Quantity { get; init; } } /// Refine skill XP applied on successful craft. public sealed class CraftXpGrantSummaryJson { [JsonPropertyName("skillId")] public required string SkillId { get; init; } [JsonPropertyName("amount")] public int Amount { get; init; } [JsonPropertyName("sourceKind")] public required string SourceKind { get; init; } }