Support PointMenu' (e.g. the stone tablet interaction near DT's beginning) + Update...
authorLiza Carvelli <liza@carvel.li>
Tue, 9 Jul 2024 14:58:26 +0000 (16:58 +0200)
committerLiza Carvelli <liza@carvel.li>
Tue, 9 Jul 2024 14:58:26 +0000 (16:58 +0200)
46 files changed:
QuestPathGenerator/QuestSourceGenerator.cs
QuestPaths/Dawntrail/AetherCurrents/Urqopacha/5039_Traveler to the Rescue.json
QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4860_A New World to Explore.json
QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4863_A Saga in Stone.json
QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4865_To Kozama'uka.json
QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4868_A Well-mannered Shipwright.json
QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4869_The Lifting of Wings.json
QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4873_The Feat of Gold.json
QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4878_The Success of Others.json
QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4879_For All Turali.json
QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4880_A Leaking Workpot.json
QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4881_Lending a Helphand.json
QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4882_The Feat of Pots.json
QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4884_The Shape of Peace.json
QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4885_Lost Promise.json
QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4886_A Brother's Duty.json
QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4889_History's Keepers.json
QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4890_The Feat of Proof.json
QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4892_An Echo of Madness.json
QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4893_Pointing the Way.json
QuestPaths/Dawntrail/MSQ/C-Yak T'el/4897_The Leap to Yak T'el.json
QuestPaths/Dawntrail/MSQ/C-Yak T'el/4899_A History of Violence.json
QuestPaths/Dawntrail/MSQ/C-Yak T'el/4900_The Feat of Repast.json
QuestPaths/Dawntrail/MSQ/D-Shaaloani-HeritageFound1/4912_The Long Road to Xak Tural.json
QuestPaths/Dawntrail/MSQ/D-Shaaloani-HeritageFound1/4923_In Yyasulani's Shadow.json
QuestPaths/Dawntrail/MSQ/D-Shaaloani-HeritageFound1/4926_All Aboard.json
QuestPaths/Dawntrail/MSQ/E-SolutionNine-HeritageFound2/4933_Solution Nine.json
QuestPaths/Dawntrail/MSQ/E-SolutionNine-HeritageFound2/4945_The Resilient Son.json
QuestPaths/Dawntrail/MSQ/F-Living Memory/4948_Through the Gate of Gold.json
QuestPaths/Dawntrail/MSQ/F-Living Memory/4959_Dawntrail.json
QuestPaths/Dawntrail/RoleQuests/Healer/4824_In the Sting of Things.json
QuestPaths/Dawntrail/RoleQuests/MagicalRanged/4842_Power Forgotten.json
QuestPaths/Dawntrail/RoleQuests/MagicalRanged/4843_A Brand of Justice.json [new file with mode: 0644]
QuestPaths/Dawntrail/RoleQuests/MagicalRanged/4844_The Seeds of Popularity.json [new file with mode: 0644]
QuestPaths/Dawntrail/RoleQuests/Melee/4830_The Hunter and the Hunted.json
QuestPaths/Dawntrail/RoleQuests/PhysicalRanged/4836_To Steal a Steelhog.json
QuestPaths/Dawntrail/RoleQuests/Tank/4823_Dreams of a New Day.json
QuestPaths/quest-v1.json
Questionable.Model/V1/QuestStep.cs
Questionable/Controller/GameUiController.cs
Questionable/Controller/QuestController.cs
Questionable/Controller/QuestRegistry.cs
Questionable/Controller/Steps/BaseFactory/Move.cs
Questionable/Controller/Steps/BaseFactory/WaitAtEnd.cs
Questionable/Data/TerritoryData.cs
Questionable/Windows/QuestWindow.cs

index c136d2e46d55c4b32be4668e77bac526a26882f3..060d62540835aca28559e1efc4c2388cbfdb7394 100644 (file)
@@ -350,6 +350,8 @@ public class QuestSourceGenerator : ISourceGenerator
                                                 .AsSyntaxNodeOrToken(),
                                             AssignmentList(nameof(QuestStep.DialogueChoices), step.DialogueChoices)
                                                 .AsSyntaxNodeOrToken(),
+                                            AssignmentList(nameof(QuestStep.PointMenuChoices), step.PointMenuChoices)
+                                                .AsSyntaxNodeOrToken(),
                                             Assignment(nameof(QuestStep.QuestId), step.QuestId, emptyStep.QuestId)
                                                 .AsSyntaxNodeOrToken()))))),
                     Token(SyntaxKind.CommaToken),
index a370f3f16bc32b80f31745573f9987a335c59967..c9da7b591cce9de8a7c9a4b4c8428d9fee9d4b74 100644 (file)
@@ -26,6 +26,7 @@
             "Y": -129.27074,
             "Z": -351.33496
           },
+          "StopDistance": 0.25,
           "TerritoryId": 1187,
           "InteractionType": "Combat",
           "EnemySpawnType": "AutoOnEnterArea",
