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

//-------Aliases-------//
private alias 42 : TYPE_TORNADO

// Function declarations
reserve function Tornado_Function97
reserve function Tornado_Function98

// Static Values

// Tables
public table Tornado_table42
	5, 32, 6, 8, 7, 8, 8, 8, 7, 8, 6, 16, 9, 32, 6, 16
end table

public table Tornado_table41
	10, 9, 11, 9, 10, 9, 11, 9, 10, 9, 11, 9, 10, 9, 11, 9
end table

public table Tornado_table43
	19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 22, 22
	22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23
end table

public table Tornado_table44
	12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 15, 15
	15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16
end table

public table Tornado_table45
	27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 30, 30
	30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31
end table

public table Tornado_table46
	35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 38, 38
	38, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39
end table

public table Tornado_table47
	0xA00000, 0x700000, 0xB00000, 0x700000, 0xB60000, 0x710000, 0xBC0000, 0x720000, 0xC40000, 0x740000, 0xC80000, 0x750000, 0xCA0000, 0x760000, 0xCC0000, 0x770000
	0xCE0000, 0x780000, 0xD00000, 0x790000, 0xD20000, 0x7A0000, 0xD40000, 0x7B0000, 0xD60000, 0x7C0000, 0xD90000, 0x7E0000, 0xDC0000, 0x810000, 0xDE0000, 0x840000
	0xE10000, 0x870000, 0xE40000, 0x8B0000, 0xE70000, 0x8F0000, 0xEC0000, 0x940000, 0xF00000, 0x990000, 0xF50000, 0x9D0000, 0xF90000, 0xA40000, 0x1000000, 0xAC0000
	0x1080000, 0xB80000, 0x1120000, 0xC40000, 0x11F0000, 0xD30000, 0x12C0000, 0xFA0000
end table

public table Tornado_table51
	43, 43, 43, 43, 43, 43, 43, 44, 44, 44, 44, 44, 44, 45, 45, 45
	45, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48
	48, 48, 48, 48, 48, 48
end table

public table Tornado_table52
	0xC00000, 0x900000, 0xB00000, 0x910000, 0xA80000, 0x920000, 0x9B0000, 0x960000, 0x990000, 0x980000, 0x980000, 0x990000, 0x990000, 0x9A0000, 0x9B0000, 0x9C0000
	0x9F0000, 0x9E0000, 0xA40000, 0xA00000, 0xAC0000, 0xA20000, 0xB70000, 0xA50000, 0xC40000, 0xA80000, 0xD30000, 0xAB0000, 0xDE0000, 0xAE0000, 0xE80000, 0xB00000
	0xEF0000, 0xB20000, 0xF40000, 0xB50000, 0xF90000, 0xB80000, 0xFC0000, 0xBB0000, 0xFE0000, 0xBE0000, 0xFF0000, 0xC00000, 0x1000000, 0xC20000, 0x1010000, 0xC50000
	0x1020000, 0xC80000, 0x1020000, 0xCC0000, 0x1010000, 0xD10000, 0xFD0000, 0xD70000, 0xF90000, 0xDE0000, 0xF90000, 0x1180000, 0x600000, 0x880000, 0x500000, 0x680000
	0x440000, 0x460000, 0x3C0000, 0x360000, 0x360000, 0x2A0000, 0x330000, 0x240000, 0x310000, 0x200000, 0x300000, 0x1E0000
end table

public table Tornado_table48
	-0x3A0000, -0x880000, -0xC0000, -0x220000, -0x80000, -0x100000, -0x40000, -0x80000, -0x20000, -0x40000, -0x10000, -0x20000, -0x10000, -0x20000
end table

public table Tornado_table49
	51, 53, 54, 55, 0x154D, 51
end table

public table Tornado_table50
	51, 56, 57, 58, 59, 58, 57, 56, 51
end table


