Files
NeoIDE/src/blocks/sound.js
2026-01-19 23:44:32 -06:00

138 lines
3.7 KiB
JavaScript

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];
};