Files
fs25-adsmartpickup/docs/superpowers/specs/2026-09-28-flow-vogne-design.md
T

4.2 KiB

Flow-vogne — design

Dato: 2026-09-28 · Status: godkendt i chat ("1 vognen hører til flowet", "1 automatisk", "ja alle tre", "når du har det hele klar"). Bygger på maskinpuljen (2026-09-28-maskinpulje-design.md).

Formål

Alle påhæng har nu egen AD-parkering "P X" og en markør "Connect P X". Flows (fodring, mælk, slurry …) skal ikke længere have traktor og vogn låst sammen: et flow henter sin egen vogn, når det starter, og når flowet ikke har noget job længere, køres vognen på plads og traktoren hjem, så begge bliver ledige i puljen.

Brugerens valg

Spørgsmål Valg
Hvem ejer en flow-vogn? Flowet. Puljen må kun låne den, når flowet er stoppet/slettet/uden bygning
Hvordan kendes flowets vogn? Automatisk: vognen der hænger på flowets traktor huskes pr. traktor
Hvornår "intet job"? Alle tre: bygning væk, flow slettet, flow stoppet
Mejetærskere/skærebord Uændret — skærebord er aldrig i puljen; mejetærsker henter ikke redskaber

Begreber

  • Flowets vogn: run.wagons = {[traktorId] = vognId}. Opdateres automatisk: hænger der et redskab bagpå en af flowets traktorer (mens flowet ikke er stoppet), huskes det som traktorens vogn. Gemmes i ADSmartPickup_runs.xml (wagons="traktorId=vognId;…").
  • Stoppet flow: run.stopped = true, gemt. Sættes af Stop på flowet, "Stop alle"/"Stop alt og parkér" og "bygning væk"; ryddes af Start / "Start alle". Ikke udledt af om AD kører (en traktor ved et Wait-punkt kan holde stille uden at flowet er stoppet).
  • Bygning væk: en bygning i flowets kilde-/mål-/lagerliste findes ikke længere som placeable (uniqueId) i to tjek i træk (60 s mellem tjek).

Adfærd

  1. Husk vogn (hvert 10. s): for hvert ikke-stoppet flow og hver traktor med et bagerste redskab → wagons[traktor] = redskab (ændringer gemmes med næste gem).
  2. Start (startVehicle): er traktoren solo og har den en husket vogn:
    • vognen frakoblet og ikke reserveret/lånt → ADHitch.fetch til "Connect ", derefter startes traktoren i flowet som i dag. Fanen/loggen: "henter sin vogn".
    • vognen er lånt ud / koblet på en anden → traktoren venter ("venter på sin vogn"), der prøves igen hvert 10. s.
    • vognen findes ikke eller har ingen Connect-markør → startes som i dag (solo; valideringen afgør).
  3. Stop / "Stop alle" / "Stop alt og parkér": stopped = true; hver traktor stoppes og køres hjem med ADHitch.returnHome (vogn af på sin parkering, traktor til sin egen). Vognen forbliver flowets.
  4. Slet flow: som stop; derefter er vognen ikke længere flowets (flowet findes ikke).
  5. Bygning væk: flowet stoppes som i 3, markeres i loggen og med en besked: "Flow 'X': bygning findes ikke længere — stoppet, traktorer kørt hjem".

Puljen og flows

  • ADPool.collect: traktor i et flow er kun puljetraktor, når flowet er stoppet.
  • Puljeredskab: en vogn, der er husket af et ikke-stoppet flow, er aldrig puljeredskab.
  • ADFieldWork.getRigs: uændret for kørende flows; traktorer i stoppede flows må indgå.

Komponenter

  • adFlowWagons.lua (nyt): ren logik (serialisering af wagons, beslutning ved start: fetch/wait/start, "bygning væk"-debounce, ejer-opslag) + spil-del (tick: husk vogne, ventende starter, bygningstjek; fetchThenStart, sendHome(run)).
  • adRuns.lua/adRunsStorage.lua: felterne stopped, wagons i records.
  • adRunsController.lua: kroge i startVehicle, stopRun, deleteRun, stopAllRuns, stopAllAndPark, startRun/startAllRuns/queueStartAll (ryd stopped).
  • adPool.lua: udelukker vogne ejet af ikke-stoppede flows; traktorer i stoppede flows tæller.
  • adSmartPickup.lua: ADFlowWagons.tick i update-løkken.

Test

  • tests/test_adFlowWagons.lua: serialisering frem/tilbage, startbeslutning (fetch/wait/start), debounce af bygning væk, ejer-opslag (stoppet vs kørende).
  • tests/test_adRuns.lua: records med stopped og wagons.
  • In-game: savegame2 — stop et fodringsflow → vogne sættes på plads, traktorer hjem; start det → traktorerne henter deres egne vogne og kører.

Uden for scope

  • Valg af vogn i GUI (automatisk er valgt).
  • At et flow tager en anden vogn end sin egen.