docs(plan): marksilo-flow — 4 opgaver (planlægger, opsætning, spil-lag, fane)

This commit is contained in:
2026-09-27 10:39:48 +02:00
parent f93ae798e3
commit 8a0d7f2489
2 changed files with 1044 additions and 9 deletions
File diff suppressed because it is too large Load Diff
@@ -29,14 +29,16 @@ med højst x vogne ude ad gangen, og uden at tage vogne fra markarbejde, andre f
## Flowet ## Flowet
Ny run-type `fieldSilos` i `ADRuns.KINDS` (ved siden af `supply`/`outbound`). Højst ét marksilo-flow pr. savegame Marksilo-flowet er ÉN fast opsætning pr. savegame — ikke en ny run-type. Beslutning (2026-09-27, under
(GUI'et tilbyder ikke at oprette et til, når det findes). planlægning): run-editoren (`SmartPickupFrame`) er bygget til præcis to typer (forsyning/udkørsel) mange steder,
og runs har faste vogne, Start/Stop pr. vogn og Wait-puljer, som intet af det passer til lånte vogne. En egen
underfane + egen gemmefil giver langt færre indgreb i eksisterende kode.
Felter (gemmes i `ADSmartPickup_runs.xml` som de øvrige): Opsætning (`ADSmartPickup_fieldsilos.xml` i savegame-mappen, gemmes sammen med runs):
- `storeBuildings` — gårdlagre (bygnings-id'er → markører via den eksisterende `resolveMarkers`) - `enabled` — til/fra, standard fra
- `storeIds` — gårdlagre (bygnings-id'er fra `ADBuildings`, kun `kind == "silo"`)
- `maxVehicles` — x, 1–10, standard 2 - `maxVehicles` — x, 1–10, standard 2
- `minLiters` — tærskel pr. silo og vare, standard 10000 - `minLiters` — tærskel pr. silo og vare: 5000 / 10000 / 25000 / 50000, standard 10000
- `running` — til/fra (som de andre flows' Start/Stop)
## Planlægning (ren logik, nyt modul `adFieldSiloPlanner.lua`, testes med luajit) ## Planlægning (ren logik, nyt modul `adFieldSiloPlanner.lua`, testes med luajit)
@@ -61,7 +63,8 @@ Output: `{dispatch = {{vehicleId, siloId, siloMarkerId, fillType, storeMarkerId,
- **Takt:** planlæg hvert 60. s (spiltid via `dt`), kun når flowet kører. Lagertal læses som i dag - **Takt:** planlæg hvert 60. s (spiltid via `dt`), kun når flowet kører. Lagertal læses som i dag
(`ADSmartPickup.getStationLevelAndCapacity` / silo-lagre). (`ADSmartPickup.getStationLevelAndCapacity` / silo-lagre).
- **Ledige vogne:** `ADFieldWork.getRigs(adEnv)` filtreret til `enabled and not busy and not controlled`, og - **Ledige vogne:** `ADFieldWork.getRigs(adEnv)` filtreret til `role == "unloader"` (traktor + vogn, som Courseplay
godkender som tømmevogn — ikke sprøjter/høstere med tank), `enabled and not busy and not controlled`, og
vogne der har aflæsbare enheder (`AutoDrive.getAllDischargeableUnits`), der understøtter varen. vogne der har aflæsbare enheder (`AutoDrive.getAllDischargeableUnits`), der understøtter varen.
`getRigs.busy` udvides med `ADFieldSilos.isLoaned(vehicle)`, så markarbejdet ikke tager en lånt vogn `getRigs.busy` udvides med `ADFieldSilos.isLoaned(vehicle)`, så markarbejdet ikke tager en lånt vogn
(flows tager allerede kun deres egne tilknyttede vogne). (flows tager allerede kun deres egne tilknyttede vogne).
@@ -78,7 +81,7 @@ Output: `{dispatch = {{vehicleId, siloId, siloMarkerId, fillType, storeMarkerId,
## GUI ## GUI
Flow-fanen: typen "Marksiloer" kan oprettes (højst én). Indstillinger: gårdlagre (eksisterende vælger), Ny underfane "Marksiloer" efter "Måned". Indstillinger: gårdlagre (eksisterende vælger),
"Maks. vogne ude" (1–10), "Mindste mængde" (5.000 / 10.000 / 25.000 / 50.000 l), Start/Stop. "Maks. vogne ude" (1–10), "Mindste mængde" (5.000 / 10.000 / 25.000 / 50.000 l), Start/Stop.
Status: `x/y vogne ude · n siloer venter`, og én række pr. marksilo med indhold: silo, vare, liter, på vej, Status: `x/y vogne ude · n siloer venter`, og én række pr. marksilo med indhold: silo, vare, liter, på vej,
status (`ok` / `mangler markør` / `ingen gård tager <vare>`). Tekster i `l10n_da` + `l10n_en` (`spu_fs_*`). status (`ok` / `mangler markør` / `ingen gård tager <vare>`). Tekster i `l10n_da` + `l10n_en` (`spu_fs_*`).
@@ -94,6 +97,6 @@ status (`ok` / `mangler markør` / `ingen gård tager <vare>`). Tekster i `l10n_
- `tests/test_adFieldSiloPlanner.lua`: kvalificering (tærskel, markør, gård tager varen), fuldeste først, - `tests/test_adFieldSiloPlanner.lua`: kvalificering (tærskel, markør, gård tager varen), fuldeste først,
x-loft inkl. aktive lån, flere vogne til én stor silo, vogn der ikke kan bære varen springes over, nærmeste x-loft inkl. aktive lån, flere vogne til én stor silo, vogn der ikke kan bære varen springes over, nærmeste
gårdlager med plads, fallback til mest plads, intet lager → ingen afsendelse. gårdlager med plads, fallback til mest plads, intet lager → ingen afsendelse.
- `tests/test_adRuns.lua`: ny kind gemmes/indlæses med `maxVehicles`/`minLiters`; ukendt kind → supply som før. - `tests/test_adFieldSiloConfig.lua`: standarder, grænser (x 1–10, tærskel kun de fire værdier), til/fra af gårdlager, records frem og tilbage.
- In-game: silo ved en mark med 50.000 l hvede, gårdlager = Farma-silo, x = 2 → to vogne kører, afleverer, - In-game: silo ved en mark med 50.000 l hvede, gårdlager = Farma-silo, x = 2 → to vogne kører, afleverer,
parkerer; markarbejdet tager ikke de lånte vogne imens. parkerer; markarbejdet tager ikke de lånte vogne imens.