1
0
forked from liza/Questionable

Support PointMenu' (e.g. the stone tablet interaction near DT's beginning) + Update DT paths till mid-Yak T'el

This commit is contained in:
Liza 2024-07-09 16:58:26 +02:00
parent 72740677e5
commit 7485923506
Signed by: liza
GPG Key ID: 7199F8D727D55F67
46 changed files with 837 additions and 49 deletions

View File

@ -350,6 +350,8 @@ public class QuestSourceGenerator : ISourceGenerator
.AsSyntaxNodeOrToken(), .AsSyntaxNodeOrToken(),
AssignmentList(nameof(QuestStep.DialogueChoices), step.DialogueChoices) AssignmentList(nameof(QuestStep.DialogueChoices), step.DialogueChoices)
.AsSyntaxNodeOrToken(), .AsSyntaxNodeOrToken(),
AssignmentList(nameof(QuestStep.PointMenuChoices), step.PointMenuChoices)
.AsSyntaxNodeOrToken(),
Assignment(nameof(QuestStep.QuestId), step.QuestId, emptyStep.QuestId) Assignment(nameof(QuestStep.QuestId), step.QuestId, emptyStep.QuestId)
.AsSyntaxNodeOrToken()))))), .AsSyntaxNodeOrToken()))))),
Token(SyntaxKind.CommaToken), Token(SyntaxKind.CommaToken),

View File

@ -26,6 +26,7 @@
"Y": -129.27074, "Y": -129.27074,
"Z": -351.33496 "Z": -351.33496
}, },
"StopDistance": 0.25,
"TerritoryId": 1187, "TerritoryId": 1187,
"InteractionType": "Combat", "InteractionType": "Combat",
"EnemySpawnType": "AutoOnEnterArea", "EnemySpawnType": "AutoOnEnterArea",

View File

@ -59,6 +59,21 @@
} }
] ]
}, },
{
"Sequence": 3,
"Steps": [
{
"Position": {
"X": 0,
"Y": 0,
"Z": 0
},
"TerritoryId": 1,
"InteractionType": "WalkTo",
"Comment": "Filler"
}
]
},
{ {
"Sequence": 4, "Sequence": 4,
"Steps": [ "Steps": [

View File

@ -29,8 +29,7 @@
"Z": 129.80847 "Z": 129.80847
}, },
"TerritoryId": 1185, "TerritoryId": 1185,
"InteractionType": "WaitForManualProgress", "InteractionType": "Interact",
"Comment": "Click all tablets (PointMenu)",
"DialogueChoices": [ "DialogueChoices": [
{ {
"Type": "YesNo", "Type": "YesNo",
@ -47,6 +46,16 @@
"Prompt": "TEXT_KINGMA104_04863_Q2_000_000", "Prompt": "TEXT_KINGMA104_04863_Q2_000_000",
"Answer": "TEXT_KINGMA104_04863_A2_000_001" "Answer": "TEXT_KINGMA104_04863_A2_000_001"
} }
],
"PointMenuChoices": [
0,
1,
2,
3,
0,
1,
2,
3
] ]
} }
] ]

View File

