From 140094a7ad74b9ab08ae53218673ce8273d5914a Mon Sep 17 00:00:00 2001 From: Paul Kaplan Date: Tue, 20 Mar 2018 09:50:57 -0400 Subject: [PATCH] Make "when clicked" blocks target dependent. This involves adding a new opcode, event_whenstageclicked, and adding a method to the blocks container to update the opcode pair depending on whether the target is the stage. This method is then called in two places: first after the sb2 import parses the blocks (not done in the sb2 parsing itself because no other blocks are target specific) and then again when blocks are shared between targets. Also added tests for the block container method, and a fixture project that tests the opcode splitting on sb2 import. --- src/blocks/scratch3_event.js | 3 +++ src/engine/blocks.js | 15 +++++++++++++++ src/io/mouse.js | 7 +++++++ src/serialization/sb2.js | 3 +++ src/virtual-machine.js | 1 + test/fixtures/when-clicked.sb2 | Bin 0 -> 54811 bytes test/unit/engine_blocks.js | 30 ++++++++++++++++++++++++++++++ test/unit/serialization_sb2.js | 23 +++++++++++++++++++++++ 8 files changed, 82 insertions(+) create mode 100644 test/fixtures/when-clicked.sb2 diff --git a/src/blocks/scratch3_event.js b/src/blocks/scratch3_event.js index 5ee2fab1d..1964ccf9f 100644 --- a/src/blocks/scratch3_event.js +++ b/src/blocks/scratch3_event.js @@ -32,6 +32,9 @@ class Scratch3EventBlocks { event_whenthisspriteclicked: { restartExistingThreads: true }, + event_whenstageclicked: { + restartExistingThreads: true + }, event_whenbackdropswitchesto: { restartExistingThreads: true }, diff --git a/src/engine/blocks.js b/src/engine/blocks.js index 1e22bf73e..baad5e4c6 100644 --- a/src/engine/blocks.js +++ b/src/engine/blocks.js @@ -593,6 +593,21 @@ class Blocks { } } + /** + * Keep blocks up to date after they are shared between targets. + * @param {boolean} isStage If the new target is a stage. + */ + updateTargetSpecificBlocks (isStage) { + const blocks = this._blocks; + for (const blockId in blocks) { + if (isStage && blocks[blockId].opcode === 'event_whenthisspriteclicked') { + blocks[blockId].opcode = 'event_whenstageclicked'; + } else if (!isStage && blocks[blockId].opcode === 'event_whenstageclicked') { + blocks[blockId].opcode = 'event_whenthisspriteclicked'; + } + } + } + /** * Update blocks after a sound, costume, or backdrop gets renamed. * Any block referring to the old name of the asset should get updated diff --git a/src/io/mouse.js b/src/io/mouse.js index eef3c4c86..2c4aa8aee 100644 --- a/src/io/mouse.js +++ b/src/io/mouse.js @@ -31,8 +31,15 @@ class Mouse { // only activate click hat if the mouse up event wasn't // the result of a drag ending if (!wasDragged) { + // Activate both "this sprite clicked" and "stage clicked" + // They were separated into two opcodes for labeling, + // but should act the same way. + // Intentionally not checking isStage to make it work when sharing blocks. + // @todo the blocks should be converted from one to another when shared this.runtime.startHats('event_whenthisspriteclicked', null, target); + this.runtime.startHats('event_whenstageclicked', + null, target); } return; } diff --git a/src/serialization/sb2.js b/src/serialization/sb2.js index bf9b74933..27c1412d4 100644 --- a/src/serialization/sb2.js +++ b/src/serialization/sb2.js @@ -275,6 +275,9 @@ const parseScratchObject = function (object, runtime, extensions, topLevel) { parseScripts(object.scripts, blocks, addBroadcastMsg, getVariableId, extensions); } + // Update stage specific blocks (e.g. sprite clicked <=> stage clicked) + blocks.updateTargetSpecificBlocks(topLevel); // topLevel = isStage + if (object.hasOwnProperty('lists')) { for (let k = 0; k < object.lists.length; k++) { const list = object.lists[k]; diff --git a/src/virtual-machine.js b/src/virtual-machine.js index da9849616..e90a548ca 100644 --- a/src/virtual-machine.js +++ b/src/virtual-machine.js @@ -778,6 +778,7 @@ class VirtualMachine extends EventEmitter { for (let i = 0; i < blocks.length; i++) { target.blocks.createBlock(blocks[i]); } + target.blocks.updateTargetSpecificBlocks(target.isStage); } /** diff --git a/test/fixtures/when-clicked.sb2 b/test/fixtures/when-clicked.sb2 new file mode 100644 index 0000000000000000000000000000000000000000..e5d789d8d00e2831ea8c4fc6d79ee0ba24eaf8a0 GIT binary patch literal 54811 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 hXkhDP}&9Me9% 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 { t.equals(b.getBlock('id1').fields.BACKDROP.value, 'foo'); t.end(); }); + +test('updateTargetSpecificBlocks changes sprite clicked hat to stage clicked for stage', t => { + const b = new Blocks(); + b.createBlock({ + id: 'originallySpriteClicked', + opcode: 'event_whenthisspriteclicked' + }); + b.createBlock({ + id: 'originallyStageClicked', + opcode: 'event_whenstageclicked' + }); + + // originallySpriteClicked does not update when on a non-stage target + b.updateTargetSpecificBlocks(false /* isStage */); + t.equals(b.getBlock('originallySpriteClicked').opcode, 'event_whenthisspriteclicked'); + + // originallySpriteClicked does update when on a stage target + b.updateTargetSpecificBlocks(true /* isStage */); + t.equals(b.getBlock('originallySpriteClicked').opcode, 'event_whenstageclicked'); + + // originallyStageClicked does not update when on a stage target + b.updateTargetSpecificBlocks(true /* isStage */); + t.equals(b.getBlock('originallyStageClicked').opcode, 'event_whenstageclicked'); + + // originallyStageClicked does update when on a non-stage target + b.updateTargetSpecificBlocks(false/* isStage */); + t.equals(b.getBlock('originallyStageClicked').opcode, 'event_whenthisspriteclicked'); + + t.end(); +}); diff --git a/test/unit/serialization_sb2.js b/test/unit/serialization_sb2.js index d5aaa0248..933baa3e0 100644 --- a/test/unit/serialization_sb2.js +++ b/test/unit/serialization_sb2.js @@ -68,3 +68,26 @@ test('data scoping', t => { t.end(); }); }); + +test('whenclicked blocks imported separately', t => { + // This sb2 fixture has a single "whenClicked" block on both sprite and stage + const uri = path.resolve(__dirname, '../fixtures/when-clicked.sb2'); + const file = extract(uri); + const json = JSON.parse(file); + + // Create runtime instance & load SB2 into it + const rt = new Runtime(); + sb2.deserialize(json, rt).then(({targets}) => { + const stage = targets[0]; + t.equal(stage.isStage, true); // Make sure we have the correct target + const stageOpcode = stage.blocks.getBlock(stage.blocks.getScripts()[0]).opcode; + t.equal(stageOpcode, 'event_whenstageclicked'); + + const sprite = targets[1]; + t.equal(sprite.isStage, false); // Make sure we have the correct target + const spriteOpcode = sprite.blocks.getBlock(sprite.blocks.getScripts()[0]).opcode; + t.equal(spriteOpcode, 'event_whenthisspriteclicked'); + + t.end(); + }); +});