BizHawk/Assets/Lua/SNES/Megaman X.lua

160 lines
3.9 KiB
Lua

--Author Pasky13
---------------
----GLOBALS----
---------------
local pbase = 0xBA8
local px = 0xBAD
local py = 0xBB0
local cx = 0x00B4
local cy = 0x00B6
---------------
----TOGGLES----
---------------
local draw_megaman = true
local draw_enemies = true
local draw_hpvalues = true
local draw_projectiles = true
--local draw_instantbox = false -- Bizhawk doesnt support breakpoints
local xm
local ym
-- Breakpoints not yet implemented in bizhawk
-- local function draw_instabox(base)
-- local camx = mainmemory.read_u16_le(cx)
-- local camy = mainmemory.read_u16_le(cy)
-- local facing = mainmemory.read_u8(base + 0x11)
-- local x = mainmemory.read_u16_le(base + 5) - camx
-- local y = mainmemory.read_u16_le(base + 8) - camy
-- local boxpointer = mainmemory.read_u16_le(base +0x20) + 0x860000
-- local xoff = mainmemory.read_s8(boxpointer + 0)
-- local yoff = mainmemory.read_s8(boxpointer + 1)
-- local xrad = mainmemory.read_u8(boxpointer + 2)
-- local yrad = mainmemory.read_u8(boxpointer + 3)
-- if facing > 0x45 then
-- xoff = xoff * -1
-- end
-- gui.drawBox(x + xoff +xrad,y + yoff + yrad, x + xoff - xrad, y + yoff - yrad,0xFFFF0000,0x05FF0000)
-- end
memory.usememorydomain("CARTROM")
local function megaman()
local camx = mainmemory.read_u16_le(cx)
local camy = mainmemory.read_u16_le(cy)
local x = mainmemory.read_u16_le(px) - camx
local y = mainmemory.read_u16_le(py) - camy
local facing = mainmemory.read_u8(pbase + 0x11)
local boxpointer = mainmemory.read_u16_le(pbase + 0x20) + 0x28000
local xoff = memory.read_s8(boxpointer + 0)
local yoff = memory.read_s8(boxpointer + 1)
local xrad = memory.read_u8(boxpointer + 2)
local yrad = memory.read_u8(boxpointer + 3)
if facing > 0x45 then
xoff = xoff * -1
end
gui.drawBox(x + xoff +xrad,y + yoff + yrad, x + xoff - xrad, y + yoff - yrad,0xFF0000FF,0x400000FF)
end
local function enemies()
local x
local xoff
local xrad
local y
local yoff
local yrad
local camx = mainmemory.read_u16_le(cx)
local camy = mainmemory.read_u16_le(cy)
local base
local boxpointer
local facing
local fill
local outl
local start = 0xE68
local oend = 32
for i = 0, oend,1 do
base = start + (i * 0x40)
if i == 0 then
base = start
end
if mainmemory.read_u8(base) ~= 0 then
if i > 14 and i < 21 then
if draw_projectiles == true then
fill = 0x40FFFFFF
outl = 0xFFFFFFFF
else
fill = 0x00000000
outl = 0x00000000
end
else
fill = 0x40FF0000
outl = 0xFFFF0000
end
if i > 21 then
fill = 0x40FFFF00
outl = 0xFFFFFF00
end
facing = mainmemory.read_u8(base + 0x11)
x = mainmemory.read_u16_le(base + 5) - camx
y = mainmemory.read_u16_le(base + 8) - camy
boxpointer = mainmemory.read_u16_le(base +0x20) + 0x28000
xoff = memory.read_s8(boxpointer + 0)
yoff = memory.read_s8(boxpointer + 1)
xrad = memory.read_u8(boxpointer + 2)
yrad = memory.read_u8(boxpointer + 3)
if facing > 0x45 then
xoff = xoff * -1
end
--Breakpoints not yet implemented in Bizhawk
-- if draw_instantbox == true then
-- memory.registerwrite(0x7E0000 + base + 0x20,2,function ()
-- draw_instabox(memory.getregister("D"))
-- end)
-- end
--gui.text(x,y,string.format("%X",base)) -- Debug
gui.drawBox(x + xoff +xrad,y + yoff + yrad, x + xoff - xrad, y + yoff - yrad,outl, fill)
if draw_hpvalues == true and mainmemory.read_u8(base+0x27) > 0 then
if i < 15 or i > 20 then
gui.text((x-5) * xm,(y-5) * ym,"HP: " .. mainmemory.read_u8(base+0x27))
end
end
end
end
end
local function scaler()
xm = client.screenwidth() / 256
ym = client.screenheight() / 224
end
while true do
scaler()
if draw_megaman == true then
megaman()
end
if draw_enemies == true then
enemies()
end
emu.frameadvance()
end