diff options
Diffstat (limited to 'plugins/timer/init.lua')
-rw-r--r-- | plugins/timer/init.lua | 140 |
1 files changed, 55 insertions, 85 deletions
diff --git a/plugins/timer/init.lua b/plugins/timer/init.lua index 56ccd6b39ed..1d67472b3c2 100644 --- a/plugins/timer/init.lua +++ b/plugins/timer/init.lua @@ -1,109 +1,79 @@ -- license:BSD-3-Clause --- copyright-holders:Carl -require('lfs') -local sqlite3 = require('lsqlite3') -local exports = {} -exports.name = "timer" -exports.version = "0.0.2" -exports.description = "Game play timer" -exports.license = "The BSD 3-Clause License" -exports.author = { name = "Carl" } +-- copyright-holders:Vas Crabb +-- TODO: track time properly across soft reset and state load +local exports = { + name = 'timer', + version = '0.0.3', + description = 'Game play timer', + license = 'BSD-3-Clause', + author = { name = 'Vas Crabb' } } local timer = exports +local reset_subscription, stop_subscription + function timer.startplugin() - local dir = lfs.env_replace(manager:options().entries.homepath:value()) - local timer_db = dir .. "/timer/timer.db" - local timer_started = false local total_time = 0 local start_time = 0 local play_count = 0 + local emu_total = emu.attotime() - local function save() - total_time = total_time + (os.time() - start_time) - - local db = assert(sqlite3.open(timer_db)) - - local insert_stmt = assert( db:prepare("INSERT OR IGNORE INTO timer VALUES (?, ?, 0, 0)") ) - insert_stmt:bind_values(emu.romname(), emu.softname()) - insert_stmt:step() - insert_stmt:reset() - - local update_stmt = assert( db:prepare("UPDATE timer SET total_time=?, play_count=? WHERE driver=? AND software=?") ) - update_stmt:bind_values(total_time, play_count,emu.romname(), emu.softname()) - update_stmt:step() - update_stmt:reset() - - assert(db:close() == sqlite3.OK) - end - - - emu.register_start(function() - local file - if timer_started then - save() - end - timer_started = true - lfs.mkdir(dir .. '/timer') - local db = assert(sqlite3.open(timer_db)) - local found=false - db:exec([[select * from sqlite_master where name='timer';]], function(...) found=true return 0 end) - if not found then - db:exec[[ CREATE TABLE timer ( - driver VARCHAR(32) PRIMARY KEY, - software VARCHAR(40), - total_time INTEGER NOT NULL, - play_count INTEGER NOT NULL - ); ]] - end - - local stmt, row - stmt = db:prepare("SELECT total_time, play_count FROM timer WHERE driver = ? AND software = ?") - stmt:bind_values(emu.romname(), emu.softname()) - if (stmt:step() == sqlite3.ROW) then - row = stmt:get_named_values() - play_count = row.play_count - total_time = row.total_time - else - play_count = 0 - total_time = 0 - end + local reference = 0 + local lastupdate + local highlight -- hacky - workaround for the menu not remembering the selected item if its ref is nullptr - assert(db:close() == sqlite3.OK) - - start_time = os.time() - play_count = play_count + 1 - end) - - emu.register_stop(function() - timer_started = false - save() - total_time = 0 - play_count = 0 - end) local function sectohms(time) - local hrs = math.floor(time / 3600) - local min = math.floor((time % 3600) / 60) + local hrs = time // 3600 + local min = (time % 3600) // 60 local sec = time % 60 - return string.format("%03d:%02d:%02d", hrs, min, sec) + return string.format(_p('plugin-timer', '%03d:%02d:%02d'), hrs, min, sec) end local function menu_populate() - local time = os.time() - start_time - return {{ _("Current time"), "", "off" }, - { sectohms(time), "", "off" }, - { _("Total time"), "", "off" }, - { sectohms(total_time + time), "", "off" }, - { _("Play Count"), "", "off" }, - { play_count, "", "off" }} + lastupdate = os.time() + local refname = (reference == 0) and _p('plugin-timer', 'Wall clock') or _p('plugin-timer', 'Emulated time') + local time = (reference == 0) and (lastupdate - start_time) or manager.machine.time.seconds + local total = (reference == 0) and (total_time + time) or (manager.machine.time + emu_total).seconds + return + { + { _p("plugin-timer", "Reference"), refname, (reference == 0) and 'r' or 'l' }, + { '---', '', '' }, + { _p("plugin-timer", "Current time"), sectohms(time), "off" }, + { _p("plugin-timer", "Total time"), sectohms(total), "off" }, + { _p("plugin-timer", "Play Count"), tostring(play_count), "off" } }, + highlight, + "idle" end local function menu_callback(index, event) - return true + if (index == 1) and ((event == 'left') or (event == 'right') or (event == 'select')) then + reference = reference ~ 1 + return true + end + highlight = index + return os.time() > lastupdate end - emu.register_menu(menu_callback, menu_populate, _("Timer")) + + reset_subscription = emu.add_machine_reset_notifier( + function () + if emu.romname() ~= '___empty' then + start_time = os.time() + local persister = require('timer/timer_persist') + total_time, play_count, emu_total = persister:start_session() + end + end) + + stop_subscription = emu.add_machine_stop_notifier( + function () + if emu.romname() ~= '___empty' then + local persister = require('timer/timer_persist') + persister:update_totals(start_time) + end + end) + + emu.register_menu(menu_callback, menu_populate, _p("plugin-timer", "Timer")) end return exports |