User File #59827345600595517

Upload All User Files

#59827345600595517 - Battle Kid series lua for Bizhawk

Battle Kid.lua
457 downloads
Uploaded 12/8/2019 7:47 AM by Fortranm (94 files)
Original Battle Kid and Battle Kid 2 scripts by caitsith2.
-- Battle Kid 2: Mountain of Torment
-- Written by CaitSith2
-- Oct 8, 2013
-- Displays Hitboxes, Enemy HP, and various stats on screen

enable_info = 1
current_run_direction = 0

--1: Battle Kid v1.x; 2: Battle Kid 2; 3:Battle Kid v2.0
local version = 1
local demo = false
local stuffSet = {0x0300, 0x0400, 0x0440}
local timmyshotsSet = {0x0290, 0x0598, 0x0290}
local shotsexistSet = {0x0295, 0x059F, 0x0210}
local roomcollisionSet = {0x500, 0x0300, 0x0300}
local solidSet = {1, 0x10, 128}
local instKillSet = {2, 0x03, 32}
local xlocSet = {0x1E, 0x31, 0x3A}
local ylocSet = {0x1D, 0x30, 0x39}
local aliveSet = {0x20, 0x70, 0x93}
local hpSet = {0, 0x82, 0x6E}
local jleftSet = {0x4D, 0x78, 0x83}
local jtotalSet = {0x4E, 0x77, 0x84}
local accelSet = {0, 0x59, 0x4E}
local runspeedSet = {0, 0x58, 0x4E}

local function line(x1,y1,x2,y2,color)
		if (enable_info == 1) then
			gui.drawLine(x1,y1+8,x2,y2+8,color)
		end
end
local function box(x1,y1,x2,y2,color)
	line(x1,y1,x1,y2,color)
	line(x1,y1,x2,y1,color)
	line(x2,y1,x2,y2,color)
	line(x1,y2,x2,y2,color)
end
local function selectivebox(x1,y1,x2,y2,color,left,right,top,bottom)
	if (left == 1) then
		line(x1,y1,x1,y2,color)
	end
	if (top == 1) then
		line(x1,y1,x2,y1,color)
	end
	if (right == 1) then
		line(x2,y1,x2,y2,color)
	end
	if (bottom == 1) then
		line(x1,y2,x2,y2,color)
	end
end
local function text(x,y,str)
	if (x >= 0 and x < 255 and y >= 0 and y < 240) then
	  xm = client.screenwidth() / 256
		ym = client.screenheight() / 224
		if (enable_info == 1) then
			gui.text(x*xm,(y-8)*ym,str)
		end
	end
end

enable_tas_info = 0
infinite_loop = 1
end_avi = 197000

