1
0
Fork 0
master
Liza 2024-06-06 18:49:49 +02:00
parent a45cfda2e6
commit 9bbfbc54d3
Signed by: liza
GPG Key ID: 7199F8D727D55F67
66 changed files with 1352 additions and 165 deletions

View File

@ -29,7 +29,14 @@
},
"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"
}
]
}
]
},

View File

@ -90,7 +90,14 @@
},
"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"
}
]
}
]
},

View File

@ -75,6 +75,21 @@
},
"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"
},
@ -87,6 +102,21 @@
},
"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]"
},
{
@ -98,6 +128,21 @@
},
"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"
}

View File

@ -88,7 +88,14 @@
"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"
}
]
}
]
},
@ -103,7 +110,14 @@
"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"
}
]
}
]
},
@ -118,7 +132,14 @@
"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"
}
]
}
]
},

View File

@ -101,9 +101,9 @@
},
{
"Position": {
"X": -425.43683,
"Y": 38.413155,
"Z": 160.11292
"X": -436.3368,
"Y": 38.647118,
"Z": 166.13683
},
"TerritoryId": 957,
"InteractionType": "WalkTo"

View File

@ -43,7 +43,14 @@
"Z": 28.244385
},
"TerritoryId": 957,
"InteractionType": "Interact"
"InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_AKTKMA118_04374_Q1_000_041",
"Yes": true
}
]
}
]
},
@ -108,7 +115,14 @@
"Z": -555.04694
},
"TerritoryId": 957,
"InteractionType": "Interact"
"InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_AKTKMA118_04374_Q2_000_141",
"Yes": true
}
]
}
]
},

View File

@ -105,7 +105,14 @@
"Z": -565.0569
},
"TerritoryId": 957,
"InteractionType": "Interact"
"InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_AKTKMA119_04375_Q1_000_056",
"Yes": true
}
]
}
]
},

View File

@ -1,6 +1,9 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"TerritoryBlacklist": [
952
],
"QuestSequence": [
{
"Sequence": 0,

View File

@ -119,7 +119,14 @@
},
"StopDistance": 6,
"TerritoryId": 962,
"InteractionType": "Interact"
"InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_AKTKMA123_04379_Q1_000_163",
"Yes": true
}
]
}
]
}

View File

@ -59,7 +59,14 @@
},
"TerritoryId": 129,
"InteractionType": "Interact",
"AetheryteShortcut": "Limsa Lominsa"
"AetheryteShortcut": "Limsa Lominsa",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_AKTKMB102_04381_Q1_000_067",
"Yes": true
}
]
}
]
},

View File

@ -30,7 +30,14 @@
},
"StopDistance": 7,
"TerritoryId": 621,
"InteractionType": "Interact"
"InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_AKTKMB103_04382_Q1_000_052",
"Yes": true
}
]
}
]
},
@ -62,7 +69,15 @@
"StopDistance": 7,
"TerritoryId": 737,
"InteractionType": "Interact",
"Comment": "A-Ruhn-Senna"
"Comment": "A-Ruhn-Senna",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 1038812,
@ -74,7 +89,15 @@
"StopDistance": 7,
"TerritoryId": 737,
"InteractionType": "Interact",
"Comment": "Sicard"
"Comment": "Sicard",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"DataId": 1038813,
@ -86,7 +109,15 @@
"StopDistance": 7,
"TerritoryId": 737,
"InteractionType": "Interact",
"Comment": "Lyse"
"Comment": "Lyse",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
},
{
"DataId": 1038814,
@ -98,7 +129,15 @@
"StopDistance": 7,
"TerritoryId": 737,
"InteractionType": "Interact",
"Comment": "Lucia"
"Comment": "Lucia",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
16
]
},
{
"DataId": 1038815,
@ -110,7 +149,15 @@
"StopDistance": 7,
"TerritoryId": 737,
"InteractionType": "Interact",
"Comment": "Cirina"
"Comment": "Cirina",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
8
]
}
]
},

