From cc0c972baeea2e16742d846bc82673739e40b946 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sat, 20 Jul 2024 19:09:51 +0200 Subject: [PATCH] Daily quest updates --- ...689_Where There's Wool, There's a Way.json | 93 ++++++- .../Dailies/3691_Sharing Is Caring.json | 50 ++-- .../Pixies/Dailies/3691_Sharing Is Caring.md | 4 +- .../3692_The Aesthetician of Il Mheg.json | 89 +++++-- .../3692_The Aesthetician of Il Mheg.md | 10 +- .../Dailies/3694_I Dream of Shinies.json | 48 +++- .../Pixies/Dailies/3694_I Dream of Shinies.md | 10 + .../Dailies/3698_Porxine Perfection.json | 99 +++++++- .../Pixies/Dailies/3698_Porxine Perfection.md | 9 + .../3703_Raiders of the Lost Pork.json | 40 ++- .../Dailies/3703_Raiders of the Lost Pork.md | 4 +- .../Dailies/3704_Pebble without a Cause.json | 4 +- .../3705_There's Always a Stupider Fish.json | 34 ++- .../Pixies/Dailies/3710_What the Phooka.json | 43 +++- .../Story/3684_Sustenance for the Soul.json | 236 ++++++++++++++++++ .../4551_Ridin' Flyers for Flyin' Riders.json | 59 ++++- .../Dailies/4556_Anxious Rookie.json | 69 ++++- .../Arkasodara/Dailies/4556_Anxious Rookie.md | 8 + .../Dailies/4558_Essential Eggredients.json | 6 +- .../Dailies/4559_Darling Defender.json | 4 +- .../Dailies/4560_Bloomin' Ocean.json | 119 ++++++++- .../Arkasodara/Dailies/4560_Bloomin' Ocean.md | 9 + .../4562_Waste Not, Want None of That.json | 1 - .../4562_Waste Not, Want None of That.md | 12 - .../Story/4546_A Pachyderm's Promptitude.json | 214 ++++++++++++++++ QuestPaths/quest-v1.json | 36 +++ .../V1/Converter/ActionConverter.cs | 1 + .../V1/Converter/QuestWorkConfigConverter.cs | 58 +++++ Questionable.Model/V1/EAction.cs | 3 +- Questionable.Model/V1/QuestStep.cs | 1 + Questionable.Model/V1/QuestWorkValue.cs | 16 ++ .../Controller/Steps/Shared/SkipCondition.cs | 24 +- .../Controller/Utils/QuestWorkUtils.cs | 41 +++ 33 files changed, 1365 insertions(+), 89 deletions(-) create mode 100644 QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3694_I Dream of Shinies.md create mode 100644 QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3698_Porxine Perfection.md create mode 100644 QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Story/3684_Sustenance for the Soul.json create mode 100644 QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4556_Anxious Rookie.md create mode 100644 QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4560_Bloomin' Ocean.md delete mode 100644 QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4562_Waste Not, Want None of That.md create mode 100644 QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Story/4546_A Pachyderm's Promptitude.json create mode 100644 Questionable.Model/V1/Converter/QuestWorkConfigConverter.cs create mode 100644 Questionable.Model/V1/QuestWorkValue.cs diff --git a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3689_Where There's Wool, There's a Way.json b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3689_Where There's Wool, There's a Way.json index b068dc26..f05e70bc 100644 --- a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3689_Where There's Wool, There's a Way.json +++ b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3689_Where There's Wool, There's a Way.json @@ -21,7 +21,98 @@ { "Sequence": 1, "Steps": [ - + { + "Position": { + "X": -246.48618, + "Y": 54.663364, + "Z": 605.60834 + }, + "TerritoryId": 816, + "InteractionType": "WalkTo", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + -128 + ] + }, + { + "DataId": 2010856, + "Position": { + "X": -271.29016, + "Y": 52.96399, + "Z": 605.9204 + }, + "TerritoryId": 816, + "InteractionType": "Interact", + "DisableNavmesh": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 2010858, + "Position": { + "X": -250.62946, + "Y": 50.94983, + "Z": 597.7416 + }, + "TerritoryId": 816, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "Position": { + "X": -261.1694, + "Y": 50.977943, + "Z": 589.3572 + }, + "TerritoryId": 816, + "InteractionType": "WalkTo", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + -64 + ] + }, + { + "DataId": 2010857, + "Position": { + "X": -261.1277, + "Y": 50.94983, + "Z": 585.2903 + }, + "StopDistance": 4.5, + "TerritoryId": 816, + "InteractionType": "Interact", + "DisableNavmesh": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } ] }, { diff --git a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3691_Sharing Is Caring.json b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3691_Sharing Is Caring.json index 0d300612..2207c88b 100644 --- a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3691_Sharing Is Caring.json +++ b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3691_Sharing Is Caring.json @@ -1,7 +1,6 @@ { "$schema": "https://carvel.li/questionable/quest-1.0", "Author": "liza", - "Disabled": true, "QuestSequence": [ { "Sequence": 0, @@ -21,16 +20,6 @@ { "Sequence": 1, "Steps": [ - { - "Position": { - "X": -466.72015, - "Y": 44.63006, - "Z": -310.0618 - }, - "TerritoryId": 816, - "InteractionType": "WalkTo", - "Fly": true - }, { "DataId": 1032140, "Position": { @@ -43,8 +32,17 @@ "ChatMessage": { "Key": "TEXT_BANPIX103_03691_SAYTODO_000_030" }, - "SkipIf": [ - "NotTargetable" + "$": "QW: 0 0 0 1 0 0", + "Fly": true, + "RequiredQuestVariables": [ + null, + null, + null, + [ + 1 + ], + null, + null ] }, { @@ -59,8 +57,17 @@ "ChatMessage": { "Key": "TEXT_BANPIX103_03691_SAYTODO_000_030" }, - "SkipIf": [ - "NotTargetable" + "$": "QW: 0 0 0 3 0 0", + "Fly": true, + "RequiredQuestVariables": [ + null, + null, + null, + [ + 3 + ], + null, + null ] }, { @@ -70,13 +77,22 @@ "Y": 50.10258, "Z": -328.26733 }, + "$": "QW: 0 0 0 2 0 0", "TerritoryId": 816, "InteractionType": "Say", "ChatMessage": { "Key": "TEXT_BANPIX103_03691_SAYTODO_000_030" }, - "SkipIf": [ - "NotTargetable" + "Fly": true, + "RequiredQuestVariables": [ + null, + null, + null, + [ + 2 + ], + null, + null ] } ] diff --git a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3691_Sharing Is Caring.md b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3691_Sharing Is Caring.md index 0f2ea2b5..b265144d 100644 --- a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3691_Sharing Is Caring.md +++ b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3691_Sharing Is Caring.md @@ -3,9 +3,7 @@ QuestWork: ``` 0 0 0 x 0 0 + 1 → 1032140 2 → 1032142 3 → 1032141 - -unknown - ? → 1032140 ``` diff --git a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3692_The Aesthetician of Il Mheg.json b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3692_The Aesthetician of Il Mheg.json index 9429e210..0935c8f8 100644 --- a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3692_The Aesthetician of Il Mheg.json +++ b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3692_The Aesthetician of Il Mheg.json @@ -1,7 +1,6 @@ { "$schema": "https://carvel.li/questionable/quest-1.0", "Author": "liza", - "Disabled": true, "QuestSequence": [ { "Sequence": 0, @@ -20,17 +19,19 @@ }, { "Sequence": 1, - "Comment": "TODO Has multiple possible targets, unsure if QW works", "Steps": [ { "Position": { - "X": -342.05676, - "Y": 37.5036, - "Z": 434.53723 + "X": -344.05838, + "Y": 45.450672, + "Z": 456.10266 }, "TerritoryId": 816, "InteractionType": "WalkTo", - "Fly": true + "Fly": true, + "SkipIf": [ + "FlyingLocked" + ] }, { "DataId": 2010860, @@ -41,8 +42,23 @@ }, "TerritoryId": 816, "InteractionType": "Interact", - "SkipIf": [ - "NotTargetable" + "RequiredQuestVariables": [ + null, + [ + { + "Low": 1 + }, + { + "Low": 2 + }, + { + "Low": 3 + } + ], + null, + null, + null, + null ] }, { @@ -54,8 +70,23 @@ }, "TerritoryId": 816, "InteractionType": "Interact", - "SkipIf": [ - "NotTargetable" + "RequiredQuestVariables": [ + null, + [ + { + "Low": 3 + }, + { + "Low": 4 + }, + { + "Low": 5 + } + ], + null, + null, + null, + null ] }, { @@ -67,8 +98,23 @@ }, "TerritoryId": 816, "InteractionType": "Interact", - "SkipIf": [ - "NotTargetable" + "RequiredQuestVariables": [ + null, + [ + { + "Low": 1 + }, + { + "Low": 4 + }, + { + "Low": 6 + } + ], + null, + null, + null, + null ], "IgnoreDistanceToObject": true }, @@ -81,8 +127,23 @@ }, "TerritoryId": 816, "InteractionType": "Interact", - "SkipIf": [ - "NotTargetable" + "RequiredQuestVariables": [ + null, + [ + { + "Low": 2 + }, + { + "Low": 5 + }, + { + "Low": 6 + } + ], + null, + null, + null, + null ], "IgnoreDistanceToObject": true } diff --git a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3692_The Aesthetician of Il Mheg.md b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3692_The Aesthetician of Il Mheg.md index b3776681..5192727e 100644 --- a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3692_The Aesthetician of Il Mheg.md +++ b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3692_The Aesthetician of Il Mheg.md @@ -2,7 +2,11 @@ QuestWork: ``` -0 x 0 0 0 0 - 4 → 2010861, 2010863 - 5 → 2010861, 2010862 +0 x 0 0 0 0 | QW after first + 1 → 2010860 2010863 | 1 18 0 0 0 128 + 2 → 2010860 2010862 | 1 18 0 0 0 128 + 3 → 2010860 2010861 | 1 19 0 0 0 128 + 4 → 2010861 2010863 | + 5 → 2010861 2010862 | + 6 → 2010862 2010863 | 1 22 0 0 0 128 ``` diff --git a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3694_I Dream of Shinies.json b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3694_I Dream of Shinies.json index bd3cf85c..5e8bb8f1 100644 --- a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3694_I Dream of Shinies.json +++ b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3694_I Dream of Shinies.json @@ -41,6 +41,25 @@ "Fly": true, "DisableNavmesh": true }, + { + "DataId": 2010865, + "Position": { + "X": -335.59174, + "Y": -53.75763, + "Z": -277.9126 + }, + "TerritoryId": 816, + "InteractionType": "Interact", + "Fly": true, + "RequiredQuestVariables": [ + null, + null, + null, + [1], + null, + null + ] + }, { "DataId": 2010866, "Position": { @@ -50,7 +69,34 @@ }, "TerritoryId": 816, "InteractionType": "Interact", - "Fly": true + "Fly": true, + "RequiredQuestVariables": [ + null, + null, + null, + [2], + null, + null + ] + }, + { + "DataId": 2010867, + "Position": { + "X": -351.64417, + "Y": -53.635498, + "Z": -295.73517 + }, + "TerritoryId": 816, + "InteractionType": "Interact", + "Fly": true, + "RequiredQuestVariables": [ + null, + null, + null, + [3], + null, + null + ] } ] }, diff --git a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3694_I Dream of Shinies.md b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3694_I Dream of Shinies.md new file mode 100644 index 00000000..fd4810d2 --- /dev/null +++ b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3694_I Dream of Shinies.md @@ -0,0 +1,10 @@ +## I Dream of Shinies + +QuestWork: + +``` +0 0 0 x 0 0 + 1 → 2010865 + 2 → 2010866 + 3 → 2010867 +``` diff --git a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3698_Porxine Perfection.json b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3698_Porxine Perfection.json index b068dc26..76b562bf 100644 --- a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3698_Porxine Perfection.json +++ b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3698_Porxine Perfection.json @@ -1,7 +1,6 @@ { "$schema": "https://carvel.li/questionable/quest-1.0", "Author": "liza", - "Disabled": true, "QuestSequence": [ { "Sequence": 0, @@ -21,7 +20,102 @@ { "Sequence": 1, "Steps": [ - + { + "DataId": 1031811, + "Position": { + "X": -442.46588, + "Y": 70.686165, + "Z": 573.69336 + }, + "TerritoryId": 816, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2010891, + "Position": { + "X": -852.0485, + "Y": 37.67456, + "Z": 298.11548 + }, + "TerritoryId": 816, + "InteractionType": "Action", + "Action": "Siphon Snout", + "Fly": true, + "RequiredQuestVariables": [ + null, + null, + [ + { + "High": 1 + }, + { + "High": 2 + } + ], + null, + null, + null + ] + }, + { + "DataId": 2010892, + "Position": { + "X": -774.44116, + "Y": 54.520386, + "Z": 102.61682 + }, + "TerritoryId": 816, + "InteractionType": "Action", + "Action": "Siphon Snout", + "Fly": true, + "RequiredQuestVariables": [ + null, + null, + [ + { + "High": 1 + }, + { + "High": 3 + } + ], + null, + null, + null + ] + }, + { + "DataId": 2010893, + "Position": { + "X": -802.30414, + "Y": 27.115234, + "Z": -108.44586 + }, + "TerritoryId": 816, + "InteractionType": "Action", + "Action": "Siphon Snout", + "Fly": true, + "RequiredQuestVariables": [ + null, + null, + [ + { + "High": 2 + }, + { + "High": 3 + } + ], + null, + null, + null + ] + } ] }, { @@ -36,6 +130,7 @@ }, "TerritoryId": 816, "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Il Mheg - Lydha Lran", "Fly": true } ] diff --git a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3698_Porxine Perfection.md b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3698_Porxine Perfection.md new file mode 100644 index 00000000..28af2d6b --- /dev/null +++ b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3698_Porxine Perfection.md @@ -0,0 +1,9 @@ +## Sharing is Caring + +QuestWork: +``` +0 0 xx 0 0 0 + 16 → 2010891 2010892 + 32 → 2010891 2010893 | unverified + 48 → 2010892 2010893 +``` diff --git a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3703_Raiders of the Lost Pork.json b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3703_Raiders of the Lost Pork.json index f8e2bd26..493b63bf 100644 --- a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3703_Raiders of the Lost Pork.json +++ b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3703_Raiders of the Lost Pork.json @@ -1,7 +1,6 @@ { "$schema": "https://carvel.li/questionable/quest-1.0", "Author": "liza", - "Disabled": true, "QuestSequence": [ { "Sequence": 0, @@ -31,10 +30,16 @@ "TerritoryId": 816, "InteractionType": "Interact", "Fly": true, - "SkipIf": [ - "NotTargetable" - ], - "$": "Only if QW: 0 48 0 0 0 0" + "RequiredQuestVariables": [ + null, + [ + 48 + ], + null, + null, + null, + null + ] }, { "DataId": 1032168, @@ -46,10 +51,16 @@ "TerritoryId": 816, "InteractionType": "Interact", "Fly": true, - "SkipIf": [ - "NotTargetable" - ], - "$": "Only if QW: 0 32 0 0 0 0" + "RequiredQuestVariables": [ + null, + [ + 32 + ], + null, + null, + null, + null + ] }, { "DataId": 1032167, @@ -61,8 +72,15 @@ "TerritoryId": 816, "InteractionType": "Interact", "Fly": true, - "SkipIf": [ - "NotTargetable" + "RequiredQuestVariables": [ + null, + [ + 16 + ], + null, + null, + null, + null ] } ] diff --git a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3703_Raiders of the Lost Pork.md b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3703_Raiders of the Lost Pork.md index 493ab110..fd1f8a87 100644 --- a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3703_Raiders of the Lost Pork.md +++ b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3703_Raiders of the Lost Pork.md @@ -3,7 +3,7 @@ QuestWork: ``` 0 x 0 0 0 0 - 32 → 1032168 + 16 → Tall Fuath (1032167) + 32 → Trembling Scavenger (1032168) 48 → Elegant Eulmoran (1032169) - ?? → 1032167 ``` diff --git a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3704_Pebble without a Cause.json b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3704_Pebble without a Cause.json index 5c1ca655..2a3aad74 100644 --- a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3704_Pebble without a Cause.json +++ b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3704_Pebble without a Cause.json @@ -31,7 +31,7 @@ "TerritoryId": 816, "InteractionType": "Interact", "Fly": true, - "$": "Only if QW: 0 0 ??? 0 0 0", + "$": "Only if QW: 0 0 3 0 0 0", "SkipIf": ["NotTargetable"] }, { @@ -43,7 +43,7 @@ }, "TerritoryId": 816, "InteractionType": "Interact", - "$": "Only if QW: 0 0 1 0 0 0 → if complete, 0 16 0 0 0 0", + "$": "Only if QW: 0 0 1 0 0 0", "SkipIf": ["NotTargetable"] } ] diff --git a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3705_There's Always a Stupider Fish.json b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3705_There's Always a Stupider Fish.json index a71e2c27..1ca9189d 100644 --- a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3705_There's Always a Stupider Fish.json +++ b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3705_There's Always a Stupider Fish.json @@ -41,7 +41,39 @@ "TerritoryId": 816, "InteractionType": "Interact", "DisableNavmesh": true, - "$": "QW: 0 2 0 0 0 0" + "$": "QW: 0 2 0 0 0 0", + "SkipIf": [ + "NotTargetable" + ] + }, + { + "DataId": 2010904, + "Position": { + "X": -164.93481, + "Y": -50.919373, + "Z": 71.15283 + }, + "TerritoryId": 816, + "InteractionType": "Interact", + "$": "QW: 0 3 0 0 0 0", + "SkipIf": [ + "NotTargetable" + ] + }, + { + "DataId": 2010910, + "Position": { + "X": -189.86804, + "Y": -66.941345, + "Z": 13.046387 + }, + "TerritoryId": 816, + "InteractionType": "Interact", + "DisableNavmesh": true, + "$": "QW: 0 1 0 0 0 0", + "SkipIf": [ + "NotTargetable" + ] } ] }, diff --git a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3710_What the Phooka.json b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3710_What the Phooka.json index b068dc26..d9cd1c21 100644 --- a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3710_What the Phooka.json +++ b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3710_What the Phooka.json @@ -1,7 +1,6 @@ { "$schema": "https://carvel.li/questionable/quest-1.0", "Author": "liza", - "Disabled": true, "QuestSequence": [ { "Sequence": 0, @@ -21,7 +20,37 @@ { "Sequence": 1, "Steps": [ - + { + "DataId": 1032204, + "Position": { + "X": -81.864685, + "Y": 88.12085, + "Z": -175.06683 + }, + "TerritoryId": 816, + "InteractionType": "UseItem", + "ItemId": 2002945, + "$": "QW 0 32 0 0 0 0", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1032205, + "Position": { + "X": -114.21387, + "Y": 112.903015, + "Z": -350.57605 + }, + "TerritoryId": 816, + "InteractionType": "UseItem", + "ItemId": 2002945, + "$": "QW 0 17 0 0 0 0", + "Fly": true + } ] }, { @@ -36,7 +65,15 @@ }, "TerritoryId": 816, "InteractionType": "CompleteQuest", - "Fly": true + "AetheryteShortcut": "Il Mheg - Lydha Lran", + "Fly": true, + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_BANPIX122_03710_Q1_000_000", + "Answer": "TEXT_BANPIX122_03710_A1_000_002" + } + ] } ] } diff --git a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Story/3684_Sustenance for the Soul.json b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Story/3684_Sustenance for the Soul.json new file mode 100644 index 00000000..9621a630 --- /dev/null +++ b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Story/3684_Sustenance for the Soul.json @@ -0,0 +1,236 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1031806, + "Position": { + "X": -464.59143, + "Y": 71.76874, + "Z": 573.8766 + }, + "TerritoryId": 816, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1031891, + "Position": { + "X": -461.53967, + "Y": 72.51729, + "Z": 586.48047 + }, + "TerritoryId": 816, + "InteractionType": "Interact", + "TargetTerritoryId": 890 + }, + { + "DataId": 1031853, + "Position": { + "X": 60.471436, + "Y": -1.6051313, + "Z": 53.543823 + }, + "TerritoryId": 890, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1031852, + "Position": { + "X": 59.03711, + "Y": -1.7997739, + "Z": 56.565186 + }, + "TerritoryId": 890, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1031855, + "Position": { + "X": 74.784424, + "Y": 98.85967, + "Z": -820.88965 + }, + "TerritoryId": 816, + "InteractionType": "Interact", + "AetheryteShortcut": "Il Mheg - Pia Enni", + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1031858, + "Position": { + "X": -211.35272, + "Y": 16.63259, + "Z": 427.32886 + }, + "TerritoryId": 814, + "InteractionType": "Interact", + "AetheryteShortcut": "Kholusia - Wright", + "Fly": true + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1031860, + "Position": { + "X": -217.45636, + "Y": 21.481304, + "Z": 356.9237 + }, + "TerritoryId": 814, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "Position": { + "X": -137.7369, + "Y": 11.939666, + "Z": 336.4078 + }, + "TerritoryId": 814, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 11438 + ] + } + ] + }, + { + "Sequence": 7, + "Steps": [ + { + "DataId": 1031861, + "Position": { + "X": -149.85895, + "Y": 13.084818, + "Z": 341.1764 + }, + "TerritoryId": 814, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 8, + "Steps": [ + { + "DataId": 1031860, + "Position": { + "X": -217.45636, + "Y": 21.481304, + "Z": 356.9237 + }, + "TerritoryId": 814, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 9, + "Steps": [ + { + "DataId": 1031891, + "Position": { + "X": -461.53967, + "Y": 72.51729, + "Z": 586.48047 + }, + "TerritoryId": 816, + "InteractionType": "Interact", + "AetheryteShortcut": "Il Mheg - Lydha Lran", + "Fly": true, + "TargetTerritoryId": 890 + }, + { + "DataId": 1031863, + "Position": { + "X": 60.379883, + "Y": 31.0353, + "Z": -110.76526 + }, + "TerritoryId": 890, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 10, + "Steps": [ + { + "Position": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "TerritoryId": 1, + "InteractionType": "WalkTo", + "Comment": "Filler" + } + ] + }, + { + "Sequence": 11, + "Steps": [ + { + "DataId": 1032350, + "Position": { + "X": 63.797974, + "Y": 30.266184, + "Z": -103.4715 + }, + "TerritoryId": 891, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1031806, + "Position": { + "X": -464.59143, + "Y": 71.76874, + "Z": 573.8766 + }, + "TerritoryId": 816, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Il Mheg - Lydha Lran", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4551_Ridin' Flyers for Flyin' Riders.json b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4551_Ridin' Flyers for Flyin' Riders.json index 2fcc3eba..dae22d7b 100644 --- a/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4551_Ridin' Flyers for Flyin' Riders.json +++ b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4551_Ridin' Flyers for Flyin' Riders.json @@ -1,7 +1,6 @@ { "$schema": "https://carvel.li/questionable/quest-1.0", "Author": "liza", - "Disabled": true, "QuestSequence": [ { "Sequence": 0, @@ -21,7 +20,63 @@ { "Sequence": 1, "Steps": [ - + { + "DataId": 1042363, + "Position": { + "X": 227.58826, + "Y": 4.933288, + "Z": 644.4037 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "AetheryteShortcut": "Thavnair - Yedlihmad", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1042364, + "Position": { + "X": 198.93188, + "Y": 1.7699993, + "Z": 707.1183 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 1042365, + "Position": { + "X": 177.66077, + "Y": 5.331657, + "Z": 651.27026 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } ] }, { diff --git a/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4556_Anxious Rookie.json b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4556_Anxious Rookie.json index 40ffbca8..8b6a3af2 100644 --- a/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4556_Anxious Rookie.json +++ b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4556_Anxious Rookie.json @@ -19,8 +19,64 @@ }, { "Sequence": 1, - "Comment": "There are more NPC/dialogue choices", "Steps": [ + { + "DataId": 1042368, + "Position": { + "X": -485.771, + "Y": 39.62969, + "Z": 114.213745 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "AetheryteShortcut": "Thavnair - Great Work", + "Fly": true, + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_BANARK106_04556_Q1_000_000", + "Answer": "TEXT_BANARK106_04556_A1_000_001" + } + ], + "RequiredQuestVariables": [ + null, + null, + [ + 48 + ], + null, + null, + null + ] + }, + { + "DataId": 1042369, + "Position": { + "X": -561.2726, + "Y": 11.802609, + "Z": 128.95398 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "Fly": true, + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_BANARK106_04556_Q2_000_000", + "Answer": "TEXT_BANARK106_04556_A2_000_001" + } + ], + "RequiredQuestVariables": [ + null, + null, + [ + 16 + ], + null, + null, + null + ] + }, { "DataId": 1042370, "Position": { @@ -37,8 +93,15 @@ "Answer": "TEXT_BANARK106_04556_A3_000_001" } ], - "SkipIf": [ - "NotTargetable" + "RequiredQuestVariables": [ + null, + null, + [ + 32 + ], + null, + null, + null ] } ] diff --git a/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4556_Anxious Rookie.md b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4556_Anxious Rookie.md new file mode 100644 index 00000000..bd2d48c1 --- /dev/null +++ b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4556_Anxious Rookie.md @@ -0,0 +1,8 @@ +## Bloomin' Ocean + +``` +0 0 ?? 0 0 0 + 16 → 1042369 + 32 → 1042370 + 48 → 1042368 +``` diff --git a/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4558_Essential Eggredients.json b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4558_Essential Eggredients.json index 92f8f295..f13e087b 100644 --- a/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4558_Essential Eggredients.json +++ b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4558_Essential Eggredients.json @@ -29,7 +29,11 @@ }, "TerritoryId": 957, "InteractionType": "Interact", - "AetheryteShortcut": "Thavnair - Palaka's Stand", + "AetheryteShortcut": "Radz-at-Han", + "AethernetShortcut": [ + "[Radz-at-Han] Aetheryte Plaza", + "[Radz-at-Han] The Gate of First Sight (Thavnair)" + ], "Fly": true } ] diff --git a/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4559_Darling Defender.json b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4559_Darling Defender.json index 44068d32..94f73ef0 100644 --- a/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4559_Darling Defender.json +++ b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4559_Darling Defender.json @@ -32,7 +32,9 @@ "EnemySpawnType": "AutoOnEnterArea", "KillEnemyDataIds": [ 14676 - ] + ], + "Fly": true, + "AetheryteShortcut": "Thavnair - Great Work" } ] }, diff --git a/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4560_Bloomin' Ocean.json b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4560_Bloomin' Ocean.json index 2fcc3eba..b5c32eef 100644 --- a/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4560_Bloomin' Ocean.json +++ b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4560_Bloomin' Ocean.json @@ -1,7 +1,6 @@ { "$schema": "https://carvel.li/questionable/quest-1.0", "Author": "liza", - "Disabled": true, "QuestSequence": [ { "Sequence": 0, @@ -21,7 +20,122 @@ { "Sequence": 1, "Steps": [ - + { + "Position": { + "X": -611.4443, + "Y": 4.030203, + "Z": 520.76807 + }, + "TerritoryId": 957, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 2012880, + "Position": { + "X": -669.4896, + "Y": -36.42328, + "Z": 522.6367 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "Fly": true, + "DisableNavmesh": true, + "RequiredQuestVariables": [ + null, + [ + { + "Low": 1 + }, + { + "Low": 4 + } + ], + null, + null, + null, + null + ] + }, + { + "DataId": 2012881, + "Position": { + "X": -652.4605, + "Y": -31.784546, + "Z": 554.46704 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "Fly": true, + "DisableNavmesh": true, + "RequiredQuestVariables": [ + null, + [ + { + "Low": 2 + }, + { + "Low": 3 + } + ], + null, + null, + null, + null + ] + }, + { + "DataId": 2012882, + "Position": { + "X": -729.9458, + "Y": -38.864807, + "Z": 600.5187 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "Fly": true, + "RequiredQuestVariables": [ + null, + [ + { + "Low": 1 + }, + { + "Low": 3 + } + ], + null, + null, + null, + null + ] + }, + { + "DataId": 2012883, + "Position": { + "X": -746.0593, + "Y": -38.92578, + "Z": 597.0397 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "Fly": true, + "RequiredQuestVariables": [ + null, + [ + { + "Low": 2 + }, + { + "Low": 4 + } + ], + null, + null, + null, + null + ] + } ] }, { @@ -36,6 +150,7 @@ }, "TerritoryId": 957, "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Thavnair - Yedlihmad", "Fly": true } ] diff --git a/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4560_Bloomin' Ocean.md b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4560_Bloomin' Ocean.md new file mode 100644 index 00000000..b1971f61 --- /dev/null +++ b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4560_Bloomin' Ocean.md @@ -0,0 +1,9 @@ +## Bloomin' Ocean + +``` +0 ? 0 0 0 0 + 1 → 2012880 2012882 + 2 → 2012881 2012883 + 3 → 2012881 2012882 + 4 → 2012880 2012883 +``` diff --git a/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4562_Waste Not, Want None of That.json b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4562_Waste Not, Want None of That.json index 20ee2a3d..391185dc 100644 --- a/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4562_Waste Not, Want None of That.json +++ b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4562_Waste Not, Want None of That.json @@ -1,7 +1,6 @@ { "$schema": "https://carvel.li/questionable/quest-1.0", "Author": "liza", - "Disabled": true, "QuestSequence": [ { "Sequence": 0, diff --git a/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4562_Waste Not, Want None of That.md b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4562_Waste Not, Want None of That.md deleted file mode 100644 index 05681950..00000000 --- a/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4562_Waste Not, Want None of That.md +++ /dev/null @@ -1,12 +0,0 @@ -## Seedy Affair - -First NPC: -``` -0 ?? 0 0 0 0 - 32 → 1042390 -``` - -Second NPC: -``` -1 16 0 0 0 64 → 1042389 -``` diff --git a/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Story/4546_A Pachyderm's Promptitude.json b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Story/4546_A Pachyderm's Promptitude.json new file mode 100644 index 00000000..1c161888 --- /dev/null +++ b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Story/4546_A Pachyderm's Promptitude.json @@ -0,0 +1,214 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1042300, + "Position": { + "X": -76.82922, + "Y": 39.986862, + "Z": 309.98706 + }, + "TerritoryId": 957, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2012919, + "Position": { + "X": -464.22522, + "Y": 5.3864136, + "Z": 22.445984 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "AetheryteShortcut": "Thavnair - Great Work" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": -363.06543, + "Y": 55.300343, + "Z": -108.32965 + }, + "StopDistance": 0.25, + "TerritoryId": 957, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 14681 + ], + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1042318, + "Position": { + "X": -360.49445, + "Y": 54.680054, + "Z": -102.9527 + }, + "StopDistance": 7, + "TerritoryId": 957, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1042321, + "Position": { + "X": -522.9725, + "Y": 11.61713, + "Z": 88.97534 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "AetheryteShortcut": "Thavnair - Great Work" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1042322, + "Position": { + "X": -523.36926, + "Y": 10.9199, + "Z": 85.34363 + }, + "TerritoryId": 957, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 1042324, + "Position": { + "X": -558.0072, + "Y": 11.802552, + "Z": 114.03064 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 1042325, + "Position": { + "X": -552.75806, + "Y": 1.120665, + "Z": 23.392029 + }, + "StopDistance": 0.5, + "TerritoryId": 957, + "InteractionType": "Interact", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 1042323, + "Position": { + "X": -480.33875, + "Y": 1.9096844, + "Z": -13.53479 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + } + ] + }, + { + "Sequence": 7, + "Steps": [ + { + "DataId": 1042321, + "Position": { + "X": -522.9725, + "Y": 11.61713, + "Z": 88.97534 + }, + "TerritoryId": 957, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 8, + "Steps": [ + { + "DataId": 1041397, + "Position": { + "X": 402.30408, + "Y": 3.0506973, + "Z": -212.35986 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "AetheryteShortcut": "Thavnair - Palaka's Stand" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1042300, + "Position": { + "X": -76.82922, + "Y": 39.986862, + "Z": 309.98706 + }, + "TerritoryId": 957, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Thavnair - Yedlihmad", + "Fly": true + } + ] + } + ] +} diff --git a/QuestPaths/quest-v1.json b/QuestPaths/quest-v1.json index 124677a9..da4f6ab0 100644 --- a/QuestPaths/quest-v1.json +++ b/QuestPaths/quest-v1.json @@ -188,6 +188,41 @@ "CompletionQuestVariablesFlags": { "$ref": "#/$defs/CompletionFlags" }, + "RequiredQuestVariables": { + "type": "array", + "description": "Certain quests (primarily beast tribes/allied societies) have a RNG element to spawning targets, and the step should be skipped in its entirety if none of the sets below match", + "minItems": 6, + "maxItems": 6, + "items": { + "type": ["array", "null"], + "items": { + "type": [ + "number", + "object" + ], + "properties": { + "High": { + "type": [ + "number", + "null" + ], + "minimum": 0, + "maximum": 15 + }, + "Low": { + "type": [ + "number", + "null" + ], + "minimum": 0, + "maximum": 15 + } + }, + "minimum": 0, + "maximum": 255 + } + } + }, "DelaySecondsAtStart": { "description": "Time to wait before starting", "type": [ @@ -567,6 +602,7 @@ "description": "The action to use", "enum": [ "Esuna", + "Siphon Snout", "Red Gulal", "Yellow Gulal", "Blue Gulal" diff --git a/Questionable.Model/V1/Converter/ActionConverter.cs b/Questionable.Model/V1/Converter/ActionConverter.cs index 1624c18f..216a2551 100644 --- a/Questionable.Model/V1/Converter/ActionConverter.cs +++ b/Questionable.Model/V1/Converter/ActionConverter.cs @@ -7,6 +7,7 @@ public sealed class ActionConverter() : EnumConverter(Values) private static readonly Dictionary Values = new() { { EAction.Esuna, "Esuna" }, + { EAction.SiphonSnout, "Siphon Snout" }, { EAction.RedGulal, "Red Gulal" }, { EAction.YellowGulal, "Yellow Gulal" }, { EAction.BlueGulal, "Blue Gulal" }, diff --git a/Questionable.Model/V1/Converter/QuestWorkConfigConverter.cs b/Questionable.Model/V1/Converter/QuestWorkConfigConverter.cs new file mode 100644 index 00000000..9f6b0e7e --- /dev/null +++ b/Questionable.Model/V1/Converter/QuestWorkConfigConverter.cs @@ -0,0 +1,58 @@ +using System; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace Questionable.Model.V1.Converter; + +public sealed class QuestWorkConfigConverter : JsonConverter +{ + public override QuestWorkValue Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.Number) + return new QuestWorkValue(reader.GetByte()); + + if (reader.TokenType != JsonTokenType.StartObject) + throw new JsonException(); + + byte? high = null, low = null; + while (reader.Read()) + { + switch (reader.TokenType) + { + case JsonTokenType.PropertyName: + string? propertyName = reader.GetString(); + if (propertyName == null || !reader.Read()) + throw new JsonException(); + + switch (propertyName) + { + case nameof(QuestWorkValue.High): + high = reader.GetByte(); + break; + + case nameof(QuestWorkValue.Low): + low = reader.GetByte(); + break; + + default: + throw new JsonException(); + } + + break; + + case JsonTokenType.EndObject: + return new QuestWorkValue(high, low); + + default: + throw new JsonException(); + } + } + + throw new JsonException(); + } + + public override void Write(Utf8JsonWriter writer, QuestWorkValue value, JsonSerializerOptions options) + { + throw new NotImplementedException(); + } +} diff --git a/Questionable.Model/V1/EAction.cs b/Questionable.Model/V1/EAction.cs index c9bb2493..9b266f07 100644 --- a/Questionable.Model/V1/EAction.cs +++ b/Questionable.Model/V1/EAction.cs @@ -7,6 +7,7 @@ namespace Questionable.Model.V1; public enum EAction { Esuna = 7568, + SiphonSnout = 18187, RedGulal = 29382, YellowGulal = 29383, BlueGulal = 29384, @@ -16,6 +17,6 @@ public static class EActionExtensions { public static bool RequiresMount(this EAction action) { - return action is EAction.RedGulal or EAction.YellowGulal or EAction.BlueGulal; + return action is EAction.SiphonSnout or EAction.RedGulal or EAction.YellowGulal or EAction.BlueGulal; } } diff --git a/Questionable.Model/V1/QuestStep.cs b/Questionable.Model/V1/QuestStep.cs index 52793959..337f146a 100644 --- a/Questionable.Model/V1/QuestStep.cs +++ b/Questionable.Model/V1/QuestStep.cs @@ -64,6 +64,7 @@ public sealed class QuestStep public uint? ContentFinderConditionId { get; set; } public IList SkipIf { get; set; } = new List(); + public List?> RequiredQuestVariables { get; set; } = new(); public IList CompletionQuestVariablesFlags { get; set; } = new List(); public IList DialogueChoices { get; set; } = new List(); public IList PointMenuChoices { get; set; } = new List(); diff --git a/Questionable.Model/V1/QuestWorkValue.cs b/Questionable.Model/V1/QuestWorkValue.cs new file mode 100644 index 00000000..7321b2be --- /dev/null +++ b/Questionable.Model/V1/QuestWorkValue.cs @@ -0,0 +1,16 @@ +using System.Text.Json.Serialization; +using Questionable.Model.V1.Converter; + +namespace Questionable.Model.V1; + +[JsonConverter(typeof(QuestWorkConfigConverter))] +public sealed class QuestWorkValue(byte? high, byte? low) +{ + public QuestWorkValue(byte value) + : this((byte)(value >> 4), (byte)(value & 0xF)) + { + } + + public byte? High { get; set; } = high; + public byte? Low { get; set; } = low; +} diff --git a/Questionable/Controller/Steps/Shared/SkipCondition.cs b/Questionable/Controller/Steps/Shared/SkipCondition.cs index edd2b612..b509c9c6 100644 --- a/Questionable/Controller/Steps/Shared/SkipCondition.cs +++ b/Questionable/Controller/Steps/Shared/SkipCondition.cs @@ -26,7 +26,9 @@ internal static class SkipCondition var relevantConditions = step.SkipIf.Where(x => x != ESkipCondition.AetheryteShortcutIfInSameTerritory).ToList(); - if (relevantConditions.Count == 0 && step.CompletionQuestVariablesFlags.Count == 0) + if (relevantConditions.Count == 0 && + step.CompletionQuestVariablesFlags.Count == 0 && + step.RequiredQuestVariables.Count == 0) return null; return serviceProvider.GetRequiredService() @@ -100,7 +102,8 @@ internal static class SkipCondition InventoryManager* inventoryManager = InventoryManager.Instance(); if (inventoryManager->GetInventoryItemCount(Step.ItemId.Value) == 0) { - logger.LogInformation("Skipping step, no item with itemId {ItemId} in inventory", Step.ItemId.Value); + logger.LogInformation("Skipping step, no item with itemId {ItemId} in inventory", + Step.ItemId.Value); return true; } } @@ -124,11 +127,20 @@ internal static class SkipCondition } QuestWork? questWork = gameFunctions.GetQuestEx(QuestId); - if (questWork != null && - QuestWorkUtils.MatchesQuestWork(Step.CompletionQuestVariablesFlags, questWork.Value, true)) + if (questWork != null) { - logger.LogInformation("Skipping step, as quest variables match"); - return true; + if (QuestWorkUtils.MatchesQuestWork(Step.CompletionQuestVariablesFlags, questWork.Value, true)) + { + logger.LogInformation("Skipping step, as quest variables match"); + return true; + } + + if (!QuestWorkUtils.MatchesRequiredQuestWorkConfig(Step.RequiredQuestVariables, questWork.Value, + logger)) + { + logger.LogInformation("Skipping step, as required variables do not match"); + return true; + } } return false; diff --git a/Questionable/Controller/Utils/QuestWorkUtils.cs b/Questionable/Controller/Utils/QuestWorkUtils.cs index 03ddced0..360007ed 100644 --- a/Questionable/Controller/Utils/QuestWorkUtils.cs +++ b/Questionable/Controller/Utils/QuestWorkUtils.cs @@ -2,6 +2,9 @@ using System.Collections.Generic; using System.Linq; using FFXIVClientStructs.FFXIV.Application.Network.WorkDefinitions; +using Microsoft.Extensions.Logging; +using Questionable.Controller.Steps.Shared; +using Questionable.Model.V1; namespace Questionable.Controller.Utils; @@ -45,4 +48,42 @@ internal static class QuestWorkUtils return true; } + + public static bool MatchesRequiredQuestWorkConfig(List?> requiredQuestVariables, + QuestWork questWork, ILogger logger) + { + if (requiredQuestVariables.Count != 6 || requiredQuestVariables.All(x => x == null || x.Count == 0)) + { + logger.LogInformation("No RQW defined"); + return true; + } + + for (int i = 0; i < 6; ++i) + { + if (requiredQuestVariables[i] == null) + { + logger.LogInformation("No RQW {Index} defined", i); + continue; + } + + byte high = (byte)(questWork.Variables[i] >> 4); + byte low = (byte)(questWork.Variables[i] & 0xF); + + foreach (QuestWorkValue expectedValue in requiredQuestVariables[i]!) + { + logger.LogInformation("H: {ExpectedHigh} - {ActualHigh}, L: {ExpectedLow} - {ActualLow}", + expectedValue.High, high, expectedValue.Low, low); + if (expectedValue.High != null && expectedValue.High != high) + continue; + + if (expectedValue.Low != null && expectedValue.Low != low) + continue; + + return true; + } + } + + logger.LogInformation("Should execute step"); + return false; + } }