@ -33,6 +33,21 @@
} }
] ]
}, },
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": 0,
"Y": 0,
"Z": 0
},
"TerritoryId": 1,
"InteractionType": "WalkTo",
"Comment": "Filler"
}
]
},
{ {
"Sequence": 3, "Sequence": 3,
"Steps": [ "Steps": [

View File

@ -85,7 +85,8 @@
"Z": -388.50995 "Z": -388.50995
}, },
"TerritoryId": 1188, "TerritoryId": 1188,
"InteractionType": "Interact" "InteractionType": "Interact",
"AetheryteShortcut": "Kozama'uka - Ok'hanu"
} }
] ]
}, },
@ -148,6 +149,16 @@
{ {
"Sequence": 8, "Sequence": 8,
"Steps": [ "Steps": [
{
"Position": {
"X": -510.96463,
"Y": -0.47684515,
"Z": -305.96155
},
"TerritoryId": 1188,
"InteractionType": "WalkTo",
"Comment": "Waypoint after swimming through the river"
},
{ {
"DataId": 2013936, "DataId": 2013936,
"Position": { "Position": {

View File

@ -73,6 +73,17 @@
{ {
"Sequence": 4, "Sequence": 4,
"Steps": [ "Steps": [
{
"Position": {
"X": 303.21774,
"Y": 7.475274,
"Z": -215.19496
},
"TerritoryId": 1188,
"InteractionType": "WalkTo",
"DisableNavmesh": true,
"Mount": true
},
{ {
"DataId": 2013632, "DataId": 2013632,
"Position": { "Position": {

View File

@ -84,14 +84,16 @@
"Z": -171.58777 "Z": -171.58777
}, },
"TerritoryId": 1187, "TerritoryId": 1187,
"InteractionType": "WaitForManualProgress", "InteractionType": "Interact",
"Comment": "Pick Disconcerted Hoobigo",
"DialogueChoices": [ "DialogueChoices": [
{ {
"Type": "List", "Type": "List",
"Prompt": "TEXT_KINGMA114_04873_Q1_000_000", "Prompt": "TEXT_KINGMA114_04873_Q1_000_000",
"Answer": "TEXT_KINGMA114_04873_A1_000_001" "Answer": "TEXT_KINGMA114_04873_A1_000_001"
} }
],
"PointMenuChoices": [
3
] ]
} }
] ]

View File

@ -61,6 +61,29 @@
"InteractionType": "AttuneAethernetShard", "InteractionType": "AttuneAethernetShard",
"Comment": "Wachumeqimeqi" "Comment": "Wachumeqimeqi"
}, },
{
"Position": {
"X": -130.34163,
"Y": -14.999287,
"Z": 198.40685
},
"TerritoryId": 1185,
"InteractionType": "WalkTo",
"AethernetShortcut": [
"[Tuliyollal] Wachumeqimeqi",
"[Tuliyollal] The For'ard Cabins"
]
},
{
"Position": {
"X": -122.40268,
"Y": -19.754322,
"Z": 202.20439
},
"TerritoryId": 1185,
"InteractionType": "WalkTo",
"DisableNavmesh": true
},
{ {
"DataId": 1046763, "DataId": 1046763,
"Position": { "Position": {
@ -69,11 +92,7 @@
"Z": 201.12915 "Z": 201.12915
}, },
"TerritoryId": 1185, "TerritoryId": 1185,
"InteractionType": "Interact", "InteractionType": "Interact"
"AethernetShortcut": [
"[Tuliyollal] Wachumeqimeqi",
"[Tuliyollal] The For'ard Cabins"
]
} }
] ]
}, },

View File

@ -64,6 +64,21 @@
} }
] ]
}, },
{
"Sequence": 4,
"Steps": [
{
"Position": {
"X": 0,
"Y": 0,
"Z": 0
},
"TerritoryId": 1,
"InteractionType": "WalkTo",
"Comment": "Filler"
}
]
},
{ {
"Sequence": 5, "Sequence": 5,
"Steps": [ "Steps": [

View File

@ -21,17 +21,6 @@
{ {
"Sequence": 1, "Sequence": 1,
"Steps": [ "Steps": [
{
"DataId": 2013943,
"Position": {
"X": 485.89294,
"Y": 121.3855,
"Z": 831.29626
},
"TerritoryId": 1188,
"InteractionType": "AttuneAetherCurrent",
"AetherCurrentId": 2818428
},
{ {
"DataId": 203, "DataId": 203,
"Position": { "Position": {
@ -43,6 +32,41 @@
"TerritoryId": 1188, "TerritoryId": 1188,
"InteractionType": "AttuneAetheryte" "InteractionType": "AttuneAetheryte"
}, },
{
"Position": {
"X": 533.37555,
"Y": 122.98077,
"Z": 790.01416
},
"TerritoryId": 1188,
"InteractionType": "WalkTo",
"AetheryteShortcut": "Tuliyollal",
"AethernetShortcut": [
"[Tuliyollal] Aetheryte Plaza",
"[Tuliyollal] Ihuykatumu (Kozama'uka)"
]
},
{
"Position": {
"X": 522.3003,
"Y": 120.81023,
"Z": 803.62744
},
"TerritoryId": 1188,
"InteractionType": "WalkTo",
"DisableNavmesh": true
},
{
"DataId": 2013943,
"Position": {
"X": 485.89294,
"Y": 121.3855,
"Z": 831.29626
},
"TerritoryId": 1188,
"InteractionType": "AttuneAetherCurrent",
"AetherCurrentId": 2818428
},
{ {
"DataId": 1046603, "DataId": 1046603,
"Position": { "Position": {
@ -51,7 +75,8 @@
"Z": 259.66272 "Z": 259.66272
}, },
"TerritoryId": 1188, "TerritoryId": 1188,
"InteractionType": "Interact" "InteractionType": "Interact",
"AetheryteShortcut": "Kozama'uka - Many Fires"
} }
] ]
}, },

View File

@ -115,6 +115,7 @@
"Y": 122.89019, "Y": 122.89019,
"Z": 348.47034 "Z": 348.47034
}, },
"StopDistance": 5,
"TerritoryId": 1188, "TerritoryId": 1188,
"InteractionType": "CompleteQuest" "InteractionType": "CompleteQuest"
} }

View File

@ -12,6 +12,7 @@
"Y": 122.950645, "Y": 122.950645,
"Z": 345.6626 "Z": 345.6626
}, },
"StopDistance": 5,
"TerritoryId": 1188, "TerritoryId": 1188,
"InteractionType": "AcceptQuest" "InteractionType": "AcceptQuest"
} }
@ -42,6 +43,7 @@
"Y": -17.964504, "Y": -17.964504,
"Z": 166.55212 "Z": 166.55212
}, },
"StopDistance": 5,
"TerritoryId": 1185, "TerritoryId": 1185,
"InteractionType": "Interact" "InteractionType": "Interact"
} }

