BizHawk/output/Lua/SNES/Super Mario World.lua

245 lines
5.6 KiB
Lua

--Author Pasky13
--Mario
local mariox = 0x94
local marioy = 0x96
local mtype = 0x19
local marioside = 0x76
--Camera
local camx = 0x1A
local camy = 0x1C
--Object Addresses
local exbase = 0xE4
local eybase = 0xD8
local pagexbase = 0x14E0
local pageybase = 0x14D4
local otype = 0x9E
local boxpointer = 0x1662
local xoffbase = 0x01b56c
local yoffbase = 0x01b5e4
local xradbase = 0x01b5a8
local yradbase = 0x01b620
local oactive = 0x14C8
--Invulnerable objects (ghost rings etc...)
local inv_ybase = 0x1E02
local inv_xbase = 0x1E16
local inv_ypage = 0x1E2A
local inv_xpage = 0x1E3E
local itype = 0x1892
--Ghost snake
local ghosn_type = 0x17F0
local ghosn_xbase = 0x1808
local ghosn_xpage = 0x18EA
local ghosn_ybase = 0x17FC
local ghosn_ypage = 0x1814
--Ghost ship ghosts
local ghosh_type = 0x1892
local ghosh_xbase = 0x1E16
local ghosh_xpage = 0x1E3E
local ghosh_ybase = 0x1E02
local ghosh_ypage = 0x1E2A
--Projectiles
local pxbase = 0x171F
local pybase = 0x1715
local pxpage = 0x1733
local pypage = 0x1729
local projtype = 0x170B
memory.usememorydomain("CARTROM")
local function mario()
local x
local y
local yoffpoint = 0x1b65c
local yradpoint = 0x1b660
local i = 0
x = mainmemory.read_u16_le(mariox) - mainmemory.read_u16_le(camx)
y = mainmemory.read_u16_le(marioy) - mainmemory.read_u16_le(camy)
if mainmemory.read_u8(mtype) == 0 or mainmemory.read_u8(0x73) ~= 0 then
i = 1
end
if mainmemory.read_u8(0x0187a) ~= 0 then
i = i + 2
end
local xoff = 0x02
local xrad = 0x0C
local yoff = memory.read_u8(yoffpoint+i)
local yrad = memory.read_u8(yradpoint+i)
local star = 0x01490
local invuln = 0x1497
gui.drawBox(x+xoff,y+yoff,x+xoff+xrad,y+yoff+yrad,0xFF0000FF,0x300000FF)
end
local function projectiles()
local x
local y
local xoff
local yoff
local xrad
local yrad
local oend = 10
local pid
for i = 0,oend,1 do
pid = mainmemory.read_u8(projtype + i)
if pid ~= 0 and pid ~= 0x12 then
x = mainmemory.read_u8(pxbase+i) + (mainmemory.read_u8(pxpage+i) * 256) - mainmemory.read_u16_le(camx)
y = mainmemory.read_u8(pybase+i) + (mainmemory.read_u8(pypage+i) * 256) - mainmemory.read_u16_le(camy)
xoff = memory.read_s8(0x0124e7+pid)
yoff = memory.read_s8(0x0124f3+pid)
xrad = memory.read_u8(0x0124ff+pid)
yrad = memory.read_u8(0x01250b+pid)
gui.drawBox(x+xoff,y+yoff,x+xoff+xrad,y+yoff+yrad,0xFF000000,0x500000)
end
end
end
local function objects()
local oend = 20
local x = 0
local y = 0
local boxid
local xoff
local yoff
local xrad
local yrad
local fill
local outl
local objtype
for i = 0,oend,1 do
if mainmemory.read_u8(oactive + i) == 8 or mainmemory.read_u8(oactive + i) == 9 or mainmemory.read_u8(oactive +i) == 0xA then
objtype = mainmemory.read_u8(otype + i)
boxid = bit.band(mainmemory.read_u8(boxpointer+i),0x3F)
x = mainmemory.read_u8(exbase + i) + (mainmemory.read_u8(pagexbase + i) * 256) - mainmemory.read_u16_le(camx)
y = mainmemory.read_u8(eybase + i) + (mainmemory.read_u8(pageybase + i) * 256) - mainmemory.read_u16_le(camy)
xoff = memory.read_s8(xoffbase + boxid)
yoff = memory.read_s8(yoffbase + boxid)
xrad = memory.read_u8(xradbase + boxid)
yrad = memory.read_u8(yradbase + boxid)
--Yoshi
if objtype == 0x35 then
outl = 0xFF00FF37
fill = 0x3000FF37
-- Power pickups
elseif objtype >= 0x74 and objtype <= 0x81 then
outl = 0xFF00F2FF
fill = 0x3000F2FF
else
outl = 0xFFFF0000
fill = 0x30FF0000
end
if objtype == 0x29 then
xoff = -1 * 0x08
xrad = 0x10
yoff = 0x08
if mainmemory.read_u8(0x1602 + i) == 0x69 then
yoff = yoff + 0x0A
end
end
--gui.text(x,y-5,string.format("%X",exbase + i)) -- Debug
--gui.text(x,y-5,string.format("%X",objtype)) -- Debug
--gui.text(x,y-5,xoff .. "/" .. xrad .. " " .. yoff .. "/" .. yrad) -- Debug
--gui.text(x,y-5,string.format("%X",mainmemory.read_u8(oactive + i))) -- Debug
if objtype ~= 0x8C then
gui.drawBox(x+xoff,y+yoff,x+xoff+xrad,y+yoff+yrad,outl,fill)
end
end
end
end
local function invulns()
local oend = 20
local page = 0
local boxid
local x
local y
local xoff
local yoff
local xrad
local yrad
--Ghost rings/Ghost house
for i = 0,oend,1 do
if mainmemory.read_u8(itype + i) == 0x04 or mainmemory.read_u8(itype + i) == 0x03 then
x = mainmemory.read_u8(inv_xbase + i) + (mainmemory.read_u8(inv_xpage + i) * 256) - mainmemory.read_u16_le(camx)
y = mainmemory.read_u8(inv_ybase + i) + (mainmemory.read_u8(inv_ypage + i) * 256) - mainmemory.read_u16_le(camy)
xoff = 2
xrad = 12
yoff = 3
yrad = 10
gui.drawBox(x+xoff,y+yoff,x+xoff+xrad,y+yoff+yrad,0xFFFFFF00,0x30FFFF00)
end
end
--Sunken ship ghosts
for i = 0,oend,1 do
if mainmemory.read_u8(ghosh_type +i) ~= 0 then
x = mainmemory.read_u8(ghosh_xbase + i) + (mainmemory.read_u8(ghosh_xpage +i) * 256) - mainmemory.read_u16_le(camx)
y = mainmemory.read_u8(ghosh_ybase + i) + (mainmemory.read_u8(ghosh_ypage +i) * 256) - mainmemory.read_u16_le(camy)
xoff = 2
xrad = 12
yoff = 3
yrad = 10
gui.drawBox(x+xoff,y+yoff,x+xoff+xrad,y+yoff+yrad,0xFFFFFF00,0x30FFFF00)
end
end
--Ghost Snake
oend = 12
for i = 0,oend,1 do
if mainmemory.read_u8(ghosn_type+i) ~= 0 then
x = mainmemory.read_u8(ghosn_xbase + i) + (mainmemory.read_u8(ghosn_xpage +i) * 256) - mainmemory.read_u16_le(camx)
y = mainmemory.read_u8(ghosn_ybase + i) + (mainmemory.read_u8(ghosn_ypage +i) * 256) - mainmemory.read_u16_le(camy)
xoff = 2
xrad = 12
yoff = 3
yrad = 10
gui.drawBox(x+xoff,y+yoff,x+xoff+xrad,y+yoff+yrad,0xFFFFFF00,0x30FFFF00)
end
end
end
while true do
mario()
objects()
invulns()
projectiles()
emu.frameadvance()
end