Mini-YA
authorLiza Carvelli <liza@carvel.li>
Thu, 6 Jun 2024 16:49:49 +0000 (18:49 +0200)
committerLiza Carvelli <liza@carvel.li>
Thu, 6 Jun 2024 16:49:49 +0000 (18:49 +0200)
66 files changed:
QuestPaths/Endwalker/AetherCurrents/Elpis/4313_The Perks of Being a Lost Flower.json
QuestPaths/Endwalker/AetherCurrents/Garlemald/4232_Children Are Our Future.json
QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4359_Hitting the Books.json
QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4360_A Seat at the Last Stand.json
QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4372_The Great Work.json
QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4374_A Boys Errand.json
QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4375_Tipping the Scale.json
QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4377_In the Dark of the Tower.json
QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4379_The Color of Joy.json
QuestPaths/Endwalker/MSQ/B-Garlemald/4381_A Capital Idea.json
QuestPaths/Endwalker/MSQ/B-Garlemald/4382_Best of the Best.json
QuestPaths/Endwalker/MSQ/B-Garlemald/4383_A Frosty Reception.json
QuestPaths/Endwalker/MSQ/B-Garlemald/4384_Tracks in the Snow.json
QuestPaths/Endwalker/MSQ/B-Garlemald/4385_How the Mighty Are Fallen.json
QuestPaths/Endwalker/MSQ/B-Garlemald/4387_A Way Forward.json
QuestPaths/Endwalker/MSQ/B-Garlemald/4389_Personae non Gratae.json
QuestPaths/Endwalker/MSQ/B-Garlemald/4392_Alea Iacta Est.json
QuestPaths/Endwalker/MSQ/B-Garlemald/4393_Strange Bedfellows.json
QuestPaths/Endwalker/MSQ/B-Garlemald/4394_In from the Cold.json
QuestPaths/Endwalker/MSQ/B-Garlemald/4395_Gateway of the Gods.json
QuestPaths/Endwalker/MSQ/B-Garlemald/4396_A Trip to the Moon.json
QuestPaths/Endwalker/MSQ/B-Garlemald/4398_The Martyr.json
QuestPaths/Endwalker/MSQ/C-MareLamentorum/4400_Helping Hands.json
QuestPaths/Endwalker/MSQ/C-MareLamentorum/4401_A Harey Situation.json
QuestPaths/Endwalker/MSQ/C-MareLamentorum/4402_A Taste of the Moon.json
QuestPaths/Endwalker/MSQ/C-MareLamentorum/4403_Styled a Hero.json
QuestPaths/Endwalker/MSQ/C-MareLamentorum/4404_Alls Vale That Endsvale.json
QuestPaths/Endwalker/MSQ/C-MareLamentorum/4405_Back to Old Tricks.json
QuestPaths/Endwalker/MSQ/C-MareLamentorum/4406_Settiing Things Straight.json
QuestPaths/Endwalker/MSQ/C-MareLamentorum/4407_Heart of the Matter.json
QuestPaths/Endwalker/MSQ/C-MareLamentorum/4408_Returning Home.json
QuestPaths/Endwalker/MSQ/D-Thavnair2/4409_Skies Aflame.json
QuestPaths/Endwalker/MSQ/D-Thavnair2/4410_The Blasphemy Unmasked.json
QuestPaths/Endwalker/MSQ/D-Thavnair2/4413_That We Might Live.json
QuestPaths/Endwalker/MSQ/D-Thavnair2/4414_When All Hope Seems Lost.json
QuestPaths/Endwalker/MSQ/D-Thavnair2/4416_Simple Pleasures.json
QuestPaths/Endwalker/MSQ/D-Thavnair2/4418_At Worlds End.json
QuestPaths/Endwalker/MSQ/E-Elpis/4419_Return to the Crystarium.json
QuestPaths/Endwalker/MSQ/E-Elpis/4420_Hope Upon a Flower.json
QuestPaths/Endwalker/MSQ/E-Elpis/4422_In Search of Hermes.json
QuestPaths/Endwalker/MSQ/E-Elpis/4423_Ponder Warrant Cherish Welcome.json
QuestPaths/Endwalker/MSQ/E-Elpis/4425_Their Greatest Contribution.json
QuestPaths/Endwalker/MSQ/E-Elpis/4427_A Sentimental Gift.json
QuestPaths/Endwalker/MSQ/E-Elpis/4429_Travelers at the Crossroads.json
QuestPaths/Endwalker/MSQ/E-Elpis/4430_A Past Not Yet Come to Pass.json
QuestPaths/Endwalker/MSQ/E-Elpis/4431_Witness to the Spectacle.json
QuestPaths/Endwalker/MSQ/E-Elpis/4433_A Flower upon Your Return.json
QuestPaths/Endwalker/MSQ/E-Elpis/4434_Hunger in the Garden.json
QuestPaths/Endwalker/MSQ/E-Elpis/4438_Thou Must Live Die and Know.json
QuestPaths/Endwalker/MSQ/F-Labyrinthos2/4441_Going Underground.json
QuestPaths/Endwalker/MSQ/F-Labyrinthos2/4442_No Job Too Small.json
QuestPaths/Endwalker/MSQ/F-Labyrinthos2/4443_Wise Guides.json
QuestPaths/Endwalker/MSQ/F-Labyrinthos2/4444_Agriculture Shock.json
QuestPaths/Endwalker/MSQ/F-Labyrinthos2/4445_Sage Council.json
QuestPaths/Endwalker/MSQ/F-Labyrinthos2/4448_Bonds of Adamantite.json
QuestPaths/quest-v1.json
Questionable/Controller/GameUiController.cs
Questionable/Controller/MovementController.cs
Questionable/Controller/QuestController.cs
Questionable/External/NavmeshIpc.cs
Questionable/GameFunctions.cs
Questionable/Model/V1/Converter/DialogueChoiceTypeConverter.cs
Questionable/Model/V1/DialogueChoice.cs
Questionable/Model/V1/EDialogChoiceType.cs
Questionable/QuestionablePlugin.cs
Questionable/Windows/DebugWindow.cs

index 67f2dd3dadb4d3952a101af01d85091aeeb8b0d7..bf362d0721ea94b8188ec8be783bf3d095eb38a9 100644 (file)
           },
           "TerritoryId": 961,
           "InteractionType": "Interact",
-          "AetheryteShortcut": "Elpis - Anagnorisis"
+          "AetheryteShortcut": "Elpis - Anagnorisis",
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKZH018_04313_Q1_000_100",
+              "Answer": "TEXT_AKTKZH018_04313_A2_000_100"
+            }
+          ]
         }
       ]
     },
index 70d69c9678d8dafd26c5f412ac4675a1cbf7db51..9e895ffcf71bf6867142d787db67f5f5626b8005 100644 (file)
           },
           "StopDistance": 7,
           "TerritoryId": 958,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKZD008_04232_Q1_000_000",
+              "Answer": "TEXT_AKTKZD008_04232_A1_000_002"
+            }
+          ]
         }
       ]
     },
index 641b2ced4b8bec73208913f91a2431d6462d7c57..13f6043fb4d4607486834905ca2cf23fbe075d18 100644 (file)
           },
           "TerritoryId": 962,
           "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ],
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKMA103_04359_Q5_000_071",
+              "Yes": true
+            }
+          ],
           "$.0": "[1]",
           "$.2": "QuestVariables if done after [3]: 2 0 0 0 0 96"
         },
           },
           "TerritoryId": 962,
           "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ],
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKMA103_04359_Q2_000_049",
+              "Yes": true
+            }
+          ],
           "$.0": "[2]"
         },
         {
           },
           "TerritoryId": 962,
           "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ],
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKMA103_04359_Q3_000_055",
+              "Yes": true
+            }
+          ],
           "$.0": "[3]",
           "$.2": "QuestVariables if used first: 1 0 0 0 0 64"
         }
index 6e75b26ad663177c4166cb5c75a9eaa22c96ce66..c7ed8c7d143ddff1a12983f1426de70c415eb6dc 100644 (file)
             "Z": 130.47986
           },
           "TerritoryId": 962,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKMA104_04360_Q3_000_130",
+              "Answer": "TEXT_AKTKMA104_04360_A3_000_131"
+            }
+          ]
         }
       ]
     },
             "Z": 141.1001
           },
           "TerritoryId": 962,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKMA104_04360_Q5_000_150",
+              "Answer": "TEXT_AKTKMA104_04360_A5_000_151"
+            }
+          ]
         }
       ]
     },
             "Z": 148.11926
           },
           "TerritoryId": 962,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKMA104_04360_Q6_000_170",
+              "Answer": "TEXT_AKTKMA104_04360_A6_000_171"
+            }
+          ]
         }
       ]
     },
index 19fbf200fda5fa0b54f5c753aa38cb586f9fde8b..988d57d3426375ac2fa024fae22e6ce67bd6975d 100644 (file)
         },
         {
           "Position": {
-            "X": -425.43683,
-            "Y": 38.413155,
-            "Z": 160.11292
+            "X": -436.3368,
+            "Y": 38.647118,
+            "Z": 166.13683
           },
           "TerritoryId": 957,
           "InteractionType": "WalkTo"
index 9c2b153f28a71a5eae688d4265bea6ed15401289..8d9fb6ed364c1baf616a4c388df6b7ba63932fe7 100644 (file)
             "Z": 28.244385
           },
           "TerritoryId": 957,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKMA118_04374_Q1_000_041",
