From acab98dfa6622bf93d04394757878d29830a72fc Mon Sep 17 00:00:00 2001 From: damp11113 Date: Wed, 17 Jul 2024 22:32:34 +0700 Subject: [PATCH] update 1.1.2 and add new block added block CCRedstone and CCRednet and CCTurtle is finished --- blocks/CCRednet/block_design.json | 177 ++++++++++++++ blocks/CCRednet/generator.js | 94 +++++++ blocks/CCRednet/index.json | 22 ++ blocks/CCRednet/toolbox.xml | 64 +++++ blocks/CCRedstone/block_design.json | 137 +++++++++++ blocks/CCRedstone/generator.js | 50 ++++ blocks/CCRedstone/index.json | 22 ++ blocks/CCRedstone/toolbox.xml | 16 ++ blocks/CCTurtle/block_design.json | 11 +- blocks/CCTurtle/generator.js | 366 +++++++++++++++++++++++++--- blocks/CCTurtle/index.json | 2 +- blocks/CCTurtle/toolbox.xml | 14 +- ccIDE Defines.xlsx | Bin 51685 -> 52475 bytes readme.md | 2 + src/module_block_design.json | 42 +++- src/module_generator.js | 19 ++ src/toolbox.xml | 17 +- src/virtualcode.js | 8 +- 18 files changed, 1011 insertions(+), 52 deletions(-) create mode 100644 blocks/CCRednet/block_design.json create mode 100644 blocks/CCRednet/generator.js create mode 100644 blocks/CCRednet/index.json create mode 100644 blocks/CCRednet/toolbox.xml create mode 100644 blocks/CCRedstone/block_design.json create mode 100644 blocks/CCRedstone/generator.js create mode 100644 blocks/CCRedstone/index.json create mode 100644 blocks/CCRedstone/toolbox.xml diff --git a/blocks/CCRednet/block_design.json b/blocks/CCRednet/block_design.json new file mode 100644 index 0000000..a9618dd --- /dev/null +++ b/blocks/CCRednet/block_design.json @@ -0,0 +1,177 @@ +{ + "rednet_open": { + "message0": "Open modem at %1 of computer", + "args0": [ + { + "type": "field_dropdown", + "name": "SIDE", + "options": [ + ["All", "all"], + ["Top", "top"], + ["Bottom", "bottom"], + ["Left", "left"], + ["Right", "right"], + ["Front", "front"], + ["Back", "back"] + ] + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": 20, + "tooltip": "Opens a modem with the given peripheral name, allowing it to send and receive messages over rednet." + }, + "rednet_close": { + "message0": "Close modem at %1 of computer", + "args0": [ + { + "type": "field_dropdown", + "name": "SIDE", + "options": [ + ["All", "all"], + ["Top", "top"], + ["Bottom", "bottom"], + ["Left", "left"], + ["Right", "right"], + ["Front", "front"], + ["Back", "back"] + ] + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": 20, + "tooltip": "Opens a modem with the given peripheral name, allowing it to send and receive messages over rednet." + }, + "rednet_isopen": { + "message0": "Is modem at %1 of computer", + "args0": [ + { + "type": "field_dropdown", + "name": "SIDE", + "options": [ + ["All", "all"], + ["Top", "top"], + ["Bottom", "bottom"], + ["Left", "left"], + ["Right", "right"], + ["Front", "front"], + ["Back", "back"] + ] + } + ], + "output": "Boolean", + "colour": 20, + "tooltip": "Determine if rednet is currently open." + }, + "rednet_send": { + "message0": "Send %1 to computer id %2 with protocol %3", + "args0": [ + { + "type": "input_value", + "name": "DATA" + }, + { + "type": "input_value", + "name": "ID", + "check": "Number" + }, + { + "type": "input_value", + "name": "PROTO", + "check": "String" + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": 20, + "tooltip": "Allows a computer or turtle with an attached modem to send a message intended for a computer with a specific ID." + }, + "rednet_broadcast": { + "message0": "Broadcast %1 with protocol %2", + "args0": [ + { + "type": "input_value", + "name": "DATA" + }, + { + "type": "input_value", + "name": "PROTO", + "check": "String" + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": 20, + "tooltip": "Broadcasts a string message over the predefined CHANNEL_BROADCAST channel." + }, + "rednet_receive": { + "message0": "Receive data with protocol %1 and timeout waiting for %2", + "args0": [ + { + "type": "input_value", + "name": "PROTO", + "check": "String" + }, + { + "type": "input_value", + "name": "TIMEOUT", + "check": "Number" + } + ], + "output": "Multiple", + "colour": 20, + "tooltip": "Wait for a rednet message to be received, or until nTimeout seconds have elapsed." + }, + "rednet_host": { + "message0": "Start Host protocol %1 with hostname %2", + "args0": [ + { + "type": "input_value", + "name": "PROTO", + "check": "String" + }, + { + "type": "input_value", + "name": "NAME", + "check": "String" + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": 20, + "tooltip": "Register the system as 'hosting' the desired protocol under the specified name." + }, + "rednet_unhost": { + "message0": "Stop Host protocol %1", + "args0": [ + { + "type": "input_value", + "name": "PROTO", + "check": "String" + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": 20, + "tooltip": "Stop hosting a specific protocol, meaning it will no longer respond to rednet.lookup requests." + }, + "rednet_lookup": { + "message0": "Find Hostname %1 with protocol %2", + "args0": [ + { + "type": "input_value", + "name": "NAME", + "check": "String" + }, + { + "type": "input_value", + "name": "PROTO", + "check": "String" + } + ], + "output": "Number", + "colour": 20, + "tooltip": "Search the local rednet network for systems hosting the desired protocol and returns any computer IDs that respond as 'registered' against it." + } +} diff --git a/blocks/CCRednet/generator.js b/blocks/CCRednet/generator.js new file mode 100644 index 0000000..6f330fd --- /dev/null +++ b/blocks/CCRednet/generator.js @@ -0,0 +1,94 @@ +const { luaGenerator } = require('blockly/lua'); + +// Check if luaGenerator.forBlock is defined and initialize if necessary +if (!luaGenerator.forBlock) { + luaGenerator.forBlock = {}; +} + +luaGenerator.forBlock['rednet_open'] = function(block, generator) { + var side = block.getFieldValue('SIDE'); + + var code = ''; + if (side == "all") { + code = `peripheral.find("modem", rednet.open)`; + } else { + code = `rednet.open("${side}")` + } + + return code + "\n"; +}; + +luaGenerator.forBlock['rednet_close'] = function(block, generator) { + var side = block.getFieldValue('SIDE'); + + var code = ''; + if (side == "all") { + code = `peripheral.find("modem", rednet.close)`; + } else { + code = `rednet.close("${side}")` + } + + return code + "\n"; +}; + +luaGenerator.forBlock['rednet_isopen'] = function(block, generator) { + var side = block.getFieldValue('SIDE'); + + var code = ''; + if (side == "all") { + code = `rednet.isOpen()`; + } else { + code = `rednet.isOpen("${side}")` + } + + return [code, luaGenerator.ORDER_NONE]; +}; + +luaGenerator.forBlock['rednet_send'] = function(block, generator) { + var data = generator.valueToCode(block, 'DATA', generator.ORDER_NONE); + var id = generator.valueToCode(block, 'ID', generator.ORDER_NONE); + var protocol = generator.valueToCode(block, 'PROTO', generator.ORDER_NONE); + + return `rednet.send(${id}, ${data}, ${protocol})\n`; +}; + +luaGenerator.forBlock['rednet_broadcast'] = function(block, generator) { + var data = generator.valueToCode(block, 'DATA', generator.ORDER_NONE); + var protocol = generator.valueToCode(block, 'PROTO', generator.ORDER_NONE); + + return `rednet.broadcast(${data}, ${protocol})\n`; +}; + +luaGenerator.forBlock['rednet_receive'] = function(block, generator) { + var protocol = generator.valueToCode(block, 'PROTO', generator.ORDER_NONE); + var timeout = generator.valueToCode(block, 'TIMEOUT', generator.ORDER_NONE); + + var code = ''; + if (timeout == 0) { + code = `rednet.receive(${protocol})` + } else { + code = `rednet.receive(${protocol}, ${timeout})` + } + + return [code, luaGenerator.ORDER_NONE]; +}; + +luaGenerator.forBlock['rednet_host'] = function(block, generator) { + var protocol = generator.valueToCode(block, 'PROTO', generator.ORDER_NONE); + var hostname = generator.valueToCode(block, 'NAME', generator.ORDER_NONE); + + return `rednet.host(${protocol}, ${hostname})\n`; +}; + +luaGenerator.forBlock['rednet_unhost'] = function(block, generator) { + var protocol = generator.valueToCode(block, 'PROTO', generator.ORDER_NONE); + + return `rednet.unhost(${protocol})\n`; +}; + +luaGenerator.forBlock['rednet_lookup'] = function(block, generator) { + var protocol = generator.valueToCode(block, 'PROTO', generator.ORDER_NONE); + var hostname = generator.valueToCode(block, 'NAME', generator.ORDER_NONE); + + return [`rednet.lookup(${protocol}, ${hostname})`, luaGenerator.ORDER_NONE]; +}; diff --git a/blocks/CCRednet/index.json b/blocks/CCRednet/index.json new file mode 100644 index 0000000..60fe0f4 --- /dev/null +++ b/blocks/CCRednet/index.json @@ -0,0 +1,22 @@ +{ + "name": "Rednet", + "author": "DPSoftware Foundation", + "description": "Library for rednet", + "version": "1.0.0", + "category": "Network", + "keyword": "Rednet", + "license": "GPL-3.0-or-later", + "peripherals": true, + "library": true, + "require_network": false, + "dependencies": {}, + "design_for_computer": { + "basic": true, + "adv": true, + "command": true, + "pocket": true, + "advpocket": true, + "turtle": true, + "advturtle": true + } +} diff --git a/blocks/CCRednet/toolbox.xml b/blocks/CCRednet/toolbox.xml new file mode 100644 index 0000000..425b946 --- /dev/null +++ b/blocks/CCRednet/toolbox.xml @@ -0,0 +1,64 @@ + diff --git a/blocks/CCRedstone/block_design.json b/blocks/CCRedstone/block_design.json new file mode 100644 index 0000000..7997665 --- /dev/null +++ b/blocks/CCRedstone/block_design.json @@ -0,0 +1,137 @@ +{ + "redstone_set_output": { + "message0": "Set redstone %1 at %2 of computer", + "args0": [ + { + "type": "field_dropdown", + "name": "STATE", + "options": [ + ["On", "OFF"], + ["Off", "ON"] + ] + }, + { + "type": "field_dropdown", + "name": "SIDE", + "options": [ + ["Top", "top"], + ["Bottom", "bottom"], + ["Left", "left"], + ["Right", "right"], + ["Front", "front"], + ["Back", "back"] + ] + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": 10, + "tooltip": "Turn the redstone signal of a specific side on or off." + }, + "redstone_get_output": { + "message0": "Get redstone output at %1 of computer", + "args0": [ + { + "type": "field_dropdown", + "name": "SIDE", + "options": [ + ["Top", "top"], + ["Bottom", "bottom"], + ["Left", "left"], + ["Right", "right"], + ["Front", "front"], + ["Back", "back"] + ] + } + ], + "output": "Boolean", + "colour": 10, + "tooltip": "Get the current redstone output of a specific side." + }, + "redstone_read_input": { + "message0": "Read redstone input at %1 of computer", + "args0": [ + { + "type": "field_dropdown", + "name": "SIDE", + "options": [ + ["Top", "top"], + ["Bottom", "bottom"], + ["Left", "left"], + ["Right", "right"], + ["Front", "front"], + ["Back", "back"] + ] + } + ], + "output": "Boolean", + "colour": 10, + "tooltip": "Get the current redstone input of a specific side." + }, + "redstone_set_analog_output": { + "message0": "Set redstone analog with power %1 at %2 of computer", + "args0": [ + { + "type": "input_value", + "name": "POWER", + "check": "Number" + }, + { + "type": "field_dropdown", + "name": "SIDE", + "options": [ + ["Top", "top"], + ["Bottom", "bottom"], + ["Left", "left"], + ["Right", "right"], + ["Front", "front"], + ["Back", "back"] + ] + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": 10, + "tooltip": "Set the redstone signal strength for a specific side." + }, + "redstone_get_analog_output": { + "message0": "Get redstone analog output at %1 of computer", + "args0": [ + { + "type": "field_dropdown", + "name": "SIDE", + "options": [ + ["Top", "top"], + ["Bottom", "bottom"], + ["Left", "left"], + ["Right", "right"], + ["Front", "front"], + ["Back", "back"] + ] + } + ], + "output": "Number", + "colour": 10, + "tooltip": "Get the redstone output signal strength for a specific side." + }, + "redstone_read_analog_input": { + "message0": "Read redstone analog output at %1 of computer", + "args0": [ + { + "type": "field_dropdown", + "name": "SIDE", + "options": [ + ["Top", "top"], + ["Bottom", "bottom"], + ["Left", "left"], + ["Right", "right"], + ["Front", "front"], + ["Back", "back"] + ] + } + ], + "output": "Number", + "colour": 10, + "tooltip": "Get the redstone input signal strength for a specific side." + } +} diff --git a/blocks/CCRedstone/generator.js b/blocks/CCRedstone/generator.js new file mode 100644 index 0000000..4fced95 --- /dev/null +++ b/blocks/CCRedstone/generator.js @@ -0,0 +1,50 @@ +const { luaGenerator } = require('blockly/lua'); + +// Check if luaGenerator.forBlock is defined and initialize if necessary +if (!luaGenerator.forBlock) { + luaGenerator.forBlock = {}; +} + +luaGenerator.forBlock['redstone_set_output'] = function(block, generator) { + var state = block.getFieldValue('STATE'); + var side = block.getFieldValue('SIDE'); + + if (state == "OFF") { + var code = `rs.setOutput("${side}", true)`; + } else { + var code = `rs.setOutput("${side}", false)`; + } + + return code + "\n"; +}; + +luaGenerator.forBlock['redstone_get_output'] = function(block, generator) { + var side = block.getFieldValue('SIDE'); + + return [`rs.getOutput("${side}")`, luaGenerator.ORDER_NONE]; +}; + +luaGenerator.forBlock['redstone_read_input'] = function(block, generator) { + var side = block.getFieldValue('SIDE'); + + return [`rs.getInput("${side}")`, luaGenerator.ORDER_NONE]; +}; + +luaGenerator.forBlock['redstone_set_analog_output'] = function(block, generator) { + var power = generator.valueToCode(block, 'POWER', generator.ORDER_NONE); + var side = block.getFieldValue('SIDE'); + + return `rs.setAnalogOutput("${side}", ${power})\n`; +}; + +luaGenerator.forBlock['redstone_get_analog_output'] = function(block, generator) { + var side = block.getFieldValue('SIDE'); + + return `rs.getAnalogOutput("${side}")\n`; +}; + +luaGenerator.forBlock['redstone_read_analog_input'] = function(block, generator) { + var side = block.getFieldValue('SIDE'); + + return `rs.getAnalogInput("${side}")\n`; +}; diff --git a/blocks/CCRedstone/index.json b/blocks/CCRedstone/index.json new file mode 100644 index 0000000..a6b0a2c --- /dev/null +++ b/blocks/CCRedstone/index.json @@ -0,0 +1,22 @@ +{ + "name": "CC: Redstone", + "author": "DPSoftware Foundation", + "description": "Library for control redstone", + "version": "1.0.0", + "category": "Power", + "keyword": "Redstone", + "license": "GPL-3.0-or-later", + "peripherals": false, + "library": true, + "require_network": false, + "dependencies": {}, + "design_for_computer": { + "basic": true, + "adv": true, + "command": true, + "pocket": false, + "advpocket": false, + "turtle": false, + "advturtle": false + } +} diff --git a/blocks/CCRedstone/toolbox.xml b/blocks/CCRedstone/toolbox.xml new file mode 100644 index 0000000..8f2b734 --- /dev/null +++ b/blocks/CCRedstone/toolbox.xml @@ -0,0 +1,16 @@ + diff --git a/blocks/CCTurtle/block_design.json b/blocks/CCTurtle/block_design.json index 00a3a49..8af3722 100644 --- a/blocks/CCTurtle/block_design.json +++ b/blocks/CCTurtle/block_design.json @@ -63,8 +63,8 @@ "type": "field_dropdown", "name": "SIDE", "options": [ - ["Left", "LEFT"], - ["Right", "RIGHT"] + ["Left", "left"], + ["Right", "right"] ] } ], @@ -90,8 +90,8 @@ "type": "field_dropdown", "name": "SIDE", "options": [ - ["Left", "LEFT"], - ["Right", "RIGHT"] + ["Left", "left"], + ["Right", "right"] ] } ], @@ -376,7 +376,8 @@ } ], "inputsInline": true, - "output": "Multiple", + "previousStatement": null, + "nextStatement": null, "colour": 215, "tooltip": "Craft a recipe based on the turtle's inventory." } diff --git a/blocks/CCTurtle/generator.js b/blocks/CCTurtle/generator.js index 6cfab87..34eefcc 100644 --- a/blocks/CCTurtle/generator.js +++ b/blocks/CCTurtle/generator.js @@ -5,54 +5,350 @@ if (!luaGenerator.forBlock) { luaGenerator.forBlock = {}; } -// Math operation block -luaGenerator.forBlock['math_operation'] = function(block, generator) { - var operator = block.getFieldValue('OPERATOR'); - var num1 = generator.valueToCode(block, 'NUM1', generator.ORDER_ATOMIC); - var num2 = generator.valueToCode(block, 'NUM2', generator.ORDER_ATOMIC); +luaGenerator.forBlock['turtle_move_operation'] = function(block, generator) { + var operator = block.getFieldValue('OPERATION'); + var FOR = generator.valueToCode(block, 'FOR', generator.ORDER_ATOMIC); - var operatorSymbol = ''; + var movecommand = ''; switch (operator) { - case 'ADD': - operatorSymbol = '+'; + case 'FORWARD': + movecommand = 'turtle.forward()'; break; - case 'SUBTRACT': - operatorSymbol = '-'; + case 'BACK': + movecommand = 'turtle.back()'; break; - case 'MULTIPLY': - operatorSymbol = '*'; + case 'UP': + movecommand = 'turtle.up()'; break; - case 'DIVIDE': - operatorSymbol = '/'; + case 'DOWN': + movecommand = 'turtle.down()'; break; default: - operatorSymbol = '+'; + movecommand = 'turtle.forward()'; + break; + } + if (FOR == 1) { + var code = movecommand; + } else { + var code = `for i=${FOR},1,-1 do ${movecommand} end`; + }; + + return code + "\n"; +}; + +luaGenerator.forBlock['turtle_turn_operation'] = function(block, generator) { + var operator = block.getFieldValue('OPERATION'); + var FOR = generator.valueToCode(block, 'ROUND', generator.ORDER_ATOMIC); + + var movecommand = ''; + switch (operator) { + case 'LEFT': + movecommand = 'turtle.turnLeft()'; + break; + case 'RIGHT': + movecommand = 'turtle.turnRight()'; + break; + default: + movecommand = 'turtle.turnLeft()'; + break; + } + if (FOR == 1) { + var code = movecommand; + } else { + var code = `for i=${FOR},1,-1 do ${movecommand} end`; + }; + + return code + "\n"; +}; + +luaGenerator.forBlock['turtle_turn_operation'] = function(block, generator) { + var operator = block.getFieldValue('OPERATION'); + var FOR = generator.valueToCode(block, 'ROUND', generator.ORDER_ATOMIC); + + var movecommand = ''; + switch (operator) { + case 'LEFT': + movecommand = 'turtle.turnLeft()'; + break; + case 'RIGHT': + movecommand = 'turtle.turnRight()'; + break; + default: + movecommand = 'turtle.turnLeft()'; + break; + } + if (FOR == 1) { + var code = movecommand; + } else { + var code = `for i=${FOR},1,-1 do ${movecommand} end`; + }; + + return code + "\n"; +}; + +luaGenerator.forBlock['turtle_dig_operation'] = function(block, generator) { + var operator = block.getFieldValue('OPERATION'); + var side = block.getFieldValue('SIDE'); + + var code = ''; + switch (operator) { + case 'FRONT': + code = `turtle.dig("${side}")`; + break; + case 'UP': + code = `turtle.digUp("${side}")`; + break; + case 'DOWN': + code = `turtle.digDown("${side}")`; + break; + default: + code = `turtle.dig("${side}")`; + break; + } + + return code + "\n"; +}; + +luaGenerator.forBlock['turtle_attack_operation'] = function(block, generator) { + var operator = block.getFieldValue('OPERATION'); + var side = block.getFieldValue('SIDE'); + + var code = ''; + switch (operator) { + case 'FRONT': + code = `turtle.attack("${side}")`; + break; + case 'UP': + code = `turtle.attackUp("${side}")`; + break; + case 'DOWN': + code = `turtle.attackDown("${side}")`; + break; + default: + code = `turtle.attack("${side}")`; + break; + } + + return code + "\n"; +}; + +luaGenerator.forBlock['turtle_place_operation'] = function(block, generator) { + var operator = block.getFieldValue('OPERATION'); + + var code = ''; + switch (operator) { + case 'FRONT': + code = `turtle.place()`; + break; + case 'UP': + code = `turtle.placeUp()`; + break; + case 'DOWN': + code = `turtle.placeDown()`; + break; + default: + code = `turtle.place()`; + break; + } + + return code + "\n"; +}; + +luaGenerator.forBlock['turtle_drop_operation'] = function(block, generator) { + var operator = block.getFieldValue('OPERATION'); + var count = generator.valueToCode(block, 'COUNT', generator.ORDER_ATOMIC); + + var code = ''; + switch (operator) { + case 'FRONT': + code = `turtle.drop(${count})`; + break; + case 'UP': + code = `turtle.dropUp(${count})`; + break; + case 'DOWN': + code = `turtle.dropDown(${count})`; + break; + default: + code = `turtle.drop(${count})`; + break; + } + + return code + "\n"; +}; + +luaGenerator.forBlock['turtle_select_item'] = function(block, generator) { + var slot = generator.valueToCode(block, 'SLOT', generator.ORDER_ATOMIC); + + return `turtle.select(${slot})\n`; +}; + +luaGenerator.forBlock['turtle_get_item_count'] = function(block, generator) { + var slot = generator.valueToCode(block, 'SLOT', generator.ORDER_ATOMIC); + + return [`turtle.getItemCount(${slot})`, luaGenerator.ORDER_NONE]; +}; + +luaGenerator.forBlock['turtle_get_slot_free'] = function(block, generator) { + var slot = generator.valueToCode(block, 'SLOT', generator.ORDER_ATOMIC); + + return [`turtle.getItemSpace(${slot})`, luaGenerator.ORDER_NONE]; +}; + +luaGenerator.forBlock['turtle_detect_block'] = function(block, generator) { + var operator = block.getFieldValue('OPERATION'); + + var code = ''; + switch (operator) { + case 'FRONT': + code = `turtle.detect()`; + break; + case 'UP': + code = `turtle.detectUp()`; + break; + case 'DOWN': + code = `turtle.detectDown()`; + break; + default: + code = `turtle.detect()`; + break; + } + + return [code, luaGenerator.ORDER_NONE]; +}; + +luaGenerator.forBlock['turtle_compare_item'] = function(block, generator) { + var operator = block.getFieldValue('OPERATION'); + + var code = ''; + switch (operator) { + case 'FRONT': + code = `turtle.compare()`; + break; + case 'UP': + code = `turtle.compareUp()`; + break; + case 'DOWN': + code = `turtle.compareDown()`; + break; + default: + code = `turtle.compare()`; + break; + } + + return [code, luaGenerator.ORDER_NONE]; +}; + +luaGenerator.forBlock['turtle_collect_item'] = function(block, generator) { + var count = generator.valueToCode(block, 'COUNT', generator.ORDER_ATOMIC); + var operator = block.getFieldValue('OPERATION'); + + var code = ''; + switch (operator) { + case 'FRONT': + code = `turtle.suck(${count})`; + break; + case 'UP': + code = `turtle.suckUp(${count})`; + break; + case 'DOWN': + code = `turtle.suckDown(${count})`; + break; + default: + code = `turtle.suck(${count})`; + break; + } + + return code + "\n"; +}; + +luaGenerator.forBlock['turtle_get_fuel_level'] = function(block) { + return ["turtle.getFuelLevel()", luaGenerator.ORDER_NONE]; +}; + +luaGenerator.forBlock['turtle_refuel'] = function(block, generator) { + var count = generator.valueToCode(block, 'COUNT', generator.ORDER_ATOMIC); + + if (count == 0) { + var code = "turtle.refuel()" + } else { + var code = `turtle.refuel(${count})` + } + + return code + "\n"; +}; + +luaGenerator.forBlock['turtle_compare_to'] = function(block, generator) { + var slot = generator.valueToCode(block, 'SLOT', generator.ORDER_ATOMIC); + + return [`turtle.compareTo(${slot})`, luaGenerator.ORDER_NONE]; +}; + +luaGenerator.forBlock['turtle_transfer_to'] = function(block, generator) { + var slot = generator.valueToCode(block, 'SLOT', generator.ORDER_ATOMIC); + var count = generator.valueToCode(block, 'COUNT', generator.ORDER_ATOMIC); + + return `turtle.transferTo(${slot}, ${count})\n`; +}; + +luaGenerator.forBlock['turtle_get_selected_slot'] = function(block) { + return [`turtle.getSelectedSlot()`, luaGenerator.ORDER_NONE]; +}; + + +luaGenerator.forBlock['turtle_get_fuel_limit'] = function(block) { + return [`turtle.getFuelLimit()`, luaGenerator.ORDER_NONE]; +}; + +luaGenerator.forBlock['turtle_equip'] = function(block) { + var side = block.getFieldValue('SIDE'); + + var code = ''; + switch (side) { + case 'LEFT': + code = `turtle.equipLeft()`; + break; + case 'RIGHT': + code = `turtle.equipRight() `; + break; + default: + code = `turtle.equipLeft()`; break; } - var code = `${num1} ${operatorSymbol} ${num2}`; - return [code, generator.ORDER_ATOMIC]; + return [code, luaGenerator.ORDER_NONE]; }; -// Print text block -luaGenerator.forBlock['text_print'] = function(block, generator) { - var text = generator.valueToCode(block, 'TEXT', generator.ORDER_NONE) || '\'\''; - var code = `print(${text})\n`; - return code; +luaGenerator.forBlock['turtle_inspect'] = function(block) { + var operator = block.getFieldValue('OPERATION'); + + var code = ''; + switch (operator) { + case 'FRONT': + code = `turtle.inspect()`; + break; + case 'UP': + code = `turtle.inspectUp()`; + break; + case 'DOWN': + code = `turtle.inspectDown()`; + break; + default: + code = `turtle.inspect()`; + break; + } + + return [code, luaGenerator.ORDER_NONE]; }; -// If condition block -luaGenerator.forBlock['controls_if'] = function(block, generator) { - var condition = generator.valueToCode(block, 'IF0', generator.ORDER_NONE) || 'false'; - var branch = generator.statementToCode(block, 'DO0'); - var code = `if ${condition} then\n${branch}\nend\n`; - return code; +luaGenerator.forBlock['turtle_get_item_detail'] = function(block, generator) { + var slot = generator.valueToCode(block, 'SLOT', generator.ORDER_ATOMIC); + + return [`turtle.getItemDetail(${slot})`, luaGenerator.ORDER_NONE]; }; -// Set variable block -luaGenerator.forBlock['variables_set'] = function(block, generator) { - var variable = generator.nameDB_.getName(block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); - var value = generator.valueToCode(block, 'VALUE', generator.ORDER_NONE) || '0'; - var code = `${variable} = ${value}\n`; - return code; -}; +luaGenerator.forBlock['turtle_craft'] = function(block, generator) { + var limit = generator.valueToCode(block, 'LIMIT', generator.ORDER_ATOMIC); + + return `turtle.craft(${limit})\n`; +}; \ No newline at end of file diff --git a/blocks/CCTurtle/index.json b/blocks/CCTurtle/index.json index 92d0511..036e927 100644 --- a/blocks/CCTurtle/index.json +++ b/blocks/CCTurtle/index.json @@ -2,7 +2,7 @@ "name": "CC: Turtle", "author": "DPSoftware Foundation", "description": "Library for control turtle", - "version": "0.1", + "version": "1.0", "category": "turtle", "keyword": "turtle", "license": "GPL-3.0-or-later", diff --git a/blocks/CCTurtle/toolbox.xml b/blocks/CCTurtle/toolbox.xml index 10db08b..4af44d5 100644 --- a/blocks/CCTurtle/toolbox.xml +++ b/blocks/CCTurtle/toolbox.xml @@ -65,19 +65,19 @@ - 1 + 1 - 1 + 1 - 64 + 64 @@ -85,7 +85,13 @@ - + + + + 1 + + + diff --git a/ccIDE Defines.xlsx b/ccIDE Defines.xlsx index 50bfe4dbcad6e9ffefe5e56bf4b2ae8f42f925b7..01485bc07cc658e440a590c61f1988b8f45e200e 100644 GIT binary patch delta 4673 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 diff --git a/readme.md b/readme.md index f9cbc06..f763599 100644 --- a/readme.md +++ b/readme.md @@ -1,3 +1,5 @@ +[![wakatime](https://wakatime.com/badge/user/0e729f00-081a-41e0-ab17-b9ac6abfc334/project/e9e0d6a6-dfaf-46d0-bb77-e1f7127e7fb4.svg)](https://wakatime.com/badge/user/0e729f00-081a-41e0-ab17-b9ac6abfc334/project/e9e0d6a6-dfaf-46d0-bb77-e1f7127e7fb4) + # ComputerCraft IDE (ccIDE) ccIDE is block based programming for ComputerCraft lua. diff --git a/src/module_block_design.json b/src/module_block_design.json index b7cf57b..678b457 100644 --- a/src/module_block_design.json +++ b/src/module_block_design.json @@ -13,5 +13,45 @@ "colour": 120, "tooltip": "Sleep command", "helpUrl": "" + }, + "sys_utils_table_variable_pack": { + "message0": "Pack %1 to Table", + "args0": [ + { + "type": "input_value", + "name": "RETURN_ARGS", + "check": "Multiple" + } + ], + "output": "Array", + "colour": 220 + }, + "sys_utils_get_value_from_table_with_index": { + "message0": "UnPack %1 to Value with index/key %2", + "args0": [ + { + "type": "input_value", + "name": "TABLE", + "check": "Array" + }, + { + "type": "input_value", + "name": "INDEX", + "check": ["Number", "String"] + } + ], + "output": null, + "colour": 220 + }, + "sys_utils_get_type": { + "message0": "Get type of %1", + "args0": [ + { + "type": "input_value", + "name": "INPUT" + } + ], + "output": "String", + "colour": 220 } -} \ No newline at end of file +} diff --git a/src/module_generator.js b/src/module_generator.js index b06e8a3..1c4e552 100644 --- a/src/module_generator.js +++ b/src/module_generator.js @@ -11,4 +11,23 @@ luaGenerator.forBlock['sys_sleep'] = function(block, generator) { var code = `sleep(${sleepfor})\n`; return code; +}; + +luaGenerator.forBlock['sys_utils_table_variable_pack'] = function(block, generator) { + var args = generator.valueToCode(block, 'RETURN_ARGS', generator.ORDER_NONE); + + return [`{${args}}`, luaGenerator.ORDER_NONE]; +}; + +luaGenerator.forBlock['sys_utils_get_value_from_table_with_index'] = function(block, generator) { + var table = generator.valueToCode(block, 'TABLE', generator.ORDER_NONE); + var index = generator.valueToCode(block, 'INDEX', generator.ORDER_NONE); + + return [`${table}[${index}]`, luaGenerator.ORDER_NONE]; +}; + +luaGenerator.forBlock['sys_utils_get_type'] = function(block, generator) { + var input = generator.valueToCode(block, 'INPUT', generator.ORDER_NONE); + + return [`type(${input})`, luaGenerator.ORDER_NONE]; }; \ No newline at end of file diff --git a/src/toolbox.xml b/src/toolbox.xml index 16c3bff..5d5f17a 100644 --- a/src/toolbox.xml +++ b/src/toolbox.xml @@ -1,4 +1,15 @@