diff --git a/FS25_ADSmartPickup/adLoadSwap.lua b/FS25_ADSmartPickup/adLoadSwap.lua index 30533c5..4a58ab9 100644 --- a/FS25_ADSmartPickup/adLoadSwap.lua +++ b/FS25_ADSmartPickup/adLoadSwap.lua @@ -9,6 +9,8 @@ ADLoadSwap = {} ADLoadSwap.LOG_PREFIX = "ADSmartPickup: " -- Opslaget går over alle markører; ventende traktorer tjekker derfor kun så tit. ADLoadSwap.CHECK_INTERVAL_MS = 5000 +-- Byt også når et fuldt læs ikke passer, hvis den manglende vare mangler mindst så stor en andel af sit lager. +ADLoadSwap.MIN_MISSING_FRACTION = 0.25 local warnedNoSilo = setmetatable({}, {__mode = "k"}) @@ -19,7 +21,15 @@ function ADLoadSwap.findMissingIngredient(adEnv, vehicle, restFillType, homeWayP return nil end local choice = ADSmartPickup.findSupplyPickup(adEnv, vehicle, ingredients, homeWayPointId) - if choice == nil or choice.fillType == nil or choice.fillType == restFillType or choice.need.fits ~= true then + if choice == nil or choice.fillType == nil or choice.fillType == restFillType then + return nil + end + -- Et fuldt læs der passer er det bedste; men er vognen større end staldens lager, passer det aldrig + -- (Fastrac med stor vogn ved en kostald) — så er det nok at varen mangler en tydelig del. + local need = choice.need + local missesEnough = need.capacity ~= nil and need.capacity > 0 and need.freeSpace ~= nil + and need.freeSpace >= need.capacity * ADLoadSwap.MIN_MISSING_FRACTION + if need.fits ~= true and not missesEnough then return nil end return choice diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index 3fd16d4..24cb6ed 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.13.6.0 + 1.13.7.0 <en>AD Smart Pickup</en> diff --git a/tests/test_adSmartPickup.lua b/tests/test_adSmartPickup.lua index f84b62f..b0e0151 100644 --- a/tests/test_adSmartPickup.lua +++ b/tests/test_adSmartPickup.lua @@ -861,14 +861,23 @@ check("S1 AD's mål peger midlertidigt på siloen (ellers tipper AD ikke)", sv.a UnloadTask.finished(st) check("S1 mål gendannet efter aflæsning", sv.ad.stateModule.secondMarkerId, 30) --- S2: målet mangler IKKE et fuldt læs af TMR -> bliv ved Wait +-- S2: målet mangler kun lidt TMR (10 % af lageret) og et fuldt læs passer ikke -> bliv ved Wait buildSwapWorld() -waitBarnLevels[TMR] = 75000 -- 25000 fri < 40000 vogn +waitBarnLevels[TMR] = 90000 -- 10000 fri < 40000 vogn og < 25 % af 100000 local sv2, st2 = makeUnloadingVehicle("Fastrac Bliv", 522, 5000, 35000) UnloadTask.update(st2, 16) UnloadTask.update(st2, ADLoadSwap.CHECK_INTERVAL_MS + 1) check("S2 bliver ved Wait", st2.destinationID, 40) +-- S2b: vognen er større end stalden (fuldt læs passer aldrig), men TMR mangler 25 % -> byt alligevel +-- (in-game 24/9: Fastrac'erne byttede aldrig, fordi vognen er større end staldens lager) +buildSwapWorld() +waitBarnLevels[TMR] = 75000 -- 25000 fri < 40000 vogn, men = 25 % af 100000 +local sv2b, st2b = makeUnloadingVehicle("Fastrac Stor", 526, 5000, 35000) +UnloadTask.update(st2b, 16) +UnloadTask.update(st2b, ADLoadSwap.CHECK_INTERVAL_MS + 1) +check("S2b bytter når 25 % mangler", st2b.destinationID, 21) + -- S3: ingen silo med plads/vare -> bliv ved Wait, én WARN buildSwapWorld() stations[2].getFreeCapacity = function() return 1000 end