2018-05-02 17:10:52 -04:00
|
|
|
{
|
|
|
|
"$id": "https://scratch.mit.edu/sb3_definitions.json",
|
|
|
|
"$schema": "http://json-schema.org/schema#",
|
|
|
|
"description": "Scratch 3.0 Project and Sprite Schema Definitions",
|
|
|
|
"definitions": {
|
|
|
|
"optionalString": {
|
|
|
|
"oneOf": [
|
|
|
|
{"type": "string"},
|
|
|
|
{"type": "null"}
|
|
|
|
]
|
|
|
|
},
|
2018-08-13 14:28:13 -04:00
|
|
|
"optionalNumber": {
|
|
|
|
"oneOf": [
|
|
|
|
{"type": "number"},
|
|
|
|
{"type": "null"}
|
|
|
|
]
|
|
|
|
},
|
2018-08-09 15:17:00 -04:00
|
|
|
"boolOrOptBoolString": {
|
2018-05-02 17:10:52 -04:00
|
|
|
"oneOf": [
|
|
|
|
{"type": "string",
|
2018-08-09 15:17:00 -04:00
|
|
|
"enum": ["true", "false", "null"]},
|
|
|
|
{"type": "boolean"},
|
|
|
|
{"type": "null"}
|
2018-05-02 17:10:52 -04:00
|
|
|
]
|
|
|
|
},
|
|
|
|
"stringOrNumber": {
|
|
|
|
"oneOf": [
|
|
|
|
{"type": "string"},
|
|
|
|
{"type": "number"}
|
|
|
|
]
|
|
|
|
},
|
|
|
|
"scalarVal": {
|
|
|
|
"oneOf": [
|
|
|
|
{"$ref":"#/definitions/stringOrNumber"},
|
|
|
|
{"type": "boolean"}
|
|
|
|
]
|
|
|
|
},
|
|
|
|
"assetId": {
|
|
|
|
"type": "string",
|
|
|
|
"pattern": "^[a-fA-F0-9]{32}$"
|
|
|
|
},
|
|
|
|
"costume": {
|
|
|
|
"type": "object",
|
|
|
|
"properties": {
|
|
|
|
"assetId": { "$ref": "#/definitions/assetId"},
|
|
|
|
"bitmapResolution": {
|
|
|
|
"type": "integer"
|
|
|
|
},
|
|
|
|
"dataFormat": {
|
|
|
|
"type": "string",
|
|
|
|
"enum": ["png", "svg", "jpeg", "jpg", "bmp", "gif"]
|
|
|
|
},
|
|
|
|
"md5ext": {
|
|
|
|
"type": "string",
|
|
|
|
"pattern": "^[a-fA-F0-9]{32}\\.[a-zA-Z]+$"
|
|
|
|
},
|
|
|
|
"name": {
|
|
|
|
"type": "string"
|
|
|
|
},
|
|
|
|
"rotationCenterX": {
|
|
|
|
"type": "number",
|
|
|
|
"description": "This property is not required, but is highly recommended."
|
|
|
|
},
|
|
|
|
"rotationCenterY": {
|
|
|
|
"type": "number",
|
|
|
|
"description": "This property is not required, but is highly recommended."
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"required": [
|
|
|
|
"assetId",
|
|
|
|
"dataFormat",
|
|
|
|
"name"
|
|
|
|
]
|
|
|
|
},
|
|
|
|
"sound": {
|
|
|
|
"type": "object",
|
|
|
|
"properties": {
|
|
|
|
"assetId": { "$ref": "#/definitions/assetId"},
|
|
|
|
"dataFormat": {
|
|
|
|
"type": "string",
|
|
|
|
"enum": ["wav", "wave", "mp3"]
|
|
|
|
},
|
|
|
|
"md5ext": {
|
|
|
|
"type": "string",
|
|
|
|
"pattern": "^[a-fA-F0-9]{32}\\.[a-zA-Z0-9]+$"
|
|
|
|
},
|
|
|
|
"name": {
|
|
|
|
"type": "string"
|
|
|
|
},
|
|
|
|
"rate": {
|
|
|
|
"type": "integer"
|
|
|
|
},
|
|
|
|
"sampleCount": {
|
|
|
|
"type": "integer"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"required": [
|
|
|
|
"assetId",
|
|
|
|
"dataFormat",
|
|
|
|
"name"
|
|
|
|
]
|
|
|
|
},
|
|
|
|
"scalar_variable": {
|
|
|
|
"type": "array",
|
|
|
|
"items": [
|
|
|
|
{"type": "string", "description": "name of the variable"},
|
|
|
|
{"$ref":"#/definitions/scalarVal", "description": "value of the variable"}
|
|
|
|
],
|
|
|
|
"additionalItems": {"type": "boolean", "enum": [true], "description": "Whether this is a cloud variable"},
|
|
|
|
"maxItems": 3
|
|
|
|
},
|
|
|
|
"list": {
|
|
|
|
"type": "array",
|
|
|
|
"items": [
|
|
|
|
{"type":"string", "description": "name of the list"},
|
|
|
|
{
|
|
|
|
"type": "array",
|
|
|
|
"description": "contents of the list",
|
|
|
|
"items": {"$ref":"#/definitions/scalarVal"}
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"additionalItems": false
|
|
|
|
},
|
|
|
|
"broadcast_message": {
|
|
|
|
"type": "string",
|
|
|
|
"description": "the message being broadcasted"
|
|
|
|
},
|
|
|
|
"num_primitive": {
|
|
|
|
"type": "array",
|
|
|
|
"items": [
|
|
|
|
{
|
|
|
|
"type": "number",
|
|
|
|
"enum": [4,5,6,7,8]
|
|
|
|
},
|
|
|
|
{"$ref":"#/definitions/stringOrNumber"}
|
|
|
|
],
|
|
|
|
"additionalItems": false
|
|
|
|
},
|
|
|
|
"color_primitive": {
|
|
|
|
"type": "array",
|
|
|
|
"items": [
|
|
|
|
{
|
|
|
|
"type": "number",
|
|
|
|
"enum": [9]
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"type": "string",
|
|
|
|
"pattern": "^#[a-fA-F0-9]{6}$"
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"additionalItems": false
|
|
|
|
},
|
|
|
|
"text_primitive": {
|
|
|
|
"type": "array",
|
|
|
|
"items": [
|
|
|
|
{
|
|
|
|
"type": "number",
|
|
|
|
"enum": [10]
|
|
|
|
},
|
|
|
|
{"$ref":"#/definitions/stringOrNumber"}
|
|
|
|
],
|
|
|
|
"additionalItems": false
|
|
|
|
},
|
|
|
|
"broadcast_primitive": {
|
|
|
|
"type": "array",
|
|
|
|
"items": [
|
|
|
|
{
|
|
|
|
"type": "number",
|
|
|
|
"enum": [11]
|
|
|
|
},
|
|
|
|
{"type": "string", "description": "broadcast message"},
|
|
|
|
{"type": "string", "description": "broadcast message id"}
|
|
|
|
],
|
|
|
|
"additionalItems": false
|
|
|
|
},
|
|
|
|
"variable_primitive": {
|
|
|
|
"type": "array",
|
|
|
|
"items": [
|
|
|
|
{
|
|
|
|
"type": "number",
|
|
|
|
"enum": [12]
|
|
|
|
},
|
|
|
|
{"type": "string", "description": "variable name"},
|
|
|
|
{"type": "string", "description": "variable id"}
|
|
|
|
],
|
|
|
|
"additionalItems": {
|
|
|
|
"type": "number"
|
|
|
|
},
|
|
|
|
"minItems": 3,
|
|
|
|
"maxItems": 5
|
|
|
|
},
|
|
|
|
"list_primitive": {
|
|
|
|
"type": "array",
|
|
|
|
"items": [
|
|
|
|
{
|
|
|
|
"type": "number",
|
|
|
|
"enum": [13]
|
|
|
|
},
|
|
|
|
{"type": "string", "description": "list name"},
|
|
|
|
{"type": "string", "description": "list id"}
|
|
|
|
],
|
|
|
|
"additionalItems": {
|
|
|
|
"type": "number"
|
|
|
|
},
|
|
|
|
"minItems": 3,
|
|
|
|
"maxItems": 5
|
|
|
|
},
|
|
|
|
"topLevelPrimitive": {
|
|
|
|
"oneOf": [
|
|
|
|
{"$ref":"#/definitions/variable_primitive"},
|
|
|
|
{"$ref":"#/definitions/list_primitive"}
|
|
|
|
]
|
|
|
|
},
|
|
|
|
"inputPrimitive": {
|
|
|
|
"oneOf": [
|
|
|
|
{"$ref":"#/definitions/num_primitive"},
|
|
|
|
{"$ref":"#/definitions/color_primitive"},
|
|
|
|
{"$ref":"#/definitions/text_primitive"},
|
|
|
|
{"$ref":"#/definitions/broadcast_primitive"},
|
|
|
|
{"$ref":"#/definitions/variable_primitive"},
|
|
|
|
{"$ref":"#/definitions/list_primitive"}
|
|
|
|
]
|
|
|
|
},
|
|
|
|
"block": {
|
|
|
|
"type": "object",
|
|
|
|
"properties": {
|
|
|
|
"opcode": {
|
|
|
|
"type": "string"
|
|
|
|
},
|
2018-06-15 10:53:14 -04:00
|
|
|
"comment": {
|
|
|
|
"type": "string"
|
|
|
|
},
|
2018-05-02 17:10:52 -04:00
|
|
|
"inputs": {
|
|
|
|
"type": "object",
|
|
|
|
"additionalProperties": {
|
|
|
|
"type": "array",
|
|
|
|
"items": [
|
|
|
|
{
|
|
|
|
"type":"number",
|
|
|
|
"enum":[1,2,3],
|
|
|
|
"description": "1 = unobscured shadow, 2 = no shadow, 3 = obscured shadow"
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"additionalItems": {
|
|
|
|
"oneOf": [
|
|
|
|
{"$ref":"#/definitions/optionalString"},
|
|
|
|
{"$ref":"#/definitions/inputPrimitive"}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"fields": {
|
|
|
|
"type": "object"
|
|
|
|
},
|
|
|
|
"next": {"$ref":"#/definitions/optionalString"},
|
|
|
|
"topLevel": {
|
|
|
|
"type": "boolean"
|
|
|
|
},
|
|
|
|
"parent": {"$ref":"#/definitions/optionalString"},
|
|
|
|
"shadow": {
|
|
|
|
"type": "boolean"
|
|
|
|
},
|
|
|
|
"x": {
|
|
|
|
"type": "number"
|
|
|
|
},
|
|
|
|
"y": {
|
|
|
|
"type": "number"
|
|
|
|
},
|
|
|
|
"mutation": {
|
|
|
|
"type": "object",
|
|
|
|
"properties": {
|
|
|
|
"tagName": {
|
|
|
|
"type": "string",
|
|
|
|
"enum": ["mutation"]
|
|
|
|
},
|
|
|
|
"children": {
|
|
|
|
"type": "array"
|
|
|
|
},
|
|
|
|
"proccode": {
|
|
|
|
"type": "string"
|
|
|
|
},
|
|
|
|
"argumentids": {
|
|
|
|
"type": "string"
|
|
|
|
},
|
2018-08-09 15:17:00 -04:00
|
|
|
"warp": {"$ref":"#/definitions/boolOrOptBoolString"},
|
|
|
|
"hasnext": {"$ref":"#/definitions/boolOrOptBoolString"}
|
2018-05-02 17:10:52 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"required": [
|
|
|
|
"opcode"
|
|
|
|
]
|
|
|
|
},
|
2018-06-15 10:53:14 -04:00
|
|
|
"comment": {
|
|
|
|
"type": "object",
|
|
|
|
"properties": {
|
|
|
|
"blockId": {"$ref": "#/definitions/optionalString"},
|
2018-06-15 17:35:14 -04:00
|
|
|
"text": {
|
|
|
|
"type": "string",
|
|
|
|
"maxLength": 8000
|
|
|
|
},
|
2018-06-15 10:53:14 -04:00
|
|
|
"minimized": {"type": "boolean"},
|
2018-08-13 14:28:13 -04:00
|
|
|
"x": {"$ref": "#/definitions/optionalNumber"},
|
|
|
|
"y": {"$ref": "#/definitions/optionalNumber"},
|
2018-06-15 10:53:14 -04:00
|
|
|
"width": {"type": "number"},
|
|
|
|
"height": {"type": "number"}
|
|
|
|
},
|
|
|
|
"required": [
|
|
|
|
"text"
|
|
|
|
]
|
|
|
|
},
|
2018-05-02 17:10:52 -04:00
|
|
|
"stage": {
|
|
|
|
"type": "object",
|
|
|
|
"description": "Description of property (and/or property/value pairs) that are unique to the stage.",
|
|
|
|
"properties": {
|
|
|
|
"name": {
|
|
|
|
"type": "string",
|
|
|
|
"enum": ["Stage"]
|
|
|
|
},
|
|
|
|
"isStage": {
|
|
|
|
"type": "boolean",
|
|
|
|
"enum": [true]
|
|
|
|
},
|
|
|
|
"tempo": {
|
|
|
|
"type": "number"
|
|
|
|
},
|
|
|
|
"videoTransparency": {
|
|
|
|
"type": "number"
|
|
|
|
},
|
|
|
|
"videoState": {
|
|
|
|
"type": "string",
|
|
|
|
"enum": ["on", "off", "on-flipped"]
|
2018-07-24 17:00:38 -04:00
|
|
|
},
|
|
|
|
"layerOrder": {
|
|
|
|
"type": "integer",
|
|
|
|
"enum": [0],
|
|
|
|
"description": "The layer order of the stage should be 0, if specified."
|
2018-05-02 17:10:52 -04:00
|
|
|
}
|
|
|
|
},
|
|
|
|
"required": [
|
|
|
|
"name",
|
|
|
|
"isStage"
|
|
|
|
]
|
|
|
|
},
|
|
|
|
"sprite": {
|
|
|
|
"type": "object",
|
|
|
|
"description": "Description of property (and/or property/value pairs) for sprites.",
|
|
|
|
"properties": {
|
|
|
|
"name": {
|
2018-12-19 11:09:06 -05:00
|
|
|
"type": "string",
|
|
|
|
"not": {"enum": ["_stage_"]}
|
2018-05-02 17:10:52 -04:00
|
|
|
},
|
|
|
|
"isStage": {
|
|
|
|
"type": "boolean",
|
|
|
|
"enum": [false]
|
|
|
|
},
|
|
|
|
"visible": {
|
|
|
|
"type": "boolean"
|
|
|
|
},
|
|
|
|
"x": {
|
|
|
|
"type": "number"
|
|
|
|
},
|
|
|
|
"y": {
|
|
|
|
"type": "number"
|
|
|
|
},
|
|
|
|
"size": {
|
|
|
|
"type": "number"
|
|
|
|
},
|
|
|
|
"direction": {
|
|
|
|
"type": "number"
|
|
|
|
},
|
|
|
|
"draggable": {
|
|
|
|
"type": "boolean"
|
|
|
|
},
|
|
|
|
"rotationStyle": {
|
|
|
|
"type": "string",
|
|
|
|
"enum": ["all around", "don't rotate", "left-right"]
|
2018-07-24 17:00:38 -04:00
|
|
|
},
|
|
|
|
"layerOrder": {
|
|
|
|
"type": "integer",
|
|
|
|
"minimum": 1,
|
|
|
|
"description": "The layer order of a sprite should be a positive number, if specified."
|
2018-05-02 17:10:52 -04:00
|
|
|
}
|
|
|
|
},
|
|
|
|
"required": [
|
|
|
|
"name",
|
|
|
|
"isStage"
|
|
|
|
]
|
|
|
|
},
|
|
|
|
"target": {
|
|
|
|
"type": "object",
|
|
|
|
"description" : "Properties common to both Scratch 3.0 Stage and Sprite",
|
|
|
|
"properties": {
|
|
|
|
"currentCostume": {
|
|
|
|
"type": "integer",
|
|
|
|
"minimum": 0
|
|
|
|
},
|
|
|
|
"blocks": {
|
|
|
|
"type": "object",
|
|
|
|
"additionalProperties": {
|
|
|
|
"oneOf": [
|
|
|
|
{"$ref":"#/definitions/block"},
|
|
|
|
{"$ref":"#/definitions/topLevelPrimitive"}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"variables": {
|
|
|
|
"type": "object",
|
|
|
|
"additionalProperties": {"$ref":"#/definitions/scalar_variable"}
|
|
|
|
},
|
|
|
|
"lists": {
|
|
|
|
"type": "object",
|
|
|
|
"additionalProperties": {"$ref":"#/definitions/list"}
|
|
|
|
},
|
|
|
|
"broadcasts": {
|
|
|
|
"type": "object",
|
|
|
|
"additionalProperties": {"$ref":"#/definitions/broadcast_message"}
|
|
|
|
},
|
2018-06-15 10:53:14 -04:00
|
|
|
"comments": {
|
|
|
|
"type": "object",
|
|
|
|
"additionalProperties": {"$ref": "#/definitions/comment"}
|
|
|
|
},
|
2018-05-02 17:10:52 -04:00
|
|
|
"costumes": {
|
|
|
|
"type": "array",
|
|
|
|
"items": {"$ref":"#/definitions/costume"},
|
|
|
|
"minItems": 1,
|
|
|
|
"uniqueItems": true
|
|
|
|
},
|
|
|
|
"sounds": {
|
|
|
|
"type": "array",
|
|
|
|
"items": {"$ref":"#/definitions/sound"},
|
|
|
|
"uniqueItems": true
|
|
|
|
},
|
|
|
|
"volume": {
|
|
|
|
"type": "number"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"required": [
|
|
|
|
"variables",
|
|
|
|
"costumes",
|
|
|
|
"sounds",
|
|
|
|
"blocks"
|
|
|
|
]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|