-- https://git.l--n.de/justuswolff/cc_housebuild/raw/branch/main/src/main.lua if not _G["turtle"] then error("This program only runs on turtles!") end local turtle = _G["turtle"] print("House building system") print("JUFS Technologies (c) 2026 (Justus Wolff)") print("fuel: "..tostring(turtle.getFuelLevel()).."/"..tostring(turtle.getFuelLimit())) function term.setcol(fc, bc) term.setTextColor(fc) term.setBackgroundColor(bc) end local function reset() term.setcol(colors.white, colors.black) term.clear() term.setCursorPos(1,1) end local function incline() local _,y = term.getCursorPos() term.setCursorPos(1,y+1) end local function selopt(options, title) local selected = 1 while true do reset() term.setcol(colors.black, colors.white) term.write(title) for i,v in pairs(options) do incline() if i == selected then term.setcol(colors.black, colors.blue) else term.setcol(colors.white, colors.black) end term.write(v) end local event,key = os.pullEvent("key") if keys.getName(key) == "w" and selected ~= 1 then selected = selected - 1 end if keys.getName(key) == "s" and selected ~= #options then selected = selected + 1 end if keys.getName(key) == "enter" then return selected end end end local function integritycheck() if not fs.exists("designs") then fs.makeDir("designs") end end local function posasstring(...) local positions = {...} local out = "" for _,v in pairs(positions) do out = out .. tostring(v) .. ":" end return out end local function newdesign() local buf = {} local dimensions = { x = 8, z = 8, y = 1 } local currentfloor = 1 local camx,camy = 0,0 while true do -- render buf reset() for x=1+camx,dimensions["x"]+camx,1 do for z=1+camy,dimensions["z"]+camy,1 do local currentbuf = buf[posasstring(x, currentfloor, z)] term.setCursorPos(x, z) if currentbuf then term.blit(" ", colors.toBlit(colors.white), colors.toBlit(colors.white)) else term.blit("\127", colors.toBlit(colors.gray), colors.toBlit(colors.black)) end end end term.setcol(colors.yellow, colors.black) local _,y = term.getSize() term.setCursorPos(1,y) term.write("Press Ctrl for menu.") -- user input local event = table.pack(os.pullEvent()) if event[1] == "mouse_click" or event[1] == "mouse_drag" then event[3] = event[3]+camx event[4] = event[4]+camy if event[3] <= dimensions["x"] and event[4] <= dimensions["z"] then if event[2] == 1 then -- left button, set buf[posasstring(event[3], currentfloor, event[4])] = true end if event[2] == 2 then -- right button, erase buf[posasstring(event[3], currentfloor, event[4])] = false end end end if event[1] == "key" then if keys.getName(event[2]) == "leftCtrl" then -- menu local action = selopt({ "Save", "Load", "Exit", "Change X size", "Change floor amount", "Change Z size" }, "menu") if action == 3 then return end -- exit if action == 1 then -- save reset() for _,v in pairs(fs.list("designs")) do term.write(v) incline() end write("Enter name: ") local name = read() local file = fs.open("designs/"..name, "w") file.write(textutils.serialiseJSON({ ["dimensions"] = dimensions, ["buf"] = buf })) file.close() end if action == 2 then -- load 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 file = fs.open("designs/"..name, "r") local content = file.readAll() file.close() content = textutils.unserialiseJSON(content) dimensions = content["dimensions"] buf = content["buf"] end end if action == 4 then -- change X size reset() write("Enter new X size: ") local xsize = tonumber(read()) dimensions["x"] = xsize end if action == 5 then -- change floor amount reset() write("Enter new floor amount: ") local ysize = tonumber(read()) dimensions["y"] = ysize end if action == 6 then -- change Z size reset() write("Enter new Z size: ") local zsize = tonumber(read()) dimensions["z"] = zsize end end if keys.getName(event[2]) == "q" and currentfloor < dimensions["y"] then -- go up currentfloor = currentfloor + 1 end if keys.getName(event[2]) == "e" and currentfloor > 1 then -- go down currentfloor = currentfloor - 1 end if keys.getName(event[2]) == "w" and camy < dimensions["z"] then -- pan up camy = camy + 1 end if keys.getName(event[2]) == "s" and camy > 0 then -- pan down camy = camy - 1 end if keys.getName(event[2]) == "a" and camx < dimensions["x"] then -- pan left camx = camx + 1 end if keys.getName(event[2]) == "d" and camx > 0 then -- pan right camx = camx - 1 end end end end while true do integritycheck() local action = selopt({ "New Design", "Print Design" }, "Select Action") if action == 1 then newdesign() end end