From 8093df63fe5d97ae94f956c5cb37f31dbe729a96 Mon Sep 17 00:00:00 2001 From: alydev Date: Wed, 23 Sep 2026 15:48:18 +1000 Subject: [PATCH 1/3] add patch number badge, slightly more ui customisation --- CHANGELOG.md | 4 +- Directory.Build.targets | 2 +- Questionable/Configuration.cs | 32 +++++++++------ Questionable/Utils/MoreInfoUtils.cs | 22 ++++++++++ .../ConfigComponents/DebugConfigComponent.cs | 26 +++++++----- .../GeneralConfigComponent.cs | 36 ++++++++++++----- .../JournalComponents/QuestJournalUtils.cs | 11 +---- .../QuestComponents/ActiveQuestComponent.cs | 40 +++++++++++++++---- 8 files changed, 119 insertions(+), 54 deletions(-) create mode 100644 Questionable/Utils/MoreInfoUtils.cs diff --git a/CHANGELOG.md b/CHANGELOG.md index 22d31d558..11f41cfae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1 +1,3 @@ -- Feature: added/testing post-HW unlocks, DoH/DoL unlocks presets -alydev \ No newline at end of file +- Feature: Patch number badge (click to open Console Games Wiki to the changelog page) -alydev +- Feature: ^ new badge and quest-accepted-job badge can be hidden -alydev +- Change: General and Advanced config tabs slightly reordered -alydev \ No newline at end of file diff --git a/Directory.Build.targets b/Directory.Build.targets index 69b2d4f15..2425a696c 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -1,6 +1,6 @@ - 15.756.3.17 + 15.756.3.18 diff --git a/Questionable/Configuration.cs b/Questionable/Configuration.cs index 9dcd938a8..5635d824d 100644 --- a/Questionable/Configuration.cs +++ b/Questionable/Configuration.cs @@ -202,36 +202,42 @@ internal void DeleteProfile(string profileName) #region Variables internal sealed class GeneralConfiguration { + // Preferences + public string Language { get; set; } = "en"; public ECombatModule CombatModule { get; set; } = ECombatModule.None; public uint MountId { get; set; } = 1; - public string ChocoboName { get; set; } = string.Empty; public GrandCompany GrandCompany { get; set; } = GrandCompany.None; public Job CombatJob { get; set; } = Job.ADV; public Job CraftingJob { get; set; } = Job.CRP; public Job GatheringJob { get; set; } = Job.MIN; public EGearsetUpdateSource GearsetUpdateSource { get; set; } = EGearsetUpdateSource.Vanilla; - public bool HideInAllInstances { get; set; } = true; - public bool UseQuestionableTheme { get; set; } = true; - public bool TitleBarPillCenter { get; set; } = true; + public string ChocoboName { get; set; } = string.Empty; + public string DisplayName { get; set; } = "Anonymous"; + // UI public bool UseEscToCancelQuesting { get; set; } = true; + public bool UseQuestionableTheme { get; set; } = true; public bool ShowIncompleteSeasonalEvents { get; set; } = true; - public bool SkipLowPriorityDuties { get; set; } + public bool QuestIcons { get; set; } = true; + public bool HideSponsorButton { get; set; } + public bool HideRemainingTasks { get; set; } + public bool HideInAllInstances { get; set; } = true; + public bool HidePatch { get; set; } + public bool HideQuestStartedJob { get; set; } + // Questing public bool ConfigureTextAdvance { get; set; } = true; public bool DontSkipCutscenes { get; set; } public bool DontShowAnswerSuggestions { get; set; } - public bool AutoStepRefreshEnabled { get; set; } - public int AutoStepRefreshDelaySeconds { get; set; } = 30; + public bool SkipLowPriorityDuties { get; set; } public bool UseTickets { get; set; } - public bool HideSponsorButton { get; set; } + public bool SameJobThroughoutQuest { get; set; } + // Unimplemented/hidden + public bool TitleBarPillCenter { get; set; } = true; public bool DismissedReportWarning { get; set; } public bool ReportsDisabled { get; set; } public string ReportMessage { get; set; } = ""; - public string DisplayName { get; set; } = "Anonymous"; - public string Language { get; set; } = "en"; - public bool HideRemainingTasks { get; set; } public bool ClaimMail { get; set; } - public bool SameJobThroughoutQuest { get; set; } - public bool QuestIcons { get; set; } = true; + public bool AutoStepRefreshEnabled { get; set; } + public int AutoStepRefreshDelaySeconds { get; set; } = 30; } internal sealed class StopConfiguration diff --git a/Questionable/Utils/MoreInfoUtils.cs b/Questionable/Utils/MoreInfoUtils.cs new file mode 100644 index 000000000..f13ced253 --- /dev/null +++ b/Questionable/Utils/MoreInfoUtils.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; +using System.Text.RegularExpressions; + +namespace Questionable.Utils; + +internal static class MoreInfoUtils +{ + internal static void SearchConsoleGamesWiki(string term) + { + var query = string.Join('&', new[] + { + ("search", term), + ("title", "Special:Search"), + ("go", "Go") + }.Select(p => $"{Uri.EscapeDataString(p.Item1)}={Uri.EscapeDataString(p.Item2)}")); + var uri = new UriBuilder("https", "ffxiv.consolegameswiki.com", 443, "mediawiki/index.php", $"?{query}"); + Process.Start(new ProcessStartInfo { FileName = uri.ToString(), UseShellExecute = true }); + } +} diff --git a/Questionable/Windows/ConfigComponents/DebugConfigComponent.cs b/Questionable/Windows/ConfigComponents/DebugConfigComponent.cs index 50b6a7263..d3e0dc274 100644 --- a/Questionable/Windows/ConfigComponents/DebugConfigComponent.cs +++ b/Questionable/Windows/ConfigComponents/DebugConfigComponent.cs @@ -66,6 +66,8 @@ public override void DrawTab() } } + ImGui.Separator(); + if (QstWidgets.SectionHeader(_L("Information"), "Information", defaultOpen: false)) { using (ImRaii.PushIndent()) @@ -170,20 +172,22 @@ public override void DrawTab() ImGui.Separator(); - ImGui.Text(_L("AutoDuty Settings")); - using (ImRaii.PushIndent()) + if (QstWidgets.SectionHeader(_L("AutoDuty Settings"), "AutoDutySettings", defaultOpen: true)) { - ImGui.AlignTextToFramePadding(); - bool disableAutoDutyBareMode = Configuration.Advanced.DisableAutoDutyBareMode; - if (ImGui.Checkbox(_L("Use Pre-Loop/Loop/Post-Loop settings"), ref disableAutoDutyBareMode)) + using (ImRaii.PushIndent()) { - Configuration.Advanced.DisableAutoDutyBareMode = disableAutoDutyBareMode; - Save(); - } + ImGui.AlignTextToFramePadding(); + bool disableAutoDutyBareMode = Configuration.Advanced.DisableAutoDutyBareMode; + if (ImGui.Checkbox(_L("Use Pre-Loop/Loop/Post-Loop settings"), ref disableAutoDutyBareMode)) + { + Configuration.Advanced.DisableAutoDutyBareMode = disableAutoDutyBareMode; + Save(); + } - ImGui.SameLine(); - ImGuiComponents.HelpMarker( - _L("Typically, the loop settings for AutoDuty are disabled when running dungeons with Questionable, since they can cause issues (or even shut down your PC).")); + ImGui.SameLine(); + ImGuiComponents.HelpMarker( + _L("Typically, the loop settings for AutoDuty are disabled when running dungeons with Questionable, since they can cause issues (or even shut down your PC).")); + } } ImGui.Separator(); diff --git a/Questionable/Windows/ConfigComponents/GeneralConfigComponent.cs b/Questionable/Windows/ConfigComponents/GeneralConfigComponent.cs index 46989e8b0..4d3b3f1f9 100644 --- a/Questionable/Windows/ConfigComponents/GeneralConfigComponent.cs +++ b/Questionable/Windows/ConfigComponents/GeneralConfigComponent.cs @@ -237,13 +237,6 @@ public override void DrawTab() } } - bool hideInAllInstances = Configuration.General.HideInAllInstances; - if (ImGui.Checkbox(_L("Hide quest window in all instanced duties"), ref hideInAllInstances)) - { - Configuration.General.HideInAllInstances = hideInAllInstances; - Save(); - } - bool useEscToCancelQuesting = Configuration.General.UseEscToCancelQuesting; if (ImGui.Checkbox(_L("Use ESC to cancel questing/movement"), ref useEscToCancelQuesting)) { @@ -258,12 +251,28 @@ public override void DrawTab() Save(); } + bool questIcons = Configuration.General.QuestIcons; + if (ImGui.Checkbox(_L("Show quest icons"), ref questIcons)) + { + Configuration.General.QuestIcons = questIcons; + Save(); + } + + bool hideInAllInstances = Configuration.General.HideInAllInstances; + if (ImGui.Checkbox(_L("Hide quest window in all instanced duties"), ref hideInAllInstances)) + { + Configuration.General.HideInAllInstances = hideInAllInstances; + Save(); + } + bool hideSponsorButton = Configuration.General.HideSponsorButton; if (ImGui.Checkbox(_L("Hide Sponsor button"), ref hideSponsorButton)) { Configuration.General.HideSponsorButton = hideSponsorButton; Save(); } + if (ImGui.IsItemHovered()) + ImGui.SetTooltip(_L("Takes effect next time the plugin is loaded")); bool hideRemainingTasks = Configuration.General.HideRemainingTasks; if (ImGui.Checkbox(_L("Hide remaining tasks"), ref hideRemainingTasks)) @@ -272,10 +281,17 @@ public override void DrawTab() Save(); } - bool questIcons = Configuration.General.QuestIcons; - if (ImGui.Checkbox(_L("Show quest icons"), ref questIcons)) + bool hidePatch = Configuration.General.HidePatch; + if (ImGui.Checkbox(_L("Hide quest patch badge"), ref hidePatch)) { - Configuration.General.QuestIcons = questIcons; + Configuration.General.HidePatch = hidePatch; + Save(); + } + + bool hideQuestStartedJob = Configuration.General.HideQuestStartedJob; + if (ImGui.Checkbox(_L("Hide which job a quest was started with"), ref hideQuestStartedJob)) + { + Configuration.General.HideQuestStartedJob = hideQuestStartedJob; Save(); } } diff --git a/Questionable/Windows/JournalComponents/QuestJournalUtils.cs b/Questionable/Windows/JournalComponents/QuestJournalUtils.cs index 4ff596fab..abfa9af92 100644 --- a/Questionable/Windows/JournalComponents/QuestJournalUtils.cs +++ b/Questionable/Windows/JournalComponents/QuestJournalUtils.cs @@ -131,16 +131,7 @@ public void ShowContextMenu(IQuestInfo questInfo, Quest? quest, string label) using (ImRaii.Disabled(questInfo.QuestId is not QuestId)) { if (ImGui.MenuItem("View on Console Games Wiki")) - { - var query = string.Join('&', new[] - { - ("search", questInfo.SimplifiedName), - ("title", "Special:Search"), - ("go", "Go") - }.Select(p => $"{Uri.EscapeDataString(p.Item1)}={Uri.EscapeDataString(p.Item2)}")); - var uri = new UriBuilder("https", "ffxiv.consolegameswiki.com", 443, "mediawiki/index.php", $"?{query}"); - Process.Start(new ProcessStartInfo { FileName = uri.ToString(), UseShellExecute = true }); - } + MoreInfoUtils.SearchConsoleGamesWiki(questInfo.SimplifiedName); } if (configuration.Advanced.Debug) { diff --git a/Questionable/Windows/QuestComponents/ActiveQuestComponent.cs b/Questionable/Windows/QuestComponents/ActiveQuestComponent.cs index 07624b79f..33683da45 100644 --- a/Questionable/Windows/QuestComponents/ActiveQuestComponent.cs +++ b/Questionable/Windows/QuestComponents/ActiveQuestComponent.cs @@ -1,4 +1,5 @@ using System.Collections.Immutable; +using System.Diagnostics; using System.Text.RegularExpressions; using Dalamud.Bindings.ImGui; using Dalamud.Game.ClientState.Conditions; @@ -353,17 +354,22 @@ private void DrawQuestNames(QuestController.QuestProgress currentQuest, ImGui.TextUnformatted(Shorten(currentQuest.Quest.Info.Name)); else ImGui.TextUnformatted(_L("Quest: ") + Shorten(currentQuest.Quest.Info.Name)); + ImGui.SameLine(); QstWidgets.Chip($"#{currentQuest.Quest.Id}", QstTheme.Info); - var acceptedJob = classJobUtils.LookupQuestStartJob(currentQuest.Quest.Id); - if (acceptedJob is not ECommons.ExcelServices.Job.ADV) + + if (!configuration.General.HideQuestStartedJob) { - ImGui.SameLine(); - QstWidgets.Chip($"{acceptedJob}", QstTheme.Accent); - if (ImGui.IsItemClicked()) - classJobUtils.SwitchClassJob(acceptedJob); - if (ImGui.IsItemHovered()) - ImGui.SetMouseCursor(ImGuiMouseCursor.Hand); + var acceptedJob = classJobUtils.LookupQuestStartJob(currentQuest.Quest.Id); + if (acceptedJob is not ECommons.ExcelServices.Job.ADV) + { + ImGui.SameLine(); + QstWidgets.Chip($"{acceptedJob}", QstTheme.Accent); + if (ImGui.IsItemClicked()) + classJobUtils.SwitchClassJob(acceptedJob); + if (ImGui.IsItemHovered()) + ImGui.SetMouseCursor(ImGuiMouseCursor.Hand); + } } if (startedQuest.Quest.Root.Disabled) @@ -501,6 +507,24 @@ private void DrawQuestNames(QuestController.QuestProgress currentQuest, QstWidgets.Chip(metaDataId.ToString(CultureInfo.InvariantCulture), QstTheme.TextMuted); } } + + if (!configuration.General.HidePatch) + { + var patch = QuestPatchMapper.GetPatch(currentQuest.Quest.Id.Value); + if (patch != null) + { + ImGui.SameLine(); + QstWidgets.Chip(patch, QstTheme.Danger); + if (ImGui.IsItemHovered()) + { + ImGui.SetMouseCursor(ImGuiMouseCursor.Hand); + ImGui.SetTooltip(_LF("This quest was added to the game in Patch {0}.\nClick here to view the changelog from this patch.", patch)); + } + if (ImGui.IsItemClicked()) + MoreInfoUtils.SearchConsoleGamesWiki($"Patch {patch}"); + } + } + if (configuration.Advanced.Debug) { ImGui.SameLine(); From daccf2d9427e2063ab6f8be307f0ac6d1e36185f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 23 Sep 2026 05:50:14 +0000 Subject: [PATCH 2/3] Apply formatting --- Questionable/Resources/I18N.xml | 70 ++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 27 deletions(-) diff --git a/Questionable/Resources/I18N.xml b/Questionable/Resources/I18N.xml index 6334dfa09..8b085a41c 100644 --- a/Questionable/Resources/I18N.xml +++ b/Questionable/Resources/I18N.xml @@ -1427,10 +1427,10 @@ + - - + Name Name 名前 @@ -1510,8 +1510,8 @@ - + Quest Quest クエスト @@ -1529,8 +1529,8 @@ - + Step Step @@ -1658,9 +1658,9 @@ - - + + Disabled Disabled 無効 @@ -1903,9 +1903,9 @@ 크리스탈 타워 레이드는 패치 2.55 퀘스트 '모든 목적에 대한 시간' 및 Heavensward 시작에 필요합니다. + - Prevent quest completion Prevent quest completion クエスト完了を防ぐ @@ -1923,8 +1923,8 @@ - + Abandon quest before completion Abandon quest before completion 完了前にクエストを放棄する @@ -1933,8 +1933,8 @@ - + Remove from priority when abandoned Remove from priority when abandoned 放棄時に優先リストから削除 @@ -1997,8 +1997,8 @@ - + Path data Path data パスデータ @@ -2052,9 +2052,9 @@ + - ? ? ? @@ -2063,8 +2063,8 @@ - + Duties Duties コンテンツ @@ -3236,8 +3236,8 @@ - + Stop Stop 停止 @@ -3282,8 +3282,8 @@ - + (Current: {0}) (Current: {0}) (現在: {0}) @@ -3364,8 +3364,8 @@ - + This quest is in Priority Quests. This quest is in Priority Quests. このクエストは優先クエストに含まれています。 @@ -3393,8 +3393,8 @@ - + Supported Supported サポート済み @@ -3611,8 +3611,8 @@ - + Add all to Priority Quests Add all to Priority Quests すべて優先クエストに追加 @@ -3666,8 +3666,8 @@ - + Remove all from Priority Quests Remove all from Priority Quests すべて優先クエストから削除 @@ -3676,8 +3676,8 @@ - + Sim first quest Sim first quest 最初のクエストをシミュレート @@ -4954,8 +4954,8 @@ - + Start NG+ here Start NG+ here ここからNG+を開始 @@ -4964,8 +4964,8 @@ - + Stop NG+ Stop NG+ NG+を停止 @@ -4974,8 +4974,8 @@ - + Idle Idle 待機中 @@ -5101,8 +5101,8 @@ - + Run command when Questionable finishes automatic questing Run command when Questionable finishes automatic questing Questionableの自動クエストが完了した際にコマンドを実行 @@ -5210,8 +5210,8 @@ - + Prev quest Prev quest 前提クエスト @@ -5945,8 +5945,8 @@ - + Interaction type detected from the target's nameplate icon. Interaction type detected from the target's nameplate icon. ターゲットのネームプレートアイコンからインタラクションタイプを検出しました。 @@ -6710,9 +6710,9 @@ /qst cleanup - 將所有已接取的任務新增到優先列表,已完成的排在前面 - + No open quests to clean up. No open quests to clean up. クリーンアップ対象の受注中クエストがありません。 @@ -6720,8 +6720,8 @@ 沒有已接取的任務可供清理。 - + Added {0} open quest(s) to the priority list: Added {0} open quest(s) to the priority list: 受注中のクエスト {0} 件を優先リストに追加しました: @@ -6928,4 +6928,20 @@ Post-HW unlocks Post-HW unlocks + + + Takes effect next time the plugin is loaded + + + + Hide quest patch badge + + + + Hide which job a quest was started with + + + + This quest was added to the game in Patch {0}.\nClick here to view the changelog from this patch. + \ No newline at end of file From ded88eeba84447d7e5e4fdf2e76f865f4c6caa0d Mon Sep 17 00:00:00 2001 From: alydev Date: Wed, 23 Sep 2026 15:52:33 +1000 Subject: [PATCH 3/3] lang fix --- Questionable/Resources/I18N.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Questionable/Resources/I18N.xml b/Questionable/Resources/I18N.xml index 8b085a41c..64c5125d0 100644 --- a/Questionable/Resources/I18N.xml +++ b/Questionable/Resources/I18N.xml @@ -6931,17 +6931,21 @@ Takes effect next time the plugin is loaded + Takes effect next time the plugin is loaded Hide quest patch badge + Hide quest patch badge Hide which job a quest was started with + Hide which job a quest was started with This quest was added to the game in Patch {0}.\nClick here to view the changelog from this patch. + This quest was added to the game in Patch {0}.\nClick here to view the changelog from this patch. \ No newline at end of file