Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 59 additions & 1 deletion src/lib/ruby-generator/control.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,69 @@
* @return {Blockly} Blockly defined Ruby generator.
*/
export default function (Blockly) {
Blockly.Ruby.control_wait = function (block) {
const secs = Blockly.Ruby.valueToCode(block, 'DURATION', Blockly.Ruby.ORDER_NONE) || '0';
return `sleep(${secs})\n`;
};

Blockly.Ruby.control_repeat = function (block) {
const times = Blockly.Ruby.valueToCode(block, 'TIMES', Blockly.Ruby.ORDER_NONE) || '0';
const branch = Blockly.Ruby.statementToCode(block, 'SUBSTACK') || '\n';

return `${times}.times do\n${branch}end\n`;
return `repeat(${times}) do\n${branch}end\n`;
};

Blockly.Ruby.control_forever = function (block) {
const branch = Blockly.Ruby.statementToCode(block, 'SUBSTACK') || '\n';
return `forever do\n${branch}end\n`;
};

Blockly.Ruby.control_if = function (block) {
const operator = Blockly.Ruby.valueToCode(block, 'CONDITION', Blockly.Ruby.ORDER_NONE) || 'false';
const branch = Blockly.Ruby.statementToCode(block, 'SUBSTACK') || '\n';
return `if ${operator}\n${branch}end\n`;
};

Blockly.Ruby.control_if_else = function (block) {
const operator = Blockly.Ruby.valueToCode(block, 'CONDITION', Blockly.Ruby.ORDER_NONE) || 'false';
const branch = Blockly.Ruby.statementToCode(block, 'SUBSTACK') || '\n';
const branch2 = Blockly.Ruby.statementToCode(block, 'SUBSTACK2') || '\n';
return `if ${operator}\n${branch}else\n${branch2}end\n`;
};

Blockly.Ruby.control_wait_until = function (block) {
const operator = Blockly.Ruby.valueToCode(block, 'CONDITION', Blockly.Ruby.ORDER_NONE) || 'false';
return `wait until ${operator}\n`;
};

Blockly.Ruby.control_repeat_until = function (block) {
const operator = Blockly.Ruby.valueToCode(block, 'CONDITION', Blockly.Ruby.ORDER_NONE) || 'false';
const branch = Blockly.Ruby.statementToCode(block, 'SUBSTACK') || '\n';
return `until ${operator}\n${branch}end\n`;
};

Blockly.Ruby.control_stop = function (block) {
const target = block.getFieldValue('STOP_OPTION') || null;
return `stop("${target}")\n`;
};

Blockly.Ruby.control_start_as_clone = function (block) {
Blockly.Ruby.targetEventBlock = block;
return `${Blockly.Ruby.spriteName()}.when(:start_as_a_clone) do\n`;
};

Blockly.Ruby.control_create_clone_of = function (block) {
const target = Blockly.Ruby.valueToCode(block, 'CLONE_OPTION', Blockly.Ruby.ORDER_NONE) || null;
return `create_clone("${target}")\n`;
};

Blockly.Ruby.control_create_clone_of_menu = function (block) {
const target = block.getFieldValue('CLONE_OPTION') || null;
return [target, Blockly.Ruby.ORDER_ATOMIC];
};

Blockly.Ruby.control_delete_this_clone = function () {
return 'delete_this_clone\n';
};

return Blockly;
Expand Down
50 changes: 50 additions & 0 deletions src/lib/ruby-generator/event.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,55 @@ export default function (Blockly) {
return `${Blockly.Ruby.spriteName()}.when(:flag_clicked) do\n`;
};

Blockly.Ruby.event_whenthisspriteclicked = function (block) {
Blockly.Ruby.targetEventBlock = block;
return `${Blockly.Ruby.spriteName()}.when(:click) do\n`;
};

Blockly.Ruby.event_whenkeypressed = function (block) {
Blockly.Ruby.targetEventBlock = block;
const key = block.getFieldValue('KEY_OPTION') || null;
return `${Blockly.Ruby.spriteName()}.when(:key_pressed, "${key}") do\n`;
};

Blockly.Ruby.event_whenbackdropswitchesto = function (block) {
Blockly.Ruby.targetEventBlock = block;
const backdrop = block.getFieldValue('BACKDROP') || null;
return `${Blockly.Ruby.spriteName()}.when(:backdrop_switches, "${backdrop}") do\n`;
};

Blockly.Ruby.event_whengreaterthan = function (block) {
Blockly.Ruby.targetEventBlock = block;
const lh = block.getFieldValue('WHENGREATERTHANMENU') || null;
const rh = Blockly.Ruby.valueToCode(block, 'VALUE', Blockly.Ruby.ORDER_NONE) || '0';
return `${Blockly.Ruby.spriteName()}.when(:greater_than, "${lh}", ${rh}) do\n`;
};

Blockly.Ruby.event_whenbroadcastreceived = function (block) {
Blockly.Ruby.targetEventBlock = block;
const message = block.getFieldValue('BROADCAST_OPTION') || null;
return `${Blockly.Ruby.spriteName()}.when(receive:, "${message}") do\n`;
};

Blockly.Ruby.event_broadcast = function (block) {
const message = Blockly.Ruby.valueToCode(block, 'BROADCAST_INPUT', Blockly.Ruby.ORDER_NONE) || null;
return `broadcast("${message}")\n`;
};

Blockly.Ruby.event_broadcastandwait = function (block) {
const message = Blockly.Ruby.valueToCode(block, 'BROADCAST_INPUT', Blockly.Ruby.ORDER_NONE) || null;
return `broadcast_and_wait("${message}")\n`;
};

Blockly.Ruby.event_broadcast_menu = function (block) {
const message = block.getFieldValue('BROADCAST_OPTION') || null;
return [message, Blockly.Ruby.ORDER_ATOMIC];
};

Blockly.Ruby.event_whenstageclicked = function (block) {
Blockly.Ruby.targetEventBlock = block;
return `Stage.when(:stage_clicked) do\n`;
};

return Blockly;
}
2 changes: 2 additions & 0 deletions src/lib/ruby-generator/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import MathBlocks from './math.js';
import TextBlocks from './text.js';
import MotionBlocks from './motion.js';
import LooksBlocks from './looks.js';
import SoundBlocks from './sound.js';
import EventBlocks from './event.js';
import ControlBlocks from './control.js';

