moonscratch 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/dist/chunk-DQk6qfdC.mjs +18 -0
  2. package/dist/index.d.mts +1173 -0
  3. package/dist/index.mjs +27135 -0
  4. package/package.json +6 -1
  5. package/.agents/skills/moonbit-agent-guide/LICENSE +0 -202
  6. package/.agents/skills/moonbit-agent-guide/SKILL.mbt.md +0 -1126
  7. package/.agents/skills/moonbit-agent-guide/SKILL.md +0 -1126
  8. package/.agents/skills/moonbit-agent-guide/ide.md +0 -116
  9. package/.agents/skills/moonbit-agent-guide/references/advanced-moonbit-build.md +0 -106
  10. package/.agents/skills/moonbit-agent-guide/references/moonbit-language-fundamentals.mbt.md +0 -422
  11. package/.agents/skills/moonbit-agent-guide/references/moonbit-language-fundamentals.md +0 -422
  12. package/.agents/skills/moonbit-practice/SKILL.md +0 -258
  13. package/.agents/skills/moonbit-practice/assets/ci.yaml +0 -25
  14. package/.agents/skills/moonbit-practice/reference/agents.md +0 -1469
  15. package/.agents/skills/moonbit-practice/reference/configuration.md +0 -228
  16. package/.agents/skills/moonbit-practice/reference/ffi.md +0 -229
  17. package/.agents/skills/moonbit-practice/reference/ide.md +0 -189
  18. package/.agents/skills/moonbit-practice/reference/performance.md +0 -217
  19. package/.agents/skills/moonbit-practice/reference/refactor.md +0 -154
  20. package/.agents/skills/moonbit-practice/reference/stdlib.md +0 -351
  21. package/.agents/skills/moonbit-practice/reference/testing.md +0 -228
  22. package/.agents/skills/moonbit-refactoring/LICENSE +0 -21
  23. package/.agents/skills/moonbit-refactoring/SKILL.md +0 -323
  24. package/.githooks/README.md +0 -23
  25. package/.githooks/pre-commit +0 -3
  26. package/.github/workflows/copilot-setup-steps.yml +0 -40
  27. package/AGENTS.md +0 -91
  28. package/PLAN.md +0 -64
  29. package/TODO.md +0 -120
  30. package/benchmarks/calc.bench.ts +0 -144
  31. package/benchmarks/draw.bench.ts +0 -215
  32. package/benchmarks/load.bench.ts +0 -28
  33. package/benchmarks/render.bench.ts +0 -53
  34. package/benchmarks/run.bench.ts +0 -8
  35. package/benchmarks/types.d.ts +0 -15
  36. package/docs/scratch-vm-specs/eventloop.md +0 -103
  37. package/docs/scratch-vm-specs/moonscratch-time-separation.md +0 -50
  38. package/index.html +0 -91
  39. package/js/AGENTS.md +0 -5
  40. package/js/a.ts +0 -52
  41. package/js/assets/AGENTS.md +0 -5
  42. package/js/assets/base64.test.ts +0 -14
  43. package/js/assets/base64.ts +0 -21
  44. package/js/assets/build-asset.test.ts +0 -26
  45. package/js/assets/build-asset.ts +0 -28
  46. package/js/assets/create.test.ts +0 -142
  47. package/js/assets/create.ts +0 -122
  48. package/js/assets/index.test.ts +0 -15
  49. package/js/assets/index.ts +0 -2
  50. package/js/assets/types.ts +0 -26
  51. package/js/assets/validation.test.ts +0 -34
  52. package/js/assets/validation.ts +0 -25
  53. package/js/assets.test.ts +0 -14
  54. package/js/assets.ts +0 -1
  55. package/js/index.test.ts +0 -26
  56. package/js/index.ts +0 -3
  57. package/js/render/index.test.ts +0 -65
  58. package/js/render/index.ts +0 -13
  59. package/js/render/sharp.ts +0 -87
  60. package/js/render/svg.ts +0 -68
  61. package/js/render/types.ts +0 -35
  62. package/js/render/utils.ts +0 -108
  63. package/js/render/webgl.ts +0 -274
  64. package/js/sharp-optional.d.ts +0 -16
  65. package/js/test/helpers.ts +0 -116
  66. package/js/test/hikkaku-sample.test.ts +0 -37
  67. package/js/test/rubik-components.input-motion.test.ts +0 -60
  68. package/js/test/rubik-components.lists.test.ts +0 -49
  69. package/js/test/rubik-components.operators.test.ts +0 -104
  70. package/js/test/rubik-components.pen.test.ts +0 -112
  71. package/js/test/rubik-components.procedures-loops.test.ts +0 -72
  72. package/js/test/rubik-components.variables-branches.test.ts +0 -57
  73. package/js/test/rubik-components.visibility-entry.test.ts +0 -31
  74. package/js/test/test-projects.ts +0 -598
  75. package/js/test/variable.ts +0 -200
  76. package/js/test/warp.test.ts +0 -59
  77. package/js/vm/AGENTS.md +0 -6
  78. package/js/vm/README.md +0 -183
  79. package/js/vm/bindings.test.ts +0 -13
  80. package/js/vm/bindings.ts +0 -5
  81. package/js/vm/compare-operators.test.ts +0 -145
  82. package/js/vm/constants.test.ts +0 -11
  83. package/js/vm/constants.ts +0 -4
  84. package/js/vm/effect-guards.test.ts +0 -68
  85. package/js/vm/effect-guards.ts +0 -44
  86. package/js/vm/factory.test.ts +0 -486
  87. package/js/vm/factory.ts +0 -615
  88. package/js/vm/headless-vm.test.ts +0 -131
  89. package/js/vm/headless-vm.ts +0 -342
  90. package/js/vm/index.test.ts +0 -28
  91. package/js/vm/index.ts +0 -5
  92. package/js/vm/internal-types.ts +0 -32
  93. package/js/vm/json.test.ts +0 -40
  94. package/js/vm/json.ts +0 -273
  95. package/js/vm/normalize.test.ts +0 -48
  96. package/js/vm/normalize.ts +0 -65
  97. package/js/vm/options.test.ts +0 -30
  98. package/js/vm/options.ts +0 -55
  99. package/js/vm/pen-transparency.test.ts +0 -115
  100. package/js/vm/program-wasm.ts +0 -322
  101. package/js/vm/scheduler-render.test.ts +0 -401
  102. package/js/vm/scratch-assets.test.ts +0 -136
  103. package/js/vm/scratch-assets.ts +0 -202
  104. package/js/vm/types.ts +0 -358
  105. package/js/vm/value-guards.test.ts +0 -25
  106. package/js/vm/value-guards.ts +0 -18
  107. package/moon.mod.json +0 -10
  108. package/scripts/preinstall.ts +0 -4
  109. package/src/AGENTS.md +0 -6
  110. package/src/api.mbt +0 -161
  111. package/src/api_aot_commands.mbt +0 -184
  112. package/src/api_effects_json.mbt +0 -72
  113. package/src/api_options.mbt +0 -60
  114. package/src/api_program_wasm.mbt +0 -1647
  115. package/src/api_program_wat.mbt +0 -2206
  116. package/src/api_snapshot_json.mbt +0 -44
  117. package/src/cmd/AGENTS.md +0 -5
  118. package/src/cmd/main/AGENTS.md +0 -5
  119. package/src/cmd/main/main.mbt +0 -29
  120. package/src/cmd/main/moon.pkg +0 -7
  121. package/src/cmd/main/pkg.generated.mbti +0 -13
  122. package/src/json_helpers.mbt +0 -176
  123. package/src/moon.pkg +0 -65
  124. package/src/moonscratch.mbt +0 -3
  125. package/src/moonscratch_wbtest.mbt +0 -40
  126. package/src/parser_sb3.mbt +0 -890
  127. package/src/pkg.generated.mbti +0 -479
  128. package/src/runtime_eval.mbt +0 -2844
  129. package/src/runtime_exec.mbt +0 -3850
  130. package/src/runtime_render.mbt +0 -2550
  131. package/src/runtime_state.mbt +0 -870
  132. package/src/test/AGENTS.md +0 -3
  133. package/src/test/projects/AGENTS.md +0 -6
  134. package/src/test/projects/moon.pkg +0 -4
  135. package/src/test/projects/moonscratch_compat_test.mbt +0 -642
  136. package/src/test/projects/moonscratch_core_test.mbt +0 -1332
  137. package/src/test/projects/moonscratch_runtime_test.mbt +0 -1087
  138. package/src/test/projects/pkg.generated.mbti +0 -13
  139. package/src/test/projects/test_support.mbt +0 -35
  140. package/src/types_effects.mbt +0 -20
  141. package/src/types_error.mbt +0 -4
  142. package/src/types_options.mbt +0 -31
  143. package/src/types_runtime_structs.mbt +0 -254
  144. package/src/types_vm.mbt +0 -109
  145. package/tsconfig.json +0 -29
  146. package/viewer/index.ts +0 -399
  147. package/viewer/vite.d.ts +0 -1
  148. package/viewer/worker.ts +0 -161
  149. package/vite.config.ts +0 -61