index 6d600acd2937e10ae98507597ce0a3834ee78a0f..9164879e248ad03e6239127b1d68edafaec4f658 100644 (file)
         }
       ]
     },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "Position": {
+            "X": 0,
+            "Y": 0,
+            "Z": 0
+          },
+          "TerritoryId": 1,
+          "InteractionType": "WalkTo",
+          "Comment": "Filler"
+        }
+      ]
+    },
     {
       "Sequence": 4,
       "Steps": [
index 3b5ec9750aa8ca58e7a26b0fb4ee926922ac0009..ba5c7a98cd8257beb55d44d283950be808990a44 100644 (file)
@@ -29,8 +29,7 @@
             "Z": 129.80847
           },
           "TerritoryId": 1185,
-          "InteractionType": "WaitForManualProgress",
-          "Comment": "Click all tablets (PointMenu)",
+          "InteractionType": "Interact",
           "DialogueChoices": [
             {
               "Type": "YesNo",
               "Prompt": "TEXT_KINGMA104_04863_Q2_000_000",
               "Answer": "TEXT_KINGMA104_04863_A2_000_001"
             }
+          ],
+          "PointMenuChoices": [
+            0,
+            1,
+            2,
+            3,
+            0,
+            1,
+            2,
+            3
           ]
         }
       ]
index 75add291dc98adf3522d66ef9428aafc9843c656..e1f33ee5d87292f03984b2eff696fb9591ed127e 100644 (file)
         }
       ]
     },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "Position": {
+            "X": 0,
+            "Y": 0,
+            "Z": 0
+          },
+          "TerritoryId": 1,
+          "InteractionType": "WalkTo",
+          "Comment": "Filler"
+        }
+      ]
+    },
     {
       "Sequence": 3,
       "Steps": [
index 5623afb05e9c126fc05643fc92eacde93aa66465..002a3643c0397e2a106a6fc71f90a307c53bb17b 100644 (file)
@@ -85,7 +85,8 @@
             "Z": -388.50995
           },
           "TerritoryId": 1188,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Kozama'uka - Ok'hanu"
         }
       ]
     },
     {
       "Sequence": 8,
       "Steps": [
+        {
+          "Position": {
+            "X": -510.96463,
+            "Y": -0.47684515,
+            "Z": -305.96155
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "WalkTo",
+          "Comment": "Waypoint after swimming through the river"
+        },
         {
           "DataId": 2013936,
           "Position": {
index d721f506968317d919861d0ff2fb836c81a4994e..61b6a3165ede212be033fbed4f28ab9ec94d6c30 100644 (file)
     {
       "Sequence": 4,
       "Steps": [
+        {
+          "Position": {
+            "X": 303.21774,
+            "Y": 7.475274,
+            "Z": -215.19496
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "WalkTo",
+          "DisableNavmesh": true,
+          "Mount": true
+        },
         {
           "DataId": 2013632,
           "Position": {
index 93ab2e85d5a961bd4569fa04776cd48b72c8bde0..ef9e4e1aa08cb76bbe71d42a1f008efbcbe1fb03 100644 (file)
             "Z": -171.58777
           },
           "TerritoryId": 1187,
-          "InteractionType": "WaitForManualProgress",
-          "Comment": "Pick Disconcerted Hoobigo",
+          "InteractionType": "Interact",
           "DialogueChoices": [
             {
               "Type": "List",
               "Prompt": "TEXT_KINGMA114_04873_Q1_000_000",
               "Answer": "TEXT_KINGMA114_04873_A1_000_001"
             }
+          ],
+          "PointMenuChoices": [
+            3
           ]
         }
       ]
index 491fe1b8cd6c776760dccb468b29341c93e5db1d..9a8138f252a4cb9b00a6e245dfe1d9fbc03a792f 100644 (file)
           "Comment": "Wachumeqimeqi"
         },
         {
-          "DataId": 1046763,
           "Position": {
-            "X": -114.64105,
-            "Y": -19.642736,
-            "Z": 201.12915
+            "X": -130.34163,
+            "Y": -14.999287,
+            "Z": 198.40685
           },
           "TerritoryId": 1185,
-          "InteractionType": "Interact",
+          "InteractionType": "WalkTo",
           "AethernetShortcut": [
             "[Tuliyollal] Wachumeqimeqi",
             "[Tuliyollal] The For'ard Cabins"
           ]
+        },
+        {
+          "Position": {
+            "X": -122.40268,
+            "Y": -19.754322,
+            "Z": 202.20439
+          },
+          "TerritoryId": 1185,
+          "InteractionType": "WalkTo",
+          "DisableNavmesh": true
+        },
+        {
+          "DataId": 1046763,
+          "Position": {
+            "X": -114.64105,
+            "Y": -19.642736,
+            "Z": 201.12915
+          },
+          "TerritoryId": 1185,
+          "InteractionType": "Interact"
         }
       ]
     },
index c3912a95838169a30a983c54426b424f8f050ee2..029cab88624f19ae9df518ba825eca5d691ce41f 100644 (file)
         }
       ]
     },
+    {
+      "Sequence": 4,
+      "Steps": [
+        {
+          "Position": {
+            "X": 0,
+            "Y": 0,
+            "Z": 0
+          },
+          "TerritoryId": 1,
+          "InteractionType": "WalkTo",
+          "Comment": "Filler"
+        }
+      ]
+    },
     {
       "Sequence": 5,
       "Steps": [
index 0f5663c5ad75247ba253bfaae53deef747f33bb3..20faf30d80509dfecbfa6207c49c9de901ebbd8c 100644 (file)
     {
       "Sequence": 1,
       "Steps": [
-        {
-          "DataId": 2013943,
-          "Position": {
-            "X": 485.89294,
-            "Y": 121.3855,
-            "Z": 831.29626
-          },
-          "TerritoryId": 1188,
-          "InteractionType": "AttuneAetherCurrent",
-          "AetherCurrentId": 2818428
-        },
         {
           "DataId": 203,
           "Position": {
           "TerritoryId": 1188,
           "InteractionType": "AttuneAetheryte"
         },
+        {
+          "Position": {
+            "X": 533.37555,
+            "Y": 122.98077,
+            "Z": 790.01416
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "WalkTo",
+          "AetheryteShortcut": "Tuliyollal",
+          "AethernetShortcut": [
+            "[Tuliyollal] Aetheryte Plaza",
+            "[Tuliyollal] Ihuykatumu (Kozama'uka)"
+          ]
+        },
+        {
+          "Position": {
+            "X": 522.3003,
+            "Y": 120.81023,
+            "Z": 803.62744
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "WalkTo",
+          "DisableNavmesh": true
+        },
+        {
+          "DataId": 2013943,
+          "Position": {
+            "X": 485.89294,
+            "Y": 121.3855,
+            "Z": 831.29626
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "AttuneAetherCurrent",
+          "AetherCurrentId": 2818428
+        },
         {
           "DataId": 1046603,
           "Position": {
@@ -51,7 +75,8 @@
             "Z": 259.66272
           },
           "TerritoryId": 1188,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Kozama'uka - Many Fires"
         }
       ]
     },
index 10934a893f144cdfd8307357c78f72572c6d34a6..dcd11e605e6147a325eaac6a77d930d76d98c979 100644 (file)
             "Y": 122.89019,
             "Z": 348.47034
           },
+          "StopDistance": 5,
           "TerritoryId": 1188,
           "InteractionType": "CompleteQuest"
         }
index 54e043143fbee20f993f42474ce1600b2c5c21e5..d42df4293712799cb3f2bff7c22a9def1ef91abe 100644 (file)
@@ -12,6 +12,7 @@
             "Y": 122.950645,
             "Z": 345.6626
           },
+          "StopDistance": 5,
           "TerritoryId": 1188,
           "InteractionType": "AcceptQuest"
         }
@@ -42,6 +43,7 @@
             "Y": -17.964504,
             "Z": 166.55212
           },
+          "StopDistance": 5,
           "TerritoryId": 1185,
           "InteractionType": "Interact"
         }
index 4c71bd86540a2911334b8cc2ae1935ef2aa94b13..185ff46b2b9488f775237d1d978af98b4b8f6c35 100644 (file)
         }
       ]
     },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "Position": {
+            "X": 0,
+            "Y": 0,
+            "Z": 0
+          },
+          "TerritoryId": 1,
+          "InteractionType": "WalkTo",
+          "Comment": "Filler"
+        }
+      ]
+    },
     {
       "Sequence": 3,
       "Steps": [
index 7a3023c7451f7e89b7a91864224ea62e775a06dc..b89555e7384207416479f933474a2330a375f4c3 100644 (file)
           },
           "TerritoryId": 1188,
           "InteractionType": "WaitForNpcAtPosition",
-          "NpcWaitDistance": 1
+          "NpcWaitDistance": 3
         },
         {
           "DataId": 1046648,
index 6e2f83184acd2d283e5d6062c4961daa9fa49e1f..cca2883ee7ca532775449809d6f350a3cc1020ba 100644 (file)
     {
       "Sequence": 1,
       "Steps": [
+        {
+          "Position": {
+            "X": 531.60944,
+            "Y": 116.17938,
+            "Z": 166.65599
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "WalkTo"
+        },
         {
           "DataId": 2013610,
           "Position": {
@@ -42,6 +51,7 @@
             "Y": 110.795235,
             "Z": 256.5983
           },
+          "StopDistance": 0.25,
           "TerritoryId": 1188,
           "InteractionType": "Combat",
           "EnemySpawnType": "AutoOnEnterArea",
@@ -79,8 +89,7 @@
             "Z": 229.96863
           },
           "TerritoryId": 1188,
-          "InteractionType": "Interact",
-          "Comment": "TODO Verify this is the correct sequence"
+          "InteractionType": "Interact"
         }
       ]
     },
index 892432e66c9609da7743bccdd8b67285a7337685..5fb8769c131a0d0cdb51b6d3655ba0cb6439431b 100644 (file)
@@ -28,7 +28,8 @@
             "Z": 465.87305
           },
           "TerritoryId": 1188,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Kozama'uka - Earthenshire"
         }
       ]
     },
