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

//-------Aliases-------//
private alias 45 : TYPE_MOVINGCRATES

// Function declarations
reserve function MovingCrates_DebugDraw
reserve function MovingCrates_DebugSpawn
reserve function MovingCrates_Function111
reserve function MovingCrates_Function112
reserve function MovingCrates_Function113

// Static Values

// Tables

function MovingCrates_DebugDraw
	DrawSprite(0)
end function


function MovingCrates_DebugSpawn
	CreateTempObject(TypeName[Moving Crates], 0, object.xpos, object.ypos)
	if object.direction == FLIP_NONE
		object[tempObjectPos].value1 = 0
		object[tempObjectPos].value2 = 0
		object[tempObjectPos].value7 = 0x10000
		object[tempObjectPos].value8 = 0
		object[tempObjectPos].value3 = 0x400000
		object[tempObjectPos].value4 = 0x400000
		object[tempObjectPos].value9 = -0x10000
		object[tempObjectPos].value10 = 0
		object[tempObjectPos].value5 = -0x400000
		object[tempObjectPos].value6 = 0x400000
		object[tempObjectPos].value11 = 0
		object[tempObjectPos].value12 = -0x10000
		object[tempObjectPos].value15 = 0
		object[tempObjectPos].value16 = 2
		object[tempObjectPos].value17 = 3
	else
		object[tempObjectPos].value1 = 0
		object[tempObjectPos].value2 = 0
		object[tempObjectPos].value7 = -0x10000
		object[tempObjectPos].value8 = 0
		object[tempObjectPos].value3 = 0x400000
		object[tempObjectPos].value4 = 0x400000
		object[tempObjectPos].value9 = 0
		object[tempObjectPos].value10 = -0x10000
		object[tempObjectPos].value5 = -0x400000
		object[tempObjectPos].value6 = 0x400000
		object[tempObjectPos].value11 = 0x10000
		object[tempObjectPos].value12 = 0
		object[tempObjectPos].value15 = 4
		object[tempObjectPos].value16 = 7
		object[tempObjectPos].value17 = 6
	end if
end function


