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

//-------Aliases-------//
private alias 4 : TYPE_STAGESETUP
private alias object.value29 : achievement.state
private alias object.value31 : achieve.timer
private alias object.value37 : achieve.earned
private alias object.value14 : TimeOverFlag

// Function declarations
reserve function StageSetup_Function71
reserve function StageSetup_SaveStageState
reserve function StageSetup_LoadStageState
reserve function StageSetup_AchievementDisplay


// Static Values
public value StageSetup_value22 = 0;
public value StageSetup_value21 = 0;

// Tables
public table StageSetup_table8
	128, 0, 128, 0, 128, 0, 128, 0, 128, 0, 128, 0, 128, 0, 128, 0
	128, 0, 0x3848, 238, 0x2080, 180, 0x3080, 270, 0x5080, 450, 0x7080, 630, 128, 0, 0x4000, 254
end table

public table StageSetup_table9
	128, 0, 128, 0, 128, 0, 128, 0, 128, 0, 128, 0, 128, 0, 128, 0
	128, 0, 0x3848, 238, 0x2080, 180, 0x3080, 270, 0x5080, 450, 0x7080, 630, 128, 0, 0x4000, 254
end table

public table StageSetup_table10
	2, 0x1000, 2, 0x1800, 2, 0x2000, 2, 0x3000, 4, 0x2000, 8, 0x800, 8, 0x4000, 4, 0x4000
	2, 0x3800, 2, 0x3800, 2, 0x2000, 3, 0x3000, 5, 0x5000, 7, 0x7000, 2, 0x4000, 2, 0x4000
end table

function StageSetup_AchievementDisplay
	if stage.state == STAGE_RUNNING
		switch achievement.state
			case 0
				if achievement.trigger > 0
					achieve.earned = achievement.trigger
					achievement.trigger = 0
					achievement.state = 1
				end if
				break
			case 1
				arrayPos1 = 399
				arrayPos1 += achieve.earned
				if saveRAM[arrayPos1] == 1
					achieve.earned = 0	
					achievement.state = 0
				else
					saveRAM[arrayPos1] = 1
					WriteSaveRAM()
					achievement.state++
				end if
				break
			case 2
				PlaySfx(SfxName[Event], 0)
				achieve.yoffset = 0
				achievement.state++
				break			
			case 3
				if achieve.yoffset < 30
					achieve.yoffset += 2
				end if
				if achieve.yoffset >= 30
					achieve.yoffset = 30
					achieve.timer = 0
					achievement.state++
				end if
				break
			case 4
				if achieve.timer < 180
					achieve.timer++
				else
					achievement.state++
				end if
				break
			case 5
				if achieve.yoffset > 0
					achieve.yoffset -= 2
				end if
				if achieve.yoffset <= 0
					achieve.yoffset = 0
					achievement.state++
				end if
				break
			case 6
				achieve.earned = 0	
				achievement.state = 0
				break
		end switch
	end if
end function

function StageSetup_SaveStageState
	arrayPos0 = 32
	arrayPos1 = 7168
	
	while arrayPos0 < 1056
		if object[arrayPos0].type == TypeName[Blank Object]
			saveRAM[arrayPos1] = 1
		else
			if object[arrayPos0].type==TypeName[Broken Monitor]
				saveRAM[arrayPos1] = 1
			else
				saveRAM[arrayPos1] = 0
			endif
		endif
		arrayPos0++
		arrayPos1++
	loop
	recRings = object[0].value0
	recShield = object[0].value37
	RecRingBonus = ringExtraLife
end function