+              "Yes": true
+            }
+          ]
         }
       ]
     },
             "Z": -555.04694
           },
           "TerritoryId": 957,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKMA118_04374_Q2_000_141",
+              "Yes": true
+            }
+          ]
         }
       ]
     },
index 21c59858750d83c2828c20595846777beedcf02b..34840010c8d3c69f975bddb0026d93d8357f2109 100644 (file)
             "Z": -565.0569
           },
           "TerritoryId": 957,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKMA119_04375_Q1_000_056",
+              "Yes": true
+            }
+          ]
         }
       ]
     },
index 709a45aea3c86e40484773ee930570385a6d7a30..482feffeb3d8dd846a6aa7b9b8b86fb41bfcaea1 100644 (file)
@@ -1,6 +1,9 @@
 {
   "$schema": "https://carvel.li/questionable/quest-1.0",
   "Author": "liza",
+  "TerritoryBlacklist": [
+    952
+  ],
   "QuestSequence": [
     {
       "Sequence": 0,
index 6473b6130a7d95543ff333b8943e09835a357520..3eae20ee8b797cc60d63d9b447fd43f2e1d73d42 100644 (file)
           },
           "StopDistance": 6,
           "TerritoryId": 962,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKMA123_04379_Q1_000_163",
+              "Yes": true
+            }
+          ]
         }
       ]
     }
index fa6d6a21d5d267bf3c0fcd575607861d9c6a7ddd..e968456a471937674591142f0c7ceba742ce987d 100644 (file)
           },
           "TerritoryId": 129,
           "InteractionType": "Interact",
-          "AetheryteShortcut": "Limsa Lominsa"
+          "AetheryteShortcut": "Limsa Lominsa",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKMB102_04381_Q1_000_067",
+              "Yes": true
+            }
+          ]
         }
       ]
     },
index 7d10000e69ab02825f3b92ea091f20c8c5bdd43e..6eae9fa62e595532136c8acf58d62ec9a5996a45 100644 (file)
           },
           "StopDistance": 7,
           "TerritoryId": 621,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKMB103_04382_Q1_000_052",
+              "Yes": true
+            }
+          ]
         }
       ]
     },
           "StopDistance": 7,
           "TerritoryId": 737,
           "InteractionType": "Interact",
-          "Comment": "A-Ruhn-Senna"
+          "Comment": "A-Ruhn-Senna",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
         },
         {
           "DataId": 1038812,
           "StopDistance": 7,
           "TerritoryId": 737,
           "InteractionType": "Interact",
-          "Comment": "Sicard"
+          "Comment": "Sicard",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
         },
         {
           "DataId": 1038813,
           "StopDistance": 7,
           "TerritoryId": 737,
           "InteractionType": "Interact",
-          "Comment": "Lyse"
+          "Comment": "Lyse",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ]
         },
         {
           "DataId": 1038814,
           "StopDistance": 7,
           "TerritoryId": 737,
           "InteractionType": "Interact",
-          "Comment": "Lucia"
+          "Comment": "Lucia",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            16
+          ]
         },
         {
           "DataId": 1038815,
           "StopDistance": 7,
           "TerritoryId": 737,
           "InteractionType": "Interact",
-          "Comment": "Cirina"
+          "Comment": "Cirina",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            8
+          ]
         }
       ]
     },
index 345a81a0c91973fe6b6474bc021f03835ea09e66..1d54df3637b9fff08b870dea7d8deac87f9f6b80 100644 (file)
           },
           "TerritoryId": 621,
           "InteractionType": "SinglePlayerDuty",
-          "Comment": "A Frosty Reception"
+          "Comment": "A Frosty Reception",
+          "DialogueChoices": [
+            {
+              "Type": "ContentTalkList",
+              "Prompt": "264",
+              "Answer": "267"
+            },
+            {
+              "Type": "ContentTalkYesNo",
+              "Prompt": "268",
+              "Yes": true
+            }
+          ]
         }
       ]
     },
index d8b23832fed34e063832472368673fd1090a4d5c..e16247092a4daecf68cbebc60e934ca4caab093b 100644 (file)
         },
         {
           "Position": {
-            "X": -188.58397,
-            "Y": 20.625948,
-            "Z": 408.3002
+            "X": -188.84349,
+            "Y": 20.31553,
+            "Z": 406.13293
           },
+          "StopDistance": 1,
           "TerritoryId": 958,
           "InteractionType": "WalkTo",
           "DisableNavmesh": true,
@@ -75,6 +76,7 @@
             "Y": 3.426586,
             "Z": 360.1115
           },
+          "StopDistance": 1,
           "TerritoryId": 958,
           "InteractionType": "WalkTo",
           "DisableNavmesh": true,
             "Z": 159.10571
           },
           "TerritoryId": 958,
-          "InteractionType": "Interact"
+          "InteractionType": "WalkTo"
         }
       ]
     },
index 711b3ec24cffd93fd6117f87912f011cd5fa7612..94d98301a0cc2923dd1c2bf01fb214db334c116f 100644 (file)
         },
         {
           "Position": {
-            "X": 393.71204,
-            "Y": 4.142438,
-            "Z": 251.71986
+            "X": 394.97046,
+            "Y": 3.652959,
+            "Z": 254.77034
           },
           "TerritoryId": 958,
-          "InteractionType": "ShouldBeAJump",
+          "InteractionType": "Jump",
           "DisableNavmesh": true,
-          "Comment": "Jump on Pipeline and move near the Aether Current"
+          "JumpDestination": {
+            "Position": {
+              "X": 405.0264,
+              "Y": -2.2185562,
+              "Z": 267.40506
+            },
+            "StopDistance": 3
+          }
+        },
+        {
+          "Position": {
+            "X": 405.01987,
+            "Y": -2.2185562,
+            "Z": 298.9302
+          },
+          "TerritoryId": 958,
+          "InteractionType": "Jump",
+          "JumpDestination": {
+            "Position": {
+              "X": 405.01382,
+              "Y": -2.2185562,
+              "Z": 308.17484
+            },
+            "StopDistance": 3
+          }
+        },
+        {
+          "Position": {
+            "X": 404.9343,
+            "Y": -2.2185562,
+            "Z": 338.46368
+          },
+          "TerritoryId": 958,
+          "InteractionType": "Jump",
+          "JumpDestination": {
+            "Position": {
+              "X": 404.9452,
+              "Y": -2.2185562,
+              "Z": 347.15533
+            },
+            "StopDistance": 3
+          }
+        },
+        {
+          "Position": {
+            "X": 405.0104,
+            "Y": -2.2185562,
+            "Z": 379.0302
+          },
+          "TerritoryId": 958,
+          "InteractionType": "Jump",
+          "JumpDestination": {
+            "Position": {
+              "X": 404.98633,
+              "Y": -2.2185562,
+              "Z": 388.4368
+            },
+            "StopDistance": 3
+          }
+        },
+        {
+          "Position": {
+            "X": 405.02594,
+            "Y": -2.2185562,
+            "Z": 419.30426
+          },
+          "TerritoryId": 958,
+          "InteractionType": "Jump",
+          "JumpDestination": {
+            "Position": {
+              "X": 405.00076,
+              "Y": -2.2185562,
+              "Z": 427.6698
+            },
+            "StopDistance": 3
+          }
+        },
+        {
+          "Position": {
+            "X": 405.03207,
+            "Y": -2.2185562,
+            "Z": 457.66095
+          },
+          "TerritoryId": 958,
+          "InteractionType": "Jump",
+          "JumpDestination": {
+            "Position": {
+              "X": 404.94934,
+              "Y": -2.2185562,
+              "Z": 467.3867
+            },
+            "StopDistance": 3
+          }
+        },
+        {
+          "Position": {
+            "X": 405.04044,
+            "Y": -2.2185562,
+            "Z": 498.37363
+          },
+          "TerritoryId": 958,
+          "InteractionType": "Jump",
+          "JumpDestination": {
+            "Position": {
+              "X": 405.158,
+              "Y": -2.2185564,
+              "Z": 508.9487
+            },
+            "StopDistance": 3
+          }
         },
         {
           "DataId": 2012003,
index 8cc0d700b75292c0ee41976e780ddaa1662ea43e..6e96c3c5542ce5f43ecae9f852f7aa50e708b566 100644 (file)
           },
           "TerritoryId": 958,
           "InteractionType": "WaitForManualProgress",
-          "Comment": "Follow Alphinaud and Alisaie"
+          "Comment": "Follow Alphinaud and Alisaie",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKMB108_04387_Q1_000_161",
+              "Yes": true
+            }
+          ]
         }
       ]
     },
index d0383fa8a436578e53aa7bde59a5d95bf6648f3e..81827ee08ed5c3c5ca100403034330aacf527519 100644 (file)
           "TerritoryId": 958,
           "InteractionType": "Interact",
           "Comment": "Caeso",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ],
           "$.0": "[1]",
           "$.1": "QuestVariables if done first: 17 0 0 0 0 64"
         },
           "TerritoryId": 958,
           "InteractionType": "Interact",
           "Comment": "Octavia",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            16
