using System.Text.Json.Serialization; namespace GameCli; /// Input line from the client (per step OR a reset command). public sealed class StepInput { [JsonPropertyName("action")] public int? Action { get; set; } [JsonPropertyName("target")] public float[]? Target { get; set; } [JsonPropertyName("cmd")] public string? Cmd { get; set; } [JsonPropertyName("seed")] public int? Seed { get; set; } } /// Output line from the CLI after each step or reset. public sealed class StepOutput { [JsonPropertyName("obs")] public float[] Obs { get; set; } = System.Array.Empty(); [JsonPropertyName("state")] public ShipStateDto State { get; set; } = new(); [JsonPropertyName("reward")] public float Reward { get; set; } [JsonPropertyName("done")] public bool Done { get; set; } [JsonPropertyName("step")] public int Step { get; set; } } /// Renderable ship pose (subset of ShipState that the UI actually draws). public sealed class ShipStateDto { [JsonPropertyName("x")] public float X { get; set; } [JsonPropertyName("y")] public float Y { get; set; } [JsonPropertyName("angle")] public float Angle { get; set; } [JsonPropertyName("engine")] public int Engine { get; set; } } /// Startup handshake emitted as the very first stdout line. public sealed class InitMessage { [JsonPropertyName("init")] public InitPayload Init { get; set; } = new(); } public sealed class InitPayload { [JsonPropertyName("world")] public float[] World { get; set; } = new[] { 1f, 1f }; [JsonPropertyName("dt")] public float Dt { get; set; } [JsonPropertyName("obs_dim")] public int ObsDim { get; set; } [JsonPropertyName("n_actions")] public int NActions { get; set; } } /// Source-generated JSON contracts for AOT-friendly, allocation-lean (de)serialization. [JsonSourceGenerationOptions(WriteIndented = false)] [JsonSerializable(typeof(StepInput))] [JsonSerializable(typeof(StepOutput))] [JsonSerializable(typeof(ShipStateDto))] [JsonSerializable(typeof(InitMessage))] [JsonSerializable(typeof(InitPayload))] internal partial class ProtocolJsonContext : JsonSerializerContext { }