function Tornado_Function97
	object.value15++
	if object.value15 >= 12
		object.value15 = 0
		object.value16 += 4
		if object.value16 >= 24
			object.value16 = 0
		end if
	end if
	temp1 = object.value16
	GetTableValue(temp0, temp1, PlayerObject_TailsSuperPal)
	SetPaletteEntry(0, 202, temp0)
	temp1++
	GetTableValue(temp0, temp1, PlayerObject_TailsSuperPal)
	SetPaletteEntry(0, 205, temp0)
	temp1++
	GetTableValue(temp0, temp1, PlayerObject_TailsSuperPal)
	SetPaletteEntry(0, 206, temp0)
	temp1++
	GetTableValue(temp0, temp1, PlayerObject_TailsSuperPal)
	SetPaletteEntry(0, 203, temp0)
end function


function Tornado_Function98
	object.frame++
	object.frame &= 3
	if object.value2 < 2
		if stage.playerListPos == 1
			GetTableValue(object.value1, object.value3, Tornado_table41)
			object.value3++
			GetTableValue(object.value2, object.value3, Tornado_table41)
			object.value3++
		else
			GetTableValue(object.value1, object.value3, Tornado_table42)
			object.value3++
			GetTableValue(object.value2, object.value3, Tornado_table42)
			object.value3++
		end if
		object.value3 &= 15
	else
		object.value2--
	end if
end function


