MAME/plugins/offscreenreload/offscreenreload_persist.lua
2026-05-23 01:35:04 +10:00

134 lines
3.4 KiB
Lua

-- license:BSD-3-Clause
-- copyright-holders:Vas Crabb
-- Helpers
local function settings_path()
return manager.machine.options.entries.homepath:value():match('([^;]+)') .. '/offscreenreload'
end
local function settings_filename()
return emu.romname() .. '.cfg'
end
local function make_helper(setting)
if (setting.binding == nil) or (setting.axis == nil) or (setting.button == nil) then
return nil
elseif (setting.axis.port == nil) or (setting.axis.mask == nil) or (setting.axis.type == nil) then
return nil
elseif (setting.button.port == nil) or (setting.button.mask == nil) or (setting.button.type == nil) then
return nil
end
local ioport = manager.machine.ioport
local result = {
binding = manager.machine.input:seq_from_tokens(setting.binding),
bindingcfg = setting.binding,
axis = {
port = setting.axis.port,
mask = setting.axis.mask,
type = ioport:token_to_input_type(setting.axis.type) },
button = {
port = setting.button.port,
mask = setting.button.mask,
type = ioport:token_to_input_type(setting.button.type) } }
local axisport = ioport.ports[result.axis.port]
if axisport then
local field = axisport:field(result.axis.mask)
if field and (field.type == result.axis.type) then
result.axis.field = field
end
end
local buttonport = ioport.ports[result.button.port]
if buttonport then
local field = buttonport:field(result.button.mask)
if field and (field.type == result.button.type) then
result.button.field = field
end
end
return result
end
local function make_settings(helpers)
local input = manager.machine.input
local ioport = manager.machine.ioport
local result = { }
for i, helper in ipairs(helpers) do
local h = {
binding = helper.bindingcfg,
axis = {
port = helper.axis.port,
mask = helper.axis.mask,
type = ioport:input_type_to_token(helper.axis.type) },
button = {
port = helper.button.port,
mask = helper.button.mask,
type = ioport:input_type_to_token(helper.button.type) } }
table.insert(result, h)
end
return result
end
-- Entry points
local lib = { }
function lib:load_settings()
local filename = settings_path() .. '/' .. settings_filename()
local file = io.open(filename, 'r')
if not file then
return { }
end
local json = require('json')
local settings = json.parse(file:read('a'))
file:close()
if not settings then
emu.print_error(string.format('Error loading off-screen reload helpers: error parsing file "%s" as JSON', filename))
return { }
end
result = { }
for index, setting in ipairs(settings) do
local helper = make_helper(setting)
if helper then
table.insert(result, helper)
end
end
return result
end
function lib:save_settings(helpers)
local path = settings_path()
local stat = lfs.attributes(path)
if stat and (stat.mode ~= 'directory') then
emu.print_error(string.format('Error saving off-screen reload helpers: "%s" is not a directory', path))
return
end
local filename = path .. '/' .. settings_filename()
if #helpers == 0 then
os.remove(filename)
return
elseif not stat then
lfs.mkdir(path)
end
local json = require('json')
local settings = make_settings(helpers)
local text = json.stringify(settings, { indent = true })
local file = io.open(filename, 'w')
if not file then
emu.print_error(string.format('Error saving off-screen reload helpers: error opening file "%s" for writing', filename))
return
end
file:write(text)
file:close()
end
return lib