From d2e6d503609c4cda38bffa97f5cb42c727f5190b Mon Sep 17 00:00:00 2001 From: pasky1382 Date: Sat, 13 Oct 2012 19:33:42 +0000 Subject: [PATCH] Rockman & Forte collision box viewer --- .../output/Lua/SNES/Rockman & Forte.lua | 183 ++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 BizHawk.MultiClient/output/Lua/SNES/Rockman & Forte.lua diff --git a/BizHawk.MultiClient/output/Lua/SNES/Rockman & Forte.lua b/BizHawk.MultiClient/output/Lua/SNES/Rockman & Forte.lua new file mode 100644 index 0000000000..4989f9a609 --- /dev/null +++ b/BizHawk.MultiClient/output/Lua/SNES/Rockman & Forte.lua @@ -0,0 +1,183 @@ +-- Author Pasky13 + +local pbase = 0xC00 +local ppbase = 0xCC0 + +local ebase = 0x19C0 +local epbase = 0xEC0 + +local xm +local ym + +memory.usememorydomain("CARTROM") + +function findbit(p) + return 2 ^ (p - 1) +end + +function hasbit(x, p) + return x % (p + p) >= p +end + +local function hex(val) + val = string.format("%X",val) + return val +end + +local function camera() + cx = mainmemory.read_u16_le(0xD9) + cy = mainmemory.read_u16_le(0xDB) +end + + +local function drawbox(p,x,y,base,player,fill,outl) + local box = {0,0,0,0} --xoff/yoff/xrad/yrad + + box[1] = memory.read_s8(p) + box[2] = memory.read_s8(p + 1) + box[3] = memory.read_u8(p + 2) + box[4] = memory.read_u8(p + 3) + + if player == false then + if hasbit(mainmemory.read_u8(base+0x14),findbit(7)) then -- megaman facing right + box[1] = box[1] * - 1 + end + else + if hasbit(mainmemory.read_u8(base+0x4A),findbit(3)) then -- enemy facing left + box[1] = box[1] * - 1 + end + end + + gui.drawBox(x+box[1]+box[3],y+box[2]+box[4],x+box[1]-box[3],y+box[2]-box[4],outl, fill) + return box +end + +local function proj_vuln(base,x,y,xoff,yoff,xrad,yrad) + local offset = memory.read_u8(0x87D0 +(mainmemory.read_u8(base + 0x31) * 2)) + local property = memory.read_s8(0x87D0 + offset) + if property <= 0 then + gui.drawLine(x + xoff + xrad,y + yoff,x + xoff - xrad, y + yoff,0xFFFFFFFF) + gui.drawLine(x + xoff,y + yoff + yrad, x + xoff,y + yoff - yrad,0xFFFFFFFF) + end + --gui.text(x-40,y-20,hex(offset) .. " " .. hex(base)) +end + +local function player() + local x = mainmemory.read_u16_le(pbase + 5) - cx + local y = mainmemory.read_u16_le(pbase + 8) - cy + local pointer = mainmemory.read_u16_le(pbase + 0x24) + local hp = mainmemory.read_s8(pbase + 0x2F) + drawbox(pointer,x,y,pbase,true,0x400000FF,0xFF0000FF) + gui.text((x-4) * xm,y * ym,"HP:" .. hp) +end + + + +local function player_projectiles() + local x + local y + local base + local pointer + local active + local anim + + for i = 0,7,1 do + base = ppbase + (i * 0x40) + active = mainmemory.read_u8(base) + anim = mainmemory.read_u8(base + 1) + if active ~= 0 and anim > 1 then + x = mainmemory.read_u16_le(base + 5) - cx + y = mainmemory.read_u16_le(base + 8) - cy + pointer = mainmemory.read_u16_le(base + 0x24) + drawbox(pointer,x,y,base,false,0x40FFFFFF,0xFFFFFFFF) + end + end + +end + +local function enemy_projectiles() + local x + local y + local base + local pointer + local active + local anim + for i = 0,7,1 do + base = epbase + (i * 0x40) + active = mainmemory.read_u8(base) + anim = mainmemory.read_u8(base + 1) + if active ~= 0 and anim > 1 then + x = mainmemory.read_u16_le(base + 5) - cx + y = mainmemory.read_u16_le(base + 8) - cy + pointer = mainmemory.read_u16_le(base + 0x24) + drawbox(pointer,x,y,base,false,0x4000FF00,0xFF00FF00) + end + end + +end + +local function objects() + local x + local y + local hp + local base + local pointer + local active + local anim + local box + for i = 0,15,1 do + base = ebase + (i * 0x40) + active = mainmemory.read_u8(base) + anim = mainmemory.read_u8(base + 1) + if active ~= 0 and anim > 1 then + x = mainmemory.read_u16_le(base + 5) - cx + y = mainmemory.read_u16_le(base + 8) - cy + pointer = mainmemory.read_u16_le(base + 0x24) + hp = mainmemory.read_s8(base + 0x2F) + if hp > 0 then + gui.text((x-8) * xm,(y-8) * ym,"HP: " .. hp) + end + box = drawbox(pointer,x,y,base,false,0x40FF0000,0xFFFF0000) + proj_vuln(base,x,y,box[1],box[2],box[3],box[4]) + end + end +end + +-- local function unknown() -- Hitstun animations? + -- local x + -- local y + -- local base = 0x15C0 + + -- for i = 0,8,1 do + -- base = 0x15C0 + (i * 0x20) + -- if mainmemory.read_u16_le(base) ~= 0 then + -- x = mainmemory.read_u16_le(base + 5) - cx + -- y = mainmemory.read_u16_le(base + 8) - cy + -- gui.text(x,y,"UK:" .. i) + -- end + -- end + + -- for i = 0,15,1 do + -- base = 0x16C0 + (i * 0x30) + -- if mainmemory.read_u16_le(base) ~= 0 then + -- x = mainmemory.read_u16_le(base + 5) - cx + -- y = mainmemory.read_u16_le(base + 8) - cy + -- gui.text(x,y,"UK2:" .. i) + -- end + -- end +-- end + +local function scaler() + xm = client.screenwidth() / 256 + ym = client.screenheight() / 224 +end + +while true do + scaler() + camera() + enemy_projectiles() + player_projectiles() + objects() + player() + emu.frameadvance() +end \ No newline at end of file