diff options
Diffstat (limited to 'plugins/autofire/autofire_save.lua')
-rw-r--r-- | plugins/autofire/autofire_save.lua | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/plugins/autofire/autofire_save.lua b/plugins/autofire/autofire_save.lua new file mode 100644 index 00000000000..e7d28029cd5 --- /dev/null +++ b/plugins/autofire/autofire_save.lua @@ -0,0 +1,86 @@ +local lib = {} + +local function get_settings_path() + return lfs.env_replace(manager:machine():options().entries.pluginspath:value():match('([^;]+)')) .. '/autofire/cfg/' +end + +local function get_settings_filename() + return emu.romname() .. '.cfg' +end + +local function initialize_button(settings) + if settings.port and settings.field and settings.key and settings.on_frames and settings.off_frames then + local new_button = { + port = settings.port, + field = settings.field, + key = manager:machine():input():code_from_token(settings.key), + on_frames = settings.on_frames, + off_frames = settings.off_frames, + counter = 0 + } + local port = manager:machine():ioport().ports[settings.port] + if port then + local field = port.fields[settings.field] + if field then + new_button.button = field + return new_button + end + end + end + return nil +end + +local function serialize_settings(button_list) + local settings = {} + for index, button in ipairs(button_list) do + setting = { + port = button.port, + field = button.field, + key = manager:machine():input():code_to_token(button.key), + on_frames = button.on_frames, + off_frames = button.off_frames + } + settings[#settings + 1] = setting + end + return settings +end + +function lib:load_settings() + local buttons = {} + local json = require('json') + local file = io.open(get_settings_path() .. get_settings_filename(), 'r') + if not file then + return buttons + end + local loaded_settings = json.parse(file:read('a')) + file:close() + if not loaded_settings then + 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 not attr then + lfs.mkdir(path) + elseif attr.mode ~= 'directory' then + return + 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() + end +end + +return lib |