function battlekidloop()

	framecounter = emu.framecount()
	local enable_extended_info = 1
	local enable_hud_info = 1
	local enable_debug_code = 0
	--local force_wall_grip	-- obsoleted by 3 line game genie code, YATVXN + ELYTUY + ELTVVY
	
	local info_frames = 300
	local info_1 = 1200
	local info_1_string = "Unfair 100%"
	local info_1_author = "CaitSith2"
	local info_2 = 1800
	local frame_rate = 60.098769685745869044
	local frames_per_minute = frame_rate * 60
	text(1,1,"")

	stuff = stuffSet[version];
	timmy = {0, 0, 0, 0}
	if (version == 1) then	
		if (demo == true) then
			timmy[0] = 0x0030
			timmy[1] = 0x0031
			timmy[2] = 0x0032
			timmy[3] = 0x0033
		else
			timmy[0] = 0x0031
			timmy[1] = 0x0032
			timmy[2] = 0x0033
			timmy[3] = 0x0034
		end
	elseif (version ==2) then
		if (demo == true) then
			timmy[0] = 0x005B
			timmy[1] = 0x005C
			timmy[2] = 0x005A
			timmy[3] = 0x005D
		else
			timmy[0] = 0x0054
			timmy[1] = 0x0055
			timmy[2] = 0x0056
			timmy[3] = 0x0057
		end
	else
		timmy[0] = 0x0069
		timmy[1] = 0x006B
		timmy[2] = 0x006A
		timmy[3] = 0x006C
	end
	
	timmyshots = timmyshotsSet[version]
	roomcollision = roomcollisionSet[version]
	
	timmyOffset = 24
	if (version == 3) then
		timmyOffset = 40
	end
	x1 = memory.readbyte(timmy[0])
	x2 = memory.readbyte(timmy[1])
	y1 = memory.readbyte(timmy[2]) + timmyOffset
	y2 = memory.readbyte(timmy[3]) + timmyOffset
	alive = memory.readbyte(aliveSet[version])
	hp = memory.readbyte(hpSet[version])	
	if (demo == true) then
		if (version==1) then
			alive = memory.readbyte(0x1F)
		else
			alive = memory.readbyte(0x76)
			hp = memory.readbyte(0x88)
		end
	end
	if (version==1) then
		hp = 1
		if((memory.readbyte(0) == 136) and (memory.readbyte(1) <= 10)) then
			gameaction = 1
		else
			gameaction = 0
		end
	else
		if((memory.readbyte(0x20) == 0) and (memory.readbyte(0x21) == 0)) then
			gameaction = 0
		else
			gameaction = 1
		end
	end
	
	if ((enable_extended_info == 1) and (gameaction == 1)) then

		--spritetype is structured bitwise as follows, ffffbbdd
		--ffff = flags. 0001 = box backs off one color on sprites 3-15.
		--			 0010 =
		--bb = box color. 00 = red, 01 = yellow, 10 = green, 11 = no box.
		--dd = display info. 00 = All info, 01 = no info, 10 = HP, 11 = Phase
		local spritetype = {{    0x00,0x00,0x00,0x00,0x00, 0x00,0x08,0x00,0x02,0x00,
                  0x09,0x00,0x04,0x00,0x01, 0x00,0x0A,0x00,0x08,0x00,
                  0x00,0x00,0x00,0x00,0x02, 0x00,0x08,0x00,0x00,0x00,
                  0x41,0x00,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,

                  0x14,0x00,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x02,0x00,0x00, 0x00,0x0D,0x00,0x02,0x00,
                  0x41,0x00,0x01,0x00,0x00, 0x00,0x20,0x00,0x03,0x00,
                  0x40,0x00,0x42,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
                  0x08,0x00,0x41,0x00,0x00, 0x00,0x41,0x00,0x08,0x00,

                  0x01,0x00,0x09,0x00,0x00, 0x00,0x41,0x00,0x00,0x00,
                  0x00,0x00,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
                  0x08,0x00,0x01,0x00,0x01, 0x00,0x05,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,

                  0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
   
                  0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,

                  0x00,0x00,0x00,0x00,0x00, 0x00,
		},{		 0x0D, 0x02, 0x09, 0x0D, 0x0D,	0x0D, 0x0C, 0x01, 0x00, 0x0D,
						0x0C, 0x02, 0x02, 0x09, 0x00,	0x00, 0x00, 0x00, 0x00, 0x00,
						0x00, 0x00, 0x0E, 0x00, 0x0D,	0x00, 0x09, 0x0D, 0x02, 0x00,
						0x00, 0x00, 0x03, 0x00, 0x00,	0x0D, 0x00, 0x00, 0x00, 0x02,
						0x00, 0x00, 0x00, 0x09, 0x09,	0x09, 0x00, 0x00, 0x00, 0x00,

						0x03, 0x00, 0x00, 0x00, 0x00,	0x00, 0x00, 0x00, 0x00, 0x00,
						0x00, 0x00, 0x00, 0x07, 0x09,	0x00, 0x00, 0x00, 0x0D, 0x00,
						0x00, 0x00, 0x00, 0x00, 0x00,	0x00, 0x00, 0x00, 0x00, 0x0D,
						0x00, 0x00, 0x00, 0x00, 0x00,	0x00, 0x00, 0x00, 0x00, 0x00,
						0x00, 0x00, 0x09, 0x09, 0x00,	0x00, 0x00, 0x00, 0x00, 0x00,
		},{    0x00,0x00,0x00,0x00,0x00, 0x00,0x08,0x00,0x02,0x00,
                  0x09,0x00,0x04,0x00,0x01, 0x00,0x0A,0x00,0x08,0x00,
                  0x00,0x00,0x00,0x00,0x02, 0x00,0x08,0x00,0x00,0x00,
                  0x41,0x00,0x05,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0x00,

                  0x14,0x00,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x02,0x00,0x00, 0x00,0x0D,0x00,0x02,0x00,
                  0x41,0x00,0x01,0x00,0x00, 0x00,0x20,0x00,0x03,0x00,
                  0x40,0x00,0x42,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
                  0x08,0x00,0x41,0x00,0x00, 0x00,0x41,0x00,0x08,0x00,

                  0x01,0x00,0x09,0x00,0x00, 0x00,0x41,0x00,0x00,0x00,
                  0x00,0x00,0x08,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
                  0x08,0x00,0x01,0x00,0x01, 0x00,0x05,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,

                  0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
   
                  0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,
                  0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,

                  0x00,0x00,0x00,0x00,0x00, 0x00,
		}};

		--draw room collision zones

		for i=0,12 do
			toprow = 24
			bottomrow = 39
			if (i == 0) then
				toprow = 36
			end
			for j=0,15 do
				top = 1
				bottom = 1
				left = 1
				right = 1
				blocktype = memory.readbyte(roomcollision + (i*16) + j)
				if(i ~= 0) then
					if (blocktype == memory.readbyte(roomcollision + ((i-1)*16) + j)) then
						top = 0
					end
				end
				if(i ~= 12) then
					if (blocktype == memory.readbyte(roomcollision + ((i+1)*16) + j)) then
						bottom = 0
					end
				end
				if(j ~= 0) then
					if (blocktype == memory.readbyte(roomcollision + (i*16) + (j-1))) then
						left = 0
					end
				end
				if(j ~= 15) then
					if (blocktype == memory.readbyte(roomcollision + (i*16) + (j+1))) then
						right = 0
					end
				end

				if(blocktype == instKillSet[version]) then		--Instant Kill Object
					selectivebox(j*16,toprow+(i*16),15+(j*16),bottomrow+(i*16),"red",left,right,top,bottom)
					line(j*16,toprow+(i*16),15+(j*16),bottomrow+(i*16),"red")
					line(15+(j*16),toprow+(i*16),j*16,bottomrow+(i*16),"red")
				elseif(blocktype == 102) then		--Blinking spike in its Off state (BK1)
					selectivebox(j*16,toprow+(i*16),15+(j*16),bottomrow+(i*16),"yellow",left,right,top,bottom)
					line(j*16,toprow+(i*16),(j*16)+8,(toprow+(i*16))+8,"yellow")
					line((j*16)+8,toprow+(i*16),(j*16)+15,(toprow+(i*16))+8,"yellow")
				elseif(blocktype >= solidSet[version]) then		--Solid Object
					selectivebox(j*16,toprow+(i*16),15+(j*16),bottomrow+(i*16),"cyan",left,right,top,bottom)
					if(blocktype > solidSet[version]) then		--BK2
						if(blocktype == 0x11) then	--Ice
							line(j*16,toprow+(i*16),(j*16)+8,(toprow+(i*16))+8,"cyan")
							line((j*16)+8,toprow+(i*16),(j*16)+15,(toprow+(i*16))+8,"cyan")
						elseif(blocktype == 0x12) then	--conveyer belt <<<
							line(j*16,toprow+8+(i*16),15+(j*16),bottomrow+(i*16),"cyan")
							line(15+(j*16),toprow+(i*16),j*16,bottomrow-8+(i*16),"cyan")
						elseif(blocktype == 0x13) then	--conveyer belt >>>
							line(j*16,toprow+(i*16),15+(j*16),bottomrow-8+(i*16),"cyan")
							line(15+(j*16),toprow+8+(i*16),j*16,bottomrow+(i*16),"cyan")
						elseif(blocktype == 0x14) then	--Wallgrip objects
							line(j*16,toprow+(i*16),15+(j*16),bottomrow+(i*16),"cyan")
							line(15+(j*16),toprow+(i*16),j*16,bottomrow+(i*16),"cyan")
						elseif(blocktype == 0x15) then	--Rune spectre destroyable blocks
							line((j*16)+8,toprow+(i*16),(j*16)+8,bottomrow+(i*16),"cyan")
							line(j*16,toprow+(i*16)+8,(j*16)+15,toprow+(i*16)+8,"cyan")
							line((j*16)+8,toprow+(i*16),(j*16)+15,(toprow+(i*16))+8,"cyan")
							line((j*16)+8,bottomrow+(i*16),(j*16)+15,(toprow+(i*16))+8,"cyan")
							line((j*16)+8,toprow+(i*16),j*16,(toprow+(i*16))+8,"cyan")
							line((j*16)+8,bottomrow+(i*16),j*16,(toprow+(i*16))+8,"cyan")
						end		
					end
				end
			end
		end

		--text(x1,y1-8,string.format("%03d,%03d",x1,y1))
		if (alive == 0 and hp > 0) then
			box(x1,y1,x2,y2,"green")
		elseif (version > 1 and hp > 0) then --Invincibility time
			box(x1,y1,x2,y2,"yellow")
			line(x1,y1,x2,y2,"yellow")
			line(x1,y2,x2,y1,"yellow")
		else
			box(x1,y1,x2,y2,"red")
			line(x1,y1,x2,y2,"red")
			line(x1,y2,x2,y1,"red")
		end
		
		shotsleft=3
		for i=0,2 do
			if (version == 3) then
				timmyshotexists = memory.readbyte(shotsexistSet[version]+(i*4))
			else
				timmyshotexists = memory.readbyte(shotsexistSet[version]+(i*8))
			end
			if(timmyshotexists ~= 0xF8) then
				x1 = memory.readbyte(timmyshots+1+(i*8))
				x2 = memory.readbyte(timmyshots+2+(i*8))
				y1 = memory.readbyte(timmyshots+3+(i*8)) + 24
				y2 = memory.readbyte(timmyshots+4+(i*8)) + 24
				shotsleft = shotsleft - 1
				box(x1,y1,x2,y2,"green")
			end
		end
		text(35,8,string.format("Shots:%d/3",shotsleft))
		
		for i=0,15 do --enemy sprites
			if (version == 2) then
				stype = memory.readbyte(stuff+(i*16)) / 2
			else
				stype = memory.readbyte(stuff+(i*16));
			end
			if(spritetype[version][stype+1] == nil) then
				break	--Invalid sprite type.  Game has very likely crashed
				--As such, there is no point in running the rest of this script section.
			end
			spritedisplay = bit.band(spritetype[version][stype+1],3)
			spritebox = bit.band(spritetype[version][stype+1],12)
			spriteflags = bit.band(spritetype[version][stype+1],240)
			spriteexists = memory.readbyte(stuff+8+(i*16))
			if (bit.band(spriteflags,0x10) == 0x10) then
				if (i >= 3) then
					spritebox = spritebox - 4
					if (spritebox < 0) then
						spritebox = 12
					end
				end
			end
			if (bit.band(spriteflags,0x20) == 0x20) then
				if (i >= 3) then
					spritedisplay = 1
				end
			end

