mirror of
https://github.com/mamedev/mame.git
synced 2024-11-18 10:06:19 +01:00
00f317b3d3
-plugins/autofire, plugins/inputmacro: Don't be so eager to create empty settings folders.
101 lines
2.8 KiB
Lua
101 lines
2.8 KiB
Lua
local lib = {}
|
|
|
|
local function get_settings_path()
|
|
return manager.machine.options.entries.homepath:value():match('([^;]+)') .. '/autofire'
|
|
end
|
|
|
|
local function get_settings_filename()
|
|
return emu.romname() .. '.cfg'
|
|
end
|
|
|
|
local function initialize_button(settings)
|
|
if settings.port and settings.mask and settings.type and settings.key and settings.on_frames and settings.off_frames then
|
|
local ioport = manager.machine.ioport
|
|
local new_button = {
|
|
port = settings.port,
|
|
mask = settings.mask,
|
|
type = ioport:token_to_input_type(settings.type),
|
|
key = manager.machine.input:seq_from_tokens(settings.key),
|
|
key_cfg = settings.key,
|
|
on_frames = settings.on_frames,
|
|
off_frames = settings.off_frames,
|
|
counter = 0
|
|
}
|
|
local port = ioport.ports[settings.port]
|
|
if port then
|
|
local field = port:field(settings.mask)
|
|
if field and (field.type == new_button.type) then
|
|
new_button.button = field
|
|
end
|
|
end
|
|
return new_button
|
|
end
|
|
return nil
|
|
end
|
|
|
|
local function serialize_settings(button_list)
|
|
local settings = {}
|
|
for index, button in ipairs(button_list) do
|
|
local setting = {
|
|
port = button.port,
|
|
mask = button.mask,
|
|
type = manager.machine.ioport:input_type_to_token(button.type),
|
|
key = button.key_cfg,
|
|
on_frames = button.on_frames,
|
|
off_frames = button.off_frames
|
|
}
|
|
table.insert(settings, setting)
|
|
end
|
|
return settings
|
|
end
|
|
|
|
function lib:load_settings()
|
|
local buttons = {}
|
|
local json = require('json')
|
|
local filename = get_settings_path() .. '/' .. get_settings_filename()
|
|
local file = io.open(filename, 'r')
|
|
if not file then
|
|
return buttons
|
|
end
|
|
local loaded_settings = json.parse(file:read('a'))
|
|
file:close()
|
|
if not loaded_settings then
|
|
emu.print_error(string.format('Error loading autofire settings: error parsing file "%s" as JSON', filename))
|
|
return buttons
|
|
end
|
|
for index, button_settings in ipairs(loaded_settings) do
|
|
local new_button = initialize_button(button_settings)
|
|
if new_button then
|
|
buttons[#buttons + 1] = new_button
|
|
end
|
|
end
|
|
return buttons
|
|
end
|
|
|
|
function lib:save_settings(buttons)
|
|
local path = get_settings_path()
|
|
local attr = lfs.attributes(path)
|
|
if attr and (attr.mode ~= 'directory') then
|
|
emu.print_error(string.format('Error saving autofire settings: "%s" is not a directory', path))
|
|
return
|
|
end
|
|
local filename = path .. '/' .. get_settings_filename()
|
|
if #buttons == 0 then
|
|
os.remove(filename)
|
|
return
|
|
elseif not attr then
|
|
lfs.mkdir(path)
|
|
end
|
|
local json = require('json')
|
|
local settings = serialize_settings(buttons)
|
|
local data = json.stringify(settings, {indent = true})
|
|
local file = io.open(filename, 'w')
|
|
if not file then
|
|
emu.print_error(string.format('Error saving autofire settings: error opening file "%s" for writing', filename))
|
|
return
|
|
end
|
|
file:write(data)
|
|
file:close()
|
|
end
|
|
|
|
return lib
|