index 209821cf48ce91c669ecdbecc22fe3f1baa787e5..b538942cfd9df09d63f3ee7b026acab669284a48 100644 (file)
         },
         {
           "Position": {
-            "X": 282.9373,
-            "Y": 47.77521,
-            "Z": 140.4986
+            "X": 341.56342,
+            "Y": 57.53834,
+            "Z": 10.309054
+          },
+          "TerritoryId": 1187,
+          "InteractionType": "WalkTo"
+        },
+        {
+          "Position": {
+            "X": 308.72827,
+            "Y": 60.2934,
+            "Z": 111.43004
           },
           "TerritoryId": 1187,
           "InteractionType": "WalkTo"
index d0d19f5cc7b4afa3ee461f245cc22a1b0faa110e..6492474c4eceb965ba725eb4c318cc29609eb710 100644 (file)
@@ -27,6 +27,7 @@
             "Y": 129.04724,
             "Z": 652.12476
           },
+          "StopDistance": 5,
           "TerritoryId": 1187,
           "InteractionType": "Interact",
           "CompletionQuestVariablesFlags": [
@@ -62,6 +63,7 @@
             "Y": 111.135,
             "Z": 557.7324
           },
+          "StopDistance": 5,
           "TerritoryId": 1187,
           "InteractionType": "Interact",
           "CompletionQuestVariablesFlags": [
@@ -80,6 +82,7 @@
             "Y": 111.135,
             "Z": 697.4745
           },
