fix(kæde): markvarer som hø og hakkelse kommer fra markerne

ADChainData leverer data.fieldGoods (vindue-varer, spillets konvertere, tørrede
varianter og kendte markvarer der findes som fill type). En markvare uden
producent/stald får kilden "fra marker" uden afgrødeplan og uden problem, så
fermenteringssiloernes hø/lucerne/kløver/hakkelse ikke meldes som køb.
This commit is contained in:
2026-09-30 15:25:47 +02:00
parent 928299c8ee
commit d2a4cf0d23
6 changed files with 96 additions and 7 deletions
+72 -1
View File
@@ -197,6 +197,76 @@ local function readCrops(data, nameOf)
end
end
-- ---- markvarer (hø, hakkelse, halm …) ----
-- Varer der høstes/laves på marken uden at være en afgrødes hovedvare. Spillets konvertere hedder forskelligt
-- mellem versioner/kort (FORAGEHARVESTER/FORAGE_HARVESTER), så alle navne prøves; et ukendt navn giver nil.
ADChainData.FIELD_CONVERTERS = {"FORAGEHARVESTER", "FORAGE_HARVESTER", "MOWER", "COMBINE", "CUTTER"}
-- Kendte markvarer (basisspil, FermentingSiloPack, Dakota); kun dem der findes som fill type bruges.
ADChainData.KNOWN_FIELD_GOODS = {"STRAW", "CHAFF", "CROP_WINDROW", "GRASS_WINDROW", "ALFALFA_WINDROW", "CLOVER_WINDROW",
"DRYGRASS_WINDROW", "DRYALFALFA_WINDROW", "DRYCLOVER_WINDROW", "CCM", "CCMRAW", "WCS"}
-- fruit.windrowFillType kan være et indeks eller en fill type-beskrivelse
local function windrowIndex(fruit)
local windrow = fruit.windrowFillType
if type(windrow) == "number" then return windrow end
if type(windrow) == "table" then
if windrow.index ~= nil then return windrow.index end
if windrow.name ~= nil and g_fillTypeManager.getFillTypeIndexByName ~= nil then
return g_fillTypeManager:getFillTypeIndexByName(windrow.name)
end
end
return nil
end
-- Én konverters mål-indekser ({[fra] = {targetFillTypeIndex|fillTypeIndex}}, samme form som adFields.buildMowable)
local function converterTargets(converter, add)
for _, entry in pairs(converter or {}) do
if type(entry) == "table" then add(entry.targetFillTypeIndex or entry.fillTypeIndex) end
end
end
-- data.fieldGoods = {[navn] = true}. Kun eksisterende fill types; fejl logges én gang og gør ikke læsningen delvis
-- (en ændret spil-API må ikke blokere kæden for altid) — værst tænkeligt meldes en markvare som "køb".
local function readFieldGoods(data, nameOf)
local indices = {}
local function add(index) if type(index) == "number" then indices[index] = true end end
local function guarded(key, fn)
local ok, err = pcall(fn)
if not ok then ADChainData.warnOnce("fieldGoods:" .. key, "markvarer (%s) kunne ikke læses: %s", key, tostring(err)) end
end
if g_fillTypeManager == nil then return end
local fruitManager = g_fruitTypeManager
for _, fruit in ipairs(fruitManager ~= nil and fruitManager.fruitTypes or {}) do
guarded("windrow:" .. tostring(fruit.name), function() add(windrowIndex(fruit)) end)
end
if fruitManager ~= nil and fruitManager.getConverterDataByName ~= nil then
for _, name in ipairs(ADChainData.FIELD_CONVERTERS) do
guarded(name, function() converterTargets(fruitManager:getConverterDataByName(name), add) end)
end
end
if g_fillTypeManager.getFillTypeIndexByName ~= nil then
for _, name in ipairs(ADChainData.KNOWN_FIELD_GOODS) do
guarded(name, function() add(g_fillTypeManager:getFillTypeIndexByName(name)) end)
end
end
-- tørrede varianter (vender: græs-vindue -> hø)
if g_fillTypeManager.getConverterDataByName ~= nil then
guarded("TEDDER", function()
local tedder = g_fillTypeManager:getConverterDataByName("TEDDER") or {}
local windrows = {}
for index in pairs(indices) do table.insert(windrows, index) end
for _, index in ipairs(windrows) do
local entry = tedder[index]
if type(entry) == "table" then add(entry.targetFillTypeIndex or entry.fillTypeIndex) end
end
end)
end
for index in pairs(indices) do
local ok, name = pcall(nameOf, index)
if ok and name ~= nil and data.crops[name] == nil then data.fieldGoods[name] = true end
end
end
local function readStock(data, adEnv, farmId, nameOf)
local ok, err = pcall(function()
for index, liters in pairs(ADStorageStats.farmTotals(ADSources.getFarmInventory(adEnv, farmId))) do
@@ -369,11 +439,12 @@ end
-- ikke har nået alle marker.
function ADChainData.collect(adEnv, farmId, byChain)
local data = {recipes = {}, husbandry = {}, crops = {}, stock = {}, fields = {}, yields = {}, fruitFillIndex = {},
usedFruits = {}, points = {}, fillTitles = {}, fillIndex = {}, placeables = {}, barnFood = {}, stockByFill = {}, rates = {}}
usedFruits = {}, points = {}, fillTitles = {}, fillIndex = {}, placeables = {}, barnFood = {}, stockByFill = {}, rates = {}, fieldGoods = {}}
local nameOf = nameResolver(data)
data.priceOf = priceResolver(data)
readPlaceables(data, farmId, byChain, nameOf)
readCrops(data, nameOf)
readFieldGoods(data, nameOf)
readStock(data, adEnv, farmId, nameOf)
readRates(data, adEnv, farmId, nameOf)
readUsedFruits(data, adEnv, farmId, nameOf)