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

//-------Aliases-------//
private alias 8 : TYPE_ACTFINISH


// Static Values

// Tables

event ObjectMain
	switch object.state
	case 0
		stage.pauseEnabled = 0
		object.drawOrder = 6
		if object.priority != PRIORITY_ACTIVE_PAUSED
			object.priority = PRIORITY_ACTIVE
		end if
		object.value1 = -384
		object.value2 = 384
		object.value3 = 640
		object.value4 = 656
		object.value5 = 672
		object.value6 = 688
		switch stage.minutes
		case 0
			if stage.seconds < 30
				object.value7 = 0xC350
			else
				if stage.seconds < 45
					object.value7 = 0x2710
				else
					object.value7 = 0x1388
				end if
			end if
			break
		case 1
			if stage.seconds < 30
				object.value7 = 0xFA0
			else
				object.value7 = 0xBB8
			end if
			break
		case 2
			object.value7 = 0x7D0
			break
		case 3
			object.value7 = 1000
			break
		case 4
			object.value7 = 500
			break
		case 5
			object.value7 = 100
			break
		case 9
			if stage.debugMode == 0
				if options.gameMode < 2
					if stage.seconds == 59
						object.value7 = 0x186A0
					end if
				end if
			end if
			break
		end switch
		object.value8 = object[0].value0
		object.value8 *= 100
		switch stage.playerListPos
		case 0
		case 3
			temp0 = 0
			foreach (TypeName[Ring], arrayPos0, ALL_ENTITIES)
				if object[arrayPos0].propertyValue <= 1
					temp0++
				end if
			next
			break
		case 1
		case 2
			temp0 = 0
			foreach (TypeName[Ring], arrayPos0, ALL_ENTITIES)
				if object[arrayPos0].propertyValue != 2
					temp0++
				end if
			next
			break
		end switch
		if temp0 == 0
			object.value10 = 1
			object.value9 = 0xC350
		end if
		if stage.activeList == REGULAR_STAGE
			if stage.listPos == 19
				object.value10 = 0
				object.value9 = 0
			end if
		end if
		if object.value10 == 1
			if stage.debugMode == 0
				if options.gameMode != 5
					//CallNativeFunction2(SetAchievement, 6, 100)
					achievement.trigger = 7 // Perfectionist
				end if
			end if
		end if
		object.state++
		break
	case 1
		if object.value1 < 0
			object.value1 += 16
		end if
		if object.value2 > 0
			object.value2 -= 16
		end if
		if object.value3 > 0
			object.value3 -= 16
		end if
		if object.value4 > 0
			object.value4 -= 16
		end if
		if object.value5 > 0
			object.value5 -= 16
		end if
		if object.value6 > 0
			object.value6 -= 16
		else
			object.state++
		end if
		break
	case 2
		object.value0++
		switch options.gameMode
			case 2
				if object.value0 > 400
					object.value0 = 0
					object.state = 5
				end if
				break
			case 5
				break
			default
				if object.value0 > 299
					object.value0 = 0
					object.state++
				end if
				break
		end switch
		break
	case 3
		temp2 = inputDown.buttonA
		temp2 |= inputDown.buttonB
		temp2 |= inputDown.buttonC
		if temp2 == 1
			temp3 = 2000
			if temp3 > object.value7
				temp3 = object.value7
			end if
			temp4 = 2000
			if temp4 > object.value8
				temp4 = object.value8
			end if
			temp5 = 2000
			if temp5 > object.value9
				temp5 = object.value9
			end if
		else
			temp3 = 100
			temp4 = 100
			temp5 = 100
		end if
		if object.value7 > 0
			object.value7 -= temp3			
			object.value11 += temp3
			player.score += temp3
		end if
		if object.value8 > 0
			object.value8 -= temp4
			object.value11 += temp4
			player.score += temp4
		end if
		if object.value9 > 0
			object.value9 -= temp5
			object.value11 += temp5
			player.score += temp5
		end if
		
		//if object.value7 > 0
		//	object.value7 -= 100
		//	object.value11 += 100
		//	player.score += 100
		//end if
		//if object.value8 > 0
		//	object.value8 -= 100
		//	object.value11 += 100
		//	player.score += 100
		//end if
		//if object.value9 > 0
		//	object.value9 -= 100
		//	object.value11 += 100
		//	player.score += 100
		//end if
		
		CheckGreater(object.value7, 0)
		temp0 = checkResult
		CheckGreater(object.value8, 0)
		temp0 |= checkResult
		CheckGreater(object.value9, 0)
		temp0 |= checkResult
		if temp0 == 1
			object.value0++
			if object.value0 == 2
				PlaySfx(SfxName[Score Add], 0)
				object.value0 = 0
			end if
		else
			if options.vsMode == 0
				if options.gameMode < 2
					if object.value11 >= 0x2710
						if temp2 == 1
							object.value0 = 0
							object.value12 = 1
							player.continues++
							PlaySfx(SfxName[Continue], 0)
							object.state = 4	
						else
							object.state = 6
						end if
					else
						object.state++
					end if
				else
					object.state++
				end if
			else
				object.state++
			end if
			object.value0 = 0
			PlaySfx(SfxName[Score Total], 0)
		end if
		break
	case 6
		object.value0++
		if object.value0 == 60
			object.value0 = 0
			object.value12 = 1
			player.continues++
			PlaySfx(SfxName[Continue], 0)
			object.state = 4
		end if
		break
	case 4
		object.value0++
		if object.value0 == 160
			object.value0 = 0
			object.state++
			if stage.activeList == REGULAR_STAGE
				if stage.listPos == 18
					if options.gameMode != 2
						object.state = 10
						object.value12 = 0
					end if
				end if
			end if
		end if
		break
	case 5
		object.value0 += 8
		SetScreenFade(0, 0, 0, object.value0)
		if object.value0 >= 384
			fadeColor = 0
			object.value0 = 0
			starPostID = 0
			object.direction = FLIP_NONE
			stage.listPos++
			if stage.listPos > 20
				stage.activeList = PRESENTATION_STAGE
				stage.listPos = 6
			end if
			switch options.gameMode
				case 1
					arrayPos1 = options.saveSlot
					arrayPos1 <<= 3
					arrayPos1 += 1000
					if stage.player2Enabled == 1
						switch stage.playerListPos
							case 0
								saveRAM[arrayPos1] = 3
								break
							case 2
								saveRAM[arrayPos1] = 4
								break
						end switch
					else
						saveRAM[arrayPos1] = stage.playerListPos
					end if
					arrayPos1++
					saveRAM[arrayPos1] = player.lives
					arrayPos1++
					saveRAM[arrayPos1] = player.score
					arrayPos1++
					saveRAM[arrayPos1] = player.scoreBonus
					arrayPos1++
					temp0 = stage.listPos
					temp0++
					if saveRAM[arrayPos1] != 22
						saveRAM[arrayPos1] = temp0
					end if
					arrayPos1++
					saveRAM[arrayPos1] = specialStage.emeralds
					arrayPos1++
					saveRAM[arrayPos1] = specialStage.listPos
					arrayPos1++
					saveRAM[arrayPos1] = player.continues
					WriteSaveRAM()					
					LoadStage()
					break
				case 2
					options.attractMode = 0
					player.lives = 3
					player.continues = 0
					player.score = 0
					player.scoreBonus = 0xC350
					starPostID = 0
					specialStage.listPos = 0
					specialStage.emeralds = 0
					specialStage.nextZone = 0
					stage.activeList = PRESENTATION_STAGE
					stage.listPos = 7
					LoadStage()
					break
				case 5
					options.attractMode = 0
					player.lives = 3
					player.continues = 0
					player.score = 0
					player.scoreBonus = 0xC350
					starPostID = 0
					specialStage.listPos = 0
					specialStage.emeralds = 0
					specialStage.nextZone = 0
					stage.activeList = PRESENTATION_STAGE
					stage.listPos = 6
					LoadStage()
					break
					
				default			
					temp0 = engine.trialMode
					if stage.listPos >= stage.listSize
						temp0 = 1
					end if
					if temp0 == 0
						LoadStage()
					else
						stage.activeList = PRESENTATION_STAGE
						stage.listPos = 0
						LoadStage()
					end if
					break
			end switch
		end if
		break
	case 10
		if object.value1 > -384
			object.value1 -= 16
		end if
		if object.value2 < 384
			object.value2 += 16
		end if
		if object.value3 < 640
			object.value3 += 16
		end if
		if object.value4 < 656
			object.value4 += 16
		end if
		if object.value5 < 672
			object.value5 += 16
		end if
		if object.value6 < 688
			object.value6 += 16
		else
			object.type = TypeName[Blank Object]
			PlayMusic(0)
		end if
		break
	end switch