------------------------------ COMMON VARIABLES ---------------------------------------------------
		if (version < 3) then
			phase = memory.readbyte(stuff+1+(i*16))
			x1 = memory.readbyte(stuff+2+(i*16))
			x2 = memory.readbyte(stuff+3+(i*16))
			y1 = memory.readbyte(stuff+4+(i*16)) + 24
			y2 = memory.readbyte(stuff+5+(i*16)) + 24
		else
			phase = memory.readbyte(stuff+4+(i*16))
			x1 = memory.readbyte(stuff+5+(i*16))
			x2 = memory.readbyte(stuff+7+(i*16))
			y1 = memory.readbyte(stuff+6+(i*16)) + 40
			y2 = memory.readbyte(stuff+8+(i*16)) + 40
		end

		if (version == 2) then --Battle Kid 2: Mountain of Torment
		
------------------------------ BOSS HANDLERS ------------------------------------------------------
			if (stype == 18) then	--Boss/minigame/locked door spawner
				spawntype = memory.readbyte(stuff+11+(i*16))
				if(spawntype == 0x42) then
					timer = memory.readbyte(stuff+13+(i*16))
					text(x1,y1+8,timer)
					break;
				end
			end

			if (stype == 55) then	--Handle Night Mission Boss
				if(i == 1) then
					spritedisplay = 0
					ZeddState = memory.readbyte(stuff+11+(i*16))
					if ((ZeddState == 0) or (ZeddState <= 6)) then
						text(90,32,"Tossing Electric Sparks")
					elseif ((ZeddState >= 8) and (ZeddState <= 10)) then
						text(90,32,"Last Spark")
					elseif ((ZeddState >= 12) and (ZeddState <= 14)) then
						text(90,32,"Charging up")
					elseif ((ZeddState >= 16) and (ZeddState <= 20)) then
						text(90,32,"Dashing Across Room")
					elseif ((ZeddState >= 22) and (ZeddState <= 26)) then
						text(90,32,"Staying in one spot")
					end
				end
				spritebox = 12
				box(x1,y1,x2,y2,"red")
				
			end

			if ((stype == 42) or (stype == 83)) then	--Hantairei'mos
				spritebox = 12
				box(x1,y1,x2,y2,"red")
				if(i==0) then
					spritedisplay = 3
				end
			end
			
			if ((stype == 53) or (stype == 85)) then	--Misha
				spritebox = 12
				box(x1,y1,x2,y2,"red")
				--if(i==0) then
				--	spritedisplay = 3
				--end
			end

			if ((stype == 54) or (stype == 86)) then	--Helga Kraftie, Power station version
				spritebox = 12
				box(x1,y1,x2,y2,"red")
			end

			if ((stype == 56) or (stype == 87)) then	--Doppleganger either being constructed or dying
				if (i == 0) then	--Doppleganger constructor phase
					hp = memory.readbyte(stuff+6+(i*16))
					if ((hp == 13) or (hp == 12)) then
						text(24,72,"One doppleganger clone, no abilities")
					elseif (hp == 11) then
						text(24,72,"Two doppleganger clones, no abilities")
					elseif (hp == 10) then
						text(24,72,"Three doppleganger clones, Jump")
					elseif (hp == 9) then
						text(24,72,"Five doppleganger clones, Jump")
					elseif (hp == 8) then
						text(24,72,"Six doppleganger clones, Jump")
					elseif (hp == 7) then
						text(24,72,"Five doppleganger clones, Jump, Feather")
					elseif (hp == 6) then
						text(24,72,"Six doppleganger clones, Jump, Feather")
					elseif (hp == 5) then
						text(24,72,"Three doppleganger clones, Jump lust")
					elseif (hp == 4) then
						text(24,72,"Six doppleganger clones, Jump lust")
					elseif (hp == 3) then
						text(24,72,"Three doppleganger clones, Double Jump")
					elseif (hp == 2) then
						text(24,72,"Two doppleganger clones, Double Jump, 5HP")
					elseif (hp == 1) then
						text(24,72,"Two doppleganger clones, Attack shots, 5HP")
					elseif (hp == 0) then
						text(24,64,"One doppleganger clone")
						text(24,72,"Attack Shots, 5HP, Jump")
					else
						text(24,72,"The TIMMY :)")
					end
				end
				spritebox = 12
				spritedisplay = 3
				if (phase < 12) then
					box(x1,y1,x2,y2,"yellow")
				elseif (phase == 12) then
					box(x1,y1,x2,y2,"red")
				elseif (phase == 34) then
					box(x1,y1,x2,y2,"red")
					spritedisplay = 1
				else
					spritedisplay = 1
				end
			end;
			
			if (stype == 57) then	--Doppleganger in action
				spritebox = 0
				spritedisplay = 2
			end;

			if (stype == 58) then	--The Timmy :)
				spritebox = 12
				if (i ~= 1) then
					spritedisplay = 1
				end
				box(x1,y1,x2,y2,"red")
			end;

			if (stype == 69) then	--Doppleganger exploding
				spritebox = 12
				spritedisplay = 1
			end

			if (stype == 68) then
				spritebox = 12
				if (i==0) then
					stype = memory.readbyte(stuff+0+16)/2
					ZeddState = memory.readbyte(stuff+11+(16))
					if ((stype == 19) or (stype == 80)) then	--Handle Golem Boss
						spritedisplay = 0
						if ((ZeddState == 18) or (ZeddState <= 2)) then
							text(90,32,"Manipulate Luck Now")
						elseif ((ZeddState >= 4) and (ZeddState <= 6)) then
							text(90,32,"Group of 3 Balls")
						elseif ((ZeddState >= 8) and (ZeddState <= 10)) then
							text(90,32,"Targeting Blue Balls")
						elseif (ZeddState == 12) then
							text(90,32,"End of Blue Balls")
						elseif ((ZeddState >= 14) and (ZeddState <= 16)) then
							text(90,32,"Yellow Goop")
						end
						spritebox = 12
						box(x1,y1,x2,y2,"red")
					end
					if ((stype == 31) or (stype == 81)) then		--Verdigrime
						
						if (ZeddState == 0) then
							text(90,32,"Waiting phase - Open fire")
						elseif (ZeddState == 2) then
							text(90,32,"End of Waiting phase")
							text(90,40,"Manipulate Luck during Attacks")
						elseif ((ZeddState >= 4) and (ZeddState <= 8)) then
							text(90,32,"Targeted Eye Slime Attack")
						elseif ((ZeddState >= 10) and (ZeddState <= 16)) then
							text(90,32,"Mouth Slime spray attack")
						elseif ((ZeddState >= 18) and (ZeddState <= 22)) then
							text(90,32,"Ceiling Slime Attack")
						end
						box(x1,y1,x2,0x8F+24,"red")
					end
					if ((stype == 34) or (stype == 82)) then	--Ivan 2
						if (ZeddState <= 4) then
							text(90,32,"Making Ice column")
						elseif ((ZeddState >= 6) and (ZeddState <= 14)) then
							text(90,32,"Shooting Ice Ghost")
						elseif((ZeddState >= 16) and (ZeddState <= 30)) then
							text(90,32,"Shooting Icicles")
						elseif((ZeddState >= 32) and (ZeddState <= 44)) then
							text(90,32,"Shooting Ice bullet spread")
						end
						box(x1,y1,x2,0xAF+24,"red")
					end
				else
					box(x1,y1,x2,y2,"red")
				end
			end

			if (stype == 84) then	--Lobstor bot
				spritebox = 12
				box(x1,y1,x2,y2,"red")
				for j=0,15 do
					stype = memory.readbyte(stuff+(j*16))
					if (stype == 68) then
						x1 = memory.readbyte(stuff+2+(j*16))
						x2 = memory.readbyte(stuff+3+(j*16))
						y1 = memory.readbyte(stuff+4+(j*16)) + 24
						y2 = memory.readbyte(stuff+5+(j*16)) + 24
						box(x1,y1,x2,y2,"red")
					end
				end
			end

			if (stype == 70) then	--Muckswimmer
				spritebox = 12
				if(phase ~= 4) then
					spritedisplay = 1
				else
					box(x1,y1,x2,y2,"red")
				end
			end

			if (stype == 96) then	--Pinkface
				dirchange = memory.readbyte(0x6BC)
				current_suit = memory.readbyte(0x6E5)
				spritebox = 12
				box(x1,y1,x2,y2,"red")
				if(current_suit == 0) then
					text(16,32,"Current suit is Hearts")
				elseif (current_suit == 1) then
					text(16,32,"Current suit is Diamonds")
				elseif (current_suit == 2) then
					text(16,32,"Current suit is Spades")
				else
					text(16,32,"Current suit is Clubs")
				end
				text(16,40,string.format("Direction change in %d suit changes",dirchange))

				for j=0,15 do
					stype = memory.readbyte(stuff+(j*16))
					if (stype == 68) then
						x1 = memory.readbyte(stuff+2+(j*16))
						x2 = memory.readbyte(stuff+3+(j*16))
						y1 = memory.readbyte(stuff+4+(j*16)) + 24
						y2 = memory.readbyte(stuff+5+(j*16)) + 24
						timer1 = memory.readbyte(stuff+13+(j*16))
						timer2 = memory.readbyte(stuff+14+(j*16))
						if(current_suit == 0) then
							if(timer2 > 0) then
								box(x1,y1,x2,y2,"yellow")
								text(x1,y1+8,timer2)
							else
								box(x1,y1,x2,y2,"red")
								text(x1,y1+8,timer1)
							end
						elseif (current_suit == 3) then
							box(x1,y1,x2,y2,"red")
							line(0,y1,255,y1,"yellow")
							line(0,y2,255,y2,"yellow")
						end
					end
				end
			end


------------------------------ END OF BOSS HANDLERS -----------------------------------------------


------------------------------ SPRITE HANDLERS ----------------------------------------------------
			if (stype == 3) then	--Dying sprite
				spritebox = 12
				spritedisplay = 1
			end

			if (stype == 4) then	--Shot Cannons
				timeleft = memory.readbyte(stuff+14+(i*16))
				for j=0,7 do
					stype2 = memory.readbyte(stuff+0+(j*16)) / 2
					x2 = memory.readbyte(stuff+2+(j*16))
					y2 = memory.readbyte(stuff+4+(j*16)) + 24
					timeleft2 = memory.readbyte(stuff+14+(j*16))
					if((x1 == x2) and (y1 == y2) and (timeleft2 < timeleft) and (stype2 == 4)) then
						if(j < i) then
							break
						end
						timeleft = timeleft2
					end
					if (j==7) then
						text(x1,y1+8,timeleft)
						box(x1,y1,x1+7,y1+7,"yellow")
					end
				end
			end

			if ((stype == 5) or  (stype == 6) or (stype == 9)) then	--shots
				if ((x2 ~=0) or ((y2-24) ~= 0)) then
					box(x1,y1,x2,y2,"red")
				end;
			end

			if (stype == 12) then	--Eye Sniper
				timeleft = memory.readbyte(stuff+14+(i*16))
				text(x1,y1+8,timeleft)
			end

			if (stype == 14) then	--Lock Blocks
				spritebox = 12
				spritedisplay = 1
				keyrequired = memory.readbyte(stuff+6+(i*16))
				keys = memory.readbyte(0x89)
				if(bit.band(keys,keyrequired) == keyrequired) then
					box(x1,y1,x2,y2,"red")
				end
			end

			if (stype == 15) then	--Pickaxe Chuck
				spritedisplay = 2
				timer = memory.readbyte(stuff+13+(i*16))
				if(phase == 2) then
					text(x1,y1+8,timer+30)
				elseif (phase == 4) then
					text(x1,y1+8,timer)
				elseif (phase == 6) then
					text(x1,y1+8,timer+86)
				elseif (phase == 8) then
					text(x1,y1+8,timer+70)
				end
			end

			if (stype == 16) then	--Boss Door
				spritedisplay = 1
			end

			if (stype == 21) then	--Sqlungy
				spritedisplay = 2
				updown = memory.readbyte(stuff+1+(i*16))
				if (updown < 8) then
					line(x1+6,y1,x1+6,0,"yellow")
					--line(x1+7,y1,x1+7,0,"yellow")
					--line(x1+8,y1,x1+8,0,"yellow")
					line(x1+9,y1,x1+9,0,"yellow")
				else
					line(x2-6,y2,x2-6,240,"yellow")
					--line(x2-7,y2,x2-7,240,"yellow")
					--line(x2-8,y2,x2-8,240,"yellow")
					line(x2-9,y2,x2-9,240,"yellow")
				end
			end

			if (stype == 22) then	--shots
				if (i<8) then
					timeleft = memory.readbyte(stuff+13+(i*16))
					for j=0,7 do
						stype2 = memory.readbyte(stuff+0+(j*16))/2
						timeleft2 = memory.readbyte(stuff+13+(j*16))
						x3 = memory.readbyte(stuff+2+(j*16))
						y3 = memory.readbyte(stuff+4+(j*16)) + 24
						if((x1 == x3) and (y1 == y3) and (timeleft2 < timeleft) and (stype2 == 22)) then
							if(j<i) then
								break
							end
							timeleft = timeleft2
						end
						if(j==7) then
							box(x1,y1,x1+15,y1+15,"yellow")
							text(x1,y1+8,timeleft)
						end
					end
				else
					box(x1,y1,x2,y2,"red")
				end
			end

			if (stype == 24) then	--Turbine
				type = memory.readbyte(stuff+1+(i*16))
				if (type < 9) then
					box(x1,y1,x2,y2,"red")
					line(x1,y1,x2,y2,"red")
					line(x1,y2,x2,y1,"red")
					timeleft = memory.readbyte(stuff+13+(i*16))
					if (type == 8) then
						text(x1,y1+8,timeleft+90)
					elseif (type == 2) then
						text(x1,y1+8,timeleft+30)
					else
						text(x1,y1+8,timeleft)
					end
				end
			end
			if (stype == 25) then	--megaman style disappearing blocks
				spritedisplay = 1
				spritebox = 12
				type = memory.readbyte(stuff+12+(i*16))
				timer = memory.readbyte(stuff+13+(i*16))
				if(phase < 8) then
					box(x1,y1,x2,y2,"yellow")
					if(type == 17) then	--Ice
						line(x1,y1,x1+8,y1+8,"yellow")
						line(x1+8,y1,x2,y1+8,"yellow")
					elseif(type == 18) then	--conveyer belt
						line(x2,y1,x1,y1+8,"yellow")
						line(x2,y2,x1,y1+8,"yellow")
					elseif(type == 19) then	--conveyer belt
						line(x1,y1,x2,y1+8,"yellow")
						line(x1,y2,x2,y1+8,"yellow")
					elseif(type == 20) then	--Wallgrip objects
						line(x1,y1,x2,y2,"yellow")
						line(x1,y2,x2,y1,"yellow")
					end
				end
				text(x1,y2,timer)
			end

			if (stype == 26) then	--Timmy's breath bubbles.
				spritebox = 12
			end

			if (stype == 27) then	--Immortal Jelly
				hp = memory.readbyte(stuff+6+(i*16))
				timer = memory.readbyte(stuff+13+(i*16))
				if(phase <= 8) then
					box(x1,y1,x2,y2,"red")
					text(x1,y1,hp)
				elseif(phase == 10) then
					text(x1,y1+8,timer+147)
				elseif(phase == 12) then
					text(x1,y1+8,timer+27)
				elseif(phase == 14) then
					text(x1,y1+8,((hp-1)*3)+timer)
				end
				
			end

			if (stype == 28) then		--Squeex
				direction = memory.readbyte(stuff+11+(i*16))
				timer = memory.readbyte(stuff+13+(i*16))
				shots = memory.readbyte(stuff+14+(i*16))
				if(phase == 4) then
					text(x1,y1+8,39)
				elseif(phase >= 6) then
					if(shots == 3) then
						timer = timer + 7 + 7 + 21
					end
					if(shots == 2) then
						timer = timer + 7 + 21
					end
					if (shots == 1) then
						timer = timer + 21
					end
					text(x1,y1+8,timer)
				end
				if(direction == 1) then
					line(x1,y1+7,255,y1+7,"yellow")
					line(x1,y2-1,255,y2-1,"yellow")
				else
					line(0,y1+7,x2,y1+7,"yellow")
					line(0,y2-1,x2,y2-1,"yellow")
				end
			end

			if(stype == 29) then	--spirit conjurer/stalking spirit
				spritedisplay = 1
				hp = memory.readbyte(stuff+6+(i*16))
				timer1 = memory.readbyte(stuff+13+(i*16))
				timer2 = memory.readbyte(stuff+14+(i*16))
				if(phase == 2) then
					text(x1,y1+8,timer1+36)
				elseif(phase == 4) then
					text(x1,y1+8,((timer1-1)+((timer2-1)*6))+1)
				end
				if(phase <= 6) then
					text(x1,y1,hp)
				end
			end

			if(stype == 30) then	--Orbit Drone
				spritedisplay = 1
			end

			if(stype == 32) then	--Bone spears
				spritebox = 12
				spritedisplay = 1
				timer = memory.readbyte(stuff+13+(i*16))
				if(phase < 16) then
					text(x1,y2,timer)
				else
					text(x1,y1-8,timer)
				end
				if((phase == 2) or (phase == 16)) then
					box(x1,y1,x2,y2,"yellow")
				else
					box(x1,y1,x2,y2,"red")
				end
			end;	

			if (stype == 35) then	--Eletric Barriers
				count1 = memory.readbyte(stuff+11+(i*16))
				count2 = memory.readbyte(stuff+13+(i*16))
				if(count1 > 0) then
					text(x1,y1+8,((count1-1)*10)+count2)
				else
					box(x1,y1,x2,y2,"red")
				end
			end

			if (stype == 37) then	--Voltsphere
				spritebox = 12
				spritedisplay = 2
				box(x1,y1,x2,y2,"red")
				timer1 = memory.readbyte(stuff+13+(i*16))
				timer2 = memory.readbyte(stuff+11+(i*16))
				timer3 = 3 - ((phase / 2) - 1)
				if(phase <= 8) then
					text(x1,y1+8,((timer2-1)*4)+timer3+21)
				elseif (phase == 10) then
					text(x1,y1+8,timer1)
				elseif (phase == 12) then
					text(x1,y1+8,timer1+30+48+21)
				elseif (phase == 14) then
					text(x1,y1+8,timer1+48+21)
				elseif (phase == 16) then
					text(x1,y1+8,timer1+48+21)
				end
			end

			if (stype == 38 and demo == false) then	--To'skuuth
				spritebox = 12
				spritedisplay = 2
				count = memory.readbyte(stuff+13+(i*16))
				if((phase >= 8) and (phase <= 14)) then
					box(x1,y1,x2,y2,"red")
				else
					box(x1,y1,x2,y2,"yellow")
				end;
				local countoffset = { 28, count, count - 1, 36, 21, 1, 0, count + 70, count + 69, 70, 69 }
				text(x1,y1+8,count+countoffset[phase/2])
			end

			if (stype == 39) then	--Rune Spectre
				count1 = memory.readbyte(stuff+15+(i*16))
				count2 = memory.readbyte(stuff+13+(i*16))
				x2 = memory.readbyte(timmy[0])
				y2 = memory.readbyte(timmy[2]) + 24
				if (phase == 10) then
					line(x1+8,y1,x2+7,y2+7,"green")
				elseif ((phase == 12) or (phase == 14)) then
					line(x1+8,y1,x2+7,y2+7,"red")
				else
					line(x1+8,y1,x2+7,y2+7,"yellow")
				end
				if(phase <= 8) then
					if((phase == 2) or (phase == 6)) then
						offset = 1
					else
						offset = 0
					end
					text(x1,y1+8,((count1-1)*4)+count2+offset)
				elseif (phase == 10) then
					text(x1,y1+8,count2)
				end
			end

			if (stype == 41) then	--Timed Sprite spawner
				spritebox = 12
				timer1 = memory.readbyte(stuff+12+(i*16))
				timer2 = memory.readbyte(stuff+13+(i*16))
				if(phase < 6) then
					x1 = memory.readbyte(stuff+2+((i+1)*16))
					y1 = memory.readbyte(stuff+4+((i+1)*16)) + 24
					box(x1,y1,x1+15,y1+15,"yellow")
					text(x1,y1,((timer1-1)*60)+timer2)
				end
			end
			
			if (stype == 47) then	--Yeti
				spritebox = 12
				box(x1,y1,x2,y2,"red")
				if(phase == 14) then
					spritedisplay = 2
				end
			end

			if (stype == 50) then	--Spiked Crusher
				spritebox = 12
				type = memory.readbyte(stuff+15+(i*16))
				x3 = memory.readbyte(stuff+11+(i*16))
				y3 = memory.readbyte(stuff+12+(i*16)) + 24
				line(x3,y3,x3+15,y3+15,"yellow")
				line(x3+15,y3,x3,y3+15,"yellow")
				if ((type == 2) or (type == 6)) then
					line(x3,36,x3,y3,"yellow")
					line(x3,y3+15,x3,240,"yellow")
					line(x3+15,36,x3+15,y3,"yellow")
					line(x3+15,y3+15,x3+15,240,"yellow")
				end
				if ((type == 4) or (type == 6)) then
					line(0,y3,x3,y3,"yellow")
					line(x3+15,y3,256,y3,"yellow")
					line(0,y3+15,x3,y3+15,"yellow")
					line(x3+15,y3+15,256,y3+15,"yellow")
				end
				box(x1,y1,x2,y2,"red")
			end

			if (stype == 51) then	--Binary Zap minigame
				spritebox = 12
				if(i > 0) then
					local bdigits = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }
					if(bit.band(memory.readbyte(stuff+12),bdigits[i]) == bdigits[i]) then
						box(x1,0x50+24,x2,0xA0+24,"yellow")
						for j=0,4 do
							line(x1,0x50+24+(j*16),x2,0x60+24+(j*16),"yellow")
							line(x2,0x50+24+(j*16),x1,0x60+24+(j*16),"yellow")
						end
					end
					box(x1,y1,x2,y2,"red")
				end
			end

			if (stype == 64) then	--Portals
				spritebox = 12
				dx = memory.readbyte(stuff+11+(i*16))
				dy = memory.readbyte(stuff+12+(i*16))
				if((dx == 0x19) and (dy == 0)) then
					box(x1,y1,x2,y2,"red");	--This is the land of pointy things, at 25,00. don't want to go here :)
				else
					box(x1,y1,x2,y2,"green")
				end
			end

			if (stype == 65) then	--Simon says minigame
				spritebox = 12
				spritedisplay = 1
				if(i>=3) then
					correct_corner_offset = memory.readbyte(stuff+12+(2*16))
					corner = memory.readbyte(stuff+11+(i*16))
					if(corner == memory.readbyte(0x708 + correct_corner_offset)) then
						box(x1,y1,x2,y2,"green")
					else
						box(x1,y1,x2,y2,"red")
					end
				end
			end

			if (stype == 72) then	--Icicle
				spritedisplay = 1
				spritebox = 12
				box(x1,y1,x2,y2,"red")
				direction = memory.readbyte(stuff+12+(i*16))
				if(bit.band(direction,0xC0) == 0x00) then
					line(x1,y2,x1,240,"yellow")
					line(x2,y2,x2,240,"yellow")
				elseif(bit.band(direction,0xC0) == 0x40) then
					line(x2,y1,256,y1,"yellow")
					line(x2,y2,256,y2,"yellow")
				elseif(bit.band(direction,0xC0) == 0x80) then
					line(x1,y1,x1,40,"yellow")
					line(x2,y1,x2,40,"yellow")
				elseif(bit.band(direction,0xC0) == 0xC0) then
					line(x1,y1,0,y1,"yellow")
					line(x2,y2,0,y2,"yellow")
				end
			end

			if (stype == 98) then	-- This is only present in the Demo version.  In the full version, this sprite type
						-- does absolutely nothing, as it never leaves phase 0.
				if(phase > 0) then
					text(8,200,"Next room to the left will end this demo")
				end
			end
