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

//-------Aliases-------//
private alias 16 : TYPE_SPECIALFINISH


// Static Values

// Tables
public table SpecialFinish_table18
	0, 24, 24, 0, -24, -24, 0
end table

public table SpecialFinish_table19
	84, 96, 120, 132, 120, 96, 108
end table


event ObjectMain
	switch object.state
	case 0
		if object.value0 < 256
			object.value0 += 8
			SetScreenFade(224, 224, 224, object.value0)
		else
			if SpecialSetup_value0 == 1
				temp0 = stage.actNum
				temp0--
				SetBit(specialStage.emeralds, temp0, 1)
				if specialStage.emeralds == 127
					object.value11 = 3
					object.value12 = 3
				else
					object.value11 = 2
					object.value12 = 2
				end if
				object.value10 = 0x2710
				specialStage.listPos++
				specialStage.listPos %= 7
			else
				object.value11 = 0
				object.value12 = 1
				object.value10 = 0
			end if
			object.value13 = 0
			object.value8 = object[2].value0
			if stage.player2Enabled == 1
				object.value9 = object[3].value0
			else
				object.value9 = 0
			end if
			stage.listPos = specialStage.nextZone
			stage.activeList = REGULAR_STAGE
			object.value0 = 0
			temp0 = 0
			while temp0 < 20
				ResetObjectEntity(temp0, TypeName[Blank Object], 0, 0, 0)
				temp0++
			loop
			temp0++
			while temp0 < 0x4A0
				ResetObjectEntity(temp0, TypeName[Blank Object], 0, 0, 0)
				temp0++
			loop
			stage[0].activeLayer = 9
			stage[1].activeLayer = 9
			stage[2].activeLayer = 9
			stage[3].activeLayer = 9
			stage.pauseEnabled = 0
			object.controlMode = 0
			inputDown.left = 0
			inputDown.right = 0
			object.direction = FLIP_NONE
			object.value1 = -384
			object.value2 = 384
			object.value4 = 640
			object.value5 = 656
			object.value6 = 672
			object.value7 = 688
			object.value4 += 128
			object.value5 += 128
			object.value6 += 128
			object.value7 += 128
			object.inkEffect = INK_ALPHA
			PlayMusic(1)
			object.state++
			SetScreenFade(224, 224, 224, 255)
		end if
		break
	case 1
		object.value0++
		if object.value0 > 15
			object.value0 = 0
			object.state++
		end if
		SetScreenFade(224, 224, 224, 255)
		break
	case 2
		if object.value1 < 0
			object.value1 += 16
		end if
		if object.value2 > 0
			object.value2 -= 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
		end if
		if object.value7 > 0
			object.value7 -= 16
		else
			object.state++
		end if
		break
	case 3
		object.value0++
		if object.value14 < 256
			object.value14 += 8
		end if
		if object.value0 > 299
			object.value0 = 0
			object.state++
		end if
		break
	case 4	
		temp2 = inputDown.buttonA
		temp2 |= inputDown.buttonB
		temp2 |= inputDown.buttonC
		if temp2 == 1
			temp3 = 20
			if temp3 > object.value8
				temp3 = object.value8
			end if
			temp4 = 20
			if temp4 > object.value9
				temp4 = object.value9
			end if
			temp5 = 2000
			if temp5 > object.value10
				temp5 = object.value10
			end if
		else
			temp3 = 1
			temp4 = 1
			temp5 = 100
		end if
		if object.value8 > 0
			object.value8 -= temp3
			temp3 *= 100
			player.score += temp3
		end if
		if object.value9 > 0
			object.value9 -= temp4
			temp4 *= 100
			player.score += temp4
		end if
		if object.value10 > 0
			object.value10 -= temp5
			player.score += temp5
		end if
		
		//if object.value8 > 0
		//	object.value8--
		//	player.score += 100
		//end if
		//if object.value9 > 0
		//	object.value9--
		//	player.score += 100
		//end if
		//if object.value10 > 0
		//	object.value10 -= 100
		//	player.score += 100
		//end if
		
		if player.score >= player.scoreBonus
			if saved.lives == 0
				if options.gameMode < 2
					player.lives++
					PlaySfx(SfxName[Life], 0)
				end if
			end if
			player.scoreBonus += 0xC350
		end if
		CheckGreater(object.value8, 0)
		temp0 = checkResult
		CheckGreater(object.value9, 0)
		temp0 |= checkResult
		CheckGreater(object.value10, 0)
		temp0 |= checkResult
		if temp0 == 1
			object.value0++
			if object.value0 == 2
				PlaySfx(SfxName[Score Add], 0)
				object.value0 = 0
			end if
		else
			if SpecialSetup_value0 == 1
				if specialStage.emeralds == 0x3FFF
					object.state = 8
				else
					if specialStage.emeralds == 127
						switch stage.playerListPos
						case 0
						case 2
							object.state = 8
							break
						case 1
							if options.superTails == 1
								object.state = 8
							else
								object.state++
							end if
							break
						end switch
					else
						object.state++
					end if
				end if
			else
				object.state++
			end if
			object.value0 = 0
			PlaySfx(SfxName[Score Total], 0)
		end if
		break
	case 5
		object.value0++
		if object.value0 == 160
			object.value0 = 0
			object.state++
			PlaySfx(SfxName[Warp], 0)
		end if
		break
	case 6
		if object.value0 < 400
			object.value0 += 8
			SetScreenFade(248, 248, 248, object.value0)
		else
			object.value0 = 248
			object.state++
			SetScreenFade(248, 248, 248, 255)
		end if
		break
	case 7
		if object.value0 > 0
			object.value0 -= 8
		else
			fadeColor = 0
			if stage.listPos < stage.listSize
				recGoggles = 1
				LoadStage()
			else
				stage.activeList = PRESENTATION_STAGE
				stage.listPos = 0
				LoadStage()
			end if
		end if
		SetScreenFade(object.value0, object.value0, object.value0, 255)
		break
	case 8
		object.value0++
		if object.value0 == 90
			object.value0 = 0
			object.value3 = 0
			object.state++
		end if
		break
	case 9
		if object.value1 > -384
			object.value1 -= 32
			object.value3 -= 32
		end if
		if object.value2 < 384
			object.value2 += 32
		else
			if specialStage.emeralds == 0x3FFF
				object.value11 = 4
				object.value12 = 4
				object.value13 = 4
			else
				if options.hiddenPalace == 1
					object.value11 = 5
					object.value12 = 5
					object.value13 = 5
				else
					object.value11 = 4
					object.value12 = 4
					object.value13 = 4
				end if
			end if
			object.state++
		end if
		break
	case 10
		if object.value1 < 0
			object.value1 += 16
			object.value3 += 16
		end if
		if object.value2 > 0
			object.value2 -= 16
		else
			PlaySfx(SfxName[Event], 0)
			object.state++
		end if
		break
	case 11
		object.value0++
		if object.value0 == 200
			object.value0 = 0
			object.state = 6
			PlaySfx(SfxName[Warp], 0)
		end if
		break
	end switch
