{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "assets.json",
  "type": "object",
  "properties": {
    "schema": {
      "const": "pz3d:assets/1"
    },
    "assets": {
      "type": "array",
      "maxItems": 65536,
      "items": {
        "$ref": "#/$defs/asset"
      }
    }
  },
  "required": [
    "schema",
    "assets"
  ],
  "additionalProperties": false,
  "$defs": {
    "asset": {
      "type": "object",
      "properties": {
        "directory": {
          "type": "string",
          "minLength": 1,
          "pattern": "^(?![\\\\/])[^:<>\"|?*\\u0000-\\u001f]+$"
        },
        "id": {
          "type": "string",
          "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
        },
        "name": {
          "type": "string",
          "maxLength": 160,
          "minLength": 1,
          "not": {
            "pattern": "^[\\u0009-\\u000d\\u001c-\\u0020\\u1680\\u2000-\\u2006\\u2008-\\u200a\\u2028\\u2029\\u205f\\u3000]*$"
          }
        },
        "description": {
          "type": "string",
          "maxLength": 16384,
          "default": ""
        },
        "author": {
          "type": "string",
          "maxLength": 160,
          "minLength": 1,
          "not": {
            "pattern": "^[\\u0009-\\u000d\\u001c-\\u0020\\u1680\\u2000-\\u2006\\u2008-\\u200a\\u2028\\u2029\\u205f\\u3000]*$"
          },
          "pattern": "^[^\\u0000-\\u001f\\u007f-\\u009f]*$"
        },
        "url": {
          "type": "string",
          "maxLength": 16384,
          "default": ""
        },
        "allowRepack": {
          "type": "boolean"
        },
        "variants": {
          "type": "object",
          "minProperties": 1,
          "maxProperties": 4096,
          "propertyNames": {
            "pattern": "^[A-Za-z0-9_-]{1,96}$"
          },
          "additionalProperties": {
            "$ref": "#/$defs/variant"
          }
        }
      },
      "required": [
        "directory",
        "id",
        "name",
        "author",
        "allowRepack",
        "variants"
      ],
      "additionalProperties": false
    },
    "tile": {
      "type": "string",
      "maxLength": 256,
      "minLength": 1,
      "not": {
        "pattern": "^[\\u0009-\\u000d\\u001c-\\u0020\\u1680\\u2000-\\u2006\\u2008-\\u200a\\u2028\\u2029\\u205f\\u3000]*$"
      },
      "pattern": "^[^\\u0000-\\u001f\\u007f-\\u009f]*$"
    },
    "part": {
      "type": "object",
      "properties": {
        "tile": {
          "$ref": "#/$defs/tile"
        },
        "x": {
          "type": "integer",
          "minimum": -32,
          "maximum": 32,
          "default": 0
        },
        "y": {
          "type": "integer",
          "minimum": -32,
          "maximum": 32,
          "default": 0
        },
        "z": {
          "type": "integer",
          "minimum": -32,
          "maximum": 32,
          "default": 0
        }
      },
      "required": [
        "tile"
      ],
      "additionalProperties": false
    },
    "placement": {
      "type": "object",
      "properties": {
        "position": {
          "type": "array",
          "minItems": 3,
          "maxItems": 3,
          "items": {
            "type": "number",
            "minimum": -32,
            "maximum": 32
          },
          "default": [
            0,
            0,
            0
          ]
        },
        "rotation": {
          "type": "array",
          "minItems": 3,
          "maxItems": 3,
          "items": {
            "type": "number",
            "minimum": -36000,
            "maximum": 36000
          },
          "default": [
            0,
            0,
            0
          ]
        },
        "scale": {
          "type": "array",
          "minItems": 3,
          "maxItems": 3,
          "items": {
            "type": "number",
            "exclusiveMinimum": 0,
            "maximum": 100
          },
          "default": [
            1,
            1,
            1
          ]
        }
      },
      "required": [],
      "additionalProperties": false
    },
    "binding": {
      "type": "object",
      "properties": {
        "tile": {
          "$ref": "#/$defs/tile"
        },
        "state": {
          "type": "string",
          "pattern": "^[A-Za-z0-9_*.-]{1,96}$",
          "default": "*"
        },
        "layer": {
          "enum": [
            "base",
            "overlay",
            "attached"
          ],
          "default": "base"
        },
        "parts": {
          "type": "array",
          "minItems": 1,
          "maxItems": 256,
          "items": {
            "$ref": "#/$defs/part"
          },
          "contains": {
            "type": "object",
            "properties": {
              "x": {
                "const": 0
              },
              "y": {
                "const": 0
              },
              "z": {
                "const": 0
              }
            }
          },
          "minContains": 1
        },
        "placement": {
          "$ref": "#/$defs/placement"
        }
      },
      "propertyNames": {
        "maxLength": 256,
        "anyOf": [
          {
            "enum": [
              "tile",
              "state",
              "layer",
              "parts",
              "placement"
            ]
          },
          {
            "allOf": [
              {
                "not": {
                  "enum": [
                    "id",
                    "variant",
                    "when",
                    "assetVersion",
                    "class"
                  ]
                }
              },
              {
                "pattern": "^(?:[\\p{L}\\p{Nl}\\p{Sc}\\p{Pc}][\\p{L}\\p{Nl}\\p{Sc}\\p{Pc}\\p{Mn}\\p{Mc}\\p{Nd}\\p{Cf}\\u0000-\\u0008\\u000e-\\u001b\\u007f-\\u009f]*|modData\\.(?:[^.\\\\\\u0000-\\u001f\\u007f-\\u009f]|\\\\[.\\\\])+(?:\\.(?:[^.\\\\\\u0000-\\u001f\\u007f-\\u009f]|\\\\[.\\\\])+){0,7})$"
              }
            ]
          }
        ]
      },
      "additionalProperties": {
        "anyOf": [
          {
            "type": "string",
            "maxLength": 1024
          },
          {
            "type": "boolean"
          },
          {
            "type": "number"
          }
        ]
      },
      "oneOf": [
        {
          "required": [
            "tile"
          ],
          "not": {
            "required": [
              "parts"
            ]
          }
        },
        {
          "required": [
            "parts"
          ],
          "not": {
            "required": [
              "tile"
            ]
          },
          "properties": {
            "layer": {
              "const": "base"
            }
          }
        }
      ]
    },
    "variant": {
      "type": "object",
      "properties": {
        "file": {
          "type": "string",
          "pattern": "^(?![\\\\/])[^:<>\"|?*\\u0000-\\u001f]*\\.[oO][bB][jJ]$",
          "description": "Relative OBJ path that stays within the card directory after normalization."
        },
        "bindings": {
          "type": "array",
          "minItems": 1,
          "maxItems": 16384,
          "items": {
            "$ref": "#/$defs/binding"
          }
        }
      },
      "required": [
        "file",
        "bindings"
      ],
      "additionalProperties": false
    }
  }
}
