"""
Indicates exactly one field must be supplied and this field must not be `null`.
"""
directive @oneOf on INPUT_OBJECT

"""String or list of strings"""
scalar StringFilter

"""
Int, list of ints, or object with gte (>=), gt (>), lte (<=), and lt (<) properties for range of values
"""
scalar IntFilter

"""
Float, list of floats, or object with gte (>=), gt (>), lte (<=), and lt (<) properties for range of values
"""
scalar FloatFilter

type AbilityScore {
  index: String!
  name: String!
  full_name: String!
  desc: [String!]!
  skills(order_direction: OrderByDirection, name: String): [Skill!]!
}

type Skill {
  index: String!
  name: String!
  desc: [String!]!
  ability_score: AbilityScore!
}

type Alignment {
  index: String!
  name: String!
  abbreviation: String!
  desc: String!
}

type Condition {
  index: String!
  name: String!
  desc: [String!]!
}

type DamageType {
  index: String!
  name: String!
  desc: [String!]!
}

type WeaponProperty {
  index: String!
  name: String!
  desc: [String!]!
}

enum Currency {
  CP
  SP
  GP
}

type Cost {
  quantity: Int!
  unit: Currency!
}

type EquipmentCategory {
  index: String!
  name: String!
  equipment(order: EquipmentCategoryOrder, skip: Int, limit: Int! = 100, name: String): [IEquipmentBase!]!
}

interface IEquipmentBase {
  index: String!
  name: String!
  desc: [String!]
  equipment_category: EquipmentCategory!
}

enum MagicItemRarity {
  VARIES
  COMMON
  UNCOMMON
  RARE
  VERY_RARE
  LEGENDARY
  ARTIFACT
}

type MagicItem implements IEquipmentBase {
  index: String!
  name: String!
  desc: [String!]!
  rarity: MagicItemRarity!
  equipment_category: EquipmentCategory!
  image: String
}

interface IEquipment implements IEquipmentBase {
  index: String!
  name: String!
  cost: Cost!
  desc: [String!]
  equipment_category: EquipmentCategory!
  weight: Float
}

type Tool implements IEquipment & IEquipmentBase {
  index: String!
  name: String!
  desc: [String!]
  cost: Cost!
  equipment_category: EquipmentCategory!
  weight: Float
  tool_category: EquipmentCategory!
}

interface IGear implements IEquipment & IEquipmentBase {
  index: String!
  name: String!
  cost: Cost!
  desc: [String!]
  equipment_category: EquipmentCategory!
  weight: Float
  gear_category: EquipmentCategory!
}

type Gear implements IGear & IEquipment & IEquipmentBase {
  index: String!
  name: String!
  cost: Cost!
  desc: [String!]
  equipment_category: EquipmentCategory!
  weight: Float
  gear_category: EquipmentCategory!
}

type PackQuantity {
  quantity: Int!
  item: IEquipment!
}

type Quantity {
  quantity: Int!
  equipment: IEquipment!
}

type Pack implements IGear & IEquipment & IEquipmentBase {
  index: String!
  name: String!
  cost: Cost!
  desc: [String!]
  equipment_category: EquipmentCategory!
  weight: Float
  gear_category: EquipmentCategory!
  contents: [PackQuantity!]!
}

type Ammunition implements IGear & IEquipment & IEquipmentBase {
  index: String!
  name: String!
  cost: Cost!
  desc: [String!]
  equipment_category: EquipmentCategory!
  weight: Float
  gear_category: EquipmentCategory!
  quantity: Int!
}

type Damage {
  damage_dice: String!
  damage_type: DamageType!
}

type Range {
  normal: Int!
  long: Int
}

enum WeaponRange {
  MELEE
  RANGED
}

type Weapon implements IEquipment & IEquipmentBase {
  index: String!
  name: String!
  cost: Cost!
  desc: [String!]
  equipment_category: EquipmentCategory!
  weight: Float
  damage: Damage
  range: Range!
  throw_range: Range
  weapon_category: EquipmentCategory!
  weapon_range: WeaponRange!
  category_range: EquipmentCategory!
  two_handed_damage: Damage
  properties(name: String): [WeaponProperty!]!
  special: [String!]
}

type ArmorClass {
  base: Int!
  dex_bonus: Boolean!
  max_bonus: Int
}

type Armor implements IEquipment & IEquipmentBase {
  index: String!
  name: String!
  cost: Cost!
  desc: [String!]
  equipment_category: EquipmentCategory!
  weight: Float
  armor_category: EquipmentCategory!
  str_minimum: Int!
  stealth_disadvantage: Boolean!
  armor_class: ArmorClass!
}

