// ----------------------------------
// RSDK Project: Sonic 1/Sonic 2
// Script Description: Sonic Team Object
// Script Author: Christan Whitehead/Simon Thomley
// Unpacked by Rubberduckycooly's script unpacker
// ----------------------------------

//-------Aliases-------//

private alias 175 : game.modes.alpha

private alias object.value0 : fade.control
private alias object.value1 : char.select
private alias object.value2 : zigzag.pos
private alias object.value3 : title.scroll
private alias object.value4 : arcade.offset
private alias object.value5 : arrow.flash
private alias object.value6 : ring.timer
private alias object.value7 : ring.frame
private alias object.value8 : hold.time

// Function declarations
reserve function ScoreOrder
reserve function ArcadeOffsetting
reserve function menu.holdmovement

// Static Values
// Tables
private table Arcade_table0
	0x6060A0, 0x80A0E0, 0xE08000, 0xE0C080, 0xA04000, 0x600000, 0xE02080, 0xE00040, 0x800000, 0x806080, 0xA08060, 0xE0C0A0, 0x80A0A0, 0xA04020
end table

private table Arcade_table1
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0 
end table

private table Arcade_table2
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0 
end table

private table Arcade_table3
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0 
end table

function menu.holdmovement
		if inputDown.up == 1
			hold.time++
			if hold.time >= 20
				inputPress.up = 1
				hold.time = 12
			end if
		else	
			if inputDown.down == 1
				hold.time++
				if hold.time >= 20
					inputPress.down = 1
					hold.time = 12
				end if
			else
				if inputDown.right == 1
					hold.time++
					if hold.time >= 20
						inputPress.right = 1
						hold.time = 12
					end if		
				else
					if inputDown.left == 1
						hold.time++
						if hold.time >= 20
							inputPress.left = 1
							hold.time = 12
						end if		
					else
						hold.time = 0
					end if
				end if
			end if
		end if
end function 


event ObjectMain
		CallFunction(menu.holdmovement)
		switch object.state
			case 2 //Character Select			
				if inputPress.right == 1
					char.select++
					PlaySfx(SfxName[Score Add], 0)
				else
					if inputPress.left == 1
						char.select--
						PlaySfx(SfxName[Score Add], 0)
					end if
				end if
				while char.select < 0
					char.select += 3
				loop
				char.select %= 3
				
				CheckEqual(inputPress.start, 1)
				temp0 = checkResult
				CheckEqual(inputPress.buttonA, 1)
				temp0 |= checkResult
				if temp0 == 1
					object.state = 5
					PlaySfx(SfxName[Ring L], 0)
				end if
				
				if inputPress.buttonB == 1
					object.state = 4
				end if
				
				break
			case 3 //Waiting to Start
				CheckEqual(inputPress.start, 1)
				temp0 = checkResult
				CheckEqual(inputPress.buttonA, 1)
				temp0 |= checkResult
				if temp0 == 1
					object.state = 5
					PlaySfx(SfxName[Ring L], 0)
				end if
				
				if inputPress.buttonB == 1
					object.state = 2
				end if
				break
			case 6 //Outro
				CheckEqual(inputPress.start, 1)
				temp0 = checkResult
				CheckEqual(inputPress.buttonA, 1)
				temp0 |= checkResult
				if temp0 == 1
					
					object.state = 2
					player.score = 0
				end if
				break		
		end switch
end event



