namespace AcDream.UI.Abstractions.Panels.Settings; /// /// Chat-related preferences persisted to settings.json. Mixes /// retail's CharacterOptions2 chat-channel filter bits (Hear*Chat /// + TimeStamp + FilterLanguage + AppearOffline) with a few visual /// preferences (font size) that don't have a retail bitfield. /// See docs/research/named-retail/acclient.h:3451+ for the /// retail bit values. /// /// /// L.0 scope: local-only like the rest of L.0. The Hear*Chat /// flags affect client-side display filtering of the existing /// channels — the server still streams every line; the client decides /// what to render. Server-sync arrives in a later phase that flips the /// retail-faithful "tell server which channels I'm subscribed to" /// switch. /// /// public sealed record ChatSettings( // CharacterOptions2 (32-bit) channel filters. bool HearGeneralChat, // 0x100 — General channel bool HearTradeChat, // 0x200 — Trade channel bool HearLFGChat, // 0x400 — LFG channel bool HearRoleplayChat, // 0x800 — RP channel bool HearSocietyChat, // 0x80000 — Society chat (CD/EW/RB) bool AppearOffline, // 0x1000 — hide /who status bool ShowTimestamps, // 0x40 — TimeStamp prefix on chat lines bool FilterProfanity, // 0x20000 — FilterLanguage (Turbine's profanity filter) // Visual / UX (no retail bitfield). float FontSize) // chat panel font, 10..20 pt { /// Sensible starting values matching the retail "all on" stance. public static ChatSettings Default { get; } = new( HearGeneralChat: true, HearTradeChat: true, HearLFGChat: true, HearRoleplayChat: true, HearSocietyChat: true, AppearOffline: false, ShowTimestamps: true, FilterProfanity: true, FontSize: 12f); }