event ObjectMain
	object.drawOrder = 4
	if stage.playerListPos == 1
		if PlayerObject_SuperState != 0
			CallFunction(Tornado_Function97)
		end if
	end if
	switch object.state
	case 0
		object.xpos += 0x10000
		object.ypos -= 0x8000
		if object.xpos == 0xB40000
			if PlayerObject_SuperState != 0
				if stage.playerListPos == 2
					object[0].animation = ANI_GLIDING_DROP
				end if
			end if
		end if
		if object.xpos > 0xD40000
			if PlayerObject_SuperState == 0
				object[0].animation = ANI_STOPPED
			else
				if stage.playerListPos == 1
					object[0].animation = ANI_STOPPED
				end if
				if stage.playerListPos == 2
					object[0].animation = ANI_STOPPED
				end if
			end if
			EndingSetup_value33 = -0x10000
			arrayPos0 = object[34].entityPos
			temp0 = 0
			temp1 = 0
			temp3 = 0
			while temp0 < 20
				object[arrayPos0].type = TypeName[Bird]
				object[arrayPos0].priority = PRIORITY_ACTIVE
				object[arrayPos0].value0 = temp1
				if temp3 == 0
					object[arrayPos0].drawOrder = 3
				else
					object[arrayPos0].drawOrder = 5
				end if
				temp3 ^= 1
				Rand(temp2, 16)
				temp1 += temp2
				arrayPos0++
				temp0++
			loop
			switch stage.playerListPos
			case 0
			case 3
				if specialStage.emeralds >= 127
					object.value12 = 64
					object.value9 = 1
					stage.newXBoundary2 = screen.xsize
					stage.newYBoundary2 = 376
					stage.newYBoundary2 += screen.ysize
					stage.deathBoundary = stage.newYBoundary2
					stage.deathBoundary <<= 16
				end if
				break
			end switch
			object.state = 1
		end if
		CallFunction(Tornado_Function98)
		break
	case 1
		EndingSetup_value34 += 0x400
		if EndingSetup_value34 >= 0
			object.state = 2
		end if
		CallFunction(Tornado_Function98)
		break
	case 2
		object.value0++
		if object.value0 >= 0x44E
			object.value0 = 0
			switch stage.playerListPos
			case 0
			case 3
				if PlayerObject_SuperState == 0
					object[0].visible = 0
				end if
				break
			case 1
			case 2
				object[0].visible = 0
				break
			end switch
			object.state = 3
		end if
		CallFunction(Tornado_Function98)
		break
	case 3
		switch stage.playerListPos
		case 0
		case 3
			if PlayerObject_SuperState != 0
				if object.value9 != 3
					object.value12++
					if object.value12 >= 90
						object.value12 = 0
						object[0].visible = 0
						object.value9 = 3
					end if
				end if
			end if
			break
		end switch
		object.value0--
		if object.value0 < 0
			object.value0 = 2
			switch stage.playerListPos
			case 0
			case 3
				if specialStage.emeralds < 127
					GetTableValue(object.frame, object.value4, Tornado_table43)
				else
					GetTableValue(object.frame, object.value4, Tornado_table44)
				end if
				break
			case 1
				GetTableValue(object.frame, object.value4, Tornado_table45)
				break
			case 2
				GetTableValue(object.frame, object.value4, Tornado_table46)
				break
			end switch
			temp0 = object.value4
			temp0 <<= 1
			GetTableValue(object.xpos, temp0, Tornado_table47)
			object.xpos += 0x340000
			temp0++
			GetTableValue(object.ypos, temp0, Tornado_table47)
			temp0 = screen.cameraY
			temp0 -= screen.ycenter
			temp0 += 32
			temp0 <<= 16
			object.ypos += temp0
			object.value4++
			if object.value4 >= 28
				object.value0 = 0
				object.value4 = 0
				if stage.playerListPos == 1
					object.frame = 49
				else
					object.frame = 50
				end if
				object.xpos -= 0x220000
				object.ypos += 0x450000
				object.state = 4
			end if
		end if
		break
	case 4
		switch stage.playerListPos
		case 0
		case 3
			if PlayerObject_SuperState != 0
				if object.value9 != 3
					object.value12++
					if object.value12 >= 90
						object.value12 = 0
						object[0].visible = 0
						object.value9 = 3
					end if
				end if
			end if
			break
		end switch
		object.value0++
		if object.value0 >= 120
			object.value0 = 0
			object.state = 5
		end if
		break
	case 5
		object.value0--
		if object.value0 < 0
			object.value0 = 2
			temp0 = object.value4
			temp0 <<= 1
			GetTableValue(temp1, temp0, Tornado_table48)
			object.xpos += temp1
			temp0++
			GetTableValue(temp1, temp0, Tornado_table48)
			object.ypos += temp1
			object.value4++
			if object.value4 >= 7
				object.value0 = 0
				object.state = 6
			end if
		end if
		break
	case 6
		object.value0++
		if object.value0 == 4
			object.value0 = 0
			GetTableValue(object.value6, 0, Tornado_table49)
			GetTableValue(object.value7, 0, Tornado_table50)
			object.state = 7
		end if
		break
	case 7
		if object.alpha < 256
			object.alpha += 4
		end if
		object.value0++
		if object.value0 == 90
			object.value0 = 0
			object.value8 = 0
			object.state = 8
		end if
		break
	case 8
		object.value5++
		if object.value5 == 2
			object.value5 = 0
			object.value8++
			GetTableValue(object.value6, object.value8, Tornado_table49)
			if object.value8 == 6
				object.value8 = 0
				object.state = 9
			end if
		end if
		break
	case 9
		object.value5++
		if object.value5 == 2
			object.value5 = 0
			object.value8++
			GetTableValue(object.value7, object.value8, Tornado_table50)
			if object.value8 == 9
				object.value8 = 0
				object.state = 10
			end if
		end if
		break
	case 10
		object.value0++
		if object.value0 >= 240
			object.value0 = 0
			object.state = 11
		end if
		break
	case 11
		if object.value0 < 320
			object.value0 += 12
		else
			stage.activeList = PRESENTATION_STAGE
			stage.listPos = 2
			LoadStage()
		end if
		if object.value0 > 0
			temp0 = object.value0
		else
			temp0 = 0
		end if
		SetScreenFade(0, 0, 0, temp0)
		break
	end switch
	switch object.value9
	case 0
		break
	case 1
		object[0].xpos += 0x8000
		object[0].ypos += 0x10000
		object.value12--
		if object.value12 < 0
			object.value13 = object[0].xpos
			object.value14 = object[0].ypos
			object.value9 = 2
		end if
		break
	case 2
		break
	case 3
		object.value12--
		if object.value12 < 0
			object.value12 = 2
			GetTableValue(object.value10, object.value11, Tornado_table51)
			temp0 = object.value11
			temp0 <<= 1
			GetTableValue(object.value13, temp0, Tornado_table52)
			object.value13 += 0x340000
			temp0++
			GetTableValue(object.value14, temp0, Tornado_table52)
			temp0 = screen.cameraY
			temp0 -= screen.ycenter
			temp0 += 32
			temp0 <<= 16
			object.value14 += temp0
			object.value11++
			if object.value11 >= 30
				object.value12 = 0
				object.value9 = 4
			end if
		end if
		break
	case 4
		object.value12++
		if object.value12 >= 60
			object.value12 = 0
			object.value9 = 5
		end if
		break
	case 5
		object.value12--
		if object.value12 < 0
			object.value12 = 2
			GetTableValue(object.value10, object.value11, Tornado_table51)
			temp0 = object.value11
			temp0 <<= 1
			GetTableValue(object.value13, temp0, Tornado_table52)
			object.value13 += 0x340000
			temp0++
			GetTableValue(object.value14, temp0, Tornado_table52)
			temp0 = screen.cameraY
			temp0 -= screen.ycenter
			temp0 += 32
			temp0 <<= 16
			object.value14 += temp0
			object.value11++
			if object.value11 >= 38
				object.value9 = 6
			end if
		end if
		break
	case 6
		break
	end switch
	object.value17 = 60
	object.animationTimer++
	if object.animationTimer == 3
		object.animationTimer = 0
		object.value17 ^= 1
	end if
