From 9e34a16dfa879c7bbd5c2c823af7e54d5e983740 Mon Sep 17 00:00:00 2001 From: masterdraco Date: Wed, 30 Sep 2026 14:26:09 +0200 Subject: [PATCH] =?UTF-8?q?fix(k=C3=A6de):=20h=C3=B8jst=203=20forslag=20pr?= =?UTF-8?q?.=20afgr=C3=B8de=20og=20=C3=A9t=20samlet=20k=C3=A6depunkt=20i?= =?UTF-8?q?=20Kr=C3=A6ver=20handling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FS25_ADSmartPickup/adCropPlan.lua | 24 +++++++++++++++---- FS25_ADSmartPickup/adStorageStats.lua | 21 +++++++--------- .../gui/SmartPickupStorageView.lua | 4 ++-- FS25_ADSmartPickup/l10n/l10n_da.xml | 2 +- FS25_ADSmartPickup/l10n/l10n_en.xml | 2 +- 5 files changed, 31 insertions(+), 22 deletions(-) diff --git a/FS25_ADSmartPickup/adCropPlan.lua b/FS25_ADSmartPickup/adCropPlan.lua index fc81616..43651e0 100644 --- a/FS25_ADSmartPickup/adCropPlan.lua +++ b/FS25_ADSmartPickup/adCropPlan.lua @@ -6,6 +6,8 @@ ADCropPlan = {} ADCropPlan.HORIZON_MONTHS = 12 ADCropPlan.MIN_SHARE = 0.10 ADCropPlan.MIN_HA = 0.5 +-- højst så mange forslag (ikke auto-skift) pr. afgrøde, så listen ikke vokser til snesevis af rækker +ADCropPlan.MAX_SUGGEST_PER_FRUIT = 3 function ADCropPlan.plannedFruit(field) if field.targetFruit ~= nil and field.targetFruit ~= "" then return field.targetFruit end @@ -43,16 +45,24 @@ local function isCandidate(field, used, dismissedFruit, fruit) return dismissedFruit ~= fruit end +-- prices: {[afgrøde] = pris} eller en funktion afgrøde -> pris (slås kun op for kandidaternes afgrøder). function ADCropPlan.choose(shortages, fields, usedFruits, yields, prices, dismissed) local actions, taken = {}, {} local used = usedFruits or {} + local priceOf = type(prices) == "function" and prices or function(fruit) return (prices or {})[fruit] or 0 end + local priceCache = {} + local function valueOf(fruit) + if fruit == "" then return 0 end + if priceCache[fruit] == nil then priceCache[fruit] = ((yields or {})[fruit] or 0) * (priceOf(fruit) or 0) end + return priceCache[fruit] + end for _, shortage in ipairs(shortages or {}) do local remaining = shortage.missingHa local candidates = {} for _, field in ipairs(fields or {}) do if not taken[field.id] and isCandidate(field, used, (dismissed or {})[field.id], shortage.fruit) then local planned = ADCropPlan.plannedFruit(field) or "" - local value = ((yields or {})[planned] or 0) * ((prices or {})[planned] or 0) + local value = valueOf(planned) table.insert(candidates, {field = field, value = value}) end end @@ -62,14 +72,18 @@ function ADCropPlan.choose(shortages, fields, usedFruits, yields, prices, dismis if da ~= db then return da < db end return a.field.id < b.field.id end) + local suggested = 0 for _, candidate in ipairs(candidates) do if remaining <= 0 then break end local field = candidate.field local auto = field.chainFree == true and field.targetSource ~= "user" - table.insert(actions, {fieldId = field.id, from = ADCropPlan.plannedFruit(field) or "", to = shortage.fruit, - hectares = field.areaHa or 0, reason = shortage.fruit, mode = auto and "auto" or "suggest"}) - taken[field.id] = true - remaining = remaining - (field.areaHa or 0) + if auto or suggested < ADCropPlan.MAX_SUGGEST_PER_FRUIT then + table.insert(actions, {fieldId = field.id, from = ADCropPlan.plannedFruit(field) or "", to = shortage.fruit, + hectares = field.areaHa or 0, reason = shortage.fruit, mode = auto and "auto" or "suggest"}) + taken[field.id] = true + remaining = remaining - (field.areaHa or 0) + if not auto then suggested = suggested + 1 end + end end end return actions diff --git a/FS25_ADSmartPickup/adStorageStats.lua b/FS25_ADSmartPickup/adStorageStats.lua index 522a6c4..ce12f44 100644 --- a/FS25_ADSmartPickup/adStorageStats.lua +++ b/FS25_ADSmartPickup/adStorageStats.lua @@ -276,23 +276,18 @@ function ADStorageStats.rankAttention(list, max) return result end --- "Kræver handling" fra kæden (ADChain.last): ét gult punkt pr. afgrødeforslag spilleren skal tage stilling til. --- Rangeres over "sælg nu" (score < 1000) og under røde punkter (>= 3000). -ADStorageStats.CHAIN_SCORE = 1000 +-- "Kræver handling" fra kæden (ADChain.last): ÉT gult punkt "Kæde: N forslag" (klik -> fanen Kæder), så +-- forslagene ikke fylder listen. Rangeres under alle røde punkter (>= 3000), øverst blandt de gule, over "sælg nu". +ADStorageStats.CHAIN_SCORE = 2000 function ADStorageStats.chainEntries(last) - local entries = {} - local titles = last ~= nil and last.titles or {} - local function title(name) return tostring((titles or {})[name] or name) end + local count = 0 for _, action in ipairs(last ~= nil and last.actions or {}) do - if action.mode == "suggest" then - local from = (action.from ~= nil and action.from ~= "") and title(action.from) or "-" - table.insert(entries, {kind = "chainSuggest", level = "yellow", score = ADStorageStats.CHAIN_SCORE, fieldId = action.fieldId, - from = from, to = title(action.to), hectares = action.hectares, - text = string.format("F%s %s → %s", tostring(action.fieldId), from, title(action.to))}) - end + if action.mode == "suggest" then count = count + 1 end end - return entries + if count == 0 then return {} end + return {{kind = "chainSuggest", level = "yellow", score = ADStorageStats.CHAIN_SCORE, count = count, + text = string.format("Kæde: %d", count)}} end -- Varepunkterne (allerede rangeret) + kædens punkter, samme loft. diff --git a/FS25_ADSmartPickup/gui/SmartPickupStorageView.lua b/FS25_ADSmartPickup/gui/SmartPickupStorageView.lua index 8bcf4c1..37ae26c 100644 --- a/FS25_ADSmartPickup/gui/SmartPickupStorageView.lua +++ b/FS25_ADSmartPickup/gui/SmartPickupStorageView.lua @@ -183,7 +183,7 @@ function SmartPickupFrame:addKpiRow(stats) return row end --- Varepunkterne + kædens afgrødeforslag (ADChain.last; ingen evaluering her), samme loft MAX_ATTENTION. +-- Varepunkterne + ét samlet punkt for kædens afgrødeforslag (ADChain.last; ingen evaluering her), samme loft MAX_ATTENTION. function SmartPickupFrame:attentionFor(stats) local attention = ADStorageStats.attentionList(stats, SmartPickupFrame.MAX_ATTENTION) if ADChain == nil or ADChain.last == nil then return attention end @@ -193,7 +193,7 @@ end function SmartPickupFrame:alertText(entry) local stat, fc, i18n = entry.stat, SmartPickupFrame.formatCompact, self.i18n if entry.kind == "chainSuggest" then - return string.format(i18n:getText("spu_attention_chainSuggest"), entry.fieldId or 0, tostring(entry.from), tostring(entry.to)) + return string.format(i18n:getText("spu_attention_chainSuggests"), entry.count or 0) end if entry.kind == "empty" then return string.format(i18n:getText("spu_alert_empty"), stat.title, self:formatDays(stat.days), fc(stat.farmLevel or 0), fc(math.abs(stat.net or 0))) diff --git a/FS25_ADSmartPickup/l10n/l10n_da.xml b/FS25_ADSmartPickup/l10n/l10n_da.xml index 840833c..2a7f6eb 100644 --- a/FS25_ADSmartPickup/l10n/l10n_da.xml +++ b/FS25_ADSmartPickup/l10n/l10n_da.xml @@ -607,7 +607,7 @@ - + diff --git a/FS25_ADSmartPickup/l10n/l10n_en.xml b/FS25_ADSmartPickup/l10n/l10n_en.xml index 56754d8..0a593e0 100644 --- a/FS25_ADSmartPickup/l10n/l10n_en.xml +++ b/FS25_ADSmartPickup/l10n/l10n_en.xml @@ -607,7 +607,7 @@ - +