diff --git a/CHANGELOG.md b/CHANGELOG.md index 7647126..e1c7599 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ står i [docs/BRUGERMANUAL.md](docs/BRUGERMANUAL.md) (dansk) og [docs/USER_MANUA ## 1.61 — Produktionskæder +- **1.61.6** Slutprodukter sælges kun straks, hvis gården ikke selv bruger varen (stald, tændt produktion, forbrug eller flow). Varer kæden allerede havde sat til salg, sættes automatisk tilbage til *Behold*, når de ikke længere må sælges (in-game: TMR og roesnitter blev sat til salg). - **1.61.5** Redskaber bredere end Courseplays 50 m (Unrealistic kan sættes til op til 120 m) afvises ikke længere: de bruges, og kursusbredden sættes til 50 m, før Courseplay laver kurset. Markflåden viser *kursus 50 m* ved dem. - **1.61.4** Kæder mere realistiske: **ét kædeflow pr. bygning** med alle bygningens manglende varer (før ét pr. vare og bygning); nye varer lægges i bygningens eksisterende kædeflow, og tidligere tomme kædeflows (uden traktor) til samme bygning lægges sammen. **Slutprodukter sælges straks** som standard (fabrikkens udgang sættes til *Sælg direkte*); feltet *Sælg*/*Behold* på kædelinjen skifter, og *Behold* sætter varer, kæden selv satte til salg, tilbage. I Flows-listen foldes kædeflows uden traktor sammen i én linje. En såmaskine med gødningstank (fx Kinze 4905) bruges kun til såning, ikke som gødningsspreder. - **1.61.3** Fanen **Kæder** sorteret: forslag til ny afgrøde står samlet øverst, én gang pr. mark og efter marknummer (før gentaget under hver kæde, der bruger afgrøden); kæderne står efter status (mangel/fejl, venter, dækket), så bygning og produkt. Kædelinjen viser stadig "· N forslag". diff --git a/FS25_ADSmartPickup/adChainActions.lua b/FS25_ADSmartPickup/adChainActions.lua index 0dbd55d..e16a896 100644 --- a/FS25_ADSmartPickup/adChainActions.lua +++ b/FS25_ADSmartPickup/adChainActions.lua @@ -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 diff --git a/FS25_ADSmartPickup/adChainRun.lua b/FS25_ADSmartPickup/adChainRun.lua index 1665fc2..e8d5870 100644 --- a/FS25_ADSmartPickup/adChainRun.lua +++ b/FS25_ADSmartPickup/adChainRun.lua @@ -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 diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index 71a5f93..c5a83b9 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.61.5.0 + 1.61.6.0 <en>AD Smart Pickup</en>