feat(marker): generisk lagring af alle plan-felter (test sikrer at intet felt glemmes)

This commit is contained in:
2026-09-25 23:58:47 +02:00
parent 7b0a9e452b
commit 969db0a699
2 changed files with 69 additions and 21 deletions
+27 -21
View File
@@ -1,17 +1,41 @@
-- AD Field Storage
-- Markernes trin/plan og markflåden gemmes i savegame-mappen ved siden af runs.
-- Markernes trin/plan og markflåden gemmes i savegame-mappen ved siden af runs. Hvert felt modellen gemmer
-- (ADFieldModel.toRecord) står i FIELD_TYPES med sin XML-type — en test sikrer at intet felt glemmes.
ADFieldStorage = {}
ADFieldStorage.FILE_NAME = "ADSmartPickup_fields.xml"
ADFieldStorage.ROOT = "ADSmartPickupFields"
ADFieldStorage.FIELD_TYPES = {
id = "Int", stage = "String", mode = "String", product = "String", rake = "Int", store = "String",
rigs = "Int", unloaders = "Int", mulch = "Int", lime = "Int", soil = "String", sow = "Int",
sowFruit = "String", roll = "Int", fertilize = "Int", weed = "Int",
kind = "String", lastFruit = "String", care = "String",
mowWidth = "Float", mowVehicle = "String", rakeVehicle = "String", windrowOffset = "String",
}
function ADFieldStorage.getPath()
local runsPath = ADRunsStorage ~= nil and ADRunsStorage.getPath() or nil
if runsPath == nil then return nil end
return (string.gsub(runsPath, ADRunsStorage.FILE_NAME .. "$", ADFieldStorage.FILE_NAME))
end
function ADFieldStorage.writeRecord(xmlFile, key, record)
for name, kind in pairs(ADFieldStorage.FIELD_TYPES) do
local value = record[name]
if value ~= nil then xmlFile["set" .. kind](xmlFile, key .. "#" .. name, value) end
end
end
function ADFieldStorage.readRecord(xmlFile, key)
local record = {}
for name, kind in pairs(ADFieldStorage.FIELD_TYPES) do
record[name] = xmlFile["get" .. kind](xmlFile, key .. "#" .. name)
end
return record
end
function ADFieldStorage.save(state)
local path = ADFieldStorage.getPath()
if path == nil then return false end
@@ -19,18 +43,7 @@ function ADFieldStorage.save(state)
if xmlFile == nil then return false end
local index = 0
for _, field in pairs(state.fields) do
local record = ADFieldModel.toRecord(field)
local key = string.format("%s.field(%d)", ADFieldStorage.ROOT, index)
xmlFile:setInt(key .. "#id", record.id)
xmlFile:setString(key .. "#stage", record.stage)
xmlFile:setString(key .. "#mode", record.mode)
xmlFile:setString(key .. "#product", record.product)
xmlFile:setInt(key .. "#rake", record.rake)
xmlFile:setString(key .. "#store", record.store)
xmlFile:setFloat(key .. "#mowWidth", record.mowWidth)
xmlFile:setString(key .. "#mowVehicle", record.mowVehicle)
xmlFile:setString(key .. "#rakeVehicle", record.rakeVehicle)
xmlFile:setString(key .. "#windrowOffset", record.windrowOffset)
ADFieldStorage.writeRecord(xmlFile, string.format("%s.field(%d)", ADFieldStorage.ROOT, index), ADFieldModel.toRecord(field))
index = index + 1
end
local vehicleIndex = 0
@@ -50,14 +63,7 @@ function ADFieldStorage.load()
local xmlFile = XMLFile.load("ADSmartPickupFields", path)
if xmlFile == nil then return result end
xmlFile:iterate(ADFieldStorage.ROOT .. ".field", function(_, key)
local field = ADFieldModel.fromRecord({
id = xmlFile:getInt(key .. "#id"), stage = xmlFile:getString(key .. "#stage"),
mode = xmlFile:getString(key .. "#mode"), product = xmlFile:getString(key .. "#product"),
rake = xmlFile:getInt(key .. "#rake"), store = xmlFile:getString(key .. "#store"),
mowWidth = xmlFile:getFloat(key .. "#mowWidth"), mowVehicle = xmlFile:getString(key .. "#mowVehicle"),
rakeVehicle = xmlFile:getString(key .. "#rakeVehicle"),
windrowOffset = xmlFile:getString(key .. "#windrowOffset"),
})
local field = ADFieldModel.fromRecord(ADFieldStorage.readRecord(xmlFile, key))
if field.id ~= nil then result.fields[field.id] = field end
end)
xmlFile:iterate(ADFieldStorage.ROOT .. ".fleet.vehicle", function(_, key)