feat(foder): parallelt foder (høns: korn 80 %/roesnitter 20 %) — gruppeandele af truget, ingen 'bedste foder først'-spærring (v1.19.7.0)
This commit is contained in:
@@ -498,6 +498,27 @@ local function getHusbandryFoodFillTypes(husbandry)
|
||||
return fillTypes
|
||||
end
|
||||
|
||||
-- Parallelt foder (animalFood consumptionType PARALLEL, fx høns: korn + roesnitter): dyrene spiser fra alle
|
||||
-- grupper samtidig. Returnerer grupperne {fillTypes, eatWeight} eller nil (serielt = bedste foder først).
|
||||
local function getParallelFoodGroups(husbandry)
|
||||
local foodSpec = husbandry.spec_husbandryFood
|
||||
local foodSystem = g_currentMission ~= nil and g_currentMission.animalFoodSystem or nil
|
||||
if foodSpec == nil or foodSystem == nil or foodSpec.animalTypeIndex == nil or foodSystem.getAnimalFood == nil then
|
||||
return nil
|
||||
end
|
||||
local animalFood = foodSystem:getAnimalFood(foodSpec.animalTypeIndex)
|
||||
if animalFood == nil then return nil end
|
||||
local consumption = animalFood.consumptionType
|
||||
local parallelConstant = AnimalFoodSystem ~= nil and AnimalFoodSystem.FOOD_CONSUME_TYPE_PARALLEL or nil
|
||||
local isParallel = (parallelConstant ~= nil and consumption == parallelConstant) or string.upper(tostring(consumption)) == "PARALLEL"
|
||||
if not isParallel then return nil end
|
||||
local groups = {}
|
||||
for _, group in pairs(animalFood.groups or {}) do
|
||||
table.insert(groups, {fillTypes = group.fillTypes or {}, eatWeight = tonumber(group.eatWeight) or tonumber(group.productionWeight) or 1})
|
||||
end
|
||||
return groups
|
||||
end
|
||||
|
||||
-- Trugets fælles trang (fri/kapacitet) og foderets vægt for en vare; nil når varen ikke er foder.
|
||||
local function getFoodPriority(station, fillType)
|
||||
local husbandry = getHusbandry(station)
|
||||
@@ -505,6 +526,10 @@ local function getFoodPriority(station, fillType)
|
||||
if foodFillTypes == nil or foodFillTypes[fillType] == nil then
|
||||
return nil
|
||||
end
|
||||
-- parallelt foder: grupperne supplerer hinanden, så "bedste foder først" gælder ikke
|
||||
if getParallelFoodGroups(husbandry) ~= nil then
|
||||
return nil
|
||||
end
|
||||
local foodSpec = husbandry.spec_husbandryFood
|
||||
local total = 0
|
||||
for _, level in pairs(foodSpec.fillLevels or {}) do
|
||||
@@ -542,6 +567,17 @@ end
|
||||
-- Foder deler ét trug: varens eget niveau + trugets fri plads = den kapacitet varen kan nå.
|
||||
local function getHusbandryFoodLevelAndCapacity(husbandry, fillType)
|
||||
local foodSpec = husbandry.spec_husbandryFood
|
||||
local groups = getParallelFoodGroups(husbandry)
|
||||
if groups ~= nil then
|
||||
local level, capacity = ADSupplyPlanner.parallelFoodShare(groups, foodSpec.fillLevels, foodSpec.capacity, fillType)
|
||||
if level ~= nil then
|
||||
-- andelen kan ikke overstige den plads truget faktisk har fri (fuldt af korn = ingen plads til snitter)
|
||||
local total = 0
|
||||
for _, value in pairs(foodSpec.fillLevels or {}) do total = total + (value or 0) end
|
||||
local actualFree = math.max(0, (foodSpec.capacity or 0) - total)
|
||||
return level, math.max(level, math.min(capacity, level + actualFree))
|
||||
end
|
||||
end
|
||||
local total = 0
|
||||
for _, level in pairs(foodSpec.fillLevels or {}) do
|
||||
total = total + (level or 0)
|
||||
|
||||
@@ -323,3 +323,25 @@ function ADSupplyPlanner.findTriggerNodes(root, maxDepth)
|
||||
visit(root, 0)
|
||||
return nodes
|
||||
end
|
||||
|
||||
|
||||
-- Parallelt foder (animalFood consumptionType PARALLEL, fx høns): dyrene spiser fra alle grupper samtidig,
|
||||
-- så hver gruppe skal have sin andel af truget efter eatWeight. Returnerer gruppens niveau og kapacitet
|
||||
-- (trugets kapacitet × gruppens andel) for gruppen der indeholder fillType; nil hvis varen ikke er foder.
|
||||
function ADSupplyPlanner.parallelFoodShare(groups, fillLevels, capacity, fillType)
|
||||
local totalWeight = 0
|
||||
for _, group in ipairs(groups or {}) do totalWeight = totalWeight + (tonumber(group.eatWeight) or 0) end
|
||||
if totalWeight <= 0 then return nil end
|
||||
for _, group in ipairs(groups or {}) do
|
||||
local isMember = false
|
||||
for _, member in pairs(group.fillTypes or {}) do
|
||||
if member == fillType then isMember = true end
|
||||
end
|
||||
if isMember then
|
||||
local level = 0
|
||||
for _, member in pairs(group.fillTypes or {}) do level = level + ((fillLevels or {})[member] or 0) end
|
||||
return level, (capacity or 0) * (tonumber(group.eatWeight) or 0) / totalWeight
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<modDesc descVersion="107">
|
||||
<author>masterdraco</author>
|
||||
<version>1.19.6.0</version>
|
||||
<version>1.19.7.0</version>
|
||||
<title>
|
||||
<en>AD Smart Pickup</en>
|
||||
</title>
|
||||
|
||||
Reference in New Issue
Block a user