+          ],
           "$.0": "[2]",
           "$.2": "QuestVariables if done after [1]: 33 1 0 0 0 80"
         },
             "Z": -178.38684
           },
           "TerritoryId": 958,
-          "InteractionType": "WalkTo"
+          "InteractionType": "WalkTo",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
         },
         {
           "DataId": 1037715,
           "TerritoryId": 958,
           "InteractionType": "Interact",
           "Comment": "Sabinianus",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ],
           "$.0": "[3]",
           "$.2": "QuestVariables if done after [1, 2]: 49 1 16 0 0 206"
         },
           "TerritoryId": 958,
           "InteractionType": "Interact",
           "Comment": "Marcellinus",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ],
           "$.0": "[4]",
           "$.2": "QuestVariables if done after [1, 2, 3]: 65 17 16 0 0 240"
         },
           "TerritoryId": 958,
           "InteractionType": "Interact",
           "Comment": "Magitek Radio",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            8
+          ],
           "$.0": "[5]"
         }
       ]
index 81aed27d9f7f18d3913e1219bf3a44d07fd3d486..d84e07be6676fb3aa9f745ca834c6ba571da865a 100644 (file)
           "TerritoryId": 958,
           "InteractionType": "Interact",
           "Comment": "Marcellinus",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ],
           "$.1": "QuestVariables if done first: 16 16 0 0 0 128"
         },
         {
           },
           "TerritoryId": 958,
           "InteractionType": "Interact",
-          "Comment": "Octavia"
+          "Comment": "Octavia",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
         }
       ]
     },
             "Z": -422.62915
           },
           "TerritoryId": 958,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKMB113_04392_Q1_000_031",
+              "Answer": "TEXT_AKTKMB113_04392_A1_000_032"
+            }
+          ]
         }
       ]
     },
             "Z": -232.98999
           },
           "TerritoryId": 958,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKMB113_04392_Q2_000_051",
+              "Yes": true
+            }
+          ]
         }
       ]
     },
index 116ea21f7f70e07236dcc15786f8288aa4cd98af..c6c583019ac2d79dd78c308e5b0138f107095add 100644 (file)
           "KillEnemyDataIds": [
             14078
           ],
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ],
           "$.0": "[1]",
           "$.1": "QuestVariables if done first: (before) 0 0 2 0 0 0 (after) 16 16 2 0 0 64"
         },
           "Comment": "TODO Needs item use?",
           "ItemId": 2003231,
           "ItemUseHealthMaxPercent": 10,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ],
           "$.0": "[2]",
           "$.1": "QuestVariables if done after [1]: 32 17 1 0 0 96"
         },
           },
           "TerritoryId": 958,
           "InteractionType": "Interact",
-          "Comment": "TODO Maybe move the train station aether current interaction before this",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ],
           "$.0": "[3]",
           "$.1": "QuestVariables if done after [1, 2]: 49 17 1 0 0 224"
         },
           "Comment": "TODO Needs item use?",
           "ItemId": 2003231,
           "ItemUseHealthMaxPercent": 10,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            16
+          ],
           "$.0": "[4]"
         }
       ]
index 25b94232ac28943174d4181341eb6026b25b0381..e99a2460ce825edf74698377b79eb25e1241db7a 100644 (file)
@@ -1,6 +1,9 @@
 {
   "$schema": "https://carvel.li/questionable/quest-1.0",
   "Author": "liza",
+  "TerritoryBlacklist": [
+    1011
+  ],
   "QuestSequence": [
     {
       "Sequence": 0,
           },
           "TerritoryId": 958,
           "InteractionType": "SinglePlayerDuty",
-          "Comment": "In from the Cold"
+          "Comment": "In from the Cold",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKMB115_04394_Q1_000_042",
+              "Yes": true
+            }
+          ]
         }
       ]
     },
@@ -43,6 +53,7 @@
             "Y": 22.20836,
             "Z": 403.76892
           },
+          "StopDistance": 5,
           "TerritoryId": 958,
           "InteractionType": "Interact"
         }
index c3ac8466290237ab9fe2873571ebe2077c4cf0da..85247d7e58477510478b6199a4c6a513554b24db 100644 (file)
@@ -1,6 +1,9 @@
 {
   "$schema": "https://carvel.li/questionable/quest-1.0",
   "Author": "liza",
+  "TerritoryBlacklist": [
+    969
+  ],
   "QuestSequence": [
     {
       "Sequence": 0,
             "Z": -677.4243
           },
           "TerritoryId": 958,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKMB116_04395_Q3_000_206",
+              "Yes": true
+            }
+          ]
         },
         {
           "DataId": 2012112,
             "Y": 0,
             "Z": 33.585083
           },
+          "StopDistance": 4,
           "TerritoryId": 1024,
           "InteractionType": "Interact"
         }
index 3e5fbbefd4fe66eb3cba8e879c77f9e05b171dc8..05c47368ee8ea9b10c5ad5443746df7020b89bb4 100644 (file)
             "Z": -0.00103838
           },
           "TerritoryId": 1024,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKMB117_04396_Q1_000_060",
+              "Yes": true
+            }
+          ]
         }
       ]
     },
index 51e28375d95a31f014be4171b33b5acbf0910380..8512b2e40441ee52ac80a736cf2fa5c5f1a58c3f 100644 (file)
             "Z": 467.46008
           },
           "TerritoryId": 959,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKMB119_04398_Q1_000_001",
+              "Answer": "TEXT_AKTKMB119_04398_A1_000_002"
+            }
+          ]
         }
       ]
     },
             "Z": 467.46008
           },
           "TerritoryId": 959,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKMB119_04398_Q2_000_010",
+              "Yes": true
+            }
+          ]
         }
       ]
     },
index 6fe492444418dbf14edc7853bb73d07bf9ad1468..e47ddb6fe01d672cc6bc60f112e383b5c52ffa38 100644 (file)
           },
           "StopDistance": 5,
           "TerritoryId": 959,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKMC102_04400_Q1_000_151",
+              "Yes": true
+            }
+          ]
         }
       ]
     },
index e29218484f1cceb8eb17a9abe0b8a8bfcf14a30f..edaf5084fecb4a7d53876903ddd6527b08e4c634 100644 (file)
@@ -1,6 +1,7 @@
 {
   "$schema": "https://carvel.li/questionable/quest-1.0",
   "Author": "liza",
+  "Comment": "TODO add aether current (2818368) here since it can't be reached later with mount speed 0",
   "QuestSequence": [
     {
       "Sequence": 0,
     {
       "Sequence": 255,
       "Steps": [
+        {
+          "Position": {
+            "X": -9.783533,
+            "Y": -49.589592,
+            "Z": -339.60205
+          },
+          "TerritoryId": 959,
+          "InteractionType": "WalkTo"
+        },
         {
           "Position": {
             "X": -72.39724,
index 8f90639fa0abef44d3fa7db001b674f4a8d7cdf5..ed304e3a892e8555512d130548b32e974ea52db1 100644 (file)
         {
           "DataId": 2012178,
           "TerritoryId": 959,
+          "StopDistance": 3,
           "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKMC104_04402_Q1_000_071",
+              "Answer": "TEXT_AKTKMC104_04402_A1_000_074"
+            },
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKMC104_04402_Q2_000_081",
+              "Yes": true
+            }
+          ],
           "Comment": "Navmesh can't jump"
         }
       ]
         },
         {
           "DataId": 1038912,
-          "StopDistance": 5,
+          "Position": {
+            "X": -462.06528,
+            "Y": -155.5629,
+            "Z": -625.5277
+          },
+          "TerritoryId": 959,
+          "InteractionType": "Jump",
+          "JumpDestination": {
+            "Position": {
+              "X": -453.99258,
+              "Y": -168,
+              "Z": -618.5703
+            },
+            "StopDistance": 8
+          }
+        },
+        {
+          "DataId": 1038912,
+          "Position": {
+            "X": -455.40552,
+            "Y": -168,
+            "Z": -620.05035
+          },
           "TerritoryId": 959,
           "InteractionType": "Interact",
-          "Comment": "Navmesh can't jump"
+          "DialogueChoices": [
+          ]
         }
       ]
     },
index 3223e91a8f6fec167934421c0ea466058a651c19..f48c68c2e728becae55fec22924a9cf529bfdf55 100644 (file)
           "StopDistance": 5,
           "TerritoryId": 959,
           "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKMC105_04403_Q1_000_073",
+              "Answer": "TEXT_AKTKMC105_04403_A1_000_075"
+            }
+          ],
           "Comment": "Navmesh can't jump"
         }
       ]
           "StopDistance": 5,
           "TerritoryId": 959,
           "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKMC105_04403_Q1_000_118",
+              "Answer": "TEXT_AKTKMC105_04403_A1_000_120"
+            }
+          ],
           "Comment": "Navmesh can't jump"
         }
       ]
           },
           "TerritoryId": 959,
           "InteractionType": "Interact",
-          "AetheryteShortcut": "Mare Lamentorum - Bestways Burrow"
+          "AetheryteShortcut": "Mare Lamentorum - Bestways Burrow",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKMC105_04403_SYSTEM_000_215",
+              "Yes": true
+            }
+          ]
         }
       ]
     },
index 4293bb8f6a698a8c5a2e6cca01bb73184a0f318e..201cd1886cb60206dcd5cf9febb871a21649d418 100644 (file)
             "Z": -494.13293
           },
           "TerritoryId": 959,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKMC106_04404_Q1_000_021",
