import * as Blockly from "blockly"; import * as BlocklyJS from "blockly/javascript"; // Function to get available sounds - you'll need to implement this in your main editor // This should return an array of sound names from your project function getAvailableSounds() { // This needs to be connected to your sound list // For now, returning a default option if (window.projectSounds && window.projectSounds.length > 0) { return window.projectSounds.map(sound => [sound, sound]); } return [["no sounds", ""]]; } Blockly.Blocks["play_sound"] = { init: function () { this.appendDummyInput() .appendField("play sound") .appendField(new Blockly.FieldDropdown( function() { return getAvailableSounds(); } ), "SOUND_NAME"); this.appendDummyInput().appendField( new Blockly.FieldDropdown([ ["until finished", "true"], ["without waiting", "false"], ]), "wait" ); this.setColour("#ff66ba"); this.setPreviousStatement(true, "default"); this.setNextStatement(true, "default"); }, }; BlocklyJS.javascriptGenerator.forBlock["play_sound"] = function (block, generator) { var name = "'" + block.getFieldValue("SOUND_NAME") + "'"; var wait = block.getFieldValue("wait"); return `await playSound(${name}, ${wait});\n`; }; Blockly.Blocks["stop_sound"] = { init: function () { this.appendDummyInput() .appendField("stop sound") .appendField(new Blockly.FieldDropdown( function() { return getAvailableSounds(); } ), "SOUND_NAME"); this.setColour("#ff66ba"); this.setPreviousStatement(true, "default"); this.setNextStatement(true, "default"); }, }; BlocklyJS.javascriptGenerator.forBlock["stop_sound"] = function (block, generator) { var name = "'" + block.getFieldValue("SOUND_NAME") + "'"; return `stopSound(${name});\n`; }; Blockly.Blocks["stop_all_sounds"] = { init: function () { this.appendDummyInput() .appendField("stop") .appendField( new Blockly.FieldDropdown([ ["all", "false"], ["my", "true"], ]), "who" ) .appendField("sounds"); this.setColour("#ff66ba"); this.setPreviousStatement(true, "default"); this.setNextStatement(true, "default"); }, }; BlocklyJS.javascriptGenerator.forBlock["stop_all_sounds"] = function (block) { var who = block.getFieldValue("who"); var code = `stopAllSounds(${who});\n`; return code; }; Blockly.Blocks["set_sound_property"] = { init: function () { this.appendValueInput("value") .setCheck("Number") .appendField("set") .appendField( new Blockly.FieldDropdown([ ["volume", "volume"], ["speed", "speed"], ]), "property" ) .appendField("to"); this.appendDummyInput().appendField("%"); this.setColour("#ff66ba"); this.setPreviousStatement(true, "default"); this.setNextStatement(true, "default"); }, }; BlocklyJS.javascriptGenerator.forBlock["set_sound_property"] = function ( block, generator ) { var value = generator.valueToCode( block, "value", BlocklyJS.Order.ATOMIC ); var property = block.getFieldValue("property"); return `setSoundProperty("${property}", ${value});\n`; }; Blockly.Blocks["get_sound_property"] = { init: function () { this.appendDummyInput().appendField( new Blockly.FieldDropdown([ ["volume", "volume"], ["speed", "speed"], ]), "property" ); this.setColour("#ff66ba"); this.setOutput(true, "Number"); }, }; BlocklyJS.javascriptGenerator.forBlock["get_sound_property"] = function (block) { var property = block.getFieldValue("property"); return [`soundProperties["${property}"]`, BlocklyJS.Order.NONE]; };