type Speed {
  quantity: Float!
  unit: String!
}

type Vehicle implements IEquipment & IEquipmentBase {
  index: String!
  name: String!
  cost: Cost!
  desc: [String!]
  equipment_category: EquipmentCategory!
  weight: Float
  vehicle_category: EquipmentCategory!
  speed: Speed
  capacity: String
}

type AbilityScorePrerequisite {
  ability_score: AbilityScore!
  minimum_score: Int!
}

type Feat {
  index: String!
  name: String!
  desc: [String!]!
  prerequisites: [AbilityScorePrerequisite!]!
}

enum LanguageType {
  STANDARD
  EXOTIC
}

enum LanguageScript {
  COMMON
  ELVISH
  DWARVISH
  INFERNAL
  DRACONIC
  CELESTIAL
}

"""
LanguageScript ("COMMON", "ELVISH", "DWARVISH", "INFERNAL", "DRACONIC", "CELESTIAL") or list of LanguageScripts
"""
scalar LanguageScriptFilter

type Language {
  index: String!
  name: String!
  desc: String
  script: LanguageScript
  type: LanguageType!
  typical_speakers: [String!]!
}

type Rule {
  index: String!
  name: String!
  desc: String!
  subsections(name: String): [RuleSection!]!
}

type RuleSection {
  index: String!
  name: String!
  desc: String!
}

type AreaOfEffect {
  type: AreaOfEffectType!
  size: Int!
}

enum AreaOfEffectType {
  SPHERE
  CUBE
  CYLINDER
  LINE
  CONE
}

"""
AreaOfEffectType ("SPHERE", "CUBE", "CYLINDER", "LINE", "CONE") or list of AreaOfEffectTypes
"""
scalar AreaOfEffectTypeFilter

enum SpellComponent {
  V
  S
  M
}

type DamageAtLevel {
  level: Int!
  damage: String!
}

type SpellDamage {
  damage_at_slot_level: [DamageAtLevel!]
  damage_at_character_level: [DamageAtLevel!]
  damage_type: DamageType
}

type HealingAtLevel {
  level: Int!
  healing: String!
}

enum DcSuccess {
  NONE
  HALF
  OTHER
}

type SpellDc {
  success: DcSuccess!
  type: AbilityScore!
  desc: String
}

type MagicSchool {
  index: String!
  name: String!
  desc: String!
  spells(level: IntFilter, class: StringFilter, subclass: StringFilter, concentration: Boolean, ritual: Boolean, attack_type: SpellAttackTypeFilter, casting_time: StringFilter, area_of_effect: AreaOfEffectFilter, damage_type: StringFilter, dc_type: StringFilter, range: StringFilter, order: SpellOrder, skip: Int, limit: Int! = 100, name: String): [Spell!]!
}

enum SpellAttackType {
  MELEE
  RANGED
}

"""SpellAttackType ("MELEE", "RANGED") or list of SpellAttackTypes"""
scalar SpellAttackTypeFilter

type Spell {
  index: String!
  area_of_effect: AreaOfEffect
  attack_type: SpellAttackType
  casting_time: String!
  classes(name: String): [Class!]!
  subclasses(name: String): [Subclass!]!
  components: [SpellComponent]
  concentration: Boolean!
  damage: SpellDamage
  dc: SpellDc
  desc: [String!]!
  duration: String!
  heal_at_slot_level: [HealingAtLevel!]
  higher_level: [String!]
  level: Int!
  material: String
  name: String!
  range: String!
  ritual: Boolean!
  school: MagicSchool!
}

union ProficiencyReference = EquipmentCategory | Skill | AbilityScore | Tool | Armor | Weapon | Vehicle | Gear | Pack | Ammunition

enum ProficiencyType {
  WEAPONS
  ARTISANS_TOOLS
  SKILLS
  ARMOR
  MUSICAL_INSTRUMENTS
  SAVING_THROWS
  OTHER
  GAMING_SETS
  VEHICLES
}

"""
ProficiencyType ("WEAPONS", "ARTISANS_TOOLS", "SKILLS", "ARMOR", "MUSICAL_INSTRUMENTS", "SAVING_THROWS", "OTHER", "GAMING_SETS", "VEHICLES") or list of ProficiencyTypes
"""
scalar ProficiencyTypeFilter