View File

@ -45,6 +45,21 @@
} }
] ]
}, },
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": 0,
"Y": 0,
"Z": 0
},
"TerritoryId": 1,
"InteractionType": "WalkTo",
"Comment": "Filler"
}
]
},
{ {
"Sequence": 3, "Sequence": 3,
"Steps": [ "Steps": [

View File

@ -188,7 +188,7 @@
}, },
"TerritoryId": 1188, "TerritoryId": 1188,
"InteractionType": "WaitForNpcAtPosition", "InteractionType": "WaitForNpcAtPosition",
"NpcWaitDistance": 1 "NpcWaitDistance": 3
}, },
{ {
"DataId": 1046648, "DataId": 1046648,

View File

@ -21,6 +21,15 @@
{ {
"Sequence": 1, "Sequence": 1,
"Steps": [ "Steps": [
{
"Position": {
"X": 531.60944,
"Y": 116.17938,
"Z": 166.65599
},
"TerritoryId": 1188,
"InteractionType": "WalkTo"
},
{ {
"DataId": 2013610, "DataId": 2013610,
"Position": { "Position": {
@ -42,6 +51,7 @@
"Y": 110.795235, "Y": 110.795235,
"Z": 256.5983 "Z": 256.5983
}, },
"StopDistance": 0.25,
"TerritoryId": 1188, "TerritoryId": 1188,
"InteractionType": "Combat", "InteractionType": "Combat",
"EnemySpawnType": "AutoOnEnterArea", "EnemySpawnType": "AutoOnEnterArea",
@ -79,8 +89,7 @@
"Z": 229.96863 "Z": 229.96863
}, },
"TerritoryId": 1188, "TerritoryId": 1188,
"InteractionType": "Interact", "InteractionType": "Interact"
"Comment": "TODO Verify this is the correct sequence"
} }
] ]
}, },

View File

@ -28,7 +28,8 @@
"Z": 465.87305 "Z": 465.87305
}, },
"TerritoryId": 1188, "TerritoryId": 1188,
"InteractionType": "Interact" "InteractionType": "Interact",
"AetheryteShortcut": "Kozama'uka - Earthenshire"
} }
] ]
}, },

View File

@ -166,9 +166,18 @@
}, },
{ {
"Position": { "Position": {
"X": 282.9373, "X": 341.56342,
"Y": 47.77521, "Y": 57.53834,
"Z": 140.4986 "Z": 10.309054
},
"TerritoryId": 1187,
"InteractionType": "WalkTo"
},
{
"Position": {
"X": 308.72827,
"Y": 60.2934,
"Z": 111.43004
}, },
"TerritoryId": 1187, "TerritoryId": 1187,
"InteractionType": "WalkTo" "InteractionType": "WalkTo"

View File

@ -27,6 +27,7 @@
"Y": 129.04724, "Y": 129.04724,
"Z": 652.12476 "Z": 652.12476
}, },
"StopDistance": 5,
"TerritoryId": 1187, "TerritoryId": 1187,
"InteractionType": "Interact", "InteractionType": "Interact",
"CompletionQuestVariablesFlags": [ "CompletionQuestVariablesFlags": [
@ -62,6 +63,7 @@
"Y": 111.135, "Y": 111.135,
"Z": 557.7324 "Z": 557.7324
}, },
"StopDistance": 5,
"TerritoryId": 1187, "TerritoryId": 1187,
"InteractionType": "Interact", "InteractionType": "Interact",
"CompletionQuestVariablesFlags": [ "CompletionQuestVariablesFlags": [
@ -80,6 +82,7 @@
"Y": 111.135, "Y": 111.135,
"Z": 697.4745 "Z": 697.4745
}, },
"StopDistance": 5,
"TerritoryId": 1187, "TerritoryId": 1187,
"InteractionType": "Interact", "InteractionType": "Interact",
"CompletionQuestVariablesFlags": [ "CompletionQuestVariablesFlags": [

View File

@ -157,6 +157,7 @@
"Y": 109.359344, "Y": 109.359344,
"Z": 395.2364 "Z": 395.2364
}, },
"StopDistance": 0.25,
"TerritoryId": 1187, "TerritoryId": 1187,
"InteractionType": "Combat", "InteractionType": "Combat",
"EnemySpawnType": "AutoOnEnterArea", "EnemySpawnType": "AutoOnEnterArea",

