Compare commits

...

48 Commits

Author SHA1 Message Date
Justus Wolff
2f7e2194b3 remove experimental warning 2026-02-23 01:16:11 +01:00
Justus Wolff
7886710d15 add correction manuevuers for move 2026-02-23 01:15:07 +01:00
Justus Wolff
93d20c3e9e change the failcheck again. 2026-02-23 01:03:49 +01:00
Justus Wolff
bc2cdbf347 change the failcheck to use even. 2026-02-23 01:01:29 +01:00
Justus Wolff
ee428d09bc check if even, yes? ok, add 1 no? dont add 1. 2026-02-23 01:00:43 +01:00
Justus Wolff
285ef315ab add check so that an unevenstack only gets added if it actually has something. 2026-02-23 00:52:26 +01:00
Justus Wolff
b795880174 also remove wanted from center call in VP_prinstack 2026-02-23 00:48:19 +01:00
Justus Wolff
1e6f259bab and fix that again 2026-02-23 00:46:06 +01:00
Justus Wolff
d17ab84e67 aaand fix an y offset bug 2026-02-23 00:44:51 +01:00
Justus Wolff
c20b6b7eba change a few things 2026-02-23 00:42:54 +01:00
Justus Wolff
0c6185f67e remove check at the end of VP_splitstack and add some stuff to move 2026-02-23 00:37:55 +01:00
Justus Wolff
a284cc6c87 qol 2026-02-22 21:19:40 +01:00
Justus Wolff
1e2bf6183b forgot to reset ind 2026-02-22 21:11:53 +01:00
Justus Wolff
f8467d5703 I knew I forgot something... 2026-02-22 21:00:34 +01:00
Justus Wolff
b75e547483 remade splitstack. 2026-02-22 20:57:59 +01:00
Justus Wolff
0c71102650 fix start position of master turtle. 2026-02-22 20:47:47 +01:00
Justus Wolff
c76c674a58 so first we fix an height issue aswell as an naming issue in a packet 2026-02-22 20:41:06 +01:00
Justus Wolff
ba3d077bac and fix an indexing issue again... 2026-02-22 20:38:25 +01:00
Justus Wolff
0107287084 and fix master turtle not properly getting its own stack. 2026-02-22 20:37:07 +01:00
Justus Wolff
bc4193cadb forgot to send height as master turtle. 2026-02-22 20:35:26 +01:00
Justus Wolff
f14fb1cc2f also ask user to add <x> many blocks to master turtle 2026-02-22 20:33:43 +01:00
Justus Wolff
5434ceb46c also fix going right for no reason (why did I add that?) 2026-02-22 20:31:47 +01:00
Justus Wolff
0a9ef1709e fix stack printing 2026-02-22 20:30:47 +01:00
Justus Wolff
8b05cf5e67 print id when waiting for stack and dimension 2026-02-22 20:27:36 +01:00
Justus Wolff
663bf2ffb9 fix dimension accessing 2026-02-22 20:24:31 +01:00
Justus Wolff
f804467e82 hopefully fixed 2026-02-22 20:23:39 +01:00
Justus Wolff
6f6e61b092 D E B U G 2026-02-22 20:21:25 +01:00
Justus Wolff
f06e2e9b3a more debugging 2026-02-22 20:20:38 +01:00
Justus Wolff
2123699e23 add debugging code 2026-02-22 20:19:54 +01:00
Justus Wolff
c66fedaf2f attempt to fix createstack and reintroduce optimizestack. 2026-02-22 20:16:58 +01:00
Justus Wolff
0df5a87891 remove optimizestack call 2026-02-22 20:09:58 +01:00
justuswolff
bdf3f34e6b failcheck 2026-02-19 20:12:03 +01:00
justuswolff
608083d928 expand failcheck a little 2026-02-19 20:07:54 +01:00
justuswolff
ce75d4a034 failcheck 2026-02-19 20:06:18 +01:00
justuswolff
4f82df6dbb fix an bug where we couldnt index an stack properly 2026-02-19 20:03:27 +01:00
justuswolff
37233f7b42 add rednet open to action 3 and 4 2026-02-19 20:00:05 +01:00
justuswolff
322ec34491 add update function 2026-02-19 19:57:53 +01:00
justuswolff
5e299edd9c VPrint full first code 2026-02-19 19:56:23 +01:00
justuswolff
35bd00feb9 fix it again... 2026-02-18 20:22:06 +01:00
justuswolff
3f74327f77 change return to home again under VP_printstack or rather, fix it. 2026-02-18 20:18:40 +01:00
justuswolff
90a54914be change a bit of positioning under VP_printstack 2026-02-18 20:15:57 +01:00
justuswolff
de029e6886 attempt to fix y offset at VP_printstack 2026-02-18 20:12:23 +01:00
justuswolff
29e23e9f40 provide cx,cz and direction to VP_printstack 2026-02-18 20:09:20 +01:00
justuswolff
5417ff638f remove fuel checking in VPrint entirely 2026-02-18 20:07:06 +01:00
justuswolff
cd8a403d6e made VPrint a mode and experimental 2026-02-18 20:02:40 +01:00
justuswolff
529b10e8dd add optimization for stacks 2026-02-18 18:52:49 +01:00
justuswolff
a6d267765d refactor code to provide newest needed argument to getnearestunplaced. 2026-02-17 22:26:11 +01:00
justuswolff
ab9d5c7b83 make getnearestunplaced also take direction into account. 2026-02-17 22:25:20 +01:00

