UNPKG

14.7 kBJSONView Raw
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}