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

//-------Aliases-------//
private alias 49 : TYPE_HFLIPPER

// Function declarations
reserve function HFlipper_DebugDraw
reserve function HFlipper_DebugSpawn
reserve function HFlipper_Function122

// Static Values

// Tables
private table HFlipper_table0
	-8, -8, -8, -8, -9, -9, -9, -9, -9, -9, -9, -8, -8, -7, -7, -6, -6, -5, -5, -4, -4, -3, -3, -2, -2, -1, -1, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 10, 11, 
end table

private table HFlipper_table1
	5, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18
end table

private table HFlipper_table2
	11, 10, 9, 8, 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0, -1, -1, -2, -2, -3, -3, -4, -4, -5, -5, -6, -6, -7, -7, -8, -8, -9, -9, -9, -9, -9, -9, -9, -8, -8, -8, -8, 
end table

private table HFlipper_table3
	18, 18, 18, 18, 18, 18, 18, 17, 17, 17, 17, 16, 16, 16, 16, 15, 15, 15, 15, 14, 14, 14, 14, 13, 13, 13, 13, 12, 12, 12, 12, 11, 11, 11, 11, 10, 10, 10, 10, 9, 9, 9, 8, 8, 7, 7, 6, 5
end table

function HFlipper_DebugDraw
	DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)
end function


function HFlipper_DebugSpawn
	CreateTempObject(TypeName[H Flipper], 0, object.xpos, object.ypos)
	object[tempObjectPos].direction = object.direction
	if object[tempObjectPos].direction == FLIP_NONE
		object[tempObjectPos].value1 = HFlipper_table0
		object[tempObjectPos].value2 = HFlipper_table1
	else
		object[tempObjectPos].value1 = HFlipper_table2
		object[tempObjectPos].value2 = HFlipper_table3
	end if
end function


function HFlipper_Function122
	temp0 = object[currentPlayer].ixpos
	temp0 -= object.ixpos
	if object.direction == FLIP_X
		FlipSign(temp0)
	end if
	temp0 += 35
	temp2 = temp0
	if temp2 > 64
		temp2 = 64
	end if
	temp2 <<= 5
	temp2 += 0x800
	FlipSign(temp2)
	temp3 = temp0
	temp3 >>= 2
	temp3 += 64
	Sin256(temp0, temp3)
	Cos256(temp1, temp3)
	temp0 *= temp2
	temp1 *= temp2
	object[currentPlayer].yvel = temp0
	if object.direction == FLIP_X
		FlipSign(temp1)
	end if
	object[currentPlayer].speed = temp1
	object[currentPlayer].xvel = temp1
end function