function StageSetup_LoadStageState
	switch recGoggles
		case 0
			arrayPos0 = 32
			arrayPos1 = 7168
			
			while arrayPos0 < 1056
				saveRAM[arrayPos1] = 0
				arrayPos0++
				arrayPos1++
			loop			
			
			recRings = 0
			recRingBonus = 0
			recShield = 0
			recGoggles = 0
			break	
		case 1
			arrayPos0 = 32
			arrayPos1 = 7168
			
			while arrayPos0 < 1056
				if object[arrayPos0].type == TypeName[Monitor]
					if saveRAM[arrayPos1] == 1
						object[arrayPos0].type = TypeName[Broken Monitor]
						object[arrayPos0].state = 2
					end if
				else
					if saveRAM[arrayPos1] == 1
						if object[arrayPos0].type == TypeName[Title Card]
						else
							object[arrayPos0].type = TypeName[Blank Object]
						end if
					end if
				endif
				saveRAM[arrayPos1] = 0
				arrayPos0++
				arrayPos1++
			loop
			
			object[0].value0 = recRings
			object[0].value37 = recShield
			arrayPos0 = playerCount
			currentPlayer = 0
			CallFunction(PlayerObject_RestorePowerup)
			ringExtraLife = recRingBonus
			if ringExtraLife < 100
				ringExtraLife = 100
			end if
			
			recRings = 0
			recRingBonus = 0
			recShield = 0
			recGoggles = 0
			break
		case 2
			object[0].value0 = recRings
			object[0].value37 = recShield
			arrayPos0 = playerCount
			currentPlayer = 0
			CallFunction(PlayerObject_RestorePowerup)
			ringExtraLife = recRingBonus
			if ringExtraLife < 100
				ringExtraLife = 100
			end if
			
			recRings = 0
			recRingBonus = 0
			recShield = 0
			break
	end switch
	WriteSaveRAM()
end function




function StageSetup_Function71
	temp0 = 0
	temp1 = 0
	while temp0 < 16
		GetTableValue(temp4, temp1, StageSetup_table10)
		GetTableValue(temp6, temp1, StageSetup_table9)
		temp1++
		GetTableValue(temp5, temp1, StageSetup_table10)
		GetTableValue(temp7, temp1, StageSetup_table9)
		temp1--
		GetBit(temp2, StageSetup_value21, temp0)
		if temp2 == 0
			temp7 += temp4
			temp6 += temp7
			if temp6 >= temp5
				SetBit(StageSetup_value21, temp0, 1)
			end if
		else
			temp7 -= temp4
			temp6 += temp7
			if temp6 < temp5
				SetBit(StageSetup_value21, temp0, 0)
			end if
		end if
		SetTableValue(temp6, temp1, StageSetup_table9)
		temp1++
		SetTableValue(temp7, temp1, StageSetup_table9)
		temp1++
		temp0++
	loop
end function


