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

//-------Aliases-------//
private alias 52 : TYPE_BALLCANNON

// Function declarations
reserve function BallCannon_DebugDraw
reserve function BallCannon_DebugSpawn

// Static Values
private value BallCannon_value36 = 0;

// Tables
private table BallCannon_table0
	0, 0, 1, 0, 2, 0
end table

private table BallCannon_table1
	0, 2, 1, 2, 2, 2
end table

private table BallCannon_table2
	3, 1, 4, 1, 5, 1
end table

private table BallCannon_table3
	3, 0, 4, 0, 5, 0
end table

private table BallCannon_table4
	6, 7, 8, 9, 10, 11, 12, 13
end table

private table BallCannon_table5
	13, 12, 11, 10, 9, 8, 7, 6
end table

function BallCannon_DebugDraw
	temp0 = object[0].value17
	temp0 -= BallCannon_value36
	DrawSprite(temp0)
end function


function BallCannon_DebugSpawn
	temp0 = object[0].value17
	temp0 -= BallCannon_value36
	CreateTempObject(TypeName[Ball Cannon], temp0, object.xpos, object.ypos)
	object[tempObjectPos].drawOrder = 4
	object[tempObjectPos].value2 = BallCannon_table0
	object[tempObjectPos].value3 = BallCannon_table3
	object[tempObjectPos].value4 = BallCannon_table5
	object[tempObjectPos].xvel = 0x100000
	object[tempObjectPos].yvel = 0
	object[tempObjectPos].value6 = 1
	switch object[tempObjectPos].propertyValue
	case 0
		object[tempObjectPos].value2 = BallCannon_table0
		object[tempObjectPos].value3 = BallCannon_table3
		object[tempObjectPos].value4 = BallCannon_table5
		object[tempObjectPos].xvel = 0x100000
		object[tempObjectPos].yvel = 0
		break
	case 1
		object[tempObjectPos].value2 = BallCannon_table3
		object[tempObjectPos].value3 = BallCannon_table1
		object[tempObjectPos].value4 = BallCannon_table5
		object[tempObjectPos].xvel = 0
		object[tempObjectPos].yvel = 0x100000
		break
	case 2
		object[tempObjectPos].value2 = BallCannon_table1
		object[tempObjectPos].value3 = BallCannon_table2
		object[tempObjectPos].value4 = BallCannon_table5
		object[tempObjectPos].xvel = -0x100000
		object[tempObjectPos].yvel = 0
		break
	case 3
		object[tempObjectPos].value2 = BallCannon_table2
		object[tempObjectPos].value3 = BallCannon_table0
		object[tempObjectPos].value4 = BallCannon_table5
		object[tempObjectPos].xvel = 0
		object[tempObjectPos].yvel = -0x100000
		break
	case 4
		object[tempObjectPos].value2 = BallCannon_table3
		object[tempObjectPos].value3 = BallCannon_table0
		object[tempObjectPos].value4 = BallCannon_table4
		object[tempObjectPos].xvel = 0
		object[tempObjectPos].yvel = -0x100000
		break
	case 5
		object[tempObjectPos].value2 = BallCannon_table1
		object[tempObjectPos].value3 = BallCannon_table3
		object[tempObjectPos].value4 = BallCannon_table4
		object[tempObjectPos].xvel = 0x100000
		object[tempObjectPos].yvel = 0
		break
	case 6
		object[tempObjectPos].value2 = BallCannon_table2
		object[tempObjectPos].value3 = BallCannon_table1
		object[tempObjectPos].value4 = BallCannon_table4
		object[tempObjectPos].xvel = 0
		object[tempObjectPos].yvel = 0x100000
		break
	case 7
		object[tempObjectPos].value2 = BallCannon_table0
		object[tempObjectPos].value3 = BallCannon_table2
		object[tempObjectPos].value4 = BallCannon_table4
		object[tempObjectPos].xvel = -0x100000
		object[tempObjectPos].yvel = 0
		break
	end switch
end function