+          "StopDistance": 5,
           "TerritoryId": 1187,
           "InteractionType": "Interact",
           "CompletionQuestVariablesFlags": [
index a3d3b5d3fcf5e1abf88c9110f3c1c608791f33e4..c1e0da4c2b298cf89e0dab6f69d9d0de164f2138 100644 (file)
             "Y": 109.359344,
             "Z": 395.2364
           },
+          "StopDistance": 0.25,
           "TerritoryId": 1187,
           "InteractionType": "Combat",
           "EnemySpawnType": "AutoOnEnterArea",
index df60f84e51e10973ac0df5386a6d0ac81b112751..3df2c76be309d465400f859dd471c721c99801a7 100644 (file)
         }
       ]
     },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "Position": {
+            "X": 0,
+            "Y": 0,
+            "Z": 0
+          },
+          "TerritoryId": 1,
+          "InteractionType": "WalkTo",
+          "Comment": "Filler"
+        }
+      ]
+    },
     {
       "Sequence": 3,
       "Steps": [
index 1e40bf466a37c247cbffed7a1383192954a978cc..b67d760e30be991a5f504fe6e734e2fdee44c480 100644 (file)
@@ -43,8 +43,7 @@
             "Z": -403.21973
           },
           "TerritoryId": 1189,
-          "InteractionType": "Interact",
-          "Comment": "TODO Verify this shouldn't have a teleport (was removed due to AC moving)"
+          "InteractionType": "Interact"
         }
       ]
     },
index 2b135bfd62ab19bde7eda4ad7105835f0c8d0798..273ebbdcdad9d6e6a092084ae504d28da7b0a7ca 100644 (file)
@@ -12,6 +12,7 @@
             "Y": 19.501463,
             "Z": -358.05298
           },
+          "StopDistance": 5,
           "TerritoryId": 1189,
           "InteractionType": "AcceptQuest"
         }
index 72e612c1d5b21d92f33e9690f5c0b3d355500084..dcdc22ec68267da5a51f628747dd2ac037af73a2 100644 (file)
         }
       ]
     },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "Position": {
+            "X": 0,
+            "Y": 0,
+            "Z": 0
+          },
+          "TerritoryId": 1,
+          "InteractionType": "WalkTo",
+          "Comment": "Filler"
+        }
+      ]
+    },
     {
       "Sequence": 3,
       "Steps": [
index 442c2d8f5c15faf2cf56590d22c21565e038a6be..8d9fd18b667e2a23616358cba5a335f652d9ac9f 100644 (file)
         }
       ]
     },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "Position": {
+            "X": 0,
+            "Y": 0,
+            "Z": 0
+          },
+          "TerritoryId": 1,
+          "InteractionType": "WalkTo",
+          "Comment": "Filler"
+        }
+      ]
+    },
     {
       "Sequence": 3,
       "Steps": [
index 65234f2075e1c169f60d0b5dc2e2108265f792f6..a37257edf7c9dbf4c5bdedc89ff54641418f039d 100644 (file)
         }
       ]
     },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "Position": {
+            "X": 0,
+            "Y": 0,
+            "Z": 0
+          },
+          "TerritoryId": 1,
+          "InteractionType": "WalkTo",
+          "Comment": "Filler"
+        }
+      ]
+    },
     {
       "Sequence": 3,
       "Steps": [
index 9e43bc412bf89cbac60248ab4c8c5088e483952a..7d3d23e75dc44942d0b1986f3cecb76d1c864a36 100644 (file)
         }
       ]
     },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "Position": {
+            "X": 0,
+            "Y": 0,
+            "Z": 0
+          },
+          "TerritoryId": 1,
+          "InteractionType": "WalkTo",
+          "Comment": "Filler"
+        }
+      ]
+    },
     {
       "Sequence": 3,
       "Steps": [
index ba6befc7207446e57f4a665dda4fd173d953bba2..8abe5c21145655601e3a13f9c27e9d0ace3db7ae 100644 (file)
         }
       ]
     },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "Position": {
+            "X": 0,
+            "Y": 0,
+            "Z": 0
+          },
+          "TerritoryId": 1,
+          "InteractionType": "WalkTo",
+          "Comment": "Filler"
+        }
+      ]
+    },
     {
       "Sequence": 4,
       "Steps": [
         }
       ]
     },
+    {
+      "Sequence": 5,
+      "Steps": [
+        {
+          "Position": {
+            "X": 0,
+            "Y": 0,
+            "Z": 0
+          },
+          "TerritoryId": 1,
+          "InteractionType": "WalkTo",
+          "Comment": "Filler"
+        }
+      ]
+    },
     {
       "Sequence": 6,
       "Steps": [
index 78a70188cb1cbf2f91186e451724f58bd3c74082..1b76a71769490139f1fc366e6d94c47e771c4163 100644 (file)
         }
       ]
     },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "Position": {
+            "X": 0,
+            "Y": 0,
+            "Z": 0
+          },
+          "TerritoryId": 1,
+          "InteractionType": "WalkTo",
+          "Comment": "Filler"
+        }
+      ]
+    },
     {
       "Sequence": 3,
       "Steps": [
         }
       ]
     },
