From 41e50ccec8111085beb7862800ef0b816109ce8b Mon Sep 17 00:00:00 2001 From: masterdraco Date: Sat, 26 Sep 2026 11:54:14 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20forsyning=20med=20flere=20m=C3=A5l=20v?= =?UTF-8?q?=C3=A6lger=20m=C3=A5let=20med=20f=C3=A6rrest=20andre=20vogne=20?= =?UTF-8?q?p=C3=A5=20vej=20f=C3=B8r=20mindst=20fyldte=20(3=20biogas-vogne?= =?UTF-8?q?=20i=20k=C3=B8=20ved=20samme=20drop)=20(v1.28.3.0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FS25_ADSmartPickup/adRunsController.lua | 12 ++++++++---- FS25_ADSmartPickup/adSmartPickup.lua | 9 +++++++++ FS25_ADSmartPickup/modDesc.xml | 2 +- tests/test_adRunsController.lua | 9 +++++++++ 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/FS25_ADSmartPickup/adRunsController.lua b/FS25_ADSmartPickup/adRunsController.lua index db0630e..3dbf707 100644 --- a/FS25_ADSmartPickup/adRunsController.lua +++ b/FS25_ADSmartPickup/adRunsController.lua @@ -372,18 +372,22 @@ function ADRunsController.chooseTarget(adEnv, run, vehicle) end local farmId = ADSmartPickup.getFarmId(vehicle) local ingredients = ADRunsController.getRunIngredients(adEnv, run, vehicle) - local bestId, bestNeed = nil, nil + local bestId, bestNeed, bestInbound = nil, nil, 0 for _, entry in ipairs(getTargetStations(adEnv, run, farmId)) do -- læs andre traktorer er på vej med til stalden, tæller med — så fordeler de sig på staldene local pending = ADSmartPickup.getPending ~= nil and ADSmartPickup.getPending(entry.wayPointId, vehicle) or nil local ranked = ADSmartPickup.getTargetNeedsRanked(entry.station, ingredients, farmId, pending) local need = ranked[1] if need ~= nil and need.freeSpace >= (ADSupplyPlanner.MIN_FREE_LITERS or 1000) then + -- færrest andre vogne på vej først: et drop (drive-on-bunker, trug) tager én ad gangen, så tre + -- vogne mod det mindst fyldte mål holder i kø mens de andre mål står tomme (in-game 26/9) + local inbound = ADSmartPickup.countEnRoute ~= nil and ADSmartPickup.countEnRoute(entry.wayPointId, vehicle) or 0 local isBetter = bestNeed == nil - or (need.fits == true and bestNeed.fits ~= true) - or (need.fits == bestNeed.fits and need.score > bestNeed.score) + or inbound < bestInbound + or (inbound == bestInbound and need.fits == true and bestNeed.fits ~= true) + or (inbound == bestInbound and need.fits == bestNeed.fits and need.score > bestNeed.score) if isBetter then - bestId, bestNeed = entry.wayPointId, need + bestId, bestNeed, bestInbound = entry.wayPointId, need, inbound end end end diff --git a/FS25_ADSmartPickup/adSmartPickup.lua b/FS25_ADSmartPickup/adSmartPickup.lua index 7b08de6..e026122 100644 --- a/FS25_ADSmartPickup/adSmartPickup.lua +++ b/FS25_ADSmartPickup/adSmartPickup.lua @@ -672,6 +672,15 @@ function ADSmartPickup.getPending(wayPointId, excludeVehicle) return pending end +-- Antal ANDRE traktorer på vej til målet (målvalget fordeler vognene på flere drops). +function ADSmartPickup.countEnRoute(wayPointId, excludeVehicle) + local count = 0 + for vehicle, entry in pairs(enRoute) do + if vehicle ~= excludeVehicle and entry.wayPointId == wayPointId then count = count + 1 end + end + return count +end + -- pending (valgfri): læs på vej til målet, lægges oven i (fanen og mål-valget mellem stalde). function ADSmartPickup.getTargetNeedsRanked(station, fillTypes, farmId, pending) local needs = getTargetNeeds(station, fillTypes, farmId, {}) diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index b3b2ca3..3233bfc 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.28.2.0 + 1.28.3.0 <en>AD Smart Pickup</en> diff --git a/tests/test_adRunsController.lua b/tests/test_adRunsController.lua index 0f66022..0ff6306 100644 --- a/tests/test_adRunsController.lua +++ b/tests/test_adRunsController.lua @@ -402,6 +402,15 @@ check("C16 vælger stald 2 (tom)", ADRunsController.chooseTarget(adEnv, multiRun unloadAt[99].levels = {[STRAW] = 290000, [TMR] = 290000} check("C16 vælger stald 1 når stald 2 er fuld", ADRunsController.chooseTarget(adEnv, multiRun, multiVehicle), 94) check("C16 validering ok med flere mål", ADRunsController.validateVehicle(adEnv, multiRun, multiVehicle).ok, true) +-- C16b: en anden vogn er allerede på vej til stald 2 — så vælges stald 1 selvom stald 2 er mindre fyldt +-- (drive-on-bunker: kun én kan tippe ad gangen; in-game 26/9 kørte 3 biogas-vogne til samme drop) +unloadAt[99].levels = {[STRAW] = 100000, [TMR] = 100000} +unloadAt[94].levels = {[STRAW] = 200000, [TMR] = 200000, [WATER] = 50000} +ADSmartPickup.countEnRoute = function(id, exclude) return id == 99 and 1 or 0 end +check("C16b ledigt mål foran mindre fyldt mål med vogn på vej", ADRunsController.chooseTarget(adEnv, multiRun, multiVehicle), 94) +ADSmartPickup.countEnRoute = function() return 1 end +check("C16b lige mange på vej -> mindst fyldte", ADRunsController.chooseTarget(adEnv, multiRun, multiVehicle), 99) +ADSmartPickup.countEnRoute = nil ADRunsController.updateRun(multi.id, {targetWayPointIds = {4242}}) check("C16 kun ukendte mål -> noTarget", ADRunsController.validateVehicle(adEnv, ADRuns.getRun(ADRunsController.store, multi.id), multiVehicle).reason, "noTarget")