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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user