Added a Super Mario Brothers 3 collision box viewer.

This commit is contained in:
pasky1382 2015-06-22 11:13:31 +00:00
parent 7c35d7b80d
commit 681faaff32
1 changed files with 252 additions and 0 deletions

View File

@ -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