@@ -1,1087 +0,0 @@
1
- ///|
2
- let procedures_project =
3
- #|{
4
- #| "targets": [
5
- #| {
6
- #| "isStage": true,
7
- #| "name": "Stage",
8
- #| "variables": {
9
- #| "var_inside": ["inside", 0],
10
- #| "var_outside": ["outside", 0]
11
- #| },
12
- #| "lists": {},
13
- #| "blocks": {}
14
- #| },
15
- #| {
16
- #| "isStage": false,
17
- #| "name": "Sprite1",
18
- #| "variables": {},
19
- #| "lists": {},
20
- #| "blocks": {
21
- #| "hat_flag": {
22
- #| "opcode": "event_whenflagclicked",
23
- #| "next": "set_outside",
24
- #| "parent": null,
25
- #| "inputs": {},
26
- #| "fields": {},
27
- #| "topLevel": true
28
- #| },
29
- #| "set_outside": {
30
- #| "opcode": "data_setvariableto",
31
- #| "next": "call_proc",
32
- #| "parent": "hat_flag",
33
- #| "inputs": {
34
- #| "VALUE": [2, "arg_outside"]
35
- #| },
36
- #| "fields": {
37
- #| "VARIABLE": ["outside", "var_outside"]
38
- #| },
39
- #| "topLevel": false
40
- #| },
41
- #| "arg_outside": {
42
- #| "opcode": "argument_reporter_string_number",
43
- #| "next": null,
44
- #| "parent": "set_outside",
45
- #| "inputs": {},
46
- #| "fields": {
47
- #| "VALUE": ["x", null]
48
- #| },
49
- #| "topLevel": false
50
- #| },
51
- #| "call_proc": {
52
- #| "opcode": "procedures_call",
53
- #| "next": null,
54
- #| "parent": "set_outside",
55
- #| "inputs": {
56
- #| "arg_id": [1, [4, 7]]
57
- #| },
58
- #| "fields": {},
59
- #| "mutation": {
60
- #| "proccode": "set inside %s",
61
- #| "argumentids": "[\"arg_id\"]",
62
- #| "argumentnames": "[\"x\"]",
63
- #| "argumentdefaults": "[0]",
64
- #| "warp": "false"
65
- #| },
66
- #| "topLevel": false
67
- #| },
68
- #| "proc_def": {
69
- #| "opcode": "procedures_definition",
70
- #| "next": "set_inside",
71
- #| "parent": null,
72
- #| "inputs": {
73
- #| "custom_block": [1, "proc_proto"]
74
- #| },
75
- #| "fields": {},
76
- #| "topLevel": true
77
- #| },
78
- #| "proc_proto": {
79
- #| "opcode": "procedures_prototype",
80
- #| "next": null,
81
- #| "parent": "proc_def",
82
- #| "inputs": {},
83
- #| "fields": {},
84
- #| "mutation": {
85
- #| "proccode": "set inside %s",
86
- #| "argumentids": "[\"arg_id\"]",
87
- #| "argumentnames": "[\"x\"]",
88
- #| "argumentdefaults": "[0]",
89
- #| "warp": "false"
90
- #| },
91
- #| "topLevel": false
92
- #| },
93
- #| "set_inside": {
94
- #| "opcode": "data_setvariableto",
95
- #| "next": null,
96
- #| "parent": "proc_def",
97
- #| "inputs": {
98
- #| "VALUE": [2, "arg_inside"]
99
- #| },
100
- #| "fields": {
101
- #| "VARIABLE": ["inside", "var_inside"]
102
- #| },
103
- #| "topLevel": false
104
- #| },
105
- #| "arg_inside": {
106
- #| "opcode": "argument_reporter_string_number",
107
- #| "next": null,
108
- #| "parent": "set_inside",
109
- #| "inputs": {},
110
- #| "fields": {
111
- #| "VALUE": ["x", null]
112
- #| },
113
- #| "topLevel": false
114
- #| }
115
- #| }
116
- #| }
117
- #| ]
118
- #|}
119
-
120
- ///|
121
- test "procedures call and argument reporters" {
122
- let vm = unwrap_result(
123
- try? vm_new_precompiled_from_json(procedures_project),
124
- "vm init failed",
125
- )
126
- @moonscratch.vm_green_flag(vm)
127
- for _ in 0..<20 {
128
- ignore(@moonscratch.vm_step_frame(vm))
129
- }
130
-
131
- let snapshot = unwrap_result(
132
- try? @json.parse(@moonscratch.vm_snapshot_json(vm)),
133
- "snapshot parse failed",
134
- )
135
- let root_obj = match snapshot {
136
- Object(obj) => obj
137
- _ => fail("snapshot must be object")
138
- }
139
- let targets = match root_obj["targets"] {
140
- Array(items) => items
141
- _ => fail("targets must be array")
142
- }
143
- let stage = match targets[0] {
144
- Object(obj) => obj
145
- _ => fail("stage must be object")
146
- }
147
- let vars = match stage["variables"] {
148
- Object(obj) => obj
149
- _ => fail("variables must be object")
150
- }
151
- assert_eq(vars["var_inside"], Json::number(7.0))
152
- assert_eq(vars["var_outside"], Json::number(0.0))
153
- }
154
-
155
- ///|
156
- let procedures_project_nonwarp =
157
- #|{
158
- #| "targets": [
159
- #| {
160
- #| "isStage": true,
161
- #| "name": "Stage",
162
- #| "variables": {
163
- #| "var_inside": ["inside", 0],
164
- #| "var_outside": ["outside", 0]
165
- #| },
166
- #| "lists": {},
167
- #| "blocks": {}
168
- #| },
169
- #| {
170
- #| "isStage": false,
171
- #| "name": "Sprite1",
172
- #| "variables": {},
173
- #| "lists": {},
174
- #| "blocks": {
175
- #| "hat_main": {
176
- #| "opcode": "event_whenflagclicked",
177
- #| "next": "call_proc",
178
- #| "parent": null,
179
- #| "inputs": {},
180
- #| "fields": {},
181
- #| "topLevel": true
182
- #| },
183
- #| "call_proc": {
184
- #| "opcode": "procedures_call",
185
- #| "next": null,
186
- #| "parent": "hat_main",
187
- #| "inputs": {},
188
- #| "fields": {},
189
- #| "mutation": {
190
- #| "proccode": "long task",
191
- #| "argumentids": "[]",
192
- #| "argumentnames": "[]",
193
- #| "argumentdefaults": "[]",
194
- #| "warp": "false"
195
- #| },
196
- #| "topLevel": false
197
- #| },
198
- #| "proc_def": {
199
- #| "opcode": "procedures_definition",
200
- #| "next": "repeat_proc",
201
- #| "parent": null,
202
- #| "inputs": {
203
- #| "custom_block": [1, "proc_proto"]
204
- #| },
205
- #| "fields": {},
206
- #| "topLevel": true
207
- #| },
208
- #| "proc_proto": {
209
- #| "opcode": "procedures_prototype",
210
- #| "next": null,
211
- #| "parent": "proc_def",
212
- #| "inputs": {},
213
- #| "fields": {},
214
- #| "mutation": {
215
- #| "proccode": "long task",
216
- #| "argumentids": "[]",
217
- #| "argumentnames": "[]",
218
- #| "argumentdefaults": "[]",
219
- #| "warp": "false"
220
- #| },
221
- #| "topLevel": false
222
- #| },
223
- #| "repeat_proc": {
224
- #| "opcode": "control_repeat",
225
- #| "next": null,
226
- #| "parent": "proc_def",
227
- #| "inputs": {
228
- #| "TIMES": [4, 250],
229
- #| "SUBSTACK": [2, "inc_inside"]
230
- #| },
231
- #| "fields": {},
232
- #| "topLevel": false
233
- #| },
234
- #| "inc_inside": {
235
- #| "opcode": "data_changevariableby",
236
- #| "next": null,
237
- #| "parent": "repeat_proc",
238
- #| "inputs": {
239
- #| "VALUE": [4, 1]
240
- #| },
241
- #| "fields": {
242
- #| "VARIABLE": ["inside", "var_inside"]
243
- #| },
244
- #| "topLevel": false
245
- #| },
246
- #| "hat_outside": {
247
- #| "opcode": "event_whenflagclicked",
248
- #| "next": "set_outside",
249
- #| "parent": null,
250
- #| "inputs": {},
251
- #| "fields": {},
252
- #| "topLevel": true
253
- #| },
254
- #| "set_outside": {
255
- #| "opcode": "data_setvariableto",
256
- #| "next": null,
257
- #| "parent": "hat_outside",
258
- #| "inputs": {
259
- #| "VALUE": [4, 1]
260
- #| },
261
- #| "fields": {
262
- #| "VARIABLE": ["outside", "var_outside"]
263
- #| },
264
- #| "topLevel": false
265
- #| }
266
- #| }
267
- #| }
268
- #| ]
269
- #|}
270
-
271
- ///|
272
- test "procedures call non-warp yields before procedure loop in same frame" {
273
- let vm = unwrap_result(
274
- try? vm_new_precompiled_from_json(procedures_project_nonwarp),
275
- "vm init failed",
276
- )
277
- @moonscratch.vm_green_flag(vm)
278
- ignore(@moonscratch.vm_step_frame(vm))
279
- let snapshot = unwrap_result(
280
- try? @json.parse(@moonscratch.vm_snapshot_json(vm)),
281
- "snapshot parse failed",
282
- )
283
- let root_obj = match snapshot {
284
- Object(obj) => obj
285
- _ => fail("snapshot must be object")
286
- }
287
- let targets = match root_obj["targets"] {
288
- Array(items) => items
289
- _ => fail("targets must be array")
290
- }
291
- let stage = match targets[0] {
292
- Object(obj) => obj
293
- _ => fail("stage must be object")
294
- }
295
- let vars = match stage["variables"] {
296
- Object(obj) => obj
297
- _ => fail("variables must be object")
298
- }
299
- assert_eq(vars["var_outside"], Json::number(1.0))
300
- }
301
-
302
- ///|
303
- let procedures_project_warp =
304
- #|{
305
- #| "targets": [
306
- #| {
307
- #| "isStage": true,
308
- #| "name": "Stage",
309
- #| "variables": {
310
- #| "var_inside": ["inside", 0],
311
- #| "var_outside": ["outside", 0]
312
- #| },
313
- #| "lists": {},
314
- #| "blocks": {}
315
- #| },
316
- #| {
317
- #| "isStage": false,
318
- #| "name": "Sprite1",
319
- #| "variables": {},
320
- #| "lists": {},
321
- #| "blocks": {
322
- #| "hat_flag": {
323
- #| "opcode": "event_whenflagclicked",
324
- #| "next": "call_proc",
325
- #| "parent": null,
326
- #| "inputs": {},
327
- #| "fields": {},
328
- #| "topLevel": true
329
- #| },
330
- #| "call_proc": {
331
- #| "opcode": "procedures_call",
332
- #| "next": null,
333
- #| "parent": "hat_flag",
334
- #| "inputs": {
335
- #| "arg_id": [1, [4, 7]]
336
- #| },
337
- #| "fields": {},
338
- #| "mutation": {
339
- #| "proccode": "set inside %s",
340
- #| "argumentids": "[\"arg_id\"]",
341
- #| "argumentnames": "[\"x\"]",
342
- #| "argumentdefaults": "[0]",
343
- #| "warp": "true"
344
- #| },
345
- #| "topLevel": false
346
- #| },
347
- #| "proc_def": {
348
- #| "opcode": "procedures_definition",
349
- #| "next": "set_inside",
350
- #| "parent": null,
351
- #| "inputs": {
352
- #| "custom_block": [1, "proc_proto"]
353
- #| },
354
- #| "fields": {},
355
- #| "topLevel": true
356
- #| },
357
- #| "proc_proto": {
358
- #| "opcode": "procedures_prototype",
359
- #| "next": null,
360
- #| "parent": "proc_def",
361
- #| "inputs": {},
362
- #| "fields": {},
363
- #| "mutation": {
364
- #| "proccode": "set inside %s",
365
- #| "argumentids": "[\"arg_id\"]",
366
- #| "argumentnames": "[\"x\"]",
367
- #| "argumentdefaults": "[0]",
368
- #| "warp": "true"
369
- #| },
370
- #| "topLevel": false
371
- #| },
372
- #| "set_inside": {
373
- #| "opcode": "data_setvariableto",
374
- #| "next": null,
375
- #| "parent": "proc_def",
376
- #| "inputs": {
377
- #| "VALUE": [2, "arg_inside"]
378
- #| },
379
- #| "fields": {
380
- #| "VARIABLE": ["inside", "var_inside"]
381
- #| },
382
- #| "topLevel": false
383
- #| },
384
- #| "arg_inside": {
385
- #| "opcode": "argument_reporter_string_number",
386
- #| "next": null,
387
- #| "parent": "set_inside",
388
- #| "inputs": {},
389
- #| "fields": {
390
- #| "VALUE": ["x", null]
391
- #| },
392
- #| "topLevel": false
393
- #| }
394
- #| }
395
- #| }
396
- #| ]
397
- #|}
398
-
399
- ///|
400
- test "procedures call warp mode executes body in same frame" {
401
- let vm = unwrap_result(
402
- try? vm_new_precompiled_from_json(procedures_project_warp),
403
- "vm init failed",
404
- )
405
- @moonscratch.vm_green_flag(vm)
406
- ignore(@moonscratch.vm_step_frame(vm))
407
-
408
- let snapshot = unwrap_result(
409
- try? @json.parse(@moonscratch.vm_snapshot_json(vm)),
410
- "snapshot parse failed",
411
- )
412
- let root_obj = match snapshot {
413
- Object(obj) => obj
414
- _ => fail("snapshot must be object")
415
- }
416
- let targets = match root_obj["targets"] {
417
- Array(items) => items
418
- _ => fail("targets must be array")
419
- }
420
- let stage = match targets[0] {
421
- Object(obj) => obj
422
- _ => fail("stage must be object")
423
- }
424
- let vars = match stage["variables"] {
425
- Object(obj) => obj
426
- _ => fail("variables must be object")
427
- }
428
- assert_eq(vars["var_inside"], Json::number(7.0))
429
- assert_eq(vars["var_outside"], Json::number(0.0))
430
- }
431
-
432
- ///|
433
- let sensing_sound_project =
434
- #|{
435
- #| "targets": [
436
- #| {
437
- #| "isStage": true,
438
- #| "name": "Stage",
439
- #| "variables": {
440
- #| "var_timer": ["timer_value", 0],
441
- #| "var_sm": ["sound_menu", ""],
442
- #| "var_em": ["effect_menu", ""],
443
- #| "var_bm": ["beats_menu", ""],
444
- #| "var_vol": ["volume", 0],
445
- #| "var_mx": ["mouse_x", 0],
446
- #| "var_my": ["mouse_y", 0],
447
- #| "var_md": ["mouse_down", false],
448
- #| "var_key": ["space_down", false],
449
- #| "var_touch": ["touching_mouse", false],
450
- #| "var_dist": ["distance", 0],
451
- #| "var_loudness": ["loudness", 0],
452
- #| "var_loud": ["loud", false],
453
- #| "var_online": ["online", false],
454
- #| "var_username": ["username", ""],
455
- #| "var_userid": ["userid", 0],
456
- #| "var_current_year": ["current_year", 0],
457
- #| "var_days": ["days_since_2000", 0],
458
- #| "var_of_x": ["of_x", 0],
459
- #| "var_of_volume": ["of_volume", 0],
460
- #| "var_touchingcolor": ["touching_color", false],
461
- #| "var_color_touch": ["color_touch", false]
462
- #| },
463
- #| "lists": {},
464
- #| "blocks": {}
465
- #| },
466
- #| {
467
- #| "isStage": false,
468
- #| "name": "Sprite1",
469
- #| "variables": {},
470
- #| "lists": {},
471
- #| "blocks": {
472
- #| "hat_flag": {
473
- #| "opcode": "event_whenflagclicked",
474
- #| "next": "set_volume",
475
- #| "parent": null,
476
- #| "inputs": {},
477
- #| "fields": {},
478
- #| "topLevel": true
479
- #| },
480
- #| "set_volume": {
481
- #| "opcode": "sound_setvolumeto",
482
- #| "next": "change_volume",
483
- #| "parent": "hat_flag",
484
- #| "inputs": {
485
- #| "VOLUME": [1, [4, 20]]
486
- #| },
487
- #| "fields": {},
488
- #| "topLevel": false
489
- #| },
490
- #| "change_volume": {
491
- #| "opcode": "sound_changevolumeby",
492
- #| "next": "set_effect",
493
- #| "parent": "set_volume",
494
- #| "inputs": {
495
- #| "VOLUME": [1, [4, 5]]
496
- #| },
497
- #| "fields": {},
498
- #| "topLevel": false
499
- #| },
500
- #| "set_effect": {
501
- #| "opcode": "sound_seteffectto",
502
- #| "next": "change_effect",
503
- #| "parent": "change_volume",
504
- #| "inputs": {
505
- #| "EFFECT": [1, [10, "pitch"]],
506
- #| "VALUE": [1, [4, 30]]
507
- #| },
508
- #| "fields": {},
509
- #| "topLevel": false
510
- #| },
511
- #| "change_effect": {
512
- #| "opcode": "sound_changeeffectby",
513
- #| "next": "clear_effect",
514
- #| "parent": "set_effect",
515
- #| "inputs": {
516
- #| "EFFECT": [1, [10, "pitch"]],
517
- #| "VALUE": [1, [4, 5]]
518
- #| },
519
- #| "fields": {},
520
- #| "topLevel": false
521
- #| },
522
- #| "clear_effect": {
523
- #| "opcode": "sound_cleareffects",
524
- #| "next": "reset_timer",
525
- #| "parent": "change_effect",
526
- #| "inputs": {},
527
- #| "fields": {},
528
- #| "topLevel": false
529
- #| },
530
- #| "reset_timer": {
531
- #| "opcode": "sensing_resettimer",
532
- #| "next": "wait_short",
533
- #| "parent": "clear_effect",
534
- #| "inputs": {},
535
- #| "fields": {},
536
- #| "topLevel": false
537
- #| },
538
- #| "wait_short": {
539
- #| "opcode": "control_wait",
540
- #| "next": "set_timer",
541
- #| "parent": "reset_timer",
542
- #| "inputs": {
543
- #| "DURATION": [1, [4, 0.05]]
544
- #| },
545
- #| "fields": {},
546
- #| "topLevel": false
547
- #| },
548
- #| "set_timer": {
549
- #| "opcode": "data_setvariableto",
550
- #| "next": "set_sound_menu",
551
- #| "parent": "wait_short",
552
- #| "inputs": {
553
- #| "VALUE": [2, "rep_timer"]
554
- #| },
555
- #| "fields": {
556
- #| "VARIABLE": ["timer_value", "var_timer"]
557
- #| },
558
- #| "topLevel": false
559
- #| },
560
- #| "set_sound_menu": {
561
- #| "opcode": "data_setvariableto",
562
- #| "next": "set_effect_menu",
563
- #| "parent": "set_timer",
564
- #| "inputs": {
565
- #| "VALUE": [2, "rep_sound_menu"]
566
- #| },
567
- #| "fields": {
568
- #| "VARIABLE": ["sound_menu", "var_sm"]
569
- #| },
570
- #| "topLevel": false
571
- #| },
572
- #| "set_effect_menu": {
573
- #| "opcode": "data_setvariableto",
574
- #| "next": "set_beats_menu",
575
- #| "parent": "set_sound_menu",
576
- #| "inputs": {
577
- #| "VALUE": [2, "rep_effect_menu"]
578
- #| },
579
- #| "fields": {
580
- #| "VARIABLE": ["effect_menu", "var_em"]
581
- #| },
582
- #| "topLevel": false
583
- #| },
584
- #| "set_beats_menu": {
585
- #| "opcode": "data_setvariableto",
586
- #| "next": "set_volume_reporter",
587
- #| "parent": "set_effect_menu",
588
- #| "inputs": {
589
- #| "VALUE": [2, "rep_beats_menu"]
590
- #| },
591
- #| "fields": {
592
- #| "VARIABLE": ["beats_menu", "var_bm"]
593
- #| },
594
- #| "topLevel": false
595
- #| },
596
- #| "set_volume_reporter": {
597
- #| "opcode": "data_setvariableto",
598
- #| "next": "set_mousex",
599
- #| "parent": "set_beats_menu",
600
- #| "inputs": {
601
- #| "VALUE": [2, "rep_volume"]
602
- #| },
603
- #| "fields": {
604
- #| "VARIABLE": ["volume", "var_vol"]
605
- #| },
606
- #| "topLevel": false
607
- #| },
608
- #| "set_mousex": {
609
- #| "opcode": "data_setvariableto",
610
- #| "next": "set_mousey",
611
- #| "parent": "set_volume_reporter",
612
- #| "inputs": {
613
- #| "VALUE": [2, "rep_mousex"]
614
- #| },
615
- #| "fields": {
616
- #| "VARIABLE": ["mouse_x", "var_mx"]
617
- #| },
618
- #| "topLevel": false
619
- #| },
620
- #| "set_mousey": {
621
- #| "opcode": "data_setvariableto",
622
- #| "next": "set_mousedown",
623
- #| "parent": "set_mousex",
624
- #| "inputs": {
625
- #| "VALUE": [2, "rep_mousey"]
626
- #| },
627
- #| "fields": {
628
- #| "VARIABLE": ["mouse_y", "var_my"]
629
- #| },
630
- #| "topLevel": false
631
- #| },
632
- #| "set_mousedown": {
633
- #| "opcode": "data_setvariableto",
634
- #| "next": "set_key",
635
- #| "parent": "set_mousey",
636
- #| "inputs": {
637
- #| "VALUE": [2, "rep_mousedown"]
638
- #| },
639
- #| "fields": {
640
- #| "VARIABLE": ["mouse_down", "var_md"]
641
- #| },
642
- #| "topLevel": false
643
- #| },
644
- #| "set_key": {
645
- #| "opcode": "data_setvariableto",
646
- #| "next": "set_touch",
647
- #| "parent": "set_mousedown",
648
- #| "inputs": {
649
- #| "VALUE": [2, "rep_key"]
650
- #| },
651
- #| "fields": {
652
- #| "VARIABLE": ["space_down", "var_key"]
653
- #| },
654
- #| "topLevel": false
655
- #| },
656
- #| "set_touch": {
657
- #| "opcode": "data_setvariableto",
658
- #| "next": "set_dist",
659
- #| "parent": "set_key",
660
- #| "inputs": {
661
- #| "VALUE": [2, "rep_touch"]
662
- #| },
663
- #| "fields": {
664
- #| "VARIABLE": ["touching_mouse", "var_touch"]
665
- #| },
666
- #| "topLevel": false
667
- #| },
668
- #| "set_dist": {
669
- #| "opcode": "data_setvariableto",
670
- #| "next": "set_loudness",
671
- #| "parent": "set_touch",
672
- #| "inputs": {
673
- #| "VALUE": [2, "rep_dist"]
674
- #| },
675
- #| "fields": {
676
- #| "VARIABLE": ["distance", "var_dist"]
677
- #| },
678
- #| "topLevel": false
679
- #| },
680
- #| "set_loudness": {
681
- #| "opcode": "data_setvariableto",
682
- #| "next": "set_loud",
683
- #| "parent": "set_dist",
684
- #| "inputs": {
685
- #| "VALUE": [2, "rep_loudness"]
686
- #| },
687
- #| "fields": {
688
- #| "VARIABLE": ["loudness", "var_loudness"]
689
- #| },
690
- #| "topLevel": false
691
- #| },
692
- #| "set_loud": {
693
- #| "opcode": "data_setvariableto",
694
- #| "next": "set_online",
695
- #| "parent": "set_loudness",
696
- #| "inputs": {
697
- #| "VALUE": [2, "rep_loud"]
698
- #| },
699
- #| "fields": {
700
- #| "VARIABLE": ["loud", "var_loud"]
701
- #| },
702
- #| "topLevel": false
703
- #| },
704
- #| "set_online": {
705
- #| "opcode": "data_setvariableto",
706
- #| "next": "set_username",
707
- #| "parent": "set_loud",
708
- #| "inputs": {
709
- #| "VALUE": [2, "rep_online"]
710
- #| },
711
- #| "fields": {
712
- #| "VARIABLE": ["online", "var_online"]
713
- #| },
714
- #| "topLevel": false
715
- #| },
716
- #| "set_username": {
717
- #| "opcode": "data_setvariableto",
718
- #| "next": "set_userid",
719
- #| "parent": "set_online",
720
- #| "inputs": {
721
- #| "VALUE": [2, "rep_username"]
722
- #| },
723
- #| "fields": {
724
- #| "VARIABLE": ["username", "var_username"]
725
- #| },
726
- #| "topLevel": false
727
- #| },
728
- #| "set_userid": {
729
- #| "opcode": "data_setvariableto",
730
- #| "next": "set_current_year",
731
- #| "parent": "set_username",
732
- #| "inputs": {
733
- #| "VALUE": [2, "rep_userid"]
734
- #| },
735
- #| "fields": {
736
- #| "VARIABLE": ["userid", "var_userid"]
737
- #| },
738
- #| "topLevel": false
739
- #| },
740
- #| "set_current_year": {
741
- #| "opcode": "data_setvariableto",
742
- #| "next": "set_days",
743
- #| "parent": "set_userid",
744
- #| "inputs": {
745
- #| "VALUE": [2, "rep_current"]
746
- #| },
747
- #| "fields": {
748
- #| "VARIABLE": ["current_year", "var_current_year"]
749
- #| },
750
- #| "topLevel": false
751
- #| },
752
- #| "set_days": {
753
- #| "opcode": "data_setvariableto",
754
- #| "next": "set_of_x",
755
- #| "parent": "set_current_year",
756
- #| "inputs": {
757
- #| "VALUE": [2, "rep_days"]
758
- #| },
759
- #| "fields": {
760
- #| "VARIABLE": ["days_since_2000", "var_days"]
761
- #| },
762
- #| "topLevel": false
763
- #| },
764
- #| "set_of_x": {
765
- #| "opcode": "data_setvariableto",
766
- #| "next": "set_of_volume",
767
- #| "parent": "set_days",
768
- #| "inputs": {
769
- #| "VALUE": [2, "rep_of_x"]
770
- #| },
771
- #| "fields": {
772
- #| "VARIABLE": ["of_x", "var_of_x"]
773
- #| },
774
- #| "topLevel": false
775
- #| },
776
- #| "set_of_volume": {
777
- #| "opcode": "data_setvariableto",
778
- #| "next": "set_touchingcolor",
779
- #| "parent": "set_of_x",
780
- #| "inputs": {
781
- #| "VALUE": [2, "rep_of_volume"]
782
- #| },
783
- #| "fields": {
784
- #| "VARIABLE": ["of_volume", "var_of_volume"]
785
- #| },
786
- #| "topLevel": false
787
- #| },
788
- #| "set_touchingcolor": {
789
- #| "opcode": "data_setvariableto",
790
- #| "next": "set_color_touch",
791
- #| "parent": "set_of_volume",
792
- #| "inputs": {
793
- #| "VALUE": [2, "rep_touchingcolor"]
794
- #| },
795
- #| "fields": {
796
- #| "VARIABLE": ["touching_color", "var_touchingcolor"]
797
- #| },
798
- #| "topLevel": false
799
- #| },
800
- #| "set_color_touch": {
801
- #| "opcode": "data_setvariableto",
802
- #| "next": null,
803
- #| "parent": "set_touchingcolor",
804
- #| "inputs": {
805
- #| "VALUE": [2, "rep_color_touch"]
806
- #| },
807
- #| "fields": {
808
- #| "VARIABLE": ["color_touch", "var_color_touch"]
809
- #| },
810
- #| "topLevel": false
811
- #| },
812
- #| "rep_timer": {
813
- #| "opcode": "sensing_timer",
814
- #| "next": null,
815
- #| "parent": "set_timer",
816
- #| "inputs": {},
817
- #| "fields": {},
818
- #| "topLevel": false
819
- #| },
820
- #| "rep_sound_menu": {
821
- #| "opcode": "sound_sounds_menu",
822
- #| "next": null,
823
- #| "parent": "set_sound_menu",
824
- #| "inputs": {},
825
- #| "fields": {
826
- #| "SOUND_MENU": ["pop", null]
827
- #| },
828
- #| "topLevel": false
829
- #| },
830
- #| "rep_effect_menu": {
831
- #| "opcode": "sound_effects_menu",
832
- #| "next": null,
833
- #| "parent": "set_effect_menu",
834
- #| "inputs": {},
835
- #| "fields": {
836
- #| "EFFECT": ["pitch", null]
837
- #| },
838
- #| "topLevel": false
839
- #| },
840
- #| "rep_beats_menu": {
841
- #| "opcode": "sound_beats_menu",
842
- #| "next": null,
843
- #| "parent": "set_beats_menu",
844
- #| "inputs": {},
845
- #| "fields": {
846
- #| "BEATS": ["0.5", null]
847
- #| },
848
- #| "topLevel": false
849
- #| },
850
- #| "rep_volume": {
851
- #| "opcode": "sound_volume",
852
- #| "next": null,
853
- #| "parent": "set_volume_reporter",
854
- #| "inputs": {},
855
- #| "fields": {},
856
- #| "topLevel": false
857
- #| },
858
- #| "rep_mousex": {
859
- #| "opcode": "sensing_mousex",
860
- #| "next": null,
861
- #| "parent": "set_mousex",
862
- #| "inputs": {},
863
- #| "fields": {},
864
- #| "topLevel": false
865
- #| },
866
- #| "rep_mousey": {
867
- #| "opcode": "sensing_mousey",
868
- #| "next": null,
869
- #| "parent": "set_mousey",
870
- #| "inputs": {},
871
- #| "fields": {},
872
- #| "topLevel": false
873
- #| },
874
- #| "rep_mousedown": {
875
- #| "opcode": "sensing_mousedown",
876
- #| "next": null,
877
- #| "parent": "set_mousedown",
878
- #| "inputs": {},
879
- #| "fields": {},
880
- #| "topLevel": false
881
- #| },
882
- #| "rep_key": {
883
- #| "opcode": "sensing_keypressed",
884
- #| "next": null,
885
- #| "parent": "set_key",
886
- #| "inputs": {},
887
- #| "fields": {
888
- #| "KEY_OPTION": ["space", null]
889
- #| },
890
- #| "topLevel": false
891
- #| },
892
- #| "rep_touch": {
893
- #| "opcode": "sensing_touchingobject",
894
- #| "next": null,
895
- #| "parent": "set_touch",
896
- #| "inputs": {},
897
- #| "fields": {
898
- #| "TOUCHINGOBJECTMENU": ["_mouse_", null]
899
- #| },
900
- #| "topLevel": false
901
- #| },
902
- #| "rep_dist": {
903
- #| "opcode": "sensing_distanceto",
904
- #| "next": null,
905
- #| "parent": "set_dist",
906
- #| "inputs": {},
907
- #| "fields": {
908
- #| "DISTANCETOMENU": ["_mouse_", null]
909
- #| },
910
- #| "topLevel": false
911
- #| },
912
- #| "rep_loudness": {
913
- #| "opcode": "sensing_loudness",
914
- #| "next": null,
915
- #| "parent": "set_loudness",
916
- #| "inputs": {},
917
- #| "fields": {},
918
- #| "topLevel": false
919
- #| },
920
- #| "rep_loud": {
921
- #| "opcode": "sensing_loud",
922
- #| "next": null,
923
- #| "parent": "set_loud",
924
- #| "inputs": {},
925
- #| "fields": {},
926
- #| "topLevel": false
927
- #| },
928
- #| "rep_online": {
929
- #| "opcode": "sensing_online",
930
- #| "next": null,
931
- #| "parent": "set_online",
932
- #| "inputs": {},
933
- #| "fields": {},
934
- #| "topLevel": false
935
- #| },
936
- #| "rep_username": {
937
- #| "opcode": "sensing_username",
938
- #| "next": null,
939
- #| "parent": "set_username",
940
- #| "inputs": {},
941
- #| "fields": {},
942
- #| "topLevel": false
943
- #| },
944
- #| "rep_userid": {
945
- #| "opcode": "sensing_userid",
946
- #| "next": null,
947
- #| "parent": "set_userid",
948
- #| "inputs": {},
949
- #| "fields": {},
950
- #| "topLevel": false
951
- #| },
952
- #| "rep_current": {
953
- #| "opcode": "sensing_current",
954
- #| "next": null,
955
- #| "parent": "set_current_year",
956
- #| "inputs": {},
957
- #| "fields": {
958
- #| "CURRENTMENU": ["year", null]
959
- #| },
960
- #| "topLevel": false
961
- #| },
962
- #| "rep_days": {
963
- #| "opcode": "sensing_dayssince2000",
964
- #| "next": null,
965
- #| "parent": "set_days",
966
- #| "inputs": {},
967
- #| "fields": {},
968
- #| "topLevel": false
969
- #| },
970
- #| "rep_of_x": {
971
- #| "opcode": "sensing_of",
972
- #| "next": null,
973
- #| "parent": "set_of_x",
974
- #| "inputs": {},
975
- #| "fields": {
976
- #| "PROPERTY": ["x position", null],
977
- #| "OBJECT": ["Sprite1", null]
978
- #| },
979
- #| "topLevel": false
980
- #| },
981
- #| "rep_of_volume": {
982
- #| "opcode": "sensing_of",
983
- #| "next": null,
984
- #| "parent": "set_of_volume",
985
- #| "inputs": {},
986
- #| "fields": {
987
- #| "PROPERTY": ["volume", null],
988
- #| "OBJECT": ["_stage_", null]
989
- #| },
990
- #| "topLevel": false
991
- #| },
992
- #| "rep_touchingcolor": {
993
- #| "opcode": "sensing_touchingcolor",
994
- #| "next": null,
995
- #| "parent": "set_touchingcolor",
996
- #| "inputs": {
997
- #| "COLOR": [1, [10, "#ff0000"]]
998
- #| },
999
- #| "fields": {},
1000
- #| "topLevel": false
1001
- #| },
1002
- #| "rep_color_touch": {
1003
- #| "opcode": "sensing_coloristouchingcolor",
1004
- #| "next": null,
1005
- #| "parent": "set_color_touch",
1006
- #| "inputs": {
1007
- #| "COLOR": [1, [10, "#ff0000"]],
1008
- #| "COLOR2": [1, [10, "#00ff00"]]
1009
- #| },
1010
- #| "fields": {},
1011
- #| "topLevel": false
1012
- #| }
1013
- #| }
1014
- #| }
1015
- #| ]
1016
- #|}
1017
-
1018
- ///|
1019
- test "sensing and sound reporters work in headless runtime" {
1020
- let vm = unwrap_result(
1021
- try? vm_new_precompiled_from_json(sensing_sound_project),
1022
- "vm init failed",
1023
- )
1024
- @moonscratch.vm_green_flag(vm)
1025
-
1026
- @moonscratch.vm_post_io_json(vm, "mouse", "{\"x\":3,\"y\":4,\"isDown\":true}")
1027
- @moonscratch.vm_post_io_json(vm, "keys_down", "[\"space\"]")
1028
- @moonscratch.vm_post_io_json(vm, "touching", "{\"Sprite1\":[\"_mouse_\"]}")
1029
- @moonscratch.vm_post_io_json(vm, "loudness", "12")
1030
- @moonscratch.vm_post_io_json(vm, "online", "true")
1031
- @moonscratch.vm_post_io_json(vm, "username", "\"alice\"")
1032
- @moonscratch.vm_post_io_json(vm, "userid", "123")
1033
- @moonscratch.vm_post_io_json(vm, "current_timestamp_ms", "946684800000")
1034
-
1035
- let mut now_ms = 0
1036
- for _ in 0..<90 {
1037
- now_ms += 16
1038
- @moonscratch.vm_set_time(vm, now_ms)
1039
- ignore(@moonscratch.vm_step_frame(vm))
1040
- }
1041
-
1042
- let snapshot = unwrap_result(
1043
- try? @json.parse(@moonscratch.vm_snapshot_json(vm)),
1044
- "snapshot parse failed",
1045
- )
1046
- let root_obj = match snapshot {
1047
- Object(obj) => obj
1048
- _ => fail("snapshot must be object")
1049
- }
1050
- let targets = match root_obj["targets"] {
1051
- Array(items) => items
1052
- _ => fail("targets must be array")
1053
- }
1054
- let stage = match targets[0] {
1055
- Object(obj) => obj
1056
- _ => fail("stage must be object")
1057
- }
1058
- let vars = match stage["variables"] {
1059
- Object(obj) => obj
1060
- _ => fail("variables must be object")
1061
- }
1062
- match vars["var_timer"] {
1063
- Number(n, ..) => assert_true(n > 0.0)
1064
- _ => fail("var_timer must be number")
1065
- }
1066
- assert_eq(vars["var_sm"], Json::string("pop"))
1067
- assert_eq(vars["var_em"], Json::string("pitch"))
1068
- assert_eq(vars["var_bm"], Json::string("0.5"))
1069
- assert_eq(vars["var_vol"], Json::number(25.0))
1070
- assert_eq(vars["var_mx"], Json::number(3.0))
1071
- assert_eq(vars["var_my"], Json::number(4.0))
1072
- assert_eq(vars["var_md"], Json::boolean(true))
1073
- assert_eq(vars["var_key"], Json::boolean(true))
1074
- assert_eq(vars["var_touch"], Json::boolean(true))
1075
- assert_eq(vars["var_dist"], Json::number(5.0))
1076
- assert_eq(vars["var_loudness"], Json::number(12.0))
1077
- assert_eq(vars["var_loud"], Json::boolean(true))
1078
- assert_eq(vars["var_online"], Json::boolean(true))
1079
- assert_eq(vars["var_username"], Json::string("alice"))
1080
- assert_eq(vars["var_userid"], Json::number(123.0))
1081
- assert_eq(vars["var_current_year"], Json::number(2000.0))
1082
- assert_eq(vars["var_days"], Json::number(0.0))
1083
- assert_eq(vars["var_of_x"], Json::number(0.0))
1084
- assert_eq(vars["var_of_volume"], Json::number(100.0))
1085
- assert_eq(vars["var_touchingcolor"], Json::boolean(false))
1086
- assert_eq(vars["var_color_touch"], Json::boolean(false))
1087
- }