File: offscreenreload_persist.lua

package info (click to toggle)
mame 0.286%2Bdfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 930,472 kB
  • sloc: cpp: 5,499,413; xml: 2,250,892; ansic: 752,116; sh: 34,431; lisp: 19,643; python: 17,598; makefile: 13,246; java: 8,492; yacc: 8,152; javascript: 7,147; cs: 6,013; asm: 4,786; ada: 1,681; pascal: 1,191; lex: 1,174; perl: 585; ruby: 373
file content (133 lines) | stat: -rw-r--r-- 3,471 bytes parent folder | download
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
-- 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