end event


event ObjectDraw
	switch object.state
	case 0
	case 1
	case 2
		DrawSprite(object.frame)
		DrawSprite(4)
		DrawSprite(object.value1)
		DrawSprite(object.value17) //me do animate :mindblown:
		break
	case 3
		DrawSprite(object.frame)
		break
	case 4
		break
	case 5
		DrawSprite(object.frame)
		temp0 = object.xpos
		temp1 = object.ypos
		switch stage.playerListPos
		case 0
		case 3
			if specialStage.emeralds < 127
				temp0 -= 0x220000
				temp1 -= 0x2F0000
				DrawSpriteXY(24, temp0, temp1)
			end if
			break
		case 1
			temp0 -= 0x240000
			temp1 -= 0x2D0000
			DrawSpriteXY(32, temp0, temp1)
			break
		case 2
			temp0 -= 0x220000
			temp1 -= 0x2F0000
			DrawSpriteXY(40, temp0, temp1)
			break
		end switch
		break
	case 6
		DrawSprite(object.frame)
		temp0 = object.xpos
		temp1 = object.ypos
		switch stage.playerListPos
		case 0
		case 3
			if specialStage.emeralds < 127
				temp0 -= 0x2A0000
				temp1 -= 0x2F0000
				DrawSpriteXY(25, temp0, temp1)
			end if
			break
		case 1
			temp0 -= 0x2A0000
			temp1 -= 0x250000
			DrawSpriteXY(33, temp0, temp1)
			break
		case 2
			temp0 -= 0x2A0000
			temp1 -= 0x270000
			DrawSpriteXY(41, temp0, temp1)
			break
		end switch
		break
	case 7
	case 8
	case 9
	case 10
	case 11
		temp0 = screen.xsize
		temp0 -= 79
		temp1 = screen.ysize
		temp1 -= 38
		DrawSpriteScreenFX(52, FX_INK, temp0, temp1)
		DrawSpriteScreenFX(object.value6, FX_INK, temp0, temp1)
		DrawSpriteScreenFX(object.value7, FX_INK, temp0, temp1)
		DrawSprite(object.frame)
		temp0 = object.xpos
		temp1 = object.ypos
		switch stage.playerListPos
		case 0
		case 3
			if specialStage.emeralds < 127
				temp0 -= 0x6E0000
				temp1 -= 0x670000
				DrawSpriteXY(26, temp0, temp1)
			end if
			break
		case 1
			temp0 -= 0x6D0000
			temp1 -= 0x670000
			DrawSpriteXY(34, temp0, temp1)
			break
		case 2
			temp0 -= 0x660000
			temp1 -= 0x670000
			DrawSpriteXY(42, temp0, temp1)
			break
		end switch
		break
	end switch
	switch object.value9
	case 3
	case 4
	case 5
	case 6
		DrawSpriteXY(object.value10, object.value13, object.value14)
		break
	end switch
	if object.state >= 5
		GetBit(temp0, oscillation, 1)
		temp0 += 17
		DrawSprite(temp0)
	end if
end event