end event


event ObjectDraw
	switch object.state
	case 2
	case 3
	case 4
	case 5
	case 6
	case 8
	case 9
	case 10
	case 11
		ClearScreen(152)
		object.animationTimer += 16
		object.animationTimer &= 511
		Sin(temp0, object.animationTimer)
		temp0 >>= 3
		temp0 += 190
		temp0 *= object.value14
		temp0 >>= 8
		object.alpha = temp0
		temp0 = 0
		while temp0 < 7
			GetBit(temp1, specialStage.emeralds, temp0)
			if temp1 == 1
				GetTableValue(temp2, temp0, SpecialFinish_table18)
				temp2 += screen.xcenter
				GetTableValue(temp3, temp0, SpecialFinish_table19)
				DrawSpriteScreenFX(temp0, FX_INK, temp2, temp3)
			end if
			temp0++
			temp1++
		loop
		temp7 = object.value1
		temp7 += screen.xcenter
		switch object.value11
		case 2
			DrawSpriteScreenXY(24, temp7, 0)
			DrawSpriteScreenXY(25, temp7, 0)
			break
		case 3
			DrawSpriteScreenXY(27, temp7, 0)
			DrawSpriteScreenXY(28, temp7, 0)
			break
		case 4
			DrawSpriteScreenXY(30, temp7, 0)
			DrawSpriteScreenXY(31, temp7, 0)
			DrawSpriteScreenXY(32, temp7, 0)
			break
		case 5
			DrawSpriteScreenXY(36, temp7, 0)
			DrawSpriteScreenXY(37, temp7, 0)
			break
		end switch
		temp7 = object.value2
		temp7 += screen.xcenter
		switch object.value12
		case 1
			DrawSpriteScreenXY(23, temp7, 0)
			break
		case 2
			DrawSpriteScreenXY(26, temp7, 0)
			break
		case 3
			DrawSpriteScreenXY(29, temp7, 0)
			break
		case 4
			DrawSpriteScreenXY(33, temp7, 0)
			break
		case 5
			DrawSpriteScreenXY(38, temp7, 0)
			DrawSpriteScreenXY(39, temp7, 0)
			DrawSpriteScreenXY(40, temp7, 0)
			break
		end switch
		temp7 = object.value3
		temp7 += screen.xcenter
		switch object.value13
		case 4
			DrawSpriteScreenXY(34, temp7, 0)
			DrawSpriteScreenXY(35, temp7, 0)
			break
		case 5
			DrawSpriteScreenXY(41, temp7, 0)
			break
		end switch
		temp7 = object.value4
		temp7 += screen.xcenter
		DrawSpriteScreenXY(17, temp7, 145)
		temp7 += 88
		DrawNumbers(7, temp7, 145, player.score, 9, 8, 0)
		if stage.player2Enabled == 1
			temp7 = object.value5
			temp7 += screen.xcenter
			DrawSpriteScreenXY(20, temp7, 161)
			temp7 += 88
			DrawNumbers(7, temp7, 161, object.value8, 5, 8, 0)
			temp7 = object.value6
			temp7 += screen.xcenter
			DrawSpriteScreenXY(21, temp7, 177)
			temp7 += 88
			DrawNumbers(7, temp7, 177, object.value9, 5, 8, 0)
			if SpecialSetup_value0 == 1
				temp7 = object.value7
				temp7 += screen.xcenter
				DrawSpriteScreenXY(22, temp7, 193)
				temp7 += 88
				DrawNumbers(7, temp7, 193, object.value10, 5, 8, 0)
			end if
		else
			temp7 = object.value5
			temp7 += screen.xcenter
			DrawSpriteScreenXY(18, temp7, 169)
			temp7 += 88
			DrawNumbers(7, temp7, 169, object.value8, 5, 8, 0)
			if SpecialSetup_value0 == 1
				temp7 = object.value6
				temp7 += screen.xcenter
				DrawSpriteScreenXY(19, temp7, 193)
				temp7 += 88
				DrawNumbers(7, temp7, 193, object.value10, 5, 8, 0)
			end if
		end if
		break
	end switch
