diff --git a/Dalamud/Game/Chat/SeStringHandling/Payload.cs b/Dalamud/Game/Chat/SeStringHandling/Payload.cs index 519cd1e5c..2320a8dfb 100644 --- a/Dalamud/Game/Chat/SeStringHandling/Payload.cs +++ b/Dalamud/Game/Chat/SeStringHandling/Payload.cs @@ -8,12 +8,12 @@ using Serilog; // TODOs: // - refactor integer handling now that we have multiple packed types -// - common construction/property design for subclasses // - wrapper class(es) for handling of composite links in chat (item, map etc) and formatting operations -// - add italics payload // Maybes: // - convert parsing to custom structs for each payload? would make some code prettier and easier to work with // but also wouldn't work out as well for things that are dynamically-sized +// - [SeString] some way to add surrounding formatting information as flags/data to text (or other?) payloads? +// eg, if a text payload is surrounded by italics payloads, strip them out and mark the text payload as italicized namespace Dalamud.Game.Chat.SeStringHandling { @@ -98,6 +98,10 @@ namespace Dalamud.Game.Chat.SeStringHandling switch (chunkType) { + case SeStringChunkType.EmphasisItalic: + payload = new EmphasisItalicPayload(); + break; + case SeStringChunkType.Interactable: { var subType = (EmbeddedInfoType)reader.ReadByte(); @@ -176,6 +180,7 @@ namespace Dalamud.Game.Chat.SeStringHandling protected enum SeStringChunkType { + EmphasisItalic = 0x1A, Interactable = 0x27, AutoTranslateKey = 0x2E, UIForeground = 0x48, diff --git a/Dalamud/Game/Chat/SeStringHandling/PayloadType.cs b/Dalamud/Game/Chat/SeStringHandling/PayloadType.cs index 92e8afa44..fe379ffd2 100644 --- a/Dalamud/Game/Chat/SeStringHandling/PayloadType.cs +++ b/Dalamud/Game/Chat/SeStringHandling/PayloadType.cs @@ -39,6 +39,10 @@ namespace Dalamud.Game.Chat.SeStringHandling /// AutoTranslateText, /// + /// An SeString payload representing italic emphasis formatting on text. + /// + EmphasisItalic, + /// /// An SeString payload representing any data we don't handle. /// Unknown diff --git a/Dalamud/Game/Chat/SeStringHandling/Payloads/EmphasisItalicPayload.cs b/Dalamud/Game/Chat/SeStringHandling/Payloads/EmphasisItalicPayload.cs new file mode 100644 index 000000000..359866247 --- /dev/null +++ b/Dalamud/Game/Chat/SeStringHandling/Payloads/EmphasisItalicPayload.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.IO; + +namespace Dalamud.Game.Chat.SeStringHandling.Payloads +{ + class EmphasisItalicPayload : Payload + { + public override PayloadType Type => PayloadType.EmphasisItalic; + + public bool IsEnabled { get; private set; } + + internal EmphasisItalicPayload() { } + + public EmphasisItalicPayload(bool enabled) + { + IsEnabled = enabled; + } + + public override string ToString() + { + return $"{Type} - Enabled: {IsEnabled}"; + } + + protected override byte[] EncodeImpl() + { + // realistically this will always be a single byte of value 1 or 2 + // but we'll treat it normally anyway + var enabledBytes = MakeInteger(IsEnabled ? (uint)1 : 0); + + var chunkLen = enabledBytes.Length + 1; + var bytes = new List() + { + START_BYTE, (byte)SeStringChunkType.EmphasisItalic, (byte)chunkLen + }; + bytes.AddRange(enabledBytes); + bytes.Add(END_BYTE); + + return bytes.ToArray(); + } + + protected override void DecodeImpl(BinaryReader reader, long endOfStream) + { + IsEnabled = (GetInteger(reader) == 1); + } + } +}