+              "Answer": "TEXT_AKTKMC106_04404_A1_000_022"
+            }
+          ]
         }
       ]
     },
index 6131425d9c16e35d7eb6194be7c4bc4f5c584006..a75f5f0e8d4e67fdcb938ec90bd1b7685d33c1b8 100644 (file)
@@ -46,7 +46,7 @@
           },
           "TerritoryId": 959,
           "InteractionType": "SinglePlayerDuty",
-          "Comment": "Follow Urianger"
+          "Comment": "Follow Urianger (TODO is this sequence used?)"
         }
       ]
     },
@@ -62,7 +62,7 @@
           },
           "TerritoryId": 959,
           "InteractionType": "SinglePlayerDuty",
-          "Comment": "Follow Urianger (but you failed the first time)"
+          "Comment": "Follow Urianger"
         }
       ]
     },
index ed498ea1fb0839fe1125ab0bc5a196907b2b5b2b..f84dcfd5805797aa04d26cbff6fd7bb2be79a27b 100644 (file)
             "Z": -558.8681
           },
           "TerritoryId": 959,
-          "InteractionType": "ShouldBeAJump",
+          "InteractionType": "Jump",
           "AetheryteShortcut": "Mare Lamentorum - Bestways Burrow",
-          "Comment": "Navmesh can't jump"
+          "JumpDestination": {
+            "Position": {
+              "X": 307.72073,
+              "Y": -143.15913,
+              "Z": -563.4788
+            },
+            "StopDistance": 5
+          }
         },
         {
           "DataId": 2012012,
index dbd2af4da8aaf5fc6904db75958ee858566147b2..a417052bf3293e17fa84c3a4bdbd9dc266b6e33e 100644 (file)
           "TerritoryId": 959,
           "InteractionType": "Interact",
           "AetheryteShortcut": "Mare Lamentorum - Bestways Burrow",
-          "Comment": "Teleporter"
+          "TargetTerritoryId": 959,
+          "SkipIf": [
+            "Never"
+          ]
         },
         {
           "Position": {
index b0e712a6655a9f1fe9451cf9f69e75ff11a2b70d..0c584860f46cd20eb8a3aaeb7a5b755b06269299 100644 (file)
@@ -39,7 +39,8 @@
             "Z": 728.96924
           },
           "TerritoryId": 959,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "TargetTerritoryId": 1024
         },
         {
           "DataId": 1038960,
             "Z": -5.081299
           },
           "TerritoryId": 987,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKMC110_04408_Q3_000_170",
+              "Yes": true
+            }
+          ]
         }
       ]
     },
           "AethernetShortcut": [
             "[Old Sharlayan] Aetheryte Plaza",
             "[Old Sharlayan] The Baldesion Annex"
+          ],
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKMC110_04408_Q4_000_204",
+              "Yes": true
+            }
           ]
         }
       ]
index 069e95df9d1b2441b4d1980b9b82c232cf2df423..ef589423a08716a5b148622e475375c9213b4a95 100644 (file)
@@ -1,6 +1,9 @@
 {
   "$schema": "https://carvel.li/questionable/quest-1.0",
   "Author": "liza",
+  "TerritoryBlacklist": [
+    970
+  ],
   "QuestSequence": [
     {
       "Sequence": 0,
index a72c9042c4a9fe13e51a1c63020578c4311ce64f..a23d73f86622b627cc7b428d1b349f51316d7f79 100644 (file)
           },
           "TerritoryId": 963,
           "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ],
           "Comment": "Varsra"
         },
         {
           },
           "TerritoryId": 963,
           "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ],
           "Comment": "Zeytahnur"
         },
         {
           },
           "TerritoryId": 963,
           "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ],
           "Comment": "Rahdvira"
         }
       ]
index 7cc17766837155e1104566a4a8b770dedebf80a5..82f83cbe703894206d99671ce7c5954e50759a2b 100644 (file)
             "Z": -330.46472
           },
           "TerritoryId": 957,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKMD105_04413_Q1_000_095",
+              "Answer": "TEXT_AKTKMD105_04413_A1_000_096"
+            }
+          ]
         }
       ]
     },
index a540b3e6332448a1314721f169a6858339a2e96f..3e6c3e564718b5c46514a8e71bcd77eadef1c8b4 100644 (file)
           "KillEnemyDataIds": [
             13987
           ],
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ],
           "$.0": "[1]",
           "$.1": "QuestVariables if done first: 16 1 0 0 0 128"
         },
           "KillEnemyDataIds": [
             13986
           ],
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ],
           "$.0": "[2]",
           "$.1": "QuestVariables if done after [1]: 33 1 0 0 0 192",
           "$.2": "QuestVariables if done after [3]: 33 32 0 0 0 96"
             13985,
             13984
           ],
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ],
           "$.0": "[3]",
           "$.2": "QuestVariables if done first: 16 32 0 0 0 32"
         }
index a045b5ac962d1673176054004da69e48b42a5b69..2b93258daa2710e1ada912c40fb1653249a1b912 100644 (file)
@@ -52,6 +52,7 @@
     },
     {
       "Sequence": 3,
+      "Comment": "TODO Check flags",
       "Steps": [
         {
           "DataId": 1037628,
             "Z": -243.76288
           },
           "TerritoryId": 957,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
         },
         {
           "DataId": 1040449,
             "Z": -238.3612
           },
           "TerritoryId": 957,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
         },
         {
           "DataId": 1037629,
             "Z": -200.85455
           },
           "TerritoryId": 957,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ]
         }
       ]
     },
index 51f9e948c063a122e59d5b7c7d12af60b0539d14..c1eea5b6e1ff300f8a18eaf260c19ee10e8efc48 100644 (file)
             "Z": -87.90729
           },
           "TerritoryId": 963,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKMD110_04418_Q2_000_172",
+              "Answer": "TEXT_AKTKMD110_04418_A2_000_173"
+            }
+          ]
         }
       ]
     },
           "AethernetShortcut": [
             "[Radz-at-Han] Hall of the Radiant Host",
             "[Radz-at-Han] Mehryde's Meyhane"
+          ],
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKMD110_04418_Q3_000_223",
+              "Answer": "TEXT_AKTKMD110_04418_A3_000_225"
+            }
           ]
         }
       ]
index ceab4a96f8292e73a71259438e9e04ba81c4207a..de65b0a50edb1cfd8652d6cc33abc1e4c4795cac 100644 (file)
             "Z": -210.52875
           },
           "TerritoryId": 819,
-          "InteractionType": "WaitForManualProgress",
-          "Comment": "Cutscene Interaction needed",
+          "InteractionType": "Interact",
           "AetheryteShortcut": "Crystarium",
           "AethernetShortcut": [
             "[Crystarium] Aetheryte Plaza",
             "[Crystarium] The Cabinet of Curiosity"
+          ],
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKME101_04419_Q2_000_071",
+              "Yes": true
+            },
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKME101_04419_Q3_000_083",
+              "Answer": "TEXT_AKTKME101_04419_A3_000_087"
+            },
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKME101_04419_Q4_000_113",
+              "Answer": "TEXT_AKTKME101_04419_A4_000_114"
+            },
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKME101_04419_Q5_000_129",
+              "Answer": "TEXT_AKTKME101_04419_A5_000_131"
+            }
           ]
         }
       ]
index 5630fd9ff3ae6947d8f870ceab460ca697792961..41e2d48e998f91d5cade1249dbe5544c59aa1ab0 100644 (file)
@@ -33,7 +33,9 @@
           "AethernetShortcut": [
             "[Crystarium] The Cabinet of Curiosity",
             "[Crystarium] The Dossal Gate"
-          ]
+          ],
+          "Comment": "TODO Check target territory id",
+          "TargetTerritoryId": 844
         }
       ]
     },
             "Z": -4.654831
           },
           "TerritoryId": 1031,
-          "InteractionType": "WalkTo"
+          "InteractionType": "Jump",
+          "JumpDestination": {
+            "Position": {
+              "X": -1.5539734,
+              "Y": 3.6164591,
+              "Z": -1.1141448
+            }
+          },
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            16
+          ]
         },
         {
           "DataId": 2012128,
+          "Position": {
+            "X": -0.001528129,
+            "Y": 4.931927,
+            "Z": 0.01416349
+          },
           "TerritoryId": 1031,
           "InteractionType": "Interact",
-          "Comment": "Interact with Aetheryte (Navmesh can't jump)",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            16
+          ],
           "$.0": "[1]",
           "$.1": "QuestVariables if done first: 16 0 16 0 0 16"
         },
           },
           "TerritoryId": 1031,
           "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ],
           "$.0": "[2]",
           "$": "QuestVariables after: 32 1 16 0 0 144"
         },
           },
           "TerritoryId": 1031,
           "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ],
           "$.0": "[3]",
           "$.1": "QuestVariables after: 49 1 16 0 0 208"
         },
           },
           "TerritoryId": 1031,
           "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ],
           "$.0": "[4]",
           "$.2": "QuestVariables if done first: 16 16 0 0 0 32"
         }
index a8d89fff0ac45e936646e3af02d3bf1dd99d94b0..5b33b5f06980a5c157c48400ad74740909b91281 100644 (file)
             "Z": 157.61035
           },
           "TerritoryId": 961,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKME104_04422_Q1_000_094",
