{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "/ai/project.schema.json",
  "title": "Game Engine project file (hellarena.project/1)",
  "description": "Read /ai/guide.md: the rules that tie pieces together (references, map reach, rules) are there.",
  "type": "object",
  "required": [
    "format",
    "name",
    "license",
    "assets"
  ],
  "properties": {
    "format": {
      "const": "hellarena.project/1"
    },
    "name": {
      "type": "string",
      "minLength": 3,
      "maxLength": 40
    },
    "description": {
      "type": "string",
      "maxLength": 400
    },
    "license": {
      "enum": [
        "hellarena-credito",
        "cc-by-4.0",
        "cc-by-nc-4.0"
      ]
    },
    "assets": {
      "type": "array",
      "minItems": 1,
      "maxItems": 500,
      "items": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "kind",
              "key",
              "name",
              "draft"
            ],
            "properties": {
              "kind": {
                "const": "spell"
              },
              "key": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9_]{1,31}$"
              },
              "name": {
                "type": "string",
                "minLength": 3,
                "maxLength": 40
              },
              "draft": {
                "type": "object",
                "required": [
                  "v",
                  "name",
                  "school",
                  "target",
                  "delivery",
                  "effects",
                  "cast",
                  "cooldown",
                  "range"
                ],
                "properties": {
                  "v": {
                    "const": 1
                  },
                  "name": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 32
                  },
                  "description": {
                    "type": "string",
                    "maxLength": 300
                  },
                  "school": {
                    "enum": [
                      "physical",
                      "fire",
                      "frost",
                      "nature",
                      "arcane",
                      "shadow",
                      "holy"
                    ]
                  },
                  "target": {
                    "enum": [
                      "enemy",
                      "ally",
                      "self",
                      "ground",
                      "direction"
                    ]
                  },
                  "delivery": {
                    "enum": [
                      "instant",
                      "projectile",
                      "area",
                      "zone",
                      "chain"
                    ]
                  },
                  "radius": {
                    "type": "number",
                    "minimum": 1.5,
                    "maximum": 20
                  },
                  "duration": {
                    "type": "number",
                    "minimum": 3,
                    "maximum": 10
                  },
                  "speed": {
                    "enum": [
                      "slow",
                      "normal",
                      "fast"
                    ]
                  },
                  "jumps": {
                    "type": "integer",
                    "minimum": 2,
                    "maximum": 6
                  },
                  "jumpRange": {
                    "type": "number",
                    "minimum": 4,
                    "maximum": 15
                  },
                  "falloff": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 50
                  },
                  "hops": {
                    "type": "array",
                    "items": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "kind"
                        ],
                        "properties": {
                          "kind": {
                            "enum": [
                              "damage",
                              "dot",
                              "heal",
                              "hot",
                              "shield",
                              "slow",
                              "root",
                              "stun",
                              "silence",
                              "knockback",
                              "pull",
                              "haste",
                              "cost",
                              "treat",
                              "buff",
                              "debuff",
                              "polymorph",
                              "sleep",
                              "immune",
                              "charge",
                              "leap",
                              "blink",
                              "reactive",
                              "taunt",
                              "stealth",
                              "reveal",
                              "cleanse"
                            ]
                          },
                          "power": {
                            "enum": [
                              "weak",
                              "normal",
                              "strong"
                            ]
                          },
                          "duration": {
                            "type": "number"
                          },
                          "amount": {
                            "type": "number"
                          },
                          "distance": {
                            "type": "number"
                          },
                          "wound": {
                            "enum": [
                              "bleed",
                              "limp",
                              "burn",
                              "all"
                            ]
                          },
                          "scale": {
                            "type": "number",
                            "minimum": 0.25,
                            "maximum": 8
                          },
                          "flat": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 3000
                          },
                          "ap": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 3
                          },
                          "sp": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 3
                          },
                          "stat": {
                            "enum": [
                              "attack",
                              "spellpower",
                              "armor",
                              "health",
                              "mana",
                              "crit",
                              "damage",
                              "protection",
                              "protectionPhysical",
                              "attackSpeed",
                              "healing",
                              "castSpeed",
                              "threat"
                            ]
                          },
                          "stacks": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 10
                          },
                          "still": {
                            "type": "boolean"
                          },
                          "backward": {
                            "type": "boolean"
                          },
                          "only": {
                            "enum": [
                              "foe",
                              "friend"
                            ]
                          },
                          "when": {
                            "enum": [
                              "hurt",
                              "melee",
                              "hit",
                              "cast"
                            ]
                          },
                          "react": {
                            "enum": [
                              "damage",
                              "slow",
                              "heal"
                            ]
                          },
                          "dispel": {
                            "enum": [
                              "magic",
                              "curse",
                              "poison",
                              "disease"
                            ]
                          }
                        },
                        "additionalProperties": false
                      },
                      "maxItems": 3
                    }
                  },
                  "chainAllies": {
                    "type": "boolean"
                  },
                  "self": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "required": [
                        "kind"
                      ],
                      "properties": {
                        "kind": {
                          "enum": [
                            "damage",
                            "dot",
                            "heal",
                            "hot",
                            "shield",
                            "slow",
                            "root",
                            "stun",
                            "silence",
                            "knockback",
                            "pull",
                            "haste",
                            "cost",
                            "treat",
                            "buff",
                            "debuff",
                            "polymorph",
                            "sleep",
                            "immune",
                            "charge",
                            "leap",
                            "blink",
                            "reactive",
                            "taunt",
                            "stealth",
                            "reveal",
                            "cleanse"
                          ]
                        },
                        "power": {
                          "enum": [
                            "weak",
                            "normal",
                            "strong"
                          ]
                        },
                        "duration": {
                          "type": "number"
                        },
                        "amount": {
                          "type": "number"
                        },
                        "distance": {
                          "type": "number"
                        },
                        "wound": {
                          "enum": [
                            "bleed",
                            "limp",
                            "burn",
                            "all"
                          ]
                        },
                        "scale": {
                          "type": "number",
                          "minimum": 0.25,
                          "maximum": 8
                        },
                        "flat": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 3000
                        },
                        "ap": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 3
                        },
                        "sp": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 3
                        },
                        "stat": {
                          "enum": [
                            "attack",
                            "spellpower",
                            "armor",
                            "health",
                            "mana",
                            "crit",
                            "damage",
                            "protection",
                            "protectionPhysical",
                            "attackSpeed",
                            "healing",
                            "castSpeed",
                            "threat"
                          ]
                        },
                        "stacks": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 10
                        },
                        "still": {
                          "type": "boolean"
                        },
                        "backward": {
                          "type": "boolean"
                        },
                        "only": {
                          "enum": [
                            "foe",
                            "friend"
                          ]
                        },
                        "when": {
                          "enum": [
                            "hurt",
                            "melee",
                            "hit",
                            "cast"
                          ]
                        },
                        "react": {
                          "enum": [
                            "damage",
                            "slow",
                            "heal"
                          ]
                        },
                        "dispel": {
                          "enum": [
                            "magic",
                            "curse",
                            "poison",
                            "disease"
                          ]
                        }
                      },
                      "additionalProperties": false
                    },
                    "maxItems": 3
                  },
                  "hitSelf": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "required": [
                        "kind"
                      ],
                      "properties": {
                        "kind": {
                          "enum": [
                            "damage",
                            "dot",
                            "heal",
                            "hot",
                            "shield",
                            "slow",
                            "root",
                            "stun",
                            "silence",
                            "knockback",
                            "pull",
                            "haste",
                            "cost",
                            "treat",
                            "buff",
                            "debuff",
                            "polymorph",
                            "sleep",
                            "immune",
                            "charge",
                            "leap",
                            "blink",
                            "reactive",
                            "taunt",
                            "stealth",
                            "reveal",
                            "cleanse"
                          ]
                        },
                        "power": {
                          "enum": [
                            "weak",
                            "normal",
                            "strong"
                          ]
                        },
                        "duration": {
                          "type": "number"
                        },
                        "amount": {
                          "type": "number"
                        },
                        "distance": {
                          "type": "number"
                        },
                        "wound": {
                          "enum": [
                            "bleed",
                            "limp",
                            "burn",
                            "all"
                          ]
                        },
                        "scale": {
                          "type": "number",
                          "minimum": 0.25,
                          "maximum": 8
                        },
                        "flat": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 3000
                        },
                        "ap": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 3
                        },
                        "sp": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 3
                        },
                        "stat": {
                          "enum": [
                            "attack",
                            "spellpower",
                            "armor",
                            "health",
                            "mana",
                            "crit",
                            "damage",
                            "protection",
                            "protectionPhysical",
                            "attackSpeed",
                            "healing",
                            "castSpeed",
                            "threat"
                          ]
                        },
                        "stacks": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 10
                        },
                        "still": {
                          "type": "boolean"
                        },
                        "backward": {
                          "type": "boolean"
                        },
                        "only": {
                          "enum": [
                            "foe",
                            "friend"
                          ]
                        },
                        "when": {
                          "enum": [
                            "hurt",
                            "melee",
                            "hit",
                            "cast"
                          ]
                        },
                        "react": {
                          "enum": [
                            "damage",
                            "slow",
                            "heal"
                          ]
                        },
                        "dispel": {
                          "enum": [
                            "magic",
                            "curse",
                            "poison",
                            "disease"
                          ]
                        }
                      },
                      "additionalProperties": false
                    },
                    "maxItems": 3
                  },
                  "seek": {
                    "type": "number",
                    "minimum": 2,
                    "maximum": 12
                  },
                  "fall": {
                    "type": "number",
                    "minimum": 0.5,
                    "maximum": 3
                  },
                  "effects": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "required": [
                        "kind"
                      ],
                      "properties": {
                        "kind": {
                          "enum": [
                            "damage",
                            "dot",
                            "heal",
                            "hot",
                            "shield",
                            "slow",
                            "root",
                            "stun",
                            "silence",
                            "knockback",
                            "pull",
                            "haste",
                            "cost",
                            "treat",
                            "buff",
                            "debuff",
                            "polymorph",
                            "sleep",
                            "immune",
                            "charge",
                            "leap",
                            "blink",
                            "reactive",
                            "taunt",
                            "stealth",
                            "reveal",
                            "cleanse"
                          ]
                        },
                        "power": {
                          "enum": [
                            "weak",
                            "normal",
                            "strong"
                          ]
                        },
                        "duration": {
                          "type": "number"
                        },
                        "amount": {
                          "type": "number"
                        },
                        "distance": {
                          "type": "number"
                        },
                        "wound": {
                          "enum": [
                            "bleed",
                            "limp",
                            "burn",
                            "all"
                          ]
                        },
                        "scale": {
                          "type": "number",
                          "minimum": 0.25,
                          "maximum": 8
                        },
                        "flat": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 3000
                        },
                        "ap": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 3
                        },
                        "sp": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 3
                        },
                        "stat": {
                          "enum": [
                            "attack",
                            "spellpower",
                            "armor",
                            "health",
                            "mana",
                            "crit",
                            "damage",
                            "protection",
                            "protectionPhysical",
                            "attackSpeed",
                            "healing",
                            "castSpeed",
                            "threat"
                          ]
                        },
                        "stacks": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 10
                        },
                        "still": {
                          "type": "boolean"
                        },
                        "backward": {
                          "type": "boolean"
                        },
                        "only": {
                          "enum": [
                            "foe",
                            "friend"
                          ]
                        },
                        "when": {
                          "enum": [
                            "hurt",
                            "melee",
                            "hit",
                            "cast"
                          ]
                        },
                        "react": {
                          "enum": [
                            "damage",
                            "slow",
                            "heal"
                          ]
                        },
                        "dispel": {
                          "enum": [
                            "magic",
                            "curse",
                            "poison",
                            "disease"
                          ]
                        }
                      },
                      "additionalProperties": false
                    },
                    "maxItems": 3
                  },
                  "cast": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 5,
                    "multipleOf": 0.5
                  },
                  "fragile": {
                    "type": "boolean"
                  },
                  "channel": {
                    "type": "integer",
                    "minimum": 2,
                    "maximum": 10
                  },
                  "hpCost": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 50
                  },
                  "threat": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 1000
                  },
                  "element": {
                    "enum": [
                      "fire",
                      "water",
                      "ice",
                      "lightning",
                      "earth",
                      "wind",
                      "nature",
                      "shadow",
                      "light"
                    ],
                    "description": "its element for the combos of a match with elements (content/elements.ts); left out: its school’s"
                  },
                  "cooldown": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 120
                  },
                  "range": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 40
                  },
                  "vfx": {
                    "type": "object",
                    "properties": {
                      "particles": {
                        "enum": [
                          "fire",
                          "embers",
                          "snow",
                          "poison",
                          "shadow",
                          "spark",
                          "lightning",
                          "life",
                          "holy",
                          "dust",
                          "wind",
                          "water",
                          "none"
                        ]
                      },
                      "color": {
                        "type": "string",
                        "pattern": "^#[0-9a-fA-F]{6}$"
                      },
                      "weapon": {
                        "enum": [
                          "dagger",
                          "arrow",
                          "axe",
                          "shield",
                          "hammer",
                          "fist"
                        ],
                        "description": "a projectile flies as this weapon (a dagger thrown, an arrow, an axe, a shield, a hammer, a fist of light), its particles the element trail"
                      },
                      "theme": {
                        "enum": [
                          "fogo",
                          "gelo",
                          "sombra",
                          "raio",
                          "vento",
                          "pedra",
                          "agua",
                          "vida",
                          "arcano",
                          "brasa",
                          "trovao",
                          "aurora",
                          "runa",
                          "flecha"
                        ],
                        "description": "the theme of a projectile by name: its own shape in flight (else the particles pick one)"
                      }
                    },
                    "additionalProperties": false
                  },
                  "sound": {
                    "anyOf": [
                      {
                        "enum": [
                          "fireball",
                          "frostbolt",
                          "shadow_bolt",
                          "smite",
                          "wrath",
                          "arcane_missiles",
                          "lightning_bolt",
                          "frost_nova",
                          "arcane_explosion",
                          "blizzard",
                          "consecration",
                          "thunder_clap",
                          "entangling_roots",
                          "renew",
                          "flash_heal",
                          "power_word_shield",
                          "aimed_shot",
                          "arcane_bolt",
                          "meteor",
                          "starfire",
                          "vanish",
                          "blink",
                          "charge",
                          "ice_block",
                          "mana_shield",
                          "hunters_mark",
                          "earthbind_totem",
                          "barkskin",
                          "rejuvenation",
                          "sprint",
                          "elem_earth",
                          "elem_water",
                          "elem_death",
                          "elem_wind",
                          "elem_blood",
                          "elem_spellfire",
                          "elem_arcane",
                          "thorns",
                          "stoneskin_totem",
                          "shadow_step",
                          "toxic_cloud",
                          "insect_swarm",
                          "elem_poison",
                          "divine_shield",
                          "holy_shield",
                          "holy_nova",
                          "battle_shout",
                          "heroic_leap",
                          "berserker_rage",
                          "shield_wall",
                          "retaliation",
                          "last_stand",
                          "freezing_trap",
                          "multi_shot",
                          "volley",
                          "holy_shock",
                          "divine_protection",
                          "shield_block",
                          "disengage",
                          "fade",
                          "feral_charge",
                          "intercession",
                          "beber_pocao_cura",
                          "regrowth",
                          "dinamite",
                          "devotion_aura",
                          "aspect_of_the_cheetah",
                          "wyvern_sting",
                          "bomba_cobre",
                          "arcane_rune",
                          "call_pet",
                          "blade_flurry",
                          "demoralizing_roar",
                          "holy_clamor",
                          "moonfire",
                          "exorcism",
                          "npc_sneed_whirl",
                          "taunt",
                          "serpent_sting",
                          "righteous_fury",
                          "hammer_of_justice",
                          "ice_prison",
                          "hurricane",
                          "drain_life",
                          "deadly_poison",
                          "demoralizing_shout",
                          "hammer_of_wrath",
                          "power_word_fortitude",
                          "intimidating_shout",
                          "piercing_howl",
                          "immolation_trap",
                          "seal_of_command",
                          "distracting_shot",
                          "battle_stance"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "icon": {
                    "anyOf": [
                      {
                        "enum": [
                          "aimed_shot.png",
                          "ambush.png",
                          "arcane_barrage.png",
                          "arcane_bolt.png",
                          "arcane_explosion.png",
                          "arcane_intellect.png",
                          "arcane_leap.png",
                          "arcane_missiles.png",
                          "arcane_shot.png",
                          "arcane_step.png",
                          "aspect_of_the_cheetah.png",
                          "aspect_of_the_hawk.png",
                          "auto_attack.png",
                          "auto_shot.png",
                          "backstab.png",
                          "bark_colossus.png",
                          "barkskin.png",
                          "bear_form.png",
                          "berserker_rage.png",
                          "blast_wave.png",
                          "blessing_of_freedom.png",
                          "blessing_of_protection.png",
                          "blind.png",
                          "blink.png",
                          "blizzard.png",
                          "blood_bait.png",
                          "bloodrage.png",
                          "boomerang_blade.png",
                          "call_pet.png",
                          "cat_form.png",
                          "chain_heal.png",
                          "chain_lightning.png",
                          "charge.png",
                          "chave_arena.png",
                          "cheap_shot.png",
                          "claw.png",
                          "cleanse.png",
                          "cleave.png",
                          "cold_snap.png",
                          "concussive_shot.png",
                          "cone_of_cold.png",
                          "conflagrate.png",
                          "consecration.png",
                          "corruption.png",
                          "counterspell.png",
                          "cure_disease.png",
                          "cure_poison.png",
                          "curse_of_agony.png",
                          "curse_of_exhaustion.png",
                          "deadly_poison.png",
                          "death_coil.png",
                          "devotion_aura.png",
                          "disengage.png",
                          "dispel_magic.png",
                          "divine_shield.png",
                          "drain_life.png",
                          "earth_shock.png",
                          "earthbind_totem.png",
                          "ember_step.png",
                          "entangling_roots.png",
                          "eviscerate.png",
                          "evocation.png",
                          "execute.png",
                          "execution_strike.png",
                          "exorcism.png",
                          "explosive_trap.png",
                          "fan_of_fire.png",
                          "fear.png",
                          "feral_charge.png",
                          "ferocious_bite.png",
                          "fire_blast.png",
                          "fireball.png",
                          "flame_shock.png",
                          "flamestrike.png",
                          "flash_heal.png",
                          "flash_of_light.png",
                          "flash_step.png",
                          "freezing_trap.png",
                          "frost_nova.png",
                          "frost_orbs.png",
                          "frost_shock.png",
                          "frostbolt.png",
                          "ghost_wolf.png",
                          "golem_obsidiana.png",
                          "gouge.png",
                          "greater_heal.png",
                          "growing_storm.png",
                          "hammer_of_justice.png",
                          "hammer_of_wrath.png",
                          "hamstring.png",
                          "healing_stream_totem.png",
                          "healing_touch.png",
                          "healing_wave.png",
                          "hellfire.png",
                          "heroic_leap.png",
                          "heroic_strike.png",
                          "holy_light.png",
                          "holy_nova.png",
                          "holy_shock.png",
                          "howl_of_terror.png",
                          "hunters_mark.png",
                          "hurricane.png",
                          "ice_barrier.png",
                          "ice_block.png",
                          "immolate.png",
                          "infestation.png",
                          "innervate.png",
                          "insect_swarm.png",
                          "insignia_da_provacao_1.png",
                          "insignia_da_provacao_2.png",
                          "insignia_da_provacao_3.png",
                          "insignia_da_provacao_4.png",
                          "insignia_da_provacao_5.png",
                          "intimidating_shout.png",
                          "inverse_bolt.png",
                          "iron_quake.png",
                          "iron_taunt.png",
                          "judgement.png",
                          "kick.png",
                          "kidney_shot.png",
                          "lay_on_hands.png",
                          "lesser_healing_wave.png",
                          "life_tap.png",
                          "light_lasso.png",
                          "lightning_bolt.png",
                          "lightning_shield.png",
                          "magma_totem.png",
                          "maul.png",
                          "meteor.png",
                          "mind_blast.png",
                          "mind_flay.png",
                          "moonfire.png",
                          "mortal_strike.png",
                          "multi_shot.png",
                          "net_cast.png",
                          "noon_fist.png",
                          "poison_blade.png",
                          "polymorph.png",
                          "pounce.png",
                          "power_infusion.png",
                          "power_word_shield.png",
                          "prayer_of_healing.png",
                          "presence_of_mind.png",
                          "prov_estilo_area.png",
                          "prov_estilo_aura.png",
                          "prov_estilo_espinhos.png",
                          "prov_estilo_invocador.png",
                          "prov_estilo_vampirismo_critico_esquiva.png",
                          "prov_estilo_velocidade_de_ataque.png",
                          "prov_item_anel_comum.png",
                          "prov_item_anel_epico.png",
                          "prov_item_anel_raro.png",
                          "prov_item_berloque_comum.png",
                          "prov_item_berloque_epico.png",
                          "prov_item_berloque_raro.png",
                          "prov_item_bota_comum.png",
                          "prov_item_bota_epico.png",
                          "prov_item_bota_raro.png",
                          "prov_item_calca_comum.png",
                          "prov_item_calca_epico.png",
                          "prov_item_calca_raro.png",
                          "prov_item_elmo_comum.png",
                          "prov_item_elmo_epico.png",
                          "prov_item_elmo_raro.png",
                          "prov_item_luva_comum.png",
                          "prov_item_luva_epico.png",
                          "prov_item_luva_raro.png",
                          "prov_item_ombreira_comum.png",
                          "prov_item_ombreira_epico.png",
                          "prov_item_ombreira_raro.png",
                          "prov_item_peito_comum.png",
                          "prov_item_peito_epico.png",
                          "prov_item_peito_raro.png",
                          "prov_passiva_01_corrente_partida.png",
                          "prov_passiva_02_reflexo_da_aurora.png",
                          "prov_passiva_03_pe_de_pedra.png",
                          "prov_passiva_04_aura_do_juramento.png",
                          "prov_passiva_05_lume_que_arde.png",
                          "prov_passiva_06_couro_do_ciclo.png",
                          "prov_passiva_07_quarto_golpe.png",
                          "prov_passiva_08_asa_de_po.png",
                          "prov_passiva_09_bando_de_dois.png",
                          "prov_passiva_10_flecha_que_salta.png",
                          "prov_passiva_11_embalo_do_ki.png",
                          "prov_passiva_12_giro_de_mariposa.png",
                          "prov_passiva_13_runa_deixada.png",
                          "prov_passiva_14_totem_aceso.png",
                          "prov_passiva_15_contrato_do_avesso.png",
                          "prov_passiva_16_mare_que_volta.png",
                          "prov_passiva_17_tinta_de_lume.png",
                          "prov_passiva_18_enxame_do_ciclo.png",
                          "prowl.png",
                          "psychic_scream.png",
                          "pummel.png",
                          "purge.png",
                          "pyroblast.png",
                          "rain_of_fire.png",
                          "recall_tower.png",
                          "regrowth.png",
                          "rejuvenation.png",
                          "renew.png",
                          "repentance.png",
                          "retaliation.png",
                          "ring_of_frost.png",
                          "rip.png",
                          "sap.png",
                          "scatter_shot.png",
                          "scorch.png",
                          "seal_of_righteousness.png",
                          "seal_of_the_crusader.png",
                          "searing_totem.png",
                          "serpent_sting.png",
                          "shadow_bolt.png",
                          "shadow_step.png",
                          "shadow_stride.png",
                          "shadow_veil.png",
                          "shadow_word_pain.png",
                          "shadowburn.png",
                          "shield_bash.png",
                          "shield_wall.png",
                          "shred.png",
                          "silence.png",
                          "sinister_strike.png",
                          "siphon_life.png",
                          "slice_and_dice.png",
                          "smite.png",
                          "soul_fire.png",
                          "sprint.png",
                          "starfire.png",
                          "stealth.png",
                          "sting_swarm.png",
                          "sucata.png",
                          "summon_imp.png",
                          "summon_voidwalker.png",
                          "sun_step.png",
                          "sunder_armor.png",
                          "swiftmend.png",
                          "swipe.png",
                          "tame_beast.png",
                          "thorns.png",
                          "thunder_clap.png",
                          "toxic_cloud.png",
                          "tranquility.png",
                          "tremor_totem.png",
                          "unstable_mark.png",
                          "vampiric_embrace.png",
                          "vanish.png",
                          "volley.png",
                          "wasp_cloud.png",
                          "whirlwind.png",
                          "wing_clip.png",
                          "wl_adaga_sedenta.png",
                          "wl_armadilha.png",
                          "wl_armadilha_rapida.png",
                          "wl_avanco_de_escudo.png",
                          "wl_barreira_arcana.png",
                          "wl_bloco_de_gelo.png",
                          "wl_bola_de_fogo.png",
                          "wl_bomba_de_corda.png",
                          "wl_bomba_de_fumaca.png",
                          "wl_brinde_do_campeao.png",
                          "wl_casca_de_carvalho.png",
                          "wl_chuva_de_flechas.png",
                          "wl_chuva_de_meteoros.png",
                          "wl_circulo_da_aurora.png",
                          "wl_clarao_sagrado.png",
                          "wl_elo_de_almas.png",
                          "wl_escudo_arcano.png",
                          "wl_escudo_da_aurora.png",
                          "wl_esfera_arcana.png",
                          "wl_esfera_faminta.png",
                          "wl_esfera_vampirica.png",
                          "wl_espinho_selvagem.png",
                          "wl_fenda_do_avesso.png",
                          "wl_flecha_rastreadora.png",
                          "wl_flecha_veloz.png",
                          "wl_frasco_de_folego.png",
                          "wl_furia_de_ferro.png",
                          "wl_giro_do_sol.png",
                          "wl_golpe_de_escudo.png",
                          "wl_grito_de_guerra.png",
                          "wl_grito_do_guardiao.png",
                          "wl_grito_largo.png",
                          "wl_grito_pesado.png",
                          "wl_investida.png",
                          "wl_investida_da_aurora.png",
                          "wl_isca_de_fera.png",
                          "wl_jato_de_mare.png",
                          "wl_juramento_da_aurora.png",
                          "wl_lanca_de_gelo.png",
                          "wl_manto_de_sombras.png",
                          "wl_mapa_do_faro.png",
                          "wl_mare_calma.png",
                          "wl_martelo_atordoante.png",
                          "wl_martelo_da_aurora.png",
                          "wl_muralha_de_escudo.png",
                          "wl_nuvem_de_esporos.png",
                          "wl_onda_de_choque.png",
                          "wl_orbe_gravitacional.png",
                          "wl_orbe_repulsor.png",
                          "wl_orbe_sombrio.png",
                          "wl_palma_do_sol.png",
                          "wl_palma_firme.png",
                          "wl_passo_do_avesso.png",
                          "wl_passo_do_sol.png",
                          "wl_pedregulho.png",
                          "wl_pele_de_pedra.png",
                          "wl_pele_rija.png",
                          "wl_placa_de_ferro.png",
                          "wl_postura_de_pedra.png",
                          "wl_prece_da_mare.png",
                          "wl_prisao_de_runa.png",
                          "wl_prisao_firme.png",
                          "wl_pulso_gelado.png",
                          "wl_raio_arcano.png",
                          "wl_raio_rubro.png",
                          "wl_raio_trovejante.png",
                          "wl_raiz_presa.png",
                          "wl_rajada_veloz.png",
                          "wl_rede.png",
                          "wl_rede_de_caca.png",
                          "wl_rede_de_seda.png",
                          "wl_redemoinho_de_aco.png",
                          "wl_relampago_de_runa.png",
                          "wl_respiracao_do_sol.png",
                          "wl_revelar.png",
                          "wl_rolamento.png",
                          "wl_rugido_do_urso.png",
                          "wl_rugido_largo.png",
                          "wl_runa_de_guarda.png",
                          "wl_salto_da_sombra.png",
                          "wl_salto_do_felino.png",
                          "wl_salto_do_machado.png",
                          "wl_sangue_quente.png",
                          "wl_teleporte.png",
                          "wl_toque_paralisante.png",
                          "wl_totem_do_vento.png",
                          "wl_totem_largo.png",
                          "wl_veneno_fundo.png",
                          "wl_veneno_paralisante.png",
                          "wl_veu_da_lua.png",
                          "wl_veu_longo.png",
                          "wrath.png"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "art": {
                    "anyOf": [
                      {
                        "enum": [
                          "gelo-lanca",
                          "gelo-estilhaco",
                          "gelo-orbe",
                          "gelo-geada",
                          "gelo-prisao",
                          "gelo-escudo",
                          "gelo-vento",
                          "gelo-sopro",
                          "gelo-nova",
                          "gelo-eclosao",
                          "gelo-nevasca",
                          "gelo-anel",
                          "gelo-chao",
                          "gelo-ricochete",
                          "fogo-lanca",
                          "fogo-estilhaco",
                          "fogo-orbe",
                          "fogo-geada",
                          "fogo-prisao",
                          "fogo-escudo",
                          "fogo-vento",
                          "fogo-sopro",
                          "fogo-nova",
                          "fogo-eclosao",
                          "fogo-nevasca",
                          "fogo-anel",
                          "fogo-chao",
                          "fogo-ricochete",
                          "veneno-lanca",
                          "veneno-estilhaco",
                          "veneno-orbe",
                          "veneno-geada",
                          "veneno-prisao",
                          "veneno-escudo",
                          "veneno-vento",
                          "veneno-sopro",
                          "veneno-nova",
                          "veneno-eclosao",
                          "veneno-nevasca",
                          "veneno-anel",
                          "veneno-chao",
                          "veneno-ricochete",
                          "arcano-lanca",
                          "arcano-estilhaco",
                          "arcano-orbe",
                          "arcano-geada",
                          "arcano-prisao",
                          "arcano-escudo",
                          "arcano-vento",
                          "arcano-sopro",
                          "arcano-nova",
                          "arcano-eclosao",
                          "arcano-nevasca",
                          "arcano-anel",
                          "arcano-chao",
                          "arcano-ricochete",
                          "sombra-lanca",
                          "sombra-estilhaco",
                          "sombra-orbe",
                          "sombra-geada",
                          "sombra-prisao",
                          "sombra-escudo",
                          "sombra-vento",
                          "sombra-sopro",
                          "sombra-nova",
                          "sombra-eclosao",
                          "sombra-nevasca",
                          "sombra-anel",
                          "sombra-chao",
                          "sombra-ricochete",
                          "raio-lanca",
                          "raio-estilhaco",
                          "raio-orbe",
                          "raio-geada",
                          "raio-prisao",
                          "raio-escudo",
                          "raio-vento",
                          "raio-sopro",
                          "raio-nova",
                          "raio-eclosao",
                          "raio-nevasca",
                          "raio-anel",
                          "raio-chao",
                          "raio-ricochete",
                          "luz-lanca",
                          "luz-estilhaco",
                          "luz-orbe",
                          "luz-geada",
                          "luz-prisao",
                          "luz-escudo",
                          "luz-vento",
                          "luz-sopro",
                          "luz-nova",
                          "luz-eclosao",
                          "luz-nevasca",
                          "luz-anel",
                          "luz-chao",
                          "luz-ricochete",
                          "natureza-lanca",
                          "natureza-estilhaco",
                          "natureza-orbe",
                          "natureza-geada",
                          "natureza-prisao",
                          "natureza-escudo",
                          "natureza-vento",
                          "natureza-sopro",
                          "natureza-nova",
                          "natureza-eclosao",
                          "natureza-nevasca",
                          "natureza-anel",
                          "natureza-chao",
                          "natureza-ricochete"
                        ]
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "move": {
                    "enum": [
                      "strike",
                      "throw",
                      "slam",
                      "shield",
                      "pray",
                      "roar",
                      "spin",
                      "stab",
                      "toss",
                      "kneel",
                      "drink"
                    ]
                  },
                  "summon": {
                    "type": "string",
                    "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$",
                    "description": "calls a companion: a creature of the project with a companion field (target self, delivery instant; effects may be empty)"
                  }
                },
                "additionalProperties": false
              }
            }
          },
          {
            "type": "object",
            "required": [
              "kind",
              "key",
              "name",
              "draft"
            ],
            "properties": {
              "kind": {
                "const": "item"
              },
              "key": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9_]{1,31}$"
              },
              "name": {
                "type": "string",
                "minLength": 3,
                "maxLength": 40
              },
              "draft": {
                "type": "object",
                "required": [
                  "v",
                  "name",
                  "kind",
                  "quality"
                ],
                "properties": {
                  "v": {
                    "const": 1
                  },
                  "name": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 32
                  },
                  "kind": {
                    "enum": [
                      "weapon",
                      "armor",
                      "jewel",
                      "consumable",
                      "material",
                      "component",
                      "key",
                      "vehicle"
                    ]
                  },
                  "quality": {
                    "enum": [
                      "poor",
                      "common",
                      "uncommon",
                      "rare",
                      "epic",
                      "legendary"
                    ]
                  },
                  "icon": {
                    "type": "string",
                    "maxLength": 80
                  },
                  "description": {
                    "type": "string",
                    "maxLength": 200
                  },
                  "slot": {
                    "enum": [
                      "onehand",
                      "twohand",
                      "mainhand",
                      "ranged",
                      "head",
                      "shoulders",
                      "back",
                      "chest",
                      "wrist",
                      "hands",
                      "waist",
                      "legs",
                      "feet",
                      "shield",
                      "holdable",
                      "neck",
                      "finger",
                      "trinket"
                    ]
                  },
                  "weaponType": {
                    "enum": [
                      "sword",
                      "axe",
                      "mace",
                      "dagger",
                      "staff",
                      "bow",
                      "wand"
                    ]
                  },
                  "damage": {
                    "type": "array",
                    "items": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 2000
                    },
                    "minItems": 2,
                    "maxItems": 2
                  },
                  "speed": {
                    "type": "number",
                    "minimum": 1,
                    "maximum": 4
                  },
                  "armorType": {
                    "enum": [
                      "cloth",
                      "leather",
                      "mail",
                      "plate"
                    ]
                  },
                  "reach": {
                    "type": "number",
                    "minimum": 3,
                    "maximum": 9
                  },
                  "sweet": {
                    "type": "array",
                    "items": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 9
                    },
                    "minItems": 2,
                    "maxItems": 2
                  },
                  "thrust": {
                    "type": "boolean"
                  },
                  "stats": {
                    "type": "object",
                    "propertyNames": {
                      "enum": [
                        "str",
                        "agi",
                        "sta",
                        "int",
                        "spi",
                        "spd",
                        "hpw",
                        "mp5"
                      ]
                    },
                    "additionalProperties": {
                      "type": "integer",
                      "minimum": -200,
                      "maximum": 200
                    }
                  },
                  "level": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 60
                  },
                  "stack": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 200
                  },
                  "sell": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 1000000
                  },
                  "use": {
                    "type": "string",
                    "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                  },
                  "color": {
                    "type": "string",
                    "pattern": "^#[0-9a-fA-F]{6}$"
                  },
                  "size": {
                    "type": "array",
                    "items": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 4
                    },
                    "minItems": 2,
                    "maxItems": 2
                  },
                  "weight": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 50
                  },
                  "ride": {
                    "enum": [
                      "carro",
                      "moto",
                      "aviao",
                      "cavalo",
                      "raptor",
                      "saltador",
                      "grifo",
                      "kart"
                    ],
                    "description": "kind vehicle: the body it gives"
                  },
                  "questItem": {
                    "type": "boolean",
                    "description": "material, component, consumable or key: a thing a quest asks for (no shop buys it)"
                  },
                  "armor": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 20000,
                    "description": "kind armor: its armour value (left out: by material, slot and level)"
                  },
                  "sockets": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 3
                  },
                  "light": {
                    "type": "number",
                    "minimum": 3,
                    "maximum": 20
                  },
                  "socket": {
                    "type": "object",
                    "required": [
                      "type"
                    ],
                    "properties": {
                      "type": {
                        "enum": [
                          "rune",
                          "stone",
                          "seal"
                        ]
                      },
                      "school": {
                        "enum": [
                          "physical",
                          "fire",
                          "frost",
                          "nature",
                          "arcane",
                          "shadow",
                          "holy"
                        ]
                      },
                      "power": {
                        "enum": [
                          "weak",
                          "normal",
                          "strong"
                        ]
                      },
                      "stats": {
                        "type": "object",
                        "propertyNames": {
                          "enum": [
                            "str",
                            "agi",
                            "sta",
                            "int",
                            "spi",
                            "spd",
                            "hpw",
                            "mp5"
                          ]
                        },
                        "additionalProperties": {
                          "type": "integer",
                          "minimum": -50,
                          "maximum": 50
                        }
                      },
                      "seal": {
                        "enum": [
                          "cura_aparo",
                          "folego_aparo",
                          "roubo_vida"
                        ]
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false
              }
            }
          },
          {
            "type": "object",
            "required": [
              "kind",
              "key",
              "name",
              "draft"
            ],
            "properties": {
              "kind": {
                "const": "creature"
              },
              "key": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9_]{1,31}$"
              },
              "name": {
                "type": "string",
                "minLength": 3,
                "maxLength": 40
              },
              "draft": {
                "type": "object",
                "required": [
                  "v",
                  "name",
                  "family",
                  "look",
                  "level",
                  "rank",
                  "role",
                  "temper",
                  "abilities",
                  "powers"
                ],
                "properties": {
                  "v": {
                    "const": 1
                  },
                  "name": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 32
                  },
                  "family": {
                    "enum": [
                      "raposa_cinza",
                      "raposa_brasa",
                      "lagarto_feroz",
                      "lagarto",
                      "mariposa",
                      "lobo",
                      "javali",
                      "carneiro",
                      "lince",
                      "urso",
                      "aranha",
                      "escorpiao",
                      "ave_terror",
                      "urubu",
                      "varano",
                      "ema",
                      "zebra",
                      "leao",
                      "tatu",
                      "siri",
                      "ermitao",
                      "verme_broca",
                      "salamandra",
                      "cupim",
                      "cupim_soldado",
                      "cupim_cuspidor",
                      "cupim_rainha",
                      "vespa",
                      "vespa_ferroadora",
                      "vespa_rainha",
                      "gafanhotao",
                      "gafanhotao_zumbidor",
                      "toupeiro",
                      "toupeiro_cavador",
                      "toupeiro_ressoador",
                      "corvejo",
                      "polvorino",
                      "polvorino_tinteiro",
                      "sorrak",
                      "sorrak_xama",
                      "troglodita",
                      "trogg_xama",
                      "troll_enfeiticado",
                      "troll_vodu",
                      "irmandade",
                      "irmandade_queimador",
                      "pirata",
                      "fuzileiro",
                      "coveiro",
                      "coveiro_lanterneiro",
                      "cacador_po",
                      "desertor_arqueiro",
                      "desertor_cavaleiro",
                      "culto_iniciado",
                      "culto_incendiario",
                      "orc_lamina",
                      "orc_executor",
                      "orc_fanatico",
                      "orc_bruxo",
                      "orc_abrasador",
                      "sacerdote_apagado",
                      "gnomo",
                      "oco",
                      "oco_faminto",
                      "oco_inchado",
                      "oco_vindimador",
                      "oco_elfico",
                      "carniceiro_oco",
                      "soldado_thessar",
                      "espirito_bruma",
                      "espantalho",
                      "espantalho_ardente",
                      "espantalho_ceifador",
                      "elemental_fogo",
                      "cria_lava",
                      "elenco_escola",
                      "elenco_empresa",
                      "masmorra_esqueletos",
                      "masmorra_conjuradores",
                      "masmorra_chefe",
                      "bruma_saqueadores",
                      "bruma_feras",
                      "bruma_chefe",
                      "bruma_espectros",
                      "selva_salamandra",
                      "selva_ermitao",
                      "selva_dragao"
                    ]
                  },
                  "look": {
                    "enum": [
                      "raposa_cinza",
                      "raposa_brasa",
                      "lagarto_crista_feroz",
                      "lagarto_crista",
                      "moth_giant",
                      "lobo_nevoa",
                      "beast_veilwolf",
                      "beast_wolf",
                      "lobo_nevoa_grande",
                      "javali_musgo",
                      "carneiro",
                      "beast_lynx",
                      "beast_tiger",
                      "beast_bear",
                      "spider_mist",
                      "beast_spider",
                      "beast_scorpid",
                      "beast_scorpid_red",
                      "beast_scorpid_dark",
                      "ave_terror",
                      "ave_terror_dourada",
                      "beast_vulture",
                      "beast_lizard",
                      "beast_plainstrider",
                      "beast_zhevra",
                      "beast_lion",
                      "tatu",
                      "tatu_grande",
                      "siri",
                      "ermitao",
                      "ermitao_escudo",
                      "earthborer",
                      "salamandra",
                      "cupim",
                      "cupim_soldado",
                      "cupim_cuspidor",
                      "cupim_rainha",
                      "vespa",
                      "vespa_ferroadora",
                      "vespa_rainha",
                      "gafanhotao",
                      "gafanhotao_zumbidor",
                      "toupeiro",
                      "toupeiro_cavador",
                      "toupeiro_ressoador",
                      "corvejo",
                      "polvorino",
                      "polvorino_tinteiro",
                      "sorrak",
                      "sorrak_xama",
                      "trogg",
                      "trogg_xama",
                      "troll_enfeiticado",
                      "troll_vodu",
                      "irmandade",
                      "irmandade_queimador",
                      "pirata",
                      "kultiras_fuzileiro",
                      "coveiro",
                      "coveiro_lanterneiro",
                      "cacador_po",
                      "desertor_arqueiro",
                      "desertor_cavaleiro",
                      "culto_iniciado",
                      "culto_incendiario",
                      "orc_lamina",
                      "orc_executor",
                      "orc_fanatico",
                      "orc_bruxo",
                      "orc_abrasador",
                      "sacerdote_apagado",
                      "gnomo_ladino",
                      "oco",
                      "oco_faminto",
                      "oco_inchado",
                      "oco_vindimador",
                      "oco_elfico",
                      "carniceiro_oco",
                      "soldado_thessar",
                      "mist_spirit",
                      "espantalho",
                      "espantalho_ardente",
                      "espantalho_ceifador",
                      "mc_fire_elemental",
                      "mc_lava_spawn",
                      "edu_professora",
                      "edu_professor",
                      "edu_tecnico_lab",
                      "edu_aluno",
                      "edu_aluna",
                      "emp_atendente",
                      "emp_cliente",
                      "emp_gerente",
                      "emp_tecnico_seguranca",
                      "mas_esqueleto_espada",
                      "mas_esqueleto_pesado",
                      "mas_esqueleto_lanca",
                      "mas_esqueleto_adagas",
                      "mas_sacerdote_apagado",
                      "mas_conjurador_chama",
                      "mas_chamador_ocos",
                      "mas_chefe_trono",
                      "ext_saqueador",
                      "ext_lobo",
                      "ext_lobo_filhote",
                      "ext_guardiao_bruma",
                      "ext_espectro_bruma",
                      "salamandra_brasa",
                      "ermitao_de_elmo",
                      "dragao_brasa"
                    ]
                  },
                  "level": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 20
                  },
                  "rank": {
                    "enum": [
                      "normal",
                      "elite",
                      "boss"
                    ]
                  },
                  "role": {
                    "enum": [
                      "balanced",
                      "tank",
                      "swift",
                      "caster"
                    ]
                  },
                  "temper": {
                    "enum": [
                      "predador",
                      "territorial",
                      "enxame",
                      "guerreiro",
                      "conjurador",
                      "covarde",
                      "faminto",
                      "construto",
                      "imovel"
                    ]
                  },
                  "abilities": {
                    "type": "array",
                    "items": {
                      "enum": [
                        "bite_hop",
                        "bleed",
                        "bolt",
                        "bomb",
                        "burrow",
                        "butt",
                        "call_help",
                        "charge",
                        "curl_regen",
                        "devour_ab",
                        "dive",
                        "drain",
                        "dust_wings",
                        "execute",
                        "heal_ally",
                        "heavy",
                        "interrupt_kick",
                        "kick",
                        "lasso",
                        "leap",
                        "net",
                        "push",
                        "roll",
                        "sand_frill",
                        "shell",
                        "shield_up",
                        "shout",
                        "spider_bite",
                        "spikes",
                        "spin",
                        "spit",
                        "steal",
                        "summon",
                        "thrust",
                        "trail",
                        "trap",
                        "vanish",
                        "vanish_smoke",
                        "wall",
                        "war_drum",
                        "web"
                      ]
                    },
                    "uniqueItems": true,
                    "maxItems": 4
                  },
                  "death": {
                    "enum": [
                      "death_pool",
                      "explode"
                    ]
                  },
                  "powers": {
                    "type": "array",
                    "items": {
                      "enum": [
                        "split",
                        "raise",
                        "disguise",
                        "rooted"
                      ]
                    },
                    "uniqueItems": true
                  },
                  "spellRefs": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                    },
                    "maxItems": 3
                  },
                  "drops": {
                    "type": "array",
                    "maxItems": 8,
                    "items": {
                      "type": "object",
                      "required": [
                        "item",
                        "chance"
                      ],
                      "properties": {
                        "item": {
                          "type": "string",
                          "pattern": "^item:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                        },
                        "chance": {
                          "type": "number",
                          "exclusiveMinimum": 0,
                          "maximum": 1
                        },
                        "count": {
                          "type": "array",
                          "items": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 99
                          },
                          "minItems": 2,
                          "maxItems": 2
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "money": {
                    "type": "array",
                    "items": {
                      "type": "integer",
                      "minimum": 0
                    },
                    "minItems": 2,
                    "maxItems": 2
                  },
                  "lootTable": {
                    "type": "string",
                    "pattern": "^loot:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                  },
                  "encounter": {
                    "type": "string",
                    "pattern": "^encounter:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                  },
                  "companion": {
                    "type": "object",
                    "additionalProperties": false,
                    "description": "the creature may be called as a companion by a spell with \"summon\" (it follows and fights beside the caster)",
                    "properties": {
                      "ranged": {
                        "type": "boolean"
                      },
                      "scale": {
                        "enum": [
                          "creature",
                          "owner"
                        ]
                      },
                      "lifespan": {
                        "type": "number",
                        "minimum": 5,
                        "maximum": 3600
                      }
                    }
                  },
                  "lore": {
                    "type": "object",
                    "properties": {
                      "where": {
                        "type": "string",
                        "maxLength": 600
                      },
                      "why": {
                        "type": "string",
                        "maxLength": 600
                      }
                    },
                    "additionalProperties": false
                  },
                  "graph": {
                    "type": "object",
                    "description": "the Creature Workshop's drawing of its blocks (optional, kept as it is)"
                  },
                  "stats": {
                    "type": "object",
                    "additionalProperties": false,
                    "description": "exact numbers instead of the table by level, role and rank (all optional)",
                    "properties": {
                      "hp": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 5000000
                      },
                      "damage": {
                        "type": "array",
                        "minItems": 2,
                        "maxItems": 2,
                        "items": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 200000
                        },
                        "description": "[min, max] of a blow"
                      },
                      "ap": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 20000
                      },
                      "sp": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 20000
                      },
                      "armor": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 20000
                      },
                      "speed": {
                        "type": "number",
                        "minimum": 1,
                        "maximum": 14,
                        "description": "m/s (a player runs 7)"
                      }
                    }
                  },
                  "aggro": {
                    "type": "number",
                    "minimum": 2,
                    "maximum": 60,
                    "description": "m it notices from"
                  },
                  "leash": {
                    "type": "number",
                    "minimum": 8,
                    "maximum": 150,
                    "description": "m from home it follows"
                  },
                  "patrol": {
                    "type": "array",
                    "minItems": 2,
                    "maxItems": 8,
                    "items": {
                      "type": "array",
                      "minItems": 2,
                      "maxItems": 2,
                      "items": {
                        "type": "number",
                        "minimum": -80,
                        "maximum": 80
                      }
                    },
                    "description": "route of [dx, dy] metres from the spot the map puts it at, walked in a loop"
                  },
                  "neutral": {
                    "type": "boolean",
                    "description": "only fights back"
                  },
                  "skinnable": {
                    "type": "boolean"
                  },
                  "kit": {
                    "description": "a family id: all of that family's usual abilities at once",
                    "type": "string"
                  },
                  "questDrops": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 4,
                    "uniqueItems": true,
                    "items": {
                      "type": "string",
                      "pattern": "^item:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                    },
                    "description": "items dropped only to whoever has a quest that asks for them"
                  },
                  "mount": {
                    "type": "object",
                    "required": [
                      "kind"
                    ],
                    "additionalProperties": false,
                    "description": "a creature one rides: it stands on the players side; R next to it gets on",
                    "properties": {
                      "kind": {
                        "enum": [
                          "cavalo",
                          "raptor",
                          "saltador",
                          "grifo"
                        ]
                      }
                    }
                  },
                  "behavior": {
                    "type": "object",
                    "additionalProperties": false,
                    "description": "in an expedition: gentle, hearing, stages, a wandering boss, light; with active combat: its blows, feints, a boss breather",
                    "properties": {
                      "gentle": {
                        "type": "boolean"
                      },
                      "hearing": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 2
                      },
                      "light": {
                        "enum": [
                          "normal",
                          "drawn",
                          "shy",
                          "blind"
                        ]
                      },
                      "stage": {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                          "wake": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9
                          },
                          "patrol": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 3
                          },
                          "hunt": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9
                          }
                        }
                      },
                      "wander": {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                          "radius": {
                            "type": "number",
                            "minimum": 5,
                            "maximum": 80
                          },
                          "call": {
                            "type": "number",
                            "minimum": 10,
                            "maximum": 120
                          },
                          "speed": {
                            "type": "number",
                            "minimum": 0.2,
                            "maximum": 1.5
                          }
                        }
                      },
                      "moves": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 3,
                        "uniqueItems": true,
                        "items": {
                          "enum": [
                            "quick",
                            "heavy",
                            "lunge",
                            "sweep",
                            "throw"
                          ]
                        }
                      },
                      "feint": {
                        "type": "boolean"
                      },
                      "breather": {
                        "type": "boolean"
                      }
                    }
                  }
                },
                "additionalProperties": false
              }
            }
          },
          {
            "type": "object",
            "required": [
              "kind",
              "key",
              "name",
              "draft"
            ],
            "properties": {
              "kind": {
                "const": "map"
              },
              "key": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9_]{1,31}$"
              },
              "name": {
                "type": "string",
                "minLength": 3,
                "maxLength": 40
              },
              "draft": {
                "type": "object",
                "required": [
                  "v",
                  "name",
                  "view",
                  "screens"
                ],
                "properties": {
                  "v": {
                    "const": 1
                  },
                  "name": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 40
                  },
                  "view": {
                    "const": "side"
                  },
                  "combat": {
                    "type": "string",
                    "enum": [
                      "classic",
                      "active"
                    ]
                  },
                  "screen": {
                    "type": "array",
                    "items": {
                      "type": "integer"
                    },
                    "minItems": 2,
                    "maxItems": 2
                  },
                  "transition": {
                    "type": "string",
                    "enum": [
                      "flip",
                      "scroll"
                    ]
                  },
                  "bg": {
                    "type": "string",
                    "enum": [
                      "salao",
                      "caverna",
                      "floresta",
                      "torre",
                      "cemiterio",
                      "cripta",
                      "sino"
                    ]
                  },
                  "weather": {
                    "type": "string",
                    "enum": [
                      "mist",
                      "rain",
                      "storm"
                    ]
                  },
                  "camera": {
                    "type": "object",
                    "properties": {
                      "height": {
                        "type": "number",
                        "minimum": 7,
                        "maximum": 18
                      }
                    },
                    "additionalProperties": false
                  },
                  "legend": {
                    "type": "object",
                    "propertyNames": {
                      "pattern": "^[a-z]$"
                    },
                    "additionalProperties": {
                      "type": "object",
                      "properties": {
                        "creature": {
                          "type": "string",
                          "pattern": "^creature:[a-z][a-z0-9_]*@\\d+\\.\\d+\\.\\d+$"
                        },
                        "fly": {
                          "anyOf": [
                            {
                              "type": "boolean"
                            },
                            {
                              "type": "string",
                              "enum": [
                                "hover",
                                "wave",
                                "dive",
                                "orbit"
                              ]
                            }
                          ]
                        },
                        "move": {
                          "type": "string",
                          "enum": [
                            "walk",
                            "jump",
                            "still"
                          ]
                        },
                        "scale": {
                          "type": "number",
                          "minimum": 1,
                          "maximum": 6
                        },
                        "speed": {
                          "type": "number",
                          "minimum": 0.5,
                          "maximum": 12
                        },
                        "boss": {
                          "type": "boolean"
                        },
                        "tag": {
                          "type": "string"
                        },
                        "prop": {
                          "type": "string"
                        },
                        "checkpoint": {
                          "const": true
                        },
                        "breakable": {
                          "type": "string",
                          "enum": [
                            "candle",
                            "pot",
                            "crate"
                          ]
                        },
                        "drops": {
                          "type": "object",
                          "properties": {
                            "money": {
                              "type": "array",
                              "items": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "minItems": 2,
                              "maxItems": 2
                            },
                            "item": {
                              "type": "string",
                              "pattern": "^item:[a-z][a-z0-9_]*@\\d+\\.\\d+\\.\\d+$"
                            },
                            "chance": {
                              "type": "number",
                              "minimum": 0,
                              "maximum": 1
                            },
                            "heal": {
                              "type": "number",
                              "minimum": 0,
                              "maximum": 1
                            },
                            "sub": {
                              "type": "string",
                              "enum": [
                                "knife",
                                "axe",
                                "flask",
                                "cross",
                                "clock"
                              ]
                            },
                            "ammo": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 20
                            },
                            "boost": {
                              "type": "string",
                              "enum": [
                                "lash",
                                "double",
                                "triple",
                                "power"
                              ]
                            }
                          },
                          "additionalProperties": false
                        },
                        "crumble": {
                          "const": true
                        },
                        "block": {
                          "const": true
                        },
                        "crystal": {
                          "const": true
                        },
                        "talk": {
                          "type": "object",
                          "required": [
                            "name",
                            "lines"
                          ],
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 40
                            },
                            "look": {
                              "type": "string"
                            },
                            "lines": {
                              "type": "array",
                              "minItems": 1,
                              "maxItems": 12,
                              "items": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 200
                              }
                            }
                          },
                          "additionalProperties": false
                        },
                        "companion": {
                          "type": "object",
                          "required": [
                            "name",
                            "look"
                          ],
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 40
                            },
                            "look": {
                              "type": "string"
                            },
                            "role": {
                              "type": "string",
                              "enum": [
                                "fighter",
                                "healer"
                              ]
                            }
                          },
                          "additionalProperties": false
                        },
                        "grantMove": {
                          "type": "string",
                          "enum": [
                            "double_jump",
                            "wall_jump",
                            "dash",
                            "glide",
                            "fly",
                            "small",
                            "phase",
                            "wall_climb"
                          ]
                        },
                        "barrier": {
                          "type": "string",
                          "enum": [
                            "double_jump",
                            "wall_jump",
                            "dash",
                            "glide",
                            "fly",
                            "small",
                            "phase",
                            "wall_climb"
                          ]
                        },
                        "name": {
                          "type": "string",
                          "maxLength": 40
                        },
                        "look": {
                          "type": "string"
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "screens": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 64,
                    "items": {
                      "type": "object",
                      "required": [
                        "id",
                        "rows"
                      ],
                      "properties": {
                        "id": {
                          "type": "string",
                          "pattern": "^[a-z][a-z0-9_]{0,23}$"
                        },
                        "name": {
                          "type": "string"
                        },
                        "theme": {
                          "type": "string"
                        },
                        "room": {
                          "type": "string",
                          "pattern": "^[a-z][a-z0-9_]{0,23}$"
                        },
                        "at": {
                          "type": "array",
                          "items": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 63
                          },
                          "minItems": 2,
                          "maxItems": 2
                        },
                        "rows": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "kind": {
                          "type": "string",
                          "enum": [
                            "save",
                            "warp",
                            "boss"
                          ]
                        },
                        "intro": {
                          "type": "object",
                          "required": [
                            "name",
                            "lines"
                          ],
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 40
                            },
                            "look": {
                              "type": "string"
                            },
                            "lines": {
                              "type": "array",
                              "minItems": 1,
                              "maxItems": 12,
                              "items": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 200
                              }
                            }
                          },
                          "additionalProperties": false
                        },
                        "bg": {
                          "type": "string",
                          "enum": [
                            "salao",
                            "caverna",
                            "floresta",
                            "torre",
                            "cemiterio",
                            "cripta",
                            "sino"
                          ]
                        },
                        "weather": {
                          "type": "string",
                          "enum": [
                            "mist",
                            "rain",
                            "storm"
                          ]
                        },
                        "mechanics": {
                          "type": "object",
                          "properties": {
                            "gravity": {
                              "type": "number",
                              "minimum": 0.3,
                              "maximum": 2
                            },
                            "water": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "wind": {
                              "type": "number",
                              "minimum": -10,
                              "maximum": 10
                            },
                            "ice": {
                              "type": "boolean"
                            },
                            "lock": {
                              "const": "clear"
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "physics": {
                    "type": "object",
                    "properties": {
                      "run": {
                        "type": "number",
                        "minimum": 1,
                        "maximum": 12
                      },
                      "jumpH": {
                        "type": "number",
                        "minimum": 1,
                        "maximum": 6
                      },
                      "gravity": {
                        "type": "number",
                        "minimum": 10,
                        "maximum": 60
                      },
                      "maxFall": {
                        "type": "number",
                        "minimum": 6,
                        "maximum": 30
                      },
                      "airControl": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 1
                      },
                      "apexGravity": {
                        "type": "number",
                        "minimum": 0.2,
                        "maximum": 1
                      },
                      "fallGravity": {
                        "type": "number",
                        "minimum": 1,
                        "maximum": 3
                      },
                      "cornerCorrect": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 0.5
                      },
                      "ledgeSnap": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 0.5
                      },
                      "wallJumpReach": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 0.5
                      },
                      "inputBuffer": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 300
                      },
                      "stamina": {
                        "type": "number",
                        "minimum": 1,
                        "maximum": 10
                      },
                      "jumpCut": {
                        "type": "boolean"
                      },
                      "crouch": {
                        "type": "boolean"
                      },
                      "knockback": {
                        "enum": [
                          true,
                          false,
                          "arc"
                        ]
                      },
                      "ledge": {
                        "type": "boolean"
                      },
                      "pit": {
                        "type": "string",
                        "enum": [
                          "die",
                          "return"
                        ]
                      },
                      "stairs": {
                        "type": "string",
                        "enum": [
                          "free",
                          "classic"
                        ]
                      },
                      "backdash": {
                        "type": "boolean"
                      },
                      "dash8": {
                        "type": "boolean"
                      },
                      "instantRespawn": {
                        "type": "boolean"
                      },
                      "dashRecharge": {
                        "type": "string",
                        "enum": [
                          "ground",
                          "wall"
                        ]
                      }
                    },
                    "additionalProperties": false
                  },
                  "shot": {
                    "type": "object",
                    "required": [
                      "speed",
                      "every"
                    ],
                    "properties": {
                      "speed": {
                        "type": "number",
                        "minimum": 8,
                        "maximum": 40
                      },
                      "every": {
                        "type": "number",
                        "minimum": 50,
                        "maximum": 1000
                      },
                      "damage": {
                        "type": "number",
                        "minimum": 0.2,
                        "maximum": 5
                      },
                      "range": {
                        "type": "number",
                        "minimum": 4,
                        "maximum": 40
                      },
                      "hold": {
                        "type": "boolean"
                      },
                      "aim": {
                        "enum": [
                          4,
                          8
                        ]
                      },
                      "sweep": {
                        "type": "boolean"
                      },
                      "lethal": {
                        "type": "boolean"
                      }
                    },
                    "additionalProperties": false
                  },
                  "juice": {
                    "type": "object",
                    "properties": {
                      "hitstop": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 150
                      },
                      "shake": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 1
                      },
                      "cameraAhead": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 4
                      },
                      "deadZone": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 3
                      },
                      "lookUpDown": {
                        "type": "boolean"
                      },
                      "squash": {
                        "type": "boolean"
                      },
                      "dust": {
                        "type": "boolean"
                      },
                      "dashIndicator": {
                        "type": "boolean"
                      }
                    },
                    "additionalProperties": false
                  },
                  "melee": {
                    "type": "object",
                    "required": [
                      "reach",
                      "windup",
                      "active",
                      "recover"
                    ],
                    "properties": {
                      "reach": {
                        "type": "number",
                        "minimum": 1,
                        "maximum": 5
                      },
                      "windup": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 600
                      },
                      "active": {
                        "type": "number",
                        "minimum": 40,
                        "maximum": 300
                      },
                      "recover": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 600
                      },
                      "damage": {
                        "type": "number",
                        "minimum": 0.2,
                        "maximum": 5
                      },
                      "reaches": {
                        "type": "array",
                        "maxItems": 2,
                        "items": {
                          "type": "number",
                          "minimum": 1,
                          "maximum": 6
                        }
                      }
                    },
                    "additionalProperties": false
                  },
                  "sub": {
                    "type": "object",
                    "properties": {
                      "start": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 99
                      },
                      "max": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 99
                      },
                      "weapon": {
                        "type": "string",
                        "enum": [
                          "knife",
                          "axe",
                          "flask",
                          "cross",
                          "clock"
                        ]
                      },
                      "carry": {
                        "type": "boolean"
                      },
                      "name": {
                        "type": "array",
                        "minItems": 2,
                        "maxItems": 2,
                        "items": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 24
                        },
                        "description": "[Portuguese, English] name of the resource"
                      }
                    },
                    "additionalProperties": false
                  },
                  "rules": {
                    "type": "object",
                    "required": [
                      "rules"
                    ],
                    "properties": {
                      "vars": {
                        "type": "object",
                        "maxProperties": 40,
                        "propertyNames": {
                          "pattern": "^[a-z][a-z0-9_]{0,23}$"
                        },
                        "additionalProperties": {
                          "type": [
                            "number",
                            "string",
                            "boolean"
                          ]
                        }
                      },
                      "rules": {
                        "type": "array",
                        "maxItems": 60,
                        "items": {
                          "type": "object",
                          "required": [
                            "id",
                            "on",
                            "do"
                          ],
                          "properties": {
                            "id": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_]{0,23}$"
                            },
                            "once": {
                              "type": "boolean"
                            },
                            "on": {
                              "type": "object",
                              "required": [
                                "kind"
                              ],
                              "properties": {
                                "kind": {
                                  "enum": [
                                    "start",
                                    "enterRoom",
                                    "enterRegion",
                                    "unitDies",
                                    "groupCleared",
                                    "timer",
                                    "every",
                                    "playerDies",
                                    "itemTaken",
                                    "enterScreen",
                                    "screenCleared",
                                    "talk",
                                    "teamOut",
                                    "enterFloor",
                                    "healthBelow",
                                    "extracted",
                                    "ballInGoal",
                                    "matchOver",
                                    "structureDown",
                                    "waveSpawn",
                                    "waveStart",
                                    "waveCleared",
                                    "leak",
                                    "towerBuilt",
                                    "boardTurn",
                                    "landed",
                                    "boardEvent",
                                    "trophyBought",
                                    "lastTurns",
                                    "boardOver",
                                    "itemUsed",
                                    "trialStart",
                                    "trialOver",
                                    "cycleChange",
                                    "rogue",
                                    "defenseWon",
                                    "defenseLost",
                                    "send",
                                    "towerDown",
                                    "flagTaken",
                                    "flagDropped",
                                    "flagReturned",
                                    "flagCaptured",
                                    "pointCaptured",
                                    "roundStart",
                                    "roundOver",
                                    "battleOver",
                                    "arenaStart",
                                    "arenaOver",
                                    "cinemaOver",
                                    "checkpoint",
                                    "lap",
                                    "raceFinished"
                                  ]
                                },
                                "arg": {
                                  "type": [
                                    "string",
                                    "number"
                                  ]
                                },
                                "pct": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 99,
                                  "description": "healthBelow: the % of life"
                                }
                              },
                              "additionalProperties": false
                            },
                            "if": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "required": [
                                  "kind"
                                ],
                                "properties": {
                                  "kind": {
                                    "enum": [
                                      "var",
                                      "alive",
                                      "hasItem",
                                      "elapsed",
                                      "teamAlive",
                                      "lifeLead",
                                      "hasMoney",
                                      "score",
                                      "onScreen",
                                      "teamScore",
                                      "lives",
                                      "defenseWave",
                                      "turnsLeft",
                                      "boardCoins",
                                      "trophies",
                                      "onSpace",
                                      "arena"
                                    ]
                                  },
                                  "op": {
                                    "enum": [
                                      "=",
                                      "!=",
                                      ">",
                                      ">=",
                                      "<",
                                      "<="
                                    ]
                                  }
                                }
                              }
                            },
                            "do": {
                              "type": "array",
                              "minItems": 1,
                              "maxItems": 40,
                              "items": {
                                "type": "object",
                                "required": [
                                  "kind"
                                ],
                                "properties": {
                                  "kind": {
                                    "enum": [
                                      "setVar",
                                      "showText",
                                      "startTimer",
                                      "stopTimer",
                                      "spawnGroup",
                                      "openGate",
                                      "closeGate",
                                      "giveItem",
                                      "takeItem",
                                      "goToRoom",
                                      "endSession",
                                      "offerChoice",
                                      "if",
                                      "random",
                                      "setObjective",
                                      "completeObjective",
                                      "takeAllItems",
                                      "lockScreen",
                                      "unlockScreen",
                                      "setMechanic",
                                      "spawnAt",
                                      "grantMove",
                                      "dialog",
                                      "giveXp",
                                      "giveMoney",
                                      "assignTeams",
                                      "restorePlayers",
                                      "setRespawn",
                                      "newRun",
                                      "castOnPlayers",
                                      "takeMoney",
                                      "station",
                                      "setStage",
                                      "fog",
                                      "loudNoise",
                                      "showExit",
                                      "hideExit",
                                      "awardPoint",
                                      "resetKickoff",
                                      "eventResult",
                                      "showPodium",
                                      "spawnWave",
                                      "grantTeamBuff",
                                      "giveGold",
                                      "addLives",
                                      "callWave",
                                      "giveCoins",
                                      "giveBoardItem",
                                      "boardMove",
                                      "boardWarp",
                                      "setGate",
                                      "moveAltar",
                                      "setSpaceKind",
                                      "setWeather",
                                      "addTeamScore",
                                      "playCinematic",
                                      "grantAchievement",
                                      "addStat",
                                      "startEvent"
                                    ]
                                  },
                                  "if": {
                                    "type": "array",
                                    "items": {
                                      "type": "object",
                                      "required": [
                                        "kind"
                                      ],
                                      "properties": {
                                        "kind": {
                                          "enum": [
                                            "var",
                                            "alive",
                                            "hasItem",
                                            "elapsed",
                                            "teamAlive",
                                            "lifeLead",
                                            "hasMoney",
                                            "score",
                                            "onScreen",
                                            "teamScore",
                                            "lives",
                                            "defenseWave",
                                            "turnsLeft",
                                            "boardCoins",
                                            "trophies",
                                            "onSpace",
                                            "arena"
                                          ]
                                        },
                                        "op": {
                                          "enum": [
                                            "=",
                                            "!=",
                                            ">",
                                            ">=",
                                            "<",
                                            "<="
                                          ]
                                        }
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          },
                          "additionalProperties": false
                        }
                      }
                    },
                    "additionalProperties": false
                  }
                },
                "additionalProperties": false
              }
            }
          },
          {
            "type": "object",
            "required": [
              "kind",
              "key",
              "name",
              "draft"
            ],
            "properties": {
              "kind": {
                "const": "map"
              },
              "key": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9_]{1,31}$"
              },
              "name": {
                "type": "string",
                "minLength": 3,
                "maxLength": 40
              },
              "draft": {
                "type": "object",
                "required": [
                  "v",
                  "name",
                  "start",
                  "rooms"
                ],
                "properties": {
                  "v": {
                    "const": 1
                  },
                  "name": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 32
                  },
                  "start": {
                    "type": "string"
                  },
                  "rooms": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 24,
                    "items": {
                      "type": "object",
                      "required": [
                        "id",
                        "name",
                        "w",
                        "h",
                        "cells",
                        "props",
                        "doors",
                        "spawns",
                        "regions"
                      ],
                      "properties": {
                        "id": {
                          "type": "string",
                          "pattern": "^[a-z][a-z0-9_]{0,15}$"
                        },
                        "name": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 32
                        },
                        "w": {
                          "type": "integer",
                          "minimum": 8,
                          "maximum": 400
                        },
                        "h": {
                          "type": "integer",
                          "minimum": 8,
                          "maximum": 320
                        },
                        "cells": {
                          "type": "string",
                          "pattern": "^[#.~\",=:\\^/*Tgkwoav0-9]+$",
                          "description": "w*h characters, row by row from the top-left; , = : ^ / * T g k w o a v only in an open room. Or in runs (a character, then its count from 2: \".120#3\" = 120 floor cells then 3 walls): far shorter for a zone"
                        },
                        "open": {
                          "type": "boolean",
                          "description": "an outdoor room, a whole zone: up to 400 x 320 cells (800 x 640 m), ground cells, a climate in look, the objects of openProps"
                        },
                        "props": {
                          "type": "array",
                          "maxItems": 600,
                          "items": {
                            "type": "object",
                            "required": [
                              "kind",
                              "x",
                              "y"
                            ],
                            "properties": {
                              "kind": {
                                "enum": [
                                  "torch",
                                  "crate",
                                  "crates",
                                  "barrel",
                                  "barrels",
                                  "sack",
                                  "table",
                                  "support",
                                  "rubble",
                                  "cart",
                                  "minecart",
                                  "bancada_lab",
                                  "microscopio",
                                  "armario",
                                  "quadro_negro",
                                  "carteira",
                                  "lixeira_comum",
                                  "lixeira_perfuro",
                                  "lixeira_quimico",
                                  "lixeira_biologico",
                                  "balcao_loja",
                                  "prateleira",
                                  "forge",
                                  "anvil",
                                  "campfire",
                                  "nicho_tumulo",
                                  "ossada_1",
                                  "ossada_2",
                                  "ossada_3",
                                  "porta_ferro",
                                  "grade",
                                  "alavanca",
                                  "escada_descida",
                                  "tocha_parede",
                                  "bau_cripta",
                                  "tree",
                                  "pine",
                                  "stump",
                                  "boulder",
                                  "log",
                                  "house",
                                  "shack",
                                  "barn",
                                  "farmhouse",
                                  "chapel",
                                  "tower",
                                  "windmill",
                                  "smithy",
                                  "well",
                                  "signpost",
                                  "lamppost",
                                  "haystack",
                                  "scarecrow",
                                  "woodpile",
                                  "wagon",
                                  "flag",
                                  "flag_pacto",
                                  "flag_legiao",
                                  "flag_circulo",
                                  "tent",
                                  "inn",
                                  "abbey",
                                  "ruin",
                                  "mine",
                                  "gravestone",
                                  "boat",
                                  "dock",
                                  "bridge"
                                ]
                              },
                              "x": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "y": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "w": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 40,
                                "description": "open room only, for a prop with a footprint (openProps footprint): its own width in cells (a bridge across a river); give w and h together"
                              },
                              "h": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 40
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "doors": {
                          "type": "array",
                          "maxItems": 32,
                          "items": {
                            "type": "object",
                            "required": [
                              "x",
                              "y",
                              "to"
                            ],
                            "properties": {
                              "x": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "y": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "to": {
                                "type": "string",
                                "description": "a room id of this map, or \"map_key/room_id\": a room of another map of the project (a border; that room needs the door back)"
                              },
                              "label": {
                                "type": "string",
                                "maxLength": 24
                              },
                              "stairs": {
                                "enum": [
                                  "up",
                                  "down"
                                ]
                              },
                              "w": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 12,
                                "description": "a strip door: this many cells wide, centred on x, y (a border across a road)"
                              },
                              "h": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 12
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "spawns": {
                          "type": "array",
                          "maxItems": 600,
                          "items": {
                            "type": "object",
                            "required": [
                              "x",
                              "y",
                              "ref"
                            ],
                            "properties": {
                              "x": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "y": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "ref": {
                                "anyOf": [
                                  {
                                    "const": "player"
                                  },
                                  {
                                    "const": "team"
                                  },
                                  {
                                    "type": "string",
                                    "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                  }
                                ]
                              },
                              "respawn": {
                                "enum": [
                                  "normal",
                                  "never"
                                ]
                              },
                              "tag": {
                                "type": "string",
                                "pattern": "^[a-z][a-z0-9_]{0,23}$"
                              },
                              "rare": {
                                "type": "object",
                                "additionalProperties": false,
                                "description": "a rare creature: not always there; the spots it may stand at, how long it stays away, what it says in a bubble",
                                "properties": {
                                  "spots": {
                                    "type": "array",
                                    "minItems": 1,
                                    "maxItems": 6,
                                    "items": {
                                      "type": "array",
                                      "minItems": 2,
                                      "maxItems": 2,
                                      "items": {
                                        "type": "integer",
                                        "minimum": 0
                                      }
                                    }
                                  },
                                  "respawn": {
                                    "type": "array",
                                    "minItems": 2,
                                    "maxItems": 2,
                                    "items": {
                                      "type": "number",
                                      "minimum": 1,
                                      "maximum": 240
                                    }
                                  },
                                  "upChance": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 1
                                  },
                                  "placeholder": {
                                    "type": "string",
                                    "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                  },
                                  "lines": {
                                    "type": "object",
                                    "additionalProperties": false,
                                    "properties": {
                                      "aggro": {
                                        "oneOf": [
                                          {
                                            "type": "string",
                                            "minLength": 1,
                                            "maxLength": 90
                                          },
                                          {
                                            "type": "array",
                                            "minItems": 2,
                                            "maxItems": 2,
                                            "items": {
                                              "type": "string",
                                              "minLength": 1,
                                              "maxLength": 90
                                            }
                                          }
                                        ]
                                      },
                                      "hurt": {
                                        "oneOf": [
                                          {
                                            "type": "string",
                                            "minLength": 1,
                                            "maxLength": 90
                                          },
                                          {
                                            "type": "array",
                                            "minItems": 2,
                                            "maxItems": 2,
                                            "items": {
                                              "type": "string",
                                              "minLength": 1,
                                              "maxLength": 90
                                            }
                                          }
                                        ]
                                      },
                                      "move": {
                                        "oneOf": [
                                          {
                                            "type": "string",
                                            "minLength": 1,
                                            "maxLength": 90
                                          },
                                          {
                                            "type": "array",
                                            "minItems": 2,
                                            "maxItems": 2,
                                            "items": {
                                              "type": "string",
                                              "minLength": 1,
                                              "maxLength": 90
                                            }
                                          }
                                        ]
                                      },
                                      "death": {
                                        "oneOf": [
                                          {
                                            "type": "string",
                                            "minLength": 1,
                                            "maxLength": 90
                                          },
                                          {
                                            "type": "array",
                                            "minItems": 2,
                                            "maxItems": 2,
                                            "items": {
                                              "type": "string",
                                              "minLength": 1,
                                              "maxLength": 90
                                            }
                                          }
                                        ]
                                      }
                                    }
                                  },
                                  "sig": {
                                    "type": "string",
                                    "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                  },
                                  "always": {
                                    "type": "boolean"
                                  }
                                }
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "regions": {
                          "type": "array",
                          "maxItems": 96,
                          "items": {
                            "type": "object",
                            "required": [
                              "name",
                              "x",
                              "y",
                              "w",
                              "h"
                            ],
                            "properties": {
                              "name": {
                                "type": "string",
                                "pattern": "^[^/]{1,24}$"
                              },
                              "x": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "y": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "w": {
                                "type": "integer",
                                "minimum": 1
                              },
                              "h": {
                                "type": "integer",
                                "minimum": 1
                              },
                              "look": {
                                "enum": [
                                  "campo",
                                  "bosque",
                                  "seco",
                                  "savana",
                                  "terra_vermelha",
                                  "charneca",
                                  "bruma"
                                ],
                                "description": "open room only: a climate of its own over this region (the ground takes the palette of that climate)"
                              },
                              "surface": {
                                "type": "object",
                                "required": [
                                  "grip",
                                  "power"
                                ],
                                "additionalProperties": false,
                                "description": "the ground for vehicles (mud, ice): 1 is the usual road",
                                "properties": {
                                  "grip": {
                                    "type": "number",
                                    "minimum": 0.2,
                                    "maximum": 2
                                  },
                                  "power": {
                                    "type": "number",
                                    "minimum": 0.2,
                                    "maximum": 2
                                  }
                                }
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "parked": {
                          "type": "array",
                          "maxItems": 8,
                          "description": "vehicles and mounts standing for the player to take (R)",
                          "items": {
                            "type": "object",
                            "required": [
                              "x",
                              "y",
                              "kind"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "x": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "y": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "kind": {
                                "enum": [
                                  "carro",
                                  "moto",
                                  "aviao",
                                  "cavalo",
                                  "raptor",
                                  "saltador",
                                  "grifo",
                                  "kart"
                                ]
                              }
                            }
                          }
                        },
                        "gates": {
                          "type": "array",
                          "maxItems": 6,
                          "items": {
                            "type": "object",
                            "required": [
                              "id",
                              "x",
                              "y",
                              "w",
                              "h"
                            ],
                            "properties": {
                              "id": {
                                "type": "string",
                                "pattern": "^[a-z][a-z0-9_]{0,23}$"
                              },
                              "x": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "y": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "w": {
                                "type": "integer",
                                "minimum": 1
                              },
                              "h": {
                                "type": "integer",
                                "minimum": 1
                              },
                              "locked": {
                                "type": "boolean"
                              },
                              "door": {
                                "enum": [
                                  "madeira",
                                  "ferro"
                                ]
                              },
                              "key": {
                                "type": "string",
                                "pattern": "^item:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                              },
                              "open": {
                                "type": "boolean"
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "chests": {
                          "type": "array",
                          "maxItems": 96,
                          "items": {
                            "type": "object",
                            "required": [
                              "x",
                              "y"
                            ],
                            "properties": {
                              "x": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "y": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "drops": {
                                "type": "array",
                                "maxItems": 8,
                                "items": {
                                  "type": "object",
                                  "required": [
                                    "item",
                                    "chance"
                                  ],
                                  "properties": {
                                    "item": {
                                      "type": "string",
                                      "pattern": "^item:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                    },
                                    "chance": {
                                      "type": "number",
                                      "exclusiveMinimum": 0,
                                      "maximum": 1
                                    },
                                    "count": {
                                      "type": "array",
                                      "items": {
                                        "type": "integer",
                                        "minimum": 1,
                                        "maximum": 99
                                      },
                                      "minItems": 2,
                                      "maxItems": 2
                                    }
                                  },
                                  "additionalProperties": false
                                },
                                "minItems": 1
                              },
                              "money": {
                                "type": "array",
                                "items": {
                                  "type": "integer",
                                  "minimum": 0
                                },
                                "minItems": 2,
                                "maxItems": 2
                              },
                              "table": {
                                "type": "string",
                                "pattern": "^loot:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                              },
                              "loud": {
                                "type": "boolean"
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "gathers": {
                          "type": "array",
                          "maxItems": 160,
                          "description": "spots that give what a node of a profession gives",
                          "items": {
                            "type": "object",
                            "required": [
                              "x",
                              "y",
                              "profession",
                              "node"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "x": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "y": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "profession": {
                                "type": "string",
                                "pattern": "^profession:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                              },
                              "node": {
                                "type": "string",
                                "pattern": "^[a-z][a-z0-9_]{0,23}$"
                              }
                            }
                          }
                        },
                        "lines": {
                          "type": "array",
                          "maxItems": 96,
                          "description": "open room only: fences and walls as lines (a thin collision along a path, not a cell of rock): a fence is low (the player hops it, creatures walk around), a wall is shut; the corners are in cells, decimals allowed (4.5 is the middle of cell 4); leave a gap in a fence or a wall for a door",
                          "items": {
                            "type": "object",
                            "required": [
                              "kind",
                              "pts"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "kind": {
                                "enum": [
                                  "fence",
                                  "wall"
                                ]
                              },
                              "pts": {
                                "type": "array",
                                "minItems": 2,
                                "maxItems": 48,
                                "items": {
                                  "type": "array",
                                  "minItems": 2,
                                  "maxItems": 2,
                                  "items": {
                                    "type": "number",
                                    "minimum": 0
                                  }
                                }
                              }
                            }
                          }
                        },
                        "graveyards": {
                          "type": "array",
                          "maxItems": 12,
                          "description": "where the dead come back (the nearest one to the fall); on a floor cell",
                          "items": {
                            "type": "object",
                            "required": [
                              "x",
                              "y"
                            ],
                            "properties": {
                              "x": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "y": {
                                "type": "integer",
                                "minimum": 0
                              }
                            },
                            "additionalProperties": false
                          }
                        },
                        "hour": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 23.99,
                          "description": "the hour of the day in this room, fixed (0 midnight, 12 noon, 18 dusk): a cave always at dusk; left out: the world clock"
                        },
                        "fresh": {
                          "type": "boolean"
                        },
                        "dark": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 1
                        },
                        "look": {
                          "enum": [
                            "refugio",
                            "ruinas",
                            "cripta",
                            "catacumbas",
                            "gruta",
                            "forja",
                            "masmorra",
                            "ossuario",
                            "laboratorio",
                            "sala_aula",
                            "escritorio",
                            "loja",
                            "campo",
                            "bosque",
                            "seco",
                            "savana",
                            "terra_vermelha",
                            "charneca",
                            "bruma"
                          ]
                        },
                        "stash": {
                          "type": "object",
                          "required": [
                            "x",
                            "y"
                          ],
                          "properties": {
                            "x": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "y": {
                              "type": "integer",
                              "minimum": 0
                            }
                          },
                          "additionalProperties": false
                        },
                        "trial": {
                          "type": "object",
                          "required": [
                            "mold",
                            "time",
                            "starts"
                          ],
                          "additionalProperties": false,
                          "description": "a short match in this room: a board's trial between rounds, or played on its own",
                          "properties": {
                            "mold": {
                              "enum": [
                                "collect",
                                "race",
                                "survive",
                                "push",
                                "reflex",
                                "aim",
                                "memory",
                                "rhythm",
                                "doors",
                                "plates"
                              ],
                              "description": "collect: pick up the most; race: checkpoints in order; survive: off the warned cells; push: shove the others out of the shrinking ring; reflex: press on the signal, never before; aim: Space shoots the drifting targets in reach; memory: repeat the pads' sequence; rhythm: Space on the beat; doors: stand at a door, each hides a value; plates: a side stands on both lit plates"
                            },
                            "about": {
                              "type": "string",
                              "maxLength": 200
                            },
                            "time": {
                              "type": "number",
                              "minimum": 5,
                              "maximum": 180
                            },
                            "ready": {
                              "type": "number",
                              "minimum": 0,
                              "maximum": 10
                            },
                            "starts": {
                              "type": "array",
                              "minItems": 1,
                              "maxItems": 4,
                              "items": {
                                "type": "object",
                                "required": [
                                  "x",
                                  "y"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "x": {
                                    "type": "integer",
                                    "minimum": 0
                                  },
                                  "y": {
                                    "type": "integer",
                                    "minimum": 0
                                  }
                                }
                              }
                            },
                            "pickups": {
                              "type": "object",
                              "required": [
                                "every",
                                "max"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "every": {
                                  "type": "number",
                                  "minimum": 0.2,
                                  "maximum": 10
                                },
                                "max": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 60
                                },
                                "value": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 9
                                },
                                "look": {
                                  "enum": [
                                    "coin",
                                    "gem",
                                    "fruit"
                                  ]
                                }
                              }
                            },
                            "checkpoints": {
                              "type": "array",
                              "minItems": 1,
                              "maxItems": 16,
                              "items": {
                                "type": "object",
                                "required": [
                                  "x",
                                  "y"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "x": {
                                    "type": "integer",
                                    "minimum": 0
                                  },
                                  "y": {
                                    "type": "integer",
                                    "minimum": 0
                                  }
                                }
                              }
                            },
                            "hazards": {
                              "type": "object",
                              "required": [
                                "every",
                                "count",
                                "warn"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "every": {
                                  "type": "number",
                                  "minimum": 0.2,
                                  "maximum": 10
                                },
                                "count": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 30
                                },
                                "warn": {
                                  "type": "number",
                                  "minimum": 0.3,
                                  "maximum": 5
                                },
                                "grow": {
                                  "type": "number",
                                  "minimum": 0,
                                  "maximum": 5
                                }
                              }
                            },
                            "ring": {
                              "type": "object",
                              "required": [
                                "x",
                                "y",
                                "from",
                                "to"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "x": {
                                  "type": "integer",
                                  "minimum": 0
                                },
                                "y": {
                                  "type": "integer",
                                  "minimum": 0
                                },
                                "from": {
                                  "type": "number",
                                  "minimum": 1,
                                  "maximum": 40
                                },
                                "to": {
                                  "type": "number",
                                  "minimum": 1,
                                  "maximum": 40
                                }
                              }
                            },
                            "reflex": {
                              "type": "object",
                              "required": [
                                "rounds",
                                "wait"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "rounds": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 9
                                },
                                "wait": {
                                  "type": "array",
                                  "minItems": 2,
                                  "maxItems": 2,
                                  "items": {
                                    "type": "number",
                                    "minimum": 0.5,
                                    "maximum": 10
                                  }
                                },
                                "fakes": {
                                  "type": "boolean"
                                }
                              }
                            },
                            "targets": {
                              "type": "object",
                              "required": [
                                "every",
                                "max",
                                "speed"
                              ],
                              "additionalProperties": false,
                              "description": "aim",
                              "properties": {
                                "every": {
                                  "type": "number",
                                  "minimum": 0.2,
                                  "maximum": 10
                                },
                                "max": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 20
                                },
                                "speed": {
                                  "type": "number",
                                  "minimum": 0,
                                  "maximum": 8
                                },
                                "value": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 9
                                }
                              }
                            },
                            "pads": {
                              "type": "object",
                              "required": [
                                "cells",
                                "rounds"
                              ],
                              "additionalProperties": false,
                              "description": "memory",
                              "properties": {
                                "cells": {
                                  "type": "array",
                                  "minItems": 3,
                                  "maxItems": 9,
                                  "items": {
                                    "type": "object",
                                    "required": [
                                      "x",
                                      "y"
                                    ],
                                    "additionalProperties": false,
                                    "properties": {
                                      "x": {
                                        "type": "integer",
                                        "minimum": 0
                                      },
                                      "y": {
                                        "type": "integer",
                                        "minimum": 0
                                      }
                                    }
                                  }
                                },
                                "rounds": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 9
                                },
                                "first": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 6
                                }
                              }
                            },
                            "beat": {
                              "type": "object",
                              "required": [
                                "every",
                                "window",
                                "count"
                              ],
                              "additionalProperties": false,
                              "description": "rhythm (ms)",
                              "properties": {
                                "every": {
                                  "type": "integer",
                                  "minimum": 350,
                                  "maximum": 2000
                                },
                                "window": {
                                  "type": "integer",
                                  "minimum": 60,
                                  "maximum": 400
                                },
                                "count": {
                                  "type": "integer",
                                  "minimum": 4,
                                  "maximum": 60
                                }
                              }
                            },
                            "doors": {
                              "type": "object",
                              "required": [
                                "cells",
                                "values",
                                "rounds",
                                "choose"
                              ],
                              "additionalProperties": false,
                              "description": "doors: one value per door",
                              "properties": {
                                "cells": {
                                  "type": "array",
                                  "minItems": 2,
                                  "maxItems": 5,
                                  "items": {
                                    "type": "object",
                                    "required": [
                                      "x",
                                      "y"
                                    ],
                                    "additionalProperties": false,
                                    "properties": {
                                      "x": {
                                        "type": "integer",
                                        "minimum": 0
                                      },
                                      "y": {
                                        "type": "integer",
                                        "minimum": 0
                                      }
                                    }
                                  }
                                },
                                "values": {
                                  "type": "array",
                                  "items": {
                                    "type": "integer",
                                    "minimum": -20,
                                    "maximum": 50
                                  }
                                },
                                "rounds": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 9
                                },
                                "choose": {
                                  "type": "number",
                                  "minimum": 2,
                                  "maximum": 15
                                }
                              }
                            },
                            "plates": {
                              "type": "object",
                              "required": [
                                "cells",
                                "every"
                              ],
                              "additionalProperties": false,
                              "description": "plates",
                              "properties": {
                                "cells": {
                                  "type": "array",
                                  "minItems": 4,
                                  "maxItems": 12,
                                  "items": {
                                    "type": "object",
                                    "required": [
                                      "x",
                                      "y"
                                    ],
                                    "additionalProperties": false,
                                    "properties": {
                                      "x": {
                                        "type": "integer",
                                        "minimum": 0
                                      },
                                      "y": {
                                        "type": "integer",
                                        "minimum": 0
                                      }
                                    }
                                  }
                                },
                                "every": {
                                  "type": "number",
                                  "minimum": 0.2,
                                  "maximum": 10
                                }
                              }
                            }
                          }
                        },
                        "court": {
                          "type": "object",
                          "required": [
                            "kind"
                          ],
                          "additionalProperties": false,
                          "description": "a sport's court in the room (a match of 3 on 3 starts there)",
                          "properties": {
                            "kind": {
                              "enum": [
                                "basquete_rua",
                                "basquete"
                              ]
                            },
                            "x": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "y": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "time": {
                              "type": "integer",
                              "minimum": 0,
                              "maximum": 1800
                            },
                            "target": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 99
                            },
                            "byTwo": {
                              "type": "boolean"
                            },
                            "pts": {
                              "type": "array",
                              "minItems": 2,
                              "maxItems": 2,
                              "items": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 10
                              }
                            },
                            "goals": {
                              "enum": [
                                1,
                                2
                              ]
                            },
                            "skill": {
                              "type": "object",
                              "additionalProperties": false,
                              "properties": {
                                "home": {
                                  "enum": [
                                    "facil",
                                    "medio",
                                    "dificil",
                                    "craque"
                                  ]
                                },
                                "away": {
                                  "enum": [
                                    "facil",
                                    "medio",
                                    "dificil",
                                    "craque"
                                  ]
                                }
                              }
                            },
                            "side": {
                              "enum": [
                                "home",
                                "away"
                              ],
                              "description": "the player's team (home by default)"
                            }
                          }
                        },
                        "exits": {
                          "type": "array",
                          "maxItems": 6,
                          "description": "where one gets out of an expedition: stand in the rectangle for its seconds",
                          "items": {
                            "type": "object",
                            "required": [
                              "id",
                              "x",
                              "y",
                              "w",
                              "h",
                              "seconds"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "id": {
                                "type": "string",
                                "pattern": "^[a-z][a-z0-9_]{0,23}$"
                              },
                              "name": {
                                "type": "string",
                                "maxLength": 24
                              },
                              "x": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "y": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "w": {
                                "type": "integer",
                                "minimum": 1
                              },
                              "h": {
                                "type": "integer",
                                "minimum": 1
                              },
                              "seconds": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 30
                              },
                              "hidden": {
                                "type": "boolean"
                              },
                              "cost": {
                                "type": "string",
                                "pattern": "^item:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                              },
                              "team": {
                                "type": "string",
                                "pattern": "^[a-z][a-z0-9_]{0,23}$"
                              },
                              "from": {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 9
                              },
                              "until": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 9
                              },
                              "to": {
                                "type": "string"
                              }
                            }
                          }
                        },
                        "pool": {
                          "type": "string",
                          "pattern": "^[a-z][a-z0-9_]{0,23}$"
                        },
                        "entry": {
                          "type": "object",
                          "required": [
                            "x",
                            "y"
                          ],
                          "properties": {
                            "x": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "y": {
                              "type": "integer",
                              "minimum": 0
                            }
                          },
                          "additionalProperties": false
                        },
                        "npcs": {
                          "type": "array",
                          "maxItems": 96,
                          "items": {
                            "type": "object",
                            "required": [
                              "id",
                              "name",
                              "x",
                              "y"
                            ],
                            "properties": {
                              "id": {
                                "type": "string",
                                "pattern": "^[a-z][a-z0-9_]{0,23}$"
                              },
                              "name": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 24
                              },
                              "x": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "y": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "look": {
                                "type": "string",
                                "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                              },
                              "shop": {
                                "type": "string",
                                "pattern": "^shop:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                              },
                              "teaches": {
                                "type": "string",
                                "pattern": "^profession:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                              },
                              "trains": {
                                "enum": [
                                  "class"
                                ],
                                "description": "a class master: a right click opens the class window, where the specialization and the talents are chosen and changed"
                              },
                              "greeting": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 240
                              },
                              "title": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 48
                              }
                            },
                            "additionalProperties": false
                          }
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "combat": {
                    "enum": [
                      "classic",
                      "active"
                    ]
                  },
                  "activeCombat": {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "stamina": {
                        "type": "number",
                        "minimum": 40,
                        "maximum": 300
                      },
                      "regen": {
                        "type": "number",
                        "minimum": 5,
                        "maximum": 120
                      },
                      "regenDelay": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 3000
                      },
                      "dodgeCost": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 100
                      },
                      "dodgeMs": {
                        "type": "number",
                        "minimum": 150,
                        "maximum": 800
                      },
                      "dodgeDist": {
                        "type": "number",
                        "minimum": 1,
                        "maximum": 8
                      },
                      "parryCost": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 100
                      },
                      "parryMs": {
                        "type": "number",
                        "minimum": 100,
                        "maximum": 800
                      },
                      "windupMs": {
                        "type": "number",
                        "minimum": 300,
                        "maximum": 2000
                      },
                      "openMs": {
                        "type": "number",
                        "minimum": 300,
                        "maximum": 4000
                      },
                      "pvpDmg": {
                        "type": "number",
                        "minimum": 0.5,
                        "maximum": 5
                      },
                      "lightCost": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 60
                      },
                      "heavyCost": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 100
                      },
                      "heavyHoldMs": {
                        "type": "number",
                        "minimum": 150,
                        "maximum": 2000
                      },
                      "heavyMul": {
                        "type": "number",
                        "minimum": 1,
                        "maximum": 5
                      },
                      "chargeMove": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 1
                      },
                      "strikeMove": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 1
                      },
                      "postureMax": {
                        "type": "number",
                        "minimum": 20,
                        "maximum": 500
                      },
                      "staggerMs": {
                        "type": "number",
                        "minimum": 300,
                        "maximum": 6000
                      },
                      "perfectMs": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 400
                      }
                    }
                  },
                  "pvpDamage": {
                    "type": "number",
                    "minimum": 0.5,
                    "maximum": 5
                  },
                  "manualAttack": {
                    "type": "boolean"
                  },
                  "controls": {
                    "enum": [
                      "classic",
                      "action"
                    ]
                  },
                  "wounds": {
                    "type": "object",
                    "minProperties": 1,
                    "additionalProperties": false,
                    "properties": {
                      "bleed": {
                        "anyOf": [
                          {
                            "const": true
                          },
                          {
                            "type": "object",
                            "additionalProperties": false,
                            "properties": {
                              "chance": {
                                "type": "number",
                                "minimum": 0,
                                "maximum": 1
                              },
                              "perSecond": {
                                "type": "number",
                                "minimum": 0.002,
                                "maximum": 0.05
                              },
                              "seconds": {
                                "type": "number",
                                "minimum": 5,
                                "maximum": 300
                              }
                            }
                          }
                        ]
                      },
                      "limp": {
                        "anyOf": [
                          {
                            "const": true
                          },
                          {
                            "type": "object",
                            "additionalProperties": false,
                            "properties": {
                              "hit": {
                                "type": "number",
                                "minimum": 0.05,
                                "maximum": 0.9
                              },
                              "slow": {
                                "type": "number",
                                "minimum": 0.1,
                                "maximum": 0.8
                              },
                              "seconds": {
                                "type": "number",
                                "minimum": 5,
                                "maximum": 600
                              }
                            }
                          }
                        ]
                      },
                      "burn": {
                        "anyOf": [
                          {
                            "const": true
                          },
                          {
                            "type": "object",
                            "additionalProperties": false,
                            "properties": {
                              "chance": {
                                "type": "number",
                                "minimum": 0,
                                "maximum": 1
                              },
                              "heal": {
                                "type": "number",
                                "minimum": 0.1,
                                "maximum": 0.9
                              },
                              "seconds": {
                                "type": "number",
                                "minimum": 5,
                                "maximum": 600
                              }
                            }
                          }
                        ]
                      }
                    }
                  },
                  "light": {
                    "enum": [
                      "items"
                    ]
                  },
                  "equip": {
                    "type": "array",
                    "minItems": 1,
                    "uniqueItems": true,
                    "items": {
                      "enum": [
                        "head",
                        "neck",
                        "shoulders",
                        "back",
                        "chest",
                        "wrist",
                        "hands",
                        "waist",
                        "legs",
                        "feet",
                        "finger1",
                        "finger2",
                        "trinket1",
                        "trinket2",
                        "mainhand",
                        "offhand",
                        "ranged"
                      ]
                    }
                  },
                  "options": {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "hide": {
                        "type": "array",
                        "items": {
                          "enum": [
                            "sidebars",
                            "bars",
                            "vitals",
                            "frames",
                            "thirdPerson",
                            "firstPerson",
                            "view3d",
                            "xp"
                          ]
                        }
                      },
                      "show": {
                        "type": "array",
                        "items": {
                          "enum": [
                            "sidebars",
                            "bars",
                            "vitals",
                            "frames",
                            "thirdPerson",
                            "firstPerson",
                            "view3d",
                            "xp"
                          ]
                        }
                      },
                      "hideKeys": {
                        "type": "array",
                        "maxItems": 60,
                        "items": {
                          "type": "string",
                          "pattern": "^[a-z][a-z0-9_]{1,30}$"
                        },
                        "description": "ids of keys the Shortcuts tab does not list (torch, auto_attack, target_enemy…)"
                      }
                    }
                  },
                  "facing": {
                    "enum": [
                      "free",
                      "strict"
                    ]
                  },
                  "aim": {
                    "enum": [
                      "target",
                      "free"
                    ]
                  },
                  "ride": {
                    "enum": [
                      "carro",
                      "moto",
                      "aviao",
                      "cavalo",
                      "raptor",
                      "saltador",
                      "grifo",
                      "kart"
                    ]
                  },
                  "rides": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 8,
                    "items": {
                      "enum": [
                        "carro",
                        "moto",
                        "aviao",
                        "cavalo",
                        "raptor",
                        "saltador",
                        "grifo",
                        "kart"
                      ]
                    }
                  },
                  "rideCam": {
                    "enum": [
                      "chase",
                      "far",
                      "hood",
                      "cockpit",
                      "top",
                      "free"
                    ],
                    "description": "the 3D camera a rider starts in"
                  },
                  "rideCams": {
                    "type": "array",
                    "minItems": 1,
                    "uniqueItems": true,
                    "items": {
                      "enum": [
                        "chase",
                        "far",
                        "hood",
                        "cockpit",
                        "top",
                        "free"
                      ]
                    },
                    "description": "the 3D cameras the ride-view key (V) and the on-screen button go through; left out: all"
                  },
                  "vehicles": {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "preset": {
                        "enum": [
                          "classico",
                          "simulador",
                          "esportivo",
                          "cidade",
                          "drift",
                          "kart"
                        ],
                        "description": "a ready-made feel; numbers beside it change only those"
                      },
                      "assist": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 1
                      },
                      "grip": {
                        "type": "number",
                        "minimum": 0.3,
                        "maximum": 2
                      },
                      "power": {
                        "type": "number",
                        "minimum": 0.3,
                        "maximum": 2
                      },
                      "grav": {
                        "type": "number",
                        "minimum": 0.3,
                        "maximum": 2
                      },
                      "turn": {
                        "type": "number",
                        "minimum": 0.3,
                        "maximum": 2
                      }
                    }
                  },
                  "weight": {
                    "type": "integer",
                    "minimum": 10,
                    "maximum": 500
                  },
                  "clock": {
                    "type": "object",
                    "required": [
                      "cycleMinutes"
                    ],
                    "additionalProperties": false,
                    "description": "the day and night of the world: real minutes one game day lasts (default 120)",
                    "properties": {
                      "cycleMinutes": {
                        "type": "integer",
                        "minimum": 10,
                        "maximum": 1440
                      }
                    }
                  },
                  "joined": {
                    "type": "boolean",
                    "description": "a map one enters from another map of the project: no player start here (the game begins in the first map)"
                  },
                  "pvp": {
                    "type": "boolean"
                  },
                  "deathDrop": {
                    "type": "boolean"
                  },
                  "difficulty": {
                    "enum": [
                      "normal",
                      "heroic"
                    ]
                  },
                  "seed": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 2147483647,
                    "description": "with floors: a fixed seed, the same run every time"
                  },
                  "arena": {
                    "type": "object",
                    "required": [
                      "room",
                      "teams",
                      "lanes",
                      "waves",
                      "structures"
                    ],
                    "additionalProperties": false,
                    "description": "a hero arena: trails, platoons, structures (towers, inhibitors, a heart per team)",
                    "properties": {
                      "room": {
                        "type": "string"
                      },
                      "teams": {
                        "type": "array",
                        "minItems": 2,
                        "maxItems": 2,
                        "items": {
                          "type": "string",
                          "pattern": "^[a-z][a-z0-9_]{0,23}$"
                        }
                      },
                      "lanes": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 3,
                        "items": {
                          "type": "object",
                          "required": [
                            "id",
                            "points"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "id": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_]{0,23}$"
                            },
                            "points": {
                              "type": "array",
                              "minItems": 2,
                              "maxItems": 32,
                              "items": {
                                "type": "array",
                                "minItems": 2,
                                "maxItems": 2,
                                "items": {
                                  "type": "integer",
                                  "minimum": 0
                                }
                              }
                            }
                          }
                        }
                      },
                      "waves": {
                        "type": "object",
                        "required": [
                          "creature",
                          "every",
                          "size"
                        ],
                        "additionalProperties": false,
                        "properties": {
                          "creature": {
                            "type": "string",
                            "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                          },
                          "every": {
                            "type": "integer",
                            "minimum": 10,
                            "maximum": 120
                          },
                          "size": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 8
                          }
                        }
                      },
                      "structures": {
                        "type": "array",
                        "maxItems": 24,
                        "items": {
                          "type": "object",
                          "required": [
                            "id",
                            "team",
                            "kind",
                            "x",
                            "y"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "id": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_]{0,23}$"
                            },
                            "team": {
                              "enum": [
                                0,
                                1
                              ]
                            },
                            "kind": {
                              "enum": [
                                "tower",
                                "inhibitor",
                                "heart"
                              ]
                            },
                            "x": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "y": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "hp": {
                              "type": "integer",
                              "minimum": 100,
                              "maximum": 50000
                            },
                            "lane": {
                              "type": "string"
                            },
                            "after": {
                              "type": "string"
                            }
                          }
                        }
                      }
                    }
                  },
                  "defense": {
                    "type": "object",
                    "required": [
                      "room",
                      "entries",
                      "sanctuaries",
                      "lives",
                      "economy",
                      "towers",
                      "invaders",
                      "waves"
                    ],
                    "additionalProperties": false,
                    "description": "a tower defense: invaders walk from the entries to the sanctuaries by the shortest way left; the players build towers on the grid (no tower may close the way)",
                    "properties": {
                      "room": {
                        "type": "string"
                      },
                      "player": {
                        "enum": [
                          "builder",
                          "hero"
                        ],
                        "description": "'builder' (default): only builds, no character on the field, a free camera; 'hero': the world's character walks and fights beside the towers"
                      },
                      "build": {
                        "type": "string",
                        "description": "one character per cell of the room: '#' one may build, anything else not; left out: every walkable cell"
                      },
                      "entries": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 4,
                        "items": {
                          "type": "object",
                          "required": [
                            "id",
                            "x",
                            "y"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "id": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_]{0,23}$"
                            },
                            "x": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "y": {
                              "type": "integer",
                              "minimum": 0
                            }
                          }
                        }
                      },
                      "sanctuaries": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 3,
                        "items": {
                          "type": "object",
                          "required": [
                            "id",
                            "x",
                            "y"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "id": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_]{0,23}$"
                            },
                            "x": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "y": {
                              "type": "integer",
                              "minimum": 0
                            }
                          }
                        }
                      },
                      "lives": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 200
                      },
                      "economy": {
                        "type": "object",
                        "required": [
                          "gold"
                        ],
                        "additionalProperties": false,
                        "properties": {
                          "gold": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 100000
                          },
                          "sell": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 1
                          },
                          "interest": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 0.2
                          },
                          "early": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 100
                          },
                          "repair": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 2
                          },
                          "income": {
                            "type": "object",
                            "required": [
                              "every",
                              "base"
                            ],
                            "additionalProperties": false,
                            "description": "with lanes: every so many seconds each lane gets base + its income",
                            "properties": {
                              "every": {
                                "type": "number",
                                "minimum": 5,
                                "maximum": 60
                              },
                              "base": {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 10000
                              }
                            }
                          }
                        }
                      },
                      "lanes": {
                        "type": "array",
                        "minItems": 2,
                        "maxItems": 4,
                        "description": "a match of lanes: each player defends one (its id is the team); the waves come down every lane",
                        "items": {
                          "type": "object",
                          "required": [
                            "id",
                            "entries",
                            "sanctuaries",
                            "area"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "id": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_]{0,23}$"
                            },
                            "entries": {
                              "type": "array",
                              "minItems": 1,
                              "items": {
                                "type": "string"
                              }
                            },
                            "sanctuaries": {
                              "type": "array",
                              "minItems": 1,
                              "items": {
                                "type": "string"
                              }
                            },
                            "area": {
                              "type": "object",
                              "required": [
                                "x",
                                "y",
                                "w",
                                "h"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "x": {
                                  "type": "integer",
                                  "minimum": 0
                                },
                                "y": {
                                  "type": "integer",
                                  "minimum": 0
                                },
                                "w": {
                                  "type": "integer",
                                  "minimum": 1
                                },
                                "h": {
                                  "type": "integer",
                                  "minimum": 1
                                }
                              }
                            }
                          }
                        }
                      },
                      "sends": {
                        "type": "array",
                        "maxItems": 8,
                        "description": "with lanes: invaders one sends to the next lane, for gold, raising the sender income",
                        "items": {
                          "type": "object",
                          "required": [
                            "invader",
                            "n",
                            "cost",
                            "income"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "invader": {
                              "type": "string"
                            },
                            "n": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 20
                            },
                            "cost": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 100000
                            },
                            "income": {
                              "type": "integer",
                              "minimum": 0,
                              "maximum": 1000
                            }
                          }
                        }
                      },
                      "bots": {
                        "type": "boolean",
                        "description": "with lanes: the AI plays every lane no player took"
                      },
                      "buildReach": {
                        "type": "number",
                        "minimum": 2,
                        "maximum": 40,
                        "description": "with player 'hero': one builds, repairs and raises only this near the hero (m)"
                      },
                      "weather": {
                        "enum": [
                          "clear",
                          "rain",
                          "storm",
                          "fog",
                          "sand",
                          "ash",
                          "mist"
                        ],
                        "description": "the weather the match starts with (none: the world's)"
                      },
                      "difficulty": {
                        "enum": [
                          "easy",
                          "normal",
                          "hard"
                        ],
                        "description": "set by the setup screen (normal and hard close pads of the build grid); rarely written by hand"
                      },
                      "weatherEffects": {
                        "description": "what the weather does: \"default\" (the engine's table) or, by weather, damage × by school, reach ×, speed ×",
                        "oneOf": [
                          {
                            "const": "default"
                          },
                          {
                            "type": "object",
                            "additionalProperties": false,
                            "properties": {
                              "clear": {
                                "type": "object",
                                "additionalProperties": false,
                                "properties": {
                                  "dmg": {
                                    "type": "object",
                                    "additionalProperties": false,
                                    "properties": {
                                      "physical": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "fire": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "frost": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "arcane": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "nature": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "shadow": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "holy": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      }
                                    }
                                  },
                                  "reach": {
                                    "type": "number",
                                    "minimum": 0.3,
                                    "maximum": 2
                                  },
                                  "speed": {
                                    "type": "number",
                                    "minimum": 0.3,
                                    "maximum": 2
                                  }
                                }
                              },
                              "rain": {
                                "type": "object",
                                "additionalProperties": false,
                                "properties": {
                                  "dmg": {
                                    "type": "object",
                                    "additionalProperties": false,
                                    "properties": {
                                      "physical": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "fire": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "frost": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "arcane": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "nature": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "shadow": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "holy": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      }
                                    }
                                  },
                                  "reach": {
                                    "type": "number",
                                    "minimum": 0.3,
                                    "maximum": 2
                                  },
                                  "speed": {
                                    "type": "number",
                                    "minimum": 0.3,
                                    "maximum": 2
                                  }
                                }
                              },
                              "storm": {
                                "type": "object",
                                "additionalProperties": false,
                                "properties": {
                                  "dmg": {
                                    "type": "object",
                                    "additionalProperties": false,
                                    "properties": {
                                      "physical": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "fire": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "frost": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "arcane": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "nature": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "shadow": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "holy": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      }
                                    }
                                  },
                                  "reach": {
                                    "type": "number",
                                    "minimum": 0.3,
                                    "maximum": 2
                                  },
                                  "speed": {
                                    "type": "number",
                                    "minimum": 0.3,
                                    "maximum": 2
                                  }
                                }
                              },
                              "fog": {
                                "type": "object",
                                "additionalProperties": false,
                                "properties": {
                                  "dmg": {
                                    "type": "object",
                                    "additionalProperties": false,
                                    "properties": {
                                      "physical": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "fire": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "frost": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "arcane": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "nature": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "shadow": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "holy": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      }
                                    }
                                  },
                                  "reach": {
                                    "type": "number",
                                    "minimum": 0.3,
                                    "maximum": 2
                                  },
                                  "speed": {
                                    "type": "number",
                                    "minimum": 0.3,
                                    "maximum": 2
                                  }
                                }
                              },
                              "sand": {
                                "type": "object",
                                "additionalProperties": false,
                                "properties": {
                                  "dmg": {
                                    "type": "object",
                                    "additionalProperties": false,
                                    "properties": {
                                      "physical": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "fire": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "frost": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "arcane": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "nature": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "shadow": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "holy": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      }
                                    }
                                  },
                                  "reach": {
                                    "type": "number",
                                    "minimum": 0.3,
                                    "maximum": 2
                                  },
                                  "speed": {
                                    "type": "number",
                                    "minimum": 0.3,
                                    "maximum": 2
                                  }
                                }
                              },
                              "ash": {
                                "type": "object",
                                "additionalProperties": false,
                                "properties": {
                                  "dmg": {
                                    "type": "object",
                                    "additionalProperties": false,
                                    "properties": {
                                      "physical": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "fire": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "frost": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "arcane": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "nature": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "shadow": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "holy": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      }
                                    }
                                  },
                                  "reach": {
                                    "type": "number",
                                    "minimum": 0.3,
                                    "maximum": 2
                                  },
                                  "speed": {
                                    "type": "number",
                                    "minimum": 0.3,
                                    "maximum": 2
                                  }
                                }
                              },
                              "mist": {
                                "type": "object",
                                "additionalProperties": false,
                                "properties": {
                                  "dmg": {
                                    "type": "object",
                                    "additionalProperties": false,
                                    "properties": {
                                      "physical": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "fire": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "frost": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "arcane": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "nature": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "shadow": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      },
                                      "holy": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 3
                                      }
                                    }
                                  },
                                  "reach": {
                                    "type": "number",
                                    "minimum": 0.3,
                                    "maximum": 2
                                  },
                                  "speed": {
                                    "type": "number",
                                    "minimum": 0.3,
                                    "maximum": 2
                                  }
                                }
                              }
                            }
                          }
                        ]
                      },
                      "conditions": {
                        "description": "the states invaders carry: \"default\" (the engine's: wet, burning, chilled, oiled) or your own (up to 8, by id)",
                        "oneOf": [
                          {
                            "const": "default"
                          },
                          {
                            "type": "object",
                            "maxProperties": 8,
                            "additionalProperties": {
                              "type": "object",
                              "required": [
                                "name",
                                "color",
                                "lasts"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "name": {
                                  "type": "array",
                                  "minItems": 2,
                                  "maxItems": 2,
                                  "items": {
                                    "type": "string",
                                    "maxLength": 24
                                  },
                                  "description": "[pt, en]"
                                },
                                "color": {
                                  "type": "string",
                                  "pattern": "^#[0-9a-fA-F]{6}$"
                                },
                                "lasts": {
                                  "type": "number",
                                  "minimum": 0.5,
                                  "maximum": 60,
                                  "description": "seconds (renewed by a new hit)"
                                },
                                "dmg": {
                                  "type": "object",
                                  "additionalProperties": false,
                                  "description": "× the damage it takes, by school",
                                  "properties": {
                                    "physical": {
                                      "type": "number",
                                      "minimum": 0,
                                      "maximum": 3
                                    },
                                    "fire": {
                                      "type": "number",
                                      "minimum": 0,
                                      "maximum": 3
                                    },
                                    "frost": {
                                      "type": "number",
                                      "minimum": 0,
                                      "maximum": 3
                                    },
                                    "arcane": {
                                      "type": "number",
                                      "minimum": 0,
                                      "maximum": 3
                                    },
                                    "nature": {
                                      "type": "number",
                                      "minimum": 0,
                                      "maximum": 3
                                    },
                                    "shadow": {
                                      "type": "number",
                                      "minimum": 0,
                                      "maximum": 3
                                    },
                                    "holy": {
                                      "type": "number",
                                      "minimum": 0,
                                      "maximum": 3
                                    }
                                  }
                                },
                                "speed": {
                                  "type": "number",
                                  "minimum": 0.2,
                                  "maximum": 2,
                                  "description": "× its pace"
                                },
                                "dps": {
                                  "type": "object",
                                  "required": [
                                    "school",
                                    "pct"
                                  ],
                                  "additionalProperties": false,
                                  "description": "it burns: this part of its life a second",
                                  "properties": {
                                    "school": {
                                      "enum": [
                                        "physical",
                                        "fire",
                                        "frost",
                                        "arcane",
                                        "nature",
                                        "shadow",
                                        "holy"
                                      ]
                                    },
                                    "pct": {
                                      "type": "number",
                                      "minimum": 0,
                                      "maximum": 0.2
                                    }
                                  }
                                },
                                "from": {
                                  "type": "object",
                                  "additionalProperties": false,
                                  "description": "where it comes from: these weathers lay it on everyone walking; hits of these schools lay it",
                                  "properties": {
                                    "weather": {
                                      "type": "array",
                                      "items": {
                                        "enum": [
                                          "clear",
                                          "rain",
                                          "storm",
                                          "fog",
                                          "sand",
                                          "ash",
                                          "mist"
                                        ]
                                      }
                                    },
                                    "school": {
                                      "type": "array",
                                      "items": {
                                        "enum": [
                                          "physical",
                                          "fire",
                                          "frost",
                                          "arcane",
                                          "nature",
                                          "shadow",
                                          "holy"
                                        ]
                                      }
                                    }
                                  }
                                },
                                "blockedBy": {
                                  "type": "array",
                                  "items": {
                                    "type": "string"
                                  },
                                  "description": "it does not start while one of these states holds"
                                },
                                "removedBy": {
                                  "type": "array",
                                  "items": {
                                    "enum": [
                                      "physical",
                                      "fire",
                                      "frost",
                                      "arcane",
                                      "nature",
                                      "shadow",
                                      "holy"
                                    ]
                                  },
                                  "description": "a hit of one of these schools puts it out"
                                }
                              }
                            }
                          }
                        ]
                      },
                      "environment": {
                        "description": "the scenery: one of the engine's (volcano, glacier, swamp, crypt, desert, forest) or your own",
                        "oneOf": [
                          {
                            "enum": [
                              "volcano",
                              "glacier",
                              "swamp",
                              "crypt",
                              "desert",
                              "forest"
                            ]
                          },
                          {
                            "type": "object",
                            "additionalProperties": false,
                            "properties": {
                              "name": {
                                "type": "array",
                                "minItems": 2,
                                "maxItems": 2,
                                "items": {
                                  "type": "string"
                                }
                              },
                              "dmg": {
                                "type": "object",
                                "additionalProperties": false,
                                "description": "× the towers' damage by school",
                                "properties": {
                                  "physical": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 3
                                  },
                                  "fire": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 3
                                  },
                                  "frost": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 3
                                  },
                                  "arcane": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 3
                                  },
                                  "nature": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 3
                                  },
                                  "shadow": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 3
                                  },
                                  "holy": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 3
                                  }
                                }
                              },
                              "reach": {
                                "type": "number",
                                "minimum": 0.3,
                                "maximum": 2
                              },
                              "speed": {
                                "type": "number",
                                "minimum": 0.3,
                                "maximum": 2
                              },
                              "lasts": {
                                "type": "object",
                                "additionalProperties": {
                                  "type": "number",
                                  "minimum": 0.1,
                                  "maximum": 5
                                },
                                "description": "× how long each state lasts here"
                              },
                              "never": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                },
                                "description": "states that never take hold here"
                              },
                              "always": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                },
                                "description": "states everyone here always has"
                              }
                            }
                          }
                        ]
                      },
                      "setup": {
                        "type": "object",
                        "additionalProperties": false,
                        "description": "a screen before the match: the player picks the map (the defense's room, one of `fields`, or a random one) and turns the mechanics in `choose` on or off",
                        "properties": {
                          "name": {
                            "type": "string",
                            "maxLength": 32,
                            "description": "the name of the defense's own map"
                          },
                          "about": {
                            "type": "string",
                            "maxLength": 120
                          },
                          "random": {
                            "type": "boolean",
                            "description": "offer a random map (default true with other maps)"
                          },
                          "choose": {
                            "type": "array",
                            "uniqueItems": true,
                            "items": {
                              "enum": [
                                "weather",
                                "conditions",
                                "environment",
                                "draft",
                                "merges",
                                "endless",
                                "difficulty"
                              ]
                            },
                            "description": "the options the player may change (default: all that fit)"
                          },
                          "fields": {
                            "type": "array",
                            "maxItems": 6,
                            "description": "other maps: another room of the map with its own entries, sanctuaries, build grid, scenery and weather (towers, invaders and waves are the defense's)",
                            "items": {
                              "type": "object",
                              "required": [
                                "room",
                                "entries",
                                "sanctuaries"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "room": {
                                  "type": "string"
                                },
                                "name": {
                                  "type": "string",
                                  "maxLength": 32
                                },
                                "about": {
                                  "type": "string",
                                  "maxLength": 120
                                },
                                "entries": {
                                  "type": "array",
                                  "minItems": 1,
                                  "maxItems": 4,
                                  "items": {
                                    "type": "object",
                                    "required": [
                                      "id",
                                      "x",
                                      "y"
                                    ],
                                    "additionalProperties": false,
                                    "properties": {
                                      "id": {
                                        "type": "string",
                                        "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                      },
                                      "x": {
                                        "type": "integer",
                                        "minimum": 0
                                      },
                                      "y": {
                                        "type": "integer",
                                        "minimum": 0
                                      }
                                    }
                                  }
                                },
                                "sanctuaries": {
                                  "type": "array",
                                  "minItems": 1,
                                  "maxItems": 3,
                                  "items": {
                                    "type": "object",
                                    "required": [
                                      "id",
                                      "x",
                                      "y"
                                    ],
                                    "additionalProperties": false,
                                    "properties": {
                                      "id": {
                                        "type": "string",
                                        "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                      },
                                      "x": {
                                        "type": "integer",
                                        "minimum": 0
                                      },
                                      "y": {
                                        "type": "integer",
                                        "minimum": 0
                                      }
                                    }
                                  }
                                },
                                "build": {
                                  "type": "string"
                                },
                                "environment": {
                                  "oneOf": [
                                    {
                                      "enum": [
                                        "volcano",
                                        "glacier",
                                        "swamp",
                                        "crypt",
                                        "desert",
                                        "forest"
                                      ]
                                    },
                                    {
                                      "type": "object"
                                    }
                                  ]
                                },
                                "weather": {
                                  "enum": [
                                    "clear",
                                    "rain",
                                    "storm",
                                    "fog",
                                    "sand",
                                    "ash",
                                    "mist"
                                  ]
                                }
                              }
                            }
                          }
                        }
                      },
                      "towers": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 16,
                        "items": {
                          "type": "object",
                          "required": [
                            "id",
                            "name",
                            "cost",
                            "range",
                            "rate",
                            "attack",
                            "dmg"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "id": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_]{0,23}$"
                            },
                            "name": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 32
                            },
                            "look": {
                              "type": "string",
                              "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                            },
                            "cost": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 100000
                            },
                            "range": {
                              "type": "number",
                              "minimum": 1,
                              "maximum": 40
                            },
                            "minRange": {
                              "type": "number",
                              "minimum": 0,
                              "maximum": 40
                            },
                            "rate": {
                              "type": "number",
                              "minimum": 0.1,
                              "maximum": 20
                            },
                            "attack": {
                              "enum": [
                                "single",
                                "splash",
                                "chain",
                                "slow",
                                "spell",
                                "pierce",
                                "cone",
                                "none"
                              ]
                            },
                            "dmg": {
                              "type": "number",
                              "minimum": 0,
                              "maximum": 100000
                            },
                            "school": {
                              "enum": [
                                "physical",
                                "fire",
                                "frost",
                                "arcane",
                                "nature",
                                "shadow",
                                "holy"
                              ]
                            },
                            "radius": {
                              "type": "number",
                              "minimum": 0.5,
                              "maximum": 10
                            },
                            "jumps": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 8
                            },
                            "slow": {
                              "type": "object",
                              "required": [
                                "by",
                                "for"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "by": {
                                  "type": "number",
                                  "minimum": 0.1,
                                  "maximum": 0.8
                                },
                                "for": {
                                  "type": "number",
                                  "minimum": 0.5,
                                  "maximum": 10
                                }
                              }
                            },
                            "spell": {
                              "type": "string",
                              "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                            },
                            "aim": {
                              "enum": [
                                "first",
                                "last",
                                "strong",
                                "weak",
                                "close"
                              ]
                            },
                            "upgrades": {
                              "type": "array",
                              "maxItems": 4,
                              "items": {
                                "type": "object",
                                "required": [
                                  "cost"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "cost": {
                                    "type": "integer",
                                    "minimum": 1,
                                    "maximum": 100000
                                  },
                                  "dmg": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 100000
                                  },
                                  "range": {
                                    "type": "number",
                                    "minimum": 1,
                                    "maximum": 40
                                  },
                                  "rate": {
                                    "type": "number",
                                    "minimum": 0.1,
                                    "maximum": 20
                                  },
                                  "radius": {
                                    "type": "number",
                                    "minimum": 0.5,
                                    "maximum": 10
                                  }
                                }
                              }
                            },
                            "limit": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 120
                            },
                            "color": {
                              "type": "string",
                              "pattern": "^#[0-9a-fA-F]{6}$"
                            },
                            "hits": {
                              "type": "array",
                              "minItems": 1,
                              "uniqueItems": true,
                              "items": {
                                "enum": [
                                  "ground",
                                  "air",
                                  "camo"
                                ]
                              },
                              "description": "what it can hit (default: ground)"
                            },
                            "reveal": {
                              "type": "number",
                              "minimum": 1,
                              "maximum": 20
                            },
                            "angle": {
                              "type": "number",
                              "minimum": 20,
                              "maximum": 180
                            },
                            "trap": {
                              "type": "boolean",
                              "description": "goes on the way itself, never closes it, goes off under an invader"
                            },
                            "build": {
                              "type": "boolean",
                              "description": "false: not on the bar, only from a merge or the draw"
                            },
                            "hp": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 1000000
                            },
                            "paths": {
                              "type": "array",
                              "minItems": 1,
                              "maxItems": 3,
                              "description": "upgrade paths of their own (damage, reach, rate, area): each level bought apart, adding to the numbers",
                              "items": {
                                "type": "object",
                                "required": [
                                  "id",
                                  "name",
                                  "levels"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "id": {
                                    "type": "string",
                                    "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                  },
                                  "name": {
                                    "type": "string",
                                    "minLength": 1,
                                    "maxLength": 24
                                  },
                                  "levels": {
                                    "type": "array",
                                    "minItems": 1,
                                    "maxItems": 5,
                                    "items": {
                                      "type": "object",
                                      "required": [
                                        "cost"
                                      ],
                                      "minProperties": 2,
                                      "additionalProperties": false,
                                      "properties": {
                                        "cost": {
                                          "type": "integer",
                                          "minimum": 1,
                                          "maximum": 100000
                                        },
                                        "dmg": {
                                          "type": "number",
                                          "minimum": 0,
                                          "maximum": 100000
                                        },
                                        "range": {
                                          "type": "number",
                                          "minimum": 0,
                                          "maximum": 20
                                        },
                                        "rate": {
                                          "type": "number",
                                          "minimum": 0,
                                          "maximum": 10
                                        },
                                        "radius": {
                                          "type": "number",
                                          "minimum": 0,
                                          "maximum": 5
                                        }
                                      }
                                    }
                                  }
                                }
                              }
                            },
                            "pathCap": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 15,
                              "description": "the most path levels in all the paths together (none: every level of every path)"
                            },
                            "applies": {
                              "type": "array",
                              "maxItems": 3,
                              "uniqueItems": true,
                              "items": {
                                "type": "string"
                              },
                              "description": "states of the defense its hits lay (needs \"conditions\")"
                            },
                            "fx": {
                              "type": "object",
                              "additionalProperties": false,
                              "description": "how the hit looks (never the damage): projectile, trail, impact, a charge over the tower; left out: by its attack and school",
                              "properties": {
                                "shot": {
                                  "enum": [
                                    "bolt",
                                    "arrow",
                                    "lance",
                                    "orb",
                                    "lob",
                                    "strike",
                                    "spray"
                                  ]
                                },
                                "trail": {
                                  "enum": [
                                    "none",
                                    "smoke",
                                    "ember",
                                    "frost",
                                    "spark"
                                  ]
                                },
                                "impact": {
                                  "enum": [
                                    "none",
                                    "burst",
                                    "rocks",
                                    "frost",
                                    "spark",
                                    "ring"
                                  ]
                                },
                                "charge": {
                                  "type": "boolean"
                                }
                              }
                            },
                            "branches": {
                              "type": "array",
                              "minItems": 2,
                              "maxItems": 3,
                              "description": "past the last level, pick one for good",
                              "items": {
                                "type": "object",
                                "required": [
                                  "id",
                                  "name",
                                  "cost"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "id": {
                                    "type": "string",
                                    "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                  },
                                  "name": {
                                    "type": "string",
                                    "minLength": 1,
                                    "maxLength": 32
                                  },
                                  "cost": {
                                    "type": "integer",
                                    "minimum": 1,
                                    "maximum": 100000
                                  },
                                  "dmg": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 100000
                                  },
                                  "range": {
                                    "type": "number",
                                    "minimum": 1,
                                    "maximum": 40
                                  },
                                  "rate": {
                                    "type": "number",
                                    "minimum": 0.1,
                                    "maximum": 20
                                  },
                                  "radius": {
                                    "type": "number",
                                    "minimum": 0.5,
                                    "maximum": 10
                                  },
                                  "attack": {
                                    "enum": [
                                      "single",
                                      "splash",
                                      "chain",
                                      "slow",
                                      "pierce",
                                      "cone"
                                    ]
                                  },
                                  "school": {
                                    "enum": [
                                      "physical",
                                      "fire",
                                      "frost",
                                      "arcane",
                                      "nature",
                                      "shadow",
                                      "holy"
                                    ]
                                  },
                                  "jumps": {
                                    "type": "integer",
                                    "minimum": 1,
                                    "maximum": 8
                                  },
                                  "angle": {
                                    "type": "number",
                                    "minimum": 20,
                                    "maximum": 180
                                  },
                                  "slow": {
                                    "type": "object",
                                    "required": [
                                      "by",
                                      "for"
                                    ],
                                    "additionalProperties": false,
                                    "properties": {
                                      "by": {
                                        "type": "number",
                                        "minimum": 0.1,
                                        "maximum": 0.8
                                      },
                                      "for": {
                                        "type": "number",
                                        "minimum": 0.5,
                                        "maximum": 10
                                      }
                                    }
                                  },
                                  "hits": {
                                    "type": "array",
                                    "minItems": 1,
                                    "uniqueItems": true,
                                    "items": {
                                      "enum": [
                                        "ground",
                                        "air",
                                        "camo"
                                      ]
                                    }
                                  },
                                  "reveal": {
                                    "type": "number",
                                    "minimum": 1,
                                    "maximum": 20
                                  },
                                  "applies": {
                                    "type": "array",
                                    "maxItems": 3,
                                    "uniqueItems": true,
                                    "items": {
                                      "type": "string"
                                    }
                                  },
                                  "fx": {
                                    "type": "object",
                                    "additionalProperties": false,
                                    "description": "how the hit looks (never the damage): projectile, trail, impact, a charge over the tower; left out: by its attack and school",
                                    "properties": {
                                      "shot": {
                                        "enum": [
                                          "bolt",
                                          "arrow",
                                          "lance",
                                          "orb",
                                          "lob",
                                          "strike",
                                          "spray"
                                        ]
                                      },
                                      "trail": {
                                        "enum": [
                                          "none",
                                          "smoke",
                                          "ember",
                                          "frost",
                                          "spark"
                                        ]
                                      },
                                      "impact": {
                                        "enum": [
                                          "none",
                                          "burst",
                                          "rocks",
                                          "frost",
                                          "spark",
                                          "ring"
                                        ]
                                      },
                                      "charge": {
                                        "type": "boolean"
                                      }
                                    }
                                  },
                                  "color": {
                                    "type": "string",
                                    "pattern": "^#[0-9a-fA-F]{6}$"
                                  }
                                }
                              }
                            }
                          }
                        }
                      },
                      "invaders": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 16,
                        "items": {
                          "type": "object",
                          "required": [
                            "id",
                            "creature",
                            "hp",
                            "speed",
                            "gold"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "id": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_]{0,23}$"
                            },
                            "creature": {
                              "type": "string",
                              "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                            },
                            "hp": {
                              "type": "number",
                              "minimum": 1,
                              "maximum": 1000000
                            },
                            "speed": {
                              "type": "number",
                              "minimum": 0.3,
                              "maximum": 14
                            },
                            "gold": {
                              "type": "integer",
                              "minimum": 0,
                              "maximum": 10000
                            },
                            "leak": {
                              "type": "integer",
                              "minimum": 0,
                              "maximum": 100
                            },
                            "armor": {
                              "type": "number",
                              "minimum": 0,
                              "maximum": 0.9
                            },
                            "fly": {
                              "type": "boolean"
                            },
                            "camo": {
                              "type": "boolean"
                            },
                            "immune": {
                              "type": "array",
                              "items": {
                                "enum": [
                                  "slow",
                                  "physical",
                                  "fire",
                                  "frost",
                                  "arcane",
                                  "nature",
                                  "shadow",
                                  "holy"
                                ]
                              }
                            },
                            "resist": {
                              "type": "object",
                              "additionalProperties": false,
                              "properties": {
                                "physical": {
                                  "type": "number",
                                  "minimum": 0,
                                  "maximum": 0.9
                                },
                                "fire": {
                                  "type": "number",
                                  "minimum": 0,
                                  "maximum": 0.9
                                },
                                "frost": {
                                  "type": "number",
                                  "minimum": 0,
                                  "maximum": 0.9
                                },
                                "arcane": {
                                  "type": "number",
                                  "minimum": 0,
                                  "maximum": 0.9
                                },
                                "nature": {
                                  "type": "number",
                                  "minimum": 0,
                                  "maximum": 0.9
                                },
                                "shadow": {
                                  "type": "number",
                                  "minimum": 0,
                                  "maximum": 0.9
                                },
                                "holy": {
                                  "type": "number",
                                  "minimum": 0,
                                  "maximum": 0.9
                                }
                              }
                            },
                            "regen": {
                              "type": "number",
                              "minimum": 0,
                              "maximum": 10000
                            },
                            "split": {
                              "type": "object",
                              "required": [
                                "into",
                                "n"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "into": {
                                  "type": "string"
                                },
                                "n": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 6
                                }
                              }
                            },
                            "revive": {
                              "type": "object",
                              "required": [
                                "pct",
                                "after"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "pct": {
                                  "type": "number",
                                  "minimum": 0.1,
                                  "maximum": 1
                                },
                                "after": {
                                  "type": "number",
                                  "minimum": 0.5,
                                  "maximum": 30
                                }
                              }
                            },
                            "healOnDeath": {
                              "type": "object",
                              "required": [
                                "pct",
                                "radius"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "pct": {
                                  "type": "number",
                                  "minimum": 0.05,
                                  "maximum": 1
                                },
                                "radius": {
                                  "type": "number",
                                  "minimum": 1,
                                  "maximum": 12
                                }
                              }
                            },
                            "siege": {
                              "type": "object",
                              "required": [
                                "dmg",
                                "rate",
                                "range"
                              ],
                              "additionalProperties": false,
                              "description": "hits the towers with life (and the heroes) it passes",
                              "properties": {
                                "dmg": {
                                  "type": "number",
                                  "minimum": 1,
                                  "maximum": 100000
                                },
                                "rate": {
                                  "type": "number",
                                  "minimum": 0.1,
                                  "maximum": 5
                                },
                                "range": {
                                  "type": "number",
                                  "minimum": 0.5,
                                  "maximum": 12
                                }
                              }
                            }
                          }
                        }
                      },
                      "waves": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 60,
                        "items": {
                          "type": "object",
                          "required": [
                            "groups",
                            "gap"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "gap": {
                              "type": "number",
                              "minimum": 0,
                              "maximum": 180
                            },
                            "bonus": {
                              "type": "integer",
                              "minimum": 0,
                              "maximum": 100000
                            },
                            "weather": {
                              "enum": [
                                "clear",
                                "rain",
                                "storm",
                                "fog",
                                "sand",
                                "ash",
                                "mist"
                              ]
                            },
                            "groups": {
                              "type": "array",
                              "minItems": 1,
                              "maxItems": 6,
                              "items": {
                                "type": "object",
                                "required": [
                                  "invader",
                                  "n",
                                  "every"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "invader": {
                                    "type": "string"
                                  },
                                  "n": {
                                    "type": "integer",
                                    "minimum": 1,
                                    "maximum": 80
                                  },
                                  "every": {
                                    "type": "number",
                                    "minimum": 0.2,
                                    "maximum": 10
                                  },
                                  "entry": {
                                    "type": "string"
                                  },
                                  "delay": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 120
                                  }
                                }
                              }
                            }
                          }
                        }
                      },
                      "endless": {
                        "type": "object",
                        "required": [
                          "hp",
                          "count"
                        ],
                        "additionalProperties": false,
                        "properties": {
                          "hp": {
                            "type": "number",
                            "minimum": 1,
                            "maximum": 2
                          },
                          "count": {
                            "type": "number",
                            "minimum": 1,
                            "maximum": 2
                          }
                        }
                      },
                      "merges": {
                        "type": "array",
                        "maxItems": 12,
                        "description": "towers standing that become one tower (the selected one and the nearest others)",
                        "items": {
                          "type": "object",
                          "required": [
                            "from",
                            "to"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "from": {
                              "type": "array",
                              "minItems": 2,
                              "maxItems": 4,
                              "items": {
                                "type": "string"
                              }
                            },
                            "to": {
                              "type": "string"
                            },
                            "cost": {
                              "type": "integer",
                              "minimum": 0,
                              "maximum": 100000
                            }
                          }
                        }
                      },
                      "draft": {
                        "type": "object",
                        "required": [
                          "offer"
                        ],
                        "additionalProperties": false,
                        "description": "before each wave, towers drawn to pick one from: built once for free",
                        "properties": {
                          "offer": {
                            "type": "integer",
                            "minimum": 2,
                            "maximum": 5
                          },
                          "pool": {
                            "type": "array",
                            "uniqueItems": true,
                            "items": {
                              "type": "string"
                            }
                          }
                        }
                      }
                    }
                  },
                  "board": {
                    "type": "object",
                    "required": [
                      "room",
                      "turns"
                    ],
                    "additionalProperties": false,
                    "description": "a board game (spaces and trophy required unless stadium): the seats roll the die in turns and walk the spaces; passing the altar with the coins buys a trophy; the most trophies (then coins) win; empty seats are robots",
                    "properties": {
                      "room": {
                        "type": "string"
                      },
                      "stadium": {
                        "type": "boolean",
                        "description": "only the trials, one a round (turns of them), no spaces nor trophy: the coins won decide"
                      },
                      "pieces": {
                        "type": "array",
                        "maxItems": 4,
                        "items": {
                          "type": "string"
                        },
                        "description": "a look per seat (a person or creature look of the world): the pieces are those bodies, in 2D and 3D"
                      },
                      "players": {
                        "type": "integer",
                        "minimum": 2,
                        "maximum": 4
                      },
                      "names": {
                        "type": "array",
                        "maxItems": 3,
                        "items": {
                          "type": "string",
                          "maxLength": 24
                        },
                        "description": "the robots' names"
                      },
                      "turns": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 99
                      },
                      "dice": {
                        "type": "object",
                        "required": [
                          "faces"
                        ],
                        "additionalProperties": false,
                        "properties": {
                          "faces": {
                            "type": "integer",
                            "minimum": 2,
                            "maximum": 20
                          },
                          "min": {
                            "type": "integer",
                            "minimum": 0
                          }
                        }
                      },
                      "coins": {
                        "type": "object",
                        "required": [
                          "start"
                        ],
                        "additionalProperties": false,
                        "properties": {
                          "start": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 999
                          }
                        }
                      },
                      "trophy": {
                        "type": "object",
                        "required": [
                          "price",
                          "altars"
                        ],
                        "additionalProperties": false,
                        "properties": {
                          "price": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 999
                          },
                          "decoy": {
                            "type": "boolean",
                            "description": "a false altar too: it takes the price and gives nothing"
                          },
                          "altars": {
                            "type": "array",
                            "minItems": 1,
                            "maxItems": 8,
                            "uniqueItems": true,
                            "items": {
                              "type": "string"
                            },
                            "description": "the spaces the altar may stand on (the first: where it starts)"
                          },
                          "moves": {
                            "enum": [
                              "afterBuy",
                              "never"
                            ]
                          }
                        }
                      },
                      "lastTurns": {
                        "type": "object",
                        "required": [
                          "count",
                          "mult"
                        ],
                        "additionalProperties": false,
                        "description": "the last turns multiply what gain and loss spaces give and take",
                        "properties": {
                          "count": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 99
                          },
                          "mult": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 5
                          }
                        }
                      },
                      "kinds": {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                          "gain": {
                            "type": "object",
                            "required": [
                              "coins"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "coins": {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 99
                              }
                            }
                          },
                          "loss": {
                            "type": "object",
                            "required": [
                              "coins"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "coins": {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 99
                              }
                            }
                          }
                        }
                      },
                      "spaces": {
                        "type": "array",
                        "minItems": 2,
                        "maxItems": 160,
                        "items": {
                          "type": "object",
                          "required": [
                            "id",
                            "x",
                            "y",
                            "kind",
                            "next"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "id": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_]{0,23}$"
                            },
                            "x": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "y": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "kind": {
                              "enum": [
                                "start",
                                "blank",
                                "gain",
                                "loss",
                                "event",
                                "shop",
                                "vault",
                                "twist",
                                "warp",
                                "back",
                                "pot",
                                "duel",
                                "pick",
                                "gift",
                                "rogue"
                              ],
                              "description": "start (exactly one), blank, gain (coins given), loss (coins taken), event (the rules hear boardEvent with the space's id), shop (passing it one may buy items), vault (passing pays into it, stopping takes it all), twist (a draw of who gives what to whom)"
                            },
                            "next": {
                              "type": "array",
                              "minItems": 1,
                              "maxItems": 3,
                              "uniqueItems": true,
                              "items": {
                                "type": "string"
                              },
                              "description": "the spaces one goes on to (more than one: a fork, the player picks)"
                            },
                            "coins": {
                              "type": "integer",
                              "minimum": 0,
                              "maximum": 99
                            },
                            "name": {
                              "type": "string",
                              "maxLength": 40,
                              "description": "shown when one lands (event spaces)"
                            },
                            "to": {
                              "type": "string",
                              "description": "warp: the space it carries to"
                            },
                            "steps": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 9
                            },
                            "night": {
                              "enum": [
                                "blank",
                                "gain",
                                "loss",
                                "event",
                                "shop",
                                "vault",
                                "twist",
                                "warp",
                                "back",
                                "pot",
                                "duel",
                                "pick",
                                "gift",
                                "rogue"
                              ],
                              "description": "what it is at night (needs the board's cycle)"
                            }
                          }
                        }
                      },
                      "items": {
                        "type": "array",
                        "maxItems": 12,
                        "description": "items the peddler sells (one used a turn, before rolling)",
                        "items": {
                          "type": "object",
                          "required": [
                            "id",
                            "name",
                            "price",
                            "effect"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "id": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_]{0,23}$"
                            },
                            "name": {
                              "type": "string",
                              "maxLength": 24
                            },
                            "price": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 999
                            },
                            "effect": {
                              "enum": [
                                "dice",
                                "toAltar",
                                "swap",
                                "steal",
                                "curse",
                                "key"
                              ],
                              "description": "dice: roll `dice` dice; toAltar: go to the altar (one still pays); swap: swap places; steal: take `coins` from another; curse: the next roll of another is 1–3"
                            },
                            "dice": {
                              "type": "integer",
                              "minimum": 2,
                              "maximum": 3
                            },
                            "coins": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 99
                            },
                            "target": {
                              "enum": [
                                "leader",
                                "random"
                              ],
                              "description": "swap, steal, curse: the one ahead (default) or anyone"
                            }
                          }
                        }
                      },
                      "bag": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 3
                      },
                      "shop": {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                          "offer": {
                            "type": "array",
                            "minItems": 2,
                            "maxItems": 2,
                            "items": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 5
                            },
                            "description": "[items offered to the one ahead, to the last]"
                          },
                          "catchUp": {
                            "type": "boolean"
                          }
                        }
                      },
                      "vault": {
                        "type": "object",
                        "required": [
                          "pass"
                        ],
                        "additionalProperties": false,
                        "properties": {
                          "pass": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 50
                          }
                        }
                      },
                      "twist": {
                        "type": "object",
                        "required": [
                          "options"
                        ],
                        "additionalProperties": false,
                        "properties": {
                          "options": {
                            "type": "array",
                            "minItems": 1,
                            "maxItems": 8,
                            "items": {
                              "oneOf": [
                                {
                                  "type": "object",
                                  "required": [
                                    "coins"
                                  ],
                                  "additionalProperties": false,
                                  "properties": {
                                    "coins": {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 99
                                    }
                                  }
                                },
                                {
                                  "type": "object",
                                  "required": [
                                    "trophies"
                                  ],
                                  "additionalProperties": false,
                                  "properties": {
                                    "trophies": {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 3
                                    }
                                  }
                                },
                                {
                                  "type": "object",
                                  "required": [
                                    "swap"
                                  ],
                                  "additionalProperties": false,
                                  "properties": {
                                    "swap": {
                                      "enum": [
                                        "coins",
                                        "trophies"
                                      ]
                                    }
                                  }
                                }
                              ]
                            }
                          }
                        }
                      },
                      "honors": {
                        "type": "object",
                        "required": [
                          "pick"
                        ],
                        "additionalProperties": false,
                        "description": "extra trophies at the end for the most of something",
                        "properties": {
                          "pick": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 3
                          },
                          "announce": {
                            "type": "boolean"
                          },
                          "from": {
                            "type": "array",
                            "uniqueItems": true,
                            "items": {
                              "enum": [
                                "mostCoins",
                                "events",
                                "steps",
                                "gained",
                                "shopper",
                                "losses",
                                "trialCoins"
                              ]
                            }
                          }
                        }
                      },
                      "preset": {
                        "enum": [
                          "classic",
                          "pro"
                        ],
                        "description": "pro: no twist, one honour announced"
                      },
                      "gates": {
                        "type": "array",
                        "maxItems": 12,
                        "items": {
                          "type": "object",
                          "required": [
                            "id",
                            "from",
                            "to",
                            "mode"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "id": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_]{0,23}$"
                            },
                            "from": {
                              "type": "string"
                            },
                            "to": {
                              "type": "string",
                              "description": "a next space of from (the trail it closes)"
                            },
                            "mode": {
                              "enum": [
                                "toll",
                                "key",
                                "cycle",
                                "rules"
                              ],
                              "description": "toll: pay to pass; key: spend a key item; cycle: open by day or by night; rules: setGate opens and closes it"
                            },
                            "toll": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 99
                            },
                            "when": {
                              "enum": [
                                "day",
                                "night"
                              ]
                            },
                            "open": {
                              "type": "boolean"
                            }
                          }
                        }
                      },
                      "cycle": {
                        "type": "object",
                        "required": [
                          "every"
                        ],
                        "additionalProperties": false,
                        "properties": {
                          "every": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 10
                          },
                          "names": {
                            "type": "array",
                            "minItems": 2,
                            "maxItems": 2,
                            "items": {
                              "type": "string",
                              "maxLength": 16
                            }
                          }
                        }
                      },
                      "rogue": {
                        "type": "object",
                        "additionalProperties": false,
                        "description": "the rogue space: a roulette of punishments, harsher as the match goes on",
                        "properties": {
                          "name": {
                            "type": "string",
                            "maxLength": 24
                          },
                          "look": {
                            "type": "string",
                            "description": "the herald standing beside each rogue space"
                          },
                          "roll": {
                            "type": "array",
                            "minItems": 1,
                            "items": {
                              "enum": [
                                "toll",
                                "potluck",
                                "revolution",
                                "shuffle",
                                "curseAll",
                                "trophy"
                              ]
                            }
                          }
                        }
                      },
                      "bots": {
                        "enum": [
                          "easy",
                          "normal",
                          "hard"
                        ],
                        "description": "how sharp the robots are on the board and in the trials"
                      },
                      "handicap": {
                        "type": "array",
                        "items": {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 3
                        },
                        "description": "a level per seat: each one 5 more coins to start, the trophy 2 cheaper, the die's least face 1 more"
                      },
                      "setup": {
                        "type": "object",
                        "required": [
                          "choose"
                        ],
                        "additionalProperties": false,
                        "description": "a screen before the match: the host picks these",
                        "properties": {
                          "choose": {
                            "type": "array",
                            "minItems": 1,
                            "uniqueItems": true,
                            "items": {
                              "enum": [
                                "turns",
                                "preset",
                                "trials",
                                "twist",
                                "bots",
                                "handicap"
                              ]
                            }
                          },
                          "turns": {
                            "type": "array",
                            "minItems": 1,
                            "maxItems": 5,
                            "items": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 99
                            }
                          },
                          "name": {
                            "type": "string",
                            "maxLength": 24
                          }
                        }
                      },
                      "pot": {
                        "type": "object",
                        "required": [
                          "ante"
                        ],
                        "additionalProperties": false,
                        "properties": {
                          "ante": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 50
                          }
                        }
                      },
                      "duel": {
                        "type": "object",
                        "required": [
                          "stake"
                        ],
                        "additionalProperties": false,
                        "properties": {
                          "stake": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 99
                          }
                        }
                      },
                      "pick": {
                        "type": "object",
                        "required": [
                          "boxes",
                          "prizes"
                        ],
                        "additionalProperties": false,
                        "properties": {
                          "boxes": {
                            "type": "integer",
                            "minimum": 2,
                            "maximum": 4
                          },
                          "prizes": {
                            "type": "array",
                            "minItems": 2,
                            "maxItems": 8,
                            "items": {
                              "type": "object",
                              "minProperties": 1,
                              "maxProperties": 1,
                              "additionalProperties": false,
                              "properties": {
                                "coins": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 50
                                },
                                "lose": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 50
                                },
                                "trophy": {
                                  "const": 1
                                },
                                "item": {
                                  "type": "string"
                                },
                                "none": {
                                  "const": true
                                }
                              }
                            }
                          }
                        }
                      },
                      "trials": {
                        "type": "object",
                        "required": [
                          "list"
                        ],
                        "additionalProperties": false,
                        "description": "a trial after every round (or every few): its format from the spaces the seats stopped on",
                        "properties": {
                          "list": {
                            "type": "array",
                            "minItems": 1,
                            "maxItems": 24,
                            "items": {
                              "type": "object",
                              "required": [
                                "room"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "room": {
                                  "type": "string",
                                  "description": "a room of the map with \"trial\""
                                },
                                "formats": {
                                  "type": "array",
                                  "uniqueItems": true,
                                  "items": {
                                    "enum": [
                                      "ffa",
                                      "pair",
                                      "one",
                                      "duel"
                                    ]
                                  }
                                },
                                "pay": {
                                  "enum": [
                                    "places",
                                    "score"
                                  ]
                                }
                              }
                            }
                          },
                          "every": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 5
                          },
                          "pay": {
                            "type": "object",
                            "additionalProperties": false,
                            "properties": {
                              "places": {
                                "type": "array",
                                "minItems": 4,
                                "maxItems": 4,
                                "items": {
                                  "type": "integer",
                                  "minimum": 0,
                                  "maximum": 99
                                }
                              },
                              "team": {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 99
                              }
                            }
                          }
                        }
                      }
                    }
                  },
                  "race": {
                    "type": "object",
                    "required": [
                      "checkpoints"
                    ],
                    "additionalProperties": false,
                    "description": "checkpoints in order (the first is the start and finish line), laps, the variable that gets the time",
                    "properties": {
                      "checkpoints": {
                        "type": "array",
                        "minItems": 2,
                        "maxItems": 20,
                        "items": {
                          "type": "object",
                          "required": [
                            "region"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "region": {
                              "type": "string"
                            },
                            "alt": {
                              "type": "array",
                              "minItems": 2,
                              "maxItems": 2,
                              "items": {
                                "type": "number",
                                "minimum": 0,
                                "maximum": 400
                              }
                            }
                          }
                        }
                      },
                      "laps": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 10
                      },
                      "timeVar": {
                        "type": "string"
                      },
                      "line": {
                        "type": "array",
                        "minItems": 3,
                        "maxItems": 64,
                        "description": "the racing line (cells, in order round the track): the rivals follow it and the places are measured on it",
                        "items": {
                          "type": "array",
                          "minItems": 2,
                          "maxItems": 2,
                          "items": {
                            "type": "integer",
                            "minimum": 0
                          }
                        }
                      },
                      "rivals": {
                        "type": "object",
                        "required": [
                          "count"
                        ],
                        "additionalProperties": false,
                        "properties": {
                          "count": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 11
                          },
                          "ride": {
                            "enum": [
                              "carro",
                              "moto",
                              "aviao",
                              "cavalo",
                              "raptor",
                              "saltador",
                              "grifo",
                              "kart"
                            ]
                          },
                          "skill": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 1
                          },
                          "names": {
                            "type": "array",
                            "maxItems": 16,
                            "items": {
                              "type": "string",
                              "maxLength": 24
                            }
                          }
                        }
                      },
                      "countdown": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 5
                      },
                      "items": {
                        "type": "object",
                        "required": [
                          "boxes"
                        ],
                        "additionalProperties": false,
                        "properties": {
                          "boxes": {
                            "type": "array",
                            "minItems": 1,
                            "maxItems": 40,
                            "items": {
                              "type": "array",
                              "minItems": 2,
                              "maxItems": 2,
                              "items": {
                                "type": "integer",
                                "minimum": 0
                              }
                            }
                          },
                          "powers": {
                            "type": "array",
                            "minItems": 1,
                            "items": {
                              "enum": [
                                "turbo",
                                "tiro",
                                "missil",
                                "armadilha",
                                "escudo"
                              ]
                            }
                          },
                          "respawn": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 30
                          }
                        }
                      },
                      "pads": {
                        "type": "array",
                        "maxItems": 16,
                        "items": {
                          "type": "object",
                          "required": [
                            "x",
                            "y",
                            "w",
                            "h"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "x": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "y": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "w": {
                              "type": "integer",
                              "minimum": 1
                            },
                            "h": {
                              "type": "integer",
                              "minimum": 1
                            }
                          }
                        }
                      },
                      "drift": {
                        "oneOf": [
                          {
                            "type": "boolean"
                          },
                          {
                            "enum": [
                              "hop"
                            ]
                          }
                        ],
                        "description": "true: hold the handbrake through a turn; \"hop\": hop into the slide, the stick tightens/opens the arc, swaying it charges the mini-turbo"
                      },
                      "rocketStart": {
                        "type": "boolean",
                        "description": "tap accelerate near the end of the countdown for a boost"
                      },
                      "nitro": {
                        "type": "boolean"
                      },
                      "catchUp": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 1
                      },
                      "placeVar": {
                        "type": "string"
                      }
                    }
                  },
                  "garage": {
                    "type": "object",
                    "additionalProperties": false,
                    "description": "on entering, the player picks the mode (when there are several), the ride, the track and the feel (needs ride)",
                    "properties": {
                      "rides": {
                        "type": "array",
                        "minItems": 1,
                        "uniqueItems": true,
                        "items": {
                          "enum": [
                            "carro",
                            "moto",
                            "aviao",
                            "cavalo",
                            "raptor",
                            "saltador",
                            "grifo",
                            "kart"
                          ]
                        }
                      },
                      "feels": {
                        "type": "array",
                        "minItems": 1,
                        "uniqueItems": true,
                        "items": {
                          "enum": [
                            "classico",
                            "simulador",
                            "esportivo",
                            "cidade",
                            "drift",
                            "kart"
                          ]
                        }
                      },
                      "tracks": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 8,
                        "items": {
                          "type": "object",
                          "required": [
                            "room",
                            "x",
                            "y"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "room": {
                              "type": "string"
                            },
                            "x": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "y": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "name": {
                              "type": "string",
                              "maxLength": 32
                            },
                            "about": {
                              "type": "string",
                              "maxLength": 120
                            },
                            "race": {
                              "type": "object",
                              "required": [
                                "checkpoints"
                              ],
                              "additionalProperties": false,
                              "description": "checkpoints in order (the first is the start and finish line), laps, the variable that gets the time",
                              "properties": {
                                "checkpoints": {
                                  "type": "array",
                                  "minItems": 2,
                                  "maxItems": 20,
                                  "items": {
                                    "type": "object",
                                    "required": [
                                      "region"
                                    ],
                                    "additionalProperties": false,
                                    "properties": {
                                      "region": {
                                        "type": "string"
                                      },
                                      "alt": {
                                        "type": "array",
                                        "minItems": 2,
                                        "maxItems": 2,
                                        "items": {
                                          "type": "number",
                                          "minimum": 0,
                                          "maximum": 400
                                        }
                                      }
                                    }
                                  }
                                },
                                "laps": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 10
                                },
                                "timeVar": {
                                  "type": "string"
                                },
                                "line": {
                                  "type": "array",
                                  "minItems": 3,
                                  "maxItems": 64,
                                  "description": "the racing line (cells, in order round the track): the rivals follow it and the places are measured on it",
                                  "items": {
                                    "type": "array",
                                    "minItems": 2,
                                    "maxItems": 2,
                                    "items": {
                                      "type": "integer",
                                      "minimum": 0
                                    }
                                  }
                                },
                                "rivals": {
                                  "type": "object",
                                  "required": [
                                    "count"
                                  ],
                                  "additionalProperties": false,
                                  "properties": {
                                    "count": {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 11
                                    },
                                    "ride": {
                                      "enum": [
                                        "carro",
                                        "moto",
                                        "aviao",
                                        "cavalo",
                                        "raptor",
                                        "saltador",
                                        "grifo",
                                        "kart"
                                      ]
                                    },
                                    "skill": {
                                      "type": "number",
                                      "minimum": 0,
                                      "maximum": 1
                                    },
                                    "names": {
                                      "type": "array",
                                      "maxItems": 16,
                                      "items": {
                                        "type": "string",
                                        "maxLength": 24
                                      }
                                    }
                                  }
                                },
                                "countdown": {
                                  "type": "integer",
                                  "minimum": 0,
                                  "maximum": 5
                                },
                                "items": {
                                  "type": "object",
                                  "required": [
                                    "boxes"
                                  ],
                                  "additionalProperties": false,
                                  "properties": {
                                    "boxes": {
                                      "type": "array",
                                      "minItems": 1,
                                      "maxItems": 40,
                                      "items": {
                                        "type": "array",
                                        "minItems": 2,
                                        "maxItems": 2,
                                        "items": {
                                          "type": "integer",
                                          "minimum": 0
                                        }
                                      }
                                    },
                                    "powers": {
                                      "type": "array",
                                      "minItems": 1,
                                      "items": {
                                        "enum": [
                                          "turbo",
                                          "tiro",
                                          "missil",
                                          "armadilha",
                                          "escudo"
                                        ]
                                      }
                                    },
                                    "respawn": {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 30
                                    }
                                  }
                                },
                                "pads": {
                                  "type": "array",
                                  "maxItems": 16,
                                  "items": {
                                    "type": "object",
                                    "required": [
                                      "x",
                                      "y",
                                      "w",
                                      "h"
                                    ],
                                    "additionalProperties": false,
                                    "properties": {
                                      "x": {
                                        "type": "integer",
                                        "minimum": 0
                                      },
                                      "y": {
                                        "type": "integer",
                                        "minimum": 0
                                      },
                                      "w": {
                                        "type": "integer",
                                        "minimum": 1
                                      },
                                      "h": {
                                        "type": "integer",
                                        "minimum": 1
                                      }
                                    }
                                  }
                                },
                                "drift": {
                                  "oneOf": [
                                    {
                                      "type": "boolean"
                                    },
                                    {
                                      "enum": [
                                        "hop"
                                      ]
                                    }
                                  ],
                                  "description": "true: hold the handbrake through a turn; \"hop\": hop into the slide, the stick tightens/opens the arc, swaying it charges the mini-turbo"
                                },
                                "rocketStart": {
                                  "type": "boolean",
                                  "description": "tap accelerate near the end of the countdown for a boost"
                                },
                                "nitro": {
                                  "type": "boolean"
                                },
                                "catchUp": {
                                  "type": "number",
                                  "minimum": 0,
                                  "maximum": 1
                                },
                                "placeVar": {
                                  "type": "string"
                                }
                              }
                            }
                          }
                        }
                      },
                      "modes": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 4,
                        "items": {
                          "type": "object",
                          "required": [
                            "name"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "id": {
                              "type": "string"
                            },
                            "name": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 32
                            },
                            "about": {
                              "type": "string",
                              "maxLength": 120
                            },
                            "rides": {
                              "type": "array",
                              "minItems": 1,
                              "uniqueItems": true,
                              "items": {
                                "enum": [
                                  "carro",
                                  "moto",
                                  "aviao",
                                  "cavalo",
                                  "raptor",
                                  "saltador",
                                  "grifo",
                                  "kart"
                                ]
                              }
                            },
                            "feels": {
                              "type": "array",
                              "minItems": 1,
                              "uniqueItems": true,
                              "items": {
                                "enum": [
                                  "classico",
                                  "simulador",
                                  "esportivo",
                                  "cidade",
                                  "drift",
                                  "kart"
                                ]
                              }
                            },
                            "tracks": {
                              "type": "array",
                              "minItems": 1,
                              "maxItems": 8,
                              "items": {
                                "type": "object",
                                "required": [
                                  "room",
                                  "x",
                                  "y"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "room": {
                                    "type": "string"
                                  },
                                  "x": {
                                    "type": "integer",
                                    "minimum": 0
                                  },
                                  "y": {
                                    "type": "integer",
                                    "minimum": 0
                                  },
                                  "name": {
                                    "type": "string",
                                    "maxLength": 32
                                  },
                                  "about": {
                                    "type": "string",
                                    "maxLength": 120
                                  },
                                  "race": {
                                    "type": "object",
                                    "required": [
                                      "checkpoints"
                                    ],
                                    "additionalProperties": false,
                                    "description": "checkpoints in order (the first is the start and finish line), laps, the variable that gets the time",
                                    "properties": {
                                      "checkpoints": {
                                        "type": "array",
                                        "minItems": 2,
                                        "maxItems": 20,
                                        "items": {
                                          "type": "object",
                                          "required": [
                                            "region"
                                          ],
                                          "additionalProperties": false,
                                          "properties": {
                                            "region": {
                                              "type": "string"
                                            },
                                            "alt": {
                                              "type": "array",
                                              "minItems": 2,
                                              "maxItems": 2,
                                              "items": {
                                                "type": "number",
                                                "minimum": 0,
                                                "maximum": 400
                                              }
                                            }
                                          }
                                        }
                                      },
                                      "laps": {
                                        "type": "integer",
                                        "minimum": 1,
                                        "maximum": 10
                                      },
                                      "timeVar": {
                                        "type": "string"
                                      },
                                      "line": {
                                        "type": "array",
                                        "minItems": 3,
                                        "maxItems": 64,
                                        "description": "the racing line (cells, in order round the track): the rivals follow it and the places are measured on it",
                                        "items": {
                                          "type": "array",
                                          "minItems": 2,
                                          "maxItems": 2,
                                          "items": {
                                            "type": "integer",
                                            "minimum": 0
                                          }
                                        }
                                      },
                                      "rivals": {
                                        "type": "object",
                                        "required": [
                                          "count"
                                        ],
                                        "additionalProperties": false,
                                        "properties": {
                                          "count": {
                                            "type": "integer",
                                            "minimum": 1,
                                            "maximum": 11
                                          },
                                          "ride": {
                                            "enum": [
                                              "carro",
                                              "moto",
                                              "aviao",
                                              "cavalo",
                                              "raptor",
                                              "saltador",
                                              "grifo",
                                              "kart"
                                            ]
                                          },
                                          "skill": {
                                            "type": "number",
                                            "minimum": 0,
                                            "maximum": 1
                                          },
                                          "names": {
                                            "type": "array",
                                            "maxItems": 16,
                                            "items": {
                                              "type": "string",
                                              "maxLength": 24
                                            }
                                          }
                                        }
                                      },
                                      "countdown": {
                                        "type": "integer",
                                        "minimum": 0,
                                        "maximum": 5
                                      },
                                      "items": {
                                        "type": "object",
                                        "required": [
                                          "boxes"
                                        ],
                                        "additionalProperties": false,
                                        "properties": {
                                          "boxes": {
                                            "type": "array",
                                            "minItems": 1,
                                            "maxItems": 40,
                                            "items": {
                                              "type": "array",
                                              "minItems": 2,
                                              "maxItems": 2,
                                              "items": {
                                                "type": "integer",
                                                "minimum": 0
                                              }
                                            }
                                          },
                                          "powers": {
                                            "type": "array",
                                            "minItems": 1,
                                            "items": {
                                              "enum": [
                                                "turbo",
                                                "tiro",
                                                "missil",
                                                "armadilha",
                                                "escudo"
                                              ]
                                            }
                                          },
                                          "respawn": {
                                            "type": "integer",
                                            "minimum": 1,
                                            "maximum": 30
                                          }
                                        }
                                      },
                                      "pads": {
                                        "type": "array",
                                        "maxItems": 16,
                                        "items": {
                                          "type": "object",
                                          "required": [
                                            "x",
                                            "y",
                                            "w",
                                            "h"
                                          ],
                                          "additionalProperties": false,
                                          "properties": {
                                            "x": {
                                              "type": "integer",
                                              "minimum": 0
                                            },
                                            "y": {
                                              "type": "integer",
                                              "minimum": 0
                                            },
                                            "w": {
                                              "type": "integer",
                                              "minimum": 1
                                            },
                                            "h": {
                                              "type": "integer",
                                              "minimum": 1
                                            }
                                          }
                                        }
                                      },
                                      "drift": {
                                        "oneOf": [
                                          {
                                            "type": "boolean"
                                          },
                                          {
                                            "enum": [
                                              "hop"
                                            ]
                                          }
                                        ],
                                        "description": "true: hold the handbrake through a turn; \"hop\": hop into the slide, the stick tightens/opens the arc, swaying it charges the mini-turbo"
                                      },
                                      "rocketStart": {
                                        "type": "boolean",
                                        "description": "tap accelerate near the end of the countdown for a boost"
                                      },
                                      "nitro": {
                                        "type": "boolean"
                                      },
                                      "catchUp": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 1
                                      },
                                      "placeVar": {
                                        "type": "string"
                                      }
                                    }
                                  }
                                }
                              }
                            },
                            "switch": {
                              "type": "array",
                              "minItems": 1,
                              "uniqueItems": true,
                              "items": {
                                "enum": [
                                  "carro",
                                  "moto",
                                  "aviao",
                                  "cavalo",
                                  "raptor",
                                  "saltador",
                                  "grifo",
                                  "kart"
                                ]
                              }
                            }
                          }
                        },
                        "description": "a mode is a kind of race (a plain race with every body, a kart race with rivals and items): its own bodies, tracks and feels; what it leaves out comes from the garage itself"
                      }
                    }
                  },
                  "gincana": {
                    "type": "object",
                    "required": [
                      "rivals",
                      "events"
                    ],
                    "additionalProperties": false,
                    "description": "a world of several events: three rivals, medals by place, the podium",
                    "properties": {
                      "rivals": {
                        "type": "array",
                        "minItems": 3,
                        "maxItems": 3,
                        "items": {
                          "type": "string",
                          "maxLength": 24
                        }
                      },
                      "medals": {
                        "type": "array",
                        "minItems": 4,
                        "maxItems": 4,
                        "items": {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 100
                        }
                      },
                      "events": {
                        "type": "array",
                        "minItems": 1,
                        "items": {
                          "type": "object",
                          "required": [
                            "id",
                            "name",
                            "room",
                            "unit",
                            "rivals"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "id": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_]{0,23}$"
                            },
                            "name": {
                              "type": "string",
                              "maxLength": 32
                            },
                            "room": {
                              "type": "string"
                            },
                            "unit": {
                              "type": "string",
                              "maxLength": 12
                            },
                            "lower": {
                              "type": "boolean"
                            },
                            "rivals": {
                              "type": "array",
                              "minItems": 2,
                              "maxItems": 2,
                              "items": {
                                "type": "number"
                              }
                            }
                          }
                        }
                      }
                    }
                  },
                  "lobby": {
                    "type": "object",
                    "additionalProperties": false,
                    "description": "the world opens on a match menu (alone, a room online, a friend's room; the court, the team, the bots' level, the length), then straight to the court; needs a room with a court",
                    "properties": {
                      "title": {
                        "type": "string",
                        "maxLength": 40
                      },
                      "courts": {
                        "type": "array",
                        "minItems": 1,
                        "uniqueItems": true,
                        "items": {
                          "type": "string"
                        }
                      },
                      "online": {
                        "type": "boolean"
                      },
                      "skills": {
                        "type": "boolean"
                      },
                      "lengths": {
                        "type": "boolean"
                      }
                    }
                  },
                  "pickCharacter": {
                    "type": "boolean",
                    "description": "on entering, the player picks or makes a character (list, name, look); without it the player goes straight in with the last one or a new plain one"
                  },
                  "views": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 3,
                    "uniqueItems": true,
                    "items": {
                      "enum": [
                        "top",
                        "third",
                        "first"
                      ]
                    },
                    "description": "the views the world may be played in (none: every view); a PvP world may want only first"
                  },
                  "safePocket": {
                    "type": "object",
                    "required": [
                      "cells"
                    ],
                    "additionalProperties": false,
                    "description": "a small space apart from the bag that a fall never empties",
                    "properties": {
                      "cells": {
                        "type": "array",
                        "minItems": 2,
                        "maxItems": 2,
                        "items": [
                          {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 4
                          },
                          {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 3
                          }
                        ]
                      }
                    }
                  },
                  "extraction": {
                    "type": "object",
                    "additionalProperties": false,
                    "description": "an expedition: falls with rescue (seconds), noise the creatures hear, near chat (m), a free kit",
                    "properties": {
                      "downed": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 60
                      },
                      "noise": {
                        "type": "boolean"
                      },
                      "nearChat": {
                        "type": "integer",
                        "minimum": 5,
                        "maximum": 60
                      },
                      "pace": {
                        "type": "number",
                        "minimum": 0.4,
                        "maximum": 1
                      },
                      "kit": {
                        "type": "object",
                        "required": [
                          "items",
                          "minutes"
                        ],
                        "additionalProperties": false,
                        "properties": {
                          "minutes": {
                            "type": "integer",
                            "minimum": 5,
                            "maximum": 1440
                          },
                          "items": {
                            "type": "array",
                            "minItems": 1,
                            "maxItems": 8,
                            "items": {
                              "type": "object",
                              "required": [
                                "item"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "item": {
                                  "type": "string",
                                  "pattern": "^item:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                },
                                "count": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 99
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  },
                  "floors": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 6,
                    "items": {
                      "type": "object",
                      "required": [
                        "id",
                        "name",
                        "pool",
                        "rooms"
                      ],
                      "properties": {
                        "id": {
                          "type": "string",
                          "pattern": "^[a-z][a-z0-9_]{0,23}$"
                        },
                        "name": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 32
                        },
                        "pool": {
                          "type": "string",
                          "pattern": "^[a-z][a-z0-9_]{0,23}$"
                        },
                        "rooms": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 8
                        },
                        "end": {
                          "type": "string"
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "teams": {
                    "type": "object",
                    "required": [
                      "size",
                      "max"
                    ],
                    "properties": {
                      "size": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 6
                      },
                      "max": {
                        "type": "integer",
                        "minimum": 2,
                        "maximum": 8
                      },
                      "stagger": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 120
                      },
                      "kitBands": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 3,
                        "items": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 1000000000
                        }
                      }
                    },
                    "additionalProperties": false
                  },
                  "inventory": {
                    "type": "object",
                    "required": [
                      "cols",
                      "rows"
                    ],
                    "properties": {
                      "cols": {
                        "type": "integer",
                        "minimum": 4,
                        "maximum": 16
                      },
                      "rows": {
                        "type": "integer",
                        "minimum": 3,
                        "maximum": 12
                      }
                    },
                    "additionalProperties": false
                  },
                  "rules": {
                    "type": "object",
                    "required": [
                      "rules"
                    ],
                    "properties": {
                      "vars": {
                        "type": "object",
                        "maxProperties": 40,
                        "propertyNames": {
                          "pattern": "^[a-z][a-z0-9_]{0,23}$"
                        },
                        "additionalProperties": {
                          "type": [
                            "number",
                            "string",
                            "boolean"
                          ]
                        }
                      },
                      "rules": {
                        "type": "array",
                        "maxItems": 60,
                        "items": {
                          "type": "object",
                          "required": [
                            "id",
                            "on",
                            "do"
                          ],
                          "properties": {
                            "id": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_]{0,23}$"
                            },
                            "once": {
                              "type": "boolean"
                            },
                            "on": {
                              "type": "object",
                              "required": [
                                "kind"
                              ],
                              "properties": {
                                "kind": {
                                  "enum": [
                                    "start",
                                    "enterRoom",
                                    "enterRegion",
                                    "unitDies",
                                    "groupCleared",
                                    "timer",
                                    "every",
                                    "playerDies",
                                    "itemTaken",
                                    "enterScreen",
                                    "screenCleared",
                                    "talk",
                                    "teamOut",
                                    "enterFloor",
                                    "healthBelow",
                                    "extracted",
                                    "ballInGoal",
                                    "matchOver",
                                    "structureDown",
                                    "waveSpawn",
                                    "waveStart",
                                    "waveCleared",
                                    "leak",
                                    "towerBuilt",
                                    "boardTurn",
                                    "landed",
                                    "boardEvent",
                                    "trophyBought",
                                    "lastTurns",
                                    "boardOver",
                                    "itemUsed",
                                    "trialStart",
                                    "trialOver",
                                    "cycleChange",
                                    "rogue",
                                    "defenseWon",
                                    "defenseLost",
                                    "send",
                                    "towerDown",
                                    "flagTaken",
                                    "flagDropped",
                                    "flagReturned",
                                    "flagCaptured",
                                    "pointCaptured",
                                    "roundStart",
                                    "roundOver",
                                    "battleOver",
                                    "arenaStart",
                                    "arenaOver",
                                    "cinemaOver",
                                    "checkpoint",
                                    "lap",
                                    "raceFinished"
                                  ]
                                },
                                "arg": {
                                  "type": [
                                    "string",
                                    "number"
                                  ]
                                },
                                "pct": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 99,
                                  "description": "healthBelow: the % of life"
                                }
                              },
                              "additionalProperties": false
                            },
                            "if": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "required": [
                                  "kind"
                                ],
                                "properties": {
                                  "kind": {
                                    "enum": [
                                      "var",
                                      "alive",
                                      "hasItem",
                                      "elapsed",
                                      "teamAlive",
                                      "lifeLead",
                                      "hasMoney",
                                      "score",
                                      "onScreen",
                                      "teamScore",
                                      "lives",
                                      "defenseWave",
                                      "turnsLeft",
                                      "boardCoins",
                                      "trophies",
                                      "onSpace",
                                      "arena"
                                    ]
                                  },
                                  "op": {
                                    "enum": [
                                      "=",
                                      "!=",
                                      ">",
                                      ">=",
                                      "<",
                                      "<="
                                    ]
                                  }
                                }
                              }
                            },
                            "do": {
                              "type": "array",
                              "minItems": 1,
                              "maxItems": 40,
                              "items": {
                                "type": "object",
                                "required": [
                                  "kind"
                                ],
                                "properties": {
                                  "kind": {
                                    "enum": [
                                      "setVar",
                                      "showText",
                                      "startTimer",
                                      "stopTimer",
                                      "spawnGroup",
                                      "openGate",
                                      "closeGate",
                                      "giveItem",
                                      "takeItem",
                                      "goToRoom",
                                      "endSession",
                                      "offerChoice",
                                      "if",
                                      "random",
                                      "setObjective",
                                      "completeObjective",
                                      "takeAllItems",
                                      "lockScreen",
                                      "unlockScreen",
                                      "setMechanic",
                                      "spawnAt",
                                      "grantMove",
                                      "dialog",
                                      "giveXp",
                                      "giveMoney",
                                      "assignTeams",
                                      "restorePlayers",
                                      "setRespawn",
                                      "newRun",
                                      "castOnPlayers",
                                      "takeMoney",
                                      "station",
                                      "setStage",
                                      "fog",
                                      "loudNoise",
                                      "showExit",
                                      "hideExit",
                                      "awardPoint",
                                      "resetKickoff",
                                      "eventResult",
                                      "showPodium",
                                      "spawnWave",
                                      "grantTeamBuff",
                                      "giveGold",
                                      "addLives",
                                      "callWave",
                                      "giveCoins",
                                      "giveBoardItem",
                                      "boardMove",
                                      "boardWarp",
                                      "setGate",
                                      "moveAltar",
                                      "setSpaceKind",
                                      "setWeather",
                                      "addTeamScore",
                                      "playCinematic",
                                      "grantAchievement",
                                      "addStat",
                                      "startEvent"
                                    ]
                                  },
                                  "if": {
                                    "type": "array",
                                    "items": {
                                      "type": "object",
                                      "required": [
                                        "kind"
                                      ],
                                      "properties": {
                                        "kind": {
                                          "enum": [
                                            "var",
                                            "alive",
                                            "hasItem",
                                            "elapsed",
                                            "teamAlive",
                                            "lifeLead",
                                            "hasMoney",
                                            "score",
                                            "onScreen",
                                            "teamScore",
                                            "lives",
                                            "defenseWave",
                                            "turnsLeft",
                                            "boardCoins",
                                            "trophies",
                                            "onSpace",
                                            "arena"
                                          ]
                                        },
                                        "op": {
                                          "enum": [
                                            "=",
                                            "!=",
                                            ">",
                                            ">=",
                                            "<",
                                            "<="
                                          ]
                                        }
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          },
                          "additionalProperties": false
                        }
                      }
                    },
                    "additionalProperties": false
                  },
                  "quests": {
                    "type": "array",
                    "maxItems": 200,
                    "description": "the world's quests: who gives them, what they ask, what they pay (rooms maps only)",
                    "items": {
                      "type": "object",
                      "required": [
                        "id",
                        "name",
                        "giver",
                        "text",
                        "objectives"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "id": {
                          "type": "string",
                          "pattern": "^[a-z][a-z0-9_]{0,23}$"
                        },
                        "name": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 40
                        },
                        "giver": {
                          "type": "string",
                          "pattern": "^[a-z][a-z0-9_]{0,23}$"
                        },
                        "turnIn": {
                          "type": "string",
                          "pattern": "^[a-z][a-z0-9_]{0,23}$"
                        },
                        "level": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 100
                        },
                        "minLevel": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 100
                        },
                        "requires": {
                          "type": "array",
                          "minItems": 1,
                          "maxItems": 3,
                          "uniqueItems": true,
                          "items": {
                            "type": "string",
                            "pattern": "^[a-z][a-z0-9_]{0,23}$"
                          }
                        },
                        "repeat": {
                          "enum": [
                            "daily",
                            "weekly"
                          ]
                        },
                        "text": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 400
                        },
                        "progressText": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 400
                        },
                        "doneText": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 400
                        },
                        "where": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 120
                        },
                        "cinematic": {
                          "type": "object",
                          "required": [
                            "id"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "id": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_]{0,23}$"
                            },
                            "when": {
                              "enum": [
                                "accept",
                                "turnIn",
                                "complete"
                              ]
                            }
                          },
                          "description": "a scene of the map's cinematics that plays when the quest is accepted (default), handed in or completed"
                        },
                        "objectives": {
                          "type": "array",
                          "minItems": 1,
                          "maxItems": 4,
                          "items": {
                            "oneOf": [
                              {
                                "type": "object",
                                "required": [
                                  "type",
                                  "creature",
                                  "count"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "type": {
                                    "const": "kill"
                                  },
                                  "creature": {
                                    "type": "string",
                                    "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                  },
                                  "count": {
                                    "type": "integer",
                                    "minimum": 1,
                                    "maximum": 99
                                  },
                                  "label": {
                                    "type": "string",
                                    "minLength": 1,
                                    "maxLength": 60
                                  }
                                }
                              },
                              {
                                "type": "object",
                                "required": [
                                  "type",
                                  "item",
                                  "count"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "type": {
                                    "const": "collect"
                                  },
                                  "item": {
                                    "type": "string",
                                    "pattern": "^item:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                  },
                                  "count": {
                                    "type": "integer",
                                    "minimum": 1,
                                    "maximum": 99
                                  },
                                  "label": {
                                    "type": "string",
                                    "minLength": 1,
                                    "maxLength": 60
                                  }
                                }
                              },
                              {
                                "type": "object",
                                "required": [
                                  "type",
                                  "npc"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "type": {
                                    "const": "talk"
                                  },
                                  "npc": {
                                    "type": "string",
                                    "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                  },
                                  "says": {
                                    "type": "string",
                                    "minLength": 1,
                                    "maxLength": 200
                                  },
                                  "label": {
                                    "type": "string",
                                    "minLength": 1,
                                    "maxLength": 60
                                  }
                                }
                              },
                              {
                                "type": "object",
                                "required": [
                                  "type",
                                  "region"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "type": {
                                    "const": "reach"
                                  },
                                  "region": {
                                    "type": "string",
                                    "pattern": "^[^/]+/[^/]+$"
                                  },
                                  "label": {
                                    "type": "string",
                                    "minLength": 1,
                                    "maxLength": 60
                                  }
                                }
                              }
                            ]
                          }
                        },
                        "rewards": {
                          "type": "object",
                          "additionalProperties": false,
                          "properties": {
                            "xp": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 100000
                            },
                            "money": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 1000000
                            },
                            "items": {
                              "type": "array",
                              "minItems": 1,
                              "maxItems": 4,
                              "items": {
                                "type": "string",
                                "pattern": "^item:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                              }
                            },
                            "choice": {
                              "type": "array",
                              "minItems": 2,
                              "maxItems": 4,
                              "items": {
                                "type": "string",
                                "pattern": "^item:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                              }
                            },
                            "spells": {
                              "type": "array",
                              "minItems": 1,
                              "maxItems": 2,
                              "items": {
                                "type": "string",
                                "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                              }
                            }
                          }
                        }
                      }
                    }
                  },
                  "cinematics": {
                    "type": "array",
                    "maxItems": 24,
                    "description": "scenes in which the player can neither walk, attack nor cast, only watch or skip (rooms maps only); a rule's playCinematic, a quest's cinematic or a trigger starts one",
                    "items": {
                      "type": "object",
                      "required": [
                        "id",
                        "steps"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "id": {
                          "type": "string",
                          "pattern": "^[a-z][a-z0-9_]{0,23}$"
                        },
                        "skippable": {
                          "type": "boolean"
                        },
                        "lock": {
                          "type": "boolean"
                        },
                        "bars": {
                          "type": "boolean"
                        },
                        "hud": {
                          "enum": [
                            "hide",
                            "show"
                          ]
                        },
                        "repeatable": {
                          "type": "boolean"
                        },
                        "scope": {
                          "enum": [
                            "self",
                            "group"
                          ]
                        },
                        "radius": {
                          "type": "number",
                          "minimum": 5,
                          "maximum": 200
                        },
                        "scene": {
                          "type": "string",
                          "description": "the room it belongs to (left out: every room)"
                        },
                        "trigger": {
                          "type": "object",
                          "required": [
                            "kind"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "kind": {
                              "enum": [
                                "region",
                                "scene"
                              ]
                            },
                            "region": {
                              "type": "string",
                              "pattern": "^[^/]+/[^/]+$"
                            },
                            "delay": {
                              "type": "number",
                              "minimum": 0,
                              "maximum": 60
                            }
                          }
                        },
                        "steps": {
                          "type": "array",
                          "minItems": 1,
                          "maxItems": 60,
                          "items": {
                            "oneOf": [
                              {
                                "type": "object",
                                "required": [
                                  "kind"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "kind": {
                                    "const": "camera"
                                  },
                                  "at": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 120,
                                    "description": "seconds from the start of the scene; left out: right after the previous step"
                                  },
                                  "wait": {
                                    "type": "boolean",
                                    "description": "does the next step wait for this one to end?"
                                  },
                                  "focus": {
                                    "oneOf": [
                                      {
                                        "type": "string",
                                        "description": "'player', the id of a character of the map (its npcs), a tag, or a figure the scene brings (spawn)"
                                      },
                                      {
                                        "type": "array",
                                        "minItems": 2,
                                        "maxItems": 2,
                                        "items": {
                                          "type": "number"
                                        }
                                      }
                                    ]
                                  },
                                  "yaw": {
                                    "type": "number",
                                    "minimum": -720,
                                    "maximum": 720
                                  },
                                  "pitch": {
                                    "type": "number",
                                    "minimum": 5,
                                    "maximum": 85
                                  },
                                  "dist": {
                                    "type": "number",
                                    "minimum": 3,
                                    "maximum": 80
                                  },
                                  "height": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 30
                                  },
                                  "zoom": {
                                    "type": "number",
                                    "minimum": 0.4,
                                    "maximum": 2.5
                                  },
                                  "dur": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 30
                                  },
                                  "ease": {
                                    "enum": [
                                      "linear",
                                      "in",
                                      "out",
                                      "inout"
                                    ]
                                  }
                                }
                              },
                              {
                                "type": "object",
                                "required": [
                                  "kind",
                                  "who",
                                  "to",
                                  "dur"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "kind": {
                                    "const": "move"
                                  },
                                  "at": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 120,
                                    "description": "seconds from the start of the scene; left out: right after the previous step"
                                  },
                                  "wait": {
                                    "type": "boolean",
                                    "description": "does the next step wait for this one to end?"
                                  },
                                  "who": {
                                    "type": "string",
                                    "description": "'player', the id of a character of the map (its npcs), a tag, or a figure the scene brings (spawn)"
                                  },
                                  "to": {
                                    "type": "array",
                                    "minItems": 2,
                                    "maxItems": 2,
                                    "items": {
                                      "type": "number"
                                    }
                                  },
                                  "dur": {
                                    "type": "number",
                                    "minimum": 0.2,
                                    "maximum": 60
                                  }
                                }
                              },
                              {
                                "type": "object",
                                "required": [
                                  "kind",
                                  "who",
                                  "to"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "kind": {
                                    "const": "face"
                                  },
                                  "at": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 120,
                                    "description": "seconds from the start of the scene; left out: right after the previous step"
                                  },
                                  "wait": {
                                    "type": "boolean",
                                    "description": "does the next step wait for this one to end?"
                                  },
                                  "who": {
                                    "type": "string",
                                    "description": "'player', the id of a character of the map (its npcs), a tag, or a figure the scene brings (spawn)"
                                  },
                                  "to": {
                                    "oneOf": [
                                      {
                                        "type": "string",
                                        "description": "'player', the id of a character of the map (its npcs), a tag, or a figure the scene brings (spawn)"
                                      },
                                      {
                                        "type": "array",
                                        "minItems": 2,
                                        "maxItems": 2,
                                        "items": {
                                          "type": "number"
                                        }
                                      }
                                    ]
                                  }
                                }
                              },
                              {
                                "type": "object",
                                "required": [
                                  "kind",
                                  "text"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "kind": {
                                    "const": "say"
                                  },
                                  "at": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 120,
                                    "description": "seconds from the start of the scene; left out: right after the previous step"
                                  },
                                  "wait": {
                                    "type": "boolean",
                                    "description": "does the next step wait for this one to end?"
                                  },
                                  "who": {
                                    "type": "string",
                                    "description": "'player', the id of a character of the map (its npcs), a tag, or a figure the scene brings (spawn)"
                                  },
                                  "name": {
                                    "type": "string",
                                    "maxLength": 32
                                  },
                                  "text": {
                                    "type": "string",
                                    "minLength": 1,
                                    "maxLength": 160
                                  },
                                  "dur": {
                                    "type": "number",
                                    "minimum": 0.5,
                                    "maximum": 30
                                  }
                                }
                              },
                              {
                                "type": "object",
                                "required": [
                                  "kind",
                                  "who",
                                  "anim"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "kind": {
                                    "const": "play"
                                  },
                                  "at": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 120,
                                    "description": "seconds from the start of the scene; left out: right after the previous step"
                                  },
                                  "wait": {
                                    "type": "boolean",
                                    "description": "does the next step wait for this one to end?"
                                  },
                                  "who": {
                                    "type": "string",
                                    "description": "'player', the id of a character of the map (its npcs), a tag, or a figure the scene brings (spawn)"
                                  },
                                  "anim": {
                                    "enum": [
                                      "talk",
                                      "interact",
                                      "pray",
                                      "kneel",
                                      "drink",
                                      "roar",
                                      "swing",
                                      "strike",
                                      "throw",
                                      "slam",
                                      "shield",
                                      "cast"
                                    ]
                                  },
                                  "dur": {
                                    "type": "number",
                                    "minimum": 0.3,
                                    "maximum": 20
                                  }
                                }
                              },
                              {
                                "type": "object",
                                "required": [
                                  "kind",
                                  "id",
                                  "pos"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "kind": {
                                    "const": "spawn"
                                  },
                                  "at": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 120,
                                    "description": "seconds from the start of the scene; left out: right after the previous step"
                                  },
                                  "wait": {
                                    "type": "boolean",
                                    "description": "does the next step wait for this one to end?"
                                  },
                                  "id": {
                                    "type": "string",
                                    "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                  },
                                  "pos": {
                                    "type": "array",
                                    "minItems": 2,
                                    "maxItems": 2,
                                    "items": {
                                      "type": "number"
                                    }
                                  },
                                  "look": {
                                    "type": "string"
                                  },
                                  "name": {
                                    "type": "string",
                                    "maxLength": 32
                                  },
                                  "creature": {
                                    "type": "string",
                                    "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                  },
                                  "facing": {
                                    "type": "number"
                                  },
                                  "tag": {
                                    "type": "string",
                                    "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                  },
                                  "keep": {
                                    "type": "boolean"
                                  }
                                }
                              },
                              {
                                "type": "object",
                                "required": [
                                  "kind",
                                  "who"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "kind": {
                                    "const": "despawn"
                                  },
                                  "at": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 120,
                                    "description": "seconds from the start of the scene; left out: right after the previous step"
                                  },
                                  "wait": {
                                    "type": "boolean",
                                    "description": "does the next step wait for this one to end?"
                                  },
                                  "who": {
                                    "type": "string",
                                    "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                  }
                                }
                              },
                              {
                                "type": "object",
                                "required": [
                                  "kind",
                                  "dur"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "kind": {
                                    "const": "wait"
                                  },
                                  "at": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 120,
                                    "description": "seconds from the start of the scene; left out: right after the previous step"
                                  },
                                  "wait": {
                                    "type": "boolean",
                                    "description": "does the next step wait for this one to end?"
                                  },
                                  "dur": {
                                    "type": "number",
                                    "minimum": 0.1,
                                    "maximum": 60
                                  }
                                }
                              },
                              {
                                "type": "object",
                                "required": [
                                  "kind",
                                  "to"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "kind": {
                                    "const": "fade"
                                  },
                                  "at": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 120,
                                    "description": "seconds from the start of the scene; left out: right after the previous step"
                                  },
                                  "wait": {
                                    "type": "boolean",
                                    "description": "does the next step wait for this one to end?"
                                  },
                                  "to": {
                                    "enum": [
                                      "black",
                                      "clear"
                                    ]
                                  },
                                  "dur": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 20
                                  }
                                }
                              },
                              {
                                "type": "object",
                                "required": [
                                  "kind",
                                  "weather"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "kind": {
                                    "const": "weather"
                                  },
                                  "at": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 120,
                                    "description": "seconds from the start of the scene; left out: right after the previous step"
                                  },
                                  "wait": {
                                    "type": "boolean",
                                    "description": "does the next step wait for this one to end?"
                                  },
                                  "weather": {
                                    "enum": [
                                      "clear",
                                      "rain",
                                      "storm",
                                      "fog",
                                      "sand",
                                      "ash",
                                      "mist"
                                    ]
                                  }
                                }
                              },
                              {
                                "type": "object",
                                "required": [
                                  "kind",
                                  "region",
                                  "dps"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "kind": {
                                    "const": "fog"
                                  },
                                  "at": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 120,
                                    "description": "seconds from the start of the scene; left out: right after the previous step"
                                  },
                                  "wait": {
                                    "type": "boolean",
                                    "description": "does the next step wait for this one to end?"
                                  },
                                  "region": {
                                    "type": "string",
                                    "pattern": "^[^/]+/[^/]+$"
                                  },
                                  "dps": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 500
                                  }
                                }
                              },
                              {
                                "type": "object",
                                "required": [
                                  "kind",
                                  "sound"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "kind": {
                                    "const": "sound"
                                  },
                                  "at": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 120,
                                    "description": "seconds from the start of the scene; left out: right after the previous step"
                                  },
                                  "wait": {
                                    "type": "boolean",
                                    "description": "does the next step wait for this one to end?"
                                  },
                                  "sound": {
                                    "type": "string"
                                  },
                                  "vol": {
                                    "type": "number",
                                    "minimum": 0.05,
                                    "maximum": 1
                                  }
                                }
                              }
                            ]
                          }
                        },
                        "then": {
                          "type": "array",
                          "maxItems": 12,
                          "description": "rule actions that run when the scene ends (watched or skipped)",
                          "items": {
                            "type": "object",
                            "required": [
                              "kind"
                            ]
                          }
                        }
                      }
                    }
                  },
                  "battle": {
                    "type": "object",
                    "required": [
                      "room"
                    ],
                    "additionalProperties": false,
                    "description": "a team match in one room (PvP on): flags, control points or rounds, with bots filling the teams",
                    "properties": {
                      "room": {
                        "type": "string"
                      },
                      "ffa": {
                        "type": "object",
                        "required": [
                          "players",
                          "x",
                          "y",
                          "radius"
                        ],
                        "additionalProperties": false,
                        "description": "every one for themselves: the places on a circle, teams p1…pN of one fighter each (leave teams, size and bases out)",
                        "properties": {
                          "players": {
                            "type": "integer",
                            "minimum": 2,
                            "maximum": 8
                          },
                          "x": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "y": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "radius": {
                            "type": "integer",
                            "minimum": 2,
                            "maximum": 20
                          },
                          "group": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 4,
                            "description": "fighters a side (2: duos…): players ÷ group sides p1…, each at its own base; at the arena table each player takes a place in a side (an empty one is a bot)"
                          }
                        }
                      },
                      "sizes": {
                        "type": "array",
                        "minItems": 2,
                        "maxItems": 4,
                        "items": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 8
                        },
                        "description": "fighters each team has, by team (instead of one size for all): a few strong against many"
                      },
                      "botSpells": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 8,
                        "uniqueItems": true,
                        "items": {
                          "type": "string",
                          "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                        },
                        "description": "spells of the project the bots cast at who they fight, in turn, when the target is in range"
                      },
                      "looks": {
                        "type": "array",
                        "minItems": 2,
                        "items": {
                          "type": "string",
                          "pattern": "^(lay:[a-z0-9_]+:[A-Za-z0-9_.~|-]{0,1180}|[a-z][a-z0-9_]{1,40})$"
                        },
                        "description": "the look of each team's bots, by team: a layered look of the RPG art (lay:rpg:…) or the name of a look"
                      },
                      "objective": {
                        "type": "object",
                        "required": [
                          "team",
                          "x",
                          "y",
                          "creature",
                          "hp"
                        ],
                        "additionalProperties": false,
                        "description": "a structure of a team (a creature that stands still) the others must bring down before its team holds out `time` seconds",
                        "properties": {
                          "team": {
                            "type": "string",
                            "pattern": "^[a-z][a-z0-9_]{0,23}$"
                          },
                          "x": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "y": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "creature": {
                            "type": "string",
                            "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                          },
                          "hp": {
                            "type": "integer",
                            "minimum": 100,
                            "maximum": 200000
                          },
                          "time": {
                            "type": "integer",
                            "minimum": 30,
                            "maximum": 3600
                          },
                          "model": {
                            "enum": [
                              "tower",
                              "inhibitor",
                              "heart"
                            ]
                          }
                        }
                      },
                      "build": {
                        "type": "object",
                        "required": [
                          "teams",
                          "items"
                        ],
                        "additionalProperties": false,
                        "description": "what some teams may build where their players stand, with the shop's gold",
                        "properties": {
                          "teams": {
                            "type": "array",
                            "minItems": 1,
                            "maxItems": 4,
                            "items": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_]{0,23}$"
                            }
                          },
                          "limit": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 40
                          },
                          "income": {
                            "type": "object",
                            "required": [
                              "gold",
                              "every"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "gold": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 500
                              },
                              "every": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 60
                              }
                            }
                          },
                          "items": {
                            "type": "array",
                            "minItems": 1,
                            "maxItems": 8,
                            "items": {
                              "type": "object",
                              "required": [
                                "id",
                                "name",
                                "cost",
                                "hp",
                                "creature"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "id": {
                                  "type": "string",
                                  "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                },
                                "name": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 40
                                },
                                "about": {
                                  "type": "string",
                                  "maxLength": 160
                                },
                                "cost": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 9999
                                },
                                "hp": {
                                  "type": "integer",
                                  "minimum": 20,
                                  "maximum": 50000
                                },
                                "creature": {
                                  "type": "string",
                                  "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                },
                                "model": {
                                  "enum": [
                                    "tower",
                                    "inhibitor",
                                    "heart"
                                  ]
                                },
                                "attack": {
                                  "type": "object",
                                  "required": [
                                    "range",
                                    "dmg",
                                    "rate"
                                  ],
                                  "additionalProperties": false,
                                  "properties": {
                                    "range": {
                                      "type": "number",
                                      "minimum": 3,
                                      "maximum": 30
                                    },
                                    "dmg": {
                                      "type": "number",
                                      "minimum": 1,
                                      "maximum": 2000
                                    },
                                    "rate": {
                                      "type": "number",
                                      "minimum": 0.2,
                                      "maximum": 4
                                    },
                                    "school": {
                                      "type": "string"
                                    }
                                  }
                                },
                                "heal": {
                                  "type": "object",
                                  "required": [
                                    "range",
                                    "amount",
                                    "rate"
                                  ],
                                  "additionalProperties": false,
                                  "properties": {
                                    "range": {
                                      "type": "number",
                                      "minimum": 3,
                                      "maximum": 30
                                    },
                                    "amount": {
                                      "type": "number",
                                      "minimum": 1,
                                      "maximum": 500
                                    },
                                    "rate": {
                                      "type": "number",
                                      "minimum": 0.2,
                                      "maximum": 4
                                    }
                                  }
                                },
                                "income": {
                                  "type": "object",
                                  "required": [
                                    "gold",
                                    "every"
                                  ],
                                  "additionalProperties": false,
                                  "properties": {
                                    "gold": {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 500
                                    },
                                    "every": {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 60
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      },
                      "ring": {
                        "type": "object",
                        "required": [
                          "x",
                          "y",
                          "radius",
                          "to",
                          "seconds"
                        ],
                        "additionalProperties": false,
                        "description": "a safe circle that shrinks over each round and hurts whoever stays outside",
                        "properties": {
                          "x": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "y": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "radius": {
                            "type": "integer",
                            "minimum": 3,
                            "maximum": 40
                          },
                          "to": {
                            "type": "integer",
                            "minimum": 1
                          },
                          "delay": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 300
                          },
                          "seconds": {
                            "type": "integer",
                            "minimum": 5,
                            "maximum": 900
                          },
                          "dps": {
                            "type": "number",
                            "minimum": 1,
                            "maximum": 50
                          },
                          "ramp": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 20,
                            "description": "% of life a second more for every second a fighter already burned outside the ring this round"
                          }
                        }
                      },
                      "lobby": {
                        "type": "object",
                        "required": [
                          "seconds"
                        ],
                        "additionalProperties": false,
                        "description": "before the first round: the players are in and held, the tutorial shows first and then the shop, and the round begins after `seconds` or when every human says ready",
                        "properties": {
                          "seconds": {
                            "type": "integer",
                            "minimum": 5,
                            "maximum": 300
                          },
                          "tutorial": {
                            "type": "object",
                            "required": [
                              "pages"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "pages": {
                                "type": "array",
                                "minItems": 1,
                                "maxItems": 8,
                                "items": {
                                  "type": "object",
                                  "required": [
                                    "title",
                                    "text"
                                  ],
                                  "additionalProperties": false,
                                  "properties": {
                                    "image": {
                                      "type": "string",
                                      "pattern": "^art\\/[a-z0-9_\\/-]{1,80}\\.(png|webp|jpg)$",
                                      "description": "a picture of the game’s art (art/….png)"
                                    },
                                    "diagram": {
                                      "enum": [
                                        "elements"
                                      ],
                                      "description": "a diagram the engine draws from the rules: elements = the wheels of the elements"
                                    },
                                    "title": {
                                      "type": "string",
                                      "minLength": 1,
                                      "maxLength": 40
                                    },
                                    "text": {
                                      "type": "string",
                                      "minLength": 1,
                                      "maxLength": 700
                                    },
                                    "touch": {
                                      "type": "string",
                                      "minLength": 1,
                                      "maxLength": 700,
                                      "description": "other words for a touch screen (a phone): the controls page says how to play with the thumbs"
                                    },
                                    "pad": {
                                      "type": "string",
                                      "minLength": 1,
                                      "maxLength": 700,
                                      "description": "other words when a controller is used (a Steam Deck)"
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      },
                      "shotSpeed": {
                        "type": "number",
                        "minimum": 0.3,
                        "maximum": 2,
                        "description": "how fast every spell shot flies in the match, a multiplier (0.7: 30% slower)"
                      },
                      "moveSpeed": {
                        "type": "number",
                        "minimum": 0.2,
                        "maximum": 1.5,
                        "description": "how fast everyone in the match walks, a multiplier (0.5: half the speed)"
                      },
                      "hazards": {
                        "type": "array",
                        "maxItems": 16,
                        "description": "the room’s hazards, always there",
                        "items": {
                          "type": "object",
                          "required": [
                            "kind",
                            "x",
                            "y"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "kind": {
                              "enum": [
                                "vortex",
                                "water",
                                "lava",
                                "ice",
                                "wind",
                                "current",
                                "geyser",
                                "rocks",
                                "lightning",
                                "quicksand",
                                "bumper",
                                "blade"
                              ]
                            },
                            "x": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "y": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "radius": {
                              "type": "number",
                              "minimum": 1,
                              "maximum": 30
                            },
                            "w": {
                              "type": "number",
                              "minimum": 1,
                              "maximum": 60
                            },
                            "h": {
                              "type": "number",
                              "minimum": 1,
                              "maximum": 60
                            },
                            "dir": {
                              "type": "number",
                              "minimum": -360,
                              "maximum": 360
                            },
                            "power": {
                              "type": "number",
                              "minimum": 0.5,
                              "maximum": 40
                            },
                            "every": {
                              "type": "number",
                              "minimum": 1,
                              "maximum": 60
                            },
                            "orbit": {
                              "type": "number",
                              "minimum": 0,
                              "maximum": 20
                            },
                            "stun": {
                              "type": "number",
                              "minimum": 0.2,
                              "maximum": 4,
                              "description": "a strike (geyser, rocks, lightning) stuns whoever it hits, seconds"
                            },
                            "slow": {
                              "type": "number",
                              "minimum": 0.5,
                              "maximum": 8,
                              "description": "a strike slows whoever it hits by half, seconds"
                            }
                          }
                        }
                      },
                      "chests": {
                        "type": "object",
                        "additionalProperties": false,
                        "description": "chests that come up during the fight: hold the use key (F) by one to open it, gold and the shop’s gear into the match’s bag; with keep, a vault for the winner",
                        "properties": {
                          "every": {
                            "type": "number",
                            "minimum": 5,
                            "maximum": 300,
                            "description": "seconds between two chances of a chest (default 25)"
                          },
                          "chance": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 100,
                            "description": "% of each chance that one comes up (default 60)"
                          },
                          "max": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 6,
                            "description": "chests on the floor at once"
                          },
                          "hold": {
                            "type": "number",
                            "minimum": 1,
                            "maximum": 15,
                            "description": "seconds the use key is held, standing still and taking no damage (default 5)"
                          },
                          "reach": {
                            "type": "number",
                            "minimum": 0.5,
                            "maximum": 4,
                            "description": "how near one stands to open it (cells)"
                          },
                          "at": {
                            "type": "array",
                            "minItems": 1,
                            "maxItems": 16,
                            "items": {
                              "type": "array",
                              "minItems": 2,
                              "maxItems": 2,
                              "items": {
                                "type": "integer",
                                "minimum": 0
                              }
                            },
                            "description": "floor cells where they may come up (left out: anywhere inside the ring, or near the middle)"
                          },
                          "gold": {
                            "type": "array",
                            "minItems": 2,
                            "maxItems": 2,
                            "items": {
                              "type": "integer",
                              "minimum": 0,
                              "maximum": 9999
                            },
                            "description": "[least, most] gold found"
                          },
                          "items": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 100,
                            "description": "% that a piece of the shop’s gear comes with the gold (default 35)"
                          },
                          "rarity": {
                            "type": "object",
                            "additionalProperties": false,
                            "description": "the gear’s rarity by weight (the shop’s items without a rarity are common)",
                            "properties": {
                              "common": {
                                "type": "number",
                                "minimum": 0,
                                "maximum": 1000
                              },
                              "rare": {
                                "type": "number",
                                "minimum": 0,
                                "maximum": 1000
                              },
                              "epic": {
                                "type": "number",
                                "minimum": 0,
                                "maximum": 1000
                              },
                              "legendary": {
                                "type": "number",
                                "minimum": 0,
                                "maximum": 1000
                              }
                            }
                          },
                          "locked": {
                            "type": "object",
                            "additionalProperties": false,
                            "description": "a chest that comes up locked: only a key opens it, and it holds more",
                            "properties": {
                              "chance": {
                                "type": "number",
                                "minimum": 0,
                                "maximum": 100,
                                "description": "% that a chest comes up locked"
                              },
                              "gold": {
                                "type": "array",
                                "minItems": 2,
                                "maxItems": 2,
                                "items": {
                                  "type": "integer",
                                  "minimum": 0,
                                  "maximum": 9999
                                },
                                "description": "[least, most] gold found"
                              },
                              "items": {
                                "type": "number",
                                "minimum": 0,
                                "maximum": 100
                              },
                              "rarity": {
                                "type": "object",
                                "additionalProperties": false,
                                "description": "the gear’s rarity by weight (the shop’s items without a rarity are common)",
                                "properties": {
                                  "common": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 1000
                                  },
                                  "rare": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 1000
                                  },
                                  "epic": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 1000
                                  },
                                  "legendary": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 1000
                                  }
                                }
                              }
                            }
                          },
                          "key": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 100,
                            "description": "% that an open chest also holds a key (default 10 with locked chests)"
                          },
                          "bag": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 12,
                            "description": "places in the match’s bag (default 6)"
                          },
                          "keep": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 6,
                            "description": "the winner takes home its gear and bag into a vault on its PC, and each player may bring this many of them into the next match (lost if it does not win)"
                          }
                        }
                      },
                      "winMark": {
                        "type": "string",
                        "description": "the account mark the winners get (a friend rescued)"
                      },
                      "gcd": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 1500,
                        "description": "the global cooldown of the match in ms (left out: 1.5 s): a short one lets spells chain into combos; each spell own cooldown still holds"
                      },
                      "endLines": {
                        "type": "object",
                        "additionalProperties": false,
                        "description": "what the opponent (the first bot) says at the end",
                        "properties": {
                          "won": {
                            "type": "string",
                            "maxLength": 120,
                            "description": "when a player side won"
                          },
                          "lost": {
                            "type": "string",
                            "maxLength": 120,
                            "description": "when it lost"
                          }
                        }
                      },
                      "cameos": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 4,
                        "description": "someone of the story who shows up on the floor in a round (some seconds in, with a chance) when a player of the match carries its account mark, and blesses whoever reaches it first (a spell cast on that fighter); then it goes away",
                        "items": {
                          "type": "object",
                          "additionalProperties": false,
                          "required": [
                            "id",
                            "name",
                            "look"
                          ],
                          "properties": {
                            "id": {
                              "type": "string"
                            },
                            "name": {
                              "type": "string",
                              "maxLength": 32
                            },
                            "look": {
                              "type": "string"
                            },
                            "buff": {
                              "type": "string",
                              "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                            },
                            "unless": {
                              "type": "string",
                              "description": "it shows only while a player of the match lacks this mark"
                            },
                            "claim": {
                              "type": "object",
                              "additionalProperties": false,
                              "required": [
                                "arena"
                              ],
                              "properties": {
                                "arena": {
                                  "type": "string"
                                }
                              },
                              "description": "a challenge instead of a blessing: the first player to reach it takes it (one only); winning the match, leaving opens that arena for the player alone"
                            },
                            "requires": {
                              "type": "string",
                              "description": "an account story mark one of the players must carry (mark:<id> among its tags)"
                            },
                            "chance": {
                              "type": "number",
                              "minimum": 1,
                              "maximum": 100
                            },
                            "delay": {
                              "type": "number",
                              "minimum": 0,
                              "maximum": 120
                            },
                            "stay": {
                              "type": "number",
                              "minimum": 3,
                              "maximum": 60
                            },
                            "hello": {
                              "type": "string",
                              "maxLength": 120
                            },
                            "bless": {
                              "type": "string",
                              "maxLength": 120
                            }
                          }
                        }
                      },
                      "stages": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 16,
                        "description": "whole scenarios of hazards; stage says which is played",
                        "items": {
                          "type": "object",
                          "required": [
                            "id",
                            "name",
                            "hazards"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "id": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_]{0,23}$"
                            },
                            "name": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 40
                            },
                            "theme": {
                              "enum": [
                                "fire",
                                "air",
                                "water",
                                "ice",
                                "earth",
                                "swamp"
                              ],
                              "description": "its element: the floor, what lies past the ring and the rim’s particles take its look"
                            },
                            "hazards": {
                              "type": "array",
                              "maxItems": 16,
                              "description": "the scenario’s hazards",
                              "items": {
                                "type": "object",
                                "required": [
                                  "kind",
                                  "x",
                                  "y"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "kind": {
                                    "enum": [
                                      "vortex",
                                      "water",
                                      "lava",
                                      "ice",
                                      "wind",
                                      "current",
                                      "geyser",
                                      "rocks",
                                      "lightning",
                                      "quicksand",
                                      "bumper",
                                      "blade"
                                    ]
                                  },
                                  "x": {
                                    "type": "integer",
                                    "minimum": 0
                                  },
                                  "y": {
                                    "type": "integer",
                                    "minimum": 0
                                  },
                                  "radius": {
                                    "type": "number",
                                    "minimum": 1,
                                    "maximum": 30
                                  },
                                  "w": {
                                    "type": "number",
                                    "minimum": 1,
                                    "maximum": 60
                                  },
                                  "h": {
                                    "type": "number",
                                    "minimum": 1,
                                    "maximum": 60
                                  },
                                  "dir": {
                                    "type": "number",
                                    "minimum": -360,
                                    "maximum": 360
                                  },
                                  "power": {
                                    "type": "number",
                                    "minimum": 0.5,
                                    "maximum": 40
                                  },
                                  "every": {
                                    "type": "number",
                                    "minimum": 1,
                                    "maximum": 60
                                  },
                                  "orbit": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 20
                                  },
                                  "stun": {
                                    "type": "number",
                                    "minimum": 0.2,
                                    "maximum": 4,
                                    "description": "a strike (geyser, rocks, lightning) stuns whoever it hits, seconds"
                                  },
                                  "slow": {
                                    "type": "number",
                                    "minimum": 0.5,
                                    "maximum": 8,
                                    "description": "a strike slows whoever it hits by half, seconds"
                                  }
                                }
                              }
                            }
                          }
                        }
                      },
                      "stage": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 16,
                        "description": "0: a scenario of stages drawn when the match is built (the lobby shows the one played); n: always the n-th"
                      },
                      "stagePerRound": {
                        "type": "boolean",
                        "description": "true: with stage 0, a new scenario is drawn at every round"
                      },
                      "report": {
                        "type": "boolean",
                        "description": "true: the host counts the match’s statistics (per fighter: skin, element, damage, spells cast and landed, combos, falls and their causes, purchases; per match: scenario, rounds, rules) and sends the summary to the API at the end"
                      },
                      "elements": {
                        "type": "object",
                        "additionalProperties": false,
                        "description": "elements, marks, wheels and combos: every spell hit counts its element",
                        "properties": {
                          "strong": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 1
                          },
                          "weak": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 0.9
                          },
                          "mark": {
                            "type": "number",
                            "minimum": 1,
                            "maximum": 10
                          },
                          "combos": {
                            "type": "array",
                            "items": {
                              "enum": [
                                "eletrocutar",
                                "congelar",
                                "vapor",
                                "labareda",
                                "incendio",
                                "derreter",
                                "estilhacar",
                                "lama",
                                "areia",
                                "aterrar",
                                "tempestade",
                                "arremesso",
                                "eclipse",
                                "apagar",
                                "raiz_brasa",
                                "florescer"
                              ]
                            },
                            "description": "the combos that are on (left out: all)"
                          }
                        }
                      },
                      "hp": {
                        "type": "integer",
                        "minimum": 50,
                        "maximum": 100000,
                        "description": "everyone’s maximum life in the match, one number for all (whatever their level or class; the shop’s life perks still add to it), and the blows of all at the same scale (a normal project spell takes ~180); wins over life"
                      },
                      "life": {
                        "type": "number",
                        "minimum": 0.2,
                        "maximum": 3,
                        "description": "everyone’s maximum life in the match, a multiplier (0.6: 60%)"
                      },
                      "regen": {
                        "type": "boolean",
                        "description": "false: no life comes back by itself in the match (only the shop’s regen perk, heals and spells)"
                      },
                      "botStyle": {
                        "type": "object",
                        "required": [
                          "kind"
                        ],
                        "additionalProperties": false,
                        "description": "how the bots play: a caster keeps its distance, zigzags, leads its shots and steps out of the way of the ones coming at it; no blow of its own",
                        "properties": {
                          "kind": {
                            "const": "caster"
                          },
                          "keep": {
                            "type": "array",
                            "minItems": 2,
                            "maxItems": 2,
                            "items": {
                              "type": "integer",
                              "minimum": 2,
                              "maximum": 40
                            }
                          },
                          "strafe": {
                            "type": "number",
                            "minimum": 0.3,
                            "maximum": 4
                          },
                          "dodge": {
                            "type": "boolean"
                          },
                          "own": {
                            "type": "boolean"
                          },
                          "skill": {
                            "enum": [
                              1,
                              2,
                              3
                            ],
                            "description": "how well the bots play: 1 easy (aims where the target is, misses, rarely dodges, slow to throw), 2 medium, 3 hard (leads every shot, dodges all; the default)"
                          }
                        }
                      },
                      "colony": {
                        "type": "object",
                        "required": [
                          "builders",
                          "builder",
                          "resources",
                          "start",
                          "nodes",
                          "workers",
                          "structures",
                          "eras"
                        ],
                        "additionalProperties": false,
                        "description": "the strategy part of a match with an objective: the builders' team plays the way of a strategy game (a grid, structures, veins, workers, tiers, eras with hordes)",
                        "properties": {
                          "builders": {
                            "type": "array",
                            "minItems": 1,
                            "items": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_]{0,23}$"
                            },
                            "description": "the teams that build: each player of them is a builder that does not fight"
                          },
                          "builder": {
                            "type": "object",
                            "required": [
                              "creature",
                              "hp",
                              "respawn"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "creature": {
                                "type": "string",
                                "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                              },
                              "hp": {
                                "type": "integer",
                                "minimum": 20,
                                "maximum": 2000
                              },
                              "respawn": {
                                "type": "integer",
                                "minimum": 3,
                                "maximum": 120
                              },
                              "speed": {
                                "type": "number",
                                "minimum": 1,
                                "maximum": 12
                              },
                              "reach": {
                                "type": "integer",
                                "minimum": 4,
                                "maximum": 40
                              }
                            }
                          },
                          "resources": {
                            "type": "array",
                            "minItems": 1,
                            "maxItems": 6,
                            "items": {
                              "type": "object",
                              "required": [
                                "id",
                                "name"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "id": {
                                  "type": "string",
                                  "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                },
                                "name": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 40
                                }
                              }
                            }
                          },
                          "start": {
                            "type": "object",
                            "additionalProperties": {
                              "type": "integer",
                              "minimum": 0,
                              "maximum": 99999
                            },
                            "description": "resource id → amount"
                          },
                          "home": {
                            "type": "object",
                            "required": [
                              "structure",
                              "x",
                              "y"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "structure": {
                                "type": "string",
                                "pattern": "^[a-z][a-z0-9_]{0,23}$"
                              },
                              "x": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "y": {
                                "type": "integer",
                                "minimum": 0
                              }
                            }
                          },
                          "heart": {
                            "type": "string",
                            "pattern": "^[a-z][a-z0-9_]{0,23}$",
                            "description": "the structure whose fall ends the match once it has stood (the base): its team loses"
                          },
                          "hordeScale": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 3,
                            "description": "a multiplier on the size of every era horde (0: no hordes)"
                          },
                          "hold": {
                            "type": "integer",
                            "minimum": 30,
                            "maximum": 7200,
                            "description": "seconds from the start of the fight after which the builders team wins (no objective needed)"
                          },
                          "lair": {
                            "type": "object",
                            "required": [
                              "creature",
                              "x",
                              "y",
                              "hp",
                              "gold"
                            ],
                            "additionalProperties": false,
                            "description": "the lair of the team that comes in: it spawns there, nobody can hit it, it brings gold to each of its players, and a shop item with lair:true takes it up a tier",
                            "properties": {
                              "creature": {
                                "type": "string",
                                "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                              },
                              "x": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "y": {
                                "type": "integer",
                                "minimum": 0
                              },
                              "hp": {
                                "type": "integer",
                                "minimum": 20,
                                "maximum": 300000
                              },
                              "model": {
                                "enum": [
                                  "tower",
                                  "inhibitor",
                                  "heart"
                                ]
                              },
                              "gold": {
                                "type": "object",
                                "required": [
                                  "every",
                                  "amount"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "every": {
                                    "type": "integer",
                                    "minimum": 1,
                                    "maximum": 60
                                  },
                                  "amount": {
                                    "type": "integer",
                                    "minimum": 1,
                                    "maximum": 500
                                  }
                                }
                              },
                              "tiers": {
                                "type": "array",
                                "maxItems": 30,
                                "items": {
                                  "type": "object",
                                  "required": [
                                    "amount"
                                  ],
                                  "additionalProperties": false,
                                  "properties": {
                                    "amount": {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 500
                                    },
                                    "hp": {
                                      "type": "integer",
                                      "minimum": 20,
                                      "maximum": 300000
                                    }
                                  }
                                }
                              }
                            }
                          },
                          "nodes": {
                            "type": "array",
                            "maxItems": 40,
                            "items": {
                              "type": "object",
                              "required": [
                                "id",
                                "res",
                                "x",
                                "y",
                                "reserve"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "id": {
                                  "type": "string",
                                  "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                },
                                "res": {
                                  "type": "string",
                                  "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                },
                                "x": {
                                  "type": "integer",
                                  "minimum": 0
                                },
                                "y": {
                                  "type": "integer",
                                  "minimum": 0
                                },
                                "reserve": {
                                  "type": "integer",
                                  "minimum": 50,
                                  "maximum": 99999
                                },
                                "slots": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 12
                                },
                                "mine": {
                                  "type": "boolean"
                                },
                                "regrow": {
                                  "type": "object",
                                  "required": [
                                    "every",
                                    "amount"
                                  ],
                                  "additionalProperties": false,
                                  "properties": {
                                    "every": {
                                      "type": "integer",
                                      "minimum": 5,
                                      "maximum": 600
                                    },
                                    "amount": {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 200
                                    }
                                  }
                                }
                              }
                            }
                          },
                          "workers": {
                            "type": "array",
                            "maxItems": 6,
                            "items": {
                              "type": "object",
                              "required": [
                                "id",
                                "name",
                                "cost",
                                "creature",
                                "carries",
                                "capacity",
                                "gather",
                                "speed",
                                "hp"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "id": {
                                  "type": "string",
                                  "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                },
                                "name": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 40
                                },
                                "about": {
                                  "type": "string",
                                  "maxLength": 160
                                },
                                "cost": {
                                  "type": "object",
                                  "additionalProperties": {
                                    "type": "integer",
                                    "minimum": 0,
                                    "maximum": 99999
                                  },
                                  "description": "resource id → amount"
                                },
                                "creature": {
                                  "type": "string",
                                  "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                },
                                "carries": {
                                  "type": "array",
                                  "minItems": 1,
                                  "items": {
                                    "type": "string",
                                    "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                  }
                                },
                                "capacity": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 40
                                },
                                "gather": {
                                  "type": "number",
                                  "minimum": 0.5,
                                  "maximum": 30
                                },
                                "speed": {
                                  "type": "number",
                                  "minimum": 1,
                                  "maximum": 12
                                },
                                "hp": {
                                  "type": "integer",
                                  "minimum": 10,
                                  "maximum": 2000
                                }
                              }
                            }
                          },
                          "structures": {
                            "type": "array",
                            "maxItems": 24,
                            "items": {
                              "type": "object",
                              "required": [
                                "id",
                                "name",
                                "cost",
                                "size",
                                "hp",
                                "creature",
                                "time"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "id": {
                                  "type": "string",
                                  "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                },
                                "name": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 40
                                },
                                "about": {
                                  "type": "string",
                                  "maxLength": 160
                                },
                                "cost": {
                                  "type": "object",
                                  "additionalProperties": {
                                    "type": "integer",
                                    "minimum": 0,
                                    "maximum": 99999
                                  },
                                  "description": "resource id → amount"
                                },
                                "size": {
                                  "type": "array",
                                  "minItems": 2,
                                  "maxItems": 2,
                                  "items": {
                                    "type": "integer",
                                    "minimum": 1,
                                    "maximum": 6
                                  }
                                },
                                "hp": {
                                  "type": "integer",
                                  "minimum": 20,
                                  "maximum": 300000
                                },
                                "creature": {
                                  "type": "string",
                                  "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                },
                                "model": {
                                  "enum": [
                                    "tower",
                                    "inhibitor",
                                    "heart"
                                  ]
                                },
                                "time": {
                                  "type": "number",
                                  "minimum": 1,
                                  "maximum": 300
                                },
                                "territory": {
                                  "type": "integer",
                                  "minimum": 4,
                                  "maximum": 80
                                },
                                "outpost": {
                                  "type": "integer",
                                  "minimum": 2,
                                  "maximum": 30
                                },
                                "depot": {
                                  "type": "array",
                                  "items": {
                                    "type": "string",
                                    "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                  }
                                },
                                "houses": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 40
                                },
                                "trains": {
                                  "type": "array",
                                  "items": {
                                    "type": "string",
                                    "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                  }
                                },
                                "gate": {
                                  "type": "boolean"
                                },
                                "attack": {
                                  "type": "object",
                                  "required": [
                                    "range",
                                    "dmg",
                                    "rate"
                                  ],
                                  "additionalProperties": false,
                                  "properties": {
                                    "range": {
                                      "type": "number",
                                      "minimum": 3,
                                      "maximum": 30
                                    },
                                    "dmg": {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 2000
                                    },
                                    "rate": {
                                      "type": "number",
                                      "minimum": 0.2,
                                      "maximum": 4
                                    },
                                    "school": {
                                      "type": "string"
                                    }
                                  }
                                },
                                "heal": {
                                  "type": "object",
                                  "required": [
                                    "range",
                                    "amount",
                                    "rate"
                                  ],
                                  "additionalProperties": false,
                                  "properties": {
                                    "range": {
                                      "type": "number",
                                      "minimum": 3,
                                      "maximum": 30
                                    },
                                    "amount": {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 500
                                    },
                                    "rate": {
                                      "type": "number",
                                      "minimum": 0.2,
                                      "maximum": 4
                                    }
                                  }
                                },
                                "income": {
                                  "type": "object",
                                  "required": [
                                    "gold",
                                    "every"
                                  ],
                                  "additionalProperties": false,
                                  "properties": {
                                    "gold": {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 500
                                    },
                                    "every": {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 60
                                    }
                                  }
                                },
                                "tiers": {
                                  "type": "array",
                                  "maxItems": 30,
                                  "items": {
                                    "type": "object",
                                    "required": [
                                      "cost"
                                    ],
                                    "additionalProperties": false,
                                    "properties": {
                                      "cost": {
                                        "type": "object",
                                        "additionalProperties": {
                                          "type": "integer",
                                          "minimum": 0,
                                          "maximum": 99999
                                        },
                                        "description": "resource id → amount"
                                      },
                                      "points": {
                                        "type": "integer",
                                        "minimum": 0,
                                        "maximum": 20
                                      },
                                      "hp": {
                                        "type": "integer",
                                        "minimum": 20,
                                        "maximum": 300000
                                      },
                                      "dmg": {
                                        "type": "integer",
                                        "minimum": 1,
                                        "maximum": 2000
                                      },
                                      "range": {
                                        "type": "number",
                                        "minimum": 3,
                                        "maximum": 30
                                      },
                                      "rate": {
                                        "type": "number",
                                        "minimum": 0.2,
                                        "maximum": 4
                                      },
                                      "slots": {
                                        "type": "integer",
                                        "minimum": 1,
                                        "maximum": 12
                                      },
                                      "capacity": {
                                        "type": "integer",
                                        "minimum": 1,
                                        "maximum": 40
                                      },
                                      "houses": {
                                        "type": "integer",
                                        "minimum": 1,
                                        "maximum": 40
                                      },
                                      "income": {
                                        "type": "integer",
                                        "minimum": 1,
                                        "maximum": 500
                                      },
                                      "heal": {
                                        "type": "integer",
                                        "minimum": 1,
                                        "maximum": 500
                                      }
                                    }
                                  }
                                },
                                "era": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 8
                                },
                                "requires": {
                                  "oneOf": [
                                    {
                                      "type": "string",
                                      "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                    },
                                    {
                                      "type": "array",
                                      "minItems": 1,
                                      "maxItems": 6,
                                      "items": {
                                        "type": "string",
                                        "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                      }
                                    }
                                  ]
                                },
                                "limit": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 99
                                },
                                "anywhere": {
                                  "type": "boolean"
                                },
                                "cat": {
                                  "type": "string",
                                  "maxLength": 20
                                },
                                "icon": {
                                  "type": "string",
                                  "maxLength": 4
                                }
                              }
                            }
                          },
                          "eras": {
                            "type": "array",
                            "minItems": 1,
                            "maxItems": 8,
                            "items": {
                              "type": "object",
                              "required": [
                                "name",
                                "at"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "name": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 40
                                },
                                "at": {
                                  "type": "integer",
                                  "minimum": 0,
                                  "maximum": 7200
                                },
                                "points": {
                                  "type": "integer",
                                  "minimum": 0,
                                  "maximum": 20
                                },
                                "horde": {
                                  "type": "object",
                                  "required": [
                                    "count"
                                  ],
                                  "additionalProperties": false,
                                  "properties": {
                                    "count": {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 60
                                    },
                                    "every": {
                                      "type": "number",
                                      "minimum": 0.3,
                                      "maximum": 20
                                    }
                                  }
                                }
                              }
                            }
                          },
                          "pop": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 200
                          },
                          "loot": {
                            "type": "object",
                            "additionalProperties": false,
                            "description": "gold the other side's player takes for what it brings down",
                            "properties": {
                              "structure": {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 9999
                              },
                              "worker": {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 9999
                              },
                              "builder": {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 9999
                              }
                            }
                          },
                          "arrival": {
                            "type": "object",
                            "required": [
                              "team",
                              "delay"
                            ],
                            "additionalProperties": false,
                            "description": "a team that comes in later: its players wait held and out of reach until delay seconds after the fight began",
                            "properties": {
                              "team": {
                                "type": "string",
                                "pattern": "^[a-z][a-z0-9_]{0,23}$"
                              },
                              "delay": {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 1800
                              }
                            }
                          },
                          "talents": {
                            "type": "object",
                            "required": [
                              "items"
                            ],
                            "additionalProperties": false,
                            "description": "talent points for the players of the teams that do not build, spent on passives",
                            "properties": {
                              "start": {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 60
                              },
                              "every": {
                                "type": "integer",
                                "minimum": 5,
                                "maximum": 600
                              },
                              "total": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 60
                              },
                              "items": {
                                "type": "array",
                                "minItems": 1,
                                "maxItems": 8,
                                "items": {
                                  "type": "object",
                                  "required": [
                                    "id",
                                    "name",
                                    "max",
                                    "perk"
                                  ],
                                  "additionalProperties": false,
                                  "properties": {
                                    "id": {
                                      "type": "string",
                                      "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                    },
                                    "name": {
                                      "type": "string",
                                      "minLength": 1,
                                      "maxLength": 40
                                    },
                                    "about": {
                                      "type": "string",
                                      "maxLength": 160
                                    },
                                    "max": {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 5
                                    },
                                    "perk": {
                                      "type": "object",
                                      "minProperties": 1,
                                      "additionalProperties": false,
                                      "properties": {
                                        "life": {
                                          "type": "number",
                                          "minimum": 0.01,
                                          "maximum": 1
                                        },
                                        "damage": {
                                          "type": "number",
                                          "minimum": 0.01,
                                          "maximum": 1
                                        },
                                        "armor": {
                                          "type": "number",
                                          "minimum": 0.01,
                                          "maximum": 0.5
                                        },
                                        "speed": {
                                          "type": "number",
                                          "minimum": 0.01,
                                          "maximum": 0.5
                                        },
                                        "castTime": {
                                          "type": "number",
                                          "minimum": 0.01,
                                          "maximum": 0.5
                                        },
                                        "attackSpeed": {
                                          "type": "number",
                                          "minimum": 0.01,
                                          "maximum": 0.5
                                        },
                                        "push": {
                                          "type": "number",
                                          "minimum": 0.01,
                                          "maximum": 1
                                        },
                                        "pushResist": {
                                          "type": "number",
                                          "minimum": 0.01,
                                          "maximum": 0.8
                                        },
                                        "regen": {
                                          "type": "number",
                                          "minimum": 0.01,
                                          "maximum": 0.05
                                        },
                                        "ringResist": {
                                          "type": "number",
                                          "minimum": 0.01,
                                          "maximum": 0.5
                                        },
                                        "hazardResist": {
                                          "type": "number",
                                          "minimum": 0.01,
                                          "maximum": 0.5
                                        },
                                        "chestSpeed": {
                                          "type": "number",
                                          "minimum": 0.01,
                                          "maximum": 0.5
                                        }
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          },
                          "scrolls": {
                            "type": "array",
                            "maxItems": 8,
                            "items": {
                              "type": "object",
                              "required": [
                                "id",
                                "name",
                                "cost"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "id": {
                                  "type": "string",
                                  "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                },
                                "name": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 40
                                },
                                "about": {
                                  "type": "string",
                                  "maxLength": 160
                                },
                                "cost": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 9999
                                },
                                "seconds": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 300
                                },
                                "perk": {
                                  "type": "object",
                                  "minProperties": 1,
                                  "additionalProperties": false,
                                  "properties": {
                                    "life": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 1
                                    },
                                    "damage": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 1
                                    },
                                    "armor": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    },
                                    "speed": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    },
                                    "castTime": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    },
                                    "attackSpeed": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    },
                                    "push": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 1
                                    },
                                    "pushResist": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.8
                                    },
                                    "regen": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.05
                                    },
                                    "ringResist": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    },
                                    "hazardResist": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    },
                                    "chestSpeed": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    }
                                  }
                                },
                                "heal": {
                                  "type": "number",
                                  "minimum": 0.05,
                                  "maximum": 1
                                }
                              }
                            }
                          }
                        }
                      },
                      "shop": {
                        "type": "object",
                        "required": [
                          "items"
                        ],
                        "additionalProperties": false,
                        "description": "gold earned by round, win and fall, spent between rounds on perks",
                        "properties": {
                          "perHit": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9999
                          },
                          "perAssist": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9999
                          },
                          "assistShare": {
                            "type": "number",
                            "minimum": 0.01,
                            "maximum": 1,
                            "description": "an assist pays only when the helper took off this share of the victim's life within the 10 s (left out: any hit counts)"
                          },
                          "prices": {
                            "type": "object",
                            "additionalProperties": false,
                            "description": "the price of each rarity, for items that name a rarity instead of a cost",
                            "properties": {
                              "common": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 9999
                              },
                              "rare": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 9999
                              },
                              "epic": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 9999
                              },
                              "legendary": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 9999
                              }
                            }
                          },
                          "itemSlots": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 8
                          },
                          "extraSpells": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 8
                          },
                          "teams": {
                            "type": "array",
                            "minItems": 1,
                            "items": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_]{0,23}$"
                            },
                            "description": "the teams that may buy (left out: all)"
                          },
                          "gold": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9999
                          },
                          "perRound": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9999
                          },
                          "perWin": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9999
                          },
                          "perKill": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9999
                          },
                          "items": {
                            "type": "array",
                            "minItems": 1,
                            "maxItems": 96,
                            "items": {
                              "type": "object",
                              "required": [
                                "id",
                                "name"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "id": {
                                  "type": "string",
                                  "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                },
                                "name": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 40
                                },
                                "about": {
                                  "type": "string",
                                  "maxLength": 160
                                },
                                "cost": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 9999
                                },
                                "max": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 5
                                },
                                "slot": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 24
                                },
                                "icon": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 8
                                },
                                "lair": {
                                  "type": "boolean",
                                  "description": "a colony lair upgrade: each level takes the lair a tier up"
                                },
                                "cat": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 16
                                },
                                "rarity": {
                                  "enum": [
                                    "common",
                                    "rare",
                                    "epic",
                                    "legendary"
                                  ]
                                },
                                "spell": {
                                  "type": "string",
                                  "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                },
                                "only": {
                                  "type": "object",
                                  "additionalProperties": false,
                                  "minProperties": 1,
                                  "description": "for some only: who entered with one of these RPG classes (classBridge), or, with no class, who took one of these options of the arena pick; and/or who follows one of these professions; left out: for everyone",
                                  "properties": {
                                    "classes": {
                                      "type": "array",
                                      "minItems": 1,
                                      "maxItems": 24,
                                      "items": {
                                        "type": "string"
                                      }
                                    },
                                    "choices": {
                                      "type": "array",
                                      "minItems": 1,
                                      "maxItems": 24,
                                      "items": {
                                        "type": "string"
                                      }
                                    },
                                    "professions": {
                                      "type": "array",
                                      "minItems": 1,
                                      "maxItems": 24,
                                      "items": {
                                        "type": "string"
                                      },
                                      "description": "the game professions (alchemy, engineering...) whose followers may buy it"
                                    }
                                  }
                                },
                                "penalty": {
                                  "type": "object",
                                  "minProperties": 1,
                                  "additionalProperties": false,
                                  "properties": {
                                    "life": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 1
                                    },
                                    "damage": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 1
                                    },
                                    "armor": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    },
                                    "speed": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    },
                                    "castTime": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    },
                                    "attackSpeed": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    },
                                    "push": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 1
                                    },
                                    "pushResist": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.8
                                    },
                                    "regen": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.05
                                    },
                                    "ringResist": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    },
                                    "hazardResist": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    },
                                    "chestSpeed": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    }
                                  },
                                  "description": "what it costs the wearer: the same kinds as perk, the other way (a speed penalty slows, an armor one makes it take more)"
                                },
                                "levels": {
                                  "type": "array",
                                  "minItems": 1,
                                  "maxItems": 5,
                                  "description": "instead of cost/perk/max: each level has its own price, the structures razed before it and the whole perk of that level (perk may be left out on a lair item)",
                                  "items": {
                                    "type": "object",
                                    "required": [
                                      "cost"
                                    ],
                                    "additionalProperties": false,
                                    "properties": {
                                      "cost": {
                                        "type": "integer",
                                        "minimum": 1,
                                        "maximum": 9999
                                      },
                                      "razed": {
                                        "type": "integer",
                                        "minimum": 0,
                                        "maximum": 999
                                      },
                                      "penalty": {
                                        "type": "object",
                                        "minProperties": 1,
                                        "additionalProperties": false,
                                        "properties": {
                                          "life": {
                                            "type": "number",
                                            "minimum": 0.01,
                                            "maximum": 1
                                          },
                                          "damage": {
                                            "type": "number",
                                            "minimum": 0.01,
                                            "maximum": 1
                                          },
                                          "armor": {
                                            "type": "number",
                                            "minimum": 0.01,
                                            "maximum": 0.5
                                          },
                                          "speed": {
                                            "type": "number",
                                            "minimum": 0.01,
                                            "maximum": 0.5
                                          },
                                          "castTime": {
                                            "type": "number",
                                            "minimum": 0.01,
                                            "maximum": 0.5
                                          },
                                          "attackSpeed": {
                                            "type": "number",
                                            "minimum": 0.01,
                                            "maximum": 0.5
                                          },
                                          "push": {
                                            "type": "number",
                                            "minimum": 0.01,
                                            "maximum": 1
                                          },
                                          "pushResist": {
                                            "type": "number",
                                            "minimum": 0.01,
                                            "maximum": 0.8
                                          },
                                          "regen": {
                                            "type": "number",
                                            "minimum": 0.01,
                                            "maximum": 0.05
                                          },
                                          "ringResist": {
                                            "type": "number",
                                            "minimum": 0.01,
                                            "maximum": 0.5
                                          },
                                          "hazardResist": {
                                            "type": "number",
                                            "minimum": 0.01,
                                            "maximum": 0.5
                                          },
                                          "chestSpeed": {
                                            "type": "number",
                                            "minimum": 0.01,
                                            "maximum": 0.5
                                          }
                                        }
                                      },
                                      "perk": {
                                        "type": "object",
                                        "minProperties": 1,
                                        "additionalProperties": false,
                                        "properties": {
                                          "life": {
                                            "type": "number",
                                            "minimum": 0.01,
                                            "maximum": 1
                                          },
                                          "damage": {
                                            "type": "number",
                                            "minimum": 0.01,
                                            "maximum": 1
                                          },
                                          "armor": {
                                            "type": "number",
                                            "minimum": 0.01,
                                            "maximum": 0.5
                                          },
                                          "speed": {
                                            "type": "number",
                                            "minimum": 0.01,
                                            "maximum": 0.5
                                          },
                                          "castTime": {
                                            "type": "number",
                                            "minimum": 0.01,
                                            "maximum": 0.5
                                          },
                                          "attackSpeed": {
                                            "type": "number",
                                            "minimum": 0.01,
                                            "maximum": 0.5
                                          },
                                          "push": {
                                            "type": "number",
                                            "minimum": 0.01,
                                            "maximum": 1
                                          },
                                          "pushResist": {
                                            "type": "number",
                                            "minimum": 0.01,
                                            "maximum": 0.8
                                          },
                                          "regen": {
                                            "type": "number",
                                            "minimum": 0.01,
                                            "maximum": 0.05
                                          },
                                          "ringResist": {
                                            "type": "number",
                                            "minimum": 0.01,
                                            "maximum": 0.5
                                          },
                                          "hazardResist": {
                                            "type": "number",
                                            "minimum": 0.01,
                                            "maximum": 0.5
                                          },
                                          "chestSpeed": {
                                            "type": "number",
                                            "minimum": 0.01,
                                            "maximum": 0.5
                                          }
                                        }
                                      }
                                    }
                                  }
                                },
                                "perk": {
                                  "type": "object",
                                  "minProperties": 1,
                                  "additionalProperties": false,
                                  "properties": {
                                    "life": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 1
                                    },
                                    "damage": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 1
                                    },
                                    "armor": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    },
                                    "speed": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    },
                                    "castTime": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    },
                                    "attackSpeed": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    },
                                    "push": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 1
                                    },
                                    "pushResist": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.8
                                    },
                                    "regen": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.05
                                    },
                                    "ringResist": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    },
                                    "hazardResist": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    },
                                    "chestSpeed": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      },
                      "teams": {
                        "type": "array",
                        "minItems": 2,
                        "maxItems": 4,
                        "items": {
                          "type": "string",
                          "pattern": "^[a-z][a-z0-9_]{0,23}$"
                        }
                      },
                      "size": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 6
                      },
                      "bases": {
                        "type": "array",
                        "minItems": 2,
                        "maxItems": 4,
                        "items": {
                          "type": "array",
                          "minItems": 2,
                          "maxItems": 2,
                          "items": {
                            "type": "integer",
                            "minimum": 0
                          }
                        }
                      },
                      "bot": {
                        "type": "string",
                        "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                      },
                      "flags": {
                        "type": "array",
                        "minItems": 2,
                        "maxItems": 4,
                        "items": {
                          "type": "object",
                          "required": [
                            "id",
                            "team",
                            "x",
                            "y"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "id": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_]{0,23}$"
                            },
                            "team": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_]{0,23}$"
                            },
                            "x": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "y": {
                              "type": "integer",
                              "minimum": 0
                            }
                          }
                        }
                      },
                      "points": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 8,
                        "items": {
                          "type": "object",
                          "required": [
                            "id",
                            "x",
                            "y"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "id": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_]{0,23}$"
                            },
                            "x": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "y": {
                              "type": "integer",
                              "minimum": 0
                            },
                            "radius": {
                              "type": "number",
                              "minimum": 1,
                              "maximum": 6
                            },
                            "seconds": {
                              "type": "number",
                              "minimum": 1,
                              "maximum": 60
                            },
                            "worth": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 10
                            }
                          }
                        }
                      },
                      "win": {
                        "type": "object",
                        "required": [
                          "score"
                        ],
                        "additionalProperties": false,
                        "properties": {
                          "score": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 200
                          },
                          "time": {
                            "type": "integer",
                            "minimum": 30,
                            "maximum": 3600
                          }
                        }
                      },
                      "flagReturn": {
                        "type": "integer",
                        "minimum": 5,
                        "maximum": 120
                      },
                      "respawn": {
                        "type": "integer",
                        "minimum": 2,
                        "maximum": 60
                      },
                      "tick": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 30
                      },
                      "rounds": {
                        "type": "object",
                        "required": [
                          "wins"
                        ],
                        "additionalProperties": false,
                        "properties": {
                          "wins": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 9
                          },
                          "prepare": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 30
                          },
                          "limit": {
                            "type": "integer",
                            "minimum": 10,
                            "maximum": 600
                          },
                          "between": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 120
                          },
                          "ready": {
                            "type": "boolean",
                            "description": "true: the wait between rounds ends as soon as every human says ready"
                          }
                        }
                      }
                    }
                  },
                  "arenas": {
                    "type": "object",
                    "required": [
                      "hall",
                      "list"
                    ],
                    "additionalProperties": false,
                    "description": "custom arenas: a hall where the group gathers, a table where the host picks an arena and sets its rules, and the arenas (each a room)",
                    "properties": {
                      "hall": {
                        "type": "string",
                        "description": "the hall's room"
                      },
                      "table": {
                        "type": "object",
                        "required": [
                          "x",
                          "y"
                        ],
                        "additionalProperties": false,
                        "properties": {
                          "x": {
                            "type": "integer",
                            "minimum": 0
                          },
                          "y": {
                            "type": "integer",
                            "minimum": 0
                          }
                        }
                      },
                      "look": {
                        "type": "object",
                        "additionalProperties": false,
                        "description": "how the table looks in this world (a tavern's table, a war room): a name, a line under it, a picture of the game's art behind it",
                        "properties": {
                          "name": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 40
                          },
                          "about": {
                            "type": "string",
                            "maxLength": 160
                          },
                          "art": {
                            "type": "string",
                            "pattern": "^art/[a-z0-9_/-]{1,80}.(png|webp|jpg)$"
                          }
                        }
                      },
                      "list": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 12,
                        "items": {
                          "type": "object",
                          "required": [
                            "id",
                            "name",
                            "room",
                            "players"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "id": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_]{0,23}$"
                            },
                            "name": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 40
                            },
                            "about": {
                              "type": "string",
                              "maxLength": 160
                            },
                            "hidden": {
                              "type": "boolean",
                              "description": "true: not on the table list; the world opens it (a cameo challenge, battle.cameos[].claim)"
                            },
                            "prize": {
                              "type": "object",
                              "additionalProperties": false,
                              "description": "what the winners of a match of it win for the account's wardrobe (appearance only)",
                              "properties": {
                                "wardrobe": {
                                  "type": "array",
                                  "minItems": 1,
                                  "maxItems": 8,
                                  "items": {
                                    "type": "string"
                                  },
                                  "description": "entries of the wardrobe catalogue: a set or a weapon"
                                }
                              }
                            },
                            "room": {
                              "type": "string"
                            },
                            "players": {
                              "type": "object",
                              "required": [
                                "min",
                                "max"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "min": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 12
                                },
                                "max": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 12
                                }
                              }
                            },
                            "teams": {
                              "oneOf": [
                                {
                                  "enum": [
                                    "ffa",
                                    "coop"
                                  ]
                                },
                                {
                                  "type": "array",
                                  "minItems": 2,
                                  "maxItems": 4,
                                  "uniqueItems": true,
                                  "items": {
                                    "type": "string",
                                    "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                  }
                                }
                              ]
                            },
                            "options": {
                              "type": "array",
                              "maxItems": 10,
                              "items": {
                                "type": "object",
                                "required": [
                                  "id",
                                  "name",
                                  "kind",
                                  "default"
                                ],
                                "additionalProperties": false,
                                "description": "a rule the host sets at the table; it becomes the variable opt_<id>, and with \"bind\" it also sets one number of the arena room's match or defense",
                                "properties": {
                                  "id": {
                                    "type": "string",
                                    "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                  },
                                  "name": {
                                    "type": "string",
                                    "minLength": 1,
                                    "maxLength": 40
                                  },
                                  "about": {
                                    "type": "string",
                                    "maxLength": 160
                                  },
                                  "kind": {
                                    "enum": [
                                      "toggle",
                                      "choice",
                                      "number"
                                    ]
                                  },
                                  "default": {
                                    "type": [
                                      "boolean",
                                      "number",
                                      "string"
                                    ]
                                  },
                                  "values": {
                                    "type": "array",
                                    "minItems": 2,
                                    "maxItems": 16,
                                    "uniqueItems": true,
                                    "items": {
                                      "type": [
                                        "number",
                                        "string"
                                      ]
                                    },
                                    "description": "choice: the values on offer (all numbers or all words)"
                                  },
                                  "labels": {
                                    "type": "array",
                                    "minItems": 2,
                                    "maxItems": 16,
                                    "items": {
                                      "type": "string",
                                      "minLength": 1,
                                      "maxLength": 40
                                    },
                                    "description": "choice: the name the table shows for each value, same order (a number bound to the match, words for the host)"
                                  },
                                  "min": {
                                    "type": "number"
                                  },
                                  "max": {
                                    "type": "number"
                                  },
                                  "step": {
                                    "type": "number",
                                    "exclusiveMinimum": 0
                                  },
                                  "bind": {
                                    "enum": [
                                      "battle.rounds.wins",
                                      "battle.rounds.prepare",
                                      "battle.rounds.limit",
                                      "battle.win.score",
                                      "battle.win.time",
                                      "battle.respawn",
                                      "battle.size",
                                      "battle.flagReturn",
                                      "battle.tick",
                                      "defense.lives",
                                      "battle.ffa.players",
                                      "battle.ffa.group",
                                      "battle.ring.delay",
                                      "battle.ring.seconds",
                                      "battle.ring.dps",
                                      "battle.shop.gold",
                                      "battle.shop.perRound",
                                      "battle.shop.perWin",
                                      "battle.shop.perKill",
                                      "battle.objective.time",
                                      "battle.objective.hp",
                                      "battle.build.limit",
                                      "battle.build.income.gold",
                                      "battle.build.income.every",
                                      "battle.colony.hold",
                                      "battle.colony.hordeScale",
                                      "battle.colony.arrival.delay",
                                      "battle.colony.talents.start",
                                      "battle.colony.talents.every",
                                      "battle.colony.talents.total",
                                      "battle.moveSpeed",
                                      "battle.shotSpeed",
                                      "battle.life",
                                      "battle.hp",
                                      "battle.ring.ramp",
                                      "battle.chests.chance",
                                      "battle.chests.every",
                                      "battle.botStyle.skill",
                                      "battle.stage",
                                      "battle.sizes.0",
                                      "battle.sizes.1",
                                      "battle.sizes.2",
                                      "battle.sizes.3",
                                      "survival.gap",
                                      "survival.hp",
                                      "survival.count",
                                      "survival.perPlayer",
                                      "survival.heal",
                                      "survival.shop.gold",
                                      "survival.shop.perWave",
                                      "survival.shop.perKill",
                                      "play.push"
                                    ],
                                    "description": "a number option that sets this field of the arena room's match / defense, or a choice option whose values are the words of that play field (play.push)"
                                  }
                                }
                              }
                            },
                            "battle": {
                              "type": "object",
                              "required": [
                                "room"
                              ],
                              "additionalProperties": false,
                              "description": "a team match in one room (PvP on): flags, control points or rounds, with bots filling the teams",
                              "properties": {
                                "room": {
                                  "type": "string"
                                },
                                "ffa": {
                                  "type": "object",
                                  "required": [
                                    "players",
                                    "x",
                                    "y",
                                    "radius"
                                  ],
                                  "additionalProperties": false,
                                  "description": "every one for themselves: the places on a circle, teams p1…pN of one fighter each (leave teams, size and bases out)",
                                  "properties": {
                                    "players": {
                                      "type": "integer",
                                      "minimum": 2,
                                      "maximum": 8
                                    },
                                    "x": {
                                      "type": "integer",
                                      "minimum": 0
                                    },
                                    "y": {
                                      "type": "integer",
                                      "minimum": 0
                                    },
                                    "radius": {
                                      "type": "integer",
                                      "minimum": 2,
                                      "maximum": 20
                                    },
                                    "group": {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 4,
                                      "description": "fighters a side (2: duos…): players ÷ group sides p1…, each at its own base; at the arena table each player takes a place in a side (an empty one is a bot)"
                                    }
                                  }
                                },
                                "sizes": {
                                  "type": "array",
                                  "minItems": 2,
                                  "maxItems": 4,
                                  "items": {
                                    "type": "integer",
                                    "minimum": 1,
                                    "maximum": 8
                                  },
                                  "description": "fighters each team has, by team (instead of one size for all): a few strong against many"
                                },
                                "botSpells": {
                                  "type": "array",
                                  "minItems": 1,
                                  "maxItems": 8,
                                  "uniqueItems": true,
                                  "items": {
                                    "type": "string",
                                    "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                  },
                                  "description": "spells of the project the bots cast at who they fight, in turn, when the target is in range"
                                },
                                "looks": {
                                  "type": "array",
                                  "minItems": 2,
                                  "items": {
                                    "type": "string",
                                    "pattern": "^(lay:[a-z0-9_]+:[A-Za-z0-9_.~|-]{0,1180}|[a-z][a-z0-9_]{1,40})$"
                                  },
                                  "description": "the look of each team's bots, by team: a layered look of the RPG art (lay:rpg:…) or the name of a look"
                                },
                                "objective": {
                                  "type": "object",
                                  "required": [
                                    "team",
                                    "x",
                                    "y",
                                    "creature",
                                    "hp"
                                  ],
                                  "additionalProperties": false,
                                  "description": "a structure of a team (a creature that stands still) the others must bring down before its team holds out `time` seconds",
                                  "properties": {
                                    "team": {
                                      "type": "string",
                                      "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                    },
                                    "x": {
                                      "type": "integer",
                                      "minimum": 0
                                    },
                                    "y": {
                                      "type": "integer",
                                      "minimum": 0
                                    },
                                    "creature": {
                                      "type": "string",
                                      "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                    },
                                    "hp": {
                                      "type": "integer",
                                      "minimum": 100,
                                      "maximum": 200000
                                    },
                                    "time": {
                                      "type": "integer",
                                      "minimum": 30,
                                      "maximum": 3600
                                    },
                                    "model": {
                                      "enum": [
                                        "tower",
                                        "inhibitor",
                                        "heart"
                                      ]
                                    }
                                  }
                                },
                                "build": {
                                  "type": "object",
                                  "required": [
                                    "teams",
                                    "items"
                                  ],
                                  "additionalProperties": false,
                                  "description": "what some teams may build where their players stand, with the shop's gold",
                                  "properties": {
                                    "teams": {
                                      "type": "array",
                                      "minItems": 1,
                                      "maxItems": 4,
                                      "items": {
                                        "type": "string",
                                        "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                      }
                                    },
                                    "limit": {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 40
                                    },
                                    "income": {
                                      "type": "object",
                                      "required": [
                                        "gold",
                                        "every"
                                      ],
                                      "additionalProperties": false,
                                      "properties": {
                                        "gold": {
                                          "type": "integer",
                                          "minimum": 1,
                                          "maximum": 500
                                        },
                                        "every": {
                                          "type": "integer",
                                          "minimum": 1,
                                          "maximum": 60
                                        }
                                      }
                                    },
                                    "items": {
                                      "type": "array",
                                      "minItems": 1,
                                      "maxItems": 8,
                                      "items": {
                                        "type": "object",
                                        "required": [
                                          "id",
                                          "name",
                                          "cost",
                                          "hp",
                                          "creature"
                                        ],
                                        "additionalProperties": false,
                                        "properties": {
                                          "id": {
                                            "type": "string",
                                            "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                          },
                                          "name": {
                                            "type": "string",
                                            "minLength": 1,
                                            "maxLength": 40
                                          },
                                          "about": {
                                            "type": "string",
                                            "maxLength": 160
                                          },
                                          "cost": {
                                            "type": "integer",
                                            "minimum": 1,
                                            "maximum": 9999
                                          },
                                          "hp": {
                                            "type": "integer",
                                            "minimum": 20,
                                            "maximum": 50000
                                          },
                                          "creature": {
                                            "type": "string",
                                            "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                          },
                                          "model": {
                                            "enum": [
                                              "tower",
                                              "inhibitor",
                                              "heart"
                                            ]
                                          },
                                          "attack": {
                                            "type": "object",
                                            "required": [
                                              "range",
                                              "dmg",
                                              "rate"
                                            ],
                                            "additionalProperties": false,
                                            "properties": {
                                              "range": {
                                                "type": "number",
                                                "minimum": 3,
                                                "maximum": 30
                                              },
                                              "dmg": {
                                                "type": "number",
                                                "minimum": 1,
                                                "maximum": 2000
                                              },
                                              "rate": {
                                                "type": "number",
                                                "minimum": 0.2,
                                                "maximum": 4
                                              },
                                              "school": {
                                                "type": "string"
                                              }
                                            }
                                          },
                                          "heal": {
                                            "type": "object",
                                            "required": [
                                              "range",
                                              "amount",
                                              "rate"
                                            ],
                                            "additionalProperties": false,
                                            "properties": {
                                              "range": {
                                                "type": "number",
                                                "minimum": 3,
                                                "maximum": 30
                                              },
                                              "amount": {
                                                "type": "number",
                                                "minimum": 1,
                                                "maximum": 500
                                              },
                                              "rate": {
                                                "type": "number",
                                                "minimum": 0.2,
                                                "maximum": 4
                                              }
                                            }
                                          },
                                          "income": {
                                            "type": "object",
                                            "required": [
                                              "gold",
                                              "every"
                                            ],
                                            "additionalProperties": false,
                                            "properties": {
                                              "gold": {
                                                "type": "integer",
                                                "minimum": 1,
                                                "maximum": 500
                                              },
                                              "every": {
                                                "type": "integer",
                                                "minimum": 1,
                                                "maximum": 60
                                              }
                                            }
                                          }
                                        }
                                      }
                                    }
                                  }
                                },
                                "ring": {
                                  "type": "object",
                                  "required": [
                                    "x",
                                    "y",
                                    "radius",
                                    "to",
                                    "seconds"
                                  ],
                                  "additionalProperties": false,
                                  "description": "a safe circle that shrinks over each round and hurts whoever stays outside",
                                  "properties": {
                                    "x": {
                                      "type": "integer",
                                      "minimum": 0
                                    },
                                    "y": {
                                      "type": "integer",
                                      "minimum": 0
                                    },
                                    "radius": {
                                      "type": "integer",
                                      "minimum": 3,
                                      "maximum": 40
                                    },
                                    "to": {
                                      "type": "integer",
                                      "minimum": 1
                                    },
                                    "delay": {
                                      "type": "integer",
                                      "minimum": 0,
                                      "maximum": 300
                                    },
                                    "seconds": {
                                      "type": "integer",
                                      "minimum": 5,
                                      "maximum": 900
                                    },
                                    "dps": {
                                      "type": "number",
                                      "minimum": 1,
                                      "maximum": 50
                                    },
                                    "ramp": {
                                      "type": "number",
                                      "minimum": 0,
                                      "maximum": 20,
                                      "description": "% of life a second more for every second a fighter already burned outside the ring this round"
                                    }
                                  }
                                },
                                "lobby": {
                                  "type": "object",
                                  "required": [
                                    "seconds"
                                  ],
                                  "additionalProperties": false,
                                  "description": "before the first round: the players are in and held, the tutorial shows first and then the shop, and the round begins after `seconds` or when every human says ready",
                                  "properties": {
                                    "seconds": {
                                      "type": "integer",
                                      "minimum": 5,
                                      "maximum": 300
                                    },
                                    "tutorial": {
                                      "type": "object",
                                      "required": [
                                        "pages"
                                      ],
                                      "additionalProperties": false,
                                      "properties": {
                                        "pages": {
                                          "type": "array",
                                          "minItems": 1,
                                          "maxItems": 8,
                                          "items": {
                                            "type": "object",
                                            "required": [
                                              "title",
                                              "text"
                                            ],
                                            "additionalProperties": false,
                                            "properties": {
                                              "image": {
                                                "type": "string",
                                                "pattern": "^art\\/[a-z0-9_\\/-]{1,80}\\.(png|webp|jpg)$",
                                                "description": "a picture of the game’s art (art/….png)"
                                              },
                                              "diagram": {
                                                "enum": [
                                                  "elements"
                                                ],
                                                "description": "a diagram the engine draws from the rules: elements = the wheels of the elements"
                                              },
                                              "title": {
                                                "type": "string",
                                                "minLength": 1,
                                                "maxLength": 40
                                              },
                                              "text": {
                                                "type": "string",
                                                "minLength": 1,
                                                "maxLength": 700
                                              },
                                              "touch": {
                                                "type": "string",
                                                "minLength": 1,
                                                "maxLength": 700,
                                                "description": "other words for a touch screen (a phone): the controls page says how to play with the thumbs"
                                              },
                                              "pad": {
                                                "type": "string",
                                                "minLength": 1,
                                                "maxLength": 700,
                                                "description": "other words when a controller is used (a Steam Deck)"
                                              }
                                            }
                                          }
                                        }
                                      }
                                    }
                                  }
                                },
                                "shotSpeed": {
                                  "type": "number",
                                  "minimum": 0.3,
                                  "maximum": 2,
                                  "description": "how fast every spell shot flies in the match, a multiplier (0.7: 30% slower)"
                                },
                                "moveSpeed": {
                                  "type": "number",
                                  "minimum": 0.2,
                                  "maximum": 1.5,
                                  "description": "how fast everyone in the match walks, a multiplier (0.5: half the speed)"
                                },
                                "hazards": {
                                  "type": "array",
                                  "maxItems": 16,
                                  "description": "the room’s hazards, always there",
                                  "items": {
                                    "type": "object",
                                    "required": [
                                      "kind",
                                      "x",
                                      "y"
                                    ],
                                    "additionalProperties": false,
                                    "properties": {
                                      "kind": {
                                        "enum": [
                                          "vortex",
                                          "water",
                                          "lava",
                                          "ice",
                                          "wind",
                                          "current",
                                          "geyser",
                                          "rocks",
                                          "lightning",
                                          "quicksand",
                                          "bumper",
                                          "blade"
                                        ]
                                      },
                                      "x": {
                                        "type": "integer",
                                        "minimum": 0
                                      },
                                      "y": {
                                        "type": "integer",
                                        "minimum": 0
                                      },
                                      "radius": {
                                        "type": "number",
                                        "minimum": 1,
                                        "maximum": 30
                                      },
                                      "w": {
                                        "type": "number",
                                        "minimum": 1,
                                        "maximum": 60
                                      },
                                      "h": {
                                        "type": "number",
                                        "minimum": 1,
                                        "maximum": 60
                                      },
                                      "dir": {
                                        "type": "number",
                                        "minimum": -360,
                                        "maximum": 360
                                      },
                                      "power": {
                                        "type": "number",
                                        "minimum": 0.5,
                                        "maximum": 40
                                      },
                                      "every": {
                                        "type": "number",
                                        "minimum": 1,
                                        "maximum": 60
                                      },
                                      "orbit": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 20
                                      },
                                      "stun": {
                                        "type": "number",
                                        "minimum": 0.2,
                                        "maximum": 4,
                                        "description": "a strike (geyser, rocks, lightning) stuns whoever it hits, seconds"
                                      },
                                      "slow": {
                                        "type": "number",
                                        "minimum": 0.5,
                                        "maximum": 8,
                                        "description": "a strike slows whoever it hits by half, seconds"
                                      }
                                    }
                                  }
                                },
                                "chests": {
                                  "type": "object",
                                  "additionalProperties": false,
                                  "description": "chests that come up during the fight: hold the use key (F) by one to open it, gold and the shop’s gear into the match’s bag; with keep, a vault for the winner",
                                  "properties": {
                                    "every": {
                                      "type": "number",
                                      "minimum": 5,
                                      "maximum": 300,
                                      "description": "seconds between two chances of a chest (default 25)"
                                    },
                                    "chance": {
                                      "type": "number",
                                      "minimum": 0,
                                      "maximum": 100,
                                      "description": "% of each chance that one comes up (default 60)"
                                    },
                                    "max": {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 6,
                                      "description": "chests on the floor at once"
                                    },
                                    "hold": {
                                      "type": "number",
                                      "minimum": 1,
                                      "maximum": 15,
                                      "description": "seconds the use key is held, standing still and taking no damage (default 5)"
                                    },
                                    "reach": {
                                      "type": "number",
                                      "minimum": 0.5,
                                      "maximum": 4,
                                      "description": "how near one stands to open it (cells)"
                                    },
                                    "at": {
                                      "type": "array",
                                      "minItems": 1,
                                      "maxItems": 16,
                                      "items": {
                                        "type": "array",
                                        "minItems": 2,
                                        "maxItems": 2,
                                        "items": {
                                          "type": "integer",
                                          "minimum": 0
                                        }
                                      },
                                      "description": "floor cells where they may come up (left out: anywhere inside the ring, or near the middle)"
                                    },
                                    "gold": {
                                      "type": "array",
                                      "minItems": 2,
                                      "maxItems": 2,
                                      "items": {
                                        "type": "integer",
                                        "minimum": 0,
                                        "maximum": 9999
                                      },
                                      "description": "[least, most] gold found"
                                    },
                                    "items": {
                                      "type": "number",
                                      "minimum": 0,
                                      "maximum": 100,
                                      "description": "% that a piece of the shop’s gear comes with the gold (default 35)"
                                    },
                                    "rarity": {
                                      "type": "object",
                                      "additionalProperties": false,
                                      "description": "the gear’s rarity by weight (the shop’s items without a rarity are common)",
                                      "properties": {
                                        "common": {
                                          "type": "number",
                                          "minimum": 0,
                                          "maximum": 1000
                                        },
                                        "rare": {
                                          "type": "number",
                                          "minimum": 0,
                                          "maximum": 1000
                                        },
                                        "epic": {
                                          "type": "number",
                                          "minimum": 0,
                                          "maximum": 1000
                                        },
                                        "legendary": {
                                          "type": "number",
                                          "minimum": 0,
                                          "maximum": 1000
                                        }
                                      }
                                    },
                                    "locked": {
                                      "type": "object",
                                      "additionalProperties": false,
                                      "description": "a chest that comes up locked: only a key opens it, and it holds more",
                                      "properties": {
                                        "chance": {
                                          "type": "number",
                                          "minimum": 0,
                                          "maximum": 100,
                                          "description": "% that a chest comes up locked"
                                        },
                                        "gold": {
                                          "type": "array",
                                          "minItems": 2,
                                          "maxItems": 2,
                                          "items": {
                                            "type": "integer",
                                            "minimum": 0,
                                            "maximum": 9999
                                          },
                                          "description": "[least, most] gold found"
                                        },
                                        "items": {
                                          "type": "number",
                                          "minimum": 0,
                                          "maximum": 100
                                        },
                                        "rarity": {
                                          "type": "object",
                                          "additionalProperties": false,
                                          "description": "the gear’s rarity by weight (the shop’s items without a rarity are common)",
                                          "properties": {
                                            "common": {
                                              "type": "number",
                                              "minimum": 0,
                                              "maximum": 1000
                                            },
                                            "rare": {
                                              "type": "number",
                                              "minimum": 0,
                                              "maximum": 1000
                                            },
                                            "epic": {
                                              "type": "number",
                                              "minimum": 0,
                                              "maximum": 1000
                                            },
                                            "legendary": {
                                              "type": "number",
                                              "minimum": 0,
                                              "maximum": 1000
                                            }
                                          }
                                        }
                                      }
                                    },
                                    "key": {
                                      "type": "number",
                                      "minimum": 0,
                                      "maximum": 100,
                                      "description": "% that an open chest also holds a key (default 10 with locked chests)"
                                    },
                                    "bag": {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 12,
                                      "description": "places in the match’s bag (default 6)"
                                    },
                                    "keep": {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 6,
                                      "description": "the winner takes home its gear and bag into a vault on its PC, and each player may bring this many of them into the next match (lost if it does not win)"
                                    }
                                  }
                                },
                                "winMark": {
                                  "type": "string",
                                  "description": "the account mark the winners get (a friend rescued)"
                                },
                                "gcd": {
                                  "type": "integer",
                                  "minimum": 0,
                                  "maximum": 1500,
                                  "description": "the global cooldown of the match in ms (left out: 1.5 s): a short one lets spells chain into combos; each spell own cooldown still holds"
                                },
                                "endLines": {
                                  "type": "object",
                                  "additionalProperties": false,
                                  "description": "what the opponent (the first bot) says at the end",
                                  "properties": {
                                    "won": {
                                      "type": "string",
                                      "maxLength": 120,
                                      "description": "when a player side won"
                                    },
                                    "lost": {
                                      "type": "string",
                                      "maxLength": 120,
                                      "description": "when it lost"
                                    }
                                  }
                                },
                                "cameos": {
                                  "type": "array",
                                  "minItems": 1,
                                  "maxItems": 4,
                                  "description": "someone of the story who shows up on the floor in a round (some seconds in, with a chance) when a player of the match carries its account mark, and blesses whoever reaches it first (a spell cast on that fighter); then it goes away",
                                  "items": {
                                    "type": "object",
                                    "additionalProperties": false,
                                    "required": [
                                      "id",
                                      "name",
                                      "look"
                                    ],
                                    "properties": {
                                      "id": {
                                        "type": "string"
                                      },
                                      "name": {
                                        "type": "string",
                                        "maxLength": 32
                                      },
                                      "look": {
                                        "type": "string"
                                      },
                                      "buff": {
                                        "type": "string",
                                        "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                      },
                                      "unless": {
                                        "type": "string",
                                        "description": "it shows only while a player of the match lacks this mark"
                                      },
                                      "claim": {
                                        "type": "object",
                                        "additionalProperties": false,
                                        "required": [
                                          "arena"
                                        ],
                                        "properties": {
                                          "arena": {
                                            "type": "string"
                                          }
                                        },
                                        "description": "a challenge instead of a blessing: the first player to reach it takes it (one only); winning the match, leaving opens that arena for the player alone"
                                      },
                                      "requires": {
                                        "type": "string",
                                        "description": "an account story mark one of the players must carry (mark:<id> among its tags)"
                                      },
                                      "chance": {
                                        "type": "number",
                                        "minimum": 1,
                                        "maximum": 100
                                      },
                                      "delay": {
                                        "type": "number",
                                        "minimum": 0,
                                        "maximum": 120
                                      },
                                      "stay": {
                                        "type": "number",
                                        "minimum": 3,
                                        "maximum": 60
                                      },
                                      "hello": {
                                        "type": "string",
                                        "maxLength": 120
                                      },
                                      "bless": {
                                        "type": "string",
                                        "maxLength": 120
                                      }
                                    }
                                  }
                                },
                                "stages": {
                                  "type": "array",
                                  "minItems": 1,
                                  "maxItems": 16,
                                  "description": "whole scenarios of hazards; stage says which is played",
                                  "items": {
                                    "type": "object",
                                    "required": [
                                      "id",
                                      "name",
                                      "hazards"
                                    ],
                                    "additionalProperties": false,
                                    "properties": {
                                      "id": {
                                        "type": "string",
                                        "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                      },
                                      "name": {
                                        "type": "string",
                                        "minLength": 1,
                                        "maxLength": 40
                                      },
                                      "theme": {
                                        "enum": [
                                          "fire",
                                          "air",
                                          "water",
                                          "ice",
                                          "earth",
                                          "swamp"
                                        ],
                                        "description": "its element: the floor, what lies past the ring and the rim’s particles take its look"
                                      },
                                      "hazards": {
                                        "type": "array",
                                        "maxItems": 16,
                                        "description": "the scenario’s hazards",
                                        "items": {
                                          "type": "object",
                                          "required": [
                                            "kind",
                                            "x",
                                            "y"
                                          ],
                                          "additionalProperties": false,
                                          "properties": {
                                            "kind": {
                                              "enum": [
                                                "vortex",
                                                "water",
                                                "lava",
                                                "ice",
                                                "wind",
                                                "current",
                                                "geyser",
                                                "rocks",
                                                "lightning",
                                                "quicksand",
                                                "bumper",
                                                "blade"
                                              ]
                                            },
                                            "x": {
                                              "type": "integer",
                                              "minimum": 0
                                            },
                                            "y": {
                                              "type": "integer",
                                              "minimum": 0
                                            },
                                            "radius": {
                                              "type": "number",
                                              "minimum": 1,
                                              "maximum": 30
                                            },
                                            "w": {
                                              "type": "number",
                                              "minimum": 1,
                                              "maximum": 60
                                            },
                                            "h": {
                                              "type": "number",
                                              "minimum": 1,
                                              "maximum": 60
                                            },
                                            "dir": {
                                              "type": "number",
                                              "minimum": -360,
                                              "maximum": 360
                                            },
                                            "power": {
                                              "type": "number",
                                              "minimum": 0.5,
                                              "maximum": 40
                                            },
                                            "every": {
                                              "type": "number",
                                              "minimum": 1,
                                              "maximum": 60
                                            },
                                            "orbit": {
                                              "type": "number",
                                              "minimum": 0,
                                              "maximum": 20
                                            },
                                            "stun": {
                                              "type": "number",
                                              "minimum": 0.2,
                                              "maximum": 4,
                                              "description": "a strike (geyser, rocks, lightning) stuns whoever it hits, seconds"
                                            },
                                            "slow": {
                                              "type": "number",
                                              "minimum": 0.5,
                                              "maximum": 8,
                                              "description": "a strike slows whoever it hits by half, seconds"
                                            }
                                          }
                                        }
                                      }
                                    }
                                  }
                                },
                                "stage": {
                                  "type": "integer",
                                  "minimum": 0,
                                  "maximum": 16,
                                  "description": "0: a scenario of stages drawn when the match is built (the lobby shows the one played); n: always the n-th"
                                },
                                "stagePerRound": {
                                  "type": "boolean",
                                  "description": "true: with stage 0, a new scenario is drawn at every round"
                                },
                                "report": {
                                  "type": "boolean",
                                  "description": "true: the host counts the match’s statistics (per fighter: skin, element, damage, spells cast and landed, combos, falls and their causes, purchases; per match: scenario, rounds, rules) and sends the summary to the API at the end"
                                },
                                "elements": {
                                  "type": "object",
                                  "additionalProperties": false,
                                  "description": "elements, marks, wheels and combos: every spell hit counts its element",
                                  "properties": {
                                    "strong": {
                                      "type": "number",
                                      "minimum": 0,
                                      "maximum": 1
                                    },
                                    "weak": {
                                      "type": "number",
                                      "minimum": 0,
                                      "maximum": 0.9
                                    },
                                    "mark": {
                                      "type": "number",
                                      "minimum": 1,
                                      "maximum": 10
                                    },
                                    "combos": {
                                      "type": "array",
                                      "items": {
                                        "enum": [
                                          "eletrocutar",
                                          "congelar",
                                          "vapor",
                                          "labareda",
                                          "incendio",
                                          "derreter",
                                          "estilhacar",
                                          "lama",
                                          "areia",
                                          "aterrar",
                                          "tempestade",
                                          "arremesso",
                                          "eclipse",
                                          "apagar",
                                          "raiz_brasa",
                                          "florescer"
                                        ]
                                      },
                                      "description": "the combos that are on (left out: all)"
                                    }
                                  }
                                },
                                "hp": {
                                  "type": "integer",
                                  "minimum": 50,
                                  "maximum": 100000,
                                  "description": "everyone’s maximum life in the match, one number for all (whatever their level or class; the shop’s life perks still add to it), and the blows of all at the same scale (a normal project spell takes ~180); wins over life"
                                },
                                "life": {
                                  "type": "number",
                                  "minimum": 0.2,
                                  "maximum": 3,
                                  "description": "everyone’s maximum life in the match, a multiplier (0.6: 60%)"
                                },
                                "regen": {
                                  "type": "boolean",
                                  "description": "false: no life comes back by itself in the match (only the shop’s regen perk, heals and spells)"
                                },
                                "botStyle": {
                                  "type": "object",
                                  "required": [
                                    "kind"
                                  ],
                                  "additionalProperties": false,
                                  "description": "how the bots play: a caster keeps its distance, zigzags, leads its shots and steps out of the way of the ones coming at it; no blow of its own",
                                  "properties": {
                                    "kind": {
                                      "const": "caster"
                                    },
                                    "keep": {
                                      "type": "array",
                                      "minItems": 2,
                                      "maxItems": 2,
                                      "items": {
                                        "type": "integer",
                                        "minimum": 2,
                                        "maximum": 40
                                      }
                                    },
                                    "strafe": {
                                      "type": "number",
                                      "minimum": 0.3,
                                      "maximum": 4
                                    },
                                    "dodge": {
                                      "type": "boolean"
                                    },
                                    "own": {
                                      "type": "boolean"
                                    },
                                    "skill": {
                                      "enum": [
                                        1,
                                        2,
                                        3
                                      ],
                                      "description": "how well the bots play: 1 easy (aims where the target is, misses, rarely dodges, slow to throw), 2 medium, 3 hard (leads every shot, dodges all; the default)"
                                    }
                                  }
                                },
                                "colony": {
                                  "type": "object",
                                  "required": [
                                    "builders",
                                    "builder",
                                    "resources",
                                    "start",
                                    "nodes",
                                    "workers",
                                    "structures",
                                    "eras"
                                  ],
                                  "additionalProperties": false,
                                  "description": "the strategy part of a match with an objective: the builders' team plays the way of a strategy game (a grid, structures, veins, workers, tiers, eras with hordes)",
                                  "properties": {
                                    "builders": {
                                      "type": "array",
                                      "minItems": 1,
                                      "items": {
                                        "type": "string",
                                        "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                      },
                                      "description": "the teams that build: each player of them is a builder that does not fight"
                                    },
                                    "builder": {
                                      "type": "object",
                                      "required": [
                                        "creature",
                                        "hp",
                                        "respawn"
                                      ],
                                      "additionalProperties": false,
                                      "properties": {
                                        "creature": {
                                          "type": "string",
                                          "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                        },
                                        "hp": {
                                          "type": "integer",
                                          "minimum": 20,
                                          "maximum": 2000
                                        },
                                        "respawn": {
                                          "type": "integer",
                                          "minimum": 3,
                                          "maximum": 120
                                        },
                                        "speed": {
                                          "type": "number",
                                          "minimum": 1,
                                          "maximum": 12
                                        },
                                        "reach": {
                                          "type": "integer",
                                          "minimum": 4,
                                          "maximum": 40
                                        }
                                      }
                                    },
                                    "resources": {
                                      "type": "array",
                                      "minItems": 1,
                                      "maxItems": 6,
                                      "items": {
                                        "type": "object",
                                        "required": [
                                          "id",
                                          "name"
                                        ],
                                        "additionalProperties": false,
                                        "properties": {
                                          "id": {
                                            "type": "string",
                                            "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                          },
                                          "name": {
                                            "type": "string",
                                            "minLength": 1,
                                            "maxLength": 40
                                          }
                                        }
                                      }
                                    },
                                    "start": {
                                      "type": "object",
                                      "additionalProperties": {
                                        "type": "integer",
                                        "minimum": 0,
                                        "maximum": 99999
                                      },
                                      "description": "resource id → amount"
                                    },
                                    "home": {
                                      "type": "object",
                                      "required": [
                                        "structure",
                                        "x",
                                        "y"
                                      ],
                                      "additionalProperties": false,
                                      "properties": {
                                        "structure": {
                                          "type": "string",
                                          "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                        },
                                        "x": {
                                          "type": "integer",
                                          "minimum": 0
                                        },
                                        "y": {
                                          "type": "integer",
                                          "minimum": 0
                                        }
                                      }
                                    },
                                    "heart": {
                                      "type": "string",
                                      "pattern": "^[a-z][a-z0-9_]{0,23}$",
                                      "description": "the structure whose fall ends the match once it has stood (the base): its team loses"
                                    },
                                    "hordeScale": {
                                      "type": "number",
                                      "minimum": 0,
                                      "maximum": 3,
                                      "description": "a multiplier on the size of every era horde (0: no hordes)"
                                    },
                                    "hold": {
                                      "type": "integer",
                                      "minimum": 30,
                                      "maximum": 7200,
                                      "description": "seconds from the start of the fight after which the builders team wins (no objective needed)"
                                    },
                                    "lair": {
                                      "type": "object",
                                      "required": [
                                        "creature",
                                        "x",
                                        "y",
                                        "hp",
                                        "gold"
                                      ],
                                      "additionalProperties": false,
                                      "description": "the lair of the team that comes in: it spawns there, nobody can hit it, it brings gold to each of its players, and a shop item with lair:true takes it up a tier",
                                      "properties": {
                                        "creature": {
                                          "type": "string",
                                          "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                        },
                                        "x": {
                                          "type": "integer",
                                          "minimum": 0
                                        },
                                        "y": {
                                          "type": "integer",
                                          "minimum": 0
                                        },
                                        "hp": {
                                          "type": "integer",
                                          "minimum": 20,
                                          "maximum": 300000
                                        },
                                        "model": {
                                          "enum": [
                                            "tower",
                                            "inhibitor",
                                            "heart"
                                          ]
                                        },
                                        "gold": {
                                          "type": "object",
                                          "required": [
                                            "every",
                                            "amount"
                                          ],
                                          "additionalProperties": false,
                                          "properties": {
                                            "every": {
                                              "type": "integer",
                                              "minimum": 1,
                                              "maximum": 60
                                            },
                                            "amount": {
                                              "type": "integer",
                                              "minimum": 1,
                                              "maximum": 500
                                            }
                                          }
                                        },
                                        "tiers": {
                                          "type": "array",
                                          "maxItems": 30,
                                          "items": {
                                            "type": "object",
                                            "required": [
                                              "amount"
                                            ],
                                            "additionalProperties": false,
                                            "properties": {
                                              "amount": {
                                                "type": "integer",
                                                "minimum": 1,
                                                "maximum": 500
                                              },
                                              "hp": {
                                                "type": "integer",
                                                "minimum": 20,
                                                "maximum": 300000
                                              }
                                            }
                                          }
                                        }
                                      }
                                    },
                                    "nodes": {
                                      "type": "array",
                                      "maxItems": 40,
                                      "items": {
                                        "type": "object",
                                        "required": [
                                          "id",
                                          "res",
                                          "x",
                                          "y",
                                          "reserve"
                                        ],
                                        "additionalProperties": false,
                                        "properties": {
                                          "id": {
                                            "type": "string",
                                            "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                          },
                                          "res": {
                                            "type": "string",
                                            "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                          },
                                          "x": {
                                            "type": "integer",
                                            "minimum": 0
                                          },
                                          "y": {
                                            "type": "integer",
                                            "minimum": 0
                                          },
                                          "reserve": {
                                            "type": "integer",
                                            "minimum": 50,
                                            "maximum": 99999
                                          },
                                          "slots": {
                                            "type": "integer",
                                            "minimum": 1,
                                            "maximum": 12
                                          },
                                          "mine": {
                                            "type": "boolean"
                                          },
                                          "regrow": {
                                            "type": "object",
                                            "required": [
                                              "every",
                                              "amount"
                                            ],
                                            "additionalProperties": false,
                                            "properties": {
                                              "every": {
                                                "type": "integer",
                                                "minimum": 5,
                                                "maximum": 600
                                              },
                                              "amount": {
                                                "type": "integer",
                                                "minimum": 1,
                                                "maximum": 200
                                              }
                                            }
                                          }
                                        }
                                      }
                                    },
                                    "workers": {
                                      "type": "array",
                                      "maxItems": 6,
                                      "items": {
                                        "type": "object",
                                        "required": [
                                          "id",
                                          "name",
                                          "cost",
                                          "creature",
                                          "carries",
                                          "capacity",
                                          "gather",
                                          "speed",
                                          "hp"
                                        ],
                                        "additionalProperties": false,
                                        "properties": {
                                          "id": {
                                            "type": "string",
                                            "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                          },
                                          "name": {
                                            "type": "string",
                                            "minLength": 1,
                                            "maxLength": 40
                                          },
                                          "about": {
                                            "type": "string",
                                            "maxLength": 160
                                          },
                                          "cost": {
                                            "type": "object",
                                            "additionalProperties": {
                                              "type": "integer",
                                              "minimum": 0,
                                              "maximum": 99999
                                            },
                                            "description": "resource id → amount"
                                          },
                                          "creature": {
                                            "type": "string",
                                            "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                          },
                                          "carries": {
                                            "type": "array",
                                            "minItems": 1,
                                            "items": {
                                              "type": "string",
                                              "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                            }
                                          },
                                          "capacity": {
                                            "type": "integer",
                                            "minimum": 1,
                                            "maximum": 40
                                          },
                                          "gather": {
                                            "type": "number",
                                            "minimum": 0.5,
                                            "maximum": 30
                                          },
                                          "speed": {
                                            "type": "number",
                                            "minimum": 1,
                                            "maximum": 12
                                          },
                                          "hp": {
                                            "type": "integer",
                                            "minimum": 10,
                                            "maximum": 2000
                                          }
                                        }
                                      }
                                    },
                                    "structures": {
                                      "type": "array",
                                      "maxItems": 24,
                                      "items": {
                                        "type": "object",
                                        "required": [
                                          "id",
                                          "name",
                                          "cost",
                                          "size",
                                          "hp",
                                          "creature",
                                          "time"
                                        ],
                                        "additionalProperties": false,
                                        "properties": {
                                          "id": {
                                            "type": "string",
                                            "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                          },
                                          "name": {
                                            "type": "string",
                                            "minLength": 1,
                                            "maxLength": 40
                                          },
                                          "about": {
                                            "type": "string",
                                            "maxLength": 160
                                          },
                                          "cost": {
                                            "type": "object",
                                            "additionalProperties": {
                                              "type": "integer",
                                              "minimum": 0,
                                              "maximum": 99999
                                            },
                                            "description": "resource id → amount"
                                          },
                                          "size": {
                                            "type": "array",
                                            "minItems": 2,
                                            "maxItems": 2,
                                            "items": {
                                              "type": "integer",
                                              "minimum": 1,
                                              "maximum": 6
                                            }
                                          },
                                          "hp": {
                                            "type": "integer",
                                            "minimum": 20,
                                            "maximum": 300000
                                          },
                                          "creature": {
                                            "type": "string",
                                            "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                          },
                                          "model": {
                                            "enum": [
                                              "tower",
                                              "inhibitor",
                                              "heart"
                                            ]
                                          },
                                          "time": {
                                            "type": "number",
                                            "minimum": 1,
                                            "maximum": 300
                                          },
                                          "territory": {
                                            "type": "integer",
                                            "minimum": 4,
                                            "maximum": 80
                                          },
                                          "outpost": {
                                            "type": "integer",
                                            "minimum": 2,
                                            "maximum": 30
                                          },
                                          "depot": {
                                            "type": "array",
                                            "items": {
                                              "type": "string",
                                              "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                            }
                                          },
                                          "houses": {
                                            "type": "integer",
                                            "minimum": 1,
                                            "maximum": 40
                                          },
                                          "trains": {
                                            "type": "array",
                                            "items": {
                                              "type": "string",
                                              "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                            }
                                          },
                                          "gate": {
                                            "type": "boolean"
                                          },
                                          "attack": {
                                            "type": "object",
                                            "required": [
                                              "range",
                                              "dmg",
                                              "rate"
                                            ],
                                            "additionalProperties": false,
                                            "properties": {
                                              "range": {
                                                "type": "number",
                                                "minimum": 3,
                                                "maximum": 30
                                              },
                                              "dmg": {
                                                "type": "integer",
                                                "minimum": 1,
                                                "maximum": 2000
                                              },
                                              "rate": {
                                                "type": "number",
                                                "minimum": 0.2,
                                                "maximum": 4
                                              },
                                              "school": {
                                                "type": "string"
                                              }
                                            }
                                          },
                                          "heal": {
                                            "type": "object",
                                            "required": [
                                              "range",
                                              "amount",
                                              "rate"
                                            ],
                                            "additionalProperties": false,
                                            "properties": {
                                              "range": {
                                                "type": "number",
                                                "minimum": 3,
                                                "maximum": 30
                                              },
                                              "amount": {
                                                "type": "integer",
                                                "minimum": 1,
                                                "maximum": 500
                                              },
                                              "rate": {
                                                "type": "number",
                                                "minimum": 0.2,
                                                "maximum": 4
                                              }
                                            }
                                          },
                                          "income": {
                                            "type": "object",
                                            "required": [
                                              "gold",
                                              "every"
                                            ],
                                            "additionalProperties": false,
                                            "properties": {
                                              "gold": {
                                                "type": "integer",
                                                "minimum": 1,
                                                "maximum": 500
                                              },
                                              "every": {
                                                "type": "integer",
                                                "minimum": 1,
                                                "maximum": 60
                                              }
                                            }
                                          },
                                          "tiers": {
                                            "type": "array",
                                            "maxItems": 30,
                                            "items": {
                                              "type": "object",
                                              "required": [
                                                "cost"
                                              ],
                                              "additionalProperties": false,
                                              "properties": {
                                                "cost": {
                                                  "type": "object",
                                                  "additionalProperties": {
                                                    "type": "integer",
                                                    "minimum": 0,
                                                    "maximum": 99999
                                                  },
                                                  "description": "resource id → amount"
                                                },
                                                "points": {
                                                  "type": "integer",
                                                  "minimum": 0,
                                                  "maximum": 20
                                                },
                                                "hp": {
                                                  "type": "integer",
                                                  "minimum": 20,
                                                  "maximum": 300000
                                                },
                                                "dmg": {
                                                  "type": "integer",
                                                  "minimum": 1,
                                                  "maximum": 2000
                                                },
                                                "range": {
                                                  "type": "number",
                                                  "minimum": 3,
                                                  "maximum": 30
                                                },
                                                "rate": {
                                                  "type": "number",
                                                  "minimum": 0.2,
                                                  "maximum": 4
                                                },
                                                "slots": {
                                                  "type": "integer",
                                                  "minimum": 1,
                                                  "maximum": 12
                                                },
                                                "capacity": {
                                                  "type": "integer",
                                                  "minimum": 1,
                                                  "maximum": 40
                                                },
                                                "houses": {
                                                  "type": "integer",
                                                  "minimum": 1,
                                                  "maximum": 40
                                                },
                                                "income": {
                                                  "type": "integer",
                                                  "minimum": 1,
                                                  "maximum": 500
                                                },
                                                "heal": {
                                                  "type": "integer",
                                                  "minimum": 1,
                                                  "maximum": 500
                                                }
                                              }
                                            }
                                          },
                                          "era": {
                                            "type": "integer",
                                            "minimum": 1,
                                            "maximum": 8
                                          },
                                          "requires": {
                                            "oneOf": [
                                              {
                                                "type": "string",
                                                "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                              },
                                              {
                                                "type": "array",
                                                "minItems": 1,
                                                "maxItems": 6,
                                                "items": {
                                                  "type": "string",
                                                  "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                                }
                                              }
                                            ]
                                          },
                                          "limit": {
                                            "type": "integer",
                                            "minimum": 1,
                                            "maximum": 99
                                          },
                                          "anywhere": {
                                            "type": "boolean"
                                          },
                                          "cat": {
                                            "type": "string",
                                            "maxLength": 20
                                          },
                                          "icon": {
                                            "type": "string",
                                            "maxLength": 4
                                          }
                                        }
                                      }
                                    },
                                    "eras": {
                                      "type": "array",
                                      "minItems": 1,
                                      "maxItems": 8,
                                      "items": {
                                        "type": "object",
                                        "required": [
                                          "name",
                                          "at"
                                        ],
                                        "additionalProperties": false,
                                        "properties": {
                                          "name": {
                                            "type": "string",
                                            "minLength": 1,
                                            "maxLength": 40
                                          },
                                          "at": {
                                            "type": "integer",
                                            "minimum": 0,
                                            "maximum": 7200
                                          },
                                          "points": {
                                            "type": "integer",
                                            "minimum": 0,
                                            "maximum": 20
                                          },
                                          "horde": {
                                            "type": "object",
                                            "required": [
                                              "count"
                                            ],
                                            "additionalProperties": false,
                                            "properties": {
                                              "count": {
                                                "type": "integer",
                                                "minimum": 1,
                                                "maximum": 60
                                              },
                                              "every": {
                                                "type": "number",
                                                "minimum": 0.3,
                                                "maximum": 20
                                              }
                                            }
                                          }
                                        }
                                      }
                                    },
                                    "pop": {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 200
                                    },
                                    "loot": {
                                      "type": "object",
                                      "additionalProperties": false,
                                      "description": "gold the other side's player takes for what it brings down",
                                      "properties": {
                                        "structure": {
                                          "type": "integer",
                                          "minimum": 0,
                                          "maximum": 9999
                                        },
                                        "worker": {
                                          "type": "integer",
                                          "minimum": 0,
                                          "maximum": 9999
                                        },
                                        "builder": {
                                          "type": "integer",
                                          "minimum": 0,
                                          "maximum": 9999
                                        }
                                      }
                                    },
                                    "arrival": {
                                      "type": "object",
                                      "required": [
                                        "team",
                                        "delay"
                                      ],
                                      "additionalProperties": false,
                                      "description": "a team that comes in later: its players wait held and out of reach until delay seconds after the fight began",
                                      "properties": {
                                        "team": {
                                          "type": "string",
                                          "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                        },
                                        "delay": {
                                          "type": "integer",
                                          "minimum": 0,
                                          "maximum": 1800
                                        }
                                      }
                                    },
                                    "talents": {
                                      "type": "object",
                                      "required": [
                                        "items"
                                      ],
                                      "additionalProperties": false,
                                      "description": "talent points for the players of the teams that do not build, spent on passives",
                                      "properties": {
                                        "start": {
                                          "type": "integer",
                                          "minimum": 0,
                                          "maximum": 60
                                        },
                                        "every": {
                                          "type": "integer",
                                          "minimum": 5,
                                          "maximum": 600
                                        },
                                        "total": {
                                          "type": "integer",
                                          "minimum": 1,
                                          "maximum": 60
                                        },
                                        "items": {
                                          "type": "array",
                                          "minItems": 1,
                                          "maxItems": 8,
                                          "items": {
                                            "type": "object",
                                            "required": [
                                              "id",
                                              "name",
                                              "max",
                                              "perk"
                                            ],
                                            "additionalProperties": false,
                                            "properties": {
                                              "id": {
                                                "type": "string",
                                                "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                              },
                                              "name": {
                                                "type": "string",
                                                "minLength": 1,
                                                "maxLength": 40
                                              },
                                              "about": {
                                                "type": "string",
                                                "maxLength": 160
                                              },
                                              "max": {
                                                "type": "integer",
                                                "minimum": 1,
                                                "maximum": 5
                                              },
                                              "perk": {
                                                "type": "object",
                                                "minProperties": 1,
                                                "additionalProperties": false,
                                                "properties": {
                                                  "life": {
                                                    "type": "number",
                                                    "minimum": 0.01,
                                                    "maximum": 1
                                                  },
                                                  "damage": {
                                                    "type": "number",
                                                    "minimum": 0.01,
                                                    "maximum": 1
                                                  },
                                                  "armor": {
                                                    "type": "number",
                                                    "minimum": 0.01,
                                                    "maximum": 0.5
                                                  },
                                                  "speed": {
                                                    "type": "number",
                                                    "minimum": 0.01,
                                                    "maximum": 0.5
                                                  },
                                                  "castTime": {
                                                    "type": "number",
                                                    "minimum": 0.01,
                                                    "maximum": 0.5
                                                  },
                                                  "attackSpeed": {
                                                    "type": "number",
                                                    "minimum": 0.01,
                                                    "maximum": 0.5
                                                  },
                                                  "push": {
                                                    "type": "number",
                                                    "minimum": 0.01,
                                                    "maximum": 1
                                                  },
                                                  "pushResist": {
                                                    "type": "number",
                                                    "minimum": 0.01,
                                                    "maximum": 0.8
                                                  },
                                                  "regen": {
                                                    "type": "number",
                                                    "minimum": 0.01,
                                                    "maximum": 0.05
                                                  },
                                                  "ringResist": {
                                                    "type": "number",
                                                    "minimum": 0.01,
                                                    "maximum": 0.5
                                                  },
                                                  "hazardResist": {
                                                    "type": "number",
                                                    "minimum": 0.01,
                                                    "maximum": 0.5
                                                  },
                                                  "chestSpeed": {
                                                    "type": "number",
                                                    "minimum": 0.01,
                                                    "maximum": 0.5
                                                  }
                                                }
                                              }
                                            }
                                          }
                                        }
                                      }
                                    },
                                    "scrolls": {
                                      "type": "array",
                                      "maxItems": 8,
                                      "items": {
                                        "type": "object",
                                        "required": [
                                          "id",
                                          "name",
                                          "cost"
                                        ],
                                        "additionalProperties": false,
                                        "properties": {
                                          "id": {
                                            "type": "string",
                                            "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                          },
                                          "name": {
                                            "type": "string",
                                            "minLength": 1,
                                            "maxLength": 40
                                          },
                                          "about": {
                                            "type": "string",
                                            "maxLength": 160
                                          },
                                          "cost": {
                                            "type": "integer",
                                            "minimum": 1,
                                            "maximum": 9999
                                          },
                                          "seconds": {
                                            "type": "integer",
                                            "minimum": 1,
                                            "maximum": 300
                                          },
                                          "perk": {
                                            "type": "object",
                                            "minProperties": 1,
                                            "additionalProperties": false,
                                            "properties": {
                                              "life": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 1
                                              },
                                              "damage": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 1
                                              },
                                              "armor": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "speed": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "castTime": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "attackSpeed": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "push": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 1
                                              },
                                              "pushResist": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.8
                                              },
                                              "regen": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.05
                                              },
                                              "ringResist": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "hazardResist": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "chestSpeed": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              }
                                            }
                                          },
                                          "heal": {
                                            "type": "number",
                                            "minimum": 0.05,
                                            "maximum": 1
                                          }
                                        }
                                      }
                                    }
                                  }
                                },
                                "shop": {
                                  "type": "object",
                                  "required": [
                                    "items"
                                  ],
                                  "additionalProperties": false,
                                  "description": "gold earned by round, win and fall, spent between rounds on perks",
                                  "properties": {
                                    "perHit": {
                                      "type": "integer",
                                      "minimum": 0,
                                      "maximum": 9999
                                    },
                                    "perAssist": {
                                      "type": "integer",
                                      "minimum": 0,
                                      "maximum": 9999
                                    },
                                    "assistShare": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 1,
                                      "description": "an assist pays only when the helper took off this share of the victim's life within the 10 s (left out: any hit counts)"
                                    },
                                    "prices": {
                                      "type": "object",
                                      "additionalProperties": false,
                                      "description": "the price of each rarity, for items that name a rarity instead of a cost",
                                      "properties": {
                                        "common": {
                                          "type": "integer",
                                          "minimum": 1,
                                          "maximum": 9999
                                        },
                                        "rare": {
                                          "type": "integer",
                                          "minimum": 1,
                                          "maximum": 9999
                                        },
                                        "epic": {
                                          "type": "integer",
                                          "minimum": 1,
                                          "maximum": 9999
                                        },
                                        "legendary": {
                                          "type": "integer",
                                          "minimum": 1,
                                          "maximum": 9999
                                        }
                                      }
                                    },
                                    "itemSlots": {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 8
                                    },
                                    "extraSpells": {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 8
                                    },
                                    "teams": {
                                      "type": "array",
                                      "minItems": 1,
                                      "items": {
                                        "type": "string",
                                        "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                      },
                                      "description": "the teams that may buy (left out: all)"
                                    },
                                    "gold": {
                                      "type": "integer",
                                      "minimum": 0,
                                      "maximum": 9999
                                    },
                                    "perRound": {
                                      "type": "integer",
                                      "minimum": 0,
                                      "maximum": 9999
                                    },
                                    "perWin": {
                                      "type": "integer",
                                      "minimum": 0,
                                      "maximum": 9999
                                    },
                                    "perKill": {
                                      "type": "integer",
                                      "minimum": 0,
                                      "maximum": 9999
                                    },
                                    "items": {
                                      "type": "array",
                                      "minItems": 1,
                                      "maxItems": 96,
                                      "items": {
                                        "type": "object",
                                        "required": [
                                          "id",
                                          "name"
                                        ],
                                        "additionalProperties": false,
                                        "properties": {
                                          "id": {
                                            "type": "string",
                                            "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                          },
                                          "name": {
                                            "type": "string",
                                            "minLength": 1,
                                            "maxLength": 40
                                          },
                                          "about": {
                                            "type": "string",
                                            "maxLength": 160
                                          },
                                          "cost": {
                                            "type": "integer",
                                            "minimum": 1,
                                            "maximum": 9999
                                          },
                                          "max": {
                                            "type": "integer",
                                            "minimum": 1,
                                            "maximum": 5
                                          },
                                          "slot": {
                                            "type": "string",
                                            "minLength": 1,
                                            "maxLength": 24
                                          },
                                          "icon": {
                                            "type": "string",
                                            "minLength": 1,
                                            "maxLength": 8
                                          },
                                          "lair": {
                                            "type": "boolean",
                                            "description": "a colony lair upgrade: each level takes the lair a tier up"
                                          },
                                          "cat": {
                                            "type": "string",
                                            "minLength": 1,
                                            "maxLength": 16
                                          },
                                          "rarity": {
                                            "enum": [
                                              "common",
                                              "rare",
                                              "epic",
                                              "legendary"
                                            ]
                                          },
                                          "spell": {
                                            "type": "string",
                                            "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                          },
                                          "only": {
                                            "type": "object",
                                            "additionalProperties": false,
                                            "minProperties": 1,
                                            "description": "for some only: who entered with one of these RPG classes (classBridge), or, with no class, who took one of these options of the arena pick; and/or who follows one of these professions; left out: for everyone",
                                            "properties": {
                                              "classes": {
                                                "type": "array",
                                                "minItems": 1,
                                                "maxItems": 24,
                                                "items": {
                                                  "type": "string"
                                                }
                                              },
                                              "choices": {
                                                "type": "array",
                                                "minItems": 1,
                                                "maxItems": 24,
                                                "items": {
                                                  "type": "string"
                                                }
                                              },
                                              "professions": {
                                                "type": "array",
                                                "minItems": 1,
                                                "maxItems": 24,
                                                "items": {
                                                  "type": "string"
                                                },
                                                "description": "the game professions (alchemy, engineering...) whose followers may buy it"
                                              }
                                            }
                                          },
                                          "penalty": {
                                            "type": "object",
                                            "minProperties": 1,
                                            "additionalProperties": false,
                                            "properties": {
                                              "life": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 1
                                              },
                                              "damage": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 1
                                              },
                                              "armor": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "speed": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "castTime": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "attackSpeed": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "push": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 1
                                              },
                                              "pushResist": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.8
                                              },
                                              "regen": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.05
                                              },
                                              "ringResist": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "hazardResist": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "chestSpeed": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              }
                                            },
                                            "description": "what it costs the wearer: the same kinds as perk, the other way (a speed penalty slows, an armor one makes it take more)"
                                          },
                                          "levels": {
                                            "type": "array",
                                            "minItems": 1,
                                            "maxItems": 5,
                                            "description": "instead of cost/perk/max: each level has its own price, the structures razed before it and the whole perk of that level (perk may be left out on a lair item)",
                                            "items": {
                                              "type": "object",
                                              "required": [
                                                "cost"
                                              ],
                                              "additionalProperties": false,
                                              "properties": {
                                                "cost": {
                                                  "type": "integer",
                                                  "minimum": 1,
                                                  "maximum": 9999
                                                },
                                                "razed": {
                                                  "type": "integer",
                                                  "minimum": 0,
                                                  "maximum": 999
                                                },
                                                "penalty": {
                                                  "type": "object",
                                                  "minProperties": 1,
                                                  "additionalProperties": false,
                                                  "properties": {
                                                    "life": {
                                                      "type": "number",
                                                      "minimum": 0.01,
                                                      "maximum": 1
                                                    },
                                                    "damage": {
                                                      "type": "number",
                                                      "minimum": 0.01,
                                                      "maximum": 1
                                                    },
                                                    "armor": {
                                                      "type": "number",
                                                      "minimum": 0.01,
                                                      "maximum": 0.5
                                                    },
                                                    "speed": {
                                                      "type": "number",
                                                      "minimum": 0.01,
                                                      "maximum": 0.5
                                                    },
                                                    "castTime": {
                                                      "type": "number",
                                                      "minimum": 0.01,
                                                      "maximum": 0.5
                                                    },
                                                    "attackSpeed": {
                                                      "type": "number",
                                                      "minimum": 0.01,
                                                      "maximum": 0.5
                                                    },
                                                    "push": {
                                                      "type": "number",
                                                      "minimum": 0.01,
                                                      "maximum": 1
                                                    },
                                                    "pushResist": {
                                                      "type": "number",
                                                      "minimum": 0.01,
                                                      "maximum": 0.8
                                                    },
                                                    "regen": {
                                                      "type": "number",
                                                      "minimum": 0.01,
                                                      "maximum": 0.05
                                                    },
                                                    "ringResist": {
                                                      "type": "number",
                                                      "minimum": 0.01,
                                                      "maximum": 0.5
                                                    },
                                                    "hazardResist": {
                                                      "type": "number",
                                                      "minimum": 0.01,
                                                      "maximum": 0.5
                                                    },
                                                    "chestSpeed": {
                                                      "type": "number",
                                                      "minimum": 0.01,
                                                      "maximum": 0.5
                                                    }
                                                  }
                                                },
                                                "perk": {
                                                  "type": "object",
                                                  "minProperties": 1,
                                                  "additionalProperties": false,
                                                  "properties": {
                                                    "life": {
                                                      "type": "number",
                                                      "minimum": 0.01,
                                                      "maximum": 1
                                                    },
                                                    "damage": {
                                                      "type": "number",
                                                      "minimum": 0.01,
                                                      "maximum": 1
                                                    },
                                                    "armor": {
                                                      "type": "number",
                                                      "minimum": 0.01,
                                                      "maximum": 0.5
                                                    },
                                                    "speed": {
                                                      "type": "number",
                                                      "minimum": 0.01,
                                                      "maximum": 0.5
                                                    },
                                                    "castTime": {
                                                      "type": "number",
                                                      "minimum": 0.01,
                                                      "maximum": 0.5
                                                    },
                                                    "attackSpeed": {
                                                      "type": "number",
                                                      "minimum": 0.01,
                                                      "maximum": 0.5
                                                    },
                                                    "push": {
                                                      "type": "number",
                                                      "minimum": 0.01,
                                                      "maximum": 1
                                                    },
                                                    "pushResist": {
                                                      "type": "number",
                                                      "minimum": 0.01,
                                                      "maximum": 0.8
                                                    },
                                                    "regen": {
                                                      "type": "number",
                                                      "minimum": 0.01,
                                                      "maximum": 0.05
                                                    },
                                                    "ringResist": {
                                                      "type": "number",
                                                      "minimum": 0.01,
                                                      "maximum": 0.5
                                                    },
                                                    "hazardResist": {
                                                      "type": "number",
                                                      "minimum": 0.01,
                                                      "maximum": 0.5
                                                    },
                                                    "chestSpeed": {
                                                      "type": "number",
                                                      "minimum": 0.01,
                                                      "maximum": 0.5
                                                    }
                                                  }
                                                }
                                              }
                                            }
                                          },
                                          "perk": {
                                            "type": "object",
                                            "minProperties": 1,
                                            "additionalProperties": false,
                                            "properties": {
                                              "life": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 1
                                              },
                                              "damage": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 1
                                              },
                                              "armor": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "speed": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "castTime": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "attackSpeed": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "push": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 1
                                              },
                                              "pushResist": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.8
                                              },
                                              "regen": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.05
                                              },
                                              "ringResist": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "hazardResist": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "chestSpeed": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              }
                                            }
                                          }
                                        }
                                      }
                                    }
                                  }
                                },
                                "teams": {
                                  "type": "array",
                                  "minItems": 2,
                                  "maxItems": 4,
                                  "items": {
                                    "type": "string",
                                    "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                  }
                                },
                                "size": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 6
                                },
                                "bases": {
                                  "type": "array",
                                  "minItems": 2,
                                  "maxItems": 4,
                                  "items": {
                                    "type": "array",
                                    "minItems": 2,
                                    "maxItems": 2,
                                    "items": {
                                      "type": "integer",
                                      "minimum": 0
                                    }
                                  }
                                },
                                "bot": {
                                  "type": "string",
                                  "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                },
                                "flags": {
                                  "type": "array",
                                  "minItems": 2,
                                  "maxItems": 4,
                                  "items": {
                                    "type": "object",
                                    "required": [
                                      "id",
                                      "team",
                                      "x",
                                      "y"
                                    ],
                                    "additionalProperties": false,
                                    "properties": {
                                      "id": {
                                        "type": "string",
                                        "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                      },
                                      "team": {
                                        "type": "string",
                                        "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                      },
                                      "x": {
                                        "type": "integer",
                                        "minimum": 0
                                      },
                                      "y": {
                                        "type": "integer",
                                        "minimum": 0
                                      }
                                    }
                                  }
                                },
                                "points": {
                                  "type": "array",
                                  "minItems": 1,
                                  "maxItems": 8,
                                  "items": {
                                    "type": "object",
                                    "required": [
                                      "id",
                                      "x",
                                      "y"
                                    ],
                                    "additionalProperties": false,
                                    "properties": {
                                      "id": {
                                        "type": "string",
                                        "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                      },
                                      "x": {
                                        "type": "integer",
                                        "minimum": 0
                                      },
                                      "y": {
                                        "type": "integer",
                                        "minimum": 0
                                      },
                                      "radius": {
                                        "type": "number",
                                        "minimum": 1,
                                        "maximum": 6
                                      },
                                      "seconds": {
                                        "type": "number",
                                        "minimum": 1,
                                        "maximum": 60
                                      },
                                      "worth": {
                                        "type": "integer",
                                        "minimum": 1,
                                        "maximum": 10
                                      }
                                    }
                                  }
                                },
                                "win": {
                                  "type": "object",
                                  "required": [
                                    "score"
                                  ],
                                  "additionalProperties": false,
                                  "properties": {
                                    "score": {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 200
                                    },
                                    "time": {
                                      "type": "integer",
                                      "minimum": 30,
                                      "maximum": 3600
                                    }
                                  }
                                },
                                "flagReturn": {
                                  "type": "integer",
                                  "minimum": 5,
                                  "maximum": 120
                                },
                                "respawn": {
                                  "type": "integer",
                                  "minimum": 2,
                                  "maximum": 60
                                },
                                "tick": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 30
                                },
                                "rounds": {
                                  "type": "object",
                                  "required": [
                                    "wins"
                                  ],
                                  "additionalProperties": false,
                                  "properties": {
                                    "wins": {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 9
                                    },
                                    "prepare": {
                                      "type": "integer",
                                      "minimum": 0,
                                      "maximum": 30
                                    },
                                    "limit": {
                                      "type": "integer",
                                      "minimum": 10,
                                      "maximum": 600
                                    },
                                    "between": {
                                      "type": "integer",
                                      "minimum": 0,
                                      "maximum": 120
                                    },
                                    "ready": {
                                      "type": "boolean",
                                      "description": "true: the wait between rounds ends as soon as every human says ready"
                                    }
                                  }
                                }
                              }
                            },
                            "survival": {
                              "type": "object",
                              "required": [
                                "room",
                                "spawns",
                                "base",
                                "waves"
                              ],
                              "additionalProperties": false,
                              "description": "waves of creatures against the players in the open: preparation, boss, gold, shop, revive",
                              "properties": {
                                "room": {
                                  "type": "string"
                                },
                                "spawns": {
                                  "type": "array",
                                  "minItems": 1,
                                  "maxItems": 6,
                                  "uniqueItems": true,
                                  "items": {
                                    "type": "string"
                                  },
                                  "description": "regions of the room where the creatures come in"
                                },
                                "base": {
                                  "type": "array",
                                  "minItems": 2,
                                  "maxItems": 2,
                                  "items": {
                                    "type": "integer",
                                    "minimum": 0
                                  },
                                  "description": "the cell where the players stand and the fallen come back"
                                },
                                "waves": {
                                  "type": "array",
                                  "minItems": 1,
                                  "maxItems": 30,
                                  "items": {
                                    "type": "object",
                                    "required": [
                                      "groups"
                                    ],
                                    "additionalProperties": false,
                                    "properties": {
                                      "groups": {
                                        "type": "array",
                                        "minItems": 1,
                                        "maxItems": 4,
                                        "items": {
                                          "type": "object",
                                          "required": [
                                            "creature",
                                            "count"
                                          ],
                                          "additionalProperties": false,
                                          "properties": {
                                            "creature": {
                                              "type": "string",
                                              "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                            },
                                            "count": {
                                              "type": "integer",
                                              "minimum": 1,
                                              "maximum": 40
                                            },
                                            "every": {
                                              "type": "number",
                                              "minimum": 0.2,
                                              "maximum": 10
                                            }
                                          }
                                        }
                                      },
                                      "boss": {
                                        "type": "string",
                                        "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                      },
                                      "gap": {
                                        "type": "integer",
                                        "minimum": 0,
                                        "maximum": 120
                                      },
                                      "gold": {
                                        "type": "integer",
                                        "minimum": 0,
                                        "maximum": 9999
                                      }
                                    }
                                  }
                                },
                                "gap": {
                                  "type": "integer",
                                  "minimum": 0,
                                  "maximum": 120
                                },
                                "hp": {
                                  "type": "number",
                                  "minimum": 0.25,
                                  "maximum": 4
                                },
                                "count": {
                                  "type": "number",
                                  "minimum": 0.25,
                                  "maximum": 4
                                },
                                "perPlayer": {
                                  "type": "number",
                                  "minimum": 0,
                                  "maximum": 1
                                },
                                "heal": {
                                  "type": "number",
                                  "minimum": 0,
                                  "maximum": 1
                                },
                                "revive": {
                                  "oneOf": [
                                    {
                                      "enum": [
                                        "wave",
                                        "never"
                                      ]
                                    },
                                    {
                                      "type": "integer",
                                      "minimum": 5,
                                      "maximum": 120
                                    }
                                  ]
                                },
                                "endless": {
                                  "type": "object",
                                  "required": [
                                    "hp",
                                    "count"
                                  ],
                                  "additionalProperties": false,
                                  "properties": {
                                    "hp": {
                                      "type": "number",
                                      "minimum": 1,
                                      "maximum": 2
                                    },
                                    "count": {
                                      "type": "number",
                                      "minimum": 1,
                                      "maximum": 2
                                    }
                                  }
                                },
                                "shop": {
                                  "type": "object",
                                  "required": [
                                    "items"
                                  ],
                                  "additionalProperties": false,
                                  "description": "gold for each creature and each wave, spent between waves on perks",
                                  "properties": {
                                    "gold": {
                                      "type": "integer",
                                      "minimum": 0,
                                      "maximum": 9999
                                    },
                                    "perWave": {
                                      "type": "integer",
                                      "minimum": 0,
                                      "maximum": 9999
                                    },
                                    "perKill": {
                                      "type": "integer",
                                      "minimum": 0,
                                      "maximum": 9999
                                    },
                                    "items": {
                                      "type": "array",
                                      "minItems": 1,
                                      "maxItems": 96,
                                      "items": {
                                        "type": "object",
                                        "required": [
                                          "id",
                                          "name",
                                          "cost",
                                          "perk"
                                        ],
                                        "additionalProperties": false,
                                        "properties": {
                                          "id": {
                                            "type": "string",
                                            "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                          },
                                          "name": {
                                            "type": "string",
                                            "minLength": 1,
                                            "maxLength": 40
                                          },
                                          "about": {
                                            "type": "string",
                                            "maxLength": 160
                                          },
                                          "cost": {
                                            "type": "integer",
                                            "minimum": 1,
                                            "maximum": 9999
                                          },
                                          "max": {
                                            "type": "integer",
                                            "minimum": 1,
                                            "maximum": 5
                                          },
                                          "perk": {
                                            "type": "object",
                                            "minProperties": 1,
                                            "additionalProperties": false,
                                            "properties": {
                                              "life": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 1
                                              },
                                              "damage": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 1
                                              },
                                              "armor": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "speed": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "castTime": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "attackSpeed": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "push": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 1
                                              },
                                              "pushResist": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.8
                                              },
                                              "regen": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.05
                                              },
                                              "ringResist": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "hazardResist": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "chestSpeed": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              }
                                            }
                                          }
                                        }
                                      }
                                    }
                                  }
                                }
                              }
                            },
                            "play": {
                              "type": "object",
                              "additionalProperties": false,
                              "description": "how the world (or this arena) is played: no auto attack, no target (every spell aimed freely), a fixed high camera with a limited zoom, how a spell is launched",
                              "properties": {
                                "jump": {
                                  "type": "boolean",
                                  "description": "false: no jump (the key does nothing)"
                                },
                                "autoAttack": {
                                  "type": "boolean",
                                  "description": "false: players have no auto attack (no T key, no click, no spell turns it on)"
                                },
                                "targeting": {
                                  "enum": [
                                    "none",
                                    "target"
                                  ],
                                  "description": "\"none\": nothing is selected (a click or Tab picks nothing, no target frame or ring) and every spell is aimed freely with the mouse; \"target\": the game's own"
                                },
                                "camera": {
                                  "type": "object",
                                  "additionalProperties": false,
                                  "description": "a fixed high camera (3D and 2D) with the zoom held inside a band",
                                  "properties": {
                                    "zoom": {
                                      "type": "array",
                                      "minItems": 2,
                                      "maxItems": 2,
                                      "items": {
                                        "type": "number",
                                        "minimum": 0.4,
                                        "maximum": 3
                                      },
                                      "description": "[farthest, closest] as factors of the standard view: 1 = standard, more = closer"
                                    },
                                    "pitch": {
                                      "type": "number",
                                      "minimum": 0.5,
                                      "maximum": 1.5,
                                      "description": "how steeply the 3D camera looks down, radians (0.95 = the high view)"
                                    },
                                    "rotate": {
                                      "type": "boolean",
                                      "description": "true lets the player turn the camera with [ and ]; left out: the view is fixed"
                                    }
                                  }
                                },
                                "castMode": {
                                  "enum": [
                                    "quick",
                                    "preview",
                                    "choice"
                                  ],
                                  "description": "\"quick\": the spell's key fires at once toward the cursor; \"preview\": the key shows the aim and a click (or letting go of a held key) fires; \"choice\": the player picks in the Options (quick by default)"
                                },
                                "castStop": {
                                  "type": "boolean",
                                  "description": "true: a spell cast while walking stops the walk and is cast (keys held stay still until the cast ends; a new press of a move key walks and cancels it); left out: walking keeps a spell with a cast time from starting"
                                },
                                "push": {
                                  "enum": [
                                    "linear",
                                    "impacto",
                                    "deslize",
                                    "chicote",
                                    "quique"
                                  ],
                                  "description": "how a knockback moves the body: linear, impacto (fast at the blow, braking), deslize (hard start, long slide), chicote (gathers speed, brakes), quique (impacto, and bounces off a wall)"
                                },
                                "spectate": {
                                  "type": "boolean",
                                  "description": "true: a player who falls in a round watches it with a free camera (move keys; Space follows the next fighter standing)"
                                },
                                "foeAim": {
                                  "type": "boolean",
                                  "description": "false: nobody sees on the ground where the other players aim (only their own preview)"
                                },
                                "foeCastBars": {
                                  "type": "boolean",
                                  "description": "false: a player does not see the cast bars of foes (their own and their allies stay)"
                                },
                                "pad": {
                                  "description": "the controller (a Steam Deck or any gamepad): left stick walks, right stick aims, R2 R1 L1 L2 A cast the first spells of the bar (held shows the aim, let go casts, B cancels), the own buttons of the world press keys; in a window the d-pad moves, A presses, B goes back; false: none",
                                  "oneOf": [
                                    {
                                      "const": false
                                    },
                                    {
                                      "type": "object",
                                      "additionalProperties": false,
                                      "properties": {
                                        "spells": {
                                          "type": "integer",
                                          "minimum": 1,
                                          "maximum": 5,
                                          "description": "how many spells get a button, in the order r2, r1, l1, l2, a (default 5)"
                                        },
                                        "buttons": {
                                          "type": "array",
                                          "maxItems": 10,
                                          "items": {
                                            "type": "object",
                                            "additionalProperties": false,
                                            "required": [
                                              "button",
                                              "key"
                                            ],
                                            "properties": {
                                              "button": {
                                                "enum": [
                                                  "a",
                                                  "b",
                                                  "x",
                                                  "y",
                                                  "l1",
                                                  "r1",
                                                  "l2",
                                                  "r2",
                                                  "select",
                                                  "start",
                                                  "l3",
                                                  "r3",
                                                  "up",
                                                  "down",
                                                  "left",
                                                  "right"
                                                ]
                                              },
                                              "key": {
                                                "type": "string",
                                                "description": "the keyboard key it presses, as KeyboardEvent.code"
                                              },
                                              "hold": {
                                                "type": "boolean",
                                                "description": "true: the key stays held while the button does"
                                              }
                                            }
                                          }
                                        },
                                        "assist": {
                                          "type": "boolean",
                                          "description": "false: no pull of the aim onto a foe close to its line (default on)"
                                        }
                                      }
                                    }
                                  ]
                                },
                                "touch": {
                                  "description": "the touch controls on a phone or tablet: a stick for the left thumb, the first spells of the bar as buttons (press and drag aims, letting go casts, a tap casts at the nearest foe), the own buttons of the world; false: none",
                                  "oneOf": [
                                    {
                                      "const": false
                                    },
                                    {
                                      "type": "object",
                                      "additionalProperties": false,
                                      "properties": {
                                        "spells": {
                                          "type": "integer",
                                          "minimum": 1,
                                          "maximum": 8,
                                          "description": "how many spells of the bar become buttons (default 5; the first is the big one)"
                                        },
                                        "buttons": {
                                          "type": "array",
                                          "maxItems": 6,
                                          "items": {
                                            "type": "object",
                                            "additionalProperties": false,
                                            "required": [
                                              "label",
                                              "key"
                                            ],
                                            "properties": {
                                              "label": {
                                                "type": "string",
                                                "minLength": 1,
                                                "maxLength": 14
                                              },
                                              "key": {
                                                "type": "string",
                                                "description": "the keyboard key it presses, as KeyboardEvent.code: \"KeyU\", \"Space\", \"Digit6\""
                                              },
                                              "hold": {
                                                "type": "boolean",
                                                "description": "true: the key stays held while the finger does"
                                              }
                                            }
                                          }
                                        }
                                      }
                                    }
                                  ]
                                }
                              }
                            },
                            "spells": {
                              "type": "array",
                              "minItems": 0,
                              "maxItems": 8,
                              "uniqueItems": true,
                              "items": {
                                "type": "string",
                                "pattern": "^spell:[a-z][a-z0-9_]{1,31}@(0|[1-9][0-9]{0,3})\\.(0|[1-9][0-9]{0,3})\\.(0|[1-9][0-9]{0,3})$"
                              },
                              "description": "the bar of the match: spells of the project (left out: the world's own bar)"
                            },
                            "pick": {
                              "type": "object",
                              "additionalProperties": false,
                              "description": "how each player picks their character at the table, for this arena (a skin, a type, a side)",
                              "properties": {
                                "skins": {
                                  "type": "array",
                                  "minItems": 1,
                                  "maxItems": 12,
                                  "items": {
                                    "oneOf": [
                                      {
                                        "type": "string",
                                        "pattern": "^creature:[a-z][a-z0-9_]{1,31}@(0|[1-9][0-9]{0,3})\\.(0|[1-9][0-9]{0,3})\\.(0|[1-9][0-9]{0,3})$"
                                      },
                                      {
                                        "type": "object",
                                        "required": [
                                          "look",
                                          "name"
                                        ],
                                        "additionalProperties": false,
                                        "properties": {
                                          "look": {
                                            "type": "string",
                                            "pattern": "^(lay:[a-z0-9_]+:[A-Za-z0-9_.~|-]{0,1180}|[a-z][a-z0-9_]{1,40})$"
                                          },
                                          "name": {
                                            "type": "string",
                                            "minLength": 1,
                                            "maxLength": 40
                                          }
                                        }
                                      },
                                      {
                                        "type": "object",
                                        "required": [
                                          "skin",
                                          "name"
                                        ],
                                        "additionalProperties": false,
                                        "properties": {
                                          "skin": {
                                            "enum": [
                                              "bastiao_pacto",
                                              "bastiao_legiao",
                                              "atiradora_pacto",
                                              "atiradora_legiao",
                                              "elementalista_pacto",
                                              "elementalista_legiao",
                                              "sacerdotisa_pacto",
                                              "sacerdotisa_legiao",
                                              "runista_pacto",
                                              "runista_legiao",
                                              "colosso_obsidiana",
                                              "soldado_pacto",
                                              "soldado_legiao",
                                              "atirador_pacto",
                                              "atirador_legiao",
                                              "onda_que_anda",
                                              "druida_pacto",
                                              "druida_legiao",
                                              "guardiao_pacto",
                                              "guardiao_legiao",
                                              "monge_pacto",
                                              "monge_legiao",
                                              "rastreador_pacto",
                                              "rastreador_legiao",
                                              "bruxo_pacto",
                                              "bruxo_legiao",
                                              "geadeira_pacto",
                                              "geadeira_legiao",
                                              "vidente_pacto",
                                              "vidente_legiao",
                                              "cantor_pacto",
                                              "cantor_legiao",
                                              "assassino_pacto",
                                              "assassino_legiao",
                                              "barbaro_pacto",
                                              "barbaro_legiao",
                                              "feiticeiro_rubro",
                                              "xama",
                                              "mago_azul",
                                              "juramentado_chifre",
                                              "sem_dor",
                                              "mariposa_negra",
                                              "dancarino_crepusculo",
                                              "escriba_veu",
                                              "arqueira_veu",
                                              "vigia_bosque",
                                              "diabrete_avesso",
                                              "amigo_pinho",
                                              "amigo_caju",
                                              "amigo_tatu",
                                              "amigo_mare",
                                              "paladino_pacto",
                                              "paladino_legiao",
                                              "cavaleiro",
                                              "pirata",
                                              "arqueiro",
                                              "mago_rubro_lay",
                                              "mago_azul_lay",
                                              "elfo_lay",
                                              "troll_lay",
                                              "azul_lay",
                                              "vermelho_lay"
                                            ],
                                            "description": "a skin of the wardrobe that is a look (catalog hero.wardrobe.skins, kind dress or layered), worn as the look; use it instead of writing the look"
                                          },
                                          "name": {
                                            "type": "string",
                                            "minLength": 1,
                                            "maxLength": 40
                                          }
                                        }
                                      }
                                    ]
                                  },
                                  "description": "what the player wears for the match: a creature of the project (its look), { look, name } with a layered look of the RPG art, or { skin, name } with a skin of the wardrobe"
                                },
                                "choice": {
                                  "type": "object",
                                  "required": [
                                    "name",
                                    "options"
                                  ],
                                  "additionalProperties": false,
                                  "properties": {
                                    "name": {
                                      "type": "string",
                                      "minLength": 1,
                                      "maxLength": 40
                                    },
                                    "about": {
                                      "type": "string",
                                      "maxLength": 160
                                    },
                                    "options": {
                                      "type": "array",
                                      "minItems": 2,
                                      "maxItems": 12,
                                      "items": {
                                        "type": "object",
                                        "required": [
                                          "id",
                                          "name"
                                        ],
                                        "additionalProperties": false,
                                        "properties": {
                                          "id": {
                                            "type": "string",
                                            "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                          },
                                          "name": {
                                            "type": "string",
                                            "minLength": 1,
                                            "maxLength": 40
                                          },
                                          "about": {
                                            "type": "string",
                                            "maxLength": 160
                                          },
                                          "look": {
                                            "type": "string",
                                            "pattern": "^(lay:[a-z0-9_]+:[A-Za-z0-9_.~|-]{0,1180}|[a-z][a-z0-9_]{1,40})$"
                                          },
                                          "skin": {
                                            "enum": [
                                              "bastiao_pacto",
                                              "bastiao_legiao",
                                              "atiradora_pacto",
                                              "atiradora_legiao",
                                              "elementalista_pacto",
                                              "elementalista_legiao",
                                              "sacerdotisa_pacto",
                                              "sacerdotisa_legiao",
                                              "runista_pacto",
                                              "runista_legiao",
                                              "colosso_obsidiana",
                                              "soldado_pacto",
                                              "soldado_legiao",
                                              "atirador_pacto",
                                              "atirador_legiao",
                                              "onda_que_anda",
                                              "druida_pacto",
                                              "druida_legiao",
                                              "guardiao_pacto",
                                              "guardiao_legiao",
                                              "monge_pacto",
                                              "monge_legiao",
                                              "rastreador_pacto",
                                              "rastreador_legiao",
                                              "bruxo_pacto",
                                              "bruxo_legiao",
                                              "geadeira_pacto",
                                              "geadeira_legiao",
                                              "vidente_pacto",
                                              "vidente_legiao",
                                              "cantor_pacto",
                                              "cantor_legiao",
                                              "assassino_pacto",
                                              "assassino_legiao",
                                              "barbaro_pacto",
                                              "barbaro_legiao",
                                              "feiticeiro_rubro",
                                              "xama",
                                              "mago_azul",
                                              "juramentado_chifre",
                                              "sem_dor",
                                              "mariposa_negra",
                                              "dancarino_crepusculo",
                                              "escriba_veu",
                                              "arqueira_veu",
                                              "vigia_bosque",
                                              "diabrete_avesso",
                                              "amigo_pinho",
                                              "amigo_caju",
                                              "amigo_tatu",
                                              "amigo_mare",
                                              "paladino_pacto",
                                              "paladino_legiao",
                                              "cavaleiro",
                                              "pirata",
                                              "arqueiro",
                                              "mago_rubro_lay",
                                              "mago_azul_lay",
                                              "elfo_lay",
                                              "troll_lay",
                                              "azul_lay",
                                              "vermelho_lay"
                                            ],
                                            "description": "a skin of the wardrobe that is a look (catalog hero.wardrobe.skins, kind dress or layered), worn as the look; use it instead of writing the look"
                                          },
                                          "perks": {
                                            "type": "object",
                                            "minProperties": 1,
                                            "additionalProperties": false,
                                            "properties": {
                                              "life": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 1
                                              },
                                              "damage": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 1
                                              },
                                              "armor": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "speed": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "castTime": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "attackSpeed": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "push": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 1
                                              },
                                              "pushResist": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.8
                                              },
                                              "regen": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.05
                                              },
                                              "ringResist": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "hazardResist": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              },
                                              "chestSpeed": {
                                                "type": "number",
                                                "minimum": 0.01,
                                                "maximum": 0.5
                                              }
                                            },
                                            "description": "starting stats, as fractions"
                                          },
                                          "passive": {
                                            "type": "string",
                                            "pattern": "^spell:[a-z][a-z0-9_]{1,31}@(0|[1-9][0-9]{0,3})\\.(0|[1-9][0-9]{0,3})\\.(0|[1-9][0-9]{0,3})$"
                                          },
                                          "every": {
                                            "type": "integer",
                                            "minimum": 3,
                                            "maximum": 60
                                          },
                                          "spells": {
                                            "type": "array",
                                            "minItems": 0,
                                            "maxItems": 8,
                                            "uniqueItems": true,
                                            "items": {
                                              "type": "string",
                                              "pattern": "^spell:[a-z][a-z0-9_]{1,31}@(0|[1-9][0-9]{0,3})\\.(0|[1-9][0-9]{0,3})\\.(0|[1-9][0-9]{0,3})$"
                                            }
                                          },
                                          "team": {
                                            "type": "string",
                                            "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                          }
                                        }
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  },
                  "play": {
                    "type": "object",
                    "additionalProperties": false,
                    "description": "how the world (or this arena) is played: no auto attack, no target (every spell aimed freely), a fixed high camera with a limited zoom, how a spell is launched",
                    "properties": {
                      "jump": {
                        "type": "boolean",
                        "description": "false: no jump (the key does nothing)"
                      },
                      "autoAttack": {
                        "type": "boolean",
                        "description": "false: players have no auto attack (no T key, no click, no spell turns it on)"
                      },
                      "targeting": {
                        "enum": [
                          "none",
                          "target"
                        ],
                        "description": "\"none\": nothing is selected (a click or Tab picks nothing, no target frame or ring) and every spell is aimed freely with the mouse; \"target\": the game's own"
                      },
                      "camera": {
                        "type": "object",
                        "additionalProperties": false,
                        "description": "a fixed high camera (3D and 2D) with the zoom held inside a band",
                        "properties": {
                          "zoom": {
                            "type": "array",
                            "minItems": 2,
                            "maxItems": 2,
                            "items": {
                              "type": "number",
                              "minimum": 0.4,
                              "maximum": 3
                            },
                            "description": "[farthest, closest] as factors of the standard view: 1 = standard, more = closer"
                          },
                          "pitch": {
                            "type": "number",
                            "minimum": 0.5,
                            "maximum": 1.5,
                            "description": "how steeply the 3D camera looks down, radians (0.95 = the high view)"
                          },
                          "rotate": {
                            "type": "boolean",
                            "description": "true lets the player turn the camera with [ and ]; left out: the view is fixed"
                          }
                        }
                      },
                      "castMode": {
                        "enum": [
                          "quick",
                          "preview",
                          "choice"
                        ],
                        "description": "\"quick\": the spell's key fires at once toward the cursor; \"preview\": the key shows the aim and a click (or letting go of a held key) fires; \"choice\": the player picks in the Options (quick by default)"
                      },
                      "castStop": {
                        "type": "boolean",
                        "description": "true: a spell cast while walking stops the walk and is cast (keys held stay still until the cast ends; a new press of a move key walks and cancels it); left out: walking keeps a spell with a cast time from starting"
                      },
                      "push": {
                        "enum": [
                          "linear",
                          "impacto",
                          "deslize",
                          "chicote",
                          "quique"
                        ],
                        "description": "how a knockback moves the body: linear, impacto (fast at the blow, braking), deslize (hard start, long slide), chicote (gathers speed, brakes), quique (impacto, and bounces off a wall)"
                      },
                      "spectate": {
                        "type": "boolean",
                        "description": "true: a player who falls in a round watches it with a free camera (move keys; Space follows the next fighter standing)"
                      },
                      "foeAim": {
                        "type": "boolean",
                        "description": "false: nobody sees on the ground where the other players aim (only their own preview)"
                      },
                      "foeCastBars": {
                        "type": "boolean",
                        "description": "false: a player does not see the cast bars of foes (their own and their allies stay)"
                      },
                      "pad": {
                        "description": "the controller (a Steam Deck or any gamepad): left stick walks, right stick aims, R2 R1 L1 L2 A cast the first spells of the bar (held shows the aim, let go casts, B cancels), the own buttons of the world press keys; in a window the d-pad moves, A presses, B goes back; false: none",
                        "oneOf": [
                          {
                            "const": false
                          },
                          {
                            "type": "object",
                            "additionalProperties": false,
                            "properties": {
                              "spells": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 5,
                                "description": "how many spells get a button, in the order r2, r1, l1, l2, a (default 5)"
                              },
                              "buttons": {
                                "type": "array",
                                "maxItems": 10,
                                "items": {
                                  "type": "object",
                                  "additionalProperties": false,
                                  "required": [
                                    "button",
                                    "key"
                                  ],
                                  "properties": {
                                    "button": {
                                      "enum": [
                                        "a",
                                        "b",
                                        "x",
                                        "y",
                                        "l1",
                                        "r1",
                                        "l2",
                                        "r2",
                                        "select",
                                        "start",
                                        "l3",
                                        "r3",
                                        "up",
                                        "down",
                                        "left",
                                        "right"
                                      ]
                                    },
                                    "key": {
                                      "type": "string",
                                      "description": "the keyboard key it presses, as KeyboardEvent.code"
                                    },
                                    "hold": {
                                      "type": "boolean",
                                      "description": "true: the key stays held while the button does"
                                    }
                                  }
                                }
                              },
                              "assist": {
                                "type": "boolean",
                                "description": "false: no pull of the aim onto a foe close to its line (default on)"
                              }
                            }
                          }
                        ]
                      },
                      "touch": {
                        "description": "the touch controls on a phone or tablet: a stick for the left thumb, the first spells of the bar as buttons (press and drag aims, letting go casts, a tap casts at the nearest foe), the own buttons of the world; false: none",
                        "oneOf": [
                          {
                            "const": false
                          },
                          {
                            "type": "object",
                            "additionalProperties": false,
                            "properties": {
                              "spells": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 8,
                                "description": "how many spells of the bar become buttons (default 5; the first is the big one)"
                              },
                              "buttons": {
                                "type": "array",
                                "maxItems": 6,
                                "items": {
                                  "type": "object",
                                  "additionalProperties": false,
                                  "required": [
                                    "label",
                                    "key"
                                  ],
                                  "properties": {
                                    "label": {
                                      "type": "string",
                                      "minLength": 1,
                                      "maxLength": 14
                                    },
                                    "key": {
                                      "type": "string",
                                      "description": "the keyboard key it presses, as KeyboardEvent.code: \"KeyU\", \"Space\", \"Digit6\""
                                    },
                                    "hold": {
                                      "type": "boolean",
                                      "description": "true: the key stays held while the finger does"
                                    }
                                  }
                                }
                              }
                            }
                          }
                        ]
                      }
                    }
                  },
                  "marcos": {
                    "type": "object",
                    "additionalProperties": false,
                    "required": [
                      "classes"
                    ],
                    "description": "each class one choice of 2 or 3 options that change one of its spells: a way to play, never a strength",
                    "properties": {
                      "classes": {
                        "type": "object",
                        "maxProperties": 24,
                        "additionalProperties": {
                          "type": "object",
                          "additionalProperties": false,
                          "required": [
                            "options"
                          ],
                          "properties": {
                            "choices": {
                              "type": "array",
                              "items": {
                                "type": "string"
                              },
                              "description": "the arena pick options (skins) whose players take this class Marco"
                            },
                            "options": {
                              "type": "array",
                              "minItems": 2,
                              "maxItems": 3,
                              "items": {
                                "type": "object",
                                "additionalProperties": false,
                                "required": [
                                  "id",
                                  "name"
                                ],
                                "properties": {
                                  "id": {
                                    "type": "string",
                                    "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                  },
                                  "name": {
                                    "type": "string",
                                    "minLength": 1,
                                    "maxLength": 32
                                  },
                                  "about": {
                                    "type": "string",
                                    "maxLength": 160
                                  },
                                  "rpg": {
                                    "type": "array",
                                    "items": {
                                      "type": "string"
                                    },
                                    "description": "the RPG Marcos it mirrors: a character that took one comes with this option"
                                  },
                                  "mods": {
                                    "type": "array",
                                    "maxItems": 3,
                                    "items": {
                                      "type": "object",
                                      "additionalProperties": false,
                                      "required": [
                                        "spell",
                                        "prop",
                                        "value"
                                      ],
                                      "properties": {
                                        "spell": {
                                          "type": "string",
                                          "pattern": "^spell:[a-z][a-z0-9_]{0,40}@\\d+\\.\\d+\\.\\d+$"
                                        },
                                        "prop": {
                                          "enum": [
                                            "cooldown",
                                            "castTime"
                                          ]
                                        },
                                        "value": {
                                          "type": "integer",
                                          "minimum": -6000,
                                          "maximum": 6000,
                                          "description": "ms; negative is quicker"
                                        }
                                      }
                                    }
                                  },
                                  "swap": {
                                    "type": "array",
                                    "maxItems": 2,
                                    "items": {
                                      "type": "object",
                                      "additionalProperties": false,
                                      "required": [
                                        "from",
                                        "to"
                                      ],
                                      "properties": {
                                        "from": {
                                          "type": "string",
                                          "pattern": "^spell:[a-z][a-z0-9_]{0,40}@\\d+\\.\\d+\\.\\d+$"
                                        },
                                        "to": {
                                          "type": "string",
                                          "pattern": "^spell:[a-z][a-z0-9_]{0,40}@\\d+\\.\\d+\\.\\d+$"
                                        }
                                      }
                                    },
                                    "description": "a spell cast in another dress of it (keeps its cooldown)"
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  },
                  "menu": {
                    "type": "object",
                    "additionalProperties": false,
                    "description": "the Esc menu of the world",
                    "properties": {
                      "own": {
                        "type": "boolean",
                        "description": "the world's own menu (resume, controls, world options, sound, back to the hall, back to the worlds) instead of the RPG's; on by default for a world with arenas or a play block"
                      },
                      "hall": {
                        "type": "boolean",
                        "description": "with arenas: the \"back to the hall\" entry while the player is in an arena's room (default on); false takes it away"
                      }
                    }
                  },
                  "survival": {
                    "type": "object",
                    "required": [
                      "room",
                      "spawns",
                      "base",
                      "waves"
                    ],
                    "additionalProperties": false,
                    "description": "waves of creatures against the players in the open: preparation, boss, gold, shop, revive",
                    "properties": {
                      "room": {
                        "type": "string"
                      },
                      "spawns": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 6,
                        "uniqueItems": true,
                        "items": {
                          "type": "string"
                        },
                        "description": "regions of the room where the creatures come in"
                      },
                      "base": {
                        "type": "array",
                        "minItems": 2,
                        "maxItems": 2,
                        "items": {
                          "type": "integer",
                          "minimum": 0
                        },
                        "description": "the cell where the players stand and the fallen come back"
                      },
                      "waves": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 30,
                        "items": {
                          "type": "object",
                          "required": [
                            "groups"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "groups": {
                              "type": "array",
                              "minItems": 1,
                              "maxItems": 4,
                              "items": {
                                "type": "object",
                                "required": [
                                  "creature",
                                  "count"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "creature": {
                                    "type": "string",
                                    "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                  },
                                  "count": {
                                    "type": "integer",
                                    "minimum": 1,
                                    "maximum": 40
                                  },
                                  "every": {
                                    "type": "number",
                                    "minimum": 0.2,
                                    "maximum": 10
                                  }
                                }
                              }
                            },
                            "boss": {
                              "type": "string",
                              "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                            },
                            "gap": {
                              "type": "integer",
                              "minimum": 0,
                              "maximum": 120
                            },
                            "gold": {
                              "type": "integer",
                              "minimum": 0,
                              "maximum": 9999
                            }
                          }
                        }
                      },
                      "gap": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 120
                      },
                      "hp": {
                        "type": "number",
                        "minimum": 0.25,
                        "maximum": 4
                      },
                      "count": {
                        "type": "number",
                        "minimum": 0.25,
                        "maximum": 4
                      },
                      "perPlayer": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 1
                      },
                      "heal": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 1
                      },
                      "revive": {
                        "oneOf": [
                          {
                            "enum": [
                              "wave",
                              "never"
                            ]
                          },
                          {
                            "type": "integer",
                            "minimum": 5,
                            "maximum": 120
                          }
                        ]
                      },
                      "endless": {
                        "type": "object",
                        "required": [
                          "hp",
                          "count"
                        ],
                        "additionalProperties": false,
                        "properties": {
                          "hp": {
                            "type": "number",
                            "minimum": 1,
                            "maximum": 2
                          },
                          "count": {
                            "type": "number",
                            "minimum": 1,
                            "maximum": 2
                          }
                        }
                      },
                      "shop": {
                        "type": "object",
                        "required": [
                          "items"
                        ],
                        "additionalProperties": false,
                        "description": "gold for each creature and each wave, spent between waves on perks",
                        "properties": {
                          "gold": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9999
                          },
                          "perWave": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9999
                          },
                          "perKill": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 9999
                          },
                          "items": {
                            "type": "array",
                            "minItems": 1,
                            "maxItems": 96,
                            "items": {
                              "type": "object",
                              "required": [
                                "id",
                                "name",
                                "cost",
                                "perk"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "id": {
                                  "type": "string",
                                  "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                },
                                "name": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 40
                                },
                                "about": {
                                  "type": "string",
                                  "maxLength": 160
                                },
                                "cost": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 9999
                                },
                                "max": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 5
                                },
                                "perk": {
                                  "type": "object",
                                  "minProperties": 1,
                                  "additionalProperties": false,
                                  "properties": {
                                    "life": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 1
                                    },
                                    "damage": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 1
                                    },
                                    "armor": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    },
                                    "speed": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    },
                                    "castTime": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    },
                                    "attackSpeed": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    },
                                    "push": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 1
                                    },
                                    "pushResist": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.8
                                    },
                                    "regen": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.05
                                    },
                                    "ringResist": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    },
                                    "hazardResist": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    },
                                    "chestSpeed": {
                                      "type": "number",
                                      "minimum": 0.01,
                                      "maximum": 0.5
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  },
                  "ui": {
                    "type": "object",
                    "additionalProperties": false,
                    "description": "the world's interface: which parts of the HUD show, resource bar names and colours, button texts, colours and mark (rooms maps only)",
                    "properties": {
                      "v": {
                        "const": 1
                      },
                      "preset": {
                        "enum": [
                          "lean",
                          "full",
                          "bare"
                        ]
                      },
                      "hud": {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                          "player": {
                            "type": "boolean"
                          },
                          "target": {
                            "type": "boolean"
                          },
                          "buffs": {
                            "type": "boolean"
                          },
                          "xp": {
                            "type": "boolean"
                          },
                          "cast": {
                            "type": "boolean"
                          },
                          "sidebars": {
                            "type": "boolean"
                          },
                          "minimap": {
                            "type": "boolean"
                          },
                          "chat": {
                            "type": "boolean"
                          },
                          "bags": {
                            "type": "boolean"
                          },
                          "meter": {
                            "type": "boolean"
                          },
                          "book": {
                            "type": "boolean"
                          },
                          "character": {
                            "type": "boolean"
                          },
                          "social": {
                            "type": "boolean"
                          },
                          "party": {
                            "type": "boolean"
                          },
                          "goals": {
                            "type": "boolean"
                          },
                          "boss": {
                            "type": "boolean"
                          },
                          "log": {
                            "type": "boolean"
                          },
                          "stamina": {
                            "type": "boolean"
                          },
                          "sidehud": {
                            "type": "boolean"
                          },
                          "bars": {
                            "enum": [
                              0,
                              1,
                              2
                            ]
                          },
                          "slots": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 12
                          }
                        }
                      },
                      "resources": {
                        "type": "array",
                        "maxItems": 6,
                        "items": {
                          "type": "object",
                          "required": [
                            "id"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "id": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_]{0,31}$"
                            },
                            "label": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 16
                            },
                            "color": {
                              "type": "string",
                              "pattern": "^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"
                            },
                            "hide": {
                              "type": "boolean"
                            }
                          }
                        }
                      },
                      "texts": {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                          "btn.book": {
                            "type": "object",
                            "additionalProperties": false,
                            "minProperties": 1,
                            "properties": {
                              "pt": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 40
                              },
                              "en": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 40
                              }
                            }
                          },
                          "btn.bags": {
                            "type": "object",
                            "additionalProperties": false,
                            "minProperties": 1,
                            "properties": {
                              "pt": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 40
                              },
                              "en": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 40
                              }
                            }
                          },
                          "btn.meter": {
                            "type": "object",
                            "additionalProperties": false,
                            "minProperties": 1,
                            "properties": {
                              "pt": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 40
                              },
                              "en": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 40
                              }
                            }
                          },
                          "btn.quests": {
                            "type": "object",
                            "additionalProperties": false,
                            "minProperties": 1,
                            "properties": {
                              "pt": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 40
                              },
                              "en": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 40
                              }
                            }
                          },
                          "btn.profs": {
                            "type": "object",
                            "additionalProperties": false,
                            "minProperties": 1,
                            "properties": {
                              "pt": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 40
                              },
                              "en": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 40
                              }
                            }
                          },
                          "btn.talents": {
                            "type": "object",
                            "additionalProperties": false,
                            "minProperties": 1,
                            "properties": {
                              "pt": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 40
                              },
                              "en": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 40
                              }
                            }
                          },
                          "btn.online": {
                            "type": "object",
                            "additionalProperties": false,
                            "minProperties": 1,
                            "properties": {
                              "pt": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 40
                              },
                              "en": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 40
                              }
                            }
                          },
                          "btn.worldhelp": {
                            "type": "object",
                            "additionalProperties": false,
                            "minProperties": 1,
                            "properties": {
                              "pt": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 40
                              },
                              "en": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 40
                              }
                            }
                          },
                          "title.help": {
                            "type": "object",
                            "additionalProperties": false,
                            "minProperties": 1,
                            "properties": {
                              "pt": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 40
                              },
                              "en": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 40
                              }
                            }
                          },
                          "help.ok": {
                            "type": "object",
                            "additionalProperties": false,
                            "minProperties": 1,
                            "properties": {
                              "pt": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 40
                              },
                              "en": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 40
                              }
                            }
                          }
                        }
                      },
                      "theme": {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                          "accent": {
                            "type": "string",
                            "pattern": "^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"
                          },
                          "panel": {
                            "type": "string",
                            "pattern": "^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"
                          },
                          "text": {
                            "type": "string",
                            "pattern": "^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"
                          }
                        }
                      },
                      "brand": {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                          "name": {
                            "type": "object",
                            "additionalProperties": false,
                            "minProperties": 1,
                            "properties": {
                              "pt": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 40
                              },
                              "en": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 40
                              }
                            }
                          },
                          "tagline": {
                            "type": "object",
                            "additionalProperties": false,
                            "minProperties": 1,
                            "properties": {
                              "pt": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 120
                              },
                              "en": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 120
                              }
                            }
                          },
                          "mark": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 8
                          },
                          "color": {
                            "type": "string",
                            "pattern": "^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"
                          }
                        }
                      },
                      "bars": {
                        "type": "array",
                        "maxItems": 4,
                        "items": {
                          "type": "object",
                          "required": [
                            "slots"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "slots": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 12
                            },
                            "cols": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 12
                            },
                            "at": {
                              "enum": [
                                "top-left",
                                "top",
                                "top-right",
                                "left",
                                "center",
                                "right",
                                "bottom-left",
                                "bottom",
                                "bottom-right"
                              ]
                            },
                            "x": {
                              "type": "integer",
                              "minimum": -2000,
                              "maximum": 2000
                            },
                            "y": {
                              "type": "integer",
                              "minimum": -2000,
                              "maximum": 2000
                            },
                            "size": {
                              "type": "integer",
                              "minimum": 24,
                              "maximum": 72
                            },
                            "spells": {
                              "type": "array",
                              "maxItems": 12,
                              "items": {
                                "type": "string",
                                "pattern": "^$|^spell:[a-z][a-z0-9_]{1,31}@\\d+\\.\\d+\\.\\d+$"
                              }
                            },
                            "label": {
                              "type": "object",
                              "additionalProperties": false,
                              "minProperties": 1,
                              "properties": {
                                "pt": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 24
                                },
                                "en": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 24
                                }
                              }
                            }
                          }
                        }
                      },
                      "place": {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                          "player": {
                            "type": "object",
                            "required": [
                              "at"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "at": {
                                "enum": [
                                  "top-left",
                                  "top",
                                  "top-right",
                                  "left",
                                  "center",
                                  "right",
                                  "bottom-left",
                                  "bottom",
                                  "bottom-right"
                                ]
                              },
                              "x": {
                                "type": "integer",
                                "minimum": -2000,
                                "maximum": 2000
                              },
                              "y": {
                                "type": "integer",
                                "minimum": -2000,
                                "maximum": 2000
                              },
                              "scale": {
                                "type": "number",
                                "minimum": 0.5,
                                "maximum": 2
                              }
                            }
                          },
                          "target": {
                            "type": "object",
                            "required": [
                              "at"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "at": {
                                "enum": [
                                  "top-left",
                                  "top",
                                  "top-right",
                                  "left",
                                  "center",
                                  "right",
                                  "bottom-left",
                                  "bottom",
                                  "bottom-right"
                                ]
                              },
                              "x": {
                                "type": "integer",
                                "minimum": -2000,
                                "maximum": 2000
                              },
                              "y": {
                                "type": "integer",
                                "minimum": -2000,
                                "maximum": 2000
                              },
                              "scale": {
                                "type": "number",
                                "minimum": 0.5,
                                "maximum": 2
                              }
                            }
                          },
                          "party": {
                            "type": "object",
                            "required": [
                              "at"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "at": {
                                "enum": [
                                  "top-left",
                                  "top",
                                  "top-right",
                                  "left",
                                  "center",
                                  "right",
                                  "bottom-left",
                                  "bottom",
                                  "bottom-right"
                                ]
                              },
                              "x": {
                                "type": "integer",
                                "minimum": -2000,
                                "maximum": 2000
                              },
                              "y": {
                                "type": "integer",
                                "minimum": -2000,
                                "maximum": 2000
                              },
                              "scale": {
                                "type": "number",
                                "minimum": 0.5,
                                "maximum": 2
                              }
                            }
                          },
                          "cast": {
                            "type": "object",
                            "required": [
                              "at"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "at": {
                                "enum": [
                                  "top-left",
                                  "top",
                                  "top-right",
                                  "left",
                                  "center",
                                  "right",
                                  "bottom-left",
                                  "bottom",
                                  "bottom-right"
                                ]
                              },
                              "x": {
                                "type": "integer",
                                "minimum": -2000,
                                "maximum": 2000
                              },
                              "y": {
                                "type": "integer",
                                "minimum": -2000,
                                "maximum": 2000
                              },
                              "scale": {
                                "type": "number",
                                "minimum": 0.5,
                                "maximum": 2
                              }
                            }
                          },
                          "xp": {
                            "type": "object",
                            "required": [
                              "at"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "at": {
                                "enum": [
                                  "top-left",
                                  "top",
                                  "top-right",
                                  "left",
                                  "center",
                                  "right",
                                  "bottom-left",
                                  "bottom",
                                  "bottom-right"
                                ]
                              },
                              "x": {
                                "type": "integer",
                                "minimum": -2000,
                                "maximum": 2000
                              },
                              "y": {
                                "type": "integer",
                                "minimum": -2000,
                                "maximum": 2000
                              },
                              "scale": {
                                "type": "number",
                                "minimum": 0.5,
                                "maximum": 2
                              }
                            }
                          },
                          "minimap": {
                            "type": "object",
                            "required": [
                              "at"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "at": {
                                "enum": [
                                  "top-left",
                                  "top",
                                  "top-right",
                                  "left",
                                  "center",
                                  "right",
                                  "bottom-left",
                                  "bottom",
                                  "bottom-right"
                                ]
                              },
                              "x": {
                                "type": "integer",
                                "minimum": -2000,
                                "maximum": 2000
                              },
                              "y": {
                                "type": "integer",
                                "minimum": -2000,
                                "maximum": 2000
                              },
                              "scale": {
                                "type": "number",
                                "minimum": 0.5,
                                "maximum": 2
                              }
                            }
                          },
                          "chat": {
                            "type": "object",
                            "required": [
                              "at"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "at": {
                                "enum": [
                                  "top-left",
                                  "top",
                                  "top-right",
                                  "left",
                                  "center",
                                  "right",
                                  "bottom-left",
                                  "bottom",
                                  "bottom-right"
                                ]
                              },
                              "x": {
                                "type": "integer",
                                "minimum": -2000,
                                "maximum": 2000
                              },
                              "y": {
                                "type": "integer",
                                "minimum": -2000,
                                "maximum": 2000
                              },
                              "scale": {
                                "type": "number",
                                "minimum": 0.5,
                                "maximum": 2
                              }
                            }
                          },
                          "log": {
                            "type": "object",
                            "required": [
                              "at"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "at": {
                                "enum": [
                                  "top-left",
                                  "top",
                                  "top-right",
                                  "left",
                                  "center",
                                  "right",
                                  "bottom-left",
                                  "bottom",
                                  "bottom-right"
                                ]
                              },
                              "x": {
                                "type": "integer",
                                "minimum": -2000,
                                "maximum": 2000
                              },
                              "y": {
                                "type": "integer",
                                "minimum": -2000,
                                "maximum": 2000
                              },
                              "scale": {
                                "type": "number",
                                "minimum": 0.5,
                                "maximum": 2
                              }
                            }
                          },
                          "goals": {
                            "type": "object",
                            "required": [
                              "at"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "at": {
                                "enum": [
                                  "top-left",
                                  "top",
                                  "top-right",
                                  "left",
                                  "center",
                                  "right",
                                  "bottom-left",
                                  "bottom",
                                  "bottom-right"
                                ]
                              },
                              "x": {
                                "type": "integer",
                                "minimum": -2000,
                                "maximum": 2000
                              },
                              "y": {
                                "type": "integer",
                                "minimum": -2000,
                                "maximum": 2000
                              },
                              "scale": {
                                "type": "number",
                                "minimum": 0.5,
                                "maximum": 2
                              }
                            }
                          },
                          "boss": {
                            "type": "object",
                            "required": [
                              "at"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "at": {
                                "enum": [
                                  "top-left",
                                  "top",
                                  "top-right",
                                  "left",
                                  "center",
                                  "right",
                                  "bottom-left",
                                  "bottom",
                                  "bottom-right"
                                ]
                              },
                              "x": {
                                "type": "integer",
                                "minimum": -2000,
                                "maximum": 2000
                              },
                              "y": {
                                "type": "integer",
                                "minimum": -2000,
                                "maximum": 2000
                              },
                              "scale": {
                                "type": "number",
                                "minimum": 0.5,
                                "maximum": 2
                              }
                            }
                          },
                          "mode": {
                            "type": "object",
                            "required": [
                              "at"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "at": {
                                "enum": [
                                  "top-left",
                                  "top",
                                  "top-right",
                                  "left",
                                  "center",
                                  "right",
                                  "bottom-left",
                                  "bottom",
                                  "bottom-right"
                                ]
                              },
                              "x": {
                                "type": "integer",
                                "minimum": -2000,
                                "maximum": 2000
                              },
                              "y": {
                                "type": "integer",
                                "minimum": -2000,
                                "maximum": 2000
                              },
                              "scale": {
                                "type": "number",
                                "minimum": 0.5,
                                "maximum": 2
                              }
                            }
                          }
                        }
                      },
                      "widgets": {
                        "type": "array",
                        "maxItems": 8,
                        "items": {
                          "type": "object",
                          "required": [
                            "var"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "var": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_]{0,31}$"
                            },
                            "kind": {
                              "enum": [
                                "number",
                                "timer",
                                "bar"
                              ]
                            },
                            "label": {
                              "type": "object",
                              "additionalProperties": false,
                              "minProperties": 1,
                              "properties": {
                                "pt": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 24
                                },
                                "en": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 24
                                }
                              }
                            },
                            "max": {
                              "oneOf": [
                                {
                                  "type": "number",
                                  "exclusiveMinimum": 0
                                },
                                {
                                  "type": "string",
                                  "pattern": "^[a-z][a-z0-9_]{0,31}$"
                                }
                              ]
                            },
                            "icon": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 8
                            },
                            "color": {
                              "type": "string",
                              "pattern": "^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"
                            },
                            "at": {
                              "enum": [
                                "top-left",
                                "top",
                                "top-right",
                                "left",
                                "center",
                                "right",
                                "bottom-left",
                                "bottom",
                                "bottom-right"
                              ]
                            },
                            "x": {
                              "type": "integer",
                              "minimum": -2000,
                              "maximum": 2000
                            },
                            "y": {
                              "type": "integer",
                              "minimum": -2000,
                              "maximum": 2000
                            }
                          }
                        }
                      }
                    }
                  },
                  "meta": {
                    "type": "object",
                    "required": [
                      "perMatch"
                    ],
                    "additionalProperties": false,
                    "description": "what a player keeps between matches: a share of the gold to the account, and what it buys outside the matches",
                    "properties": {
                      "perMatch": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 1
                      },
                      "perWin": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 1
                      },
                      "cancel": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 1
                      },
                      "dailyCap": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 1000000
                      },
                      "unlocks": {
                        "type": "array",
                        "maxItems": 64,
                        "items": {
                          "type": "object",
                          "required": [
                            "id",
                            "kind",
                            "price"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "id": {
                              "type": "string",
                              "pattern": "^[A-Za-z0-9_:@.-]{1,64}$"
                            },
                            "kind": {
                              "enum": [
                                "spell",
                                "item",
                                "look"
                              ]
                            },
                            "price": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 1000000
                            },
                            "lv": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 9
                            }
                          }
                        }
                      }
                    }
                  },
                  "collection": {
                    "type": "object",
                    "additionalProperties": false,
                    "description": "what the world takes from the account's collection (looks, mounts, titles) and what it gives to it",
                    "properties": {
                      "accept": {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                          "looks": {
                            "type": "boolean"
                          },
                          "rides": {
                            "type": "boolean"
                          },
                          "titles": {
                            "type": "boolean"
                          },
                          "frames": {
                            "type": "boolean"
                          },
                          "effects": {
                            "type": "boolean"
                          }
                        }
                      },
                      "gives": {
                        "type": "array",
                        "maxItems": 32,
                        "items": {
                          "type": "object",
                          "required": [
                            "id",
                            "kind",
                            "name",
                            "when"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "id": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_]{0,23}$"
                            },
                            "kind": {
                              "enum": [
                                "look",
                                "ride",
                                "title",
                                "frame",
                                "effect"
                              ]
                            },
                            "name": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 40
                            },
                            "look": {
                              "type": "string"
                            },
                            "ride": {
                              "type": "string"
                            },
                            "when": {
                              "type": "object",
                              "additionalProperties": false,
                              "minProperties": 1,
                              "properties": {
                                "wins": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 100000
                                },
                                "matches": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 100000
                                },
                                "kills": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 100000
                                },
                                "chests": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 100000
                                },
                                "rounds": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 100000
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  },
                  "wardrobe": {
                    "type": "object",
                    "additionalProperties": false,
                    "description": "turns the account's wardrobe on in this world (the player shows the sets and weapons won in any game; looks only) and says what the world opens for it",
                    "properties": {
                      "allow": {
                        "oneOf": [
                          {
                            "const": "all-free"
                          },
                          {
                            "type": "array",
                            "minItems": 1,
                            "maxItems": 64,
                            "uniqueItems": true,
                            "items": {
                              "enum": [
                                "campones",
                                "patrulheiro",
                                "camponesa",
                                "couro_f",
                                "malha_f",
                                "placa_f",
                                "bastiao_pacto",
                                "bastiao_legiao",
                                "atiradora_pacto",
                                "atiradora_legiao",
                                "elementalista_pacto",
                                "elementalista_legiao",
                                "sacerdotisa_pacto",
                                "sacerdotisa_legiao",
                                "runista_pacto",
                                "runista_legiao",
                                "colosso_obsidiana",
                                "soldado_pacto",
                                "soldado_legiao",
                                "atirador_pacto",
                                "atirador_legiao",
                                "onda_que_anda",
                                "druida_pacto",
                                "druida_legiao",
                                "guardiao_pacto",
                                "guardiao_legiao",
                                "monge_pacto",
                                "monge_legiao",
                                "rastreador_pacto",
                                "rastreador_legiao",
                                "bruxo_pacto",
                                "bruxo_legiao",
                                "geadeira_pacto",
                                "geadeira_legiao",
                                "vidente_pacto",
                                "vidente_legiao",
                                "cantor_pacto",
                                "cantor_legiao",
                                "assassino_pacto",
                                "assassino_legiao",
                                "barbaro_pacto",
                                "barbaro_legiao",
                                "feiticeiro_rubro",
                                "xama",
                                "mago_azul",
                                "juramentado_chifre",
                                "sem_dor",
                                "mariposa_negra",
                                "dancarino_crepusculo",
                                "escriba_veu",
                                "arqueira_veu",
                                "vigia_bosque",
                                "diabrete_avesso",
                                "amigo_pinho",
                                "amigo_caju",
                                "amigo_tatu",
                                "amigo_mare",
                                "paladino_pacto",
                                "paladino_legiao",
                                "cavaleiro",
                                "pirata",
                                "arqueiro",
                                "mago_rubro_lay",
                                "mago_azul_lay",
                                "elfo_lay",
                                "troll_lay",
                                "azul_lay",
                                "vermelho_lay",
                                "sem_arma",
                                "espada_gasto",
                                "espada_comum",
                                "espada_fino",
                                "maca_gasto",
                                "maca_comum",
                                "maca_fino",
                                "martelo_gasto",
                                "martelo_comum",
                                "martelo_fino",
                                "machado_gasto",
                                "machado_comum",
                                "machado_fino",
                                "adaga_gasto",
                                "adaga_comum",
                                "adaga_fino",
                                "cajado_gasto",
                                "cajado_comum",
                                "cajado_fino",
                                "arco_gasto",
                                "arco_comum",
                                "arco_fino",
                                "soqueira_gasto",
                                "soqueira_comum",
                                "soqueira_fino",
                                "escudo_broquel_gasto",
                                "escudo_broquel_comum",
                                "escudo_broquel_fino",
                                "escudo_redondo_gasto",
                                "escudo_redondo_comum",
                                "escudo_redondo_fino",
                                "escudo_torre_gasto",
                                "escudo_torre_comum",
                                "escudo_torre_fino",
                                "espada_grande_gasto",
                                "espada_grande_comum",
                                "espada_grande_fino",
                                "machado_grande_gasto",
                                "machado_grande_comum",
                                "machado_grande_fino",
                                "lanca_gasto",
                                "lanca_comum",
                                "lanca_fino",
                                "varinha_gasto",
                                "varinha_comum",
                                "varinha_fino",
                                "tomo_gasto",
                                "tomo_comum",
                                "tomo_fino",
                                "escudo_pacto_gasto",
                                "escudo_pacto_comum",
                                "escudo_pacto_fino",
                                "escudo_legiao_gasto",
                                "escudo_legiao_comum",
                                "escudo_legiao_fino"
                              ]
                            }
                          }
                        ],
                        "description": "what may be worn here: every entry with free art (default) or a list of ids of the catalog (hero.wardrobe.skins / hero.wardrobe.weapons)"
                      },
                      "unlocksFrom": {
                        "type": "array",
                        "uniqueItems": true,
                        "items": {
                          "enum": [
                            "loot",
                            "chest",
                            "shop",
                            "quest",
                            "craft",
                            "reward"
                          ]
                        },
                        "description": "the pickups of this world that open entries for the account (left out: none)"
                      }
                    }
                  },
                  "classBridge": {
                    "type": "object",
                    "required": [
                      "classes"
                    ],
                    "additionalProperties": false,
                    "description": "what a class of the player's RPG character becomes in this world: a look, a title, the basic spell or a whole kit, the pick's option, a level cap",
                    "properties": {
                      "classes": {
                        "type": "object",
                        "maxProperties": 24,
                        "propertyNames": {
                          "pattern": "^[a-z][a-z0-9_]{0,23}$"
                        },
                        "additionalProperties": {
                          "type": "object",
                          "additionalProperties": false,
                          "properties": {
                            "look": {
                              "type": "string"
                            },
                            "title": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 40
                            },
                            "about": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 160
                            },
                            "basic": {
                              "type": "string",
                              "pattern": "^spell:[a-z][a-z0-9_]{1,31}@\\d+\\.\\d+\\.\\d+$"
                            },
                            "kit": {
                              "type": "array",
                              "minItems": 1,
                              "maxItems": 8,
                              "items": {
                                "type": "string",
                                "pattern": "^spell:[a-z][a-z0-9_]{1,31}@\\d+\\.\\d+\\.\\d+$"
                              }
                            },
                            "choice": {
                              "type": "string",
                              "pattern": "^[a-z0-9_]{1,24}$"
                            },
                            "levelCap": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 100
                            }
                          }
                        }
                      },
                      "minLevel": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 100
                      },
                      "levelCap": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 100
                      }
                    }
                  },
                  "modeTalents": {
                    "type": "object",
                    "required": [
                      "rows"
                    ],
                    "additionalProperties": false,
                    "description": "a small tree of talents won by playing this world, worth only here: rows that open at a mastery level, each a choice of two or three options of the same weight",
                    "properties": {
                      "mastery": {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                          "match": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 20
                          },
                          "win": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 20
                          },
                          "round": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 20
                          },
                          "step": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 1000
                          }
                        }
                      },
                      "rows": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 6,
                        "items": {
                          "type": "object",
                          "required": [
                            "id",
                            "at",
                            "options"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "id": {
                              "type": "string",
                              "pattern": "^[a-z][a-z0-9_]{0,23}$"
                            },
                            "at": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 30
                            },
                            "options": {
                              "type": "array",
                              "minItems": 2,
                              "maxItems": 3,
                              "items": {
                                "type": "object",
                                "required": [
                                  "id",
                                  "name",
                                  "perk"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "id": {
                                    "type": "string",
                                    "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                  },
                                  "name": {
                                    "type": "string",
                                    "minLength": 1,
                                    "maxLength": 32
                                  },
                                  "about": {
                                    "type": "string",
                                    "maxLength": 120
                                  },
                                  "perk": {
                                    "type": "object",
                                    "minProperties": 1,
                                    "additionalProperties": false,
                                    "properties": {
                                      "life": {
                                        "type": "number",
                                        "exclusiveMinimum": 0,
                                        "maximum": 0.1
                                      },
                                      "damage": {
                                        "type": "number",
                                        "exclusiveMinimum": 0,
                                        "maximum": 0.1
                                      },
                                      "armor": {
                                        "type": "number",
                                        "exclusiveMinimum": 0,
                                        "maximum": 0.1
                                      },
                                      "speed": {
                                        "type": "number",
                                        "exclusiveMinimum": 0,
                                        "maximum": 0.1
                                      },
                                      "castTime": {
                                        "type": "number",
                                        "exclusiveMinimum": 0,
                                        "maximum": 0.1
                                      },
                                      "attackSpeed": {
                                        "type": "number",
                                        "exclusiveMinimum": 0,
                                        "maximum": 0.1
                                      },
                                      "push": {
                                        "type": "number",
                                        "exclusiveMinimum": 0,
                                        "maximum": 0.1
                                      },
                                      "pushResist": {
                                        "type": "number",
                                        "exclusiveMinimum": 0,
                                        "maximum": 0.1
                                      },
                                      "regen": {
                                        "type": "number",
                                        "exclusiveMinimum": 0,
                                        "maximum": 0.1
                                      },
                                      "ringResist": {
                                        "type": "number",
                                        "exclusiveMinimum": 0,
                                        "maximum": 0.1
                                      },
                                      "hazardResist": {
                                        "type": "number",
                                        "exclusiveMinimum": 0,
                                        "maximum": 0.1
                                      },
                                      "chestSpeed": {
                                        "type": "number",
                                        "exclusiveMinimum": 0,
                                        "maximum": 0.1
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  },
                  "achievements": {
                    "type": "array",
                    "maxItems": 40,
                    "description": "the world's achievements: a condition, a reward, a banner and a window (rooms maps only)",
                    "items": {
                      "type": "object",
                      "required": [
                        "id",
                        "name",
                        "text",
                        "when"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "id": {
                          "type": "string",
                          "pattern": "^[a-z][a-z0-9_]{0,23}$"
                        },
                        "name": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 40
                        },
                        "text": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 200
                        },
                        "icon": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 8
                        },
                        "hidden": {
                          "type": "boolean"
                        },
                        "announce": {
                          "type": "boolean"
                        },
                        "when": {
                          "oneOf": [
                            {
                              "type": "object",
                              "required": [
                                "type",
                                "count"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "type": {
                                  "const": "kills"
                                },
                                "count": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 1000000
                                },
                                "creature": {
                                  "type": "string",
                                  "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                }
                              }
                            },
                            {
                              "type": "object",
                              "required": [
                                "type",
                                "stat",
                                "value"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "type": {
                                  "const": "stat"
                                },
                                "stat": {
                                  "type": "string",
                                  "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                },
                                "value": {
                                  "type": "integer",
                                  "minimum": 1,
                                  "maximum": 1000000
                                }
                              }
                            },
                            {
                              "type": "object",
                              "required": [
                                "type",
                                "name",
                                "value"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "type": {
                                  "const": "var"
                                },
                                "name": {
                                  "type": "string",
                                  "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                },
                                "op": {
                                  "enum": [
                                    "=",
                                    "!=",
                                    ">",
                                    ">=",
                                    "<",
                                    "<="
                                  ]
                                },
                                "value": {
                                  "type": [
                                    "number",
                                    "string",
                                    "boolean"
                                  ]
                                }
                              }
                            },
                            {
                              "type": "object",
                              "required": [
                                "type"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "type": {
                                  "const": "rule"
                                }
                              }
                            }
                          ]
                        },
                        "rewards": {
                          "type": "object",
                          "additionalProperties": false,
                          "properties": {
                            "xp": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 100000
                            },
                            "money": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 1000000
                            },
                            "items": {
                              "type": "array",
                              "minItems": 1,
                              "maxItems": 4,
                              "items": {
                                "type": "string",
                                "pattern": "^item:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                              }
                            },
                            "spells": {
                              "type": "array",
                              "minItems": 1,
                              "maxItems": 2,
                              "items": {
                                "type": "string",
                                "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                              }
                            }
                          }
                        }
                      }
                    }
                  },
                  "worldEvents": {
                    "type": "array",
                    "maxItems": 6,
                    "description": "group events of the world: a band comes to a place, the players around defend it (rooms maps only)",
                    "items": {
                      "type": "object",
                      "required": [
                        "id",
                        "name",
                        "region",
                        "announce",
                        "win",
                        "lose",
                        "trigger",
                        "units",
                        "phases"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "id": {
                          "type": "string",
                          "pattern": "^[a-z][a-z0-9_]{0,23}$"
                        },
                        "name": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 40
                        },
                        "icon": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 8
                        },
                        "region": {
                          "type": "string",
                          "pattern": "^[^/]+/[^/]+$"
                        },
                        "entries": {
                          "type": "array",
                          "minItems": 1,
                          "maxItems": 6,
                          "items": {
                            "type": "string",
                            "pattern": "^[^/]+/[^/]+$"
                          }
                        },
                        "level": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 100
                        },
                        "announce": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 200
                        },
                        "win": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 200
                        },
                        "lose": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 200
                        },
                        "trigger": {
                          "oneOf": [
                            {
                              "type": "object",
                              "required": [
                                "mode"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "mode": {
                                  "const": "random"
                                },
                                "chance": {
                                  "type": "number",
                                  "minimum": 0.01,
                                  "maximum": 1
                                },
                                "checkMin": {
                                  "type": "number",
                                  "minimum": 0.05,
                                  "maximum": 120
                                },
                                "cooldownMin": {
                                  "type": "number",
                                  "minimum": 0.1,
                                  "maximum": 1440
                                },
                                "phase": {
                                  "enum": [
                                    "any",
                                    "day",
                                    "night"
                                  ]
                                },
                                "weekdays": {
                                  "type": "array",
                                  "minItems": 1,
                                  "items": {
                                    "type": "integer",
                                    "minimum": 0,
                                    "maximum": 6
                                  }
                                },
                                "hours": {
                                  "type": "array",
                                  "minItems": 2,
                                  "maxItems": 2,
                                  "items": {
                                    "type": "integer",
                                    "minimum": 0,
                                    "maximum": 24
                                  }
                                }
                              }
                            },
                            {
                              "type": "object",
                              "required": [
                                "mode"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "mode": {
                                  "const": "region"
                                },
                                "cooldownMin": {
                                  "type": "number",
                                  "minimum": 0.1,
                                  "maximum": 1440
                                }
                              }
                            },
                            {
                              "type": "object",
                              "required": [
                                "mode",
                                "afterSec"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "mode": {
                                  "const": "timer"
                                },
                                "afterSec": {
                                  "type": "number",
                                  "minimum": 1,
                                  "maximum": 3600
                                },
                                "cooldownMin": {
                                  "type": "number",
                                  "minimum": 0.1,
                                  "maximum": 1440
                                }
                              }
                            },
                            {
                              "type": "object",
                              "required": [
                                "mode"
                              ],
                              "additionalProperties": false,
                              "properties": {
                                "mode": {
                                  "const": "rule"
                                },
                                "cooldownMin": {
                                  "type": "number",
                                  "minimum": 0.1,
                                  "maximum": 1440
                                }
                              }
                            }
                          ]
                        },
                        "units": {
                          "type": "object",
                          "minProperties": 1,
                          "maxProperties": 6,
                          "propertyNames": {
                            "type": "string",
                            "pattern": "^[a-z][a-z0-9_]{0,23}$"
                          },
                          "additionalProperties": {
                            "type": "string",
                            "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                          }
                        },
                        "phases": {
                          "type": "array",
                          "minItems": 1,
                          "maxItems": 5,
                          "items": {
                            "type": "object",
                            "required": [
                              "kind",
                              "text"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "kind": {
                                "enum": [
                                  "clear",
                                  "defend",
                                  "hold",
                                  "boss"
                                ]
                              },
                              "text": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 200
                              },
                              "spawn": {
                                "type": "array",
                                "minItems": 1,
                                "maxItems": 4,
                                "items": {
                                  "type": "array",
                                  "minItems": 2,
                                  "maxItems": 2,
                                  "items": [
                                    {
                                      "type": "string",
                                      "pattern": "^[a-z][a-z0-9_]{0,23}$"
                                    },
                                    {
                                      "type": "integer",
                                      "minimum": 1,
                                      "maximum": 12
                                    }
                                  ]
                                }
                              },
                              "limit": {
                                "type": "number",
                                "minimum": 10,
                                "maximum": 3600
                              },
                              "protect": {
                                "type": "string",
                                "pattern": "^[a-z][a-z0-9_]{0,23}$"
                              },
                              "seconds": {
                                "type": "number",
                                "minimum": 5,
                                "maximum": 3600
                              },
                              "every": {
                                "type": "number",
                                "minimum": 3,
                                "maximum": 300
                              },
                              "perWave": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 6
                              },
                              "holdRadius": {
                                "type": "number",
                                "minimum": 3,
                                "maximum": 60
                              },
                              "maxAlive": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 30
                              },
                              "boss": {
                                "type": "string",
                                "pattern": "^[a-z][a-z0-9_]{0,23}$"
                              },
                              "at": {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 5
                              },
                              "yell": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 200
                              }
                            }
                          }
                        },
                        "rewards": {
                          "type": "object",
                          "additionalProperties": false,
                          "properties": {
                            "xpPct": {
                              "type": "number",
                              "minimum": 0.01,
                              "maximum": 2
                            },
                            "money": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 1000000
                            },
                            "items": {
                              "type": "array",
                              "minItems": 1,
                              "maxItems": 4,
                              "items": {
                                "type": "array",
                                "minItems": 2,
                                "maxItems": 2,
                                "items": [
                                  {
                                    "type": "string",
                                    "pattern": "^item:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                  },
                                  {
                                    "type": "integer",
                                    "minimum": 1,
                                    "maximum": 99
                                  }
                                ]
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                },
                "additionalProperties": false
              }
            }
          },
          {
            "type": "object",
            "required": [
              "kind",
              "key",
              "name",
              "draft"
            ],
            "properties": {
              "kind": {
                "const": "class"
              },
              "key": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9_]{1,31}$"
              },
              "name": {
                "type": "string",
                "minLength": 3,
                "maxLength": 40
              },
              "draft": {
                "type": "object",
                "required": [
                  "v",
                  "name",
                  "stats",
                  "spells"
                ],
                "additionalProperties": false,
                "properties": {
                  "v": {
                    "const": 1
                  },
                  "name": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 32
                  },
                  "description": {
                    "type": "string",
                    "maxLength": 200
                  },
                  "color": {
                    "type": "string",
                    "pattern": "^#[0-9a-fA-F]{6}$"
                  },
                  "role": {
                    "enum": [
                      "dps",
                      "tank",
                      "heal",
                      "support"
                    ]
                  },
                  "resource": {
                    "type": "object",
                    "required": [
                      "name",
                      "max"
                    ],
                    "additionalProperties": false,
                    "description": "the class bar: spell rows may cost it",
                    "properties": {
                      "name": {
                        "type": "string",
                        "minLength": 3,
                        "maxLength": 32
                      },
                      "color": {
                        "type": "string",
                        "pattern": "^#[0-9a-fA-F]{6}$"
                      },
                      "max": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 1000
                      },
                      "start": {
                        "enum": [
                          "full",
                          "empty"
                        ]
                      },
                      "regen": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 50
                      },
                      "decay": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 50
                      },
                      "gainDealt": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 100
                      },
                      "gainTaken": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 100
                      },
                      "display": {
                        "enum": [
                          "bar",
                          "pips"
                        ]
                      }
                    }
                  },
                  "stats": {
                    "type": "object",
                    "required": [
                      "hp"
                    ],
                    "additionalProperties": false,
                    "description": "what the player sees at level 1 and at the last level of the curve",
                    "properties": {
                      "hp": {
                        "type": "array",
                        "minItems": 2,
                        "maxItems": 2,
                        "items": {
                          "type": "number",
                          "minimum": 1,
                          "maximum": 1000000
                        }
                      },
                      "ap": {
                        "type": "array",
                        "minItems": 2,
                        "maxItems": 2,
                        "items": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 100000
                        }
                      },
                      "sp": {
                        "type": "array",
                        "minItems": 2,
                        "maxItems": 2,
                        "items": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 100000
                        }
                      },
                      "crit": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 60
                      },
                      "weapon": {
                        "type": "array",
                        "minItems": 2,
                        "maxItems": 2,
                        "items": {
                          "type": "array",
                          "minItems": 2,
                          "maxItems": 2,
                          "items": {
                            "type": "number",
                            "minimum": 1,
                            "maximum": 100000
                          }
                        }
                      }
                    }
                  },
                  "spells": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 24,
                    "items": {
                      "type": "object",
                      "required": [
                        "level",
                        "spell"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "level": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 60
                        },
                        "spell": {
                          "type": "string",
                          "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                        },
                        "cost": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 1000
                        }
                      }
                    }
                  },
                  "marcos": {
                    "type": "array",
                    "maxItems": 4,
                    "items": {
                      "type": "object",
                      "required": [
                        "level",
                        "options"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "level": {
                          "type": "integer",
                          "minimum": 2,
                          "maximum": 60
                        },
                        "options": {
                          "type": "array",
                          "minItems": 2,
                          "maxItems": 3,
                          "items": {
                            "type": "object",
                            "required": [
                              "name"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "name": {
                                "type": "string",
                                "minLength": 3,
                                "maxLength": 32
                              },
                              "desc": {
                                "type": "string",
                                "maxLength": 120
                              },
                              "stats": {
                                "type": "object",
                                "additionalProperties": false,
                                "minProperties": 1,
                                "properties": {
                                  "maxHp": {
                                    "type": "number",
                                    "minimum": -2000,
                                    "maximum": 5000
                                  },
                                  "ap": {
                                    "type": "number",
                                    "minimum": -500,
                                    "maximum": 1000
                                  },
                                  "sp": {
                                    "type": "number",
                                    "minimum": -500,
                                    "maximum": 1000
                                  },
                                  "crit": {
                                    "type": "number",
                                    "minimum": -20,
                                    "maximum": 30
                                  },
                                  "haste": {
                                    "type": "number",
                                    "minimum": -20,
                                    "maximum": 40
                                  },
                                  "dmg": {
                                    "type": "number",
                                    "minimum": -0.5,
                                    "maximum": 1
                                  },
                                  "healing": {
                                    "type": "number",
                                    "minimum": -0.5,
                                    "maximum": 1
                                  },
                                  "regen_hp": {
                                    "type": "number",
                                    "minimum": -0.5,
                                    "maximum": 3
                                  }
                                }
                              },
                              "mods": {
                                "type": "array",
                                "maxItems": 3,
                                "items": {
                                  "type": "object",
                                  "required": [
                                    "prop",
                                    "value"
                                  ],
                                  "additionalProperties": false,
                                  "properties": {
                                    "prop": {
                                      "enum": [
                                        "damage",
                                        "healing",
                                        "cost",
                                        "cooldown",
                                        "castTime",
                                        "crit"
                                      ]
                                    },
                                    "value": {
                                      "type": "number"
                                    },
                                    "spells": {
                                      "type": "array",
                                      "minItems": 1,
                                      "items": {
                                        "type": "string",
                                        "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                      }
                                    }
                                  }
                                }
                              },
                              "spell": {
                                "type": "string",
                                "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                              }
                            }
                          }
                        }
                      }
                    }
                  },
                  "startItems": {
                    "type": "array",
                    "maxItems": 4,
                    "items": {
                      "type": "string",
                      "pattern": "^item:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                    }
                  },
                  "look": {
                    "anyOf": [
                      {
                        "type": "string",
                        "pattern": "^look:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                      },
                      {
                        "enum": [
                          "ext_combatente_pesado_a",
                          "ext_combatente_pesado_b",
                          "ext_conjurador_a",
                          "ext_conjurador_b",
                          "ext_devoto_a",
                          "ext_devoto_b",
                          "ext_batedor_a",
                          "ext_batedor_b",
                          "ext_guardiao_mata_a",
                          "ext_guardiao_mata_b"
                        ]
                      }
                    ],
                    "description": "how a character of the class looks: a look of the project or one of the hero looks of the game (catalog hero.heroLooks)"
                  },
                  "skin": {
                    "enum": [
                      "campones",
                      "patrulheiro",
                      "camponesa",
                      "couro_f",
                      "malha_f",
                      "placa_f",
                      "bastiao_pacto",
                      "bastiao_legiao",
                      "atiradora_pacto",
                      "atiradora_legiao",
                      "elementalista_pacto",
                      "elementalista_legiao",
                      "sacerdotisa_pacto",
                      "sacerdotisa_legiao",
                      "runista_pacto",
                      "runista_legiao",
                      "colosso_obsidiana",
                      "soldado_pacto",
                      "soldado_legiao",
                      "atirador_pacto",
                      "atirador_legiao",
                      "onda_que_anda",
                      "druida_pacto",
                      "druida_legiao",
                      "guardiao_pacto",
                      "guardiao_legiao",
                      "monge_pacto",
                      "monge_legiao",
                      "rastreador_pacto",
                      "rastreador_legiao",
                      "bruxo_pacto",
                      "bruxo_legiao",
                      "geadeira_pacto",
                      "geadeira_legiao",
                      "vidente_pacto",
                      "vidente_legiao",
                      "cantor_pacto",
                      "cantor_legiao",
                      "assassino_pacto",
                      "assassino_legiao",
                      "barbaro_pacto",
                      "barbaro_legiao",
                      "feiticeiro_rubro",
                      "xama",
                      "mago_azul",
                      "juramentado_chifre",
                      "sem_dor",
                      "mariposa_negra",
                      "dancarino_crepusculo",
                      "escriba_veu",
                      "arqueira_veu",
                      "vigia_bosque",
                      "diabrete_avesso",
                      "amigo_pinho",
                      "amigo_caju",
                      "amigo_tatu",
                      "amigo_mare",
                      "paladino_pacto",
                      "paladino_legiao",
                      "cavaleiro",
                      "pirata",
                      "arqueiro",
                      "mago_rubro_lay",
                      "mago_azul_lay",
                      "elfo_lay",
                      "troll_lay",
                      "azul_lay",
                      "vermelho_lay"
                    ],
                    "description": "the wardrobe skin the character wears in 3D (catalog hero.wardrobe.skins); left out: the wardrobe's default for the class (e.g. the Paladin wears the Paladin's dress)"
                  },
                  "ai": {
                    "type": "object",
                    "additionalProperties": false,
                    "description": "how companions and AI players play the class; left out: the generic pattern (its spells by simple priority)",
                    "properties": {
                      "style": {
                        "enum": [
                          "melee",
                          "ranged"
                        ]
                      },
                      "icon": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 32
                      },
                      "rotation": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 12,
                        "items": {
                          "type": "string",
                          "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                        },
                        "description": "damage spells of the class, in the order the AI presses them"
                      },
                      "heal": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 12,
                        "items": {
                          "type": "string",
                          "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                        },
                        "description": "healing spells of the class, in the order the AI uses them"
                      },
                      "gear": {
                        "enum": [
                          "caster",
                          "agile",
                          "brute"
                        ]
                      },
                      "interrupt": {
                        "type": "string",
                        "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                      },
                      "steps": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 16,
                        "description": "the damage rotation with conditions, tried in order: the first that can be cast and holds is used",
                        "items": {
                          "type": "object",
                          "required": [
                            "spell"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "spell": {
                              "type": "string",
                              "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                            },
                            "flag": {
                              "enum": [
                                "loose"
                              ]
                            },
                            "when": {
                              "type": "object",
                              "minProperties": 1,
                              "maxProperties": 1,
                              "propertyNames": {
                                "enum": [
                                  "near",
                                  "pack",
                                  "members",
                                  "self",
                                  "wp",
                                  "hurtGroup",
                                  "hurtAround",
                                  "noDot",
                                  "noAura",
                                  "hasAura",
                                  "noObject",
                                  "noGroup",
                                  "noTargetGroup",
                                  "tankLacks",
                                  "spec",
                                  "notSpec",
                                  "stacks",
                                  "tstacks",
                                  "res",
                                  "casting",
                                  "noPet",
                                  "hasPet",
                                  "tamed",
                                  "loose",
                                  "pvp",
                                  "behind",
                                  "solo",
                                  "ooc",
                                  "worstTank",
                                  "worstThreat",
                                  "hp",
                                  "range",
                                  "state",
                                  "spread",
                                  "role",
                                  "notRole",
                                  "worstHas",
                                  "all",
                                  "any",
                                  "not"
                                ]
                              },
                              "description": "a condition of one key (all / any / not combine them); catalog hero.conditions"
                            }
                          }
                        }
                      },
                      "keep": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 16,
                        "description": "buffs kept up, tried before the damage",
                        "items": {
                          "type": "object",
                          "required": [
                            "spell"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "spell": {
                              "type": "string",
                              "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                            },
                            "flag": {
                              "enum": [
                                "loose"
                              ]
                            },
                            "when": {
                              "type": "object",
                              "minProperties": 1,
                              "maxProperties": 1,
                              "propertyNames": {
                                "enum": [
                                  "near",
                                  "pack",
                                  "members",
                                  "self",
                                  "wp",
                                  "hurtGroup",
                                  "hurtAround",
                                  "noDot",
                                  "noAura",
                                  "hasAura",
                                  "noObject",
                                  "noGroup",
                                  "noTargetGroup",
                                  "tankLacks",
                                  "spec",
                                  "notSpec",
                                  "stacks",
                                  "tstacks",
                                  "res",
                                  "casting",
                                  "noPet",
                                  "hasPet",
                                  "tamed",
                                  "loose",
                                  "pvp",
                                  "behind",
                                  "solo",
                                  "ooc",
                                  "worstTank",
                                  "worstThreat",
                                  "hp",
                                  "range",
                                  "state",
                                  "spread",
                                  "role",
                                  "notRole",
                                  "worstHas",
                                  "all",
                                  "any",
                                  "not"
                                ]
                              },
                              "description": "a condition of one key (all / any / not combine them); catalog hero.conditions"
                            }
                          }
                        }
                      },
                      "healSteps": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 16,
                        "description": "the healing ladder on the most hurt partner",
                        "items": {
                          "type": "object",
                          "required": [
                            "spell"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "spell": {
                              "type": "string",
                              "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                            },
                            "flag": {
                              "enum": [
                                "tank",
                                "loose"
                              ]
                            },
                            "when": {
                              "type": "object",
                              "minProperties": 1,
                              "maxProperties": 1,
                              "propertyNames": {
                                "enum": [
                                  "near",
                                  "pack",
                                  "members",
                                  "self",
                                  "wp",
                                  "hurtGroup",
                                  "hurtAround",
                                  "noDot",
                                  "noAura",
                                  "hasAura",
                                  "noObject",
                                  "noGroup",
                                  "noTargetGroup",
                                  "tankLacks",
                                  "spec",
                                  "notSpec",
                                  "stacks",
                                  "tstacks",
                                  "res",
                                  "casting",
                                  "noPet",
                                  "hasPet",
                                  "tamed",
                                  "loose",
                                  "pvp",
                                  "behind",
                                  "solo",
                                  "ooc",
                                  "worstTank",
                                  "worstThreat",
                                  "hp",
                                  "range",
                                  "state",
                                  "spread",
                                  "role",
                                  "notRole",
                                  "worstHas",
                                  "all",
                                  "any",
                                  "not"
                                ]
                              },
                              "description": "a condition of one key (all / any / not combine them); catalog hero.conditions"
                            }
                          }
                        }
                      }
                    }
                  },
                  "specLevel": {
                    "type": "integer",
                    "minimum": 2,
                    "maximum": 60,
                    "description": "the level the specialization is chosen at (default 10)"
                  },
                  "specs": {
                    "type": "array",
                    "minItems": 2,
                    "maxItems": 4,
                    "items": {
                      "type": "object",
                      "required": [
                        "key",
                        "name",
                        "spells"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "key": {
                          "type": "string",
                          "pattern": "^[a-z][a-z0-9_]{1,23}$"
                        },
                        "name": {
                          "type": "string",
                          "minLength": 3,
                          "maxLength": 32
                        },
                        "description": {
                          "type": "string",
                          "maxLength": 200
                        },
                        "icon": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 32
                        },
                        "roles": {
                          "type": "array",
                          "minItems": 1,
                          "maxItems": 3,
                          "uniqueItems": true,
                          "items": {
                            "enum": [
                              "tank",
                              "heal",
                              "dps"
                            ]
                          }
                        },
                        "resource": {
                          "type": "object",
                          "required": [
                            "name",
                            "max"
                          ],
                          "additionalProperties": false,
                          "description": "the class bar: spell rows may cost it",
                          "properties": {
                            "name": {
                              "type": "string",
                              "minLength": 3,
                              "maxLength": 32
                            },
                            "color": {
                              "type": "string",
                              "pattern": "^#[0-9a-fA-F]{6}$"
                            },
                            "max": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 1000
                            },
                            "start": {
                              "enum": [
                                "full",
                                "empty"
                              ]
                            },
                            "regen": {
                              "type": "number",
                              "minimum": 0,
                              "maximum": 50
                            },
                            "decay": {
                              "type": "number",
                              "minimum": 0,
                              "maximum": 50
                            },
                            "gainDealt": {
                              "type": "number",
                              "minimum": 0,
                              "maximum": 100
                            },
                            "gainTaken": {
                              "type": "number",
                              "minimum": 0,
                              "maximum": 100
                            },
                            "display": {
                              "enum": [
                                "bar",
                                "pips"
                              ]
                            }
                          }
                        },
                        "stats": {
                          "type": "object",
                          "additionalProperties": false,
                          "minProperties": 1,
                          "properties": {
                            "maxHp": {
                              "type": "number",
                              "minimum": -2000,
                              "maximum": 5000
                            },
                            "ap": {
                              "type": "number",
                              "minimum": -500,
                              "maximum": 1000
                            },
                            "sp": {
                              "type": "number",
                              "minimum": -500,
                              "maximum": 1000
                            },
                            "crit": {
                              "type": "number",
                              "minimum": -20,
                              "maximum": 30
                            },
                            "haste": {
                              "type": "number",
                              "minimum": -20,
                              "maximum": 40
                            },
                            "dmg": {
                              "type": "number",
                              "minimum": -0.5,
                              "maximum": 1
                            },
                            "healing": {
                              "type": "number",
                              "minimum": -0.5,
                              "maximum": 1
                            },
                            "regen_hp": {
                              "type": "number",
                              "minimum": -0.5,
                              "maximum": 3
                            }
                          }
                        },
                        "spells": {
                          "type": "array",
                          "minItems": 1,
                          "maxItems": 16,
                          "items": {
                            "type": "object",
                            "required": [
                              "level",
                              "spell"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "level": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 60
                              },
                              "spell": {
                                "type": "string",
                                "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                              },
                              "cost": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 1000
                              }
                            }
                          }
                        },
                        "marcos": {
                          "type": "array",
                          "maxItems": 3,
                          "items": {
                            "type": "object",
                            "required": [
                              "level",
                              "options"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "level": {
                                "type": "integer",
                                "minimum": 2,
                                "maximum": 60
                              },
                              "options": {
                                "type": "array",
                                "minItems": 2,
                                "maxItems": 3,
                                "items": {
                                  "type": "object",
                                  "required": [
                                    "name"
                                  ],
                                  "additionalProperties": false,
                                  "properties": {
                                    "name": {
                                      "type": "string",
                                      "minLength": 3,
                                      "maxLength": 32
                                    },
                                    "desc": {
                                      "type": "string",
                                      "maxLength": 120
                                    },
                                    "stats": {
                                      "type": "object",
                                      "additionalProperties": false,
                                      "minProperties": 1,
                                      "properties": {
                                        "maxHp": {
                                          "type": "number",
                                          "minimum": -2000,
                                          "maximum": 5000
                                        },
                                        "ap": {
                                          "type": "number",
                                          "minimum": -500,
                                          "maximum": 1000
                                        },
                                        "sp": {
                                          "type": "number",
                                          "minimum": -500,
                                          "maximum": 1000
                                        },
                                        "crit": {
                                          "type": "number",
                                          "minimum": -20,
                                          "maximum": 30
                                        },
                                        "haste": {
                                          "type": "number",
                                          "minimum": -20,
                                          "maximum": 40
                                        },
                                        "dmg": {
                                          "type": "number",
                                          "minimum": -0.5,
                                          "maximum": 1
                                        },
                                        "healing": {
                                          "type": "number",
                                          "minimum": -0.5,
                                          "maximum": 1
                                        },
                                        "regen_hp": {
                                          "type": "number",
                                          "minimum": -0.5,
                                          "maximum": 3
                                        }
                                      }
                                    },
                                    "mods": {
                                      "type": "array",
                                      "maxItems": 3,
                                      "items": {
                                        "type": "object",
                                        "required": [
                                          "prop",
                                          "value"
                                        ],
                                        "additionalProperties": false,
                                        "properties": {
                                          "prop": {
                                            "enum": [
                                              "damage",
                                              "healing",
                                              "cost",
                                              "cooldown",
                                              "castTime",
                                              "crit"
                                            ]
                                          },
                                          "value": {
                                            "type": "number"
                                          },
                                          "spells": {
                                            "type": "array",
                                            "minItems": 1,
                                            "items": {
                                              "type": "string",
                                              "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                            }
                                          }
                                        }
                                      }
                                    },
                                    "spell": {
                                      "type": "string",
                                      "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                    }
                                  }
                                }
                              }
                            }
                          }
                        },
                        "style": {
                          "enum": [
                            "melee",
                            "ranged"
                          ]
                        },
                        "ai": {
                          "type": "object",
                          "additionalProperties": false,
                          "properties": {
                            "steps": {
                              "type": "array",
                              "minItems": 1,
                              "maxItems": 16,
                              "description": "the damage rotation with conditions, tried in order: the first that can be cast and holds is used",
                              "items": {
                                "type": "object",
                                "required": [
                                  "spell"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "spell": {
                                    "type": "string",
                                    "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                  },
                                  "flag": {
                                    "enum": [
                                      "loose"
                                    ]
                                  },
                                  "when": {
                                    "type": "object",
                                    "minProperties": 1,
                                    "maxProperties": 1,
                                    "propertyNames": {
                                      "enum": [
                                        "near",
                                        "pack",
                                        "members",
                                        "self",
                                        "wp",
                                        "hurtGroup",
                                        "hurtAround",
                                        "noDot",
                                        "noAura",
                                        "hasAura",
                                        "noObject",
                                        "noGroup",
                                        "noTargetGroup",
                                        "tankLacks",
                                        "spec",
                                        "notSpec",
                                        "stacks",
                                        "tstacks",
                                        "res",
                                        "casting",
                                        "noPet",
                                        "hasPet",
                                        "tamed",
                                        "loose",
                                        "pvp",
                                        "behind",
                                        "solo",
                                        "ooc",
                                        "worstTank",
                                        "worstThreat",
                                        "hp",
                                        "range",
                                        "state",
                                        "spread",
                                        "role",
                                        "notRole",
                                        "worstHas",
                                        "all",
                                        "any",
                                        "not"
                                      ]
                                    },
                                    "description": "a condition of one key (all / any / not combine them); catalog hero.conditions"
                                  }
                                }
                              }
                            },
                            "keep": {
                              "type": "array",
                              "minItems": 1,
                              "maxItems": 16,
                              "description": "buffs kept up, tried before the damage",
                              "items": {
                                "type": "object",
                                "required": [
                                  "spell"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "spell": {
                                    "type": "string",
                                    "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                  },
                                  "flag": {
                                    "enum": [
                                      "loose"
                                    ]
                                  },
                                  "when": {
                                    "type": "object",
                                    "minProperties": 1,
                                    "maxProperties": 1,
                                    "propertyNames": {
                                      "enum": [
                                        "near",
                                        "pack",
                                        "members",
                                        "self",
                                        "wp",
                                        "hurtGroup",
                                        "hurtAround",
                                        "noDot",
                                        "noAura",
                                        "hasAura",
                                        "noObject",
                                        "noGroup",
                                        "noTargetGroup",
                                        "tankLacks",
                                        "spec",
                                        "notSpec",
                                        "stacks",
                                        "tstacks",
                                        "res",
                                        "casting",
                                        "noPet",
                                        "hasPet",
                                        "tamed",
                                        "loose",
                                        "pvp",
                                        "behind",
                                        "solo",
                                        "ooc",
                                        "worstTank",
                                        "worstThreat",
                                        "hp",
                                        "range",
                                        "state",
                                        "spread",
                                        "role",
                                        "notRole",
                                        "worstHas",
                                        "all",
                                        "any",
                                        "not"
                                      ]
                                    },
                                    "description": "a condition of one key (all / any / not combine them); catalog hero.conditions"
                                  }
                                }
                              }
                            },
                            "healSteps": {
                              "type": "array",
                              "minItems": 1,
                              "maxItems": 16,
                              "description": "the healing ladder on the most hurt partner",
                              "items": {
                                "type": "object",
                                "required": [
                                  "spell"
                                ],
                                "additionalProperties": false,
                                "properties": {
                                  "spell": {
                                    "type": "string",
                                    "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                  },
                                  "flag": {
                                    "enum": [
                                      "tank",
                                      "loose"
                                    ]
                                  },
                                  "when": {
                                    "type": "object",
                                    "minProperties": 1,
                                    "maxProperties": 1,
                                    "propertyNames": {
                                      "enum": [
                                        "near",
                                        "pack",
                                        "members",
                                        "self",
                                        "wp",
                                        "hurtGroup",
                                        "hurtAround",
                                        "noDot",
                                        "noAura",
                                        "hasAura",
                                        "noObject",
                                        "noGroup",
                                        "noTargetGroup",
                                        "tankLacks",
                                        "spec",
                                        "notSpec",
                                        "stacks",
                                        "tstacks",
                                        "res",
                                        "casting",
                                        "noPet",
                                        "hasPet",
                                        "tamed",
                                        "loose",
                                        "pvp",
                                        "behind",
                                        "solo",
                                        "ooc",
                                        "worstTank",
                                        "worstThreat",
                                        "hp",
                                        "range",
                                        "state",
                                        "spread",
                                        "role",
                                        "notRole",
                                        "worstHas",
                                        "all",
                                        "any",
                                        "not"
                                      ]
                                    },
                                    "description": "a condition of one key (all / any / not combine them); catalog hero.conditions"
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    },
                    "description": "the specializations: each its own spells, bar, Marcos and AI steps"
                  },
                  "talents": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 3,
                    "items": {
                      "type": "object",
                      "required": [
                        "key",
                        "name",
                        "talents"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "key": {
                          "type": "string",
                          "pattern": "^[a-z][a-z0-9_]{1,23}$"
                        },
                        "name": {
                          "type": "string",
                          "minLength": 3,
                          "maxLength": 32
                        },
                        "spec": {
                          "type": "string",
                          "pattern": "^[a-z][a-z0-9_]{1,23}$"
                        },
                        "talents": {
                          "type": "array",
                          "minItems": 1,
                          "maxItems": 10,
                          "items": {
                            "type": "object",
                            "required": [
                              "key",
                              "name"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "key": {
                                "type": "string",
                                "pattern": "^[a-z][a-z0-9_]{1,23}$"
                              },
                              "name": {
                                "type": "string",
                                "minLength": 3,
                                "maxLength": 32
                              },
                              "desc": {
                                "type": "string",
                                "maxLength": 120
                              },
                              "max": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 5
                              },
                              "tier": {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 4
                              },
                              "col": {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 3
                              },
                              "req": {
                                "type": "string",
                                "pattern": "^[a-z][a-z0-9_]{1,23}$"
                              },
                              "stats": {
                                "type": "object",
                                "additionalProperties": false,
                                "minProperties": 1,
                                "properties": {
                                  "maxHp": {
                                    "type": "number",
                                    "minimum": -2000,
                                    "maximum": 5000
                                  },
                                  "ap": {
                                    "type": "number",
                                    "minimum": -500,
                                    "maximum": 1000
                                  },
                                  "sp": {
                                    "type": "number",
                                    "minimum": -500,
                                    "maximum": 1000
                                  },
                                  "crit": {
                                    "type": "number",
                                    "minimum": -20,
                                    "maximum": 30
                                  },
                                  "haste": {
                                    "type": "number",
                                    "minimum": -20,
                                    "maximum": 40
                                  },
                                  "dmg": {
                                    "type": "number",
                                    "minimum": -0.5,
                                    "maximum": 1
                                  },
                                  "healing": {
                                    "type": "number",
                                    "minimum": -0.5,
                                    "maximum": 1
                                  },
                                  "regen_hp": {
                                    "type": "number",
                                    "minimum": -0.5,
                                    "maximum": 3
                                  }
                                }
                              },
                              "mods": {
                                "type": "array",
                                "maxItems": 3,
                                "items": {
                                  "type": "object",
                                  "required": [
                                    "prop",
                                    "value"
                                  ],
                                  "additionalProperties": false,
                                  "properties": {
                                    "prop": {
                                      "enum": [
                                        "damage",
                                        "healing",
                                        "cost",
                                        "cooldown",
                                        "castTime",
                                        "crit"
                                      ]
                                    },
                                    "value": {
                                      "type": "number"
                                    },
                                    "spells": {
                                      "type": "array",
                                      "minItems": 1,
                                      "items": {
                                        "type": "string",
                                        "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                                      }
                                    }
                                  }
                                }
                              },
                              "spell": {
                                "type": "string",
                                "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                              }
                            }
                          }
                        }
                      }
                    },
                    "description": "talent trees"
                  },
                  "master": {
                    "type": "boolean",
                    "description": "the specialization and the talents change only at a class master (a map character with trains: \"class\")"
                  },
                  "respecCost": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 1000000,
                    "description": "copper charged to change the specialization or give the talent points back (the first choice is free)"
                  }
                }
              }
            }
          },
          {
            "type": "object",
            "required": [
              "kind",
              "key",
              "name",
              "draft"
            ],
            "properties": {
              "kind": {
                "const": "race"
              },
              "key": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9_]{1,31}$"
              },
              "name": {
                "type": "string",
                "minLength": 3,
                "maxLength": 40
              },
              "draft": {
                "type": "object",
                "required": [
                  "v",
                  "name"
                ],
                "additionalProperties": false,
                "properties": {
                  "v": {
                    "const": 1
                  },
                  "name": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 32
                  },
                  "description": {
                    "type": "string",
                    "maxLength": 200
                  },
                  "classes": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 12,
                    "uniqueItems": true,
                    "items": {
                      "type": "string",
                      "pattern": "^class:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                    },
                    "description": "the classes it can be (left out: all)"
                  },
                  "racial": {
                    "type": "array",
                    "maxItems": 2,
                    "items": {
                      "type": "string",
                      "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                    }
                  },
                  "stats": {
                    "type": "object",
                    "additionalProperties": false,
                    "minProperties": 1,
                    "properties": {
                      "maxHp": {
                        "type": "number",
                        "minimum": -2000,
                        "maximum": 5000
                      },
                      "ap": {
                        "type": "number",
                        "minimum": -500,
                        "maximum": 1000
                      },
                      "sp": {
                        "type": "number",
                        "minimum": -500,
                        "maximum": 1000
                      },
                      "crit": {
                        "type": "number",
                        "minimum": -20,
                        "maximum": 30
                      },
                      "haste": {
                        "type": "number",
                        "minimum": -20,
                        "maximum": 40
                      },
                      "dmg": {
                        "type": "number",
                        "minimum": -0.5,
                        "maximum": 1
                      },
                      "healing": {
                        "type": "number",
                        "minimum": -0.5,
                        "maximum": 1
                      },
                      "regen_hp": {
                        "type": "number",
                        "minimum": -0.5,
                        "maximum": 3
                      }
                    }
                  },
                  "look": {
                    "type": "string",
                    "pattern": "^look:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                  },
                  "lookF": {
                    "type": "string",
                    "pattern": "^look:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                  },
                  "skin": {
                    "enum": [
                      "campones",
                      "patrulheiro",
                      "camponesa",
                      "couro_f",
                      "malha_f",
                      "placa_f",
                      "bastiao_pacto",
                      "bastiao_legiao",
                      "atiradora_pacto",
                      "atiradora_legiao",
                      "elementalista_pacto",
                      "elementalista_legiao",
                      "sacerdotisa_pacto",
                      "sacerdotisa_legiao",
                      "runista_pacto",
                      "runista_legiao",
                      "colosso_obsidiana",
                      "soldado_pacto",
                      "soldado_legiao",
                      "atirador_pacto",
                      "atirador_legiao",
                      "onda_que_anda",
                      "druida_pacto",
                      "druida_legiao",
                      "guardiao_pacto",
                      "guardiao_legiao",
                      "monge_pacto",
                      "monge_legiao",
                      "rastreador_pacto",
                      "rastreador_legiao",
                      "bruxo_pacto",
                      "bruxo_legiao",
                      "geadeira_pacto",
                      "geadeira_legiao",
                      "vidente_pacto",
                      "vidente_legiao",
                      "cantor_pacto",
                      "cantor_legiao",
                      "assassino_pacto",
                      "assassino_legiao",
                      "barbaro_pacto",
                      "barbaro_legiao",
                      "feiticeiro_rubro",
                      "xama",
                      "mago_azul",
                      "juramentado_chifre",
                      "sem_dor",
                      "mariposa_negra",
                      "dancarino_crepusculo",
                      "escriba_veu",
                      "arqueira_veu",
                      "vigia_bosque",
                      "diabrete_avesso",
                      "amigo_pinho",
                      "amigo_caju",
                      "amigo_tatu",
                      "amigo_mare",
                      "paladino_pacto",
                      "paladino_legiao",
                      "cavaleiro",
                      "pirata",
                      "arqueiro",
                      "mago_rubro_lay",
                      "mago_azul_lay",
                      "elfo_lay",
                      "troll_lay",
                      "azul_lay",
                      "vermelho_lay"
                    ],
                    "description": "the wardrobe skin the character wears in 3D (catalog hero.wardrobe.skins); left out: the wardrobe's default for the class (e.g. the Paladin wears the Paladin's dress)"
                  },
                  "body": {
                    "type": "object",
                    "additionalProperties": false,
                    "description": "the body of the paper doll (both genders)",
                    "properties": {
                      "height": {
                        "type": "number",
                        "minimum": 0.6,
                        "maximum": 1.6
                      },
                      "width": {
                        "type": "number",
                        "minimum": 0.6,
                        "maximum": 1.8
                      },
                      "headSize": {
                        "type": "number",
                        "minimum": 0.7,
                        "maximum": 1.4
                      },
                      "skin": {
                        "type": "string",
                        "pattern": "^#[0-9a-fA-F]{6}$"
                      },
                      "hairColor": {
                        "type": "string",
                        "pattern": "^#[0-9a-fA-F]{6}$"
                      },
                      "eyes": {
                        "type": "string",
                        "pattern": "^#[0-9a-fA-F]{6}$"
                      },
                      "ears": {
                        "enum": [
                          "none",
                          "pointy",
                          "long"
                        ]
                      },
                      "horns": {
                        "enum": [
                          "none",
                          "small",
                          "big"
                        ]
                      },
                      "hair": {
                        "enum": [
                          "none",
                          "short",
                          "long",
                          "mohawk",
                          "ponytail",
                          "bun"
                        ]
                      },
                      "beard": {
                        "enum": [
                          "none",
                          "short",
                          "long",
                          "braided"
                        ]
                      },
                      "tusks": {
                        "type": "boolean"
                      }
                    }
                  },
                  "bodyF": {
                    "type": "object",
                    "additionalProperties": false,
                    "description": "over body, for the women",
                    "properties": {
                      "height": {
                        "type": "number",
                        "minimum": 0.6,
                        "maximum": 1.6
                      },
                      "width": {
                        "type": "number",
                        "minimum": 0.6,
                        "maximum": 1.8
                      },
                      "headSize": {
                        "type": "number",
                        "minimum": 0.7,
                        "maximum": 1.4
                      },
                      "skin": {
                        "type": "string",
                        "pattern": "^#[0-9a-fA-F]{6}$"
                      },
                      "hairColor": {
                        "type": "string",
                        "pattern": "^#[0-9a-fA-F]{6}$"
                      },
                      "eyes": {
                        "type": "string",
                        "pattern": "^#[0-9a-fA-F]{6}$"
                      },
                      "ears": {
                        "enum": [
                          "none",
                          "pointy",
                          "long"
                        ]
                      },
                      "horns": {
                        "enum": [
                          "none",
                          "small",
                          "big"
                        ]
                      },
                      "hair": {
                        "enum": [
                          "none",
                          "short",
                          "long",
                          "mohawk",
                          "ponytail",
                          "bun"
                        ]
                      },
                      "beard": {
                        "enum": [
                          "none",
                          "short",
                          "long",
                          "braided"
                        ]
                      },
                      "tusks": {
                        "type": "boolean"
                      }
                    }
                  }
                }
              }
            }
          },
          {
            "type": "object",
            "required": [
              "kind",
              "key",
              "name",
              "draft"
            ],
            "properties": {
              "kind": {
                "const": "curve"
              },
              "key": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9_]{1,31}$"
              },
              "name": {
                "type": "string",
                "minLength": 3,
                "maxLength": 40
              },
              "draft": {
                "type": "object",
                "required": [
                  "v",
                  "name",
                  "maxLevel"
                ],
                "additionalProperties": false,
                "properties": {
                  "v": {
                    "const": 1
                  },
                  "name": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 32
                  },
                  "maxLevel": {
                    "type": "integer",
                    "minimum": 2,
                    "maximum": 60
                  },
                  "xp": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 59,
                    "items": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 10000000
                    },
                    "description": "maxLevel − 1 numbers: the XP that takes level i to i+1"
                  },
                  "base": {
                    "type": "number",
                    "minimum": 10,
                    "maximum": 100000
                  },
                  "growth": {
                    "type": "number",
                    "minimum": 1,
                    "maximum": 2
                  },
                  "kill": {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "base": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 5000
                      },
                      "perLevel": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 500
                      },
                      "above": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 1
                      },
                      "aboveMax": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 5
                      },
                      "below": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 1
                      },
                      "greyAt": {
                        "type": "number",
                        "minimum": 1,
                        "maximum": 60
                      },
                      "elite": {
                        "type": "number",
                        "minimum": 1,
                        "maximum": 20
                      },
                      "boss": {
                        "type": "number",
                        "minimum": 1,
                        "maximum": 50
                      },
                      "groupBonus": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 1
                      }
                    }
                  },
                  "talents": {
                    "type": "object",
                    "additionalProperties": false,
                    "description": "talent points",
                    "properties": {
                      "firstLevel": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 60
                      },
                      "perLevel": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 5
                      },
                      "perTier": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 10
                      }
                    }
                  }
                }
              }
            }
          },
          {
            "type": "object",
            "required": [
              "kind",
              "key",
              "name",
              "draft"
            ],
            "properties": {
              "kind": {
                "const": "profession"
              },
              "key": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9_]{1,31}$"
              },
              "name": {
                "type": "string",
                "minLength": 3,
                "maxLength": 40
              },
              "draft": {
                "type": "object",
                "required": [
                  "v",
                  "name",
                  "max"
                ],
                "additionalProperties": false,
                "properties": {
                  "v": {
                    "const": 1
                  },
                  "name": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 32
                  },
                  "icon": {
                    "type": "string",
                    "maxLength": 80
                  },
                  "description": {
                    "type": "string",
                    "maxLength": 200
                  },
                  "max": {
                    "type": "integer",
                    "minimum": 25,
                    "maximum": 300
                  },
                  "primary": {
                    "type": "boolean"
                  },
                  "tool": {
                    "type": "string",
                    "pattern": "^item:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                  },
                  "cost": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 1000000
                  },
                  "curve": {
                    "type": "array",
                    "minItems": 3,
                    "maxItems": 3,
                    "items": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 300
                    },
                    "description": "skill points above a level where it is orange, yellow and green (rising); then grey"
                  },
                  "recipes": {
                    "type": "array",
                    "maxItems": 12,
                    "items": {
                      "type": "object",
                      "required": [
                        "id",
                        "req",
                        "reagents",
                        "result"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "id": {
                          "type": "string",
                          "pattern": "^[a-z][a-z0-9_]{0,23}$"
                        },
                        "req": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 300
                        },
                        "reagents": {
                          "type": "array",
                          "minItems": 1,
                          "maxItems": 4,
                          "items": {
                            "type": "object",
                            "required": [
                              "item",
                              "count"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "item": {
                                "type": "string",
                                "pattern": "^item:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                              },
                              "count": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 20
                              }
                            }
                          }
                        },
                        "result": {
                          "type": "object",
                          "required": [
                            "item"
                          ],
                          "additionalProperties": false,
                          "properties": {
                            "item": {
                              "type": "string",
                              "pattern": "^item:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                            },
                            "count": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 20
                            }
                          }
                        },
                        "station": {
                          "enum": [
                            "forge",
                            "anvil",
                            "campfire"
                          ]
                        },
                        "cost": {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 1000000
                        },
                        "start": {
                          "type": "boolean"
                        }
                      }
                    }
                  },
                  "nodes": {
                    "type": "array",
                    "maxItems": 8,
                    "items": {
                      "type": "object",
                      "required": [
                        "id",
                        "name",
                        "req",
                        "item"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "id": {
                          "type": "string",
                          "pattern": "^[a-z][a-z0-9_]{0,23}$"
                        },
                        "name": {
                          "type": "string",
                          "minLength": 3,
                          "maxLength": 32
                        },
                        "req": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 300
                        },
                        "item": {
                          "type": "string",
                          "pattern": "^item:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                        },
                        "amount": {
                          "type": "array",
                          "minItems": 2,
                          "maxItems": 2,
                          "items": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 20
                          }
                        },
                        "extra": {
                          "type": "array",
                          "maxItems": 3,
                          "items": {
                            "type": "object",
                            "required": [
                              "item",
                              "chance"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "item": {
                                "type": "string",
                                "pattern": "^item:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                              },
                              "chance": {
                                "type": "number",
                                "exclusiveMinimum": 0,
                                "maximum": 1
                              }
                            }
                          }
                        },
                        "respawn": {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 3600
                        },
                        "look": {
                          "enum": [
                            "ore",
                            "herb",
                            "fish",
                            "corpse"
                          ]
                        },
                        "color": {
                          "type": "string",
                          "pattern": "^#[0-9a-fA-F]{6}$"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          {
            "type": "object",
            "required": [
              "kind",
              "key",
              "name",
              "draft"
            ],
            "properties": {
              "kind": {
                "const": "loot"
              },
              "key": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9_]{1,31}$"
              },
              "name": {
                "type": "string",
                "minLength": 3,
                "maxLength": 40
              },
              "draft": {
                "type": "object",
                "required": [
                  "v",
                  "name",
                  "drops"
                ],
                "additionalProperties": false,
                "properties": {
                  "v": {
                    "const": 1
                  },
                  "name": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 32
                  },
                  "money": {
                    "type": "array",
                    "minItems": 2,
                    "maxItems": 2,
                    "items": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 100000
                    }
                  },
                  "drops": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 12,
                    "items": {
                      "type": "object",
                      "required": [
                        "chance"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "item": {
                          "type": "string",
                          "pattern": "^item:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                        },
                        "pool": {
                          "type": "array",
                          "minItems": 2,
                          "maxItems": 8,
                          "uniqueItems": true,
                          "items": {
                            "type": "string",
                            "pattern": "^item:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                          },
                          "description": "instead of item: one of these is drawn"
                        },
                        "chance": {
                          "type": "number",
                          "exclusiveMinimum": 0,
                          "maximum": 1
                        },
                        "count": {
                          "type": "array",
                          "minItems": 2,
                          "maxItems": 2,
                          "items": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 99
                          }
                        },
                        "quest": {
                          "type": "boolean",
                          "description": "with item only: it drops only while a quest of the character asks for the item"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          {
            "type": "object",
            "required": [
              "kind",
              "key",
              "name",
              "draft"
            ],
            "properties": {
              "kind": {
                "const": "itemset"
              },
              "key": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9_]{1,31}$"
              },
              "name": {
                "type": "string",
                "minLength": 3,
                "maxLength": 40
              },
              "draft": {
                "type": "object",
                "required": [
                  "v",
                  "name",
                  "pieces",
                  "bonuses"
                ],
                "additionalProperties": false,
                "properties": {
                  "v": {
                    "const": 1
                  },
                  "name": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 32
                  },
                  "pieces": {
                    "type": "array",
                    "minItems": 2,
                    "maxItems": 8,
                    "uniqueItems": true,
                    "items": {
                      "type": "string",
                      "pattern": "^item:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                    }
                  },
                  "bonuses": {
                    "type": "array",
                    "minItems": 1,
                    "maxItems": 4,
                    "items": {
                      "type": "object",
                      "required": [
                        "count",
                        "stats"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "count": {
                          "type": "integer",
                          "minimum": 2,
                          "maximum": 8
                        },
                        "desc": {
                          "type": "string",
                          "maxLength": 80
                        },
                        "stats": {
                          "type": "object",
                          "minProperties": 1,
                          "propertyNames": {
                            "enum": [
                              "str",
                              "agi",
                              "sta",
                              "int",
                              "spi",
                              "spd",
                              "hpw",
                              "mp5",
                              "ap",
                              "crit",
                              "spellCrit",
                              "attackSpeed",
                              "armor",
                              "dmgTaken",
                              "block",
                              "dodge",
                              "threat",
                              "regen_energy",
                              "castTime",
                              "dmgDone_physical",
                              "dmgDone_fire",
                              "dmgDone_frost",
                              "dmgDone_nature",
                              "dmgDone_shadow",
                              "dmgDone_holy",
                              "dmgDone_arcane"
                            ]
                          },
                          "additionalProperties": {
                            "type": "number",
                            "minimum": -200,
                            "maximum": 200
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          {
            "type": "object",
            "required": [
              "kind",
              "key",
              "name",
              "draft"
            ],
            "properties": {
              "kind": {
                "const": "shop"
              },
              "key": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9_]{1,31}$"
              },
              "name": {
                "type": "string",
                "minLength": 3,
                "maxLength": 40
              },
              "draft": {
                "type": "object",
                "required": [
                  "v",
                  "name",
                  "sells"
                ],
                "additionalProperties": false,
                "properties": {
                  "v": {
                    "const": 1
                  },
                  "name": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 32
                  },
                  "buys": {
                    "enum": [
                      "all",
                      "listed",
                      "none"
                    ]
                  },
                  "buyRate": {
                    "type": "number",
                    "minimum": 0.1,
                    "maximum": 2
                  },
                  "sells": {
                    "type": "array",
                    "maxItems": 24,
                    "items": {
                      "type": "object",
                      "required": [
                        "item",
                        "price"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "item": {
                          "type": "string",
                          "pattern": "^item:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                        },
                        "price": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 1000000
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          {
            "type": "object",
            "required": [
              "kind",
              "key",
              "name",
              "draft"
            ],
            "properties": {
              "kind": {
                "const": "encounter"
              },
              "key": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9_]{1,31}$"
              },
              "name": {
                "type": "string",
                "minLength": 3,
                "maxLength": 40
              },
              "draft": {
                "type": "object",
                "required": [
                  "v",
                  "name"
                ],
                "additionalProperties": false,
                "properties": {
                  "v": {
                    "const": 1
                  },
                  "name": {
                    "type": "string",
                    "minLength": 3,
                    "maxLength": 32
                  },
                  "yells": {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "aggro": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 120
                      },
                      "death": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 120
                      },
                      "kill": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 120
                      }
                    }
                  },
                  "phases": {
                    "type": "array",
                    "maxItems": 4,
                    "description": "phase 2, 3… in order; phase 1 is the opening",
                    "items": {
                      "type": "object",
                      "required": [
                        "at"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "at": {
                          "type": "object",
                          "minProperties": 1,
                          "maxProperties": 1,
                          "additionalProperties": false,
                          "description": "how the phase begins: exactly one key",
                          "properties": {
                            "hpBelow": {
                              "type": "integer",
                              "minimum": 1,
                              "maximum": 99
                            },
                            "after": {
                              "type": "integer",
                              "minimum": 5,
                              "maximum": 3600
                            },
                            "addsDead": {
                              "const": true
                            }
                          }
                        },
                        "yell": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 120
                        },
                        "summon": {
                          "type": "array",
                          "minItems": 1,
                          "maxItems": 3,
                          "items": {
                            "type": "object",
                            "required": [
                              "creature"
                            ],
                            "additionalProperties": false,
                            "properties": {
                              "creature": {
                                "type": "string",
                                "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                              },
                              "count": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 6
                              },
                              "radius": {
                                "type": "number",
                                "minimum": 2,
                                "maximum": 10
                              }
                            }
                          }
                        },
                        "shield": {
                          "type": "boolean"
                        }
                      }
                    }
                  },
                  "abilities": {
                    "type": "array",
                    "maxItems": 6,
                    "items": {
                      "type": "object",
                      "required": [
                        "spell",
                        "every"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "spell": {
                          "type": "string",
                          "pattern": "^spell:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                        },
                        "every": {
                          "oneOf": [
                            {
                              "type": "integer",
                              "minimum": 2,
                              "maximum": 600
                            },
                            {
                              "type": "array",
                              "minItems": 2,
                              "maxItems": 2,
                              "items": {
                                "type": "integer",
                                "minimum": 2,
                                "maximum": 600
                              }
                            }
                          ],
                          "description": "seconds, or [min, max] seconds drawn each time"
                        },
                        "first": {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 600
                        },
                        "target": {
                          "enum": [
                            "tank",
                            "random",
                            "randomNotTank",
                            "farthest",
                            "nearest",
                            "self"
                          ]
                        },
                        "phases": {
                          "type": "array",
                          "minItems": 1,
                          "maxItems": 5,
                          "uniqueItems": true,
                          "items": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 5
                          },
                          "description": "phase numbers (1 is the opening); left out: all"
                        },
                        "unstoppable": {
                          "type": "boolean"
                        }
                      }
                    }
                  },
                  "adds": {
                    "type": "array",
                    "maxItems": 2,
                    "items": {
                      "type": "object",
                      "required": [
                        "creature",
                        "every"
                      ],
                      "additionalProperties": false,
                      "properties": {
                        "creature": {
                          "type": "string",
                          "pattern": "^creature:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                        },
                        "count": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 6
                        },
                        "every": {
                          "oneOf": [
                            {
                              "type": "integer",
                              "minimum": 2,
                              "maximum": 600
                            },
                            {
                              "type": "array",
                              "minItems": 2,
                              "maxItems": 2,
                              "items": {
                                "type": "integer",
                                "minimum": 2,
                                "maximum": 600
                              }
                            }
                          ],
                          "description": "seconds, or [min, max] seconds drawn each time"
                        },
                        "first": {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 600
                        },
                        "max": {
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 12
                        },
                        "radius": {
                          "type": "number",
                          "minimum": 2,
                          "maximum": 10
                        },
                        "phases": {
                          "type": "array",
                          "minItems": 1,
                          "maxItems": 5,
                          "uniqueItems": true,
                          "items": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 5
                          },
                          "description": "phase numbers (1 is the opening); left out: all"
                        }
                      }
                    }
                  },
                  "enrage": {
                    "type": "object",
                    "required": [
                      "damage"
                    ],
                    "additionalProperties": false,
                    "properties": {
                      "after": {
                        "type": "integer",
                        "minimum": 10,
                        "maximum": 3600
                      },
                      "hpBelow": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 99
                      },
                      "damage": {
                        "type": "number",
                        "minimum": 1.1,
                        "maximum": 5
                      },
                      "haste": {
                        "type": "number",
                        "minimum": 1,
                        "maximum": 2
                      },
                      "yell": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 120
                      }
                    }
                  },
                  "immune": {
                    "type": "array",
                    "minItems": 1,
                    "uniqueItems": true,
                    "items": {
                      "enum": [
                        "stun",
                        "root",
                        "silence"
                      ]
                    }
                  },
                  "levels": {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "normal": {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                          "hp": {
                            "type": "number",
                            "minimum": 1,
                            "maximum": 6
                          },
                          "damage": {
                            "type": "number",
                            "minimum": 1,
                            "maximum": 4
                          },
                          "adds": {
                            "type": "number",
                            "minimum": 1,
                            "maximum": 3
                          },
                          "loot": {
                            "type": "string",
                            "pattern": "^loot:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                          }
                        }
                      },
                      "heroic": {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                          "hp": {
                            "type": "number",
                            "minimum": 1,
                            "maximum": 6
                          },
                          "damage": {
                            "type": "number",
                            "minimum": 1,
                            "maximum": 4
                          },
                          "adds": {
                            "type": "number",
                            "minimum": 1,
                            "maximum": 3
                          },
                          "loot": {
                            "type": "string",
                            "pattern": "^loot:[a-z][a-z0-9_]{1,31}@1\\.0\\.0$"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        ]
      }
    },
    "uses": {
      "type": "array",
      "maxItems": 1,
      "items": {
        "type": "string",
        "pattern": "^[a-z0-9]+([.-][a-z0-9]+)+@[0-9xX*^~<>=. ]+$"
      },
      "description": "the pack the project builds on, e.g. [\"hellarena.base@1.x\"]: its spells, items and creatures are cited like the file's own and are not copied (see /ai/base.json)"
    },
    "wishes": {
      "type": "array",
      "maxItems": 20,
      "items": {
        "type": "object",
        "required": [
          "want"
        ],
        "properties": {
          "want": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300
          },
          "used": {
            "type": "string",
            "maxLength": 300
          },
          "piece": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    }
  }
}