+    {
+      "Sequence": 4,
+      "Steps": [
+        {
+          "Position": {
+            "X": 0,
+            "Y": 0,
+            "Z": 0
+          },
+          "TerritoryId": 1,
+          "InteractionType": "WalkTo",
+          "Comment": "Filler"
+        }
+      ]
+    },
     {
       "Sequence": 5,
       "Steps": [
index 2f768149b98ae1b77b51d518cf46bea18d4a15e5..4d320523e01a6d6b3dfd86ade4c3f04ad871ca78 100644 (file)
         }
       ]
     },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "Position": {
+            "X": 0,
+            "Y": 0,
+            "Z": 0
+          },
+          "TerritoryId": 1,
+          "InteractionType": "WalkTo",
+          "Comment": "Filler"
+        }
+      ]
+    },
     {
       "Sequence": 4,
       "Steps": [
index 8cdb0369c1da15311dd4303f7e0ab9d15ddfe91d..777a0ba07a963c4ae1cea7c895665191bd27e7ab 100644 (file)
@@ -13,7 +13,7 @@
             "Z": 201.28174
           },
           "TerritoryId": 1185,
-          "InteractionType": "Interact"
+          "InteractionType": "AcceptQuest"
         }
       ]
     }
index 7bf7c7e50584c4c70759a3a4ca855e90c4162760..2cb7c7f4e628de12504244d01954e017eb89d183 100644 (file)
             "Z": 194.72034
           },
           "TerritoryId": 1185,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1048335,
+          "Position": {
+            "X": -16.739136,
+            "Y": 0.5999997,
+            "Z": -55.10034
+          },
+          "TerritoryId": 963,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Radz-at-Han"
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 1048337,
+          "Position": {
+            "X": 155.87085,
+            "Y": 5.297462,
+            "Z": 618.2803
+          },
+          "TerritoryId": 957,
           "InteractionType": "Interact"
         }
       ]
+    },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "DataId": 2013708,
+          "Position": {
+            "X": 48.90515,
+            "Y": 90.22656,
+            "Z": -83.024414
+          },
+          "StopDistance": 0.5,
+          "TerritoryId": 957,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048331,
+          "Position": {
+            "X": 214.03821,
+            "Y": 5.2600574,
+            "Z": 628.3817
+          },
+          "TerritoryId": 957,
+          "InteractionType": "CompleteQuest"
+        }
+      ]
     }
   ]
 }
