require("inventory") require("pathfinding") require("fluids") sfx = require("sfx") press_pos = vector.new(1,0,0) deployer_pos = vector.new(2,0,0) furnace_pos = vector.new(4,2,0) saw_pos = vector.new(3,1,0) saw_out_pos = vector.new(2,0,0) mill_pos = vector.new(4,0,0) mixer_pos = vector.new(-1,0,0) compactor_pos = vector.new(-2,0,0) spout_pos = vector.new(-3,0,0) melter_pos = vector.new(-4,1,-3) casting_table_pos = vector.new(-3,0,-3) function spout(extra_items) local fluid = extra_items[1] if not fluid then error("no fluid specified") end goTo(spout_pos, "south") insertDepot(1) selectFluidDevice("spout") connectTanks({fluid.name}) pumpToDevices(true) sleep(10) pumpToDevices(false) goTo(spout_pos, "south") takeDepot() fluidInvAdd(fluid.name, -fluid.count) pumpToTanks(true) goTo(spout_pos, "south") while #pFront("tanks")[1].amount > 0 do sleep(0.5) end pumpToTanks(false) end function saw(_) goTo(saw_pos, "south") turtle.drop() goTo(saw_out_pos, "south") takeDepot() end function mill(extra_items) goTo(mill_pos,"south") item_count = 0 if turtle.getItemCount() ~= 0 then item_count = 1 end insertForward(1, 1) for _,item in pairs(extra_items) do item_count = item_count + item.count selectItem(item.name) insertForward(1, item.count) end print(item_count,"items") while pFront("getItemDetail", 1) do sleep(0.1) end for i = 2, 10 do takeForward(i) end end function deploy(extra_items) -- extra_items should only be one item goTo(deployer_pos, "south") insertDepot(1) goUp() goUp() selectItem(extra_items[1].name) turtle.dropUp(1) pFront("pullItem", "top") goDown() goDown() takeDepot() end function deploy_tool(extra_items) -- extra_items should only be one item goTo(deployer_pos, "south") insertDepot(1) goUp() goUp() selectItem(extra_items[1].name) turtle.dropUp(1) pFront("pullItem", "top") goDown() goDown() takeDepot() goUp() goUp() pFront("pushItem", "top") turtle.suckUp() end function furnace(extra_items) goTo(furnace_pos, "south") item_count = 0 if turtle.getItemCount() ~= 0 then item_count = 1 end insertForward(1, 1) for _,item in pairs(extra_items) do item_count = item_count + item.count selectItem(item.name) insertForward(1, item.count) end wait_time = 10 * item_count -- TODO refuel sleep(wait_time) takeForward(3) end function press(_) goTo(press_pos, "south") insertDepot(1) sleep(1) takeDepot() end function compact(extra_items) printError("unimplemented :3") sfx.fail() end function make_water(_,_,yield) selectFluidDevice("water_source") connectTanks({"water"}) pumpToTanks(true) print("waiting 30s for water tanks to fill") sleep(30) pumpToTanks(false) fluidInvAdd("water", yield) end function alloy(parts, product) for _, item in pairs(parts) do if not isFluid[item.name] then error(item.name .. " is not a known fluid, but was used in alloy") end end selectFluidDevice("mixer") connectTanks(parts) pumpToDevices(true) goTo(mixer_pos, "south") -- TODO --[[ wait until at least one input fluid is used up if two remain, it needs to keep track of which tank gets what when draining ]] -- while true do -- end pumpToDevices(false) end function melt(_, product, yield) goTo(melter_pos, "north") goUp() turtle.drop() selectFluidDevice("melter") connectTankOrAssign(product) pumpToTanks(true) goTo(melter_pos, "north") while #pFront("items") > 0 do sleep(1) end pumpToTanks(false) fluidInvAdd(product, yield) end function mix(extra_items, product, yield) -- prepare fluids local fluids = {} for index, item in pairs(extra_items) do if isFluid[item.name] then table.insert(fluids, item) extra_items[index] = nil end end if #fluids > 0 then print("mixing with fluids", fluids[1]) selectFluidDevice("mixer") connectTanks({fluids[1].name}) pumpToDevices(true) sleep(10) pumpToDevices(false) end -- print("aaa") -- read() -- mix goTo(mixer_pos, "south") insertForward(1, 1) for _, item in pairs(extra_items) do selectItem(item.name) insertForward(nil, item.count) end goUp() goUp() goDown() goDown() sleep(10) -- todo wait until ingredients are gone takeForward(10) -- todo empty fluids end function craft(extra_items) local slot = 0 for _, item in pairs(extra_items) do slot = slot + 1 if slot == 4 then slot = 5 elseif slot == 8 then slot = 9 end if item.name ~= "nil" then turtle.select(slot) takeItems(item.name, item.count) end end turtle.craft() end return { mill = mill, deploy = deploy, deploy_tool = deploy_tool, furnace = furnace, press = press, compact = compact, mix = mix, craft = craft, alloy = alloy, melt = melt, saw = saw, spout = spout, make_water = make_water, }