Add leves to statistics window v2.6
authorLiza Carvelli <liza@carvel.li>
Sun, 11 Aug 2024 17:13:21 +0000 (19:13 +0200)
committerLiza Carvelli <liza@carvel.li>
Sun, 11 Aug 2024 17:13:21 +0000 (19:13 +0200)
Questionable/Data/JournalData.cs
Questionable/Data/QuestData.cs
Questionable/Model/IQuestInfo.cs
Questionable/Model/LeveInfo.cs
Questionable/Model/QuestInfo.cs
Questionable/Model/SatisfactionSupplyInfo.cs
Questionable/Windows/JournalProgressWindow.cs

index ae6c6ac2a55af49f48369290bc69742374c90a2b..fca04e82387d1259338831884069b1df970d0104 100644 (file)
@@ -22,17 +22,17 @@ internal sealed class JournalData
         var genreLimsa = new Genre(uint.MaxValue - 3, "Starting in Limsa Lominsa", 1,
             new uint[] { 108, 109 }.Concat(limsaStart.Quest.Select(x => x.Row))
                 .Where(x => x != 0)
-                .Select(x => (QuestInfo)questData.GetQuestInfo(new QuestId((ushort)(x & 0xFFFF))))
+                .Select(x => questData.GetQuestInfo(new QuestId((ushort)(x & 0xFFFF))))
                 .ToList());
         var genreGridania = new Genre(uint.MaxValue - 2, "Starting in Gridania", 1,
             new uint[] { 85, 123, 124 }.Concat(gridaniaStart.Quest.Select(x => x.Row))
                 .Where(x => x != 0)
-                .Select(x => (QuestInfo)questData.GetQuestInfo(new QuestId((ushort)(x & 0xFFFF))))
+                .Select(x => questData.GetQuestInfo(new QuestId((ushort)(x & 0xFFFF))))
                 .ToList());
         var genreUldah = new Genre(uint.MaxValue - 1, "Starting in Ul'dah", 1,
             new uint[] { 568, 569, 570 }.Concat(uldahStart.Quest.Select(x => x.Row))
                 .Where(x => x != 0)
-                .Select(x => (QuestInfo)questData.GetQuestInfo(new QuestId((ushort)(x & 0xFFFF))))
+                .Select(x => questData.GetQuestInfo(new QuestId((ushort)(x & 0xFFFF))))
                 .ToList());
         genres.InsertRange(0, [genreLimsa, genreGridania, genreUldah]);
         genres.Single(x => x.Id == 1)
