Gridania start, various quest fixes, automatically start GC quest, automatically...
authorLiza Carvelli <liza@carvel.li>
Sat, 15 Jun 2024 12:12:32 +0000 (14:12 +0200)
committerLiza Carvelli <liza@carvel.li>
Sat, 15 Jun 2024 12:12:32 +0000 (14:12 +0200)
55 files changed:
QuestPathGenerator/QuestSourceGenerator.cs
QuestPaths/ARealmReborn/MSQ-1/Gridania/129_Spirithold Broken.json [new file with mode: 0644]
QuestPaths/ARealmReborn/MSQ-1/Gridania/161_Leia's Legacy.json [new file with mode: 0644]
QuestPaths/ARealmReborn/MSQ-1/Gridania/175_Surveying the Damage.json [new file with mode: 0644]
QuestPaths/ARealmReborn/MSQ-1/Gridania/176_On to Bentbranch.json [new file with mode: 0644]
QuestPaths/ARealmReborn/MSQ-1/Gridania/201_Passing Muster.json [new file with mode: 0644]
QuestPaths/ARealmReborn/MSQ-1/Gridania/28_To the Bannock.json [new file with mode: 0644]
QuestPaths/ARealmReborn/MSQ-1/Gridania/376_You Shall Not Trespass.json [new file with mode: 0644]
QuestPaths/ARealmReborn/MSQ-1/Gridania/377_Don't Look Down.json [new file with mode: 0644]
QuestPaths/ARealmReborn/MSQ-1/Gridania/379_In the Grim Darkness of the Forest.json [new file with mode: 0644]
QuestPaths/ARealmReborn/MSQ-1/Gridania/380_Threat Level Elevated.json [new file with mode: 0644]
QuestPaths/ARealmReborn/MSQ-1/Gridania/381_Migrant Marauders.json [new file with mode: 0644]
QuestPaths/ARealmReborn/MSQ-1/Gridania/384_A Hearer is Often Late.json [new file with mode: 0644]
QuestPaths/ARealmReborn/MSQ-1/Gridania/3854_Eggs over Queasy.json [new file with mode: 0644]
QuestPaths/ARealmReborn/MSQ-1/Gridania/3855_A Soldier's Breakfast.json [new file with mode: 0644]
QuestPaths/ARealmReborn/MSQ-1/Gridania/387_Salvaging the Scene.json [new file with mode: 0644]
QuestPaths/ARealmReborn/MSQ-1/Gridania/39_Coming to Gridania.json [new file with mode: 0644]
QuestPaths/ARealmReborn/MSQ-1/Gridania/445_Chasing Shadows.json [new file with mode: 0644]
QuestPaths/ARealmReborn/MSQ-1/Gridania/446_Dread Is in the Air.json [new file with mode: 0644]
QuestPaths/ARealmReborn/MSQ-1/Gridania/447_To Guard a Guardian.json [new file with mode: 0644]
QuestPaths/ARealmReborn/MSQ-1/Gridania/448_Festive Endeavors.json [new file with mode: 0644]
QuestPaths/ARealmReborn/MSQ-1/Gridania/449_Renewing the Covenant.json [new file with mode: 0644]
QuestPaths/ARealmReborn/MSQ-1/Gridania/507_The Gridanian Envoy.json [new file with mode: 0644]
QuestPaths/ARealmReborn/MSQ-1/Gridania/85_LNC_Close to Home.json [new file with mode: 0644]
QuestPaths/ARealmReborn/MSQ-1/Shared/245_It's Probably Pirates.json
QuestPaths/ARealmReborn/MSQ-1/Shared/272_Life, Materia and Everything.json
QuestPaths/ARealmReborn/MSQ-1/Shared/509_The Scions of the Seventh Dawn.json
QuestPaths/ARealmReborn/MSQ-1/Shared/510_A Wild Rose By Any Other Name.json
QuestPaths/ARealmReborn/MSQ-1/Shared/511_A Hero in the Making.json
QuestPaths/ARealmReborn/MSQ-1/Shared/618_Unsolved Mystery.json
QuestPaths/ARealmReborn/MSQ-1/Shared/660_Into a Copper Hell.json
QuestPaths/ARealmReborn/MSQ-1/Shared/677_Fire in the Gloom.json
QuestPaths/ARealmReborn/MSQ-1/Shared/680_The Company You Keep (Twin Adders).json [new file with mode: 0644]
QuestPaths/ARealmReborn/MSQ-1/Shared/681_The Company You Keep (Maelstrom).json
QuestPaths/ARealmReborn/MSQ-1/Shared/683_Wood's Will Be Done.json [new file with mode: 0644]
QuestPaths/ARealmReborn/MSQ-1/Shared/700_My Little Chocobo (Twin Adder).json [new file with mode: 0644]
QuestPaths/ARealmReborn/MSQ-1/Shared/701_My Little Chocobo (Maelstrom).json [new file with mode: 0644]
QuestPaths/ARealmReborn/MSQ-2/.gitkeep [deleted file]
QuestPaths/ARealmReborn/MSQ-2/A2/3856_We Come in Peace.json [new file with mode: 0644]
QuestPaths/quest-v1.json
Questionable.Model/V1/Converter/SkipConditionConverter.cs
Questionable.Model/V1/ESkipCondition.cs
Questionable/Configuration.cs
Questionable/Controller/GameUiController.cs
Questionable/Controller/MovementController.cs
Questionable/Controller/QuestController.cs
Questionable/Controller/Steps/BaseFactory/AetheryteShortcut.cs
Questionable/Controller/Steps/BaseFactory/SkipCondition.cs
Questionable/Controller/Steps/BaseFactory/WaitAtEnd.cs
Questionable/Controller/Steps/InteractionFactory/EquipItem.cs
Questionable/Controller/Steps/InteractionFactory/UseItem.cs
Questionable/GameFunctions.cs
Questionable/Questionable.csproj
Questionable/Windows/ConfigWindow.cs
Questionable/Windows/DebugWindow.cs

index 9bc6cc29077cabaa3bea34dbed0e12a4404a78c4..8d2f37edb9b4baaefbd4e0169b01343261175acd 100644 (file)
@@ -48,6 +48,9 @@ public class QuestSourceGenerator : ISourceGenerator
             quests.Add((id, quest));
         }
 
+        if (quests.Count == 0)
+            return;
+
         quests = quests.OrderBy(x => x.Item1).ToList();
 
         var code =
diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/129_Spirithold Broken.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/129_Spirithold Broken.json
new file mode 100644 (file)
index 0000000..6f83e49
--- /dev/null
@@ -0,0 +1,210 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "TerritoryBlacklist": [
+    225
+  ],
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1000421,
+          "Position": {
+            "X": 98.25281,
+            "Y": -8,
+            "Z": -78.446655
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1000465,
+          "Position": {
+            "X": 298.63428,
+            "Y": 9.999997,
+            "Z": 119.035645
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 1000465,
+          "Position": {
+            "X": 298.63428,
+            "Y": 9.999997,
+            "Z": 119.035645
+          },
+          "TerritoryId": 148,
+          "InteractionType": "WaitForManualProgress",
+          "Comment": "Manual Quest Progress (very combat heavy)",
+          "$": "TODO Remove later"
+        },
+        {
+          "DataId": 1000512,
+          "Position": {
+            "X": 311.69592,
+            "Y": 14.8470745,
+            "Z": 164.47693
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact",
+          "Disabled": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        },
+        {
+          "DataId": 1000513,
+          "Position": {
+            "X": 303.8833,
+            "Y": 15.899703,
+            "Z": 160.87585
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact",
+          "Disabled": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
+        },
+        {
+          "DataId": 1000514,
+          "Position": {
+            "X": 296.1012,
+            "Y": 15.999987,
+            "Z": 171.4961
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact",
+          "Disabled": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ]
+        },
+        {
+          "DataId": 1000515,
+          "Position": {
+            "X": 291.21838,
+            "Y": 19.86808,
+            "Z": 175.21924
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact",
+          "Disabled": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            16
+          ]
+        },
+        {
+          "DataId": 1000516,
+          "Position": {
+            "X": 284.65698,
+            "Y": 21.97319,
+            "Z": 188.18945
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact",
+          "Disabled": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            8
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "DataId": 1000740,
+          "Position": {
+            "X": 260.18152,
+            "Y": 24.000002,
+            "Z": 192.2179
+          },
+          "TerritoryId": 148,
+          "InteractionType": "SinglePlayerDuty"
+        }
+      ]
+    },
+    {
+      "Sequence": 5,
+      "Steps": [
+        {
+          "Position": {
+            "X": 319.9492,
+            "Y": 13.866494,
+            "Z": 156.2647
+          },
+          "TerritoryId": 148,
+          "InteractionType": "WalkTo"
+        },
+        {
+          "DataId": 1000465,
+          "Position": {
+            "X": 298.63428,
+            "Y": 9.999997,
+            "Z": 119.035645
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1000100,
+          "Position": {
+            "X": 23.819275,
+            "Y": -8,
+            "Z": 115.92273
+          },
+          "TerritoryId": 132,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Gridania",
+          "AethernetShortcut": [
+            "[Gridania] Aetheryte Plaza",
+            "[Gridania] Airship Landing"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/161_Leia's Legacy.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/161_Leia's Legacy.json
new file mode 100644 (file)
index 0000000..04f87db
--- /dev/null
@@ -0,0 +1,165 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1000471,
+          "Position": {
+            "X": -60.471558,
+            "Y": 0.19999865,
+            "Z": 6.301941
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1000484,
+          "Position": {
+            "X": 2.0598755,
+            "Y": -7.9139543,
+            "Z": -22.171448
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ]
+        },
+        {
+          "DataId": 1000476,
+          "Position": {
+            "X": 27.0542,
+            "Y": -6.881897,
+            "Z": 14.145081
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        },
+        {
+          "DataId": 1000483,
+          "Position": {
+            "X": 85.496216,
+            "Y": -6.0870457,
+            "Z": 67.00232
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 1000471,
+          "Position": {
+            "X": -60.471558,
+            "Y": 0.19999865,
+            "Z": 6.301941
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "Position": {
+            "X": 9.630515,
+            "Y": -22.580793,
+            "Z": 242.32327
+          },
+          "TerritoryId": 148,
+          "InteractionType": "WalkTo"
+        },
+        {
+          "DataId": 1003002,
+          "Position": {
+            "X": -189.13562,
+            "Y": -26.70127,
+            "Z": 295.52136
+          },
+          "TerritoryId": 148,
+          "InteractionType": "SinglePlayerDuty"
+        }
+      ]
+    },
+    {
+      "Sequence": 4,
+      "Steps": [
+        {
+          "DataId": 1003002,
+          "Position": {
+            "X": -189.13562,
+            "Y": -26.70127,
+            "Z": 295.52136
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 5,
+      "Steps": [
+        {
+          "DataId": 1000471,
+          "Position": {
+            "X": -60.471558,
+            "Y": 0.19999865,
+            "Z": 6.301941
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Central Shroud - Bentbranch Meadows"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1000471,
+          "Position": {
+            "X": -60.471558,
+            "Y": 0.19999865,
+            "Z": 6.301941
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/175_Surveying the Damage.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/175_Surveying the Damage.json
new file mode 100644 (file)
index 0000000..9da7388
--- /dev/null
@@ -0,0 +1,117 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1000449,
+          "Position": {
+            "X": 201.83093,
+            "Y": -5.5419664,
+            "Z": -107.25574
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Comment": "Very likely this needs manual combat and/or manual continues",
+      "Steps": [
+        {
+          "DataId": 2000141,
+          "Position": {
+            "X": 179.4613,
+            "Y": -10.666138,
+            "Z": 99.56506
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ],
+          "$": "QuestVariables if done first: 17 0 16 0 0 128"
+        },
+        {
+          "DataId": 2000147,
+          "Position": {
+            "X": 168.07812,
+            "Y": -12.008911,
+            "Z": 120.80554
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ],
+          "$": "QuestVariables if done first: 17 16 17 0 0 192"
+        },
+        {
+          "DataId": 2000149,
+          "Position": {
+            "X": 154.0398,
+            "Y": -10.75769,
+            "Z": 120.3479
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            16
+          ],
+          "$": "QuestVariables if done first: 33 17 17 16 0 208"
+        },
+        {
+          "DataId": 2000148,
+          "Position": {
+            "X": 126.14636,
+            "Y": -12.008911,
+            "Z": 142.35144
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1000685,
+          "Position": {
+            "X": 287.92236,
+            "Y": -3.297,
+            "Z": -32.6391
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/176_On to Bentbranch.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/176_On to Bentbranch.json
new file mode 100644 (file)
index 0000000..db4e89f
--- /dev/null
@@ -0,0 +1,48 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1000100,
+          "Position": {
+            "X": 23.819275,
+            "Y": -8,
+            "Z": 115.92273
+          },
+          "TerritoryId": 132,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 3,
+          "Position": {
+            "X": 13.076904,
+            "Y": 0.56451416,
+            "Z": 35.90442
+          },
+          "StopDistance": 10,
+          "TerritoryId": 148,
+          "InteractionType": "AttuneAetheryte",
+          "AethernetShortcut": ["[Gridania] Aetheryte Plaza", "[Gridania] Blue Badger Gate (Central Shroud)"]
+        },
+        {
+          "DataId": 1000470,
+          "Position": {
+            "X": -59.006653,
+            "Y": -0.010835781,
+            "Z": 26.41333
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/201_Passing Muster.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/201_Passing Muster.json
new file mode 100644 (file)
index 0000000..55d8a1b
--- /dev/null
@@ -0,0 +1,37 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1000421,
+          "Position": {
+            "X": 98.25281,
+            "Y": -8,
+            "Z": -78.446655
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1000421,
+          "Position": {
+            "X": 98.25281,
+            "Y": -8,
+            "Z": -78.446655
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact",
+          "Comment": "All starting gear (except the hat) is ilvl 5 already"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/28_To the Bannock.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/28_To the Bannock.json
new file mode 100644 (file)
index 0000000..e57f082
--- /dev/null
@@ -0,0 +1,46 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1000100,
+          "Position": {
+            "X": 23.819275,
+            "Y": -8,
+            "Z": 115.92273
+          },
+          "TerritoryId": 132,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "Position": {
+            "X": 158.06026,
+            "Y": -12.97808,
+            "Z": 158.08466
+          },
+          "TerritoryId": 132,
+          "InteractionType": "WalkTo",
+          "TargetTerritoryId": 148
+        },
+        {
+          "DataId": 1000421,
+          "Position": {
+            "X": 98.25281,
+            "Y": -8,
+            "Z": -78.446655
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/376_You Shall Not Trespass.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/376_You Shall Not Trespass.json
new file mode 100644 (file)
index 0000000..504b366
--- /dev/null
@@ -0,0 +1,87 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1000470,
+          "Position": {
+            "X": -59.006653,
+            "Y": -0.010835781,
+            "Z": 26.41333
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "Position": {
+            "X": -61.749943,
+            "Y": 0.9481318,
+            "Z": -38.52144
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Jump",
+          "JumpDestination": {
+            "Position": {
+              "X": -67.083466,
+              "Y": -4.478065,
+              "Z": -45.204926
+            },
+            "StopDistance": 3
+          }
+        },
+        {
+          "DataId": 1000748,
+          "Position": {
+            "X": -125.230774,
+            "Y": 4.1573725,
+            "Z": -43.595093
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "Position": {
+            "X": -171.87439,
+            "Y": 1.7183347,
+            "Z": -70.586975
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Combat",
+          "EnemySpawnType": "OverworldEnemies",
+          "KillEnemyDataIds": [
+            771
+          ],
+          "Comment": "Kill Qiqirn manually"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1000748,
+          "Position": {
+            "X": -125.230774,
+            "Y": 4.1573725,
+            "Z": -43.595093
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/377_Don't Look Down.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/377_Don't Look Down.json
new file mode 100644 (file)
index 0000000..e662df8
--- /dev/null
@@ -0,0 +1,197 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1000435,
+          "Position": {
+            "X": -127.06189,
+            "Y": 4.1490583,
+            "Z": -44.296997
+          },
+          "StopDistance": 5,
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 2000750,
+          "Position": {
+            "X": -151.26276,
+            "Y": 14.358704,
+            "Z": -73.014465
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ]
+        },
+        {
+          "DataId": 2000749,
+          "Position": {
+            "X": -164.11078,
+            "Y": 23.025818,
+            "Z": -86.167725
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
+        },
+        {
+          "Position": {
+            "X": -180.18181,
+            "Y": 31.66525,
+            "Z": -91.84381
+          },
+          "TerritoryId": 148,
+          "InteractionType": "WalkTo",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            -128
+          ]
+        },
+        {
+          "Position": {
+            "X": -184.41872,
+            "Y": 29.940958,
+            "Z": -93.809525
+          },
+          "TerritoryId": 148,
+          "InteractionType": "WalkTo",
+          "DisableNavmesh": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            -128
+          ]
+        },
+        {
+          "DataId": 2000748,
+          "Position": {
+            "X": -189.25769,
+            "Y": 30.44165,
+            "Z": -98.83276
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact",
+          "DisableNavmesh": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        },
+        {
+          "Position": {
+            "X": -179.84062,
+            "Y": 31.476957,
+            "Z": -91.05707
+          },
+          "TerritoryId": 148,
+          "InteractionType": "WalkTo",
+          "DisableNavmesh": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            -16
+          ]
+        },
+        {
+          "Position": {
+            "X": -171.76294,
+            "Y": 23.022184,
+            "Z": -76.32822
+          },
+          "TerritoryId": 148,
+          "InteractionType": "WalkTo",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            -16
+          ]
+        },
+        {
+          "DataId": 2000751,
+          "Position": {
+            "X": -169.3294,
+            "Y": 18.600708,
+            "Z": -72.129456
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact",
+          "DisableNavmesh": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            16
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "Position": {
+            "X": -166.56161,
+            "Y": 0.63666093,
+            "Z": -61.089085
+          },
+          "TerritoryId": 148,
+          "InteractionType": "WalkTo",
+          "DisableNavmesh": true,
+          "Comment": "Jumping back up isn't trivial"
+        },
+        {
+          "DataId": 1000436,
+          "Position": {
+            "X": -193.22504,
+            "Y": 56.264572,
+            "Z": -116.47211
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/379_In the Grim Darkness of the Forest.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/379_In the Grim Darkness of the Forest.json
new file mode 100644 (file)
index 0000000..c9de3ec
--- /dev/null
@@ -0,0 +1,66 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1000436,
+          "Position": {
+            "X": -193.22504,
+            "Y": 56.264572,
+            "Z": -116.47211
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1000748,
+          "Position": {
+            "X": -125.230774,
+            "Y": 4.1573725,
+            "Z": -43.595093
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 2000689,
+          "Position": {
+            "X": -95.47571,
+            "Y": 3.4942627,
+            "Z": -150.80493
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1000748,
+          "Position": {
+            "X": -125.230774,
+            "Y": 4.1573725,
+            "Z": -43.595093
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/380_Threat Level Elevated.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/380_Threat Level Elevated.json
new file mode 100644 (file)
index 0000000..9afa66d
--- /dev/null
@@ -0,0 +1,66 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1000748,
+          "Position": {
+            "X": -125.230774,
+            "Y": 4.1573725,
+            "Z": -43.595093
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1001280,
+          "Position": {
+            "X": 89.28052,
+            "Y": -6.351089,
+            "Z": -121.96539
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 1000483,
+          "Position": {
+            "X": 85.496216,
+            "Y": -6.0870457,
+            "Z": 67.00232
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1000741,
+          "Position": {
+            "X": -66.7583,
+            "Y": 0.2,
+            "Z": 11.36792
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/381_Migrant Marauders.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/381_Migrant Marauders.json
new file mode 100644 (file)
index 0000000..dde9cfe
--- /dev/null
@@ -0,0 +1,55 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1000741,
+          "Position": {
+            "X": -66.7583,
+            "Y": 0.2,
+            "Z": 11.36792
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 2001006,
+          "Position": {
+            "X": 99.65662,
+            "Y": -15.732117,
+            "Z": 193.01135
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Combat",
+          "EnemySpawnType": "AfterInteraction",
+          "KillEnemyDataIds": [
+            12
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1000491,
+          "Position": {
+            "X": 47.958984,
+            "Y": -24,
+            "Z": 228.5343
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/384_A Hearer is Often Late.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/384_A Hearer is Often Late.json
new file mode 100644 (file)
index 0000000..0511deb
--- /dev/null
@@ -0,0 +1,51 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1000491,
+          "Position": {
+            "X": 47.958984,
+            "Y": -24,
+            "Z": 228.5343
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1002932,
+          "Position": {
+            "X": -65.049255,
+            "Y": -36.79766,
+            "Z": 477.59204
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1000503,
+          "Position": {
+            "X": 178.33215,
+            "Y": -32.015224,
+            "Z": 333.30273
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/3854_Eggs over Queasy.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/3854_Eggs over Queasy.json
new file mode 100644 (file)
index 0000000..ac7ea3c
--- /dev/null
@@ -0,0 +1,55 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1000421,
+          "Position": {
+            "X": 98.25281,
+            "Y": -8,
+            "Z": -78.446655
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "Position": {
+            "X": 194.08282,
+            "Y": -8.422037,
+            "Z": -47.295006
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Combat",
+          "EnemySpawnType": "OverworldEnemies",
+          "KillEnemyDataIds": [
+            43
+          ],
+          "Comment": "Kill Chigoes manually"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1000449,
+          "Position": {
+            "X": 201.83093,
+            "Y": -5.5419664,
+            "Z": -107.25574
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/3855_A Soldier's Breakfast.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/3855_A Soldier's Breakfast.json
new file mode 100644 (file)
index 0000000..ed45022
--- /dev/null
@@ -0,0 +1,79 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1000685,
+          "Position": {
+            "X": 287.92236,
+            "Y": -3.297,
+            "Z": -32.6391
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Comment": "TODO Figure out quest flags if picking up egg first OR doing the combat first",
+      "Steps": [
+        {
+          "DataId": 2000010,
+          "Position": {
+            "X": 480.88794,
+            "Y": 30.746826,
+            "Z": -49.729187
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        },
+        {
+          "Position": {
+            "X": 480.88794,
+            "Y": 30.746826,
+            "Z": -49.729187
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Combat",
+          "EnemySpawnType": "OverworldEnemies",
+          "KillEnemyDataIds": [142],
+          "Comment": "Depending on how many enemies you fought on the way to the egg, this step could be optional"
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 1000685,
+          "Position": {
+            "X": 287.92236,
+            "Y": -3.297,
+            "Z": -32.6391
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1000408,
+          "Position": {
+            "X": 106.85889,
+            "Y": -8,
+            "Z": -75.669556
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/387_Salvaging the Scene.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/387_Salvaging the Scene.json
new file mode 100644 (file)
index 0000000..ad35530
--- /dev/null
@@ -0,0 +1,66 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1000503,
+          "Position": {
+            "X": 178.33215,
+            "Y": -32.015224,
+            "Z": 333.30273
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 2001018,
+          "Position": {
+            "X": 155.47412,
+            "Y": -23.66681,
+            "Z": 490.74524
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Combat",
+          "EnemySpawnType": "AutoOnEnterArea",
+          "KillEnemyDataIds": [
+            26
+          ]
+        },
+        {
+          "DataId": 2001016,
+          "Position": {
+            "X": 152.60547,
+            "Y": -23.758362,
+            "Z": 494.71265
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1000470,
+          "Position": {
+            "X": -59.006653,
+            "Y": -0.010835781,
+            "Z": 26.41333
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Central Shroud - Bentbranch Meadows"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/39_Coming to Gridania.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/39_Coming to Gridania.json
new file mode 100644 (file)
index 0000000..ae0d54a
--- /dev/null
@@ -0,0 +1,36 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1001148,
+          "Position": {
+            "X": 117.112915,
+            "Y": -12.506256,
+            "Z": 143.63306
+          },
+          "TerritoryId": 183,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1001140,
+          "Position": {
+            "X": 23.788818,
+            "Y": -8,
+            "Z": 115.861694
+          },
+          "TerritoryId": 183,
+          "InteractionType": "Interact"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/445_Chasing Shadows.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/445_Chasing Shadows.json
new file mode 100644 (file)
index 0000000..70c7c52
--- /dev/null
@@ -0,0 +1,69 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "TerritoryBlacklist": [
+    233
+  ],
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1000421,
+          "Position": {
+            "X": 98.25281,
+            "Y": -8,
+            "Z": -78.446655
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 2000953,
+          "Position": {
+            "X": 323.5979,
+            "Y": 0.3508911,
+            "Z": -309.55975
+          },
+          "TerritoryId": 148,
+          "InteractionType": "SinglePlayerDuty"
+        }
+      ]
+    },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "DataId": 2001194,
+          "Position": {
+            "X": 323.627,
+            "Y": 0.3168333,
+            "Z": -309.5412
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1000421,
+          "Position": {
+            "X": 98.25281,
+            "Y": -8,
+            "Z": -78.446655
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/446_Dread Is in the Air.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/446_Dread Is in the Air.json
new file mode 100644 (file)
index 0000000..07e7791
--- /dev/null
@@ -0,0 +1,41 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1000471,
+          "Position": {
+            "X": -60.471558,
+            "Y": 0.19999865,
+            "Z": 6.301941
+          },
+          "TerritoryId": 148,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1000100,
+          "Position": {
+            "X": 23.819275,
+            "Y": -8,
+            "Z": 115.92273
+          },
+          "TerritoryId": 132,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Gridania",
+          "AethernetShortcut": [
+            "[Gridania] Aetheryte Plaza",
+            "[Gridania] Airship Landing"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/447_To Guard a Guardian.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/447_To Guard a Guardian.json
new file mode 100644 (file)
index 0000000..31deec4
--- /dev/null
@@ -0,0 +1,118 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1000100,
+          "Position": {
+            "X": 23.819275,
+            "Y": -8,
+            "Z": 115.92273
+          },
+          "TerritoryId": 132,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "Position": {
+            "X": 49.65071,
+            "Y": -8.046952,
+            "Z": 102.32186
+          },
+          "TerritoryId": 132,
+          "InteractionType": "WalkTo",
+          "$": "New Gridania Navmesh workaround"
+        },
+        {
+          "DataId": 1000423,
+          "Position": {
+            "X": 232.04382,
+            "Y": 1.999974,
+            "Z": 45.578613
+          },
+          "TerritoryId": 132,
+          "InteractionType": "Interact",
+          "AethernetShortcut": ["[Gridania] Aetheryte Plaza", "[Gridania] Archers' Guild"],
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_MANFST007_00447_Q1_000_1",
+              "Yes": true
+            }
+          ]
+        },
+        {
+          "DataId": 1003061,
+          "Position": {
+            "X": -0.015319824,
+            "Y": 0.500025,
+            "Z": -4.3793945
+          },
+          "StopDistance": 7,
+          "TerritoryId": 204,
+          "InteractionType": "Interact",
+          "DisableNavmesh": true
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 1000456,
+          "Position": {
+            "X": -303.5172,
+            "Y": 21.902342,
+            "Z": 127.45862
+          },
+          "TerritoryId": 148,
+          "InteractionType": "SinglePlayerDuty",
+          "AetheryteShortcut": "Central Shroud - Bentbranch Meadows"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1000423,
+          "Position": {
+            "X": 232.04382,
+            "Y": 1.999974,
+            "Z": 45.578613
+          },
+          "TerritoryId": 132,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Gridania",
+          "AethernetShortcut": ["[Gridania] Aetheryte Plaza", "[Gridania] Archers' Guild"],
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_MANFST007_00447_Q1_000_1",
+              "Yes": true
+            }
+          ]
+        },
+        {
+          "DataId": 1003061,
+          "Position": {
+            "X": -0.015319824,
+            "Y": 0.500025,
+            "Z": -4.3793945
+          },
+          "StopDistance": 7,
+          "TerritoryId": 204,
+          "InteractionType": "Interact",
+          "DisableNavmesh": true
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/448_Festive Endeavors.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/448_Festive Endeavors.json
new file mode 100644 (file)
index 0000000..f2b9a53
--- /dev/null
@@ -0,0 +1,102 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1003061,
+          "Position": {
+            "X": -0.015319824,
+            "Y": 0.500025,
+            "Z": -4.3793945
+          },
+          "StopDistance": 7,
+          "TerritoryId": 204,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 2001215,
+          "Position": {
+            "X": 0.002457563,
+            "Y": 1.052062,
+            "Z": 9.820032
+          },
+          "TerritoryId": 204,
+          "InteractionType": "Interact",
+          "TargetTerritoryId": 132
+        },
+        {
+          "DataId": 1000100,
+          "Position": {
+            "X": 23.819275,
+            "Y": -8,
+            "Z": 115.92273
+          },
+          "TerritoryId": 132,
+          "InteractionType": "Interact",
+          "AethernetShortcut": [
+            "[Gridania] Archers' Guild",
+            "[Gridania] Airship Landing"
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "Position": {
+            "X": 49.65071,
+            "Y": -8.046952,
+            "Z": 102.32186
+          },
+          "TerritoryId": 132,
+          "InteractionType": "WalkTo",
+          "$": "New Gridania Navmesh workaround"
+        },
+        {
+          "DataId": 1000153,
+          "Position": {
+            "X": -44.87683,
+            "Y": -1.2500024,
+            "Z": 56.839844
+          },
+          "TerritoryId": 132,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "Position": {
+            "X": 49.65071,
+            "Y": -8.046952,
+            "Z": 102.32186
+          },
+          "TerritoryId": 132,
+          "InteractionType": "WalkTo",
+          "$": "New Gridania Navmesh workaround"
+        },
+        {
+          "DataId": 1000100,
+          "Position": {
+            "X": 23.819275,
+            "Y": -8,
+            "Z": 115.92273
+          },
+          "TerritoryId": 132,
+          "InteractionType": "Interact"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/449_Renewing the Covenant.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/449_Renewing the Covenant.json
new file mode 100644 (file)
index 0000000..843634c
--- /dev/null
@@ -0,0 +1,112 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1000100,
+          "Position": {
+            "X": 23.819275,
+            "Y": -8,
+            "Z": 115.92273
+          },
+          "TerritoryId": 132,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "TerritoryId": 132,
+          "InteractionType": "EquipItem",
+          "ItemId": 2651
+        },
+        {
+          "Position": {
+            "X": 49.65071,
+            "Y": -8.046952,
+            "Z": 102.32186
+          },
+          "TerritoryId": 132,
+          "InteractionType": "WalkTo",
+          "$": "New Gridania Navmesh workaround"
+        },
+        {
+          "DataId": 1000286,
+          "Position": {
+            "X": -53.574463,
+            "Y": 7.2025366,
+            "Z": -118.36426
+          },
+          "TerritoryId": 133,
+          "InteractionType": "Interact",
+          "AethernetShortcut": [
+            "[Gridania] Aetheryte Plaza",
+            "[Gridania] Mih Khetto's Amphitheatre"
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 2000087,
+          "Position": {
+            "X": 0.015197754,
+            "Y": 1.449585,
+            "Z": 7.7057495
+          },
+          "TerritoryId": 179,
+          "InteractionType": "Interact",
+          "TargetTerritoryId": 132
+        },
+        {
+          "Position": {
+            "X": 49.65071,
+            "Y": -8.046952,
+            "Z": 102.32186
+          },
+          "TerritoryId": 132,
+          "InteractionType": "WalkTo",
+          "$": "New Gridania Navmesh workaround"
+        },
+        {
+          "DataId": 1000460,
+          "Position": {
+            "X": -159.41101,
+            "Y": 4.054107,
+            "Z": -4.1047363
+          },
+          "TerritoryId": 133,
+          "InteractionType": "Interact",
+          "AethernetShortcut": [
+            "[Gridania] Aetheryte Plaza",
+            "[Gridania] Conjurers' Guild"
+          ],
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_MANFST009_00449_Q2_000_1",
+              "Yes": true
+            }
+          ]
+        },
+        {
+          "DataId": 1003027,
+          "Position": {
+            "X": 4.8981323,
+            "Y": -1.92944,
+            "Z": -0.19836426
+          },
+          "TerritoryId": 205,
+          "InteractionType": "Interact"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/507_The Gridanian Envoy.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/507_The Gridanian Envoy.json
new file mode 100644 (file)
index 0000000..ad1d110
--- /dev/null
@@ -0,0 +1,383 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1003027,
+          "Position": {
+            "X": 4.8981323,
+            "Y": -1.92944,
+            "Z": -0.19836426
+          },
+          "TerritoryId": 205,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 2001216,
+          "Position": {
+            "X": 45.87172,
+            "Y": 7.763558,
+            "Z": 47.41661
+          },
+          "TerritoryId": 205,
+          "InteractionType": "Interact",
+          "TargetTerritoryId": 133
+        },
+        {
+          "DataId": 1000100,
+          "Position": {
+            "X": 23.819275,
+            "Y": -8,
+            "Z": 115.92273
+          },
+          "TerritoryId": 132,
+          "InteractionType": "Interact",
+          "AethernetShortcut": [
+            "[Gridania] Conjurers' Guild",
+            "[Gridania] Airship Landing"
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 1000106,
+          "Position": {
+            "X": 29.007324,
+            "Y": -19.000002,
+            "Z": 105.485596
+          },
+          "TerritoryId": 132,
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_MANFST200_00507_Q1_000_1",
+              "Yes": true
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "DataId": 2001666,
+          "Position": {
+            "X": 7.179191,
+            "Y": -21.93796,
+            "Z": 124.1005
+          },
+          "TerritoryId": 132,
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_MANFST200_00507_Q2_000_1",
+              "Yes": true
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 4,
+      "Steps": [
+        {
+          "DataId": 1002703,
+          "Position": {
+            "X": -12.375122,
+            "Y": 91.499985,
+            "Z": -0.5340576
+          },
+          "TerritoryId": 128,
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_MANFST200_00507_Q5_000_1",
+              "Yes": true
+            }
+          ],
+          "Comment": "Limsa Arrivals Attendant"
+        },
+        {
+          "DataId": 1002693,
+          "Position": {
+            "X": -6.515625,
+            "Y": 91.49996,
+            "Z": -13.656921
+          },
+          "TerritoryId": 128,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 5,
+      "Steps": [
+        {
+          "DataId": 1003583,
+          "Position": {
+            "X": -7.248047,
+            "Y": 91.49999,
+            "Z": -16.128845
+          },
+          "TerritoryId": 128,
+          "InteractionType": "Interact",
+          "TargetTerritoryId": 129,
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "ExcelSheet": "Warp",
+              "Prompt": null,
+              "Answer": 131094
+            }
+          ]
+        },
+        {
+          "DataId": 1001029,
+          "Position": {
+            "X": 9.170593,
+            "Y": 20.999403,
+            "Z": -15.213318
+          },
+          "TerritoryId": 129,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 6,
+      "Steps": [
+        {
+          "DataId": 8,
+          "Position": {
+            "X": -84.00108,
+            "Y": 20.77683,
+            "Z": 0.03414845
+          },
+          "StopDistance": 10,
+          "TerritoryId": 129,
+          "InteractionType": "AttuneAetheryte"
+        },
+        {
+          "DataId": 49,
+          "Position": {
+            "X": -213.61108,
+            "Y": 16.739136,
+            "Z": 51.80432
+          },
+          "TerritoryId": 129,
+          "InteractionType": "AttuneAethernetShard",
+          "Comment": "Hawkers' Alley"
+        },
+        {
+          "DataId": 43,
+          "Position": {
+            "X": -335.1645,
+            "Y": 12.619202,
+            "Z": 56.381958
+          },
+          "TerritoryId": 129,
+          "InteractionType": "AttuneAethernetShard",
+          "Comment": "Arcanists' Guild"
+        },
+        {
+          "DataId": 44,
+          "Position": {
+            "X": -179.40033,
+            "Y": 4.8065186,
+            "Z": 182.97095
+          },
+          "TerritoryId": 129,
+          "InteractionType": "AttuneAethernetShard",
+          "Comment": "Fishermens' Guild",
+          "AethernetShortcut": [
+            "[Limsa Lominsa] Arcanists' Guild",
+            "[Limsa Lominsa] Hawkers' Alley"
+          ]
+        },
+        {
+          "Position": {
+            "X": -83.8817,
+            "Y": 18.475962,
+            "Z": -29.903847
+          },
+          "TerritoryId": 129,
+          "InteractionType": "WalkTo",
+          "TargetTerritoryId": 128,
+          "Comment": "Walk to Culinarians' Guild",
+          "AethernetShortcut": [
+            "[Limsa Lominsa] Fishermens' Guild",
+            "[Limsa Lominsa] Aetheryte Plaza"
+          ]
+        },
+        {
+          "DataId": 42,
+          "Position": {
+            "X": -56.50421,
+            "Y": 44.47998,
+            "Z": -131.45648
+          },
+          "TerritoryId": 128,
+          "InteractionType": "AttuneAethernetShard",
+          "Comment": "Culinarians' Guild"
+        },
+        {
+          "DataId": 48,
+          "Position": {
+            "X": -5.1728516,
+            "Y": 44.63257,
+            "Z": -218.06671
+          },
+          "TerritoryId": 128,
+          "InteractionType": "AttuneAethernetShard",
+          "Comment": "Marauders' Guild"
+        },
+        {
+          "DataId": 41,
+          "Position": {
+            "X": 16.067688,
+            "Y": 40.787354,
+            "Z": 68.80286
+          },
+          "TerritoryId": 128,
+          "InteractionType": "AttuneAethernetShard",
+          "Comment": "Aftcastle"
+        },
+        {
+          "DataId": 1002695,
+          "Position": {
+            "X": -25.92511,
+            "Y": 91.999954,
+            "Z": -3.6774292
+          },
+          "TerritoryId": 128,
+          "InteractionType": "Interact",
+          "AethernetShortcut": [
+            "[Limsa Lominsa] The Aftcastle",
+            "[Limsa Lominsa] Airship Landing"
+          ],
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_MANFST200_00507_Q6_000_1",
+              "Yes": true
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 7,
+      "Steps": [
+        {
+          "DataId": 2001669,
+          "Position": {
+            "X": -11.12384,
+            "Y": 92.0271,
+            "Z": 17.166382
+          },
+          "TerritoryId": 128,
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_MANFST200_00507_Q4_000_1",
+              "Yes": true
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 8,
+      "Steps": [
+        {
+          "DataId": 1004434,
+          "Position": {
+            "X": -27.17633,
+            "Y": 83.19998,
+            "Z": 2.304016
+          },
+          "TerritoryId": 130,
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_MANFST200_00507_Q7_000_1",
+              "Yes": true
+            }
+          ],
+          "Comment": "Ul'dah Arrivals Attendant"
+        },
+        {
+          "DataId": 1004336,
+          "Position": {
+            "X": -12.619263,
+            "Y": 82.99987,
+            "Z": 4.562378
+          },
+          "TerritoryId": 130,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1004339,
+          "Position": {
+            "X": -25.986206,
+            "Y": 81.799995,
+            "Z": -31.99823
+          },
+          "TerritoryId": 130,
+          "InteractionType": "Interact",
+          "TargetTerritoryId": 131,
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "ExcelSheet": "Warp",
+              "Prompt": null,
+              "Answer": 131096
+            }
+          ]
+        },
+        {
+          "DataId": 51,
+          "Position": {
+            "X": 6.6376343,
+            "Y": 30.655273,
+            "Z": -24.826477
+          },
+          "TerritoryId": 131,
+          "InteractionType": "AttuneAethernetShard"
+        },
+        {
+          "DataId": 1001821,
+          "Position": {
+            "X": -24.124573,
+            "Y": 38.000004,
+            "Z": 85.31323
+          },
+          "TerritoryId": 131,
+          "InteractionType": "Interact"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/85_LNC_Close to Home.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/85_LNC_Close to Home.json
new file mode 100644 (file)
index 0000000..13ab3a0
--- /dev/null
@@ -0,0 +1,201 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1001140,
+          "Position": {
+            "X": 23.788818,
+            "Y": -8,
+            "Z": 115.861694
+          },
+          "TerritoryId": 183,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "Position": {
+            "X": 49.65071,
+            "Y": -8.046952,
+            "Z": 102.32186
+          },
+          "TerritoryId": 132,
+          "InteractionType": "WalkTo",
+          "$": "New Gridania Navmesh workaround"
+        },
+        {
+          "DataId": 2,
+          "Position": {
+            "X": 32.913696,
+            "Y": 2.670288,
+            "Z": 30.014404
+          },
+          "StopDistance": 10,
+          "TerritoryId": 132,
+          "InteractionType": "AttuneAetheryte",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        },
+        {
+          "DataId": 25,
+          "Position": {
+            "X": 166.58276,
+            "Y": -1.7243042,
+            "Z": 86.13721
+          },
+          "TerritoryId": 132,
+          "InteractionType": "AttuneAethernetShard",
+          "Comment": "Archers' Guild"
+        },
+        {
+          "Position": {
+            "X": 102.810745,
+            "Y": 5.4071116,
+            "Z": 12.54738
+          },
+          "TerritoryId": 132,
+          "InteractionType": "WalkTo",
+          "TargetTerritoryId": 133
+        },
+        {
+          "DataId": 1000768,
+          "Position": {
+            "X": 172.35059,
+            "Y": 15.5,
+            "Z": -89.951965
+          },
+          "TerritoryId": 133,
+          "InteractionType": "Interact",
+          "Comment": "TODO Questflags",
+          "$": "If done after aetheryte: 33 1 0 0 0 128"
+        },
+        {
+          "DataId": 26,
+          "Position": {
+            "X": 101.27405,
+            "Y": 9.018005,
+            "Z": -111.31464
+          },
+          "TerritoryId": 133,
+          "InteractionType": "AttuneAethernetShard",
+          "Comment": "Leatherworkers' Guild"
+        },
+        {
+          "DataId": 27,
+          "Position": {
+            "X": 121.23291,
+            "Y": 12.649658,
+            "Z": -229.63306
+          },
+          "TerritoryId": 133,
+          "InteractionType": "AttuneAethernetShard",
+          "Comment": "Lancers' Guild"
+        },
+        {
+          "DataId": 1000251,
+          "Position": {
+            "X": 147.08167,
+            "Y": 15.5,
+            "Z": -267.99426
+          },
+          "TerritoryId": 133,
+          "InteractionType": "Interact",
+          "Comment": "Lancer Receptionist"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1000251,
+          "Position": {
+            "X": 147.08167,
+            "Y": 15.5,
+            "Z": -267.99426
+          },
+          "TerritoryId": 133,
+          "InteractionType": "Interact",
+          "Comment": "Pick up Class Quest"
+        },
+        {
+          "DataId": 30,
+          "Position": {
+            "X": -73.92999,
+            "Y": 7.9804688,
+            "Z": -140.15417
+          },
+          "TerritoryId": 133,
+          "InteractionType": "AttuneAethernetShard",
+          "AethernetShortcut": [
+            "[Gridania] Lancers' Guild",
+            "[Gridania] Leatherworkers' Guild & Shaded Bower"
+          ],
+          "Comment": "Mih Khetto's Amphitheatre"
+        },
+        {
+          "Position": {
+            "X": -174.09056,
+            "Y": 10.91981,
+            "Z": -162.12527
+          },
+          "TerritoryId": 133,
+          "InteractionType": "WalkTo"
+        },
+        {
+          "DataId": 29,
+          "Position": {
+            "X": -311.0857,
+            "Y": 7.94989,
+            "Z": -177.05048
+          },
+          "TerritoryId": 133,
+          "InteractionType": "AttuneAethernetShard",
+          "Comment": "Botanists' Guild"
+        },
+        {
+          "DataId": 28,
+          "Position": {
+            "X": -145.15906,
+            "Y": 4.9591064,
+            "Z": -11.7647705
+          },
+          "TerritoryId": 133,
+          "InteractionType": "AttuneAethernetShard",
+          "AethernetShortcut": [
+            "[Gridania] Botanists' Guild",
+            "[Gridania] Mih Khetto's Amphitheatre"
+          ],
+          "Comment": "Conjurers' Guild"
+        },
+        {
+          "DataId": 1000100,
+          "Position": {
+            "X": 23.819275,
+            "Y": -8,
+            "Z": 115.92273
+          },
+          "TerritoryId": 132,
+          "InteractionType": "Interact",
+          "AethernetShortcut": [
+            "[Gridania] Conjurers' Guild",
+            "[Gridania] Airship Landing"
+          ]
+        }
+      ]
+    }
+  ]
+}
index 369a9edca9ce7657cebb8093c38db16d81154957..6985404e62d7eb8619c873466e643d685aaf20f4 100644 (file)
@@ -82,6 +82,7 @@
             "Y": 0.9999907,
             "Z": 211.68835
           },
+          "StopDistance": 7,
           "TerritoryId": 129,
           "InteractionType": "Interact",
           "TargetTerritoryId": 138,
index 63542a692677ac7eea2ac8616340c359a499c4f9..ac2d5284d629e07c938f2bcfef0a16e6ef4c5840 100644 (file)
@@ -29,7 +29,8 @@
           },
           "TerritoryId": 141,
           "InteractionType": "Interact",
-          "Comment": "'Forging the Spirit'"
+          "Comment": "'Forging the Spirit'",
+          "AetheryteShortcut": "Central Thanalan - Black Brush Station"
         },
         {
           "DataId": 1001426,
index 94290f688b792aca86dc7c0cb44e81bcfd619baa..2f3dd4635b8e26acc7c0a0999326a0d69bbc8b8f 100644 (file)
     {
       "Sequence": 1,
       "Steps": [
+        {
+          "Position": {
+            "X": -316.29608,
+            "Y": 23.44405,
+            "Z": -345.24487
+          },
+          "TerritoryId": 140,
+          "InteractionType": "WalkTo",
+          "AetheryteShortcut": "Western Thanalan - Horizon"
+        },
         {
           "DataId": 1004603,
           "Position": {
             "Z": -381.97913
           },
           "TerritoryId": 140,
-          "InteractionType": "Interact",
-          "AetheryteShortcut": "Western Thanalan - Horizon"
+          "InteractionType": "Interact"
         }
       ]
     },
     {
       "Sequence": 255,
       "Steps": [
+        {
+          "Position": {
+            "X": -493.3852,
+            "Y": 21,
+            "Z": -382.50455
+          },
+          "TerritoryId": 140,
+          "InteractionType": "WalkTo"
+        },
         {
           "DataId": 2001711,
           "Position": {
index 818d8a47d4a006883499326a1d85d7a7cb44d19b..794aa215687bb339c056c81a30acdd3919c5bd7e 100644 (file)
@@ -50,6 +50,7 @@
             "Y": 0.32037354,
             "Z": -166.58276
           },
+          "StopDistance": 10,
           "TerritoryId": 141,
           "InteractionType": "AttuneAetheryte",
           "AetheryteShortcut": "Ul'dah",
           "InteractionType": "WalkTo",
           "TargetTerritoryId": 145
         },
+        {
+          "Position": {
+            "X": -423.0189,
+            "Y": -37.96352,
+            "Z": 176.73677
+          },
+          "TerritoryId": 145,
+          "InteractionType": "WalkTo",
+          "$": "Camp Drybone Lantern"
+        },
         {
           "DataId": 18,
           "Position": {
@@ -75,6 +86,7 @@
             "Y": -57.1756,
             "Z": 142.59558
           },
+          "StopDistance": 10,
           "TerritoryId": 145,
           "InteractionType": "AttuneAetheryte"
         },
index 59c28f16fc012e8f5b55a9d7360fbf212b487e41..576fc56adc46cec4896db74bb4fdd911b4465980 100644 (file)
       "Sequence": 255,
       "Steps": [
         {
-          "TerritoryId": 145,
+          "TerritoryId": 133,
           "InteractionType": "UseItem",
           "ItemId": 30362,
           "TargetTerritoryId": 140
index 6684049e815a8246dc3b6b25c9a3be87aa8a4778..7a932363036564f3d26af8c509c73064c7efa635 100644 (file)
     {
       "Sequence": 255,
       "Steps": [
+        {
+          "Position": {
+            "X": -378.46735,
+            "Y": -38.009487,
+            "Z": 159.38092
+          },
+          "TerritoryId": 145,
+          "InteractionType": "WalkTo",
+          "$": "Camp Drybone cliff jump"
+        },
+        {
+          "Position": {
+            "X": -379.3895,
+            "Y": -59.000004,
+            "Z": 147.99257
+          },
+          "TerritoryId": 145,
+          "InteractionType": "WalkTo",
+          "DisableNavmesh": true
+        },
         {
           "DataId": 1003929,
           "Position": {
index 8c9213ee4e531203213564515ca6f076a66d57ec..4d35fbf0d1dfd9ec8d30c07aa1f247ed1e2904d1 100644 (file)
@@ -46,6 +46,7 @@
             "Y": 48.203125,
             "Z": -227.039
           },
+          "StopDistance": 10,
           "TerritoryId": 140,
           "InteractionType": "AttuneAetheryte",
           "AethernetShortcut": [
index 88ee8a147f487c16acfa9f3277887d565ec10ae5..1ae9d994549945a18c3d81e415827152c26953fb 100644 (file)
     {
       "Sequence": 1,
       "Steps": [
+        {
+          "Position": {
+            "X": 49.65071,
+            "Y": -8.046952,
+            "Z": 102.32186
+          },
+          "TerritoryId": 132,
+          "InteractionType": "WalkTo",
+          "$": "New Gridania Navmesh workaround"
+        },
         {
           "DataId": 3,
           "Position": {
     {
       "Sequence": 255,
       "Steps": [
+        {
+          "Position": {
+            "X": 49.65071,
+            "Y": -8.046952,
+            "Z": 102.32186
+          },
+          "TerritoryId": 132,
+          "InteractionType": "WalkTo",
+          "$": "New Gridania Navmesh workaround",
+          "AetheryteShortcut": "Gridania"
+        },
         {
           "DataId": 1000100,
           "Position": {
@@ -71,8 +92,7 @@
             "Z": 115.92273
           },
           "TerritoryId": 132,
-          "InteractionType": "Interact",
-          "AetheryteShortcut": "Gridania"
+          "InteractionType": "Interact"
         }
       ]
     }
diff --git a/QuestPaths/ARealmReborn/MSQ-1/Shared/680_The Company You Keep (Twin Adders).json b/QuestPaths/ARealmReborn/MSQ-1/Shared/680_The Company You Keep (Twin Adders).json
new file mode 100644 (file)
index 0000000..6e716e3
--- /dev/null
@@ -0,0 +1,105 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1004884,
+          "Position": {
+            "X": 38.895264,
+            "Y": 1.2000012,
+            "Z": 3.463745
+          },
+          "TerritoryId": 212,
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_MANFST302_00680_Q1_000_1",
+              "Yes": true
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1002394,
+          "Position": {
+            "X": -69.5354,
+            "Y": -0.50095016,
+            "Z": -9.99469
+          },
+          "TerritoryId": 132,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Gridania",
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_MANFST302_00680_Q2_000_1",
+              "Answer": "TEXT_MANFST302_00680_A2_000_2"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 1001263,
+          "Position": {
+            "X": 181.41443,
+            "Y": -2.3519497,
+            "Z": -240.40594
+          },
+          "TerritoryId": 133,
+          "InteractionType": "Interact",
+          "TargetTerritoryId": 152,
+          "AethernetShortcut": [
+            "[Gridania] Aetheryte Plaza",
+            "[Gridania] Lancers' Guild"
+          ],
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "ExcelSheet": "Warp",
+              "Prompt": null,
+              "Answer": 131077
+            }
+          ]
+        },
+        {
+          "DataId": 1004886,
+          "Position": {
+            "X": 30.319702,
+            "Y": 8.422709,
+            "Z": 475.30322
+          },
+          "TerritoryId": 152,
+          "InteractionType": "SinglePlayerDuty"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1002394,
+          "Position": {
+            "X": -69.5354,
+            "Y": -0.50095016,
+            "Z": -9.99469
+          },
+          "TerritoryId": 132,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Gridania"
+        }
+      ]
+    }
+  ]
+}
index 09c9602f7bca7b2e2ba313b9415d7eee89c23726..a469fae8a5babc01a63b8994c27380448a005c8e 100644 (file)
@@ -4,8 +4,25 @@
   "QuestSequence": [
     {
       "Sequence": 0,
-      "Steps": [],
-      "Comment": "Quest start is intentionally empty, so you pick a Grand Company"
+      "Steps": [
+        {
+          "DataId": 1004885,
+          "Position": {
+            "X": 36.453735,
+            "Y": 1.2000011,
+            "Z": 4.6845093
+          },
+          "TerritoryId": 212,
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_MANSEA302_00681_Q1_000_1",
+              "Yes": true
+            }
+          ]
+        }
+      ]
     },
     {
       "Sequence": 1,
diff --git a/QuestPaths/ARealmReborn/MSQ-1/Shared/683_Wood's Will Be Done.json b/QuestPaths/ARealmReborn/MSQ-1/Shared/683_Wood's Will Be Done.json
new file mode 100644 (file)
index 0000000..a1ad698
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1002394,
+          "Position": {
+            "X": -69.5354,
+            "Y": -0.50095016,
+            "Z": -9.99469
+          },
+          "TerritoryId": 132,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "TerritoryId": 132,
+          "InteractionType": "UseItem",
+          "ItemId": 30362,
+          "TargetTerritoryId": 140
+        },
+        {
+          "Position": {
+            "X": -492.96475,
+            "Y": 20.999884,
+            "Z": -380.82272
+          },
+          "TerritoryId": 140,
+          "InteractionType": "WalkTo"
+        },
+        {
+          "DataId": 2001711,
+          "Position": {
+            "X": -480.9181,
+            "Y": 18.00103,
+            "Z": -386.862
+          },
+          "TerritoryId": 140,
+          "InteractionType": "Interact",
+          "TargetTerritoryId": 212
+        },
+        {
+          "DataId": 1005012,
+          "Position": {
+            "X": 22.507019,
+            "Y": 0.9999986,
+            "Z": -2.02948
+          },
+          "TerritoryId": 212,
+          "InteractionType": "Interact"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/ARealmReborn/MSQ-1/Shared/700_My Little Chocobo (Twin Adder).json b/QuestPaths/ARealmReborn/MSQ-1/Shared/700_My Little Chocobo (Twin Adder).json
new file mode 100644 (file)
index 0000000..5dd6d39
--- /dev/null
@@ -0,0 +1,78 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1000168,
+          "Position": {
+            "X": -75.48645,
+            "Y": -0.5013741,
+            "Z": -5.081299
+          },
+          "TerritoryId": 132,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1002394,
+          "Position": {
+            "X": -69.5354,
+            "Y": -0.50095016,
+            "Z": -9.99469
+          },
+          "TerritoryId": 132,
+          "InteractionType": "Instruction",
+          "Comment": "Buy Serpent Chocobo Issuance"
+        },
+        {
+          "DataId": 1000136,
+          "Position": {
+            "X": 32.303345,
+            "Y": -0.050583772,
+            "Z": 70.29822
+          },
+          "TerritoryId": 132,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 1006001,
+          "Position": {
+            "X": 35.38562,
+            "Y": -0.89902794,
+            "Z": 67.551636
+          },
+          "StopDistance": 7,
+          "TerritoryId": 132,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1000136,
+          "Position": {
+            "X": 32.303345,
+            "Y": -0.050583772,
+            "Z": 70.29822
+          },
+          "TerritoryId": 132,
+          "InteractionType": "Interact"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/ARealmReborn/MSQ-1/Shared/701_My Little Chocobo (Maelstrom).json b/QuestPaths/ARealmReborn/MSQ-1/Shared/701_My Little Chocobo (Maelstrom).json
new file mode 100644 (file)
index 0000000..8bf69cc
--- /dev/null
@@ -0,0 +1,99 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1003281,
+          "Position": {
+            "X": 97.520386,
+            "Y": 40.248554,
+            "Z": 81.1322
+          },
+          "TerritoryId": 128,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Limsa Lominsa",
+          "AethernetShortcut": ["[Limsa Lominsa] Aetheryte Plaza", "[Limsa Lominsa] The Aftcastle"]
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1002387,
+          "Position": {
+            "X": 95.750244,
+            "Y": 40.250286,
+            "Z": 76.67651
+          },
+          "TerritoryId": 128,
+          "InteractionType": "Instruction",
+          "Comment": "Buy Storm Chocobo Issuance"
+        },
+        {
+          "DataId": 1003597,
+          "Position": {
+            "X": 8.194031,
+            "Y": 39.999973,
+            "Z": 17.746216
+          },
+          "TerritoryId": 128,
+          "InteractionType": "Interact",
+          "TargetTerritoryId": 129,
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "ExcelSheet": "Warp",
+              "Prompt": null,
+              "Answer": 131094
+            }
+          ]
+        },
+        {
+          "DataId": 1001027,
+          "Position": {
+            "X": 45.792236,
+            "Y": 20,
+            "Z": -8.1026
+          },
+          "TerritoryId": 129,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 1006002,
+          "Position": {
+            "X": 49.576538,
+            "Y": 20,
+            "Z": -5.722229
+          },
+          "StopDistance": 7,
+          "TerritoryId": 129,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1001027,
+          "Position": {
+            "X": 45.792236,
+            "Y": 20,
+            "Z": -8.1026
+          },
+          "TerritoryId": 129,
+          "InteractionType": "Interact"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/ARealmReborn/MSQ-2/.gitkeep b/QuestPaths/ARealmReborn/MSQ-2/.gitkeep
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/QuestPaths/ARealmReborn/MSQ-2/A2/3856_We Come in Peace.json b/QuestPaths/ARealmReborn/MSQ-2/A2/3856_We Come in Peace.json
new file mode 100644 (file)
index 0000000..c8fc28a
--- /dev/null
@@ -0,0 +1,44 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1000168,
+          "Position": {
+            "X": -75.48645,
+            "Y": -0.5013741,
+            "Z": -5.081299
+          },
+          "TerritoryId": 132,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Gridania",
+          "SkipIf": [
+            "AetheryteShortcutIfInSameTerritory"
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "Position": {
+            "X": -75.48645,
+            "Y": -0.5013741,
+            "Z": -5.081299
+          },
+          "TerritoryId": 132,
+          "InteractionType": "UseItem",
+          "ItemId": 6001,
+          "SkipIf": [
+            "ChocoboUnlocked"
+          ],
+          "Comment": "Use Chocobo whistle (if not yet unlocked)"
+        }
+      ]
+    }
+  ]
+}
index 0cf0ac3fcfd81740ace5392846022a079b0e8d8d..9ad2c19bed7d793444f996150336fe0173a902c5 100644 (file)
                       "Never",
                       "FlyingLocked",
                       "FlyingUnlocked",
-                      "DifferentTerritory"
+                      "DifferentTerritory",
+                      "ChocoboUnlocked",
+                      "AetheryteShortcutIfInSameTerritory"
                     ]
                   }
                 },
index dd38ac4f1c0cbddcee774cf02bce377bec2700b9..3ae25769787df950781187da9bb7020263d578ef 100644 (file)
@@ -9,5 +9,7 @@ public sealed class SkipConditionConverter() : EnumConverter<ESkipCondition>(Val
         { ESkipCondition.Never, "Never" },
         { ESkipCondition.FlyingLocked, "FlyingLocked" },
         { ESkipCondition.FlyingUnlocked, "FlyingUnlocked" },
+        { ESkipCondition.ChocoboUnlocked, "ChocoboUnlocked" },
+        { ESkipCondition.AetheryteShortcutIfInSameTerritory, "AetheryteShortcutIfInSameTerritory" },
     };
 }
index 4f2639d42196a164e0547a7db179d9bc6903ec8d..fd8ee6a33b451b07140a5794f0d3678483c00ef6 100644 (file)
@@ -10,4 +10,6 @@ public enum ESkipCondition
     Never,
     FlyingLocked,
     FlyingUnlocked,
+    ChocoboUnlocked,
+    AetheryteShortcutIfInSameTerritory,
 }
index d77af785724e9d6e86672cbd2f35e96d6da83ced..7dc415b916e14091d56188df72a49c43bc3c3576 100644 (file)
@@ -1,4 +1,5 @@
 using Dalamud.Configuration;
+using FFXIVClientStructs.FFXIV.Client.UI.Agent;
 using LLib.ImGui;
 
 namespace Questionable;
@@ -15,6 +16,7 @@ internal sealed class Configuration : IPluginConfiguration
     {
         public bool AutoAcceptNextQuest { get; set; }
         public uint MountId { get; set; } = 71;
+        public GrandCompany GrandCompany { get; set; } = GrandCompany.None;
     }
 
     internal sealed class AdvancedConfiguration
index 116af08168caab83736e372eb639f3293c275cfb..5830ecedecd80e7bb3f04a75387760d92ec4d368 100644 (file)
@@ -386,10 +386,8 @@ internal sealed class GameUiController : IDisposable
     {
         if (_questController.CurrentQuest?.Quest.QuestId == 245)
         {
-            // TODO Test this
             _logger.LogInformation("Closing ContentsTutorial");
             AtkUnitBase* addon = (AtkUnitBase*)args.Addon;
-            //addon->FireCallbackInt(-2);
             addon->FireCallbackInt(13);
         }
     }
index 7f01ee3afa545c4e956519fcdc45f57fe0c9932c..cc732962ee5235a0841fb52d0beac310d4f283d8 100644 (file)
@@ -44,7 +44,7 @@ internal sealed class MovementController : IDisposable
     public bool IsNavmeshReady => _navmeshIpc.IsReady;
     public bool IsPathRunning => _navmeshIpc.IsPathRunning;
     public bool IsPathfinding => _pathfindTask is { IsCompleted: false };
-    public DestinationData? Destination { get; private set; }
+    public DestinationData? Destination { get; set; }
     public DateTime MovementStartedAt { get; private set; } = DateTime.MaxValue;
 
     public void Update()
index 494a181e6c31c7f22491f57eefc10b9b172ad847..7cd71c4df919e1dd5fb13e24864cc086f2da1be9 100644 (file)
@@ -1,23 +1,12 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
-using System.Numerics;
-using System.Threading;
-using System.Threading.Tasks;
-using Dalamud.Game.ClientState.Conditions;
 using Dalamud.Game.ClientState.Keys;
-using Dalamud.Game.ClientState.Objects.Types;
 using Dalamud.Plugin.Services;
-using FFXIVClientStructs.FFXIV.Application.Network.WorkDefinitions;
-using FFXIVClientStructs.FFXIV.Client.Game;
-using FFXIVClientStructs.FFXIV.Client.Game.UI;
 using Microsoft.Extensions.Logging;
 using Questionable.Controller.Steps;
-using Questionable.Data;
-using Questionable.External;
 using Questionable.Model;
 using Questionable.Model.V1;
-using Questionable.Model.V1.Converter;
 
 namespace Questionable.Controller;
 
@@ -464,11 +453,6 @@ internal sealed class QuestController
         }
     }
 
-    // TODO is this still required?
-    public sealed record StepProgress(
-        DateTime StartedAt,
-        int DialogueChoicesSelected = 0);
-
     public void Skip(ushort questQuestId, byte currentQuestSequence)
     {
         lock (_lock)
@@ -498,4 +482,7 @@ internal sealed class QuestController
             }
         }
     }
+
+    public sealed record StepProgress(
+        DateTime StartedAt);
 }
index 5a3f76c661d33074df3fbdbac0b64f652e80f7d7..5a9b3b86a46b191eb0ae79dbcf6474b0a1ffcd30 100644 (file)
@@ -25,7 +25,11 @@ internal static class AetheryteShortcut
 
             var task = serviceProvider.GetRequiredService<UseAetheryteShortcut>()
                 .With(step, step.AetheryteShortcut.Value, aetheryteData.TerritoryIds[step.AetheryteShortcut.Value]);
-            return [new WaitConditionTask(gameFunctions.CanTeleport, "CanTeleport"), task];
+            return
+            [
+                new WaitConditionTask(() => gameFunctions.CanTeleport(step.AetheryteShortcut.Value), "CanTeleport"),
+                task
+            ];
         }
 
         public ITask CreateTask(Quest quest, QuestSequence sequence, QuestStep step)
@@ -64,6 +68,12 @@ internal static class AetheryteShortcut
             ushort territoryType = clientState.TerritoryType;
             if (ExpectedTerritoryId == territoryType)
             {
+                if (Step.SkipIf.Contains(ESkipCondition.AetheryteShortcutIfInSameTerritory))
+                {
+                    logger.LogInformation("Skipping aetheryte teleport due to SkipIf");
+                    return false;
+                }
+
                 Vector3 pos = clientState.LocalPlayer!.Position;
                 if (aetheryteData.CalculateDistance(pos, territoryType, TargetAetheryte) < 11 ||
                     (Step.AethernetShortcut != null &&
index b7fa8e40dd783c6f1d8b521bc43267453a2e2b60..6757aa20cffa809aaeb0dbf4616f0361436ab824 100644 (file)
@@ -1,5 +1,8 @@
 using System;
+using System.Collections.Generic;
+using System.Linq;
 using FFXIVClientStructs.FFXIV.Application.Network.WorkDefinitions;
+using FFXIVClientStructs.FFXIV.Client.Game.UI;
 using FFXIVClientStructs.FFXIV.Client.System.Framework;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Logging;
@@ -17,11 +20,13 @@ internal static class SkipCondition
             if (step.SkipIf.Contains(ESkipCondition.Never))
                 return null;
 
-            if (step.SkipIf.Count == 0 && step.CompletionQuestVariablesFlags.Count == 0)
+            var relevantConditions =
+                step.SkipIf.Where(x => x != ESkipCondition.AetheryteShortcutIfInSameTerritory).ToList();
+            if (relevantConditions.Count == 0 && step.CompletionQuestVariablesFlags.Count == 0)
                 return null;
 
             return serviceProvider.GetRequiredService<CheckTask>()
-                .With(step, quest.QuestId);
+                .With(step, relevantConditions, quest.QuestId);
         }
     }
 
@@ -30,33 +35,42 @@ internal static class SkipCondition
         GameFunctions gameFunctions) : ITask
     {
         public QuestStep Step { get; set; } = null!;
+        public List<ESkipCondition> SkipConditions { get; set; } = null!;
         public ushort QuestId { get; set; }
 
-        public ITask With(QuestStep step, ushort questId)
+        public ITask With(QuestStep step, List<ESkipCondition> skipConditions, ushort questId)
         {
             Step = step;
+            SkipConditions = skipConditions;
             QuestId = questId;
             return this;
         }
 
-        public bool Start()
+        public unsafe bool Start()
         {
-            logger.LogInformation("Checking skip conditions; {ConfiguredConditions}", string.Join(",", Step.SkipIf));
+            logger.LogInformation("Checking skip conditions; {ConfiguredConditions}", string.Join(",", SkipConditions));
 
-            if (Step.SkipIf.Contains(ESkipCondition.FlyingUnlocked) &&
+            if (SkipConditions.Contains(ESkipCondition.FlyingUnlocked) &&
                 gameFunctions.IsFlyingUnlocked(Step.TerritoryId))
             {
                 logger.LogInformation("Skipping step, as flying is unlocked");
                 return true;
             }
 
-            if (Step.SkipIf.Contains(ESkipCondition.FlyingLocked) &&
+            if (SkipConditions.Contains(ESkipCondition.FlyingLocked) &&
                 !gameFunctions.IsFlyingUnlocked(Step.TerritoryId))
             {
                 logger.LogInformation("Skipping step, as flying is locked");
                 return true;
             }
 
+            if (SkipConditions.Contains(ESkipCondition.ChocoboUnlocked) &&
+                PlayerState.Instance()->IsMountUnlocked(1))
+            {
+                logger.LogInformation("Skipping step, as chocobo is unlocked");
+                return true;
+            }
+
             if (Step is
                 {
                     DataId: not null,
@@ -87,6 +101,6 @@ internal static class SkipCondition
 
         public ETaskResult Update() => ETaskResult.SkipRemainingTasksForStep;
 
-        public override string ToString() => $"CheckSkip({string.Join(", ", Step.SkipIf)})";
+        public override string ToString() => $"CheckSkip({string.Join(", ", SkipConditions)})";
     }
 }
index 59f2c0ec7591acbd1014d6153ac04da1e056d5f3..8c9ed5e952ffac151a0a9687a5dcf010233eab02 100644 (file)
@@ -35,6 +35,7 @@ internal static class WaitAtEnd
                     return [
                         serviceProvider.GetRequiredService<WaitDelay>(),
                         notInCombat,
+                        serviceProvider.GetRequiredService<WaitDelay>(),
                         Next(quest, sequence, step)
                     ];
 
index 802bec61c4ae795cdcbebb0755830807610d4f6d..865c171fe889ad8afadd1fc3d6d6f771ad56d3c9 100644 (file)
@@ -27,8 +27,7 @@ internal static class EquipItem
         }
     }
 
-    internal sealed class DoEquip(IDataManager dataManager, ILogger<DoEquip> logger)
-        : AbstractDelayedTask(TimeSpan.FromSeconds(1))
+    internal sealed class DoEquip(IDataManager dataManager, ILogger<DoEquip> logger) : ITask
     {
         private static readonly IReadOnlyList<InventoryType> SourceInventoryTypes =
         [
@@ -55,6 +54,8 @@ internal static class EquipItem
         private Item _item = null!;
         private List<ushort> _targetSlots = [];
 
+        private DateTime _continueAt = DateTime.MaxValue;
+
         public ITask With(uint itemId)
         {
             _itemId = itemId;
@@ -64,7 +65,32 @@ internal static class EquipItem
             return this;
         }
 
-        protected override unsafe bool StartInternal()
+        public bool Start()
+        {
+            Equip();
+            _continueAt = DateTime.Now.AddSeconds(1);
+            return true;
+        }
+
+        public unsafe ETaskResult Update()
+        {
+            if (DateTime.Now < _continueAt)
+                return ETaskResult.StillRunning;
+
+            InventoryManager* inventoryManager = InventoryManager.Instance();
+            if (inventoryManager == null)
+                return ETaskResult.StillRunning;
+
+            if (_targetSlots.Any(x =>
+                    inventoryManager->GetInventorySlot(InventoryType.EquippedItems, x)->ItemID == _itemId))
+                return ETaskResult.TaskComplete;
+
+            Equip();
+            _continueAt = DateTime.Now.AddSeconds(1);
+            return ETaskResult.StillRunning;
+        }
+
+        private unsafe bool Equip()
         {
             var inventoryManager = InventoryManager.Instance();
             if (inventoryManager == null)
@@ -108,26 +134,13 @@ internal static class EquipItem
                     int result = inventoryManager->MoveItemSlot(sourceInventoryType, sourceSlot,
                         InventoryType.EquippedItems, targetSlot, 1);
                     logger.LogInformation("MoveItemSlot result: {Result}", result);
-                    return true;
+                    return result == 0;
                 }
             }
 
             return false;
         }
 
-        protected override unsafe ETaskResult UpdateInternal()
-        {
-            InventoryManager* inventoryManager = InventoryManager.Instance();
-            if (inventoryManager == null)
-                return ETaskResult.StillRunning;
-
-            if (_targetSlots.Any(x =>
-                    inventoryManager->GetInventorySlot(InventoryType.EquippedItems, x)->ItemID == _itemId))
-                return ETaskResult.TaskComplete;
-
-            return ETaskResult.StillRunning;
-        }
-
         private static List<ushort>? GetEquipSlot(Item item)
         {
             return item.EquipSlotCategory.Row switch
index 7b6d043dc869a8cfa09b95aca4088ca6a98d86af..323d4a791c9a5892177f6d5fa6660dc058c7571f 100644 (file)
@@ -1,6 +1,8 @@
 using System;
 using System.Collections.Generic;
+using FFXIVClientStructs.FFXIV.Client.Game;
 using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
 using Questionable.Controller.Steps.BaseTasks;
 using Questionable.Model;
 using Questionable.Model.V1;
@@ -9,6 +11,8 @@ namespace Questionable.Controller.Steps.InteractionFactory;
 
 internal static class UseItem
 {
+    public const int VesperBayAetheryteTicket = 30362;
+
     internal sealed class Factory(IServiceProvider serviceProvider) : ITaskFactory
     {
         public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step)
@@ -45,30 +49,58 @@ internal static class UseItem
             => throw new InvalidOperationException();
     }
 
-    internal abstract class UseItemBase : ITask
+    internal abstract class UseItemBase(ILogger logger) : ITask
     {
         private bool _usedItem;
         private DateTime _continueAt;
+        private int _itemCount;
 
         public uint ItemId { get; set; }
 
         protected abstract bool UseItem();
 
-        public bool Start()
+        public unsafe bool Start()
         {
+            InventoryManager* inventoryManager = InventoryManager.Instance();
+            if (inventoryManager == null)
+                throw new TaskException("No InventoryManager");
+
+            _itemCount = inventoryManager->GetInventoryItemCount(ItemId);
+            if (_itemCount == 0)
+                throw new TaskException($"Don't have any {ItemId} in inventory (NQ only)");
+
             _usedItem = UseItem();
-            if (ItemId == 30362) // vesper bay aether ticket
+            if (ItemId == VesperBayAetheryteTicket)
                 _continueAt = DateTime.Now.AddSeconds(11);
             else
                 _continueAt = DateTime.Now.AddSeconds(2);
             return true;
         }
 
-        public ETaskResult Update()
+        public unsafe ETaskResult Update()
         {
             if (DateTime.Now <= _continueAt)
                 return ETaskResult.StillRunning;
 
+            if (ItemId == VesperBayAetheryteTicket)
+            {
+                InventoryManager* inventoryManager = InventoryManager.Instance();
+                if (inventoryManager == null)
+                {
+                    logger.LogWarning("InventoryManager is not available");
+                    return ETaskResult.StillRunning;
+                }
+
+                int itemCount = inventoryManager->GetInventoryItemCount(ItemId);
+                if (itemCount == _itemCount)
+                {
+                    // TODO Better handling for game-provided errors, i.e. reacting to the 'Could not use' messages. UseItem() is successful in this case (and returns 0)
+                    logger.LogInformation("Attempted to use vesper bay aetheryte ticket, but it didn't consume an item - reattempting next frame");
+                    _usedItem = false;
+                    return ETaskResult.StillRunning;
+                }
+            }
+
             if (!_usedItem)
             {
                 _usedItem = UseItem();
@@ -81,7 +113,7 @@ internal static class UseItem
     }
 
 
-    internal sealed class UseOnGround(GameFunctions gameFunctions) : UseItemBase
+    internal sealed class UseOnGround(GameFunctions gameFunctions, ILogger<UseOnGround> logger) : UseItemBase(logger)
     {
         public uint DataId { get; set; }
 
@@ -97,7 +129,7 @@ internal static class UseItem
         public override string ToString() => $"UseItem({ItemId} on ground at {DataId})";
     }
 
-    internal sealed class UseOnObject(GameFunctions gameFunctions) : UseItemBase
+    internal sealed class UseOnObject(GameFunctions gameFunctions, ILogger<UseOnObject> logger) : UseItemBase(logger)
     {
         public uint DataId { get; set; }
 
@@ -113,7 +145,7 @@ internal static class UseItem
         public override string ToString() => $"UseItem({ItemId} on {DataId})";
     }
 
-    internal sealed class Use(GameFunctions gameFunctions) : UseItemBase
+    internal sealed class Use(GameFunctions gameFunctions, ILogger<Use> logger) : UseItemBase(logger)
     {
         public ITask With(uint itemId)
         {
index 3c3da8052bf94610fb1f8116a5b35c1da44227c2..96ed837a6e4960d6f3f292a8cafd768e64b5ed06 100644 (file)
@@ -32,6 +32,7 @@ using ContentFinderCondition = Lumina.Excel.GeneratedSheets.ContentFinderConditi
 using ContentTalk = Lumina.Excel.GeneratedSheets.ContentTalk;
 using Emote = Lumina.Excel.GeneratedSheets.Emote;
 using GameObject = Dalamud.Game.ClientState.Objects.Types.GameObject;
+using GrandCompany = FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany;
 using Quest = Questionable.Model.Quest;
 using TerritoryType = Lumina.Excel.GeneratedSheets.TerritoryType;
 
@@ -102,6 +103,50 @@ internal sealed unsafe class GameFunctions
     public DateTime ReturnRequestedAt { get; set; } = DateTime.MinValue;
 
     public (ushort CurrentQuest, byte Sequence) GetCurrentQuest()
+    {
+        var (currentQuest, sequence) = GetCurrentQuestInternal();
+        QuestManager* questManager = QuestManager.Instance();
+        PlayerState* playerState = PlayerState.Instance();
+
+        if (currentQuest == 0)
+        {
+            if (_clientState.TerritoryType == 181) // Starting in Limsa
+                return (107, 0);
+            if (_clientState.TerritoryType == 183) // Starting in Gridania
+                return (39, 0);
+            return default;
+        }
+        else if (currentQuest == 681)
+        {
+            // if we have already picked up the GC quest, just return the progress for it
+            if (questManager->IsQuestAccepted(currentQuest) || QuestManager.IsQuestComplete(currentQuest))
+                return (currentQuest, sequence);
+
+            // The company you keep...
+            return _configuration.General.GrandCompany switch
+            {
+                GrandCompany.TwinAdder => (680, 0),
+                GrandCompany.Maelstrom => (681, 0),
+                _ => default
+            };
+        }
+        else if (currentQuest == 3856 && !playerState->IsMountUnlocked(1)) // we come in peace
+        {
+            ushort chocoboQuest = (GrandCompany)playerState->GrandCompany switch
+            {
+                GrandCompany.TwinAdder => 700,
+                GrandCompany.Maelstrom => 701,
+                _ => 0
+            };
+
+            if (chocoboQuest != 0 && !QuestManager.IsQuestComplete(chocoboQuest))
+                return (chocoboQuest, QuestManager.GetQuestSequence(chocoboQuest));
+        }
+
+        return (currentQuest, sequence);
+    }
+
+    public (ushort CurrentQuest, byte Sequence) GetCurrentQuestInternal()
     {
         ushort currentQuest;
 
@@ -135,12 +180,7 @@ internal sealed unsafe class GameFunctions
 
         currentQuest = scenarioTree->Data->CurrentScenarioQuest;
         if (currentQuest == 0)
-        {
-            if (_clientState.TerritoryType == 181) // Starting Limsa
-                return (107, 0);
-
             return default;
-        }
 
         return (currentQuest, QuestManager.GetQuestSequence(currentQuest));
     }
@@ -157,39 +197,23 @@ internal sealed unsafe class GameFunctions
 
         var uiState = UIState.Instance();
         return uiState != null && uiState->IsAetheryteUnlocked(aetheryteId);
-        /*
-        var telepo = Telepo.Instance();
-        if (telepo == null || telepo->UpdateAetheryteList() == null)
-        {
-            subIndex = 0;
-            return false;
-        }
-
-        for (ulong i = 0; i < telepo->TeleportList.Size(); ++i)
-        {
-            var data = telepo->TeleportList.Get(i);
-            if (data.AetheryteId == aetheryteId)
-            {
-                subIndex = data.SubIndex;
-                return true;
-            }
-        }
-
-        subIndex = 0;
-        return false;
-        */
     }
 
     public bool IsAetheryteUnlocked(EAetheryteLocation aetheryteLocation)
         => IsAetheryteUnlocked((uint)aetheryteLocation, out _);
 
-    public bool CanTeleport() => ActionManager.Instance()->GetActionStatus(ActionType.Action, 5) == 0;
+    public bool CanTeleport(EAetheryteLocation aetheryteLocation)
+    {
+        if ((ushort)aetheryteLocation == PlayerState.Instance()->HomeAetheryteId &&
+            ActionManager.Instance()->GetActionStatus(ActionType.GeneralAction, 8) == 0)
+            return true;
+
+        return ActionManager.Instance()->GetActionStatus(ActionType.Action, 5) == 0;
+    }
 
     public bool TeleportAetheryte(uint aetheryteId)
     {
-        var status = ActionManager.Instance()->GetActionStatus(ActionType.Action, 5);
-        if (status != 0)
-            return false;
+
 
         if (IsAetheryteUnlocked(aetheryteId, out var subIndex))
         {
@@ -201,8 +225,9 @@ internal sealed unsafe class GameFunctions
                     return true;
             }
 
-            // fallback if return isn't available or (more likely) on a different aetheryte
-            return Telepo.Instance()->Teleport(aetheryteId, subIndex);
+            if (ActionManager.Instance()->GetActionStatus(ActionType.Action, 5) == 0)
+                // fallback if return isn't available or (more likely) on a different aetheryte
+                return Telepo.Instance()->Teleport(aetheryteId, subIndex);
         }
 
         return false;
index 64a7caf1106ae9bcf5bb7ac736d8a784eeab956c..da28f5fe8d0934a5a44f9613d73067990493817e 100644 (file)
@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
     <PropertyGroup>
         <TargetFramework>net8.0-windows</TargetFramework>
-        <Version>0.14</Version>
+        <Version>0.15</Version>
         <LangVersion>12</LangVersion>
         <Nullable>enable</Nullable>
         <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
index ebfe6059e4611b6f97d171b43855b637e1de237b..3a3ce0833159b0a423872f082e1cce3ed84f70eb 100644 (file)
@@ -1,5 +1,4 @@
 using System;
-using System.Collections.Generic;
 using System.Diagnostics.CodeAnalysis;
 using System.Linq;
 using Dalamud.Interface.Colors;
@@ -8,6 +7,7 @@ using Dalamud.Plugin.Services;
 using ImGuiNET;
 using LLib.ImGui;
 using Lumina.Excel.GeneratedSheets;
+using GrandCompany = FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany;
 
 namespace Questionable.Windows;
 
@@ -19,6 +19,9 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig
     private readonly uint[] _mountIds;
     private readonly string[] _mountNames;
 
+    private readonly string[] _grandCompanyNames =
+        ["None (manually pick quest)", "Maelstrom", "Twin Adder"/*, "Immortal Flames"*/];
+
     [SuppressMessage("Performance", "CA1861", Justification = "One time initialization")]
     public ConfigWindow(DalamudPluginInterface pluginInterface, Configuration configuration, IDataManager dataManager)
         : base("Config - Questionable###QuestionableConfig", ImGuiWindowFlags.AlwaysAutoResize)
@@ -58,6 +61,14 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig
                     Save();
                 }
 
+                int grandCompany = (int)_configuration.General.GrandCompany;
+                if (ImGui.Combo("Preferred Grand Company", ref grandCompany, _grandCompanyNames,
+                        _grandCompanyNames.Length))
+                {
+                    _configuration.General.GrandCompany = (GrandCompany)grandCompany;
+                    Save();
+                }
+
                 ImGui.EndTabItem();
             }
 
index 468a455f137c6214afb5ac26958b265058c24995..380e7819c1257115f502aad99f1aa59c44f0c09e 100644 (file)
@@ -310,8 +310,12 @@ internal sealed class DebugWindow : LWindow, IPersistableWindowConfig
                             map->FlagMapMarker.TerritoryId != _clientState.TerritoryType ||
                             !_navmeshIpc.IsReady);
         if (ImGui.Button("Move to Flag"))
+        {
+            _movementController.Destination = null;
             _gameFunctions.ExecuteCommand(
                 $"/vnav {(_gameFunctions.IsFlyingUnlockedInCurrentZone() ? "flyflag" : "moveflag")}");
+        }
+
         ImGui.EndDisabled();
 
         ImGui.SameLine();