event ObjectMain
	object.drawOrder = 6
	switch stage.state
	case 2
	case 3
		break
	default
		ringTimer++
		if ringTimer == 4
			ringTimer = 0
			ringFrame++
			ringFrame &= 7
		end if
		StageSetup_value22++
		if StageSetup_value22 > 17
			StageSetup_value22 = 0
		end if
		if options.gameMode != 2
			if player.score >= player.scoreBonus
				if saved.lives == 0
					player.lives++
					PlaySfx(SfxName[Life], 0)
					PauseMusic()
					ResetObjectEntity(25, TypeName[Music Event], 2, 0, 0)
					object[25].priority = PRIORITY_ACTIVE
				end if
				player.scoreBonus += 0xC350
			end if
		end if
		oscillation++
		oscillation &= 511
		CallFunction(StageSetup_Function71)

		//Time Over
		if stage.timeEnabled == 1
			switch options.gameMode
				case 0
				case 1
					switch saved.timeLimit
						case 0
							break
						case 1
							if stage.minutes == 3
								CheckEqual(stage.debugMode, 1)
								temp0 = checkResult
								if temp0 == 0
									currentPlayer = 0
									object[0].type = TypeName[Player Object]
									CallFunction(PlayerObject_Kill)
								end if
								stage.minutes = 3
								stage.seconds = 0
								stage.milliSeconds = 0
								stage.timeEnabled = 0
								stage.timeOver = 1
							end if
							break
						case 2
							if stage.minutes == 10
								CheckEqual(stage.debugMode, 1)
								temp0 = checkResult
								if temp0 == 0
									currentPlayer = 0
									object[0].type = TypeName[Player Object]
									CallFunction(PlayerObject_Kill)
								end if
								stage.minutes = 9
								stage.seconds = 59
								stage.milliSeconds = 99
								stage.timeEnabled = 0
								stage.timeOver = 1
							end if
							break
					end switch
					break					
				case 3 //Arcade forces ten minutes
					if stage.minutes == 10
						CheckEqual(stage.debugMode, 1)
						temp0 = checkResult
						if temp0 == 0
							currentPlayer = 0
							object[0].type = TypeName[Player Object]
							CallFunction(PlayerObject_Kill)
						end if
						stage.minutes = 9
						stage.seconds = 59
						stage.milliSeconds = 99
						stage.timeEnabled = 0
						stage.timeOver = 1
					end if
					break
				case 2
				case 5
					break
			end switch
		end if

		foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
			temp0 = object[currentPlayer].collisionLeft
			temp0 <<= 16
			temp0 += object[currentPlayer].xpos
			temp1 = stage.curXBoundary1
			temp1 <<= 16
			if temp0 < temp1
				if object[currentPlayer].right == 1
					object[currentPlayer].xvel = 0x10000
					object[currentPlayer].speed = 0x10000
				else
					object[currentPlayer].xvel = 0
					object[currentPlayer].speed = 0
				end if
				object[currentPlayer].xpos = temp1
				temp0 = object[currentPlayer].collisionLeft
				temp0 <<= 16
				object[currentPlayer].xpos -= temp0
			end if
			
			temp0 = object[currentPlayer].collisionRight
			temp0 <<= 16
			temp0 += object[currentPlayer].xpos
			temp1 = tileLayer[0].xsize
			temp1 <<= 7
			temp1 <<= 16
			if temp0 > temp1
				object[currentPlayer].xvel = 0
				object[currentPlayer].speed = 0
				object[currentPlayer].xpos = temp1
				temp0 = object[currentPlayer].collisionRight
				temp0 <<= 16
				object[currentPlayer].xpos -= temp0
			end if
			
			temp1 = stage.curYBoundary2
			temp1 <<= 16
			if temp1 < stage.deathBoundary
				if object[currentPlayer].ypos > stage.deathBoundary
					CallFunction(PlayerObject_Kill)
				end if
			else
				if object[currentPlayer].ypos > temp1
					CallFunction(PlayerObject_Kill)
				end if
			end if
		next
	end switch
	
	if stage.state != STAGE_PAUSED
		if object[0].state == PlayerObject_HandleFlyCarry
			currentPlayer = 0
			while currentPlayer < playerCount
				if object[currentPlayer].visible == 1
					currentPlayer += playerCount
					if object[currentPlayer].value18 == 0
						currentPlayer -= playerCount
						arrayPos0 = object[currentPlayer].value18
						AddDrawListEntityRef(arrayPos0, currentPlayer)
						currentPlayer += playerCount
						AddDrawListEntityRef(arrayPos0, currentPlayer)
						currentPlayer -= playerCount
					else
						currentPlayer -= playerCount
						arrayPos0 = object[currentPlayer].value18
						currentPlayer += playerCount
						AddDrawListEntityRef(arrayPos0, currentPlayer)
						currentPlayer -= playerCount
						arrayPos0 = object[currentPlayer].value18
						AddDrawListEntityRef(arrayPos0, currentPlayer)
					end if
				end if
				currentPlayer++
			loop
		
		else
			currentPlayer = playerCount
			currentPlayer--
			while currentPlayer > -1
				if object[currentPlayer].visible == 1
					currentPlayer += playerCount
					if object[currentPlayer].value18 == 0
						currentPlayer -= playerCount
						arrayPos0 = object[currentPlayer].value18
						AddDrawListEntityRef(arrayPos0, currentPlayer)
						currentPlayer += playerCount
						AddDrawListEntityRef(arrayPos0, currentPlayer)
						currentPlayer -= playerCount
					else
						currentPlayer -= playerCount
						arrayPos0 = object[currentPlayer].value18
						currentPlayer += playerCount
						AddDrawListEntityRef(arrayPos0, currentPlayer)
						currentPlayer -= playerCount
						arrayPos0 = object[currentPlayer].value18
						AddDrawListEntityRef(arrayPos0, currentPlayer)
					end if
				end if
				currentPlayer--
			loop
		end if
	end if
	
	CallFunction(StageSetup_AchievementDisplay)

