feat: Wait-punkter for rest-læs + læs der passer foretrækkes (v1.7.0.0)
Rest-læs ved fuldt mål: AutoDrive ventede ved aflæsningspunktet 'til tømt' og spærrede køen. Nu omdirigeres den aktuelle UnloadAtDestinationTask (destinationID + drivePathModule:setPathTo) til nærmeste ledige markør med 'Wait' i navnet / mappen Wait (fælles pulje, reservationer pr. køretøj); tilbage når målet har plads til hele resten. Ventende ser rotateTargets=RT_NONE så 'rotér aflæsning' ikke kører videre fra Wait-punktet. Ingen ledige punkter = som i dag + én advarsel. Rangering: varer hvor et fuldt læs (AutoDrive.getAllFillLevels-kapacitet) passer i målet går forud; passer intet, mest trængende. Nyt modul adUnloadWait.lua; ADSmartPickup.getTargetFreeCapacity delt hjælper.
This commit is contained in:
@@ -122,5 +122,41 @@ check("vare fabrikken ikke kender -> ikke beskyttet", ADSupplyPlanner.isProducti
|
||||
check("ingen produktioner -> ikke beskyttet", ADSupplyPlanner.isProductionInput({}, STRAW), false)
|
||||
check("produktion uden inputs/outputs tåles", ADSupplyPlanner.isProductionInput({{id = "x"}}, STRAW), false)
|
||||
|
||||
-- rankNeeds med læs-størrelse: varer hvor et FULDT læs passer går forud, ellers mest trængende
|
||||
local sized = ADSupplyPlanner.rankNeeds({
|
||||
{fillType = STRAW, level = 40000, capacity = 50000, litersPerMinute = 500}, -- 80 min, kun 10000 fri
|
||||
{fillType = TMR, level = 20000, capacity = 100000, litersPerMinute = 50}, -- 400 min, 80000 fri
|
||||
}, 40000)
|
||||
check("fuldt læs der passer vinder over mere trængende der ikke passer", sized[1].fillType, TMR)
|
||||
check("den der ikke passer bevares som reserve", sized[2].fillType, STRAW)
|
||||
check("fits markeres", sized[1].fits, true)
|
||||
check("ikke-fits markeres", sized[2].fits, false)
|
||||
local noneFit = ADSupplyPlanner.rankNeeds({
|
||||
{fillType = STRAW, level = 40000, capacity = 50000, litersPerMinute = 500},
|
||||
{fillType = TMR, level = 90000, capacity = 100000, litersPerMinute = 50},
|
||||
}, 40000)
|
||||
check("passer intet -> mest trængende først", noneFit[1].fillType, STRAW)
|
||||
check("uden læs-størrelse -> som før", ADSupplyPlanner.rankNeeds({{fillType = STRAW, level = 40000, capacity = 50000}})[1].fits, nil)
|
||||
|
||||
-- Wait-punkter: navn med ordet "Wait" (uanset store/små) eller mappen "Wait"
|
||||
check("'Cow 1 Food Wait' er wait-punkt", ADSupplyPlanner.isWaitMarker({name = "Cow 1 Food Wait", group = "Cow Food"}), true)
|
||||
check("'wait 3' er wait-punkt", ADSupplyPlanner.isWaitMarker({name = "wait 3", group = "Andet"}), true)
|
||||
check("mappen Wait tæller", ADSupplyPlanner.isWaitMarker({name = "P2", group = "Wait"}), true)
|
||||
check("'Waiter' er ikke wait-punkt", ADSupplyPlanner.isWaitMarker({name = "Waiter", group = "X"}), false)
|
||||
check("'Cow 1 Food' er ikke wait-punkt", ADSupplyPlanner.isWaitMarker({name = "Cow 1 Food", group = "Cow Food"}), false)
|
||||
|
||||
-- nærmeste ledige wait-punkt; candidates = {{marker, x, z}}, claims = {[markerId] = vehicle}
|
||||
local V1, V2 = {}, {}
|
||||
local waitPoints = {
|
||||
{marker = {id = 1, name = "Wait A"}, x = 0, z = 0},
|
||||
{marker = {id = 2, name = "Wait B"}, x = 100, z = 0},
|
||||
{marker = {id = 3, name = "Wait C"}, x = 300, z = 0},
|
||||
}
|
||||
check("nærmeste ledige vælges", ADSupplyPlanner.pickNearestFreeWaitPoint(waitPoints, {}, 10, 0, V1).marker.id, 1)
|
||||
check("reserveret springes over", ADSupplyPlanner.pickNearestFreeWaitPoint(waitPoints, {[1] = V2}, 10, 0, V1).marker.id, 2)
|
||||
check("egen reservation tæller som ledig", ADSupplyPlanner.pickNearestFreeWaitPoint(waitPoints, {[1] = V1}, 10, 0, V1).marker.id, 1)
|
||||
check("alle optaget -> nil", ADSupplyPlanner.pickNearestFreeWaitPoint(waitPoints, {[1] = V2, [2] = V2, [3] = V2}, 10, 0, V1), nil)
|
||||
check("ingen punkter -> nil", ADSupplyPlanner.pickNearestFreeWaitPoint({}, {}, 0, 0, V1), nil)
|
||||
|
||||
print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL"))
|
||||
os.exit(failures == 0 and 0 or 1)
|
||||
|
||||
Reference in New Issue
Block a user