feat: kæder respekterer fabrikkens udgang (Fordel = intet flow, Sælg på mellemvare -> Behold)

This commit is contained in:
2026-09-30 22:01:42 +02:00
parent 21b48d7664
commit 1bda82a270
9 changed files with 120 additions and 14 deletions
+60 -4
View File
@@ -17,14 +17,53 @@ end
local SUPPLIED = {production = true, husbandry = true, field = true}
function ADChainActions.edges(chain)
local list, seen = {}, {}
-- Hvordan varen når frem, ud fra producenternes udgang: "auto" = alle fordeler (spillet leverer selv til gårdens
-- fabrikker; kædens forbrugere er altid fabrikker) -> intet flow; "sold" = en producent sælger mellemvaren væk;
-- ellers "haul" (Behold: spawn/lager ved fabrikken, eller stald/mark) -> et flow henter. recipesByKey = {[nøgle] = opskrift}.
function ADChainActions.delivery(edge, recipesByKey)
local producers = edge.producers or {}
if #producers == 0 or recipesByKey == nil then return "haul" end
local all, sold = true, false
for _, key in ipairs(producers) do
local mode = ADChainActions.producerMode(recipesByKey, key, edge.fillType)
if mode == "sell" then sold = true end
if mode ~= "distribute" then all = false end
end
if sold then return "sold" end
return all and "auto" or "haul"
end
function ADChainActions.producerMode(recipesByKey, key, fillType)
local recipe = (recipesByKey or {})[key]
return recipe ~= nil and (recipe.outputModes or {})[fillType] or nil
end
local function producerKeys(node)
local keys = {}
for _, producer in ipairs(node.producers or {}) do table.insert(keys, producer.key) end
return keys
end
-- recipes (valgfri): gårdens opskrifter med outputModes -> kanten får delivery (se ADChainActions.delivery).
function ADChainActions.edges(chain, recipes)
local list, seen, byKey = {}, {}, nil
if recipes ~= nil then
byKey = {}
for _, recipe in ipairs(recipes) do byKey[recipe.key] = recipe end
end
local function walk(nodes, rootKey)
for _, node in ipairs(nodes or {}) do
local id = tostring(node.consumer) .. "|" .. tostring(node.fillType)
if SUPPLIED[node.source] and node.consumer ~= nil and not seen[id] then
seen[id] = true
table.insert(list, {fillType = node.fillType, consumer = node.consumer, consumerName = node.consumerName, rootKey = rootKey})
local edge = {fillType = node.fillType, consumer = node.consumer, consumerName = node.consumerName, rootKey = rootKey,
producers = producerKeys(node)}
edge.delivery = ADChainActions.delivery(edge, byKey)
edge.soldBy = {}
for _, key in ipairs(edge.producers) do
if ADChainActions.producerMode(byKey, key, edge.fillType) == "sell" then table.insert(edge.soldBy, key) end
end
table.insert(list, edge)
end
walk(node.children, rootKey)
end
@@ -51,7 +90,24 @@ end
function ADChainActions.missingFlows(edges, runs)
local list = {}
for _, edge in ipairs(edges or {}) do
if not ADChainActions.isCovered(edge, runs) then table.insert(list, edge) end
if edge.delivery ~= "auto" and not ADChainActions.isCovered(edge, runs) then table.insert(list, edge) end
end
return list
end
-- Mellemvarer en producent sælger væk (kanten er "sold") -> {{key, fillType}} én gang hver; kæden sætter dem til Behold.
function ADChainActions.soldIntermediates(edges)
local list, seen = {}, {}
for _, edge in ipairs(edges or {}) do
if edge.delivery == "sold" then
for _, key in ipairs(edge.soldBy or {}) do
local id = key .. "|" .. edge.fillType
if not seen[id] then
seen[id] = true
table.insert(list, {key = key, fillType = edge.fillType})
end
end
end
end
return list
end