113 lines
3.4 KiB
Lua
113 lines
3.4 KiB
Lua
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
|