feat: kæder respekterer fabrikkens udgang (Fordel = intet flow, Sælg på mellemvare -> Behold)
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user