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:
2026-09-24 21:39:13 +02:00
parent a4c3d6fb91
commit e785439605
7 changed files with 96 additions and 3 deletions
+36
View File
@@ -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)