fix(kæde): stald-mangel forklares rigtigt og beskeder nævner kæden

Køb af en rest efter gårdens stalde giver nu spu_chain_problem_barn (køb resten
eller flere dyr) i stedet for 'byg en fabrik'. Engangsbeskeden får kædens navn
foran, så to kæder der mangler samme vare kan skelnes.
This commit is contained in:
2026-09-30 14:42:53 +02:00
parent 19a10ab67c
commit 131b1ad10c
7 changed files with 21 additions and 6 deletions
+1 -1
View File
@@ -8,7 +8,7 @@ står i [docs/BRUGERMANUAL.md](docs/BRUGERMANUAL.md) (dansk) og [docs/USER_MANUA
## 1.61 — Produktionskæder ## 1.61 — Produktionskæder
- **1.61.0** Produktionskæder: slå et produkt til i en fabrik, og moden holder det kørende helt tilbage til marken. Kæden regner baglæns gennem dine egne fabrikker og stalde til afgrøderne og ser 12 måneder frem. Ny fane **Kæder** med træ pr. rod-produktion, farvet status, fold ud/ind og **[Pause]**/**[Start]**. Marker markeret **Fri til kæden** skifter afgrøde automatisk (højst 2 i minuttet); andre marker får forslag med **[Godkend]**/**[Afvis]** (højst 3 pr. afgrøde) i fanen og som ét samlet punkt i **Kræver handling**. En afgrøde, du selv har valgt, ændres aldrig. Mellemled tændes og slukkes kun igen, hvis kæden tændte dem. Flows **Kæde: <vare> → <bygning>** oprettes med en ledig pool-traktor og tipvogn (ellers stoppet: *mangler traktor/vogn*; paller altid stoppet) og stoppes, ikke slettes, når kæden slås fra. Dine egne tændte produktioner bruges som kilde først; slukker du en produktion, tænder kæden den ikke igen, før du tænder en ny. Stoppede kædeflows slippes af kæden. Ingen handlinger de første 2 minutter, ingen markskift før alle marker er scannet, og intet slukkes ved delvise læsefejl. Begrænsninger: intet køb, ingen dyrekøb, flerårige afgrøder og græsmarker skiftes aldrig, grundudbytte uden gødningsbonus. **Vigtigt:** hver produktion, du tænder i en fabrik, prøver moden at forsyne — tænd kun det, du vil have produceret; sluk produktionen eller tryk [Pause] for at stoppe kæden. Manglende led forklares i klart sprog med råd (*Ingen af dine fabrikker laver Mel — byg en eller køb*, *Mølle kan kun lave 800 af 1.0k/md*, *… er slukket af dig*, *Kredsløb omkring …*): som rød tekst under varen i fanen Kæder, som én rød linje pr. kæde i **Kræver handling** (højst 2; klik åbner kæden foldet ud) og som engangsbesked, når et nyt led mangler (ikke i opstartsfristen eller mens markerne scannes). Manual og ordliste opdateret. - **1.61.0** Produktionskæder: slå et produkt til i en fabrik, og moden holder det kørende helt tilbage til marken. Kæden regner baglæns gennem dine egne fabrikker og stalde til afgrøderne og ser 12 måneder frem. Ny fane **Kæder** med træ pr. rod-produktion, farvet status, fold ud/ind og **[Pause]**/**[Start]**. Marker markeret **Fri til kæden** skifter afgrøde automatisk (højst 2 i minuttet); andre marker får forslag med **[Godkend]**/**[Afvis]** (højst 3 pr. afgrøde) i fanen og som ét samlet punkt i **Kræver handling**. En afgrøde, du selv har valgt, ændres aldrig. Mellemled tændes og slukkes kun igen, hvis kæden tændte dem. Flows **Kæde: <vare> → <bygning>** oprettes med en ledig pool-traktor og tipvogn (ellers stoppet: *mangler traktor/vogn*; paller altid stoppet) og stoppes, ikke slettes, når kæden slås fra. Dine egne tændte produktioner bruges som kilde først; slukker du en produktion, tænder kæden den ikke igen, før du tænder en ny. Stoppede kædeflows slippes af kæden. Ingen handlinger de første 2 minutter, ingen markskift før alle marker er scannet, og intet slukkes ved delvise læsefejl. Begrænsninger: intet køb, ingen dyrekøb, flerårige afgrøder og græsmarker skiftes aldrig, grundudbytte uden gødningsbonus. **Vigtigt:** hver produktion, du tænder i en fabrik, prøver moden at forsyne — tænd kun det, du vil have produceret; sluk produktionen eller tryk [Pause] for at stoppe kæden. Manglende led forklares i klart sprog med råd (*Ingen af dine fabrikker laver Mel — byg en eller køb*, *Mølle kan kun lave 800 af 1.0k/md*, *Dine stalde leverer ikke nok Mælk …*, *… er slukket af dig*, *Kredsløb omkring …*): som rød tekst under varen i fanen Kæder, som én rød linje pr. kæde i **Kræver handling** (højst 2; klik åbner kæden foldet ud) og som engangsbesked med kædens navn foran, når et nyt led mangler (ikke i opstartsfristen eller mens markerne scannes). Manual og ordliste opdateret.
## 1.60 — "Kræver handling" → flow, menuplacering, flow-vogne i guiden ## 1.60 — "Kræver handling" → flow, menuplacering, flow-vogne i guiden
+6 -1
View File
@@ -365,8 +365,13 @@ function ADChain.notifyProblems(last)
if #fresh == 0 or ADFieldJobs == nil or ADFieldJobs.notify == nil then return 0 end if #fresh == 0 or ADFieldJobs == nil or ADFieldJobs.notify == nil then return 0 end
local textOf = function(key) return g_i18n ~= nil and g_i18n:getText(key) or key end local textOf = function(key) return g_i18n ~= nil and g_i18n:getText(key) or key end
local fmt = SmartPickupFrame ~= nil and SmartPickupFrame.formatCompact or nil local fmt = SmartPickupFrame ~= nil and SmartPickupFrame.formatCompact or nil
local rootNames = {}
for _, root in ipairs(last.chain ~= nil and last.chain.roots or {}) do
rootNames[root.key] = tostring((last.titles or {})[root.name] or root.name)
end
for _, problem in ipairs(fresh) do for _, problem in ipairs(fresh) do
local text = ADChainView.problemText(problem, last, textOf, nil, fmt) -- kædens navn foran, så to kæder der mangler samme vare kan skelnes
local text = tostring(rootNames[problem.rootKey] or problem.rootKey) .. ": " .. ADChainView.problemText(problem, last, textOf, nil, fmt)
Logging.info(ADChain.LOG_PREFIX .. "manglende led: %s", text) Logging.info(ADChain.LOG_PREFIX .. "manglende led: %s", text)
ADFieldJobs.notify(text, true) ADFieldJobs.notify(text, true)
end end
+8 -2
View File
@@ -26,7 +26,7 @@ ADChainView.TEXT_KEYS = {"spu_chain_empty", "spu_chain_approve", "spu_chain_dism
"spu_chain_pause", "spu_chain_resume", "spu_chain_scanning", "spu_chain_rootOk", "spu_chain_rootError", "spu_chain_rootWaiting", "spu_chain_pause", "spu_chain_resume", "spu_chain_scanning", "spu_chain_rootOk", "spu_chain_rootError", "spu_chain_rootWaiting",
"spu_chain_rootPaused", "spu_chain_rootSummary", "spu_chain_free", "spu_chain_switches", "spu_chain_gone", "spu_chain_col_item", "spu_chain_rootPaused", "spu_chain_rootSummary", "spu_chain_free", "spu_chain_switches", "spu_chain_gone", "spu_chain_col_item",
"spu_chain_col_source", "spu_chain_col_perMonth", "spu_chain_col_status", "spu_chain_col_stock", "spu_chain_col_source", "spu_chain_col_perMonth", "spu_chain_col_status", "spu_chain_col_stock",
"spu_chain_problem_buy", "spu_chain_problem_bottleneck", "spu_chain_problem_off", "spu_chain_problem_cycle"} "spu_chain_problem_buy", "spu_chain_problem_bottleneck", "spu_chain_problem_off", "spu_chain_problem_cycle", "spu_chain_problem_barn"}
local FLOW_KEYS = {ok = "spu_chain_flowOk", missing = "spu_chain_flowNone", stopped = "spu_chain_flowStopped", noVehicle = "spu_chain_flowMissing", local FLOW_KEYS = {ok = "spu_chain_flowOk", missing = "spu_chain_flowNone", stopped = "spu_chain_flowStopped", noVehicle = "spu_chain_flowMissing",
pallet = "spu_chain_flowPallet"} pallet = "spu_chain_flowPallet"}
@@ -148,7 +148,7 @@ local function producersOf(last, fillType)
end end
-- Årsag i klart sprog med råd for et problem fra kædemodellen ({kind="buy"|"bottleneck"|"cycle", fillType, rootKey, -- Årsag i klart sprog med råd for et problem fra kædemodellen ({kind="buy"|"bottleneck"|"cycle", fillType, rootKey,
-- detail = manglende l/md, need = behov l/md}). En producent spilleren selv har slukket (last.userOff, stadig -- detail = manglende l/md, need = behov l/md}). Køb af en rest efter gårdens stalde -> stald-tekst. En producent spilleren selv har slukket (last.userOff, stadig
-- slukket) slår igennem som "slukket af dig" — det er den reelle årsag, uanset om modellen så køb eller flaskehals. -- slukket) slår igennem som "slukket af dig" — det er den reelle årsag, uanset om modellen så køb eller flaskehals.
function ADChainView.problemText(problem, last, textOf, titleOf, fmt) function ADChainView.problemText(problem, last, textOf, titleOf, fmt)
last, textOf, fmt = last or {}, textOf or identity, fmt or ADChainView.compact last, textOf, fmt = last or {}, textOf or identity, fmt or ADChainView.compact
@@ -171,6 +171,12 @@ function ADChainView.problemText(problem, last, textOf, titleOf, fmt)
local made = math.max(0, need - (problem.detail or 0)) local made = math.max(0, need - (problem.detail or 0))
return string.format(textOf("spu_chain_problem_bottleneck"), joinCapped(names), fmt(math.floor(made + 0.5)), fmt(math.floor(need + 0.5))) return string.format(textOf("spu_chain_problem_bottleneck"), joinCapped(names), fmt(math.floor(made + 0.5)), fmt(math.floor(need + 0.5)))
end end
-- modellen melder også "køb" for resten, når gårdens stalde leverer for lidt: så er rådet ikke "byg en fabrik"
for _, herd in ipairs(last.data ~= nil and last.data.husbandry or {}) do
if ((herd.outputs or {})[problem.fillType] or 0) > 0 then
return string.format(textOf("spu_chain_problem_barn"), item)
end
end
return string.format(textOf("spu_chain_problem_buy"), item) return string.format(textOf("spu_chain_problem_buy"), item)
end end
+1
View File
@@ -611,6 +611,7 @@
<text name="spu_attention_chainSuggests" text="Kæde: %d forslag"/> <text name="spu_attention_chainSuggests" text="Kæde: %d forslag"/>
<text name="spu_attention_hintChain" text=" → klik: se Kæder"/> <text name="spu_attention_hintChain" text=" → klik: se Kæder"/>
<text name="spu_chain_problem_buy" text="Ingen af dine fabrikker laver %s — byg en eller køb"/> <text name="spu_chain_problem_buy" text="Ingen af dine fabrikker laver %s — byg en eller køb"/>
<text name="spu_chain_problem_barn" text="Dine stalde leverer ikke nok %s — køb resten eller flere dyr"/>
<text name="spu_chain_problem_bottleneck" text="%s kan kun lave %s af %s/md"/> <text name="spu_chain_problem_bottleneck" text="%s kan kun lave %s af %s/md"/>
<text name="spu_chain_problem_off" text="%s (%s) er slukket af dig — tænd den eller sæt kæden på pause"/> <text name="spu_chain_problem_off" text="%s (%s) er slukket af dig — tænd den eller sæt kæden på pause"/>
<text name="spu_chain_problem_cycle" text="Kredsløb omkring %s — kæden kan ikke beregnes"/> <text name="spu_chain_problem_cycle" text="Kredsløb omkring %s — kæden kan ikke beregnes"/>
+1
View File
@@ -611,6 +611,7 @@
<text name="spu_attention_chainSuggests" text="Chain: %d suggestions"/> <text name="spu_attention_chainSuggests" text="Chain: %d suggestions"/>
<text name="spu_attention_hintChain" text=" → click: see Chains"/> <text name="spu_attention_hintChain" text=" → click: see Chains"/>
<text name="spu_chain_problem_buy" text="None of your factories makes %s — build one or buy it"/> <text name="spu_chain_problem_buy" text="None of your factories makes %s — build one or buy it"/>
<text name="spu_chain_problem_barn" text="Barns make too little %s — buy the rest or more animals"/>
<text name="spu_chain_problem_bottleneck" text="%s can only make %s of %s/mo"/> <text name="spu_chain_problem_bottleneck" text="%s can only make %s of %s/mo"/>
<text name="spu_chain_problem_off" text="%s (%s) was turned off by you — turn it on or pause the chain"/> <text name="spu_chain_problem_off" text="%s (%s) was turned off by you — turn it on or pause the chain"/>
<text name="spu_chain_problem_cycle" text="Loop around %s — the chain cannot be calculated"/> <text name="spu_chain_problem_cycle" text="Loop around %s — the chain cannot be calculated"/>
+2 -1
View File
@@ -657,12 +657,13 @@ Mangler et led i en kæde, forklarer moden hvorfor og hvad du kan gøre. Teksten
- **I fanen Kæder**: fold kæden ud; under den røde vare står årsagen i rødt. - **I fanen Kæder**: fold kæden ud; under den røde vare står årsagen i rødt.
- **I Kræver handling**: én rød linje pr. kæde, fx *Brød mangler et led: Mel*. Der vises højst 2 kæder; resten - **I Kræver handling**: én rød linje pr. kæde, fx *Brød mangler et led: Mel*. Der vises højst 2 kæder; resten
står i fanen Kæder. Et klik åbner fanen Kæder med kæden foldet ud. står i fanen Kæder. Et klik åbner fanen Kæder med kæden foldet ud.
- **Som besked på skærmen**: første gang et nyt led mangler. Samme besked kommer først igen, når problemet har - **Som besked på skærmen**: første gang et nyt led mangler, med kædens navn foran (fx *Brød: …*). Samme besked kommer først igen, når problemet har
været væk og vender tilbage. De første 2 minutter efter indlæsning og mens markerne scannes, sendes ingen besked. været væk og vender tilbage. De første 2 minutter efter indlæsning og mens markerne scannes, sendes ingen besked.
Beskederne: Beskederne:
- *Ingen af dine fabrikker laver Mel — byg en eller køb*: ingen fabrik, stald eller mark leverer varen. - *Ingen af dine fabrikker laver Mel — byg en eller køb*: ingen fabrik, stald eller mark leverer varen.
- *Dine stalde leverer ikke nok Mælk — køb resten eller flere dyr*: stalden laver varen, men for lidt.
- *Mølle kan kun lave 800 af 1.0k/md*: fabrikken kan ikke følge med (flaskehals). - *Mølle kan kun lave 800 af 1.0k/md*: fabrikken kan ikke følge med (flaskehals).
- *Mølle (Mel) er slukket af dig — tænd den eller sæt kæden på pause*: du har selv slukket produktionen. - *Mølle (Mel) er slukket af dig — tænd den eller sæt kæden på pause*: du har selv slukket produktionen.
- *Kredsløb omkring Mel — kæden kan ikke beregnes*: varen bruges til at lave sig selv. - *Kredsløb omkring Mel — kæden kan ikke beregnes*: varen bruges til at lave sig selv.
+2 -1
View File
@@ -670,13 +670,14 @@ If a link in a chain is missing, the mod explains why and what you can do. The t
- **In the Chains tab**: fold the chain out; the reason is shown in red below the red goods row. - **In the Chains tab**: fold the chain out; the reason is shown in red below the red goods row.
- **In Needs attention**: one red line per chain, for example *Bread is missing a link: Flour*. At most 2 chains - **In Needs attention**: one red line per chain, for example *Bread is missing a link: Flour*. At most 2 chains
are shown; the rest are in the Chains tab. Clicking opens the Chains tab with that chain folded out. are shown; the rest are in the Chains tab. Clicking opens the Chains tab with that chain folded out.
- **As an on-screen message**: the first time a new link goes missing. The same message only returns after the - **As an on-screen message**: the first time a new link goes missing, with the chain's name in front (for example *Bread: …*). The same message only returns after the
problem has gone away and come back. No messages during the first 2 minutes after loading or while fields are problem has gone away and come back. No messages during the first 2 minutes after loading or while fields are
being scanned. being scanned.
The messages: The messages:
- *None of your factories makes Flour — build one or buy it*: no factory, barn or field supplies the goods. - *None of your factories makes Flour — build one or buy it*: no factory, barn or field supplies the goods.
- *Barns make too little Milk — buy the rest or more animals*: the barn makes the goods, but too little.
- *Mill can only make 800 of 1.0k/mo*: the factory cannot keep up (bottleneck). - *Mill can only make 800 of 1.0k/mo*: the factory cannot keep up (bottleneck).
- *Mill (Flour) was turned off by you — turn it on or pause the chain*: you switched the production off yourself. - *Mill (Flour) was turned off by you — turn it on or pause the chain*: you switched the production off yourself.
- *Loop around Flour — the chain cannot be calculated*: the goods are needed to make themselves. - *Loop around Flour — the chain cannot be calculated*: the goods are needed to make themselves.