diff --git a/FS25_ADSmartPickup/adSmartPickup.lua b/FS25_ADSmartPickup/adSmartPickup.lua index e76e227..86d3cdc 100644 --- a/FS25_ADSmartPickup/adSmartPickup.lua +++ b/FS25_ADSmartPickup/adSmartPickup.lua @@ -186,13 +186,27 @@ function ADSmartPickup.findLeastFilledPickup(adEnv, driver) return findLeastFilled(collectMarkerStations(adEnv, groupMarkers, farmId, nil), fillTypes, farmId) end +-- Lagrene bag aflæsningsstationen; produktionspunkter uden targetStorages læses direkte. +local function getTargetStorages(station) + if station.targetStorages ~= nil and next(station.targetStorages) ~= nil then + return station.targetStorages + end + local placeable = station.owningPlaceable + local productionPoint = placeable ~= nil and placeable.spec_productionPoint ~= nil and placeable.spec_productionPoint.productionPoint or nil + if productionPoint ~= nil and productionPoint.storage ~= nil then + return {productionPoint.storage} + end + return {} +end + -- Niveau + kapacitet pr. ingrediens i aflæsningsmålets lager. local function getTargetNeeds(station, ingredients, farmId) local needs = {} + local storages = getTargetStorages(station) for _, fillType in ipairs(ingredients) do if station.getIsFillTypeSupported == nil or station:getIsFillTypeSupported(fillType) then local level, freeSpace = 0, 0 - for _, storage in pairs(station.targetStorages or {}) do + for _, storage in pairs(storages) do level = level + (storage:getFillLevel(fillType) or 0) freeSpace = freeSpace + (storage:getFreeCapacity(fillType) or 0) end diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index a052179..a2e5c61 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,16 +1,17 @@ masterdraco - 1.0.0.0 + 1.1.0.0 <en>AD Smart Pickup</en> - + icon.dds + diff --git a/README.md b/README.md index f639817..d86fad0 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,39 @@ # FS25_ADSmartPickup -AutoDrive-tillæg til Farming Simulator 25: 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** — i stedet for -at prøve markørerne én efter én. +AutoDrive-tillæg til Farming Simulator 25 med to funktioner oven på Pickup&Deliver: + +## 1. Vare-bevidst mappe-rotation (én vare valgt) + +Når pålæsningsmål roteres i en AD-mappe, køres der direkte til den silo i mappen, der har den +valgte vare — **mindst fyldte først** — i stedet for at prøve markørerne én efter én. + +## 2. Behovsstyret forsyning (flere varer valgt) + +Én traktor holder alle input i en produktion fyldt — fx hø, græs, ensilage og sukkerroer til en +TMR-blander — i stedet for én traktor pr. vare. + +1. Aflæsningsmål = produktionens markør. +2. Multi-vælg ingredienserne i AutoDrives vare-dropdown. +3. Start Pickup&Deliver. Loop-tælleren virker som normalt (N læs → parkér, 0 = uendeligt). + +Pr. tur læses målets lager; den ingrediens der mangler mest (relativt til kapacitet) hentes fra en +silo **hvor som helst på kortet** (eget lager før nabo-lån, mindst fyldte først). Ingredienser uden +plads i målet (< 1000 l fri) eller uden kilde springes over. Mens AD kører viser HUD'en kun turens +vare (AutoDrive ville ellers selv rotere vare ved triggeren); når AD stopper, gendannes hele listen. +Slå fra ved at vælge en anden enkelt vare. + +"Mest brug for" defineres i `ADSupplyPlanner.scoreNeed` (`adSupplyPlanner.lua`). + +## 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`). -- Finder den ingen silo med varen, eller fejler et spil-API, bruges AutoDrives originale rotation. +- Intet fund, intet behov eller fejl i et spil-API → AutoDrives originale rotation. Valg logges som `ADSmartPickup:` i log.txt. - Kræver i AutoDrive: "Brug mapper" + "Rotér mål: pålæsning" på køretøjet. -Test: `luajit tests/test_adSmartPickup.lua` · Byg: zip indholdet af `FS25_ADSmartPickup/` til `FS25_ADSmartPickup.zip`. +Begrænsninger: AD læsser fuld vogn — er der mindre plads i målet end ét læs, venter traktoren ved +aflæsning. Målet skal være en placeable med aflæsningstrigger (ikke en blandevogn). + +Test: `luajit tests/test_adSupplyPlanner.lua && luajit tests/test_adSmartPickup.lua` +Byg: `cd FS25_ADSmartPickup && zip -qr ../FS25_ADSmartPickup.zip .` +Design/plan: `docs/superpowers/` diff --git a/tests/test_adSmartPickup.lua b/tests/test_adSmartPickup.lua index d67b0f3..4eab065 100644 --- a/tests/test_adSmartPickup.lua +++ b/tests/test_adSmartPickup.lua @@ -254,5 +254,14 @@ feeder = makeSupplyDriver(markerByIndex(1), markerByIndex(10), {HAY, GRASS}) check("S9 fejl giver fallback", manager:getNextPickup(feeder, false), "ORIGINAL") check("S9 fejl logges som advarsel", logLines[#logLines]:sub(1, 4), "WARN") +-- S10: stationen eksponerer ikke targetStorages -> lageret læses fra produktionspunktet +buildFeedWorld() +local bareStation = unloadStations[1] +local productionStorage = next(bareStation.targetStorages) +bareStation.targetStorages = nil +bareStation.owningPlaceable = {spec_productionPoint = {productionPoint = {storage = productionStorage}}} +feeder = makeSupplyDriver(markerByIndex(1), markerByIndex(10), {HAY, GRASS, SILAGE}) +check("S10 lager læses fra produktionspunktet", manager:getNextPickup(feeder, false), 3) + print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) os.exit(failures == 0 and 0 or 1)