diff --git a/FS25_ADSmartPickup/adFieldJobs.lua b/FS25_ADSmartPickup/adFieldJobs.lua index 82d7d28..0fb1053 100644 --- a/FS25_ADSmartPickup/adFieldJobs.lua +++ b/FS25_ADSmartPickup/adFieldJobs.lua @@ -89,6 +89,19 @@ function ADFieldJobs.shouldResume(s) return type(s.distance) == "number" and s.distance <= ADFieldJobs.RESUME_NEAR_M end +-- Højst én maskine sendt ud pr. DISPATCH_GAP_MS på tværs af alle marker (in-game 27/9: 6 maskiner kørte fra +-- parkeringen i samme sekund efter Start alle). +ADFieldJobs.DISPATCH_GAP_MS = 10000 +function ADFieldJobs.mayDispatch(now, lastAt) + return lastAt == nil or now - lastAt >= ADFieldJobs.DISPATCH_GAP_MS +end + +function ADFieldJobs.assignmentCount() + local count = 0 + for _ in pairs(ADFieldJobs.state.assignments) do count = count + 1 end + return count +end + -- Beslutning for én mark. assignments = sæt på marken ({phase, stage, helper}); kun sæt på det aktuelle -- trin tæller (en aflæsningsvogn på vej hjem fra høsten forstyrrer ikke kultiveringen). -- env = {raining = bool}: vejrfølsomme trin (høst/slå/vend/riv/hø) sendes ikke ud i regn. @@ -366,7 +379,11 @@ local function stepField(adEnv, info, env) ADFieldJobs.note(info.id, {reason = {key = key}}) end elseif decision.action == "dispatch" then + -- én udsendelse ad gangen på tværs af markerne: marken prøver igen ved næste tick + if not ADFieldJobs.mayDispatch(ADFieldJobs.now, ADFieldJobs.lastDispatchAt) then return end + local before = ADFieldJobs.assignmentCount() ADFieldWork.dispatch(adEnv, field, info, decision) + if ADFieldJobs.assignmentCount() > before then ADFieldJobs.lastDispatchAt = ADFieldJobs.now end end end diff --git a/FS25_ADSmartPickup/adFieldSilos.lua b/FS25_ADSmartPickup/adFieldSilos.lua index d2c4a47..215902f 100644 --- a/FS25_ADSmartPickup/adFieldSilos.lua +++ b/FS25_ADSmartPickup/adFieldSilos.lua @@ -167,7 +167,10 @@ function ADFieldSilos.collectBuildings(adEnv) if not seen[building.id] and not ADFieldSiloConfig.hasStore(ADFieldSilos.config, building.id) and not nearStore(stores, x, z) then seen[building.id] = true -- marknummeret først: navnet skæres af i fanen, og mange siloer hedder ens ("Farma 500 …") - table.insert(silos, {id = building.id, name = string.format("F%s %s", tostring(info.id), tostring(building.name)), markerId = firstMarker(building, "load"), + -- marknummeret først (medmindre navnet allerede starter med det, fx "F22 marksilo") + local siloName = tostring(building.name) + if not siloName:match("^F" .. tostring(info.id) .. "%f[%D]") then siloName = string.format("F%s %s", tostring(info.id), siloName) end + table.insert(silos, {id = building.id, name = siloName, markerId = firstMarker(building, "load"), x = x, z = z, stock = siloStock(building.placeable)}) end end diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index a3c91b0..26b6fa3 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.42.1.0 + 1.42.2.0 <en>AD Smart Pickup</en> diff --git a/tests/test_adFieldJobs.lua b/tests/test_adFieldJobs.lua index 197aac3..f149f26 100644 --- a/tests/test_adFieldJobs.lua +++ b/tests/test_adFieldJobs.lua @@ -151,5 +151,12 @@ check("SR lige ved sit huskede waypoint -> ja", ADFieldJobs.shouldResume({distan check("SR langt fra waypointet og ingen mark -> nej", ADFieldJobs.shouldResume({distance = 850}), false) check("SR ukendt afstand og ingen mark -> nej", ADFieldJobs.shouldResume({}), false) + +-- mayDispatch: markarbejdet sender højst én maskine ud pr. DISPATCH_GAP_MS på tværs af alle marker +-- (in-game 27/9: 6 maskiner kørte fra parkeringen i samme sekund efter Start alle) +check("MD første udsendelse", ADFieldJobs.mayDispatch(5000, nil), true) +check("MD for tæt på forrige", ADFieldJobs.mayDispatch(5000 + ADFieldJobs.DISPATCH_GAP_MS - 1, 5000), false) +check("MD efter mellemrummet", ADFieldJobs.mayDispatch(5000 + ADFieldJobs.DISPATCH_GAP_MS, 5000), true) + print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) os.exit(failures == 0 and 0 or 1)