diff options
Diffstat (limited to 'plugins/autofire/autofire_save.lua')
-rw-r--r-- | plugins/autofire/autofire_save.lua | 55 |
1 files changed, 35 insertions, 20 deletions
diff --git a/plugins/autofire/autofire_save.lua b/plugins/autofire/autofire_save.lua index 2f353417e3e..f863b003f4d 100644 --- a/plugins/autofire/autofire_save.lua +++ b/plugins/autofire/autofire_save.lua @@ -1,7 +1,7 @@ local lib = {} local function get_settings_path() - return lfs.env_replace(manager:machine():options().entries.homepath:value():match('([^;]+)')) .. '/autofire/' + return manager.machine.options.entries.homepath:value():match('([^;]+)') .. '/autofire' end local function get_settings_filename() @@ -9,23 +9,26 @@ local function get_settings_filename() end local function initialize_button(settings) - if settings.port and settings.field and settings.key and settings.on_frames and settings.off_frames then + 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, - field = settings.field, - key = manager:machine():input():code_from_token(settings.key), + 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 = manager:machine():ioport().ports[settings.port] + local port = ioport.ports[settings.port] if port then - local field = port.fields[settings.field] - if field then + local field = port:field(settings.mask) + if field and (field.type == new_button.type) then new_button.button = field - return new_button end end + return new_button end return nil end @@ -33,14 +36,15 @@ end local function serialize_settings(button_list) local settings = {} for index, button in ipairs(button_list) do - setting = { + local setting = { port = button.port, - field = button.field, - key = manager:machine():input():code_to_token(button.key), + 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 } - settings[#settings + 1] = setting + table.insert(settings, setting) end return settings end @@ -48,13 +52,15 @@ end function lib:load_settings() local buttons = {} local json = require('json') - local file = io.open(get_settings_path() .. get_settings_filename(), 'r') + 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 @@ -69,18 +75,27 @@ end function lib:save_settings(buttons) local path = get_settings_path() local attr = lfs.attributes(path) - if not attr then - lfs.mkdir(path) - elseif attr.mode ~= 'directory' then + 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 file = io.open(path .. get_settings_filename(), 'w') - if file then - file:write(json.stringify(settings, {indent = true})) - file:close() + 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 |