-- 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