68 lines
2.3 KiB
Lua
68 lines
2.3 KiB
Lua
-- AD Supply Planner
|
|
-- Rene funktioner (ingen spil-API) til behovsstyret forsyning: hvilken ingrediens
|
|
-- har aflæsningsmålet mest brug for, og hvilken ingrediensliste gælder for køretøjet.
|
|
|
|
ADSupplyPlanner = {}
|
|
|
|
-- Mindre fri plads end dette i målet regnes som "fuldt" (undgår ture med læs der ikke kan komme af).
|
|
ADSupplyPlanner.MIN_FREE_LITERS = 1000
|
|
|
|
function ADSupplyPlanner.copyList(list)
|
|
local copy = {}
|
|
for index, value in ipairs(list) do
|
|
copy[index] = value
|
|
end
|
|
return copy
|
|
end
|
|
|
|
-- Hvor meget trænger målet til denne ingrediens? Højere = hentes først.
|
|
-- Alle tal er liter i aflæsningsmålets lager. Standard: relativ tomhed (0..1),
|
|
-- så en lille næsten-tom tank vinder over en stor halvfuld.
|
|
function ADSupplyPlanner.scoreNeed(level, capacity, freeSpace)
|
|
if capacity <= 0 then
|
|
return 0
|
|
end
|
|
return freeSpace / capacity
|
|
end
|
|
|
|
-- needs: {{fillType, level, capacity}, ...}. Returnerer NY liste, mest trængende først;
|
|
-- ingredienser uden plads i målet er sorteret fra.
|
|
function ADSupplyPlanner.rankNeeds(needs)
|
|
local ranked = {}
|
|
for _, need in ipairs(needs) do
|
|
local freeSpace = need.capacity - need.level
|
|
if freeSpace >= ADSupplyPlanner.MIN_FREE_LITERS then
|
|
table.insert(ranked, {
|
|
fillType = need.fillType,
|
|
level = need.level,
|
|
capacity = need.capacity,
|
|
freeSpace = freeSpace,
|
|
score = ADSupplyPlanner.scoreNeed(need.level, need.capacity, freeSpace),
|
|
})
|
|
end
|
|
end
|
|
table.sort(ranked, function(a, b)
|
|
if a.score ~= b.score then
|
|
return a.score > b.score
|
|
end
|
|
return a.fillType < b.fillType
|
|
end)
|
|
return ranked
|
|
end
|
|
|
|
-- state: nil eller {ingredients, narrowedTo} fra forrige tur. selected: AD's aktuelle varevalg.
|
|
-- >1 valgt = (ny) ingrediensliste. Præcis den vare vi selv indsnævrede til = gemt liste.
|
|
-- Alt andet = brugeren har valgt noget andet -> nil (behovsstyring fra).
|
|
function ADSupplyPlanner.resolveIngredients(state, selected)
|
|
if type(selected) ~= "table" then
|
|
return nil
|
|
end
|
|
if #selected > 1 then
|
|
return ADSupplyPlanner.copyList(selected)
|
|
end
|
|
if state ~= nil and #selected == 1 and selected[1] == state.narrowedTo then
|
|
return ADSupplyPlanner.copyList(state.ingredients)
|
|
end
|
|
return nil
|
|
end
|