View File

@ -45,6 +45,21 @@
} }
] ]
}, },
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": 0,
"Y": 0,
"Z": 0
},
"TerritoryId": 1,
"InteractionType": "WalkTo",
"Comment": "Filler"
}
]
},
{ {
"Sequence": 3, "Sequence": 3,
"Steps": [ "Steps": [

View File

@ -43,8 +43,7 @@
"Z": -403.21973 "Z": -403.21973
}, },
"TerritoryId": 1189, "TerritoryId": 1189,
"InteractionType": "Interact", "InteractionType": "Interact"
"Comment": "TODO Verify this shouldn't have a teleport (was removed due to AC moving)"
} }
] ]
}, },

View File

@ -12,6 +12,7 @@
"Y": 19.501463, "Y": 19.501463,
"Z": -358.05298 "Z": -358.05298
}, },
"StopDistance": 5,
"TerritoryId": 1189, "TerritoryId": 1189,
"InteractionType": "AcceptQuest" "InteractionType": "AcceptQuest"
} }

View File

@ -32,6 +32,21 @@
} }
] ]
}, },
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": 0,
"Y": 0,
"Z": 0
},
"TerritoryId": 1,
"InteractionType": "WalkTo",
"Comment": "Filler"
}
]
},
{ {
"Sequence": 3, "Sequence": 3,
"Steps": [ "Steps": [

View File

@ -37,6 +37,21 @@
} }
] ]
}, },
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": 0,
"Y": 0,
"Z": 0
},
"TerritoryId": 1,
"InteractionType": "WalkTo",
"Comment": "Filler"
}
]
},
{ {
"Sequence": 3, "Sequence": 3,
"Steps": [ "Steps": [

View File

@ -42,6 +42,21 @@
} }
] ]
}, },
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": 0,
"Y": 0,
"Z": 0
},
"TerritoryId": 1,
"InteractionType": "WalkTo",
"Comment": "Filler"
}
]
},
{ {
"Sequence": 3, "Sequence": 3,
"Steps": [ "Steps": [

View File

@ -34,6 +34,21 @@
} }
] ]
}, },
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": 0,
"Y": 0,
"Z": 0
},
"TerritoryId": 1,
"InteractionType": "WalkTo",
"Comment": "Filler"
}
]
},
{ {
"Sequence": 3, "Sequence": 3,
"Steps": [ "Steps": [

View File

@ -46,6 +46,21 @@
} }
] ]
}, },
{
"Sequence": 3,
"Steps": [
{
"Position": {
"X": 0,
"Y": 0,
"Z": 0
},
"TerritoryId": 1,
"InteractionType": "WalkTo",
"Comment": "Filler"
}
]
},
{ {
"Sequence": 4, "Sequence": 4,
"Steps": [ "Steps": [
@ -56,6 +71,21 @@
} }
] ]
}, },
{
"Sequence": 5,
"Steps": [
{
"Position": {
"X": 0,
"Y": 0,
"Z": 0
},
"TerritoryId": 1,
"InteractionType": "WalkTo",
"Comment": "Filler"
}
]
},
{ {
"Sequence": 6, "Sequence": 6,
"Steps": [ "Steps": [

View File

@ -56,6 +56,21 @@
} }
] ]
}, },
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": 0,
"Y": 0,
"Z": 0
},
"TerritoryId": 1,
"InteractionType": "WalkTo",
"Comment": "Filler"
}
]
},
{ {
"Sequence": 3, "Sequence": 3,
"Steps": [ "Steps": [
@ -71,6 +86,21 @@
} }
] ]
}, },
{
"Sequence": 4,
"Steps": [
{
"Position": {
"X": 0,
"Y": 0,
"Z": 0
},
"TerritoryId": 1,
"InteractionType": "WalkTo",
"Comment": "Filler"
}
]
},
{ {
"Sequence": 5, "Sequence": 5,
"Steps": [ "Steps": [

View File

@ -48,6 +48,21 @@
} }
] ]
}, },
{
"Sequence": 3,
"Steps": [
{
"Position": {
"X": 0,
"Y": 0,
"Z": 0
},
"TerritoryId": 1,
"InteractionType": "WalkTo",
"Comment": "Filler"
}
]
},
{ {
"Sequence": 4, "Sequence": 4,
"Steps": [ "Steps": [

View File

@ -13,7 +13,7 @@
"Z": 201.28174 "Z": 201.28174
}, },
"TerritoryId": 1185, "TerritoryId": 1185,
"InteractionType": "Interact" "InteractionType": "AcceptQuest"
} }
] ]
} }

View File

