1
0
forked from liza/Questionable
Questionable/QuestPaths/quest-v1.json

1112 lines
38 KiB
JSON
Raw Permalink Normal View History

2024-05-25 21:51:37 +00:00
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
2024-07-26 23:32:17 +00:00
"$id": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
2024-05-25 21:51:37 +00:00
"title": "Questionable V1",
"description": "A series of quest sequences",
"type": "object",
"properties": {
2024-07-14 10:39:02 +00:00
"$schema": {
"type": "string",
2024-07-26 23:32:17 +00:00
"const": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json"
2024-07-14 10:39:02 +00:00
},
2024-05-25 21:51:37 +00:00
"Author": {
"description": "Author of the quest sequence",
2024-07-21 00:06:33 +00:00
"type": [
"string",
"array"
],
2024-05-25 21:51:37 +00:00
"items": {
"type": "string"
}
},
"Disabled": {
"type": "boolean"
},
2024-05-25 21:51:37 +00:00
"Comment": {
"type": "string"
},
2024-07-14 10:44:31 +00:00
"$": {
"type": "string",
"description": "Dev Comment (not visible in-game)"
},
2024-05-25 21:51:37 +00:00
"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",
2024-05-27 19:54:34 +00:00
"description": "The data id of the NPC/Object/Aetheryte/Aether Current",
2024-05-25 21:51:37 +00:00
"exclusiveMinimum": 0
},
"Position": {
"type": "object",
2024-05-27 19:54:34 +00:00
"description": "Position to (typically) walk to",
2024-05-25 21:51:37 +00:00
"properties": {
"X": {
"type": "number"
},
"Y": {
"type": "number"
},
"Z": {
"type": "number"
}
},
"required": [
"X",
"Y",
"Z"
]
},
2024-05-26 19:45:26 +00:00
"StopDistance": {
"type": [
"number",
"null"
],
2024-05-27 19:54:34 +00:00
"description": "Set if pathfinding should stop closer or further away from the default stop distance",
2024-05-26 19:45:26 +00:00
"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."
},
2024-05-25 21:51:37 +00:00
"TerritoryId": {
"type": "integer",
2024-05-27 19:54:34 +00:00
"description": "The territory id associated with the location",
2024-05-25 21:51:37 +00:00
"exclusiveMinimum": 0
},
"TargetTerritoryId": {
"type": "integer",
"description": "If set, this step is complete (movement-wise) if this territory id is reached",
"exclusiveMinimum": 0
},
2024-05-25 21:51:37 +00:00
"InteractionType": {
"type": "string",
2024-05-27 19:54:34 +00:00
"description": "What to do at the position",
2024-05-25 21:51:37 +00:00
"enum": [
"None",
2024-05-25 21:51:37 +00:00
"Interact",
2024-05-26 13:43:33 +00:00
"WalkTo",
2024-05-27 19:54:34 +00:00
"AttuneAethernetShard",
2024-05-25 21:51:37 +00:00
"AttuneAetheryte",
2024-05-26 13:43:33 +00:00
"AttuneAetherCurrent",
2024-05-25 21:51:37 +00:00
"Combat",
"UseItem",
"EquipItem",
2024-05-28 22:17:19 +00:00
"Say",
2024-05-25 21:51:37 +00:00
"Emote",
"Action",
2024-05-27 19:54:34 +00:00
"WaitForNpcAtPosition",
"WaitForManualProgress",
"Duty",
"SinglePlayerDuty",
2024-06-01 12:30:20 +00:00
"Jump",
2024-07-24 18:47:08 +00:00
"Dive",
"Instruction",
"AcceptQuest",
"CompleteQuest"
2024-05-25 21:51:37 +00:00
]
},
"Disabled": {
"description": "Whether this step is disabled (see SkipIf for more control)",
2024-05-27 19:54:34 +00:00
"type": "boolean"
},
"DisableNavmesh": {
"description": "If true, will go to the position in a straight line instead of using pathfinding",
2024-05-25 21:51:37 +00:00
"type": "boolean"
},
2024-05-27 19:54:34 +00:00
"Mount": {
"type": [
"boolean",
"null"
],
2024-05-27 19:54:34 +00:00
"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"
},
2024-07-12 21:58:48 +00:00
"Land": {
"type": "boolean",
"description": "If true and flying, will attempt to land on the ground"
},
2024-06-01 16:46:57 +00:00
"Sprint": {
"type": [
"boolean",
"null"
]
},
2024-07-27 22:13:52 +00:00
"AetheryteShortcut": {
2024-05-27 19:54:34 +00:00
"description": "The Aetheryte to teleport to (before moving)",
2024-08-02 16:30:21 +00:00
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte"
2024-05-26 19:45:26 +00:00
},
2024-05-25 21:51:37 +00:00
"AethernetShortcut": {
"type": "array",
2024-05-27 19:54:34 +00:00
"description": "A pair of aethernet locations (from + to) to use as a shortcut",
"minItems": 2,
2024-05-25 21:51:37 +00:00
"maxItems": 2,
"items": {
2024-08-02 16:30:21 +00:00
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/AethernetShard"
2024-05-25 21:51:37 +00:00
}
},
2024-05-27 19:54:34 +00:00
"ItemId": {
"type": [
"number",
"null"
],
2024-05-27 19:54:34 +00:00
"description": "The Item to use",
"exclusiveMinimum": 0
},
2024-07-27 13:39:47 +00:00
"SkipConditions": {
"type": "object",
"properties": {
"StepIf": {
"type": "object",
"properties": {
"Never": {
"type": "boolean"
},
"CompletionQuestVariablesFlags": {
2024-08-02 16:30:21 +00:00
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/CompletionFlags"
},
2024-07-27 13:39:47 +00:00
"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"
}
},
"QuestsCompleted": {
"type": "array",
"items": {
"type": "number"
}
},
"ExtraCondition": {
"type": "string",
"enum": [
"WakingSandsMainArea"
]
}
},
"additionalProperties": false
2024-07-27 13:39:47 +00:00
},
"AetheryteShortcutIf": {
"type": "object",
"properties": {
"Never": {
"type": "boolean"
},
"InSameTerritory": {
"type": "boolean"
2024-08-03 20:17:18 +00:00
},
"InTerritory": {
"type": "array",
"items": {
"type": "integer"
}
2024-07-27 13:39:47 +00:00
}
},
"additionalProperties": false
2024-07-27 22:13:52 +00:00
},
"AethernetShortcutIf": {
"type": "object",
"properties": {
"Never": {
"type": "boolean"
},
"InSameTerritory": {
"type": "boolean"
}
},
"additionalProperties": false
2024-07-27 13:39:47 +00:00
}
},
"additionalProperties": false
2024-05-25 21:51:37 +00:00
},
2024-06-01 16:46:57 +00:00
"CompletionQuestVariablesFlags": {
2024-08-02 16:30:21 +00:00
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/CompletionFlags"
2024-06-01 16:46:57 +00:00
},
2024-07-20 17:09:51 +00:00
"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": {
2024-07-21 00:06:33 +00:00
"type": [
"array",
"null"
],
2024-07-20 17:09:51 +00:00
"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
}
}
},
2024-08-03 09:17:20 +00:00
"RequiredGatheredItems": {
"type": "array",
"items": {
"type": "object",
"properties": {
"ItemId": {
"type": "number"
},
"ItemCount": {
"type": "number",
"exclusiveMinimum": 0
},
"Collectability": {
"type": "number",
"minimum": 0,
"maximum": 1000
}
},
"required": [
"ItemId",
"ItemCount"
]
}
},
"DelaySecondsAtStart": {
"description": "Time to wait before starting",
"type": [
"number",
"null"
]
},
2024-06-01 20:01:50 +00:00
"Comment": {
"type": "string"
}
},
"required": [
"TerritoryId",
"InteractionType"
],
"allOf": [
{
"if": {
"properties": {
"InteractionType": {
2024-07-28 19:03:44 +00:00
"const": "Interact"
}
}
},
"then": {
"required": [
"DataId"
]
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "SinglePlayerDuty"
},
2024-07-30 02:45:06 +00:00
"Emote": {
2024-07-28 19:03:44 +00:00
"not": true
2024-06-01 20:01:50 +00:00
}
}
},
"then": {
"required": [
"DataId"
]
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "WalkTo"
}
}
},
"then": {
"required": [
"Position"
]
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "AttuneAetheryte"
2024-06-01 20:01:50 +00:00
}
}
},
"then": {
"properties": {
"Aetheryte": {
2024-08-02 16:30:21 +00:00
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/Aetheryte"
},
"DataId": {
"type": "null"
},
"Position": {
"type": "null"
}
},
2024-06-01 20:01:50 +00:00
"required": [
"Aetheryte"
]
2024-07-17 18:40:38 +00:00
},
"else": {
"properties": {
"Aetheryte": {
"type": "null"
}
}
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "AttuneAethernetShard"
}
}
},
"then": {
"properties": {
"AethernetShard": {
2024-08-02 16:30:21 +00:00
"$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"
2024-06-01 20:01:50 +00:00
]
2024-07-17 18:40:38 +00:00
},
"else": {
"properties": {
"AethernetShard": {
"type": "null"
}
}
2024-06-01 20:01:50 +00:00
}
},
{
"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": {
2024-06-01 16:46:57 +00:00
"properties": {
2024-06-01 20:01:50 +00:00
"EnemySpawnType": {
"type": "string",
"description": "Determines how enemy spawning is handled in combat locations",
"enum": [
"AutoOnEnterArea",
"AfterInteraction",
"AfterItemUse",
"OverworldEnemies"
]
2024-06-01 16:46:57 +00:00
},
2024-06-01 20:01:50 +00:00
"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": {
2024-08-02 16:30:21 +00:00
"$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/CompletionFlags"
},
"IgnoreQuestMarker": {
"type": "boolean"
}
},
"required": [
"DataId"
]
}
},
"CombatDelaySecondsAtStart": {
"type": "number"
2024-06-01 16:46:57 +00:00
}
},
"required": [
2024-06-01 20:01:50 +00:00
"Position",
"EnemySpawnType"
],
"oneOf": [
{
"required": [
"KillEnemyDataIds"
]
},
{
"required": [
"ComplexCombatData"
]
}
2024-06-01 16:46:57 +00:00
]
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "UseItem"
},
"ItemId": {
"not": {
"const": 30362
}
}
}
},
"then": {
"required": [
"Position"
]
}
},
2024-06-01 20:01:50 +00:00
{
"if": {
2024-07-21 00:06:33 +00:00
"anyOf": [
{
"properties": {
"InteractionType": {
"const": "UseItem"
}
}
},
{
"properties": {
"InteractionType": {
"const": "Combat"
},
"EnemySpawnType": {
"const": "AfterItemUse"
}
}
2024-06-01 20:01:50 +00:00
}
2024-07-21 00:06:33 +00:00
]
2024-06-01 20:01:50 +00:00
},
"then": {
"properties": {
"GroundTarget": {
"type": [
"boolean",
"null"
],
"default": false
}
},
"required": [
"ItemId"
]
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "EquipItem"
}
}
},
"then": {
"required": [
"ItemId"
]
}
},
2024-06-01 20:01:50 +00:00
{
"if": {
"properties": {
"InteractionType": {
"anyOf": [
{
"const": "Emote"
},
{
"const": "AcceptQuest"
},
{
"const": "CompleteQuest"
2024-07-28 19:03:44 +00:00
},
{
"const": "SinglePlayerDuty"
}
]
2024-06-01 20:01:50 +00:00
}
}
},
"then": {
"properties": {
"Emote": {
"type": "string",
"description": "The emote to use",
"enum": [
"stretch",
"wave",
"rally",
"deny",
"pray",
"slap",
"doubt",
"psych",
"cheer",
"happy",
"poke",
"flex",
2024-07-12 21:58:48 +00:00
"soothe",
2024-07-13 19:58:41 +00:00
"me",
"welcome",
2024-07-17 02:31:54 +00:00
"imperialsalute",
2024-07-17 18:40:38 +00:00
"pet",
2024-07-18 14:33:48 +00:00
"dance",
2024-07-18 16:38:23 +00:00
"respect",
2024-07-24 01:33:03 +00:00
"lookout",
2024-07-25 00:18:17 +00:00
"kneel",
"bow"
2024-06-01 20:01:50 +00:00
]
}
}
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "Emote"
}
}
},
"then": {
2024-06-01 20:01:50 +00:00
"required": [
"Position",
"Emote"
]
}
},
{
"if": {
"properties": {
"InteractionType": {
2024-07-30 02:45:06 +00:00
"anyOf": [
{
"const": "Say"
},
{
"const": "CompleteQuest"
}
]
2024-06-01 20:01:50 +00:00
}
}
},
"then": {
"properties": {
"ChatMessage": {
"type": "object",
"description": "The text to use with /say",
"properties": {
"ExcelSheet": {
"type": "string"
},
"Key": {
"type": "string"
}
},
"required": [
"Key"
]
2024-06-01 20:01:50 +00:00
}
2024-07-30 02:45:06 +00:00
}
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "Say"
}
}
},
"then": {
2024-06-01 20:01:50 +00:00
"required": [
"ChatMessage"
]
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "Action"
}
}
},
"then": {
"properties": {
"Action": {
"type": "string",
"description": "The action to use",
"enum": [
2024-07-31 22:40:52 +00:00
"Cure",
2024-07-12 21:58:48 +00:00
"Esuna",
2024-07-24 13:45:03 +00:00
"Physick",
2024-07-29 19:19:22 +00:00
"Buffet",
"Fumigate",
2024-07-20 17:09:51 +00:00
"Siphon Snout",
2024-07-12 21:58:48 +00:00
"Red Gulal",
"Yellow Gulal",
"Blue Gulal"
]
}
},
"required": [
"Action"
]
}
},
2024-06-01 20:01:50 +00:00
{
"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"
]
2024-07-24 18:47:08 +00:00
},
"Type": {
"type": "string",
"enum": [
"SingleJump",
"RepeatedJumps"
],
"default": "SingleJump"
2024-06-01 20:01:50 +00:00
}
},
"required": [
"Position"
]
}
},
"required": [
"Position",
"JumpDestination"
]
}
},
{
"if": {
"properties": {
"InteractionType": {
2024-06-06 16:49:49 +00:00
"anyOf": [
{
"const": "Interact"
},
{
"const": "SinglePlayerDuty"
},
{
"const": "WaitForManualProgress"
},
{
"const": "AcceptQuest"
},
{
"const": "CompleteQuest"
2024-07-17 18:40:38 +00:00
},
{
"const": "Instruction"
2024-07-24 18:47:08 +00:00
},
2024-07-26 17:12:34 +00:00
{
"const": "Say"
},
2024-07-24 18:47:08 +00:00
{
"const": "Emote"
},
{
"const": "UseItem"
2024-06-06 16:49:49 +00:00
}
]
2024-06-01 20:01:50 +00:00
}
}
},
"then": {
"properties": {
"DialogueChoices": {
"type": "array",
"items": {
"type": "object",
"properties": {
"Type": {
"type": "string",
"enum": [
"YesNo",
2024-06-12 16:03:48 +00:00
"List"
]
},
2024-06-01 20:01:50 +00:00
"ExcelSheet": {
"type": "string"
}
},
"required": [
2024-06-12 16:03:48 +00:00
"Type"
],
"allOf": [
{
"if": {
"properties": {
"Type": {
2024-06-12 16:03:48 +00:00
"const": "YesNo"
}
}
},
"then": {
"properties": {
2024-06-12 16:03:48 +00:00
"Prompt": {
"type": [
"string",
"integer"
]
},
"Yes": {
"type": "boolean",
"default": true
}
},
"required": [
2024-06-12 16:03:48 +00:00
"Prompt",
"Yes"
]
}
},
{
"if": {
"properties": {
"Type": {
2024-06-12 16:03:48 +00:00
"const": "List"
}
}
},
"then": {
"properties": {
2024-06-12 16:03:48 +00:00
"Prompt": {
"type": [
"string",
"integer",
"null"
]
},
"Answer": {
2024-06-12 16:03:48 +00:00
"type": [
"string",
"integer"
]
}
},
"required": [
2024-06-12 16:03:48 +00:00
"Prompt",
"Answer"
]
}
}
2024-06-01 20:01:50 +00:00
]
}
},
"PointMenuChoices": {
"type": "array",
"items": {
"type": "integer",
"minimum": 0
}
2024-06-01 20:01:50 +00:00
}
}
2024-06-01 20:01:50 +00:00
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "Duty"
}
}
},
"then": {
"properties": {
"ContentFinderConditionId": {
"type": "integer",
"exclusiveMinimum": 0,
"exclusiveMaximum": 3000
},
"DataId": {
"type": "null"
},
"Position": {
"type": "null"
2024-06-01 20:01:50 +00:00
}
},
"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."
}
}
}
2024-05-25 21:51:37 +00:00
}
2024-07-27 22:13:52 +00:00
],
"not": {
"anyOf": [
{
2024-07-28 19:03:44 +00:00
"required": [
"SkipIf"
]
2024-07-27 22:13:52 +00:00
}
]
}
2024-05-25 21:51:37 +00:00
}
},
"Comment": {
"type": "string"
}
},
"required": [
"Sequence"
],
"additionalProperties": false
2024-05-25 21:51:37 +00:00
}
}
},
"required": [
2024-07-14 10:39:02 +00:00
"$schema",
2024-06-01 20:01:50 +00:00
"QuestSequence",
2024-05-25 21:51:37 +00:00
"Author"
],
2024-08-02 16:30:21 +00:00
"additionalProperties": false
2024-05-25 21:51:37 +00:00
}