type Proficiency {
  index: String!
  name: String!
  classes(name: String): [Class!]!
  type: ProficiencyType!
  races(name: String): [ProficiencyRace!]!
  reference: ProficiencyReference!
}

type ActionDc {
  type: AbilityScore!
  value: Int!
  success: DcSuccess!
}

type LegendaryAction {
  name: String!
  desc: String!
  dc: ActionDc
  damage: [Damage!]
}

type MonsterProficiency {
  proficiency: Proficiency!
  value: Int!
}

type Reaction {
  name: String!
  desc: String!
  dc: ActionDc
}

type Senses {
  blindsight: String
  darkvision: String
  passive_perception: Int!
  tremorsense: String
  truesight: String
}

enum RestType {
  SHORT
  LONG
}

enum UsageType {
  AT_WILL
  PER_DAY
  RECHARGE_ON_ROLL
  RECHARGE_AFTER_REST
  PER_REST
}

type Usage {
  type: UsageType!
  times: Int
  rest_types: [RestType!]
  dice: String
  min_value: Int
}

type MonsterSpellSlot {
  level: Int!
  slots: Int!
}

type MonsterSpell {
  spell: Spell!
  usage: Usage
}

type MonsterSpellcasting {
  level: Int
  ability: AbilityScore!
  dc: Int
  modifier: Int
  components_required: [SpellComponent!]
  school: String
  slots: [MonsterSpellSlot!]
  spells: [MonsterSpell!]!
}

type SpecialAbility {
  name: String!
  desc: String!
  usage: Usage
  dc: ActionDc
  spellcasting: MonsterSpellcasting
  damage: [Damage!]
}

type MonsterSpeed {
  burrow: String
  climb: String
  fly: String
  hover: Boolean
  swim: String
  walk: String
}

enum Size {
  TINY
  SMALL
  MEDIUM
  LARGE
  HUGE
  GARGANTUAN
}

"""
Size ("TINY", "SMALL", "MEDIUM", "LARGE", "HUGE", "GARGANTUAN") or list of sizes
"""
scalar SizeFilter

enum MonsterType {
  BEAST
  MONSTROSITY
  DRAGON
  HUMANOID
  UNDEAD
  FIEND
  CELESTIAL
  CONSTRUCT
  GIANT
  ELEMENTAL
  FEY
  ABERRATION
  OOZE
  SWARM
  PLANT
}

"""
MonsterTypes ("BEAST", "MONSTROSITY", "DRAGON", "HUMANOID", "UNDEAD", "FIEND", "CELESTIAL", "CONSTRUCT", "GIANT", "ELEMENTAL", "FEY", "ABERRATION", "OOZE", "SWARM", "PLANT") or list of MonsterTypes
"""
scalar MonsterTypeFilter

enum MonsterSubtype {
  ANY_RACE
  HUMAN
  DWARF
  ELF
  GOBLINOID
  MERFOLK
  SHAPECHANGER
  DEMON
  DEVIL
  ORC
  SAHUAGIN
  TITAN
  KOBOLD
  GNOLL
  GRIMLOCK
  LIZARDFOLK
  GNOME
}

"""
MonsterSubtype ("ANY_RACE", "HUMAN", "DWARF", "ELF", "GOBLINOID", "MERFOLK", "SHAPECHANGER", "DEMON", "DEVIL", "ORC", "SAHUAGIN", "TITAN", "KOBOLD", "GNOLL", "GRIMLOCK", "LIZARDFOLK", "GNOME") or list of MonsterSubtypes
"""
scalar MonsterSubtypeFilter

"""Int or string"""
scalar ActionCount

type ActionOption {
  option_type: String!
  action_name: String!
  count: ActionCount!
  type: String
}

type MultipleActionOption {
  option_type: String!
  items: [ActionOption!]!
}

union MonsterActionOption = ActionOption | MultipleActionOption

type MonsterActionOptionSet {
  option_set_type: String!
  options: [MonsterActionOption!]!
}

type MonsterActionChoice {
  choose: Int!
  type: String!
  from: MonsterActionOptionSet!
}

type Action {
  action_name: String!
  count: ActionCount!
  type: String!
}

type Attack {
  damage: [Damage!]
  dc: ActionDc!
  name: String!
}

type DamageOption {
  option_type: String!
  damage_dice: String!
  damage_type: DamageType!
  notes: String
}

type DamageOptionSet {
  option_set_type: String!
  options: [DamageOption!]!
}