View File

@@ -1,4 +1,4 @@
-- http://justus.l--n.de:3000/JUFS/cc_housebuild/raw/branch/main/src/main.lua local url = "http://justus.l--n.de:3000/JUFS/cc_housebuild/raw/branch/main/src/main.lua"
if not _G["turtle"] then if not _G["turtle"] then
error("This program only runs on turtles!") error("This program only runs on turtles!")
@@ -297,7 +297,7 @@ local function newdesign()
end end
end end
end end
local function move(direction) local function move(direction, continousattempt)
if direction == "left" then if direction == "left" then
turtle.turnLeft() turtle.turnLeft()
return return
@@ -306,29 +306,42 @@ local function move(direction)
turtle.turnRight() turtle.turnRight()
return return
end end
local correction = 0
while true do while true do
if turtle.getFuelLevel() == 0 then if turtle.getFuelLevel() == 0 then
reset() reset()
print("Out of fuel! Please insert fuel into current slot.") print("Out of fuel! Trying to refuel.")
while true do while true do
local suc = turtle.refuel(64) local suc = turtle.refuel(64)
if suc then if suc then
print("Refuelled. Press enter to continue.")
read("")
break break
end end
local current = turtle.getSelectedSlot()
if current == 16 then
turtle.select(1)
else
turtle.select(current+1)
end
os.sleep(1) os.sleep(1)
end end
end end
local suc,reason = turtle[direction]() local suc,reason = turtle[direction]()
if not suc then if not suc and not continousattempt then
printError(reason) printError(reason)
print("Resolve the error and press enter to continue.") print("Resolve the error and press enter to continue.")
read("") read("")
else elseif not suc and continousattempt then
reset()
printError("Failure moving "..direction.." Continous attempt true.")
move("forward", true)
correction = correction + 1
elseif suc then
break break
end end
end end
for _=1,correction,1 do
move("back", true)
end
end end
local function place(direction) local function place(direction)
local func = turtle.place local func = turtle.place
@@ -361,25 +374,48 @@ local function placebuf(buf, x, y, z)
place("down") place("down")
end end
end end
local function getnearestunplaced(buf, pbuf, cx,cy,cz,clayer, sx,sz) local function directiondist(direction, wanted)
if direction == 0 then return 1 end
if direction == 1 and wanted == -1 then return 2 end
if direction == -1 and wanted == 1 then return 2 end
if direction ~= wanted then return 1 end -- failsafes
if direction == wanted then return 0 end
end
local function needstobeplaced(placecode, clayer)
if clayer == 0 or clayer == 2 then
return placecode == 1
end
if clayer == 1 then
return placecode == 1 or placecode == 4
end
if clayer == 3 then
return placecode == 1 or placecode == 4 or placecode == 3
end
end
local function getnearestunplaced(buf, pbuf, cx,cy,cz,clayer, sx,sz, direction)
local distance = math.huge local distance = math.huge
local selected = nil local selected = nil
for x=1,sx,1 do for x=1,sx,1 do
for y=1,sz,1 do for y=1,sz,1 do
local extracost = 0
if x ~= cx and direction ~= 0 then
extracost = extracost + 1
end
if y > cz and direction ~= 1 then
extracost = extracost + directiondist(direction, 1)
end
if y < cz and direction ~= -1 then
extracost = extracost + directiondist(direction, -1)
end
local needplace = buf[posasstring(x,cy,y)] local needplace = buf[posasstring(x,cy,y)]
if pbuf[posasstring(x,cy,y)] then needplace = 0 end -- already placed if pbuf[posasstring(x,cy,y)] then needplace = 0 end -- already placed
if clayer == 0 or clayer == 2 then needplace = needstobeplaced(needplace, clayer)
needplace = needplace == 1
end
if clayer == 1 then
needplace = needplace == 1 or needplace == 4
end
if clayer == 3 then
needplace = needplace == 1 or needplace == 4 or needplace == 3
end
if needplace then -- needs to be placed, calculate distance if needplace then -- needs to be placed, calculate distance
local cd = math.abs(y-cz)+math.abs(x-cx) -- raw distance (amount of blocks between) local cd = math.abs(y-cz)+math.abs(x-cx) -- raw distance (amount of blocks between)
cd = cd + extracost
if cd < distance then if cd < distance then
distance = cd distance = cd
selected = {x,y} selected = {x,y}
@@ -479,7 +515,7 @@ local function printdes(buf, dimensions)
for clayer=1,3,1 do -- build walls for clayer=1,3,1 do -- build walls
local pbuf = {} local pbuf = {}
while true do while true do
local target = getnearestunplaced(buf, pbuf, cx,cy,cz,clayer, dimensions["x"],dimensions["z"]) local target = getnearestunplaced(buf, pbuf, cx,cy,cz,clayer, dimensions["x"],dimensions["z"], direction)
if not target then break end if not target then break end
render(buf, pbuf, cx,cy,cz, target[1],target[2], dimensions["x"],dimensions["z"], setlists[clayer]) render(buf, pbuf, cx,cy,cz, target[1],target[2], dimensions["x"],dimensions["z"], setlists[clayer])
@@ -505,7 +541,7 @@ local function printdes(buf, dimensions)
end end
end end
while true do while true do
local target = getnearestunplaced(cbuf, pbuf, cx,0,cz,0, dimensions["x"],dimensions["z"]) local target = getnearestunplaced(cbuf, pbuf, cx,0,cz,0, dimensions["x"],dimensions["z"], direction)
if not target then break end if not target then break end
render(cbuf, pbuf, cx,0,cz, target[1],target[2], dimensions["x"],dimensions["z"], {1}) render(cbuf, pbuf, cx,0,cz, target[1],target[2], dimensions["x"],dimensions["z"], {1})
@@ -525,11 +561,266 @@ local function printdes(buf, dimensions)
center(direction) center(direction)
end end
-- vertical stack printing
local function VP_movetoy(y, target)
while y > target do
move("down", true)
y = y - 1
end
while y < target do
move("up", true)
y = y + 1
end
return target
end
local function VP_moveto(x,z, cx,cz,direction)
local y = 0
--[[
y lanes for directions:
1: +x
2: -x
3: +z
4: -z
]]--
while x ~= cx do
if cx < x then -- x
center(direction)
direction = 0
y = VP_movetoy(y, 1)
cx = cx + 1
move("forward", true)
end
if cx > x then
center(direction)
direction = 0
y = VP_movetoy(y, 2)
cx = cx - 1
move("back", true)
end
end
while z ~= cz do
if z > cz then -- z
if center(direction, 1) then move("right") end
y = VP_movetoy(y, 3)
cz = cz + 1
move("forward", true)
direction = 1
end
if z < cz then
if center(direction, -1) then move("left") end
y = VP_movetoy(y, 4)
cz = cz - 1
move("forward", true)
direction = -1
end
end
VP_movetoy(y, 0)
return cx,cz,direction
end
local function VP_optimizestack(target)
-- go from bottom to top and erase false entries until we encounter a true one.
while #target > 0 do
if target[1] then break else
table.remove(target, 1)
end
end
return target
end
local function VP_createstack(buf, dimensions)
local fout = {
["height"] = dimensions["y"]*(4)+1,
["dimensions"] = dimensions,
}
local out = {}
for x=1,dimensions["x"],1 do
for z=1,dimensions["z"],1 do
local tempbuf = {}
for y=1,dimensions["y"],1 do -- for each y dimension
local placecode = buf[posasstring(x,y,z)]
for layer=1,3,1 do -- layers
table.insert(tempbuf, needstobeplaced(placecode, layer))
end
-- ceiling
table.insert(tempbuf, buf[posasstring(x,y,z)] ~= 2)
end
VP_optimizestack(tempbuf)
if #tempbuf > 0 then
out[posasstring(x,z)] = tempbuf
end
end
end
fout["stacks"] = out
return fout
end
local function VP_lengthofdict(target)
local out = 0
for _,v in pairs(target) do out = out + 1 end
return out
end
local function VP_splitstack(_stack, x)
local stack = _stack["stacks"]
local height = _stack["height"]
local stacks = {}
local spliteverx = math.floor(VP_lengthofdict(stack)/x)
local ind = 0
local buf = {}
for i,v in pairs(stack) do
if ind == spliteverx then
ind = 0
table.insert(stacks, buf)
buf = {}
end
buf[i] = v
ind = ind + 1
end
if VP_lengthofdict(buf) > 0 then table.insert(stacks, buf) end
local out = {
height=height,
stacks={}
}
for _,v in pairs(stacks) do
table.insert(out["stacks"],v)
end
return out
end
--[[local function VP_inspectsplitted(stacks, dimensions) -- I will probably never finish this.
local currentselected = 1
while true do
reset() -- render
local _,y = term.getSize()
term.setCursorPos(1,y)
term.setcol(colors.yellow, colors.black)
term.write("Currentlayer: ")
term.write(tostring(currentselected))
local event = table.pack(os.pullEvent())
if event[1] == "key" then
end
end
end]]
local function VP_printstack(buf, dimensions, cx,cy,cz,direction)
reset()
move("up")
for _=1,buf["height"]-cy,1 do
move("up")
end
local ox,oz = cx,cz
cx,cz,direction = VP_moveto(cx+1,cz, cx,cz,direction)
for x=1,dimensions["x"],1 do
for z=1,dimensions["z"],1 do
local tempbuf = buf["stacks"][posasstring(x,z)]
if tempbuf then
cx,cz,direction = VP_moveto(x,z, cx,cz,direction)
for _=1,#tempbuf+1,1 do
move("down", true)
end
for _,v in pairs(tempbuf) do
if v then
place("down")
end
move("up", true)
end
move("up", true)
end
end
end
VP_moveto(ox,oz, cx,cz,direction)
for _=1,buf["height"]+1,1 do
move("down")
end
center(direction)
return cx,cz,direction
end
local function VP_calccost(stacks, height,sx,sz) -- calculate needed blocks
local cost = 0
for cx=1,sx,1 do
for cz=1,sz,1 do
local tempbuf = stacks[posasstring(cx,cz)]
if tempbuf then
for ind=1,height,1 do
if tempbuf[ind] then cost = cost + 1 end
end
end
end
end
return cost
end
local function VP_selectpos(design,dimensions,msg, cx,cz)
cx,cz = cx or 0, cz or 0
local camx,camz = cx,cz
while true do
render(design,{}, camx,1,camz, camx,camz, dimensions["x"],dimensions["z"], {1,4})
term.setCursorPos(1,1)
term.write(msg)
local _,y = term.getSize()
term.setCursorPos(1,y)
term.write("x: ")
term.write(tostring(camx))
term.write(" z: ")
term.write(tostring(camz))
local _,key = os.pullEvent("key")
key = keys.getName(key)
if key == "w" then
camz = camz - 1
end
if key == "s" then
camz = camz + 1
end
if key == "a" then
camx = camx - 1
end
if key == "d" then
camx = camx + 1
end
if key == "enter" then
break
end
end
return camx,camz
end
local function expwarn()
reset()
term.write("This mode is experimental! Be cautious!")
incline()
term.write("Enter to continue.")
read("")
end
local function randomstr(length)
local possible = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
local out = ""
for _=1,length,1 do
local ind = math.random(#possible)
out = out .. string.sub(possible, ind, ind)
end
return out
end
while true do while true do
integritycheck() integritycheck()
local action = selopt({ local action = selopt({
"New Design", "New Design",
"Print Design" "Print Design",
"VPrint Design",
"Join VPrint",
"Update",
}, "Select Action") }, "Select Action")
if action == 1 then if action == 1 then
@@ -564,5 +855,150 @@ while true do
end end
end end
end end
if action == 3 then
--expwarn()
peripheral.find("modem", rednet.open)
reset()
for _,v in pairs(fs.list("designs")) do
term.write(v)
incline()
end
write("Enter name: ")
local name = read()
if not fs.exists("designs/"..name) or name == "" then
printError("Design not found!")
else
local buf,dimensions = load(name)
local stacks = VP_createstack(buf, dimensions)
local height = stacks["height"]
print("Stacks created.")
local code = randomstr(5)
print("Pair code: '"..code.."'")
write("Enter amount of partaking turtles: ")
local expam = tonumber(read())
write("Press enter to send pair request.")
read("")
rednet.broadcast({
code=code,
}, "HB_vprint_pair")
print("Sent. awaiting pair accepts.")
local accepted = {}
while #accepted < expam do
local id,msg = rednet.receive("HB_vprint_pairespond")
if msg["code"] == code then
table.insert(accepted, id)
reset()
term.write(tostring(#accepted).."/"..tostring(expam))
end
end
reset()
print("Paired. Splitting stacks and sending out...")
local even = (VP_lengthofdict(stacks["stacks"])%(#accepted+1)) == 0
if even then even = #accepted+1 else even = #accepted end
stacks = VP_splitstack(stacks, even)
if #stacks["stacks"] ~= #accepted and (#stacks["stacks"] ~= #accepted+1) then
printError("Internal error with VP_splitstack. It returned "..#stacks["stacks"].." stacks.")
return
end
for i,v in pairs(accepted) do
reset()
print("ID "..tostring(v).." needs "..VP_calccost(stacks["stacks"][i], stacks["height"],dimensions["x"],dimensions["z"]).." blocks.")
print("Please ensure that turtle has that many blocks and press enter to continue.")
read("")
rednet.send(v, {
stack=stacks["stacks"][i],
dimensions=dimensions,
height=height
}, "HB_vprint_pairacknowledge")
end
print("This turtle needs "..tostring(VP_calccost(stacks["stacks"][expam+1], stacks["height"],dimensions["x"],dimensions["z"])).." blocks.")
print("Please ensure that turtle has that many blocks and press enter to continue.")
read("")
local x,y = 0,0
for _,v in pairs(accepted) do
x,y = VP_selectpos(buf,dimensions,"Select position of turtle "..tostring(v), x,y)
rednet.send(v, {
cx=x,
cz=y,
}, "HB_vprint_pairpossend")
end
reset()
write("Ready to begin, press enter to continue")
read("")
print("Sending begin signal.")
for _,v in pairs(accepted) do
rednet.send(v, {}, "HB_vprint_begin")
end
local ownstack = {
stacks=stacks["stacks"][expam+1],
dimensions=dimensions,
height=height
}
VP_printstack(ownstack,dimensions, 0,0,1,0)
end
end
if action == 4 then
--expwarn()
peripheral.find("modem", rednet.open)
reset()
term.write("Enter the code: ")
local code = read()
local masterid = 0
local buf = {}
local dimensions = {}
local height = 0
local cx,cz = 0,0
while true do -- await pairing request and respond
local id,request = rednet.receive("HB_vprint_pair")
if request["code"] == code then
masterid = id
print("Detected master: "..tostring(masterid))
print("Responding...")
rednet.send(masterid, {
code=code,
}, "HB_vprint_pairespond")
print("Waiting for response... ID: "..tostring(os.getComputerID()))
local id,msg = -1,{}
repeat
id,msg = rednet.receive("HB_vprint_pairacknowledge")
until id == masterid
buf = msg["stack"]
dimensions = msg["dimensions"]
height = msg["height"]
break
end
end
print("Received stacks and dimensions. ID: "..tostring(os.getComputerID()))
local id,msg = -1,"" -- wait until we get our current position
repeat
id,msg = rednet.receive("HB_vprint_pairpossend")
until id == masterid
cx,cz = msg["cx"],msg["cz"]
repeat -- wait until we can begin
id = rednet.receive("HB_vprint_begin")
until id == masterid
local ownstack = {
stacks=buf,
dimensions=dimensions,
height=height
}
VP_printstack(ownstack,dimensions, cx,0,cz,0)
end
if action == 5 then
shell.run("rm", "main.lua")
shell.run("wget", url)
return
end
end end