mirror of
https://github.com/holub/mame
synced 2025-05-04 05:23:22 +03:00

Changed the hiscore plugin to save inside the "hiscore" folder in the plugin data directory. The old hiscore path setting has already been removed from MAME for some time. This means the plugin was always saving in the "hi" folder in the working directory with no way to change it, which is problematic on Linux and macOS, particularly for distro packagers. There are lots of plugin and UI changes in this release, so we may as well get this out of the way now. Also made it possible to change the "timed save" option from the Plugin Options menu, and save that in the data folder, too. Documented the input macro plugin. The only undocumented plugins now are the cheat plugin, the cheat finder plugin, and the port name plugin.
100 lines
2.8 KiB
Lua
100 lines
2.8 KiB
Lua
local lib = {}
|
|
|
|
local function get_settings_path()
|
|
return emu.subst_env(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 new_button = {
|
|
port = settings.port,
|
|
key = manager.machine.input:seq_from_tokens(settings.key),
|
|
on_frames = settings.on_frames,
|
|
off_frames = settings.off_frames,
|
|
counter = 0
|
|
}
|
|
local ioport = manager.machine.ioport
|
|
local port = ioport.ports[settings.port]
|
|
if port then
|
|
local field = port:field(settings.mask)
|
|
if field and (field.type == ioport:token_to_input_type(settings.type)) then
|
|
new_button.field = field.name
|
|
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,
|
|
mask = button.button.mask,
|
|
type = manager.machine.ioport:input_type_to_token(button.button.type),
|
|
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 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\n', 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 not attr then
|
|
lfs.mkdir(path)
|
|
elseif attr.mode ~= 'directory' then
|
|
emu.print_error(string.format('Error saving autofire settings: "%s" is not a directory\n', path))
|
|
return
|
|
end
|
|
if #buttons == 0 then
|
|
os.remove(path .. get_settings_filename())
|
|
return
|
|
end
|
|
local json = require('json')
|
|
local settings = serialize_settings(buttons)
|
|
local data = json.stringify(settings, {indent = true})
|
|
local filename = path .. get_settings_filename()
|
|
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\n', filename))
|
|
return
|
|
end
|
|
file:write(data)
|
|
file:close()
|
|
end
|
|
|
|
return lib
|