diff options
author | 2017-06-02 17:59:55 -0500 | |
---|---|---|
committer | 2017-06-02 18:03:25 -0500 | |
commit | 33c65a2afccb8031e5c929498cdbdb6c83bb645e (patch) | |
tree | e91bc89b1ffdaac44a8f4bbb2fb135e1221db597 /plugins/cheat/init.lua | |
parent | e6ee45d670bc54cf033a2d71454095b0392bbf3b (diff) |
plugins/cheat: add hotkey support [Carl]
Diffstat (limited to 'plugins/cheat/init.lua')
-rw-r--r-- | plugins/cheat/init.lua | 274 |
1 files changed, 223 insertions, 51 deletions
diff --git a/plugins/cheat/init.lua b/plugins/cheat/init.lua index 7b85697fc48..1990fbca86a 100644 --- a/plugins/cheat/init.lua +++ b/plugins/cheat/init.lua @@ -62,12 +62,17 @@ exports.author = { name = "Carl" } local cheat = exports +function cheat.set_folder(path) + cheat.path = path +end + function cheat.startplugin() local cheats = {} local output = {} local line = 0 local start_time = 0 local stop = true + local cheatname = "" local function load_cheats() local filename = emu.romname() @@ -80,6 +85,7 @@ function cheat.startplugin() end end end + cheatname = filename local function add(addcheats) if not next(newcheats) then newcheats = addcheats @@ -89,25 +95,65 @@ function cheat.startplugin() end end end + for scrfile in lfs.dir(cheat.path) do + local name = string.match(scrfile, "^(cheat_.*).lua$") + if name then + local conv = require("cheat/" .. name) + if conv then + local ret = file:open(conv.filename(filename)) + while not ret do + add(conv.conv_cheat(file:read(file:size()))) + ret = file:open_next() + end + end + end + end + return newcheats + end + + local function load_hotkeys() local json = require("json") - local ret = file:open(filename .. ".json") - while not ret do - add(json.parse(file:read(file:size()))) - ret = file:open_next() - end - local xml = require("cheat/xml_conv") - ret = file:open(filename .. ".xml") - while not ret do - add(xml.conv_cheat(file:read(file:size()))) - ret = file:open_next() - end - local simp = require("cheat/simple_conv") - ret = file:open("cheat.simple") - while not ret do - add(simp.conv_cheat(filename, file:read(file:size()))) - ret = file:open_next() + local hotkeys = json.parse(io.open(manager:machine():options().entries.cheatpath:value():match("([^;]+)") .. "/" .. cheatname .. "_hotkeys.json", "r"):read("a")) + for num, val in ipairs(hotkeys) do + for num, cheat in pairs(cheats) do + if val.desc == cheat.desc then + cheat.hotkeys = {} + local keymap = require("cheat/keycodemap") + cheat.hotkeys.keys = manager:machine():input():seq_from_tokens(val.keys) + local keysstr = {} + val.keys:gsub("([^ ]+)", function(s) keysstr[#keysstr + 1] = keymap[s] return s end) + cheat.hotkeys.keysstr = keysstr + cheat.hotkeys.pressed = false + end + end + end + end + + local function save_hotkeys() + local hotkeys = {} + for num, cheat in ipairs(cheats) do + if cheat.hotkeys then + local keymap = require("cheat/keycodemap") + local hotkey = {} + hotkey.desc = cheat.desc + hotkey.keys = "" + for num2, key in ipairs(cheat.hotkeys.keysstr) do + if #hotkey.keys > 0 then + hotkey.keys = hotkey.keys .. " " + end + hotkey.keys = hotkey.keys .. keymap[key] + end + hotkeys[#hotkeys + 1] = hotkey + end + end + if #hotkeys > 0 then + local json = require("json") + local file = io.open(manager:machine():options().entries.cheatpath:value():match("([^;]+)") .. "/" .. cheatname .. "_hotkeys.json", "w+") + if file then + file:write(json.stringify(hotkeys, {indent = true})) + file:close() + end end - return newcheats end local function draw_text(screen, x, y, color, form, ...) @@ -284,8 +330,103 @@ function cheat.startplugin() cheat.cheat_env.param = param.min end + local hotkeymenu = false + local hotkeysel = 0 + local hotkey = 1 + local hotmod = 1 + local hotkeylist = {} + local function run_if(func) if func then func() end return func or false end + local function is_oneshot(cheat) return cheat.script and not cheat.script.run and not cheat.script.on end + local function menu_populate() local menu = {} + if hotkeymenu then + if hotkeysel > 0 then + return hotkeylist[hotkeysel].pop() + end + local keys = {"1","2","3","4","5","6","7","8","9","0"} + local mods = {"LSHFT","RSHFT","LALT","RALT","LCTRL","RCTRL","LWIN","RWIN","MENU"} + + local function hkpopfunc(cheat) + local hkmenu = {} + hkmenu[1] = {"Set hotkey", "", "off"} + hkmenu[2] = {cheat.desc, "", "off"} + hkmenu[3] = {"Current Keys", cheat.hotkeys and table.concat(cheat.hotkeys.keysstr, " ") or "None", "off"} + hkmenu[4] = {"---", "", "off"} + hkmenu[5] = {"Key", keys[hotkey], "lr"} + if hotkey == 1 then + hkmenu[5][3] = "r" + elseif hotkey == #keys then + hkmenu[5][3] = "l" + end + hkmenu[6] = {"Modifier", mods[hotmod], "lr"} + if hotkey == 1 then + hkmenu[6][3] = "r" + elseif hotkey == #keys then + hkmenu[6][3] = "l" + end + hkmenu[7] = {"---", "", ""} + hkmenu[8] = {"Done", "", ""} + hkmenu[9] = {"Clear and Exit", "", ""} + hkmenu[10] = {"Cancel", "", ""} + return hkmenu + end + + local function hkcbfunc(cheat, index, event) + if event == "right" then + if index == 5 then + hotkey = math.min(hotkey + 1, #keys) + return true + elseif index == 6 then + hotmod = math.min(hotmod + 1, #mods) + return true + end + elseif event == "left" then + if index == 5 then + hotkey = math.max(hotkey - 1, 1) + return true + elseif index == 6 then + hotmod = math.max(hotmod - 1, 1) + return true + end + elseif event == "select" then + if index == 8 then + local keymap = require("cheat/keycodemap") + cheat.hotkeys = {} + cheat.hotkeys.keys = manager:machine():input():seq_from_tokens(keymap[keys[hotkey]] .. " " .. keymap[mods[hotmod]]) + cheat.hotkeys.keysstr = {keys[hotkey], mods[hotmod]} + cheat.hotkeys.pressed = false + hotkeysel = 0 + hotkeymenu = false + return true + elseif index == 9 then + cheat.hotkeys = nil + hotkeysel = 0 + hotkeymenu = false + return true + elseif index == 10 then + hotkeysel = 0 + return true + end + end + return false + end + + + menu[1] = {"Select cheat to set hotkey", "", "off"} + menu[2] = {"---", "", "off"} + hotkeylist = {} + for num, cheat in ipairs(cheats) do + if cheat.script then + menu[#menu + 1] = {cheat.desc, " ", ""} + hotkeylist[#hotkeylist + 1] = { pop = function() return hkpopfunc(cheat) end, + cb = function(index, event) return hkcbfunc(cheat, index, event) end } + end + end + menu[#menu + 1] = {"---", "", ""} + menu[#menu + 1] = {"Done", "", ""} + return menu + end for num, cheat in ipairs(cheats) do menu[num] = {} menu[num][1] = cheat.desc @@ -296,7 +437,7 @@ function cheat.startplugin() end menu[num][2] = "" menu[num][3] = "off" - elseif not cheat.script.run and not cheat.script.off then + elseif is_oneshot(cheat) then menu[num][2] = "Set" menu[num][3] = 0 else @@ -310,7 +451,7 @@ function cheat.startplugin() end else if cheat.parameter.index == 0 then - if not cheat.script.run and not cheat.script.off then + if is_oneshot(cheat) then menu[num][2] = "Set" else menu[num][2] = "Off" @@ -330,6 +471,7 @@ function cheat.startplugin() end end menu[#menu + 1] = {"---", "", 0} + menu[#menu + 1] = {"Set hotkeys", "", 0} menu[#menu + 1] = {"Reset All", "", 0} menu[#menu + 1] = {"Reload All", "", 0} return menu @@ -337,12 +479,30 @@ function cheat.startplugin() local function menu_callback(index, event) manager:machine():popmessage() + if hotkeymenu then + if hotkeysel > 0 then + return hotkeylist[hotkeysel].cb(index, event) + end + if event == "select" then + index = index - 2 + if index >= 1 and index <= #hotkeylist then + hotkeysel = index + return true + elseif index == #hotkeylist + 2 then + hotkeymenu = false + return true + end + end + return false + end if index > #cheats and event == "select" then index = index - #cheats if index == 2 then + hotkeymenu = true + elseif index == 3 then for num, cheat in pairs(cheats) do - if cheat.enabled and cheat.script.off then - cheat.script.off() + if cheat.enabled then + run_if(cheat.script.off) end cheat.enabled = false if cheat.parameter then @@ -350,16 +510,17 @@ function cheat.startplugin() cheat.parameter.index = 0 end end - elseif index == 3 then + elseif index == 4 then for num, cheat in pairs(cheats) do - if cheat.enabled and cheat.script.off then - cheat.script.off() + if cheat.enabled then + run_if(cheat.script.off) end end cheats = load_cheats() for num, cheat in pairs(cheats) do parse_cheat(cheat) end + load_hotkeys() end return true end @@ -393,9 +554,7 @@ function cheat.startplugin() param.index = 0 cheat.enabled = false cheat.cheat_env.param = param.min - if cheat.script.off then - cheat.script.off() - end + run_if(cheat.script.off) return true elseif param.index == 0 then return false @@ -403,19 +562,14 @@ function cheat.startplugin() param.index = param.index - 1 param_calc(param) cheat.cheat_env.param = param.value - if cheat.script.change and (cheat.script.run or cheat.script.off) then - cheat.script.change() + if not is_oneshot() then + run_if(cheat.script.change) end return true else - if not cheat.script.run and not cheat.script.off then - return false - end - if cheat.enabled then + if cheat.enabled and not is_oneshot(cheat) then cheat.enabled = false - if cheat.script.off then - cheat.script.off() - end + run_if(cheat.script.off) return true end return false @@ -425,34 +579,27 @@ function cheat.startplugin() local param = cheat.parameter if param.index == 0 then cheat.enabled = true - if cheat.script.on then - cheat.script.on() - end + run_if(cheat.script.on) elseif param.index == param.last then return false end param.index = param.index + 1 param_calc(param) cheat.cheat_env.param = param.value - if cheat.script.change and (cheat.script.run or cheat.script.off) then - cheat.script.change() + if not is_oneshot(cheat) then + run_if(cheat.script.change) end return true else - if not cheat.script.run and not cheat.script.off then - return false - end - if not cheat.enabled then + if not cheat.enabled and not is_oneshot(cheat) then cheat.enabled = true - if cheat.script.on then - cheat.script.on() - end + run_if(cheat.script.on) return true end return false end elseif event == "select" then - if not cheat.script.run and not cheat.script.off then + if is_oneshot(cheat) then if cheat.parameter and cheat.script.change and cheat.parameter.index ~= 0 then param_calc(cheat.parameter) cheat.cheat_env.param = cheat.parameter.value @@ -496,10 +643,12 @@ function cheat.startplugin() for num, cheat in pairs(cheats) do parse_cheat(cheat) end + load_hotkeys() end) emu.register_stop(function() stop = true + save_hotkeys() end) emu.register_frame(function() @@ -507,8 +656,31 @@ function cheat.startplugin() return end for num, cheat in pairs(cheats) do - if cheat.enabled and cheat.script.run then - cheat.script.run() + if cheat.enabled then + run_if(cheat.script.run) + end + if cheat.hotkeys and cheat.hotkeys.keys then + if manager:machine():input():seq_pressed(cheat.hotkeys.keys) then + if not cheat.hotkeys.pressed then + if is_oneshot(cheat) then + if not run_if(cheat.script.change) then + run_if(cheat.script.on) + end + manager:machine():popmessage("Activated: " .. cheat.desc) + elseif not cheat.enabled then + cheat.enabled = true + run_if(cheat.script.on) + manager:machine():popmessage("Enabled: " .. cheat.desc) + else + cheat.enabled = false + run_if(cheat.script.off) + manager:machine():popmessage("Disabled: " .. cheat.desc) + end + end + cheat.hotkeys.pressed = true + else + cheat.hotkeys.pressed = false + end end end end) |