{
  "$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",
            "SwitchClass",
            "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"
                  ]
                },
                "Diving": {
                  "type": ["boolean", "null"]
                },
                "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",
                  "FinishCombatIfAny"
                ]
              },
              "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",
                  "mogdance"
                ]
              }
            }
          }
        },
        {
          "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",
                  "Fiery Breath",
                  "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",
                  "Bosom Brook",
                  "Souleater"
                ]
              }
            },
            "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"
            ]
          }
        },
        {
          "if": {
            "properties": {
              "InteractionType": {
                "const": "SwitchClass"
              }
            }
          },
          "then": {
            "properties": {
              "TargetClass": {
                "$ref": "https://git.carvel.li/liza/Questionable/raw/branch/master/Questionable.Model/common-schema.json#/$defs/ClassJob"
              }
            },
            "required": [
              "TargetClass"
            ]
          }
        }
      ]
    }
  }
}