event ObjectDraw		
		CallFunction(ArcadeOffsetting)
		switch object.state
		
		//Fade in/out
		case 0 //Setup
			screen.xoffset = 0
			object.priority = PRIORITY_ACTIVE
			fade.control = 256
			stage[0].activeLayer = 1
			object.state++
			SetScreenFade(0, 0, 0, 255)
			break
		case 1 //Fade in
			if fade.control > 0
				fade.control -= 16
			else
				PlayMusic(0)
				if player.score == 0
					object.state++
				else
					object.state = 6
				end if
			end if
			SetScreenFade(0, 0, 0, fade.control)
			break
		case 2 //Character Select
		case 3 //Waiting to Start
		case 6 //Outro
			fade.control = 0
			break
		case 4 //Fade out to exit
			if fade.control < 320
				fade.control += 16
				music.volume -= 2
			else
				StopMusic()
				stage.activeList = PRESENTATION_STAGE
				stage.listPos = 6
				saveRAM[620] = char.select
				WriteSaveRAM()
				LoadStage()
			end if
			SetScreenFade(0, 0, 0, fade.control)
			break
		case 5 //Fade out to Emerald Hill
			if fade.control < 320
				fade.control += 16
				music.volume -= 2
			else
				StopMusic()
				stage.activeList = REGULAR_STAGE
				stage.listPos = 0
				credits.screen = 0
				stage.debugMode = 0
				options.stageSelectFlag = 0
				options.gameMode = 3
				options.attractMode = 0
				player.lives = 1
				player.continues = 0
				player.score = 0
				player.scoreBonus = 10000000
				stage.player2Enabled = 0
				starPostID = 0
				specialStage.listPos = 0
				specialStage.emeralds = 0
				specialStage.nextZone = 0
				stage.playerListPos = char.select
				saveRAM[620] = char.select
				WriteSaveRAM()
				LoadStage()
			end if
			SetScreenFade(0, 0, 0, fade.control)
			break
		end switch
		
		//Background
		//White Back
		DrawRect(0, 0, screen.xsize, screen.ysize, 255, 255, 255, 255)
		
		//Moving Lines
		temp0 = zigzag.pos
		temp0 /= 3
		FlipSign(temp0)
		temp0 += screen.xsize
		temp0 -= 120
		temp1 = screen.ysize
		temp1 += 20
		temp1 += zigzag.pos		
		while temp1 > 0
			DrawSpriteScreenXY(14, temp0, temp1)
			temp0 += 4
			temp1 -= 14
		loop
		
		//Top Zigzag
		temp0 = zigzag.pos
		temp0 -= 20
		while temp0 < screen.xsize
			DrawSpriteScreenXY(10, temp0, 0)
			temp0 += 14
		loop
		zigzag.pos--
		if zigzag.pos < 0
			zigzag.pos = 13
		end if
		
		//Side Bar
		DrawRect(0, 0, 10, screen.ysize, 0, 0, 0, 255)
		DrawSpriteScreenXY(11, 0, 0)
		DrawSpriteScreenXY(12, 0, 0)
		DrawSpriteScreenXY(13, 0, 0)
		
		//Scrolling Title
		temp0 = screen.xsize
		temp0 += title.scroll
		while temp0 > 0
			temp0 -= 760
			DrawSpriteScreenXY(15, temp0, 0)
			DrawSpriteScreenXY(16, temp0, 0)
			DrawSpriteScreenXY(17, temp0, 0)
			DrawSpriteScreenXY(18, temp0, 0)
			DrawSpriteScreenXY(19, temp0, 0)
			DrawSpriteScreenXY(20, temp0, 0)
			DrawSpriteScreenXY(21, temp0, 0)
			DrawSpriteScreenXY(22, temp0, 0)
		loop
		title.scroll++
		title.scroll %= 760
		
		//Records		
		//Base
		temp0 = arcade.offset
		FlipSign(temp0)
		DrawSpriteScreenXY(24, temp0, screen.ysize)
		DrawSpriteScreenXY(23, temp0, screen.ysize)
		
		//Ranks	
		temp1 = temp0
		temp1 += 12
		DrawSpriteScreenXY(25, temp1, 23)
		temp1 += 52
		DrawSpriteScreenXY(26, temp1, 23)
		temp1 += 60
		DrawSpriteScreenXY(27, temp1, 23)
		temp1 += 64
		DrawSpriteScreenXY(28, temp1, 23)
		
		temp2 = 1
		temp3 = 41
		while temp2 < 10
			temp1 = temp0
			temp1 += 24
			
			switch temp2
				case 1
				case 2
				case 3
					DrawNumbers(32, temp1, temp3, temp2, 1, 8, 0)
					break
				default
					DrawNumbers(0, temp1, temp3, temp2, 1, 8, 0)
					break
			end switch
			
			arrayPos0 = temp2
			arrayPos0 += 620
			temp1 += 76
			temp5 = saveRAM[arrayPos0]
			if saveRAM[arrayPos0] >= 1000000			
				DrawNumbers(0, temp1, temp3, saveRAM[arrayPos0], 7, 8, 1)
			else
				DrawNumbers(0, temp1, temp3, saveRAM[arrayPos0], 6, 8, 1)
			end if
			arrayPos0 += 10
			temp4 = saveRAM[arrayPos0]
			temp4 += 29
			temp1 += 40
			DrawSpriteScreenXY(temp4, temp1, temp3)
			
			if temp5 == 0
				temp1 += 60
				DrawSpriteScreenXY(48, temp1, temp3)
			else
				temp1 += 48
				arrayPos0 += 10				
				temp4 = saveRAM[arrayPos0]
				switch temp4
					case 0
					case 1	
						DrawSpriteScreenXY(36, temp1, temp3)
						break
					case 2
					case 3
						DrawSpriteScreenXY(37, temp1, temp3)
						break
					case 4
					case 5
						DrawSpriteScreenXY(38, temp1, temp3)
						break
					case 6
					case 7
						DrawSpriteScreenXY(39, temp1, temp3)
						break
					case 8
					case 9
						DrawSpriteScreenXY(40, temp1, temp3)
						break
					case 10
					case 11
						DrawSpriteScreenXY(41, temp1, temp3)
						break
					case 12
					case 13
						DrawSpriteScreenXY(42, temp1, temp3)
						break
					case 14
					case 15
					case 16
						DrawSpriteScreenXY(43, temp1, temp3)
						break
					case 17
						DrawSpriteScreenXY(44, temp1, temp3)
						break
					case 18
						DrawSpriteScreenXY(45, temp1, temp3)
						break
					case 19
						DrawSpriteScreenXY(46, temp1, temp3)
						break
					case 20
						DrawSpriteScreenXY(47, temp1, temp3)
						break					
				end switch
				switch temp4
					case 0
					case 2
					case 4
					case 6
					case 8
					case 10
					case 12
					case 14
						temp1 += 24
						DrawNumbers(0, temp1, temp3, 1, 1, 8, 0)
						break
					case 1
					case 3
					case 5
					case 7
					case 9
					case 11
					case 13
					case 15
						temp1 += 24
						DrawNumbers(0, temp1, temp3, 2, 1, 8, 0)
						break
					case 16
						temp1 += 24
						DrawNumbers(0, temp1, temp3, 3, 1, 8, 0)
						break
				end switch
			end if		
			
			temp3 += 15
			temp2++
		loop		
		
		//Character Select
		temp3 = arcade.offset
		temp3 += screen.xsize
		DrawSpriteScreenXY(78, temp3, 53)
		temp3 -= 106
		temp0 = char.select	
		temp0 += 52
		DrawSpriteScreenXY(temp0, temp3, screen.ycenter)
		temp0 -= 3
		DrawSpriteScreenXY(temp0, temp3, screen.ycenter)
		temp0 +=30
		temp3 += 106
		DrawSpriteScreenXY(temp0, temp3, 53)

		//arrows
		temp3=245
		temp3 += arcade.offset
		DrawSpriteScreenXY(82, temp3, screen.ycenter)
		DrawSpriteScreenXY(83, temp3, screen.ycenter)

		//Insert Ring
		temp0 = screen.xsize
		temp0 += arcade.offset
		temp1 = screen.ysize
		temp2 = 69
				ring.timer++
				if ring.timer >= 4
					ring.timer = 0
					ring.frame++
					ring.frame %= 8
				end if
		DrawSpriteScreenXY(temp2, temp0, temp1)
		temp0 -= 22
		temp1 -= 14
		temp2++
		temp2 += ring.frame
		DrawSpriteScreenXY(temp2, temp0, temp1)
		
		//Outro
		temp0 = screen.xsize
		temp0 += 75
		temp0 -= arcade.offset
		DrawSpriteScreenXY(55, screen.xcenter, temp0)
		temp1 = screen.xcenter
		temp1 -= 97
		temp0 += 70
		DrawSpriteScreenXY(56, temp1, temp0)
			temp1 += 186
		DrawNumbers(58, temp1, temp0, player.score, 6, 8, 0)
		temp0 += 20
		temp1 -= 186
		DrawSpriteScreenXY(57, temp1, temp0)
		temp1 += 186
		arrayPos0 = 621
		temp2 = 1
		temp3 = 20
		while temp2 < 10
			if player.score == saveRAM[arrayPos0]
				temp3 = temp2
			end if
			arrayPos0++
			temp2++
		loop
		if temp3 == 20
			DrawSpriteScreenXY(68, temp1, temp0)
		else
			DrawNumbers(58, temp1, temp0, temp3, 6, 8, 0)
		end if