type ActionDamage {
  damage_dice: String
  damage_type: DamageType
  choose: Int
  dc: ActionDc
  type: String
  from: DamageOptionSet
}

type BreathOption {
  option_type: String!
  name: String!
  dc: ActionDc!
  damage: [Damage!]
}

type BreathOptionSet {
  option_set_type: String!
  options: [BreathOption!]!
}

type BreathChoice {
  choose: Int!
  type: String!
  from: BreathOptionSet!
}

type MonsterAction {
  action_options: MonsterActionChoice
  actions: [Action!]
  name: String!
  multiattack_type: String
  attack_bonus: Int
  attacks: [Attack!]
  damage: [ActionDamage!]
  desc: String!
  dc: ActionDc
  options: BreathChoice
  usage: Usage
}

enum MonsterArmorClassType {
  dex
  natural
  armor
  spell
  condition
}

type MonsterArmorClass {
  type: MonsterArmorClassType!
  desc: String
  value: Int!
  armor: [Armor]
  spell: Spell
  condition: Condition
}

type Monster {
  index: String!
  name: String!
  alignment: String!
  armor_class: [MonsterArmorClass]
  desc: String
  actions: [MonsterAction!]
  challenge_rating: Float!
  proficiency_bonus: Int!
  charisma: Int!
  condition_immunities: [Condition!]!
  constitution: Int!
  damage_immunities: [String!]!
  damage_resistances: [String!]!
  damage_vulnerabilities: [String!]!
  dexterity: Int!
  forms: [Monster!]
  hit_dice: String!
  hit_points: Int!
  hit_points_roll: String!
  intelligence: Int!
  languages: String!
  legendary_actions: [LegendaryAction!]
  proficiencies: [MonsterProficiency!]!
  reactions: [Reaction!]
  senses: Senses!
  size: Size!
  special_abilities: [SpecialAbility!]
  speed: MonsterSpeed!
  strength: Int!
  subtype: MonsterSubtype
  type: MonsterType!
  wisdom: Int!
  xp: Int!
  image: String
}

type ProficiencyReferenceOption {
  option_type: String!
  item: Proficiency!
}

type ProficiencyChoiceOption {
  option_type: String!
  choice: ProficiencyChoice!
}

union ProficiencyOption = ProficiencyChoiceOption | ProficiencyReferenceOption

type ProficiencyOptionSet {
  option_set_type: String!
  options: [ProficiencyOption!]!
}

type ProficiencyChoice {
  desc: String
  choose: Int!
  type: String!
  from: ProficiencyOptionSet!
}

type BreathWeaponDc {
  type: AbilityScore!
  success: DcSuccess!
}

type BreathWeaponUsage {
  times: Int!
  type: UsageType!
}

type BreathWeaponDamage {
  damage_at_character_level: [DamageAtLevel!]!
  damage_type: DamageType!
}

type BreathWeaponTrait {
  name: String!
  desc: String!
  dc: BreathWeaponDc!
  usage: BreathWeaponUsage!
  damage: [BreathWeaponDamage!]!
  area_of_effect: AreaOfEffect!
}

type SpellOption {
  option_type: String!
  item: Spell!
}

type SpellOptionSet {
  option_set_type: String!
  options: [SpellOption!]!
}

type SpellChoice {
  choose: Int!
  type: String!
  from: SpellOptionSet!
}

type TraitOption {
  option_type: String!
  item: Trait!
}

type TraitOptionSet {
  option_set_type: String!
  options: [TraitOption!]!
}

type TraitChoice {
  choose: Int!
  type: String!
  from: TraitOptionSet!
}

type TraitSpecific {
  breath_weapon: BreathWeaponTrait
  damage_type: DamageType
  spell_options: SpellChoice
  subtrait_options: TraitChoice
}

type Trait {
  index: String!
  desc: [String!]!
  name: String!
  proficiencies(name: String): [Proficiency!]!
  parent: Trait
  races(name: String): [Race]!
  subraces(name: String): [Subrace!]!
  proficiency_choices: ProficiencyChoice
  language_options: LanguageChoice
  trait_specific: TraitSpecific
}

type AbilityBonus {
  ability_score: AbilityScore!
  bonus: Int!
}

type AbilityBonusOption {
  option_type: String!
  bonus: Int!
  ability_score: AbilityScore!
}

type AbilityBonusOptionSet {
  option_set_type: String!
  options: [AbilityBonusOption!]!
}

type AbilityBonusChoice {
  choose: Int!
  type: String!
  from: AbilityBonusOptionSet!
}