@ -13,9 +13,71 @@
"Z": 194.72034 "Z": 194.72034
}, },
"TerritoryId": 1185, "TerritoryId": 1185,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1048335,
"Position": {
"X": -16.739136,
"Y": 0.5999997,
"Z": -55.10034
},
"TerritoryId": 963,
"InteractionType": "Interact",
"AetheryteShortcut": "Radz-at-Han"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1048337,
"Position": {
"X": 155.87085,
"Y": 5.297462,
"Z": 618.2803
},
"TerritoryId": 957,
"InteractionType": "Interact" "InteractionType": "Interact"
} }
] ]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 2013708,
"Position": {
"X": 48.90515,
"Y": 90.22656,
"Z": -83.024414
},
"StopDistance": 0.5,
"TerritoryId": 957,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048331,
"Position": {
"X": 214.03821,
"Y": 5.2600574,
"Z": 628.3817
},
"TerritoryId": 957,
"InteractionType": "CompleteQuest"
}
]
} }
] ]
} }

View File

@ -0,0 +1,141 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048331,
"Position": {
"X": 214.03821,
"Y": 5.2600574,
"Z": 628.3817
},
"TerritoryId": 957,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1048332,
"Position": {
"X": 52.506226,
"Y": -5.20688E-07,
"Z": -54.154297
},
"TerritoryId": 963,
"InteractionType": "Interact",
"AetheryteShortcut": "Radz-at-Han"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1048340,
"Position": {
"X": -186.69415,
"Y": 4.0499983,
"Z": -108.11017
},
"TerritoryId": 963,
"InteractionType": "Interact",
"AethernetShortcut": [
"[Radz-at-Han] Aetheryte Plaza",
"[Radz-at-Han] Hall of the Radiant Host"
]
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1048332,
"Position": {
"X": 52.506226,
"Y": -5.20688E-07,
"Z": -54.154297
},
"TerritoryId": 963,
"InteractionType": "Interact",
"AethernetShortcut": [
"[Radz-at-Han] Hall of the Radiant Host",
"[Radz-at-Han] Aetheryte Plaza"
]
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 1048343,
"Position": {
"X": -336.53772,
"Y": 52.243706,
"Z": -165.05688
},
"TerritoryId": 957,
"InteractionType": "Interact",
"AetheryteShortcut": "Thavnair - Great Work"
}
]
},
{
"Sequence": 5,
"Steps": [
{
"Position": {
"X": -427.5108,
"Y": -0.015813708,
"Z": -710.37146
},
"StopDistance": 0.25,
"TerritoryId": 957,
"InteractionType": "Combat",
"EnemySpawnType": "AutoOnEnterArea",
"KillEnemyDataIds": [
17625
]
}
]
},
{
"Sequence": 6,
"Steps": [
{
"DataId": 1048344,
"Position": {
"X": -419.028,
"Y": 0.06509568,
"Z": -710.9331
},
"StopDistance": 7,
"TerritoryId": 957,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048331,
"Position": {
"X": 214.03821,
"Y": 5.2600574,
"Z": 628.3817
},
"TerritoryId": 957,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -0,0 +1,163 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048331,
"Position": {
"X": 214.03821,
"Y": 5.2600574,
"Z": 628.3817
},
"TerritoryId": 957,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1048348,
"Position": {
"X": -118.76105,
"Y": 88.94139,
"Z": -556.90857
},
"TerritoryId": 957,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": 77.94611,
"Y": 82.44486,
"Z": -548.9286
},
"StopDistance": 10,
"TerritoryId": 957,
"InteractionType": "Instruction",
"EnemySpawnType": "AutoOnEnterArea",
"KillEnemyDataIds": [
17626
],
"ItemId": 2003495,
"Comment": "TODO Needs item use?"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1048348,
"Position": {
"X": -118.76105,
"Y": 88.94139,
"Z": -556.90857
},
"TerritoryId": 957,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 1048350,
"Position": {
"X": -508.53745,
"Y": 12.375278,
"Z": 97.3678
},
"TerritoryId": 957,
"InteractionType": "Interact",
"AetheryteShortcut": "Thavnair - Great Work"
}
]
},
{
"Sequence": 5,
"Steps": [
{
"DataId": 1048354,
"Position": {
"X": 154.28394,
"Y": 5.2641535,
"Z": 618.40234
},
"TerritoryId": 957,
"InteractionType": "Interact",
"AetheryteShortcut": "Thavnair - Yedlihmad",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
},
{
"DataId": 1048355,
"Position": {
"X": 227.98499,
"Y": 10.19656,
"Z": 563.31726
},
"TerritoryId": 957,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"DataId": 1048352,
"Position": {
"X": 195.5138,
"Y": 15.136732,
"Z": 529.015
},
"TerritoryId": 957,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048331,
"Position": {
"X": 214.03821,
"Y": 5.2600574,
"Z": 628.3817
},
"TerritoryId": 957,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -13,7 +13,7 @@
"Z": 198.68762 "Z": 198.68762
}, },
"TerritoryId": 1185, "TerritoryId": 1185,
"InteractionType": "Interact" "InteractionType": "AcceptQuest"
} }
] ]
} }

