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
68 changes: 68 additions & 0 deletions src/lib/ruby-generator/boost.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,5 +38,73 @@ export default function (Generator) {
return `boost_motor_set_power_for(${motorid}, ${power})\n`;
};

Generator.boost_menu_MOTOR_DIRECTION = function (block) {
const index = Generator.getFieldValue(block, 'MOTOR_DIRECTION') || 0;
const motordirection = Generator.quote_(index);
return [motordirection, Generator.ORDER_ATOMIC];
};

Generator.boost_setMotorDirection = function (block) {
const motorid = Generator.valueToCode(block, 'MOTOR_ID', Generator.ORDER_NONE) || null;
const motordirection = Generator.valueToCode(block, 'MOTOR_DIRECTION') || null;
return `boost_motor_set_direction_for(${motorid}, ${motordirection})\n`;
};

Generator.boost_menu_MOTOR_REPORTER_ID = function (block) {
const index = Generator.getFieldValue(block, 'MOTOR_REPORTER_ID') || 0;
const motorreporterid = Generator.quote_(index);
return [motorreporterid, Generator.ORDER_ATOMIC];
};

Generator.boost_getMotorPosition = function (block) {
const motorreporterid = Generator.valueToCode(block, 'MOTOR_REPORTER_ID', Generator.ORDER_NONE) || null;
return `boost_motor_get_position(${motorreporterid})\n`;
};

Generator.boost_menu_COLOR = function (block) {
const index = Generator.getFieldValue(block, 'COLOR') || 0;
const color = Generator.quote_(index);
return [color, Generator.ORDER_ATOMIC];
};

Generator.boost_whenColor = function (block) {
block.isStatement = true;
const color = Generator.valueToCode(block, 'COLOR', Generator.ORDER_NONE) || null;
return `${Generator.spriteName()}.when(:boost_color, ${color}) do\n`;
};

Generator.boost_seeingColor = function (block) {
const color = Generator.valueToCode(block, 'COLOR', Generator.ORDER_NONE) || null;
return `boost_seeing_color?(${color})\n`;
};

Generator.boost_menu_TILT_DIRECTION_ANY = function (block) {
const index = Generator.getFieldValue(block, 'TILT_DIRECTION_ANY') || 0;
const tiltdirectionany = Generator.quote_(index);
return [tiltdirectionany, Generator.ORDER_ATOMIC];
};

Generator.boost_whenTilted = function (block) {
block.isStatement = true;
const tiltdirectionany = Generator.valueToCode(block, 'TILT_DIRECTION_ANY', Generator.ORDER_NONE) || null;
return `${Generator.spriteName()}.when(:boost_tilted, ${tiltdirectionany}) do\n`;
};

Generator.boost_menu_TILT_DIRECTION = function (block) {
const index = Generator.getFieldValue(block, 'TILT_DIRECTION') || 0;
const tiltdirection = Generator.quote_(index);
return [tiltdirection, Generator.ORDER_ATOMIC];
};

Generator.boost_getTiltAngle = function (block) {
const tiltdirection = Generator.valueToCode(block, 'TILT_DIRECTION', Generator.ORDER_NONE) || null;
return `boost_get_tilt_angle(${tiltdirection})\n`;
};

Generator.boost_setLightHue = function (block) {
const hue = Generator.valueToCode(block, 'HUE', Generator.ORDER_NONE) || null;
return `boost_set_light_color(${hue})\n`;
};

return Generator;
}
146 changes: 146 additions & 0 deletions src/lib/ruby-to-blocks-converter/boost.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
/* global Opal */
import _ from 'lodash';

