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) washer_pos = vector.new(3,0,-4) 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") connectTank(fluid.name) pumpToDevices(true) sleep(10) pumpToDevices(false) goTo(spout_pos, "south") takeDepot() fluidInvAdd(fluid.name, -fluid.count) pumpToTanks(true) goTo(spout_pos, "south") goUp() goUp() 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, true) 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 turtle.dropUp(1) pFront("pullItems", "top", 1, 64, 1) for _,item in pairs(extra_items) do item_count = item_count + item.count selectItem(item.name) turtle.dropUp(item.count) pFront("pullItems", "top", 1, 64, 1) end wait_time = 10 * item_count -- TODO refuel sleep(wait_time) pFront("pushItems", "top", 3) turtle.suckUp() end function press(_) goTo(press_pos, "south") insertDepot(1) sleep(1) takeDepot() end function compact(extra_items, product, yield) silly_temp = mixer_pos mixer_pos = compactor_pos mix(extra_items, product, yield) mixer_pos = silly_temp end function make_water(_,_,yield) selectFluidDevice("water_source") connectTank("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") for _, fluid in pairs(parts) do connectTank(fluid.name) pumpToDevices(true) goTo(mixer_pos, "south") -- TODO wait for 1B or tank content is in the mixer sleep(5) pumpToDevices(false) end goTo(mixer_pos, "south") -- TODO wait for alloy to be done sleep(10) created_amount = 0 for _, fluid in pairs(pFront("tanks")) do if fluid.amount > 0 then connectTankOrAssign(stripModname(fluid.name)) pumpToTanks(true) sleep(10) pumpToTanks(false) if stripModname(fluid.name) == product then fluidInvAdd(product, fluid.amount) created_amount = fluid.amount end end end for _, fluid in pairs(parts) do fluidInvAdd(fluid.name, -created_amount) end 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") connectTank(fluids[1].name) pumpToDevices(true) sleep(8) pumpToDevices(false) end if isFluid[product] then selectFluidDevice("mixer") end -- mix goTo(mixer_pos, "south") insertForward(1, 1) for _, item in pairs(extra_items) do selectItem(item.name) insertForward(nil, item.count) end -- todo update the mixer somehow? -- wait until ingredients are gone repeat sleep(1) contents = pFront("list") inputs_remaining = false for i = 1,9 do if contents[i] then inputs_remaining = true break end end until not inputs_remaining if product == "still_milk" then repeat is_done = false for _,t in pairs(pFront("tanks")) do if stripModname(t.name) == "still_milk" then is_done = t.amount >= yield break end end until is_done end for i = 10, 18 do takeForward(i) end -- empty fluids tanks = pFront("tanks") for _,tank in pairs(tanks) do if tank.amount > 0 then connectTankOrAssign(stripModname(tank.name)) pumpToTanks(true) sleep(8) pumpToTanks(false) end end fluidInvAdd(product, yield) 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 function wash(_, product) goTo(washer_pos, "east") insertDepot(1) repeat is_done = false for _,item in pairs(pFront("items")) do if stripModname(item.name) == product then is_done = true end end until is_done takeDepot() 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, wash = wash, }