Compare commits
3 Commits
76f51c7be7
...
v1.60.13.0
| Author | SHA1 | Date | |
|---|---|---|---|
| b33f7682b4 | |||
| d420d5026d | |||
| 5827143327 |
+429
@@ -0,0 +1,429 @@
|
|||||||
|
# Ændringslog — FS25_ADSmartPickup
|
||||||
|
|
||||||
|
Nyeste version øverst. Versionsnummeret står i `FS25_ADSmartPickup/modDesc.xml`. Brugervejledningen
|
||||||
|
står i [docs/BRUGERMANUAL.md](docs/BRUGERMANUAL.md) (dansk) og [docs/USER_MANUAL.md](docs/USER_MANUAL.md)
|
||||||
|
(engelsk). De ældste afsnit (v1.1–v1.13) er de oprindelige udviklernoter, der tidligere stod i README.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1.60 — "Kræver handling" → flow, menuplacering, flow-vogne i guiden
|
||||||
|
|
||||||
|
- **1.60.13** CP-genstart efter indlæsning starter kun maskiner, hvis valgte CP-job er markarbejde. Moddets
|
||||||
|
markopgaver starter CP med eget job, så HUD'en kunne stå på fx bunkersilo, og HUD-starten gav "CP: No silo found".
|
||||||
|
- **1.60.12** "Start alle" ophæver altid pausen: et flow på pause, hvis traktorer stadig kørte en gemt AD-tur,
|
||||||
|
blev talt som "kørte allerede" og forblev stoppet — traktoren hentede sin vogn og kørte den straks hjem igen.
|
||||||
|
- **1.60.11** Udkørselsregler vises kun, når en vare bruger dem: salgsgrænserne ("Sælg fra", "Sælg altid
|
||||||
|
over") kun ved Salg / Salg, ellers lager, og "Kør til lager over" kun ved Lager / Salg, ellers lager.
|
||||||
|
Gælder Regler-trinnet, resuméet og status (et rent lagerflow viser fx kun "lager > 80 %").
|
||||||
|
- **1.60.10** Guiden "Opsæt flow" tildeler ledige vogne til solo-traktorer (traktor uden vogn bagpå):
|
||||||
|
guiden foreslår en vogn (navnematch, ellers "Disponibel …"), vognen kan skiftes pr. traktor på linjen
|
||||||
|
"↳ Vogn", og flowet husker parret ved Gem.
|
||||||
|
- **1.60.9** Tydelig linje øverst i Fields, når "Stop alt"-pausen er aktiv (pausen gemmes med savegamet).
|
||||||
|
- **1.60.8** Gemt produkt (ensilage/hø) gælder kun slåafgrøder.
|
||||||
|
- **1.60.7** Traktor med redskab på sin egen parkering er et parkeret sæt, ikke en forældreløs påkobling.
|
||||||
|
- **1.60.6** Tømning ved stop bruger aldrig marksiloer; kan en silo ikke tage imod, prøves den næste
|
||||||
|
(op til 3), før der parkeres med last.
|
||||||
|
- **1.60.4–1.60.5** Redskab/vogn der er koblet på uden ejer efter genindlæsning, sættes tilbage efter
|
||||||
|
2 min uden opgave. Flowet husker kun vognen, når et kørende flow stoppes.
|
||||||
|
- **1.60.3** Diagnoselinje når vognen står ved målet med plads, uden at læsset falder, i 30 s.
|
||||||
|
- **1.60.2** Vin og oliven er aldrig slåafgrøder.
|
||||||
|
- **1.60.1** Fanen Smart Pickup ligger lige over spillets Indstillinger i ESC-menuen.
|
||||||
|
- **1.60.0** Lagerfanernes "Kræver handling": klik åbner eller opretter et forsyningsflow (løber tør) eller et
|
||||||
|
salgsflow (sælg nu), eller siger "producér/køb", når et flow ikke hjælper. Statuslinjen i lagerfanerne
|
||||||
|
viser ikke længere det sidst valgte flows status.
|
||||||
|
|
||||||
|
## 1.59 — Fields som farvet liste, Pleje Automatisk/Manuelt
|
||||||
|
|
||||||
|
- **1.59.0** Fields-fanen som farvet liste med Start/Stop pr. række; klik åbner redigeringsvinduet.
|
||||||
|
- **1.59.1–1.59.5** Review-rettelser til listen og redigeringsvinduet (placering, fokus, ESC, [Start]
|
||||||
|
kræver markør); vinduet i menuens mørke tone; tekstrækker op til 90 tegn; forklaring af farver i hint.
|
||||||
|
- **1.59.2** Flow der ikke er stoppet og har kørende traktorer, tæller som kørende efter genindlæsning.
|
||||||
|
- **1.59.3** Under "Stop alt"-pausen vises marker som stoppet med [Start]; [Start] genoptager kun den mark.
|
||||||
|
- **1.59.6–1.59.7** Traktorer der ikke findes længere (solgt), fjernes fra flowet 2 min efter indlæsning,
|
||||||
|
med besked på skærmen; rød besked når flowet står uden traktorer.
|
||||||
|
- **1.59.8** Pleje har Automatisk/Manuelt som Klargøring (Automatisk = gødning, ukrudt og kalk).
|
||||||
|
- **1.59.9–1.59.11** Markvinduet viser ikke marksilo-advarsler; kolonnebredder i Marksiloer og Måned.
|
||||||
|
|
||||||
|
## 1.58 — Flows som farvet liste med redigeringsvindue
|
||||||
|
|
||||||
|
- **1.58.0** Flows-fanen som farvet liste med [Start]/[Stop] pr. række; klik åbner et redigeringsvindue
|
||||||
|
(Luk/ESC, Start/Stop, Slet).
|
||||||
|
|
||||||
|
## 1.57 — Forsyning og Wait-valg
|
||||||
|
|
||||||
|
- **1.57.0** Mindst fyldte kilde først kun blandt kilder med mindst 25 % af et læs (ellers fyldeste).
|
||||||
|
- **1.57.1–1.57.2** "Vent ved: Alle" vælger det ledige Wait-punkt nærmest flowets kilder.
|
||||||
|
- **1.57.3** Manuel påkobling starter traktoren i et flow, hvis Start blev afvist.
|
||||||
|
- **1.57.4** AutoDrive tælles ikke som Courseplay (flow-traktor ventede på sig selv efter indlæsning).
|
||||||
|
|
||||||
|
## 1.56 — Bedste pasform i maskinpuljen
|
||||||
|
|
||||||
|
- **1.56.0** Puljen vælger den mindste traktor med hk nok; afstand kun inden for ±15 %; over 2,5× redskabets
|
||||||
|
behov kun som nødløsning.
|
||||||
|
- **1.56.1–1.56.5** Flow prøver én gang mere at hente vognen; traktor startes, når spilleren selv har kørt
|
||||||
|
den til Connect og koblet vognen på; AD "Kør til" et puljeredskabs parkering kobler det af; flowet
|
||||||
|
husker vognen før et stop; afviste traktorer ved Start vises med grund.
|
||||||
|
|
||||||
|
## 1.55 — Redskaber foldes ved stop
|
||||||
|
|
||||||
|
- **1.55.0** Redskaber slukkes, løftes og foldes til transport, når en mark, et flow eller "Stop alt" stoppes.
|
||||||
|
- **1.55.1** Tømning ved stop: 45 s ved målet uden at læsset falder → silo, ellers parkering med last.
|
||||||
|
|
||||||
|
## 1.51–1.54 — Flow-vogne og kobling
|
||||||
|
|
||||||
|
- **1.51.0** Flow-vogne: flowets vogn huskes pr. traktor, solo-traktor henter sin vogn ved start, stop/slet
|
||||||
|
sætter vognen på plads og kører traktoren hjem; stoppede flows er ledige i maskinpuljen.
|
||||||
|
- **1.51.1** Konsolkommandoen `spuNameFleet` giver traktorer uden for flows butiksnavne og parkeringer
|
||||||
|
"P <navn>".
|
||||||
|
- **1.51.3–1.51.4** Flow-traktor finder sin vogn på parkeringsnavnet; stoppet flow tømmer vognen før den
|
||||||
|
parkeres.
|
||||||
|
- **1.51.5** Nye Courseplay-kurser får altid 2 forager-runder.
|
||||||
|
- **1.52.0** Lagerfanerne får vareoversigt med nøgletal, "Kræver handling" og fyldningsbjælker.
|
||||||
|
- **1.52.1** Flow startet igen under tømning/hjemtur kører videre med vognen.
|
||||||
|
- **1.53.0** Koblingsrækkevidde 3 m og bakning de sidste 3–8 m ved Connect-markører.
|
||||||
|
- **1.53.1–1.53.2** Tømning ved stop kun ved flowets egne mål; afkobling bekræftes (op til 20 s).
|
||||||
|
- **1.54.0** Flow-vogne holdes altid af deres flow; markredskaber kun bag traktorer.
|
||||||
|
|
||||||
|
## 1.48–1.50 — Maskinpulje
|
||||||
|
|
||||||
|
- **1.48.0** Maskinpulje etape 1: markarbejdet sender en solo-traktor efter et puljeredskab (frakoblet, med
|
||||||
|
parkering + Connect-markør), når ingen færdig kombination er ledig; bagefter sættes redskabet af på sin
|
||||||
|
parkering, og traktoren kører hjem. Marker der venter, betjenes længst-ventende først.
|
||||||
|
- **1.48.1–1.48.4** Bar mark med mål-afgrøde klargøres straks (kun såningen venter); plov før kultivator i
|
||||||
|
rolletabellen; markflåden viser puljetraktorer og -redskaber med status.
|
||||||
|
- **1.49.0** Etape 2: tømmevogne ved høst fra puljen.
|
||||||
|
- **1.50.0** Etape 3: marksilo-flowet låner også solo-traktor + puljevogn.
|
||||||
|
- **1.50.2–1.50.5** Plov foldes ud før afkobling; kultivering/pløjning måles på jorden (≥95 %); tom/fuld
|
||||||
|
marksilo og fuld fabrik håndteres.
|
||||||
|
|
||||||
|
## 1.46–1.47 — Connect- og Afkobl-markører
|
||||||
|
|
||||||
|
- **1.46.0** Connect-markører: en traktor der kører AD "Kør til" en "Connect <navn>"-markør, kobler
|
||||||
|
redskabet på ved ankomst.
|
||||||
|
- **1.47.0–1.47.4** Afkobl-markører; Connect virker begge veje; ture i flere trin; vognen sættes af ved sin
|
||||||
|
egen AD-parkering.
|
||||||
|
|
||||||
|
## 1.41–1.45 — Navne, Stop alt, Courseplay-genstart
|
||||||
|
|
||||||
|
- **1.41.0** Markmaskiner med modelnavn navngives efter rollen (Læssevogn 5, Mejetærsker 1 …).
|
||||||
|
- **1.41.1** Navnefilen skrives i spillets gem-hook.
|
||||||
|
- **1.42.0** "Stop alt og parkér" og "Start alle" med pause der gemmes.
|
||||||
|
- **1.42.1–1.42.5** Parkeringspunkt findes også på vognen/redskabet; højst én maskine sendt ud hvert
|
||||||
|
10. sekund; vent op til 5 min på Courseplays kursusberegning; Flows-fanen med valgt flow øverst.
|
||||||
|
- **1.43.0** Høster med korn i tanken efter høsten: tømmevogn sendes ud, før marken går videre.
|
||||||
|
- **1.44.0** Marksilo: "Kør overskud til produktion" med foderreserve.
|
||||||
|
- **1.45.0** Maskiner som Courseplay kører, huskes ved hvert gem og startes igen efter indlæsning.
|
||||||
|
|
||||||
|
## 1.36–1.40 — Marksilo-flow og bygningsnavne
|
||||||
|
|
||||||
|
- **1.36.0** Fanen Marksiloer: låner ledige tømmevogne og kører marksiloernes varer hjem til gårdlagre.
|
||||||
|
- **1.36.x** Flow-guiden viser ubrugelige traktorer med grund (foldet sammen); grunden "AutoLoad er slået
|
||||||
|
til på vognen"; pallespawnere viger for aflæsningens markør.
|
||||||
|
- **1.37.0** CP-maskiner midt i et job genstartes efter indlæsning.
|
||||||
|
- **1.38.0** Manuel transport af brede høstere ("Kører selv på vejen" Ja/Nej).
|
||||||
|
- **1.38.x** Rettelser til CP-startpunkt, genstart og marksilo-navne.
|
||||||
|
- **1.39.0** Egne bygningsnavne fra `ADSmartPickup_names.xml` bruges overalt.
|
||||||
|
- **1.40.0** Nye bygninger navngives automatisk; knappen "Omdøb bygning" i bygningsfanerne.
|
||||||
|
|
||||||
|
## 1.33–1.35 — Courseplay-kursusgenbrug og fanen Måned
|
||||||
|
|
||||||
|
- **1.33.0** Udkørsel: "Sælg altid når kilden er over X %".
|
||||||
|
- **1.33.1–1.33.4** Vinmarker, maskiner langt fra vejnettet sendes ikke ud, intet sendes de første 2 min
|
||||||
|
efter indlæsning, hurtigere rutetjek.
|
||||||
|
- **1.34.0** Genbrug af Courseplay-kurser (markform-signatur + kursusregister pr. maskine).
|
||||||
|
- **1.34.1–1.34.2** Slåmarker klar først i fuld højde; utoppede kartofler tæller som høstklare.
|
||||||
|
- **1.35.0** Fanen Måned: marker i gang, næste trin, og om høst-/såvinduet lukker ved månedsskiftet.
|
||||||
|
- **1.35.x** Fremdrift for høst/slåning; diagnose af stillestående AD-køretøjer; fyldte traktorer
|
||||||
|
registreres "på vej".
|
||||||
|
|
||||||
|
## 1.32 — Guiden "Opsæt flow"
|
||||||
|
|
||||||
|
- **1.32.0** Flows-fanen med tavle + resumé og trin-for-trin-guide; nyt flow oprettes først ved Gem.
|
||||||
|
- **1.32.1–1.32.5** Oprydning i gammel GUI-kode; høsterens restkorn; advarsel når markflåden er tom;
|
||||||
|
forkert vare hældes kun ud som lille rest; vinkursus i gangen.
|
||||||
|
|
||||||
|
## 1.31 — Guiden "Opsæt mark"
|
||||||
|
|
||||||
|
- Markfanen får resumé (klik på en linje = ret ét trin) og en trin-for-trin-guide.
|
||||||
|
|
||||||
|
## 1.21–1.30 — Markarbejde
|
||||||
|
|
||||||
|
- **1.21** Fanen Marker: slåafgrøder (slå, vend, riv, saml op) med AutoDrive til F-markøren og Courseplay
|
||||||
|
på marken; arbejdsbredde fra Courseplay.
|
||||||
|
- **1.22–1.25** Vender/river/læssevogn genbruger slåmaskinens kursus; smalle maskiner; sideriver; ensilage
|
||||||
|
til gæringssilo.
|
||||||
|
- **1.26–1.27** Høst, klargøring, pleje, multi-tool, vejr, påfyldning, mål-afgrøde pr. mark, halm efter høst;
|
||||||
|
ydelsesforbedringer.
|
||||||
|
- **1.28** Profiler og hak-audit; æg-paller; forsyning med flere mål vælger målet med færrest vogne på vej.
|
||||||
|
- **1.29** Bebyggede marker udelades; minimum arbejdsbredde 1,5 m; påfyldning via AD og købestationer;
|
||||||
|
lange tekstrækker ombrydes.
|
||||||
|
- **1.30** Faste maskiner pr. mark; markflåden er tydeligt fælles.
|
||||||
|
|
||||||
|
## 1.14–1.20 — Forsyning, lagerfaner og Overblik
|
||||||
|
|
||||||
|
- **1.14** Bedste foder først (lavere foder kun når truget er mindst 75 % tomt); læs på vej tælles med;
|
||||||
|
rest under 100 l regnes som tom.
|
||||||
|
- **1.15–1.16** Lagerfaner pr. bygningstype med statistik pr. vare; første brugermanual.
|
||||||
|
- **1.17** Traktorer navngives efter deres flow; kilder med fælles lager regnes som ét stop; lagerture til
|
||||||
|
egne fabrikker; jordbundne kortanlæg regnes som gårdens.
|
||||||
|
- **1.18** "Lager til" (tvunget aflæsningssted, fodring ved ≥ 10.000 l); siloer der kun kan fyldes; generelle
|
||||||
|
lagre som kilde; æg/uld-paller fra stalde.
|
||||||
|
- **1.19** Fanen Overblik; "Lager til" filtreres efter varer; parallelt foder (høns).
|
||||||
|
- **1.20** Start/Stop alle flows; klik på et flow i Overblik hopper til redigering.
|
||||||
|
|
||||||
|
## 1.10–1.11
|
||||||
|
|
||||||
|
- **1.10** Overblik i fanen; "Kør hjem fra Wait under X %" (10–90, standard 50); foderprioritering efter
|
||||||
|
spillets fodervægt.
|
||||||
|
- **1.11** Flere mål pr. run; faneikon; forkert last læsses af i nærmeste silo; forbedret Wait-logik.
|
||||||
|
|
||||||
|
## v1.13 — Flow-tavle (bygningsbaseret opsætning)
|
||||||
|
|
||||||
|
ESC-fanen har nu to under-faner: **Flows** og **Lagre**. Flows viser én række pr. flow (run):
|
||||||
|
`> Mælk: Sukker · Kostald 1 + Kostald 2 → salg · pris ≥ 90 %, lager > 80 % · Virtus · kører (1/1) — SUGAR 78 % af top`
|
||||||
|
og under tavlen en detail-blok for det valgte flow: **Retning** (ind til bygning / ud fra bygning),
|
||||||
|
**Fra** (udkørsel) eller **Til** (forsyning) som afkrydsning pr. **bygning** — moden finder selv den
|
||||||
|
AD-markør der står nærmest bygningens læsse-/aflæsningstrigger (≤ 40 m; siloer via det strenge
|
||||||
|
opslag) og viser den: `Kostald 1 (stald) — markør 'cow 1 milk' 12 m` eller `INGEN MARKØR inden for
|
||||||
|
40 m`. Derefter Varer, Regler, Vent ved, Traktorer og Status som før. Forsyning har "Fra = alle
|
||||||
|
siloer" (som hidtil). Wait-puljerne står nederst.
|
||||||
|
|
||||||
|
Gamle runs oversættes automatisk: markører der er en bygnings markør bliver til bygningen; rå
|
||||||
|
markører uden bygning beholdes og vises som `markør '…'`. Start afviser med `'<bygning>' mangler en
|
||||||
|
AD-markør ved triggeren`, når en valgt bygning ingen markør har. Runs gemmes som XML version 3.
|
||||||
|
|
||||||
|
## v1.12 — Udkørsel af produkter
|
||||||
|
|
||||||
|
Et run har nu en **retning**: *Forsyning* (som hidtil) eller *Udkørsel*. ESC-fanen har tre
|
||||||
|
under-faner: **Oversigt** · **Forsyning** · **Udkørsel**.
|
||||||
|
|
||||||
|
Et udkørsels-run består af:
|
||||||
|
|
||||||
|
- **Kilder** (én eller flere AD-markører): en **fabrik** (produktionspunkt, dens outputs),
|
||||||
|
en **silo** (`spec_silo`, dens indhold) eller et **objektlager** (palle-/ballelager som HVF-
|
||||||
|
pakkens; paller tages ud automatisk). Kilden genkendes inden for 40 m af markøren.
|
||||||
|
- **Varer** med politik pr. vare: **Fra** · **Lager** · **Salg** · **Salg, ellers lager**.
|
||||||
|
Bulk-varer kræver tipvogn/tank; pallevarer kræver **Universal Autoload** på vognen.
|
||||||
|
- **Regler:** *Sælg fra* (% af årets toppris, standard 90), *Kør til lager over* (% fyldning i
|
||||||
|
kilden, standard 80), *Saml op på én tur* (opsamlingsrunde).
|
||||||
|
- Wait-pulje og traktorer som i forsynings-runs.
|
||||||
|
|
||||||
|
**Turvurdering** (før hver pålæsning, og hvert 5. sekund mens traktoren holder):
|
||||||
|
|
||||||
|
1. *Salg*: en vare med Salg-politik, hvis bedst betalende **nåelige** salgssted giver mindst
|
||||||
|
tærsklen af årets toppris — **kører uanset mængde**. Højeste pris-% først. Toppris = stationens
|
||||||
|
grundpris nu × (årets højeste periodefaktor ÷ nuværende). Stor efterspørgsel giver > 100 %.
|
||||||
|
2. *Lager*: en vare med Lager-politik, når der er et **fuldt læs** eller kildens lager er over
|
||||||
|
tærsklen — til nærmeste silo med plads til hele læsset og vejnet begge veje (aldrig en kilde,
|
||||||
|
fabrik eller stald). Mest fyldte kilde først.
|
||||||
|
3. Ingen tur → traktoren holder ved et ledigt Wait-punkt (run'ets pulje) og prøver igen.
|
||||||
|
Loggen viser hvorfor: `holder ved Wait 3: SUGAR 78 % af top (kræver 90), lager 41 %`.
|
||||||
|
|
||||||
|
**Opsamlingsrunde:** tipvogn = samme vare fra flere kilder efter tur til vognen er fuld (næste
|
||||||
|
kilde kun ved ≥ 10 % fri plads); autoload-vogn = flere pallevarer med samme mål på én tur.
|
||||||
|
|
||||||
|
**Objektlager:** markøren skal stå så vognens autoload-zone dækker lagerets spawn-område (som når
|
||||||
|
man læsser manuelt). Moden beder lageret spawne **én palle ad gangen** og venter til UAL har taget
|
||||||
|
den, så der aldrig ligger paller tilbage. Sidder lageret fast (kendt spilfejl), afsluttes
|
||||||
|
læsningen efter 30 s med det der er. Ved en autoload-kilde uden fremdrift i 15 s køres der med
|
||||||
|
det der er ("uanset mængde").
|
||||||
|
|
||||||
|
**Advarsler på skærmen:** kan intet salgssted nås (vejnet), eller findes ingen silo med plads,
|
||||||
|
vises en rød AutoDrive-notifikation (`'MT635' kan ikke nå salgssted 'Grain Elevator' for SUGAR –
|
||||||
|
tjek vejnettet`), samme tekst i AD's notifikations-historik, i log.txt (WARN) og i run'ets status.
|
||||||
|
Traktoren holder ved Wait og kører selv når vejen er koblet på. Advarslen gentages først når
|
||||||
|
traktor, station eller vare ændrer sig.
|
||||||
|
|
||||||
|
**Prisregel (v1.12.1, metode fra Distribution Redux):** pris-% = nuværende periodes faktor ÷ årets
|
||||||
|
højeste faktor i spillets faste sæsonkurve (samme data som prisgrafen) × stationens egen afvigelse
|
||||||
|
(effektiv pris ÷ stationens grundpris nu). Sværhedsgraden falder ud; flade kurver (top/bund < 1,02)
|
||||||
|
regnes som 100 %; stor efterspørgsel giver > 100 %.
|
||||||
|
|
||||||
|
**Reserve (v1.12.1):** før salg fratrækkes det gårdens egne fabrikker og stalde skal bruge det næste
|
||||||
|
døgn (forbrug × 24 t minus det de allerede har, højst deres fri plads; fabrikker = ønskede
|
||||||
|
produktioners inputs, stalde = foder/halm/vand-rate). Der sælges kun når et helt læs kan tages uden
|
||||||
|
at røre reserven. Loggen/UI'et siger fx `SUGARBEET: 196.0k reserveret til TMR-fabrik`. Lager-politik
|
||||||
|
rører ikke reserven (varen bliver på gården).
|
||||||
|
|
||||||
|
**Paller til lager (v1.12.1):** Lager-mål for pallevarer = nærmeste objektlager (palleskur) der tager
|
||||||
|
varen og har plads; AutoDrive læsser UAL-vognen af dér.
|
||||||
|
|
||||||
|
**Tætte siloer (AutoDrive-indstilling):** AutoDrive tipper ved den første aflæsningstrigger inden for sin
|
||||||
|
globale "Max trigger distance" (standard 25 m). Står siloerne tættere end det, kan nabosiloen få læsset —
|
||||||
|
sæt AD-indstillingen til **10 m**. Moden advarer i loggen første gang et lagermål har en anden
|
||||||
|
aflæsningsmarkør inden for afstanden.
|
||||||
|
|
||||||
|
**Fanen Lagre (v1.12.1):** gårdens beholdning pr. bygning (fabrikker med ▸ ved outputs, stalde,
|
||||||
|
palleskure som antal paller, siloer), opdateret hvert sekund.
|
||||||
|
|
||||||
|
**Opsætning:** Udkørsel-fanen → Nyt run → afkryds kilder → sæt politik pr. vare → Ja på traktorer
|
||||||
|
→ Start. AD-tilstand pr. traktor: PickupAndDeliver, 1./2. markør = første kilde (pladsholder,
|
||||||
|
sættes pr. tur), rotation "kun pålæsning". Runs gemmes i `ADSmartPickup_runs.xml` version 2;
|
||||||
|
ældre filer læses som forsynings-runs.
|
||||||
|
|
||||||
|
## 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: `'<navn>' bytter læs: N l STRAW tilbage i <markør> (markør n), målet mangler FORAGE` ved
|
||||||
|
bytte, og én gang pr. venteperiode `'<navn>' 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.
|
||||||
|
|
||||||
|
## 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"). Sættes en traktor til
|
||||||
|
Nej (fjernet fra run'et), rører det IKKE dens AutoDrive-vareliste — run'ets varer forbliver valgt
|
||||||
|
i traktorens AD-vareliste (synlig/redigerbar i AD's eget HUD) indtil de ændres dér manuelt.
|
||||||
|
|
||||||
|
**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-afsnittet** nederst på siden 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.1–v1.7 — Grundfunktionerne
|
||||||
|
|
||||||
|
### 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.
|
||||||
|
|
||||||
|
### 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.
|
||||||
|
|
||||||
|
### Fælles tekniske noter (v1.2–v1.5)
|
||||||
|
|
||||||
|
- 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" (global AutoDrive-indstilling, gælder hele spillet) +
|
||||||
|
"Rotér mål: pålæsning" på køretøjet (pr. køretøj).
|
||||||
|
- **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`). En trigger foran næsen tæller aldrig som markørens egen.
|
||||||
|
- **Spor-regel (v1.4):** triggeren skal ligge i trækkerens spor (højst 6 m til siden). 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):** 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.
|
||||||
@@ -28,18 +28,28 @@ function ADCpResume.fromRecords(ids)
|
|||||||
return set
|
return set
|
||||||
end
|
end
|
||||||
|
|
||||||
-- vehicles = {{id, aiActive, controlled}} i fast rækkefølge -> id'er der skal startes (nil uden gemt liste)
|
-- vehicles = {{id, aiActive, controlled, fieldWork}} i fast rækkefølge -> id'er der skal startes (nil uden gemt liste).
|
||||||
|
-- fieldWork = false: CP's HUD-job er ikke markarbejde (fx bunkersilo) — HUD-start ville starte det forkerte job
|
||||||
|
-- (in-game 29/9: "CP: No silo found"); nil = ukendt (ældre CP) -> startes som før.
|
||||||
function ADCpResume.toStart(pending, vehicles)
|
function ADCpResume.toStart(pending, vehicles)
|
||||||
if pending == nil then return nil end
|
if pending == nil then return nil end
|
||||||
local ids = {}
|
local ids = {}
|
||||||
for _, vehicle in ipairs(vehicles or {}) do
|
for _, vehicle in ipairs(vehicles or {}) do
|
||||||
if pending[vehicle.id] and not vehicle.aiActive and not vehicle.controlled then table.insert(ids, vehicle.id) end
|
if pending[vehicle.id] and not vehicle.aiActive and not vehicle.controlled and vehicle.fieldWork ~= false then
|
||||||
|
table.insert(ids, vehicle.id)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
return ids
|
return ids
|
||||||
end
|
end
|
||||||
|
|
||||||
-- ---- spil ----
|
-- ---- spil ----
|
||||||
|
|
||||||
|
-- true/false fra CP's HUD; nil når CP-versionen ikke har funktionen
|
||||||
|
local function hudFieldWork(vehicle)
|
||||||
|
if vehicle.cpIsHudFieldWorkJobSelected == nil then return nil end
|
||||||
|
return vehicle:cpIsHudFieldWorkJobSelected() == true
|
||||||
|
end
|
||||||
|
|
||||||
local function vehicleState(adEnv, vehicle)
|
local function vehicleState(adEnv, vehicle)
|
||||||
local ad = vehicle.ad
|
local ad = vehicle.ad
|
||||||
return {
|
return {
|
||||||
@@ -48,6 +58,7 @@ local function vehicleState(adEnv, vehicle)
|
|||||||
adActive = ad ~= nil and ad.stateModule ~= nil and ad.stateModule:isActive(),
|
adActive = ad ~= nil and ad.stateModule ~= nil and ad.stateModule:isActive(),
|
||||||
aiActive = vehicle.getIsAIActive ~= nil and vehicle:getIsAIActive() == true,
|
aiActive = vehicle.getIsAIActive ~= nil and vehicle:getIsAIActive() == true,
|
||||||
controlled = vehicle.getIsControlled ~= nil and vehicle:getIsControlled() == true,
|
controlled = vehicle.getIsControlled ~= nil and vehicle:getIsControlled() == true,
|
||||||
|
fieldWork = hudFieldWork(vehicle),
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -43,6 +43,15 @@ local function clampRange(value, default, min, max)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Flow-vogne: {[traktorId] = vognId} (maskinpulje — flowet henter sin egen vogn).
|
-- Flow-vogne: {[traktorId] = vognId} (maskinpulje — flowet henter sin egen vogn).
|
||||||
|
-- Start alle pr. flow: isRunning (traktorer kører AD), stopped (pause fra Stop alt / Stop).
|
||||||
|
-- -> "queue" (start traktorerne), "resume" (kører allerede: kun pausen ophæves), "skip".
|
||||||
|
-- In-game 29/9: flows på pause hvis traktorer kørte videre på en gemt AD-tur blev talt som 'kørte allerede',
|
||||||
|
-- forblev stoppede, og traktoren kørte vognen hjem lige efter at have hentet den.
|
||||||
|
function ADRuns.startAllAction(isRunning, stopped)
|
||||||
|
if not isRunning then return "queue" end
|
||||||
|
return stopped and "resume" or "skip"
|
||||||
|
end
|
||||||
|
|
||||||
function ADRuns.copyWagons(wagons)
|
function ADRuns.copyWagons(wagons)
|
||||||
local copy = {}
|
local copy = {}
|
||||||
for tractorId, wagonId in pairs(wagons or {}) do copy[tractorId] = wagonId end
|
for tractorId, wagonId in pairs(wagons or {}) do copy[tractorId] = wagonId end
|
||||||
|
|||||||
@@ -1137,8 +1137,10 @@ function ADRunsController.queueStartAll(adEnv)
|
|||||||
local queue = {}
|
local queue = {}
|
||||||
for _, run in ipairs(ADRunsController.store.runs) do
|
for _, run in ipairs(ADRunsController.store.runs) do
|
||||||
if #run.vehicleIds > 0 then
|
if #run.vehicleIds > 0 then
|
||||||
if ADRunsController.getRunStatus(adEnv, run).isRunning then
|
local action = ADRuns.startAllAction(ADRunsController.getRunStatus(adEnv, run).isRunning, run.stopped == true)
|
||||||
|
if action ~= "queue" then
|
||||||
summary.alreadyRunning = summary.alreadyRunning + 1
|
summary.alreadyRunning = summary.alreadyRunning + 1
|
||||||
|
if action == "resume" then run.stopped = false end
|
||||||
else
|
else
|
||||||
run.stopped = false
|
run.stopped = false
|
||||||
for _, vehicleId in ipairs(run.vehicleIds) do
|
for _, vehicleId in ipairs(run.vehicleIds) do
|
||||||
@@ -1310,8 +1312,10 @@ function ADRunsController.startAllRuns(adEnv)
|
|||||||
local summary = {runsStarted = 0, alreadyRunning = 0, vehiclesStarted = 0, results = {}}
|
local summary = {runsStarted = 0, alreadyRunning = 0, vehiclesStarted = 0, results = {}}
|
||||||
for _, run in ipairs(ADRunsController.store.runs) do
|
for _, run in ipairs(ADRunsController.store.runs) do
|
||||||
if #run.vehicleIds > 0 then
|
if #run.vehicleIds > 0 then
|
||||||
if ADRunsController.getRunStatus(adEnv, run).isRunning then
|
local action = ADRuns.startAllAction(ADRunsController.getRunStatus(adEnv, run).isRunning, run.stopped == true)
|
||||||
|
if action ~= "queue" then
|
||||||
summary.alreadyRunning = summary.alreadyRunning + 1
|
summary.alreadyRunning = summary.alreadyRunning + 1
|
||||||
|
if action == "resume" then run.stopped = false end
|
||||||
else
|
else
|
||||||
local startedHere = 0
|
local startedHere = 0
|
||||||
for _, result in ipairs(ADRunsController.startRun(adEnv, run.id)) do
|
for _, result in ipairs(ADRunsController.startRun(adEnv, run.id)) do
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||||
<modDesc descVersion="107">
|
<modDesc descVersion="107">
|
||||||
<author>masterdraco</author>
|
<author>masterdraco</author>
|
||||||
<version>1.60.11.0</version>
|
<version>1.60.13.0</version>
|
||||||
<title>
|
<title>
|
||||||
<en>AD Smart Pickup</en>
|
<en>AD Smart Pickup</en>
|
||||||
</title>
|
</title>
|
||||||
|
|||||||
@@ -1,267 +1,99 @@
|
|||||||
# FS25_ADSmartPickup
|
# AD Smart Pickup (FS25_ADSmartPickup)
|
||||||
|
|
||||||
**Brugermanual for spillere:** [dansk](docs/BRUGERMANUAL.md) · [English](docs/USER_MANUAL.md). Resten af denne fil er udviklernoter pr. version.
|
Tillæg til **AutoDrive** i Farming Simulator 25. Du fortæller, hvad der skal køres hvorhen, og moden
|
||||||
|
styrer dine AutoDrive-traktorer tur for tur. Markarbejdet kører med Courseplay på marken.
|
||||||
|
Alt sættes op i menuen **Smart Pickup** i ESC-menuen.
|
||||||
|
|
||||||
**Download / installation:** hent `FS25_ADSmartPickup.zip` under [Releases](https://git.powerdata.dk/masterdraco/fs25-adsmartpickup/releases) og læg zip-filen (ikke udpakket) i `Documents/My Games/FarmingSimulator2025/mods/`. Kræver **AutoDrive** (og gerne Courseplay til markarbejde). Fanen "Smart Pickup" ligger i ESC-menuen. Fejl og idéer: opret et issue her i repoet.
|
*English summary below.*
|
||||||
|
|
||||||
AutoDrive-tillæg til Farming Simulator 25 med to funktioner oven på Pickup&Deliver:
|
## Hvad moden gør
|
||||||
|
|
||||||
## 1. Vare-bevidst mappe-rotation (én vare valgt)
|
- **Forsyning:** holder stalde og fabrikker fyldt. Hver tur henter den vare, målet mangler mest, fra
|
||||||
|
den bedste silo på kortet.
|
||||||
|
- **Udkørsel:** tømmer fabrikker, stalde, siloer og palleskure. Varerne køres til lager eller sælges, når
|
||||||
|
prisen er tæt på årets top, uden at sælge det, gården selv skal bruge.
|
||||||
|
- **Flows:** en navngivet opskrift med bygninger, varer, regler og traktorer. Flows sættes op i en guide og
|
||||||
|
startes eller stoppes samlet fra en farvet liste.
|
||||||
|
- **Flow-vogne og maskinpulje:** en traktor uden vogn kan selv hente sin vogn ved en Connect-markør og
|
||||||
|
sætte den på plads igen. Frakoblede redskaber og ledige traktorer bruges som en fælles pulje.
|
||||||
|
- **Markarbejde:** slåning, høst, klargøring, såning og pleje på alle marker. AutoDrive kører på vejen,
|
||||||
|
og Courseplay arbejder på marken.
|
||||||
|
- **Marksiloer:** varer i marksiloer køres automatisk hjem til gårdens lagre.
|
||||||
|
- **Lagerfaner:** beholdning, værdi og forbrug pr. vare og bygning. Listen "Kræver handling" opretter
|
||||||
|
det flow, der løser problemet.
|
||||||
|
- **Stop alt og parkér:** stopper alt, folder redskaberne sammen og parkerer maskinerne. Pausen gemmes
|
||||||
|
med savegamet.
|
||||||
|
|
||||||
Når pålæsningsmål roteres i en AD-mappe, køres der direkte til den silo i mappen, der har den
|
## Download og installation
|
||||||
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)
|
1. Hent `FS25_ADSmartPickup.zip` under [Releases](https://git.powerdata.dk/masterdraco/fs25-adsmartpickup/releases).
|
||||||
|
2. Læg zip-filen (ikke udpakket) i `Documents/My Games/FarmingSimulator2025/mods/`.
|
||||||
|
3. Aktivér moden sammen med AutoDrive, når du vælger savegame. Menuen **Smart Pickup** ligger i
|
||||||
|
ESC-menuen lige over Indstillinger.
|
||||||
|
|
||||||
Én traktor holder alle input i en produktion fyldt — fx hø, græs, ensilage og sukkerroer til en
|
## Krav
|
||||||
TMR-blander — i stedet for én traktor pr. vare.
|
|
||||||
|
|
||||||
1. Aflæsningsmål = produktionens markør.
|
- **FS25_AutoDrive** (påkrævet) og et AutoDrive-vejnet mellem bygningerne.
|
||||||
2. Multi-vælg ingredienserne i AutoDrives vare-dropdown.
|
- **Courseplay** anbefales. Det er nødvendigt for markarbejdet.
|
||||||
3. Start Pickup&Deliver. Loop-tælleren virker som normalt (N læs → parkér, 0 = uendeligt).
|
- **Universal Autoload** anbefales på vogne, der skal køre paller.
|
||||||
|
|
||||||
Pr. tur læses målets lager; den ingrediens der mangler mest (relativt til kapacitet) hentes fra en
|
## Dokumentation
|
||||||
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`).
|
- Brugermanual: [dansk](docs/BRUGERMANUAL.md) · [English](docs/USER_MANUAL.md)
|
||||||
|
- Ændringer pr. version: [CHANGELOG.md](CHANGELOG.md)
|
||||||
|
|
||||||
### Fabriksstyret (v1.6): målet er et produktionspunkt
|
## Feedback
|
||||||
|
|
||||||
Er aflæsningsmålet en fabrik (produktionspunkt), **erstattes** ingredienslisten af inputs fra
|
Fejl og idéer: opret et issue her i repoet. Vedlæg gerne `log.txt` fra
|
||||||
fabrikkens ønskede produktioner — slår du fx TMR til i en AIO-fabrik, begynder traktoren at hente
|
`Documents/My Games/FarmingSimulator2025/`, eller i det mindste linjerne der starter med `ADSmartPickup`.
|
||||||
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
|
## Udvikling
|
||||||
`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)
|
- Mod-koden ligger i `FS25_ADSmartPickup/`, og testene ligger i `tests/` (ren Lua, kører uden spillet).
|
||||||
|
- Kør testene:
|
||||||
|
|
||||||
En fabriks læssestation udleverer også dens **inputs** (halm i en TMR-fabrik). Sådan en vare hentes
|
```sh
|
||||||
aldrig derfra — kun fabrikkens outputs og rigtige siloer er kilder. Gælder både mappe-logik og
|
for t in tests/test_*.lua; do luajit $t >/dev/null 2>&1 || echo FAIL $t; done
|
||||||
behovsstyring. Varer der både er input og output (kæde) må hentes.
|
```
|
||||||
|
|
||||||
### Stalde som mål (v1.6.1)
|
- Byg zip: `cd FS25_ADSmartPickup && zip -qr ../FS25_ADSmartPickup.zip .`
|
||||||
|
- Design og planer: `docs/superpowers/`
|
||||||
|
|
||||||
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)
|
## English summary
|
||||||
|
|
||||||
AutoDrive holder ellers en traktor med rest-læs stille ved aflæsningspunktet, til den er tømt — og
|
**AD Smart Pickup** is an add-on for **AutoDrive** in Farming Simulator 25. You tell it what goes where,
|
||||||
spærrer for de næste i køen. Med Wait-punkter:
|
and it drives your AutoDrive tractors trip by trip. Field work runs with Courseplay on the field. Everything
|
||||||
|
is set up in the **Smart Pickup** menu in the ESC menu.
|
||||||
|
|
||||||
1. Læg markører i en **mappe med ordet `Wait` i navnet** (fx mappen `Cow Wait`) — så mange du har
|
**Features**
|
||||||
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.
|
- **Supply:** keeps barns and factories filled. Each trip fetches the good the target lacks most, from
|
||||||
Ventende traktorer ser rotationen som slået fra, så AutoDrive ikke kører videre fra Wait-punktet.
|
the best silo on the map.
|
||||||
Ingen ledige Wait-punkter → AutoDrive venter ved målet som i dag (én advarsel i loggen).
|
- **Outbound:** empties factories, barns, silos and pallet sheds. Goods are stored or sold near the
|
||||||
Seks markører må gerne hedde det samme (fx `Cow Wait`); loggen viser markørnummeret.
|
yearly top price, and the mod never sells what the farm needs itself.
|
||||||
|
- **Flows:** a named recipe of buildings, goods, rules and tractors. You set flows up in a guide and
|
||||||
|
start or stop them from a colour-coded list.
|
||||||
|
- **Flow trailers and machine pool:** a tractor without a trailer can fetch its trailer at a Connect
|
||||||
|
marker and park it again. Detached implements and free tractors form a shared pool.
|
||||||
|
- **Field work:** mowing, harvesting, preparation, sowing and crop care on every field. AutoDrive
|
||||||
|
drives the roads and Courseplay works the field.
|
||||||
|
- **Field silos:** goods in field silos are brought home to the farm's storages automatically.
|
||||||
|
- **Storage tabs:** stock, value and consumption per good and building. The "Needs attention" list
|
||||||
|
creates the flow that fixes the problem.
|
||||||
|
- **Stop all and park:** stops everything, folds implements and parks the machines. The pause is saved
|
||||||
|
with the savegame.
|
||||||
|
|
||||||
**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
|
**Install:** download `FS25_ADSmartPickup.zip` from
|
||||||
i målet, forud; passer intet fuldt læs, tages den mest trængende alligevel (og Wait-punktet bruges).
|
[Releases](https://git.powerdata.dk/masterdraco/fs25-adsmartpickup/releases). Put the zip, not unpacked,
|
||||||
|
in `Documents/My Games/FarmingSimulator2025/mods/`.
|
||||||
|
|
||||||
**Opsætning med flere stalde:** én traktor (eller flere) pr. stald med *Rotér mål: kun pålæsning*.
|
**Requirements:** AutoDrive is required. Courseplay is needed for field work, and Universal Autoload is
|
||||||
Brug IKKE "pålæsning og aflæsning": AutoDrive vælger næste pålæsning FØR den roterer aflæsningsmålet,
|
needed for pallets.
|
||||||
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
|
**Docs:** [User manual](docs/USER_MANUAL.md) · [Danish manual](docs/BRUGERMANUAL.md) ·
|
||||||
|
[Changelog](CHANGELOG.md)
|
||||||
|
|
||||||
Et **run** er en navngivet opskrift: mål + varer + Wait-pulje + ture, samt en liste traktorer der skal
|
**Feedback:** open an issue in this repository. Attach `log.txt`, or at least the lines starting with
|
||||||
køre den. I stedet for at sætte AutoDrive op manuelt på hver traktor, defineres run'et ét sted og
|
`ADSmartPickup`.
|
||||||
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"). Sættes en traktor til
|
|
||||||
Nej (fjernet fra run'et), rører det IKKE dens AutoDrive-vareliste — run'ets varer forbliver valgt
|
|
||||||
i traktorens AD-vareliste (synlig/redigerbar i AD's eget HUD) indtil de ændres dér manuelt.
|
|
||||||
|
|
||||||
**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-afsnittet** nederst på siden 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: `'<navn>' bytter læs: N l STRAW tilbage i <markør> (markør n), målet mangler FORAGE` ved
|
|
||||||
bytte, og én gang pr. venteperiode `'<navn>' 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.
|
|
||||||
|
|
||||||
## v1.13 — Flow-tavle (bygningsbaseret opsætning)
|
|
||||||
|
|
||||||
ESC-fanen har nu to under-faner: **Flows** og **Lagre**. Flows viser én række pr. flow (run):
|
|
||||||
`> Mælk: Sukker · Kostald 1 + Kostald 2 → salg · pris ≥ 90 %, lager > 80 % · Virtus · kører (1/1) — SUGAR 78 % af top`
|
|
||||||
og under tavlen en detail-blok for det valgte flow: **Retning** (ind til bygning / ud fra bygning),
|
|
||||||
**Fra** (udkørsel) eller **Til** (forsyning) som afkrydsning pr. **bygning** — moden finder selv den
|
|
||||||
AD-markør der står nærmest bygningens læsse-/aflæsningstrigger (≤ 40 m; siloer via det strenge
|
|
||||||
opslag) og viser den: `Kostald 1 (stald) — markør 'cow 1 milk' 12 m` eller `INGEN MARKØR inden for
|
|
||||||
40 m`. Derefter Varer, Regler, Vent ved, Traktorer og Status som før. Forsyning har "Fra = alle
|
|
||||||
siloer" (som hidtil). Wait-puljerne står nederst.
|
|
||||||
|
|
||||||
Gamle runs oversættes automatisk: markører der er en bygnings markør bliver til bygningen; rå
|
|
||||||
markører uden bygning beholdes og vises som `markør '…'`. Start afviser med `'<bygning>' mangler en
|
|
||||||
AD-markør ved triggeren`, når en valgt bygning ingen markør har. Runs gemmes som XML version 3.
|
|
||||||
|
|
||||||
## v1.12 — Udkørsel af produkter
|
|
||||||
|
|
||||||
Et run har nu en **retning**: *Forsyning* (som hidtil) eller *Udkørsel*. ESC-fanen har tre
|
|
||||||
under-faner: **Oversigt** · **Forsyning** · **Udkørsel**.
|
|
||||||
|
|
||||||
Et udkørsels-run består af:
|
|
||||||
|
|
||||||
- **Kilder** (én eller flere AD-markører): en **fabrik** (produktionspunkt, dens outputs),
|
|
||||||
en **silo** (`spec_silo`, dens indhold) eller et **objektlager** (palle-/ballelager som HVF-
|
|
||||||
pakkens; paller tages ud automatisk). Kilden genkendes inden for 40 m af markøren.
|
|
||||||
- **Varer** med politik pr. vare: **Fra** · **Lager** · **Salg** · **Salg, ellers lager**.
|
|
||||||
Bulk-varer kræver tipvogn/tank; pallevarer kræver **Universal Autoload** på vognen.
|
|
||||||
- **Regler:** *Sælg fra* (% af årets toppris, standard 90), *Kør til lager over* (% fyldning i
|
|
||||||
kilden, standard 80), *Saml op på én tur* (opsamlingsrunde).
|
|
||||||
- Wait-pulje og traktorer som i forsynings-runs.
|
|
||||||
|
|
||||||
**Turvurdering** (før hver pålæsning, og hvert 5. sekund mens traktoren holder):
|
|
||||||
|
|
||||||
1. *Salg*: en vare med Salg-politik, hvis bedst betalende **nåelige** salgssted giver mindst
|
|
||||||
tærsklen af årets toppris — **kører uanset mængde**. Højeste pris-% først. Toppris = stationens
|
|
||||||
grundpris nu × (årets højeste periodefaktor ÷ nuværende). Stor efterspørgsel giver > 100 %.
|
|
||||||
2. *Lager*: en vare med Lager-politik, når der er et **fuldt læs** eller kildens lager er over
|
|
||||||
tærsklen — til nærmeste silo med plads til hele læsset og vejnet begge veje (aldrig en kilde,
|
|
||||||
fabrik eller stald). Mest fyldte kilde først.
|
|
||||||
3. Ingen tur → traktoren holder ved et ledigt Wait-punkt (run'ets pulje) og prøver igen.
|
|
||||||
Loggen viser hvorfor: `holder ved Wait 3: SUGAR 78 % af top (kræver 90), lager 41 %`.
|
|
||||||
|
|
||||||
**Opsamlingsrunde:** tipvogn = samme vare fra flere kilder efter tur til vognen er fuld (næste
|
|
||||||
kilde kun ved ≥ 10 % fri plads); autoload-vogn = flere pallevarer med samme mål på én tur.
|
|
||||||
|
|
||||||
**Objektlager:** markøren skal stå så vognens autoload-zone dækker lagerets spawn-område (som når
|
|
||||||
man læsser manuelt). Moden beder lageret spawne **én palle ad gangen** og venter til UAL har taget
|
|
||||||
den, så der aldrig ligger paller tilbage. Sidder lageret fast (kendt spilfejl), afsluttes
|
|
||||||
læsningen efter 30 s med det der er. Ved en autoload-kilde uden fremdrift i 15 s køres der med
|
|
||||||
det der er ("uanset mængde").
|
|
||||||
|
|
||||||
**Advarsler på skærmen:** kan intet salgssted nås (vejnet), eller findes ingen silo med plads,
|
|
||||||
vises en rød AutoDrive-notifikation (`'MT635' kan ikke nå salgssted 'Grain Elevator' for SUGAR –
|
|
||||||
tjek vejnettet`), samme tekst i AD's notifikations-historik, i log.txt (WARN) og i run'ets status.
|
|
||||||
Traktoren holder ved Wait og kører selv når vejen er koblet på. Advarslen gentages først når
|
|
||||||
traktor, station eller vare ændrer sig.
|
|
||||||
|
|
||||||
**Prisregel (v1.12.1, metode fra Distribution Redux):** pris-% = nuværende periodes faktor ÷ årets
|
|
||||||
højeste faktor i spillets faste sæsonkurve (samme data som prisgrafen) × stationens egen afvigelse
|
|
||||||
(effektiv pris ÷ stationens grundpris nu). Sværhedsgraden falder ud; flade kurver (top/bund < 1,02)
|
|
||||||
regnes som 100 %; stor efterspørgsel giver > 100 %.
|
|
||||||
|
|
||||||
**Reserve (v1.12.1):** før salg fratrækkes det gårdens egne fabrikker og stalde skal bruge det næste
|
|
||||||
døgn (forbrug × 24 t minus det de allerede har, højst deres fri plads; fabrikker = ønskede
|
|
||||||
produktioners inputs, stalde = foder/halm/vand-rate). Der sælges kun når et helt læs kan tages uden
|
|
||||||
at røre reserven. Loggen/UI'et siger fx `SUGARBEET: 196.0k reserveret til TMR-fabrik`. Lager-politik
|
|
||||||
rører ikke reserven (varen bliver på gården).
|
|
||||||
|
|
||||||
**Paller til lager (v1.12.1):** Lager-mål for pallevarer = nærmeste objektlager (palleskur) der tager
|
|
||||||
varen og har plads; AutoDrive læsser UAL-vognen af dér.
|
|
||||||
|
|
||||||
**Tætte siloer (AutoDrive-indstilling):** AutoDrive tipper ved den første aflæsningstrigger inden for sin
|
|
||||||
globale "Max trigger distance" (standard 25 m). Står siloerne tættere end det, kan nabosiloen få læsset —
|
|
||||||
sæt AD-indstillingen til **10 m**. Moden advarer i loggen første gang et lagermål har en anden
|
|
||||||
aflæsningsmarkør inden for afstanden.
|
|
||||||
|
|
||||||
**Fanen Lagre (v1.12.1):** gårdens beholdning pr. bygning (fabrikker med ▸ ved outputs, stalde,
|
|
||||||
palleskure som antal paller, siloer), opdateret hvert sekund.
|
|
||||||
|
|
||||||
**Opsætning:** Udkørsel-fanen → Nyt run → afkryds kilder → sæt politik pr. vare → Ja på traktorer
|
|
||||||
→ Start. AD-tilstand pr. traktor: PickupAndDeliver, 1./2. markør = første kilde (pladsholder,
|
|
||||||
sættes pr. tur), rotation "kun pålæsning". Runs gemmes i `ADSmartPickup_runs.xml` version 2;
|
|
||||||
ældre filer læses som forsynings-runs.
|
|
||||||
|
|
||||||
## 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" (global AutoDrive-indstilling, gælder hele spillet) +
|
|
||||||
"Rotér mål: pålæsning" på køretøjet (pr. køretøj).
|
|
||||||
- **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: `for t in tests/test_*.lua; do luajit $t | tail -1; done`
|
|
||||||
Byg: `cd FS25_ADSmartPickup && zip -qr ../FS25_ADSmartPickup.zip .`
|
|
||||||
Design/plan: `docs/superpowers/`
|
|
||||||
|
|||||||
+729
-334
File diff suppressed because it is too large
Load Diff
+867
-454
File diff suppressed because it is too large
Load Diff
@@ -22,5 +22,12 @@ local vehicles = {{id = "a"}, {id = "b", aiActive = true}, {id = "c", controlled
|
|||||||
local start = R.toStart(pending, vehicles)
|
local start = R.toStart(pending, vehicles)
|
||||||
check("start: kun gemte, ikke allerede kørende/spiller i", table.concat(start, " "), "a d")
|
check("start: kun gemte, ikke allerede kørende/spiller i", table.concat(start, " "), "a d")
|
||||||
check("start: ingen gemt liste -> nil (gammel regel bruges)", R.toStart(nil, vehicles), nil)
|
check("start: ingen gemt liste -> nil (gammel regel bruges)", R.toStart(nil, vehicles), nil)
|
||||||
|
|
||||||
|
-- kun når CP's HUD-job er markarbejde: moddets markopgaver starter CP med eget job, så HUD'en kan stå på fx
|
||||||
|
-- bunkersilo — HUD-start gav "CP: No silo found" efter genindlæsning (in-game 29/9)
|
||||||
|
local mixed = R.toStart({a = true, b = true, c = true}, {
|
||||||
|
{id = "a", fieldWork = true}, {id = "b", fieldWork = false}, {id = "c"}})
|
||||||
|
check("start: kun markarbejds-job", table.concat(mixed, ","), "a,c")
|
||||||
|
|
||||||
print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL"))
|
print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL"))
|
||||||
os.exit(failures == 0 and 0 or 1)
|
os.exit(failures == 0 and 0 or 1)
|
||||||
|
|||||||
@@ -373,5 +373,13 @@ do
|
|||||||
check("besked: TMR har traktorer tilbage", notes[1].runName .. "/" .. notes[1].left .. "/" .. tostring(notes[1].critical), "TMR/1/false")
|
check("besked: TMR har traktorer tilbage", notes[1].runName .. "/" .. notes[1].left .. "/" .. tostring(notes[1].critical), "TMR/1/false")
|
||||||
check("besked: Solo står tom -> rød", notes[2].runName .. "/" .. notes[2].left .. "/" .. tostring(notes[2].critical), "Solo/0/true")
|
check("besked: Solo står tom -> rød", notes[2].runName .. "/" .. notes[2].left .. "/" .. tostring(notes[2].critical), "Solo/0/true")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Start alle: et flow på pause (Stop alt) skal have pausen ophævet, også når dets traktorer allerede kører AD
|
||||||
|
-- (in-game 29/9: 5 flows blev talt som 'kørte allerede', forblev stoppede, og traktorerne kørte vognen hjem igen)
|
||||||
|
check("start alle: kører ikke -> i kø", ADRuns.startAllAction(false, true), "queue")
|
||||||
|
check("start alle: kører ikke, ikke stoppet -> i kø", ADRuns.startAllAction(false, false), "queue")
|
||||||
|
check("start alle: kører men stoppet -> ophæv pause", ADRuns.startAllAction(true, true), "resume")
|
||||||
|
check("start alle: kører og ikke stoppet -> intet", ADRuns.startAllAction(true, false), "skip")
|
||||||
|
|
||||||
print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL"))
|
print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL"))
|
||||||
os.exit(failures == 0 and 0 or 1)
|
os.exit(failures == 0 and 0 or 1)
|
||||||
|
|||||||
Reference in New Issue
Block a user