type LanguageOption {
  option_type: String!
  item: Language!
}

type LanguageOptionSet {
  option_set_type: String!
  options: [LanguageOption!]!
}

type LanguageChoice {
  choose: Int!
  type: String!
  from: LanguageOptionSet!
}

type Race implements ProficiencyRace {
  index: String!
  name: String!
  ability_bonuses: [AbilityBonus!]!
  ability_bonus_options: AbilityBonusChoice
  age: String!
  alignment: String!
  language_desc: String!
  languages(name: String): [Language!]!
  language_options: LanguageChoice
  size: Size!
  size_description: String!
  speed: Int!
  starting_proficiencies(name: String): [Proficiency!]!
  starting_proficiency_options: ProficiencyChoice
  subraces(name: String): [Subrace!]!
  traits(name: String): [Trait!]!
}

type Subrace implements ProficiencyRace {
  index: String!
  name: String!
  ability_bonuses: [AbilityBonus!]!
  desc: String!
  race: Race!
  racial_traits(name: String): [Trait!]!
  starting_proficiencies(name: String): [Proficiency!]!
  language_options: LanguageChoice
}

interface ProficiencyRace {
  index: String!
  name: String!
  ability_bonuses: [AbilityBonus!]!
}

type BackgroundFeature {
  name: String!
  desc: [String!]!
}

type EquipmentCategoryOptionSet {
  option_set_type: String!
  equipment_category: EquipmentCategory!
}

type EquipmentCategoryChoice {
  choose: Int!
  type: String!
  from: EquipmentCategoryOptionSet!
}

type IdealOption {
  option_type: String!
  desc: String!
  alignments: [Alignment!]!
}

type IdealOptionSet {
  option_set_type: String!
  options: [IdealOption!]!
}

type IdealChoice {
  choose: Int!
  type: String!
  from: IdealOptionSet!
}

type StringOption {
  option_type: String!
  string: String!
}

type StringOptionSet {
  option_set_type: String!
  options: [StringOption!]!
}

type StringChoice {
  choose: Int!
  type: String!
  from: StringOptionSet!
}

type Background {
  index: String!
  name: String!
  starting_proficiencies(name: String): [Proficiency!]!
  starting_equipment(name: String): [Quantity!]!
  feature: BackgroundFeature!
  language_options: LanguageChoice!
  starting_equipment_options: [EquipmentCategoryChoice!]!
  ideals: IdealChoice!
  personality_traits: StringChoice!
  bonds: StringChoice!
  flaws: StringChoice!
}

type SpellcastingInfo {
  name: String!
  desc: [String!]!
}

type ClassSpellcasting {
  info: [SpellcastingInfo!]!
  level: Int!
  spellcasting_ability: AbilityScore!
}

type PrerequisiteOption {
  option_type: String!
  ability_score: AbilityScore!
  minimum_score: Int!
}

type PrerequisiteOptionSet {
  option_set_type: String!
  options: [PrerequisiteOption!]!
}

type PrerequisiteChoice {
  choose: Int!
  type: String!
  from: PrerequisiteOptionSet!
}

type Multiclassing {
  prerequisites: [AbilityScorePrerequisite!]
  prerequisite_options: PrerequisiteChoice
  proficiencies: [Proficiency!]!
  proficiency_choices: [ProficiencyChoice!]
}

type ProficiencyPrerequisite {
  type: String!
  proficiency: Proficiency!
}

type CountedReferenceOption {
  option_type: String!
  count: Int!
  of: IEquipment!
  prerequisites: [ProficiencyPrerequisite!]
}

type EquipmentCategoryChoiceOption {
  option_type: String!
  choice: EquipmentCategoryChoice!
}

union EquipmentMultipleItem = CountedReferenceOption | EquipmentCategoryChoiceOption

type EquipmentMultipleOption {
  option_type: String!
  items: [EquipmentMultipleItem!]!
}

union EquipmentOption = CountedReferenceOption | EquipmentCategoryChoiceOption | EquipmentMultipleOption

type EquipmentOptionSet {
  option_set_type: String!
  options: [EquipmentOption!]!
}

union StartingEquipmentOptionSet = EquipmentCategoryOptionSet | EquipmentOptionSet

type StartingEquipmentChoice {
  choose: Int!
  desc: String!
  type: String!
  from: StartingEquipmentOptionSet!
}