diff --git a/QuestPaths/Dawntrail/RoleQuests/MagicalRanged/4843_A Brand of Justice.json b/QuestPaths/Dawntrail/RoleQuests/MagicalRanged/4843_A Brand of Justice.json
new file mode 100644 (file)
index 0000000..6ca9420
--- /dev/null
@@ -0,0 +1,141 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048331,
+          "Position": {
+            "X": 214.03821,
+            "Y": 5.2600574,
+            "Z": 628.3817
+          },
+          "TerritoryId": 957,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1048332,
+          "Position": {
+            "X": 52.506226,
+            "Y": -5.20688E-07,
+            "Z": -54.154297
+          },
+          "TerritoryId": 963,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Radz-at-Han"
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 1048340,
+          "Position": {
+            "X": -186.69415,
+            "Y": 4.0499983,
+            "Z": -108.11017
+          },
+          "TerritoryId": 963,
+          "InteractionType": "Interact",
+          "AethernetShortcut": [
+            "[Radz-at-Han] Aetheryte Plaza",
+            "[Radz-at-Han] Hall of the Radiant Host"
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "DataId": 1048332,
+          "Position": {
+            "X": 52.506226,
+            "Y": -5.20688E-07,
+            "Z": -54.154297
+          },
+          "TerritoryId": 963,
+          "InteractionType": "Interact",
+          "AethernetShortcut": [
+            "[Radz-at-Han] Hall of the Radiant Host",
+            "[Radz-at-Han] Aetheryte Plaza"
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 4,
+      "Steps": [
+        {
+          "DataId": 1048343,
+          "Position": {
+            "X": -336.53772,
+            "Y": 52.243706,
+            "Z": -165.05688
+          },
+          "TerritoryId": 957,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Thavnair - Great Work"
+        }
+      ]
+    },
+    {
+      "Sequence": 5,
+      "Steps": [
+        {
+          "Position": {
+            "X": -427.5108,
+            "Y": -0.015813708,
+            "Z": -710.37146
+          },
+          "StopDistance": 0.25,
+          "TerritoryId": 957,
+          "InteractionType": "Combat",
+          "EnemySpawnType": "AutoOnEnterArea",
+          "KillEnemyDataIds": [
+            17625
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 6,
+      "Steps": [
+        {
+          "DataId": 1048344,
+          "Position": {
+            "X": -419.028,
+            "Y": 0.06509568,
+            "Z": -710.9331
+          },
+          "StopDistance": 7,
+          "TerritoryId": 957,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048331,
+          "Position": {
+            "X": 214.03821,
+            "Y": 5.2600574,
+            "Z": 628.3817
+          },
+          "TerritoryId": 957,
+          "InteractionType": "CompleteQuest"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/Dawntrail/RoleQuests/MagicalRanged/4844_The Seeds of Popularity.json b/QuestPaths/Dawntrail/RoleQuests/MagicalRanged/4844_The Seeds of Popularity.json
new file mode 100644 (file)
index 0000000..4ca3c1b
--- /dev/null
@@ -0,0 +1,163 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048331,
+          "Position": {
+            "X": 214.03821,
+            "Y": 5.2600574,
+            "Z": 628.3817
+          },
+          "TerritoryId": 957,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1048348,
+          "Position": {
+            "X": -118.76105,
+            "Y": 88.94139,
+            "Z": -556.90857
+          },
+          "TerritoryId": 957,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "Position": {
+            "X": 77.94611,
+            "Y": 82.44486,
+            "Z": -548.9286
+          },
+          "StopDistance": 10,
+          "TerritoryId": 957,
+          "InteractionType": "Instruction",
+          "EnemySpawnType": "AutoOnEnterArea",
+          "KillEnemyDataIds": [
+            17626
+          ],
+          "ItemId": 2003495,
+          "Comment": "TODO Needs item use?"
+        }
+      ]
+    },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "DataId": 1048348,
+          "Position": {
+            "X": -118.76105,
+            "Y": 88.94139,
+            "Z": -556.90857
+          },
+          "TerritoryId": 957,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 4,
+      "Steps": [
+        {
+          "DataId": 1048350,
+          "Position": {
+            "X": -508.53745,
+            "Y": 12.375278,
+            "Z": 97.3678
+          },
+          "TerritoryId": 957,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Thavnair - Great Work"
+        }
+      ]
+    },
+    {
+      "Sequence": 5,
+      "Steps": [
+        {
+          "DataId": 1048354,
+          "Position": {
+            "X": 154.28394,
+            "Y": 5.2641535,
+            "Z": 618.40234
+          },
+          "TerritoryId": 957,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Thavnair - Yedlihmad",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ]
+        },
+        {
+          "DataId": 1048355,
+          "Position": {
+            "X": 227.98499,
+            "Y": 10.19656,
+            "Z": 563.31726
+          },
+          "TerritoryId": 957,
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
+        },
+        {
+          "DataId": 1048352,
+          "Position": {
+            "X": 195.5138,
+            "Y": 15.136732,
+            "Z": 529.015
+          },
+          "TerritoryId": 957,
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048331,
+          "Position": {
+            "X": 214.03821,
+            "Y": 5.2600574,
+            "Z": 628.3817
+          },
+          "TerritoryId": 957,
+          "InteractionType": "CompleteQuest"
+        }
+      ]
+    }
+  ]
+}
index db58cf2ecf3d0c0ee2f79e1989dfe4af7cdd20bd..fc3fa27f431f4ff9ca5255ad52a5b911023c67a7 100644 (file)
@@ -13,7 +13,7 @@
             "Z": 198.68762
           },
           "TerritoryId": 1185,
-          "InteractionType": "Interact"
+          "InteractionType": "AcceptQuest"
         }
       ]
     }
index 579bc1bea8aef630959cde10981857285430b568..ecb16d8c111b93d7d01aea5bdc8f29740c2d6776 100644 (file)
@@ -13,7 +13,7 @@
             "Z": 203.38745
           },
           "TerritoryId": 1185,
-          "InteractionType": "Interact"
+          "InteractionType": "AcceptQuest"
         }
       ]
     }
index 1582ab92d49dbd7762ea97818cbb4e7a4272426c..5d92248296405d336552e74104fa13b535990ace 100644 (file)
         }
       ]
     },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "Position": {
+            "X": 0,
+            "Y": 0,
+            "Z": 0
+          },
+          "TerritoryId": 1,
+          "InteractionType": "WalkTo",
+          "Comment": "Filler"
+        }
+      ]
+    },
     {
       "Sequence": 4,
       "Steps": [
index 95a7cbb4ea45c28ed0169da406ab85fb9d32b15b..0ebe0e6333844bb96d03e4c67c241af1e4799852 100644 (file)
                             }
                           ]
                         }
+                      },
+                      "PointMenuChoices": {
+                        "type": "array",
+                        "items": {
+                          "type": "integer",
+                          "minimum": 0
+                        }
                       }
                     }
                   }
index 9d3262e6b2e8588bfd6d5b998674a3b2f11b5088..a23c20ca58c86026fd1550840e95fa0a77b369de 100644 (file)
@@ -49,6 +49,7 @@ public sealed class QuestStep
     public IList<ESkipCondition> SkipIf { get; set; } = new List<ESkipCondition>();
     public IList<short?> CompletionQuestVariablesFlags { get; set; } = new List<short?>();
     public IList<DialogueChoice> DialogueChoices { get; set; } = new List<DialogueChoice>();
+    public IList<uint> PointMenuChoices { get; set; } = new List<uint>();
     public ushort? QuestId { get; set; }
 
     [JsonConstructor]
index ec82f6a9fe883c11b4dcc8bcacdef65fc8460ab4..0784cca45ba61a6a20ec947e0b9858bb5a375eab 100644 (file)
@@ -48,6 +48,7 @@ internal sealed class GameUiController : IDisposable
         _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "CutSceneSelectString", CutsceneSelectStringPostSetup);
         _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "SelectIconString", SelectIconStringPostSetup);
         _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "SelectYesno", SelectYesnoPostSetup);
