diff --git a/Plugin.cs b/Plugin.cs index 8dfb8ab..13eb81c 100644 --- a/Plugin.cs +++ b/Plugin.cs @@ -1,4 +1,6 @@ using System.Runtime.InteropServices; +using System.Text; +using System.Text.RegularExpressions; using Dalamud.Game.Text.SeStringHandling; using Dalamud.Game.Text.SeStringHandling.Payloads; using Dalamud.Hooking; @@ -12,7 +14,7 @@ using YamlDotNet.Serialization.NamingConventions; namespace TimePasses; -public class Plugin : IDalamudPlugin { +public sealed class Plugin : IDalamudPlugin { [PluginService] internal static IPluginLog Log { get; set; } @@ -61,7 +63,7 @@ public class Plugin : IDalamudPlugin { await this.Mutex.WaitAsync(); try { this.Data = Plugin.Deserializer.Deserialize(yaml); - this.ReplacementPointers.Clear(); + this.ResetReplacementPointers(); } finally { this.Mutex.Release(); } @@ -72,11 +74,7 @@ public class Plugin : IDalamudPlugin { this.GetBalloonRowHook?.Dispose(); this.Client.Dispose(); this.Mutex.Dispose(); - foreach (var (_, ptr) in this.ReplacementPointers) { - Marshal.FreeHGlobal(ptr); - } - - this.ReplacementPointers.Clear(); + this.ResetReplacementPointers(); } private nint GetBalloonRowDetour(uint rowId) { @@ -121,13 +119,47 @@ public class Plugin : IDalamudPlugin { var lines = text .ReplaceLineEndings("\n") .Split('\n'); + var sb = new StringBuilder(); var seStringBuilder = new SeStringBuilder(); for (var i = 0; i < lines.Length; i++) { if (i != 0) { seStringBuilder.Add(NewLinePayload.Payload); } - seStringBuilder.AddText(lines[i].TrimEnd()); + var line = lines[i] + .TrimEnd() + .Replace("", Markers.EmphasisOn.ToString()) + .Replace("", Markers.EmphasisOff.ToString()); + + void Append() { + if (sb.Length == 0) { + return; + } + + seStringBuilder.AddText(sb.ToString()); + sb.Clear(); + } + + foreach (var ch in lines[i].TrimEnd()) { + switch (ch) { + case Markers.EmphasisOn: { + Append(); + seStringBuilder.AddItalicsOn(); + break; + } + case Markers.EmphasisOff: { + Append(); + seStringBuilder.AddItalicsOff(); + break; + } + default: { + sb.Append(ch); + break; + } + } + } + + Append(); } var textBytes = seStringBuilder.Encode(); @@ -150,6 +182,14 @@ public class Plugin : IDalamudPlugin { } } } + + private void ResetReplacementPointers() { + foreach (var (_, ptr) in this.ReplacementPointers) { + Marshal.FreeHGlobal(ptr); + } + + this.ReplacementPointers.Clear(); + } } [Serializable] @@ -162,3 +202,8 @@ internal class DataFile { public class Definitions { public uint[] Quests { get; init; } } + +internal static class Markers { + internal const char EmphasisOn = '\uf000'; + internal const char EmphasisOff = '\uf001'; +} diff --git a/replacements.yaml b/replacements.yaml index f200aa2..9e44886 100644 --- a/replacements.yaml +++ b/replacements.yaml @@ -86,7 +86,7 @@ replacements: greaterThan: 49 text: |- Bet beasties never - give you any trouble. + give you any trouble. - level: greaterThan: 29 text: |-