end event


event ObjectDraw
	if stage.state == STAGE_RUNNING
		if achieve.earned > 0
			//Achievement Display
			SetActivePalette(6, 0, screen.ysize)
			temp0 = 0
			temp1 = screen.ysize
			temp1 -= achieve.yoffset
			temp2 = achieve.earned
			temp2--

			while temp0 < screen.xsize
				DrawSpriteScreenXY(40, temp0, temp1)
				temp0 += 32				
			loop
			
			switch achieve.earned
				case 15 //Super Sonic Time Attack
					DrawSpriteScreenXY(41, 0, temp1)
					break
				default
					DrawSpriteScreenXY(39, 0, temp1)
					break					
			end switch
			
			temp0 = screen.xsize
			temp0 -= 9
			DrawSpriteScreenXY(temp2, temp0, temp1)
			SetActivePalette(0, 0, screen.ysize)
		end if
	end if
	
	if stage.activeList != PRESENTATION_STAGE
		SetActivePalette(0, 0, screen.ysize)
	end if
end event



event ObjectStartup
	SetMusicTrack("ActComplete.ogg", 1, 0)
	SetMusicTrack("Invincibility.ogg", 2, 0x9717)
	SetMusicTrack("Continue.ogg", 3, 0)
	SetMusicTrack("Boss.ogg", 4, 1)
	SetMusicTrack("GameOver.ogg", 5, 0)
	SetMusicTrack("Drowning.ogg", 6, 0)
	switch saved.Supermusic
		case 0
			SetMusicTrack("Super.ogg", 7, 1)
			break
		case 1
			SetMusicTrack("Super3.ogg", 7, 1)
			break
		case 2
			SetMusicTrack("Super3K.ogg", 7, 30014)
			break
		case 3
			SetMusicTrack("Super3U.ogg", 7, 40914)
			break
		case 4
			SetMusicTrack("SuperM.ogg", 7, 98754)
			break
	end switch
	stage.timeOver = 0
	if options.attractMode == 0
	else
		SetObjectRange(424)
	end if
	SpeedUpMusic = 0
	SlowDownMusic = 0
	stage.musicFlag = 0
	stage.deathBoundary = stage.curYBoundary2
	stage.deathBoundary <<= 16
	foreach (TypeName[Stage Setup], arrayPos0, ALL_ENTITIES)
		ResetObjectEntity(arrayPos0, TypeName[Blank Object], 0, 0, 0)
	next
	object[8].type = TypeName[Stage Setup]
	object[8].priority = PRIORITY_ACTIVE_PAUSED
	foreach (TypeName[HUD], arrayPos0, ALL_ENTITIES)
		object[arrayPos0].type = TypeName[Blank Object]
		if credits.screen == 0
			object[9].type = TypeName[HUD]
			object[9].priority = PRIORITY_ACTIVE
			object[9].drawOrder = 6
			object[9].propertyValue = object[arrayPos0].propertyValue
		end if
	next
	ringExtraLife = 100
	oscillation = 0
	StageSetup_value21 = 0xBE00
	temp0 = 0
	while temp0 < 32
		GetTableValue(temp1, temp0, StageSetup_table8)
		SetTableValue(temp1, temp0, StageSetup_table9)
		temp0++
	loop
	blueShieldType = 24
	invincibilityType = 30
	CallFunction(StageSetup_LoadStageState)
	
	//Achievement Display
	LoadSpriteSheet("Global/Achieve.gif")
	SpriteFrame(-70, 13, 70, 11, 1, 124) //0 Quick Run
	SpriteFrame(-146, 13, 146, 11, 1, 136) //1 100% Chemical Free
	SpriteFrame(-134, 13, 134, 11, 1, 148) //2 Early Bird Special
	SpriteFrame(-72, 13, 72, 11, 1, 160) //3 SuperStar
	SpriteFrame(-131, 13, 131, 11, 1, 172) //4 Gambling Problem
	SpriteFrame(-99, 13, 99, 11, 1, 184) //5 Bop Non-Stop
	SpriteFrame(-98, 13, 98, 11, 1, 196) //6 Perfectionist
	SpriteFrame(-135, 13, 135, 11, 1, 208) //7 A Secret Revealed
	SpriteFrame(-138, 13, 138, 11, 1, 220) //8 Metropolis Master
	SpriteFrame(-135, 13, 135, 11, 1, 112) //9 Tour of the Plant
	SpriteFrame(-182, 13, 182, 11, 1, 232) //10 Beat the Clock
	SpriteFrame(-140, 13, 140, 11, 1, 100) //11 Expert's Challenge

	SpriteFrame(-107, 13, 107, 11, 1, 244) //12 Scrambled Egg
	SpriteFrame(-140, 13, 140, 11, 103, 14)	// 13 Blank
	SpriteFrame(-177, 13, 177, 11, 1, 88)	// 14 SuperSonicTimeAttack
	SpriteFrame(0, 0, 200, 29, 1, 1)	// 15
	SpriteFrame(0, 0, 200, 29, 1, 1)	// 16
	SpriteFrame(0, 0, 200, 29, 1, 1)	// 17
	SpriteFrame(0, 0, 200, 29, 1, 1)	// 18
	SpriteFrame(0, 0, 200, 29, 1, 1)	// 19
	SpriteFrame(0, 0, 200, 29, 1, 1)	// 20
	SpriteFrame(0, 0, 200, 29, 1, 1)	// 21
	SpriteFrame(0, 0, 200, 29, 1, 1)	// 22
	SpriteFrame(0, 0, 200, 29, 1, 1)	// 23
	SpriteFrame(0, 0, 200, 29, 1, 1)	// 24
	SpriteFrame(0, 0, 200, 29, 1, 1)	// 25
	SpriteFrame(0, 0, 200, 29, 1, 1)	// 26
	SpriteFrame(0, 0, 200, 29, 1, 1)	// 27
	SpriteFrame(0, 0, 200, 29, 1, 1)	// 28
	SpriteFrame(0, 0, 200, 29, 1, 1)	// 29
	SpriteFrame(0, 0, 200, 29, 1, 1)	// 30
	SpriteFrame(0, 0, 200, 29, 1, 1)	// 31
	SpriteFrame(0, 0, 200, 29, 1, 1)	// 32
	SpriteFrame(0, 0, 200, 29, 1, 1)	// 33
	SpriteFrame(0, 0, 200, 29, 1, 1)	// 34
	SpriteFrame(0, 0, 200, 29, 1, 1)	// 35
	SpriteFrame(0, 0, 200, 29, 1, 1)	// 36
	SpriteFrame(0, 0, 200, 29, 1, 1)	// 37
	SpriteFrame(0, 0, 200, 29, 1, 1)	// 38
	SpriteFrame(9, 13, 91, 12, 34, 1)	// 39 Achievement Unlocked
	SpriteFrame(0, 0, 32, 30, 1, 1)		// 40 Yellow BG
	SpriteFrame(9, 13, 91, 12, 126, 1)	// 41 Reward Unlocked

end event

event RSDKDraw
	DrawSprite(0)
end event

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