183 lines
4.3 KiB
Lua
183 lines
4.3 KiB
Lua
-- 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 |