end event


event ObjectDraw
	SetActivePalette(0, 0, screen.ysize)
	temp7 = object.value1
	temp7 += screen.xcenter
	DrawSpriteScreenXY(0, temp7, 64)
	DrawSpriteScreenXY(1, temp7, 64)
	temp7 = object.value2
	temp7 += screen.xcenter
	DrawSpriteScreenXY(2, temp7, 82)
	if TitleCard_value23 == 0
		DrawSpriteScreenXY(3, temp7, 82)
		temp1 = stage.actNum
		temp1 += 4
		DrawSpriteScreenXY(temp1, temp7, 70)
	else
		DrawSpriteScreenXY(4, temp7, 82)
	end if
	temp7 = object.value3
	temp7 += screen.xcenter
	
	switch options.gameMode
		case 2
		case 5
			temp7 -= 44
			temp1 = temp7
			temp1 += 24
			DrawSpriteScreenXY(29, temp1, 121)
			DrawSpriteScreenXY(30, temp7, 121)
			temp7 += 96
			
			DrawSpriteScreenXY(28, temp7, 121)
				temp7 += 37
			DrawNumbers(14, temp7, 121, stage.milliSeconds, 2, 8, 1)
			temp7 -= 24
			DrawNumbers(14, temp7, 121, stage.seconds, 2, 8, 1)
			temp7 -= 24
			DrawNumbers(14, temp7, 121, stage.minutes, 10, 8, 0)
			temp7 = object.value4
			temp7 += screen.xcenter
		
			temp7 -= 84
			temp1 = temp7
			temp1 += 64
			DrawSpriteScreenXY(29, temp1, 137)
			DrawSpriteScreenXY(26, temp7, 137)
			temp7 += 135
			
			DrawSpriteScreenXY(28, temp7, 137)
				temp7 += 37
			DrawNumbers(14, temp7, 137, object[9].value3, 2, 8, 1)
			temp7 -= 24
			DrawNumbers(14, temp7, 137, object[9].value4, 2, 8, 1)
			temp7 -= 24
			DrawNumbers(14, temp7, 137, object[9].value5, 2, 8, 0)

			temp7 = object.value6
			temp7 += screen.xcenter
			if object[9].value2 > timeAttack.result
				temp7 -= 33
				temp1 = temp7
				temp1 += 77
				DrawSpriteScreenXY(29, temp1, 169)
				DrawSpriteScreenXY(27, temp7, 169)
			end if
			break
		default
			DrawSpriteScreenXY(8, temp7, 120)
			DrawSpriteScreenXY(13, temp7, 120)
			temp7 += 88
			DrawNumbers(14, temp7, 121, object.value7, 6, 8, 0)
			temp7 = object.value4
			temp7 += screen.xcenter
		
			DrawSpriteScreenXY(9, temp7, 136)
			DrawSpriteScreenXY(13, temp7, 136)
			temp7 += 88
			DrawNumbers(14, temp7, 137, object.value8, 5, 8, 0)
			if object.value10 == 1
				temp7 = object.value5
				temp7 += screen.xcenter
				DrawSpriteScreenXY(10, temp7, 152)
				DrawSpriteScreenXY(11, temp7, 152)
				temp7 += 88
				DrawNumbers(14, temp7, 153, object.value9, 5, 8, 0)
			end if
			temp7 = object.value6
			temp7 += screen.xcenter
			DrawSpriteScreenXY(12, temp7, 168)
			temp7 += 88
			DrawNumbers(14, temp7, 169, object.value11, 6, 8, 0)
			if object.value12 == 1
				GetBit(temp0, oscillation, 4)
				if temp0 == 1
					GetBit(temp0, oscillation, 5)
					temp0 += 24
					temp1 = screen.xcenter
					temp1 += 112
					temp2 = screen.ycenter
					temp2 += 52
					DrawSpriteScreenXY(temp0, temp1, temp2)
				end if
			end if
			break
	end switch