View File

@ -13,7 +13,7 @@
"Z": 203.38745 "Z": 203.38745
}, },
"TerritoryId": 1185, "TerritoryId": 1185,
"InteractionType": "Interact" "InteractionType": "AcceptQuest"
} }
] ]
} }

View File

@ -53,6 +53,21 @@
} }
] ]
}, },
{
"Sequence": 3,
"Steps": [
{
"Position": {
"X": 0,
"Y": 0,
"Z": 0
},
"TerritoryId": 1,
"InteractionType": "WalkTo",
"Comment": "Filler"
}
]
},
{ {
"Sequence": 4, "Sequence": 4,
"Steps": [ "Steps": [

View File

@ -866,6 +866,13 @@
} }
] ]
} }
},
"PointMenuChoices": {
"type": "array",
"items": {
"type": "integer",
"minimum": 0
}
} }
} }
} }

View File

@ -49,6 +49,7 @@ public sealed class QuestStep
public IList<ESkipCondition> SkipIf { get; set; } = new List<ESkipCondition>(); public IList<ESkipCondition> SkipIf { get; set; } = new List<ESkipCondition>();
public IList<short?> CompletionQuestVariablesFlags { get; set; } = new List<short?>(); public IList<short?> CompletionQuestVariablesFlags { get; set; } = new List<short?>();
public IList<DialogueChoice> DialogueChoices { get; set; } = new List<DialogueChoice>(); public IList<DialogueChoice> DialogueChoices { get; set; } = new List<DialogueChoice>();
public IList<uint> PointMenuChoices { get; set; } = new List<uint>();
public ushort? QuestId { get; set; } public ushort? QuestId { get; set; }
[JsonConstructor] [JsonConstructor]

View File

@ -48,6 +48,7 @@ internal sealed class GameUiController : IDisposable
_addonLifecycle.RegisterListener(AddonEvent.PostSetup, "CutSceneSelectString", CutsceneSelectStringPostSetup); _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "CutSceneSelectString", CutsceneSelectStringPostSetup);
_addonLifecycle.RegisterListener(AddonEvent.PostSetup, "SelectIconString", SelectIconStringPostSetup); _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "SelectIconString", SelectIconStringPostSetup);
_addonLifecycle.RegisterListener(AddonEvent.PostSetup, "SelectYesno", SelectYesnoPostSetup); _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "SelectYesno", SelectYesnoPostSetup);
_addonLifecycle.RegisterListener(AddonEvent.PostSetup, "PointMenu", PointMenuPostSetup);
_addonLifecycle.RegisterListener(AddonEvent.PostSetup, "Credit", CreditPostSetup); _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "Credit", CreditPostSetup);
_addonLifecycle.RegisterListener(AddonEvent.PostSetup, "AkatsukiNote", UnendingCodexPostSetup); _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "AkatsukiNote", UnendingCodexPostSetup);
_addonLifecycle.RegisterListener(AddonEvent.PostSetup, "ContentsTutorial", ContentsTutorialPostSetup); _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "ContentsTutorial", ContentsTutorialPostSetup);
@ -80,6 +81,12 @@ internal sealed class GameUiController : IDisposable
_logger.LogInformation("SelectYesno window is open"); _logger.LogInformation("SelectYesno window is open");
SelectYesnoPostSetup(addonSelectYesno, true); SelectYesnoPostSetup(addonSelectYesno, true);
} }
if (_gameGui.TryGetAddonByName("PointMenu", out AtkUnitBase* addonPointMenu))
{
_logger.LogInformation("PointMenu is open");
PointMenuPostSetup(addonPointMenu);
}
} }
private unsafe void SelectStringPostSetup(AddonEvent type, AddonArgs args) private unsafe void SelectStringPostSetup(AddonEvent type, AddonArgs args)
@ -380,6 +387,61 @@ internal sealed class GameUiController : IDisposable
} }
} }
private unsafe void PointMenuPostSetup(AddonEvent type, AddonArgs args)
{
AtkUnitBase* addonPointMenu = (AtkUnitBase*)args.Addon;
PointMenuPostSetup(addonPointMenu);
}
private unsafe void PointMenuPostSetup(AtkUnitBase* addonPointMenu)
{
var currentQuest = _questController.CurrentQuest;
if (currentQuest == null)
{
_logger.LogInformation("Ignoring point menu, no active quest");
return;
}
var sequence = currentQuest.Quest.FindSequence(currentQuest.Sequence);
if (sequence == null)
return;
QuestStep? step = sequence.FindStep(currentQuest.Step);
if (step == null)
return;
if (step.PointMenuChoices.Count == 0)
{
_logger.LogWarning("No point menu choices");
return;
}
int counter = currentQuest.StepProgress.PointMenuCounter;
if (counter >= step.PointMenuChoices.Count)
{
_logger.LogWarning("No remaining point menu choices");
return;
}
uint choice = step.PointMenuChoices[counter];
_logger.LogInformation("Handling point menu, picking choice {Choice} (index = {Index})", choice, counter);
var selectChoice = stackalloc AtkValue[]
{
new() { Type = ValueType.Int, Int = 13 },
new() { Type = ValueType.UInt, UInt = choice }
};
addonPointMenu->FireCallback(2, selectChoice);
_questController.CurrentQuest = currentQuest with
{
StepProgress = currentQuest.StepProgress with
{
PointMenuCounter = counter + 1,
}
};
}
private unsafe void CreditPostSetup(AddonEvent type, AddonArgs args) private unsafe void CreditPostSetup(AddonEvent type, AddonArgs args)
{ {
_logger.LogInformation("Closing Credits sequence"); _logger.LogInformation("Closing Credits sequence");
@ -451,6 +513,7 @@ internal sealed class GameUiController : IDisposable
_addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "ContentsTutorial", ContentsTutorialPostSetup); _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "ContentsTutorial", ContentsTutorialPostSetup);
_addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "AkatsukiNote", UnendingCodexPostSetup); _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "AkatsukiNote", UnendingCodexPostSetup);
_addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "Credit", CreditPostSetup); _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "Credit", CreditPostSetup);
_addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "PointMenu", PointMenuPostSetup);
_addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "SelectYesno", SelectYesnoPostSetup); _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "SelectYesno", SelectYesnoPostSetup);
_addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "SelectIconString", SelectIconStringPostSetup); _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "SelectIconString", SelectIconStringPostSetup);
_addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "CutSceneSelectString", CutsceneSelectStringPostSetup); _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "CutSceneSelectString", CutsceneSelectStringPostSetup);