end event





event ObjectStartup
	recRings = 0
	recShield = 0
	recRingBonus = 0
	recGoggles = 0
	
	foreach (TypeName[Arcade], arrayPos0, ALL_ENTITIES)
		object[arrayPos0].type = TypeName[Blank Object]
		ResetObjectEntity(5, TypeName[Arcade], 0, 0, 0)
		object[5].value1 = saveRAM[620]
		object[5].priority = PRIORITY_ACTIVE
		if player.score > 0
			object[5].value4 = screen.xsize
		else
			object[5].value4 = 0
		end if
	next
	
	LoadSpriteSheet("Menus/Arcade.gif")
	ReadSaveRAM()
	CallFunction(ScoreOrder)
	
	//Numbers First
	SpriteFrame(0, 0, 8, 7, 157, 20) //0
	SpriteFrame(0, 0, 8, 7, 165, 20) //1
	SpriteFrame(0, 0, 8, 7, 173, 20) //2
	SpriteFrame(0, 0, 8, 7, 181, 20) //3
	SpriteFrame(0, 0, 8, 7, 189, 20) //4
	SpriteFrame(0, 0, 8, 7, 197, 20) //5
	SpriteFrame(0, 0, 8, 7, 205, 20) //6
	SpriteFrame(0, 0, 8, 7, 213, 20) //7
	SpriteFrame(0, 0, 8, 7, 221, 20) //8
	SpriteFrame(0, 0, 8, 7, 229, 20) //9
	
	//Background Elements
	SpriteFrame(0, 0, 14, 18, 1, 1) //10 Top zigzags
	SpriteFrame(0, 43, 12, 4, 1, 28) //11 Gold Edging
	SpriteFrame(0, 58, 12, 4, 1, 33) //12 Silver Edging
	SpriteFrame(0, 73, 12, 4, 1, 38) //13 Bronze Edging	
	SpriteFrame(0, 0, 34, 10, 94, 28) //14 BG lines
	temp0 = 0
	SpriteFrame(temp0, 5, 91, 5, 16, 1) //15 Arcade Mode White
	temp0 += 95
	SpriteFrame(temp0, 5, 91, 5, 16, 7) //16 Arcade Mode 2
	temp0 += 95
	SpriteFrame(temp0, 5, 91, 5, 16, 13) //17 Arcade Mode 3
	temp0 += 95
	SpriteFrame(temp0, 5, 91, 5, 108, 1) //18 Arcade Mode 4
	temp0 += 95
	SpriteFrame(temp0, 5, 91, 5, 108, 7) //19 Arcade Mode Black
	temp0 += 95
	SpriteFrame(temp0, 5, 91, 5, 108, 1) //20 Arcade Mode 4
	temp0 += 95
	SpriteFrame(temp0, 5, 91, 5, 16, 13) //21 Arcade Mode 3
	temp0 += 95
	SpriteFrame(temp0, 5, 91, 5, 16, 7) //22 Arcade Mode 2
	
	//Ranks
	SpriteFrame(0, -71, 285, 71, 1, 90) //23 Large Blue Arrow
	SpriteFrame(99, -71, 237, 71, 1, 162) //24 Large Yellow Arrow
	SpriteFrame(0, 0, 32, 7, 1, 20) //25 Rank Heading
	SpriteFrame(0, 0, 40, 7, 34, 20) //26 Score Heading
	SpriteFrame(0, 0, 48, 7, 75, 20) //27 Player Heading
	SpriteFrame(0, 0, 32, 7, 124, 20) //28 Last Heading
	
	//Character Heads
	SpriteFrame(0, -3, 15, 14, 78, 27) //29  Empty	
	SpriteFrame(0, -3, 15, 14, 33, 27) //30  Sonic
	SpriteFrame(2, -3, 13, 13, 49, 28) //31  Tails
	SpriteFrame(0, -3, 16, 13, 62, 28) //32  Knuckles
	
	//Medals
	SpriteFrame(-9, -4, 26, 16, 1, 43) //33 Gold
	SpriteFrame(-8, -3, 24, 14, 1, 60) //34 Silver
	SpriteFrame(-7, -3, 22, 14, 1, 75) //35 Bronze
	
	//Zone Names
	SpriteFrame(0, 0, 24, 7, 157, 28) //36 EHZ
	SpriteFrame(0, 0, 24, 7, 182, 28) //37 CPZ
	SpriteFrame(0, 0, 24, 7, 207, 28) //38 ARZ
	SpriteFrame(0, 0, 24, 7, 232, 28) //39 CNZ
	SpriteFrame(0, 0, 24, 7, 257, 28) //40 HTZ
	SpriteFrame(0, 0, 24, 7, 157, 36) //41 MCZ
	SpriteFrame(0, 0, 24, 7, 182, 36) //42 OOZ
	SpriteFrame(0, 0, 24, 7, 207, 36) //43 MPZ
	SpriteFrame(0, 0, 24, 7, 232, 36) //44 SCZ
	SpriteFrame(0, 0, 24, 7, 257, 36) //45 WFZ
	SpriteFrame(0, 0, 24, 7, 157, 44) //46 DEZ
	SpriteFrame(0, 0, 24, 7, 182, 44) //47 END	
	SpriteFrame(0, 2, 8, 3, 207, 44) //48 dash
	
	//Character Select
	SpriteFrame(-75, -66, 151, 132, 1, 246) //49 Sonic
	SpriteFrame(-63, -64, 126, 128, 153, 246) //50 Tails
	SpriteFrame(-100, -64, 200, 129, 280, 246) //51 Knuckles
	
	SpriteFrame(-70, -61, 151, 132, 1, 379) //52 Sonic Negative
	SpriteFrame(-58, -61, 126, 128, 153, 379) //53 Tails Negative
	SpriteFrame(-95, -61, 200, 129, 280, 379) //54 Knuckles Negative
	
	//Outro
	SpriteFrame(-104, 0, 207, 16, 287, 90) //55 Final Results
	SpriteFrame(0, -2, 90, 16, 287, 107) //56 Score
	SpriteFrame(0, -2, 39, 16, 287, 124) //57 Rank
	
	//Result Numbers
	SpriteFrame(0, 0, 8, 11, 239, 162) //58 0
	SpriteFrame(0, 0, 8, 11, 248, 162) //1
	SpriteFrame(0, 0, 8, 11, 257, 162) //2
	SpriteFrame(0, 0, 8, 11, 266, 162) //3
	SpriteFrame(0, 0, 8, 11, 239, 174) //4
	SpriteFrame(0, 0, 8, 11, 248, 174) //5
	SpriteFrame(0, 0, 8, 11, 257, 174) //6
	SpriteFrame(0, 0, 8, 11, 266, 174) //7
	SpriteFrame(0, 0, 8, 11, 239, 186) //8
	SpriteFrame(0, 0, 8, 11, 248, 186) //9
	SpriteFrame(0, 0, 8, 11, 257, 186) //68 dash

	//Insert Ring
	SpriteFrame(-145, -29, 147, 29, 327, 192) //69 Ring Frame
	SpriteFrame(-3, -9, 18, 18, 327, 173) //70 Ring0
	SpriteFrame(-2, -9, 16, 18, 346, 173) //71 Ring1
	SpriteFrame(-1, -9, 14, 18, 363, 173) //72 Ring2
	SpriteFrame(1, -9, 10, 18, 378, 173) //73 Ring3
	SpriteFrame(2, -9, 8, 18, 389, 173) //74 Ring4
	SpriteFrame(1, -9, 10, 18, 398, 173) //75 Ring5
	SpriteFrame(-1, -9, 14, 18, 409, 173) //76 Ring6
	SpriteFrame(-2, -9, 16, 18, 424, 173) //77 Ring7

	//Character Menu
	SpriteFrame(-60, -35, 60, 24, 28, 67) //78 Grey Bois
	SpriteFrame(-60, -35, 17, 24, 28, 43) //79 Sonic Highlighted
	SpriteFrame(-40, -35, 16, 23, 62, 43) //80 Tails Highlighted
	SpriteFrame(-20, -35, 17, 24, 96, 43) //81 Knuckles Highlighted

	SpriteFrame(0, -58, 22,7, 89, 67)  //82 Left Arrow
	SpriteFrame(145, 65, 22,7, 89, 75)  //83 Right Arrow
	
	
	
	SetMusicTrack("Arcade.ogg", 0, 1)
	
	//from logo - background
	temp0 = 208
	temp1 = 0
	while temp1 < 14
		GetTableValue(temp2, temp1, Arcade_table0)
		SetPaletteEntry(0, temp0, temp2)
		temp0++
		temp1++
	loop
