Files
fs25-adsmartpickup/FS25_ADSmartPickup/adStorageStats.lua
T
masterdraco cc35b157bd feat(oversigt): Start/Stop alle flows + klik på flow hopper til redigering; palleskure viser paller af pladser (v1.20.0.0)
- ADRunsController.startAllRuns/stopAllRuns/hasActiveRuns (kørende flows røres ikke ved Start alle)
- Oversigt: knapsæt Start alle / Stop alle / Nyt run, samlet status, klikbare rækker (hop via update)
- Palleskur-statistik: kapacitet = (egne + ledige pladser) x indhold; 24/4000 paller 1 % i stedet for 600 %
- Manualer da/en opdateret
2026-09-25 21:03:30 +02:00

111 lines
4.4 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 nettoforbrug.
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
-- palleskure: fyldning i paller af pladser (kapaciteten er et antal pladser, ikke liter)
local percent = capacity > 0 and math.floor(100 * level / capacity + 0.5) or nil
if item.count ~= nil and (item.slots or 0) > 0 then
percent = math.floor(100 * item.count / item.slots + 0.5)
end
return {
fillType = item.fillType,
level = level,
capacity = capacity,
count = item.count,
slots = item.slots,
percent = percent,
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,
-- døgn til tom ved gårdens NETTO-forbrug; produktion ≥ forbrug = beholdningen stiger
days = consumption > production and (farmTotal or level) / (consumption - production) or nil,
rising = consumption > 0 and production >= consumption,
}
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
-- Bygninger af én type (fanerne Fabrikker/Siloer/Stalde/Palleskure); rækkefølgen bevares.
function ADStorageStats.filterKind(inventory, kind)
local result = {}
for _, entry in ipairs(inventory or {}) do
if entry.kind == kind then table.insert(result, entry) end
end
return result
end