rombyte = memory.readbyte(0x00013F) if rombyte == 0x47 then -- Sonic 1 print("Detected Sonic 1") addr_xcamera = 0xFFF700 addr_ycamera = 0xFFF616 addr_startedflag = 0xFFFE02 addr_ost = 0xFFD000 addr_ostend = 0xFFEFFF ost_length = 0x40 elseif rombyte == 0x32 then -- Sonic 2 print("Detected Sonic 2") addr_xcamera = 0xFFEE00 addr_ycamera = 0xFFEE04 addr_startedflag = 0xFFF711 addr_ost = 0xFFB000 addr_ostend = 0xFFD5FF ost_length = 0x40 elseif rombyte == 0x33 then -- Sonic 3 elseif rombyte == 0x20 then -- SK/S3K end xmouse = 0 ymouse = 0 xmousedelta = 0 ymousedelta = 0 pinned = {} rightclickdown = false memory.register(addr_startedflag, function() if memory.readbyte(addr_startedflag) == 0 then pinned = {} end end) gens.registerbefore( function() local xcamera = memory.readword(addr_xcamera) local ycamera = memory.readword(addr_ycamera) local input_state = input.get() xmousedelta = input_state.xmouse - xmouse ymousedelta = input_state.ymouse - ymouse xmouse = input_state.xmouse ymouse = input_state.ymouse local i, entry, x1, y1, x2, y2, outline_color for i=addr_ost,addr_ostend,ost_length do entry = ostentry(i) if entry then local width, height if entry.widthhalf == 0 then width = entry.width else width = entry.widthhalf end if entry.heighthalf == 0 then height = 8 else height = entry.heighthalf end if pinned[tostring(entry.baseaddr)] == nil then x1 = (entry.x - width) - xcamera y1 = (entry.y - height) - ycamera x2 = (entry.x + width) - xcamera y2 = (entry.y + height) - ycamera else local x = pinned[tostring(entry.baseaddr)][1] local y = pinned[tostring(entry.baseaddr)][2] x1 = x - width y1 = y - height x2 = x + width y2 = y + height memory.writeword(i + 0x08, xcamera + x) -- x memory.writeword(i + 0x0C, ycamera + y) -- y memory.writeword(i + 0x10, 0) -- xspeed memory.writeword(i + 0x12, 0) -- yspeed end if (xmouse >= x1 and ymouse >= y1) and (xmouse <= x2 and ymouse <= y2) then outline_color = {255, 0, 0, 255} if input_state.leftclick then if pinned[tostring(entry.baseaddr)] ~= nil then pinned[tostring(entry.baseaddr)][1] = xmouse pinned[tostring(entry.baseaddr)][2] = ymouse end memory.writeword(i + 0x08, xcamera + xmouse) -- x memory.writeword(i + 0x0C, ycamera + ymouse) -- y memory.writeword(i + 0x10, xmousedelta * 100) -- xspeed memory.writeword(i + 0x12, ymousedelta * 100) -- yspeed end if input_state.rightclick then if not rightclickdown then if pinned[tostring(entry.baseaddr)] == nil then pinned[tostring(entry.baseaddr)] = {xmouse, ymouse} else pinned[tostring(entry.baseaddr)] = nil end rightclickdown = true end else rightclickdown = false end else if pinned[tostring(entry.baseaddr)] ~= nil then outline_color = {0, 255, 0, 255} else outline_color = {255, 255, 255, 255} end end gui.box(x1, y1, x2, y2, {0, 0, 0, 0}, outline_color) end end end) function ostentry(address) local entry = {} entry.baseaddr = address entry.id = memory.readbyte(address) if entry.id == 0 or entry.id == nil then return nil end entry.renderflags = memory.readbyte(address + 0x01) entry.artindex = memory.readword(address + 0x02) entry.mappings = memory.readdword(address + 0x04) entry.x = memory.readword(address + 0x08) entry.xsub = memory.readword(address + 0x0A) entry.y = memory.readword(address + 0x0C) entry.ysub = memory.readword(address + 0x0E) entry.xspeed = memory.readword(address + 0x10) entry.yspeed = memory.readword(address + 0x12) entry.inertia = memory.readword(address + 0x14) entry.heighthalf = memory.readbyte(address + 0x16) entry.widthhalf = memory.readbyte(address + 0x17) entry.priority = memory.readbyte(address + 0x18) entry.width = memory.readbyte(address + 0x19) entry.dispframe = memory.readbyte(address + 0x1A) entry.animframe = memory.readbyte(address + 0x1B) entry.animnum = memory.readbyte(address + 0x1C) entry.animrestart = memory.readbyte(address + 0x1D) entry.animtime = memory.readbyte(address + 0x1E) entry.collision = memory.readbyte(address + 0x20) entry.colcustom = memory.readbyte(address + 0x21) entry.status = memory.readbyte(address + 0x22) entry.respawn = memory.readbyte(address + 0x23) entry.counter = memory.readbyte(address + 0x24) entry.counter2 = memory.readbyte(address + 0x25) entry.angle = memory.readbyte(address + 0x26) entry.angle2 = memory.readbyte(address + 0x27) entry.subtype = memory.readbyte(address + 0x28) entry.parent = memory.readword(address + 0x3E) return entry end