type Class {
  index: String!
  name: String!
  hit_die: Int!
  proficiencies(name: String): [Proficiency!]!
  saving_throws: [AbilityScore!]!
  spellcasting: ClassSpellcasting
  spells(school: StringFilter, level: IntFilter, subclass: StringFilter, concentration: Boolean, ritual: Boolean, attack_type: SpellAttackTypeFilter, casting_time: StringFilter, area_of_effect: AreaOfEffectFilter, damage_type: StringFilter, dc_type: StringFilter, range: StringFilter, order: SpellOrder, skip: Int, limit: Int! = 100, name: String): [Spell!]
  starting_equipment: [Quantity!]!
  class_levels: [Level!]!
  subclasses(name: String): [Subclass!]!
  multi_classing: Multiclassing!
  proficiency_choices: [ProficiencyChoice!]!
  starting_equipment_options: [StartingEquipmentChoice!]!
}

type FeaturePrerequisite {
  type: String!
  feature: Feature
  level: Int
  spell: Spell
}

type FeatureOption {
  option_type: String!
  item: Feature!
}

type FeatureOptionSet {
  option_set_type: String!
  options: [FeatureOption!]!
}

type FeatureChoice {
  choose: Int!
  type: String!
  from: FeatureOptionSet!
}

type ExpertiseMultipleOption {
  option_type: String!
  items: [ProficiencyOption!]!
}

union ExpertiseOption = ExpertiseMultipleOption | ProficiencyChoiceOption | ProficiencyReferenceOption

type ExpertiseOptionSet {
  option_set_type: String!
  options: [ExpertiseOption!]!
}

type ExpertiseChoice {
  choose: Int!
  type: String!
  from: ExpertiseOptionSet!
}

type FeatureSpecific {
  expertise_options: ExpertiseChoice
  subfeature_options: FeatureChoice
  invocations: [Feature!]
}

type Feature {
  index: String!
  name: String!
  level: Int!
  desc: [String!]!
  parent: Feature
  class: Class!
  subclass: Subclass
  prerequisites: [FeaturePrerequisite!]!
  reference: String
  feature_specific: FeatureSpecific
}

type LevelSpellcasting {
  cantrips_known: Int
  spell_slots_level_1: Int
  spell_slots_level_2: Int
  spell_slots_level_3: Int
  spell_slots_level_4: Int
  spell_slots_level_5: Int
  spell_slots_level_6: Int
  spell_slots_level_7: Int
  spell_slots_level_8: Int
  spell_slots_level_9: Int
  spells_known: Int
}

type Dice {
  dice_count: Int!
  dice_value: Int!
}

type BarbarianSpecific {
  rage_count: Int!
  rage_damage_bonus: Int!
  brutal_critical_dice: Int!
}

type BardSpecific {
  bardic_inspiration_die: Int!
  song_of_rest_die: Int!
  magical_secrets_max_5: Int!
  magical_secrets_max_7: Int!
  magical_secrets_max_9: Int!
}

type ClericSpecific {
  channel_divinity_charges: Int!
  destroy_undead_cr: Float!
}

type DruidSpecific {
  wild_shape_max_cr: Float!
  wild_shape_swim: Boolean!
  wild_shape_fly: Boolean!
}

type FighterSpecific {
  action_surges: Int!
  indomitable_uses: Int!
  extra_attacks: Int!
}

type MonkSpecific {
  martial_arts: Dice!
  ki_points: Int!
  unarmored_movement: Int!
}

type PaladinSpecific {
  aura_range: Int!
}

type RangerSpecific {
  favored_enemies: Int!
  favored_terrain: Int!
}

type RogueSpecific {
  sneak_attack: Dice!
}

type SpellSlotCreation {
  sorcery_point_cost: Int!
  spell_slot_level: Int!
}

type SorcererSpecific {
  sorcery_points: Int!
  metamagic_known: Int!
  creating_spell_slots: [SpellSlotCreation!]!
}

type WarlockSpecific {
  invocations_known: Int!
  mystic_arcanum_level_6: Int!
  mystic_arcanum_level_7: Int!
  mystic_arcanum_level_8: Int!
  mystic_arcanum_level_9: Int!
}

type WizardSpecific {
  arcane_recovery_levels: Int!
}

union ClassSpecific = BarbarianSpecific | BardSpecific | ClericSpecific | DruidSpecific | FighterSpecific | MonkSpecific | PaladinSpecific | RangerSpecific | RogueSpecific | SorcererSpecific | WarlockSpecific | WizardSpecific

type DevotionSpecific {
  aura_range: Int!
}

