{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "version": {
      "type": "number",
      "const": 1
    },
    "name": {
      "type": "string",
      "minLength": 3,
      "maxLength": 80
    },
    "description": {
      "type": "string",
      "maxLength": 400
    },
    "presentation": {
      "type": "object",
      "properties": {
        "version": {
          "type": "number",
          "const": 1
        },
        "grid": {
          "type": "object",
          "properties": {
            "columns": {
              "type": "integer",
              "minimum": 1,
              "maximum": 64
            },
            "rows": {
              "type": "integer",
              "minimum": 1,
              "maximum": 64
            },
            "cells": {
              "minItems": 1,
              "maxItems": 64,
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "position": {
                    "type": "array",
                    "prefixItems": [
                      {
                        "type": "number",
                        "minimum": -6,
                        "maximum": 12
                      },
                      {
                        "type": "number",
                        "minimum": -6,
                        "maximum": 12
                      },
                      {
                        "type": "number",
                        "minimum": -6,
                        "maximum": 12
                      }
                    ],
                    "items": false,
                    "minItems": 3,
                    "maxItems": 3
                  },
                  "rotation": {
                    "type": "array",
                    "prefixItems": [
                      {
                        "type": "number",
                        "minimum": -6.283185307179586,
                        "maximum": 6.283185307179586
                      },
                      {
                        "type": "number",
                        "minimum": -6.283185307179586,
                        "maximum": 6.283185307179586
                      },
                      {
                        "type": "number",
                        "minimum": -6.283185307179586,
                        "maximum": 6.283185307179586
                      }
                    ],
                    "items": false,
                    "minItems": 3,
                    "maxItems": 3
                  },
                  "scale": {
                    "type": "array",
                    "prefixItems": [
                      {
                        "type": "number",
                        "minimum": 0.02,
                        "maximum": 12
                      },
                      {
                        "type": "number",
                        "minimum": 0.02,
                        "maximum": 12
                      },
                      {
                        "type": "number",
                        "minimum": 0.02,
                        "maximum": 12
                      }
                    ],
                    "items": false,
                    "minItems": 3,
                    "maxItems": 3
                  }
                },
                "required": [
                  "position",
                  "rotation",
                  "scale"
                ],
                "additionalProperties": false
              }
            }
          },
          "required": [
            "columns",
            "rows",
            "cells"
          ],
          "additionalProperties": false
        },
        "symbols": {
          "minItems": 2,
          "maxItems": 32,
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9_-]{0,31}$"
              },
              "asset": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              "shape": {
                "type": "string",
                "enum": [
                  "cube",
                  "sphere",
                  "diamond",
                  "disc"
                ]
              },
              "color": {
                "type": "string",
                "pattern": "^#[a-fA-F0-9]{6}$"
              }
            },
            "required": [
              "id",
              "color"
            ],
            "additionalProperties": false
          }
        },
        "parts": {
          "maxItems": 24,
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9_-]{0,31}$"
              },
              "asset": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              "position": {
                "type": "array",
                "prefixItems": [
                  {
                    "type": "number",
                    "minimum": -6,
                    "maximum": 12
                  },
                  {
                    "type": "number",
                    "minimum": -6,
                    "maximum": 12
                  },
                  {
                    "type": "number",
                    "minimum": -6,
                    "maximum": 12
                  }
                ],
                "items": false,
                "minItems": 3,
                "maxItems": 3
              },
              "rotation": {
                "type": "array",
                "prefixItems": [
                  {
                    "type": "number",
                    "minimum": -6.283185307179586,
                    "maximum": 6.283185307179586
                  },
                  {
                    "type": "number",
                    "minimum": -6.283185307179586,
                    "maximum": 6.283185307179586
                  },
                  {
                    "type": "number",
                    "minimum": -6.283185307179586,
                    "maximum": 6.283185307179586
                  }
                ],
                "items": false,
                "minItems": 3,
                "maxItems": 3
              },
              "scale": {
                "type": "array",
                "prefixItems": [
                  {
                    "type": "number",
                    "minimum": 0.02,
                    "maximum": 12
                  },
                  {
                    "type": "number",
                    "minimum": 0.02,
                    "maximum": 12
                  },
                  {
                    "type": "number",
                    "minimum": 0.02,
                    "maximum": 12
                  }
                ],
                "items": false,
                "minItems": 3,
                "maxItems": 3
              }
            },
            "required": [
              "id",
              "asset",
              "position",
              "rotation",
              "scale"
            ],
            "additionalProperties": false
          }
        },
        "controls": {
          "type": "object",
          "properties": {
            "settings": {
              "type": "object",
              "properties": {
                "position": {
                  "type": "array",
                  "prefixItems": [
                    {
                      "type": "number",
                      "minimum": -6,
                      "maximum": 12
                    },
                    {
                      "type": "number",
                      "minimum": -6,
                      "maximum": 12
                    },
                    {
                      "type": "number",
                      "minimum": -6,
                      "maximum": 12
                    }
                  ],
                  "items": false,
                  "minItems": 3,
                  "maxItems": 3
                },
                "rotation": {
                  "type": "array",
                  "prefixItems": [
                    {
                      "type": "number",
                      "minimum": -3.141592653589793,
                      "maximum": 3.141592653589793
                    },
                    {
                      "type": "number",
                      "minimum": -3.141592653589793,
                      "maximum": 3.141592653589793
                    },
                    {
                      "type": "number",
                      "minimum": -3.141592653589793,
                      "maximum": 3.141592653589793
                    }
                  ],
                  "items": false,
                  "minItems": 3,
                  "maxItems": 3
                }
              },
              "required": [
                "position",
                "rotation"
              ],
              "additionalProperties": false
            },
            "quick": {
              "type": "object",
              "properties": {
                "position": {
                  "type": "array",
                  "prefixItems": [
                    {
                      "type": "number",
                      "minimum": -6,
                      "maximum": 12
                    },
                    {
                      "type": "number",
                      "minimum": -6,
                      "maximum": 12
                    },
                    {
                      "type": "number",
                      "minimum": -6,
                      "maximum": 12
                    }
                  ],
                  "items": false,
                  "minItems": 3,
                  "maxItems": 3
                },
                "rotation": {
                  "type": "array",
                  "prefixItems": [
                    {
                      "type": "number",
                      "minimum": -3.141592653589793,
                      "maximum": 3.141592653589793
                    },
                    {
                      "type": "number",
                      "minimum": -3.141592653589793,
                      "maximum": 3.141592653589793
                    },
                    {
                      "type": "number",
                      "minimum": -3.141592653589793,
                      "maximum": 3.141592653589793
                    }
                  ],
                  "items": false,
                  "minItems": 3,
                  "maxItems": 3
                }
              },
              "required": [
                "position",
                "rotation"
              ],
              "additionalProperties": false
            },
            "leave": {
              "type": "object",
              "properties": {
                "position": {
                  "type": "array",
                  "prefixItems": [
                    {
                      "type": "number",
                      "minimum": -6,
                      "maximum": 12
                    },
                    {
                      "type": "number",
                      "minimum": -6,
                      "maximum": 12
                    },
                    {
                      "type": "number",
                      "minimum": -6,
                      "maximum": 12
                    }
                  ],
                  "items": false,
                  "minItems": 3,
                  "maxItems": 3
                },
                "rotation": {
                  "type": "array",
                  "prefixItems": [
                    {
                      "type": "number",
                      "minimum": -3.141592653589793,
                      "maximum": 3.141592653589793
                    },
                    {
                      "type": "number",
                      "minimum": -3.141592653589793,
                      "maximum": 3.141592653589793
                    },
                    {
                      "type": "number",
                      "minimum": -3.141592653589793,
                      "maximum": 3.141592653589793
                    }
                  ],
                  "items": false,
                  "minItems": 3,
                  "maxItems": 3
                }
              },
              "required": [
                "position",
                "rotation"
              ],
              "additionalProperties": false
            }
          },
          "required": [
            "settings",
            "quick",
            "leave"
          ],
          "additionalProperties": false
        },
        "clips": {
          "maxItems": 24,
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "pattern": "^[a-z][a-z0-9_-]{0,31}$"
              },
              "durationMs": {
                "type": "integer",
                "minimum": 100,
                "maximum": 10000
              },
              "tracks": {
                "minItems": 1,
                "maxItems": 16,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "target": {
                      "type": "string",
                      "pattern": "^(?:part:[a-z][a-z0-9_-]{0,31}|cell:[0-9]{1,2})$"
                    },
                    "keyframes": {
                      "minItems": 2,
                      "maxItems": 24,
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "at": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 1
                          },
                          "position": {
                            "type": "array",
                            "prefixItems": [
                              {
                                "type": "number",
                                "minimum": -6,
                                "maximum": 6
                              },
                              {
                                "type": "number",
                                "minimum": -6,
                                "maximum": 6
                              },
                              {
                                "type": "number",
                                "minimum": -6,
                                "maximum": 6
                              }
                            ],
                            "items": false,
                            "minItems": 3,
                            "maxItems": 3
                          },
                          "rotation": {
                            "type": "array",
                            "prefixItems": [
                              {
                                "type": "number",
                                "minimum": -12.566370614359172,
                                "maximum": 12.566370614359172
                              },
                              {
                                "type": "number",
                                "minimum": -12.566370614359172,
                                "maximum": 12.566370614359172
                              },
                              {
                                "type": "number",
                                "minimum": -12.566370614359172,
                                "maximum": 12.566370614359172
                              }
                            ],
                            "items": false,
                            "minItems": 3,
                            "maxItems": 3
                          },
                          "scale": {
                            "type": "array",
                            "prefixItems": [
                              {
                                "type": "number",
                                "minimum": 0.02,
                                "maximum": 4
                              },
                              {
                                "type": "number",
                                "minimum": 0.02,
                                "maximum": 4
                              },
                              {
                                "type": "number",
                                "minimum": 0.02,
                                "maximum": 4
                              }
                            ],
                            "items": false,
                            "minItems": 3,
                            "maxItems": 3
                          }
                        },
                        "required": [
                          "at",
                          "position",
                          "rotation",
                          "scale"
                        ],
                        "additionalProperties": false
                      }
                    }
                  },
                  "required": [
                    "target",
                    "keyframes"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "required": [
              "id",
              "durationMs",
              "tracks"
            ],
            "additionalProperties": false
          }
        },
        "idleClip": {
          "type": "string",
          "pattern": "^[a-z][a-z0-9_-]{0,31}$"
        }
      },
      "required": [
        "version",
        "grid",
        "symbols",
        "parts",
        "controls",
        "clips"
      ],
      "additionalProperties": false
    },
    "modes": {
      "minItems": 1,
      "maxItems": 4,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "pattern": "^[a-z][a-z0-9_-]{0,31}$"
          },
          "cost": {
            "type": "number",
            "minimum": 0.01,
            "maximum": 1000
          },
          "books": {
            "minItems": 1000,
            "maxItems": 10000,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 2147483647
                },
                "events": {
                  "minItems": 2,
                  "maxItems": 64,
                  "type": "array",
                  "items": {
                    "oneOf": [
                      {
                        "type": "object",
                        "properties": {
                          "index": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 63
                          },
                          "type": {
                            "type": "string",
                            "const": "reveal"
                          },
                          "board": {
                            "minItems": 1,
                            "maxItems": 64,
                            "type": "array",
                            "items": {
                              "minItems": 1,
                              "maxItems": 64,
                              "type": "array",
                              "items": {
                                "type": "string",
                                "pattern": "^[a-z][a-z0-9_-]{0,31}$"
                              }
                            }
                          },
                          "durationMs": {
                            "type": "integer",
                            "minimum": 100,
                            "maximum": 10000
                          },
                          "clip": {
                            "type": "string",
                            "pattern": "^[a-z][a-z0-9_-]{0,31}$"
                          }
                        },
                        "required": [
                          "index",
                          "type",
                          "board",
                          "durationMs"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "index": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 63
                          },
                          "type": {
                            "type": "string",
                            "const": "animate"
                          },
                          "clip": {
                            "type": "string",
                            "pattern": "^[a-z][a-z0-9_-]{0,31}$"
                          }
                        },
                        "required": [
                          "index",
                          "type",
                          "clip"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "index": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 63
                          },
                          "type": {
                            "type": "string",
                            "const": "win"
                          },
                          "amount": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 100000000
                          },
                          "cells": {
                            "maxItems": 64,
                            "type": "array",
                            "items": {
                              "type": "integer",
                              "minimum": 0,
                              "maximum": 63
                            }
                          },
                          "durationMs": {
                            "type": "integer",
                            "minimum": 100,
                            "maximum": 10000
                          },
                          "clip": {
                            "type": "string",
                            "pattern": "^[a-z][a-z0-9_-]{0,31}$"
                          }
                        },
                        "required": [
                          "index",
                          "type",
                          "amount",
                          "cells",
                          "durationMs"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "object",
                        "properties": {
                          "index": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 63
                          },
                          "type": {
                            "type": "string",
                            "const": "finalWin"
                          },
                          "amount": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 100000000
                          },
                          "durationMs": {
                            "type": "integer",
                            "minimum": 100,
                            "maximum": 10000
                          }
                        },
                        "required": [
                          "index",
                          "type",
                          "amount",
                          "durationMs"
                        ],
                        "additionalProperties": false
                      }
                    ]
                  }
                },
                "payoutMultiplier": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 100000000
                }
              },
              "required": [
                "id",
                "events",
                "payoutMultiplier"
              ],
              "additionalProperties": false
            }
          },
          "weights": {
            "minItems": 1000,
            "maxItems": 10000,
            "type": "array",
            "items": {
              "type": "string",
              "pattern": "^[1-9][0-9]{0,19}$"
            }
          }
        },
        "required": [
          "name",
          "cost",
          "books",
          "weights"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "version",
    "name",
    "description",
    "presentation",
    "modes"
  ],
  "additionalProperties": false
}
