{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "title": "Questionable V1", "description": "A series of quest sequences", "type": "object", "properties": { "$schema": { "type": "string", "const": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json" }, "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)" }, "QuestSequence": { "type": "array", "items": { "type": "object", "properties": { "Sequence": { "type": "integer", "minimum": 0, "maximum": 255 }, "Steps": { "type": "array", "items": { "$ref": "#/$defs/Step" } }, "Comment": { "type": "string" } }, "required": [ "Sequence" ], "additionalProperties": false } } }, "required": [ "$schema", "QuestSequence", "Author" ], "additionalProperties": false, "$defs": { "Step": { "type": "object", "properties": { "DataId": { "type": "integer", "description": "The data id of the NPC/Object/Aetheryte/Aether Current", "exclusiveMinimum": 0 }, "Position": { "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Vector3" }, "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." }, "RestartNavigationIfCancelled": { "type": "boolean", "description": "For some specific loading screen transitions (e.g. when entering/leaving the water through the portals in the ruby sea), setting this to 'false' means it won't re-attempt to move to the portal after the loading animation" }, "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": [ "None", "Interact", "WalkTo", "AttuneAethernetShard", "AttuneAetheryte", "AttuneAetherCurrent", "Combat", "UseItem", "EquipItem", "PurchaseItem", "EquipRecommended", "Say", "Emote", "Action", "StatusOff", "WaitForNpcAtPosition", "WaitForManualProgress", "Duty", "SinglePlayerDuty", "Jump", "Dive", "Craft", "Gather", "Snipe", "Instruction", "AcceptQuest", "CompleteQuest", "InitiateLeve" ] }, "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": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte" }, "AethernetShortcut": { "type": "array", "description": "A pair of aethernet locations (from + to) to use as a shortcut", "minItems": 2, "maxItems": 2, "items": { "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/AethernetShard" } }, "ItemId": { "type": [ "number", "null" ], "description": "The Item to use", "exclusiveMinimum": 0 }, "SkipConditions": { "type": "object", "properties": { "StepIf": { "type": "object", "properties": { "Never": { "type": "boolean" }, "CompletionQuestVariablesFlags": { "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/CompletionFlags" }, "Flying": { "type": "string", "enum": [ "Locked", "Unlocked" ] }, "Chocobo": { "type": "string", "enum": [ "Locked", "Unlocked" ] }, "NotTargetable": { "type": "boolean" }, "InTerritory": { "type": "array", "items": { "type": "integer" } }, "NotInTerritory": { "type": "array", "items": { "type": "integer" } }, "Item": { "type": "object", "properties": { "NotInInventory": { "type": "boolean" } } }, "QuestsAccepted": { "type": "array", "items": { "type": [ "number", "string" ] } }, "QuestsCompleted": { "type": "array", "items": { "type": [ "number", "string" ] } }, "NotNamePlateIconId": { "type": "array", "items": { "type": "integer" } }, "AetheryteLocked": { "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte" }, "AetheryteUnlocked": { "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte" }, "NearPosition": { "type": "object", "properties": { "Position": { "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Vector3" }, "MaximumDistance": { "type": "number" }, "TerritoryId": { "type": "number" } }, "required": [ "Position", "MaximumDistance", "TerritoryId" ], "additionalProperties": false }, "ExtraCondition": { "type": "string", "enum": [ "WakingSandsMainArea", "RisingStonesSolar", "RoguesGuild", "DockStorehouse" ] } }, "additionalProperties": false }, "AetheryteShortcutIf": { "type": "object", "properties": { "Never": { "type": "boolean" }, "InSameTerritory": { "type": "boolean" }, "InTerritory": { "type": "array", "items": { "type": "integer" } }, "QuestsAccepted": { "type": "array", "items": { "type": [ "number", "string" ] } }, "QuestsCompleted": { "type": "array", "items": { "type": [ "number", "string" ] } }, "AetheryteLocked": { "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte" }, "AetheryteUnlocked": { "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte" }, "RequiredQuestVariablesNotMet": { "type": "boolean" }, "NearPosition": { "type": "object", "properties": { "Position": { "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Vector3" }, "MaximumDistance": { "type": "number" }, "TerritoryId": { "type": "number" } }, "required": [ "Position", "MaximumDistance", "TerritoryId" ], "additionalProperties": false } }, "additionalProperties": false }, "AethernetShortcutIf": { "type": "object", "properties": { "Never": { "type": "boolean" }, "InSameTerritory": { "type": "boolean" }, "AetheryteLocked": { "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte" }, "AetheryteUnlocked": { "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte" } }, "additionalProperties": false } }, "additionalProperties": false }, "CompletionQuestVariablesFlags": { "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/CompletionFlags" }, "RequiredQuestVariables": { "type": "array", "description": "Certain quests (primarily beast tribes/allied societies) have a RNG element to spawning targets, and the step should be skipped in its entirety if none of the sets below match", "minItems": 6, "maxItems": 6, "items": { "type": [ "array", "null" ], "items": { "type": [ "number", "object" ], "properties": { "High": { "type": [ "number", "null" ], "minimum": 0, "maximum": 15 }, "Low": { "type": [ "number", "null" ], "minimum": 0, "maximum": 15 } }, "minimum": 0, "maximum": 255 } } }, "RequiredCurrentJob": { "description": "Which class or job you are using whenever this step gets executed", "type": "array", "items": { "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/ClassJob" } }, "RequiredQuestAcceptedJob": { "description": "Which class or job you were using when accepting this quest (e.g. for beast tribes)", "type": "array", "items": { "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/ClassJob" } }, "DelaySecondsAtStart": { "description": "Time to wait before starting", "type": [ "number", "null" ] }, "Comment": { "type": "string" } }, "required": [ "TerritoryId", "InteractionType" ], "allOf": [ { "if": { "properties": { "InteractionType": { "const": "Interact" } } }, "then": { "properties": { "PickUpItemId": { "type": "number" } }, "required": [ "DataId" ] } }, { "if": { "properties": { "InteractionType": { "const": "WalkTo" } } }, "then": { "required": [ "Position" ] } }, { "if": { "properties": { "InteractionType": { "const": "AttuneAetheryte" } } }, "then": { "properties": { "Aetheryte": { "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte" }, "DataId": { "type": "null" }, "Position": { "type": "null" } }, "required": [ "Aetheryte" ] }, "else": { "properties": { "Aetheryte": { "type": "null" } } } }, { "if": { "properties": { "InteractionType": { "const": "AttuneAethernetShard" } } }, "then": { "properties": { "AethernetShard": { "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$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", "AfterAction", "AfterEmote", "OverworldEnemies", "FateEnemies" ] }, "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": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/CompletionFlags" }, "IgnoreQuestMarker": { "type": "boolean" } }, "required": [ "DataId" ] } }, "CombatItemUse": { "description": "Unlike the 'AfterItemUse' condition that is used for spawning an enemy in the first place, interacting with an item at a certain stage of combat is required", "type": "object", "properties": { "ItemId": { "type": "integer" }, "Condition": { "type": "string", "enum": [ "Incapacitated", "Health%" ] }, "Value": { "type": "integer" } }, "required": [ "ItemId", "Condition" ] }, "CombatDelaySecondsAtStart": { "type": "number" } }, "required": [ "Position", "EnemySpawnType" ], "oneOf": [ { "required": [ "KillEnemyDataIds" ] }, { "required": [ "ComplexCombatData" ] } ] } }, { "if": { "properties": { "InteractionType": { "const": "UseItem" }, "ItemId": { "not": { "const": 30362 } } } }, "then": { "required": [ "Position" ] } }, { "if": { "anyOf": [ { "properties": { "InteractionType": { "const": "UseItem" } } }, { "properties": { "InteractionType": { "const": "Combat" }, "EnemySpawnType": { "const": "AfterItemUse" } } } ] }, "then": { "properties": { "GroundTarget": { "type": [ "boolean", "null" ], "default": false } }, "required": [ "ItemId" ] } }, { "if": { "properties": { "InteractionType": { "const": "EquipItem" } } }, "then": { "required": [ "ItemId" ] } }, { "if": { "properties": { "InteractionType": { "const": "PurchaseItem" } } }, "then": { "properties": { "ItemCount": { "type": "integer" }, "PurchaseMenu": { "type": "object", "description": "The text to use with /say", "properties": { "ExcelSheet": { "type": "string" }, "Key": { "type": [ "string", "integer" ] } }, "required": [ "Key" ] } }, "required": [ "ItemId", "ItemCount" ] } }, { "if": { "properties": { "InteractionType": { "anyOf": [ { "const": "Emote" }, { "const": "AcceptQuest" }, { "const": "CompleteQuest" }, { "const": "SinglePlayerDuty" } ] } } }, "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", "kneel", "bow", "uchiwasshoi", "clap", "victorypose", "comfort", "battlestance", "doze", "box", "sundropdance", "cry", "disappointed", "examineself", "joy" ] } } } }, { "if": { "properties": { "InteractionType": { "const": "Emote" } } }, "then": { "required": [ "Position", "Emote" ] } }, { "if": { "properties": { "InteractionType": { "anyOf": [ { "const": "Say" }, { "const": "CompleteQuest" } ] } } }, "then": { "properties": { "ChatMessage": { "type": "object", "description": "The text to use with /say", "properties": { "ExcelSheet": { "type": "string" }, "Key": { "type": "string" } }, "required": [ "Key" ] } } } }, { "if": { "properties": { "InteractionType": { "const": "Say" } } }, "then": { "required": [ "ChatMessage" ] } }, { "if": { "properties": { "InteractionType": { "const": "Action" } } }, "then": { "properties": { "Action": { "type": "string", "description": "The action to use", "enum": [ "Heavy Swing", "Bootshine", "Twin Snakes", "Demolish", "Dragon Kick", "Heavy Shot", "Cure", "Cure II", "Eukrasia", "Diagnosis", "Eukrasian Diagnosis", "Esuna", "Physick", "Aspected Benefic", "Form Shift", "Buffet (Sanuwa)", "Buffet (Griffin)", "Trample", "Fumigate", "Inhale", "Siphon Snout", "Peculiar Light", "Cannonfire", "Red Gulal", "Yellow Gulal", "Blue Gulal", "Electric Flux", "Hop-step", "Fuma Shuriken", "Katon", "Raiton", "Hide", "Slug Shot" ] } }, "required": [ "Action" ] } }, { "if": { "properties": { "InteractionType": { "const": "StatusOff" } } }, "then": { "properties": { "Status": { "type": "string", "description": "The status to disable", "enum": [ "Hidden" ] } }, "required": [ "Status" ] } }, { "if": { "properties": { "InteractionType": { "const": "Jump" } } }, "then": { "properties": { "JumpDestination": { "type": "object", "properties": { "Position": { "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Vector3" }, "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" ] }, "Type": { "type": "string", "enum": [ "SingleJump", "RepeatedJumps" ], "default": "SingleJump" } }, "required": [ "Position" ] } }, "required": [ "Position", "JumpDestination" ] } }, { "if": { "properties": { "InteractionType": { "anyOf": [ { "const": "Interact" }, { "const": "SinglePlayerDuty" }, { "const": "WaitForManualProgress" }, { "const": "AcceptQuest" }, { "const": "CompleteQuest" }, { "const": "Instruction" }, { "const": "Say" }, { "const": "Emote" }, { "const": "UseItem" } ] } } }, "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" ] }, "PromptIsRegularExpression": { "type": "boolean" }, "Yes": { "type": "boolean", "default": true } }, "required": [ "Prompt", "Yes" ] } }, { "if": { "properties": { "Type": { "const": "List" } } }, "then": { "properties": { "Prompt": { "type": [ "string", "integer", "null" ] }, "PromptIsRegularExpression": { "type": "boolean" }, "Answer": { "type": [ "string", "integer" ] }, "AnswerIsRegularExpression": { "type": "boolean" } }, "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", "string" ], "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", "string" ], "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", "string" ], "description": "For quest chains (e.g. DT healer role quests) Which quest to do next, given that you meet the required level." } } } }, { "if": { "properties": { "InteractionType": { "const": "Craft" } } }, "then": { "properties": { "ItemCount": { "type": "number" } }, "required": [ "ItemId", "ItemCount" ] } }, { "if": { "properties": { "InteractionType": { "const": "Gather" } } }, "then": { "properties": { "ItemsToGather": { "type": "array", "description": "Unlike crafting steps, which will always craft a single item id regardless of class, this allows for gathering different items depending on whether you've picked the quest up as miner or botanist", "items": { "type": "object", "properties": { "ItemId": { "type": "number" }, "AlternativeItemId": { "description": "For leves that allow you to gather two items with different chance percentage, this is the preferred item if the gathering chance is 100% (after buffs)", "type": "number" }, "ItemCount": { "type": "number", "exclusiveMinimum": 0 }, "Collectability": { "type": "number", "minimum": 0, "maximum": 1000 } }, "required": [ "ItemId", "ItemCount" ] } } }, "required": [ "ItemsToGather" ] } }, { "if": { "properties": { "InteractionType": { "anyOf": [ { "const": "WaitForManualProgress" }, { "const": "Instruction" }, { "const": "Snipe" } ] } } }, "then": { "required": [ "Comment" ] } } ] } } }