type LoreSpecific {
  additional_magical_secrets_max_lvl: Int!
}

union SubclassSpecific = DevotionSpecific | LoreSpecific

type Level {
  index: String!
  level: Int!
  ability_score_bonuses: Int
  class: Class!
  subclass: Subclass
  features(order_direction: OrderByDirection, name: String): [Feature!]!
  prof_bonus: Int
  spellcasting: LevelSpellcasting
  class_specific: ClassSpecific
  subclass_specific: SubclassSpecific
}

union SpellPrerequisite = Feature | Level

type SpellWithPrerequisite {
  prerequisites: [SpellPrerequisite]!
  spell: Spell!
}

type Subclass {
  index: String!
  name: String!
  desc: [String!]!
  class: Class!
  subclass_flavor: String!
  subclass_levels: [Level]!
  spells(school: StringFilter, class: StringFilter, level: IntFilter, concentration: Boolean, ritual: Boolean, attack_type: SpellAttackTypeFilter, casting_time: StringFilter, area_of_effect: AreaOfEffectFilter, damage_type: StringFilter, dc_type: StringFilter, range: StringFilter, order: SpellOrder, skip: Int, limit: Int! = 100, name: String): [SpellWithPrerequisite!]
}

input AreaOfEffectFilter {
  type: AreaOfEffectTypeFilter
  size: IntFilter
}

enum OrderByDirection {
  ASCENDING
  DESCENDING
}

input SpellOrder {
  by: SpellOrderBy!
  direction: OrderByDirection! = ASCENDING
  then_by: SpellOrder
}

enum SpellOrderBy {
  NAME
  LEVEL
  AREA_OF_EFFECT_SIZE
  CONCENTRATION
  RITUAL
  SCHOOL
}

input EquipmentOrder {
  by: EquipmentOrderBy!
  direction: OrderByDirection! = ASCENDING
  then_by: EquipmentOrder
}

enum EquipmentOrderBy {
  NAME
  WEIGHT
  EQUIPMENT_CATEGORY
}

input ClassOrder {
  by: ClassOrderBy!
  direction: OrderByDirection! = ASCENDING
  then_by: ClassOrder
}

enum ClassOrderBy {
  NAME
  HIT_DIE
}

input MagicItemOrder {
  by: MagicItemOrderBy!
  direction: OrderByDirection! = ASCENDING
  then_by: MagicItemOrder
}

enum MagicItemOrderBy {
  NAME
  EQUIPMENT_CATEGORY
}

input EquipmentCategoryOrder {
  by: EquipmentCategoryOrderBy!
  direction: OrderByDirection! = ASCENDING
  then_by: EquipmentCategoryOrder
}

enum EquipmentCategoryOrderBy {
  NAME
  WEIGHT
}

input FeatureOrder {
  by: FeatureOrderBy!
  direction: OrderByDirection! = ASCENDING
  then_by: FeatureOrder
}

enum FeatureOrderBy {
  NAME
  LEVEL
  CLASS
  SUBCLASS
}

input LanguageOrder {
  by: LanguageOrderBy!
  direction: OrderByDirection! = ASCENDING
  then_by: LanguageOrder
}

enum LanguageOrderBy {
  NAME
  TYPE
  SCRIPT
}

input LevelOrder {
  by: LevelOrderBy!
  direction: OrderByDirection! = ASCENDING
  then_by: LevelOrder
}

enum LevelOrderBy {
  LEVEL
  CLASS
  SUBCLASS
  PROF_BONUS
  ABILITY_SCORE_BONUSES
}

input MonsterOrder {
  by: MonsterOrderBy!
  direction: OrderByDirection! = ASCENDING
  then_by: MonsterOrder
}

enum MonsterOrderBy {
  NAME
  SIZE
  TYPE
  SUBTYPE
  ARMOR_CLASS
  CHALLENGE_RATING
  CHARISMA
  CONSTITUTION
  STRENGTH
  WISDOM
  INTELLIGENCE
  DEXTERITY
  XP
}

input ProficiencyOrder {
  by: ProficiencyOrderBy!
  direction: OrderByDirection! = ASCENDING
  then_by: ProficiencyOrder
}

enum ProficiencyOrderBy {
  NAME
  TYPE
}

input RaceOrder {
  by: RaceOrderBy!
  direction: OrderByDirection! = ASCENDING
  then_by: RaceOrder
}

enum RaceOrderBy {
  NAME
  SIZE
  SPEED
}