/**
* Boost converter
*/
const BoostConverter = {
// eslint-disable-next-line no-unused-vars
onSend: function (receiver, name, args, rubyBlockArgs, rubyBlock) {
let block;
if ((this._isSelf(receiver) || receiver === Opal.nil) && !rubyBlock) {
switch (name) {
case 'boost_motor_turn_on_for':
if (args.length === 2 && this._isStringOrBlock(args[0]) && this._isNumberOrBlock(args[1])) {
block = this._createBlock('boost_motorOnFor', 'statement');
this._addInput(
block,
'MOTOR_ID',
this._createFieldBlock('boost_menu_MOTOR_ID', 'MOTOR_ID', args[0])
);
this._addNumberInput(block, 'DURATION', 'math_number', args[1], 1);
} else if (args.length === 1 && this._isStringOrBlock(args[0])) {
block = this._createBlock('boost_motorOn', 'statement');
this._addInput(
block,
'MOTOR_ID',
this._createFieldBlock('boost_menu_MOTOR_ID', 'MOTOR_ID', args[0])
);
}
break;
case 'boost_motor_turn_this_way_for':
if (args.length === 2 && this._isStringOrBlock(args[0]) && this._isNumberOrBlock(args[1])) {
block = this._createBlock('boost_motorOnForRotation', 'statement');
this._addInput(
block,
'MOTOR_ID',
this._createFieldBlock('boost_menu_MOTOR_ID', 'MOTOR_ID', args[0])
);
this._addNumberInput(block, 'ROTATION', 'math_number', args[1], 1);
}
break;
case 'boost_motor_turn_off_for':
if (args.length === 1 && this._isStringOrBlock(args[0])) {
block = this._createBlock('boost_motorOff', 'statement');
this._addInput(
block,
'MOTOR_ID',
this._createFieldBlock('boost_menu_MOTOR_ID', 'MOTOR_ID', args[0])
);
}
break;
case 'boost_motor_set_power_for':
if (args.length === 2 && this._isStringOrBlock(args[0]) && this._isNumberOrBlock(args[1])) {
block = this._createBlock('boost_setMotorPower', 'statement');
this._addInput(
block,
'MOTOR_ID',
this._createFieldBlock('boost_menu_MOTOR_ID', 'MOTOR_ID', args[0])
);
this._addNumberInput(block, 'POWER', 'math_number', args[1], 100);
}
break;
case 'boost_motor_set_direction_for':
if (args.length === 2 && this._isStringOrBlock(args[0]) && this._isStringOrBlock(args[1])) {
block = this._createBlock('boost_setMotorDirection', 'statement');
this._addInput(
block,
'MOTOR_ID',
this._createFieldBlock('boost_menu_MOTOR_ID', 'MOTOR_ID', args[0])
);
this._addInput(
block,
'MOTOR_DIRECTION',
this._createFieldBlock('boost_menu_MOTOR_DIRECTION', 'MOTOR_DIRECTION', args[1])
);
}
break;
case 'boost_motor_get_position':
if (args.length === 1 && this._isStringOrBlock(args[0])) {
block = this._createBlock('boost_getMotorPosition', 'value');
this._addInput(
block,
'MOTOR_REPORTER_ID',
this._createFieldBlock('boost_menu_MOTOR_REPORTER_ID', 'MOTOR_REPORTER_ID', args[0])
);
}
break;
case 'boost_seeing_color?':
if (args.length === 1 && this._isStringOrBlock(args[0])) {
block = this._createBlock('boost_seeingColor', 'boolean');
this._addInput(
block,
'COLOR',
this._createFieldBlock('boost_menu_COLOR', 'COLOR', args[0])
);
}
break;
case 'boost_get_tilt_angle':
if (args.length === 1 && this._isStringOrBlock(args[0])) {
block = this._createBlock('boost_getTiltAngle', 'value');
this._addInput(
block,
'TILT_DIRECTION',
this._createFieldBlock('boost_menu_TILT_DIRECTION', 'TILT_DIRECTION', args[0])
);
}
break;
case 'boost_set_light_color':
if (args.length === 1 && this._isNumberOrBlock(args[0])) {
block = this._createBlock('boost_setLightHue', 'statement');
this._addNumberInput(block, 'HUE', 'math_number', args[0], 100);
}
break;
}
} else if ((this._isSelf(receiver) || receiver === Opal.nil) &&
name === 'when' &&
args.length === 2 && args[0].type === 'sym' &&
this._isStringOrBlock(args[1]) &&
rubyBlockArgs && rubyBlockArgs.length === 0 &&
rubyBlock) {
switch (args[0].value) {
case 'boost_color':
block = this._createBlock('boost_whenColor', 'hat');
this._addInput(
block,
'COLOR',
this._createFieldBlock('boost_menu_COLOR', 'COLOR', args[1])
);
this._setParent(rubyBlock, block);
break;
case 'boost_tilted':
block = this._createBlock('boost_whenTilted', 'hat');
this._addInput(
block,
'TILT_DIRECTION_ANY',
this._createFieldBlock('boost_menu_TILT_DIRECTION_ANY', 'TILT_DIRECTION_ANY', args[1])
);
this._setParent(rubyBlock, block);
break;
}
}
return block;
}
};

export default BoostConverter;
2 changes: 2 additions & 0 deletions src/lib/ruby-to-blocks-converter/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import Wedo2Converter from './wedo2';
import GdxForConverter from './gdx_for';
import MeshConverter from './mesh';
import SmalrubotS1Converter from './smalrubot_s1';
import BoostConverter from './boost';

const messages = defineMessages({
couldNotConvertPremitive: {
Expand Down Expand Up @@ -85,6 +86,7 @@ class RubyToBlocksConverter {
GdxForConverter,
MeshConverter,
SmalrubotS1Converter,
BoostConverter,

MotionConverter,
LooksConverter,
Expand Down