namespace Theriapolis.Core.Persistence; /// /// Phase 6 M2 — serializable snapshot of . /// Plain-data fields only; rebuilt back into the live aggregate by the /// PlayScreen restore path. /// /// Round-trips via SaveCodec tags 110 (faction standings) and 112 /// (reputation aggregate). The split lets the codec emit faction /// standings even when no personal records exist, keeping save files /// small for short playthroughs. /// public sealed class ReputationSnapshot { /// Faction id → integer standing in ±C.REP_MAX. public Dictionary FactionStandings { get; set; } = new(); /// Per-NPC personal records, keyed by role tag. public List Personal { get; set; } = new(); /// Most recent events. public List Ledger { get; set; } = new(); } public sealed class PersonalDispositionSnapshot { public string RoleTag { get; set; } = ""; public int Score { get; set; } public byte Trust { get; set; } // TrustLevel byte value public bool Betrayed { get; set; } public long LastInteractionSeconds { get; set; } public string[] MemoryTags { get; set; } = System.Array.Empty(); public RepEventSnapshot[] Log { get; set; } = System.Array.Empty(); } public sealed class RepEventSnapshot { public int SequenceId { get; set; } // Phase 6 M5 public byte Kind { get; set; } // RepEventKind byte value public string FactionId { get; set; } = ""; public string RoleTag { get; set; } = ""; public int Magnitude { get; set; } public string Note { get; set; } = ""; public int OriginTileX { get; set; } public int OriginTileY { get; set; } public long TimestampSeconds { get; set; } }