1 | {
|
2 | "$id": "https://scratch.mit.edu/sb3_definitions.json",
|
3 | "$schema": "http://json-schema.org/schema#",
|
4 | "description": "Scratch 3.0 Project and Sprite Schema Definitions",
|
5 | "definitions": {
|
6 | "optionalString": {
|
7 | "oneOf": [
|
8 | {"type": "string"},
|
9 | {"type": "null"}
|
10 | ]
|
11 | },
|
12 | "optionalNumber": {
|
13 | "oneOf": [
|
14 | {"type": "number"},
|
15 | {"type": "null"}
|
16 | ]
|
17 | },
|
18 | "boolOrOptBoolString": {
|
19 | "oneOf": [
|
20 | {"type": "string",
|
21 | "enum": ["true", "false", "null"]},
|
22 | {"type": "boolean"},
|
23 | {"type": "null"}
|
24 | ]
|
25 | },
|
26 | "stringOrNumber": {
|
27 | "oneOf": [
|
28 | {"type": "string"},
|
29 | {"type": "number"}
|
30 | ]
|
31 | },
|
32 | "scalarVal": {
|
33 | "oneOf": [
|
34 | {"$ref":"#/definitions/stringOrNumber"},
|
35 | {"type": "boolean"}
|
36 | ]
|
37 | },
|
38 | "assetId": {
|
39 | "type": "string",
|
40 | "pattern": "^[a-fA-F0-9]{32}$"
|
41 | },
|
42 | "costume": {
|
43 | "type": "object",
|
44 | "properties": {
|
45 | "assetId": { "$ref": "#/definitions/assetId"},
|
46 | "bitmapResolution": {
|
47 | "type": "integer"
|
48 | },
|
49 | "dataFormat": {
|
50 | "type": "string",
|
51 | "enum": ["png", "svg", "jpeg", "jpg", "bmp", "gif"]
|
52 | },
|
53 | "md5ext": {
|
54 | "type": "string",
|
55 | "pattern": "^[a-fA-F0-9]{32}\\.[a-zA-Z]+$"
|
56 | },
|
57 | "name": {
|
58 | "type": "string"
|
59 | },
|
60 | "rotationCenterX": {
|
61 | "type": "number",
|
62 | "description": "This property is not required, but is highly recommended."
|
63 | },
|
64 | "rotationCenterY": {
|
65 | "type": "number",
|
66 | "description": "This property is not required, but is highly recommended."
|
67 | }
|
68 | },
|
69 | "required": [
|
70 | "assetId",
|
71 | "dataFormat",
|
72 | "name"
|
73 | ]
|
74 | },
|
75 | "sound": {
|
76 | "type": "object",
|
77 | "properties": {
|
78 | "assetId": { "$ref": "#/definitions/assetId"},
|
79 | "dataFormat": {
|
80 | "type": "string",
|
81 | "enum": ["wav", "wave", "mp3"]
|
82 | },
|
83 | "md5ext": {
|
84 | "type": "string",
|
85 | "pattern": "^[a-fA-F0-9]{32}\\.[a-zA-Z0-9]+$"
|
86 | },
|
87 | "name": {
|
88 | "type": "string"
|
89 | },
|
90 | "rate": {
|
91 | "type": "integer"
|
92 | },
|
93 | "sampleCount": {
|
94 | "type": "integer"
|
95 | }
|
96 | },
|
97 | "required": [
|
98 | "assetId",
|
99 | "dataFormat",
|
100 | "name"
|
101 | ]
|
102 | },
|
103 | "scalar_variable": {
|
104 | "type": "array",
|
105 | "items": [
|
106 | {"type": "string", "description": "name of the variable"},
|
107 | {"$ref":"#/definitions/scalarVal", "description": "value of the variable"}
|
108 | ],
|
109 | "additionalItems": {"type": "boolean", "enum": [true], "description": "Whether this is a cloud variable"},
|
110 | "maxItems": 3
|
111 | },
|
112 | "list": {
|
113 | "type": "array",
|
114 | "items": [
|
115 | {"type":"string", "description": "name of the list"},
|
116 | {
|
117 | "type": "array",
|
118 | "description": "contents of the list",
|
119 | "items": {"$ref":"#/definitions/scalarVal"}
|
120 | }
|
121 | ],
|
122 | "additionalItems": false
|
123 | },
|
124 | "broadcast_message": {
|
125 | "type": "string",
|
126 | "description": "the message being broadcasted"
|
127 | },
|
128 | "num_primitive": {
|
129 | "type": "array",
|
130 | "items": [
|
131 | {
|
132 | "type": "number",
|
133 | "enum": [4,5,6,7,8]
|
134 | },
|
135 | {"$ref":"#/definitions/stringOrNumber"}
|
136 | ],
|
137 | "additionalItems": false
|
138 | },
|
139 | "color_primitive": {
|
140 | "type": "array",
|
141 | "items": [
|
142 | {
|
143 | "type": "number",
|
144 | "enum": [9]
|
145 | },
|
146 | {
|
147 | "type": "string",
|
148 | "pattern": "^#[a-fA-F0-9]{6}$"
|
149 | }
|
150 | ],
|
151 | "additionalItems": false
|
152 | },
|
153 | "text_primitive": {
|
154 | "type": "array",
|
155 | "items": [
|
156 | {
|
157 | "type": "number",
|
158 | "enum": [10]
|
159 | },
|
160 | {"$ref":"#/definitions/stringOrNumber"}
|
161 | ],
|
162 | "additionalItems": false
|
163 | },
|
164 | "broadcast_primitive": {
|
165 | "type": "array",
|
166 | "items": [
|
167 | {
|
168 | "type": "number",
|
169 | "enum": [11]
|
170 | },
|
171 | {"type": "string", "description": "broadcast message"},
|
172 | {"type": "string", "description": "broadcast message id"}
|
173 | ],
|
174 | "additionalItems": false
|
175 | },
|
176 | "variable_primitive": {
|
177 | "type": "array",
|
178 | "items": [
|
179 | {
|
180 | "type": "number",
|
181 | "enum": [12]
|
182 | },
|
183 | {"type": "string", "description": "variable name"},
|
184 | {"type": "string", "description": "variable id"}
|
185 | ],
|
186 | "additionalItems": {
|
187 | "type": "number"
|
188 | },
|
189 | "minItems": 3,
|
190 | "maxItems": 5
|
191 | },
|
192 | "list_primitive": {
|
193 | "type": "array",
|
194 | "items": [
|
195 | {
|
196 | "type": "number",
|
197 | "enum": [13]
|
198 | },
|
199 | {"type": "string", "description": "list name"},
|
200 | {"type": "string", "description": "list id"}
|
201 | ],
|
202 | "additionalItems": {
|
203 | "type": "number"
|
204 | },
|
205 | "minItems": 3,
|
206 | "maxItems": 5
|
207 | },
|
208 | "topLevelPrimitive": {
|
209 | "oneOf": [
|
210 | {"$ref":"#/definitions/variable_primitive"},
|
211 | {"$ref":"#/definitions/list_primitive"}
|
212 | ]
|
213 | },
|
214 | "inputPrimitive": {
|
215 | "oneOf": [
|
216 | {"$ref":"#/definitions/num_primitive"},
|
217 | {"$ref":"#/definitions/color_primitive"},
|
218 | {"$ref":"#/definitions/text_primitive"},
|
219 | {"$ref":"#/definitions/broadcast_primitive"},
|
220 | {"$ref":"#/definitions/variable_primitive"},
|
221 | {"$ref":"#/definitions/list_primitive"}
|
222 | ]
|
223 | },
|
224 | "block": {
|
225 | "type": "object",
|
226 | "properties": {
|
227 | "opcode": {
|
228 | "type": "string"
|
229 | },
|
230 | "comment": {
|
231 | "type": "string"
|
232 | },
|
233 | "inputs": {
|
234 | "type": "object",
|
235 | "additionalProperties": {
|
236 | "type": "array",
|
237 | "items": [
|
238 | {
|
239 | "type":"number",
|
240 | "enum":[1,2,3],
|
241 | "description": "1 = unobscured shadow, 2 = no shadow, 3 = obscured shadow"
|
242 | }
|
243 | ],
|
244 | "additionalItems": {
|
245 | "oneOf": [
|
246 | {"$ref":"#/definitions/optionalString"},
|
247 | {"$ref":"#/definitions/inputPrimitive"}
|
248 | ]
|
249 | }
|
250 | }
|
251 | },
|
252 | "fields": {
|
253 | "type": "object"
|
254 | },
|
255 | "next": {"$ref":"#/definitions/optionalString"},
|
256 | "topLevel": {
|
257 | "type": "boolean"
|
258 | },
|
259 | "parent": {"$ref":"#/definitions/optionalString"},
|
260 | "shadow": {
|
261 | "type": "boolean"
|
262 | },
|
263 | "x": {
|
264 | "type": "number"
|
265 | },
|
266 | "y": {
|
267 | "type": "number"
|
268 | },
|
269 | "mutation": {
|
270 | "type": "object",
|
271 | "properties": {
|
272 | "tagName": {
|
273 | "type": "string",
|
274 | "enum": ["mutation"]
|
275 | },
|
276 | "children": {
|
277 | "type": "array"
|
278 | },
|
279 | "proccode": {
|
280 | "type": "string"
|
281 | },
|
282 | "argumentids": {
|
283 | "type": "string"
|
284 | },
|
285 | "warp": {"$ref":"#/definitions/boolOrOptBoolString"},
|
286 | "hasnext": {"$ref":"#/definitions/boolOrOptBoolString"}
|
287 | }
|
288 | }
|
289 | },
|
290 | "required": [
|
291 | "opcode"
|
292 | ]
|
293 | },
|
294 | "comment": {
|
295 | "type": "object",
|
296 | "properties": {
|
297 | "blockId": {"$ref": "#/definitions/optionalString"},
|
298 | "text": {
|
299 | "type": "string",
|
300 | "maxLength": 8000
|
301 | },
|
302 | "minimized": {"type": "boolean"},
|
303 | "x": {"$ref": "#/definitions/optionalNumber"},
|
304 | "y": {"$ref": "#/definitions/optionalNumber"},
|
305 | "width": {"type": "number"},
|
306 | "height": {"type": "number"}
|
307 | },
|
308 | "required": [
|
309 | "text"
|
310 | ]
|
311 | },
|
312 | "stage": {
|
313 | "type": "object",
|
314 | "description": "Description of property (and/or property/value pairs) that are unique to the stage.",
|
315 | "properties": {
|
316 | "name": {
|
317 | "type": "string",
|
318 | "enum": ["Stage"]
|
319 | },
|
320 | "isStage": {
|
321 | "type": "boolean",
|
322 | "enum": [true]
|
323 | },
|
324 | "tempo": {
|
325 | "type": "number"
|
326 | },
|
327 | "videoTransparency": {
|
328 | "type": "number"
|
329 | },
|
330 | "videoState": {
|
331 | "type": "string",
|
332 | "enum": ["on", "off", "on-flipped"]
|
333 | },
|
334 | "layerOrder": {
|
335 | "type": "integer",
|
336 | "enum": [0],
|
337 | "description": "The layer order of the stage should be 0, if specified."
|
338 | }
|
339 | },
|
340 | "required": [
|
341 | "name",
|
342 | "isStage"
|
343 | ]
|
344 | },
|
345 | "sprite": {
|
346 | "type": "object",
|
347 | "description": "Description of property (and/or property/value pairs) for sprites.",
|
348 | "properties": {
|
349 | "name": {
|
350 | "type": "string",
|
351 | "not": {"enum": ["_stage_"]}
|
352 | },
|
353 | "isStage": {
|
354 | "type": "boolean",
|
355 | "enum": [false]
|
356 | },
|
357 | "visible": {
|
358 | "type": "boolean"
|
359 | },
|
360 | "x": {
|
361 | "type": "number"
|
362 | },
|
363 | "y": {
|
364 | "type": "number"
|
365 | },
|
366 | "size": {
|
367 | "type": "number"
|
368 | },
|
369 | "direction": {
|
370 | "type": "number"
|
371 | },
|
372 | "draggable": {
|
373 | "type": "boolean"
|
374 | },
|
375 | "rotationStyle": {
|
376 | "type": "string",
|
377 | "enum": ["all around", "don't rotate", "left-right"]
|
378 | },
|
379 | "layerOrder": {
|
380 | "type": "integer",
|
381 | "minimum": 1,
|
382 | "description": "The layer order of a sprite should be a positive number, if specified."
|
383 | }
|
384 | },
|
385 | "required": [
|
386 | "name",
|
387 | "isStage"
|
388 | ]
|
389 | },
|
390 | "target": {
|
391 | "type": "object",
|
392 | "description" : "Properties common to both Scratch 3.0 Stage and Sprite",
|
393 | "properties": {
|
394 | "currentCostume": {
|
395 | "type": "integer",
|
396 | "minimum": 0
|
397 | },
|
398 | "blocks": {
|
399 | "type": "object",
|
400 | "additionalProperties": {
|
401 | "oneOf": [
|
402 | {"$ref":"#/definitions/block"},
|
403 | {"$ref":"#/definitions/topLevelPrimitive"}
|
404 | ]
|
405 | }
|
406 | },
|
407 | "variables": {
|
408 | "type": "object",
|
409 | "additionalProperties": {"$ref":"#/definitions/scalar_variable"}
|
410 | },
|
411 | "lists": {
|
412 | "type": "object",
|
413 | "additionalProperties": {"$ref":"#/definitions/list"}
|
414 | },
|
415 | "broadcasts": {
|
416 | "type": "object",
|
417 | "additionalProperties": {"$ref":"#/definitions/broadcast_message"}
|
418 | },
|
419 | "comments": {
|
420 | "type": "object",
|
421 | "additionalProperties": {"$ref": "#/definitions/comment"}
|
422 | },
|
423 | "costumes": {
|
424 | "type": "array",
|
425 | "items": {"$ref":"#/definitions/costume"},
|
426 | "minItems": 1,
|
427 | "uniqueItems": true
|
428 | },
|
429 | "sounds": {
|
430 | "type": "array",
|
431 | "items": {"$ref":"#/definitions/sound"},
|
432 | "uniqueItems": true
|
433 | },
|
434 | "volume": {
|
435 | "type": "number"
|
436 | }
|
437 | },
|
438 | "required": [
|
439 | "variables",
|
440 | "costumes",
|
441 | "sounds",
|
442 | "blocks"
|
443 | ]
|
444 | }
|
445 | }
|
446 | }
|