end event




function ArcadeOffsetting
	switch object.state
		case 2
		case 3
		case 4
		case 5
			if arcade.offset > 0
				arcade.offset -= 20
			end if
			if arcade.offset < 0
				arcade.offset = 0
			end if
			break
		case 6
			if arcade.offset < screen.xsize
				arcade.offset += 20
			end if
			if arcade.offset > screen.xsize
				arcade.offset = screen.xsize
			end if
			break
	end switch
	

end function





function ScoreOrder
	arrayPos0 = 621
	arrayPos1 = 631
	arrayPos2 = 641
	
	temp0 = 0
	while temp0 < 10
		SetTableValue(saveRAM[arrayPos0], temp0, Arcade_table1)
		SetTableValue(saveRAM[arrayPos1], temp0, Arcade_table2)
		SetTableValue(saveRAM[arrayPos2], temp0, Arcade_table3)
		
		temp0++
		arrayPos0++
		arrayPos1++
		arrayPos2++
	loop
	
	temp0 = 0
	while temp0 < 10
		temp1 = temp0
		temp1++
		while temp1 < 10
			GetTableValue(temp6, temp0, Arcade_table1)
			GetTableValue(temp7, temp1, Arcade_table1)
			if temp6 < temp7
				temp5 = temp6
				temp6 = temp7
				temp7 = temp5
				SetTableValue(temp6, temp0, Arcade_table1)
				SetTableValue(temp7, temp1, Arcade_table1)
				GetTableValue(temp6, temp0, Arcade_table2)
				GetTableValue(temp7, temp1, Arcade_table2)
				temp5 = temp6
				temp6 = temp7
				temp7 = temp5
				SetTableValue(temp6, temp0, Arcade_table2)
				SetTableValue(temp7, temp1, Arcade_table2)
				GetTableValue(temp6, temp0, Arcade_table3)
				GetTableValue(temp7, temp1, Arcade_table3)
				temp5 = temp6
				temp6 = temp7
				temp7 = temp5
				SetTableValue(temp6, temp0, Arcade_table3)
				SetTableValue(temp7, temp1, Arcade_table3)
			end if			
			temp1++
		loop
		temp0++
	loop
	
	arrayPos0 = 621
	arrayPos1 = 631
	arrayPos2 = 641
	temp0 = 0
	while temp0 < 10
		GetTableValue(saveRAM[arrayPos0], temp0, Arcade_table1)
		GetTableValue(saveRAM[arrayPos1], temp0, Arcade_table2)
		GetTableValue(saveRAM[arrayPos2], temp0, Arcade_table3)
		
		temp0++
		arrayPos0++
		arrayPos1++
		arrayPos2++
	loop
	WriteSaveRAM()
end function


event RSDKDraw
	DrawSprite(0)
end event

event RSDKLoad
	LoadSpriteSheet("Global/Display.gif")
	SpriteFrame(-16, -16, 32, 32, 1, 143)
end event