event ObjectMain
	switch object.state
	case 1
		object.frame = object.value0
		object.frame >>= 2
		object.frame++
		if object.value0 < 12
			object.value0++
		else
			object.value0 = 0
			object.frame = 0
			object.state = 0
		end if
		break
	end switch
	foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
		CheckEqual(object[currentPlayer].state, PlayerObject_Death)
		temp0 = checkResult
		CheckEqual(object[currentPlayer].state, PlayerObject_Hurt)
		temp0 |= checkResult
		if temp0 == 0
			object.value4 = object[currentPlayer].xpos
			object.value4 -= object.xpos
			object.value4 >>= 16
			object.value3 = object.value4
			object.value3 += object[currentPlayer].collisionLeft
			object.value5 = object.value4
			object.value5 += object[currentPlayer].collisionRight
			object.value3 += 24
			if object.value3 < 0
				object.value3 = 0
			end if
			if object.value3 > 47
				object.value3 = 47
			end if
			object.value4 += 24
			if object.value4 < 0
				object.value4 = 0
			end if
			if object.value4 > 47
				object.value4 = 47
			end if
			object.value5 += 24
			if object.value5 < 0
				object.value5 = 0
			end if
			if object.value5 > 47
				object.value5 = 47
			end if
			GetTableValue(object.value6, object.value3, object.value1)
			GetTableValue(object.value7, object.value4, object.value1)
			GetTableValue(object.value8, object.value5, object.value1)
			object.value9 = object.value6
			if object.value7 < object.value9
				object.value9 = object.value7
			end if
			if object.value8 < object.value9
				object.value9 = object.value8
			end if
			GetTableValue(object.value6, object.value3, object.value2)
			GetTableValue(object.value7, object.value4, object.value2)
			GetTableValue(object.value8, object.value5, object.value2)
			object.value10 = object.value6
			if object.value7 > object.value10
				object.value10 = object.value7
			end if
			if object.value8 > object.value10
				object.value10 = object.value8
			end if
			if object[currentPlayer].state != PlayerObject_Blank
				BoxCollisionTest(C_BOX, object.entityPos, -24, object.value9, 24, object.value10, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
				if checkResult == 4
					CheckEqual(object[currentPlayer].state, PlayerObject_KnuxWallClimb)
					temp0 = checkResult
					CheckEqual(object[currentPlayer].state, PlayerObject_KnuxGlideLeft)
					temp0 |= checkResult
					CheckEqual(object[currentPlayer].state, PlayerObject_KnuxGlideRight)
					temp0 |= checkResult
					CheckEqual(object[currentPlayer].state, PlayerObject_HandleTailsFlight)
					temp0 |= checkResult
					CheckEqual(object[currentPlayer].state, PlayerObject_HandleRollDecel)
					temp0 |= checkResult
					CheckEqual(object[currentPlayer].state, PlayerObject_Unknown)
					temp0 |= checkResult
					if temp0 == 0
						object[currentPlayer].state = PlayerObject_HandleAir
						object[currentPlayer].gravity = GRAVITY_AIR
					end if
				end if
				temp0 = 4
			else
				temp0 = 12
			end if
			object.value9 -= temp0
			object.value10 = object.value9
			object.value10 += 8
			BoxCollisionTest(C_TOUCH, object.entityPos, -24, object.value9, 24, object.value10, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
			if checkResult == 1
				object[currentPlayer].ypos = object.value9
				object[currentPlayer].ypos += temp0
				object[currentPlayer].ypos -= object[currentPlayer].collisionBottom
				object[currentPlayer].ypos <<= 16
				object[currentPlayer].ypos += object.ypos
				if object.state == 0
					if object.direction == FLIP_NONE
						BoxCollisionTest(C_TOUCH, object.entityPos, -26, -12, 20, 8, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
					else
						BoxCollisionTest(C_TOUCH, object.entityPos, -20, -12, 26, 8, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
					end if
					if checkResult == 1
						CheckEqual(object[currentPlayer].state, PlayerObject_HandleRollDecel)
						temp0 = checkResult
						CheckEqual(object[currentPlayer].state, PlayerObject_Unknown)
						temp0 |= checkResult
						if temp0 == 0
							object[currentPlayer].state = PlayerObject_HandleRolling
							object[currentPlayer].animation = ANI_JUMPING
						end if
						object[currentPlayer].scrollTracking = 0
						object[currentPlayer].gravity = GRAVITY_GROUND
						object[currentPlayer].controlLock = 8
						if object[currentPlayer].jumpPress == 1
							CheckEqual(object[currentPlayer].state, PlayerObject_HandleRollDecel)
							temp0 = checkResult
							CheckEqual(object[currentPlayer].state, PlayerObject_Unknown)
							temp0 |= checkResult
							if temp0 == 0
								object[currentPlayer].state = PlayerObject_HandleAir
							end if
							object[currentPlayer].gravity = GRAVITY_AIR
							object[currentPlayer].value1 = 0
							object[currentPlayer].controlLock = 0
							CallFunction(HFlipper_Function122)
							object.state = 1
							StopSfx(SfxName[Jump])
							PlaySfx(SfxName[Flipper], 0)
						else
							object[currentPlayer].speed = object.xvel
							object[currentPlayer].xvel = object.xvel
							object[currentPlayer].yvel = 0
						end if
					else
						CheckEqual(object[currentPlayer].state, PlayerObject_HandleRollDecel)
						temp0 = checkResult
						CheckEqual(object[currentPlayer].state, PlayerObject_Unknown)
						temp0 |= checkResult
						if temp0 == 0
							object[currentPlayer].state = PlayerObject_HandleAir
						end if
						object[currentPlayer].gravity = GRAVITY_AIR
						object[currentPlayer].value1 = 0
					end if
					object[currentPlayer].animation = ANI_JUMPING
					object[currentPlayer].value15 = 0
					if object[currentPlayer].prevAnimation != ANI_JUMPING
						object[currentPlayer].iypos -= object[currentPlayer].value30
					end if
				else
					CheckEqual(object[currentPlayer].state, PlayerObject_HandleRollDecel)
					temp0 = checkResult
					CheckEqual(object[currentPlayer].state, PlayerObject_Unknown)
					temp0 |= checkResult
					if temp0 == 0
						object[currentPlayer].state = PlayerObject_HandleAir
					end if
					CallFunction(HFlipper_Function122)
					object[currentPlayer].gravity = GRAVITY_AIR
					object[currentPlayer].value1 = 0
				end if
			end if
		end if
	next
end event


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


event ObjectStartup
	CheckCurrentStageFolder("Zone04")
	if checkResult == 1
		LoadSpriteSheet("CNZ/Objects.gif")
		SpriteFrame(-25, -9, 47, 26, 26, 185)
		SpriteFrame(-24, -8, 48, 16, 26, 212)
		SpriteFrame(-25, -17, 47, 26, 26, 229)
		SpriteFrame(-24, -8, 48, 16, 26, 212)
	else
		LoadSpriteSheet("MBZ/Objects.gif")
		SpriteFrame(-25, -9, 47, 26, 189, 402)
		SpriteFrame(-24, -8, 48, 16, 189, 429)
		SpriteFrame(-25, -17, 47, 26, 189, 446)
		SpriteFrame(-24, -8, 48, 16, 189, 429)
	end if
	foreach (TypeName[H Flipper], arrayPos0, ALL_ENTITIES)
		object[arrayPos0].direction = object[arrayPos0].propertyValue
		if object[arrayPos0].direction == FLIP_NONE
			object[arrayPos0].value1 = HFlipper_table0
			object[arrayPos0].value2 = HFlipper_table1
			object[arrayPos0].xvel = 0x10000
		else
			object[arrayPos0].value1 = HFlipper_table2
			object[arrayPos0].value2 = HFlipper_table3
			object[arrayPos0].xvel = -0x10000
		end if
	next
	SetTableValue(TypeName[H Flipper], DebugMode_ObjCount, DebugMode_TypesTable)
	SetTableValue(HFlipper_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
	SetTableValue(HFlipper_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
	DebugMode_ObjCount++
end event

event RSDKDraw
	DrawSprite(0)
end event

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