input SkillOrder {
  by: SkillOrderBy!
  direction: OrderByDirection! = ASCENDING
  then_by: SkillOrder
}

enum SkillOrderBy {
  NAME
  ABILITY_SCORE
}

type Query {
  abilityScore(index: String): AbilityScore
  abilityScores(order_direction: OrderByDirection, name: String, full_name: String): [AbilityScore!]
  alignment(index: String): Alignment
  alignments(order_direction: OrderByDirection, name: String): [Alignment!]
  background(index: String): Background
  backgrounds(order_direction: OrderByDirection, name: String): [Background!]!
  class(index: String): Class
  classes(hit_die: IntFilter, order: ClassOrder, name: String): [Class!]!
  condition(index: String): Condition
  conditions(order_direction: OrderByDirection, name: String): [Condition!]
  damageType(index: String): DamageType
  damageTypes(order_direction: OrderByDirection, name: String): [DamageType!]
  equipment(index: String): IEquipment
  equipments(equipment_category: StringFilter, order: EquipmentOrder, skip: Int, limit: Int! = 100, name: String): [IEquipment!]
  equipmentCategory(index: String): EquipmentCategory
  equipmentCategories(order_direction: OrderByDirection, name: String): [EquipmentCategory!]
  feat(index: String): Feat
  feats(order_direction: OrderByDirection, name: String): [Feat!]
  feature(index: String): Feature
  features(level: IntFilter, class: StringFilter, subclass: StringFilter, order: FeatureOrder, skip: Int, limit: Int! = 100, name: String): [Feature!]
  language(index: String): Language
  languages(type: LanguageType, script: LanguageScriptFilter, order: LanguageOrder, name: String): [Language!]
  level(index: String): Level
  levels(class: StringFilter, subclass: StringFilter, level: IntFilter, prof_bonus: IntFilter, ability_score_bonuses: IntFilter, order: LevelOrder, skip: Int, limit: Int! = 100): [Level!]
  magicItem(index: String): MagicItem
  magicItems(equipment_category: StringFilter, order: MagicItemOrder, skip: Int, limit: Int! = 100, name: String): [MagicItem!]
  magicSchool(index: String): MagicSchool
  magicSchools(order_direction: OrderByDirection, name: String): [MagicSchool!]
  monster(index: String): Monster
  monsters(size: SizeFilter, type: MonsterTypeFilter, subtype: MonsterSubtypeFilter, damage_immunity: StringFilter, damage_resistance: StringFilter, damage_vulnerability: StringFilter, armor_class: IntFilter, challenge_rating: FloatFilter, charisma: IntFilter, constitution: IntFilter, dexterity: IntFilter, intelligence: IntFilter, strength: IntFilter, wisdom: IntFilter, xp: IntFilter, order: MonsterOrder, skip: Int, limit: Int! = 100, name: String): [Monster!]
  proficiency(index: String): Proficiency
  proficiencies(class: StringFilter, race: StringFilter, type: ProficiencyTypeFilter, order: ProficiencyOrder, skip: Int, limit: Int! = 100, name: String): [Proficiency!]
  race(index: String): Race
  races(ability_bonus: StringFilter, size: SizeFilter, language: StringFilter, speed: IntFilter, order: RaceOrder, name: String): [Race!]!
  rule(index: String): Rule
  rules(order_direction: OrderByDirection, name: String): [Rule]
  ruleSection(index: String): RuleSection
  ruleSections(order_direction: OrderByDirection, name: String): [RuleSection!]
  skill(index: String): Skill
  skills(ability_score: StringFilter, order: SkillOrder, name: String): [Skill!]
  spell(index: String): Spell
  spells(school: StringFilter, level: IntFilter, class: StringFilter, subclass: StringFilter, concentration: Boolean, ritual: Boolean, attack_type: SpellAttackTypeFilter, casting_time: StringFilter, area_of_effect: AreaOfEffectFilter, damage_type: StringFilter, dc_type: StringFilter, range: StringFilter, order: SpellOrder, skip: Int, limit: Int! = 100, name: String): [Spell!]
  subclass(index: String): Subclass
  subclasses(order_direction: OrderByDirection, name: String): [Subclass!]!
  subrace(index: String): Subrace
  subraces(order_direction: OrderByDirection, name: String): [Subrace!]!
  trait(index: String): Trait
  traits(order_direction: OrderByDirection, name: String): [Trait!]
  weaponProperty(index: String): WeaponProperty
  weaponProperties(order_direction: OrderByDirection, name: String): [WeaponProperty]
}
