diff --git a/README.md b/README.md index 1c9afbb93..55cf93f9e 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ npm install ## Development Server This requires Node.js to be installed. -For convenience, we've included a development server with the VM. This is useful because the VM can take advantage of executing in a WebWorker, which is not permitted in a local file. +For convenience, we've included a development server with the VM. This is sometimes useful when running in an environment that's loading remote resources (e.g., SVGs from the Scratch server). ## Running the Development Server Open a Command Prompt or Terminal in the repository and run: @@ -61,48 +61,44 @@ var vm = new VirtualMachine(); // Block events workspace.addChangeListener(vm.blockListener); -var flyoutWorkspace = workspace.toolbox_.flyout_.workspace_; -flyoutWorkspace.addChangeListener(vm.flyoutBlockListener); // Run threads -vm.runtime.start(); +vm.start(); ``` ## Abstract Syntax Tree #### Overview -The Virtual Machine constructs and maintains the state of an [Abstract Syntax Tree](https://en.wikipedia.org/wiki/Abstract_syntax_tree) (AST) by listening to events emitted by the [scratch-blocks](https://github.com/LLK/scratch-blocks) workspace via the `blockListener`. At any time, the current state of the AST can be viewed by inspecting the `vm.runtime.blocks` object. +The Virtual Machine constructs and maintains the state of an [Abstract Syntax Tree](https://en.wikipedia.org/wiki/Abstract_syntax_tree) (AST) by listening to events emitted by the [scratch-blocks](https://github.com/LLK/scratch-blocks) workspace via the `blockListener`. Each target (code-running object, for example, a sprite) keeps an AST for its blocks. At any time, the current state of an AST can be viewed by inspecting the `vm.runtime.targets[...].blocks` object. #### Anatomy of a Block +The VM's block representation contains all the important information for execution and storage. Here's an example representing the "when key pressed" script on a workspace: ```json { - "7AJZR#NA;m*b}R]pdq63": { - "id": "7AJZR#NA;m*b}R]pdq63", - "opcode": "control_wait", + "_blocks": { + "Q]PK~yJ@BTV8Y~FfISeo": { + "id": "Q]PK~yJ@BTV8Y~FfISeo", + "opcode": "event_whenkeypressed", "inputs": { - "DURATION": { - "name": "DURATION", - "block": ",xA8/S!Z6+kR,9dph.rO" - } }, - "fields": {}, - "next": null, - "topLevel": true - }, - ",xA8/S!Z6+kR,9dph.rO": { - "id": ",xA8/S!Z6+kR,9dph.rO", - "opcode": "math_number", - "inputs": {}, "fields": { - "NUM": { - "name": "NUM", - "value": "1" + "KEY_OPTION": { + "name": "KEY_OPTION", + "value": "space" } }, "next": null, - "topLevel": false + "topLevel": true, + "parent": null, + "shadow": false, + "x": -69.333333333333, + "y": 174 } - } + }, + "_scripts": [ + "Q]PK~yJ@BTV8Y~FfISeo" + ] +} ``` ## Testing