BizHawk/Assets/Lua/SNES/Rockman and Forte.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