Questionable/QuestPaths/quest-v1.json

1140 lines
38 KiB
JSON

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://carvel.li/questionable/quest-1.0",
"title": "Questionable V1",
"description": "A series of quest sequences",
"type": "object",
"properties": {
"$schema": {
"type": "string",
"const": "https://carvel.li/questionable/quest-1.0"
},
"Author": {
"description": "Author of the quest sequence",
"type": ["string", "array"],
"items": {
"type": "string"
}
},
"Disabled": {
"type": "boolean"
},
"Comment": {
"type": "string"
},
"$": {
"type": "string",
"description": "Dev Comment (not visible in-game)"
},
"TerritoryBlacklist": {
"type": "array",
"items": {
"type": "integer"
}
},
"QuestSequence": {
"type": "array",
"items": {
"type": "object",
"properties": {
"Sequence": {
"type": "integer",
"minimum": 0,
"maximum": 255
},
"Steps": {
"type": "array",
"items": {
"type": "object",
"properties": {
"DataId": {
"type": "integer",
"description": "The data id of the NPC/Object/Aetheryte/Aether Current",
"exclusiveMinimum": 0
},
"Position": {
"type": "object",
"description": "Position to (typically) walk to",
"properties": {
"X": {
"type": "number"
},
"Y": {
"type": "number"
},
"Z": {
"type": "number"
}
},
"required": [
"X",
"Y",
"Z"
]
},
"StopDistance": {
"type": [
"number",
"null"
],
"description": "Set if pathfinding should stop closer or further away from the default stop distance",
"exclusiveMinimum": 0
},
"IgnoreDistanceToObject": {
"type": "boolean",
"description": "Most interactions with objects are checked for a Y (height) difference of 2 in-game units. If set to true, the game won't attempt to get any closer if the height difference is larger than this."
},
"TerritoryId": {
"type": "integer",
"description": "The territory id associated with the location",
"exclusiveMinimum": 0
},
"TargetTerritoryId": {
"type": "integer",
"description": "If set, this step is complete (movement-wise) if this territory id is reached",
"exclusiveMinimum": 0
},
"InteractionType": {
"type": "string",
"description": "What to do at the position",
"enum": [
"Interact",
"WalkTo",
"AttuneAethernetShard",
"AttuneAetheryte",
"AttuneAetherCurrent",
"Combat",
"UseItem",
"EquipItem",
"Say",
"Emote",
"Action",
"WaitForNpcAtPosition",
"WaitForManualProgress",
"Duty",
"SinglePlayerDuty",
"Jump",
"Instruction",
"AcceptQuest",
"CompleteQuest"
]
},
"Disabled": {
"description": "Whether this step is disabled (see SkipIf for more control)",
"type": "boolean"
},
"DisableNavmesh": {
"description": "If true, will go to the position in a straight line instead of using pathfinding",
"type": "boolean"
},
"Mount": {
"type": [
"boolean",
"null"
],
"description": "If true, will mount regardless of distance to position. If false, will unmount."
},
"Fly": {
"type": "boolean",
"description": "If true and flying is unlocked in a zone, will use a flight path"
},
"Land": {
"type": "boolean",
"description": "If true and flying, will attempt to land on the ground"
},
"Sprint": {
"type": [
"boolean",
"null"
]
},
"AetheryteShortcut": {
"description": "The Aetheryte to teleport to (before moving)",
"$ref": "#/$defs/Aetheryte"
},
"AethernetShortcut": {
"type": "array",
"description": "A pair of aethernet locations (from + to) to use as a shortcut",
"minItems": 2,
"maxItems": 2,
"items": {
"$ref": "#/$defs/AethernetShard"
}
},
"ItemId": {
"type": [
"number",
"null"
],
"description": "The Item to use",
"exclusiveMinimum": 0
},
"SkipIf": {
"type": "array",
"items": {
"type": "string",
"enum": [
"Never",
"FlyingLocked",
"FlyingUnlocked",
"DifferentTerritory",
"ChocoboUnlocked",
"AetheryteShortcutIfInSameTerritory",
"NotTargetable",
"ItemNotInInventory"
]
}
},
"CompletionQuestVariablesFlags": {
"$ref": "#/$defs/CompletionFlags"
},
"DelaySecondsAtStart": {
"description": "Time to wait before starting",
"type": [
"number",
"null"
]
},
"Comment": {
"type": "string"
}
},
"required": [
"TerritoryId",
"InteractionType"
],
"allOf": [
{
"if": {
"properties": {
"InteractionType": {
"anyOf": [
{
"const": "Interact"
},
{
"const": "SinglePlayerDuty"
}
]
}
}
},
"then": {
"required": [
"DataId"
]
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "WalkTo"
}
}
},
"then": {
"required": [
"Position"
]
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "AttuneAetheryte"
}
}
},
"then": {
"properties": {
"Aetheryte": {
"$ref": "#/$defs/Aetheryte"
},
"DataId": {
"type": "null"
},
"Position": {
"type": "null"
}
},
"required": [
"Aetheryte"
]
},
"else": {
"properties": {
"Aetheryte": {
"type": "null"
}
}
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "AttuneAethernetShard"
}
}
},
"then": {
"properties": {
"AethernetShard": {
"$ref": "#/$defs/AethernetShard"
},
"DataId": {
"type": "null"
},
"Position": {
"type": "null"
}
},
"required": [
"AethernetShard"
]
},
"else": {
"properties": {
"AethernetShard": {
"type": "null"
}
}
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "AttuneAetherCurrent"
}
}
},
"then": {
"properties": {
"AetherCurrentId": {
"type": "integer",
"description": "The aether current id, used to check if a given aetheryte is unlocked",
"exclusiveMinimum": 0
}
},
"required": [
"DataId",
"Position",
"AetherCurrentId"
]
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "Combat"
}
}
},
"then": {
"properties": {
"EnemySpawnType": {
"type": "string",
"description": "Determines how enemy spawning is handled in combat locations",
"enum": [
"AutoOnEnterArea",
"AfterInteraction",
"AfterItemUse",
"OverworldEnemies"
]
},
"KillEnemyDataIds": {
"description": "The enemy data ids which are supposed to be killed",
"type": "array",
"items": {
"type": "integer"
}
},
"ComplexCombatData": {
"description": "If multiple different enemies are supposed to be killed in a single quest step, this typically is handled via items",
"type": "array",
"items": {
"type": "object",
"properties": {
"DataId": {
"description": "The enemy data id which is supposed to be killed",
"type": "integer"
},
"MinimumKillCount": {
"description": "Overworld mobs: If this number of mobs has been killed, will wait a bit before attempting to pull another mob to see if the quest progresses",
"type": "integer"
},
"RewardItemId": {
"type": "integer"
},
"RewardItemCount": {
"type": "integer"
},
"CompletionQuestVariablesFlags": {
"$ref": "#/$defs/CompletionFlags"
}
},
"required": [
"DataId"
]
}
}
},
"required": [
"Position",
"EnemySpawnType"
],
"oneOf": [
{
"required": [
"KillEnemyDataIds"
]
},
{
"required": [
"ComplexCombatData"
]
}
]
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "UseItem"
},
"ItemId": {
"not": {
"const": 30362
}
}
}
},
"then": {
"required": [
"Position"
]
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "UseItem"
}
}
},
"then": {
"properties": {
"GroundTarget": {
"type": [
"boolean",
"null"
],
"default": false
}
},
"required": [
"ItemId"
]
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "EquipItem"
}
}
},
"then": {
"required": [
"ItemId"
]
}
},
{
"if": {
"properties": {
"InteractionType": {
"anyOf": [
{
"const": "Emote"
},
{
"const": "AcceptQuest"
},
{
"const": "CompleteQuest"
}
]
}
}
},
"then": {
"properties": {
"Emote": {
"type": "string",
"description": "The emote to use",
"enum": [
"stretch",
"wave",
"rally",
"deny",
"pray",
"slap",
"doubt",
"psych",
"cheer",
"happy",
"poke",
"flex",
"soothe",
"me",
"welcome",
"imperialsalute",
"pet",
"dance",
"respect",
"lookout"
]
}
}
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "Emote"
}
}
},
"then": {
"required": [
"Position",
"Emote"
]
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "Say"
}
}
},
"then": {
"properties": {
"ChatMessage": {
"type": "object",
"description": "The text to use with /say",
"properties": {
"ExcelSheet": {
"type": "string"
},
"Key": {
"type": "string"
}
},
"required": [
"Key"
]
}
},
"required": [
"ChatMessage"
]
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "Action"
}
}
},
"then": {
"properties": {
"Action": {
"type": "string",
"description": "The action to use",
"enum": [
"Esuna",
"Red Gulal",
"Yellow Gulal",
"Blue Gulal"
]
}
},
"required": [
"Action"
]
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "Jump"
}
}
},
"then": {
"properties": {
"JumpDestination": {
"type": "object",
"properties": {
"Position": {
"type": "object",
"description": "Position to try reaching after the jump",
"properties": {
"X": {
"type": "number"
},
"Y": {
"type": "number"
},
"Z": {
"type": "number"
}
},
"required": [
"X",
"Y",
"Z"
]
},
"StopDistance": {
"type": [
"number",
"null"
],
"description": "Set if pathfinding should stop closer or further away from the default stop distance",
"exclusiveMinimum": 0
},
"DelaySeconds": {
"type": [
"number",
"null"
]
}
},
"required": [
"Position"
]
}
},
"required": [
"Position",
"JumpDestination"
]
}
},
{
"if": {
"properties": {
"InteractionType": {
"anyOf": [
{
"const": "Interact"
},
{
"const": "SinglePlayerDuty"
},
{
"const": "WaitForManualProgress"
},
{
"const": "AcceptQuest"
},
{
"const": "CompleteQuest"
},
{
"const": "Instruction"
}
]
}
}
},
"then": {
"properties": {
"DialogueChoices": {
"type": "array",
"items": {
"type": "object",
"properties": {
"Type": {
"type": "string",
"enum": [
"YesNo",
"List"
]
},
"ExcelSheet": {
"type": "string"
}
},
"required": [
"Type"
],
"allOf": [
{
"if": {
"properties": {
"Type": {
"const": "YesNo"
}
}
},
"then": {
"properties": {
"Prompt": {
"type": [
"string",
"integer"
]
},
"Yes": {
"type": "boolean",
"default": true
}
},
"required": [
"Prompt",
"Yes"
]
}
},
{
"if": {
"properties": {
"Type": {
"const": "List"
}
}
},
"then": {
"properties": {
"Prompt": {
"type": [
"string",
"integer",
"null"
]
},
"Answer": {
"type": [
"string",
"integer"
]
}
},
"required": [
"Prompt",
"Answer"
]
}
}
]
}
},
"PointMenuChoices": {
"type": "array",
"items": {
"type": "integer",
"minimum": 0
}
}
}
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "Duty"
}
}
},
"then": {
"properties": {
"ContentFinderConditionId": {
"type": "integer",
"exclusiveMinimum": 0,
"exclusiveMaximum": 3000
},
"DataId": {
"type": "null"
},
"Position": {
"type": "null"
}
},
"required": [
"ContentFinderConditionId"
]
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "WaitForNpcAtPosition"
}
}
},
"then": {
"properties": {
"NpcWaitDistance": {
"type": "number",
"exclusiveMinimum": 0
}
}
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "AcceptQuest"
}
}
},
"then": {
"properties": {
"PickUpQuestId": {
"type": [
"null",
"number"
],
"description": "Determines the quest which should be accepted. If empty/null, accepts the quest corresponding to the file name."
}
}
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "CompleteQuest"
}
}
},
"then": {
"properties": {
"TurnInQuestId": {
"type": [
"null",
"number"
],
"description": "Determines the quest which should be turned in. If empty/null, turns in the quest corresponding to the file name."
},
"NextQuestId": {
"type": [
"null",
"number"
],
"description": "For quest chains (e.g. DT healer role quests) Which quest to do next, given that you meet the required level."
}
}
}
}
]
}
},
"Comment": {
"type": "string"
}
},
"required": [
"Sequence"
],
"additionalProperties": false
}
}
},
"required": [
"$schema",
"QuestSequence",
"Author"
],
"additionalProperties": false,
"$defs": {
"Aetheryte": {
"type": "string",
"enum": [
"Gridania",
"Central Shroud - Bentbranch Meadows",
"East Shroud - Hawthorne Hut",
"South Shroud - Quarrymill",
"South Shroud - Camp Tranquil",
"North Shroud - Fallgourd Float",
"Ul'dah",
"Western Thanalan - Horizon",
"Central Thanalan - Black Brush Station",
"Eastern Thanalan - Camp Drybone",
"Southern Thanalan - Little Ala Mhigo",
"Southern Thanalan - Forgotten Springs",
"Northern Thanalan - Camp Bluefog",
"Northern Thanalan - Ceruleum Processing Plant",
"Limsa Lominsa",
"Middle La Noscea - Summerford Farms",
"Lower La Noscea - Moraby Drydocks",
"Eastern La Noscea - Costa Del Sol",
"Eastern La Noscea - Wineport",
"Western La Noscea - Swiftperch",
"Western La Noscea - Aleport",
"Upper La Noscea - Camp Bronze Lake",
"Outer La Noscea - Camp Overlook",
"Coerthas Central Highlands - Camp Dragonhead",
"Mor Dhona",
"Gold Saucer",
"Wolves' Den Pier",
"Ishgard",
"Idyllshire",
"Coerthas Western Highlands - Falcon's Nest",
"The Sea of Clouds - Camp Cloudtop",
"The Sea of Clouds - Ok' Zundu",
"Azys Lla - Helix",
"The Dravanian Forelands - Tailfeather",
"The Dravanian Forelands - Anyx Trine",
"The Churning Mists - Moghome",
"The Churning Mists - Zenith",
"Rhalgr's Reach",
"Fringes - Castrum Oriens",
"Fringes - Peering Stones",
"Peaks - Ala Gannha",
"Peaks - Ala Ghiri",
"Lochs - Porta Praetoria",
"Lochs - Ala Mhigan Quarter",
"Kugane",
"Ruby Sea - Tamamizu",
"Ruby Sea - Onokoro",
"Yanxia - Namai",
"Yanxia - House of the Fierce",
"Azim Steppe - Reunion",
"Azim Steppe - Dawn Throne",
"Azim Steppe - Dhoro Iloh",
"Doman Enclave",
"Crystarium",
"Eulmore",
"Lakeland - Fort Jobb",
"Lakeland - Ostall Imperative",
"Kholusia - Stilltide",
"Kholusia - Wright",
"Kholusia - Tomra",
"Amh Araeng - Mord Souq",
"Amh Araeng - Inn at Journey's Head",
"Amh Araeng - Twine",
"Rak'tika - Slitherbough",
"Rak'tika - Fanow",
"Il Mheg - Lydha Lran",
"Il Mheg - Pia Enni",
"Il Mheg - Wolekdorf",
"Tempest - Ondo Cups",
"Tempest - Macarenses Angle",
"Old Sharlayan",
"Radz-at-Han",
"Labyrinthos - Archeion",
"Labyrinthos - Sharlayan Hamlet",
"Labyrinthos - Aporia",
"Thavnair - Yedlihmad",
"Thavnair - Great Work",
"Thavnair - Palaka's Stand",
"Garlemald - Camp Broken Glass",
"Garlemald - Tertium",
"Mare Lamentorum - Sinus Lacrimarum",
"Mare Lamentorum - Bestways Burrow",
"Elpis - Anagnorisis",
"Elpis - Twelve Wonders",
"Elpis - Poieten Oikos",
"Ultima Thule - Reah Tahra",
"Ultima Thule - Abode of the Ea",
"Ultima Thule - Base Omicron",
"Tuliyollal",
"Solution Nine",
"Urqopacha - Wachunpelo",
"Urqopacha - Worlar's Echo",
"Kozama'uka - Ok'hanu",
"Kozama'uka - Many Fires",
"Kozama'uka - Earthenshire",
"Yak T'el - Iq Br'aax",
"Yak T'el - Mamook",
"Shaaloani - Hhusatahwi",
"Shaaloani - Sheshenewezi Springs",
"Shaaloani - Mehwahhetsoan",
"Heritage Found - Yyasulani Station",
"Heritage Found - The Outskirts",
"Heritage Found - Electrope Strike",
"Living Memory - Leynode Mnemo",
"Living Memory - Leynode Pyro",
"Living Memory - Leynode Aero"
]
},
"AethernetShard": {
"type": "string",
"enum": [
"[Gridania] Aetheryte Plaza",
"[Gridania] Archers' Guild",
"[Gridania] Leatherworkers' Guild & Shaded Bower",
"[Gridania] Lancers' Guild",
"[Gridania] Conjurers' Guild",
"[Gridania] Botanists' Guild",
"[Gridania] Mih Khetto's Amphitheatre",
"[Gridania] Blue Badger Gate (Central Shroud)",
"[Gridania] Yellow Serpent Gate (North Shroud)",
"[Gridania] White Wolf Gate (Central Shroud)",
"[Gridania] Airship Landing",
"[Ul'dah] Aetheryte Plaza",
"[Ul'dah] Adventurers' Guild",
"[Ul'dah] Thaumaturges' Guild",
"[Ul'dah] Gladiators' Guild",
"[Ul'dah] Miners' Guild",
"[Ul'dah] Weavers' Guild",
"[Ul'dah] Goldsmiths' Guild",
"[Ul'dah] Sapphire Avenue Exchange",
"[Ul'dah] Alchemists' Guild",
"[Ul'dah] Gate of the Sultana (Western Thanalan)",
"[Ul'dah] Gate of Nald (Central Thanalan)",
"[Ul'dah] Gate of Thal (Central Thanalan)",
"[Ul'dah] The Chamber of Rule",
"[Ul'dah] Airship Landing",
"[Limsa Lominsa] Aetheryte Plaza",
"[Limsa Lominsa] Arcanists' Guild",
"[Limsa Lominsa] Fishermens' Guild",
"[Limsa Lominsa] Hawkers' Alley",
"[Limsa Lominsa] The Aftcastle",
"[Limsa Lominsa] Culinarians' Guild",
"[Limsa Lominsa] Marauders' Guild",
"[Limsa Lominsa] Zephyr Gate (Middle La Noscea)",
"[Limsa Lominsa] Tempest Gate (Lower La Noscea)",
"[Limsa Lominsa] Airship Landing",
"[Ishgard] Aetheryte Plaza",
"[Ishgard] The Forgotten Knight",
"[Ishgard] Skysteel Manufactory",
"[Ishgard] The Brume",
"[Ishgard] Athenaeum Astrologicum",
"[Ishgard] The Jeweled Crozier",
"[Ishgard] Saint Reymanaud's Cathedral",
"[Ishgard] The Tribunal",
"[Ishgard] The Last Vigil",
"[Ishgard] The Gates of Judgement (Coerthas Central Highlands)",
"[Idyllshire] Aetheryte Plaza",
"[Idyllshire] West Idyllshire",
"[Idyllshire] Prologue Gate (Western Hinterlands)",
"[Idyllshire] Epilogue Gate (Eastern Hinterlands)",
"[Rhalgr's Reach] Aetheryte Plaza",
"[Rhalgr's Reach] Western Rhalgr's Reach",
"[Rhalgr's Reach] Northeastern Rhalgr's Reach",
"[Rhalgr's Reach] Fringes Gate",
"[Rhalgr's Reach] Peaks Gate",
"[Kugane] Aetheryte Plaza",
"[Kugane] Shiokaze Hostelry",
"[Kugane] Pier #1",
"[Kugane] Thavnairian Consulate",
"[Kugane] Kogane Dori Markets",
"[Kugane] Bokairo Inn",
"[Kugane] The Ruby Bazaar",
"[Kugane] Sekiseigumi Barracks",
"[Kugane] Rakuza District",
"[Kugane] The Ruby Price",
"[Kugane] Airship Landing",
"[Crystarium] Aetheryte Plaza",
"[Crystarium] Musica Universalis Markets",
"[Crystarium] Temenos Rookery",
"[Crystarium] The Dossal Gate",
"[Crystarium] The Pendants",
"[Crystarium] The Amaro Launch",
"[Crystarium] The Crystalline Mean",
"[Crystarium] The Cabinet of Curiosity",
"[Crystarium] Tessellation (Lakeland)",
"[Eulmore] Aetheryte Plaza",
"[Eulmore] Southeast Derelicts",
"[Eulmore] Nightsoil Pots",
"[Eulmore] The Glory Gate",
"[Eulmore] The Mainstay",
"[Eulmore] The Path to Glory (Kholusia)",
"[Old Sharlayan] Aetheryte Plaza",
"[Old Sharlayan] The Studium",
"[Old Sharlayan] The Baldesion Annex",
"[Old Sharlayan] The Rostra",
"[Old Sharlayan] The Leveilleur Estate",
"[Old Sharlayan] Journey's End",
"[Old Sharlayan] Scholar's Harbor",
"[Old Sharlayan] The Hall of Artifice (Labyrinthos)",
"[Radz-at-Han] Aetheryte Plaza",
"[Radz-at-Han] Meghaduta",
"[Radz-at-Han] Ruveydah Fibers",
"[Radz-at-Han] Airship Landing",
"[Radz-at-Han] Alzadaal's Peace",
"[Radz-at-Han] Hall of the Radiant Host",
"[Radz-at-Han] Mehryde's Meyhane",
"[Radz-at-Han] Kama",
"[Radz-at-Han] The High Crucible of Al-Kimiya",
"[Radz-at-Han] The Gate of First Sight (Thavnair)",
"[Tuliyollal] Aetheryte Plaza",
"[Tuliyollal] Dirigible Landing",
"[Tuliyollal] The Resplendent Quarter",
"[Tuliyollal] The For'ard Cabins",
"[Tuliyollal] Bayside Bevy Marketplace",
"[Tuliyollal] Vollok Shoonsa",
"[Tuliyollal] Wachumeqimeqi",
"[Tuliyollal] Brightploom Post",
"[Tuliyollal] Arch of the Dawn (Urqopacha)",
"[Tuliyollal] Arch of the Dawn (Kozama'uka)",
"[Tuliyollal] Ihuykatumu (Kozama'uka)",
"[Tuliyollal] Dirigible Landing (Yak T'el)",
"[Tuliyollal] Xak Tural Skygate (Shaaloani)",
"[Solution Nine] Aetheryte Plaza",
"[Solution Nine] Information Center",
"[Solution Nine] True Vue",
"[Solution Nine] Neon Stein",
"[Solution Nine] The Arcadion",
"[Solution Nine] Resolution",
"[Solution Nine] Nexus Arcade",
"[Solution Nine] Residential Sector",
"[Solution Nine] Scanning Port Nine (Heritage Found)"
]
},
"CompletionFlags": {
"type": "array",
"description": "Quest Variables that dictate whether or not this step is skipped: null is don't check, positive values need to be set, negative values need to be unset",
"items": {
"type": [
"integer",
"null"
],
"enum": [
null,
1,
2,
4,
8,
16,
32,
64,
128,
-1,
-2,
-4,
-8,
-16,
-32,
-64,
-128
]
},
"minItems": 6,
"maxItems": 6
}
}
}