diff --git a/output/Lua/Super Mario Brothers 3 (USA) (Rev A).lua b/output/Lua/Super Mario Brothers 3 (USA) (Rev A).lua new file mode 100644 index 0000000000..9ad5f8c64c --- /dev/null +++ b/output/Lua/Super Mario Brothers 3 (USA) (Rev A).lua @@ -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 \ No newline at end of file