From bb098052133bd6f037d5dff88ffe4121fb3565d9 Mon Sep 17 00:00:00 2001 From: alydev Date: Tue, 23 Dec 2025 10:08:49 +1000 Subject: [PATCH] muffin v7.4.5 --- LLib/LLib/DataManagerExtensions.cs | 20 +- .../CreditsController.cs | 1 - .../Dive.cs | 65 +- .../Questionable.Controller/QuestRegistry.cs | 12 +- .../Questionable.Data/ChangelogData.cs | 1583 +++++++++-------- Questionable/Questionable.Data/JournalData.cs | 20 +- Questionable/Questionable.Data/QuestData.cs | 3 +- .../Questionable.Validation/QuestValidator.cs | 1 - .../SinglePlayerDutyConfigComponent.cs | 2 - .../QuestJournalComponent.cs | 1 - .../EventInfoComponent.cs | 64 +- 11 files changed, 881 insertions(+), 891 deletions(-) diff --git a/LLib/LLib/DataManagerExtensions.cs b/LLib/LLib/DataManagerExtensions.cs index ddefe47..029aeaf 100644 --- a/LLib/LLib/DataManagerExtensions.cs +++ b/LLib/LLib/DataManagerExtensions.cs @@ -18,9 +18,7 @@ public static class DataManagerExtensions public static string? GetString(this IDataManager dataManager, string key, IPluginLog? pluginLog) where T : struct, IQuestDialogueText, IExcelRow { - string text = dataManager.GetSeString(key)?.WithCertainMacroCodeReplacements(); - pluginLog?.Verbose($"{typeof(T).Name}.{key} => {text}"); - return text; + return dataManager.GetSeString(key)?.WithCertainMacroCodeReplacements(); } public static Regex? GetRegex(this IDataManager dataManager, string key, IPluginLog? pluginLog) where T : struct, IQuestDialogueText, IExcelRow @@ -30,9 +28,7 @@ public static class DataManagerExtensions { return null; } - string text = string.Join("", seString.Select((ReadOnlySePayload payload) => (payload.Type == ReadOnlySePayloadType.Text) ? Regex.Escape(payload.ToString()) : "(.*)")); - pluginLog?.Verbose($"{typeof(T).Name}.{key} => /{text}/"); - return new Regex(text); + return new Regex(string.Join("", seString.Select((ReadOnlySePayload payload) => (payload.Type == ReadOnlySePayloadType.Text) ? Regex.Escape(payload.ToString()) : "(.*)"))); } public static ReadOnlySeString? GetSeString(this IDataManager dataManager, uint rowId, Func mapper) where T : struct, IExcelRow @@ -49,9 +45,7 @@ public static class DataManagerExtensions public static string? GetString(this IDataManager dataManager, uint rowId, Func mapper, IPluginLog? pluginLog = null) where T : struct, IExcelRow { - string text = dataManager.GetSeString(rowId, mapper)?.WithCertainMacroCodeReplacements(); - pluginLog?.Verbose($"{typeof(T).Name}.{rowId} => {text}"); - return text; + return dataManager.GetSeString(rowId, mapper)?.WithCertainMacroCodeReplacements(); } public static Regex? GetRegex(this IDataManager dataManager, uint rowId, Func mapper, IPluginLog? pluginLog = null) where T : struct, IExcelRow @@ -61,9 +55,7 @@ public static class DataManagerExtensions { return null; } - Regex regex = seString.ToRegex(); - pluginLog?.Verbose($"{typeof(T).Name}.{rowId} => /{regex}/"); - return regex; + return seString.ToRegex(); } public static Regex? GetRegex(this T excelRow, Func mapper, IPluginLog? pluginLog) where T : struct, IExcelRow @@ -74,9 +66,7 @@ public static class DataManagerExtensions { return null; } - Regex regex = text.ToRegex(); - pluginLog?.Verbose($"{typeof(T).Name}.regex => /{regex}/"); - return regex; + return text.ToRegex(); } public static Regex ToRegex(this ReadOnlySeString? text) diff --git a/Questionable/Questionable.Controller.GameUi/CreditsController.cs b/Questionable/Questionable.Controller.GameUi/CreditsController.cs index 64469cc..771e883 100644 --- a/Questionable/Questionable.Controller.GameUi/CreditsController.cs +++ b/Questionable/Questionable.Controller.GameUi/CreditsController.cs @@ -69,7 +69,6 @@ internal sealed class CreditsController : IDisposable _addonLifecycle.RegisterListener(AddonEvent.PostSetup, CreditScrollArray, _creditScrollHandler); _addonLifecycle.RegisterListener(AddonEvent.PostSetup, CreditArray, _creditHandler); _addonLifecycle.RegisterListener(AddonEvent.PostSetup, CreditPlayerArray, _creditPlayerHandler); - _logger.LogDebug("CreditsController: registered listeners and ready to skip up to {MaxSkips} successive cutscenes.", _maxConsecutiveSkips); } } } diff --git a/Questionable/Questionable.Controller.Steps.Interactions/Dive.cs b/Questionable/Questionable.Controller.Steps.Interactions/Dive.cs index 80a6ac2..0b6840b 100644 --- a/Questionable/Questionable.Controller.Steps.Interactions/Dive.cs +++ b/Questionable/Questionable.Controller.Steps.Interactions/Dive.cs @@ -6,7 +6,6 @@ using Dalamud.Game.ClientState.Conditions; using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Client.Graphics.Kernel; using FFXIVClientStructs.FFXIV.Client.System.Input; -using FFXIVClientStructs.FFXIV.Client.System.String; using FFXIVClientStructs.FFXIV.Client.UI; using Microsoft.Extensions.Logging; using Questionable.Controller.Steps.Common; @@ -37,10 +36,12 @@ internal static class Dive } } - internal sealed class DoDive(ICondition condition, ILogger logger) : AbstractDelayedTaskExecutor(TimeSpan.FromSeconds(5L)) + internal sealed class DoDive(ICondition condition, ILogger logger) : AbstractDelayedTaskExecutor(TimeSpan.FromSeconds(5L)), IStoppableTaskExecutor, ITaskExecutor { private readonly Queue<(uint Type, nint Key)> _keysToPress = new Queue<(uint, nint)>(); + private readonly HashSet _pressedKeys = new HashSet(); + private int _attempts; protected override bool StartInternal() @@ -67,11 +68,30 @@ internal static class Dive } logger.LogDebug("{Action} key {KeyCode:X2}", (result.Item1 == 256) ? "Pressing" : "Releasing", result.Item2); NativeMethods.SendMessage((nint)Device.Instance()->hWnd, result.Item1, result.Item2, IntPtr.Zero); + if (result.Item1 == 256) + { + _pressedKeys.Add(result.Item2); + } + else if (result.Item1 == 257) + { + _pressedKeys.Remove(result.Item2); + } return ETaskResult.StillRunning; } return base.Update(); } + public unsafe void StopNow() + { + foreach (nint pressedKey in _pressedKeys) + { + logger.LogDebug("Releasing stuck key {KeyCode:X2} on stop", pressedKey); + NativeMethods.SendMessage((nint)Device.Instance()->hWnd, 257u, pressedKey, IntPtr.Zero); + } + _pressedKeys.Clear(); + _keysToPress.Clear(); + } + public override bool ShouldInterruptOnDamage() { return false; @@ -83,7 +103,7 @@ internal static class Dive { return ETaskResult.TaskComplete; } - if (_attempts >= 3) + if (_attempts >= 5) { throw new TaskException("Please dive manually."); } @@ -94,22 +114,25 @@ internal static class Dive private unsafe void Descend() { - byte* ptr = stackalloc byte[16]; - Utf8String* name = Utf8String.FromString("MOVE_DESCENT"); - UIInputData.Instance()->GetKeybindByName(name, (Keybind*)ptr); - SeVirtualKey seVirtualKey = (SeVirtualKey)(*(uint*)ptr); - byte b = ptr[4]; - SeVirtualKey seVirtualKey2 = (SeVirtualKey)((uint*)ptr)[2]; - byte b2 = ptr[12]; - logger.LogInformation("Dive keybind: {Key1} + {Modifier1}, {Key2} + {Modifier2}", seVirtualKey, b, seVirtualKey2, b2); + Keybind* keybind = UIInputData.Instance()->GetKeybind(InputId.MOVE_DESCENT); + if (keybind == null) + { + throw new TaskException("Could not find descent keybind"); + } + Span keySettings = keybind->KeySettings; + SeVirtualKey key = keySettings[0].Key; + KeyModifierFlag keyModifier = keySettings[0].KeyModifier; + SeVirtualKey key2 = keySettings[1].Key; + KeyModifierFlag keyModifier2 = keySettings[1].KeyModifier; + logger.LogInformation("Dive keybind: {Key1} + {Modifier1}, {Key2} + {Modifier2}", key, keyModifier, key2, keyModifier2); int num = 2; List> list = new List>(num); CollectionsMarshal.SetCount(list, num); Span> span = CollectionsMarshal.AsSpan(list); int num2 = 0; - span[num2] = GetKeysToPress(seVirtualKey, b); + span[num2] = GetKeysToPress(key, keyModifier); num2++; - span[num2] = GetKeysToPress(seVirtualKey2, b2); + span[num2] = GetKeysToPress(key2, keyModifier2); List list2 = (from x in list where x != null select (x)).MinBy((List x) => x.Count); @@ -120,10 +143,12 @@ internal static class Dive foreach (nint item in list2) { _keysToPress.Enqueue((256u, item)); - _keysToPress.Enqueue((0u, 0)); - _keysToPress.Enqueue((0u, 0)); + for (int num3 = 0; num3 < 15; num3++) + { + _keysToPress.Enqueue((0u, 0)); + } } - for (int num3 = 0; num3 < 5; num3++) + for (int num4 = 0; num4 < 5; num4++) { _keysToPress.Enqueue((0u, 0)); } @@ -146,18 +171,18 @@ internal static class Dive public static extern nint SendMessage(nint hWnd, uint Msg, nint wParam, nint lParam); } - private static List? GetKeysToPress(SeVirtualKey key, byte modifier) + private static List? GetKeysToPress(SeVirtualKey key, KeyModifierFlag modifier) { List list = new List(); - if ((modifier & 1) != 0) + if ((modifier & KeyModifierFlag.Ctrl) != KeyModifierFlag.None) { list.Add(17); } - if ((modifier & 2) != 0) + if ((modifier & KeyModifierFlag.Shift) != KeyModifierFlag.None) { list.Add(16); } - if ((modifier & 4) != 0) + if ((modifier & KeyModifierFlag.Alt) != KeyModifierFlag.None) { list.Add(18); } diff --git a/Questionable/Questionable.Controller/QuestRegistry.cs b/Questionable/Questionable.Controller/QuestRegistry.cs index e42a2ca..861d63f 100644 --- a/Questionable/Questionable.Controller/QuestRegistry.cs +++ b/Questionable/Questionable.Controller/QuestRegistry.cs @@ -131,7 +131,7 @@ internal sealed class QuestRegistry } if (_questData.TryGetQuestInfo(elementId2, out IQuestInfo questInfo)) { - goto IL_01c8; + goto IL_01ae; } if (elementId2 is UnlockLinkId unlockLinkId) { @@ -147,18 +147,16 @@ internal sealed class QuestRegistry text = $"Unlock Link {unlockLinkId.Value}"; } questInfo = new UnlockLinkQuestInfo(unlockLinkId, text, 0u, dateTime); - _logger.LogDebug("Created UnlockLinkQuestInfo for {QuestId} from assembly", elementId2); _questData.AddOrReplaceQuestInfo(questInfo); - goto IL_01c8; + goto IL_01ae; } _logger.LogWarning("Not loading unknown quest {QuestId} from assembly: Quest not found in quest data", elementId2); goto end_IL_003d; - IL_01c8: + IL_01ae: if (flag2 || flag3) { - bool flag4 = flag ?? questInfo.IsSeasonalQuest; - _questData.ApplySeasonalOverride(elementId2, flag4, dateTime); - _logger.LogDebug("Applied seasonal override for quest {QuestId} from assembly: IsSeasonal={IsSeasonal}, Expiry={Expiry}", elementId2, flag4, dateTime?.ToString("o") ?? "(null)"); + bool isSeasonal = flag ?? questInfo.IsSeasonalQuest; + _questData.ApplySeasonalOverride(elementId2, isSeasonal, dateTime); } IQuestInfo questInfo2 = _questData.GetQuestInfo(elementId2); Quest quest = new Quest diff --git a/Questionable/Questionable.Data/ChangelogData.cs b/Questionable/Questionable.Data/ChangelogData.cs index 1204359..8235f58 100644 --- a/Questionable/Questionable.Data/ChangelogData.cs +++ b/Questionable/Questionable.Data/ChangelogData.cs @@ -11,979 +11,977 @@ internal static class ChangelogData static ChangelogData() { - int num = 49; + int num = 50; List list = new List(num); CollectionsMarshal.SetCount(list, num); Span span = CollectionsMarshal.AsSpan(list); int num2 = 0; ref ChangelogEntry reference = ref span[num2]; - DateOnly releaseDate = new DateOnly(2025, 12, 21); - int num3 = 2; + DateOnly releaseDate = new DateOnly(2025, 12, 22); + int num3 = 1; List list2 = new List(num3); CollectionsMarshal.SetCount(list2, num3); Span span2 = CollectionsMarshal.AsSpan(list2); - int num4 = 0; - ref ChangeEntry reference2 = ref span2[num4]; - int num5 = 1; - List list3 = new List(num5); - CollectionsMarshal.SetCount(list3, num5); - Span span3 = CollectionsMarshal.AsSpan(list3); int index = 0; - span3[index] = "Changelog only shows once per update now"; + ref ChangeEntry reference2 = ref span2[index]; + int num4 = 2; + List list3 = new List(num4); + CollectionsMarshal.SetCount(list3, num4); + Span span3 = CollectionsMarshal.AsSpan(list3); + int num5 = 0; + span3[num5] = "Dive adjustments"; + num5++; + span3[num5] = "Logging message adjustments"; reference2 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list3); - num4++; - ref ChangeEntry reference3 = ref span2[num4]; - index = 1; - List list4 = new List(index); - CollectionsMarshal.SetCount(list4, index); - Span span4 = CollectionsMarshal.AsSpan(list4); - num5 = 0; - span4[num5] = "Fixed gathering paths loading"; - reference3 = new ChangeEntry(EChangeCategory.Fixed, "Fixes", list4); - reference = new ChangelogEntry("7.4.4", releaseDate, list2); + reference = new ChangelogEntry("7.4.5", releaseDate, list2); num2++; - ref ChangelogEntry reference4 = ref span[num2]; + ref ChangelogEntry reference3 = ref span[num2]; DateOnly releaseDate2 = new DateOnly(2025, 12, 21); - num4 = 1; - List list5 = new List(num4); - CollectionsMarshal.SetCount(list5, num4); - Span span5 = CollectionsMarshal.AsSpan(list5); + index = 2; + List list4 = new List(index); + CollectionsMarshal.SetCount(list4, index); + Span span4 = CollectionsMarshal.AsSpan(list4); num3 = 0; - ref ChangeEntry reference5 = ref span5[num3]; + ref ChangeEntry reference4 = ref span4[num3]; num5 = 1; - List list6 = new List(num5); - CollectionsMarshal.SetCount(list6, num5); + List list5 = new List(num5); + CollectionsMarshal.SetCount(list5, num5); + Span span5 = CollectionsMarshal.AsSpan(list5); + num4 = 0; + span5[num4] = "Changelog only shows once per update now"; + reference4 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list5); + num3++; + ref ChangeEntry reference5 = ref span4[num3]; + num4 = 1; + List list6 = new List(num4); + CollectionsMarshal.SetCount(list6, num4); Span span6 = CollectionsMarshal.AsSpan(list6); - index = 0; - span6[index] = "Fixed changelog version checks"; + num5 = 0; + span6[num5] = "Fixed gathering paths loading"; reference5 = new ChangeEntry(EChangeCategory.Fixed, "Fixes", list6); - reference4 = new ChangelogEntry("7.4.3", releaseDate2, list5); + reference3 = new ChangelogEntry("7.4.4", releaseDate2, list4); num2++; ref ChangelogEntry reference6 = ref span[num2]; - DateOnly releaseDate3 = new DateOnly(2025, 12, 20); - num3 = 2; + DateOnly releaseDate3 = new DateOnly(2025, 12, 21); + num3 = 1; List list7 = new List(num3); CollectionsMarshal.SetCount(list7, num3); Span span7 = CollectionsMarshal.AsSpan(list7); - num4 = 0; - ref ChangeEntry reference7 = ref span7[num4]; - index = 1; - List list8 = new List(index); - CollectionsMarshal.SetCount(list8, index); - Span span8 = CollectionsMarshal.AsSpan(list8); - num5 = 0; - span8[num5] = "Add 7.4 Starlight Celebration (2025) quest"; - reference7 = new ChangeEntry(EChangeCategory.QuestUpdates, "New Quest Paths", list8); - num4++; - ref ChangeEntry reference8 = ref span7[num4]; - num5 = 1; - List list9 = new List(num5); - CollectionsMarshal.SetCount(list9, num5); - Span span9 = CollectionsMarshal.AsSpan(list9); index = 0; - span9[index] = "Fixed 7.4 MSQ"; - reference8 = new ChangeEntry(EChangeCategory.Fixed, "Fixes", list9); - reference6 = new ChangelogEntry("7.4.2", releaseDate3, list7); + ref ChangeEntry reference7 = ref span7[index]; + num5 = 1; + List list8 = new List(num5); + CollectionsMarshal.SetCount(list8, num5); + Span span8 = CollectionsMarshal.AsSpan(list8); + num4 = 0; + span8[num4] = "Fixed changelog version checks"; + reference7 = new ChangeEntry(EChangeCategory.Fixed, "Fixes", list8); + reference6 = new ChangelogEntry("7.4.3", releaseDate3, list7); num2++; - ref ChangelogEntry reference9 = ref span[num2]; - DateOnly releaseDate4 = new DateOnly(2025, 12, 19); - num4 = 1; - List list10 = new List(num4); - CollectionsMarshal.SetCount(list10, num4); - Span span10 = CollectionsMarshal.AsSpan(list10); - num3 = 0; - ref ChangeEntry reference10 = ref span10[num3]; + ref ChangelogEntry reference8 = ref span[num2]; + DateOnly releaseDate4 = new DateOnly(2025, 12, 20); index = 2; - List list11 = new List(index); - CollectionsMarshal.SetCount(list11, index); - Span span11 = CollectionsMarshal.AsSpan(list11); + List list9 = new List(index); + CollectionsMarshal.SetCount(list9, index); + Span span9 = CollectionsMarshal.AsSpan(list9); + num3 = 0; + ref ChangeEntry reference9 = ref span9[num3]; + num4 = 1; + List list10 = new List(num4); + CollectionsMarshal.SetCount(list10, num4); + Span span10 = CollectionsMarshal.AsSpan(list10); num5 = 0; - span11[num5] = "Add 7.4 MSQ"; - num5++; - span11[num5] = "Add 7.4 Arcadion Raid quests"; - reference10 = new ChangeEntry(EChangeCategory.QuestUpdates, "New Quest Paths", list11); - reference9 = new ChangelogEntry("7.4.1", releaseDate4, list10); + span10[num5] = "Add 7.4 Starlight Celebration (2025) quest"; + reference9 = new ChangeEntry(EChangeCategory.QuestUpdates, "New Quest Paths", list10); + num3++; + ref ChangeEntry reference10 = ref span9[num3]; + num5 = 1; + List list11 = new List(num5); + CollectionsMarshal.SetCount(list11, num5); + Span span11 = CollectionsMarshal.AsSpan(list11); + num4 = 0; + span11[num4] = "Fixed 7.4 MSQ"; + reference10 = new ChangeEntry(EChangeCategory.Fixed, "Fixes", list11); + reference8 = new ChangelogEntry("7.4.2", releaseDate4, list9); num2++; ref ChangelogEntry reference11 = ref span[num2]; - DateOnly releaseDate5 = new DateOnly(2025, 12, 17); + DateOnly releaseDate5 = new DateOnly(2025, 12, 19); num3 = 1; List list12 = new List(num3); CollectionsMarshal.SetCount(list12, num3); Span span12 = CollectionsMarshal.AsSpan(list12); - num4 = 0; - span12[num4] = new ChangeEntry(EChangeCategory.Changed, "Api 14 update"); - reference11 = new ChangelogEntry("7.4.0", releaseDate5, list12); - num2++; - ref ChangelogEntry reference12 = ref span[num2]; - DateOnly releaseDate6 = new DateOnly(2025, 12, 6); + index = 0; + ref ChangeEntry reference12 = ref span12[index]; num4 = 2; - List list13 = new List(num4); + List list13 = new List(num4); CollectionsMarshal.SetCount(list13, num4); - Span span13 = CollectionsMarshal.AsSpan(list13); - num3 = 0; - ref ChangeEntry reference13 = ref span13[num3]; - num5 = 4; - List list14 = new List(num5); - CollectionsMarshal.SetCount(list14, num5); - Span span14 = CollectionsMarshal.AsSpan(list14); - index = 0; - span14[index] = "Added reloading and rebuilding to movement system"; - index++; - span14[index] = "Improved interrupts and refresh states to allow continuation of questing"; - index++; - span14[index] = "Added player input detection to stop automation when manually moving character"; - index++; - span14[index] = "Added various missing quest sequences"; - reference13 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list14); - num3++; - ref ChangeEntry reference14 = ref span13[num3]; - index = 1; - List list15 = new List(index); - CollectionsMarshal.SetCount(list15, index); - Span span15 = CollectionsMarshal.AsSpan(list15); + Span span13 = CollectionsMarshal.AsSpan(list13); num5 = 0; - span15[num5] = "Fixed reset task state to prevent stuck interactions after interruption"; - reference14 = new ChangeEntry(EChangeCategory.Fixed, "Fixes", list15); - reference12 = new ChangelogEntry("7.38.9", releaseDate6, list13); + span13[num5] = "Add 7.4 MSQ"; + num5++; + span13[num5] = "Add 7.4 Arcadion Raid quests"; + reference12 = new ChangeEntry(EChangeCategory.QuestUpdates, "New Quest Paths", list13); + reference11 = new ChangelogEntry("7.4.1", releaseDate5, list12); num2++; - ref ChangelogEntry reference15 = ref span[num2]; - DateOnly releaseDate7 = new DateOnly(2025, 11, 29); + ref ChangelogEntry reference13 = ref span[num2]; + DateOnly releaseDate6 = new DateOnly(2025, 12, 17); + index = 1; + List list14 = new List(index); + CollectionsMarshal.SetCount(list14, index); + Span span14 = CollectionsMarshal.AsSpan(list14); + num3 = 0; + span14[num3] = new ChangeEntry(EChangeCategory.Changed, "Api 14 update"); + reference13 = new ChangelogEntry("7.4.0", releaseDate6, list14); + num2++; + ref ChangelogEntry reference14 = ref span[num2]; + DateOnly releaseDate7 = new DateOnly(2025, 12, 6); num3 = 2; - List list16 = new List(num3); - CollectionsMarshal.SetCount(list16, num3); - Span span16 = CollectionsMarshal.AsSpan(list16); + List list15 = new List(num3); + CollectionsMarshal.SetCount(list15, num3); + Span span15 = CollectionsMarshal.AsSpan(list15); + index = 0; + ref ChangeEntry reference15 = ref span15[index]; + num5 = 4; + List list16 = new List(num5); + CollectionsMarshal.SetCount(list16, num5); + Span span16 = CollectionsMarshal.AsSpan(list16); num4 = 0; - ref ChangeEntry reference16 = ref span16[num4]; - num5 = 3; - List list17 = new List(num5); - CollectionsMarshal.SetCount(list17, num5); + span16[num4] = "Added reloading and rebuilding to movement system"; + num4++; + span16[num4] = "Improved interrupts and refresh states to allow continuation of questing"; + num4++; + span16[num4] = "Added player input detection to stop automation when manually moving character"; + num4++; + span16[num4] = "Added various missing quest sequences"; + reference15 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list16); + index++; + ref ChangeEntry reference16 = ref span15[index]; + num4 = 1; + List list17 = new List(num4); + CollectionsMarshal.SetCount(list17, num4); Span span17 = CollectionsMarshal.AsSpan(list17); - index = 0; - span17[index] = "Movement update with automatic retrying if character can't reach target position"; - index++; - span17[index] = "Added Hunt mob data"; - index++; - span17[index] = "Refactored commands"; - reference16 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list17); - num4++; - ref ChangeEntry reference17 = ref span16[num4]; - index = 3; - List list18 = new List(index); + num5 = 0; + span17[num5] = "Fixed reset task state to prevent stuck interactions after interruption"; + reference16 = new ChangeEntry(EChangeCategory.Fixed, "Fixes", list17); + reference14 = new ChangelogEntry("7.38.9", releaseDate7, list15); + num2++; + ref ChangelogEntry reference17 = ref span[num2]; + DateOnly releaseDate8 = new DateOnly(2025, 11, 29); + index = 2; + List list18 = new List(index); CollectionsMarshal.SetCount(list18, index); - Span span18 = CollectionsMarshal.AsSpan(list18); - num5 = 0; - span18[num5] = "Fixed quest (Way of the Archer)"; - num5++; - span18[num5] = "Fixed quest (Spirithold Broken)"; - num5++; - span18[num5] = "Fixed quest (It's Probably Not Pirates)"; - reference17 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list18); - reference15 = new ChangelogEntry("7.38.8", releaseDate7, list16); - num2++; - ref ChangelogEntry reference18 = ref span[num2]; - DateOnly releaseDate8 = new DateOnly(2025, 11, 25); - num4 = 2; - List list19 = new List(num4); - CollectionsMarshal.SetCount(list19, num4); - Span span19 = CollectionsMarshal.AsSpan(list19); + Span span18 = CollectionsMarshal.AsSpan(list18); num3 = 0; - ref ChangeEntry reference19 = ref span19[num3]; - num5 = 2; - List list20 = new List(num5); - CollectionsMarshal.SetCount(list20, num5); - Span span20 = CollectionsMarshal.AsSpan(list20); - index = 0; - span20[index] = "Added individual sequence stop condition for each quest"; - index++; - span20[index] = "Added Trials to Duties tab in config"; - reference19 = new ChangeEntry(EChangeCategory.Added, "Major features", list20); - num3++; - ref ChangeEntry reference20 = ref span19[num3]; - index = 1; - List list21 = new List(index); - CollectionsMarshal.SetCount(list21, index); - Span span21 = CollectionsMarshal.AsSpan(list21); - num5 = 0; - span21[num5] = "Added IPC for stop conditions: GetQuestSequenceStopCondition, SetQuestSequenceStopCondition, RemoveQuestSequenceStopCondition, GetAllQuestSequenceStopConditions"; - reference20 = new ChangeEntry(EChangeCategory.Added, "IPC changes", list21); - reference18 = new ChangelogEntry("7.38.7", releaseDate8, list19); - num2++; - ref ChangelogEntry reference21 = ref span[num2]; - DateOnly releaseDate9 = new DateOnly(2025, 11, 25); - num3 = 3; - List list22 = new List(num3); - CollectionsMarshal.SetCount(list22, num3); - Span span22 = CollectionsMarshal.AsSpan(list22); + ref ChangeEntry reference18 = ref span18[num3]; + num5 = 3; + List list19 = new List(num5); + CollectionsMarshal.SetCount(list19, num5); + Span span19 = CollectionsMarshal.AsSpan(list19); num4 = 0; - ref ChangeEntry reference22 = ref span22[num4]; - num5 = 2; - List list23 = new List(num5); - CollectionsMarshal.SetCount(list23, num5); - Span span23 = CollectionsMarshal.AsSpan(list23); - index = 0; - span23[index] = "Updated Allied Society journal text"; - index++; - span23[index] = "Improved Allied Society rank handling"; - reference22 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list23); + span19[num4] = "Movement update with automatic retrying if character can't reach target position"; num4++; - ref ChangeEntry reference23 = ref span22[num4]; - index = 1; - List list24 = new List(index); - CollectionsMarshal.SetCount(list24, index); - Span span24 = CollectionsMarshal.AsSpan(list24); + span19[num4] = "Added Hunt mob data"; + num4++; + span19[num4] = "Refactored commands"; + reference18 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list19); + num3++; + ref ChangeEntry reference19 = ref span18[num3]; + num4 = 3; + List list20 = new List(num4); + CollectionsMarshal.SetCount(list20, num4); + Span span20 = CollectionsMarshal.AsSpan(list20); num5 = 0; - span24[num5] = "Added IPC for Allied Society: AddAlliedSocietyOptimalQuests, GetAlliedSocietyOptimalQuests"; - reference23 = new ChangeEntry(EChangeCategory.Added, "IPC changes", list24); + span20[num5] = "Fixed quest (Way of the Archer)"; + num5++; + span20[num5] = "Fixed quest (Spirithold Broken)"; + num5++; + span20[num5] = "Fixed quest (It's Probably Not Pirates)"; + reference19 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list20); + reference17 = new ChangelogEntry("7.38.8", releaseDate8, list18); + num2++; + ref ChangelogEntry reference20 = ref span[num2]; + DateOnly releaseDate9 = new DateOnly(2025, 11, 25); + num3 = 2; + List list21 = new List(num3); + CollectionsMarshal.SetCount(list21, num3); + Span span21 = CollectionsMarshal.AsSpan(list21); + index = 0; + ref ChangeEntry reference21 = ref span21[index]; + num5 = 2; + List list22 = new List(num5); + CollectionsMarshal.SetCount(list22, num5); + Span span22 = CollectionsMarshal.AsSpan(list22); + num4 = 0; + span22[num4] = "Added individual sequence stop condition for each quest"; num4++; - ref ChangeEntry reference24 = ref span22[num4]; - num5 = 1; + span22[num4] = "Added Trials to Duties tab in config"; + reference21 = new ChangeEntry(EChangeCategory.Added, "Major features", list22); + index++; + ref ChangeEntry reference22 = ref span21[index]; + num4 = 1; + List list23 = new List(num4); + CollectionsMarshal.SetCount(list23, num4); + Span span23 = CollectionsMarshal.AsSpan(list23); + num5 = 0; + span23[num5] = "Added IPC for stop conditions: GetQuestSequenceStopCondition, SetQuestSequenceStopCondition, RemoveQuestSequenceStopCondition, GetAllQuestSequenceStopConditions"; + reference22 = new ChangeEntry(EChangeCategory.Added, "IPC changes", list23); + reference20 = new ChangelogEntry("7.38.7", releaseDate9, list21); + num2++; + ref ChangelogEntry reference23 = ref span[num2]; + DateOnly releaseDate10 = new DateOnly(2025, 11, 25); + index = 3; + List list24 = new List(index); + CollectionsMarshal.SetCount(list24, index); + Span span24 = CollectionsMarshal.AsSpan(list24); + num3 = 0; + ref ChangeEntry reference24 = ref span24[num3]; + num5 = 2; List list25 = new List(num5); CollectionsMarshal.SetCount(list25, num5); Span span25 = CollectionsMarshal.AsSpan(list25); - index = 0; - span25[index] = "Fixed quest (We Come in Peace)"; - reference24 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list25); - reference21 = new ChangelogEntry("7.38.6", releaseDate9, list22); - num2++; - ref ChangelogEntry reference25 = ref span[num2]; - DateOnly releaseDate10 = new DateOnly(2025, 11, 24); - num4 = 2; - List list26 = new List(num4); - CollectionsMarshal.SetCount(list26, num4); - Span span26 = CollectionsMarshal.AsSpan(list26); - num3 = 0; - ref ChangeEntry reference26 = ref span26[num3]; - index = 1; - List list27 = new List(index); - CollectionsMarshal.SetCount(list27, index); - Span span27 = CollectionsMarshal.AsSpan(list27); - num5 = 0; - span27[num5] = "Added Allied Society daily allowance tracker with bulk quest adding buttons"; - reference26 = new ChangeEntry(EChangeCategory.Added, "Major features", list27); - num3++; - ref ChangeEntry reference27 = ref span26[num3]; - num5 = 1; - List list28 = new List(num5); - CollectionsMarshal.SetCount(list28, num5); - Span span28 = CollectionsMarshal.AsSpan(list28); - index = 0; - span28[index] = "Added IPC for Allied Society: GetRemainingAllowances, GetTimeUntilReset, GetAvailableQuestIds, GetAllAvailableQuestCounts, IsMaxRank, GetCurrentRank, GetSocietiesWithAvailableQuests"; - reference27 = new ChangeEntry(EChangeCategory.Added, "IPC changes", list28); - reference25 = new ChangelogEntry("7.38.5", releaseDate10, list26); - num2++; - ref ChangelogEntry reference28 = ref span[num2]; - DateOnly releaseDate11 = new DateOnly(2025, 11, 23); - num3 = 2; - List list29 = new List(num3); - CollectionsMarshal.SetCount(list29, num3); - Span span29 = CollectionsMarshal.AsSpan(list29); num4 = 0; - ref ChangeEntry reference29 = ref span29[num4]; - index = 1; - List list30 = new List(index); - CollectionsMarshal.SetCount(list30, index); - Span span30 = CollectionsMarshal.AsSpan(list30); - num5 = 0; - span30[num5] = "Explicitly declare support for BMR singleplayer duty (The Rematch)"; - reference29 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list30); + span25[num4] = "Updated Allied Society journal text"; num4++; - ref ChangeEntry reference30 = ref span29[num4]; - num5 = 8; - List list31 = new List(num5); - CollectionsMarshal.SetCount(list31, num5); - Span span31 = CollectionsMarshal.AsSpan(list31); - index = 0; - span31[index] = "Fixed quest (Microbrewing) to not get stuck near ramp"; - index++; - span31[index] = "Fixed quest (The Illuminated Land) where pathing would kill the player due to fall damage"; - index++; - span31[index] = "Fixed quest (It's Probably Not Pirates) improper pathing and removed unneeded step"; - index++; - span31[index] = "Fixed quest (The Black Wolf's Ultimatum) not exiting landing area"; - index++; - span31[index] = "Fixed quest (Magiteknical Failure) from not interacting with NPC due to being mounted"; - index++; - span31[index] = "Fixed quest (We Come in Peace) shortcut navigation"; - index++; - span31[index] = "Fixed quest (Poisoned Hearts) where incorrect pathing caused the player to die"; - index++; - span31[index] = "Fixed quests (Savage Snares) and (An Apple a Day) not detecting kills"; - reference30 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list31); - reference28 = new ChangelogEntry("7.38.4", releaseDate11, list29); - num2++; - ref ChangelogEntry reference31 = ref span[num2]; - DateOnly releaseDate12 = new DateOnly(2025, 11, 23); - num4 = 3; - List list32 = new List(num4); - CollectionsMarshal.SetCount(list32, num4); - Span span32 = CollectionsMarshal.AsSpan(list32); - num3 = 0; - ref ChangeEntry reference32 = ref span32[num3]; - index = 2; - List list33 = new List(index); - CollectionsMarshal.SetCount(list33, index); - Span span33 = CollectionsMarshal.AsSpan(list33); + span25[num4] = "Improved Allied Society rank handling"; + reference24 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list25); + num3++; + ref ChangeEntry reference25 = ref span24[num3]; + num4 = 1; + List list26 = new List(num4); + CollectionsMarshal.SetCount(list26, num4); + Span span26 = CollectionsMarshal.AsSpan(list26); num5 = 0; - span33[num5] = "Added RequireHq to crafting InteractionType"; - num5++; - span33[num5] = "Mark GC quests as Locked if rank not achieved"; - reference32 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list33); + span26[num5] = "Added IPC for Allied Society: AddAlliedSocietyOptimalQuests, GetAlliedSocietyOptimalQuests"; + reference25 = new ChangeEntry(EChangeCategory.Added, "IPC changes", list26); num3++; - ref ChangeEntry reference33 = ref span32[num3]; - num5 = 2; - List list34 = new List(num5); - CollectionsMarshal.SetCount(list34, num5); - Span span34 = CollectionsMarshal.AsSpan(list34); + ref ChangeEntry reference26 = ref span24[num3]; + num5 = 1; + List list27 = new List(num5); + CollectionsMarshal.SetCount(list27, num5); + Span span27 = CollectionsMarshal.AsSpan(list27); + num4 = 0; + span27[num4] = "Fixed quest (We Come in Peace)"; + reference26 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list27); + reference23 = new ChangelogEntry("7.38.6", releaseDate10, list24); + num2++; + ref ChangelogEntry reference27 = ref span[num2]; + DateOnly releaseDate11 = new DateOnly(2025, 11, 24); + num3 = 2; + List list28 = new List(num3); + CollectionsMarshal.SetCount(list28, num3); + Span span28 = CollectionsMarshal.AsSpan(list28); index = 0; - span34[index] = "Added IPC for stop conditions: GetStopConditionsEnabled, SetStopConditionsEnabled, GetStopQuestList, AddStopQuest, RemoveStopQuest, ClearStopQuests, GetLevelStopCondition, SetLevelStopCondition, GetSequenceStopCondition, SetSequenceStopCondition"; + ref ChangeEntry reference28 = ref span28[index]; + num4 = 1; + List list29 = new List(num4); + CollectionsMarshal.SetCount(list29, num4); + Span span29 = CollectionsMarshal.AsSpan(list29); + num5 = 0; + span29[num5] = "Added Allied Society daily allowance tracker with bulk quest adding buttons"; + reference28 = new ChangeEntry(EChangeCategory.Added, "Major features", list29); index++; - span34[index] = "Added IPC for priority quests: GetPriorityQuests, RemovePriorityQuest, ReorderPriorityQuest, GetAvailablePresets, GetPresetQuests, AddPresetToPriority, IsPresetAvailable, IsQuestInPriority, GetQuestPriorityIndex, HasAvailablePriorityQuests"; - reference33 = new ChangeEntry(EChangeCategory.Added, "IPC changes", list34); + ref ChangeEntry reference29 = ref span28[index]; + num5 = 1; + List list30 = new List(num5); + CollectionsMarshal.SetCount(list30, num5); + Span span30 = CollectionsMarshal.AsSpan(list30); + num4 = 0; + span30[num4] = "Added IPC for Allied Society: GetRemainingAllowances, GetTimeUntilReset, GetAvailableQuestIds, GetAllAvailableQuestCounts, IsMaxRank, GetCurrentRank, GetSocietiesWithAvailableQuests"; + reference29 = new ChangeEntry(EChangeCategory.Added, "IPC changes", list30); + reference27 = new ChangelogEntry("7.38.5", releaseDate11, list28); + num2++; + ref ChangelogEntry reference30 = ref span[num2]; + DateOnly releaseDate12 = new DateOnly(2025, 11, 23); + index = 2; + List list31 = new List(index); + CollectionsMarshal.SetCount(list31, index); + Span span31 = CollectionsMarshal.AsSpan(list31); + num3 = 0; + ref ChangeEntry reference31 = ref span31[num3]; + num4 = 1; + List list32 = new List(num4); + CollectionsMarshal.SetCount(list32, num4); + Span span32 = CollectionsMarshal.AsSpan(list32); + num5 = 0; + span32[num5] = "Explicitly declare support for BMR singleplayer duty (The Rematch)"; + reference31 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list32); num3++; - ref ChangeEntry reference34 = ref span32[num3]; - index = 3; - List list35 = new List(index); - CollectionsMarshal.SetCount(list35, index); + ref ChangeEntry reference32 = ref span31[num3]; + num5 = 8; + List list33 = new List(num5); + CollectionsMarshal.SetCount(list33, num5); + Span span33 = CollectionsMarshal.AsSpan(list33); + num4 = 0; + span33[num4] = "Fixed quest (Microbrewing) to not get stuck near ramp"; + num4++; + span33[num4] = "Fixed quest (The Illuminated Land) where pathing would kill the player due to fall damage"; + num4++; + span33[num4] = "Fixed quest (It's Probably Not Pirates) improper pathing and removed unneeded step"; + num4++; + span33[num4] = "Fixed quest (The Black Wolf's Ultimatum) not exiting landing area"; + num4++; + span33[num4] = "Fixed quest (Magiteknical Failure) from not interacting with NPC due to being mounted"; + num4++; + span33[num4] = "Fixed quest (We Come in Peace) shortcut navigation"; + num4++; + span33[num4] = "Fixed quest (Poisoned Hearts) where incorrect pathing caused the player to die"; + num4++; + span33[num4] = "Fixed quests (Savage Snares) and (An Apple a Day) not detecting kills"; + reference32 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list33); + reference30 = new ChangelogEntry("7.38.4", releaseDate12, list31); + num2++; + ref ChangelogEntry reference33 = ref span[num2]; + DateOnly releaseDate13 = new DateOnly(2025, 11, 23); + num3 = 3; + List list34 = new List(num3); + CollectionsMarshal.SetCount(list34, num3); + Span span34 = CollectionsMarshal.AsSpan(list34); + index = 0; + ref ChangeEntry reference34 = ref span34[index]; + num4 = 2; + List list35 = new List(num4); + CollectionsMarshal.SetCount(list35, num4); Span span35 = CollectionsMarshal.AsSpan(list35); num5 = 0; - span35[num5] = "Fixed line breaks not working in dialog strings"; + span35[num5] = "Added RequireHq to crafting InteractionType"; num5++; - span35[num5] = "Fixed quest (Labor of Love)"; - num5++; - span35[num5] = "Fixed quest (Sea of Sorrow)"; - reference34 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list35); - reference31 = new ChangelogEntry("7.38.3", releaseDate12, list32); - num2++; - ref ChangelogEntry reference35 = ref span[num2]; - DateOnly releaseDate13 = new DateOnly(2025, 11, 18); - num3 = 3; - List list36 = new List(num3); - CollectionsMarshal.SetCount(list36, num3); - Span span36 = CollectionsMarshal.AsSpan(list36); - num4 = 0; - ref ChangeEntry reference36 = ref span36[num4]; - num5 = 2; - List list37 = new List(num5); - CollectionsMarshal.SetCount(list37, num5); - Span span37 = CollectionsMarshal.AsSpan(list37); - index = 0; - span37[index] = "Auto Duty unsync options for each duty (Duty Support, Unsync Solo, Unsync Party)"; + span35[num5] = "Mark GC quests as Locked if rank not achieved"; + reference34 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list35); index++; - span37[index] = "Added Auto Duty unsync options to quest schema and updated quests using old unsync method"; - reference36 = new ChangeEntry(EChangeCategory.Added, "Major features", list37); + ref ChangeEntry reference35 = ref span34[index]; + num5 = 2; + List list36 = new List(num5); + CollectionsMarshal.SetCount(list36, num5); + Span span36 = CollectionsMarshal.AsSpan(list36); + num4 = 0; + span36[num4] = "Added IPC for stop conditions: GetStopConditionsEnabled, SetStopConditionsEnabled, GetStopQuestList, AddStopQuest, RemoveStopQuest, ClearStopQuests, GetLevelStopCondition, SetLevelStopCondition, GetSequenceStopCondition, SetSequenceStopCondition"; num4++; - ref ChangeEntry reference37 = ref span36[num4]; - index = 3; - List list38 = new List(index); - CollectionsMarshal.SetCount(list38, index); - Span span38 = CollectionsMarshal.AsSpan(list38); - num5 = 0; - span38[num5] = "Added IPC for duty sync handling: GetDefaultDutyMode, SetDefaultDutyMode"; - num5++; - span38[num5] = "Added IPC for duty mode overrides: GetDutyModeOverride, SetDutyModeOverride"; - num5++; - span38[num5] = "Added IPC for clearing overrides: ClearDutyModeOverride, ClearAllDutyModeOverrides"; - reference37 = new ChangeEntry(EChangeCategory.Added, "IPC changes", list38); - num4++; - span36[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed quest (Constant Cravings)"); - reference35 = new ChangelogEntry("7.38.2", releaseDate13, list36); - num2++; - ref ChangelogEntry reference38 = ref span[num2]; - DateOnly releaseDate14 = new DateOnly(2025, 11, 18); + span36[num4] = "Added IPC for priority quests: GetPriorityQuests, RemovePriorityQuest, ReorderPriorityQuest, GetAvailablePresets, GetPresetQuests, AddPresetToPriority, IsPresetAvailable, IsQuestInPriority, GetQuestPriorityIndex, HasAvailablePriorityQuests"; + reference35 = new ChangeEntry(EChangeCategory.Added, "IPC changes", list36); + index++; + ref ChangeEntry reference36 = ref span34[index]; num4 = 3; - List list39 = new List(num4); - CollectionsMarshal.SetCount(list39, num4); - Span span39 = CollectionsMarshal.AsSpan(list39); - num3 = 0; - ref ChangeEntry reference39 = ref span39[num3]; - num5 = 1; - List list40 = new List(num5); - CollectionsMarshal.SetCount(list40, num5); - Span span40 = CollectionsMarshal.AsSpan(list40); - index = 0; - span40[index] = "Added new fields to quest schema"; - reference39 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list40); - num3++; - ref ChangeEntry reference40 = ref span39[num3]; - index = 3; - List list41 = new List(index); - CollectionsMarshal.SetCount(list41, index); - Span span41 = CollectionsMarshal.AsSpan(list41); + List list37 = new List(num4); + CollectionsMarshal.SetCount(list37, num4); + Span span37 = CollectionsMarshal.AsSpan(list37); num5 = 0; - span41[num5] = "A Faerie Tale Come True"; + span37[num5] = "Fixed line breaks not working in dialog strings"; num5++; - span41[num5] = "Constant Cravings"; + span37[num5] = "Fixed quest (Labor of Love)"; num5++; - span41[num5] = "A Bridge Too Full"; - reference40 = new ChangeEntry(EChangeCategory.QuestUpdates, "Added new quest paths", list41); + span37[num5] = "Fixed quest (Sea of Sorrow)"; + reference36 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list37); + reference33 = new ChangelogEntry("7.38.3", releaseDate13, list34); + num2++; + ref ChangelogEntry reference37 = ref span[num2]; + DateOnly releaseDate14 = new DateOnly(2025, 11, 18); + index = 3; + List list38 = new List(index); + CollectionsMarshal.SetCount(list38, index); + Span span38 = CollectionsMarshal.AsSpan(list38); + num3 = 0; + ref ChangeEntry reference38 = ref span38[num3]; + num5 = 2; + List list39 = new List(num5); + CollectionsMarshal.SetCount(list39, num5); + Span span39 = CollectionsMarshal.AsSpan(list39); + num4 = 0; + span39[num4] = "Auto Duty unsync options for each duty (Duty Support, Unsync Solo, Unsync Party)"; + num4++; + span39[num4] = "Added Auto Duty unsync options to quest schema and updated quests using old unsync method"; + reference38 = new ChangeEntry(EChangeCategory.Added, "Major features", list39); num3++; - ref ChangeEntry reference41 = ref span39[num3]; - num5 = 3; + ref ChangeEntry reference39 = ref span38[num3]; + num4 = 3; + List list40 = new List(num4); + CollectionsMarshal.SetCount(list40, num4); + Span span40 = CollectionsMarshal.AsSpan(list40); + num5 = 0; + span40[num5] = "Added IPC for duty sync handling: GetDefaultDutyMode, SetDefaultDutyMode"; + num5++; + span40[num5] = "Added IPC for duty mode overrides: GetDutyModeOverride, SetDutyModeOverride"; + num5++; + span40[num5] = "Added IPC for clearing overrides: ClearDutyModeOverride, ClearAllDutyModeOverrides"; + reference39 = new ChangeEntry(EChangeCategory.Added, "IPC changes", list40); + num3++; + span38[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed quest (Constant Cravings)"); + reference37 = new ChangelogEntry("7.38.2", releaseDate14, list38); + num2++; + ref ChangelogEntry reference40 = ref span[num2]; + DateOnly releaseDate15 = new DateOnly(2025, 11, 18); + num3 = 3; + List list41 = new List(num3); + CollectionsMarshal.SetCount(list41, num3); + Span span41 = CollectionsMarshal.AsSpan(list41); + index = 0; + ref ChangeEntry reference41 = ref span41[index]; + num5 = 1; List list42 = new List(num5); CollectionsMarshal.SetCount(list42, num5); Span span42 = CollectionsMarshal.AsSpan(list42); - index = 0; - span42[index] = "Fixed various quest schemas"; - index++; - span42[index] = "Fixed changelog bullet point encoding"; - index++; - span42[index] = "Fixed item use to wait until item is used before next action"; - reference41 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list42); - reference38 = new ChangelogEntry("7.38.1", releaseDate14, list39); - num2++; - ref ChangelogEntry reference42 = ref span[num2]; - DateOnly releaseDate15 = new DateOnly(2025, 11, 17); - num3 = 5; - List list43 = new List(num3); - CollectionsMarshal.SetCount(list43, num3); - Span span43 = CollectionsMarshal.AsSpan(list43); num4 = 0; - ref ChangeEntry reference43 = ref span43[num4]; - index = 2; - List list44 = new List(index); - CollectionsMarshal.SetCount(list44, index); - Span span44 = CollectionsMarshal.AsSpan(list44); - num5 = 0; - span44[num5] = "Quest sequence window to show expected sequences in each quest (with quest searching)"; - num5++; - span44[num5] = "Changelog"; - reference43 = new ChangeEntry(EChangeCategory.Added, "Major features", list44); - num4++; - ref ChangeEntry reference44 = ref span43[num4]; - num5 = 2; - List list45 = new List(num5); - CollectionsMarshal.SetCount(list45, num5); - Span span45 = CollectionsMarshal.AsSpan(list45); - index = 0; - span45[index] = "Updated quest schemas"; + span42[num4] = "Added new fields to quest schema"; + reference41 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list42); index++; - span45[index] = "Added search bar to preferred mounts and capitalization to mirror game mount names"; - reference44 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list45); + ref ChangeEntry reference42 = ref span41[index]; + num4 = 3; + List list43 = new List(num4); + CollectionsMarshal.SetCount(list43, num4); + Span span43 = CollectionsMarshal.AsSpan(list43); + num5 = 0; + span43[num5] = "A Faerie Tale Come True"; + num5++; + span43[num5] = "Constant Cravings"; + num5++; + span43[num5] = "A Bridge Too Full"; + reference42 = new ChangeEntry(EChangeCategory.QuestUpdates, "Added new quest paths", list43); + index++; + ref ChangeEntry reference43 = ref span41[index]; + num5 = 3; + List list44 = new List(num5); + CollectionsMarshal.SetCount(list44, num5); + Span span44 = CollectionsMarshal.AsSpan(list44); + num4 = 0; + span44[num4] = "Fixed various quest schemas"; num4++; - ref ChangeEntry reference45 = ref span43[num4]; - index = 3; - List list46 = new List(index); - CollectionsMarshal.SetCount(list46, index); + span44[num4] = "Fixed changelog bullet point encoding"; + num4++; + span44[num4] = "Fixed item use to wait until item is used before next action"; + reference43 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list44); + reference40 = new ChangelogEntry("7.38.1", releaseDate15, list41); + num2++; + ref ChangelogEntry reference44 = ref span[num2]; + DateOnly releaseDate16 = new DateOnly(2025, 11, 17); + index = 5; + List list45 = new List(index); + CollectionsMarshal.SetCount(list45, index); + Span span45 = CollectionsMarshal.AsSpan(list45); + num3 = 0; + ref ChangeEntry reference45 = ref span45[num3]; + num4 = 2; + List list46 = new List(num4); + CollectionsMarshal.SetCount(list46, num4); Span span46 = CollectionsMarshal.AsSpan(list46); num5 = 0; - span46[num5] = "Renamed IsQuestCompleted → IsQuestComplete"; + span46[num5] = "Quest sequence window to show expected sequences in each quest (with quest searching)"; num5++; - span46[num5] = "Renamed IsQuestAvailable → IsReadyToAcceptQuest"; - num5++; - span46[num5] = "Added GetCurrentTask IPC"; - reference45 = new ChangeEntry(EChangeCategory.Changed, "IPC changes", list46); - num4++; - span43[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added all Hildibrand quests"); - num4++; - span43[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed credits/cutscenes playback"); - reference42 = new ChangelogEntry("7.38.0", releaseDate15, list43); - num2++; - ref ChangelogEntry reference46 = ref span[num2]; - DateOnly releaseDate16 = new DateOnly(2025, 11, 8); - num4 = 1; - List list47 = new List(num4); - CollectionsMarshal.SetCount(list47, num4); - Span span47 = CollectionsMarshal.AsSpan(list47); - num3 = 0; - span47[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added Fall Guys quest (Just Crowning Around)"); - reference46 = new ChangelogEntry("6.38", releaseDate16, list47); - num2++; - ref ChangelogEntry reference47 = ref span[num2]; - DateOnly releaseDate17 = new DateOnly(2025, 11, 8); - num3 = 1; - List list48 = new List(num3); - CollectionsMarshal.SetCount(list48, num3); - Span span48 = CollectionsMarshal.AsSpan(list48); + span46[num5] = "Changelog"; + reference45 = new ChangeEntry(EChangeCategory.Added, "Major features", list46); + num3++; + ref ChangeEntry reference46 = ref span45[num3]; + num5 = 2; + List list47 = new List(num5); + CollectionsMarshal.SetCount(list47, num5); + Span span47 = CollectionsMarshal.AsSpan(list47); num4 = 0; - span48[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added Cosmic Exploration and various unlock quests"); - reference47 = new ChangelogEntry("6.37", releaseDate17, list48); + span47[num4] = "Updated quest schemas"; + num4++; + span47[num4] = "Added search bar to preferred mounts and capitalization to mirror game mount names"; + reference46 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list47); + num3++; + ref ChangeEntry reference47 = ref span45[num3]; + num4 = 3; + List list48 = new List(num4); + CollectionsMarshal.SetCount(list48, num4); + Span span48 = CollectionsMarshal.AsSpan(list48); + num5 = 0; + span48[num5] = "Renamed IsQuestCompleted → IsQuestComplete"; + num5++; + span48[num5] = "Renamed IsQuestAvailable → IsReadyToAcceptQuest"; + num5++; + span48[num5] = "Added GetCurrentTask IPC"; + reference47 = new ChangeEntry(EChangeCategory.Changed, "IPC changes", list48); + num3++; + span45[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added all Hildibrand quests"); + num3++; + span45[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed credits/cutscenes playback"); + reference44 = new ChangelogEntry("7.38.0", releaseDate16, list45); num2++; ref ChangelogEntry reference48 = ref span[num2]; - DateOnly releaseDate18 = new DateOnly(2025, 11, 2); - num4 = 1; - List list49 = new List(num4); - CollectionsMarshal.SetCount(list49, num4); + DateOnly releaseDate17 = new DateOnly(2025, 11, 8); + num3 = 1; + List list49 = new List(num3); + CollectionsMarshal.SetCount(list49, num3); Span span49 = CollectionsMarshal.AsSpan(list49); - num3 = 0; - span49[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy Rank 6 quest (With High Spirits)"); - reference48 = new ChangelogEntry("6.36", releaseDate18, list49); + index = 0; + span49[index] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added Fall Guys quest (Just Crowning Around)"); + reference48 = new ChangelogEntry("6.38", releaseDate17, list49); num2++; ref ChangelogEntry reference49 = ref span[num2]; - DateOnly releaseDate19 = new DateOnly(2025, 10, 28); - num3 = 1; - List list50 = new List(num3); - CollectionsMarshal.SetCount(list50, num3); + DateOnly releaseDate18 = new DateOnly(2025, 11, 8); + index = 1; + List list50 = new List(index); + CollectionsMarshal.SetCount(list50, index); Span span50 = CollectionsMarshal.AsSpan(list50); - num4 = 0; - span50[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed level 3 MSQ handling if character started on non-XP buff world"); - reference49 = new ChangelogEntry("6.35", releaseDate19, list50); + num3 = 0; + span50[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added Cosmic Exploration and various unlock quests"); + reference49 = new ChangelogEntry("6.37", releaseDate18, list50); num2++; ref ChangelogEntry reference50 = ref span[num2]; - DateOnly releaseDate20 = new DateOnly(2025, 10, 23); - num4 = 2; - List list51 = new List(num4); - CollectionsMarshal.SetCount(list51, num4); + DateOnly releaseDate19 = new DateOnly(2025, 11, 2); + num3 = 1; + List list51 = new List(num3); + CollectionsMarshal.SetCount(list51, num3); Span span51 = CollectionsMarshal.AsSpan(list51); - num3 = 0; - span51[num3] = new ChangeEntry(EChangeCategory.Added, "Added clear priority quests on logout and on completion config settings"); - num3++; - span51[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed priority quest importing to respect import order"); - reference50 = new ChangelogEntry("6.34", releaseDate20, list51); + index = 0; + span51[index] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy Rank 6 quest (With High Spirits)"); + reference50 = new ChangelogEntry("6.36", releaseDate19, list51); num2++; ref ChangelogEntry reference51 = ref span[num2]; - DateOnly releaseDate21 = new DateOnly(2025, 10, 23); - num3 = 1; - List list52 = new List(num3); - CollectionsMarshal.SetCount(list52, num3); + DateOnly releaseDate20 = new DateOnly(2025, 10, 28); + index = 1; + List list52 = new List(index); + CollectionsMarshal.SetCount(list52, index); Span span52 = CollectionsMarshal.AsSpan(list52); - num4 = 0; - span52[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed RSR combat module"); - reference51 = new ChangelogEntry("6.33", releaseDate21, list52); + num3 = 0; + span52[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed level 3 MSQ handling if character started on non-XP buff world"); + reference51 = new ChangelogEntry("6.35", releaseDate20, list52); num2++; ref ChangelogEntry reference52 = ref span[num2]; - DateOnly releaseDate22 = new DateOnly(2025, 10, 23); - num4 = 1; - List list53 = new List(num4); - CollectionsMarshal.SetCount(list53, num4); + DateOnly releaseDate21 = new DateOnly(2025, 10, 23); + num3 = 2; + List list53 = new List(num3); + CollectionsMarshal.SetCount(list53, num3); Span span53 = CollectionsMarshal.AsSpan(list53); - num3 = 0; - span53[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy Rank 5 quest (Forged in Corn)"); - reference52 = new ChangelogEntry("6.32", releaseDate22, list53); + index = 0; + span53[index] = new ChangeEntry(EChangeCategory.Added, "Added clear priority quests on logout and on completion config settings"); + index++; + span53[index] = new ChangeEntry(EChangeCategory.Fixed, "Fixed priority quest importing to respect import order"); + reference52 = new ChangelogEntry("6.34", releaseDate21, list53); num2++; ref ChangelogEntry reference53 = ref span[num2]; - DateOnly releaseDate23 = new DateOnly(2025, 10, 21); - num3 = 1; - List list54 = new List(num3); - CollectionsMarshal.SetCount(list54, num3); + DateOnly releaseDate22 = new DateOnly(2025, 10, 23); + index = 1; + List list54 = new List(index); + CollectionsMarshal.SetCount(list54, index); Span span54 = CollectionsMarshal.AsSpan(list54); - num4 = 0; - span54[num4] = new ChangeEntry(EChangeCategory.Changed, "Added checks for moogle and allied society quests when using add all available quests"); - reference53 = new ChangelogEntry("6.31", releaseDate23, list54); + num3 = 0; + span54[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed RSR combat module"); + reference53 = new ChangelogEntry("6.33", releaseDate22, list54); num2++; ref ChangelogEntry reference54 = ref span[num2]; - DateOnly releaseDate24 = new DateOnly(2025, 10, 21); - num4 = 1; - List list55 = new List(num4); - CollectionsMarshal.SetCount(list55, num4); + DateOnly releaseDate23 = new DateOnly(2025, 10, 23); + num3 = 1; + List list55 = new List(num3); + CollectionsMarshal.SetCount(list55, num3); Span span55 = CollectionsMarshal.AsSpan(list55); - num3 = 0; - span55[num3] = new ChangeEntry(EChangeCategory.Added, "Added button to journal that allows adding all available quests to priority"); - reference54 = new ChangelogEntry("6.30", releaseDate24, list55); + index = 0; + span55[index] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy Rank 5 quest (Forged in Corn)"); + reference54 = new ChangelogEntry("6.32", releaseDate23, list55); num2++; ref ChangelogEntry reference55 = ref span[num2]; - DateOnly releaseDate25 = new DateOnly(2025, 10, 20); - num3 = 2; - List list56 = new List(num3); - CollectionsMarshal.SetCount(list56, num3); + DateOnly releaseDate24 = new DateOnly(2025, 10, 21); + index = 1; + List list56 = new List(index); + CollectionsMarshal.SetCount(list56, index); Span span56 = CollectionsMarshal.AsSpan(list56); - num4 = 0; - ref ChangeEntry reference56 = ref span56[num4]; - num5 = 2; - List list57 = new List(num5); - CollectionsMarshal.SetCount(list57, num5); - Span span57 = CollectionsMarshal.AsSpan(list57); + num3 = 0; + span56[num3] = new ChangeEntry(EChangeCategory.Changed, "Added checks for moogle and allied society quests when using add all available quests"); + reference55 = new ChangelogEntry("6.31", releaseDate24, list56); + num2++; + ref ChangelogEntry reference56 = ref span[num2]; + DateOnly releaseDate25 = new DateOnly(2025, 10, 21); + num3 = 1; + List list57 = new List(num3); + CollectionsMarshal.SetCount(list57, num3); + Span span57 = CollectionsMarshal.AsSpan(list57); index = 0; - span57[index] = "Added item count to combat handling rework"; - index++; - span57[index] = "Updated Pandora conflicting features"; - reference56 = new ChangeEntry(EChangeCategory.Changed, "Combat handling improvements", list57); - num4++; - span56[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed quest to purchase Gysahl Greens if not in inventory"); - reference55 = new ChangelogEntry("6.29", releaseDate25, list56); + span57[index] = new ChangeEntry(EChangeCategory.Added, "Added button to journal that allows adding all available quests to priority"); + reference56 = new ChangelogEntry("6.30", releaseDate25, list57); num2++; ref ChangelogEntry reference57 = ref span[num2]; - DateOnly releaseDate26 = new DateOnly(2025, 10, 19); - num4 = 1; - List list58 = new List(num4); - CollectionsMarshal.SetCount(list58, num4); + DateOnly releaseDate26 = new DateOnly(2025, 10, 20); + index = 2; + List list58 = new List(index); + CollectionsMarshal.SetCount(list58, index); Span span58 = CollectionsMarshal.AsSpan(list58); num3 = 0; - span58[num3] = new ChangeEntry(EChangeCategory.Changed, "Reworked kill count combat handling - combat and enemy kills are now processed instantly"); - reference57 = new ChangelogEntry("6.28", releaseDate26, list58); - num2++; - ref ChangelogEntry reference58 = ref span[num2]; - DateOnly releaseDate27 = new DateOnly(2025, 10, 18); - num3 = 2; - List list59 = new List(num3); - CollectionsMarshal.SetCount(list59, num3); - Span span59 = CollectionsMarshal.AsSpan(list59); + ref ChangeEntry reference58 = ref span58[num3]; + num5 = 2; + List list59 = new List(num5); + CollectionsMarshal.SetCount(list59, num5); + Span span59 = CollectionsMarshal.AsSpan(list59); num4 = 0; - span59[num4] = new ChangeEntry(EChangeCategory.Changed, "Improved Aether Current checking logic"); + span59[num4] = "Added item count to combat handling rework"; num4++; - span59[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed Chocobo Taxi Stand CheckSkip error and Patch 7.3 Fantasia unlock quest date/time"); - reference58 = new ChangelogEntry("6.27", releaseDate27, list59); + span59[num4] = "Updated Pandora conflicting features"; + reference58 = new ChangeEntry(EChangeCategory.Changed, "Combat handling improvements", list59); + num3++; + span58[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed quest to purchase Gysahl Greens if not in inventory"); + reference57 = new ChangelogEntry("6.29", releaseDate26, list58); num2++; ref ChangelogEntry reference59 = ref span[num2]; - DateOnly releaseDate28 = new DateOnly(2025, 10, 18); - num4 = 1; - List list60 = new List(num4); - CollectionsMarshal.SetCount(list60, num4); + DateOnly releaseDate27 = new DateOnly(2025, 10, 19); + num3 = 1; + List list60 = new List(num3); + CollectionsMarshal.SetCount(list60, num3); Span span60 = CollectionsMarshal.AsSpan(list60); - num3 = 0; - span60[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 4 quests"); - reference59 = new ChangelogEntry("6.26", releaseDate28, list60); + index = 0; + span60[index] = new ChangeEntry(EChangeCategory.Changed, "Reworked kill count combat handling - combat and enemy kills are now processed instantly"); + reference59 = new ChangelogEntry("6.28", releaseDate27, list60); num2++; ref ChangelogEntry reference60 = ref span[num2]; - DateOnly releaseDate29 = new DateOnly(2025, 10, 17); - num3 = 1; - List list61 = new List(num3); - CollectionsMarshal.SetCount(list61, num3); + DateOnly releaseDate28 = new DateOnly(2025, 10, 18); + index = 2; + List list61 = new List(index); + CollectionsMarshal.SetCount(list61, index); Span span61 = CollectionsMarshal.AsSpan(list61); - num4 = 0; - span61[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added All Saints' Wake 2025 quests and 7.35 Yok Huy rank 4 quests"); - reference60 = new ChangelogEntry("6.25", releaseDate29, list61); + num3 = 0; + span61[num3] = new ChangeEntry(EChangeCategory.Changed, "Improved Aether Current checking logic"); + num3++; + span61[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed Chocobo Taxi Stand CheckSkip error and Patch 7.3 Fantasia unlock quest date/time"); + reference60 = new ChangelogEntry("6.27", releaseDate28, list61); num2++; ref ChangelogEntry reference61 = ref span[num2]; - DateOnly releaseDate30 = new DateOnly(2025, 10, 16); - num4 = 1; - List list62 = new List(num4); - CollectionsMarshal.SetCount(list62, num4); + DateOnly releaseDate29 = new DateOnly(2025, 10, 18); + num3 = 1; + List list62 = new List(num3); + CollectionsMarshal.SetCount(list62, num3); Span span62 = CollectionsMarshal.AsSpan(list62); - num3 = 0; - span62[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 4 quests and Deep Dungeon quest"); - reference61 = new ChangelogEntry("6.24", releaseDate30, list62); + index = 0; + span62[index] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 4 quests"); + reference61 = new ChangelogEntry("6.26", releaseDate29, list62); num2++; ref ChangelogEntry reference62 = ref span[num2]; - DateOnly releaseDate31 = new DateOnly(2025, 10, 13); - num3 = 1; - List list63 = new List(num3); - CollectionsMarshal.SetCount(list63, num3); + DateOnly releaseDate30 = new DateOnly(2025, 10, 17); + index = 1; + List list63 = new List(index); + CollectionsMarshal.SetCount(list63, index); Span span63 = CollectionsMarshal.AsSpan(list63); - num4 = 0; - span63[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 3 quest (Larder Logistics)"); - reference62 = new ChangelogEntry("6.23", releaseDate31, list63); + num3 = 0; + span63[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added All Saints' Wake 2025 quests and 7.35 Yok Huy rank 4 quests"); + reference62 = new ChangelogEntry("6.25", releaseDate30, list63); num2++; ref ChangelogEntry reference63 = ref span[num2]; - DateOnly releaseDate32 = new DateOnly(2025, 10, 12); - num4 = 3; - List list64 = new List(num4); - CollectionsMarshal.SetCount(list64, num4); + DateOnly releaseDate31 = new DateOnly(2025, 10, 16); + num3 = 1; + List list64 = new List(num3); + CollectionsMarshal.SetCount(list64, num3); Span span64 = CollectionsMarshal.AsSpan(list64); - num3 = 0; - span64[num3] = new ChangeEntry(EChangeCategory.Changed, "Prevent disabled or Locked quests from being started as 'Start as next quest'"); - num3++; - span64[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 3 quests"); - num3++; - span64[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed Yok Huy quest and journal quest chain priority issues"); - reference63 = new ChangelogEntry("6.22", releaseDate32, list64); + index = 0; + span64[index] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 4 quests and Deep Dungeon quest"); + reference63 = new ChangelogEntry("6.24", releaseDate31, list64); num2++; ref ChangelogEntry reference64 = ref span[num2]; - DateOnly releaseDate33 = new DateOnly(2025, 10, 12); - num3 = 2; - List list65 = new List(num3); - CollectionsMarshal.SetCount(list65, num3); + DateOnly releaseDate32 = new DateOnly(2025, 10, 13); + index = 1; + List list65 = new List(index); + CollectionsMarshal.SetCount(list65, index); Span span65 = CollectionsMarshal.AsSpan(list65); - num4 = 0; - span65[num4] = new ChangeEntry(EChangeCategory.Added, "Added expansion abbreviation to journal window"); - num4++; - span65[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 3 quests"); - reference64 = new ChangelogEntry("6.21", releaseDate33, list65); + num3 = 0; + span65[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 3 quest (Larder Logistics)"); + reference64 = new ChangelogEntry("6.23", releaseDate32, list65); num2++; ref ChangelogEntry reference65 = ref span[num2]; - DateOnly releaseDate34 = new DateOnly(2025, 10, 10); - num4 = 2; - List list66 = new List(num4); - CollectionsMarshal.SetCount(list66, num4); + DateOnly releaseDate33 = new DateOnly(2025, 10, 12); + num3 = 3; + List list66 = new List(num3); + CollectionsMarshal.SetCount(list66, num3); Span span66 = CollectionsMarshal.AsSpan(list66); - num3 = 0; - span66[num3] = new ChangeEntry(EChangeCategory.Changed, "Allow completed repeatable quests to be used with 'Add quest and requirements to priority' feature"); - num3++; - span66[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 1 quest (A Work of Cart)"); - reference65 = new ChangelogEntry("6.20", releaseDate34, list66); + index = 0; + span66[index] = new ChangeEntry(EChangeCategory.Changed, "Prevent disabled or Locked quests from being started as 'Start as next quest'"); + index++; + span66[index] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 3 quests"); + index++; + span66[index] = new ChangeEntry(EChangeCategory.Fixed, "Fixed Yok Huy quest and journal quest chain priority issues"); + reference65 = new ChangelogEntry("6.22", releaseDate33, list66); num2++; ref ChangelogEntry reference66 = ref span[num2]; - DateOnly releaseDate35 = new DateOnly(2025, 10, 9); - num3 = 3; - List list67 = new List(num3); - CollectionsMarshal.SetCount(list67, num3); + DateOnly releaseDate34 = new DateOnly(2025, 10, 12); + index = 2; + List list67 = new List(index); + CollectionsMarshal.SetCount(list67, index); Span span67 = CollectionsMarshal.AsSpan(list67); - num4 = 0; - span67[num4] = new ChangeEntry(EChangeCategory.Added, "Added config to batch Allied Society quest turn-ins"); - num4++; - span67[num4] = new ChangeEntry(EChangeCategory.Changed, "Repeatable quests now show correct availability state in journal"); - num4++; - span67[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 2 quests"); - reference66 = new ChangelogEntry("6.19", releaseDate35, list67); + num3 = 0; + span67[num3] = new ChangeEntry(EChangeCategory.Added, "Added expansion abbreviation to journal window"); + num3++; + span67[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 3 quests"); + reference66 = new ChangelogEntry("6.21", releaseDate34, list67); num2++; ref ChangelogEntry reference67 = ref span[num2]; - DateOnly releaseDate36 = new DateOnly(2025, 10, 9); - num4 = 2; - List list68 = new List(num4); - CollectionsMarshal.SetCount(list68, num4); + DateOnly releaseDate35 = new DateOnly(2025, 10, 10); + num3 = 2; + List list68 = new List(num3); + CollectionsMarshal.SetCount(list68, num3); Span span68 = CollectionsMarshal.AsSpan(list68); - num3 = 0; - span68[num3] = new ChangeEntry(EChangeCategory.Changed, "Show once completed quests with improved state display"); - num3++; - span68[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy daily quest and improvements to various Yok Huy quests"); - reference67 = new ChangelogEntry("6.18", releaseDate36, list68); + index = 0; + span68[index] = new ChangeEntry(EChangeCategory.Changed, "Allow completed repeatable quests to be used with 'Add quest and requirements to priority' feature"); + index++; + span68[index] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 1 quest (A Work of Cart)"); + reference67 = new ChangelogEntry("6.20", releaseDate35, list68); num2++; ref ChangelogEntry reference68 = ref span[num2]; - DateOnly releaseDate37 = new DateOnly(2025, 10, 8); - num3 = 1; - List list69 = new List(num3); - CollectionsMarshal.SetCount(list69, num3); + DateOnly releaseDate36 = new DateOnly(2025, 10, 9); + index = 3; + List list69 = new List(index); + CollectionsMarshal.SetCount(list69, index); Span span69 = CollectionsMarshal.AsSpan(list69); - num4 = 0; - span69[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 1 and rank 2 quests"); - reference68 = new ChangelogEntry("6.17", releaseDate37, list69); + num3 = 0; + span69[num3] = new ChangeEntry(EChangeCategory.Added, "Added config to batch Allied Society quest turn-ins"); + num3++; + span69[num3] = new ChangeEntry(EChangeCategory.Changed, "Repeatable quests now show correct availability state in journal"); + num3++; + span69[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 2 quests"); + reference68 = new ChangelogEntry("6.19", releaseDate36, list69); num2++; ref ChangelogEntry reference69 = ref span[num2]; - DateOnly releaseDate38 = new DateOnly(2025, 10, 8); - num4 = 1; - List list70 = new List(num4); - CollectionsMarshal.SetCount(list70, num4); + DateOnly releaseDate37 = new DateOnly(2025, 10, 9); + num3 = 2; + List list70 = new List(num3); + CollectionsMarshal.SetCount(list70, num3); Span span70 = CollectionsMarshal.AsSpan(list70); - num3 = 0; - span70[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Deep Dungeon quest (Faerie Tale)"); - reference69 = new ChangelogEntry("6.16", releaseDate38, list70); + index = 0; + span70[index] = new ChangeEntry(EChangeCategory.Changed, "Show once completed quests with improved state display"); + index++; + span70[index] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy daily quest and improvements to various Yok Huy quests"); + reference69 = new ChangelogEntry("6.18", releaseDate37, list70); num2++; ref ChangelogEntry reference70 = ref span[num2]; - DateOnly releaseDate39 = new DateOnly(2025, 10, 8); - num3 = 2; - List list71 = new List(num3); - CollectionsMarshal.SetCount(list71, num3); + DateOnly releaseDate38 = new DateOnly(2025, 10, 8); + index = 1; + List list71 = new List(index); + CollectionsMarshal.SetCount(list71, index); Span span71 = CollectionsMarshal.AsSpan(list71); - num4 = 0; - span71[num4] = new ChangeEntry(EChangeCategory.Changed, "Dalamud cleanup"); - num4++; - span71[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed quest level requirement check log spam"); - reference70 = new ChangelogEntry("6.15", releaseDate39, list71); + num3 = 0; + span71[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 1 and rank 2 quests"); + reference70 = new ChangelogEntry("6.17", releaseDate38, list71); num2++; ref ChangelogEntry reference71 = ref span[num2]; - DateOnly releaseDate40 = new DateOnly(2025, 10, 8); - num4 = 1; - List list72 = new List(num4); - CollectionsMarshal.SetCount(list72, num4); + DateOnly releaseDate39 = new DateOnly(2025, 10, 8); + num3 = 1; + List list72 = new List(num3); + CollectionsMarshal.SetCount(list72, num3); Span span72 = CollectionsMarshal.AsSpan(list72); - num3 = 0; - span72[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed abandoned quest check logic if quest were MSQ"); - reference71 = new ChangelogEntry("6.14", releaseDate40, list72); + index = 0; + span72[index] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Deep Dungeon quest (Faerie Tale)"); + reference71 = new ChangelogEntry("6.16", releaseDate39, list72); num2++; ref ChangelogEntry reference72 = ref span[num2]; - DateOnly releaseDate41 = new DateOnly(2025, 10, 8); - num3 = 2; - List list73 = new List(num3); - CollectionsMarshal.SetCount(list73, num3); + DateOnly releaseDate40 = new DateOnly(2025, 10, 8); + index = 2; + List list73 = new List(index); + CollectionsMarshal.SetCount(list73, index); Span span73 = CollectionsMarshal.AsSpan(list73); - num4 = 0; - ref ChangeEntry reference73 = ref span73[num4]; - index = 3; - List list74 = new List(index); - CollectionsMarshal.SetCount(list74, index); - Span span74 = CollectionsMarshal.AsSpan(list74); - num5 = 0; - span74[num5] = "Context menu option to add required quests and their chain to priority list"; - num5++; - span74[num5] = "AetheryteShortcut to multiple quests"; - num5++; - span74[num5] = "Artisan as a recommended plugin/dependency"; - reference73 = new ChangeEntry(EChangeCategory.Added, "Quest improvements", list74); - num4++; - span73[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed abandoned quest check and priority list issues"); - reference72 = new ChangelogEntry("6.13", releaseDate41, list73); + num3 = 0; + span73[num3] = new ChangeEntry(EChangeCategory.Changed, "Dalamud cleanup"); + num3++; + span73[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed quest level requirement check log spam"); + reference72 = new ChangelogEntry("6.15", releaseDate40, list73); + num2++; + ref ChangelogEntry reference73 = ref span[num2]; + DateOnly releaseDate41 = new DateOnly(2025, 10, 8); + num3 = 1; + List list74 = new List(num3); + CollectionsMarshal.SetCount(list74, num3); + Span span74 = CollectionsMarshal.AsSpan(list74); + index = 0; + span74[index] = new ChangeEntry(EChangeCategory.Fixed, "Fixed abandoned quest check logic if quest were MSQ"); + reference73 = new ChangelogEntry("6.14", releaseDate41, list74); num2++; ref ChangelogEntry reference74 = ref span[num2]; - DateOnly releaseDate42 = new DateOnly(2025, 10, 7); - num4 = 4; - List list75 = new List(num4); - CollectionsMarshal.SetCount(list75, num4); + DateOnly releaseDate42 = new DateOnly(2025, 10, 8); + index = 2; + List list75 = new List(index); + CollectionsMarshal.SetCount(list75, index); Span span75 = CollectionsMarshal.AsSpan(list75); num3 = 0; ref ChangeEntry reference75 = ref span75[num3]; - num5 = 4; - List list76 = new List(num5); - CollectionsMarshal.SetCount(list76, num5); + num4 = 3; + List list76 = new List(num4); + CollectionsMarshal.SetCount(list76, num4); Span span76 = CollectionsMarshal.AsSpan(list76); - index = 0; - span76[index] = "FATE combat handling with auto level syncing"; - index++; - span76[index] = "Start accepted quests from journal with 'Start as next quest'"; - index++; - span76[index] = "Update quest tracking when quests are hidden or prioritised in game"; - index++; - span76[index] = "QuestMap as a recommended plugin/dependency"; - reference75 = new ChangeEntry(EChangeCategory.Added, "FATE and quest tracking", list76); - num3++; - ref ChangeEntry reference76 = ref span75[num3]; - index = 3; - List list77 = new List(index); - CollectionsMarshal.SetCount(list77, index); - Span span77 = CollectionsMarshal.AsSpan(list77); num5 = 0; - span77[num5] = "Always prioritise next quest during teleportation/zone transitions"; + span76[num5] = "Context menu option to add required quests and their chain to priority list"; num5++; - span77[num5] = "Improved accepted quest logic with abandoned quest detection"; + span76[num5] = "AetheryteShortcut to multiple quests"; num5++; - span77[num5] = "Show quests without quest paths as Locked"; - reference76 = new ChangeEntry(EChangeCategory.Changed, "Quest prioritisation improvements", list77); + span76[num5] = "Artisan as a recommended plugin/dependency"; + reference75 = new ChangeEntry(EChangeCategory.Added, "Quest improvements", list76); num3++; - span75[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Deep Dungeon, Hildibrand, Yok Huy, Monster Hunter Wilds Collab, and Doman Enclave quests"); - num3++; - span75[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed accepted/active quest display and Hildibrand quest issues"); - reference74 = new ChangelogEntry("6.12", releaseDate42, list75); + span75[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed abandoned quest check and priority list issues"); + reference74 = new ChangelogEntry("6.13", releaseDate42, list75); num2++; - ref ChangelogEntry reference77 = ref span[num2]; - DateOnly releaseDate43 = new DateOnly(2025, 10, 3); - num3 = 1; - List list78 = new List(num3); - CollectionsMarshal.SetCount(list78, num3); - Span span78 = CollectionsMarshal.AsSpan(list78); - num4 = 0; - span78[num4] = new ChangeEntry(EChangeCategory.Changed, "Added remaining checks for quest priority to prevent infinite teleport looping"); - reference77 = new ChangelogEntry("6.11", releaseDate43, list78); - num2++; - ref ChangelogEntry reference78 = ref span[num2]; - DateOnly releaseDate44 = new DateOnly(2025, 10, 2); - num4 = 1; - List list79 = new List(num4); - CollectionsMarshal.SetCount(list79, num4); - Span span79 = CollectionsMarshal.AsSpan(list79); - num3 = 0; - ref ChangeEntry reference79 = ref span79[num3]; - num5 = 2; - List list80 = new List(num5); - CollectionsMarshal.SetCount(list80, num5); - Span span80 = CollectionsMarshal.AsSpan(list80); + ref ChangelogEntry reference76 = ref span[num2]; + DateOnly releaseDate43 = new DateOnly(2025, 10, 7); + num3 = 4; + List list77 = new List(num3); + CollectionsMarshal.SetCount(list77, num3); + Span span77 = CollectionsMarshal.AsSpan(list77); index = 0; - span80[index] = "Don't show quests as available if player doesn't meet level requirements"; + ref ChangeEntry reference77 = ref span77[index]; + num5 = 4; + List list78 = new List(num5); + CollectionsMarshal.SetCount(list78, num5); + Span span78 = CollectionsMarshal.AsSpan(list78); + num4 = 0; + span78[num4] = "FATE combat handling with auto level syncing"; + num4++; + span78[num4] = "Start accepted quests from journal with 'Start as next quest'"; + num4++; + span78[num4] = "Update quest tracking when quests are hidden or prioritised in game"; + num4++; + span78[num4] = "QuestMap as a recommended plugin/dependency"; + reference77 = new ChangeEntry(EChangeCategory.Added, "FATE and quest tracking", list78); index++; - span80[index] = "Updated 'required for MSQ' text in Crystal Tower quest preset window"; - reference79 = new ChangeEntry(EChangeCategory.Changed, "Quest window improvements", list80); - reference78 = new ChangelogEntry("6.10", releaseDate44, list79); + ref ChangeEntry reference78 = ref span77[index]; + num4 = 3; + List list79 = new List(num4); + CollectionsMarshal.SetCount(list79, num4); + Span span79 = CollectionsMarshal.AsSpan(list79); + num5 = 0; + span79[num5] = "Always prioritise next quest during teleportation/zone transitions"; + num5++; + span79[num5] = "Improved accepted quest logic with abandoned quest detection"; + num5++; + span79[num5] = "Show quests without quest paths as Locked"; + reference78 = new ChangeEntry(EChangeCategory.Changed, "Quest prioritisation improvements", list79); + index++; + span77[index] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Deep Dungeon, Hildibrand, Yok Huy, Monster Hunter Wilds Collab, and Doman Enclave quests"); + index++; + span77[index] = new ChangeEntry(EChangeCategory.Fixed, "Fixed accepted/active quest display and Hildibrand quest issues"); + reference76 = new ChangelogEntry("6.12", releaseDate43, list77); + num2++; + ref ChangelogEntry reference79 = ref span[num2]; + DateOnly releaseDate44 = new DateOnly(2025, 10, 3); + index = 1; + List list80 = new List(index); + CollectionsMarshal.SetCount(list80, index); + Span span80 = CollectionsMarshal.AsSpan(list80); + num3 = 0; + span80[num3] = new ChangeEntry(EChangeCategory.Changed, "Added remaining checks for quest priority to prevent infinite teleport looping"); + reference79 = new ChangelogEntry("6.11", releaseDate44, list80); num2++; ref ChangelogEntry reference80 = ref span[num2]; - DateOnly releaseDate45 = new DateOnly(2025, 9, 21); - num3 = 5; + DateOnly releaseDate45 = new DateOnly(2025, 10, 2); + num3 = 1; List list81 = new List(num3); CollectionsMarshal.SetCount(list81, num3); Span span81 = CollectionsMarshal.AsSpan(list81); - num4 = 0; - ref ChangeEntry reference81 = ref span81[num4]; - index = 4; - List list82 = new List(index); - CollectionsMarshal.SetCount(list82, index); - Span span82 = CollectionsMarshal.AsSpan(list82); - num5 = 0; - span82[num5] = "Reworked event quest handling - automatically displays when events are active"; - num5++; - span82[num5] = "Reworked journal system with improved filtering and display"; - num5++; - span82[num5] = "Reworked Priority Quests tab (Manual Priority and Quest Presets)"; - num5++; - span82[num5] = "Quest path viewer site (https://wigglymuffin.github.io/FFXIV-Tools/)"; - reference81 = new ChangeEntry(EChangeCategory.Added, "Major system reworks", list82); - num4++; - ref ChangeEntry reference82 = ref span81[num4]; - num5 = 4; - List list83 = new List(num5); - CollectionsMarshal.SetCount(list83, num5); - Span span83 = CollectionsMarshal.AsSpan(list83); index = 0; - span83[index] = "Questionable.IsQuestCompleted"; - index++; - span83[index] = "Questionable.IsQuestAvailable"; - index++; - span83[index] = "Questionable.IsQuestAccepted"; - index++; - span83[index] = "Questionable.IsQuestUnobtainable"; - reference82 = new ChangeEntry(EChangeCategory.Added, "New IPC commands", list83); + ref ChangeEntry reference81 = ref span81[index]; + num5 = 2; + List list82 = new List(num5); + CollectionsMarshal.SetCount(list82, num5); + Span span82 = CollectionsMarshal.AsSpan(list82); + num4 = 0; + span82[num4] = "Don't show quests as available if player doesn't meet level requirements"; num4++; - ref ChangeEntry reference83 = ref span81[num4]; + span82[num4] = "Updated 'required for MSQ' text in Crystal Tower quest preset window"; + reference81 = new ChangeEntry(EChangeCategory.Changed, "Quest window improvements", list82); + reference80 = new ChangelogEntry("6.10", releaseDate45, list81); + num2++; + ref ChangelogEntry reference82 = ref span[num2]; + DateOnly releaseDate46 = new DateOnly(2025, 9, 21); index = 5; - List list84 = new List(index); - CollectionsMarshal.SetCount(list84, index); + List list83 = new List(index); + CollectionsMarshal.SetCount(list83, index); + Span span83 = CollectionsMarshal.AsSpan(list83); + num3 = 0; + ref ChangeEntry reference83 = ref span83[num3]; + num4 = 4; + List list84 = new List(num4); + CollectionsMarshal.SetCount(list84, num4); Span span84 = CollectionsMarshal.AsSpan(list84); num5 = 0; - span84[num5] = "Improved JSON quest validation with specific error reasons"; + span84[num5] = "Reworked event quest handling - automatically displays when events are active"; num5++; - span84[num5] = "Added stop at sequence stop condition"; + span84[num5] = "Reworked journal system with improved filtering and display"; num5++; - span84[num5] = "Improved Pandora plugin conflict detection"; + span84[num5] = "Reworked Priority Quests tab (Manual Priority and Quest Presets)"; num5++; - span84[num5] = "Improved DialogueChoices regex matching"; - num5++; - span84[num5] = "Improved refresh checker for all quest states"; - reference83 = new ChangeEntry(EChangeCategory.Changed, "Various improvements", list84); - num4++; - span81[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.31 Occult Crescent quests"); - num4++; - span81[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed cutscene crashes, Single Player Duty triggers, and various quest issues"); - reference80 = new ChangelogEntry("6.9", releaseDate45, list81); - num2++; - ref ChangelogEntry reference84 = ref span[num2]; - DateOnly releaseDate46 = new DateOnly(2025, 9, 2); - num4 = 4; - List list85 = new List(num4); - CollectionsMarshal.SetCount(list85, num4); - Span span85 = CollectionsMarshal.AsSpan(list85); - num3 = 0; - ref ChangeEntry reference85 = ref span85[num3]; + span84[num5] = "Quest path viewer site (https://wigglymuffin.github.io/FFXIV-Tools/)"; + reference83 = new ChangeEntry(EChangeCategory.Added, "Major system reworks", list84); + num3++; + ref ChangeEntry reference84 = ref span83[num3]; num5 = 4; - List list86 = new List(num5); - CollectionsMarshal.SetCount(list86, num5); + List list85 = new List(num5); + CollectionsMarshal.SetCount(list85, num5); + Span span85 = CollectionsMarshal.AsSpan(list85); + num4 = 0; + span85[num4] = "Questionable.IsQuestCompleted"; + num4++; + span85[num4] = "Questionable.IsQuestAvailable"; + num4++; + span85[num4] = "Questionable.IsQuestAccepted"; + num4++; + span85[num4] = "Questionable.IsQuestUnobtainable"; + reference84 = new ChangeEntry(EChangeCategory.Added, "New IPC commands", list85); + num3++; + ref ChangeEntry reference85 = ref span83[num3]; + num4 = 5; + List list86 = new List(num4); + CollectionsMarshal.SetCount(list86, num4); Span span86 = CollectionsMarshal.AsSpan(list86); - index = 0; - span86[index] = "Help commands and priority quest command"; - index++; - span86[index] = "Prevent 'CompleteQuest' step setting"; - index++; - span86[index] = "Duty counts and controls in 'Quest Battles' tab"; - index++; - span86[index] = "'Refresh quest timer' setting (WIP)"; - reference85 = new ChangeEntry(EChangeCategory.Added, "Command and UI improvements", list86); + num5 = 0; + span86[num5] = "Improved JSON quest validation with specific error reasons"; + num5++; + span86[num5] = "Added stop at sequence stop condition"; + num5++; + span86[num5] = "Improved Pandora plugin conflict detection"; + num5++; + span86[num5] = "Improved DialogueChoices regex matching"; + num5++; + span86[num5] = "Improved refresh checker for all quest states"; + reference85 = new ChangeEntry(EChangeCategory.Changed, "Various improvements", list86); num3++; - span85[num3] = new ChangeEntry(EChangeCategory.Changed, "Improved 'Clear All' buttons to require CTRL being held"); + span83[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.31 Occult Crescent quests"); num3++; - span85[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added Zodiac quests and 7.31 Cosmic/Occult Crescent quests"); - num3++; - span85[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed Fishing for Friendship and Cosmic Exploration quests"); - reference84 = new ChangelogEntry("6.8", releaseDate46, list85); + span83[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed cutscene crashes, Single Player Duty triggers, and various quest issues"); + reference82 = new ChangelogEntry("6.9", releaseDate46, list83); num2++; ref ChangelogEntry reference86 = ref span[num2]; - DateOnly releaseDate47 = new DateOnly(2025, 8, 27); + DateOnly releaseDate47 = new DateOnly(2025, 9, 2); num3 = 4; List list87 = new List(num3); CollectionsMarshal.SetCount(list87, num3); Span span87 = CollectionsMarshal.AsSpan(list87); - num4 = 0; - ref ChangeEntry reference87 = ref span87[num4]; - index = 2; - List list88 = new List(index); - CollectionsMarshal.SetCount(list88, index); + index = 0; + ref ChangeEntry reference87 = ref span87[index]; + num5 = 4; + List list88 = new List(num5); + CollectionsMarshal.SetCount(list88, num5); Span span88 = CollectionsMarshal.AsSpan(list88); - num5 = 0; - span88[num5] = "Icon to 'Clear All' button in stop conditions"; - num5++; - span88[num5] = "Duty counts and 'Enable All' button in 'Duties' tab"; - reference87 = new ChangeEntry(EChangeCategory.Added, "UI improvements", list88); + num4 = 0; + span88[num4] = "Help commands and priority quest command"; num4++; - span87[num4] = new ChangeEntry(EChangeCategory.Changed, "Renamed 'Clear' button to 'Clear All' in priority window"); + span88[num4] = "Prevent 'CompleteQuest' step setting"; num4++; - span87[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added Rising 2025 Event Quests"); + span88[num4] = "Duty counts and controls in 'Quest Battles' tab"; num4++; - span87[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed clipboard assigning blacklist to whitelist in 'Duties' tab"); - reference86 = new ChangelogEntry("6.7", releaseDate47, list87); + span88[num4] = "'Refresh quest timer' setting (WIP)"; + reference87 = new ChangeEntry(EChangeCategory.Added, "Command and UI improvements", list88); + index++; + span87[index] = new ChangeEntry(EChangeCategory.Changed, "Improved 'Clear All' buttons to require CTRL being held"); + index++; + span87[index] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added Zodiac quests and 7.31 Cosmic/Occult Crescent quests"); + index++; + span87[index] = new ChangeEntry(EChangeCategory.Fixed, "Fixed Fishing for Friendship and Cosmic Exploration quests"); + reference86 = new ChangelogEntry("6.8", releaseDate47, list87); num2++; ref ChangelogEntry reference88 = ref span[num2]; - DateOnly releaseDate48 = new DateOnly(2025, 8, 25); - num4 = 2; - List list89 = new List(num4); - CollectionsMarshal.SetCount(list89, num4); + DateOnly releaseDate48 = new DateOnly(2025, 8, 27); + index = 4; + List list89 = new List(index); + CollectionsMarshal.SetCount(list89, index); Span span89 = CollectionsMarshal.AsSpan(list89); num3 = 0; ref ChangeEntry reference89 = ref span89[num3]; - num5 = 2; - List list90 = new List(num5); - CollectionsMarshal.SetCount(list90, num5); + num4 = 2; + List list90 = new List(num4); + CollectionsMarshal.SetCount(list90, num4); Span span90 = CollectionsMarshal.AsSpan(list90); - index = 0; - span90[index] = "Missing emotes to schema and emote handler"; - index++; - span90[index] = "Improved stop conditions with 'Clear All' button"; - reference89 = new ChangeEntry(EChangeCategory.Added, "Emote support and stop conditions", list90); + num5 = 0; + span90[num5] = "Icon to 'Clear All' button in stop conditions"; + num5++; + span90[num5] = "Duty counts and 'Enable All' button in 'Duties' tab"; + reference89 = new ChangeEntry(EChangeCategory.Added, "UI improvements", list90); num3++; - span89[num3] = new ChangeEntry(EChangeCategory.Changed, "Stop at level functionality"); - reference88 = new ChangelogEntry("6.6", releaseDate48, list89); + span89[num3] = new ChangeEntry(EChangeCategory.Changed, "Renamed 'Clear' button to 'Clear All' in priority window"); + num3++; + span89[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added Rising 2025 Event Quests"); + num3++; + span89[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed clipboard assigning blacklist to whitelist in 'Duties' tab"); + reference88 = new ChangelogEntry("6.7", releaseDate48, list89); num2++; ref ChangelogEntry reference90 = ref span[num2]; DateOnly releaseDate49 = new DateOnly(2025, 8, 25); @@ -991,11 +989,32 @@ internal static class ChangelogData List list91 = new List(num3); CollectionsMarshal.SetCount(list91, num3); Span span91 = CollectionsMarshal.AsSpan(list91); + index = 0; + ref ChangeEntry reference91 = ref span91[index]; + num5 = 2; + List list92 = new List(num5); + CollectionsMarshal.SetCount(list92, num5); + Span span92 = CollectionsMarshal.AsSpan(list92); num4 = 0; - span91[num4] = new ChangeEntry(EChangeCategory.Fixed, "Potential fix to single/solo duties softlocking"); + span92[num4] = "Missing emotes to schema and emote handler"; num4++; - span91[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added San d'Oria: The Second Walk and various side quests"); - reference90 = new ChangelogEntry("6.5", releaseDate49, list91); + span92[num4] = "Improved stop conditions with 'Clear All' button"; + reference91 = new ChangeEntry(EChangeCategory.Added, "Emote support and stop conditions", list92); + index++; + span91[index] = new ChangeEntry(EChangeCategory.Changed, "Stop at level functionality"); + reference90 = new ChangelogEntry("6.6", releaseDate49, list91); + num2++; + ref ChangelogEntry reference92 = ref span[num2]; + DateOnly releaseDate50 = new DateOnly(2025, 8, 25); + index = 2; + List list93 = new List(index); + CollectionsMarshal.SetCount(list93, index); + Span span93 = CollectionsMarshal.AsSpan(list93); + num3 = 0; + span93[num3] = new ChangeEntry(EChangeCategory.Fixed, "Potential fix to single/solo duties softlocking"); + num3++; + span93[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added San d'Oria: The Second Walk and various side quests"); + reference92 = new ChangelogEntry("6.5", releaseDate50, list93); Changelogs = list; } } diff --git a/Questionable/Questionable.Data/JournalData.cs b/Questionable/Questionable.Data/JournalData.cs index 25f06e6..68ad162 100644 --- a/Questionable/Questionable.Data/JournalData.cs +++ b/Questionable/Questionable.Data/JournalData.cs @@ -109,7 +109,6 @@ internal sealed class JournalData if (journalCategory.RowId != 0) { SeasonalEventsCategoryId = journalCategory.RowId; - _logger.LogInformation("Resolved 'Seasonal Events' JournalCategory ID: {CategoryId}", SeasonalEventsCategoryId); } else { @@ -121,7 +120,6 @@ internal sealed class JournalData SeasonalEventGenreIds = (from x in excelSheet where x.RowId != 0 && x.JournalCategory.RowId == journalData.SeasonalEventsCategoryId.Value select x.RowId).ToHashSet(); - _logger.LogInformation("Resolved {Count} seasonal event JournalGenre IDs from JournalCategory {CategoryId}: [{Ids}]", SeasonalEventGenreIds.Count, SeasonalEventsCategoryId.Value, string.Join(", ", SeasonalEventGenreIds.OrderBy((uint x) => x))); } else { @@ -131,7 +129,6 @@ internal sealed class JournalData if (journalGenre.RowId != 0) { MoogleDeliveryGenreId = journalGenre.RowId; - _logger.LogInformation("Resolved 'Delivery Moogle Quests' JournalGenre ID: {GenreId}", MoogleDeliveryGenreId); } else { @@ -171,20 +168,19 @@ internal sealed class JournalData if (section != null) { int num = 0; - foreach (Category category in section.Categories) { - foreach (Genre genre in category.Genres) + foreach (Category category in section.Categories) { - genre.IsUnderOtherQuests = true; - num++; + foreach (Genre genre in category.Genres) + { + genre.IsUnderOtherQuests = true; + num++; + } } + return; } - _logger.LogInformation("Marked {Count} genres as under 'Other Quests' (OtherQuestsSectionRowId={Id})", num, valueOrDefault); - } - else - { - _logger.LogWarning("OtherQuestsSectionRowId = {Id} found, but matching Section not present in constructed Sections", valueOrDefault); } + _logger.LogWarning("OtherQuestsSectionRowId = {Id} found, but matching Section not present in constructed Sections", valueOrDefault); } else { diff --git a/Questionable/Questionable.Data/QuestData.cs b/Questionable/Questionable.Data/QuestData.cs index 9ecfc77..764abcf 100644 --- a/Questionable/Questionable.Data/QuestData.cs +++ b/Questionable/Questionable.Data/QuestData.cs @@ -1220,7 +1220,7 @@ internal sealed class QuestData } else { - _logger.LogWarning("ApplySeasonalOverride: Quest {QuestId} not found in QuestData (could not apply seasonal override)", questId); + _ = value is UnlockLinkQuestInfo; } } @@ -1228,7 +1228,6 @@ internal sealed class QuestData { ArgumentNullException.ThrowIfNull(info, "info"); _quests[info.QuestId] = info; - _logger.LogDebug("Added or replaced QuestInfo for {QuestId} in QuestData", info.QuestId); } static QuestData() diff --git a/Questionable/Questionable.Validation/QuestValidator.cs b/Questionable/Questionable.Validation/QuestValidator.cs index be612e6..a35e9fa 100644 --- a/Questionable/Questionable.Validation/QuestValidator.cs +++ b/Questionable/Questionable.Validation/QuestValidator.cs @@ -27,7 +27,6 @@ internal sealed class QuestValidator { _validators = validators.ToList(); _logger = logger; - _logger.LogInformation("Validators: {Validators}", string.Join(", ", _validators.Select((IQuestValidator x) => x.GetType().Name))); } public void Reset() diff --git a/Questionable/Questionable.Windows.ConfigComponents/SinglePlayerDutyConfigComponent.cs b/Questionable/Questionable.Windows.ConfigComponents/SinglePlayerDutyConfigComponent.cs index 79ddc16..d8e30b9 100644 --- a/Questionable/Questionable.Windows.ConfigComponents/SinglePlayerDutyConfigComponent.cs +++ b/Questionable/Questionable.Windows.ConfigComponents/SinglePlayerDutyConfigComponent.cs @@ -265,7 +265,6 @@ internal sealed class SinglePlayerDutyConfigComponent : ConfigComponent { if (quest.Root.Disabled) { - _logger.LogDebug("Disabling quest battle for quest {QuestId}, quest is disabled", questId); return (Enabled: false, Options: singlePlayerDutyOptions); } QuestStep questStep = (from x in quest.AllSteps() @@ -277,7 +276,6 @@ internal sealed class SinglePlayerDutyConfigComponent : ConfigComponent } return (Enabled: true, Options: questStep.SinglePlayerDutyOptions ?? singlePlayerDutyOptions); } - _logger.LogDebug("Disabling quest battle for quest {QuestId}, unknown quest", questId); return (Enabled: false, Options: singlePlayerDutyOptions); } diff --git a/Questionable/Questionable.Windows.JournalComponents/QuestJournalComponent.cs b/Questionable/Questionable.Windows.JournalComponents/QuestJournalComponent.cs index 3bcf1b1..ae247b6 100644 --- a/Questionable/Questionable.Windows.JournalComponents/QuestJournalComponent.cs +++ b/Questionable/Questionable.Windows.JournalComponents/QuestJournalComponent.cs @@ -492,7 +492,6 @@ internal sealed class QuestJournalComponent _categoryCounts.Clear(); _sectionCounts.Clear(); bool hideSeasonalEventsFromJournalProgress = _configuration.General.HideSeasonalEventsFromJournalProgress; - _logger.LogInformation("Refreshing journal counts. HideSeasonalEventsFromJournalProgress={Hide}", hideSeasonalEventsFromJournalProgress); foreach (JournalData.Genre genre in _journalData.Genres) { List source = ((hideSeasonalEventsFromJournalProgress && _journalData.SeasonalEventsCategoryId.HasValue && genre.CategoryId == _journalData.SeasonalEventsCategoryId.Value) ? genre.Quests.Where((IQuestInfo q) => !IsSeasonal(q)).ToList() : genre.Quests.ToList()); diff --git a/Questionable/Questionable.Windows.QuestComponents/EventInfoComponent.cs b/Questionable/Questionable.Windows.QuestComponents/EventInfoComponent.cs index b337dcc..7b966a9 100644 --- a/Questionable/Questionable.Windows.QuestComponents/EventInfoComponent.cs +++ b/Questionable/Questionable.Windows.QuestComponents/EventInfoComponent.cs @@ -251,33 +251,6 @@ internal sealed class EventInfoComponent } questInfo = quest.Info; } - try - { - bool flag = false; - DateTime? dateTime = null; - if (questInfo is QuestInfo questInfo2) - { - flag = questInfo2.IsSeasonalQuest || questInfo2.IsSeasonalEvent || questInfo2.SeasonalQuestExpiry is DateTime || (questInfo2.JournalGenre.HasValue && _journalData.SeasonalEventGenreIds.Contains(questInfo2.JournalGenre.Value)); - dateTime = questInfo2.SeasonalQuestExpiry; - } - if (flag) - { - if (dateTime.HasValue) - { - DateTime valueOrDefault = dateTime.GetValueOrDefault(); - DateTime dateTime2 = NormalizeExpiry(valueOrDefault); - _logger.LogInformation("Seasonal details: Quest {QuestId} '{Name}' rawExpiry={Raw:o} Kind={Kind} TimeOfDay={TimeOfDay} normalizedUtc={Normalized:o}", questInfo.QuestId, questInfo.Name, valueOrDefault, valueOrDefault.Kind, valueOrDefault.TimeOfDay, dateTime2); - } - else - { - _logger.LogInformation("Seasonal details: Quest {QuestId} '{Name}' has no expiry (seasonal flag present). IsSeasonalEvent={IsSeasonalEvent} IsSeasonalQuest={IsSeasonalQuest} JournalGenre={JournalGenre} SeasonalQuestExpiry={SeasonalQuestExpiry}", questInfo.QuestId, questInfo.Name, questInfo is QuestInfo questInfo3 && questInfo3.IsSeasonalEvent, questInfo is QuestInfo questInfo4 && questInfo4.IsSeasonalQuest, (questInfo is QuestInfo questInfo5) ? questInfo5.JournalGenre : ((uint?)null), (questInfo is QuestInfo questInfo6) ? questInfo6.SeasonalQuestExpiry : ((DateTime?)null)); - } - } - } - catch (Exception exception) - { - _logger.LogDebug(exception, "Failed to log seasonal details for {QuestId}", questInfo.QuestId); - } if (_questFunctions.IsQuestUnobtainable(questInfo.QuestId)) { if (_alreadyLoggedActiveSeasonalSkip.Add(questInfo.QuestId.Value)) @@ -289,15 +262,15 @@ internal sealed class EventInfoComponent { if (questExpiry.HasValue) { - DateTime valueOrDefault2 = questExpiry.GetValueOrDefault(); - DateTime dateTime3 = NormalizeExpiry(valueOrDefault2); - if (dateTime3 > DateTime.UtcNow) + DateTime valueOrDefault = questExpiry.GetValueOrDefault(); + DateTime dateTime = NormalizeExpiry(valueOrDefault); + if (dateTime > DateTime.UtcNow) { yield return questInfo; } else if (_alreadyLoggedActiveSeasonalSkip.Add(questInfo.QuestId.Value)) { - _logger.LogDebug("Skipping UnlockLink quest {QuestId} '{Name}': expiry {Expiry:o} UTC is not in the future", questInfo.QuestId, questInfo.Name, dateTime3); + _logger.LogDebug("Skipping UnlockLink quest {QuestId} '{Name}': expiry {Expiry:o} UTC is not in the future", questInfo.QuestId, questInfo.Name, dateTime); } } else @@ -307,24 +280,24 @@ internal sealed class EventInfoComponent } else { - if (!(questInfo is QuestInfo { SeasonalQuestExpiry: var seasonalQuestExpiry } questInfo7)) + if (!(questInfo is QuestInfo { SeasonalQuestExpiry: var seasonalQuestExpiry } questInfo2)) { continue; } if (seasonalQuestExpiry.HasValue) { - DateTime valueOrDefault3 = seasonalQuestExpiry.GetValueOrDefault(); - DateTime dateTime4 = NormalizeExpiry(valueOrDefault3); - if (dateTime4 > DateTime.UtcNow) + DateTime valueOrDefault2 = seasonalQuestExpiry.GetValueOrDefault(); + DateTime dateTime2 = NormalizeExpiry(valueOrDefault2); + if (dateTime2 > DateTime.UtcNow) { yield return questInfo; } else if (_alreadyLoggedActiveSeasonalSkip.Add(questInfo.QuestId.Value)) { - _logger.LogDebug("Skipping quest {QuestId} '{Name}': seasonal expiry {Expiry:o} UTC is not in the future", questInfo.QuestId, questInfo.Name, dateTime4); + _logger.LogDebug("Skipping quest {QuestId} '{Name}': seasonal expiry {Expiry:o} UTC is not in the future", questInfo.QuestId, questInfo.Name, dateTime2); } } - else if (questInfo7.IsSeasonalQuest && !questInfo7.SeasonalQuestExpiry.HasValue) + else if (questInfo2.IsSeasonalQuest && !questInfo2.SeasonalQuestExpiry.HasValue) { yield return questInfo; } @@ -354,12 +327,12 @@ internal sealed class EventInfoComponent return q.JournalGenre.HasValue ? GetJournalGenreName(q.JournalGenre.Value) : q.Name; })) { - DateTime dateTime = item.Select(delegate(IQuestInfo q) + item.Select(delegate(IQuestInfo q) { - DateTime? dateTime2 = (q as QuestInfo)?.SeasonalQuestExpiry ?? ((q is UnlockLinkQuestInfo unlockLinkQuestInfo) ? unlockLinkQuestInfo.QuestExpiry : ((DateTime?)null)); - if (dateTime2.HasValue) + DateTime? dateTime = (q as QuestInfo)?.SeasonalQuestExpiry ?? ((q is UnlockLinkQuestInfo unlockLinkQuestInfo) ? unlockLinkQuestInfo.QuestExpiry : ((DateTime?)null)); + if (dateTime.HasValue) { - DateTime valueOrDefault = dateTime2.GetValueOrDefault(); + DateTime valueOrDefault = dateTime.GetValueOrDefault(); return NormalizeExpiry(valueOrDefault); } return DateTime.MaxValue; @@ -368,14 +341,9 @@ internal sealed class EventInfoComponent select (q as UnlockLinkQuestInfo)?.Patch into p where !string.IsNullOrEmpty(p) select p).Distinct().ToList(); - string text = ((list.Count == 1) ? list[0] : null); - if (dateTime != DateTime.MaxValue) + if (list.Count == 1) { - _logger.LogInformation("Seasonal event '{Name}' ends at {Expiry:o} UTC (patch={Patch})", item.Key, dateTime, text ?? "n/a"); - } - else - { - _logger.LogInformation("Seasonal event '{Name}' has no expiry (patch={Patch})", item.Key, text ?? "n/a"); + _ = list[0]; } } }