Rockman & Forte collision box viewer
This commit is contained in:
parent
557fb150c3
commit
d2e6d50360
|
@ -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
|
Loading…
Reference in New Issue