@@ -57,7 +57,7 @@ internal sealed class JournalData
 
     internal sealed class Genre
     {
-        public Genre(JournalGenre journalGenre, List<QuestInfo> quests)
+        public Genre(JournalGenre journalGenre, List<IQuestInfo> quests)
         {
             Id = journalGenre.RowId;
             Name = journalGenre.Name.ToString();
@@ -65,7 +65,7 @@ internal sealed class JournalData
             Quests = quests;
         }
 
-        public Genre(uint id, string name, uint categoryId, List<QuestInfo> quests)
+        public Genre(uint id, string name, uint categoryId, List<IQuestInfo> quests)
         {
             Id = id;
             Name = name;
@@ -76,7 +76,7 @@ internal sealed class JournalData
         public uint Id { get; }
         public string Name { get; }
         public uint CategoryId { get; }
-        public List<QuestInfo> Quests { get; }
+        public List<IQuestInfo> Quests { get; }
         public int QuestCount => Quests.Count;
     }
 
index 89b389123408ac02be72f8fa4b7c7ffd23d1cce6..4c01199d4de445efdd63352d39c44d1c2e1891cd 100644 (file)
@@ -82,11 +82,10 @@ internal sealed class QuestData
 
     public bool IsIssuerOfAnyQuest(uint targetId) => _quests.Values.Any(x => x.IssuerDataId == targetId);
 
-    public List<QuestInfo> GetAllByJournalGenre(uint journalGenre)
+    public List<IQuestInfo> GetAllByJournalGenre(uint journalGenre)
     {
         return _quests.Values
-            .Where(x => x is QuestInfo { IsSeasonalEvent: false })
-            .Cast<QuestInfo>()
+            .Where(x => x is QuestInfo { IsSeasonalEvent: false } or not QuestInfo)
             .Where(x => x.JournalGenre == journalGenre)
             .OrderBy(x => x.SortKey)
             .ThenBy(x => x.QuestId)
index b4b362e8ed047f29af3f489a7ed23964c0aa5265..1a2f557a0d7b1ea2e3978ea8c2aa1282b4d69f7f 100644 (file)
@@ -14,6 +14,8 @@ public interface IQuestInfo
     public bool IsRepeatable { get; }
     public ushort Level { get; }
     public EBeastTribe BeastTribe { get; }
+    public uint? JournalGenre { get; }
+    public ushort SortKey { get; }
     public bool IsMainScenarioQuest { get; }
     public IReadOnlyList<EClassJob> ClassJobs { get; }
     public EExpansionVersion Expansion { get; }
index 499402168b8dc07c8f0c2eec7fc03f3da2745572..8d454e5b181a6a1d782901e86dbf35d6a9d35565 100644 (file)
@@ -12,6 +12,8 @@ internal sealed class LeveInfo : IQuestInfo
         QuestId = new LeveId((ushort)leve.RowId);
         Name = leve.Name;
         Level = leve.ClassJobLevel;
+        JournalGenre = leve.JournalGenre.Row;
+        SortKey = QuestId.Value;
         IssuerDataId = leve.LevelLevemete.Value!.Object;
         ClassJobs = QuestInfoUtils.AsList(leve.ClassJobCategory.Value!);
         Expansion = (EExpansionVersion)leve.LevelLevemete.Value.Territory.Value!.ExVersion.Row;
@@ -23,6 +25,8 @@ internal sealed class LeveInfo : IQuestInfo
     public bool IsRepeatable => true;
     public ushort Level { get; }
     public EBeastTribe BeastTribe => EBeastTribe.None;
+    public uint? JournalGenre { get; }
+    public ushort SortKey { get; }
     public bool IsMainScenarioQuest => false;
     public IReadOnlyList<EClassJob> ClassJobs { get; }
     public EExpansionVersion Expansion { get; }
index 6dba304f191aa87a8b083eaded3c99766b19a15b..e9a70ea3ab419190db72fc2b85bba995be996bcf 100644 (file)
@@ -71,7 +71,7 @@ internal sealed class QuestInfo : IQuestInfo
     public List<ushort> PreviousInstanceContent { get; }
     public QuestJoin PreviousInstanceContentJoin { get; }
     public uint? JournalGenre { get; }
-    public ushort SortKey { get; set; }
+    public ushort SortKey { get; }
     public bool IsMainScenarioQuest { get; }
     public bool CompletesInstantly { get; }
     public GrandCompany GrandCompany { get; }
index b46061ad01833f703d2bcc9833c32dd483f8db0e..17c56772fc1de1514aec3d2dd007f043b516c9a7 100644 (file)
@@ -13,6 +13,7 @@ internal sealed class SatisfactionSupplyInfo : IQuestInfo
         Name = npc.Npc.Value!.Singular;
         IssuerDataId = npc.Npc.Row;
         Level = npc.LevelUnlock;
+        SortKey = QuestId.Value;
         Expansion = (EExpansionVersion)npc.QuestRequired.Value!.Expansion.Row;
     }
 
@@ -22,6 +23,8 @@ internal sealed class SatisfactionSupplyInfo : IQuestInfo
     public bool IsRepeatable => true;
     public ushort Level { get; }
     public EBeastTribe BeastTribe => EBeastTribe.None;
+    public uint? JournalGenre => null;
+    public ushort SortKey { get; }
     public bool IsMainScenarioQuest => false;
     public EExpansionVersion Expansion { get; }
 
index 2d19c1be2449778a5cf7ba408c055f70a4e0b678..bf00be39771d5f44a865d31d2614bd4bac116770 100644 (file)
@@ -190,7 +190,7 @@ internal sealed class JournalProgressWindow : LWindow, IDisposable
         }
     }
 
-    private void DrawQuest(QuestInfo questInfo)
+    private void DrawQuest(IQuestInfo questInfo)
     {
         _questRegistry.TryGetQuest(questInfo.QuestId, out var quest);
 
@@ -200,7 +200,7 @@ internal sealed class JournalProgressWindow : LWindow, IDisposable
             ImGuiTreeNodeFlags.Leaf | ImGuiTreeNodeFlags.NoTreePushOnOpen | ImGuiTreeNodeFlags.SpanFullWidth);
 
 
-        if (ImGui.IsItemClicked() && _commandManager.Commands.TryGetValue("/questinfo", out var commandInfo))
+        if (questInfo is QuestInfo && ImGui.IsItemClicked() && _commandManager.Commands.TryGetValue("/questinfo", out var commandInfo))
         {
             _commandManager.DispatchCommand("/questinfo", questInfo.QuestId.ToString() ?? string.Empty, commandInfo);
         }
@@ -308,7 +308,7 @@ internal sealed class JournalProgressWindow : LWindow, IDisposable
             return new FilteredGenre(genre, genre.Quests);
         else
         {
-            List<QuestInfo> filteredQuests = genre.Quests
+            List<IQuestInfo> filteredQuests = genre.Quests
                 .Where(x => match(x.Name))
                 .ToList();
             if (filteredQuests.Count > 0)
@@ -378,5 +378,5 @@ internal sealed class JournalProgressWindow : LWindow, IDisposable
 
     private sealed record FilteredCategory(JournalData.Category Category, List<FilteredGenre> Genres);
 
-    private sealed record FilteredGenre(JournalData.Genre Genre, List<QuestInfo> Quests);
+    private sealed record FilteredGenre(JournalData.Genre Genre, List<IQuestInfo> Quests);
 }