FluidContainers/Fluid.lua

113 lines
3.4 KiB
Lua
Raw Permalink Normal View History

2018-10-01 16:12:32 +00:00
local Fluid
do
local _class_0
local _base_0 = {
update = function(self, dt)
local leak = 0
local _list_0 = self.breaches
for _index_0 = 1, #_list_0 do
local breach = _list_0[_index_0]
local rate = (self.pressure - breach.pressure) * (breach.size / self.volume) * dt
leak = leak + rate
breach.pressure = breach.pressure + (rate * (self.volume / breach.volume))
if breach.pressure < 0 then
breach.pressure = 0
end
local amount = breach.pressure * breach.volume
local modifier = 1 - self.volume * rate / amount
for item, percentage in pairs(breach.contents) do
breach.contents[item] = percentage * modifier
end
for item, percentage in pairs(self.contents) do
percentage = (self.volume * rate * percentage) / amount
if breach.contents[item] then
breach.contents[item] = breach.contents[item] + percentage
else
breach.contents[item] = percentage
end
end
end
self.pressure = self.pressure - leak
for i = 1, #self.breaches do
if self.breaches[i].pressure > self.pressure then
local other = table.remove(self.breaches, i)
other:breach(self, other.size)
i = i - 1
end
end
end,
amount = function(self, key)
if key then
if self.contents[key] then
return self.volume * self.pressure * self.contents[key]
else
return 0
end
else
return self.volume * self.pressure
end
end,
remove = function(self, key, amount)
if amount == nil then
amount = 1
end
local total = self:amount(key)
if total >= amount then
local percentage = amount / total
self.contents[key] = self.contents[key] - (self.contents[key] * percentage)
percentage = amount / self:amount()
self.pressure = self.pressure - (self.pressure * percentage)
for item, p in pairs(self.contents) do
self.contents[item] = self.contents[item] + (p * percentage)
end
return true
else
return false
end
end,
breach = function(self, other, size)
if other.pressure > self.pressure then
return other:breach(self, size)
else
other.size = size or 1
return table.insert(self.breaches, other)
end
end,
print = function(self)
print("Volume", self.volume, "Pressure", self.pressure, "#", self:amount())
local percentage, amount = 0, 0
for k, v in pairs(self.contents) do
local x = self:amount(k)
print(k, v, x)
percentage = percentage + v
amount = amount + x
end
return print("", "Total:", percentage, amount)
end
}
_base_0.__index = _base_0
_class_0 = setmetatable({
__init = function(self, opts)
if opts == nil then
opts = { }
end
self.volume = opts.volume or 1
self.pressure = opts.pressure or 1
self.contents = opts.contents or { }
self.breaches = { }
end,
__base = _base_0,
__name = "Fluid"
}, {
__index = _base_0,
__call = function(cls, ...)
local _self_0 = setmetatable({}, _base_0)
cls.__init(_self_0, ...)
return _self_0
end
})
_base_0.__class = _class_0
Fluid = _class_0
return _class_0
end