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

//-------Aliases-------//
private alias 38 : TYPE_INVISIBLEBLOCK

// Function declarations
reserve function InvisibleBlock_DebugDraw
reserve function InvisibleBlock_DebugSpawn
reserve function InvisibleBlock_DebugDraw2
reserve function InvisibleBlock_DebugSpawn2
reserve function InvisibleBlock_KnuxBlockClimb

// Static Values
public value InvisibleBlock_value31 = 8;

// Tables

function InvisibleBlock_DebugDraw
	temp0 = object.xpos
	temp1 = object.ypos
	temp0 -= 0x80000
	temp1 -= 0x80000
	DrawSpriteXY(0, temp0, temp1)
	temp0 += 0x100000
	DrawSpriteXY(0, temp0, temp1)
	temp0 -= 0x100000
	temp1 += 0x100000
	DrawSpriteXY(0, temp0, temp1)
	temp0 += 0x100000
	DrawSpriteXY(0, temp0, temp1)
end function

function InvisibleBlock_DebugDraw2
	DrawSprite(3)
end function


function InvisibleBlock_DebugSpawn
	CreateTempObject(TypeName[Invisible Block], 17, object.xpos, object.ypos)
	object[tempObjectPos].drawOrder = 5
	object[tempObjectPos].value0 = 16
	object[tempObjectPos].value1 = 16
end function

function InvisibleBlock_DebugSpawn2
	CreateTempObject(TypeName[Invisible Block], 0, object.xpos, object.ypos)
	object[tempObjectPos].drawOrder = 5
	object[tempObjectPos].state = 3
	CreateTempObject(TypeName[Blank Object], 0, 0, 0)
end function

function InvisibleBlock_KnuxBlockClimb
	if object.gravity == GRAVITY_AIR
		object.animation = ANI_CLIMBING
		if object.up == 1
			if PlayerObject_SuperState == 1
				object.yvel = -0x20000
			else
				object.yvel = -0x10000
			end if
			temp0 = object.collisionTop
			temp0 *= -0x10000
			if object.ypos < temp0
				object.ypos = temp0
			end if
			object.value1++
			if object.value1 == 4
				object.value1 = 0
				object.frame++
				object.frame %= 6
			end if
		else
			if object.down == 1
				if PlayerObject_SuperState == 1
					object.yvel = 0x20000
				else
					object.yvel = 0x10000
				end if
				object.value1++
				if object.value1 == 4
					object.value1 = 0
					if object.frame < 1
						object.frame += 6
					end if
					object.frame--
				end if
			else
				object.yvel = 0
			end if
		end if
		if object.jumpPress == 1
			object.animation = ANI_JUMPING
			object.state = PlayerObject_HandleAir
			object.value1 = 0
			PlaySfx(SfxName[Jump], 0)
			if object.direction == FLIP_X
				object.xvel = 0x40000
				object.speed = 0x40000
				object.direction = FLIP_NONE
			else
				object.xvel = -0x40000
				object.speed = -0x40000
				object.direction = FLIP_X
			end if
			object.yvel = -0x40000
			if object.value25 != 0x3800
				object.xvel >>= 1
				object.speed >>= 1
				object.yvel >>= 1
			end if
		else
			if object.direction == FLIP_NONE
				temp2 = object.xpos
				checkResult = 0
				foreach (TypeName[Invisible Block], arrayPos0, ALL_ENTITIES)
					if checkResult == 0
						if object[arrayPos0].state == 3
							BoxCollisionTest(C_TOUCH, object.entityPos, 8, -11, 11, -9, arrayPos0, -16, -16, 16, 16)
						end if
					end if
				next
				temp0 = checkResult
				temp3 = object.xpos
				object.xpos = temp2
				checkResult = 0
				foreach (TypeName[Invisible Block], arrayPos0, ALL_ENTITIES)
					if checkResult == 0
						if object[arrayPos0].state == 3
							BoxCollisionTest(C_TOUCH, object.entityPos, 8, 9, 11, 11, arrayPos0, -16, -16, 16, 16)
						end if
					end if
				next
				temp1 = checkResult
				object.xpos = temp3
			else
				temp2 = object.xpos
				checkResult = 0
				foreach (TypeName[Invisible Block], arrayPos0, ALL_ENTITIES)
					if checkResult == 0
						if object[arrayPos0].state == 3
							BoxCollisionTest(C_TOUCH, object.entityPos, -11, -11, -8, -9, arrayPos0, -16, -16, 16, 16)
						end if
					end if
				next
				temp0 = checkResult
				temp3 = object.xpos
				object.xpos = temp2
				checkResult = 0
				foreach (TypeName[Invisible Block], arrayPos0, ALL_ENTITIES)
					if checkResult == 0
						if object[arrayPos0].state == 3
							BoxCollisionTest(C_TOUCH, object.entityPos, -11, 9, -8, 11, arrayPos0, -16, -16, 16, 16)
						end if
					end if
				next
				temp1 = checkResult
				object.xpos = temp3
			end if
			if temp0 == 0
				object.xpos = temp2
				object.animation = ANI_LEDGEPULLUP
				object.yvel = 0
				object.value1 = 0
				object.state = PlayerObject_KnuxLedgePullUp
				object.tileCollisions = 0
				if object.direction == FLIP_NONE
					object.xpos += 0x10000
				end if
			else
				if temp1 == 0
					object.animation = ANI_GLIDING_DROP
					object.prevAnimation = ANI_GLIDING_DROP
					object.frame = 2
					object.value1 = 0
					object.state = PlayerObject_KnuxGlideDrop
				end if
			end if
		end if
	else
		object.animation = ANI_WALKING
		object.state = PlayerObject_HandleGround
		CallFunction(PlayerObject_ResetOnFloor)
	end if
