Add tab to view available daily quests only
authorLiza Carvelli <liza@carvel.li>
Sun, 8 Dec 2024 18:03:52 +0000 (19:03 +0100)
committerLiza Carvelli <liza@carvel.li>
Sun, 8 Dec 2024 18:03:52 +0000 (19:03 +0100)
Questionable/Functions/QuestFunctions.cs
Questionable/QuestionablePlugin.cs
Questionable/Windows/JournalComponents/AlliedSocietyJournalComponent.cs [new file with mode: 0644]
Questionable/Windows/JournalProgressWindow.cs

index 2f0cb841d3fdfa76907947574c911bffa1057bba..fb720e2fae150620af7c1656368366c36996af39 100644 (file)
@@ -552,7 +552,7 @@ internal sealed unsafe class QuestFunctions
         if (questInfo.GrandCompany != GrandCompany.None && questInfo.GrandCompany != GetGrandCompany())
             return true;
 
-        if (questInfo.AlliedSociety != EAlliedSociety.None)
+        if (questInfo.AlliedSociety != EAlliedSociety.None && questInfo.IsRepeatable)
             return !IsDailyAlliedSocietyQuestAndAvailableToday(questId);
 
         return !HasCompletedPreviousQuests(questInfo, extraCompletedQuest) || !HasCompletedPreviousInstances(questInfo);
index 2af5c204a4ccf25387cd21932dca11ab32176d04..db6d7469fb3d83e04e33ff9a8fff6e89e98cad3b 100644 (file)
@@ -264,6 +264,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin
 
         serviceCollection.AddSingleton<QuestJournalComponent>();
         serviceCollection.AddSingleton<GatheringJournalComponent>();
+        serviceCollection.AddSingleton<AlliedSocietyJournalComponent>();
 
         serviceCollection.AddSingleton<OneTimeSetupWindow>();
         serviceCollection.AddSingleton<QuestWindow>();
diff --git a/Questionable/Windows/JournalComponents/AlliedSocietyJournalComponent.cs b/Questionable/Windows/JournalComponents/AlliedSocietyJournalComponent.cs
new file mode 100644 (file)
index 0000000..e5adbc8
--- /dev/null
@@ -0,0 +1,97 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Dalamud.Interface.Colors;
+using Dalamud.Interface.Utility.Raii;
+using ImGuiNET;
+using Questionable.Controller;
+using Questionable.Data;
+using Questionable.Functions;
+using Questionable.Model;
+using Questionable.Windows.QuestComponents;
+
+namespace Questionable.Windows.JournalComponents;
+
+internal sealed class AlliedSocietyJournalComponent
+{
+    private static readonly string[] RankNames =
+        ["Neutral", "Recognized", "Friendly", "Trusted", "Respected", "Honored", "Sworn", "Allied"];
+
+    private readonly QuestFunctions _questFunctions;
+    private readonly AlliedSocietyQuestFunctions _alliedSocietyQuestFunctions;
+    private readonly QuestData _questData;
+    private readonly QuestRegistry _questRegistry;
+    private readonly QuestTooltipComponent _questTooltipComponent;
+    private readonly UiUtils _uiUtils;
+
+    public AlliedSocietyJournalComponent(
+        QuestFunctions questFunctions,
+        AlliedSocietyQuestFunctions alliedSocietyQuestFunctions,
+        QuestData questData,
+        QuestRegistry questRegistry,
+        QuestTooltipComponent questTooltipComponent,
+        UiUtils uiUtils)
+    {
+        _questFunctions = questFunctions;
+        _alliedSocietyQuestFunctions = alliedSocietyQuestFunctions;
+        _questData = questData;
+        _questRegistry = questRegistry;
+        _questTooltipComponent = questTooltipComponent;
+        _uiUtils = uiUtils;
+    }
+
+    public void DrawAlliedSocietyQuests()
+    {
+        using var tab = ImRaii.TabItem("Allied Societies");
+        if (!tab)
+            return;
+
+        foreach (EAlliedSociety alliedSociety in Enum.GetValues<EAlliedSociety>().Where(x => x != EAlliedSociety.None))
+        {
+            List<QuestInfo> quests = _alliedSocietyQuestFunctions.GetAvailableAlliedSocietyQuests(alliedSociety)
+                .Select(x => (QuestInfo)_questData.GetQuestInfo(x))
+                .ToList();
+            if (quests.Count == 0)
+                continue;
+
+            bool containsNewQuests = quests.Any(x => !_questFunctions.IsQuestComplete(x.QuestId));
+            if (containsNewQuests)
+                ImGui.PushStyleColor(ImGuiCol.Text, ImGuiColors.DalamudYellow);
+
+            if (!ImGui.CollapsingHeader($"{alliedSociety}###AlliedSociety{(int)alliedSociety}"))
+                continue;
+
+            if (containsNewQuests)
+                ImGui.PopStyleColor();
+
+            if (alliedSociety <= EAlliedSociety.Ixal)
+            {
+                for (byte i = 1; i <= 8; ++i)
+                {
+                    var questsByRank = quests.Where(x => x.AlliedSocietyRank == i).ToList();
+                    if (questsByRank.Count == 0)
+                        continue;
+
+                    ImGui.Text(RankNames[i - 1]);
+                    foreach (var quest in questsByRank)
+                        DrawQuest(quest);
+                }
+            }
+            else
+            {
+                foreach (var quest in quests)
+                    DrawQuest(quest);
+            }
+        }
+    }
+
+    private void DrawQuest(QuestInfo quest)
+    {
+        var (color, icon, tooltipText) = _uiUtils.GetQuestStyle(quest.QuestId);
+        if (!_questRegistry.IsKnownQuest(quest.QuestId))
+            color = ImGuiColors.DalamudGrey;
+
+        if (_uiUtils.ChecklistItem($"{quest.Name} ({tooltipText})", color, icon))
+            _questTooltipComponent.Draw(quest);
+    }
+}
index 531828f8b2092337aa9e875182c75772c0f592a4..6a5724a7e10b0aeb0f2a6444e0f6b4ceb99e8e51 100644 (file)
@@ -11,18 +11,21 @@ namespace Questionable.Windows;
 internal sealed class JournalProgressWindow : LWindow, IDisposable
 {
     private readonly QuestJournalComponent _questJournalComponent;
+    private readonly AlliedSocietyJournalComponent _alliedSocietyJournalComponent;
     private readonly GatheringJournalComponent _gatheringJournalComponent;
     private readonly QuestRegistry _questRegistry;
     private readonly IClientState _clientState;
 
     public JournalProgressWindow(
         QuestJournalComponent questJournalComponent,
+        AlliedSocietyJournalComponent alliedSocietyJournalComponent,
         GatheringJournalComponent gatheringJournalComponent,
         QuestRegistry questRegistry,
         IClientState clientState)
         : base("Journal Progress###QuestionableJournalProgress")
     {
         _questJournalComponent = questJournalComponent;
+        _alliedSocietyJournalComponent = alliedSocietyJournalComponent;
         _gatheringJournalComponent = gatheringJournalComponent;
         _questRegistry = questRegistry;
         _clientState = clientState;
@@ -60,6 +63,7 @@ internal sealed class JournalProgressWindow : LWindow, IDisposable
             return;
 
         _questJournalComponent.DrawQuests();
+        _alliedSocietyJournalComponent.DrawAlliedSocietyQuests();
         _gatheringJournalComponent.DrawGatheringItems();
     }