Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d420d5026d | |||
| 5827143327 |
+427
@@ -0,0 +1,427 @@
|
||||
# Æ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.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.
|
||||
@@ -43,6 +43,15 @@ local function clampRange(value, default, min, max)
|
||||
end
|
||||
|
||||
-- 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)
|
||||
local copy = {}
|
||||
for tractorId, wagonId in pairs(wagons or {}) do copy[tractorId] = wagonId end
|
||||
|
||||
@@ -1137,8 +1137,10 @@ function ADRunsController.queueStartAll(adEnv)
|
||||
local queue = {}
|
||||
for _, run in ipairs(ADRunsController.store.runs) do
|
||||
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
|
||||
if action == "resume" then run.stopped = false end
|
||||
else
|
||||
run.stopped = false
|
||||
for _, vehicleId in ipairs(run.vehicleIds) do
|
||||
@@ -1310,8 +1312,10 @@ function ADRunsController.startAllRuns(adEnv)
|
||||
local summary = {runsStarted = 0, alreadyRunning = 0, vehiclesStarted = 0, results = {}}
|
||||
for _, run in ipairs(ADRunsController.store.runs) do
|
||||
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
|
||||
if action == "resume" then run.stopped = false end
|
||||
else
|
||||
local startedHere = 0
|
||||
for _, result in ipairs(ADRunsController.startRun(adEnv, run.id)) do
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<modDesc descVersion="107">
|
||||
<author>masterdraco</author>
|
||||
<version>1.60.11.0</version>
|
||||
<version>1.60.12.0</version>
|
||||
<title>
|
||||
<en>AD Smart Pickup</en>
|
||||
</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
|
||||
valgte vare — mindst fyldte først (mælk/gylle: fyldeste først) — i stedet for at prøve markørerne én efter én.
|
||||
## Download og installation
|
||||
|
||||
## 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
|
||||
TMR-blander — i stedet for én traktor pr. vare.
|
||||
## Krav
|
||||
|
||||
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).
|
||||
- **FS25_AutoDrive** (påkrævet) og et AutoDrive-vejnet mellem bygningerne.
|
||||
- **Courseplay** anbefales. Det er nødvendigt for markarbejdet.
|
||||
- **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
|
||||
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.
|
||||
## Dokumentation
|
||||
|
||||
"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
|
||||
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.
|
||||
Fejl og idéer: opret et issue her i repoet. Vedlæg gerne `log.txt` fra
|
||||
`Documents/My Games/FarmingSimulator2025/`, eller i det mindste linjerne der starter med `ADSmartPickup`.
|
||||
|
||||
- **Ø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.
|
||||
## Udvikling
|
||||
|
||||
### 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
|
||||
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.
|
||||
```sh
|
||||
for t in tests/test_*.lua; do luajit $t >/dev/null 2>&1 || echo FAIL $t; done
|
||||
```
|
||||
|
||||
### 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
|
||||
spærrer for de næste i køen. Med Wait-punkter:
|
||||
**AD Smart Pickup** is an add-on for **AutoDrive** in Farming Simulator 25. You tell it what goes where,
|
||||
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
|
||||
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).
|
||||
**Features**
|
||||
|
||||
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.
|
||||
- **Supply:** keeps barns and factories filled. Each trip fetches the good the target lacks most, from
|
||||
the best silo on the map.
|
||||
- **Outbound:** empties factories, barns, silos and pallet sheds. Goods are stored or sold near the
|
||||
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
|
||||
i målet, forud; passer intet fuldt læs, tages den mest trængende alligevel (og Wait-punktet bruges).
|
||||
**Install:** download `FS25_ADSmartPickup.zip` from
|
||||
[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*.
|
||||
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.
|
||||
**Requirements:** AutoDrive is required. Courseplay is needed for field work, and Universal Autoload is
|
||||
needed for pallets.
|
||||
|
||||
## 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
|
||||
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.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/`
|
||||
**Feedback:** open an issue in this repository. Attach `log.txt`, or at least the lines starting with
|
||||
`ADSmartPickup`.
|
||||
|
||||
+729
-334
File diff suppressed because it is too large
Load Diff
+867
-454
File diff suppressed because it is too large
Load Diff
@@ -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: Solo står tom -> rød", notes[2].runName .. "/" .. notes[2].left .. "/" .. tostring(notes[2].critical), "Solo/0/true")
|
||||
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"))
|
||||
os.exit(failures == 0 and 0 or 1)
|
||||
|
||||
Reference in New Issue
Block a user