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,598 +0,0 @@
1
- import { Project } from 'hikkaku'
2
- import {
3
- add,
4
- changeVariableBy,
5
- gt,
6
- ifElse,
7
- mathop,
8
- repeat,
9
- repeatUntil,
10
- setVariableTo,
11
- whenFlagClicked,
12
- } from 'hikkaku/blocks'
13
- import type { Meta, ScratchProject } from 'sb3-types'
14
-
15
- import type { HeadlessVM, JsonValue } from '../vm/index.ts'
16
-
17
- const PROJECT_META: Meta = {
18
- semver: '3.0.0',
19
- vm: '0.2.0',
20
- agent: 'moonscratch-tests',
21
- }
22
-
23
- export const EXAMPLE_PROJECT: ScratchProject = {
24
- meta: PROJECT_META,
25
- targets: [
26
- {
27
- isStage: true,
28
- name: 'Stage',
29
- currentCostume: 0,
30
- variables: { var_score: ['score', 0] },
31
- lists: {},
32
- blocks: {},
33
- broadcasts: {},
34
- costumes: [],
35
- sounds: [],
36
- },
37
- {
38
- isStage: false,
39
- name: 'Sprite1',
40
- currentCostume: 0,
41
- variables: {},
42
- lists: {},
43
- broadcasts: {},
44
- costumes: [],
45
- sounds: [],
46
- blocks: {
47
- hat: {
48
- opcode: 'event_whenflagclicked',
49
- next: 'set',
50
- parent: null,
51
- inputs: {},
52
- fields: {},
53
- topLevel: true,
54
- },
55
- set: {
56
- opcode: 'data_setvariableto',
57
- next: null,
58
- parent: 'hat',
59
- inputs: { VALUE: [1, [4, 42]] },
60
- fields: { VARIABLE: ['score', 'var_score'] },
61
- topLevel: false,
62
- },
63
- },
64
- },
65
- ],
66
- }
67
-
68
- export const TEXT_TO_SPEECH_TRANSLATE_PROJECT: ScratchProject = {
69
- meta: PROJECT_META,
70
- targets: [
71
- {
72
- isStage: true,
73
- name: 'Stage',
74
- currentCostume: 0,
75
- variables: {
76
- var_viewer: ['viewer', ''],
77
- var_trans: ['translated', ''],
78
- var_done: ['done', 0],
79
- },
80
- lists: {},
81
- blocks: {},
82
- broadcasts: {},
83
- costumes: [],
84
- sounds: [],
85
- },
86
- {
87
- isStage: false,
88
- name: 'Sprite1',
89
- currentCostume: 0,
90
- variables: {},
91
- lists: {},
92
- broadcasts: {},
93
- costumes: [],
94
- sounds: [],
95
- blocks: {
96
- hat_flag: {
97
- opcode: 'event_whenflagclicked',
98
- next: 'set_viewer',
99
- parent: null,
100
- inputs: {},
101
- fields: {},
102
- topLevel: true,
103
- },
104
- set_viewer: {
105
- opcode: 'data_setvariableto',
106
- next: 'set_translate',
107
- parent: 'hat_flag',
108
- inputs: { VALUE: [2, 'viewer_reporter'] },
109
- fields: { VARIABLE: ['viewer', 'var_viewer'] },
110
- topLevel: false,
111
- },
112
- viewer_reporter: {
113
- opcode: 'translate_getViewerLanguage',
114
- next: null,
115
- parent: 'set_viewer',
116
- inputs: {},
117
- fields: {},
118
- topLevel: false,
119
- },
120
- set_translate: {
121
- opcode: 'data_setvariableto',
122
- next: 'set_voice',
123
- parent: 'set_viewer',
124
- inputs: { VALUE: [2, 'translate_reporter'] },
125
- fields: { VARIABLE: ['translated', 'var_trans'] },
126
- topLevel: false,
127
- },
128
- translate_reporter: {
129
- opcode: 'translate_getTranslate',
130
- next: null,
131
- parent: 'set_translate',
132
- inputs: {
133
- WORDS: [1, [10, 'hello']],
134
- LANGUAGE: [1, [10, 'ja']],
135
- },
136
- fields: {},
137
- topLevel: false,
138
- },
139
- set_voice: {
140
- opcode: 'text2speech_setVoice',
141
- next: 'set_language',
142
- parent: 'set_translate',
143
- inputs: { VOICE: [1, [10, 'TENOR']] },
144
- fields: {},
145
- topLevel: false,
146
- },
147
- set_language: {
148
- opcode: 'text2speech_setLanguage',
149
- next: 'speak',
150
- parent: 'set_voice',
151
- inputs: { LANGUAGE: [1, [10, 'ja']] },
152
- fields: {},
153
- topLevel: false,
154
- },
155
- speak: {
156
- opcode: 'text2speech_speakAndWait',
157
- next: 'set_done',
158
- parent: 'set_language',
159
- inputs: { WORDS: [1, [10, 'hello']] },
160
- fields: {},
161
- topLevel: false,
162
- },
163
- set_done: {
164
- opcode: 'data_setvariableto',
165
- next: null,
166
- parent: 'speak',
167
- inputs: { VALUE: [1, [4, 1]] },
168
- fields: { VARIABLE: ['done', 'var_done'] },
169
- topLevel: false,
170
- },
171
- },
172
- },
173
- ],
174
- }
175
-
176
- export const INPUT_EVENT_PROJECT: ScratchProject = {
177
- meta: PROJECT_META,
178
- targets: [
179
- {
180
- isStage: true,
181
- name: 'Stage',
182
- currentCostume: 0,
183
- variables: {
184
- var_stage_click: ['stage_click', 0],
185
- var_sprite_click: ['sprite_click', 0],
186
- var_key: ['key_pressed', 0],
187
- },
188
- lists: {},
189
- blocks: {
190
- hat_stage_click: {
191
- opcode: 'event_whenstageclicked',
192
- next: 'set_stage_click',
193
- parent: null,
194
- inputs: {},
195
- fields: {},
196
- topLevel: true,
197
- },
198
- set_stage_click: {
199
- opcode: 'data_setvariableto',
200
- next: null,
201
- parent: 'hat_stage_click',
202
- inputs: { VALUE: [1, [4, 1]] },
203
- fields: { VARIABLE: ['stage_click', 'var_stage_click'] },
204
- topLevel: false,
205
- },
206
- },
207
- broadcasts: {},
208
- costumes: [],
209
- sounds: [],
210
- },
211
- {
212
- isStage: false,
213
- name: 'Sprite1',
214
- currentCostume: 0,
215
- variables: {},
216
- lists: {},
217
- broadcasts: {},
218
- costumes: [],
219
- sounds: [],
220
- blocks: {
221
- hat_sprite_click: {
222
- opcode: 'event_whenthisspriteclicked',
223
- next: 'set_sprite_click',
224
- parent: null,
225
- inputs: {},
226
- fields: {},
227
- topLevel: true,
228
- },
229
- set_sprite_click: {
230
- opcode: 'data_setvariableto',
231
- next: null,
232
- parent: 'hat_sprite_click',
233
- inputs: { VALUE: [1, [4, 1]] },
234
- fields: { VARIABLE: ['sprite_click', 'var_sprite_click'] },
235
- topLevel: false,
236
- },
237
- hat_key: {
238
- opcode: 'event_whenkeypressed',
239
- next: 'set_key',
240
- parent: null,
241
- inputs: {},
242
- fields: {
243
- KEY_OPTION: ['space', 'space'],
244
- },
245
- topLevel: true,
246
- },
247
- set_key: {
248
- opcode: 'data_setvariableto',
249
- next: null,
250
- parent: 'hat_key',
251
- inputs: { VALUE: [1, [4, 1]] },
252
- fields: { VARIABLE: ['key_pressed', 'var_key'] },
253
- topLevel: false,
254
- },
255
- },
256
- },
257
- ],
258
- }
259
-
260
- export const CONTROL_OPERATOR_DATA_PROJECT: ScratchProject = {
261
- meta: PROJECT_META,
262
- targets: [
263
- {
264
- isStage: true,
265
- name: 'Stage',
266
- currentCostume: 0,
267
- variables: {
268
- var_result: ['result', 0],
269
- var_branch: ['branch', 0],
270
- },
271
- lists: {},
272
- blocks: {},
273
- broadcasts: {},
274
- costumes: [],
275
- sounds: [],
276
- },
277
- {
278
- isStage: false,
279
- name: 'Sprite1',
280
- currentCostume: 0,
281
- variables: {},
282
- lists: {},
283
- broadcasts: {},
284
- costumes: [],
285
- sounds: [],
286
- blocks: {
287
- hat: {
288
- opcode: 'event_whenflagclicked',
289
- next: 'set_result_0',
290
- parent: null,
291
- inputs: {},
292
- fields: {},
293
- topLevel: true,
294
- },
295
- set_result_0: {
296
- opcode: 'data_setvariableto',
297
- next: 'repeat_3',
298
- parent: 'hat',
299
- inputs: { VALUE: [1, [4, 0]] },
300
- fields: { VARIABLE: ['result', 'var_result'] },
301
- topLevel: false,
302
- },
303
- repeat_3: {
304
- opcode: 'control_repeat',
305
- next: 'if_else_branch',
306
- parent: 'set_result_0',
307
- inputs: {
308
- TIMES: [1, [4, 3]],
309
- SUBSTACK: [2, 'repeat_change_result'],
310
- },
311
- fields: {},
312
- topLevel: false,
313
- },
314
- repeat_change_result: {
315
- opcode: 'data_changevariableby',
316
- next: null,
317
- parent: 'repeat_3',
318
- inputs: { VALUE: [2, 'add_1_2'] },
319
- fields: { VARIABLE: ['result', 'var_result'] },
320
- topLevel: false,
321
- },
322
- add_1_2: {
323
- opcode: 'operator_add',
324
- next: null,
325
- parent: 'repeat_change_result',
326
- inputs: {
327
- NUM1: [1, [4, 1]],
328
- NUM2: [1, [4, 2]],
329
- },
330
- fields: {},
331
- topLevel: false,
332
- },
333
- if_else_branch: {
334
- opcode: 'control_if_else',
335
- next: 'while_lt_15',
336
- parent: 'repeat_3',
337
- inputs: {
338
- CONDITION: [2, 'gt_result_8'],
339
- SUBSTACK: [2, 'set_branch_1'],
340
- SUBSTACK2: [2, 'set_branch_2'],
341
- },
342
- fields: {},
343
- topLevel: false,
344
- },
345
- gt_result_8: {
346
- opcode: 'operator_gt',
347
- next: null,
348
- parent: 'if_else_branch',
349
- inputs: {
350
- OPERAND1: [2, 'report_result_1'],
351
- OPERAND2: [1, [4, 8]],
352
- },
353
- fields: {},
354
- topLevel: false,
355
- },
356
- report_result_1: {
357
- opcode: 'data_variable',
358
- next: null,
359
- parent: 'gt_result_8',
360
- inputs: {},
361
- fields: { VARIABLE: ['result', 'var_result'] },
362
- topLevel: false,
363
- },
364
- set_branch_1: {
365
- opcode: 'data_setvariableto',
366
- next: null,
367
- parent: 'if_else_branch',
368
- inputs: { VALUE: [1, [4, 1]] },
369
- fields: { VARIABLE: ['branch', 'var_branch'] },
370
- topLevel: false,
371
- },
372
- set_branch_2: {
373
- opcode: 'data_setvariableto',
374
- next: null,
375
- parent: 'if_else_branch',
376
- inputs: { VALUE: [1, [4, 2]] },
377
- fields: { VARIABLE: ['branch', 'var_branch'] },
378
- topLevel: false,
379
- },
380
- while_lt_15: {
381
- opcode: 'control_while',
382
- next: 'repeat_until_gt_17',
383
- parent: 'if_else_branch',
384
- inputs: {
385
- CONDITION: [2, 'lt_result_15'],
386
- SUBSTACK: [2, 'while_change_result'],
387
- },
388
- fields: {},
389
- topLevel: false,
390
- },
391
- lt_result_15: {
392
- opcode: 'operator_lt',
393
- next: null,
394
- parent: 'while_lt_15',
395
- inputs: {
396
- OPERAND1: [2, 'report_result_2'],
397
- OPERAND2: [1, [4, 15]],
398
- },
399
- fields: {},
400
- topLevel: false,
401
- },
402
- report_result_2: {
403
- opcode: 'data_variable',
404
- next: null,
405
- parent: 'lt_result_15',
406
- inputs: {},
407
- fields: { VARIABLE: ['result', 'var_result'] },
408
- topLevel: false,
409
- },
410
- while_change_result: {
411
- opcode: 'data_changevariableby',
412
- next: null,
413
- parent: 'while_lt_15',
414
- inputs: { VALUE: [1, [4, 2]] },
415
- fields: { VARIABLE: ['result', 'var_result'] },
416
- topLevel: false,
417
- },
418
- repeat_until_gt_17: {
419
- opcode: 'control_repeat_until',
420
- next: null,
421
- parent: 'while_lt_15',
422
- inputs: {
423
- CONDITION: [2, 'gt_result_17'],
424
- SUBSTACK: [2, 'until_change_result'],
425
- },
426
- fields: {},
427
- topLevel: false,
428
- },
429
- gt_result_17: {
430
- opcode: 'operator_gt',
431
- next: null,
432
- parent: 'repeat_until_gt_17',
433
- inputs: {
434
- OPERAND1: [2, 'report_result_3'],
435
- OPERAND2: [1, [4, 17]],
436
- },
437
- fields: {},
438
- topLevel: false,
439
- },
440
- report_result_3: {
441
- opcode: 'data_variable',
442
- next: null,
443
- parent: 'gt_result_17',
444
- inputs: {},
445
- fields: { VARIABLE: ['result', 'var_result'] },
446
- topLevel: false,
447
- },
448
- until_change_result: {
449
- opcode: 'data_changevariableby',
450
- next: null,
451
- parent: 'repeat_until_gt_17',
452
- inputs: { VALUE: [1, [4, 1]] },
453
- fields: { VARIABLE: ['result', 'var_result'] },
454
- topLevel: false,
455
- },
456
- },
457
- },
458
- ],
459
- }
460
-
461
- const WASM_ONLY_HIKKAKU_PROJECT_BUILDER = new Project()
462
- const wasmOnlyResult = WASM_ONLY_HIKKAKU_PROJECT_BUILDER.stage.createVariable(
463
- 'result',
464
- 0,
465
- )
466
- const wasmOnlyBranch = WASM_ONLY_HIKKAKU_PROJECT_BUILDER.stage.createVariable(
467
- 'branch',
468
- 0,
469
- )
470
- WASM_ONLY_HIKKAKU_PROJECT_BUILDER.stage.run(() => {
471
- whenFlagClicked(() => {
472
- setVariableTo(wasmOnlyResult, 0)
473
- repeat(6, () => {
474
- changeVariableBy(wasmOnlyResult, add(1, 2))
475
- })
476
- ifElse(
477
- gt(wasmOnlyResult.get(), 17),
478
- () => {
479
- setVariableTo(wasmOnlyBranch, 1)
480
- },
481
- () => {
482
- setVariableTo(wasmOnlyBranch, 2)
483
- },
484
- )
485
- })
486
- })
487
-
488
- export const WASM_ONLY_HIKKAKU_PROJECT =
489
- WASM_ONLY_HIKKAKU_PROJECT_BUILDER.toScratch() as ScratchProject
490
-
491
- export const WASM_ONLY_HIKKAKU_RESULT_ID = wasmOnlyResult.id
492
- export const WASM_ONLY_HIKKAKU_BRANCH_ID = wasmOnlyBranch.id
493
-
494
- const WASM_MATHOP_LOOP_PROJECT_BUILDER = new Project()
495
- const wasmMathopCandidate =
496
- WASM_MATHOP_LOOP_PROJECT_BUILDER.stage.createVariable('candidate', 10)
497
- const wasmMathopDivisor = WASM_MATHOP_LOOP_PROJECT_BUILDER.stage.createVariable(
498
- 'divisor',
499
- 1,
500
- )
501
- const wasmMathopCount = WASM_MATHOP_LOOP_PROJECT_BUILDER.stage.createVariable(
502
- 'count',
503
- 0,
504
- )
505
-
506
- WASM_MATHOP_LOOP_PROJECT_BUILDER.stage.run(() => {
507
- whenFlagClicked(() => {
508
- setVariableTo(wasmMathopCandidate, 10)
509
- setVariableTo(wasmMathopDivisor, 1)
510
- setVariableTo(wasmMathopCount, 0)
511
- repeatUntil(
512
- gt(wasmMathopDivisor.get(), mathop('sqrt', wasmMathopCandidate.get())),
513
- () => {
514
- changeVariableBy(wasmMathopCount, 1)
515
- changeVariableBy(wasmMathopDivisor, 1)
516
- },
517
- )
518
- })
519
- })
520
-
521
- export const WASM_MATHOP_LOOP_PROJECT =
522
- WASM_MATHOP_LOOP_PROJECT_BUILDER.toScratch() as ScratchProject
523
-
524
- export const WASM_MATHOP_LOOP_COUNT_ID = wasmMathopCount.id
525
-
526
- export const HOST_OPCODE_FALLBACK_PROJECT: ScratchProject = {
527
- meta: PROJECT_META,
528
- targets: [
529
- {
530
- isStage: true,
531
- name: 'Stage',
532
- currentCostume: 0,
533
- variables: {
534
- var_done: ['done', 0],
535
- },
536
- lists: {},
537
- blocks: {},
538
- broadcasts: {},
539
- costumes: [],
540
- sounds: [],
541
- },
542
- {
543
- isStage: false,
544
- name: 'Sprite1',
545
- currentCostume: 0,
546
- variables: {},
547
- lists: {},
548
- broadcasts: {},
549
- costumes: [],
550
- sounds: [],
551
- blocks: {
552
- hat: {
553
- opcode: 'event_whenflagclicked',
554
- next: 'set_language',
555
- parent: null,
556
- inputs: {},
557
- fields: {},
558
- topLevel: true,
559
- },
560
- set_language: {
561
- opcode: 'text2speech_setLanguage',
562
- next: 'set_done',
563
- parent: 'hat',
564
- inputs: { LANGUAGE: [1, [10, 'ja']] },
565
- fields: {},
566
- topLevel: false,
567
- },
568
- set_done: {
569
- opcode: 'data_setvariableto',
570
- next: null,
571
- parent: 'set_language',
572
- inputs: { VALUE: [1, [4, 1]] },
573
- fields: { VARIABLE: ['done', 'var_done'] },
574
- topLevel: false,
575
- },
576
- },
577
- },
578
- ],
579
- }
580
-
581
- export const getStageVariables = (
582
- vm: HeadlessVM,
583
- ): Record<string, JsonValue> => {
584
- const stage = vm.snapshot().targets.find((target) => target.isStage)
585
- if (!stage) {
586
- throw new Error('stage target was not found in snapshot')
587
- }
588
- return stage.variables
589
- }
590
-
591
- export const stepMany = (vm: HeadlessVM, count: number): void => {
592
- let nowMs = vm.snapshot().nowMs
593
- for (let index = 0; index < count; index += 1) {
594
- nowMs += 33
595
- vm.setTime(nowMs)
596
- vm.stepFrame()
597
- }
598
- }