event ObjectStartup
	LoadSpriteSheet("Ending/Objects.gif")
	SpriteFrame(21, 8, 4, 24, 373, 191)
	SpriteFrame(21, 11, 4, 18, 378, 194)
	SpriteFrame(21, 16, 4, 8, 383, 199)
	SpriteFrame(21, 11, 4, 18, 388, 194)
	SpriteFrame(-95, -16, 116, 64, 256, 191)
	SpriteFrame(-45, -8, 21, 16, 256, 174)
	SpriteFrame(-45, -8, 21, 16, 278, 174)
	SpriteFrame(-45, -8, 21, 16, 300, 174)
	SpriteFrame(-45, -8, 21, 16, 322, 174)
	SpriteFrame(-47, -8, 23, 16, 344, 174)
	SpriteFrame(-50, -8, 24, 16, 256, 157)
	SpriteFrame(-50, -8, 24, 16, 281, 157)
	SpriteFrame(-32, -16, 60, 32, 1, 1)
	SpriteFrame(-24, -12, 44, 24, 63, 1)
	SpriteFrame(-20, -12, 39, 24, 108, 1)
	SpriteFrame(-20, -12, 40, 24, 149, 1)
	SpriteFrame(-19, -12, 38, 24, 190, 1)
	SpriteFrame(-10, 7, 31, 31, 1, 34)
	SpriteFrame(-11, 6, 31, 31, 33, 34)
	SpriteFrame(-32, -28, 60, 44, 65, 26)
	SpriteFrame(-24, -24, 44, 36, 126, 26)
	SpriteFrame(-20, -19, 39, 31, 171, 26)
	SpriteFrame(-20, -19, 40, 31, 211, 26)
	SpriteFrame(-19, -15, 38, 27, 1, 146)
	SpriteFrame(0, 0, 31, 38, 4, 179)
	SpriteFrame(2, 5, 29, 42, 36, 175)
	SpriteFrame(3, 3, 77, 96, 178, 159)
	SpriteFrame(-32, -26, 60, 42, 1, 68)
	SpriteFrame(-24, -23, 44, 34, 62, 75)
	SpriteFrame(-20, -18, 39, 30, 1, 115)
	SpriteFrame(-20, -19, 40, 31, 41, 115)
	SpriteFrame(-19, -15, 38, 27, 82, 115)
	SpriteFrame(0, 2, 31, 36, 1, 219)
	SpriteFrame(0, 10, 32, 37, 33, 218)
	SpriteFrame(1, 0, 111, 96, 66, 159)
	SpriteFrame(-32, -32, 60, 48, 181, 256)
	SpriteFrame(-24, -24, 44, 36, 181, 305)
	SpriteFrame(-20, -19, 39, 31, 181, 342)
	SpriteFrame(-20, -19, 40, 31, 181, 374)
	SpriteFrame(-19, -15, 38, 27, 181, 406)
	SpriteFrame(0, 0, 31, 38, 382, 217)
	SpriteFrame(0, 0, 32, 39, 414, 216)
	SpriteFrame(0, 0, 64, 104, 447, 151)
	SpriteFrame(-11, -8, 19, 16, 124, 84)
	SpriteFrame(-8, -8, 15, 12, 128, 101)
	SpriteFrame(-7, -8, 11, 14, 132, 144)
	SpriteFrame(-7, -7, 13, 13, 130, 129)
	SpriteFrame(-6, -8, 13, 15, 130, 143)
	SpriteFrame(1, 4, 111, 92, 144, 66)
	SpriteFrame(-90, -53, 179, 105, 1, 256)
	SpriteFrame(-90, -53, 179, 105, 1, 362)
	SpriteFrame(0, 0, 0, 0, 391, 256)
	SpriteFrame(-60, -20, 120, 49, 391, 256)
	SpriteFrame(-63, -22, 81, 38, 397, 306)
	SpriteFrame(-63, -22, 81, 38, 397, 345)
	SpriteFrame(-63, -22, 81, 38, 397, 384)
	SpriteFrame(28, -20, 32, 39, 479, 306)
	SpriteFrame(28, -20, 32, 39, 479, 346)
	SpriteFrame(28, -20, 32, 39, 479, 386)
	SpriteFrame(28, -20, 32, 39, 479, 426)
	SpriteFrame(-71, 32, 32, 16, 242, 256) //60
	SpriteFrame(-55, 32, 16, 16, 275, 256) //61
end event

event RSDKDraw
	DrawSprite(0)
end event

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