From 2290bdde954c7809d0f022a0b517763119383435 Mon Sep 17 00:00:00 2001 From: masterdraco Date: Wed, 30 Sep 2026 17:55:10 +0200 Subject: [PATCH] =?UTF-8?q?fix(k=C3=A6de):=20'G=C3=A5rd'=20ved=20slutprodu?= =?UTF-8?q?kter=20g=C3=A5rden=20selv=20bruger;=20S=C3=A6lg/Behold=20kun=20?= =?UTF-8?q?ved=20salgbare=20(v1.61.7.0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + FS25_ADSmartPickup/adChain.lua | 11 ++++++++++- FS25_ADSmartPickup/adChainView.lua | 11 +++++++---- FS25_ADSmartPickup/l10n/l10n_da.xml | 1 + FS25_ADSmartPickup/l10n/l10n_en.xml | 1 + FS25_ADSmartPickup/modDesc.xml | 2 +- 6 files changed, 21 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1c7599..7632176 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.7** Kædelinjen viser *Gård* (uden klik) ved slutprodukter, gården selv bruger (fx ensilage, TMR, roesnitter), og *Sælg*/*Behold* kun ved varer, der faktisk kan sælges straks. - **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. diff --git a/FS25_ADSmartPickup/adChain.lua b/FS25_ADSmartPickup/adChain.lua index 091e980..c088784 100644 --- a/FS25_ADSmartPickup/adChain.lua +++ b/FS25_ADSmartPickup/adChain.lua @@ -382,7 +382,8 @@ function ADChain.evaluate(adEnv, act) for key in pairs(state.paused) do paused[key] = true end ADChain.last = {chain = result.chain, shortages = result.shortages, actions = result.actions, edges = result.edges, missingFlows = ADChainActions.missingFlows(result.edges, runs), flowStatus = ADChain.flowStatus(result.edges, runs, ADChain.noVehicle), - paused = paused, userOff = copySet(state.userOff), finalKeep = copySet(state.finalKeep or {}), data = data, fields = data.fields, fieldsIncomplete = data.fieldsIncomplete == true, titles = data.fillTitles, at = ADChain.now, switchCount = ADChain.switchCount, + paused = paused, userOff = copySet(state.userOff), finalKeep = copySet(state.finalKeep or {}), + sellable = ADChain.sellableRoots(data, result, runs), data = data, fields = data.fields, fieldsIncomplete = data.fieldsIncomplete == true, titles = data.fillTitles, at = ADChain.now, switchCount = ADChain.switchCount, dependency = dependency} return ADChain.last end @@ -495,6 +496,14 @@ function ADChain.dismiss(fieldId) return true end +-- Rødder med et slutprodukt der kan sælges straks (gården bruger det ikke selv). -> {[rodnøgle] = true} +function ADChain.sellableRoots(data, result, runs) + local set = {} + local ok, sales = pcall(ADChainActions.finalSales, result.chain, data.recipes, result.edges, {}, ADChainActions.farmUses(data, runs)) + for _, sale in ipairs(ok and sales or {}) do set[sale.key] = true end + return set +end + -- Slutprodukt for en kæde: keep = true -> "Behold", ellers "Sælg straks" (standard). Anvendes ved næste tick. function ADChain.setFinalKeep(rootKey, keep) if rootKey == nil then return end diff --git a/FS25_ADSmartPickup/adChainView.lua b/FS25_ADSmartPickup/adChainView.lua index b819d6c..1c2b6ef 100644 --- a/FS25_ADSmartPickup/adChainView.lua +++ b/FS25_ADSmartPickup/adChainView.lua @@ -20,7 +20,7 @@ ADChainView.TEXT_ROW_CHARS = 70 -- "stramt": lager for en mark-afgrøde under så mange måneders behov -> gul ADChainView.TIGHT_MONTHS = 3 -- nøgler rækkerne bruger (til l10n-testen) -ADChainView.TEXT_KEYS = {"spu_chain_finalSell", "spu_chain_finalKeep", "spu_chain_suggestHeader", "spu_chain_empty", "spu_chain_approve", "spu_chain_dismiss", "spu_chain_auto", +ADChainView.TEXT_KEYS = {"spu_chain_finalFarm", "spu_chain_finalSell", "spu_chain_finalKeep", "spu_chain_suggestHeader", "spu_chain_empty", "spu_chain_approve", "spu_chain_dismiss", "spu_chain_auto", "spu_chain_flowOk", "spu_chain_flowMissing", "spu_chain_flowPallet", "spu_chain_flowNone", "spu_chain_flowStopped", "spu_chain_bottleneck", "spu_chain_buy", "spu_chain_cycle", "spu_chain_fieldShort", "spu_chain_tight", "spu_chain_noField", "spu_chain_buySource", "spu_chain_fromFields", "spu_chain_pause", "spu_chain_resume", "spu_chain_scanning", "spu_chain_rootOk", "spu_chain_rootError", "spu_chain_rootWaiting", @@ -314,11 +314,14 @@ local function rootRows(rows, root, last, ctx, isExpanded) if #suggestions > 0 then status = string.format(ctx.textOf("spu_chain_rootSummary"), status, #suggestions) end local marker = (#(root.children or {}) > 0) and (isExpanded and "– " or "+ ") or "" -- slutproduktet: "Sælg straks" (standard) eller "Behold" — klik på feltet skifter + -- varer gården selv bruger (last.sellable uden roden) sælges aldrig: "Gård" uden klik local keep = (last.finalKeep or {})[root.key] == true + local sellable = last.sellable == nil or last.sellable[root.key] == true + local finalText = not sellable and "spu_chain_finalFarm" or (keep and "spu_chain_finalKeep" or "spu_chain_finalSell") + local actions = {[5] = {kind = paused and "resume" or "pause", rootKey = root.key}} + if sellable then actions[3] = {kind = "finalMode", rootKey = root.key, keep = not keep} end table.insert(rows, makeRow("root", 0, level, {marker .. ctx.titleOf(root.name), tostring(root.buildingName or ""), - ctx.textOf(keep and "spu_chain_finalKeep" or "spu_chain_finalSell"), status, - ctx.textOf(paused and "spu_chain_resume" or "spu_chain_pause")}, - {[3] = {kind = "finalMode", rootKey = root.key, keep = not keep}, [5] = {kind = paused and "resume" or "pause", rootKey = root.key}}, root.key)) + ctx.textOf(finalText), status, ctx.textOf(paused and "spu_chain_resume" or "spu_chain_pause")}, actions, root.key)) if not isExpanded then return end local shown, problems, told = {}, {}, {} for _, problem in ipairs((last.chain or {}).problems or {}) do diff --git a/FS25_ADSmartPickup/l10n/l10n_da.xml b/FS25_ADSmartPickup/l10n/l10n_da.xml index 94680c6..ebe8232 100644 --- a/FS25_ADSmartPickup/l10n/l10n_da.xml +++ b/FS25_ADSmartPickup/l10n/l10n_da.xml @@ -579,6 +579,7 @@ + diff --git a/FS25_ADSmartPickup/l10n/l10n_en.xml b/FS25_ADSmartPickup/l10n/l10n_en.xml index 299333a..3900f5d 100644 --- a/FS25_ADSmartPickup/l10n/l10n_en.xml +++ b/FS25_ADSmartPickup/l10n/l10n_en.xml @@ -579,6 +579,7 @@ + diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index c5a83b9..89becf9 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.61.6.0 + 1.61.7.0 <en>AD Smart Pickup</en>