end event


event ObjectStartup
	LoadSpriteSheet("Global/Display.gif")
	switch stage.playerListPos
	case 0
	case 3
		SpriteFrame(-64, 0, 72, 16, 1, 222) //0 Sonic
		SpriteFrame(16, 0, 48, 16, 1, 205) //1 Got
		break
	case 1
		if saved.region == 0
			SpriteFrame(-61, 0, 69, 16, 74, 222) //0 Tails
		else
			SpriteFrame(-71, 0, 79, 16, 144, 222) //0 Miles
		end if
		SpriteFrame(16, 0, 48, 16, 1, 205) //1 Got
		break
	case 2
		SpriteFrame(-94, 0, 128, 16, 34, 188) //0 Knuckles
		SpriteFrame(40, 0, 48, 16, 1, 205) //1 Got
		break
	end switch
	SpriteFrame(-88, 0, 112, 16, 50, 205) //2 Through
	SpriteFrame(33, 0, 46, 16, 163, 205) //3 Act
	SpriteFrame(33, 0, 62, 16, 83, 1) //4 Zone
	SpriteFrame(88, 0, 16, 29, 42, 1) //5 Act 1
	SpriteFrame(88, 0, 23, 29, 59, 1) //6 Act 2
	SpriteFrame(88, 0, 23, 32, 42, 31) //7 Act 3
	SpriteFrame(-91, 1, 31, 11, 2, 17) // 8 Time
	SpriteFrame(-92, 1, 32, 11, 1, 33) //9 Ring
	SpriteFrame(-104, 1, 56, 11, 66, 35) //10 Perfect
	SpriteFrame(-40, 0, 46, 16, 190, 1) //11 Bonus
	SpriteFrame(-71, 0, 45, 16, 145, 1) //12 Total
	SpriteFrame(-52, 0, 46, 16, 190, 1) //13 Bonus
	
	//Numbers
	SpriteFrame(0, 0, 8, 11, 1, 50) 
	SpriteFrame(0, 0, 8, 11, 10, 50)
	SpriteFrame(0, 0, 8, 11, 19, 50)
	SpriteFrame(0, 0, 8, 11, 28, 50)
	SpriteFrame(0, 0, 8, 11, 1, 62)
	SpriteFrame(0, 0, 8, 11, 10, 62)
	SpriteFrame(0, 0, 8, 11, 19, 62)
	SpriteFrame(0, 0, 8, 11, 28, 62)
	SpriteFrame(0, 0, 8, 11, 1, 74)
	SpriteFrame(0, 0, 8, 11, 10, 74)
	
	//Continue Sprites
	switch stage.playerListPos
	case 0
	case 3
		SpriteFrame(-8, -11, 16, 23, 178, 113) //24
		SpriteFrame(-8, -11, 16, 23, 195, 113) //25
		break
	case 1
		SpriteFrame(-8, -11, 16, 23, 212, 113) //24
		SpriteFrame(-8, -11, 16, 23, 229, 113) //25
		break
	case 2
		SpriteFrame(-8, -11, 16, 23, 178, 137) //24
		SpriteFrame(-8, -11, 16, 23, 195, 137) //25
		break
	end switch
	
	SpriteFrame(0, 0, 71, 11, 120, 46) //26 Best Time
	SpriteFrame(0, 0, 84, 11, 145, 58) //27 New Record
	SpriteFrame(0, 0, 29, 4, 1, 45) //28 Time Marker
	SpriteFrame(-4, -1, 16, 16, 209, 41) //29 Results Triangle
	SpriteFrame(0, 0, 31, 11, 2, 17) //30 Time
end event

event RSDKDraw
	DrawSprite(0)
end event

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