mirror of
https://github.com/holub/mame
synced 2025-06-06 12:53:46 +03:00
plugins/cheatfind: name cheats (nw)
This commit is contained in:
parent
4395a9ebbf
commit
8d9fb8e4a9
@ -245,6 +245,11 @@ function cheatfind.startplugin()
|
|||||||
local watches = {}
|
local watches = {}
|
||||||
local menu_func
|
local menu_func
|
||||||
|
|
||||||
|
local cheat_save
|
||||||
|
local name = 1
|
||||||
|
local name_player = 1
|
||||||
|
local name_type = 1
|
||||||
|
|
||||||
local function start()
|
local function start()
|
||||||
devtable = {}
|
devtable = {}
|
||||||
devsel = 1
|
devsel = 1
|
||||||
@ -294,6 +299,19 @@ function cheatfind.startplugin()
|
|||||||
local function menu_populate()
|
local function menu_populate()
|
||||||
local menu = {}
|
local menu = {}
|
||||||
|
|
||||||
|
local function menu_prepare()
|
||||||
|
local menu_list = {}
|
||||||
|
menu_func = {}
|
||||||
|
for num, func in ipairs(menu) do
|
||||||
|
local item, f = func()
|
||||||
|
if item then
|
||||||
|
menu_list[#menu_list + 1] = item
|
||||||
|
menu_func[#menu_list] = f
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return menu_list
|
||||||
|
end
|
||||||
|
|
||||||
local function menu_lim(val, min, max, menuitem)
|
local function menu_lim(val, min, max, menuitem)
|
||||||
if min == max then
|
if min == max then
|
||||||
menuitem[3] = 0
|
menuitem[3] = 0
|
||||||
@ -318,7 +336,90 @@ function cheatfind.startplugin()
|
|||||||
return val, ret
|
return val, ret
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if cheat_save then
|
||||||
|
local cplayer = { "All", "P1", "P2", "P3", "P4" }
|
||||||
|
local ctype = { "Infinite Credits", "Infinite Time", "Infinite Lives", "Infinite Energy", "Infinite Ammo", "Infinite Bombs", "Invincibility" }
|
||||||
|
menu[#menu + 1] = function() return { "Save Cheat", "", "off" }, nil end
|
||||||
|
menu[#menu + 1] = function() return { "---", "", "off" }, nil end
|
||||||
|
menu[#menu + 1] = function()
|
||||||
|
local c = { "Default", "Custom" }
|
||||||
|
local m = { "Cheat Name", c[name], 0 }
|
||||||
|
menu_lim(name, 1, #c, m)
|
||||||
|
f = function(event)
|
||||||
|
local r
|
||||||
|
name, r = incdec(event, name, 1, #c)
|
||||||
|
if (event == "select" or event == "comment") and name == 1 then
|
||||||
|
manager:machine():popmessage("Default name is " .. cheat_save.name)
|
||||||
|
end
|
||||||
|
return r
|
||||||
|
end
|
||||||
|
return m, f
|
||||||
|
end
|
||||||
|
if name == 2 then
|
||||||
|
menu[#menu + 1] = function()
|
||||||
|
local m = { "Player", cplayer[name_player], 0 }
|
||||||
|
menu_lim(name_player, 1, #cplayer, m)
|
||||||
|
return m, function(event) local r name_player, r = incdec(event, name_player, 1, #cplayer) return r end
|
||||||
|
end
|
||||||
|
menu[#menu + 1] = function()
|
||||||
|
local m = { "Type", ctype[name_type], 0 }
|
||||||
|
menu_lim(name_type, 1, #ctype, m)
|
||||||
|
return m, function(event) local r name_type, r = incdec(event, name_type, 1, #ctype) return r end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
menu[#menu + 1] = function()
|
||||||
|
local m = { "Save", "", 0 }
|
||||||
|
local f = function(event)
|
||||||
|
if event == "select" then
|
||||||
|
local desc
|
||||||
|
local written = false
|
||||||
|
if name == 2 then
|
||||||
|
if cplayer[name_player] == "All" then
|
||||||
|
desc = ctype[name_type]
|
||||||
|
else
|
||||||
|
desc = cplayer[name_player] .. " " .. ctype[name_type]
|
||||||
|
end
|
||||||
|
else
|
||||||
|
desc = cheat_save.name
|
||||||
|
end
|
||||||
|
local filename = cheat_save.filename .. "_" .. desc
|
||||||
|
local file = io.open(filename .. ".json", "w")
|
||||||
|
if file then
|
||||||
|
file:write(string.format(cheat_save.json, desc))
|
||||||
|
file:close()
|
||||||
|
if not devtable[devcur].space.shortname then -- no xml or simple for ram_device cheat
|
||||||
|
file = io.open(filename .. ".xml", "w")
|
||||||
|
file:write(string.format(cheat_save.xml, desc))
|
||||||
|
file:close()
|
||||||
|
file = io.open(cheat_save.path .. "/cheat.simple", "a")
|
||||||
|
file:write(string.format(cheat_save.simple, desc))
|
||||||
|
file:close()
|
||||||
|
manager:machine():popmessage("Cheat written to " .. cheat_save.filename .. " and added to cheat.simple")
|
||||||
|
end
|
||||||
|
written = true
|
||||||
|
elseif not devtable[devcur].space.shortname then
|
||||||
|
file = io.open(cheat_save.path .. "/cheat.simple", "a")
|
||||||
|
if file then
|
||||||
|
file:write(string.format(cheat_save.simple, desc))
|
||||||
|
file:close()
|
||||||
|
manager:machine():popmessage("Cheat added to cheat.simple")
|
||||||
|
written = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not written then
|
||||||
|
manager:machine():popmessage("Unable to write file\nCheck cheatpath dir exists")
|
||||||
|
end
|
||||||
|
cheat_save = nil
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
return m, f
|
||||||
|
end
|
||||||
|
menu[#menu + 1] = function() return { "Cancel", "", 0 }, function(event) if event == "select" then cheat_save = nil return true end end end
|
||||||
|
return menu_prepare()
|
||||||
|
end
|
||||||
|
|
||||||
menu[#menu + 1] = function()
|
menu[#menu + 1] = function()
|
||||||
local m = { "CPU or RAM", devtable[devsel].tag, 0 }
|
local m = { "CPU or RAM", devtable[devsel].tag, 0 }
|
||||||
menu_lim(devsel, 1, #devtable, m)
|
menu_lim(devsel, 1, #devtable, m)
|
||||||
@ -576,24 +677,24 @@ function cheatfind.startplugin()
|
|||||||
local dev = devtable[devcur]
|
local dev = devtable[devcur]
|
||||||
local cheat = { desc = string.format("Test cheat at addr %08X", match.addr), script = {} }
|
local cheat = { desc = string.format("Test cheat at addr %08X", match.addr), script = {} }
|
||||||
local wid = formtable[width]:sub(2, 2):lower()
|
local wid = formtable[width]:sub(2, 2):lower()
|
||||||
local xmlcheat
|
local widchar
|
||||||
local form
|
local form
|
||||||
if wid == "h" then
|
if wid == "h" then
|
||||||
wid = "u16"
|
wid = "u16"
|
||||||
form = "%08x %04x"
|
form = "%08x %04x"
|
||||||
xmlcheat = "w"
|
widchar = "w"
|
||||||
elseif wid == "l" then
|
elseif wid == "l" then
|
||||||
wid = "u32"
|
wid = "u32"
|
||||||
form = "%08x %08x"
|
form = "%08x %08x"
|
||||||
xmlcheat = "d"
|
widchart = "d"
|
||||||
elseif wid == "j" then
|
elseif wid == "j" then
|
||||||
wid = "u64"
|
wid = "u64"
|
||||||
form = "%08x %016x"
|
form = "%08x %016x"
|
||||||
xmlcheat = "q"
|
widchar = "q"
|
||||||
else
|
else
|
||||||
wid = "u8"
|
wid = "u8"
|
||||||
form = "%08x %02x"
|
form = "%08x %02x"
|
||||||
xmlcheat = "b"
|
widchar = "b"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@ -611,7 +712,10 @@ function cheatfind.startplugin()
|
|||||||
_G.ce.inject(cheat)
|
_G.ce.inject(cheat)
|
||||||
end
|
end
|
||||||
elseif match.mode == 2 then
|
elseif match.mode == 2 then
|
||||||
-- lfs.env_replace is defined in boot.lua
|
cheat_save = {}
|
||||||
|
menu = 1
|
||||||
|
menu_player = 1
|
||||||
|
menu_type = 1
|
||||||
local setname = emu.romname()
|
local setname = emu.romname()
|
||||||
if emu.softname() ~= "" then
|
if emu.softname() ~= "" then
|
||||||
for name, image in pairs(manager:machine().images) do
|
for name, image in pairs(manager:machine().images) do
|
||||||
@ -620,25 +724,17 @@ function cheatfind.startplugin()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
local cheatpath = lfs.env_replace(manager:machine():options().entries.cheatpath:value()):match("([^;]+)")
|
-- lfs.env_replace is defined in boot.lua
|
||||||
local filename = string.format("%s/%s_%08X_cheat", cheatpath, setname, match.addr)
|
cheat_save.path = lfs.env_replace(manager:machine():options().entries.cheatpath:value()):match("([^;]+)")
|
||||||
|
cheat_save.filename = string.format("%s/%s", cheat_save.path, setname)
|
||||||
|
cheat_save.name = cheat.desc
|
||||||
local json = require("json")
|
local json = require("json")
|
||||||
local file = io.open(filename .. ".json", "w")
|
cheat.desc = "%s"
|
||||||
if file then
|
cheat_save.json = json.stringify({[1] = cheat}, {indent = true})
|
||||||
file:write(json.stringify({[1] = cheat}, {indent = true}))
|
cheat_save.xml = string.format("<mamecheat version=1>\n<cheat desc=\"%%s\">\n<script state=\"run\">\n<action>%s.pp%s@%X=%X</action>\n</script>\n</cheat>\n</mamecheat>", dev.tag:sub(2), widchar, match.addr, match.newval)
|
||||||
file:close()
|
cheat_save.simple = string.format("%s,%s,%X,%s,%X,%%s\n", setname, dev.tag, match.addr, widchar, match.newval)
|
||||||
if not dev.space.shortname then -- no xml or simple for ram_device cheat
|
manager:machine():popmessage("Default name is " .. cheat_save.name)
|
||||||
file = io.open(filename .. ".xml", "w")
|
r = true
|
||||||
file:write(string.format("<mamecheat version=1>\n<cheat desc=\"%s\">\n<script state=\"run\">\n<action>%s.pp%s@%X=%X</action>\n</script>\n</cheat>\n</mamecheat>", cheat.desc, dev.tag:sub(2), xmlcheat, match.addr, match.newval))
|
|
||||||
file:close()
|
|
||||||
file = io.open(cheatpath .. "/cheat.simple", "a")
|
|
||||||
file:write(string.format("%s,%s,%X,%s,%X,%s\n", setname, dev.tag, match.addr, xmlcheat, match.newval, cheat.desc))
|
|
||||||
file:close()
|
|
||||||
end
|
|
||||||
manager:machine():popmessage("Cheat written to " .. filename)
|
|
||||||
else
|
|
||||||
manager:machine():popmessage("Unable to write file\nCheck cheatpath dir exists")
|
|
||||||
end
|
|
||||||
else
|
else
|
||||||
local func = "return space:read"
|
local func = "return space:read"
|
||||||
local env = { space = devtable[devcur].space }
|
local env = { space = devtable[devcur].space }
|
||||||
@ -679,16 +775,7 @@ function cheatfind.startplugin()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
local menu_list = {}
|
return menu_prepare()
|
||||||
menu_func = {}
|
|
||||||
for num, func in ipairs(menu) do
|
|
||||||
local item, f = func()
|
|
||||||
if item then
|
|
||||||
menu_list[#menu_list + 1] = item
|
|
||||||
menu_func[#menu_list] = f
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return menu_list
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local function menu_callback(index, event)
|
local function menu_callback(index, event)
|
||||||
|
Loading…
Reference in New Issue
Block a user