View File

@ -32,7 +32,19 @@
},
"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
}
]
}
]
},

View File

@ -45,10 +45,11 @@
},
{
"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,
@ -158,7 +160,7 @@
"Z": 159.10571
},
"TerritoryId": 958,
"InteractionType": "Interact"
"InteractionType": "WalkTo"
}
]
},

View File

@ -110,14 +110,123 @@
},
{
"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,

View File

@ -78,7 +78,14 @@
},
"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
}
]
}
]
},

View File

@ -30,6 +30,14 @@
"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"
},
@ -43,6 +51,14 @@
"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"
},
@ -53,7 +69,15 @@
"Z": -178.38684
},
"TerritoryId": 958,
"InteractionType": "WalkTo"
"InteractionType": "WalkTo",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 1037715,
@ -65,6 +89,14 @@
"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"
},
@ -78,6 +110,14 @@
"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"
},
@ -91,6 +131,14 @@
"TerritoryId": 958,
"InteractionType": "Interact",
"Comment": "Magitek Radio",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
8
],
"$.0": "[5]"
}
]

View File

@ -31,6 +31,14 @@
"TerritoryId": 958,
"InteractionType": "Interact",
"Comment": "Marcellinus",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
],
"$.1": "QuestVariables if done first: 16 16 0 0 0 128"
},
{
@ -42,7 +50,15 @@
},
"TerritoryId": 958,
"InteractionType": "Interact",
"Comment": "Octavia"
"Comment": "Octavia",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
}
]
},
@ -57,7 +73,14 @@
"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"
}
]
}
]
},
@ -72,7 +95,14 @@
"Z": -232.98999
},
"TerritoryId": 958,
"InteractionType": "Interact"
"InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_AKTKMB113_04392_Q2_000_051",
"Yes": true
}
]
}
]
},

View File

@ -215,6 +215,14 @@
"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"
},
@ -234,6 +242,14 @@
"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"
},
@ -246,7 +262,14 @@
},
"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"
},
@ -266,6 +289,14 @@
"Comment": "TODO Needs item use?",
"ItemId": 2003231,
"ItemUseHealthMaxPercent": 10,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
16
],
"$.0": "[4]"
}
]

View File

@ -1,6 +1,9 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"TerritoryBlacklist": [
1011
],
"QuestSequence": [
{
"Sequence": 0,
@ -29,7 +32,14 @@
},
"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"
}

View File

@ -1,6 +1,9 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"TerritoryBlacklist": [
969
],
"QuestSequence": [
{
"Sequence": 0,
@ -80,7 +83,14 @@
"Z": -677.4243
},
"TerritoryId": 958,
"InteractionType": "Interact"
"InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_AKTKMB116_04395_Q3_000_206",
"Yes": true
}
]
},
{
"DataId": 2012112,
@ -114,6 +124,7 @@
"Y": 0,
"Z": 33.585083
},
"StopDistance": 4,
"TerritoryId": 1024,
"InteractionType": "Interact"
}

View File

@ -28,7 +28,14 @@
"Z": -0.00103838
},
"TerritoryId": 1024,
"InteractionType": "Interact"
"InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_AKTKMB117_04396_Q1_000_060",
"Yes": true
}
]
}
]
},

View File

@ -16,7 +16,14 @@
"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"
}
]
}
]
},
@ -31,7 +38,14 @@
"Z": 467.46008
},
"TerritoryId": 959,
"InteractionType": "Interact"
"InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_AKTKMB119_04398_Q2_000_010",
"Yes": true
}
]
}
]
},

View File

@ -137,7 +137,14 @@
},
"StopDistance": 5,
"TerritoryId": 959,
"InteractionType": "Interact"
"InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_AKTKMC102_04400_Q1_000_151",
"Yes": true
}
]
}
]
},

