{
  "$ref": "#/definitions/GdRoot",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "definitions": {
    "EEnemySize": {
      "enum": [
        0,
        1,
        2
      ],
      "type": "number"
    },
    "EProjectileEffectType": {
      "const": 0,
      "type": "number"
    },
    "GdEnemy": {
      "additionalProperties": false,
      "properties": {
        "speed": {
          "type": "number"
        }
      },
      "required": [
        "speed"
      ],
      "type": "object"
    },
    "GdLevel": {
      "additionalProperties": false,
      "properties": {
        "currency": {
          "type": "number"
        },
        "enemyRoutes": {
          "items": {
            "items": {
              "type": "number"
            },
            "type": "array"
          },
          "type": "array"
        },
        "enemySpawns": {
          "items": {
            "$ref": "#/definitions/Hex"
          },
          "type": "array"
        },
        "enemyTargets": {
          "items": {
            "$ref": "#/definitions/Hex"
          },
          "type": "array"
        },
        "radius": {
          "type": "number"
        },
        "walls": {
          "items": {
            "$ref": "#/definitions/Hex"
          },
          "type": "array"
        },
        "waves": {
          "items": {
            "$ref": "#/definitions/GdWave"
          },
          "type": "array"
        }
      },
      "required": [
        "radius",
        "currency",
        "walls",
        "enemySpawns",
        "enemyTargets",
        "enemyRoutes",
        "waves"
      ],
      "type": "object"
    },
    "GdProjectileEffect": {
      "additionalProperties": false,
      "properties": {
        "amount": {
          "type": "number"
        },
        "speed": {
          "type": "number"
        },
        "type": {
          "$ref": "#/definitions/EProjectileEffectType"
        }
      },
      "required": [
        "type",
        "amount",
        "speed"
      ],
      "type": "object"
    },
    "GdRoot": {
      "additionalProperties": false,
      "properties": {
        "enemies": {
          "items": {
            "$ref": "#/definitions/GdEnemy"
          },
          "type": "array"
        },
        "levels": {
          "items": {
            "$ref": "#/definitions/GdLevel"
          },
          "type": "array"
        },
        "simulation": {
          "$ref": "#/definitions/GdSimulation"
        },
        "towers": {
          "items": {
            "$ref": "#/definitions/GdTower"
          },
          "type": "array"
        }
      },
      "required": [
        "enemies",
        "towers",
        "levels",
        "simulation"
      ],
      "type": "object"
    },
    "GdSimulation": {
      "additionalProperties": false,
      "properties": {
        "spawnDelay": {
          "type": "number"
        },
        "stepsPerSecond": {
          "type": "number"
        },
        "waveDuration": {
          "type": "number"
        }
      },
      "required": [
        "stepsPerSecond",
        "waveDuration",
        "spawnDelay"
      ],
      "type": "object"
    },
    "GdTower": {
      "additionalProperties": false,
      "properties": {
        "aoeEffect": {
          "anyOf": [
            {
              "$ref": "#/definitions/GdProjectileEffect"
            },
            {
              "type": "null"
            }
          ]
        },
        "aoeRange": {
          "type": "number"
        },
        "aoeRate": {
          "type": "number"
        },
        "cost": {
          "type": "number"
        },
        "projectileEffect": {
          "anyOf": [
            {
              "$ref": "#/definitions/GdProjectileEffect"
            },
            {
              "type": "null"
            }
          ]
        },
        "projectileRange": {
          "type": "number"
        },
        "projectileRate": {
          "type": "number"
        },
        "projectileSize": {
          "type": "number"
        }
      },
      "required": [
        "cost",
        "projectileEffect",
        "projectileRange",
        "projectileRate",
        "projectileSize",
        "aoeEffect",
        "aoeRange",
        "aoeRate"
      ],
      "type": "object"
    },
    "GdWave": {
      "additionalProperties": false,
      "properties": {
        "amount": {
          "type": "number"
        },
        "enemy": {
          "type": "number"
        },
        "gain": {
          "type": "number"
        },
        "hitpoints": {
          "type": "number"
        },
        "size": {
          "$ref": "#/definitions/EEnemySize"
        }
      },
      "required": [
        "enemy",
        "size",
        "amount",
        "gain",
        "hitpoints"
      ],
      "type": "object"
    },
    "Hex": {
      "additionalProperties": false,
      "properties": {
        "col": {
          "type": "number"
        },
        "row": {
          "type": "number"
        }
      },
      "required": [
        "col",
        "row"
      ],
      "type": "object"
    }
  }
}