93 lines
3.6 KiB
Lua
93 lines
3.6 KiB
Lua
-- AD Storage Stats
|
|
-- Rene beregninger (ingen spil-API) til fanen Lagre: pr. vare i en bygning fyldning, værdi nu og
|
|
-- ved årets toppris, gårdens samlede beholdning og hvor mange døgn den rækker ved gårdens forbrug.
|
|
|
|
ADStorageStats = {}
|
|
|
|
-- item = {fillType, level, capacity}; farmTotal = liter af varen på hele gården;
|
|
-- rate = {consumption, production} liter pr. døgn (eller nil); quote = {price, top} pr. liter (eller nil).
|
|
function ADStorageStats.itemStats(item, farmTotal, rate, quote)
|
|
local level = item.level or 0
|
|
local capacity = item.capacity or 0
|
|
local consumption = rate ~= nil and rate.consumption or 0
|
|
local production = rate ~= nil and rate.production or 0
|
|
return {
|
|
fillType = item.fillType,
|
|
level = level,
|
|
capacity = capacity,
|
|
percent = capacity > 0 and math.floor(100 * level / capacity + 0.5) or nil,
|
|
valueNow = quote ~= nil and quote.price ~= nil and math.floor(level * quote.price + 0.5) or nil,
|
|
valueTop = quote ~= nil and quote.top ~= nil and math.floor(level * quote.top + 0.5) or nil,
|
|
farmTotal = farmTotal or level,
|
|
consumption = consumption,
|
|
production = production,
|
|
net = production - consumption,
|
|
days = consumption > 0 and (farmTotal or level) / consumption or nil,
|
|
}
|
|
end
|
|
|
|
function ADStorageStats.buildingTotals(stats)
|
|
local now, top = 0, 0
|
|
for _, stat in ipairs(stats) do
|
|
now = now + (stat.valueNow or 0)
|
|
top = top + (stat.valueTop or 0)
|
|
end
|
|
return {valueNow = now, valueTop = top}
|
|
end
|
|
|
|
-- inventory = { {entries = {{fillType, level}}} } -> {[fillType] = liter}
|
|
function ADStorageStats.farmTotals(inventory)
|
|
local totals = {}
|
|
for _, building in ipairs(inventory or {}) do
|
|
for _, entry in ipairs(building.entries or {}) do
|
|
totals[entry.fillType] = (totals[entry.fillType] or 0) + (entry.level or 0)
|
|
end
|
|
end
|
|
return totals
|
|
end
|
|
|
|
-- Et stald-trug æder `perDay` liter i alt; fordel på fodertyperne efter hvad truget indeholder.
|
|
-- Tomt trug: alt på foderet med højest vægt (det der hentes først).
|
|
function ADStorageStats.splitTroughConsumption(perDay, levels, weights)
|
|
local total = 0
|
|
for _, level in pairs(levels or {}) do total = total + (level or 0) end
|
|
local result = {}
|
|
if total > 0 then
|
|
for fillType, level in pairs(levels) do
|
|
if (level or 0) > 0 then result[fillType] = perDay * level / total end
|
|
end
|
|
return result
|
|
end
|
|
local best, bestWeight = nil, -1
|
|
for fillType, weight in pairs(weights or {}) do
|
|
if weight > bestWeight or (weight == bestWeight and fillType < best) then best, bestWeight = fillType, weight end
|
|
end
|
|
if best ~= nil then result[best] = perDay end
|
|
return result
|
|
end
|
|
|
|
-- Deler en liste i rækker á `size` celler (gitter i fanen Lagre). Tom liste giver én tom række,
|
|
-- så bygningen stadig får sin navnerække.
|
|
function ADStorageStats.chunk(list, size)
|
|
local rows, current = {}, {}
|
|
for _, value in ipairs(list or {}) do
|
|
table.insert(current, value)
|
|
if #current == size then
|
|
table.insert(rows, current)
|
|
current = {}
|
|
end
|
|
end
|
|
if #current > 0 or #rows == 0 then
|
|
table.insert(rows, current)
|
|
end
|
|
return rows
|
|
end
|
|
|
|
-- "-14.4k +3.6k": forbrug med minus, produktion med plus pr. døgn; intet = "-".
|
|
function ADStorageStats.rateText(consumption, production, format)
|
|
local parts = {}
|
|
if (consumption or 0) > 0 then table.insert(parts, "-" .. format(consumption)) end
|
|
if (production or 0) > 0 then table.insert(parts, "+" .. format(production)) end
|
|
return #parts > 0 and table.concat(parts, " ") or "-"
|
|
end
|