View 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,
@ -97,6 +98,15 @@
{
"Sequence": 255,
"Steps": [
{
"Position": {
"X": -9.783533,
"Y": -49.589592,
"Z": -339.60205
},
"TerritoryId": 959,
"InteractionType": "WalkTo"
},
{
"Position": {
"X": -72.39724,

View File

@ -81,7 +81,20 @@
{
"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"
}
]
@ -102,10 +115,33 @@
},
{
"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": [
]
}
]
},

View File

@ -49,6 +49,13 @@
"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"
}
]
@ -70,6 +77,13 @@
"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"
}
]
@ -116,7 +130,14 @@
},
"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
}
]
}
]
},

View File

@ -64,7 +64,14 @@
"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"
}
]
}
]
},

View 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"
}
]
},

View File

@ -136,9 +136,16 @@
"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,

View File

@ -31,7 +31,10 @@
"TerritoryId": 959,
"InteractionType": "Interact",
"AetheryteShortcut": "Mare Lamentorum - Bestways Burrow",
"Comment": "Teleporter"
"TargetTerritoryId": 959,
"SkipIf": [
"Never"
]
},
{
"Position": {

View File

@ -39,7 +39,8 @@
"Z": 728.96924
},
"TerritoryId": 959,
"InteractionType": "Interact"
"InteractionType": "Interact",
"TargetTerritoryId": 1024
},
{
"DataId": 1038960,
@ -111,7 +112,14 @@
"Z": -5.081299
},
"TerritoryId": 987,
"InteractionType": "Interact"
"InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_AKTKMC110_04408_Q3_000_170",
"Yes": true
}
]
}
]
},
@ -130,6 +138,13 @@
"AethernetShortcut": [
"[Old Sharlayan] Aetheryte Plaza",
"[Old Sharlayan] The Baldesion Annex"
],
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_AKTKMC110_04408_Q4_000_204",
"Yes": true
}
]
}
]

View File

@ -1,6 +1,9 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"TerritoryBlacklist": [
970
],
"QuestSequence": [
{
"Sequence": 0,

View File

@ -60,6 +60,14 @@
},
"TerritoryId": 963,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
],
"Comment": "Varsra"
},
{
@ -71,6 +79,14 @@
},
"TerritoryId": 963,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
],
"Comment": "Zeytahnur"
},
{
@ -82,6 +98,14 @@
},
"TerritoryId": 963,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
],
"Comment": "Rahdvira"
}
]

View File

@ -66,7 +66,14 @@
"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"
}
]
}
]
},

View File

@ -140,6 +140,14 @@
"KillEnemyDataIds": [
13987
],
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
],
"$.0": "[1]",
"$.1": "QuestVariables if done first: 16 1 0 0 0 128"
},
@ -155,6 +163,14 @@
"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"
@ -172,6 +188,14 @@
13985,
13984
],
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
],
"$.0": "[3]",
"$.2": "QuestVariables if done first: 16 32 0 0 0 32"
}

View File

@ -52,6 +52,7 @@
},
{
"Sequence": 3,
"Comment": "TODO Check flags",
"Steps": [
{
"DataId": 1037628,
@ -61,7 +62,15 @@
"Z": -243.76288
},
"TerritoryId": 957,
"InteractionType": "Interact"
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"DataId": 1040449,
@ -71,7 +80,15 @@
"Z": -238.3612
},
"TerritoryId": 957,
"InteractionType": "Interact"
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 1037629,
@ -81,7 +98,15 @@
"Z": -200.85455
},
"TerritoryId": 957,
"InteractionType": "Interact"
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
}
]
},

View File

@ -95,7 +95,14 @@
"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"
}
]
}
]
},
@ -114,6 +121,13 @@
"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"
}
]
}
]

View File

@ -50,12 +50,33 @@
"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"
}
]
}
]

View File

