91 lines
2.8 KiB
Lua
91 lines
2.8 KiB
Lua
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 |