summaryrefslogtreecommitdiffstatshomepage
path: root/plugins/autofire/autofire_save.lua
blob: 067368dd2b27712965bbca844046d3c5d6d2210d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
local lib = {}

local function get_settings_path()
	return lfs.env_replace(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.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():seq_from_tokens(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():seq_to_tokens(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