var Cast = require('../util/cast'); var Scratch3EventBlocks = function (runtime) { /** * The runtime instantiating this block package. * @type {Runtime} */ this.runtime = runtime; }; /** * Retrieve the block primitives implemented by this package. * @return {Object.} Mapping of opcode to Function. */ Scratch3EventBlocks.prototype.getPrimitives = function () { return { 'event_broadcast': this.broadcast, 'event_broadcastandwait': this.broadcastAndWait, 'event_whengreaterthan': this.hatGreaterThanPredicate }; }; Scratch3EventBlocks.prototype.getHats = function () { return { 'event_whenflagclicked': { restartExistingThreads: true }, 'event_whenkeypressed': { restartExistingThreads: false }, 'event_whenthisspriteclicked': { restartExistingThreads: true }, 'event_whenbackdropswitchesto': { restartExistingThreads: true }, 'event_whengreaterthan': { restartExistingThreads: false, edgeActivated: true }, 'event_whenbroadcastreceived': { restartExistingThreads: true } }; }; Scratch3EventBlocks.prototype.hatGreaterThanPredicate = function (args, util) { var option = Cast.toString(args.WHENGREATERTHANMENU).toLowerCase(); var value = Cast.toNumber(args.VALUE); // @todo: Other cases :) if (option === 'timer') { return util.ioQuery('clock', 'projectTimer') > value; } return false; }; Scratch3EventBlocks.prototype.broadcast = function (args, util) { var broadcastOption = Cast.toString(args.BROADCAST_OPTION); util.startHats('event_whenbroadcastreceived', { 'BROADCAST_OPTION': broadcastOption }); }; Scratch3EventBlocks.prototype.broadcastAndWait = function (args, util) { var broadcastOption = Cast.toString(args.BROADCAST_OPTION); // Have we run before, starting threads? if (!util.stackFrame.startedThreads) { // No - start hats for this broadcast. util.stackFrame.startedThreads = util.startHats( 'event_whenbroadcastreceived', { 'BROADCAST_OPTION': broadcastOption } ); if (util.stackFrame.startedThreads.length === 0) { // Nothing was started. return; } } // We've run before; check if the wait is still going on. var instance = this; var waiting = util.stackFrame.startedThreads.some(function (thread) { return instance.runtime.isActiveThread(thread); }); if (waiting) { util.yield(); } }; module.exports = Scratch3EventBlocks;