@ -33,7 +33,9 @@
"AethernetShortcut": [
"[Crystarium] The Cabinet of Curiosity",
"[Crystarium] The Dossal Gate"
]
],
"Comment": "TODO Check target territory id",
"TargetTerritoryId": 844
}
]
},
@ -47,13 +49,40 @@
"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"
},
@ -66,6 +95,14 @@
},
"TerritoryId": 1031,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
],
"$.0": "[2]",
"$": "QuestVariables after: 32 1 16 0 0 144"
},
@ -78,6 +115,14 @@
},
"TerritoryId": 1031,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
],
"$.0": "[3]",
"$.1": "QuestVariables after: 49 1 16 0 0 208"
},
@ -90,6 +135,14 @@
},
"TerritoryId": 1031,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
],
"$.0": "[4]",
"$.2": "QuestVariables if done first: 16 16 0 0 0 32"
}

View File

@ -58,7 +58,14 @@
"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"
}
]
}
]
}

View File

@ -85,7 +85,14 @@
"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"
}
]
}
]
},
@ -100,7 +107,14 @@
"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"
}
]
}
]
},
@ -130,7 +144,14 @@
"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"
}
]
}
]
},

View File

@ -13,7 +13,14 @@
"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"
}
]
}
]
},

View File

@ -46,6 +46,14 @@
},
"TerritoryId": 961,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
],
"$.1": "QuestVariables if done first: 1 0 0 0 0 128"
},
{
@ -56,7 +64,15 @@
"Z": 543.572
},
"TerritoryId": 961,
"InteractionType": "Interact"
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
}
]
},
@ -116,7 +132,14 @@
"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"
}
]
}
]
},

View File

@ -102,7 +102,14 @@
"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"
}
]
}
]
}

View File

@ -84,8 +84,29 @@
"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"
}
]
}
]
},
@ -125,7 +146,29 @@
"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)"
}
]

View File

@ -13,7 +13,14 @@
"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"
}
]
}
]
},

View File

@ -40,7 +40,14 @@
"Z": 198.68762
},
"TerritoryId": 961,
"InteractionType": "Interact"
"InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_AKTKME115_04433_Q1_000_021",
"Yes": true
}
]
}
]
},
@ -82,7 +89,14 @@
"Z": -367.48303
},
"TerritoryId": 961,
"InteractionType": "Interact"
"InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_AKTKME115_04433_Q2_000_062",
"Yes": true
}
]
}
]
},

View File

@ -29,7 +29,14 @@
"Z": -653.13196
},
"TerritoryId": 961,
"InteractionType": "Interact"
"InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_AKTKME116_04434_Q1_000_021",
"Yes": true
}
]
}
]
},

View File

@ -30,7 +30,14 @@
},
"TerritoryId": 961,
"InteractionType": "Interact",
"Fly": true
"Fly": true,
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_AKTKME120_04438_Q1_000_008",
"Yes": true
}
]
}
]
},

View File

@ -45,7 +45,14 @@
"Z": -393.36237
},
"TerritoryId": 956,
"InteractionType": "Interact"
"InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_AKTKMF103_04441_Q1_000_096",
"Yes": true
}
]
},
{
"DataId": 1039711,
@ -85,7 +92,14 @@
"Z": 302.11328
},
"TerritoryId": 956,
"InteractionType": "Interact"
"InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_AKTKMF103_04441_Q1_000_181",
"Yes": true
}
]
}
]
},

View File

@ -65,6 +65,14 @@
},
"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"
},
@ -77,6 +85,14 @@
},
"TerritoryId": 956,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
],
"$.0": "[2]",
"$.1": "QuestVariables after: 2 0 0 0 0 192"
},
@ -88,7 +104,15 @@
"Z": -14.450317
},
"TerritoryId": 956,
"InteractionType": "Interact"
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
}
]
},

View File

@ -110,7 +110,11 @@
"Z": 298.72583
},
"TerritoryId": 956,
"InteractionType": "Interact"
"InteractionType": "Interact",
"TargetTerritoryId": 956,
"SkipIf": [
"Never"
]
},
{
"DataId": 1040397,

View File

@ -60,7 +60,14 @@
},
"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"
}
]
}
]
},
@ -138,7 +145,14 @@
"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"
}
]
}
]
}