end function

event ObjectMain
	temp0 = object.value0
	FlipSign(temp0)
	temp1 = object.value1
	FlipSign(temp1)
	switch object.state
	case 0
		foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
			if object[currentPlayer].state != PlayerObject_KnuxLedgePullUp
				BoxCollisionTest(C_BOX, object.entityPos, temp0, temp1, object.value0, object.value1, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
				switch checkResult
				case 0
					temp0 += 2
					temp1 += 2
					temp2 = object.value0
					temp3 = object.value1
					temp2 -= 2
					temp3 -= 2
					BoxCollisionTest(C_TOUCH, object.entityPos, temp0, temp1, temp2, temp3, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
					if checkResult == 1
						object[currentPlayer].gravity = GRAVITY_GROUND
					end if
					if currentPlayer == 0
						object.value2 = 0
					else
						object.value3 = 0
					end if
					break
				case 4
					if object[currentPlayer].gravity == GRAVITY_GROUND
						if currentPlayer == 0
							object.value2++
							if object.value2 > InvisibleBlock_value31
								CallFunction(PlayerObject_Kill)
							end if
						else
							object.value3++
							if object.value3 > InvisibleBlock_value31
								CallFunction(PlayerObject_Kill)
							end if
						end if
					end if
					break
				end switch
			end if
		next
		break
	case 1
		foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
			if object[currentPlayer].state != PlayerObject_KnuxLedgePullUp
				BoxCollisionTest(C_TOUCH, object.entityPos, temp0, temp1, object.value0, object.value1, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
				if checkResult == 1
					if object[currentPlayer].gravity == GRAVITY_GROUND
						object[currentPlayer].xpos = object[currentPlayer].collisionRight
						FlipSign(object[currentPlayer].xpos)
						object[currentPlayer].xpos -= object.value0
						object[currentPlayer].xpos <<= 16
						object[currentPlayer].xpos += object.xpos
						if object[currentPlayer].speed > 0
							object[currentPlayer].speed = 0
						end if
					end if
				end if
			end if
		next
		break
	case 2
		foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
			if object[currentPlayer].state != PlayerObject_KnuxLedgePullUp
				BoxCollisionTest(C_TOUCH, object.entityPos, temp0, temp1, object.value0, object.value1, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
				if checkResult == 1
					if object[currentPlayer].gravity == GRAVITY_GROUND
						object[currentPlayer].xpos = object[currentPlayer].collisionLeft
						FlipSign(object[currentPlayer].xpos)
						object[currentPlayer].xpos += object.value0
						object[currentPlayer].xpos <<= 16
						object[currentPlayer].xpos += object.xpos
						if object[currentPlayer].speed < 0
							object[currentPlayer].speed = 0
						end if
					end if
				end if
			end if
		next
		break
	case 3
		foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
			if object[currentPlayer].state != PlayerObject_KnuxLedgePullUp
				BoxCollisionTest(C_BOX, object.entityPos, -16, -16, 16, 16, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
				switch checkResult
				case 0
					if currentPlayer == 0
						object.value2 = 0
					else
						object.value3 = 0
					end if
					break
				case 2
					if object[currentPlayer].state == PlayerObject_KnuxGlideRight
						object[currentPlayer].state = InvisibleBlock_KnuxBlockClimb					
						if PlayerObject_SuperState == 1
							if saveRAM[482] > 0
								if object[currentPlayer].speed > 0x48000
									ResetObjectEntity(13, TypeName[Insta Shield], 3, 0, 0)
									object[13].priority = PRIORITY_ACTIVE
									PlaySfx(SfxName[Thud],0)
								end if
							end if
						end if
						object[currentPlayer].speed = 0
						object[currentPlayer].xvel = 0
						object[currentPlayer].yvel = 0
						object[currentPlayer].value1 = 0
						PlaySfx(SfxName[Catch], 0)
					end if
					break
				case 3
					if object[currentPlayer].state == PlayerObject_KnuxGlideLEft
						object[currentPlayer].state = InvisibleBlock_KnuxBlockClimb					
						if PlayerObject_SuperState == 1
							if saveRAM[482] > 0
								if object[currentPlayer].speed < -0x48000
									ResetObjectEntity(13, TypeName[Insta Shield], 3, 0, 0)
									object[13].priority = PRIORITY_ACTIVE
									PlaySfx(SfxName[Thud],0)
								end if
							end if
						end if
						object[currentPlayer].speed = 0
						object[currentPlayer].xvel = 0
						object[currentPlayer].yvel = 0
						object[currentPlayer].value1 = 0
						PlaySfx(SfxName[Catch], 0)
					end if
					break
				case 4
					if object[currentPlayer].gravity == GRAVITY_GROUND
						if currentPlayer == 0
							object.value2++
							if object.value2 > InvisibleBlock_value31
								CallFunction(PlayerObject_Kill)
							end if
						else
							object.value3++
							if object.value3 > InvisibleBlock_value31
								CallFunction(PlayerObject_Kill)
							end if
						end if
					end if
					break
				end switch
			end if
		next
		break
	end switch
end event


event ObjectDraw
	if object.state == 3
		DrawSprite(3)
	else
		if object[0].type == TypeName[Debug Mode]
			temp0 = object.xpos
			temp1 = object.ypos
			temp2 = object.propertyValue
			temp4 = temp2
			temp4 &= 240
			temp4 <<= 15
			temp2 >>= 4
			temp2++
			temp6 = temp2
			temp3 = object.propertyValue
			temp3 &= 15
			temp5 = temp3
			temp5 <<= 19
			temp3++
			temp0 -= temp4
			temp4 = temp0
			temp1 -= temp5
			while temp3 > 0
				while temp2 > 0
					DrawSpriteXY(object.state, temp0, temp1)
					temp0 += 0x100000
					temp2--
				loop
				temp2 = temp6
				temp0 = temp4
				temp1 += 0x100000
				temp3--
			loop
		end if
	end if
end event


event ObjectStartup
	LoadSpriteSheet("Global/Display.gif")
	SpriteFrame(-8, -7, 16, 14, 1, 176)
	SpriteFrame(-8, -7, 16, 14, 17, 176)
	SpriteFrame(-8, -7, 16, 14, 1, 190)
	SpriteFrame(-16, -16, 32, 32, 257, 69)
	foreach (TypeName[Invisible Block], arrayPos0, ALL_ENTITIES)
		object[arrayPos0].drawOrder = 5
		object[arrayPos0].value0 = object[arrayPos0].propertyValue
		object[arrayPos0].value0 &= 240
		object[arrayPos0].value0 += 16
		object[arrayPos0].value0 >>= 1
		object[arrayPos0].value1 = object[arrayPos0].propertyValue
		object[arrayPos0].value1 &= 15
		object[arrayPos0].value1++
		object[arrayPos0].value1 <<= 3
	next
	CheckCurrentStageFolder("Zone09")
	if checkResult == 1
		InvisibleBlock_value31 = 1
	end if
	SetTableValue(TypeName[Invisible Block], DebugMode_ObjCount, DebugMode_TypesTable)
	SetTableValue(InvisibleBlock_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
	SetTableValue(InvisibleBlock_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
	DebugMode_ObjCount++
	
	SetTableValue(TypeName[Invisible Block], DebugMode_ObjCount, DebugMode_TypesTable)
	SetTableValue(InvisibleBlock_DebugDraw2, DebugMode_ObjCount, DebugMode_DrawTable)
	SetTableValue(InvisibleBlock_DebugSpawn2, 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