end event


event ObjectStartup
	LoadSpriteSheet("Special/Objects.gif")
	SpriteFrame(-8, -8, 16, 16, 1, 260)
	SpriteFrame(-8, -8, 16, 16, 18, 260)
	SpriteFrame(-8, -8, 16, 16, 35, 260)
	SpriteFrame(-8, -8, 16, 16, 52, 260)
	SpriteFrame(-8, -8, 16, 16, 69, 260)
	SpriteFrame(-8, -8, 16, 16, 86, 260)
	SpriteFrame(-8, -8, 16, 16, 103, 260)
	SpriteFrame(0, 0, 8, 11, 1, 361)
	SpriteFrame(0, 0, 8, 11, 10, 361)
	SpriteFrame(0, 0, 8, 11, 19, 361)
	SpriteFrame(0, 0, 8, 11, 28, 361)
	SpriteFrame(0, 0, 8, 11, 37, 361)
	SpriteFrame(0, 0, 8, 11, 46, 361)
	SpriteFrame(0, 0, 8, 11, 55, 361)
	SpriteFrame(0, 0, 8, 11, 64, 361)
	SpriteFrame(0, 0, 8, 11, 73, 361)
	SpriteFrame(0, 0, 8, 11, 82, 361)
	SpriteFrame(-96, 0, 44, 15, 1, 345)
	SpriteFrame(-96, 0, 44, 15, 46, 345)
	SpriteFrame(-96, 0, 84, 15, 91, 345)
	switch stage.playerListPos
	case 2
		SpriteFrame(-96, 0, 117, 15, 151, 361)
		break
	default
		SpriteFrame(-96, 0, 92, 15, 176, 345)
		break
	end switch
	if saved.region == 0
		SpriteFrame(-96, 0, 92, 15, 269, 345)
	else
		SpriteFrame(-96, 0, 92, 15, 269, 329)
	end if
	SpriteFrame(-96, 0, 92, 15, 362, 345)
	SpriteFrame(-96, 50, 187, 16, 1, 277)
	switch stage.playerListPos
	case 0
		SpriteFrame(-72, 32, 72, 16, 189, 277)
		SpriteFrame(8, 32, 72, 16, 412, 277)
		break
	case 1
		if saved.region == 0
			SpriteFrame(-69, 32, 69, 16, 262, 277)
		else
			SpriteFrame(-79, 32, 79, 16, 332, 277)
		end if
		SpriteFrame(8, 32, 72, 16, 412, 277)
		break
	case 2
		SpriteFrame(-104, 32, 128, 16, 1, 294)
		SpriteFrame(32, 32, 72, 16, 412, 277)
		break
	end switch
	SpriteFrame(-104, 50, 208, 16, 130, 294)
	switch stage.playerListPos
	case 0
		SpriteFrame(-120, 32, 72, 16, 189, 277)
		SpriteFrame(-40, 32, 159, 16, 162, 311)
		break
	case 1
		if saved.region == 0
			SpriteFrame(-117, 32, 69, 16, 262, 277)
		else
			SpriteFrame(-127, 32, 79, 16, 332, 277)
		end if
		SpriteFrame(-40, 32, 159, 16, 162, 311)
		break
	case 2
		SpriteFrame(-148, 32, 128, 16, 1, 294)
		SpriteFrame(-12, 32, 159, 16, 162, 311)
		break
	end switch
	SpriteFrame(-112, 50, 224, 16, 130, 294)
	switch stage.playerListPos
	case 0
		SpriteFrame(-96, 20, 55, 16, 355, 294)
		SpriteFrame(-32, 20, 72, 16, 189, 277)
		SpriteFrame(48, 20, 48, 16, 411, 294)
		break
	case 1
		SpriteFrame(-96, 20, 55, 16, 355, 294)
		if saved.region == 0
			SpriteFrame(-32, 20, 69, 16, 262, 277)
		else
			SpriteFrame(-32, 20, 79, 16, 332, 277)
		end if
		SpriteFrame(48, 20, 48, 16, 411, 294)
		break
	case 2
		SpriteFrame(-124, 20, 55, 16, 355, 294)
		SpriteFrame(-60, 20, 128, 16, 1, 294)
		SpriteFrame(76, 20, 48, 16, 411, 294)
		break
	end switch
	SpriteFrame(-80, 38, 160, 16, 1, 311)
	if specialStage.emeralds <= 127
		temp0 = 322
	else
		temp0 = 403
	end if
	switch stage.playerListPos
	case 0
		SpriteFrame(-80, 56, 80, 16, temp0, 311)
		SpriteFrame(8, 56, 72, 16, 189, 277)
		break
	case 1
		SpriteFrame(-80, 56, 80, 16, temp0, 311)
		if saved.region == 0
			SpriteFrame(8, 56, 69, 16, 262, 277)
		else
			SpriteFrame(8, 56, 79, 16, 332, 277)
		end if
		break
	case 2
		SpriteFrame(-108, 56, 80, 16, temp0, 311)
		SpriteFrame(-20, 56, 128, 16, 1, 294)
		break
	end switch
	switch stage.playerListPos
	case 0
		SpriteFrame(-72, 20, 55, 16, 355, 294)
		SpriteFrame(0, 20, 72, 16, 189, 277)
		break
	case 1
		SpriteFrame(-72, 20, 55, 16, 355, 294)
		if saved.region == 0
			SpriteFrame(0, 20, 69, 16, 262, 277)
		else
			SpriteFrame(0, 20, 79, 16, 332, 277)
		end if
		break
	case 2
		SpriteFrame(-100, 20, 55, 16, 355, 294)
		SpriteFrame(-28, 20, 128, 16, 1, 294)
		break
	end switch
	SpriteFrame(-72, 38, 48, 16, 411, 294)
	SpriteFrame(-8, 38, 32, 16, 1, 328)
	SpriteFrame(40, 38, 32, 16, 34, 328)
	SpriteFrame(-100, 56, 200, 16, 67, 328)
end event

event RSDKDraw
	DrawSprite(0)
end event

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