using MessagePack; namespace SVSim.EmulatedEntrypoint.Models.Dtos.Responses.Practice; [MessagePackObject] public class PracticeOpponent { /// Practice slot id (unique per entry; AI opponent identifier). [Key("practice_id")] public int PracticeId { get; set; } /// /// Text-table id resolved client-side via Data.Master.GetPracticeText(text_id). /// Stringified int — client calls .ToString() before lookup. Sent as string to be safe. /// [Key("text_id")] public string TextId { get; set; } = string.Empty; /// Class (leader) id the AI plays. [Key("class_id")] public int ClassId { get; set; } /// Portrait / character id (which leader art the AI uses). [Key("chara_id")] public int CharaId { get; set; } /// Title-degree id shown next to the AI's name. [Key("degree_id")] public int DegreeId { get; set; } /// AI deck-strength tier (drives which preset deck the AI uses). [Key("ai_deck_level")] public int AiDeckLevel { get; set; } /// AI decision-making tier. [Key("ai_logic_level")] public int AiLogicLevel { get; set; } /// Starting HP for the AI side (often 20). [Key("ai_max_life")] public int AiMaxLife { get; set; } = 20; /// 3D battle-field asset id (string on the wire; client int.TryParse's it). [Key("battle3dfield_id")] public string Battle3dFieldId { get; set; } = "1"; /// Optional. true => entry disabled, client prepends maintenance suffix. [Key("is_maintenance")] public bool? IsMaintenance { get; set; } /// true => entry is a special "campaign" practice (event-tied). [Key("is_campaign_practice")] public bool IsCampaignPractice { get; set; } }