require("pathfinding") pretty = require("cc.pretty") pp = pretty.pretty_print() isFluid = { water = true, lava = true, milk = true, blood = true, molten_rose_gold = true, molten_copper = true, molten_gold = true, molten_bronze = true, molten_tin = true, molten_zinc = true, compound_mixture = true, } fluidDevicePos = { trash = vector.new(2, 0, -1), water_source = vector.new(0, 0, -1), mixer = vector.new(-1, 0, -1), compactor = vector.new(-2, 0, -1), spout = vector.new(-3, 0, -1), melter = vector.new(-4, 0, -1), } tankPos = { vector.new(4, 0, -3), vector.new(3, 0, -3), vector.new(2, 0, -3), vector.new(1, 0, -3), vector.new(0, 0, -3), vector.new(-1, 0, -3), vector.new(-2, 0, -3), vector.new(-3, 0, -3), vector.new(-4, 0, -3), } function setRedRouter(state) peripheral.call("bottom", "setOutput", "bottom", state) peripheral.call("bottom", "setOutput", "front", state) end function loadFluidInventory() return require("fluid_state") end function saveFluids() fs.delete("fluid_state.lua") repeat file = fs.open("fluid_state.lua", "w") until file file.write("return ") file.write(textutils.serialise(_G.fluidTanks)) file.close() end function getFluidAmount(type) for index, tank in pairs(_G.fluidTanks) do if tank.name == type then return tank.amount end end return 0 end function pumpToDevices(enable) goTo(vector.new(4, 0, -1)) -- clutches invert the signal setRedRouter(not enable) end function pumpToTanks(enable) goTo(vector.new(3, 0, -1)) -- clutches invert the signal setRedRouter(not enable) end function resetAllFluidDevices() pumpToDevices(false) pumpToTanks(false) -- for name, pos in pairs(fluidDevicePos) do -- goTo(pos) -- setRedRouter(false) -- end for x = 2, -4, -1 do goTo(vector.new(x, 0, -1)) setRedRouter(false) end for x = -4, 4 do goTo(vector.new(x, 0, -3)) setRedRouter(false) end _G.activeFluidDevice = nil for i = 1, 9 do _G.fluidTanks[i].connected = false end end function selectFluidDevice(name) if fluidDevicePos[name] == nil then error("selectFluidDevice(" .. name .. "); not a known fluid device", 2) end if _G.activeFluidDevice ~= nil then goTo(fluidDevicePos[_G.activeFluidDevice]) _G.activeFluidDevice = nil setRedRouter(false) end goTo(fluidDevicePos[name]) setRedRouter(true) _G.activeFluidDevice = name end function connectTankOrAssign(fluid) local has_fluid = false for index, tank in pairs(_G.fluidTanks) do if tank.name == fluid then has_fluid = true print(fluid, "already assigned to", index) end end if not has_fluid then print(fluid, "not in tanks, assigning new") for index = 1, 9 do if _G.fluidTanks[index].name == nil or _G.fluidTanks[index].amount == 0 then _G.fluidTanks[index] = { name = fluid, amount = 0, connected = false } print("assigned tank", index, "to", fluid) break end end end connectTanks({ fluid }) end function connectTanks(fluid_list) print("connecting tanks") pp(fluid_list) for index, tank in pairs(_G.fluidTanks) do should_be_connected = false for _, fluid in pairs(fluid_list) do if tank.name == fluid then should_be_connected = true break end end if should_be_connected ~= tank.connected then print("setting", tank.name, index, "to", should_be_connected) goTo(tankPos[index]) setRedRouter(should_be_connected) _G.fluidTanks[index].connected = should_be_connected end end end function fluidInvAdd(name, amount) print("added", amount, "to", name) for index, tank in pairs(_G.fluidTanks) do if tank.name == name then tank.amount = tank.amount + amount -- TODO limit capacity end end saveFluids() end _G.fluidTanks = _G.fluidTanks or loadFluidInventory()