+        _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "PointMenu", PointMenuPostSetup);
         _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "Credit", CreditPostSetup);
         _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "AkatsukiNote", UnendingCodexPostSetup);
         _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "ContentsTutorial", ContentsTutorialPostSetup);
@@ -80,6 +81,12 @@ internal sealed class GameUiController : IDisposable
             _logger.LogInformation("SelectYesno window is open");
             SelectYesnoPostSetup(addonSelectYesno, true);
         }
+
+        if (_gameGui.TryGetAddonByName("PointMenu", out AtkUnitBase* addonPointMenu))
+        {
+            _logger.LogInformation("PointMenu is open");
+            PointMenuPostSetup(addonPointMenu);
+        }
     }
 
     private unsafe void SelectStringPostSetup(AddonEvent type, AddonArgs args)
@@ -380,6 +387,61 @@ internal sealed class GameUiController : IDisposable
         }
     }
 
+    private unsafe void PointMenuPostSetup(AddonEvent type, AddonArgs args)
+    {
+        AtkUnitBase* addonPointMenu = (AtkUnitBase*)args.Addon;
+        PointMenuPostSetup(addonPointMenu);
+    }
+
+    private unsafe void PointMenuPostSetup(AtkUnitBase* addonPointMenu)
+    {
+        var currentQuest = _questController.CurrentQuest;
+        if (currentQuest == null)
+        {
+            _logger.LogInformation("Ignoring point menu, no active quest");
+            return;
+        }
+
+        var sequence = currentQuest.Quest.FindSequence(currentQuest.Sequence);
+        if (sequence == null)
+            return;
+
+        QuestStep? step = sequence.FindStep(currentQuest.Step);
+        if (step == null)
+            return;
+
+        if (step.PointMenuChoices.Count == 0)
+        {
+            _logger.LogWarning("No point menu choices");
+            return;
+        }
+
+        int counter = currentQuest.StepProgress.PointMenuCounter;
+        if (counter >= step.PointMenuChoices.Count)
+        {
+            _logger.LogWarning("No remaining point menu choices");
+            return;
+        }
+
+        uint choice = step.PointMenuChoices[counter];
+
+        _logger.LogInformation("Handling point menu, picking choice {Choice} (index = {Index})", choice, counter);
+        var selectChoice = stackalloc AtkValue[]
+        {
+            new() { Type = ValueType.Int, Int = 13 },
+            new() { Type = ValueType.UInt, UInt = choice }
+        };
+        addonPointMenu->FireCallback(2, selectChoice);
+
+        _questController.CurrentQuest = currentQuest with
+        {
+            StepProgress = currentQuest.StepProgress with
+            {
+                PointMenuCounter = counter + 1,
+            }
+        };
+    }
+
     private unsafe void CreditPostSetup(AddonEvent type, AddonArgs args)
     {
         _logger.LogInformation("Closing Credits sequence");
@@ -451,6 +513,7 @@ internal sealed class GameUiController : IDisposable
         _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "ContentsTutorial", ContentsTutorialPostSetup);
         _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "AkatsukiNote", UnendingCodexPostSetup);
         _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "Credit", CreditPostSetup);
+        _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "PointMenu", PointMenuPostSetup);
         _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "SelectYesno", SelectYesnoPostSetup);
         _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "SelectIconString", SelectIconStringPostSetup);
         _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "CutSceneSelectString", CutsceneSelectStringPostSetup);
index 4ed4f59b19a9f0dcd12cd42d07531c2d1bf48356..4dfa0085f2901ca15378a166b766728b9e514c30 100644 (file)
@@ -399,7 +399,8 @@ internal sealed class QuestController
         (QuestSequence? seq, QuestStep? step) = GetNextStep();
         if (CurrentQuest == null || seq == null || step == null)
         {
-            _logger.LogWarning("Could not retrieve next quest step, not doing anything");
+            _logger.LogWarning("Could not retrieve next quest step, not doing anything [{QuestId}, {Sequence}, {Step}]",
+                CurrentQuest?.Quest.QuestId, CurrentQuest?.Sequence, CurrentQuest?.Step);
             return;
         }
 
@@ -492,5 +493,6 @@ internal sealed class QuestController
     }
 
     public sealed record StepProgress(
-        DateTime StartedAt);
+        DateTime StartedAt,
+        int PointMenuCounter = 0);
 }
index 3d0f638c1b2a86cb49fb4ee465beb30d0ad014c9..cfb61097528f669baabba7c8f6174f930bf9523c 100644 (file)
@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 using System.Diagnostics.CodeAnalysis;
 using System.Globalization;
+using System.Linq;
 using System.IO;
 using System.Text.Json;
 using Dalamud.Plugin;
@@ -72,6 +73,12 @@ internal sealed class QuestRegistry
 
             quest.Name = questData.Name.ToString();
             quest.Level = questData.ClassJobLevel0;
+
+#if !RELEASE
+            int missingSteps = quest.Data.QuestSequence.Where(x => x.Sequence < 255).Max(x => x.Sequence) - quest.Data.QuestSequence.Count(x => x.Sequence < 255) + 1;
+            if (missingSteps != 0)
+                _logger.LogWarning("Quest has missing steps: {QuestId} / {QuestName} → {Count}", quest.QuestId, quest.Name, missingSteps);
+#endif
         }
 
         _logger.LogInformation("Loaded {Count} quests", _quests.Count);
