Brick_LuaLogic/bricks/special/robot-update.lua
2022-10-28 15:53:09 -06:00

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