119 lines
5.3 KiB
Lua
119 lines
5.3 KiB
Lua
-- AD Field Storage
|
|
-- 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", targetFruit = "String", prepAfterMow = "Int", straw = "String",
|
|
mowWidth = "Float", mowVehicle = "String", rakeVehicle = "String", harvestVehicle = "String", windrowOffset = "String",
|
|
dedicated = "String",
|
|
}
|
|
|
|
-- Kursus-registret (ADCourseCache): hvilken mark/bredde/form/indstillinger hver maskines CP-kursus er lavet til.
|
|
ADFieldStorage.COURSE_TYPES = {
|
|
vehicle = "String", field = "Int", width = "Float", sig = "String", settings = "String", waypoints = "Int",
|
|
}
|
|
|
|
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.writeCourseRecord(xmlFile, key, record)
|
|
for name, kind in pairs(ADFieldStorage.COURSE_TYPES) do
|
|
local value = record[name]
|
|
if value ~= nil then xmlFile["set" .. kind](xmlFile, key .. "#" .. name, value) end
|
|
end
|
|
end
|
|
|
|
function ADFieldStorage.readCourseRecord(xmlFile, key)
|
|
local record = {}
|
|
for name, kind in pairs(ADFieldStorage.COURSE_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
|
|
local xmlFile = XMLFile.create("ADSmartPickupFields", path, ADFieldStorage.ROOT)
|
|
if xmlFile == nil then return false end
|
|
local index = 0
|
|
for _, field in pairs(state.fields) do
|
|
ADFieldStorage.writeRecord(xmlFile, string.format("%s.field(%d)", ADFieldStorage.ROOT, index), ADFieldModel.toRecord(field))
|
|
index = index + 1
|
|
end
|
|
xmlFile:setString(ADFieldStorage.ROOT .. "#fleetMode", state.fleetMode or "all")
|
|
xmlFile:setInt(ADFieldStorage.ROOT .. "#paused", state.paused == true and 1 or 0)
|
|
local vehicleIndex = 0
|
|
for vehicleId in pairs(state.fleet) do
|
|
xmlFile:setString(string.format("%s.fleet.vehicle(%d)#id", ADFieldStorage.ROOT, vehicleIndex), vehicleId)
|
|
vehicleIndex = vehicleIndex + 1
|
|
end
|
|
local manualIndex = 0
|
|
for vehicleId in pairs(state.manual or {}) do
|
|
xmlFile:setString(string.format("%s.manual.vehicle(%d)#id", ADFieldStorage.ROOT, manualIndex), vehicleId)
|
|
manualIndex = manualIndex + 1
|
|
end
|
|
local courseIndex = 0
|
|
for _, record in pairs(state.courseRecords or {}) do
|
|
ADFieldStorage.writeCourseRecord(xmlFile, string.format("%s.courses.course(%d)", ADFieldStorage.ROOT, courseIndex), record)
|
|
courseIndex = courseIndex + 1
|
|
end
|
|
xmlFile:save()
|
|
xmlFile:delete()
|
|
return true
|
|
end
|
|
|
|
function ADFieldStorage.load()
|
|
local result = {fields = {}, fleet = {}, fleetMode = "all", courseRecords = {}, manual = {}, paused = false}
|
|
local path = ADFieldStorage.getPath()
|
|
if path == nil or not fileExists(path) then return result end
|
|
local xmlFile = XMLFile.load("ADSmartPickupFields", path)
|
|
if xmlFile == nil then return result end
|
|
result.fleetMode = xmlFile:getString(ADFieldStorage.ROOT .. "#fleetMode") == "ticked" and "ticked" or "all"
|
|
result.paused = xmlFile:getInt(ADFieldStorage.ROOT .. "#paused") == 1
|
|
xmlFile:iterate(ADFieldStorage.ROOT .. ".field", function(_, key)
|
|
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)
|
|
local id = xmlFile:getString(key .. "#id")
|
|
if id ~= nil and id ~= "" then result.fleet[id] = true end
|
|
end)
|
|
xmlFile:iterate(ADFieldStorage.ROOT .. ".manual.vehicle", function(_, key)
|
|
local id = xmlFile:getString(key .. "#id")
|
|
if id ~= nil and id ~= "" then result.manual[id] = true end
|
|
end)
|
|
xmlFile:iterate(ADFieldStorage.ROOT .. ".courses.course", function(_, key)
|
|
local record = ADCourseCache ~= nil and ADCourseCache.newRecord(ADFieldStorage.readCourseRecord(xmlFile, key)) or nil
|
|
if record ~= nil then result.courseRecords[record.vehicle] = record end
|
|
end)
|
|
xmlFile:delete()
|
|
return result
|
|
end
|