BizHawk/Assets/Lua/NES/Castlevania.lua

108 lines
2.6 KiB
Lua

--Author Pasky13
local px = 0x38C
local py = 0x354
local pl = 0x45
local ex = 0x38C
local ey = 0x354
memory.usememorydomain("PRG ROM")
local function whip()
local box = {0,0,0} -- xoff/yoff/xrad/yrad
local wtype = mainmemory.read_u8(0x70)
local pos = bit.band(mainmemory.read_u8(0x434),0x7F) -- Simons acting positon (jumping/crouching, etc...)
box[1] = memory.read_s8(0x1E45D + wtype)
wtype = wtype * 2
box[2] = memory.read_s8(0x1E460 + pos)
box[3] = memory.read_u8(0x1E464 + wtype)
box[4] = memory.read_u8(0x1E465 + wtype)
if mainmemory.read_u8(0x450) == 1 then -- Simon is facing left
box[1] = box[1] * -1
box[3] = box[3] * -1
end
return box
end
local function player()
local x = mainmemory.read_u8(px)
local y = mainmemory.read_u8(py)
local box
gui.drawBox(x+4,y+mainmemory.read_u8(0x5F),x-4,y-mainmemory.read_u8(0x5F),0xFF0000FF,0x400000FF)
if mainmemory.read_u8(0x568) == 0x11 then -- Whip is active
box = whip()
gui.drawBox(x+box[1]+box[3],y+box[2]+box[4],x+box[1]-box[3],y+box[2]-box[4],0xFFFFFFFF,0x40FFFFFF)
end
end
local function buildbox(i)
local box = {0,0} -- xrad/yrad
local offset = mainmemory.read_u8(0x434 + i)
local dracform
if offset == 0x1D then
dracform = mainmemory.read_u8(0x7A)
if dracform == 1 then
offset = 0x30 * 2
else
offset = offset * 2
end
else
offset = offset * 2
end
box = { memory.read_u8(0x1E46A + offset),memory.read_u8(0x1E46B + offset) }
return box
end
local function getcolor(x)
local color = {0,0} -- Fill/Outline
if x >= 0x28 and x < 0x30 then
color = {0x40FFA500,0xFFFFA500}
elseif x >= 0x30 and x <= 0x35 then
return color
elseif x == 0x17 then -- Simon subweapon
color = {0x4000FFFF,0xFF00FFFF}
elseif x == 0x1D then -- dracula invuln box
color = {0x40FF0000,0xFFFFFFFF}
else
color = {0x40FF0000,0xFFFF0000}
end
return color
end
local function objects()
local x
local y
local active
local box
local etype
local c
local oob
for i = 3,20,1 do
oob = mainmemory.read_u8(0x300 + i)
if oob == 0 or oob == 0x80 then
box = buildbox(i)
etype = mainmemory.read_u8(0x434 + i)
c = getcolor(etype)
x = mainmemory.read_u8(ex + i)
y = mainmemory.read_u8(ey + i)
gui.drawBox(x+box[1],y+box[2],x-box[1],y-box[2],c[2],c[1])
if etype == 0x1D then -- if dracula's invuln box
gui.drawLine(x+box[1],y,x-box[1],y,0xFFFFFFFF)
gui.drawLine(x,y+box[2],x,y-box[2],0xFFFFFFFF)
end
end
end
end
while true do
player()
objects()
emu.frameadvance()
end