Skip to content
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;
}
9 changes: 7 additions & 2 deletions src/lib/ruby-generator/procedure.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export default function (Generator) {
if (methodName.length === 0) {
methodName = 'procedure';
}
let args = [];
const args = [];
const paramNamesIdsAndDefaults =
Generator.currentTarget.blocks.getProcedureParamNamesIdsAndDefaults(block.mutation.proccode);
if (isCall) {
Expand All @@ -33,7 +33,12 @@ export default function (Generator) {
args.push(Generator.nosToCode(value));
}
} else {
args = paramNamesIdsAndDefaults[0];
for (let i = 0; i < paramNamesIdsAndDefaults[0].length; i++) {
// Escape identity and Change first letter to lower case.
let paramName = Generator.escapeVariableName(paramNamesIdsAndDefaults[0][i]);
paramName = paramName.replace(/^[A-Z]/, firstLetter => firstLetter.toLowerCase());
args.push(paramName);
}
}
const argsString = args.length > 0 ? `(${args.join(', ')})` : '';
return `${isCall ? '' : 'def self.'}${methodName}${argsString}\n`;
Expand Down
77 changes: 76 additions & 1 deletion src/lib/ruby-to-blocks-converter/gdx_for.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ const GdxForConverter = {
if ((this._isSelf(receiver) || receiver === Opal.nil) && !rubyBlock) {
switch (name) {
case 'gdx_for_acceleration':
if (args.length === 1) {
if (args.length === 1 && this._isStringOrBlock(args[0])) {
block = this._createBlock('gdxfor_getAcceleration', 'value');
this._addInput(
block,
Expand All @@ -20,6 +20,81 @@ const GdxForConverter = {
);
}
break;
case 'gdx_for_force':
if (args.length === 0){
block = this._createBlock('gdxfor_getForce', 'value');
}
break;
case 'gdx_for_tilted?':
if (args.length === 1 && this._isStringOrBlock(args[0])) {
block = this._createBlock('gdxfor_isTilted', 'value');
this._addInput(
block,
'TILT',
this._createFieldBlock('gdxfor_menu_tiltAnyOptions', 'tiltAnyOptions', args[0])
);
}
break;
case 'gdx_for_tilt_angle':
if (args.length === 1 && this._isStringOrBlock(args[0])) {
block = this._createBlock('gdxfor_getTilt', 'value');
this._addInput(
block,
'TILT',
this._createFieldBlock('gdxfor_menu_tiltOptions', 'tiltOptions', args[0])
);
}
break;
case 'gdx_for_falling?':
if (args.length === 0) {
block = this._createBlock('gdxfor_isFreeFalling', 'value');
}
break;
case 'gdx_for_spin_speed':
if (args.length === 1 && this._isStringOrBlock(args[0])){
block = this._createBlock('gdxfor_getSpinSpeed', 'value');
this._addInput(
block,
'DIRECTION',
this._createFieldBlock('gdxfor_menu_axisOptions', 'axisOptions', args[0])
);
}
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 'gdx_for_gesture':
block = this._createBlock('gdxfor_whenGesture', 'hat');
this._addInput(
block,
'GESTURE',
this._createFieldBlock('gdxfor_menu_gestureOptions', 'gestureOptions', args[1])
);
this._setParent(rubyBlock, block);
break;
case 'gdx_force_sensor':
block = this._createBlock('gdxfor_whenForcePushedOrPulled', 'hat');
this._addInput(
block,
'PUSH_PULL',
this._createFieldBlock('gdxfor_menu_pushPullOptions', 'pushPullOptions', args[1])
);
this._setParent(rubyBlock, block);
break;
case 'gdx_for_tilted':
block = this._createBlock('gdxfor_whenTilted', 'hat');
this._addInput(
block,
'TILT',
this._createFieldBlock('gdxfor_menu_tiltAnyOptions', 'tiltAnyOptions', args[1])
);
this._setParent(rubyBlock, block);
break;
}
}
return block;
Expand Down
65 changes: 60 additions & 5 deletions src/lib/ruby-to-blocks-converter/wedo2.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ const Wedo2Converter = {
if ((this._isSelf(receiver) || receiver === Opal.nil) && !rubyBlock) {
switch (name) {
case 'wedo2_turn_motor_on_for':
if (args.length === 2 && this._isString(args[0]) && this._isNumberOrBlock(args[1])) {
if (args.length === 2 && this._isStringOrBlock(args[0]) && this._isNumberOrBlock(args[1])) {
block = this._createBlock('wedo2_motorOnFor', 'statement');
this._addInput(
block,
Expand All @@ -22,7 +22,7 @@ const Wedo2Converter = {
}
break;
case 'wedo2_trun_motor_on':
if (args.length === 1 && this._isString(args[0])) {
if (args.length === 1 && this._isStringOrBlock(args[0])) {
block = this._createBlock('wedo2_motorOn', 'statement');
this._addInput(
block,
Expand All @@ -32,7 +32,7 @@ const Wedo2Converter = {
}
break;
case 'wedo2_trun_motor_off':
if (args.length === 1 && this._isString(args[0])) {
if (args.length === 1 && this._isStringOrBlock(args[0])) {
block = this._createBlock('wedo2_motorOff', 'statement');
this._addInput(
block,
Expand All @@ -42,7 +42,7 @@ const Wedo2Converter = {
}
break;
case 'wedo2_set_motor_power':
if (args.length === 2 && this._isString(args[0]) && this._isNumberOrBlock(args[1])) {
if (args.length === 2 && this._isStringOrBlock(args[0]) && this._isNumberOrBlock(args[1])) {
block = this._createBlock('wedo2_startMotorPower', 'statement');
this._addInput(
block,
Expand All @@ -53,7 +53,7 @@ const Wedo2Converter = {
}
break;
case 'wedo2_set_motor_direction':
if (args.length === 2 && this._isString(args[0]) && this._isString(args[1])){
if (args.length === 2 && this._isStringOrBlock(args[0]) && this._isStringOrBlock(args[1])){
block = this._createBlock('wedo2_setMotorDirection', 'statement');
this._addInput(
block,
Expand All @@ -73,6 +73,61 @@ const Wedo2Converter = {
this._addNumberInput(block, 'HUE', 'math_number', args[0], 50);
}
break;
case 'wedo2_distance':
if (args.length === 0) {
block = this._createBlock('wedo2_getDistance', 'value');
}
break;
case 'wedo2_tilted':
if (args.length === 1 && this._isStringOrBlock(args[0])) {
block = this._createBlock('wedo2_isTilted', 'value');
this._addInput(
block,
'TILT_DIRECTION_ANY',
this._createFieldBlock('wedo2_menu_TILT_DIRECTION_ANY', 'TILT_DIRECTION_ANY', args[0])
);
}
break;
case 'wedo2_tilt_angle':
if (args.length === 1 && this._isStringOrBlock(args[0])) {
block = this._createBlock('wedo2_getTiltAngle', 'value');
this._addInput(
block,
'TILT_DIRECTION',
this._createFieldBlock('wedo2_menu_TILT_DIRECTION', 'TILT_DIRECTION', args[0])
);
}
break;
}
} else if ((this._isSelf(receiver) || receiver === Opal.nil) &&
name === 'when' &&
args.length >= 1 && args[0].type === 'sym' &&
rubyBlockArgs && rubyBlockArgs.length === 0 &&
rubyBlock) {
switch (name) {
case 'wedo2_when_tilted':
if (args.length === 1 && this._isStringOrBlock(args[0])) {
block = this._createBlock('wedo2_whenTilted', 'hat');
this._addInput(
block,
'TILT_DIRECTION_ANY',
this._createFieldBlock('wedo2_menu_TILT_DIRECTION_ANY', 'TILT_DIRECTION_ANY', args[0])
);
this._setParent(rubyBlock, block);
}
break;
case 'wedo2_when_distance':
if (args.length === 2 && this._isStringOrBlock(args[0]) && this._isNumberOrBlock(args[1])) {
block = this._createBlock('wedo2_whenDistance', 'hat');
this._addInput(
block,
'OP',
this._createFieldBlock('wedo2_menu_OP', 'OP', args[0])
);
this._addNumberInput(block, 'REFERENCE', 'math_number', args[1], 50);
this._setParent(rubyBlock, block);
}
break;
}
}
return block;
Expand Down