------------------------------ END OF SPRITE HANDLERS ----------------------------------------------------
			
		else	--Battle Kid: Fortress of Peril
		
------------------------------ BOSS HANDLERS ------------------------------------------------------		
         if ((stype == 36) or (stype == 110) or (stype == 138)) then   --Handle Lotus Gaurdian   (and Petunia of pain)
            if ((i==0) or (i==2)) then
               spritebox = 12
               box(x1,y1,x2,y2,"red");
            end;
         end;
         if ((stype == 114) or (stype == 70)) then   --Handle OwlBot
            if ((i == 4) or (i == 0)) then
               spritedisplay = 0;
            end;
            if (i == 4) then
               line(x2+1,y2,x2+1,224,"yellow");
               line(x2,y2,x2,224,"yellow");
            end;
            if (i == 1) then
               spritedisplay = 0;
               spritebox = 12;
               box(0,40,88,200,"red")
            end;
         end;
         if ((stype == 116) or (stype == 76)) then   --Handle Cleo
            if (i==0) then
               spritebox = 12
               box(x1,y1,x2,y2,"red");
            end;
            cleo = memory.readbyte(stuff + 15);
            if(cleo == 0) then
               text(128,8,"Red")
            end;
            if(cleo == 1) then
               text(128,8,"Blue")
            end;
            if(cleo == 2) then
               text(128,8,"Purple")
            end;
            if(cleo == 3) then
               text(128,8,"Pink")
            end;
            if(cleo == 4) then
               text(128,8,"Yellow")
            end;
            if(cleo == 5) then
               text(128,8,"Green")
            end;
         end;
         if (stype == 80) then   --Handle nagaconda displaying specifically.
            nagaconda = memory.readbyte(stuff+10+(i*16))
            if (i == 1) then
               spritebox = 12;
            end;
            if((i >= 2)) then
               spritedisplay = 1;
            end;
            if (i == 5) then
               spritedisplay = 3;
            end;
            if (i == 12) then
               if (nagaconda == 3) then
                  spritedisplay = 2;
               end;
            end;
         end;
         if (stype == 92) then   --Handle Seahorse Turret.
            seahorsenext = {2,3,1,0,0}
            seahorsefire = memory.readbyte(stuff+13)
            seahorsetimer = memory.readbyte(stuff+12)
            seahorsebullets = memory.readbyte(stuff+14)
            j = 0;
            if(seahorsebullets == 0) then
               seahorsefire = 3;
            end;
            while((j < 4) and (seahorsefire < 4)) do
               hp = memory.readbyte(stuff+5+((seahorsenext[seahorsefire+1]+1)*16))
               --text(128,24+(8*seahorsefire),hp);
               if (memory.readbyte(stuff+5+((seahorsenext[seahorsefire+1]+1)*16))==0) then
                  seahorsefire = seahorsefire - 1;
                  if(seahorsefire < 0) then
                     seahorsefire = 3;
                  end;
               else
                  break;
               end;
               j = j + 1;
            end;
            if(seahorsefire < 4) then   --Check that there is at least one seahorse turret still alive.
               spritezero = memory.readbyte(stuff)
               if (spritezero == 92) then
                  text(128,8,seahorsebullets/4);
               end;
               --text(128,8,seahorsefire);
               --text(128,16,seahorsenext[seahorsefire+1]);
               if ((i >= 1) and (i <= 5)) then
                  spritedisplay = 2;
               end;
               if ((i-1) == (seahorsenext[seahorsefire+1])) then
                  spritebox = 4;
                  text(x1,y1+10,seahorsetimer);
               else
                  spritebox = 0;
               end;
            end;
         end;
         if (stype == 96) then   --Handle Amethyst Angel
            if(i == 0) then
               spritedisplay = 0
            end;
            if(i == 1) then
               spritebox = 12;
            end;
            if(i == 2) then
               box(x1,y1,x2,y2,"red");
               corner = memory.readbyte(stuff+12+(i*16));
               x1 = 0
               y1 = 0
               x2 = 60
               y2 = 17
               if (corner == 0) then
                  box(x1+15,y1+84,x2+15,y2+84,"red");
               end;
               if (corner == 4) then
                  box(x1+180,y1+84,x2+180,y2+84,"red");
               end;
               if (corner == 8) then
                  box(x1+15,y1+148,x2+15,y2+148,"red");
               end;
               if (corner == 12) then
                  box(x1+180,y1+148,x2+180,y2+148,"red");
                  --box((11*16)+4,(8*16)+24-4,15*16,(9*16)+24-2,"red");
               end;
            end;
         end;
         if ((stype == 100) or (stype == 126)) then   --Handle Zedd
            if(i == 0) then
               spritedisplay = 0
               ZeddState = memory.readbyte(stuff+7+(i*16));
               if ((ZeddState >= 32) and (ZeddState <= 50)) then
                  --Freeze attack in middle of room
                  text(90,0,"Freeze Attack");
                  text(90,8,"Middle of Room");
                  box(112,32,143,169,"green")
               end;
               if ((ZeddState >= 88) and (ZeddState <= 102)) then
                  --Side to Side hopping
                  text(90,0,"Side to Side");
                  text(90,8,"hopping");
                  box(0,70+24,255,121+24,"green")
               end;
               if ((ZeddState >= 2) and (ZeddState <= 20)) then
                  --Teleporting
                  spriteone = memory.readbyte(stuff+8+(14*16))
                  spritetwo = memory.readbyte(stuff+8+(15*16))
                  if ((spriteone == 248) and (spritetwo == 248)) then
                     text(90,0,"Teleporting");
                  else
                     text(90,0,"Teleport Attack");
                  end;
               end;
               if ((ZeddState >= 56) and (ZeddState <= 84)) then
                  --Freeze Attack at end of room
                  text(90,0,"Freeze Attack");
                  text(90,8,"Side of Room");
                  x1 = memory.readbyte(stuff+2+(14*16));
                  x2 = memory.readbyte(stuff+3+(14*16));
                  y1 = memory.readbyte(stuff+4+(14*16)) + 24;
                  y2 = memory.readbyte(stuff+5+(14*16)) + 24;
                  x3 = memory.readbyte(stuff+2+(15*16));
                  x4 = memory.readbyte(stuff+3+(15*16));
                  y3 = memory.readbyte(stuff+4+(15*16)) + 24;
                  y4 = memory.readbyte(stuff+5+(15*16)) + 24;
                  spriteone = memory.readbyte(stuff+8+(14*16))
                  spritetwo = memory.readbyte(stuff+8+(15*16))
                  if ( (y2-y3) < 32 ) then
                     if ((spriteone < 248) and (spritetwo < 248)) then
                        box(1,32,255,y3-1,"green");
                     end;
                  else
                     box(1,y4+1,255,y1-1,"green");
                  end;
               end;
               if (ZeddState == 22) then
                  text(90,0,"Thinking");
               end;
            end;
            spritebox = 12
            box(x1,y1,x2,y2,"red");
            
         end;
         if ((stype == 106) or (stype == 128)) then   --Handle TY-524A4ET
            if(i == 0) then
               tyrantalive = memory.readbyte(stuff+8+(1*16))
               spritedisplay = 0
               if (tyrantalive < 248) then
                  TyrantState = memory.readbyte(stuff+7+(i*16));
                  pauseemu = true
                  if ((TyrantState >= 38) and (TyrantState <= 44)) then
                     pauseemu = false
                     missiles = memory.readbyte(stuff+13+(i*16)) + 1
                     if(missiles == 256) then
                        missiles = 0;
                     end;
                     text(90,0,"Missile Attack");
                     text(90,8,string.format("Missiles Left:%d",missiles));
                  end;
                  if ((TyrantState >= 0) and (TyrantState <= 4)) then
                     pauseemu = false
                     text(90,0,"Thinking - Manipulate");
                     text(90,8,"Luck Now");
                  end;
                  if ((TyrantState >= 6) and (TyrantState <= 18)) then
                     pauseemu = false
                     text(90,0,"Mass Laser");
                     text(90,8,"Flood Attack");
                  end;
                  if ((TyrantState >= 30) and (TyrantState <= 36)) then
                     pauseemu = false
                     text(90,0,"Bullet Attack");
                     bullets = memory.readbyte(stuff+13+(i*16));
                     text(90,8,string.format("Bullets Left: %d",bullets));
                  end;
                  if ((TyrantState >= 46) and (TyrantState <= 54)) then
                     pauseemu = false
                     text(90,0,"Fireball Attack");
                     if (TyrantState < 50) then
                        bullets = memory.readbyte(stuff+13+(i*16));
                        text(90,8,string.format("FireBalls Left: %d",bullets));
                     else
                        bullets = memory.readbyte(stuff+14+(i*16));
                        text(90,8,string.format("FireBalls Left: %d",bullets));
                     end;
                  end;
                  if ((TyrantState >= 20) and (TyrantState <= 28)) then
                     pauseemu = false
                     text(90,0,"Electric Spark Attack");
                     bullets = memory.readbyte(stuff+13+(i*16));
                     text(90,8,string.format("Sparks Left: %d",bullets));
                     for j=12,15 do
                        sparkexists = memory.readbyte(stuff+8+(j*16))
                        if (sparkexists < 248) then
                           sparktype = memory.readbyte(stuff+1+(j*16))
                           x1 = memory.readbyte(stuff+2+(j*16));
                           x2 = memory.readbyte(stuff+3+(j*16));
                           y1 = memory.readbyte(stuff+4+(j*16)) + 24;
                           y2 = memory.readbyte(stuff+5+(j*16)) + 24;
                           if ((sparktype == 24)) then
                              if (x1 == 202) then
                                 line(1,y2,255,y2,"yellow");
                              else
                                 line(x2-2,32,x2-2,223,"yellow");
                              end;
                           end;
                           if ((sparktype == 26) or (sparktype == 28))then
                              line(x2-2,32,x2-2,223,"yellow");
                           end;
                           if ((sparktype == 30) or (sparktype == 32)) then
                              line(1,y2,255,y2,"yellow");
                           end;
                        end;
                     end;
                  end;
                  if (pauseemu) then
                     --FCEU.pause();
                  end;
               end;
            end;
         end;
