console.clear(); -- actor type and id to find. local actorType=0x07; local actorID=0x0020; local actors=0; local pointers={}; function getActors(type) return memory.read_u32_be(0x3E87D0+(type*0xC)); end function getAddr(type) return bit.band(memory.read_u32_be(0x3E87D0+(type*0xC)+4),0xFFFFFF); end function getPointer(pointer) return bit.band(memory.read_u32_be(pointer),0xFFFFFF); end function findActor(type,id) local amount=1; local addr=getAddr(type); for i=1,getActors(type),1 do if(addr~=0)then if(memory.read_u16_be(addr)==id)then pointers[amount]=addr; amount=amount+1; end addr=getPointer(addr+0x12C); end end end function DisplayForm() local FORM=forms.newform(275,350,"Link and Fins"); local x=5; local y=3; labels={ -- 5 80 155 ["link"]={ forms.label(FORM,"Link:",x,y,60,14,false), forms.label(FORM,"0.0",x+15,y+17,60,14,false), forms.label(FORM,"0.0",x+15,y+(17*2),60,14,false), forms.label(FORM,"0.0",x+15,y+(17*3),60,14,false), forms.label(FORM,"0",x+15,y+(17*4),60,14,false), forms.label(FORM,"00000000",x+80,y+17,60,14,false), forms.label(FORM,"00000000",x+80,y+(17*2),60,14,false), forms.label(FORM,"00000000",x+80,y+(17*3),60,14,false), forms.label(FORM,"0000",x+80,y+(17*4),60,14,false), forms.label(FORM,"X:",x,y+17,60,14,false), forms.label(FORM,"Y:",x,y+(17*2),60,14,false), forms.label(FORM,"Z:",x,y+(17*3),60,14,false), forms.label(FORM,"R:",x,y+(17*4),60,14,false) }, ["fin1"]={ forms.label(FORM,"Zora Fin 1:",x,y+(17*5)+10,60,14,false), forms.label(FORM,"0.0",x+15,y+(17*6)+10,60,14,false), forms.label(FORM,"0.0",x+15,y+(17*7)+10,60,14,false), forms.label(FORM,"0.0",x+15,y+(17*8)+10,60,14,false), forms.label(FORM,"0",x+40,y+(17*9)+10,60,14,false), forms.label(FORM,"?",x+40,y+(17*10)+10,60,14,false), forms.label(FORM,"00000000",x+80,y+(17*6)+10,60,14,false), forms.label(FORM,"00000000",x+80,y+(17*7)+10,60,14,false), forms.label(FORM,"00000000",x+80,y+(17*8)+10,60,14,false), forms.label(FORM,"X:",x,y+(17*6)+10,60,14,false), forms.label(FORM,"Y:",x,y+(17*7)+10,60,14,false), forms.label(FORM,"Z:",x,y+(17*8)+10,60,14,false), forms.label(FORM,"Timer:",x,y+(17*9)+10,60,14,false), forms.label(FORM,"Return:",x,y+(17*10)+10,60,14,false) }, ["fin2"]={ forms.label(FORM,"Zora Fin 2:",x,y+(17*11)+20,60,14,false), forms.label(FORM,"0.0",x+15,y+(17*12)+20,60,14,false), forms.label(FORM,"0.0",x+15,y+(17*13)+20,60,14,false), forms.label(FORM,"0.0",x+15,y+(17*14)+20,60,14,false), forms.label(FORM,"0",x+40,y+(17*15)+20,60,14,false), forms.label(FORM,"?",x+40,y+(17*16)+20,60,14,false), forms.label(FORM,"00000000",x+80,y+(17*12)+20,60,14,false), forms.label(FORM,"00000000",x+80,y+(17*13)+20,60,14,false), forms.label(FORM,"00000000",x+80,y+(17*14)+20,60,14,false), forms.label(FORM,"X:",x,y+(17*12)+20,60,14,false), forms.label(FORM,"Y:",x,y+(17*13)+20,60,14,false), forms.label(FORM,"Z:",x,y+(17*14)+20,60,14,false), forms.label(FORM,"Timer:",x,y+(17*15)+20,60,14,false), forms.label(FORM,"Return:",x,y+(17*16)+20,60,14,false) }, forms.label(FORM,"Hex:",x+80,y,60,14,false) }; end function updateForm() forms.settext(labels.link[2],string.format("% 5.3f",memory.readfloat(0x3FFDB0+0x24,true))); forms.settext(labels.link[3],string.format("% 5.3f",memory.readfloat(0x3FFDB0+0x28,true))); forms.settext(labels.link[4],string.format("% 5.3f",memory.readfloat(0x3FFDB0+0x2C,true))); forms.settext(labels.link[5],string.format("% 5d",memory.read_u16_be(0x3FFDB0+0xBE))); forms.settext(labels.link[6],string.format("%08s",bizstring.hex(memory.read_u32_be(0x3FFDB0+0x24)))); forms.settext(labels.link[7],string.format("%08s",bizstring.hex(memory.read_u32_be(0x3FFDB0+0x28)))); forms.settext(labels.link[8],string.format("%08s",bizstring.hex(memory.read_u32_be(0x3FFDB0+0x2C)))); forms.settext(labels.link[9],string.format("%04s",bizstring.hex(memory.read_u16_be(0x3FFDB0+0xBE)))); if(pointers[1]~=nil and pointers[1]~=0)then forms.settext(labels.fin1[2],string.format("% 5.3f",memory.readfloat(pointers[1]+0x24,true))); forms.settext(labels.fin1[3],string.format("% 5.3f",memory.readfloat(pointers[1]+0x28,true))); forms.settext(labels.fin1[4],string.format("% 5.3f",memory.readfloat(pointers[1]+0x2C,true))); forms.settext(labels.fin1[5],string.format("% 3d",memory.read_s8(pointers[1]+0x1CD))); if(memory.read_u32_be(pointers[1]+0x1C4)==0x803FFDB0)then forms.settext(labels.fin1[6],"true"); else forms.settext(labels.fin1[6],"false"); end forms.settext(labels.fin1[7],string.format("%08s",bizstring.hex(memory.read_u32_be(pointers[1]+0x24)))); forms.settext(labels.fin1[8],string.format("%08s",bizstring.hex(memory.read_u32_be(pointers[1]+0x28)))); forms.settext(labels.fin1[9],string.format("%08s",bizstring.hex(memory.read_u32_be(pointers[1]+0x2C)))); end if(pointers[2]~=nil and pointers[2]~=0)then forms.settext(labels.fin2[2],string.format("% 5.3f",memory.readfloat(pointers[2]+0x24,true))); forms.settext(labels.fin2[3],string.format("% 5.3f",memory.readfloat(pointers[2]+0x28,true))); forms.settext(labels.fin2[4],string.format("% 5.3f",memory.readfloat(pointers[2]+0x2C,true))); forms.settext(labels.fin2[5],string.format("% 3d",memory.read_s8(pointers[2]+0x1CD))); if(memory.read_u32_be(pointers[2]+0x1C4)==0x803FFDB0)then forms.settext(labels.fin2[6],"true"); else forms.settext(labels.fin2[6],"false"); end forms.settext(labels.fin2[7],string.format("%08s",bizstring.hex(memory.read_u32_be(pointers[2]+0x24)))); forms.settext(labels.fin2[8],string.format("%08s",bizstring.hex(memory.read_u32_be(pointers[2]+0x28)))); forms.settext(labels.fin2[9],string.format("%08s",bizstring.hex(memory.read_u32_be(pointers[2]+0x2C)))); end end DisplayForm(); while true do if(actors~=getActors(actorType))then actors=getActors(actorType); findActor(actorType,actorID); end updateForm(); emu.frameadvance(); end