+              "Answer": "TEXT_AKTKME104_04422_A1_000_095"
+            }
+          ]
         }
       ]
     }
index b9d0e5d28258af5aa0e2c7448f98e5d4e49ff785..09b962e2552487aaa05383e560899e53639c6967 100644 (file)
             "Z": 73.258545
           },
           "TerritoryId": 961,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKME105_04423_Q1_000_106",
+              "Answer": "TEXT_AKTKME105_04423_A1_000_107"
+            }
+          ]
         }
       ]
     },
             "Z": 121.47705
           },
           "TerritoryId": 961,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKME105_04423_Q4_000_178",
+              "Answer": "TEXT_AKTKME105_04423_A4_000_180"
+            }
+          ]
         }
       ]
     },
             "Z": 107.133545
           },
           "TerritoryId": 961,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKME105_04423_Q7_000_313",
+              "Answer": "TEXT_AKTKME105_04423_A7_000_314"
+            }
+          ]
         }
       ]
     },
index 39be27cde60a0c24f0c53f3451c3fc08460aab28..3de56d84aa9a580dc448c91bac3fb8fb3df21397 100644 (file)
             "Z": 63.70642
           },
           "TerritoryId": 961,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKME107_04425_Q1_000_024",
+              "Answer": "TEXT_AKTKME107_04425_A1_000_025"
+            }
+          ]
         }
       ]
     },
index 9bb363bc1f6ede088260a50517eff4254cdd91a3..6c61e46bf0f97c7335b71eb948a98cfdf989cd30 100644 (file)
           },
           "TerritoryId": 961,
           "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ],
           "$.1": "QuestVariables if done first: 1 0 0 0 0 128"
         },
         {
             "Z": 543.572
           },
           "TerritoryId": 961,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
         }
       ]
     },
             "Z": 460.77673
           },
           "TerritoryId": 961,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKME109_04427_Q3_000_163",
+              "Answer": "TEXT_AKTKME109_04427_A3_000_164"
+            }
+          ]
         }
       ]
     },
index f2751646a8abac96aa6a9bc11e2c3b82cb29e0b0..7a220579a1996d0544f24b53254dcd646138eac1 100644 (file)
             "Z": -113.81708
           },
           "TerritoryId": 961,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKME111_04429_Q2_000_094",
+              "Answer": "TEXT_AKTKME111_04429_A2_000_096"
+            }
+          ]
         }
       ]
     }
index 3d748254944bde2806997b3c89e0cf004e023255..3bcc5a97ff151465ee4e1a88f07b2777cb421e4d 100644 (file)
             "Z": -173.75458
           },
           "TerritoryId": 961,
-          "InteractionType": "WaitForManualProgress",
-          "Comment": "Talk (1, 2, 1)"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKME112_04430_Q1_000_072",
+              "Yes": true
+            },
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKME112_04430_Q2_000_076",
+              "Answer": "TEXT_AKTKME112_04430_A2_000_077"
+            },
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKME112_04430_Q3_000_089",
+              "Answer": "TEXT_AKTKME112_04430_A3_000_091"
+            },
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKME112_04430_Q4_000_098",
+              "Answer": "TEXT_AKTKME112_04430_A4_000_099"
+            }
+          ]
         }
       ]
     },
             "Z": -155.5047
           },
           "TerritoryId": 961,
-          "InteractionType": "WaitForManualProgress",
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKME112_04430_Q5_000_152",
+              "Yes": true
+            },
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKME112_04430_Q6_000_154",
+              "Answer": "TEXT_AKTKME112_04430_A6_000_156"
+            },
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKME112_04430_Q7_000_168",
+              "Answer": "TEXT_AKTKME112_04430_A7_000_170"
+            },
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKME112_04430_Q8_000_181",
+              "Answer": "TEXT_AKTKME112_04430_A8_000_182"
+            }
+          ],
           "Comment": "Talk (2, 2, 1)"
         }
       ]
index 277b19a02c0176c905de410cffd698785ae47e97..55965d8b206a348bfba1dc9e3594e665518e3995 100644 (file)
             "Z": -175.24994
           },
           "TerritoryId": 961,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKME113_04431_Q1_000_014",
+              "Answer": "TEXT_AKTKME113_04431_A1_000_016"
+            }
+          ]
         }
       ]
     },
index fdf7b81c49afea73923fb5854f15466a039d645e..2cb8c3836ace6fed88dc60e28447b59b8ed267ab 100644 (file)
             "Z": 198.68762
           },
           "TerritoryId": 961,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKME115_04433_Q1_000_021",
+              "Yes": true
+            }
+          ]
         }
       ]
     },
             "Z": -367.48303
           },
           "TerritoryId": 961,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKME115_04433_Q2_000_062",
+              "Yes": true
+            }
+          ]
         }
       ]
     },
index 7850888caf14cdeb97440267aa3df6b974e8f420..c6b7e18de0a30aafb81b149ed71d041894bf56d2 100644 (file)
             "Z": -653.13196
           },
           "TerritoryId": 961,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKME116_04434_Q1_000_021",
+              "Yes": true
+            }
+          ]
         }
       ]
     },
index d21a65b01dde2e2f8358508959e8becdb9acafaa..04992128037decc73a4be96390aa20f0f0944c65 100644 (file)
           },
           "TerritoryId": 961,
           "InteractionType": "Interact",
-          "Fly": true
+          "Fly": true,
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKME120_04438_Q1_000_008",
+              "Yes": true
+            }
+          ]
         }
       ]
     },
index 95764d141702903c0ebc699c0c21e03d109e3ff8..d587d581de968cb7905f4317c25b77723f5ce3c4 100644 (file)
             "Z": -393.36237
           },
           "TerritoryId": 956,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKMF103_04441_Q1_000_096",
+              "Yes": true
+            }
+          ]
         },
         {
           "DataId": 1039711,
             "Z": 302.11328
           },
           "TerritoryId": 956,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKMF103_04441_Q1_000_181",
+              "Yes": true
+            }
+          ]
         }
       ]
     },
index cd00f5c787ef9bee0e26556a5def82cbc5fd954d..14dea50cdda1e0197509955a9bbdc5e5ba40d244 100644 (file)
           },
           "TerritoryId": 956,
           "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ],
           "$.0": "[1] Navmesh navigates here first, even if you feed it [2]",
           "$.1": "QuestVariables if done first: 1 0 0 0 0 64"
         },
           },
           "TerritoryId": 956,
           "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ],
           "$.0": "[2]",
           "$.1": "QuestVariables after: 2 0 0 0 0 192"
         },
             "Z": -14.450317
           },
           "TerritoryId": 956,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ]
         }
       ]
     },
index 38c2dbaf7822a14162e589bccc7339ee63aac811..05ca4eb275eb36cf7e38d3a6af7ee65d2fb3ab81 100644 (file)
             "Z": 298.72583
           },
           "TerritoryId": 956,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "TargetTerritoryId": 956,
+          "SkipIf": [
+            "Never"
+          ]
         },
         {
           "DataId": 1040397,
index f0b1fc983436f3445c716fc196f0d2c0fdb5d181..e43a5ca7109825cba66d592ec61c1f0f37af6e04 100644 (file)
           },
           "StopDistance": 0.25,
           "TerritoryId": 956,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKMF106_04444_Q3_000_125",
+              "Answer": "TEXT_AKTKMF106_04444_A3_000_126"
+            }
+          ]
         }
       ]
     },
             "Z": 299.8855
           },
           "TerritoryId": 956,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_AKTKMF106_04444_Q4_000_272",
+              "Answer": "TEXT_AKTKMF106_04444_A4_000_273"
+            }
+          ]
         }
       ]
     }
index 23f73707ed0cee2b03cadf964428c74142a09187..93cc272c5d6965efce352c1251fbf56243dc1fa7 100644 (file)
           "TerritoryId": 956,
           "InteractionType": "Interact",
           "Comment": "Distracted Researcher",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            2,
+            null
+          ],
           "$.0": "[1]",
           "$.1": "QuestVariables if done first: 1 0 0 0 2 0"
         },
           "TerritoryId": 956,
           "InteractionType": "Interact",
           "Comment": "Hyperventilating Engineer",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            128,
+            null
+          ],
           "$.0": "[2]",
           "$.1": "QuestVariables if done after [1]: 2 0 0 0 130 0"
         },
           "TerritoryId": 956,
           "InteractionType": "Interact",
           "Comment": "Harried Aetherologist",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            8,
+            null
+          ],
           "$.0": "[3]",
           "$.1": "QuestVariables if done after [2]: 3 0 0 0 138 0"
         },
           "TerritoryId": 956,
           "InteractionType": "Interact",
           "Comment": "Grimacing Naturalist",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            4,
+            null
+          ],
+          "Mount": true,
           "$.0": "[4]",
           "$.1": "QuestVariables if done after [3]: 4 0 0 0 142 0"
         },
           "TerritoryId": 956,
           "InteractionType": "Interact",
           "Comment": "Ponderous Mathematician",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            64,
+            null
+          ],
           "$.0": "[5]",
           "$.1": "QuestVariables if done after [4]: 5 0 0 0 206 0"
         },
           "TerritoryId": 956,
           "InteractionType": "Interact",
           "Comment": "Despondent Engineer",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            32,