--End of Bosses


         if (stype == 4) then   --Lethal Lemons and Life Stealin Limes
            if (i<3) then
               subtype = memory.readbyte(stuff+1+(i*16));
               if (subtype < 8) then
                  line(x1+3,y1,x1+3,248,"yellow");
                  line(x2+3,y1,x2+3,248,"yellow");
               else
                  line(x1+3,y2,x1+3,40,"yellow");
                  line(x2+3,y2,x2+3,40,"yellow");
               end;
            end;
         end;
         if (stype == 38) then   --Sniper Snail
            line(1,y2,255,y2,"yellow");
            line(1,y1+1,255,y1+1,"yellow");
         end;
         if (stype == 60) then   --Homing Drone
            sstate = memory.readbyte(stuff+1+(i*16));
            if (sstate == 2) then
               line(x2,y2,x2-(224-y2)/2,224,"yellow");
               line(x1,y2,x1+(224-y2)/2,224,"yellow");
               line(x2,y1,x2-((y1-32)/2),32,"yellow");
               line(x1,y1,x1+((y1-32)/2),32,"yellow");
            else
               line(1,y2,255,y2,"yellow");
            end;
         end;
         if (stype == 48) then   --Handle the spawn points.
            spritebox = 12
            for j=3,15 do
               x3 = memory.readbyte(stuff+2+(j*16));
               x4 = memory.readbyte(stuff+3+(j*16));
               y3 = memory.readbyte(stuff+4+(j*16)) + 24;
               y4 = memory.readbyte(stuff+5+(j*16)) + 24;
               if ((x1 == x3) and (x2 == x4) and (y1 == y3) and (y2 == y4)) then
                  timer = memory.readbyte(stuff+12+(j*16));
                  text(x1+4,y1+4,timer);
                  box(x1,y1,x1+16,y1+16,"yellow");
               end;
            end;
         end;   
         if (stype == 78) then   -- spike traps (todo, get official name)
            subtype = memory.readbyte(stuff+11+(i*16));
            if (subtype == 0) then   --Horizontal
               line(1,y1,255,y1,"yellow");
               line(1,y2,255,y2,"yellow");
            else   --Vertical
               line(x1,32,x1,224,"yellow");
               line(x2,32,x2,224,"yellow");
            end;
         end;
		end;	--end of version branching
		
		limit = 8
		if (version == 1) then
			limit = 3
		end
		if((spriteexists < 248) or (i < limit)) then
				if ((spriteexists == 248) and (i < limit)) then
					spriteexists = memory.readbyte(stuff+7+(i*16))
				end
				if((spriteexists < 248)) then
					-- if((stype ~= 15) and (stype ~= 40) and (stype ~= 41)) then
					if(bit.band(spriteflags,0x40) ~= 0x40) then
						if (x2 <= x1) then
							x2 = x1 + 15
						end
						if (y2 <= x1) then
							y2 = y1 + 15
						end
					end
					
					if (enable_debug_code == 1) then
						if (stype>0) then
							text(1,8+(i*8),stype);	--Debug info on sprite identifier.
							text(26, 8+(i*8),spritedisplay)
							text(34, 8+(i*8),spritebox)
						end
					end
					
					if (version ~= 2 and stype == 22) then --Blinking spike room, display the phase counters in a visible spot.
						phase = memory.readbyte(stuff+12+(i*16));
						text(128,8,phase);
						phase = memory.readbyte(stuff+13+(i*16));
						text(128,16,phase);
					end;
					
					if ((spritedisplay == 0) or (spritedisplay == 2)) then
						if (version < 3) then
							hp = memory.readbyte(stuff+6+(i*16))
						else
							hp = memory.readbyte(stuff+10+(i*16))
						end
						if (hp > 0) then
							text(x1+1,y1+1,hp)
						end
					end
					if ((spritedisplay == 0) or (spritedisplay == 3)) then
						if (version == 2) then
							timer = memory.readbyte(stuff+13+(i*16))
							if(timer > 0) then
								text(x1,y1+8,timer)
							end
						else
							if(stype == 74) then   --Colormancers use 14/12 for their attack counters.
								phase = memory.readbyte(stuff+14+(i*16))
							else
								phase = memory.readbyte(stuff+12+(i*16));
							end;
							if(phase > 0) then
								text(x1,y1+8,phase);
							end;
							if(phase == 0) then
								if(stype == 74) then
									phase = memory.readbyte(stuff+12+(i*16))
								else
									phase = memory.readbyte(stuff+13+(i*16));
								end;
								if(phase > 0) then
									text(x1,y1+8,phase);
								end;
							end;
						end
					end
					if(spritebox == 0) then
						box(x1,y1,x2,y2,"red")
					end
					if(spritebox == 4) then
						box(x1,y1,x2,y2,"yellow")
					end
					if(spritebox == 8) then
						box(x1,y1,x2,y2,"green")
					end
					--if((enable_debug_code == 1) and (spritebox == 12)) then
					--	box(x1,y1,x2,y2,"red")
					--	box(x1+1,y1+1,x2-1,y2-1,"green")
					--end
				end
			end
		end	
	end

	if ((enable_hud_info == 1) and (gameaction == 1)) then
			
		xlocAddr = xlocSet[version]
		ylocAddr = ylocSet[version]
		jleftAddr = jleftSet[version]
		jtotalAddr = jtotalSet[version]
		if (demo == true) then
			xlocAddr = xlocAddr - version
			ylocAddr = ylocAddr - version
			jleftAddr = jleftAddr - version
			jtotalAddr = jtotalAddr - version
		end		
		
		xloc = memory.readbyte(xlocAddr)
		yloc = memory.readbyte(ylocAddr) / 2
		text(210,8,string.format("Room:%02d,%02d ",xloc,yloc))
				
		jumpsleft = memory.readbyte(jleftAddr)
		jumpstotal = memory.readbyte(jtotalAddr)		
		if (demo == false or version == 1) then
			text(35,16,string.format("Jumps:%d/%d",jumpsleft,jumpstotal))
		end
		
		if (version == 1) then
			portals = memory.readbyte(0x8A)
			if (bit.band(portals,0x01) == 0x01) then
				PortalA = 0x31
			else
				PortalA = 0x5F
			end;
			if (bit.band(portals,0x02) == 0x02) then
				PortalB = 0x32
			else
				PortalB = 0x5F
			end;
			if (bit.band(portals,0x04) == 0x04) then
				PortalC = 0x33
			else
				PortalC = 0x5F
			end;
			if (bit.band(portals,0x08) == 0x08) then
				PortalD = 0x34
			else
				PortalD = 0x5F
			end;
			if (bit.band(portals,0x10) == 0x10) then
				PortalE = 0x35
			else
				PortalE = 0x5F
			end;
			text(88,8,string.format("TP:%c%c%c%c%c",PortalA,PortalB,PortalC,PortalD,PortalE))
		elseif (version == 2) then
			accelAddr = accelSet[version]
			runspeedAddr = runspeedSet[version]
			if (demo == true) then
				accelAddr = 0x5F
				runspeedAddr = 0x5E
			end		
			acceleration = memory.readbyte(accelAddr)
			runspeed = memory.readbyte(runspeedAddr)
			if(acceleration > 127) then
				acceleration = bit.band(bit.bnot(acceleration),0xFF) + 1
				text(88,8,string.format("Fall Rate:-%d pixels/frame",acceleration))
			else
				text(88,8,string.format("Fall Rate: %d pixels/frame",acceleration))
			end
			if((runspeed >= 0) and (runspeed <= 127)) then
				current_run_direction = 0
			elseif (runspeed > 127) then
				runspeed = bit.band(bit.bnot(runspeed),0xFF) + 1
				current_run_direction = 1
			end
			if(current_run_direction == 1) then
				text(88,16,string.format("Run speed:-%d pixels/frame",runspeed))
			else
				text(88,16,string.format("Run speed: %d pixels/frame",runspeed))
			end
		end

		--hidden for now
		--[[
		timer_msec = memory.readbyte(0xC2)
		timer_sec = memory.readbyte(0xC3)
		timer_min = memory.readbyte(0xC4)
		timer_hour = memory.readbyte(0xC5)

		local msec_timer = { 0,1,3,5,6,8,
					10,11,13,15,16,18,
					20,21,23,25,26,28,
					30,31,33,35,36,38,
					40,41,43,45,46,48,
					50,51,53,55,56,58,
					60,61,63,65,66,68,
					70,71,73,75,76,78,
					80,81,83,85,86,88,
					90,91,93,95,96,98,
					99,}

		if (enable_tas_info ~= 1) then	--No point in showing this in a TAS, as we won't be dying. :)
			deaths = memory.readbyte(0x72) + (memory.readbyte(0x73) * 256)
			text(108,8,string.format("DEATHS: %d",deaths))
		end
		if ((timer_msec + timer_sec + timer_min + timer_hour) > 0) then
			text(108,16,string.format("%.2d:%.2d:%.2d:%.2d",timer_hour,59-timer_min,59-timer_sec,msec_timer[60-timer_msec+1]))
		end
		--]]
		
	end

	if ((enable_tas_info == 1) and (movie.isloaded())) then
		if(framecounter >= end_avi) then
			FCEU.pause()
		end
		if((framecounter >= info_1) and (framecounter <= (info_1+info_frames))) then
			text(32,32,"Battle Kid 2: Mountain of Torment")
			movie_frames = (movie.length() % frame_rate)
			movie_seconds = ((movie.length() % frames_per_minute) - movie_frames) / frame_rate
			movie_minutes = (movie.length() - (movie.length() % frames_per_minute)) / frames_per_minute
			text(32,40,string.format("%s in %02d:%02d.%02d by %s",info_1_string,movie_minutes,movie_seconds,(movie_frames*100)/60,info_1_author))
			text(32,48,string.format("%d Rerecords",movie.rerecordcount()))
		end

		if((framecounter >= info_2) and (framecounter <= (info_2+info_frames))) then
			text(32,32,"This is a Tool Assisted Recording.")
			text(32,40,"For more Info, Go to TASVideos.org")
		end
		if((framecounter >= movie.length()) and (framecounter <= (movie.length() + info_frames))) then
			text(8,200,"Movie Finished Playing")
		end
	end
end

--version detection
memory.usememorydomain("PRG ROM");
local cart = memory.readbyte(0x01)
memory.usememorydomain("RAM");
if (cart == 133) then
	version = 1
	demo = true
elseif (cart == 168) then
	version = 1
	demo = false
elseif (cart == 24) then
	version = 2
	demo = true
elseif (cart == 128) then
	version = 2
	demo = false
else 
	version = 3
end

if(movie.isloaded() and (enable_tas_info == 1)) then
	movie.playbeginning()
end

while (true) do
	battlekidloop()
	emu.frameadvance()
end;