fix: forsyning med flere mål vælger målet med færrest andre vogne på vej før mindst fyldte (3 biogas-vogne i kø ved samme drop) (v1.28.3.0)
This commit is contained in:
@@ -372,18 +372,22 @@ function ADRunsController.chooseTarget(adEnv, run, vehicle)
|
|||||||
end
|
end
|
||||||
local farmId = ADSmartPickup.getFarmId(vehicle)
|
local farmId = ADSmartPickup.getFarmId(vehicle)
|
||||||
local ingredients = ADRunsController.getRunIngredients(adEnv, run, 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
|
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
|
-- 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 pending = ADSmartPickup.getPending ~= nil and ADSmartPickup.getPending(entry.wayPointId, vehicle) or nil
|
||||||
local ranked = ADSmartPickup.getTargetNeedsRanked(entry.station, ingredients, farmId, pending)
|
local ranked = ADSmartPickup.getTargetNeedsRanked(entry.station, ingredients, farmId, pending)
|
||||||
local need = ranked[1]
|
local need = ranked[1]
|
||||||
if need ~= nil and need.freeSpace >= (ADSupplyPlanner.MIN_FREE_LITERS or 1000) then
|
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
|
local isBetter = bestNeed == nil
|
||||||
or (need.fits == true and bestNeed.fits ~= true)
|
or inbound < bestInbound
|
||||||
or (need.fits == bestNeed.fits and need.score > bestNeed.score)
|
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
|
if isBetter then
|
||||||
bestId, bestNeed = entry.wayPointId, need
|
bestId, bestNeed, bestInbound = entry.wayPointId, need, inbound
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -672,6 +672,15 @@ function ADSmartPickup.getPending(wayPointId, excludeVehicle)
|
|||||||
return pending
|
return pending
|
||||||
end
|
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).
|
-- 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)
|
function ADSmartPickup.getTargetNeedsRanked(station, fillTypes, farmId, pending)
|
||||||
local needs = getTargetNeeds(station, fillTypes, farmId, {})
|
local needs = getTargetNeeds(station, fillTypes, farmId, {})
|
||||||
|
|||||||
@@ -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.28.2.0</version>
|
<version>1.28.3.0</version>
|
||||||
<title>
|
<title>
|
||||||
<en>AD Smart Pickup</en>
|
<en>AD Smart Pickup</en>
|
||||||
</title>
|
</title>
|
||||||
|
|||||||
@@ -402,6 +402,15 @@ check("C16 vælger stald 2 (tom)", ADRunsController.chooseTarget(adEnv, multiRun
|
|||||||
unloadAt[99].levels = {[STRAW] = 290000, [TMR] = 290000}
|
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 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)
|
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}})
|
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")
|
check("C16 kun ukendte mål -> noTarget", ADRunsController.validateVehicle(adEnv, ADRuns.getRun(ADRunsController.store, multi.id), multiVehicle).reason, "noTarget")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user