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_pos = vector.new(-2, 1, -4) washer_pos = vector.new(3, 0, -4) growth_chamber_pos = vector.new(-3, 2, 0) rolling_mill_pos = vector.new(-3,0,0) 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(8) 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") -- wait for 1B or tank content is in the mixer expected_amount = math.min(getFluidAmount(fluid.name), 1000) print("waiting for", expected_amount, fluid.name, "in mixer") while getFluidAmountInTanks(fluid.name, pFront("tanks")) < expected_amount do sleep(0.1) end pumpToDevices(false) end goTo(mixer_pos, "south") -- wait for alloy to be done local is_done = false while not is_done do local mixer_tanks = pFront("tanks") for _, part in pairs(parts) do if getFluidAmountInTanks(part.name, mixer_tanks) == 0 then is_done = true end end end created_amount = 0 for _, fluid in pairs(pFront("tanks")) do if fluid.amount > 0 then connectTankOrAssign(stripModname(fluid.name)) pumpToTanks(true) goTo(mixer_pos, "south") while getFluidAmountInTanks(fluid.name, pFront("tanks")) > 0 do sleep(0.2) end 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 isFluid[product]then while getFluidAmountInTanks(product, pFront("tanks")) < yield do sleep(0.1) end 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) goTo(mixer_pos, "south") while getFluidAmountInTanks(stripModname(tank.name), pFront("tanks")) > 0 do sleep(0.1) end 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 function growth_chamber() goTo(growth_chamber_pos, "west") pTop("pushItem", "front") turtle.suck() end function cast_ingot(source, product, yield) fluid = source[1] if not isFluid[fluid.name] then error(fluid .. " is not a fluid") end connectTank(fluid) selectFluidDevice("melter") pumpToDevices(true) goTo(melter_pos, "north") repeat melter_tank = pFront("tanks")[1] local storage_emptied = melter_tank.amount >= getFluidAmount(fluid.name) local melter_full = melter_tank.amount >= melter_tank.capacity done_filling = storage_emptied or melter_full until done_filling pumpToDevices(false) local fluid_in_melter = melter_tank.amount local ingot_count = math.floor(fluid_in_melter / 111) local leftover = fluid_in_melter - ingot_count * 111.11 print("expecting", ingot_count, "ingots") goTo(casting_pos, "west") for i = 1, ingot_count do redstone.setOutput("front", true) sleep(0.1) redstone.setOutput("front", false) goDown() repeat sleep(0.1) until pFront("getItemDetail", 2) takeForward(2) goUp() end if leftover > 1 then pumpToTanks(true) sleep(5) pumpToTanks(false) end fluidInvAdd(fluid.name, -(ingot_count * 111)) end function rolling_mill(extra_items) goTo(rolling_mill_pos, "west") insertForward() sleep(1) takeForward(2) 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, cast_ingot = cast_ingot, rolling_mill = rolling_mill, growth_chamber = growth_chamber, }