# FS25_ADSmartPickup AutoDrive-tillæg til Farming Simulator 25 med to funktioner oven på Pickup&Deliver: ## 1. Vare-bevidst mappe-rotation (én vare valgt) Når pålæsningsmål roteres i en AD-mappe, køres der direkte til den silo i mappen, der har den valgte vare — mindst fyldte først (mælk/gylle: fyldeste først) — i stedet for at prøve markørerne én efter én. ## 2. Behovsstyret forsyning (flere varer valgt) Én traktor holder alle input i en produktion fyldt — fx hø, græs, ensilage og sukkerroer til en TMR-blander — i stedet for én traktor pr. vare. 1. Aflæsningsmål = produktionens markør. 2. Multi-vælg ingredienserne i AutoDrives vare-dropdown. 3. Start Pickup&Deliver. Loop-tælleren virker som normalt (N læs → parkér, 0 = uendeligt). Pr. tur læses målets lager; den ingrediens der mangler mest (relativt til kapacitet) hentes fra en silo **hvor som helst på kortet** (eget lager før nabo-lån, mindst fyldte først). Ingredienser uden plads i målet (< 1000 l fri) eller uden kilde springes over. Mens AD kører viser HUD'en kun turens vare (AutoDrive ville ellers selv rotere vare ved triggeren); når AD stopper, gendannes hele listen. Slå fra ved at vælge en anden enkelt vare. "Mest brug for" defineres i `ADSupplyPlanner.scoreNeed` (`adSupplyPlanner.lua`). ### Fabriksstyret (v1.6): målet er et produktionspunkt Er aflæsningsmålet en fabrik (produktionspunkt), **erstattes** ingredienslisten af inputs fra fabrikkens ønskede produktioner — slår du fx TMR til i en AIO-fabrik, begynder traktoren at hente ensilage/hø/halm/roer/mineralfoder af sig selv; slår du den fra, holder den op. Dit multi-valg er kun tændknappen (og det gendannes ved stop). Listen genudledes hver tur, begrænset til det vognen kan bære. - **Ønsket produktion** = tændt, ELLER slukket af kortet med status "mangler input" (Dakotas `ExtendedProductionPoint` slår produktioner fra automatisk, når de løber tør — dem skal vi netop fodre). Manuelt slukket = ikke ønsket. - **Prioritet = tid til tom:** `lager / (Σ amount × cyclesPerMinute)` over ønskede produktioner — den vare der løber tør først hentes først, uanset relativ fyldning. Loggen viser forbrug og minutter. - Fabrik uden ønskede produktioner, eller inputs vognen ikke kan bære → dit multi-valg som hidtil. ### Kilder: en fabriks inputs stjæles aldrig (v1.6.1) En fabriks læssestation udleverer også dens **inputs** (halm i en TMR-fabrik). Sådan en vare hentes aldrig derfra — kun fabrikkens outputs og rigtige siloer er kilder. Gælder både mappe-logik og behovsstyring. Varer der både er input og output (kæde) må hentes. ### Stalde som mål (v1.6.1) Kostald m.fl. svarer selv for niveau/kapacitet (`getHusbandryFillLevel/Capacity`), så halm+TMR til en stald rangeres korrekt, selv om staldens aflæsningsstation kun "kender" foder. ### Wait-punkter: rest-læs ved fuld stald (v1.7) AutoDrive holder ellers en traktor med rest-læs stille ved aflæsningspunktet, til den er tømt — og spærrer for de næste i køen. Med Wait-punkter: 1. Læg markører i en **mappe med ordet `Wait` i navnet** (fx mappen `Cow Wait`) — så mange du har plads til; de er en fælles pulje for alle traktorer. Markørernes egne navne er ligegyldige, så dine mark-ventepladser ("F91 Wait" i mark-mapperne) rører den ikke. 2. Kan målet ikke tage mere af vognens vare, kører traktoren til det **nærmeste ledige** Wait-punkt (modden holder styr på reservationer) og venter dér. 3. Når målet igen har plads til **hele** resten — eller er mindst **halvt tomt** (kæmpe vogne kan aldrig tømme hele resten i en lille stald) — kører den tilbage og læsser af. Derefter normal tur. 4. Wait-punkterne SKAL være forbundet til vejnettet både fra målets udkørsel og tilbage til målet. Modden tjekker ruten begge veje før den omdirigerer; uden rute prøves næste punkt (AutoDrive ville ellers vise "cannot reach" og slukke sig selv). Kun den aktuelle aflæsningsopgaves destination ændres — mål, rotation og loop-tæller røres ikke. Ventende traktorer ser rotationen som slået fra, så AutoDrive ikke kører videre fra Wait-punktet. Ingen ledige Wait-punkter → AutoDrive venter ved målet som i dag (én advarsel i loggen). Seks markører må gerne hedde det samme (fx `Cow Wait`); loggen viser markørnummeret. **Læs der passer, foretrækkes (v1.7):** ved valg af næste tur går varer, hvor et fuldt læs kan komme af i målet, forud; passer intet fuldt læs, tages den mest trængende alligevel (og Wait-punktet bruges). **Opsætning med flere stalde:** én traktor (eller flere) pr. stald med *Rotér mål: kun pålæsning*. Brug IKKE "pålæsning og aflæsning": AutoDrive vælger næste pålæsning FØR den roterer aflæsningsmålet, så behovet ville blive regnet for den forkerte stald. Pålæsningsmarkøren må ikke være fast på en fabrik ("kun aflæsning") — så kalder AutoDrive aldrig modden, og alt valgt læsses dér. ## v1.8 — Runs i ESC-menuen Et **run** er en navngivet opskrift: mål + varer + Wait-pulje + ture, samt en liste traktorer der skal køre den. I stedet for at sætte AutoDrive op manuelt på hver traktor, defineres run'et ét sted og startes/stoppes samlet for alle traktorer i det. **Oprettelse:** ESC → fanen "Smart Pickup" → "+ Nyt run". Runs vælges i Run-selectoren øverst; "Omdøb" og "Slet run" findes som knapper nederst sammen med Start/Stop. **Felter:** - **Mål** — dropdown med aflæsningsmål (markører med aflæsningsstation, fx en stald eller fabrik). - **Varer** — Auto (følger målets behov, som ved almindelig behovsstyret forsyning) eller Vælg (afkrydsning af bestemte varer). - **Wait-pulje** — hvilken `Wait`-mappe rest-læs skal vente i ("Alle (nærmeste ledige)" eller en navngivet pulje som fx "Cow Wait"). - **Ture** — loop-tælleren (0–99, 0 = uendeligt), som normalt i AutoDrives Pickup&Deliver. - **Traktorer** — rækker med Ja/Nej (er traktoren med i run'et), kapacitet og et ✔/✖-ikon. En **✖-traktor springes over ved Start**, med en grund vist ved siden af (fx "ingen vogn", "vognen kan ikke bære run'ets varer", "for langt fra vejnettet" eller "intet mål"). **Start/Stop:** "Start run" sætter AutoDrive op på hver ✔-traktor: mode Pickup&Deliver, målmarkør, nærmeste pålæsningsmarkør som start, run'ets varer valgt, run'ets tur-tæller, mapper ("Brug mapper") slået til, og rotation sat til "kun pålæsning" (bemærk: "Brug mapper" er en global AutoDrive-indstilling og slås til for hele spillet, ikke kun run'ets traktorer). **Dette overskriver traktorens hidtidige manuelle AutoDrive-indstillinger.** "Stop run" stopper AutoDrive på hver traktor i run'et (medlemskabet i run'et bevares, så det kan startes igen). Traktorer der ikke er del af noget run, kører som før — bortset fra at "Brug mapper" kan være blevet slået til globalt af et run. **Wait-puljer-fanen** viser hver Wait-mappe skrivebeskyttet: antal punkter og hvilken traktor der holder hvor. **Gemning:** Runs gemmes i `savegameN/ADSmartPickup_runs.xml` (ved gem og ved Start/Stop). De **genstartes ikke automatisk** ved indlæsning af et savegame — kør "Start run" igen efter load, hvis traktorerne skal køre videre. ## v1.9 — læs-bytte fra Wait Venter en traktor ved et Wait-punkt med en vare målet er fuldt af, mens målet **samtidig mangler en anden vare** på traktorens liste (run eller AD's multi-valg) — kan der ellers gå i hårdknude: alle traktorer venter med den ene vare, mens ingen henter den anden. Hvert 5. sekund tjekkes derfor: 1. Er der en anden vare i listen, målet mangler et **fuldt** læs af (og som kan hentes fra en silo)? Ellers venter traktoren som hidtil. 2. Findes en **ren lager-silo** (ikke stald, ikke fabrik, og ikke målet selv) med en aflæsningsstation ved en AD-markør, der tager varen og har fri plads ≥ resten, samt vejnet både til siloen og videre fra siloen til målet? Siloer der **allerede har varen** foretrækkes, ellers den nærmeste. 3. Findes en silo: Wait-punktet frigives, traktoren kører derhen og læsser resten af. Når vognen er tom, henter næste tur den vare målet mangler. 4. Findes ingen egnet silo: traktoren bliver ved Wait-punktet (som før v1.9). Loglinjer: `'' bytter læs: N l STRAW tilbage i (markør n), målet mangler FORAGE` ved bytte, og én gang pr. venteperiode `'' venter med N l STRAW, og målet mangler FORAGE — ingen silo med plads og vejnet til/fra tager resten, så den bliver ved Wait-punktet` når ingen silo findes. Kræver at traktoren har **begge** varer i sin liste (run's varer eller AD's multi-valg) — kun én vare valgt betyder ingen bytte-mulighed, og traktoren venter som hidtil. Wait-logikken gælder desuden kun mens aflæsningsopgaven peger på AD's rigtige aflæsningsmål, så en silo-omvej (fx efter et bytte) aldrig fejlagtigt bliver opfattet som et fuldt mål. ## Fælles - Wrapper `ADMultipleTargetsManager.getNextPickup` (via den globale `FS25_AutoDrive`-tabel); rører ikke AutoDrive-zip'en. - Siloens eget lager rangeres før nabo-lån (udvidelses-siloer deler lager inden for `storageRadius`). - Intet fund, intet behov eller fejl i et spil-API → AutoDrives originale rotation. Valg logges som `ADSmartPickup:` i log.txt. - Kræver i AutoDrive: "Brug mapper" + "Rotér mål: pålæsning" på køretøjet. - **Markør ↔ silo (v1.3):** markøren er dér hvor trækkerens næse stopper; vognen holder et vogntog bagved. Markørens silo er derfor nærmeste trigger **bag næsen** set i ankomstretningen (forrige waypoint), højst 2 m foran. I tætte rækker (15 m mellem siloerne) er nabosiloens trigger ellers nærmere end markørens egen. Ingen trigger bag næsen/ukendt retning → nærmeste trigger som før. - **Kildestrategi (v1.5):** lagervarer hentes fra den **mindst fyldte** silo først (rester ryddes, siloer frigives). Varer hvis tanke *løber fulde* — mælk, gylle, digestat — hentes fra den **fyldeste** kilde først, så produktionen ikke går i stå. Listen er `ADSupplyPlanner.FULLEST_FIRST_FILL_TYPES` (`adSupplyPlanner.lua`); tilføj fx `MANURE = true` hvis møddinger også skal tømmes fyldest-først. Loggen viser den brugte strategi. En trigger foran næsen tæller aldrig som markørens egen (v1.5). - **Spor-regel (v1.4):** triggeren skal ligge i trækkerens spor (højst 6 m til siden). En tank med aflæsningsbane på den ene side og pålæsningsbane på den anden giver ellers to markører til samme tank, og "Dropof"-markøren kunne vinde. Kendes retningen, men ligger intet i sporet (kurve ind til markøren), accepteres kun en trigger inden for 12 m. - **Kun fremme ved markøren (v1.4):** rotationen skjules først når målet er nået — undervejs ruller vognen gennem nabosiloers triggere, og dér skal AutoDrive køre videre ved tom trigger. - **Sikkerhedsventil (v1.4):** 30 s ved markøren uden at vognen fyldes → grebet slippes (advarsel i log), og AutoDrive kører videre som med almindelig rotation. - **Står og læsser (v1.2):** med rotation + mapper afslutter AutoDrive normalt pålæsningen i det øjeblik markøren nås (læsning skal være startet på vej ind, ellers kører den tom videre). Når moden har valgt siloen, ser AutoDrive under `LoadAtDestinationTask.update` rotationen som slået fra for netop det køretøj, så den holder ved markøren og læsser som uden rotation. Løber kilden tør, slippes grebet og turen fortsætter med det der er i vognen. Begrænsninger: AD læsser fuld vogn — er der mindre plads i målet end ét læs, venter traktoren ved aflæsning. Målet skal være en placeable med aflæsningstrigger (ikke en blandevogn). Test: `luajit tests/test_adSupplyPlanner.lua && luajit tests/test_adSmartPickup.lua` Byg: `cd FS25_ADSmartPickup && zip -qr ../FS25_ADSmartPickup.zip .` Design/plan: `docs/superpowers/`