View File

@ -72,6 +72,14 @@
"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"
},
@ -85,6 +93,14 @@
"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"
},
@ -98,6 +114,14 @@
"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"
},
@ -111,6 +135,15 @@
"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"
},
@ -124,6 +157,14 @@
"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"
},
@ -137,6 +178,14 @@
"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"
@ -151,6 +200,14 @@
"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"
@ -165,6 +222,14 @@
"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"
}

View File

@ -39,7 +39,14 @@
"Z": -81.28485
},
"TerritoryId": 956,
"InteractionType": "Interact"
"InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_AKTKMF110_04448_Q1_000_031",
"Yes": true
}
]
}
]
},
@ -85,7 +92,14 @@
"Z": 302.17432
},
"TerritoryId": 956,
"InteractionType": "Interact"
"InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_AKTKMF110_04448_Q2_000_111",
"Yes": true
}
]
}
]
},

View File

@ -647,7 +647,17 @@
"if": {
"properties": {
"InteractionType": {
"anyOf": [
{
"const": "Interact"
},
{
"const": "SinglePlayerDuty"
},
{
"const": "WaitForManualProgress"
}
]
}
}
},
@ -662,14 +672,19 @@
"type": "string",
"enum": [
"YesNo",
"List"
"List",
"ContentTalkYesNo",
"ContentTalkList"
]
},
"ExcelSheet": {
"type": "string"
},
"Prompt": {
"type": "string"
"type": [
"string",
"null"
]
}
},
"required": [
@ -681,7 +696,14 @@
"if": {
"properties": {
"Type": {
"anyOf": [
{
"const": "YesNo"
},
{
"const": "ContentTalkYesNo"
}
]
}
}
},
@ -701,7 +723,14 @@
"if": {
"properties": {
"Type": {
"anyOf": [
{
"const": "List"
},
{
"const": "ContentTalkList"
}
]
}
}
},

View 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;
List<string?> answers = new();
for (ushort i = 7; i < addonSelectString->AtkUnitBase.AtkValuesCount; ++i)
answers.Add(addonSelectString->AtkUnitBase.AtkValues[i].ReadAtkString());
var quest = currentQuest.Quest;
var step = quest.FindSequence(currentQuest.Sequence)?.FindStep(currentQuest.Step);
if (step == null)
return;
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;
}
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)
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 (int i = 5; i < addonCutSceneSelectString->AtkUnitBase.AtkValuesCount; ++i)
{
string? actualAnswer = addonCutSceneSelectString->AtkUnitBase.AtkValues[i].ReadAtkString();
if (actualAnswer == null || actualAnswer != excelAnswer)
_pluginLog.Information("Ignoring entry in DialogueChoices, no answer");
continue;
}
_questController.IncreaseDialogueChoicesSelected();
addonCutSceneSelectString->AtkUnitBase.FireCallbackInt(i - 5);
return;
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;
}
if (actualPrompt != null && (excelPrompt == null || !GameStringEquals(actualPrompt, excelPrompt)))
{
_pluginLog.Information($"Unexpected excelPrompt: {excelPrompt}, actualPrompt: {actualPrompt}");
continue;
}
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);
}

View 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()

View 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;

View 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)

View 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();
}
}

View File

@ -8,5 +8,7 @@ public sealed class DialogueChoiceTypeConverter() : EnumConverter<EDialogChoiceT
{
{ EDialogChoiceType.YesNo, "YesNo" },
{ EDialogChoiceType.List, "List" },
{ EDialogChoiceType.ContentTalkYesNo, "ContentTalkYesNo" },
{ EDialogChoiceType.ContentTalkList, "ContentTalkList" },
};
}

View 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; }
}

View File

@ -4,5 +4,7 @@ public enum EDialogChoiceType
{
None,
YesNo,
List
List,
ContentTalkYesNo,
ContentTalkList,
}

View 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)

View 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));
}
}
}