fix(flows): én læssemarkør pr. læssestation (mælk OG gylle på samme stald), naturlig navnesortering af bygninger (v1.13.1.0)
This commit is contained in:
@@ -68,13 +68,17 @@ end
|
|||||||
|
|
||||||
-- Trigger-noder pr. bygning: læsse (loadTriggers.triggerNode, pallespawner, objektlager) og
|
-- Trigger-noder pr. bygning: læsse (loadTriggers.triggerNode, pallespawner, objektlager) og
|
||||||
-- aflæsning (unloadTriggers exactFillRootNode/triggerNode/aiNode).
|
-- aflæsning (unloadTriggers exactFillRootNode/triggerNode/aiNode).
|
||||||
|
-- loadGroups: én gruppe noder pr. læssestation (mælketank, gyllebeholder ...), så hver station får sin
|
||||||
|
-- egen markør; pallespawner/objektlager er en gruppe for sig.
|
||||||
local function collectNodes(placeable, loadStations, unloadStations)
|
local function collectNodes(placeable, loadStations, unloadStations)
|
||||||
local loadNodes, unloadNodes = {}, {}
|
local loadGroups, unloadNodes = {}, {}
|
||||||
for _, station in pairs(loadStations) do
|
for _, station in pairs(loadStations) do
|
||||||
if station.owningPlaceable == placeable then
|
if station.owningPlaceable == placeable then
|
||||||
|
local nodes = {}
|
||||||
for _, trigger in pairs(station.loadTriggers or {}) do
|
for _, trigger in pairs(station.loadTriggers or {}) do
|
||||||
if trigger.triggerNode ~= nil then table.insert(loadNodes, trigger.triggerNode) end
|
if trigger.triggerNode ~= nil then table.insert(nodes, trigger.triggerNode) end
|
||||||
end
|
end
|
||||||
|
if #nodes > 0 then table.insert(loadGroups, nodes) end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
for _, station in pairs(unloadStations) do
|
for _, station in pairs(unloadStations) do
|
||||||
@@ -89,15 +93,52 @@ local function collectNodes(placeable, loadStations, unloadStations)
|
|||||||
local productionPoint = getProductionPoint(placeable)
|
local productionPoint = getProductionPoint(placeable)
|
||||||
local spawner = productionPoint ~= nil and productionPoint.palletSpawner or nil
|
local spawner = productionPoint ~= nil and productionPoint.palletSpawner or nil
|
||||||
if spawner ~= nil then
|
if spawner ~= nil then
|
||||||
|
local nodes = {}
|
||||||
for _, place in ipairs(spawner.spawnPlaces or {}) do
|
for _, place in ipairs(spawner.spawnPlaces or {}) do
|
||||||
if place.startNode ~= nil then table.insert(loadNodes, place.startNode) end
|
if place.startNode ~= nil then table.insert(nodes, place.startNode) end
|
||||||
end
|
end
|
||||||
|
if #nodes > 0 then table.insert(loadGroups, nodes) end
|
||||||
end
|
end
|
||||||
if placeable.spec_objectStorage ~= nil and placeable.rootNode ~= nil then
|
if placeable.spec_objectStorage ~= nil and placeable.rootNode ~= nil then
|
||||||
table.insert(loadNodes, placeable.rootNode)
|
table.insert(loadGroups, {placeable.rootNode})
|
||||||
table.insert(unloadNodes, placeable.rootNode)
|
table.insert(unloadNodes, placeable.rootNode)
|
||||||
end
|
end
|
||||||
return loadNodes, unloadNodes
|
return loadGroups, unloadNodes
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Naturlig sortering: tal i navne sammenlignes som tal ("Silo 9" < "Silo 10", "25 Silo" < "26 Silo").
|
||||||
|
local function naturalKey(text)
|
||||||
|
local parts = {}
|
||||||
|
for chunk in string.gmatch(tostring(text or ""), "%d+%.?%d*[^%d]*") do
|
||||||
|
local number, rest = string.match(chunk, "^(%d+%.?%d*)(.*)$")
|
||||||
|
table.insert(parts, {tonumber(number), string.lower(rest)})
|
||||||
|
end
|
||||||
|
local leading = string.match(tostring(text or ""), "^[^%d]*")
|
||||||
|
if leading ~= nil and leading ~= "" then
|
||||||
|
table.insert(parts, 1, {nil, string.lower(leading)})
|
||||||
|
end
|
||||||
|
return parts
|
||||||
|
end
|
||||||
|
|
||||||
|
function ADBuildings.naturalLess(a, b)
|
||||||
|
local ka, kb = naturalKey(a), naturalKey(b)
|
||||||
|
for index = 1, math.max(#ka, #kb) do
|
||||||
|
local pa, pb = ka[index], kb[index]
|
||||||
|
if pa == nil then return true end
|
||||||
|
if pb == nil then return false end
|
||||||
|
if pa[1] ~= nil and pb[1] ~= nil and pa[1] ~= pb[1] then return pa[1] < pb[1] end
|
||||||
|
if (pa[1] == nil) ~= (pb[1] == nil) then return pa[1] == nil end
|
||||||
|
if pa[2] ~= pb[2] then return pa[2] < pb[2] end
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Bygninger sorteres efter navn (naturligt), dernæst første læssemarkørs navn (ens navne, fx 40 Farma-siloer).
|
||||||
|
function ADBuildings.compare(a, b)
|
||||||
|
if a.name ~= b.name then return ADBuildings.naturalLess(a.name, b.name) end
|
||||||
|
local ma = a.loadMarkers ~= nil and a.loadMarkers[1] ~= nil and a.loadMarkers[1].name or (a.unloadMarker ~= nil and a.unloadMarker.name or "")
|
||||||
|
local mb = b.loadMarkers ~= nil and b.loadMarkers[1] ~= nil and b.loadMarkers[1].name or (b.unloadMarker ~= nil and b.unloadMarker.name or "")
|
||||||
|
return ADBuildings.naturalLess(ma, mb)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Nærmeste ikke-Wait-markør til en af noderne, ≤ MAX_MARKER_DISTANCE.
|
-- Nærmeste ikke-Wait-markør til en af noderne, ≤ MAX_MARKER_DISTANCE.
|
||||||
@@ -159,8 +200,6 @@ local function isSellPlaceable(placeable, unloadStations)
|
|||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
local ORDER = {factory = 1, husbandry = 2, objectStorage = 3, silo = 4, sell = 5}
|
|
||||||
|
|
||||||
local function build(adEnv, farmId)
|
local function build(adEnv, farmId)
|
||||||
local placeables = g_currentMission ~= nil and g_currentMission.placeableSystem ~= nil and g_currentMission.placeableSystem.placeables or {}
|
local placeables = g_currentMission ~= nil and g_currentMission.placeableSystem ~= nil and g_currentMission.placeableSystem.placeables or {}
|
||||||
local storage = g_currentMission ~= nil and g_currentMission.storageSystem or nil
|
local storage = g_currentMission ~= nil and g_currentMission.storageSystem or nil
|
||||||
@@ -174,16 +213,25 @@ local function build(adEnv, farmId)
|
|||||||
if kind ~= nil and (kind == "sell" or isOwnedBy(placeable, farmId)) then
|
if kind ~= nil and (kind == "sell" or isOwnedBy(placeable, farmId)) then
|
||||||
local id = ADBuildings.getId(placeable)
|
local id = ADBuildings.getId(placeable)
|
||||||
if id ~= nil then
|
if id ~= nil then
|
||||||
local loadNodes, unloadNodes = collectNodes(placeable, loadStations, unloadStations)
|
local loadGroups, unloadNodes = collectNodes(placeable, loadStations, unloadStations)
|
||||||
local loadMarker
|
local loadMarkers, seen = {}, {}
|
||||||
if kind == "silo" then
|
if kind == "silo" then
|
||||||
loadMarker = siloLoadMarker(adEnv, farmId, placeable, loadStations)
|
local marker = siloLoadMarker(adEnv, farmId, placeable, loadStations)
|
||||||
|
if marker ~= nil then table.insert(loadMarkers, marker) end
|
||||||
else
|
else
|
||||||
loadMarker = nearestMarker(adEnv, loadNodes)
|
for _, nodes in ipairs(loadGroups) do
|
||||||
|
local marker = nearestMarker(adEnv, nodes)
|
||||||
|
if marker ~= nil and not seen[marker.id] then
|
||||||
|
seen[marker.id] = true
|
||||||
|
table.insert(loadMarkers, marker)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
table.sort(loadMarkers, function(a, b) return ADBuildings.naturalLess(a.name, b.name) end)
|
||||||
end
|
end
|
||||||
table.insert(result, {
|
table.insert(result, {
|
||||||
id = id, name = getName(placeable, id), kind = kind, placeable = placeable,
|
id = id, name = getName(placeable, id), kind = kind, placeable = placeable,
|
||||||
loadMarker = loadMarker,
|
loadMarker = loadMarkers[1],
|
||||||
|
loadMarkers = loadMarkers,
|
||||||
unloadMarker = nearestMarker(adEnv, unloadNodes),
|
unloadMarker = nearestMarker(adEnv, unloadNodes),
|
||||||
canBeSource = kind ~= "sell",
|
canBeSource = kind ~= "sell",
|
||||||
canBeTarget = kind == "husbandry" or kind == "factory",
|
canBeTarget = kind == "husbandry" or kind == "factory",
|
||||||
@@ -192,10 +240,7 @@ local function build(adEnv, farmId)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
table.sort(result, function(a, b)
|
table.sort(result, ADBuildings.compare)
|
||||||
if ORDER[a.kind] ~= ORDER[b.kind] then return ORDER[a.kind] < ORDER[b.kind] end
|
|
||||||
return a.name < b.name
|
|
||||||
end)
|
|
||||||
return result
|
return result
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -222,8 +267,21 @@ end
|
|||||||
-- role "load": bygningen hvis læssemarkør er wayPointId; "unload": aflæsningsmarkør.
|
-- role "load": bygningen hvis læssemarkør er wayPointId; "unload": aflæsningsmarkør.
|
||||||
function ADBuildings.byMarker(adEnv, farmId, wayPointId, role)
|
function ADBuildings.byMarker(adEnv, farmId, wayPointId, role)
|
||||||
for _, building in ipairs(ADBuildings.list(adEnv, farmId)) do
|
for _, building in ipairs(ADBuildings.list(adEnv, farmId)) do
|
||||||
local marker = role == "unload" and building.unloadMarker or building.loadMarker
|
if role == "unload" then
|
||||||
if marker ~= nil and marker.id == wayPointId then return building end
|
if building.unloadMarker ~= nil and building.unloadMarker.id == wayPointId then return building end
|
||||||
|
else
|
||||||
|
for _, marker in ipairs(building.loadMarkers or {}) do
|
||||||
|
if marker.id == wayPointId then return building end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Alle markører for en rolle: læsning = én pr. læssestation; aflæsning = én.
|
||||||
|
function ADBuildings.getMarkers(building, role)
|
||||||
|
if role == "unload" then
|
||||||
|
return building.unloadMarker ~= nil and {building.unloadMarker} or {}
|
||||||
|
end
|
||||||
|
return building.loadMarkers or (building.loadMarker ~= nil and {building.loadMarker} or {})
|
||||||
|
end
|
||||||
|
|||||||
@@ -302,11 +302,13 @@ function ADRunsController.resolveMarkers(adEnv, run)
|
|||||||
local resolved, seen = {}, {}
|
local resolved, seen = {}, {}
|
||||||
for _, buildingId in ipairs(buildingIds or {}) do
|
for _, buildingId in ipairs(buildingIds or {}) do
|
||||||
local building = ADBuildings.find(adEnv, farmId, buildingId)
|
local building = ADBuildings.find(adEnv, farmId, buildingId)
|
||||||
local marker = building ~= nil and (role == "load" and building.loadMarker or building.unloadMarker) or nil
|
local markers = building ~= nil and (ADBuildings.getMarkers ~= nil and ADBuildings.getMarkers(building, role) or (role == "load" and (building.loadMarkers or {building.loadMarker}) or {building.unloadMarker})) or {}
|
||||||
if marker ~= nil then
|
if markers[1] ~= nil then
|
||||||
if not seen[marker.id] then
|
for _, marker in ipairs(markers) do
|
||||||
seen[marker.id] = true
|
if marker ~= nil and not seen[marker.id] then
|
||||||
table.insert(resolved, marker.id)
|
seen[marker.id] = true
|
||||||
|
table.insert(resolved, marker.id)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
table.insert(missing, building ~= nil and building.name or (tostring(buildingId) .. " (mangler)"))
|
table.insert(missing, building ~= nil and building.name or (tostring(buildingId) .. " (mangler)"))
|
||||||
|
|||||||
@@ -102,12 +102,16 @@ end
|
|||||||
|
|
||||||
-- "Kostald 1 (stald) — markør 'cow 1 milk' 12 m" / "… — INGEN MARKØR inden for 40 m"
|
-- "Kostald 1 (stald) — markør 'cow 1 milk' 12 m" / "… — INGEN MARKØR inden for 40 m"
|
||||||
function SmartPickupFrame:describeBuilding(building, role)
|
function SmartPickupFrame:describeBuilding(building, role)
|
||||||
local marker = role == "load" and building.loadMarker or building.unloadMarker
|
local markers = ADBuildings.getMarkers ~= nil and ADBuildings.getMarkers(building, role) or {}
|
||||||
local kindText = self.i18n:getText("spu_source_kind_" .. tostring(building.kind))
|
local kindText = self.i18n:getText("spu_source_kind_" .. tostring(building.kind))
|
||||||
if marker == nil then
|
if markers[1] == nil then
|
||||||
return string.format(" %s (%s) — %s", building.name, kindText, self.i18n:getText("spu_noMarker"))
|
return string.format(" %s (%s) — %s", building.name, kindText, self.i18n:getText("spu_noMarker"))
|
||||||
end
|
end
|
||||||
return string.format(" %s (%s) — %s", building.name, kindText, string.format(self.i18n:getText("spu_markerAt"), marker.name, marker.distance))
|
local parts = {}
|
||||||
|
for _, marker in ipairs(markers) do
|
||||||
|
table.insert(parts, string.format(self.i18n:getText("spu_markerAt"), marker.name, marker.distance))
|
||||||
|
end
|
||||||
|
return string.format(" %s (%s) — %s", building.name, kindText, table.concat(parts, ", "))
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Afkrydsning pr. bygning: kilder (udkørsel, role "load") eller mål (forsyning, role "unload").
|
-- Afkrydsning pr. bygning: kilder (udkørsel, role "load") eller mål (forsyning, role "unload").
|
||||||
|
|||||||
@@ -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.13.0.0</version>
|
<version>1.13.1.0</version>
|
||||||
<title>
|
<title>
|
||||||
<en>AD Smart Pickup</en>
|
<en>AD Smart Pickup</en>
|
||||||
</title>
|
</title>
|
||||||
|
|||||||
@@ -46,8 +46,9 @@ end
|
|||||||
-- verden: kostald med mælketank (load) og foder (unload), sukkerfabrik (unload + pallespawner), to siloer i række, objektlager, salgssted
|
-- verden: kostald med mælketank (load) og foder (unload), sukkerfabrik (unload + pallespawner), to siloer i række, objektlager, salgssted
|
||||||
local barn = placeable("barn1", "Kostald 1", 0, 0, {getHusbandryFillLevel = function() return 0 end})
|
local barn = placeable("barn1", "Kostald 1", 0, 0, {getHusbandryFillLevel = function() return 0 end})
|
||||||
local milkStation = {owningPlaceable = barn, loadTriggers = {{triggerNode = {x = 20, z = 0}}}}
|
local milkStation = {owningPlaceable = barn, loadTriggers = {{triggerNode = {x = 20, z = 0}}}}
|
||||||
|
local slurryStation = {owningPlaceable = barn, loadTriggers = {{triggerNode = {x = 0, z = 30}}}}
|
||||||
local barnUnload = {owningPlaceable = barn, unloadTriggers = {{exactFillRootNode = {x = -20, z = 0}}}}
|
local barnUnload = {owningPlaceable = barn, unloadTriggers = {{exactFillRootNode = {x = -20, z = 0}}}}
|
||||||
table.insert(loadStations, milkStation); table.insert(unloadStations, barnUnload)
|
table.insert(loadStations, milkStation); table.insert(loadStations, slurryStation); table.insert(unloadStations, barnUnload)
|
||||||
local mill = placeable("mill", "Sukkerfabrik", 500, 0, {spec_productionPoint = {productionPoint = {productions = {}, storage = {}, palletSpawner = {spawnPlaces = {{startNode = {x = 520, z = 0}}}}, unloadingStation = nil}}})
|
local mill = placeable("mill", "Sukkerfabrik", 500, 0, {spec_productionPoint = {productionPoint = {productions = {}, storage = {}, palletSpawner = {spawnPlaces = {{startNode = {x = 520, z = 0}}}}, unloadingStation = nil}}})
|
||||||
local millUnload = {owningPlaceable = mill, unloadTriggers = {{exactFillRootNode = {x = 480, z = 0}}}, isa = function() return true end, isSellingPoint = true}
|
local millUnload = {owningPlaceable = mill, unloadTriggers = {{exactFillRootNode = {x = 480, z = 0}}}, isa = function() return true end, isSellingPoint = true}
|
||||||
table.insert(unloadStations, millUnload)
|
table.insert(unloadStations, millUnload)
|
||||||
@@ -67,6 +68,7 @@ local other = placeable("otherfarm", "Naboens", 4000, 0, {spec_silo = {}, ownerF
|
|||||||
addMarker(1, "cow 1 milk", "Milk", 25, 0) -- 5 m fra mælketriggeren
|
addMarker(1, "cow 1 milk", "Milk", 25, 0) -- 5 m fra mælketriggeren
|
||||||
addMarker(2, "Cow 1 food", "Cow food", -30, 0) -- 10 m fra fodertriggeren
|
addMarker(2, "Cow 1 food", "Cow food", -30, 0) -- 10 m fra fodertriggeren
|
||||||
addMarker(3, "cow wait 1", "cow wait", 22, 0) -- Wait: må ALDRIG vælges (tættere end mælkemarkøren)
|
addMarker(3, "cow wait 1", "cow wait", 22, 0) -- Wait: må ALDRIG vælges (tættere end mælkemarkøren)
|
||||||
|
addMarker(11, "Cow 1 Slurry", "Slurry", 0, 33) -- 3 m fra gylletriggeren
|
||||||
addMarker(4, "Suger Load", "Pickup", 525, 0) -- 5 m fra pallespawneren
|
addMarker(4, "Suger Load", "Pickup", 525, 0) -- 5 m fra pallespawneren
|
||||||
addMarker(5, "sugar offload", "production", 470, 0)
|
addMarker(5, "sugar offload", "production", 470, 0)
|
||||||
addMarker(6, "silo 1", "silo", 1000, 12) -- strengt: silo1
|
addMarker(6, "silo 1", "silo", 1000, 12) -- strengt: silo1
|
||||||
@@ -83,6 +85,11 @@ for _, b in ipairs(list) do byId[b.id] = b end
|
|||||||
check("B1 antal (naboens silo udeladt)", #list, 6)
|
check("B1 antal (naboens silo udeladt)", #list, 6)
|
||||||
check("B1 stald", byId.barn1.kind, "husbandry")
|
check("B1 stald", byId.barn1.kind, "husbandry")
|
||||||
check("B1 stald læssemarkør = mælk (ikke Wait, som er tættere)", byId.barn1.loadMarker.id, 1)
|
check("B1 stald læssemarkør = mælk (ikke Wait, som er tættere)", byId.barn1.loadMarker.id, 1)
|
||||||
|
-- én markør pr. læssestation (mælketank OG gyllebeholder), sorteret på markørnavn
|
||||||
|
check("B1 stald har to læssemarkører", #byId.barn1.loadMarkers, 2)
|
||||||
|
check("B1 første = cow 1 milk (navnesorteret, uanset store/små)", byId.barn1.loadMarkers[1].id, 1)
|
||||||
|
check("B1 anden = Cow 1 Slurry", byId.barn1.loadMarkers[2].name, "Cow 1 Slurry")
|
||||||
|
check("B1 gyllemarkør -> stald via byMarker", ADBuildings.byMarker(adEnv, 1, 11, "load").id, "barn1")
|
||||||
check("B1 stald aflæsningsmarkør = foder", byId.barn1.unloadMarker.id, 2)
|
check("B1 stald aflæsningsmarkør = foder", byId.barn1.unloadMarker.id, 2)
|
||||||
check("B1 stald afstand", byId.barn1.loadMarker.distance, 5)
|
check("B1 stald afstand", byId.barn1.loadMarker.distance, 5)
|
||||||
check("B1 fabrik læssemarkør via pallespawner", byId.mill.loadMarker.id, 4)
|
check("B1 fabrik læssemarkør via pallespawner", byId.mill.loadMarker.id, 4)
|
||||||
@@ -120,10 +127,13 @@ check("B5 cachet", ADBuildings.list(adEnv, 1) == first, true)
|
|||||||
ADBuildings.invalidate()
|
ADBuildings.invalidate()
|
||||||
check("B5 ny efter invalidate", ADBuildings.list(adEnv, 1) ~= first, true)
|
check("B5 ny efter invalidate", ADBuildings.list(adEnv, 1) ~= first, true)
|
||||||
|
|
||||||
-- B6: sortering: fabrik, stald, objektlager, silo, salg; navn inden for slags
|
-- B6: sortering efter NAVN (naturlig talrækkefølge), dernæst første markørnavn — ikke efter slags
|
||||||
local order = {}
|
local order = {}
|
||||||
for _, b in ipairs(ADBuildings.list(adEnv, 1)) do table.insert(order, b.kind) end
|
for _, b in ipairs(ADBuildings.list(adEnv, 1)) do table.insert(order, b.name) end
|
||||||
check("B6 rækkefølge", table.concat(order, ","), "factory,husbandry,objectStorage,silo,silo,sell")
|
check("B6 rækkefølge", table.concat(order, ","), "Kostald 1,Mejeri,Palleskur,Silo 1,Silo 2,Sukkerfabrik")
|
||||||
|
check("B6 naturlig sortering", ADBuildings.naturalLess("Silo 9", "Silo 10"), true)
|
||||||
|
check("B6 naturlig sortering, tal før tekst-lighed", ADBuildings.naturalLess("25 Silo Storage", "26 Silo Storage"), true)
|
||||||
|
check("B6 naturlig sortering ens navn -> markørnavn", ADBuildings.compare({name = "Farma", loadMarkers = {{name = "30 Silo"}}}, {name = "Farma", loadMarkers = {{name = "4 Silo"}}}), false)
|
||||||
|
|
||||||
print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL"))
|
print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL"))
|
||||||
os.exit(failures == 0 and 0 or 1)
|
os.exit(failures == 0 and 0 or 1)
|
||||||
|
|||||||
@@ -586,14 +586,22 @@ ADUnloadWait = nil; ADOutbound = nil; ADSources = nil
|
|||||||
|
|
||||||
-- C-flow: bygninger -> markører (resolveMarkers), migration af gamle markør-runs, noMarker, flow-rækker
|
-- C-flow: bygninger -> markører (resolveMarkers), migration af gamle markør-runs, noMarker, flow-rækker
|
||||||
local buildings = {
|
local buildings = {
|
||||||
{id = "barn1", name = "Kostald 1", kind = "husbandry", loadMarker = {id = 10, name = "cow 1 milk", distance = 5}, unloadMarker = {id = 94, name = "Cow 1 Food", distance = 8}, canBeSource = true, canBeTarget = true, canSell = false},
|
{id = "barn1", name = "Kostald 1", kind = "husbandry", loadMarker = {id = 10, name = "cow 1 milk", distance = 5}, loadMarkers = {{id = 10, name = "cow 1 milk", distance = 5}, {id = 11, name = "cow 1 slurry", distance = 3}}, unloadMarker = {id = 94, name = "Cow 1 Food", distance = 8}, canBeSource = true, canBeTarget = true, canSell = false},
|
||||||
{id = "shed", name = "Palleskur", kind = "objectStorage", loadMarker = nil, unloadMarker = nil, canBeSource = true, canBeTarget = false, canSell = false},
|
{id = "shed", name = "Palleskur", kind = "objectStorage", loadMarker = nil, unloadMarker = nil, canBeSource = true, canBeTarget = false, canSell = false},
|
||||||
{id = "mill", name = "Sukkerfabrik", kind = "factory", loadMarker = {id = 12694, name = "Suger Load", distance = 3}, unloadMarker = {id = 77, name = "sugar offload", distance = 4}, canBeSource = true, canBeTarget = true, canSell = false},
|
{id = "mill", name = "Sukkerfabrik", kind = "factory", loadMarker = {id = 12694, name = "Suger Load", distance = 3}, unloadMarker = {id = 77, name = "sugar offload", distance = 4}, canBeSource = true, canBeTarget = true, canSell = false},
|
||||||
}
|
}
|
||||||
ADBuildings = {
|
ADBuildings = {
|
||||||
list = function() return buildings end,
|
list = function() return buildings end,
|
||||||
find = function(_, _, id) for _, b in ipairs(buildings) do if b.id == id then return b end end end,
|
find = function(_, _, id) for _, b in ipairs(buildings) do if b.id == id then return b end end end,
|
||||||
byMarker = function(_, _, wayPointId, role) for _, b in ipairs(buildings) do local m = role == "unload" and b.unloadMarker or b.loadMarker if m ~= nil and m.id == wayPointId then return b end end end,
|
byMarker = function(_, _, wayPointId, role)
|
||||||
|
for _, b in ipairs(buildings) do
|
||||||
|
if role == "unload" then
|
||||||
|
if b.unloadMarker ~= nil and b.unloadMarker.id == wayPointId then return b end
|
||||||
|
else
|
||||||
|
for _, m in ipairs(b.loadMarkers or {b.loadMarker}) do if m ~= nil and m.id == wayPointId then return b end end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
}
|
}
|
||||||
ADSources = {identify = function(_, id) return (id == 10 or id == 12694 or id == 555) and {kind = "x", wayPointId = id, name = "k"} or nil end, getProducts = function() return {} end, getSellMarkers = function() return {} end, stationAccepts = function() return false end, getSourcePlaceables = function() return {} end}
|
ADSources = {identify = function(_, id) return (id == 10 or id == 12694 or id == 555) and {kind = "x", wayPointId = id, name = "k"} or nil end, getProducts = function() return {} end, getSellMarkers = function() return {} end, stationAccepts = function() return false end, getSourcePlaceables = function() return {} end}
|
||||||
ADOutbound = {isOutboundVehicle = function() return false end, getRunStatus = function() return {reasons = {"SUGAR 78 % af top"}} end, getHoldFor = function() return nil end, getTripFor = function() return nil end, releaseInactive = function() end}
|
ADOutbound = {isOutboundVehicle = function() return false end, getRunStatus = function() return {reasons = {"SUGAR 78 % af top"}} end, getHoldFor = function() return nil end, getTripFor = function() return nil end, releaseInactive = function() end}
|
||||||
@@ -605,12 +613,12 @@ addMarker(77, "sugar offload", "production", 950, 0); unloadAt[77] = {accepts =
|
|||||||
local flowOut = ADRunsController.createRun("Milk", "outbound")
|
local flowOut = ADRunsController.createRun("Milk", "outbound")
|
||||||
ADRunsController.updateRun(flowOut.id, {sourceBuildingIds = {"barn1", "shed"}, sourceWayPointIds = {555}})
|
ADRunsController.updateRun(flowOut.id, {sourceBuildingIds = {"barn1", "shed"}, sourceWayPointIds = {555}})
|
||||||
local resolved = ADRunsController.resolveMarkers(adEnv, ADRuns.getRun(ADRunsController.store, flowOut.id))
|
local resolved = ADRunsController.resolveMarkers(adEnv, ADRuns.getRun(ADRunsController.store, flowOut.id))
|
||||||
check("CF1 kildemarkører = bygningens + rå", table.concat(ADRuns.getRun(ADRunsController.store, flowOut.id).sourceWayPointIds, ","), "10,555")
|
check("CF1 kildemarkører = ALLE bygningens læssemarkører + rå", table.concat(ADRuns.getRun(ADRunsController.store, flowOut.id).sourceWayPointIds, ","), "10,11,555")
|
||||||
check("CF1 manglende markør", resolved.missing[1], "Palleskur")
|
check("CF1 manglende markør", resolved.missing[1], "Palleskur")
|
||||||
-- en markør der HØRER til en bygning som ikke længere er valgt, fjernes (den er ikke rå)
|
-- en markør der HØRER til en bygning som ikke længere er valgt, fjernes (den er ikke rå)
|
||||||
ADRunsController.updateRun(flowOut.id, {sourceWayPointIds = {12694, 555}})
|
ADRunsController.updateRun(flowOut.id, {sourceWayPointIds = {12694, 555}})
|
||||||
ADRunsController.resolveMarkers(adEnv, ADRuns.getRun(ADRunsController.store, flowOut.id))
|
ADRunsController.resolveMarkers(adEnv, ADRuns.getRun(ADRunsController.store, flowOut.id))
|
||||||
check("CF1 fravalgt bygnings markør fjernes", table.concat(ADRuns.getRun(ADRunsController.store, flowOut.id).sourceWayPointIds, ","), "10,555")
|
check("CF1 fravalgt bygnings markør fjernes", table.concat(ADRuns.getRun(ADRunsController.store, flowOut.id).sourceWayPointIds, ","), "10,11,555")
|
||||||
-- CF2: forsyning: mål-bygninger -> targetWayPointIds + targetWayPointId
|
-- CF2: forsyning: mål-bygninger -> targetWayPointIds + targetWayPointId
|
||||||
local flowIn = ADRunsController.createRun("Foder", "supply")
|
local flowIn = ADRunsController.createRun("Foder", "supply")
|
||||||
ADRunsController.updateRun(flowIn.id, {targetBuildingIds = {"barn1", "mill"}})
|
ADRunsController.updateRun(flowIn.id, {targetBuildingIds = {"barn1", "mill"}})
|
||||||
|
|||||||
Reference in New Issue
Block a user