fluid things

This commit is contained in:
Crispy 2025-05-25 03:02:48 +02:00
parent 7694798ad0
commit ad6af0fa35
21 changed files with 608 additions and 183 deletions

172
computer/13/fluids.lua Normal file
View file

@ -0,0 +1,172 @@
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()