+            null
+          ],
           "Mount": true,
           "$.0": "[6]",
           "$.1": "QuestVariables if done after [5]: 6 0 0 0 238 0"
           "TerritoryId": 956,
           "InteractionType": "Interact",
           "Comment": "Skeptical Researcher",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            1,
+            null
+          ],
           "Mount": true,
           "$.0": "[7]",
           "$.1": "QuestVariables if done after [6]: 7 0 0 0 239 0"
           "TerritoryId": 956,
           "InteractionType": "Interact",
           "Comment": "Anxious Engineer",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            16,
+            null
+          ],
           "$.0": "[8]",
           "$.2": "QuestVariables if done first: 1 0 0 0 16 0"
         }
index 4574f6d0b5ed1e2fc80ea1d83aaa84cdecba2231..d0dae4ea3a4d5b5ee27067dc6b0cc265ed6cebd4 100644 (file)
             "Z": -81.28485
           },
           "TerritoryId": 956,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKMF110_04448_Q1_000_031",
+              "Yes": true
+            }
+          ]
         }
       ]
     },
             "Z": 302.17432
           },
           "TerritoryId": 956,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_AKTKMF110_04448_Q2_000_111",
+              "Yes": true
+            }
+          ]
         }
       ]
     },
index ff33740aa79ce0575f6ac9aec610ba5a1e6d8bcc..58c9890775350625f7310b6a7ef641bed4e47e85 100644 (file)
                   "if": {
                     "properties": {
                       "InteractionType": {
-                        "const": "Interact"
+                        "anyOf": [
+                          {
+                            "const": "Interact"
+                          },
+                          {
+                            "const": "SinglePlayerDuty"
+                          },
+                          {
+                            "const": "WaitForManualProgress"
+                          }
+                        ]
                       }
                     }
                   },
                               "type": "string",
                               "enum": [
                                 "YesNo",
-                                "List"
+                                "List",
+                                "ContentTalkYesNo",
+                                "ContentTalkList"
                               ]
                             },
                             "ExcelSheet": {
                               "type": "string"
                             },
                             "Prompt": {
-                              "type": "string"
+                              "type": [
+                                "string",
+                                "null"
+                              ]
                             }
                           },
                           "required": [
                               "if": {
                                 "properties": {
                                   "Type": {
-                                    "const": "YesNo"
+                                    "anyOf": [
+                                      {
+                                        "const": "YesNo"
+                                      },
+                                      {
+                                        "const": "ContentTalkYesNo"
+                                      }
+                                    ]
                                   }
                                 }
                               },
                               "if": {
                                 "properties": {
                                   "Type": {
-                                    "const": "List"
+                                    "anyOf": [
+                                      {
+                                        "const": "List"
+                                      },
+                                      {
+                                        "const": "ContentTalkList"
+                                      }
+                                    ]
                                   }
                                 }
                               },
index 63884ed37113b1ec79046672752ddbca26ba3454..fc15fb0b6d1cdce3eb16c52878e202e3aa571a26 100644 (file)
@@ -1,4 +1,6 @@
 using System;
+using System.Collections.Generic;
+using System.Globalization;
 using System.Linq;
 using Dalamud.Game.Addon.Lifecycle;
 using Dalamud.Game.Addon.Lifecycle.AddonArgTypes;
@@ -19,110 +21,216 @@ internal sealed class GameUiController : IDisposable
     private readonly IDataManager _dataManager;
     private readonly GameFunctions _gameFunctions;
     private readonly QuestController _questController;
+    private readonly IGameGui _gameGui;
     private readonly IPluginLog _pluginLog;
 
     public GameUiController(IClientState clientState, IAddonLifecycle addonLifecycle, IDataManager dataManager,
-        GameFunctions gameFunctions, QuestController questController, IPluginLog pluginLog)
+        GameFunctions gameFunctions, QuestController questController, IGameGui gameGui, IPluginLog pluginLog)
     {
         _clientState = clientState;
         _addonLifecycle = addonLifecycle;
         _dataManager = dataManager;
         _gameFunctions = gameFunctions;
         _questController = questController;
+        _gameGui = gameGui;
         _pluginLog = pluginLog;
 
         _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "SelectString", SelectStringPostSetup);
         _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "CutSceneSelectString", CutsceneSelectStringPostSetup);
+        _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "SelectIconString", SelectIconStringPostSetup);
         _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "SelectYesno", SelectYesnoPostSetup);
         _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "Credit", CreditPostSetup);
         _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "AkatsukiNote", UnendingCodexPostSetup);
     }
 
