Added a Super Mario Brothers 3 collision box viewer.
This commit is contained in:
parent
7c35d7b80d
commit
681faaff32
|
@ -0,0 +1,252 @@
|
|||
-- Super Mario Bros. 3 (USA) Rev A collision box viewer V1.0
|
||||
-- For use with Bizhawk
|
||||
-- Author: Pasky (June 22, 2015)
|
||||
-- TODO:
|
||||
-- Find coin and hidden block collisions
|
||||
|
||||
memory.usememorydomain("System Bus")
|
||||
|
||||
local camx
|
||||
local camy
|
||||
|
||||
local TOGGLE_MARIO = "ON"
|
||||
local TOGGLE_OBJECTS = "ON" --Enemies etc...
|
||||
local TOGGLE_PROJECTILES = "ON"
|
||||
local TOGGLE_OTHERATTACKS = "ON" -- Tanooki tail etc...
|
||||
local TOGGLE_UI = "ON"
|
||||
local K1,K2,K3,K4,K5,K6
|
||||
|
||||
|
||||
function axis(x,y,color,size)
|
||||
if size == nil then
|
||||
size = 2
|
||||
end
|
||||
gui.drawLine(x+size,y,x-size,y,color)
|
||||
gui.drawLine(x,y+size,x,y-size,color)
|
||||
gui.drawPixel(x,y,0xFF000000)
|
||||
end
|
||||
|
||||
|
||||
local function camera()
|
||||
camx = memory.read_u8(0xFD) + (memory.read_u8(0x12) * 0xFF)
|
||||
camy = memory.read_u8(0xFC) + (memory.read_u8(0x12) * 0xFF)
|
||||
end
|
||||
|
||||
--Player
|
||||
local function player()
|
||||
if TOGGLE_MARIO == "ON" then
|
||||
if memory.read_u8(0xD87F) == 0x20 and memory.read_u8(0xD880) == 0x7B and memory.read_u8(0xD881) == 0xD9 then -- Bank check (BANK #0)
|
||||
local x = memory.read_u8(0xAB)
|
||||
local y = memory.read_u8(0xB4)
|
||||
local x1 = memory.read_u8(0x02)
|
||||
local y1 = memory.read_u8(0x06)
|
||||
local x2 = x1 + memory.read_u8(0x03)
|
||||
local y2 = y1 + memory.read_u8(0x07)
|
||||
gui.drawBox(x1,y1,x2,y2,0xFF0000FF,0x400000FF)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--Enemies hit boxes
|
||||
local function objects()
|
||||
if TOGGLE_OBJECTS == "ON" then
|
||||
if memory.read_u8(0xD855) == 0xA5 and memory.read_u8(0xD856) == 0xED and memory.read_u8(0xD857) == 0xF0 and memory.read_u8(0xD858) == 0x09 then -- Bank check (BANK #0)
|
||||
local xreg = emu.getregister("X")
|
||||
local yreg = emu.getregister("Y")
|
||||
local x = memory.read_u8(0xAC + xreg)
|
||||
local y = memory.read_u8(0xB5 + xreg)
|
||||
local x1 = memory.read_u8(0x00)
|
||||
local y1 = memory.read_u8(0x04)
|
||||
local x2 = x1 + memory.read_u8(0x01)
|
||||
local y2 = y1 + memory.read_u8(0x05)
|
||||
gui.drawBox(x1,y1,x2,y2,0xFFFF0000,0x40FF0000)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--Projectiles
|
||||
local function eprojectiles()
|
||||
if TOGGLE_PROJECTILES == "ON" then
|
||||
if memory.read_u8(0xB7E4) == 0xBD and memory.read_u8(0xB7E5) == 0xBF and memory.read_u8(0xB7E6) == 0x05 then -- Bank check (BANK #3)
|
||||
local xreg = emu.getregister("X")
|
||||
local yreg = emu.getregister("Y")
|
||||
local x = bit.band(memory.read_u8(0x05C9 + xreg) - camx,0xFF) + 6
|
||||
local y = bit.band(memory.read_u8(0x05BF + xreg) - camy,0xFF) + 8
|
||||
axis(x,y,0xFFFFFFFF,4)
|
||||
|
||||
local mx = memory.read_u8(0xAB)
|
||||
local my = memory.read_u8(0xB4)
|
||||
x1 = mx
|
||||
y1 = my + memory.read_u8(0xB6DE + yreg)
|
||||
x2 = x1 + 0x10
|
||||
y2 = y1 + memory.read_u8(0xB6E0 + yreg)
|
||||
gui.drawBox(x1,y1,x2,y2,0xFFFFFF00,0x40FFFF00)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--Player Projectiles
|
||||
local function projectiles()
|
||||
if TOGGLE_PROJECTILES == "ON" then
|
||||
if memory.read_u8(0xA69A) == 0xDD and memory.read_u8(0xA69B) == 0x6D and memory.read_u8(0xA69C) == 0xA6 then -- Bank check (BANK #3)
|
||||
local xreg = emu.getregister("X")
|
||||
local yreg = emu.getregister("Y")
|
||||
local x = memory.read_u8(0xAC + yreg)
|
||||
local y = memory.read_u8(0xB5 + yreg)
|
||||
axis(memory.read_u8(0x0D),memory.read_u8(0x0C),0xFFFFFFFF,4)
|
||||
local x1 = x
|
||||
local y1 = y
|
||||
local x2 = x1 + memory.read_u8(0xA67D + xreg)
|
||||
local y2 = y1 + memory.read_u8(0xA66D + xreg)
|
||||
gui.drawBox(x1,y1,x2,y2,0xFFFFFF00,0x40FFFF00)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--Player Other Attacks
|
||||
local function other()
|
||||
if TOGGLE_OTHERATTACKS == "ON" then
|
||||
if memory.read_u8(0xDB4E) == 0x20 and memory.read_u8(0xDB4F) == 0x54 and memory.read_u8(0xDB50) == 0xDD then -- Bank check (BANK #0)
|
||||
--Tail
|
||||
local x = memory.read_u8(0xAB)
|
||||
local y = memory.read_u8(0xB4)
|
||||
local x1 = memory.read_u8(0x02)
|
||||
local y1 = memory.read_u8(0x06)
|
||||
local x2 = x1 + memory.read_u8(0x03)
|
||||
local y2 = y1 + memory.read_u8(0x07)
|
||||
gui.drawBox(x1,y1,x2,y2)
|
||||
|
||||
--Enemy vuln (tail)
|
||||
local xreg = emu.getregister("X")
|
||||
local yreg = bit.band(memory.read_u8(0xC2F4 + memory.read_u8(0x0671 + xreg)),0xF) * 4
|
||||
x = memory.read_u8(0xAC + xreg)
|
||||
y = memory.read_u8(0xB5 + xreg)
|
||||
x1 = x + memory.read_u8(0xC2B4 + yreg)
|
||||
y1 = y + memory.read_u8(0xC2B6 + yreg)
|
||||
x2 = x1 + memory.read_u8(0xC2B5 + yreg)
|
||||
y2 = y1 + memory.read_u8(0xC2B7 + yreg)
|
||||
gui.drawBox(x1,y1,x2,y2,0xFFFFFF00,0x40FFFF00)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function toggle(option)
|
||||
if option == "ON" then
|
||||
option = "OFF"
|
||||
else
|
||||
option = "ON"
|
||||
end
|
||||
return option
|
||||
end
|
||||
|
||||
local function PowerCycle()
|
||||
local powerup = memory.read_u8(0xED)
|
||||
if powerup == 0x06 then
|
||||
powerup = 0
|
||||
else
|
||||
powerup = powerup + 1
|
||||
end
|
||||
if powerup == 0x02 then
|
||||
memory.write_u8(0x7D2,0x27)
|
||||
memory.write_u8(0x7D4,0x16)
|
||||
else
|
||||
memory.write_u8(0x7D2,0x16)
|
||||
memory.write_u8(0x7D4,0x0F)
|
||||
end
|
||||
memory.write_u8(0xED,powerup)
|
||||
end
|
||||
|
||||
local function check_inputs()
|
||||
local inputs = input.get()
|
||||
-- Mario boxes
|
||||
if inputs["NumberPad1"] == true then
|
||||
K1 = true
|
||||
gui.drawText(10,10,"DOIG")
|
||||
end
|
||||
if inputs["NumberPad1"] == nil and K1 == true then -- Key released
|
||||
TOGGLE_MARIO = toggle(TOGGLE_MARIO)
|
||||
K1 = false
|
||||
end
|
||||
-- Enemy boxes
|
||||
if inputs["NumberPad2"] == true then
|
||||
K2 = true
|
||||
end
|
||||
if inputs["NumberPad2"] == nil and K2 == true then
|
||||
TOGGLE_OBJECTS = toggle(TOGGLE_OBJECTS)
|
||||
K2 = false
|
||||
end
|
||||
-- Projectile boxes
|
||||
if inputs["NumberPad3"] == true then
|
||||
K3 = true
|
||||
end
|
||||
if inputs["NumberPad3"] == nil and K3 == true then
|
||||
TOGGLE_PROJECTILES = toggle(TOGGLE_PROJECTILES)
|
||||
K3 = false
|
||||
end
|
||||
-- Other attacks
|
||||
if inputs["NumberPad4"] == true then
|
||||
K4 = true
|
||||
end
|
||||
if inputs["NumberPad4"] == nil and K4 == true then
|
||||
TOGGLE_OTHERATTACKS = toggle(TOGGLE_OTHERATTACKS)
|
||||
K4 = false
|
||||
end
|
||||
|
||||
-- UI
|
||||
if inputs["Home"] == true then
|
||||
K5 = true
|
||||
end
|
||||
if inputs["Home"] == nil and K5 == true then
|
||||
TOGGLE_UI = toggle(TOGGLE_UI)
|
||||
K5 = false
|
||||
end
|
||||
|
||||
--Powerup cycling
|
||||
if inputs["Insert"] == true then
|
||||
K6 = true
|
||||
end
|
||||
if inputs["Insert"] == nil and K6 == true then
|
||||
PowerCycle()
|
||||
K6 = false
|
||||
end
|
||||
end
|
||||
|
||||
local function draw_UI()
|
||||
check_inputs()
|
||||
if TOGGLE_UI == "ON" then
|
||||
gui.drawBox(154,30,255,92,0xFF000000,0xA0000000)
|
||||
gui.drawText(156,28,"MARIO",0xFFFFFFFF,10,"Segoe UI")
|
||||
gui.drawText(190,28,"(NUM1)",0xFFFF0000,10,"Segoe UI")
|
||||
gui.drawText(226,28,"["..TOGGLE_MARIO.."]",0xFFFFFF00,10,"Segoe UI")
|
||||
gui.drawText(156,38,"ENEMY",0xFFFFFFFF,10,"Segoe UI")
|
||||
gui.drawText(226,38,"["..TOGGLE_OBJECTS.."]",0xFFFFFF00,10,"Segoe UI")
|
||||
gui.drawText(190,38,"(NUM2)",0xFFFF0000,10,"Segoe UI")
|
||||
gui.drawText(156,48,"PROJ.",0xFFFFFFFF,10,"Segoe UI")
|
||||
gui.drawText(226,48,"["..TOGGLE_PROJECTILES.."]",0xFFFFFF00,10,"Segoe UI")
|
||||
gui.drawText(190,48,"(NUM3)",0xFFFF0000,10,"Segoe UI")
|
||||
gui.drawText(156,58,"OTHER",0xFFFFFFFF,10,"Segoe UI")
|
||||
gui.drawText(226,58,"["..TOGGLE_OTHERATTACKS.."]",0xFFFFFF00,10,"Segoe UI")
|
||||
gui.drawText(190,58,"(NUM4)",0xFFFF0000,10,"Segoe UI")
|
||||
gui.drawText(156,68,"POWERUP",0xFFFFFFFF,10,"Segoe UI")
|
||||
gui.drawText(214,68,"(INSERT)",0xFFFF0000,10,"Segoe UI")
|
||||
gui.drawText(156,78,"TOGGLE UI",0xFFFFFFFF,10,"Segoe UI")
|
||||
gui.drawText(214,78,"(HOME)",0xFFFF0000,10,"Segoe UI")
|
||||
end
|
||||
end
|
||||
|
||||
event.onmemoryexecute(player,0xD87F)
|
||||
event.onmemoryexecute(objects,0xD855)
|
||||
event.onmemoryexecute(projectiles,0xA69A)
|
||||
event.onmemoryexecute(eprojectiles,0xB7E4)
|
||||
event.onmemoryexecute(other,0xDB4E)
|
||||
|
||||
local function cheat()
|
||||
memory.write_u8(0x5F1,0x25) -- Timer
|
||||
end
|
||||
|
||||
while true do
|
||||
cheat()
|
||||
draw_UI()
|
||||
camera()
|
||||
emu.frameadvance()
|
||||
end
|
Loading…
Reference in New Issue