trainworld_computercraft/computer/13/machines.lua
2025-05-28 02:37:55 +02:00

371 lines
7.6 KiB
Lua

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)
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
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()
print("unimplemented :3")
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,
}