diff --git a/CHANGELOG.md b/CHANGELOG.md index b89e7ce5c..cf32afe19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1 +1 @@ -- Change: It's Probably A Trap - actually fight instead of waiting for phase 2 -alydev \ No newline at end of file +- bug fix: locked quest reasons in journal progress -alydev \ No newline at end of file diff --git a/Directory.Build.targets b/Directory.Build.targets index 69944eea8..bdc5c3c42 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -1,6 +1,6 @@ - 15.306.1.8 + 15.306.1.9 diff --git a/QuestPaths/4.x - Stormblood/Class Quests/BSM/2619_The Final Face-off.json b/QuestPaths/4.x - Stormblood/Class Quests/BSM/2619_The Final Face-off.json index acaaf5a1b..3252c46c9 100644 --- a/QuestPaths/4.x - Stormblood/Class Quests/BSM/2619_The Final Face-off.json +++ b/QuestPaths/4.x - Stormblood/Class Quests/BSM/2619_The Final Face-off.json @@ -1,186 +1,157 @@ { - "$schema": "https://qstxiv.github.io/schema/quest-v1.json", - "Author": "Gezah", - "LastChecked": {"Username": "alydev", "Date": "2026-07-19"}, - "QuestSequence": - [ - { - "Sequence": 0, - "Steps": - [ - { - "DataId": 1000997, - "Position": - { - "X": -31.265808, - "Y": 44.5, - "Z": 185.53442 - }, - "TerritoryId": 128, - "InteractionType": "AcceptQuest", - "AetheryteShortcut": "Limsa Lominsa", - "AethernetShortcut": - [ - "[Limsa Lominsa] Aetheryte Plaza", - "[Limsa Lominsa] The Aftcastle" - ], - "SkipConditions": - { - "AetheryteShortcutIf": - { - "InTerritory": - [ - 128, 129 - ] - } - } - } - ] - }, - { - "Sequence": 1, - "Steps": - [ - { - "DataId": 1021048, - "Position": - { - "X": -79.17908, - "Y": -6.9999995, - "Z": -67.704346 - }, - "TerritoryId": 628, - "InteractionType": "Interact", - "AetheryteShortcut": "Kugane", - "AethernetShortcut": - [ - "[Kugane] Aetheryte Plaza", - "[Kugane] Shiokaze Hostelry" - ] - } - ] - }, - { - "Sequence": 2, - "Steps": - [ - { - "DataId": 1019050, - "Position": - { - "X": -135.0271, - "Y": -4.4404297, - "Z": 198.01636 - }, - "TerritoryId": 628, - "InteractionType": "Interact", - "AethernetShortcut": - [ - "[Kugane] Shiokaze Hostelry", - "[Kugane] Pier #1" - ] - } - ] - }, - { - "Sequence": 3, - "Steps": - [ - { - "DataId": 1021048, - "Position": - { - "X": -79.17908, - "Y": -6.9999995, - "Z": -67.704346 - }, - "TerritoryId": 628, - "InteractionType": "Interact", - "AethernetShortcut": - [ - "[Kugane] Pier #1", - "[Kugane] Shiokaze Hostelry" - ] - } - ] - }, - { - "Sequence": 4, - "Steps": - [ - { - "InteractionType": "Craft", - "TerritoryId": 628, - "ItemId": 17892, - "ItemCount": 1, - "SkipConditions": - { - "StepIf": - { - "Item": - { - "NotInInventory": false - } - } - } - }, - { - "DataId": 1019050, - "Position": - { - "X": -135.0271, - "Y": -4.4404297, - "Z": 198.01636 - }, - "TerritoryId": 628, - "InteractionType": "Interact", - "AethernetShortcut": - [ - "[Kugane] Shiokaze Hostelry", - "[Kugane] Pier #1" - ] - } - ] - }, - { - "Sequence": 5, - "Steps": - [ - { - "DataId": 1019050, - "Position": - { - "X": -135.0271, - "Y": -4.4404297, - "Z": 198.01636 - }, - "TerritoryId": 628, - "InteractionType": "Interact" - } - ] - }, - { - "Sequence": 255, - "Steps": - [ - { - "DataId": 1000997, - "Position": - { - "X": -31.265808, - "Y": 44.5, - "Z": 185.53442 - }, - "TerritoryId": 128, - "InteractionType": "CompleteQuest", - "AetheryteShortcut": "Limsa Lominsa", - "AethernetShortcut": - [ - "[Limsa Lominsa] Aetheryte Plaza", - "[Limsa Lominsa] The Aftcastle" - ] - } - ] - } - ] -} \ No newline at end of file + "$schema": "https://qstxiv.github.io/schema/quest-v1.json", + "Author": "Gezah", + "LastChecked": { "Username": "alydev", "Date": "2026-07-19" }, + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1000997, + "Position": { + "X": -31.265808, + "Y": 44.5, + "Z": 185.53442 + }, + "TerritoryId": 128, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] The Aftcastle" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InTerritory": [128, 129] + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1021048, + "Position": { + "X": -79.17908, + "Y": -6.9999995, + "Z": -67.704346 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "AetheryteShortcut": "Kugane", + "AethernetShortcut": [ + "[Kugane] Aetheryte Plaza", + "[Kugane] Shiokaze Hostelry" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1019050, + "Position": { + "X": -135.0271, + "Y": -4.4404297, + "Z": 198.01636 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Kugane] Shiokaze Hostelry", + "[Kugane] Pier #1" + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1021048, + "Position": { + "X": -79.17908, + "Y": -6.9999995, + "Z": -67.704346 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Kugane] Pier #1", + "[Kugane] Shiokaze Hostelry" + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "InteractionType": "Craft", + "TerritoryId": 628, + "ItemId": 17892, + "ItemCount": 1, + "SkipConditions": { + "StepIf": { + "Item": { + "NotInInventory": false + } + } + } + }, + { + "DataId": 1019050, + "Position": { + "X": -135.0271, + "Y": -4.4404297, + "Z": 198.01636 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Kugane] Shiokaze Hostelry", + "[Kugane] Pier #1" + ] + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1019050, + "Position": { + "X": -135.0271, + "Y": -4.4404297, + "Z": 198.01636 + }, + "TerritoryId": 628, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1000997, + "Position": { + "X": -31.265808, + "Y": 44.5, + "Z": 185.53442 + }, + "TerritoryId": 128, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] The Aftcastle" + ] + } + ] + } + ] +} diff --git a/Questionable/Functions/QuestFunctions.cs b/Questionable/Functions/QuestFunctions.cs index 114fcb18e..cececc4be 100644 --- a/Questionable/Functions/QuestFunctions.cs +++ b/Questionable/Functions/QuestFunctions.cs @@ -443,7 +443,23 @@ private List GetNextPriorityQuestsThatCanBeAccepted() _LF("Not enough gil, estimated cost: {0:N0}{1}", teleportCosts, SeIconChar.Gil.ToIconString())); } - EAetheryteLocation? firstLockedAetheryte = quest.AllSteps() + EAetheryteLocation? firstLockedAetheryte = GetFirstLockedAetheryte(quest); + if (firstLockedAetheryte != null) + { + // if quest requires white wolf gate, and unlock quest is available, don't report locked + if (firstLockedAetheryte == EAetheryteLocation.GridaniaWhiteWolfGate && IsReadyToAcceptQuest(new QuestId(802))) + return new(x); + return new(x, _LF("Aetheryte locked: {0}", firstLockedAetheryte)); + } + + return new PriorityQuestInfo(x); + }) + .ToList(); + } + + internal EAetheryteLocation? GetFirstLockedAetheryte(Quest quest) + { + return quest.AllSteps() .Select(y => { if (y.Step.AetheryteShortcut is { } aetheryteShortcut && @@ -465,17 +481,6 @@ private List GetNextPriorityQuestsThatCanBeAccepted() return (EAetheryteLocation?)null; }) .FirstOrDefault(y => y != null); - if (firstLockedAetheryte != null) - { - // if quest requires white wolf gate, and unlock quest is available, don't report locked - if (firstLockedAetheryte == EAetheryteLocation.GridaniaWhiteWolfGate && IsReadyToAcceptQuest(new QuestId(802))) - return new(x); - return new(x, _LF("Aetheryte locked: {0}", firstLockedAetheryte)); - } - - return new PriorityQuestInfo(x); - }) - .ToList(); } private int TeleportCosts(Quest quest) @@ -663,7 +668,8 @@ public bool IsQuestComplete(ElementId elementId) lockedReason.Add(_L("Rank"), questInfo.GrandCompanyRank > GetGrandCompanyRank()); } - lockedReason.Add(_L("Level"), playerState->CurrentLevel < questInfo.Level); + if (playerState->CurrentLevel < questInfo.Level) + lockedReason.Add(_L("Level"), playerState->CurrentLevel < questInfo.Level); if (questInfo.AlliedSociety != EAlliedSociety.None) if (questInfo.IsRepeatable) lockedReason.Add(_L("Daily unavailable"), !IsDailyAlliedSocietyQuestAndAvailableToday(questId)); @@ -688,8 +694,16 @@ public bool IsQuestComplete(ElementId elementId) lockedReason.Add(_L("Retainers"), retainerManager->MaxRetainerEntitlement == 0); } - lockedReason.Add(_L("Prev quest"), !HasCompletedPreviousQuests(questInfo, extraCompletedQuest)); - lockedReason.Add(_L("Prev instance"), !HasCompletedPreviousInstances(questInfo)); + if (!HasCompletedPreviousQuests(questInfo, extraCompletedQuest)) + lockedReason.Add(_L("Prev quest"), true); + if (!HasCompletedPreviousInstances(questInfo)) + lockedReason.Add(_L("Prev instance"), true); + if (questRegistry.TryGetQuest(questId, out Quest? quest)) + { + EAetheryteLocation? firstLockedAetheryte = GetFirstLockedAetheryte(quest); + if (firstLockedAetheryte != null) + lockedReason.Add(_LF("Aetheryte locked: {0}", firstLockedAetheryte ?? EAetheryteLocation.None), true); + } return (lockedReason.Values.Any(x => x), lockedReason.Keys.ToArray()); }