index 8388df8f82e545d1cc11600bf1707f5208f25188..32ee4c616d66cc277351e35889251f6a3aa46eff 100644 (file)
@@ -7,6 +7,7 @@ using Dalamud.Plugin.Services;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Logging;
 using Questionable.Controller.Steps.BaseTasks;
+using Questionable.Data;
 using Questionable.Model;
 using Questionable.Model.V1;
 
@@ -45,7 +46,8 @@ internal static class Move
         ILogger<MoveBuilder> logger,
         GameFunctions gameFunctions,
         IClientState clientState,
-        MovementController movementController)
+        MovementController movementController,
+        TerritoryData territoryData)
     {
         public QuestStep Step { get; set; } = null!;
         public Vector3 Destination { get; set; }
@@ -61,7 +63,7 @@ internal static class Move
             }
 
             yield return new WaitConditionTask(() => clientState.TerritoryType == Step.TerritoryId,
-                $"Wait(territory: {Step.TerritoryId})");
+                $"Wait(territory: {territoryData.GetNameAndId(Step.TerritoryId)})");
 
             if (!Step.DisableNavmesh)
                 yield return new WaitConditionTask(() => movementController.IsNavmeshReady,
index a9affc04861af09140aa0a605f931cf82af408e5..4af6d58892884bd573a0cf5215ea883c9e688930 100644 (file)
@@ -9,6 +9,7 @@ using FFXIVClientStructs.FFXIV.Application.Network.WorkDefinitions;
 using FFXIVClientStructs.FFXIV.Client.Game;
 using Microsoft.Extensions.DependencyInjection;
 using Questionable.Controller.Steps.BaseTasks;
+using Questionable.Data;
 using Questionable.Model;
 using Questionable.Model.V1;
 
@@ -16,7 +17,8 @@ namespace Questionable.Controller.Steps.BaseFactory;
 
 internal static class WaitAtEnd
 {
-    internal sealed class Factory(IServiceProvider serviceProvider, IClientState clientState, ICondition condition)
+    internal sealed class Factory(IServiceProvider serviceProvider, IClientState clientState, ICondition condition,
+        TerritoryData territoryData)
         : ITaskFactory
     {
         public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step)
@@ -76,7 +78,7 @@ internal static class WaitAtEnd
                         // interaction moves to a different territory
                         waitInteraction = new WaitConditionTask(
                             () => clientState.TerritoryType == step.TargetTerritoryId,
-                            $"Wait(tp to territory: {step.TargetTerritoryId})");
+                            $"Wait(tp to territory: {territoryData.GetNameAndId(step.TargetTerritoryId.Value)})");
                     }
                     else
                     {
index 99e8c85ab09cf788c75537f88d1c2fd3183ba6fd..7d3fc59e85af4c6665068cfedb427292453c2c60 100644 (file)
@@ -1,6 +1,8 @@
 using System.Collections.Immutable;
+using System.Globalization;
 using System.Linq;
 using Dalamud.Plugin.Services;
+using FFXIVClientStructs.FFXIV.Client.Game.Character;
 using Lumina.Excel.GeneratedSheets;
 
 namespace Questionable.Data;
@@ -31,5 +33,14 @@ internal sealed class TerritoryData
 
     public string? GetName(ushort territoryId) => _territoryNames.GetValueOrDefault(territoryId);
 
+    public string GetNameAndId(ushort territoryId)
+    {
+        string? territoryName = GetName(territoryId);
+        if (territoryName != null)
+            return string.Create(CultureInfo.InvariantCulture, $"{territoryName} ({territoryId})");
+        else
+            return territoryId.ToString(CultureInfo.InvariantCulture);
+    }
+
     public bool CanUseMount(ushort territoryId) => _territoriesWithMount.Contains(territoryId);
 }
index c97481e843e69ec9b9bd7db86cc1d8e386d75dcb..e7871118ce09e9cf39b07558a8d13b791ccc6078 100644 (file)
@@ -211,13 +211,9 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
     {
         Debug.Assert(_clientState.LocalPlayer != null, "_clientState.LocalPlayer != null");
 
-        string? territoryName = _territoryData.GetName(_clientState.TerritoryType);
-        if (territoryName != null)
-            territoryName += string.Create(CultureInfo.InvariantCulture, $" ({_clientState.TerritoryType})");
-        else
-            territoryName = _clientState.TerritoryType.ToString(CultureInfo.InvariantCulture);
-
+        string territoryName = _territoryData.GetNameAndId(_clientState.TerritoryType);
         ImGui.Text(territoryName);
+
         if (_gameFunctions.IsFlyingUnlockedInCurrentZone())
         {
             ImGui.SameLine();
@@ -294,9 +290,9 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
             {
                 string interactionType = gameObject->NamePlateIconId switch
                 {
-                    71201 or 71211 or 71221 or 71231 or 71341 => "AcceptQuest",
-                    71202 or 71212 or 71222 or 71232 or 71342 => "AcceptQuest", // repeatable
-                    71205 or 71215 or 71225 or 71235 or 71345 => "CompleteQuest",
+                    71201 or 71211 or 71221 or 71231 or 71341 or 71351 => "AcceptQuest",
+                    71202 or 71212 or 71222 or 71232 or 71342 or 71352 => "AcceptQuest", // repeatable
+                    71205 or 71215 or 71225 or 71235 or 71345 or 71355 => "CompleteQuest",
                     _ => "Interact",
                 };
                 ImGui.SetClipboardText($$"""