67 lines
2.3 KiB
Lua
67 lines
2.3 KiB
Lua
|
|
local function intFromPort(gate, port, len)
|
|
local v = 0
|
|
for i = 1, len do
|
|
v = v + Gate.getportstate(gate, port+i-1)*math.pow(2, i-1)
|
|
end
|
|
return v
|
|
end
|
|
|
|
local function rotateVector(vec, rot)
|
|
if rot==0 then return { vec[1], vec[2], vec[3]}
|
|
elseif rot==1 then return { vec[2], -vec[1], vec[3]}
|
|
elseif rot==2 then return {-vec[1], -vec[2], vec[3]}
|
|
elseif rot==3 then return {-vec[2], vec[1], vec[3]}
|
|
else error("invalid rot "..rot) end
|
|
end
|
|
|
|
return function(gate)
|
|
print("robot update")
|
|
if not gate.waiting then
|
|
local action = ""
|
|
if Gate.getportstate(gate, 7)~=0 then -- remove brick
|
|
action = action.."R\t"
|
|
end
|
|
if Gate.getportstate(gate, 8)~=0 then -- plant brick
|
|
local color = intFromPort(gate, 1, 6)
|
|
local colorfx = 0
|
|
local shapefx = 0
|
|
local ray = 1
|
|
local col = 1
|
|
local ren = 1
|
|
action = action.."P "..color.." "..colorfx.." "..shapefx.." "..ray.." "..col.." "..ren.."\t"
|
|
end
|
|
if Gate.getportstate(gate, 22)~=0 then -- detect brick
|
|
action = action.."D\t"
|
|
end
|
|
|
|
local movePos = {0, 0, 0}
|
|
if Gate.getportstate(gate, 9)~=0 then movePos[3] = movePos[3]-1 end -- down
|
|
if Gate.getportstate(gate, 10)~=0 then movePos[3] = movePos[3]+1 end -- up
|
|
if Gate.getportstate(gate, 11)~=0 then movePos[3] = movePos[1]+1 end -- right
|
|
if Gate.getportstate(gate, 12)~=0 then movePos[3] = movePos[1]-1 end -- left
|
|
if Gate.getportstate(gate, 13)~=0 then movePos[3] = movePos[2]-1 end -- back
|
|
if Gate.getportstate(gate, 14)~=0 then movePos[3] = movePos[2]+1 end -- fore
|
|
local moveRotation = 0
|
|
--if Gate.getportstate(gate, 13)~=0 then moveRotation = moveRotation+1 end -- right
|
|
--if Gate.getportstate(gate, 14)~=0 then moveRotation = moveRotation-1 end -- left
|
|
gate.robotdir = (gate.robotdir + moveRotation)%4
|
|
|
|
if movePos[1]~=0 or movePos[2]~=0 or movePos[3]~=0 then
|
|
movePos = rotateVector(movePos, gate.robotdir)
|
|
gate.robotpos = { gate.robotpos[1]+movePos[1], gate.robotpos[2]+movePos[2], gate.robotpos[3]+movePos[3] }
|
|
action = action.."M "..gate.robotpos[1].." "..gate.robotpos[2].." "..gate.robotpos[3].."\t"
|
|
end
|
|
if moveRotation~=0 then
|
|
action = action.."A "..gate.robotdir.."\t"
|
|
end
|
|
|
|
if action~="" then
|
|
print("robot action")
|
|
print(action)
|
|
Gate.cb(gate, action:sub(1, #action-1))
|
|
gate.waiting = true
|
|
end
|
|
end
|
|
end
|