Skip to content

pnsk-lab/moonscratch

Repository files navigation

nakasyou/moonscratch

Headless Scratch runtime in MoonBit.

What is implemented

  • Loads Scratch 3 project.json (+ optional assets metadata map)
  • Runs scripts from hats (event_whenflagclicked, event_whenbroadcastreceived)
  • Supports core opcodes for:
    • event, control, data, operator
    • subset of motion, looks, sound, sensing
  • Emits side effects as JSON event queue (vm_take_effects_json)

MoonBit API

///|
test {
  let vm_result = try? @moonscratch.vm_new_from_json(
    "{\"targets\":[{\"isStage\":true,\"name\":\"Stage\",\"variables\":{},\"lists\":{},\"blocks\":{}}]}",
  )
  let vm = match vm_result {
    Ok(vm) => vm
    Err(_) => fail("failed to create vm")
  }
  @moonscratch.vm_start(vm)
  let report = @moonscratch.vm_step(vm, 16)
  let snapshot_json = @moonscratch.vm_snapshot_json(vm)
  inspect(report.active_threads >= 0, content="true")
  inspect(snapshot_json.contains("targets"), content="true")
}

JavaScript setup

Build JS artifacts:

moon build --target js

Use the JS wrapper:

node js/example.mjs

Wrapper file: js/headless-vm.mjs

import { createHeadlessVM } from './js/headless-vm.mjs'

const vm = createHeadlessVM({ projectJson, assets, options })
vm.greenFlag()
vm.step(16)
const effects = vm.takeEffects()
const snapshot = vm.snapshot()

Verification

moon check
moon test

About

Headless Scratch VM written in Moonbit

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors