},
"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"
+ }
+ ]
}
]
},
},
"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"
+ }
+ ]
}
]
},
},
"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"
}
"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"
+ }
+ ]
}
]
},
},
{
"Position": {
- "X": -425.43683,
- "Y": 38.413155,
- "Z": 160.11292
+ "X": -436.3368,
+ "Y": 38.647118,
+ "Z": 166.13683
},
"TerritoryId": 957,
"InteractionType": "WalkTo"
"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
+ }
+ ]
}
]
},
"Z": -565.0569
},
"TerritoryId": 957,
- "InteractionType": "Interact"
+ "InteractionType": "Interact",
+ "DialogueChoices": [
+ {
+ "Type": "YesNo",
+ "Prompt": "TEXT_AKTKMA119_04375_Q1_000_056",
+ "Yes": true
+ }
+ ]
}
]
},
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
+ "TerritoryBlacklist": [
+ 952
+ ],
"QuestSequence": [
{
"Sequence": 0,
},
"StopDistance": 6,
"TerritoryId": 962,
- "InteractionType": "Interact"
+ "InteractionType": "Interact",
+ "DialogueChoices": [
+ {
+ "Type": "YesNo",
+ "Prompt": "TEXT_AKTKMA123_04379_Q1_000_163",
+ "Yes": true
+ }
+ ]
}
]
}
},
"TerritoryId": 129,
"InteractionType": "Interact",
- "AetheryteShortcut": "Limsa Lominsa"
+ "AetheryteShortcut": "Limsa Lominsa",
+ "DialogueChoices": [
+ {
+ "Type": "YesNo",
+ "Prompt": "TEXT_AKTKMB102_04381_Q1_000_067",
+ "Yes": true
+ }
+ ]
}
]
},
},
"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
+ ]
}
]
},
},
"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
+ }
+ ]
}
]
},
},
{
"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,
"Y": 3.426586,
"Z": 360.1115
},
+ "StopDistance": 1,
"TerritoryId": 958,
"InteractionType": "WalkTo",
"DisableNavmesh": true,
"Z": 159.10571
},
"TerritoryId": 958,
- "InteractionType": "Interact"
+ "InteractionType": "WalkTo"
}
]
},
},
{
"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,
},
"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
+ }
+ ]
}
]
},
"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]"
}
]
"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
+ }
+ ]
}
]
},
"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]"
}
]
{
"$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
+ }
+ ]
}
]
},
"Y": 22.20836,
"Z": 403.76892
},
+ "StopDistance": 5,
"TerritoryId": 958,
"InteractionType": "Interact"
}
{
"$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"
}
"Z": -0.00103838
},
"TerritoryId": 1024,
- "InteractionType": "Interact"
+ "InteractionType": "Interact",
+ "DialogueChoices": [
+ {
+ "Type": "YesNo",
+ "Prompt": "TEXT_AKTKMB117_04396_Q1_000_060",
+ "Yes": true
+ }
+ ]
}
]
},
"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
+ }
+ ]
}
]
},
},
"StopDistance": 5,
"TerritoryId": 959,
- "InteractionType": "Interact"
+ "InteractionType": "Interact",
+ "DialogueChoices": [
+ {
+ "Type": "YesNo",
+ "Prompt": "TEXT_AKTKMC102_04400_Q1_000_151",
+ "Yes": true
+ }
+ ]
}
]
},
{
"$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,
{
"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": [
+ ]
}
]
},
"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
+ }
+ ]
}
]
},
"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"
+ }
+ ]
}
]
},
},
"TerritoryId": 959,
"InteractionType": "SinglePlayerDuty",
- "Comment": "Follow Urianger"
+ "Comment": "Follow Urianger (TODO is this sequence used?)"
}
]
},
},
"TerritoryId": 959,
"InteractionType": "SinglePlayerDuty",
- "Comment": "Follow Urianger (but you failed the first time)"
+ "Comment": "Follow Urianger"
}
]
},
"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,
"TerritoryId": 959,
"InteractionType": "Interact",
"AetheryteShortcut": "Mare Lamentorum - Bestways Burrow",
- "Comment": "Teleporter"
+ "TargetTerritoryId": 959,
+ "SkipIf": [
+ "Never"
+ ]
},
{
"Position": {
"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
+ }
]
}
]
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
+ "TerritoryBlacklist": [
+ 970
+ ],
"QuestSequence": [
{
"Sequence": 0,
},
"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"
}
]
"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"
+ }
+ ]
}
]
},
"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"
}
},
{
"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
+ ]
}
]
},
"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"
+ }
]
}
]
"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"
+ }
]
}
]
"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"
}
"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"
+ }
+ ]
}
]
}
"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"
+ }
+ ]
}
]
},
"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"
+ }
+ ]
}
]
},
},
"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"
+ }
+ ]
}
]
},
"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"
+ }
+ ]
}
]
}
"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)"
}
]
"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"
+ }
+ ]
}
]
},
"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
+ }
+ ]
}
]
},
"Z": -653.13196
},
"TerritoryId": 961,
- "InteractionType": "Interact"
+ "InteractionType": "Interact",
+ "DialogueChoices": [
+ {
+ "Type": "YesNo",
+ "Prompt": "TEXT_AKTKME116_04434_Q1_000_021",
+ "Yes": true
+ }
+ ]
}
]
},
},
"TerritoryId": 961,
"InteractionType": "Interact",
- "Fly": true
+ "Fly": true,
+ "DialogueChoices": [
+ {
+ "Type": "YesNo",
+ "Prompt": "TEXT_AKTKME120_04438_Q1_000_008",
+ "Yes": true
+ }
+ ]
}
]
},
"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
+ }
+ ]
}
]
},
},
"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
+ ]
}
]
},
"Z": 298.72583
},
"TerritoryId": 956,
- "InteractionType": "Interact"
+ "InteractionType": "Interact",
+ "TargetTerritoryId": 956,
+ "SkipIf": [
+ "Never"
+ ]
},
{
"DataId": 1040397,
},
"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"
+ }
+ ]
}
]
}
"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"
}
"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
+ }
+ ]
}
]
},
"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"
+ }
+ ]
}
}
},
using System;
+using System.Collections.Generic;
+using System.Globalization;
using System.Linq;
using Dalamud.Game.Addon.Lifecycle;
using Dalamud.Game.Addon.Lifecycle.AddonArgTypes;
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;
_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);
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));
_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;
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;
}
}
+ /// <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);
}
}
}
- _navmeshIpc.MoveTo(navPoints);
+ _navmeshIpc.MoveTo(navPoints, Destination.IsFlying);
ResetPathfinding();
}
else if (_pathfindTask.IsCompleted)
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}");
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()
// 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,
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;
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)
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;
_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)
{
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();
}
}
{
{ EDialogChoiceType.YesNo, "YesNo" },
{ EDialogChoiceType.List, "List" },
+ { EDialogChoiceType.ContentTalkYesNo, "ContentTalkYesNo" },
+ { EDialogChoiceType.ContentTalkList, "ContentTalkList" },
};
}
[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; }
}
{
None,
YesNo,
- List
+ List,
+ ContentTalkYesNo,
+ ContentTalkList,
}
_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)
-using System.Globalization;
+using System;
+using System.Globalization;
using System.Numerics;
using Dalamud.Game.ClientState.Objects;
using Dalamud.Interface;
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
ImGui.EndDisabled();
if (ImGui.Button("Reload Data"))
+ {
_questController.Reload();
+ _framework.RunOnTick(() => _gameUiController.HandleCurrentDialogueChoices(),
+ TimeSpan.FromMilliseconds(200));
+ }
}
}