+    internal unsafe void HandleCurrentDialogueChoices()
+    {
+        if (_gameGui.TryGetAddonByName("SelectString", out AddonSelectString* addonSelectString))
+        {
+            _pluginLog.Information("SelectString window is open");
+            SelectStringPostSetup(addonSelectString);
+        }
+
+        if (_gameGui.TryGetAddonByName("CutSceneSelectString",
+                out AddonCutSceneSelectString* addonCutSceneSelectString))
+        {
+            _pluginLog.Information("CutSceneSelectString window is open");
+            CutsceneSelectStringPostSetup(addonCutSceneSelectString);
+        }
+
+        if (_gameGui.TryGetAddonByName("SelectIconString", out AddonSelectIconString* addonSelectIconString))
+        {
+            _pluginLog.Information("SelectIconString window is open");
+            SelectIconStringPostSetup(addonSelectIconString);
+        }
+
+        if (_gameGui.TryGetAddonByName("SelectYesno", out AddonSelectYesno* addonSelectYesno))
+        {
+            _pluginLog.Information("SelectYesno window is open");
+            SelectYesnoPostSetup(addonSelectYesno);
+        }
+    }
+
     private unsafe void SelectStringPostSetup(AddonEvent type, AddonArgs args)
     {
         AddonSelectString* addonSelectString = (AddonSelectString*)args.Addon;
+        SelectStringPostSetup(addonSelectString);
+    }
+
+    private unsafe void SelectStringPostSetup(AddonSelectString* addonSelectString)
+    {
         string? actualPrompt = addonSelectString->AtkUnitBase.AtkValues[2].ReadAtkString();
         if (actualPrompt == null)
             return;
 
-        var currentQuest = _questController.CurrentQuest;
-        if (currentQuest == null)
-            return;
-
-        var quest = currentQuest.Quest;
-        var step = quest.FindSequence(currentQuest.Sequence)?.FindStep(currentQuest.Step);
-        if (step == null)
-            return;
+        List<string?> answers = new();
+        for (ushort i = 7; i < addonSelectString->AtkUnitBase.AtkValuesCount; ++i)
+            answers.Add(addonSelectString->AtkUnitBase.AtkValues[i].ReadAtkString());
 
-        foreach (var dialogueChoice in step.DialogueChoices)
+        int? answer = HandleListChoice(actualPrompt, answers);
+        if (answer != null)
         {
-            if (dialogueChoice.Answer == null)
-                continue;
-
-            string? excelPrompt =
-                _gameFunctions.GetExcelString(quest, dialogueChoice.ExcelSheet, dialogueChoice.Prompt);
-            string? excelAnswer =
-                _gameFunctions.GetExcelString(quest, dialogueChoice.ExcelSheet, dialogueChoice.Answer);
-            if (excelPrompt == null || actualPrompt != excelPrompt)
-                continue;
-
-            for (ushort i = 7; i <= addonSelectString->AtkUnitBase.AtkValuesCount; ++i)
-            {
-                string? actualAnswer = addonSelectString->AtkUnitBase.AtkValues[i].ReadAtkString();
-                if (actualAnswer == null || actualAnswer != excelAnswer)
-                    continue;
-
-                _questController.IncreaseDialogueChoicesSelected();
-                addonSelectString->AtkUnitBase.FireCallbackInt(i - 7);
-                return;
-            }
+            _questController.IncreaseDialogueChoicesSelected();
+            addonSelectString->AtkUnitBase.FireCallbackInt(answer.Value);
         }
     }
 
     private unsafe void CutsceneSelectStringPostSetup(AddonEvent type, AddonArgs args)
     {
         AddonCutSceneSelectString* addonCutSceneSelectString = (AddonCutSceneSelectString*)args.Addon;
+        CutsceneSelectStringPostSetup(addonCutSceneSelectString);
+    }
+
+    private unsafe void CutsceneSelectStringPostSetup(AddonCutSceneSelectString* addonCutSceneSelectString)
+    {
         string? actualPrompt = addonCutSceneSelectString->AtkUnitBase.AtkValues[2].ReadAtkString();
         if (actualPrompt == null)
             return;
 
+        List<string?> answers = new();
+        for (int i = 5; i < addonCutSceneSelectString->AtkUnitBase.AtkValuesCount; ++i)
+            answers.Add(addonCutSceneSelectString->AtkUnitBase.AtkValues[i].ReadAtkString());
+
+        int? answer = HandleListChoice(actualPrompt, answers);
+        if (answer != null)
+        {
+            _questController.IncreaseDialogueChoicesSelected();
+            addonCutSceneSelectString->AtkUnitBase.FireCallbackInt(answer.Value);
+        }
+    }
+
+    private unsafe void SelectIconStringPostSetup(AddonEvent type, AddonArgs args)
+    {
+        AddonSelectIconString* addonSelectIconString = (AddonSelectIconString*)args.Addon;
+        SelectIconStringPostSetup(addonSelectIconString);
+    }
+
+    private unsafe void SelectIconStringPostSetup(AddonSelectIconString* addonSelectIconString)
+    {
+        string? actualPrompt = addonSelectIconString->AtkUnitBase.AtkValues[3].ReadAtkString();
+        if (string.IsNullOrEmpty(actualPrompt))
+            actualPrompt = null;
+
+        List<string?> answers = new();
+        for (ushort i = 0; i < addonSelectIconString->AtkUnitBase.AtkValues[5].Int; i++)
+            answers.Add(addonSelectIconString->AtkUnitBase.AtkValues[i * 3 + 7].ReadAtkString());
+
+        int? answer = HandleListChoice(actualPrompt, answers);
+        if (answer != null)
+        {
+            _questController.IncreaseDialogueChoicesSelected();
+            addonSelectIconString->AtkUnitBase.FireCallbackInt(answer.Value);
+        }
+    }
+
+
+    private int? HandleListChoice(string? actualPrompt, List<string?> answers)
+    {
         var currentQuest = _questController.CurrentQuest;
         if (currentQuest == null)
-            return;
+        {
+            _pluginLog.Information("Ignoring list choice, no active quest");
+            return null;
+        }
 
         var quest = currentQuest.Quest;
         var step = quest.FindSequence(currentQuest.Sequence)?.FindStep(currentQuest.Step);
         if (step == null)
-            return;
+        {
+            _pluginLog.Information("Ignoring list choice, no active step");
+            return null;
+        }
 
-        foreach (DialogueChoice dialogueChoice in step.DialogueChoices)
+        foreach (var dialogueChoice in step.DialogueChoices)
         {
             if (dialogueChoice.Answer == null)
+            {
+                _pluginLog.Information("Ignoring entry in DialogueChoices, no answer");
                 continue;
+            }
 
-            string? excelPrompt =
-                _gameFunctions.GetExcelString(quest, dialogueChoice.ExcelSheet, dialogueChoice.Prompt);
-            string? excelAnswer =
-                _gameFunctions.GetExcelString(quest, dialogueChoice.ExcelSheet, dialogueChoice.Answer);
-            if (excelPrompt == null || actualPrompt != excelPrompt)
+            string? excelPrompt = null, excelAnswer;
+            switch (dialogueChoice.Type)
+            {
+                case EDialogChoiceType.ContentTalkList:
+                    if (dialogueChoice.Prompt != null)
+                    {
+                        excelPrompt =
+                            _gameFunctions.GetContentTalk(uint.Parse(dialogueChoice.Prompt,
+                                CultureInfo.InvariantCulture));
+                    }
+
+                    excelAnswer =
+                        _gameFunctions.GetContentTalk(uint.Parse(dialogueChoice.Answer, CultureInfo.InvariantCulture));
+                    break;
+                case EDialogChoiceType.List:
+                    if (dialogueChoice.Prompt != null)
+                    {
+                        excelPrompt =
+                            _gameFunctions.GetDialogueText(quest, dialogueChoice.ExcelSheet, dialogueChoice.Prompt);
+                    }
+
+                    excelAnswer =
+                        _gameFunctions.GetDialogueText(quest, dialogueChoice.ExcelSheet, dialogueChoice.Answer);
+                    break;
+                default:
+                    continue;
+            }
+
+            if (actualPrompt == null && !string.IsNullOrEmpty(excelPrompt))
+            {
+                _pluginLog.Information($"Unexpected excelPrompt: {excelPrompt}");
                 continue;
+            }
 
-            for (int i = 5; i < addonCutSceneSelectString->AtkUnitBase.AtkValuesCount; ++i)
+            if (actualPrompt != null && (excelPrompt == null || !GameStringEquals(actualPrompt, excelPrompt)))
             {
-                string? actualAnswer = addonCutSceneSelectString->AtkUnitBase.AtkValues[i].ReadAtkString();
-                if (actualAnswer == null || actualAnswer != excelAnswer)
-                    continue;
+                _pluginLog.Information($"Unexpected excelPrompt: {excelPrompt}, actualPrompt: {actualPrompt}");
+                continue;
+            }
 
-                _questController.IncreaseDialogueChoicesSelected();
-                addonCutSceneSelectString->AtkUnitBase.FireCallbackInt(i - 5);
-                return;
+            for (int i = 0; i < answers.Count; ++i)
+            {
+                if (GameStringEquals(answers[i], excelAnswer))
+                {
+                    _pluginLog.Information($"Returning {i}: '{answers[i]}' for '{actualPrompt}'");
+                    return i;
+                }
             }
         }
+
+        _pluginLog.Information($"No matching answer found for {actualPrompt}.");
+        return null;
     }
 
     private unsafe void SelectYesnoPostSetup(AddonEvent type, AddonArgs args)
     {
         AddonSelectYesno* addonSelectYesno = (AddonSelectYesno*)args.Addon;
+        SelectYesnoPostSetup(addonSelectYesno);
+    }
+
+    private unsafe void SelectYesnoPostSetup(AddonSelectYesno* addonSelectYesno)
+    {
         string? actualPrompt = addonSelectYesno->AtkUnitBase.AtkValues[0].ReadAtkString();
         if (actualPrompt == null)
             return;
@@ -147,9 +255,22 @@ internal sealed class GameUiController : IDisposable
         _pluginLog.Verbose($"DefaultYesNo: Choice count: {step.DialogueChoices.Count}");
         foreach (var dialogueChoice in step.DialogueChoices)
         {
-            string? excelPrompt =
-                _gameFunctions.GetExcelString(quest, dialogueChoice.ExcelSheet, dialogueChoice.Prompt);
-            if (excelPrompt == null || actualPrompt != excelPrompt)
+            string? excelPrompt;
+            switch (dialogueChoice.Type)
+            {
+                case EDialogChoiceType.ContentTalkYesNo:
+                    excelPrompt =
+                        _gameFunctions.GetContentTalk(uint.Parse(dialogueChoice.Prompt, CultureInfo.InvariantCulture));
+                    break;
+                case EDialogChoiceType.YesNo:
+                    excelPrompt =
+                        _gameFunctions.GetDialogueText(quest, dialogueChoice.ExcelSheet, dialogueChoice.Prompt);
+                    break;
+                default:
+                    continue;
+            }
+
+            if (excelPrompt == null || !GameStringEquals(actualPrompt, excelPrompt))
                 continue;
 
             addonSelectYesno->AtkUnitBase.FireCallbackInt(dialogueChoice.Yes ? 0 : 1);
@@ -174,7 +295,7 @@ internal sealed class GameUiController : IDisposable
         if (step != null)
             _pluginLog.Verbose($"Current step: {step.TerritoryId}, {step.TargetTerritoryId}");
 
-        if (step == null || step.TargetTerritoryId == null || step.TerritoryId != _clientState.TerritoryType)
+        if (step == null || step.TargetTerritoryId == null)
         {
             _pluginLog.Verbose("TravelYesNo: Checking previous step...");
             step = sequence.FindStep(currentQuest.Step == 255 ? (sequence.Steps.Count - 1) : (currentQuest.Step - 1));
@@ -184,7 +305,7 @@ internal sealed class GameUiController : IDisposable
                 _pluginLog.Verbose($"Previous step: {step.TerritoryId}, {step.TargetTerritoryId}");
         }
 
-        if (step == null || step.TargetTerritoryId == null || step.TerritoryId != _clientState.TerritoryType)
+        if (step == null || step.TargetTerritoryId == null)
         {
             _pluginLog.Verbose("TravelYesNo: Not found");
             return false;
@@ -196,7 +317,7 @@ internal sealed class GameUiController : IDisposable
         foreach (var entry in warps)
         {
             string? excelPrompt = entry.Question?.ToString();
-            if (excelPrompt == null || excelPrompt != actualPrompt)
+            if (excelPrompt == null || !GameStringEquals(excelPrompt, actualPrompt))
             {
                 _pluginLog.Information($"Ignoring prompt '{excelPrompt}'");
                 continue;
@@ -229,11 +350,26 @@ internal sealed class GameUiController : IDisposable
         }
     }
 
+    /// <summary>
+    /// Ensures characters like '-' are handled equally in both strings.
+    /// </summary>
+    private bool GameStringEquals(string? a, string? b)
+    {
+        if (a == null)
+            return b == null;
+
+        if (b == null)
+            return false;
+
+        return a.ReplaceLineEndings().Replace('\u2013', '-') == b.ReplaceLineEndings().Replace('\u2013', '-');
+    }
+
     public void Dispose()
     {
         _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "AkatsukiNote", UnendingCodexPostSetup);
         _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "Credit", CreditPostSetup);
         _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "SelectYesno", SelectYesnoPostSetup);
+        _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "SelectIconString", SelectIconStringPostSetup);
         _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "CutSceneSelectString", CutsceneSelectStringPostSetup);
         _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "SelectString", SelectStringPostSetup);
     }
index 7b7bbee993e15078141efca6df2af1475e5eb03d..839ac4531e29254708c41e7749bd9ceabc1c3599 100644 (file)
@@ -88,7 +88,7 @@ internal sealed class MovementController : IDisposable
                     }
                 }
 
