diff --git a/FS25_ADSmartPickup/adHitch.lua b/FS25_ADSmartPickup/adHitch.lua index 275a38c..4bef086 100644 --- a/FS25_ADSmartPickup/adHitch.lua +++ b/FS25_ADSmartPickup/adHitch.lua @@ -125,6 +125,16 @@ function ADHitch.step(job, state, dt, succeeded) return job end +-- Hjemtur: hvert puljeredskabs parkering (der sættes det af), så traktorens egen parkering. +function ADHitch.homeRoute(implementParkIds, tractorParkId) + local route, seen = {}, {} + for _, id in ipairs(implementParkIds or {}) do + if not seen[id] then seen[id] = true table.insert(route, id) end + end + if tractorParkId ~= nil then table.insert(route, tractorParkId) end + return route +end + -- ---- spil ---- local jobs = setmetatable({}, {__mode = "k"}) -- [vehicle] = job (+ onDone) @@ -207,6 +217,16 @@ local function isImplementPark(adEnv, vehicle, markerId) return false end +function ADHitch.rearImplementsOf(vehicle) + return ADHitch.rearImplements(attachedImplements(vehicle)) +end + +local function parkIdOf(adEnv, vehicle) + local index = vehicle.advd ~= nil and vehicle.advd.parkDestination or nil + local marker = type(index) == "number" and index >= 1 and adEnv.ADGraphManager:getMapMarkerById(index) or nil + return marker ~= nil and marker.id or nil +end + -- Kobler redskaberne bag traktoren af. -> ok, navne eller årsag function ADHitch.tryDetach(vehicle) local rear = ADHitch.rearImplements(attachedImplements(vehicle)) @@ -277,6 +297,26 @@ function ADHitch.route(adEnv, vehicle, markerIds, onDone) runStep(1) end +-- Puljeredskaber bag traktoren sættes af på deres parkering, og traktoren kører hjem til sin egen. +-- Kun redskaber med en Connect-markør til deres parkering er puljeredskaber; andre bliver siddende. +function ADHitch.returnHome(adEnv, tractor, onDone) + local markers = adEnv.ADGraphManager:getMapMarkers() + local parkIds = {} + for _, implement in ipairs(ADHitch.rearImplementsOf(tractor)) do + local parkId = parkIdOf(adEnv, implement.object) + local park = parkId ~= nil and adEnv.ADGraphManager:getMapMarkerByWayPointId(parkId) or nil + if park ~= nil and ADPool.connectFor(park.name, markers) ~= nil then table.insert(parkIds, parkId) end + end + if #parkIds == 0 then return false end + local route = ADHitch.homeRoute(parkIds, parkIdOf(adEnv, tractor)) + ADPool.setReturning(tractor, true) + ADHitch.route(adEnv, tractor, route, function(vehicle, ok, detail) + ADPool.setReturning(vehicle, false) + if onDone ~= nil then onDone(vehicle, ok, detail) end + end) + return true +end + local function tickWaits(elapsed) for i = #waits, 1, -1 do local wait = waits[i] diff --git a/FS25_ADSmartPickup/adPool.lua b/FS25_ADSmartPickup/adPool.lua index d4bd5af..05e7ac1 100644 --- a/FS25_ADSmartPickup/adPool.lua +++ b/FS25_ADSmartPickup/adPool.lua @@ -134,6 +134,17 @@ function ADPool.blocked(nowMs) return result end +-- Traktorer på hjemtur (sætter redskab af, kører hjem): optaget for markarbejdet til de er hjemme. +local returning = setmetatable({}, {__mode = "k"}) + +function ADPool.setReturning(vehicle, isOn) + returning[vehicle] = isOn and true or nil +end + +function ADPool.isReturning(vehicle) + return returning[vehicle] == true +end + -- ---- spil ---- local function parkMarker(adEnv, vehicle) diff --git a/tests/test_adHitch.lua b/tests/test_adHitch.lua index d3940b7..eb0afe6 100644 --- a/tests/test_adHitch.lua +++ b/tests/test_adHitch.lua @@ -83,5 +83,11 @@ check("connect med vogn: stadig kobl på (ingen vending)", H.resolveAction("atta check("vognens parkering: kobl af", H.resolveAction("arrive", true), "detach") check("almindelig markør", H.resolveAction("arrive", false), "arrive") check("afkobl forbliver afkobl", H.resolveAction("detach", false), "detach") +-- hjemtur: hvert puljeredskabs parkering (afkobles der), så traktorens egen parkering +local home = H.homeRoute({4}, 2) +check("hjem: to trin", #home, 2); check("hjem: redskab først", home[1], 4); check("hjem: traktor sidst", home[2], 2) +check("hjem: uden redskab kun traktor", #H.homeRoute({}, 2), 1) +check("hjem: samme parkering to gange tæller én", #H.homeRoute({4, 4}, 2), 2) +check("hjem: uden traktorparkering", #H.homeRoute({4}, nil), 1) print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) os.exit(failures == 0 and 0 or 1) diff --git a/tests/test_adPool.lua b/tests/test_adPool.lua index b705ece..f3ae389 100644 --- a/tests/test_adPool.lua +++ b/tests/test_adPool.lua @@ -72,5 +72,12 @@ local infos = {{id = 5}, {id = 3}, {id = 9}, {id = 1}} local ordered = P.queueOrder(infos, {[9] = 100, [3] = 50, [1] = 50}) check("kø: 1.", ordered[1].id, 1); check("kø: 2.", ordered[2].id, 3); check("kø: 3.", ordered[3].id, 9); check("kø: 4.", ordered[4].id, 5) check("kø: rører ikke input", infos[1].id, 5) +-- på hjemtur: optaget indtil hjemme +local tractorObject = {} +check("hjemtur: ikke fra start", P.isReturning(tractorObject), false) +P.setReturning(tractorObject, true) +check("hjemtur: markeret", P.isReturning(tractorObject), true) +P.setReturning(tractorObject, false) +check("hjemtur: hjemme", P.isReturning(tractorObject), false) print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) os.exit(failures == 0 and 0 or 1)