Tracks tiles, object hitboxes & other data
timer1=0
timer2=0
nextstring=0
for i=4,7,1 do
_G["E"..i]=0
_G["NextE"..i]=0
end
function getRom(page,addr)
return page*0x4000+addr-0x7FF0
end
while true do
scrollX = memory.readbyte(0xFC)+256*memory.readbyte(0xF9)
scrollY = memory.readbyte(0xFA)+240*memory.readbyte(0xFB)
room_width = memory.readbyte(0x28)+1
room_height = memory.readbyte(0x29)+1
--pyth1=memory.readbyte(0x314) -- MAX SUBPIX
pyth1=256*(memory.readbyte(0x0328)+256*memory.readbyte(0x033C))+memory.readbyte(0x314) -- PRIORITIZE RIGHT
--pyth1=room_width*256*256-(256*(memory.readbyte(0x0328)+256*memory.readbyte(0x033C))+memory.readbyte(0x314)) -- PRIORITIZE LEFT
--pyth1=0 -- IGNORE HORIZ
--pyth2=memory.readbyte(0x350) -- MAX SUBPIX
--pyth2=256*(memory.readbyte(0x0364)+256*memory.readbyte(0x0378))+memory.readbyte(0x350) -- PRIORITIZE BOTTOM
pyth2=room_height*256*256-(256*(memory.readbyte(0x0364)+256*memory.readbyte(0x0378))+memory.readbyte(0x350)) -- PRIORITIZE TOP
--pyth2=0 -- IGNORE VERT
gui.text(0,9,math.sqrt(pyth1*pyth1+pyth2*pyth2)) --
room_map = memory.readbyte(0x5E)+256*memory.readbyte(0x5F)
screen_data = memory.readbyte(0x50)+256*memory.readbyte(0x51)
structure_data = memory.readbyte(0x52)+256*memory.readbyte(0x53)
meta_attr = memory.readbyte(0x5C)+256*memory.readbyte(0x5D)
screenScrollNumX = memory.readbyte(0xF9)
screenScrollNumY = memory.readbyte(0xFB)
for i=0,(room_width)*(room_height)-1,1 do
screen_num = memory.readbyte(room_map+i)
cur_screen_data = getRom(1,screen_data+0x40*screen_num)
screenXpos = 256*(i%(room_width))
screenYpos = 240*(math.floor(i/room_width))
if math.abs(screenScrollNumX-screenXpos/256)<2 and math.abs(screenScrollNumY-screenYpos/240)<2 then
for j=0,63,1 do
curStructure = rom.readbyte(cur_screen_data+j)
structureXpos = 32*(j%8)
structureYpos = 32*(math.floor(j/8))
-- gui.box(screenXpos+structureXpos-scrollX,screenYpos+structureYpos-scrollY,screenXpos+structureXpos-scrollX+32,screenYpos+structureYpos-scrollY+32)
for k=0,3,1 do
curMeta = rom.readbyte(getRom(0,structure_data+4*curStructure+k))
metaXpos = 16*(k%2)
metaYpos = 16*(math.floor(k/2))
if rom.readbyte(getRom(0,meta_attr+curMeta))>=0xE0 then
gui.box(screenXpos+structureXpos+metaXpos-scrollX,screenYpos+structureYpos+metaYpos-scrollY,screenXpos+structureXpos+metaXpos+16-scrollX,screenYpos+structureYpos+metaYpos+16-scrollY,"clear","red")
elseif rom.readbyte(getRom(0,meta_attr+curMeta))>=0xD0 then
gui.box(screenXpos+structureXpos+metaXpos-scrollX,screenYpos+structureYpos+metaYpos-scrollY,screenXpos+structureXpos+metaXpos+16-scrollX,screenYpos+structureYpos+metaYpos+16-scrollY,"clear","white")
elseif rom.readbyte(getRom(0,meta_attr+curMeta))>=0xC0 then
gui.box(screenXpos+structureXpos+metaXpos-scrollX,screenYpos+structureYpos+metaYpos-scrollY,screenXpos+structureXpos+metaXpos+16-scrollX,screenYpos+structureYpos+metaYpos+16-scrollY,"clear","green")
elseif bit.band(rom.readbyte(getRom(0,meta_attr+curMeta)),0x10)==0x10 then -- / slope
if memory.readbyte(0x40)>02 then
gui.line(screenXpos+structureXpos+metaXpos-scrollX,screenYpos+structureYpos+metaYpos-scrollY+16,screenXpos+structureXpos+metaXpos+16-scrollX,screenYpos+structureYpos+metaYpos-scrollY)
else
gui.text(screenXpos+structureXpos+metaXpos-scrollX,screenYpos+structureYpos+metaYpos-scrollY, "Out")
end
elseif bit.band(rom.readbyte(getRom(0,meta_attr+curMeta)),0x20)==0x20 then -- \ slope
if memory.readbyte(0x40)>02 then
gui.line(screenXpos+structureXpos+metaXpos-scrollX,screenYpos+structureYpos+metaYpos-scrollY,screenXpos+structureXpos+metaXpos+16-scrollX,screenYpos+structureYpos+metaYpos-scrollY+16)
else
gui.text(screenXpos+structureXpos+metaXpos-scrollX+4,screenYpos+structureYpos+metaYpos-scrollY+4, "In")
end
-- else
-- gui.text(screenXpos+structureXpos+metaXpos-scrollX,screenYpos+structureYpos+metaYpos-scrollY,string.format("%x",rom.readbyte(--getRom(0,meta_attr+curMeta))))
end
-- gui.text(screenXpos+structureXpos+metaXpos-scrollX,screenYpos+structureYpos+metaYpos-scrollY,string.format("%x",curMeta))
end
end
end
end
for i=0x00,0x13,1 do
if memory.readbyte(0x0300+i)~=0 then
objXpos = memory.readbyte(0x0328+i)+256*memory.readbyte(0x033C+i)
objYpos = memory.readbyte(0x0364+i)+240*memory.readbyte(0x0378+i)
relXpos = objXpos-scrollX
relYpos = objYpos-scrollY
objHitboxType = bit.band(memory.readbyte(0x03DC+i),0x3F)
if i==0 then
gui.box(relXpos-1,relYpos-1,relXpos+1,relYpos+1,"white")
gui.pixel(relXpos,relYpos,"red")
elseif i<4 then
hitboxWidth = memory.readbyte(0xF463 + objHitboxType)
hitboxHeight = memory.readbyte(0xF44E + objHitboxType)
gui.box(relXpos-hitboxWidth, relYpos-hitboxHeight, relXpos+hitboxWidth, relYpos+hitboxHeight,"clear","orange")
elseif memory.readbyte(0x03DC+i)>=0x80 then
HP = memory.readbyte(0x418+i)
hitboxWidth = memory.readbyte(0xF463 + objHitboxType)
hitboxHeight = memory.readbyte(0xF44E + objHitboxType)
gui.box(relXpos-hitboxWidth, relYpos-hitboxHeight, relXpos+hitboxWidth, relYpos+hitboxHeight,"clear","white")
if bit.band(memory.readbyte(0x03DC+i),0x40)~=0 then
HP = memory.readbyte(0x418+i)
gui.text(relXpos-12, relYpos+8,"HP: " .. HP)
gui.box(relXpos-1,relYpos-1,relXpos+1,relYpos+1,"white")
gui.pixel(relXpos,relYpos,"red")
if memory.readbyte(0x300+i)==0x10 then
if memory.readbyte(0x440+i)==0 then
hitboxWidth = 0x60
hitboxHeight= 0x20
gui.box(relXpos-hitboxWidth, relYpos-hitboxHeight, relXpos+hitboxWidth, relYpos+hitboxHeight,"clear","yellow")
end
end
end
elseif
memory.readbyte(0x0300+i)==0x07 or
memory.readbyte(0x0300+i)==0x55 or memory.readbyte(0x0300+i)==0x56 or memory.readbyte(0x0300+i)==0x58 or
memory.readbyte(0x0300+i)==0x5A or
memory.readbyte(0x0300+i)==0x6D then
hitboxWidth = memory.readbyte(0xF463 + objHitboxType)
hitboxHeight = memory.readbyte(0xF44E + objHitboxType)
gui.box(relXpos-hitboxWidth, relYpos-hitboxHeight, relXpos+hitboxWidth, relYpos+hitboxHeight,"clear","green")
elseif memory.readbyte(0x300+i)==0x14 then
hitboxWidth = memory.readbyte(0x42C+i)
hitboxHeight = 256*256
gui.box(relXpos-hitboxWidth, relYpos-hitboxHeight, relXpos+hitboxWidth, relYpos+hitboxHeight,"clear","yellow")
gui.text(relXpos-10,relYpos,"Range: " .. memory.readbyte(0x42C+i))
end
end
end
oldstring = string.format(E4.." "..E5.." "..E6.." "..E7)
for i=4,7,1 do
_G["E"..i] = string.format("%x",memory.readbyte(0xE0+i))
if string.len(_G["E"..i])==1 then
_G["E"..i] = "0" .. _G["E"..i]
end
end
curstring=E4.." "..E5.." "..E6.." "..E7
gui.text(160,200,"RNG: "..curstring)
if curstring~=nextstring and curstring~=oldstring then
timer1=10 end
if curstring==oldstring then
timer2=5 end
if timer1~=0 then
gui.text(160,216,"RNG altered!")
timer1=timer1-1 end
if timer2~=0 then
gui.text(160,224,"RNG paused!")
timer2=timer2-1 end
carry0=0
if bit.bxor(bit.band(memory.readbyte(0xE4),0x02),bit.band(memory.readbyte(0xE5),0x02)) ~= 0 then
carry0=1 end
for i=1,3,1 do
_G["carry"..i]=0
if bit.band(memory.readbyte(0xE3+i),0x01)==1 then
_G["carry"..i]=1
end
end
for i=0,3,1 do
_G["NextE"..i+4] = string.format("%x",128*_G["carry"..i]+ bit.rshift(memory.readbyte(0xE4+i),1))
if string.len(_G["NextE"..i+4])==1 then
_G["NextE"..i+4]="0".._G["NextE"..i+4]
end
end
nextstring = NextE4.." "..NextE5.." "..NextE6.." "..NextE7
gui.text(160,208,"Next: "..nextstring)
emu.frameadvance()
end