event ObjectMain
	switch object.state
	case 1
		if object.value0 == 0
			if object.value1 == 6
				object.value1 = 0
				object.value0 = 3
				object.state++
			else
				GetTableValue(object.frame, object.value1, object.value2)
				object.value1++
				GetTableValue(object.direction, object.value1, object.value2)
				object.value1++
			end if
		end if
		object.value0++
		object.value0 &= 3
		break
	case 2
		if object.value0 == 0
			if object.value1 == 8
				object.value1 = 5
				object.value0 = 1
				object.state++
			else
				GetTableValue(object.frame, object.value1, object.value4)
				object.direction = FLIP_NONE
				object.value1++
			end if
		end if
		object.value0++
		object.value0 &= 1
		break
	case 3
		if object.value0 == 0
			foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
				BoxCollisionTest(C_TOUCH, object.entityPos, -4, -4, 4, 4, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
				if checkResult == 0
					SetBit(object.value5, currentPlayer, 0)
				end if
			next
			
			if object.value1 < 0
				object.value1 = 0
				object.state++
				foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
					temp0 = 1
					temp0 <<= currentPlayer
					temp0 &= object.value5
					if temp0 != 0
						if object.value6 == 1
							object[currentPlayer].state = PlayerObject_HandleAir
							object[currentPlayer].gravity = GRAVITY_AIR
							object[currentPlayer].value35 = 0
							object[currentPlayer].tileCollisions = 1
						end if
						object[currentPlayer].visible = 1
						object[currentPlayer].value1 = 0
						object[currentPlayer].speed = object.xvel
						object[currentPlayer].xvel = object.xvel
						object[currentPlayer].yvel = object.yvel
					end if
				next
			else
				GetTableValue(object.direction, object.value1, object.value3)
				object.value1--
				GetTableValue(object.frame, object.value1, object.value3)
				object.value1--
			end if
		end if
		object.value0++
		object.value0 &= 3
		break
	case 4
		object.value0++
		if object.value0 == 16
			object.value0 = 0
			object.value5 = 0
			object.state = 0
		end if
		break
	end switch
	foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
		BoxCollisionTest(C_TOUCH, object.entityPos, -4, -4, 4, 4, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
		if checkResult == 1
			temp0 = 1
			temp0 <<= currentPlayer
			temp0 &= object.value5
			if temp0 == 0
				object[currentPlayer].state = PlayerObject_Blank
				object[currentPlayer].value15 = 0
				object[currentPlayer].animation = ANI_JUMPING
				object[currentPlayer].animationSpeed = 240
				object[currentPlayer].value5 = 240
				object[currentPlayer].xpos = object.xpos
				object[currentPlayer].ypos = object.ypos
				object[currentPlayer].speed = 0
				object[currentPlayer].xvel = 0
				object[currentPlayer].yvel = 0
				object[currentPlayer].visible = 0
				object[currentPlayer].tileCollisions = 0
				temp0 = 1
				temp0 <<= currentPlayer
				object.value5 |= temp0
				object.value0 = 0
				object.value1 = 0
				object.state = 1
				if object.priority != PRIORITY_XBOUNDS_DESTROY
					object.priority = PRIORITY_ACTIVE
				end if
				PlaySfx(SfxName[Rolling], 0)
			end if
		end if
	next
	if object.outOfBounds == 1
		if object.priority != PRIORITY_XBOUNDS_DESTROY
			object.priority = PRIORITY_ACTIVE_BOUNDS
			object.value1 = 0
			object.value5 = 0
			object.value0 = 0
			GetTableValue(object.frame, 0, object.value2)
			GetTableValue(object.direction, 1, object.value2)
			object.state = 0
		end if
	end if
end event


event ObjectDraw
	DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)
end event


event ObjectStartup
	CheckCurrentStageFolder("Zone07")
	if checkResult == 1
		LoadSpriteSheet("OOZ/Objects.gif")
		SpriteFrame(-24, -40, 48, 64, 133, 142)
		SpriteFrame(-24, -32, 48, 56, 133, 85)
		SpriteFrame(-24, -24, 48, 48, 133, 93)
		SpriteFrame(-24, -24, 64, 48, 1, 101)
		SpriteFrame(-24, -24, 56, 48, 1, 150)
		SpriteFrame(-24, -24, 48, 48, 1, 150)
		SpriteFrame(-24, -24, 48, 48, 316, 1)
		SpriteFrame(-24, -24, 48, 48, 365, 1)
		SpriteFrame(-24, -24, 48, 48, 414, 1)
		SpriteFrame(-24, -24, 48, 48, 463, 1)
		SpriteFrame(-24, -24, 48, 48, 316, 50)
		SpriteFrame(-24, -24, 48, 48, 365, 50)
		SpriteFrame(-24, -24, 48, 48, 414, 50)
		SpriteFrame(-24, -24, 48, 48, 463, 50)
	else
		LoadSpriteSheet("MBZ/Objects.gif")
		SpriteFrame(-24, -40, 48, 64, 813, 861)
		SpriteFrame(-24, -32, 48, 56, 764, 869)
		SpriteFrame(-24, -24, 48, 48, 764, 877)
		SpriteFrame(-24, -24, 64, 48, 763, 926)
		SpriteFrame(-24, -24, 56, 48, 771, 975)
		SpriteFrame(-24, -24, 48, 48, 771, 975)
		SpriteFrame(-24, -24, 48, 48, 828, 926)
		SpriteFrame(-24, -24, 48, 48, 877, 926)
		SpriteFrame(-24, -24, 48, 48, 926, 926)
		SpriteFrame(-24, -24, 48, 48, 975, 926)
		SpriteFrame(-24, -24, 48, 48, 828, 975)
		SpriteFrame(-24, -24, 48, 48, 877, 975)
		SpriteFrame(-24, -24, 48, 48, 926, 975)
		SpriteFrame(-24, -24, 48, 48, 975, 975)
	end if
	foreach (TypeName[Ball Cannon], arrayPos0, ALL_ENTITIES)
		if object[arrayPos0].propertyValue > 7
			object[arrayPos0].value6 = 1
			object[arrayPos0].propertyValue &= 7
		end if
		switch object[arrayPos0].propertyValue
		case 0
			object[arrayPos0].value2 = BallCannon_table0
			object[arrayPos0].value3 = BallCannon_table3
			object[arrayPos0].value4 = BallCannon_table5
			object[arrayPos0].xvel = 0x100000
			object[arrayPos0].yvel = 0
			break
		case 1
			object[arrayPos0].value2 = BallCannon_table3
			object[arrayPos0].value3 = BallCannon_table1
			object[arrayPos0].value4 = BallCannon_table5
			object[arrayPos0].xvel = 0
			object[arrayPos0].yvel = 0x100000
			break
		case 2
			object[arrayPos0].value2 = BallCannon_table1
			object[arrayPos0].value3 = BallCannon_table2
			object[arrayPos0].value4 = BallCannon_table5
			object[arrayPos0].xvel = -0x100000
			object[arrayPos0].yvel = 0
			break
		case 3
			object[arrayPos0].value2 = BallCannon_table2
			object[arrayPos0].value3 = BallCannon_table0
			object[arrayPos0].value4 = BallCannon_table5
			object[arrayPos0].xvel = 0
			object[arrayPos0].yvel = -0x100000
			break
		case 4
			object[arrayPos0].value2 = BallCannon_table3
			object[arrayPos0].value3 = BallCannon_table0
			object[arrayPos0].value4 = BallCannon_table4
			object[arrayPos0].xvel = 0
			object[arrayPos0].yvel = -0x100000
			break
		case 5
			object[arrayPos0].value2 = BallCannon_table1
			object[arrayPos0].value3 = BallCannon_table3
			object[arrayPos0].value4 = BallCannon_table4
			object[arrayPos0].xvel = 0x100000
			object[arrayPos0].yvel = 0
			break
		case 6
			object[arrayPos0].value2 = BallCannon_table2
			object[arrayPos0].value3 = BallCannon_table1
			object[arrayPos0].value4 = BallCannon_table4
			object[arrayPos0].xvel = 0
			object[arrayPos0].yvel = 0x100000
			break
		case 7
			object[arrayPos0].value2 = BallCannon_table0
			object[arrayPos0].value3 = BallCannon_table2
			object[arrayPos0].value4 = BallCannon_table4
			object[arrayPos0].xvel = -0x100000
			object[arrayPos0].yvel = 0
			break
		end switch
		object[arrayPos0].drawOrder = 4
		object[arrayPos0].propertyValue = 0
		GetTableValue(object[arrayPos0].frame, 0, object[arrayPos0].value2)
		GetTableValue(object[arrayPos0].direction, 1, object[arrayPos0].value2)
	next
	temp0 = 0
	BallCannon_value36 = DebugMode_ObjCount
	while temp0 < 4
		SetTableValue(TypeName[Ball Cannon], DebugMode_ObjCount, DebugMode_TypesTable)
		SetTableValue(BallCannon_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
		SetTableValue(BallCannon_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
		DebugMode_ObjCount++
		temp0++
	loop
end event

event RSDKDraw
	DrawSprite(0)
end event

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