From 08f61c086581b1296ad09ff66e5644dd42e9d189 Mon Sep 17 00:00:00 2001 From: rnd1 Date: Sat, 1 Jul 2017 23:00:16 +0200 Subject: [PATCH] -sound for robots -check operations code -energy rewrite --- commands.lua | 82 ++++++++-------- init.lua | 91 +++++++++++------ misc_commands.lua | 54 ++++++++++ scripts/battle_bot_arena.lua | 91 +++++++++++++++++ scripts/multiplication.lua | 184 +++++++++++++++++++++++++++++++++++ scripts/simple_parser.lua | 22 +++++ sounds/Dtmf0.ogg | Bin 0 -> 6531 bytes sounds/Dtmf1.ogg | Bin 0 -> 6468 bytes sounds/Dtmf2.ogg | Bin 0 -> 6679 bytes sounds/Dtmf3.ogg | Bin 0 -> 6775 bytes sounds/Dtmf4.ogg | Bin 0 -> 6311 bytes sounds/Dtmf5.ogg | Bin 0 -> 6618 bytes sounds/Dtmf6.ogg | Bin 0 -> 6698 bytes sounds/Dtmf7.ogg | Bin 0 -> 6140 bytes sounds/Dtmf8.ogg | Bin 0 -> 6443 bytes sounds/Dtmf9.ogg | Bin 0 -> 6580 bytes textures/chars.png | Bin 0 -> 3923 bytes 17 files changed, 451 insertions(+), 73 deletions(-) create mode 100644 misc_commands.lua create mode 100644 scripts/battle_bot_arena.lua create mode 100644 scripts/multiplication.lua create mode 100644 scripts/simple_parser.lua create mode 100644 sounds/Dtmf0.ogg create mode 100644 sounds/Dtmf1.ogg create mode 100644 sounds/Dtmf2.ogg create mode 100644 sounds/Dtmf3.ogg create mode 100644 sounds/Dtmf4.ogg create mode 100644 sounds/Dtmf5.ogg create mode 100644 sounds/Dtmf6.ogg create mode 100644 sounds/Dtmf7.ogg create mode 100644 sounds/Dtmf8.ogg create mode 100644 sounds/Dtmf9.ogg create mode 100644 textures/chars.png diff --git a/commands.lua b/commands.lua index 8e4fc48..453d59b 100644 --- a/commands.lua +++ b/commands.lua @@ -44,6 +44,19 @@ local function pos_in_dir(obj, dir) -- position after we move in specified direc return pos end +local check_operations = function(name, quit) + if basic_robot.maxoperations~=0 then + local data = basic_robot.data[name]; + local operations = data.operations; + if operations > 0 then data.operations = operations-1 else + if quit then + error("robot out of available operations in one step."); return + end + end + end +end + + basic_robot.commands.move = function(name,dir) local obj = basic_robot.data[name].obj; local pos = pos_in_dir(obj, dir) @@ -65,9 +78,6 @@ basic_robot.commands.move = function(name,dir) -- obj:set_animation({x=81,y=160}) -- end - - - return true end @@ -80,11 +90,7 @@ end basic_robot.commands.dig = function(name,dir) local energy = 0; - if basic_robot.maxenergy~=0 then - local data = basic_robot.data[name]; - energy = data.energy; - if energy > 0 then data.energy = energy-1 else return false end - end + check_operations(name); local obj = basic_robot.data[name].obj; local pos = pos_in_dir(obj, dir) @@ -351,11 +357,7 @@ end basic_robot.commands.attack = function(name, target) -- attack range 4, damage 5 local energy = 0; - if basic_robot.maxenergy~=0 then - local data = basic_robot.data[name]; - energy = data.energy; - if energy > 0 then data.energy = energy-1 else return false end - end + check_operations(name); local reach = 4; local damage = 5; @@ -625,7 +627,8 @@ basic_robot.commands.keyboard = { } basic_robot.commands.craftcache = {}; -basic_robot.commands.craft = function(item, name) + +basic_robot.commands.craft = function(item, mode, name) if not item then return end local cache = basic_robot.commands.craftcache[name]; @@ -673,6 +676,8 @@ basic_robot.commands.craft = function(item, name) --minetest.chat_send_all(item) --minetest.chat_send_all(dump(itemlist)) + if mode == 1 then return itemlist end + -- check if all items from itemlist.. -- craft item @@ -714,7 +719,7 @@ end) basic_robot.technic = { -- data cache fuels = {}, --[fuel] = value - smelts = {}, -- item = [cooktime, cookeditem, aftercookeditem] + smelts = {}, -- [item] = [cooktime, cookeditem, aftercookeditem] grinder_recipes = { --[in] ={fuel cost, out, quantity of material required for processing} ["default:stone"] = {2,"default:sand",1}, @@ -754,6 +759,7 @@ basic_robot.technic = { -- data cache } local chk_machine_level = function(inv,level) -- does machine have upgrade to be classified with at least "level" + if level < 1 then level = 1 end local upg = {"default:diamondblock","default:mese","default:goldblock"}; for i = 1,#upg do if not inv:contains_item("main",ItemStack(upg[i].. " " .. level)) then return false end @@ -761,11 +767,14 @@ local chk_machine_level = function(inv,level) -- does machine have upgrade to be return true end + basic_robot.commands.machine = { -- convert fuel into energy generate_power = function(name,input, amount) -- fuel used, if no fuel then amount specifies how much energy builtin generator should produce + check_operations(name, true) + if amount and amount>0 then -- attempt to generate power from builtin generator local pos = basic_robot.data[name].spawnpos; -- position of spawner block local inv = minetest.get_meta(pos):get_inventory(); @@ -778,11 +787,7 @@ basic_robot.commands.machine = { end local energy = 0; -- can only do one step at a run time - if basic_robot.maxenergy~=0 then - local data = basic_robot.data[name]; - energy = data.energy; - if energy > 0 then data.energy = energy-1 else error("only one generate_power per run step allowed"); return end - end + if string.find(input," ") then return nil, "1: can convert only one item at once" end @@ -797,6 +802,8 @@ basic_robot.commands.machine = { local fueladd, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = {stack}}) if fueladd.time > 0 then add_energy = fueladd.time; + else + return nil, "3: material can not be used as a fuel" end if add_energy>0 then basic_robot.technic.fuels[input] = add_energy/40 end end @@ -813,15 +820,7 @@ basic_robot.commands.machine = { smelt = function(name,input,amount) -- input material, amount of energy used for smelt local energy = 0; -- can only do one step at a run time - if basic_robot.maxenergy~=0 then - local data = basic_robot.data[name]; - energy = data.energy; - if energy > 0 then - data.energy = energy-1 - else - error("only one smelt per run step allowed"); return - end - end + check_operations(name,true) if string.find(input," ") then return nil, "0: only one item per smelt" end @@ -845,7 +844,7 @@ basic_robot.commands.machine = { local data = basic_robot.data[name] energy = data.menergy or 0; -- machine energy - if energy<=cost then return nil,"1: not enough energy" end + if energy0 then - basic_robot.technic.fuels[input] = {cooked.time, cooked.item, aftercooked.items[1]}; - smelts = basic_robot.technic.fuels[input]; + basic_robot.technic.smelts[input] = {cooked.time, cooked.item, aftercooked.items[1]}; + smelts = basic_robot.technic.smelts[input]; + else + return nil, "3: material can not be smelted" end end local cooktime = smelts[1]; local cookeditem = smelts[2]; local aftercookeditem = smelts[3] @@ -890,7 +891,7 @@ basic_robot.commands.machine = { local inv = minetest.get_meta(pos):get_inventory(); --level requirement - local level = math.floor((cost-1)/3) + local level = math.floor((cost-1)/3); if not chk_machine_level(inv,level) then error("0: tried to grind " .. input .. " requires upgrade level at least " .. level) return end @@ -943,22 +944,15 @@ basic_robot.commands.machine = { if not tdata then return nil, "target inactive" end local energy = 0; -- can only do one step at a run time - if basic_robot.maxenergy~=0 then - local data = basic_robot.data[name]; - energy = data.energy; - if energy > 0 then - data.energy = energy-1 - else - error("only one transfer per run step allowed"); return - end - end + check_operations(name, true); energy = data.menergy or 0; if amount>energy then return nil,"energy too low" end if not tdata.menergy then tdata.menergy = 0 end tdata.menergy = tdata.menergy + amount - data.energy = energy - amount; + data.menergy = energy - amount; + return true end, } \ No newline at end of file diff --git a/init.lua b/init.lua index 2951dca..966cc7d 100644 --- a/init.lua +++ b/init.lua @@ -8,13 +8,13 @@ basic_robot.call_limit = 48; -- how many execution calls per script run allowed basic_robot.bad_inventory_blocks = { -- disallow taking from these nodes inventories ["craft_guide:sign_wall"] = true, } -basic_robot.maxenergy = 1; -- how much energy available per run, 0 = unlimited +basic_robot.maxoperations = 1; -- how many operations available per run, 0 = unlimited basic_robot.use_coal = true; -- does robot require coal to dig stone? ---------------------- -basic_robot.version = "02/07a"; +basic_robot.version = "06/18a"; basic_robot.data = {}; -- stores all robot data --[[ @@ -27,6 +27,7 @@ basic_robot.ids = {}; -- stores maxid for all players basic_robot.data.listening = {}; -- which robots listen to chat dofile(minetest.get_modpath("basic_robot").."/commands.lua") +local check_code, preprocess_code,is_inside_string; @@ -38,6 +39,8 @@ function getSandboxEnv (name) local env = { pcall=pcall, + robot_version = function() return basic_robot.version end, + move = { -- changes position of robot left = function() return commands.move(name,1) end, right = function() return commands.move(name,2) end, @@ -118,8 +121,8 @@ function getSandboxEnv (name) return commands.pickup(r, name); end, - craft = function(item) - return commands.craft(item, name) + craft = function(item, mode) + return commands.craft(item, mode, name) end, self = { @@ -187,6 +190,11 @@ function getSandboxEnv (name) obj:setpos({x=pos.x,y=pos.y+1,z=pos.z}); obj:setyaw(0); end, + set_libpos = function(pos) + local pos = basic_robot.data[name].spawnpos; local meta = minetest.get_meta(pos); + meta:set_string("libpos",pos.x .. " " .. pos.y .. " " .. pos.z) + end, + spam = function (mode) -- allow more than one msg per "say" if mode == 1 then basic_robot.data[name].allow_spam = true @@ -241,6 +249,20 @@ function getSandboxEnv (name) commands.display_text(obj,text,linesize,size) end, + sound = function(sample,volume) + local obj = basic_robot.data[name].obj; + return minetest.sound_play( sample, + { + object = obj, + gain = volume or 1, + max_hear_distance = 32, -- default, uses an euclidean metric + }) + end, + + sound_stop = function(handle) + minetest.sound_stop(handle) + end, + }, machine = {-- adds technic like functionality to robots: power generation, smelting, grinding, compressing @@ -318,7 +340,7 @@ function getSandboxEnv (name) backward = function(stringname,mode) return commands.read_text(name,mode,4,stringname) end, down = function(stringname,mode) return commands.read_text(name,mode,6,stringname) end, up = function(stringname,mode) return commands.read_text(name,mode,5,stringname) end, - forward_down = function() return commands.read_text(name,mode,7,stringname) end, + forward_down = function(stringname,mode) return commands.read_text(name,mode,7,stringname) end, }, write_text = { -- returns text @@ -328,12 +350,12 @@ function getSandboxEnv (name) backward = function(text) return commands.write_text(name,4,text) end, down = function(text) return commands.write_text(name,6,text) end, up = function(text) return commands.write_text(name,5,text) end, - forward_down = function() return commands.write_text(name,7,text) end, + forward_down = function(text) return commands.write_text(name,7,text) end, }, - say = function(text) - if not basic_robot.data[name].quiet_mode then + say = function(text, owneronly) + if not basic_robot.data[name].quiet_mode and not owneronly then minetest.chat_send_all(" " .. text) if not basic_robot.data[name].allow_spam then basic_robot.data[name].quiet_mode=true @@ -380,6 +402,15 @@ function getSandboxEnv (name) end, run = function(script) + if basic_robot.data[name].isadmin ~= 1 then + local err = check_code(script); + script = preprocess_code(script); + if err then + minetest.chat_send_player(name,"#ROBOT CODE CHECK ERROR : " .. err) + return + end + end + local ScriptFunc, CompileError = loadstring( script ) if CompileError then minetest.chat_send_player(name, "#code.run: compile error " .. CompileError ) @@ -470,10 +501,9 @@ end -- code checker -local function check_code(code) - +check_code = function(code) --"while ", "for ", "do ","goto ", - local bad_code = {"repeat ", "until ", "_ccounter", "_G", "while%(", "while{", "pcall","\\\""} + local bad_code = {"repeat", "until", "_ccounter", "_G", "while%(", "while{", "pcall","\\\""} for _, v in pairs(bad_code) do if string.find(code, v) then @@ -484,7 +514,7 @@ local function check_code(code) end -local function is_inside_string(pos,script) +is_inside_string = function(pos,script) local i1=string.find (script, "\"", 1); if not i1 then return false @@ -514,7 +544,7 @@ end -- COMPILATION -local function preprocess_code(script) +preprocess_code = function(script) --[[ idea: in each local a = function (args) ... end insert counter like: local a = function (args) counter() ... end when counter exceeds limit exit with error @@ -535,9 +565,10 @@ local function preprocess_code(script) found = false; i2 = nil; + -- i1 = where its looking + i2=string.find (script, "while ", i1) -- fix while OK if i2 then - --minetest.chat_send_all("while0"); if not is_inside_string(i2,script) then local i21 = i2; i2=string.find(script, "do", i2); @@ -566,7 +597,7 @@ local function preprocess_code(script) i2=string.find (script, "for ", i1) -- fix for OK if i2 then if not is_inside_string(i2,script) then - i2=string.find(script, "do ", i2); + i2=string.find(script, "do", i2); if i2 then script = script.sub(script,1, i2+1) .. _increase_ccounter .. script.sub(script, i2+2); i1=i2+string.len(_increase_ccounter); @@ -633,7 +664,7 @@ local function runSandbox( name) end data.ccounter = 0; - data.energy = 1; + data.operations = 1; setfenv( ScriptFunc, data.sandbox ) @@ -716,7 +747,7 @@ local function init_robot(obj) end minetest.register_entity("basic_robot:robot",{ - energy = 1, + operations = 1, owner = "", name = "", hp_max = 100, @@ -789,7 +820,7 @@ minetest.register_entity("basic_robot:robot",{ if self.timer>self.timestep and self.running == 1 then self.timer = 0; local err = runSandbox(self.name); - if err then + if err and type(err) == "string" then local i = string.find(err,":"); if i then err = string.sub(err,i+1) end if string.sub(err,-5)~="abort" then @@ -927,7 +958,7 @@ local spawn_robot = function(pos,node,ttl) if not data.sandbox then data.sandbox = getSandboxEnv (name) end -- actual code run process - data.ccounter = 0;data.energy = 1; + data.ccounter = 0;data.operations = 1; setfenv(data.bytecode, data.sandbox ) @@ -1087,7 +1118,7 @@ local on_receive_robot_form = function(pos, formname, fields, sender) " if index>0 it returns itemname. if itemname == \"\" it checks if inventory empty\n".. " activate.direction(mode) activates target block\n".. " pickup(r) picks up all items around robot in radius r<8 and returns list or nil\n".. - " craft(item) crafts item if required materials are present in inventory\n".. + " craft(item,mode) crafts item if required materials are present in inventory. mode = 1 returns recipe\n".. " take.direction(item, inventory) takes item from target inventory into robot inventory\n".. " read_text.direction(stringname,mode) reads text of signs, chests and other blocks, optional stringname for other meta,\n mode 1 read number\n".. " write_text.direction(text,mode) writes text to target block as infotext\n".. @@ -1118,20 +1149,22 @@ local on_receive_robot_form = function(pos, formname, fields, sender) " self.fire_pos() returns last hit position\n".. " self.label(text) changes robot label\n".. " self.display_text(text,linesize,size) displays text instead of robot face\n".. + " self.sound(sample,volume) plays sound named 'sample' at robot location\n".. " rom is aditional table that can store persistent data, like rom.x=1\n".. "**KEYBOARD : place spawner at coordinates (20i,40j+1,20k) to monitor events\n".. " keyboard.get() returns table {x=..,y=..,z=..,puncher = .. , type = .. } for keyboard event\n".. " keyboard.set(pos,type) set key at pos of type 0=air, 1..6, limited to range 10 around\n".. " keyboard.read(pos) return node name at pos\n".. - "**TECHNIC FUNCTIONALITY: namespace 'machine'\n" .. + "**TECHNIC FUNCTIONALITY: namespace 'machine'. most functions return true or nil, error\n" .. " energy() displays available energy\n".. - " generate_power(fuel, amount) attempt to generate power from fuel material, if\n" .. - " amount>0 try generate amount of power using builtin generator - this requires\n" .. + " generate_power(fuel, amount) = energy, attempt to generate power from fuel material,\n" .. + " if amount>0 try generate amount of power using builtin generator - this requires\n" .. " 40 gold/mese/diamonblock upgrades for each 1 amount\n".. - " smelt(input,amount) works as a furnace, if amount>0 try to use power to smelt -\n" .. - " requires 10 upgrades for each 1 amount, energy cost is: 1/40*(1+amount)\n".. + " smelt(input,amount) = progress/true. works as a furnace, if amount>0 try to\n" .. + " use power to smelt - requires 10 upgrades for each 1 amount, energy cost is:\n".. + " 1/40*(1+amount)\n".. " grind(input) - grinds input material, requires upgrades for harder material\n".. - " compress(input) requires upgrades - energy intensive process\n" .. + " compress(input) - requires upgrades - energy intensive process\n" .. " transfer_power(amount,target_robot_name)\n"; text = minetest.formspec_escape(text); @@ -1296,15 +1329,15 @@ minetest.register_on_player_receive_fields( elseif fields.right then pcall(function () commands.move(name,2) end) elseif fields.dig then - pcall(function () basic_robot.data[name].energy = 1; commands.dig(name,3) end) + pcall(function () basic_robot.data[name].operations = 1; commands.dig(name,3) end) elseif fields.up then pcall(function () commands.move(name,5) end) elseif fields.down then pcall(function () commands.move(name,6) end) elseif fields.digdown then - pcall(function () basic_robot.data[name].energy = 1; commands.dig(name,6) end) + pcall(function () basic_robot.data[name].operations = 1; commands.dig(name,6) end) elseif fields.digup then - pcall(function () basic_robot.data[name].energy = 1; commands.dig(name,5) end) + pcall(function () basic_robot.data[name].operations = 1; commands.dig(name,5) end) end return end diff --git a/misc_commands.lua b/misc_commands.lua new file mode 100644 index 0000000..12cce7b --- /dev/null +++ b/misc_commands.lua @@ -0,0 +1,54 @@ +//lua minetest.get_player_by_name("rnd"):set_properties({visual_size = {x=1,y=1}}) + +local name = "rnd"; local player = minetest.get_player_by_name(name); player:set_properties({visual = "upright_sprite"});player:set_properties({textures={"default_tool_diamondpick.png"}}) + + +// change to robot +local name = "rnd"; local player = minetest.get_player_by_name(name); player:set_properties({visual = "cube"});player:set_properties({textures={"arrow.png^[transformR90","basic_machine_side.png","basic_machine_side.png","basic_machine_side.png","face.png","basic_machine_side.png"}});player:set_properties({collisionbox={-0.5,-0.5,-0.5,0.5,0.5,0.5}}) + +//LawnGreen + +local name = "rnd"; local player = minetest.get_player_by_name(name); player:set_properties({visual = "sprite"});player:set_properties({textures={"farming_bottle_ethanol.png"}});player:set_properties({collisionbox={-0.5,-0.5,-0.5,0.5,0.5,0.5}});player:set_properties({visual_size = {x=2,y=2}}) + +//farming_blueberry_muffin +local name = "rnd"; local player = minetest.get_player_by_name(name); player:set_properties({visual = "cube"});player:set_properties({textures={"farming_pumpkin_face_off.png","farming_pumpkin_face_off.png","farming_pumpkin_face_off.png","farming_pumpkin_face_off.png","farming_pumpkin_face_off.png","farming_pumpkin_face_off.png"}});player:set_properties({collisionbox={-0.5,-0.5,-0.5,0.5,0.5,0.5}}) + +--nyan cat +//lua local name = "rnd"; local player = minetest.get_player_by_name(name); player:set_properties({visual = "cube"});player:set_properties({textures = {"nyancat_side.png", "nyancat_side.png", "nyancat_side.png","nyancat_side.png", "nyancat_front.png", "nyancat_back.png"}});player:set_properties({collisionbox={-0.5,-0.5,-0.5,0.5,0.5,0.5}}) + + + +local name = "rnd1"; local player = minetest.get_player_by_name(name); player:set_nametag_attributes({text = "Friend of Giorge"}); + +//lua local player = minetest.get_player_by_name("pro2");minetest.sound_play("nyan",{object = player,gain = 1.0,max_hear_distance = 8,loop = false}) + + +//lua local player = minetest.get_player_by_name("rnd");player:set_properties({visual = "mesh",textures = {"mobs_spider.png"},mesh = "mobs_spider.x",visual_size = {x=7,y=7}}) + + +//lua local player = minetest.get_player_by_name("rnd");player:set_properties({visual = "mesh",textures = {"mobs_dungeon_master.png"},mesh = "mobs_dungeon_master.b3d",visual_size = {x=1,y=1}}) + +//lua local player = minetest.get_player_by_name("best");player:set_properties({visual = "mesh",textures = {"zmobs_mese_monster.png"},mesh = "zmobs_mese_monster.x",visual_size = {x=1,y=1}}) + +//lua local player = minetest.get_player_by_name("rnd1");player:set_properties({visual = "mesh",textures = {"mobs_oerkki.png"},mesh = "mobs_oerkki.b3d",visual_size = {x=1,y=1}}) + +//lua local player = minetest.get_player_by_name("rnd1");player:set_properties({visual = "mesh",textures = {"mobs_stone_monster.png"},mesh = "mobs_stone_monster.b3d",visual_size = {x=1,y=1}}) + + +mesh = "zmobs_lava_flan.x", + textures = { + {"zmobs_lava_flan.png"}, + {"zmobs_lava_flan2.png"}, + {"zmobs_lava_flan3.png"}, + }, +---------------------------------------------- + + + +//lua local player = minetest.get_player_by_name("towner");player:set_physics_override({speed=0.05}) + + + + + + diff --git a/scripts/battle_bot_arena.lua b/scripts/battle_bot_arena.lua new file mode 100644 index 0000000..a9ceb57 --- /dev/null +++ b/scripts/battle_bot_arena.lua @@ -0,0 +1,91 @@ +if not s then +-- init +bots = {[4] = {}, [5] = {}}; -- [type] = {{1,1,10}, {3,2,10}}; -- {x,y,hp} +arena = {}; --[x][z] = {type, idx} +for i = -10,10 do arena[i] = {} for j=-10,10 do arena[i][j] = {0,0} end end +centerpos = self.spawnpos(); centerpos.y = centerpos.y+2 +TYPE = 4; -- 4,5 defines which bots are on the move/attack +DIR = 1 +s=0 +t=0 +-- load user progs +_,script1 = book.read(1);_,script2 = book.read(2); +prog1, _ = _G.loadstring( script1 ); prog2, _ = _G.loadstring( script2 ); + + spawn_bot = function (x,z,type) + if arena[x] and arena[x][z] and arena[x][z][1] == 0 then + keyboard.set({x=centerpos.x+x,y=centerpos.y,z=centerpos.z+z},type) + table.insert(bots[type],{x,z,10}) + arena[x][z] = {type,#bots[type]} + else + return false + end + end + + move_bot = function (i,dx,dz) + local bot = bots[TYPE][i];if not bot then return false end + if math.abs(dx)>1 or math.abs(dz)>1 then return false end + local x1=bot[1]+dx; local z1=bot[2]+dz; + if math.abs(x1)>10 or math.abs(z1)>10 then return false end + if arena[x1] and arena[x1][z1] and arena[x1][z1][1] == 0 then else return false end + + keyboard.set({x=centerpos.x+bot[1],y=centerpos.y,z=centerpos.z+bot[2]},0); + keyboard.set({x=centerpos.x+x1,y=centerpos.y,z=centerpos.z+z1},TYPE); + arena[bot[1]][bot[2]] = {0,0} + arena[x1][z1] = {TYPE,i} + + bot[1]=x1;bot[2]=z1; + end + + attack_bot = function(i,dx,dz) + local bot = bots[TYPE][i];if not bot then return false end + if math.abs(dx)>1 or math.abs(dz)>1 then return false end + local x1=bot[1]+dx; local z1=bot[2]+dz; + if math.abs(x1)>10 or math.abs(z1)>10 then return false end + if arena[x1] and arena[x1][z1] and arena[x1][z1][1] == 0 then return false end + local type = arena[x1][z1][1]; local idx = arena[x1][z1][2]; + local tbot = bots[type][idx]; + if not tbot then return false end + tbot[3]=tbot[3]-5; + if tbot[3]<=0 then + keyboard.set({x=centerpos.x+tbot[1],y=centerpos.y,z=centerpos.z+tbot[2]},0); + table.remove(bots[type],idx); + arena[x1][z1] = {0,0} + end + end + + read_arena = function(x,z) + local data = arena[x][z]; + if not data then return end + return {data[1],data[2]}; + end + + read_bots = function (type, idx) + local data = bots[type][idx]; + if not data then return end + return {data[1],data[2],data[3]} + end +end + +if t%10 == 0 then + spawn_bot(0,-10,4) + spawn_bot(0,10,5) +end +t=t+1 +self.label(#bots[4] .. " " .. #bots[5]) + +-- PROGRAM RULES: +-- not allowed to modify api code: TYPE, bots,t,s, spawn_bot, move_bot, attack_bot, read_arena, read_bots +-- only allowed to move bot or attack, but not to dig/place + +TYPE = 4+(t%2); +DIR = - DIR + +if TYPE == 5 then + _G.setfenv(prog1, _G.basic_robot.data[self.name()].sandbox ) + _,err = pcall(prog1) +else + _G.setfenv(prog2, _G.basic_robot.data[self.name()].sandbox ) + _,err = pcall(prog2) +end +if err then say(err) self.remove() end \ No newline at end of file diff --git a/scripts/multiplication.lua b/scripts/multiplication.lua new file mode 100644 index 0000000..2628d0b --- /dev/null +++ b/scripts/multiplication.lua @@ -0,0 +1,184 @@ +if not number then + number = {}; + number.base = 10; -- what base: 2-10 + number.data = {}; + number.size = -1; + + function number:tostring() + local ret = "" + --say("tostring size " .. self.size) + for i = self.size,1,-1 do ret = ret .. (self.data[i] or "X").."" end + return ret + end + + function number:new(data) + local o = {};_G.setmetatable(o, self); o.data = {}; + for i = 1,#data do o.data[i] = data[i] end -- do copy otherwise it just saves reference + o.size = #data; + self.__index = self; return o + end + + number.add = function (lhs, rhs,res) + local n1 = lhs.size;local n2 = rhs.size;local n = math.max(n1,n2); + local carry=0, sum; local base = lhs.base; + local out = false; + if not res then res = number:new({}) out = true end + local data = res.data + for i = 1,n do + sum = (lhs.data[i] or 0)+(rhs.data[i] or 0)+carry; + if carry>0 then carry = 0 end + if sum>=base then data[i]=sum-base; carry = 1 else data[i] = sum end + end + if carry>0 then data[n+1]=1 res.size = n+1 else res.size = n end + if out then return res end + end + + number.__add = add; + + function number:set(m) + local data = self.data; + local mdata = m.data; + for i=1,#mdata do + data[i]=mdata[i]; + end + self.size = m.size; + end + + -- 'slow' long multiply + number.multiply = function (lhs, rhs, res) + local n1 = lhs.size;local n2 = rhs.size;local n = n1+n2; + --say("multiply sizes " .. n1 .. "," .. n2) + local out = false; + if not res then res = number:new({}); out = true end; + res.size = n1+n2-1; + res.data = {} -- if data not cleared it will interfere with result! + local data = res.data; + local c,prod,carry = 0; local base = lhs.base; + for i=1,n1 do + carry = 0; + c = lhs.data[i] or 0; + for j = 1,n2 do -- multiply with i-th digit and add to result + prod = (data[i+j-1] or 0)+c*(rhs.data[j] or 0)+carry; + carry = math.floor(prod / base); + prod = prod % base; + data[i+j-1] = (prod)%base; + end + if carry>0 then data[i+n2] = (data[i+n2] or 0)+ carry ;if res.sizea^2, 1 = square and multiply a-> a*a^2 + while (power>0) do + r=power%2; powerplan[#powerplan+1] = r; power = (power-r)/2 + end + + for i = #powerplan-1,1,-1 do + + number.multiply(input,input,out); + + if powerplan[i] == 1 then + input,out = out, input; + number.multiply(input,n,out); count = count + 2 + else count = count + 1; + end + + input,out = out, input; + end + + return input + end + + split = function(s,k) + local ret = ""; + local j=1,length; length = string.len(s)/k + for i = 1, length do + j = (i-1)*k+1; + ret = ret .. string.sub(s,j,j+k-1) .. "\n" + end + --say("j " .. j) + if j>1 then j = j+k end + ret = ret .. string.sub(s,j) + return ret + end + + self.spam(1) + + -- little endian ! lower bits first .. + + --n = number:new({7,1,0,2}); local power = 2017; + --self.label(split(n:tostring().."^"..power .. " = " .. number.power(n,power):tostring(),100)) + --2017^2017 = 3906... +end \ No newline at end of file diff --git a/scripts/simple_parser.lua b/scripts/simple_parser.lua new file mode 100644 index 0000000..2a8811e --- /dev/null +++ b/scripts/simple_parser.lua @@ -0,0 +1,22 @@ +if not text then + text = "diamond 3;mese 4;gold 2;diamond 1;" + function parse(text) + ret = {}; + for a,b in text:gmatch("(%w+) (%w+)%;") do + ret[a] = (ret[a] or 0) + (tonumber(b) or 0) + end + return ret + end + + function export(array) + ret = ""; + for k,v in pairs(array) do + ret = ret .. (_G.tostring(k) or "") .. " " .. (_G.tostring(v) or "") ..";" + end + return ret + end + say("input: " .. text) + local arr = parse(text); + say("parsed text: " .. string.gsub(_G.dump(arr),"\n","")) + say("back to string :" .. export(arr)) +end \ No newline at end of file diff --git a/sounds/Dtmf0.ogg b/sounds/Dtmf0.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ba54d47937c52a7f78c7250bc41f327d23ecb486 GIT binary patch literal 6531 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 literal 0 HcmV?d00001 diff --git a/sounds/Dtmf2.ogg b/sounds/Dtmf2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..69eafc532e7b7eff4c599aad298a8c9505769ca2 GIT binary patch literal 6679 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 literal 0 HcmV?d00001 diff --git a/sounds/Dtmf3.ogg b/sounds/Dtmf3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..39b111e513ec11d56a06958728031101d0bca332 GIT binary patch literal 6775 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 NxZW&c&3XLRe*twC3dH~b literal 0 HcmV?d00001 diff --git a/sounds/Dtmf4.ogg b/sounds/Dtmf4.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2085a114c05ce36861b7ffc2ca2d4f1d80f2990d GIT binary patch literal 6311 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 literal 0 HcmV?d00001 diff --git a/sounds/Dtmf5.ogg b/sounds/Dtmf5.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b0ea2bbf49d57f04a2bf973ffe53b5a3abacd8ab GIT binary patch literal 6618 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 O8#PAX-F7g?gYYk_`vs{0 literal 0 HcmV?d00001 diff --git a/sounds/Dtmf6.ogg b/sounds/Dtmf6.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f4fe13cc1d64ea254af9d688b3f2577fdb63f81f GIT binary patch literal 6698 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 literal 0 HcmV?d00001 diff --git a/sounds/Dtmf7.ogg b/sounds/Dtmf7.ogg new file mode 100644 index 0000000000000000000000000000000000000000..406f3383d2a46983e84c3ed75ad2da6ccd022d89 GIT binary patch literal 6140 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 L;<+2QE2IAd7cqsm literal 0 HcmV?d00001 diff --git a/sounds/Dtmf8.ogg b/sounds/Dtmf8.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d54badd8c2682f996771d5ce4b2e5311663b0549 GIT binary patch literal 6443 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