From 0eb77927b36c03f0d1fae50526f875d8033f4095 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Mon, 15 Jul 2024 20:20:46 +0200 Subject: [PATCH] Show quest dependencies in quest selection window, add /qst zone as shortcut to show all (mapped) quests starting in the current zone --- QuestPathGenerator/RoslynShortcuts.cs | 2 + .../Yak T'el/5090_Preying Mantises.json | 56 +++++ .../5091_Getting to the Bottom of Things.json | 102 ++++++++ .../Yak T'el/5092_The Crimson Cenote.json | 78 +++++++ .../5093_Watching the Watchtowers.json | 67 ++++++ .../Yak T'el/5095_Hunters with Bite.json | 75 ++++++ .../Yak T'el/5096_Reminders of the Past.json | 99 ++++++++ .../Side Quests/Yak T'el/5097_Sick Day.json | 103 ++++++++ .../Yak T'el/5098_To Forge in the Forest.json | 185 +++++++++++++++ .../Yak T'el/5099_A Stomach for Change.json | 52 +++++ .../Yak T'el/5100_Carved in Stone.json | 53 +++++ .../Yak T'el/5101_Two Hearts Aflutter.json | 152 ++++++++++++ .../Yak T'el/5102_Proper Respects.json | 116 ++++++++++ .../Yak T'el/5104_Spirit's Call.json | 163 +++++++++++++ .../Yak T'el/5105_Seek the Sun.json | 92 ++++++++ .../Yak T'el/5106_Secret of Sweetness.json | 90 +++++++ .../Yak T'el/5107_Growing Grove.json | 107 +++++++++ .../Yak T'el/5108_Age Is Just a Number.json | 60 +++++ .../Yak T'el/5109_I'm with Wivre.json | 97 ++++++++ .../Yak T'el/5111_Hunting for the Family.json | 97 ++++++++ .../Yak T'el/5112_A Hunter's Dream.json | 77 ++++++ .../Yak T'el/5113_The Trial Commences.json | 90 +++++++ .../Yak T'el/5115_Remembering a Dream.json | 125 ++++++++++ .../Yak T'el/5116_Budding Promise.json | 80 +++++++ .../Yak T'el/5117_Skill of a Veteran.json | 86 +++++++ .../Side Quests/Yak T'el/5118_One Forest.json | 219 ++++++++++++++++++ QuestPaths/quest-v1.json | 4 + Questionable.Model/V1/ComplexCombatData.cs | 4 + Questionable/Controller/CommandHandler.cs | 18 +- Questionable/Controller/QuestRegistry.cs | 1 + .../Controller/Steps/Common/NextQuest.cs | 17 +- Questionable/GameFunctions.cs | 39 +++- Questionable/Model/QuestInfo.cs | 22 ++ Questionable/Windows/QuestSelectionWindow.cs | 178 ++++++++++++-- Questionable/Windows/QuestWindow.cs | 2 +- 35 files changed, 2775 insertions(+), 33 deletions(-) create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5090_Preying Mantises.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5091_Getting to the Bottom of Things.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5092_The Crimson Cenote.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5093_Watching the Watchtowers.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5095_Hunters with Bite.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5096_Reminders of the Past.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5097_Sick Day.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5098_To Forge in the Forest.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5099_A Stomach for Change.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5100_Carved in Stone.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5101_Two Hearts Aflutter.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5102_Proper Respects.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5104_Spirit's Call.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5105_Seek the Sun.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5106_Secret of Sweetness.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5107_Growing Grove.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5108_Age Is Just a Number.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5109_I'm with Wivre.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5111_Hunting for the Family.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5112_A Hunter's Dream.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5113_The Trial Commences.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5115_Remembering a Dream.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5116_Budding Promise.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5117_Skill of a Veteran.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5118_One Forest.json diff --git a/QuestPathGenerator/RoslynShortcuts.cs b/QuestPathGenerator/RoslynShortcuts.cs index 72a15a39..186de3e0 100644 --- a/QuestPathGenerator/RoslynShortcuts.cs +++ b/QuestPathGenerator/RoslynShortcuts.cs @@ -173,6 +173,8 @@ public static class RoslynShortcuts SyntaxNodeList( Assignment(nameof(ComplexCombatData.DataId), complexCombatData.DataId, default(uint)) .AsSyntaxNodeOrToken(), + Assignment(nameof(ComplexCombatData.MinimumKillCount), complexCombatData.MinimumKillCount, null) + .AsSyntaxNodeOrToken(), Assignment(nameof(ComplexCombatData.RewardItemId), complexCombatData.RewardItemId, null) .AsSyntaxNodeOrToken(), Assignment(nameof(ComplexCombatData.RewardItemCount), complexCombatData.RewardItemCount, null) diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5090_Preying Mantises.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5090_Preying Mantises.json new file mode 100644 index 00000000..3814284c --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5090_Preying Mantises.json @@ -0,0 +1,56 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1048960, + "Position": { + "X": -405.84424, + "Y": 23.562847, + "Z": -476.61554 + }, + "TerritoryId": 1189, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -455.06216, + "Y": 20.027777, + "Z": 46.272446 + }, + "TerritoryId": 1189, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "KillEnemyDataIds": [ + 17268 + ], + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1048960, + "Position": { + "X": -405.84424, + "Y": 23.562847, + "Z": -476.61554 + }, + "TerritoryId": 1189, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Yak T'el - Iq Br'aax" + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5091_Getting to the Bottom of Things.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5091_Getting to the Bottom of Things.json new file mode 100644 index 00000000..98fffc22 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5091_Getting to the Bottom of Things.json @@ -0,0 +1,102 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1051071, + "Position": { + "X": -554.03986, + "Y": 1.3156406, + "Z": -489.3416 + }, + "TerritoryId": 1189, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -596.55597, + "Y": 2.3708515, + "Z": -493.64908 + }, + "TerritoryId": 1189, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "Position": { + "X": -615.2386, + "Y": -44.093876, + "Z": -495.7548 + }, + "TerritoryId": 1189, + "InteractionType": "WalkTo", + "Fly": true, + "DisableNavmesh": true + }, + { + "DataId": 2014307, + "Position": { + "X": -729.7932, + "Y": -107.83557, + "Z": -674.8608 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": -615.2386, + "Y": -44.093876, + "Z": -495.7548 + }, + "TerritoryId": 1189, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "Position": { + "X": -596.55597, + "Y": 2.3708515, + "Z": -493.64908 + }, + "TerritoryId": 1189, + "InteractionType": "WalkTo", + "Fly": true, + "DisableNavmesh": true + }, + { + "DataId": 1051071, + "Position": { + "X": -554.03986, + "Y": 1.3156406, + "Z": -489.3416 + }, + "TerritoryId": 1189, + "InteractionType": "CompleteQuest", + "Fly": true, + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_KINGZD002_05091_Q1_000_000", + "Answer": "TEXT_KINGZD002_05091_A1_000_001" + } + ] + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5092_The Crimson Cenote.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5092_The Crimson Cenote.json new file mode 100644 index 00000000..76482417 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5092_The Crimson Cenote.json @@ -0,0 +1,78 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1051057, + "Position": { + "X": -343.67902, + "Y": 18.885578, + "Z": -404.22675 + }, + "TerritoryId": 1189, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 158.97704, + "Y": 0.80940175, + "Z": -773.5188 + }, + "StopDistance": 1, + "TerritoryId": 1189, + "InteractionType": "Combat", + "AetheryteShortcut": "Tuliyollal", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 17663 + ], + "AethernetShortcut": [ + "[Tuliyollal] Aetheryte Plaza", + "[Tuliyollal] Dirigible Landing (Yak T'el)" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1051058, + "Position": { + "X": 159.47205, + "Y": 0.81595546, + "Z": -770.19916 + }, + "StopDistance": 7, + "TerritoryId": 1189, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1051057, + "Position": { + "X": -343.67902, + "Y": 18.885578, + "Z": -404.22675 + }, + "TerritoryId": 1189, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Yak T'el - Iq Br'aax", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5093_Watching the Watchtowers.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5093_Watching the Watchtowers.json new file mode 100644 index 00000000..8b1c5c63 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5093_Watching the Watchtowers.json @@ -0,0 +1,67 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1048928, + "Position": { + "X": 36.301147, + "Y": 8.205902, + "Z": -645.1362 + }, + "TerritoryId": 1189, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1051072, + "Position": { + "X": -39.07837, + "Y": 4.3051004, + "Z": -332.87555 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1051072, + "Position": { + "X": -39.07837, + "Y": 4.3051004, + "Z": -332.87555 + }, + "TerritoryId": 1189, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1048928, + "Position": { + "X": 36.301147, + "Y": 8.205902, + "Z": -645.1362 + }, + "TerritoryId": 1189, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5095_Hunters with Bite.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5095_Hunters with Bite.json new file mode 100644 index 00000000..5bc9a423 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5095_Hunters with Bite.json @@ -0,0 +1,75 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1051061, + "Position": { + "X": -407.79742, + "Y": 28.068892, + "Z": -360.55542 + }, + "TerritoryId": 1189, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1051062, + "Position": { + "X": -489.5247, + "Y": -29.96456, + "Z": -94.83484 + }, + "TerritoryId": 1189, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 17664, + 17665 + ], + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1051062, + "Position": { + "X": -489.5247, + "Y": -29.96456, + "Z": -94.83484 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "StopDistance": 7 + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1051061, + "Position": { + "X": -407.79742, + "Y": 28.068892, + "Z": -360.55542 + }, + "TerritoryId": 1189, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Yak T'el - Iq Br'aax", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5096_Reminders of the Past.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5096_Reminders of the Past.json new file mode 100644 index 00000000..c4172c71 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5096_Reminders of the Past.json @@ -0,0 +1,99 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1051065, + "Position": { + "X": 380.7583, + "Y": 21.437008, + "Z": -496.84903 + }, + "TerritoryId": 1189, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2014264, + "Position": { + "X": 405.1422, + "Y": 20.85907, + "Z": -482.10883 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 2014266, + "Position": { + "X": 430.83838, + "Y": 20.126648, + "Z": -456.71783 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 2014265, + "Position": { + "X": 395.92578, + "Y": 20.34021, + "Z": -453.02515 + }, + "TerritoryId": 1189, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 17666 + ], + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1051065, + "Position": { + "X": 380.7583, + "Y": 21.437008, + "Z": -496.84903 + }, + "TerritoryId": 1189, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5097_Sick Day.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5097_Sick Day.json new file mode 100644 index 00000000..c7e82c8b --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5097_Sick Day.json @@ -0,0 +1,103 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1051364, + "Position": { + "X": -9.353821, + "Y": 8.205902, + "Z": -652.9183 + }, + "TerritoryId": 1189, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1048961, + "Position": { + "X": -444.38855, + "Y": 28.068893, + "Z": -363.66827 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "AetheryteShortcut": "Yak T'el - Iq Br'aax", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "Position": { + "X": -632.6718, + "Y": 25.245409, + "Z": -159.94264 + }, + "TerritoryId": 1189, + "InteractionType": "WalkTo", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + -128 + ] + }, + { + "DataId": 1048995, + "Position": { + "X": -639.27673, + "Y": 26.716875, + "Z": -161.05902 + }, + "StopDistance": 7, + "TerritoryId": 1189, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1051410, + "Position": { + "X": -9.140198, + "Y": 8.205902, + "Z": -652.9183 + }, + "TerritoryId": 1189, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Tuliyollal", + "AethernetShortcut": [ + "[Tuliyollal] Aetheryte Plaza", + "[Tuliyollal] Dirigible Landing (Yak T'el)" + ] + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5098_To Forge in the Forest.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5098_To Forge in the Forest.json new file mode 100644 index 00000000..118dc4c8 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5098_To Forge in the Forest.json @@ -0,0 +1,185 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1048996, + "Position": { + "X": -618.43286, + "Y": 25.709108, + "Z": -153.91785 + }, + "TerritoryId": 1189, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1051365, + "Position": { + "X": -738.3383, + "Y": 22.137896, + "Z": -85.404785 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": -580.44604, + "Y": 22.457048, + "Z": -3.286837 + }, + "TerritoryId": 1189, + "InteractionType": "WalkTo", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + -128 + ] + }, + { + "DataId": 2014313, + "Position": { + "X": -581.75024, + "Y": 23.697266, + "Z": -2.9450073 + }, + "TerritoryId": 1189, + "InteractionType": "UseItem", + "ItemId": 2003683, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "Position": { + "X": -506.6366, + "Y": 22.817732, + "Z": 32.985153 + }, + "TerritoryId": 1189, + "InteractionType": "WalkTo", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + -64 + ] + }, + { + "DataId": 2014314, + "Position": { + "X": -505.9129, + "Y": 23.88031, + "Z": 32.455933 + }, + "TerritoryId": 1189, + "InteractionType": "UseItem", + "ItemId": 2003683, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "Position": { + "X": -414.84598, + "Y": 20.493914, + "Z": 74.74898 + }, + "TerritoryId": 1189, + "InteractionType": "WalkTo", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + -32 + ] + }, + { + "DataId": 2014315, + "Position": { + "X": -413.96204, + "Y": 21.896606, + "Z": 74.021484 + }, + "TerritoryId": 1189, + "InteractionType": "UseItem", + "ItemId": 2003683, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1051365, + "Position": { + "X": -738.3383, + "Y": 22.137896, + "Z": -85.404785 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1048996, + "Position": { + "X": -618.43286, + "Y": 25.709108, + "Z": -153.91785 + }, + "TerritoryId": 1189, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5099_A Stomach for Change.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5099_A Stomach for Change.json new file mode 100644 index 00000000..66e5f31d --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5099_A Stomach for Change.json @@ -0,0 +1,52 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1051366, + "Position": { + "X": -399.95422, + "Y": 20.145584, + "Z": -402.4262 + }, + "TerritoryId": 1189, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1051367, + "Position": { + "X": -503.95975, + "Y": 29.007706, + "Z": -394.43048 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1051368, + "Position": { + "X": -501.27414, + "Y": 28.982998, + "Z": -394.3084 + }, + "TerritoryId": 1189, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5100_Carved in Stone.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5100_Carved in Stone.json new file mode 100644 index 00000000..a0143ab6 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5100_Carved in Stone.json @@ -0,0 +1,53 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1048982, + "Position": { + "X": 595.45276, + "Y": -137.17401, + "Z": 564.8126 + }, + "TerritoryId": 1189, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2014250, + "Position": { + "X": 598.3214, + "Y": -137.19391, + "Z": 557.7018 + }, + "TerritoryId": 1189, + "InteractionType": "Instruction", + "Comment": "Inspect Flag, Red Head, Blue Head" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1048982, + "Position": { + "X": 595.45276, + "Y": -137.17401, + "Z": 564.8126 + }, + "StopDistance": 7, + "TerritoryId": 1189, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5101_Two Hearts Aflutter.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5101_Two Hearts Aflutter.json new file mode 100644 index 00000000..570d2f2f --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5101_Two Hearts Aflutter.json @@ -0,0 +1,152 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1048984, + "Position": { + "X": 673.06006, + "Y": -135.17874, + "Z": 577.47766 + }, + "TerritoryId": 1189, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -92.00457, + "Y": -212.91975, + "Z": 624.4216 + }, + "TerritoryId": 1189, + "InteractionType": "WalkTo", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + -128 + ] + }, + { + "DataId": 1051049, + "Position": { + "X": -89.49426, + "Y": -213.64497, + "Z": 625.574 + }, + "StopDistance": 4, + "TerritoryId": 1189, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + -128 + ] + }, + { + "Position": { + "X": -122.188805, + "Y": -214.08376, + "Z": 674.54083 + }, + "TerritoryId": 1189, + "InteractionType": "WalkTo", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + -32 + ] + }, + { + "DataId": 1051051, + "Position": { + "X": -122.88098, + "Y": -213.78055, + "Z": 673.39575 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "Position": { + "X": -142.65875, + "Y": -213.42487, + "Z": 608.63165 + }, + "TerritoryId": 1189, + "InteractionType": "WalkTo", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + -64 + ] + }, + { + "DataId": 1051050, + "Position": { + "X": -143.63324, + "Y": -213.18237, + "Z": 609.0028 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1048984, + "Position": { + "X": 673.06006, + "Y": -135.17874, + "Z": 577.47766 + }, + "TerritoryId": 1189, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Yak T'el - Mamook", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5102_Proper Respects.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5102_Proper Respects.json new file mode 100644 index 00000000..3bb5132e --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5102_Proper Respects.json @@ -0,0 +1,116 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1048988, + "Position": { + "X": 584.4967, + "Y": -143.46597, + "Z": 648.64575 + }, + "TerritoryId": 1189, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2014369, + "Position": { + "X": 328.20618, + "Y": -157.21375, + "Z": 429.4651 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] + }, + { + "DataId": 2014368, + "Position": { + "X": 323.7201, + "Y": -157.76306, + "Z": 434.19543 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 2014256, + "Position": { + "X": 139.17749, + "Y": -162.24927, + "Z": 679.95715 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 2014257, + "Position": { + "X": 144.67078, + "Y": -163.25635, + "Z": 663.84375 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1048988, + "Position": { + "X": 584.4967, + "Y": -143.46597, + "Z": 648.64575 + }, + "TerritoryId": 1189, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5104_Spirit's Call.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5104_Spirit's Call.json new file mode 100644 index 00000000..42c30b86 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5104_Spirit's Call.json @@ -0,0 +1,163 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1048987, + "Position": { + "X": 596.97876, + "Y": -142.60623, + "Z": 441.7334 + }, + "TerritoryId": 1189, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1051053, + "Position": { + "X": 257.1908, + "Y": -165.78062, + "Z": 146.74597 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true, + "DialogueChoices": [ + { + "Type": "YesNo", + "Prompt": "TEXT_KINGZD105_05104_SYSTEM_100_004", + "Yes": true + } + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": 272.75598, + "Y": -161.77667, + "Z": 117.129616 + }, + "TerritoryId": 1189, + "InteractionType": "WalkTo", + "Mount": true, + "DisableNavmesh": true + }, + { + "Position": { + "X": 255.7041, + "Y": -161.34225, + "Z": 101.95002 + }, + "TerritoryId": 1189, + "InteractionType": "WalkTo", + "DisableNavmesh": true + }, + { + "DataId": 1051053, + "Position": { + "X": 218.3051, + "Y": -160.72849, + "Z": 78.95244 + }, + "TerritoryId": 1189, + "InteractionType": "WaitForNpcAtPosition", + "DisableNavmesh": true + }, + { + "DataId": 1051053, + "Position": { + "X": 168.0448, + "Y": -158.83824, + "Z": 31.171473 + }, + "TerritoryId": 1189, + "InteractionType": "WaitForNpcAtPosition", + "DisableNavmesh": true + }, + { + "DataId": 1051053, + "Position": { + "X": 144.163, + "Y": -156.25887, + "Z": -57.818764 + }, + "TerritoryId": 1189, + "InteractionType": "WaitForNpcAtPosition", + "DisableNavmesh": true + }, + { + "Position": { + "X": 83.32947, + "Y": -157.21858, + "Z": -67.64331 + }, + "StopDistance": 1, + "TerritoryId": 1189, + "InteractionType": "WalkTo", + "DisableNavmesh": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1051054, + "Position": { + "X": 83.32947, + "Y": -157.21858, + "Z": -67.64331 + }, + "TerritoryId": 1189, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 2014259, + "Position": { + "X": 65.049194, + "Y": -184.1612, + "Z": -70.237305 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "DisableNavmesh": true, + "Mount": false + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1048987, + "Position": { + "X": 596.97876, + "Y": -142.60623, + "Z": 441.7334 + }, + "TerritoryId": 1189, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Yak T'el - Mamook", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5105_Seek the Sun.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5105_Seek the Sun.json new file mode 100644 index 00000000..9a38e35c --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5105_Seek the Sun.json @@ -0,0 +1,92 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1051055, + "Position": { + "X": 563.5918, + "Y": -144.04688, + "Z": 702.26587 + }, + "TerritoryId": 1189, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -45.87303, + "Y": -174.86252, + "Z": 649.25995 + }, + "TerritoryId": 1189, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 1051056, + "Position": { + "X": -49.149292, + "Y": -174.58734, + "Z": 651.4839 + }, + "StopDistance": 5, + "TerritoryId": 1189, + "InteractionType": "Interact", + "DisableNavmesh": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1051056, + "Position": { + "X": -49.149292, + "Y": -174.58734, + "Z": 651.4839 + }, + "StopDistance": 5, + "TerritoryId": 1189, + "InteractionType": "Say", + "ChatMessage": { + "Key": "TEXT_KINGZD106_05105_SAYTODO_000_011" + } + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1051055, + "Position": { + "X": 563.5918, + "Y": -144.04688, + "Z": 702.26587 + }, + "TerritoryId": 1189, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Yak T'el - Mamook", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5106_Secret of Sweetness.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5106_Secret of Sweetness.json new file mode 100644 index 00000000..63f926c7 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5106_Secret of Sweetness.json @@ -0,0 +1,90 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1048991, + "Position": { + "X": 211.10852, + "Y": -160.27475, + "Z": 432.4253 + }, + "TerritoryId": 1189, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 178.30347, + "Y": -195.42366, + "Z": 241.28633 + }, + "TerritoryId": 1189, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 2014260, + "Position": { + "X": 177.44714, + "Y": -194.11005, + "Z": 239.61243 + }, + "TerritoryId": 1189, + "InteractionType": "UseItem", + "ItemId": 2003667, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 2014261, + "Position": { + "X": 164.47693, + "Y": -194.2627, + "Z": 237.50659 + }, + "TerritoryId": 1189, + "InteractionType": "UseItem", + "ItemId": 2003667, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1048991, + "Position": { + "X": 211.10852, + "Y": -160.27475, + "Z": 432.4253 + }, + "TerritoryId": 1189, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5107_Growing Grove.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5107_Growing Grove.json new file mode 100644 index 00000000..ddcb322b --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5107_Growing Grove.json @@ -0,0 +1,107 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1048998, + "Position": { + "X": 220.29443, + "Y": -156.80957, + "Z": 457.02295 + }, + "TerritoryId": 1189, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1051408, + "Position": { + "X": 631.2809, + "Y": -137.12654, + "Z": 509.6665 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "AetheryteShortcut": "Yak T'el - Mamook", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 1048974, + "Position": { + "X": 621.51514, + "Y": -135.12726, + "Z": 531.1207 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 1048989, + "Position": { + "X": 523.4302, + "Y": -135.12724, + "Z": 578.14905 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1048998, + "Position": { + "X": 220.29443, + "Y": -156.80957, + "Z": 457.02295 + }, + "TerritoryId": 1189, + "InteractionType": "CompleteQuest", + "Fly": true, + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_KINGZD108_05107_Q1_000_000", + "Answer": "TEXT_KINGZD108_05107_A1_000_001" + } + ] + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5108_Age Is Just a Number.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5108_Age Is Just a Number.json new file mode 100644 index 00000000..2bfe6c05 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5108_Age Is Just a Number.json @@ -0,0 +1,60 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1051067, + "Position": { + "X": -372.70166, + "Y": -162.24626, + "Z": 546.25757 + }, + "TerritoryId": 1189, + "InteractionType": "AcceptQuest", + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2014262, + "Position": { + "X": -443.83917, + "Y": -158.1903, + "Z": 343.34326 + }, + "TerritoryId": 1189, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 17743, + 17744, + 17745 + ], + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1051067, + "Position": { + "X": -372.70166, + "Y": -162.24626, + "Z": 546.25757 + }, + "TerritoryId": 1189, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5109_I'm with Wivre.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5109_I'm with Wivre.json new file mode 100644 index 00000000..1e3e90e0 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5109_I'm with Wivre.json @@ -0,0 +1,97 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1048997, + "Position": { + "X": -363.9124, + "Y": -162.23582, + "Z": 550.01135 + }, + "TerritoryId": 1189, + "InteractionType": "AcceptQuest", + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1051387, + "Position": { + "X": -383.4745, + "Y": -166.23917, + "Z": 662.95874 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": -433.617, + "Y": -156.24463, + "Z": 776.9229 + }, + "TerritoryId": 1189, + "InteractionType": "Instruction", + "Comment": "TODO Needs item use; manual for now (also unsure on health percent)", + "EnemySpawnType": "OverworldEnemies", + "ComplexCombatData": [ + { + "DataId": 17267, + "MinimumKillCount": 2, + "ItemId": 2003669, + "ItemUseHealthMaxPercent": 25, + "RewardItemId": 2003670, + "RewardItemCount": 2 + } + ], + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1051387, + "Position": { + "X": -383.4745, + "Y": -166.23917, + "Z": 662.95874 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1048997, + "Position": { + "X": -363.9124, + "Y": -162.23582, + "Z": 550.01135 + }, + "TerritoryId": 1189, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5111_Hunting for the Family.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5111_Hunting for the Family.json new file mode 100644 index 00000000..b2e79a7b --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5111_Hunting for the Family.json @@ -0,0 +1,97 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1050873, + "Position": { + "X": -455.10034, + "Y": 17.027555, + "Z": -478.8739 + }, + "TerritoryId": 1189, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1050874, + "Position": { + "X": -508.87314, + "Y": 29.61908, + "Z": -350.1183 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1050876, + "Position": { + "X": -455.92438, + "Y": 30.374397, + "Z": -423.148 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1050875, + "Position": { + "X": -391.01245, + "Y": 28.068893, + "Z": -365.0111 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1050874, + "Position": { + "X": -508.87314, + "Y": 29.61908, + "Z": -350.1183 + }, + "TerritoryId": 1189, + "InteractionType": "CompleteQuest", + "Fly": true, + "NextQuestId": 5112 + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5112_A Hunter's Dream.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5112_A Hunter's Dream.json new file mode 100644 index 00000000..9afc64aa --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5112_A Hunter's Dream.json @@ -0,0 +1,77 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1050874, + "Position": { + "X": -508.87314, + "Y": 29.61908, + "Z": -350.1183 + }, + "TerritoryId": 1189, + "InteractionType": "AcceptQuest", + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_KINGZD203_05112_Q1_000_000", + "Answer": "TEXT_KINGZD203_05112_A1_000_001" + } + ] + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1050877, + "Position": { + "X": -39.871887, + "Y": 0.35915944, + "Z": -312.1233 + }, + "StopDistance": 1, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2014144, + "Position": { + "X": -43.10681, + "Y": 0.503479, + "Z": -312.36743 + }, + "TerritoryId": 1189, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1050878, + "Position": { + "X": 475.30322, + "Y": 18.197147, + "Z": -326.95508 + }, + "TerritoryId": 1189, + "InteractionType": "CompleteQuest", + "Fly": true, + "NextQuestId": 5113 + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5113_The Trial Commences.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5113_The Trial Commences.json new file mode 100644 index 00000000..732d1ecc --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5113_The Trial Commences.json @@ -0,0 +1,90 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1050878, + "Position": { + "X": 475.30322, + "Y": 18.197147, + "Z": -326.95508 + }, + "TerritoryId": 1189, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1050879, + "Position": { + "X": 595.7274, + "Y": 18.8562, + "Z": -85.55737 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": 705.4334, + "Y": 28.302685, + "Z": 2.3153868 + }, + "StopDistance": 1, + "TerritoryId": 1189, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 17671, + 17672 + ], + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1050881, + "Position": { + "X": 595.6052, + "Y": 18.84498, + "Z": -85.55737 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1050882, + "Position": { + "X": -408.31616, + "Y": 20.383144, + "Z": -399.28284 + }, + "TerritoryId": 1189, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Yak T'el - Iq Br'aax" + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5115_Remembering a Dream.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5115_Remembering a Dream.json new file mode 100644 index 00000000..05dc0263 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5115_Remembering a Dream.json @@ -0,0 +1,125 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1050888, + "Position": { + "X": 515.58704, + "Y": -146.73436, + "Z": 477.0122 + }, + "TerritoryId": 1189, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2014147, + "Position": { + "X": 440.66528, + "Y": -150.77448, + "Z": 427.7256 + }, + "TerritoryId": 1189, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 17674 + ], + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 2014148, + "Position": { + "X": 395.4679, + "Y": -152.42242, + "Z": 372.7931 + }, + "TerritoryId": 1189, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 17674 + ], + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 2014149, + "Position": { + "X": 267.9026, + "Y": -160.05188, + "Z": 354.45166 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2014150, + "Position": { + "X": 236.95728, + "Y": -167.52887, + "Z": 307.97278 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1050890, + "Position": { + "X": 661.7991, + "Y": -137.174, + "Z": 557.76294 + }, + "TerritoryId": 1189, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Yak T'el - Mamook", + "Fly": true, + "NextQuestId": 5116 + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5116_Budding Promise.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5116_Budding Promise.json new file mode 100644 index 00000000..1acb4ee6 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5116_Budding Promise.json @@ -0,0 +1,80 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1050891, + "Position": { + "X": 662.8672, + "Y": -137.17401, + "Z": 556.115 + }, + "TerritoryId": 1189, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1048985, + "Position": { + "X": 595.11694, + "Y": -143.83003, + "Z": 710.68884 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": -61.729744, + "Y": -212.69492, + "Z": 523.0088 + }, + "TerritoryId": 1189, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 2014151, + "Position": { + "X": -60.95984, + "Y": -210.83392, + "Z": 522.02637 + }, + "TerritoryId": 1189, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1050891, + "Position": { + "X": 662.8672, + "Y": -137.17401, + "Z": 556.115 + }, + "TerritoryId": 1189, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Yak T'el - Mamook", + "Fly": true, + "NextQuestId": 5117 + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5117_Skill of a Veteran.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5117_Skill of a Veteran.json new file mode 100644 index 00000000..44fbb7fe --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5117_Skill of a Veteran.json @@ -0,0 +1,86 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1050891, + "Position": { + "X": 662.8672, + "Y": -137.17401, + "Z": 556.115 + }, + "TerritoryId": 1189, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2014153, + "Position": { + "X": 500.5111, + "Y": -150.04199, + "Z": 704.12744 + }, + "TerritoryId": 1189, + "InteractionType": "UseItem", + "ItemId": 2003624, + "GroundTarget": true, + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 2014152, + "Position": { + "X": 486.90015, + "Y": -150.04199, + "Z": 355.8556 + }, + "TerritoryId": 1189, + "InteractionType": "UseItem", + "ItemId": 2003624, + "GroundTarget": true, + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1050891, + "Position": { + "X": 662.8672, + "Y": -137.17401, + "Z": 556.115 + }, + "TerritoryId": 1189, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Yak T'el - Mamook", + "Fly": true, + "NextQuestId": 5118 + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5118_One Forest.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5118_One Forest.json new file mode 100644 index 00000000..2b3b9810 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5118_One Forest.json @@ -0,0 +1,219 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1050891, + "Position": { + "X": 662.8672, + "Y": -137.17401, + "Z": 556.115 + }, + "TerritoryId": 1189, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1050897, + "Position": { + "X": 755.94714, + "Y": -132.59648, + "Z": 505.94324 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true, + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_KINGZD401_05118_Q1_000_000", + "Answer": "TEXT_KINGZD401_05118_A1_000_001" + } + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1050891, + "Position": { + "X": 662.8672, + "Y": -137.17401, + "Z": 556.115 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1050901, + "Position": { + "X": 627.25244, + "Y": -137.174, + "Z": 591.8517 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 1050900, + "Position": { + "X": 575.55493, + "Y": -137.174, + "Z": 540.0929 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1048989, + "Position": { + "X": 523.4302, + "Y": -135.12724, + "Z": 578.14905 + }, + "TerritoryId": 1189, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1050891, + "Position": { + "X": 662.8672, + "Y": -137.17401, + "Z": 556.115 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 1050904, + "Position": { + "X": 263.84375, + "Y": -157.31726, + "Z": 738.6129 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 7, + "Steps": [ + { + "DataId": 2014154, + "Position": { + "X": 255.9701, + "Y": -150.68292, + "Z": 807.64465 + }, + "TerritoryId": 1189, + "InteractionType": "UseItem", + "ItemId": 2003625, + "Fly": true + } + ] + }, + { + "Sequence": 8, + "Steps": [ + { + "DataId": 2014248, + "Position": { + "X": 255.9701, + "Y": -150.68292, + "Z": 807.64465 + }, + "TerritoryId": 1189, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 17675 + ] + } + ] + }, + { + "Sequence": 9, + "Steps": [ + { + "DataId": 1050904, + "Position": { + "X": 263.84375, + "Y": -157.31726, + "Z": 738.6129 + }, + "TerritoryId": 1189, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1050903, + "Position": { + "X": 663.9962, + "Y": -137.17401, + "Z": 554.589 + }, + "TerritoryId": 1189, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Yak T'el - Mamook", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/quest-v1.json b/QuestPaths/quest-v1.json index 6c1d43ff..04b2a1fd 100644 --- a/QuestPaths/quest-v1.json +++ b/QuestPaths/quest-v1.json @@ -550,6 +550,10 @@ "description": "The enemy data id which is supposed to be killed", "type": "integer" }, + "MinimumKillCount": { + "description": "Overworld mobs: If this number of mobs has been killed, will wait a bit before attempting to pull another mob to see if the quest progresses", + "type": "integer" + }, "RewardItemId": { "type": "integer" }, diff --git a/Questionable.Model/V1/ComplexCombatData.cs b/Questionable.Model/V1/ComplexCombatData.cs index 29d0f223..69949ef7 100644 --- a/Questionable.Model/V1/ComplexCombatData.cs +++ b/Questionable.Model/V1/ComplexCombatData.cs @@ -5,6 +5,10 @@ namespace Questionable.Model.V1; public sealed class ComplexCombatData { public uint DataId { get; set; } + + // TODO Use this + public uint? MinimumKillCount { get; set; } + public uint? RewardItemId { get; set; } public int? RewardItemCount { get; set; } public IList CompletionQuestVariablesFlags { get; set; } = new List(); diff --git a/Questionable/Controller/CommandHandler.cs b/Questionable/Controller/CommandHandler.cs index da002e2c..33ccf29a 100644 --- a/Questionable/Controller/CommandHandler.cs +++ b/Questionable/Controller/CommandHandler.cs @@ -22,11 +22,14 @@ internal sealed class CommandHandler : IDisposable private readonly QuestWindow _questWindow; private readonly QuestSelectionWindow _questSelectionWindow; private readonly ITargetManager _targetManager; + private readonly GameFunctions _gameFunctions; + private readonly IClientState _clientState; public CommandHandler(ICommandManager commandManager, IChatGui chatGui, QuestController questController, MovementController movementController, QuestRegistry questRegistry, ConfigWindow configWindow, DebugOverlay debugOverlay, QuestWindow questWindow, - QuestSelectionWindow questSelectionWindow, ITargetManager targetManager) + QuestSelectionWindow questSelectionWindow, ITargetManager targetManager, GameFunctions gameFunctions, + IClientState clientState) { _commandManager = commandManager; _chatGui = chatGui; @@ -38,6 +41,8 @@ internal sealed class CommandHandler : IDisposable _questWindow = questWindow; _questSelectionWindow = questSelectionWindow; _targetManager = targetManager; + _gameFunctions = gameFunctions; + _clientState = clientState; _commandManager.AddHandler("/qst", new CommandInfo(ProcessCommand) { @@ -77,7 +82,12 @@ internal sealed class CommandHandler : IDisposable break; case "which": - _questSelectionWindow.Open(_targetManager.Target); + _questSelectionWindow.OpenForTarget(_targetManager.Target); + break; + + case "z": + case "zone": + _questSelectionWindow.OpenForZone(_clientState.TerritoryType); break; default: @@ -96,7 +106,9 @@ internal sealed class CommandHandler : IDisposable if (arguments.Length >= 1 && ushort.TryParse(arguments[0], out ushort questId)) { - if (_questRegistry.TryGetQuest(questId, out Quest? quest)) + if (_gameFunctions.IsQuestLocked(questId, 0)) + _chatGui.PrintError($"[Questionable] Quest {questId} is locked."); + else if (_questRegistry.TryGetQuest(questId, out Quest? quest)) { _debugOverlay.HighlightedQuest = questId; _chatGui.Print($"[Questionable] Set highlighted quest to {questId} ({quest.Info.Name})."); diff --git a/Questionable/Controller/QuestRegistry.cs b/Questionable/Controller/QuestRegistry.cs index f8a41253..dc656fbc 100644 --- a/Questionable/Controller/QuestRegistry.cs +++ b/Questionable/Controller/QuestRegistry.cs @@ -36,6 +36,7 @@ internal sealed class QuestRegistry _logger = logger; } + public IEnumerable AllQuests => _quests.Values; public int Count => _quests.Count; public void Reload() diff --git a/Questionable/Controller/Steps/Common/NextQuest.cs b/Questionable/Controller/Steps/Common/NextQuest.cs index 32d0f113..30a705e6 100644 --- a/Questionable/Controller/Steps/Common/NextQuest.cs +++ b/Questionable/Controller/Steps/Common/NextQuest.cs @@ -18,24 +18,33 @@ internal static class NextQuest if (step.NextQuestId == null) return null; + if (step.NextQuestId.Value == quest.QuestId) + return null; + return serviceProvider.GetRequiredService() - .With(step.NextQuestId.Value); + .With(step.NextQuestId.Value, quest.QuestId); } } - internal sealed class SetQuest(QuestRegistry questRegistry, QuestController questController, ILogger logger) : ITask + internal sealed class SetQuest(QuestRegistry questRegistry, QuestController questController, GameFunctions gameFunctions, ILogger logger) : ITask { public ushort NextQuestId { get; set; } + public ushort CurrentQuestId { get; set; } - public ITask With(ushort nextQuestId) + public ITask With(ushort nextQuestId, ushort currentQuestId) { NextQuestId = nextQuestId; + CurrentQuestId = currentQuestId; return this; } public bool Start() { - if (questRegistry.TryGetQuest(NextQuestId, out Quest? quest)) + if (gameFunctions.IsQuestLocked(NextQuestId, CurrentQuestId)) + { + logger.LogInformation("Can't set next quest to {QuestId}, quest is locked", NextQuestId); + } + else if (questRegistry.TryGetQuest(NextQuestId, out Quest? quest)) { logger.LogInformation("Setting next quest to {QuestId}: '{QuestName}'", NextQuestId, quest.Info.Name); questController.SetNextQuest(quest); diff --git a/Questionable/GameFunctions.cs b/Questionable/GameFunctions.cs index 31e3a622..f25cec48 100644 --- a/Questionable/GameFunctions.cs +++ b/Questionable/GameFunctions.cs @@ -21,6 +21,8 @@ using Lumina.Excel.CustomSheets; using Lumina.Excel.GeneratedSheets2; using Microsoft.Extensions.Logging; using Questionable.Controller; +using Questionable.Data; +using Questionable.Model; using Questionable.Model.V1; using Action = Lumina.Excel.GeneratedSheets2.Action; using BattleChara = FFXIVClientStructs.FFXIV.Client.Game.Character.BattleChara; @@ -45,6 +47,7 @@ internal sealed unsafe class GameFunctions private readonly ICondition _condition; private readonly IClientState _clientState; private readonly QuestRegistry _questRegistry; + private readonly QuestData _questData; private readonly IGameGui _gameGui; private readonly Configuration _configuration; private readonly ILogger _logger; @@ -55,6 +58,7 @@ internal sealed unsafe class GameFunctions ICondition condition, IClientState clientState, QuestRegistry questRegistry, + QuestData questData, IGameGui gameGui, Configuration configuration, ILogger logger) @@ -65,6 +69,7 @@ internal sealed unsafe class GameFunctions _condition = condition; _clientState = clientState; _questRegistry = questRegistry; + _questData = questData; _gameGui = gameGui; _configuration = configuration; _logger = logger; @@ -246,7 +251,7 @@ internal sealed unsafe class GameFunctions public bool IsQuestAcceptedOrComplete(ushort questId) { - return QuestManager.IsQuestComplete(questId) || IsQuestAccepted(questId); + return IsQuestComplete(questId) || IsQuestAccepted(questId); } public bool IsQuestAccepted(ushort questId) @@ -255,6 +260,38 @@ internal sealed unsafe class GameFunctions return questManager->IsQuestAccepted(questId); } + public bool IsQuestComplete(ushort questId) + { + return QuestManager.IsQuestComplete(questId); + } + + public bool IsQuestLocked(ushort questId, ushort? extraCompletedQuest = null) + { + var questInfo = _questData.GetQuestInfo(questId); + if (questInfo.QuestLocks.Count > 0) + { + var completedQuests = questInfo.QuestLocks.Count(x => IsQuestComplete(x) || x == extraCompletedQuest); + if (questInfo.QuestLockJoin == QuestInfo.QuestJoin.All && questInfo.QuestLocks.Count == completedQuests) + return true; + else if (questInfo.QuestLockJoin == QuestInfo.QuestJoin.AtLeastOne && completedQuests > 0) + return true; + } + + if (questInfo.PreviousQuests.Count > 0) + { + var completedQuests = questInfo.PreviousQuests.Count(x => IsQuestComplete(x) || x == extraCompletedQuest); + if (questInfo.PreviousQuestJoin == QuestInfo.QuestJoin.All && + questInfo.PreviousQuests.Count == completedQuests) + return false; + else if (questInfo.PreviousQuestJoin == QuestInfo.QuestJoin.AtLeastOne && completedQuests > 0) + return false; + else + return true; + } + + return false; + } + public bool IsAetheryteUnlocked(uint aetheryteId, out byte subIndex) { subIndex = 0; diff --git a/Questionable/Model/QuestInfo.cs b/Questionable/Model/QuestInfo.cs index 14ac7e7c..5b7523e8 100644 --- a/Questionable/Model/QuestInfo.cs +++ b/Questionable/Model/QuestInfo.cs @@ -1,5 +1,9 @@ using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; using Dalamud.Game.Text; +using JetBrains.Annotations; using ExcelQuest = Lumina.Excel.GeneratedSheets.Quest; namespace Questionable.Model; @@ -13,6 +17,11 @@ internal sealed class QuestInfo Level = quest.ClassJobLevel0; IssuerDataId = quest.IssuerStart; IsRepeatable = quest.IsRepeatable; + PreviousQuests = quest.PreviousQuest.Select(x => (ushort)(x.Row & 0xFFFF)).Where(x => x != 0).ToImmutableList(); + PreviousQuestJoin = (QuestJoin)quest.PreviousQuestJoin; + QuestLocks = quest.QuestLock.Select(x => (ushort)(x.Row & 0xFFFFF)).Where(x => x != 0).ToImmutableList(); + QuestLockJoin = (QuestJoin)quest.QuestLockJoin; + IsMainScenarioQuest = quest.JournalGenre?.Value?.JournalCategory?.Value?.JournalSection?.Row is 0 or 1; } public ushort QuestId { get; } @@ -20,7 +29,20 @@ internal sealed class QuestInfo public ushort Level { get; } public uint IssuerDataId { get; } public bool IsRepeatable { get; } + public ImmutableList PreviousQuests { get; } + public QuestJoin PreviousQuestJoin { get; } + public bool IsMainScenarioQuest { get; } + public ImmutableList QuestLocks { get; set; } + public QuestJoin QuestLockJoin { get; set; } public string SimplifiedName => Name .TrimStart(SeIconChar.QuestSync.ToIconChar(), SeIconChar.QuestRepeatable.ToIconChar(), ' '); + + [UsedImplicitly(ImplicitUseKindFlags.Assign, ImplicitUseTargetFlags.Members)] + public enum QuestJoin : byte + { + None = 0, + All = 1, + AtLeastOne = 2, + } } diff --git a/Questionable/Windows/QuestSelectionWindow.cs b/Questionable/Windows/QuestSelectionWindow.cs index a40ca54d..8e0bd971 100644 --- a/Questionable/Windows/QuestSelectionWindow.cs +++ b/Questionable/Windows/QuestSelectionWindow.cs @@ -29,13 +29,15 @@ internal sealed class QuestSelectionWindow : LWindow private readonly QuestController _questController; private readonly QuestRegistry _questRegistry; private readonly IDalamudPluginInterface _pluginInterface; + private readonly TerritoryData _territoryData; private List _quests = []; private List _offeredQuests = []; private bool _onlyAvailableQuests = true; public QuestSelectionWindow(QuestData questData, IGameGui gameGui, IChatGui chatGui, GameFunctions gameFunctions, - QuestController questController, QuestRegistry questRegistry, IDalamudPluginInterface pluginInterface) + QuestController questController, QuestRegistry questRegistry, IDalamudPluginInterface pluginInterface, + TerritoryData territoryData) : base($"Quest Selection{WindowId}") { _questData = questData; @@ -45,6 +47,7 @@ internal sealed class QuestSelectionWindow : LWindow _questController = questController; _questRegistry = questRegistry; _pluginInterface = pluginInterface; + _territoryData = territoryData; Size = new Vector2(500, 200); SizeCondition = ImGuiCond.Once; @@ -57,7 +60,7 @@ internal sealed class QuestSelectionWindow : LWindow public uint TargetId { get; private set; } public string TargetName { get; private set; } = string.Empty; - public unsafe void Open(IGameObject? gameObject) + public unsafe void OpenForTarget(IGameObject? gameObject) { if (gameObject != null) { @@ -85,6 +88,28 @@ internal sealed class QuestSelectionWindow : LWindow IsOpen = _quests.Count > 0; } + public void OpenForZone(ushort territoryId) + { + TargetId = territoryId; + TargetName = _territoryData.GetNameAndId(territoryId); + WindowName = $"Quests starting in {TargetName}{WindowId}"; + + _quests = _questRegistry.AllQuests + .Where(x => x.FindSequence(0)?.FindStep(0)?.TerritoryId == territoryId) + .Select(x => _questData.GetQuestInfo(x.QuestId)) + .ToList(); + _offeredQuests = []; + IsOpen = true; + } + + public override void OnClose() + { + TargetId = default; + TargetName = default; + _quests = []; + _offeredQuests = []; + } + public override void Draw() { if (_offeredQuests.Count != 0) @@ -119,30 +144,40 @@ internal sealed class QuestSelectionWindow : LWindow if (ImGui.TableNextColumn()) { ImGui.AlignTextToFramePadding(); - using var font = _pluginInterface.UiBuilder.IconFontFixedWidthHandle.Push(); - - FontAwesomeIcon icon; - Vector4 color; - if (_gameFunctions.IsQuestAccepted(quest.QuestId)) + var (color, icon, tooltipText) = GetQuestStyle(quest.QuestId); + using (var _ = _pluginInterface.UiBuilder.IconFontFixedWidthHandle.Push()) { - color = ImGuiColors.DalamudYellow; - icon = FontAwesomeIcon.Running; - } - else if (_gameFunctions.IsQuestAcceptedOrComplete(quest.QuestId)) - { - color = ImGuiColors.ParsedGreen; - icon = FontAwesomeIcon.Check; - } - else - { - color = ImGuiColors.DalamudRed; - icon = FontAwesomeIcon.Times; + if (isKnownQuest) + ImGui.TextColored(color, icon.ToIconString()); + else + ImGui.TextColored(ImGuiColors.DalamudGrey, icon.ToIconString()); } - if (isKnownQuest) - ImGui.TextColored(color, icon.ToIconString()); - else - ImGui.TextColored(ImGuiColors.DalamudGrey, icon.ToIconString()); + if (ImGui.IsItemHovered()) + { + using var tooltip = ImRaii.Tooltip(); + if (tooltip) + { + ImGui.TextColored(color, tooltipText); + if (quest.IsRepeatable) + { + ImGui.SameLine(); + ImGui.TextUnformatted("Repeatable"); + } + + if (!_questRegistry.IsKnownQuest(quest.QuestId)) + { + ImGui.SameLine(); + ImGui.TextUnformatted("NoQuestPath"); + } + + if (quest.PreviousQuests.Count > 0) + { + ImGui.Separator(); + DrawQuestUnlocks(quest, 0); + } + } + } } if (ImGui.TableNextColumn()) @@ -165,7 +200,9 @@ internal sealed class QuestSelectionWindow : LWindow ImGui.SameLine(); - if (knownQuest != null && !_gameFunctions.IsQuestAccepted(quest.QuestId) && + if (knownQuest != null && + !_gameFunctions.IsQuestAccepted(quest.QuestId) && + !_gameFunctions.IsQuestLocked(quest.QuestId) && (quest.IsRepeatable || !_gameFunctions.IsQuestAcceptedOrComplete(quest.QuestId))) { ImGui.BeginDisabled(_questController.NextQuest != null || _questController.SimulatedQuest != null); @@ -199,4 +236,97 @@ internal sealed class QuestSelectionWindow : LWindow ImGui.SetClipboardText(fileName); _chatGui.Print($"Copied '{fileName}' to clipboard"); } + + private (Vector4 color, FontAwesomeIcon icon, string status) GetQuestStyle(ushort questId) + { + if (_gameFunctions.IsQuestAccepted(questId)) + return (ImGuiColors.DalamudYellow, FontAwesomeIcon.Running, "Active"); + else if (_gameFunctions.IsQuestAcceptedOrComplete(questId)) + return (ImGuiColors.ParsedGreen, FontAwesomeIcon.Check, "Complete"); + else if (_gameFunctions.IsQuestLocked(questId)) + return (ImGuiColors.DalamudRed, FontAwesomeIcon.Times, "Locked"); + else + return (ImGuiColors.DalamudYellow, FontAwesomeIcon.PersonWalkingArrowRight, "Available"); + } + + private void DrawQuestUnlocks(QuestInfo quest, int counter) + { + if (counter >= 10) + return; + + if (counter != 0 && quest.IsMainScenarioQuest) + return; + + if (counter > 0) + ImGui.Indent(); + + if (quest.PreviousQuests.Count > 0) + { + if (quest.PreviousQuests.Count > 1) + { + if (quest.PreviousQuestJoin == QuestInfo.QuestJoin.All) + ImGui.Text("Requires all:"); + else if (quest.PreviousQuestJoin == QuestInfo.QuestJoin.AtLeastOne) + ImGui.Text("Requires one:"); + } + + foreach (var q in quest.PreviousQuests) + { + var qInfo = _questData.GetQuestInfo(q); + var (iconColor, icon, _) = GetQuestStyle(q); + using (var font = _pluginInterface.UiBuilder.IconFontFixedWidthHandle.Push()) + { + if (_questRegistry.IsKnownQuest(qInfo.QuestId)) + ImGui.TextColored(iconColor, icon.ToIconString()); + else + ImGui.TextColored(ImGuiColors.DalamudGrey, icon.ToIconString()); + } + + ImGui.SameLine(); + ImGui.TextUnformatted(FormatQuestUnlockName(qInfo)); + + DrawQuestUnlocks(qInfo, counter + 1); + } + } + + if (counter == 0 && quest.QuestLocks.Count > 0) + { + if (quest.QuestLocks.Count > 1) + { + if (quest.QuestLockJoin == QuestInfo.QuestJoin.All) + ImGui.Text("Blocked if all completed:"); + else if (quest.QuestLockJoin == QuestInfo.QuestJoin.AtLeastOne) + ImGui.Text("Blocked if at least completed:"); + } + else + ImGui.Text("Blocked by (if completed):"); + + foreach (var q in quest.QuestLocks) + { + var qInfo = _questData.GetQuestInfo(q); + var (iconColor, icon, _) = GetQuestStyle(q); + using (var font = _pluginInterface.UiBuilder.IconFontFixedWidthHandle.Push()) + { + if (_questRegistry.IsKnownQuest(qInfo.QuestId)) + ImGui.TextColored(iconColor, icon.ToIconString()); + else + ImGui.TextColored(ImGuiColors.DalamudGrey, icon.ToIconString()); + } + + ImGui.SameLine(); + ImGui.TextUnformatted(FormatQuestUnlockName(qInfo)); + } + } + + if (counter > 0) + ImGui.Unindent(); + } + + private static string FormatQuestUnlockName(QuestInfo questInfo) + { + if (questInfo.IsMainScenarioQuest) + return $"{questInfo.Name} ({questInfo.QuestId}, MSQ)"; + else + return $"{questInfo.Name} ({questInfo.QuestId})"; + } } diff --git a/Questionable/Windows/QuestWindow.cs b/Questionable/Windows/QuestWindow.cs index 573b90eb..69793cc2 100644 --- a/Questionable/Windows/QuestWindow.cs +++ b/Questionable/Windows/QuestWindow.cs @@ -452,7 +452,7 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig if (ImGui.IsItemHovered()) ImGui.SetTooltip("Show all Quests starting with your current target."); if (showQuests) - _questSelectionWindow.Open(_targetManager.Target); + _questSelectionWindow.OpenForTarget(_targetManager.Target); ImGui.EndDisabled();