View File

@ -399,7 +399,8 @@ internal sealed class QuestController
(QuestSequence? seq, QuestStep? step) = GetNextStep(); (QuestSequence? seq, QuestStep? step) = GetNextStep();
if (CurrentQuest == null || seq == null || step == null) if (CurrentQuest == null || seq == null || step == null)
{ {
_logger.LogWarning("Could not retrieve next quest step, not doing anything"); _logger.LogWarning("Could not retrieve next quest step, not doing anything [{QuestId}, {Sequence}, {Step}]",
CurrentQuest?.Quest.QuestId, CurrentQuest?.Sequence, CurrentQuest?.Step);
return; return;
} }
@ -492,5 +493,6 @@ internal sealed class QuestController
} }
public sealed record StepProgress( public sealed record StepProgress(
DateTime StartedAt); DateTime StartedAt,
int PointMenuCounter = 0);
} }

View File

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Globalization; using System.Globalization;
using System.Linq;
using System.IO; using System.IO;
using System.Text.Json; using System.Text.Json;
using Dalamud.Plugin; using Dalamud.Plugin;
@ -72,6 +73,12 @@ internal sealed class QuestRegistry
quest.Name = questData.Name.ToString(); quest.Name = questData.Name.ToString();
quest.Level = questData.ClassJobLevel0; quest.Level = questData.ClassJobLevel0;
#if !RELEASE
int missingSteps = quest.Data.QuestSequence.Where(x => x.Sequence < 255).Max(x => x.Sequence) - quest.Data.QuestSequence.Count(x => x.Sequence < 255) + 1;
if (missingSteps != 0)
_logger.LogWarning("Quest has missing steps: {QuestId} / {QuestName} → {Count}", quest.QuestId, quest.Name, missingSteps);
#endif
} }
_logger.LogInformation("Loaded {Count} quests", _quests.Count); _logger.LogInformation("Loaded {Count} quests", _quests.Count);

View File