function MovingCrates_Function111
	temp0 = object.xpos
	temp1 = object.ypos
	object.xpos += object.value1
	object.ypos += object.value2
	foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
		BoxCollisionTest(C_BOX, object.entityPos, -32, -32, 32, 32, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
		switch checkResult
		case 1
			object[currentPlayer].xpos += object.value7
			object[currentPlayer].ypos += object.value8
			break
		case 2
		case 3
			if object[currentPlayer].state == PlayerObject_KnuxWallClimb
				object[currentPlayer].value1 = 0
				object[currentPlayer].animation = ANI_GLIDING_DROP
				object[currentPlayer].state = PlayerObject_KnuxGlideDrop
			end if
			break
		case 4
			if object[currentPlayer].gravity == GRAVITY_GROUND
				if object.value8 > 0
					object.value18++
					if object.value18 > 9
						CallFunction(PlayerObject_Kill)
					end if
				end if
			end if
			break
		end switch
	next
	object.xpos = temp0
	object.ypos = temp1
	object.value1 += object.value7
	object.value2 += object.value8
	switch object.value15
	case 0
		if object.value1 >= 0x400000
			object.value15++
			object.value1 = 0x400000
			object.value7 = 0
			object.value8 = 0x10000
		end if
		break
	case 1
		if object.value2 >= 0x400000
			object.value15++
			object.value2 = 0x400000
			object.value7 = -0x10000
			object.value8 = 0
		end if
		break
	case 2
		if object.value1 <= -0x400000
			object.value15++
			object.value1 = -0x400000
			object.value7 = 0
			object.value8 = -0x10000
		end if
		break
	case 3
		if object.value2 <= 0
			object.value15 = 0
			object.value2 = 0
			object.value7 = 0x10000
			object.value8 = 0
			object.value18 = 0
		end if
		break
	case 4
		if object.value1 <= -0x400000
			object.value15++
			object.value1 = -0x400000
			object.value7 = 0
			object.value8 = 0x10000
		end if
		break
	case 5
		if object.value2 >= 0x400000
			object.value15++
			object.value2 = 0x400000
			object.value7 = 0x10000
			object.value8 = 0
		end if
		break
	case 6
		if object.value1 >= 0x400000
			object.value15++
			object.value1 = 0x400000
			object.value7 = 0
			object.value8 = -0x10000
		end if
		break
	case 7
		if object.value2 <= 0
			object.value15 = 4
			object.value2 = 0
			object.value7 = -0x10000
			object.value8 = 0
			object.value18 = 0
		end if
		break
	end switch
end function


function MovingCrates_Function112
	temp0 = object.xpos
	temp1 = object.ypos
	object.xpos += object.value3
	object.ypos += object.value4
	foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
		BoxCollisionTest(C_BOX, object.entityPos, -32, -32, 32, 32, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
		switch checkResult
		case 1
			object[currentPlayer].xpos += object.value9
			object[currentPlayer].ypos += object.value10
			break
		case 2
		case 3
			if object[currentPlayer].state == PlayerObject_KnuxWallClimb
				object[currentPlayer].value1 = 0
				object[currentPlayer].animation = ANI_GLIDING_DROP
				object[currentPlayer].state = PlayerObject_KnuxGlideDrop
			end if
			break
		case 4
			if object[currentPlayer].gravity == GRAVITY_GROUND
				if object.value10 > 0
					object.value19++
					if object.value19 > 9
						CallFunction(PlayerObject_Kill)
					end if
				end if
			end if
			break
		end switch
	next
	object.xpos = temp0
	object.ypos = temp1
	object.value3 += object.value9
	object.value4 += object.value10
	switch object.value16
	case 0
		if object.value3 >= 0x400000
			object.value16++
			object.value3 = 0x400000
			object.value9 = 0
			object.value10 = 0x10000
		end if
		break
	case 1
		if object.value4 >= 0x400000
			object.value16++
			object.value4 = 0x400000
			object.value9 = -0x10000
			object.value10 = 0
		end if
		break
	case 2
		if object.value3 <= -0x400000
			object.value16++
			object.value3 = -0x400000
			object.value9 = 0
			object.value10 = -0x10000
		end if
		break
	case 3
		if object.value4 <= 0
			object.value16 = 0
			object.value4 = 0
			object.value9 = 0x10000
			object.value10 = 0
			object.value19 = 0
		end if
		break
	case 4
		if object.value3 <= -0x400000
			object.value16++
			object.value3 = -0x400000
			object.value9 = 0
			object.value10 = 0x10000
		end if
		break
	case 5
		if object.value4 >= 0x400000
			object.value16++
			object.value4 = 0x400000
			object.value9 = 0x10000
			object.value10 = 0
		end if
		break
	case 6
		if object.value3 >= 0x400000
			object.value16++
			object.value3 = 0x400000
			object.value9 = 0
			object.value10 = -0x10000
		end if
		break
	case 7
		if object.value4 <= 0
			object.value16 = 4
			object.value4 = 0
			object.value9 = -0x10000
			object.value10 = 0
			object.value19 = 0
		end if
		break
	end switch
end function


function MovingCrates_Function113
	temp0 = object.xpos
	temp1 = object.ypos
	object.xpos += object.value5
	object.ypos += object.value6
	foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
		BoxCollisionTest(C_BOX, object.entityPos, -32, -32, 32, 32, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
		switch checkResult
		case 1
			object[currentPlayer].xpos += object.value11
			object[currentPlayer].ypos += object.value12
			break
		case 2
		case 3
			if object[currentPlayer].state == PlayerObject_KnuxWallClimb
				object[currentPlayer].value1 = 0
				object[currentPlayer].animation = ANI_GLIDING_DROP
				object[currentPlayer].state = PlayerObject_KnuxGlideDrop
			end if
			break
		case 4
			if object[currentPlayer].gravity == GRAVITY_GROUND
				if object.value12 > 0
					object.value20++
					if object.value20 > 9
						CallFunction(PlayerObject_Kill)
					end if
				end if
			end if
			break
		end switch
	next
	object.xpos = temp0
	object.ypos = temp1
	object.value5 += object.value11
	object.value6 += object.value12
	switch object.value17
	case 0
		if object.value5 >= 0x400000
			object.value17++
			object.value5 = 0x400000
			object.value11 = 0
			object.value12 = 0x10000
		end if
		break
	case 1
		if object.value6 >= 0x400000
			object.value17++
			object.value6 = 0x400000
			object.value11 = -0x10000
			object.value12 = 0
		end if
		break
	case 2
		if object.value5 <= -0x400000
			object.value17++
			object.value5 = -0x400000
			object.value11 = 0
			object.value12 = -0x10000
		end if
		break
	case 3
		if object.value6 <= 0
			object.value17 = 0
			object.value6 = 0
			object.value11 = 0x10000
			object.value12 = 0
			object.value20 = 0
		end if
		break
	case 4
		if object.value5 <= -0x400000
			object.value17++
			object.value5 = -0x400000
			object.value11 = 0
			object.value12 = 0x10000
		end if
		break
	case 5
		if object.value6 >= 0x400000
			object.value17++
			object.value6 = 0x400000
			object.value11 = 0x10000
			object.value12 = 0
		end if
		break
	case 6
		if object.value5 >= 0x400000
			object.value17++
			object.value5 = 0x400000
			object.value11 = 0
			object.value12 = -0x10000
		end if
		break
	case 7
		if object.value6 <= 0
			object.value17 = 4
			object.value6 = 0
			object.value11 = -0x10000
			object.value12 = 0
			object.value20 = 0
		end if
		break
	end switch
end function


event ObjectMain
	CallFunction(MovingCrates_Function111)
	CallFunction(MovingCrates_Function112)
	CallFunction(MovingCrates_Function113)
end event


event ObjectDraw
	temp0 = object.xpos
	temp1 = object.ypos
	temp0 += object.value1
	temp1 += object.value2
	DrawSpriteXY(0, temp0, temp1)
	temp0 = object.xpos
	temp1 = object.ypos
	temp0 += object.value3
	temp1 += object.value4
	DrawSpriteXY(0, temp0, temp1)
	temp0 = object.xpos
	temp1 = object.ypos
	temp0 += object.value5
	temp1 += object.value6
	DrawSpriteXY(0, temp0, temp1)
end event


event ObjectStartup
	CheckCurrentStageFolder("Zone06")
	if checkResult == 1
		LoadSpriteSheet("MCZ/Objects.gif")
		SpriteFrame(-32, -32, 64, 64, 136, 1)
	else
		LoadSpriteSheet("MBZ/Objects.gif")
		SpriteFrame(-32, -32, 64, 64, 797, 697)
	end if
	foreach (TypeName[Moving Crates], arrayPos0, ALL_ENTITIES)
		if object[arrayPos0].propertyValue == 0
			object[arrayPos0].value1 = 0
			object[arrayPos0].value2 = 0
			object[arrayPos0].value7 = 0x10000
			object[arrayPos0].value8 = 0
			object[arrayPos0].value3 = 0x400000
			object[arrayPos0].value4 = 0x400000
			object[arrayPos0].value9 = -0x10000
			object[arrayPos0].value10 = 0
			object[arrayPos0].value5 = -0x400000
			object[arrayPos0].value6 = 0x400000
			object[arrayPos0].value11 = 0
			object[arrayPos0].value12 = -0x10000
			object[arrayPos0].value15 = 0
			object[arrayPos0].value16 = 2
			object[arrayPos0].value17 = 3
		else
			object[arrayPos0].value1 = 0
			object[arrayPos0].value2 = 0
			object[arrayPos0].value7 = -0x10000
			object[arrayPos0].value8 = 0
			object[arrayPos0].value3 = 0x400000
			object[arrayPos0].value4 = 0x400000
			object[arrayPos0].value9 = 0
			object[arrayPos0].value10 = -0x10000
			object[arrayPos0].value5 = -0x400000
			object[arrayPos0].value6 = 0x400000
			object[arrayPos0].value11 = 0x10000
			object[arrayPos0].value12 = 0
			object[arrayPos0].value15 = 4
			object[arrayPos0].value16 = 7
			object[arrayPos0].value17 = 6
		end if
	next
	SetTableValue(TypeName[Moving Crates], DebugMode_ObjCount, DebugMode_TypesTable)
	SetTableValue(MovingCrates_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
	SetTableValue(MovingCrates_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
