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

//-------Aliases-------//
private alias 52 : TYPE_REXON

// Function declarations
reserve function Rexon_Function124
reserve function Rexon_DebugDraw
reserve function Rexon_DebugSpawn

// Static Values

// Tables

function Rexon_Function124
	temp0 = object[arrayPos0].value25
	temp1 = object[arrayPos0].ypos
	ResetObjectEntity(object[arrayPos0].entityPos, TypeName[Rexon], 0, temp0, temp1)
	object[arrayPos0].value25 = temp0
	object[arrayPos0].xvel = -0x2000
	object[arrayPos0].value0 = 128
	object[arrayPos0].value2 = 368
	object[arrayPos0].value6 = 368
	object[arrayPos0].value10 = 368
	object[arrayPos0].value14 = 368
	object[arrayPos0].value18 = 368
end function


function Rexon_DebugDraw
	DrawSpriteFX(3, FX_FLIP, object.xpos, object.ypos)
end function


function Rexon_DebugSpawn
	CreateTempObject(TypeName[Rexon], 0, object.xpos, object.ypos)
	object[tempObjectPos].value25 = object.xpos
	arrayPos0 = object[tempObjectPos].entityPos
	CallFunction(Rexon_Function124)
end function


event ObjectMain
	switch object.state
	case 0
		object.priority = PRIORITY_ACTIVE
		object.xpos += object.xvel
		object.value0--
		if object.value0 == 0
			object.value0 = 128
			object.direction ^= FLIP_X
			FlipSign(object.xvel)
		end if
		foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
			if object.direction == FLIP_NONE
				BoxCollisionTest(C_TOUCH, object.entityPos, -160, -256, 96, 256, currentPlayer, -1, -1, 1, 1)
			else
				BoxCollisionTest(C_TOUCH, object.entityPos, -96, -256, 160, 256, currentPlayer, -1, -1, 1, 1)
			end if
			if checkResult == 1
				if object[currentPlayer].xpos > object.xpos
					object.direction = FLIP_X
				else
					object.direction = FLIP_NONE
				end if
				object.state++
			end if
		next
		break
	case 1
		if object.value1 >= 0xC80
			object.state++
			object.value1 = 0xC80
		end if
		object.value1 += 640
		break
	case 2
		if object.value5 >= 0xC80
			object.state++
			object.value5 = 0xC80
		end if
		object.value5 += 640
		object.value2 += 2
		break
	case 3
		if object.value9 >= 0xC80
			object.state++
			object.value9 = 0xC80
		end if
		object.value9 += 640
		object.value2 += 2
		object.value6 += 2
		break
	case 4
		if object.value13 >= 0xC80
			object.state++
			object.value13 = 0xC80
		end if
		object.value13 += 640
		object.value2 += 2
		object.value6 += 2
		object.value10 += 2
		break
	case 5
		if object.value17 >= 0xA80
			object.state++
			object.value17 = 0xA80
		end if
		object.value17 += 640
		object.value2 += 2
		object.value6 += 2
		object.value10 += 2
		object.value14 += 2
		break
	case 6
		if object.value21 == 0
			object.value2++
			if object.value2 == 384
				object.frame = 0
			end if
			if object.value2 >= 416
				object.value21 = 1
			end if
		else
			object.value2--
			if object.value2 == 368
				object.frame = 1
			end if
			if object.value2 <= 352
				object.value21 = 0
				CreateTempObject(TypeName[Rexon Shot], 0, object.value3, object.value4)
				if object.direction == FLIP_NONE
					object[tempObjectPos].xvel = -0x10000
					object[tempObjectPos].xpos -= 0x100000
				else
					object[tempObjectPos].xvel = 0x10000
					object[tempObjectPos].xpos += 0x100000
				end if
				object[tempObjectPos].yvel = 0x8000
				object[tempObjectPos].ypos += 0x40000
			end if
		end if
		if object.value22 == 0
			object.value6++
			if object.value6 >= 416
				object.value22 = 1
			end if
		else
			object.value6--
			if object.value6 <= 352
				object.value22 = 0
			end if
		end if
		if object.value23 == 0
			object.value10++
			if object.value10 >= 416
				object.value23 = 1
			end if
		else
			object.value10--
			if object.value10 <= 352
				object.value23 = 0
			end if
		end if
		if object.value24 == 0
			object.value14++
			if object.value14 >= 416
				object.value24 = 1
			end if
		else
			object.value14--
			if object.value14 <= 352
				object.value24 = 0
			end if
		end if
		break
	case 7
		break
	case 8
		arrayPos0 = object.value0
		if object[arrayPos0].state != 7
			object.type = TypeName[Blank Object]
		end if
		object.xpos += object.xvel
		object.ypos += object.yvel
		object.yvel += 0x3800
		if object.outOfBounds == 1
			object.type = TypeName[Blank Object]
		end if
		break
	end switch
	temp0 = object.xpos
	if object.direction == FLIP_NONE
		temp0 -= 0x1C0000
	else
		temp0 += 0x1C0000
	end if
	temp1 = object.ypos
	temp1 += 0x110000
	temp2 = object.value18
	temp2 >>= 1
	if object.direction == FLIP_X
		temp2 -= 192
		FlipSign(temp2)
		temp2 += 192
		temp2 &= 255
	end if
	Cos256(object.value19, temp2)
	object.value19 *= object.value17
	object.value19 += temp0
	Sin256(object.value20, temp2)
	object.value20 *= object.value17
	object.value20 += temp1
	temp2 = object.value14
	temp2 >>= 1
	if object.direction == FLIP_X
		temp2 -= 192
		FlipSign(temp2)
		temp2 += 192
		temp2 &= 255
	end if
	Cos256(object.value15, temp2)
	object.value15 *= object.value13
	object.value15 += object.value19
	Sin256(object.value16, temp2)
	object.value16 *= object.value13
	object.value16 += object.value20
	temp2 = object.value10
	temp2 >>= 1
	if object.direction == FLIP_X
		temp2 -= 192
		FlipSign(temp2)
		temp2 += 192
		temp2 &= 255
	end if
	Cos256(object.value11, temp2)
	object.value11 *= object.value9
	object.value11 += object.value15
	Sin256(object.value12, temp2)
	object.value12 *= object.value9
	object.value12 += object.value16
	temp2 = object.value6
	temp2 >>= 1
	if object.direction == FLIP_X
		temp2 -= 192
		FlipSign(temp2)
		temp2 += 192
		temp2 &= 255
	end if
	Cos256(object.value7, temp2)
	object.value7 *= object.value5
	object.value7 += object.value11
	Sin256(object.value8, temp2)
	object.value8 *= object.value5
	object.value8 += object.value12
	temp2 = object.value2
	temp2 >>= 1
	if object.direction == FLIP_X
		temp2 -= 192
		FlipSign(temp2)
		temp2 += 192
		temp2 &= 255
	end if
	Cos256(object.value3, temp2)
	object.value3 *= object.value1
	object.value3 += object.value7
	Sin256(object.value4, temp2)
	object.value4 *= object.value1
	object.value4 += object.value8
	if object.state != 8
		if object.outOfBounds == 1
			temp0 = object.xpos
			object.xpos = object.value25
			if object.outOfBounds == 1
				arrayPos0 = object.entityPos
				CallFunction(Rexon_Function124)
			else
				object.xpos = temp0
			end if
		end if
		temp6 = object.xpos
		temp7 = object.ypos
		CallFunction(PlayerObject_EnemyPop)
		foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
			BoxCollisionTest(C_BOX, object.entityPos, -16, -8, 16, 8, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
			if object.state != 7
				object.xpos = object.value3
				object.ypos = object.value4
				BoxCollisionTest(C_TOUCH, object.entityPos, -8, -8, 8, 8, currentPlayer, object[currentPlayer].value40, object[currentPlayer].value38, object[currentPlayer].value41, object[currentPlayer].value39)
				if checkResult == 1
					CreateTempObject(TypeName[Rexon], 0, object.value7, object.value8)
					object[tempObjectPos].xvel = -0x8000
					object[tempObjectPos].state = 8
					object[tempObjectPos].direction = object.direction
					object[tempObjectPos].value0 = object.entityPos
					CreateTempObject(TypeName[Rexon], 0, object.value11, object.value12)
					object[tempObjectPos].xvel = 0x10000
					object[tempObjectPos].state = 8
					object[tempObjectPos].direction = object.direction
					object[tempObjectPos].value0 = object.entityPos
					CreateTempObject(TypeName[Rexon], 0, object.value15, object.value16)
					object[tempObjectPos].xvel = -0x10000
					object[tempObjectPos].state = 8
					object[tempObjectPos].direction = object.direction
					object[tempObjectPos].value0 = object.entityPos
					CreateTempObject(TypeName[Rexon], 0, object.value19, object.value20)
					object[tempObjectPos].xvel = 0x8000
					object[tempObjectPos].state = 8
					object[tempObjectPos].direction = object.direction
					object[tempObjectPos].value0 = object.entityPos
					temp4 = object.value25
					temp5 = object.direction
					CallFunction(PlayerObject_BadnikBreak)
					if object.type != TypeName[Rexon]
						object.type = TypeName[Rexon]
						object.value25 = temp4
						object.direction = temp5
						object.priority = PRIORITY_ACTIVE
						object.state = 7
					end if
				end if
				object.xpos = object.value7
				object.ypos = object.value8
				BoxCollisionTest(C_TOUCH, object.entityPos, -8, -8, 8, 8, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
				if checkResult == 1
					CallFunction(PlayerObject_Hit)
				end if
				object.xpos = object.value11
				object.ypos = object.value12
				BoxCollisionTest(C_TOUCH, object.entityPos, -8, -8, 8, 8, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
				if checkResult == 1
					CallFunction(PlayerObject_Hit)
				end if
				object.xpos = object.value15
				object.ypos = object.value16
				BoxCollisionTest(C_TOUCH, object.entityPos, -8, -8, 8, 8, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
				if checkResult == 1
					CallFunction(PlayerObject_Hit)
				end if
				object.xpos = object.value19
				object.ypos = object.value20
				BoxCollisionTest(C_TOUCH, object.entityPos, -8, -8, 8, 8, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
				if checkResult == 1
					CallFunction(PlayerObject_Hit)
				end if
			end if
		next
		object.xpos = temp6
		object.ypos = temp7
	end if
end event


event ObjectDraw
	switch object.state
	case 1
	case 2
	case 3
	case 4
	case 5
	case 6
		DrawSpriteFX(2, FX_FLIP, object.value19, object.value20)
		DrawSpriteFX(2, FX_FLIP, object.value15, object.value16)
		DrawSpriteFX(2, FX_FLIP, object.value11, object.value12)
		DrawSpriteFX(2, FX_FLIP, object.value7, object.value8)
		DrawSpriteFX(object.frame, FX_FLIP, object.value3, object.value4)
	case 0
	case 7
		DrawSpriteFX(3, FX_FLIP, object.xpos, object.ypos)
		break
	case 8
		DrawSpriteFX(2, FX_FLIP, object.xpos, object.ypos)
		break
	end switch
end event


event ObjectStartup
	CheckCurrentStageFolder("Zone05")
	if checkResult == 1
		LoadSpriteSheet("HTZ/Objects.gif")
		SpriteFrame(-19, -6, 23, 16, 143, 123)
		SpriteFrame(-19, -6, 23, 16, 45, 55)
		SpriteFrame(-8, -8, 16, 16, 52, 38)
		SpriteFrame(-16, -8, 32, 16, 91, 105)
	else
		LoadSpriteSheet("MBZ/Objects.gif")
		SpriteFrame(-19, -6, 23, 16, 143, 123)
		SpriteFrame(-19, -6, 23, 16, 45, 55)
		SpriteFrame(-8, -8, 16, 16, 52, 38)
		SpriteFrame(-16, -8, 32, 16, 91, 105)
	end if
	foreach (TypeName[Rexon], arrayPos0, ALL_ENTITIES)
		object[arrayPos0].value25 = object[arrayPos0].xpos
		CallFunction(Rexon_Function124)
	next
	SetTableValue(TypeName[Rexon], DebugMode_ObjCount, DebugMode_TypesTable)
	SetTableValue(Rexon_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
	SetTableValue(Rexon_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
