fix(kæde): slutprodukter gården selv bruger sælges aldrig straks; tidligere salg sættes tilbage (v1.61.6.0)

This commit is contained in:
2026-09-30 17:53:56 +02:00
parent e1f7b19fef
commit 0c21ba49a0
4 changed files with 31 additions and 7 deletions
+25 -4
View File
@@ -123,9 +123,30 @@ function ADChainActions.mergeIdle(runs)
return merges
end
-- Slutprodukter der skal sælges straks: aktive rødders udgange, som ikke selv er en kant i kæden (mellemvare).
-- keep = {[rodnøgle] = true} for rødder spilleren har sat til "Behold". -> {{key, fillType}}
function ADChainActions.finalSales(chain, recipes, edges, keep)
-- Varer gården selv bruger: stalde æder dem, en tændt produktion bruger dem, gården har forbrug af dem, eller et
-- flow (ikke udkørsel) kører dem. -> {[vare] = true}. Den slags sælges aldrig straks (in-game 30/9: TMR og roesnitter).
function ADChainActions.farmUses(data, runs)
local uses = {}
for name in pairs((data or {}).barnFood or {}) do uses[name] = true end
for name, rate in pairs((data or {}).rates or {}) do
if (rate.consumption or 0) > 0 then uses[name] = true end
end
for _, recipe in ipairs((data or {}).recipes or {}) do
if recipe.enabled then
for name in pairs(recipe.inputs or {}) do uses[name] = true end
end
end
for _, run in ipairs(runs or {}) do
if run.kind ~= "outbound" and run.ingredientMode == "manual" then
for _, name in ipairs(run.ingredients or {}) do uses[name] = true end
end
end
return uses
end
-- Slutprodukter der skal sælges straks: aktive rødders udgange, som ikke selv er en kant i kæden (mellemvare) og
-- som gården ikke selv bruger (farmUses). keep = {[rodnøgle] = true} for rødder sat til "Behold". -> {{key, fillType}}
function ADChainActions.finalSales(chain, recipes, edges, keep, farmUses)
local intermediate, byKey, list = {}, {}, {}
for _, edge in ipairs(edges or {}) do intermediate[edge.fillType] = true end
for _, recipe in ipairs(recipes or {}) do byKey[recipe.key] = recipe end
@@ -136,7 +157,7 @@ function ADChainActions.finalSales(chain, recipes, edges, keep)
for name in pairs(recipe.outputs or {}) do table.insert(names, name) end
table.sort(names)
for _, name in ipairs(names) do
if not intermediate[name] then table.insert(list, {key = root.key, fillType = name}) end
if not intermediate[name] and not (farmUses or {})[name] then table.insert(list, {key = root.key, fillType = name}) end
end
end
end
+4 -2
View File
@@ -251,7 +251,8 @@ function ADChainRun.applyFinalSales(data, chain, edges)
if ProductionPoint == nil or ProductionPoint.OUTPUT_MODE == nil then return 0 end
local state, changed = ADChain.state, 0
local wanted = {}
for _, sale in ipairs(ADChainActions.finalSales(chain, data.recipes, edges, state.finalKeep)) do
local uses = ADChainActions.farmUses(data, ADChain.runsView(ADRunsController.store.runs))
for _, sale in ipairs(ADChainActions.finalSales(chain, data.recipes, edges, state.finalKeep, uses)) do
local id = sale.key .. "|" .. sale.fillType
wanted[id] = true
local entry, fillIndex = (data.points or {})[sale.key], data.fillIndex[sale.fillType]
@@ -265,7 +266,8 @@ function ADChainRun.applyFinalSales(data, chain, edges)
end
for id in pairs(state.soldByChain) do
local key, fillType = id:match("^(.*)|([^|]+)$")
if key ~= nil and state.finalKeep[key] and not wanted[id] then
-- sat til salg af kæden, men ikke længere ønsket (Behold, gården bruger varen, kæden væk): tilbage til Behold
if key ~= nil and not wanted[id] then
local entry, fillIndex = (data.points or {})[key], data.fillIndex[fillType]
if entry ~= nil and entry.point ~= nil and fillIndex ~= nil
and outputMode(entry.point, fillIndex) == ProductionPoint.OUTPUT_MODE.DIRECT_SELL then
+1 -1
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<modDesc descVersion="107">
<author>masterdraco</author>
<version>1.61.5.0</version>
<version>1.61.6.0</version>
<title>
<en>AD Smart Pickup</en>
</title>