Expand Down Expand Up @@ -365,6 +366,7 @@ export default function (Blockly) {

Blockly = MotionBlocks(Blockly);
Blockly = LooksBlocks(Blockly);
Blockly = SoundBlocks(Blockly);
Blockly = EventBlocks(Blockly);
Blockly = ControlBlocks(Blockly);

Expand Down
57 changes: 57 additions & 0 deletions src/lib/ruby-generator/sound.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/**
* Define Ruby with Sound Blocks
* @param {Blockly} Blockly The ScratchBlocks
* @return {Blockly} Blockly defined Ruby generator.
*/
export default function (Blockly){
Blockly.Ruby.sound_sounds_menu = function (block) {
const sound = block.getFieldValue('SOUND_MENU') || null;
return [sound, Blockly.Ruby.ORDER_ATOMIC];
};

Blockly.Ruby.sound_playuntildone = function (block) {
const sound = Blockly.Ruby.valueToCode(block, 'SOUND_MENU', Blockly.Ruby.ORDER_NONE) || null;
return `Sound.play_until_done(name: "${sound}")\n`;
};

Blockly.Ruby.sound_play = function (block) {
const sound = Blockly.Ruby.valueToCode(block, 'SOUND_MENU', Blockly.Ruby.ORDER_NONE) || null;
return `Sound.play(name: "${sound}")\n`;
};

Blockly.Ruby.sound_stopallsounds = function () {
return 'stop_all_sounds\n';
};

Blockly.Ruby.sound_changeeffectby = function (block) {
const effect = block.getFieldValue('EFFECT') || null;
const value = Blockly.Ruby.valueToCode(block, 'VALUE', Blockly.Ruby.ORDER_NONE) || '0';
return `change_effect_by(effect: "${effect}", value: ${value})\n`;
};

Blockly.Ruby.sound_seteffectto = function (block) {
const effect = block.getFieldValue('EFFECT') || null;
const value = Blockly.Ruby.valueToCode(block, 'VALUE', Blockly.Ruby.ORDER_NONE) || '0';
return `set_effect(effect: "${effect}",value: ${value})\n`;
};

Blockly.Ruby.sound_cleareffects = function () {
return 'clear_effects\n';
};

Blockly.Ruby.sound_changevolumeby = function (block) {
const volume = Blockly.Ruby.valueToCode(block, 'VOLUME', Blockly.Ruby.ORDER_NONE) || '0';
return `Sound.volume += ${volume}\n`;
};

Blockly.Ruby.sound_setvolumeto = function (block) {
const volume = Blockly.Ruby.valueToCode(block, 'VOLUME', Blockly.Ruby.ORDER_NONE) || '0';
return `Sound.volume = ${volume}\n`;
};

Blockly.Ruby.sound_volume = function () {
return ['Sound.volume', Blockly.Ruby.ORDER_ATOMIC];
};

return Blockly;
}
4 changes: 2 additions & 2 deletions src/lib/ruby-generator/text.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
*/
export default function (Blockly) {
Blockly.Ruby.text = function (block) {
const code = Blockly.Ruby.quote_(block.getFieldValue('TEXT'));
return [code, Blockly.Ruby.ORDER_ATOMIC];
const text = Blockly.Ruby.quote_(block.getFieldValue('TEXT'));
return [text, Blockly.Ruby.ORDER_ATOMIC];
};

return Blockly;
Expand Down