@ -7,6 +7,7 @@ using Dalamud.Plugin.Services;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Controller.Steps.BaseTasks; using Questionable.Controller.Steps.BaseTasks;
using Questionable.Data;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.V1;
@ -45,7 +46,8 @@ internal static class Move
ILogger<MoveBuilder> logger, ILogger<MoveBuilder> logger,
GameFunctions gameFunctions, GameFunctions gameFunctions,
IClientState clientState, IClientState clientState,
MovementController movementController) MovementController movementController,
TerritoryData territoryData)
{ {
public QuestStep Step { get; set; } = null!; public QuestStep Step { get; set; } = null!;
public Vector3 Destination { get; set; } public Vector3 Destination { get; set; }
@ -61,7 +63,7 @@ internal static class Move
} }
yield return new WaitConditionTask(() => clientState.TerritoryType == Step.TerritoryId, yield return new WaitConditionTask(() => clientState.TerritoryType == Step.TerritoryId,
$"Wait(territory: {Step.TerritoryId})"); $"Wait(territory: {territoryData.GetNameAndId(Step.TerritoryId)})");
if (!Step.DisableNavmesh) if (!Step.DisableNavmesh)
yield return new WaitConditionTask(() => movementController.IsNavmeshReady, yield return new WaitConditionTask(() => movementController.IsNavmeshReady,

View File

@ -9,6 +9,7 @@ using FFXIVClientStructs.FFXIV.Application.Network.WorkDefinitions;
using FFXIVClientStructs.FFXIV.Client.Game; using FFXIVClientStructs.FFXIV.Client.Game;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Questionable.Controller.Steps.BaseTasks; using Questionable.Controller.Steps.BaseTasks;
using Questionable.Data;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.V1;
@ -16,7 +17,8 @@ namespace Questionable.Controller.Steps.BaseFactory;
internal static class WaitAtEnd internal static class WaitAtEnd
{ {
internal sealed class Factory(IServiceProvider serviceProvider, IClientState clientState, ICondition condition) internal sealed class Factory(IServiceProvider serviceProvider, IClientState clientState, ICondition condition,
TerritoryData territoryData)
: ITaskFactory : ITaskFactory
{ {
public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step) public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step)
@ -76,7 +78,7 @@ internal static class WaitAtEnd
// interaction moves to a different territory // interaction moves to a different territory
waitInteraction = new WaitConditionTask( waitInteraction = new WaitConditionTask(
() => clientState.TerritoryType == step.TargetTerritoryId, () => clientState.TerritoryType == step.TargetTerritoryId,
$"Wait(tp to territory: {step.TargetTerritoryId})"); $"Wait(tp to territory: {territoryData.GetNameAndId(step.TargetTerritoryId.Value)})");
} }
else else
{ {

View File

@ -1,6 +1,8 @@
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Globalization;
using System.Linq; using System.Linq;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game.Character;
using Lumina.Excel.GeneratedSheets; using Lumina.Excel.GeneratedSheets;
namespace Questionable.Data; namespace Questionable.Data;
@ -31,5 +33,14 @@ internal sealed class TerritoryData
public string? GetName(ushort territoryId) => _territoryNames.GetValueOrDefault(territoryId); public string? GetName(ushort territoryId) => _territoryNames.GetValueOrDefault(territoryId);
public string GetNameAndId(ushort territoryId)
{
string? territoryName = GetName(territoryId);
if (territoryName != null)
return string.Create(CultureInfo.InvariantCulture, $"{territoryName} ({territoryId})");
else
return territoryId.ToString(CultureInfo.InvariantCulture);
}
public bool CanUseMount(ushort territoryId) => _territoriesWithMount.Contains(territoryId); public bool CanUseMount(ushort territoryId) => _territoriesWithMount.Contains(territoryId);
} }

View File

@ -211,13 +211,9 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
{ {
Debug.Assert(_clientState.LocalPlayer != null, "_clientState.LocalPlayer != null"); Debug.Assert(_clientState.LocalPlayer != null, "_clientState.LocalPlayer != null");
string? territoryName = _territoryData.GetName(_clientState.TerritoryType); string territoryName = _territoryData.GetNameAndId(_clientState.TerritoryType);
if (territoryName != null)
territoryName += string.Create(CultureInfo.InvariantCulture, $" ({_clientState.TerritoryType})");
else
territoryName = _clientState.TerritoryType.ToString(CultureInfo.InvariantCulture);
ImGui.Text(territoryName); ImGui.Text(territoryName);
if (_gameFunctions.IsFlyingUnlockedInCurrentZone()) if (_gameFunctions.IsFlyingUnlockedInCurrentZone())
{ {
ImGui.SameLine(); ImGui.SameLine();
@ -294,9 +290,9 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
{ {
string interactionType = gameObject->NamePlateIconId switch string interactionType = gameObject->NamePlateIconId switch
{ {
71201 or 71211 or 71221 or 71231 or 71341 => "AcceptQuest", 71201 or 71211 or 71221 or 71231 or 71341 or 71351 => "AcceptQuest",
71202 or 71212 or 71222 or 71232 or 71342 => "AcceptQuest", // repeatable 71202 or 71212 or 71222 or 71232 or 71342 or 71352 => "AcceptQuest", // repeatable
71205 or 71215 or 71225 or 71235 or 71345 => "CompleteQuest", 71205 or 71215 or 71225 or 71235 or 71345 or 71355 => "CompleteQuest",
_ => "Interact", _ => "Interact",
}; };
ImGui.SetClipboardText($$""" ImGui.SetClipboardText($$"""