Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/Assets/Lua/SNES/Super Castlevania IV.lua
2 views
1
-- Super Castlevania IV (USA/JP) Collision box viewer
2
-- For use with Bizhawk
3
-- Author Pasky
4
5
6
local player = false
7
8
function findbit(p)
9
return 2 ^ (p - 1)
10
end
11
12
local function ax(x,y)
13
gui.drawLine(x,y+4,x,y-4,0xFFFF0000)
14
gui.drawLine(x+4,y,x-4,y,0xFFFF0000)
15
gui.drawPixel(x,y,0xFFFFFFFF)
16
end
17
18
function hasbit(x, p)
19
return x % (p + p) >= p
20
end
21
22
local function hex(val)
23
val = string.format("%X",val)
24
if string.len(val) == 1 then
25
val = "0" .. val
26
end
27
return val
28
end
29
30
local function camera()
31
camx = mainmemory.read_u16_le(0x1280)
32
camy = mainmemory.read_u16_le(0x1298)
33
end
34
35
local function objects()
36
local xreg = emu.getregister("X")
37
local areg = emu.getregister("A")
38
local c = {0xFFFF0000,0x40FF0000}
39
local o = { mainmemory.read_u16_le(0x8) - camx,mainmemory.read_u16_le(0x10), mainmemory.read_u16_le(0xA) - camy, mainmemory.read_u16_le(0x12) }
40
if mainmemory.read_u16_le(xreg + 0x10) == 0xE then
41
c[1] = 0xFF0000FF
42
c[2] = 0x400000FF
43
gui.drawBox(o[1]-o[2],o[3]-o[4],o[1]+o[2],o[3]+o[4],c[1],c[2]) -- Draw non-player objects
44
else
45
if hasbit(areg,findbit(1)) then
46
gui.drawBox(o[1]-o[2],o[3]-o[4],o[1]+o[2],o[3]+o[4],c[1],c[2]) -- Draw objects that simon can collide with
47
if o[2] == 0 and o[4] == 0 then -- enemy projectile, mark the center with an axis since there is no box
48
ax(o[1],o[3])
49
end
50
end
51
end
52
53
54
55
56
if player == false then
57
c[1] = 0xFF0000FF
58
c[2] = 0x400000FF
59
o = { mainmemory.read_u16_le(0x54A) - camx, 0x08, mainmemory.read_u16_le(0x54E), 0x13 }
60
gui.drawBox(o[1]-o[2],o[3]-o[4],o[1]+o[2],o[3]+o[4],c[1],c[2]) -- Draw player hurtbox
61
player = true -- Used so it isn't drawn every collision check
62
end
63
end
64
65
local function weapons()
66
local x,y,xr,yr,base
67
for i = 0,7,1 do
68
base = 0x200 + (i * 0x40)
69
if mainmemory.read_u16_le(base) ~= 0 then
70
x = mainmemory.read_u16_le(base + 0xA) - camx
71
y = mainmemory.read_u16_le(base + 0xE) - camy
72
xr = mainmemory.read_u16_le(base + 0x28)
73
yr = mainmemory.read_u16_le(base + 0x2A)
74
if xr == 0 and yr == 0 then -- check if it's the whip
75
if base == 0x400 then
76
gui.drawBox(x-0x10,y-0x04,x+0x10,y+0x04,0xFFFFFFFF,0x40FFFFFF)
77
else
78
gui.drawBox(x-0x04,y-0x04,x+0x04,y+0x04,0xFFFFFFFF,0x40FFFFFF)
79
end
80
else
81
gui.drawBox(x-xr,y-yr,x+xr,y-yr)
82
end
83
end
84
end
85
end
86
87
local function pproj()
88
local yreg = emu.getregister("Y")
89
local o = { mainmemory.read_u16_le(yreg + 0xA) - camx, mainmemory.read_u16_le(yreg + 0x28), mainmemory.read_u16_le(yreg + 0xE) - camy, mainmemory.read_u16_le(yreg + 0x2A) }
90
gui.drawBox(o[1]-o[2],o[3]-o[4],o[1]+o[2],o[3]+o[4],0xFFFFFFFF,0x40FFFFFF)
91
end
92
93
local function reset()
94
player = false
95
end
96
97
event.onmemoryexecute(objects,0x00DC7A)
98
event.onmemoryexecute(pproj,0xDD74)
99
100
while true do
101
camera()
102
weapons()
103
emu.frameadvance()
104
reset()
105
end
106