All pastes #1363111 Raw Edit

sonic_mousecontrol.lua

public lua v1 · immutable
#1363111 ·published 2009-03-17 07:08 UTC
rendered paste body
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 = 0x40elseif 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 = 0x40elseif rombyte == 0x33 then -- Sonic 3elseif rombyte == 0x20 then -- SK/S3Kendxmouse = 0ymouse = 0xmousedelta = 0ymousedelta = 0pinned = {}rightclickdown = falsememory.register(addr_startedflag, function()	if memory.readbyte(addr_startedflag) == 0 then		pinned = {}	endend)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	endend)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 entryend