mirror of
https://github.com/holub/mame
synced 2025-05-03 21:13:18 +03:00

Added emulated time recording as well as wall clock time. Fixed recording time for multiple software items per system. An incorrect constraint on the database table meant that time was only being recorded for a single software item per system. Detect the "empty" driver so the time spent at the selection menu isn't recorded (you'd get multiple entries for this due to the way options leak when returning to the system selection menu). Included schema migration code to update existing timer plugin databases. Also replaced some unnecessary floating point code with integer maths, added log messages, and made the plugin unload unload its database access code during emulation. Changed other plugins' use of paths with trailing slashes as this causes stat to fail on Windows.
102 lines
2.8 KiB
Lua
102 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 ioport = manager.machine.ioport
|
|
local new_button = {
|
|
port = settings.port,
|
|
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 = ioport.ports[settings.port]
|
|
if port then
|
|
local field = port:field(settings.mask)
|
|
if field and (field.type == new_button.type) then
|
|
new_button.button = field
|
|
end
|
|
end
|
|
return new_button
|
|
end
|
|
return nil
|
|
end
|
|
|
|
local function serialize_settings(button_list)
|
|
local settings = {}
|
|
for index, button in ipairs(button_list) do
|
|
local setting = {
|
|
port = button.port,
|
|
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
|
|
}
|
|
table.insert(settings, 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', 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', path))
|
|
return
|
|
end
|
|
local filename = path .. '/' .. get_settings_filename()
|
|
if #buttons == 0 then
|
|
os.remove(filename)
|
|
return
|
|
end
|
|
local json = require('json')
|
|
local settings = serialize_settings(buttons)
|
|
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
|