-                _navmeshIpc.MoveTo(navPoints);
+                _navmeshIpc.MoveTo(navPoints, Destination.IsFlying);
                 ResetPathfinding();
             }
             else if (_pathfindTask.IsCompleted)
@@ -166,6 +166,7 @@ internal sealed class MovementController : IDisposable
 
     public void NavigateTo(EMovementType type, uint? dataId, Vector3 to, bool fly, bool sprint, float? stopDistance = null)
     {
+        fly |= _condition[ConditionFlag.Diving];
         PrepareNavigation(type, dataId, to, fly, sprint, stopDistance);
         _pluginLog.Information($"Pathfinding to {Destination}");
 
@@ -177,10 +178,11 @@ internal sealed class MovementController : IDisposable
 
     public void NavigateTo(EMovementType type, uint? dataId, List<Vector3> to, bool fly, bool sprint, float? stopDistance)
     {
+        fly |= _condition[ConditionFlag.Diving];
         PrepareNavigation(type, dataId, to.Last(), fly, sprint, stopDistance);
 
         _pluginLog.Information($"Moving to {Destination}");
-        _navmeshIpc.MoveTo(to);
+        _navmeshIpc.MoveTo(to, fly);
     }
 
     public void ResetPathfinding()
index 03425ba1451cc62ce59312ee3d712e026a58bfbe..07d45f4252305607408e7f78cdcf036ab77359c7 100644 (file)
@@ -513,11 +513,6 @@ internal sealed class QuestController
                 // navmesh won't move close enough
                 if (actualDistance > distance)
                 {
-                    // picking up Mehvan's baby, not sure if navmesh ignores y distance but it thinks you're close
-                    // enough
-                    if (step.DataId == 2012208)
-                        distance /= 2;
-
                     _movementController.NavigateTo(EMovementType.Quest, step.DataId, [step.Position.Value],
                         fly: step.Fly == true && _gameFunctions.IsFlyingUnlocked(_clientState.TerritoryType),
                         sprint: step.Sprint != false,
@@ -670,7 +665,7 @@ internal sealed class QuestController
 
                 if (step.ChatMessage != null)
                 {
-                    string? excelString = _gameFunctions.GetExcelString(CurrentQuest.Quest, step.ChatMessage.ExcelSheet,
+                    string? excelString = _gameFunctions.GetDialogueText(CurrentQuest.Quest, step.ChatMessage.ExcelSheet,
                         step.ChatMessage.Key);
                     if (excelString == null)
                         return;
index 0433f33c98ff262ec695c46b84df1942e5257ca4..38dc1ddcabccaaf621bce2aab2a089f977861a3e 100644 (file)
@@ -60,11 +60,11 @@ internal sealed class NavmeshIpc
         return _navPathfind.InvokeFunc(localPlayerPosition, targetPosition, fly, cancellationToken);
     }
 
-    public void MoveTo(List<Vector3> position)
+    public void MoveTo(List<Vector3> position, bool fly)
     {
         Stop();
 
-        _pathMoveTo.InvokeAction(position, false);
+        _pathMoveTo.InvokeAction(position, fly);
     }
 
     public Vector3? GetPointOnFloor(Vector3 position)
index 6a276159e477589eb1094f0e11195fa88a6a9f47..e07c22bfada0c0a215f8ed1a2d9d90940963d3a3 100644 (file)
@@ -10,6 +10,7 @@ using Dalamud.Game;
 using Dalamud.Game.ClientState.Conditions;
 using Dalamud.Game.ClientState.Objects;
 using Dalamud.Plugin.Services;
+using Dalamud.Utility;
 using FFXIVClientStructs.FFXIV.Application.Network.WorkDefinitions;
 using FFXIVClientStructs.FFXIV.Client.Game;
 using FFXIVClientStructs.FFXIV.Client.Game.Control;
@@ -474,7 +475,7 @@ internal sealed unsafe class GameFunctions
             _pluginLog.Error($"Could not find content for content finder condition (cf: {contentFinderConditionId})");
     }
 
-    public string? GetExcelString(Quest currentQuest, string? excelSheetName, string key)
+    public string? GetDialogueText(Quest currentQuest, string? excelSheetName, string key)
     {
         if (excelSheetName == null)
         {
@@ -495,6 +496,12 @@ internal sealed unsafe class GameFunctions
             return null;
         }
 
-        return excelSheet.FirstOrDefault(x => x.Key == key)?.Value?.ToString();
+        return excelSheet.FirstOrDefault(x => x.Key == key)?.Value?.ToDalamudString().ToString();
+    }
+
+    public string? GetContentTalk(uint rowId)
+    {
+        var questRow = _dataManager.GetExcelSheet<ContentTalk>()!.GetRow(rowId);
+        return questRow?.Text?.ToString();
     }
 }
index ea832cace7410e54905f820c92849b563b90fe5b..5e35917f4e58868ec3a012d14c75fc95c3308ed7 100644 (file)
@@ -8,5 +8,7 @@ public sealed class DialogueChoiceTypeConverter() : EnumConverter<EDialogChoiceT
     {
         { EDialogChoiceType.YesNo, "YesNo" },
         { EDialogChoiceType.List, "List" },
+        { EDialogChoiceType.ContentTalkYesNo, "ContentTalkYesNo" },
+        { EDialogChoiceType.ContentTalkList, "ContentTalkList" },
     };
 }
index 1f85c63eedce9a31987f0bf415da8775a003e8c3..740ad030f196779bce7356e65d7d834ebb670de2 100644 (file)
@@ -8,7 +8,7 @@ public class DialogueChoice
     [JsonConverter(typeof(DialogueChoiceTypeConverter))]
     public EDialogChoiceType Type { get; set; }
     public string? ExcelSheet { get; set; }
-    public string Prompt { get; set; } = null!;
+    public string? Prompt { get; set; } = null!;
     public bool Yes { get; set; } = true;
     public string? Answer { get; set; }
 }
index 008418f465e496ebc2112c16dcecc2390b22d430..f07fa21fd7d78666f47335d847861efff3f9757b 100644 (file)
@@ -4,5 +4,7 @@ public enum EDialogChoiceType
 {
     None,
     YesNo,
-    List
+    List,
+    ContentTalkYesNo,
+    ContentTalkList,
 }
index 5e81004058e6643596eb9a2e14d39c429e3c4000..c3f21cc6e2268aa9cec00555c4456deb613b819e 100644 (file)
@@ -56,14 +56,17 @@ public sealed class QuestionablePlugin : IDalamudPlugin
         _questController = new QuestController(pluginInterface, dataManager, _clientState, _gameFunctions,
             _movementController, pluginLog, condition, chatGui, framework, gameGui, aetheryteData, lifestreamIpc);
         _gameUiController =
-            new GameUiController(clientState, addonLifecycle, dataManager, _gameFunctions, _questController, pluginLog);
+            new GameUiController(clientState, addonLifecycle, dataManager, _gameFunctions, _questController, gameGui,
+                pluginLog);
 
         _windowSystem.AddWindow(new DebugWindow(_movementController, _questController, _gameFunctions, clientState,
-            targetManager));
+            framework, targetManager, _gameUiController));
 
         _pluginInterface.UiBuilder.Draw += _windowSystem.Draw;
         _framework.Update += FrameworkUpdate;
         _commandManager.AddHandler("/qst", new CommandInfo(ProcessCommand));
+
+        _framework.RunOnTick(() => _gameUiController.HandleCurrentDialogueChoices(), TimeSpan.FromMilliseconds(200));
     }
 
     private void FrameworkUpdate(IFramework framework)
index b3c684500c0bf75847986f4be0caf06500fa21c4..34169e70bc59010ee9c4dc59c889282ab0c6d15a 100644 (file)
@@ -1,4 +1,5 @@
-using System.Globalization;
+using System;
+using System.Globalization;
 using System.Numerics;
 using Dalamud.Game.ClientState.Objects;
 using Dalamud.Interface;
@@ -21,18 +22,22 @@ internal sealed class DebugWindow : Window
     private readonly QuestController _questController;
     private readonly GameFunctions _gameFunctions;
     private readonly IClientState _clientState;
+    private readonly IFramework _framework;
     private readonly ITargetManager _targetManager;
+    private readonly GameUiController _gameUiController;
 
     public DebugWindow(MovementController movementController, QuestController questController,
-        GameFunctions gameFunctions, IClientState clientState,
-        ITargetManager targetManager)
+        GameFunctions gameFunctions, IClientState clientState, IFramework framework,
+        ITargetManager targetManager, GameUiController gameUiController)
         : base("Questionable", ImGuiWindowFlags.AlwaysAutoResize)
     {
         _movementController = movementController;
         _questController = questController;
         _gameFunctions = gameFunctions;
         _clientState = clientState;
+        _framework = framework;
         _targetManager = targetManager;
+        _gameUiController = gameUiController;
 
         IsOpen = true;
         SizeConstraints = new WindowSizeConstraints
@@ -230,6 +235,10 @@ internal sealed class DebugWindow : Window
         ImGui.EndDisabled();
 
         if (ImGui.Button("Reload Data"))
+        {
             _questController.Reload();
+            _framework.RunOnTick(() => _gameUiController.HandleCurrentDialogueChoices(),
+                TimeSpan.FromMilliseconds(200));
+        }
     }
 }