diff --git a/FS25_ADSmartPickup/adSmartPickup.lua b/FS25_ADSmartPickup/adSmartPickup.lua index f888563..04f7fc5 100644 --- a/FS25_ADSmartPickup/adSmartPickup.lua +++ b/FS25_ADSmartPickup/adSmartPickup.lua @@ -736,6 +736,37 @@ local function chooseRunTarget(adEnv, driver) Logging.info(ADSmartPickup.LOG_PREFIX .. "'%s' kører til %s (%s)", tostring(ADRuns.vehicleLabel(driver)), marker ~= nil and tostring(marker.name) or tostring(targetId), why) end +local tryOtherRunTargets +-- Det valgte mål har intet der kan hentes (kilden er tom, eller andre traktorer har allerede læs på vej +-- til det): prøv run'ets ANDRE mål, og skift AD's aflæsningsmål til det første der kan forsynes. +-- Ellers holdt traktoren ved Wait mens fx fire andre DOB'er ved samme biogasanlæg stod tomme. +tryOtherRunTargets = function(adEnv, driver, ingredients) + local run = ADRunsController ~= nil and ADRunsController.getRunForVehicle(driver) or nil + if run == nil or (run.kind or "supply") ~= "supply" then + return nil + end + -- AD's mål er midlertidigt en silo (forkert last læsses af): rør det ikke + if ADUnloadWait ~= nil and ADUnloadWait.getPendingTargetRestore ~= nil and ADUnloadWait.getPendingTargetRestore(driver) ~= nil then + return nil + end + local stateModule = driver.ad.stateModule + local current = stateModule.getSecondMarker ~= nil and stateModule:getSecondMarker() or nil + local currentId = current ~= nil and current.id or nil + for _, targetId in ipairs(ADRunsController.getRunTargets(run)) do + if targetId ~= currentId then + local choice = ADSmartPickup.findSupplyPickup(adEnv, driver, ingredients, targetId) + if choice ~= nil and stateModule.setSecondMarkerByWayPointId ~= nil then + stateModule:setSecondMarkerByWayPointId(targetId) + local marker = adEnv.ADGraphManager.getMapMarkerByWayPointId ~= nil and adEnv.ADGraphManager:getMapMarkerByWayPointId(targetId) or nil + Logging.info(ADSmartPickup.LOG_PREFIX .. "'%s' kører til %s (intet at hente til %s)", tostring(ADRuns.vehicleLabel(driver)), + marker ~= nil and tostring(marker.name) or tostring(targetId), current ~= nil and tostring(current.name) or "?") + return choice + end + end + end + return nil +end + -- Samlet valg: behovsstyret med ingrediensliste, ellers mappe-logik. nil = AutoDrives original. function ADSmartPickup.choosePickup(adEnv, driver) enRoute[driver] = nil -- ny tur: forrige læs er leveret (eller opgivet) @@ -747,6 +778,9 @@ function ADSmartPickup.choosePickup(adEnv, driver) end local choice = ADSmartPickup.findSupplyPickup(adEnv, driver, ingredients) + if choice == nil then + choice = tryOtherRunTargets(adEnv, driver, ingredients) + end if choice == nil then -- Traktor i et forsynings-run uden noget (tilladt) at hente: hold ved Wait og prøv igen, i stedet -- for at falde tilbage til mappe-logikken (den henter hvad som helst, fx ensilage i et halvfuldt trug). @@ -762,7 +796,7 @@ function ADSmartPickup.choosePickup(adEnv, driver) activePickups[driver] = {station = next.station, fillTypes = next.fillTypes, markerName = next.markerName, fillType = next.fillType} return next.markerId end - local held = ADOutbound.holdSupplyVehicle(adEnv, driver, run, {"intet at hente (bedste foder mangler, truget ikke nødlidende)"}, replan) + local held = ADOutbound.holdSupplyVehicle(adEnv, driver, run, {"intet at hente til nogen af run'ets mål (tom kilde, læs på vej, eller bedste foder mangler)"}, replan) if held ~= nil then return held end diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index 91781bc..38d92e6 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.18.1.0 + 1.18.2.0 <en>AD Smart Pickup</en> diff --git a/docs/BRUGERMANUAL.md b/docs/BRUGERMANUAL.md index 05348b6..0286f14 100644 --- a/docs/BRUGERMANUAL.md +++ b/docs/BRUGERMANUAL.md @@ -1,6 +1,6 @@ # AD Smart Pickup — brugermanual -Version 1.18.1 · Farming Simulator 25 · tillæg til AutoDrive +Version 1.18.2 · Farming Simulator 25 · tillæg til AutoDrive *English version: [USER_MANUAL.md](USER_MANUAL.md)* diff --git a/docs/USER_MANUAL.md b/docs/USER_MANUAL.md index e7ed895..c8c7314 100644 --- a/docs/USER_MANUAL.md +++ b/docs/USER_MANUAL.md @@ -1,6 +1,6 @@ # AD Smart Pickup — user manual -Version 1.18.1 · Farming Simulator 25 · add-on for AutoDrive +Version 1.18.2 · Farming Simulator 25 · add-on for AutoDrive *Dansk version: [BRUGERMANUAL.md](BRUGERMANUAL.md)* diff --git a/tests/test_adSmartPickup.lua b/tests/test_adSmartPickup.lua index 38bbd7f..6b3cd47 100644 --- a/tests/test_adSmartPickup.lua +++ b/tests/test_adSmartPickup.lua @@ -988,6 +988,27 @@ check("I6 næste tur: halm til stald 2", manager:getNextPickup(i6, false), 21) check("I6 mål skiftet til stald 2", i6.ad.stateModule.secondMarkerId, 31) ADRunsController.store = ADRuns.newStore() +-- I7: det valgte mål har intet der kan hentes (TMR-kilden er tom) -> prøv run'ets ANDRE mål før Wait +-- (in-game 24/9: to traktorer fik begge 'Biogas Drop 1'; nr. 2 holdt selv om 4 DOB'er var tomme) +buildCowWorld() +addMarker(31, "Cow 2 Food", "Cow Food", 6000, 0) +local cow2LevelsI7 = {[STRAW] = 10000, [TMR] = 100000} +table.insert(unloadStations, makeUnloadStation(131, 6000, 10, cow2LevelsI7, {[STRAW] = 100000, [TMR] = 100000}, {name = "kostald 2"})) +cowLevels[STRAW], cowLevels[TMR] = 100000, 0 -- stald 1 mangler KUN TMR (mest trængende) +stations[1].getFillLevel = function(_, fillType) return fillType == STRAW and 5000 or 0 end -- TMR-kilden tom +local i7 = makeSupplyDriver(markerByIndex(21), markerByIndex(30), {TMR, STRAW}) +i7.uniqueId = "vehicleI7"; i7.carriable = {TMR, STRAW}; i7.trailers = {level = 0, capacity = 8000} +i7.ad.stateModule.setSecondMarkerByWayPointId = function(self, id) self.secondMarkerId = id end +i7.ad.stateModule.getSecondMarker = function(self) return markerByIndex(self.secondMarkerId or 30) end +testVehicles = {i7} +ADRunsController.store = ADRuns.newStore() +local twoBarnsI7 = ADRunsController.createRun("Kvæg2") +ADRunsController.updateRun(twoBarnsI7.id, {targetWayPointIds = {30, 31}}) +ADRunsController.assignVehicle(twoBarnsI7.id, i7) +check("I7 henter halm til det andet mål", manager:getNextPickup(i7, false), 21) +check("I7 AD's mål skiftet til stald 2", i7.ad.stateModule.secondMarkerId, 31) +ADRunsController.store = ADRuns.newStore() + -- ==== V: forkert last på vognen ==== -- V1: pålæsning starter med anden vare på vognen -> opgaven afsluttes straks (AD leverer det den har) buildCowWorld()