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

//-------Aliases-------//
private alias 71 : TYPE_CHEMICALDROPPER

// Function declarations
reserve function ChemicalDropper_Function163
reserve function ChemicalDropper_Function164

// Static Values

// Tables
public table ChemicalDropper_table55
	2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2
end table

public table ChemicalDropper_table56
	18, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 10, 10, 10
end table

public table ChemicalDropper_table57
	12, 31, 33
end table

//0x16CA2
private table ChemicalDropper_table0
	13, 18, 14, 16, 15, 17
end table

function ChemicalDropper_Function163
	CreateTempObject(TypeName[Chemical Dropper], 0, temp0, temp1)
	object[tempObjectPos].state = 5
	object[tempObjectPos].direction = object.direction
	Rand(object[tempObjectPos].xvel, 8)
	object[tempObjectPos].xvel -= 4
	object[tempObjectPos].xvel <<= 16
	object[tempObjectPos].yvel = -0x38000
	Rand(object[tempObjectPos].value3, 255)
	object[tempObjectPos].value3 += 30
	object[tempObjectPos].value3 &= 127
end function


function ChemicalDropper_Function164
	object.ypos = object.value1
	Sin256(temp0, object.value2)
	temp0 <<= 10
	object.ypos += temp0
	object.value2 += 2
	object.value2 &= 255
	object[-1].xpos = object.xpos
	object[-1].ypos = object.ypos
	CheckGreater(object[0].xpos, object.xpos)
	object.direction = checkResult
	object[-1].direction = object.direction
end function


event ObjectMain
	switch object.state
	case 0
		if object.xpos == object.value5
			if object.value12 == 0
				object.value6 = 1
				object.value7 = 0
				object.state++
			end if
		else
			if object.xpos > object.value5
				object.xpos -= 0x30000
				if object.xpos <= object.value5
					object.xpos = object.value5
				end if
			else
				object.xpos += 0x30000
				if object.xpos >= object.value5
					object.xpos = object.value5
				end if
			end if
		end if
		CallFunction(ChemicalDropper_Function164)
		break
	case 1
		CallFunction(ChemicalDropper_Function164)
		break
	case 2
		temp0 = object.xpos
		if object[0].xpos <= object.xpos
			temp0 -= 0x480000
		else
			temp0 += 0x480000
		end if
		temp0 &= -0x10000
		temp1 = object[0].xpos
		temp1 &= -0x10000
		if temp1 == temp0
			if object.value11 == 0x580000
				object.value12 = 4
			end if
		else
			if object[0].xpos < temp0
				temp0 = stage.newXBoundary1
				temp0 -= 16
				temp0 <<= 16
				if object.xpos > temp0
					object.xpos -= 0x10000
				end if
			else
				temp0 = stage.newXBoundary2
				temp0 += 16
				temp0 <<= 16
				if object.xpos < temp0
					object.xpos += 0x10000
				end if
			end if
		end if
		CallFunction(ChemicalDropper_Function164)
		break
	case 3
		if object.xpos == object.value4
			if object.value12 == 0
				object.value6 = 1
				object.value7 = 0
				object.state = 1
			end if
		else
			if object.xpos > object.value4
				object.xpos -= 0x30000
				if object.xpos <= object.value4
					object.xpos = object.value4
				end if
			else
				object.xpos += 0x30000
				if object.xpos >= object.value4
					object.xpos = object.value4
				end if
			end if
		end if
		CallFunction(ChemicalDropper_Function164)
		break
	case 4
		object.value6 = 0
		object.value12 = 0
		temp0 = object.xpos
		if object.direction == FLIP_NONE
			temp0 -= object.value11
		else
			temp0 += object.value11
		end if
		temp1 = object.ypos
		temp1 -= 0x380000
		CallFunction(ChemicalDropper_Function163)
		object[tempObjectPos].frame = 35
		temp1 += 0x80000
		temp2 = object.value11
		temp2 >>= 16
		temp2 -= 16
		temp2 /= 24
		while temp2 >= 0
			if object.direction == FLIP_NONE
				temp0 += 0x180000
			else
				temp0 -= 0x180000
			end if
			CallFunction(ChemicalDropper_Function163)
			object[tempObjectPos].frame = 36
			temp2--
		loop
		temp0 = object.xpos
		temp1 = object.ypos
		CallFunction(ChemicalDropper_Function163)
		object[tempObjectPos].frame = 37
		CallFunction(ChemicalDropper_Function163)
		object[tempObjectPos].frame = 38
		CallFunction(ChemicalDropper_Function163)
		object[tempObjectPos].frame = 39
		if object.direction == FLIP_NONE
			temp0 += 0x40000
		else
			temp0 -= 0x40000
		end if
		temp1 += 0x190000
		temp2 = 0
		while temp2 < object.value8
			CallFunction(ChemicalDropper_Function163)
			object[tempObjectPos].frame = 1
			temp1 += 0x80000
			temp2++
		loop
		object.type = TypeName[Blank Object]
		break
	case 5
		object.value3--
		if object.value3 <= 0
			object.value3 = 30
			CreateTempObject(TypeName[Explosion], 0, object.xpos, object.ypos)
			object[tempObjectPos].drawOrder = 5
			PlaySfx(SfxName[Explosion 2], 0)
			object.state++
		end if
		break
	case 6
		object.value3--
		if object.value3 <= 0
			object.state++
		end if
		break
	case 7
		object.xpos += object.xvel
		object.ypos += object.yvel
		object.yvel += 0x3800
		temp1 = object.ypos
		temp1 >>= 16
		temp1 -= screen.cameraY
		Abs(temp1)
		temp1 -= 128
		if temp1 >= screen.ycenter
			object.type = TypeName[Blank Object]
		end if
		break
	end switch
	switch object.value6
	case 1
		object.value9 = 1
		object.value8++
		if object.value8 == 8
			object.value6 = 2
			object.value10 = 8
			object.value7 = 0
			object.value12 = 1
			object.value15 = 18
			object.value16 = 4
		end if
		break
	case 2
		object.value7++
		if object.value7 == 18
			object.value7 = 0
			object.value10--
			if object.value10 < 0
				object.value10 = 9
			end if
		end if
		GetTableValue(object.value9, object.value7, ChemicalDropper_table55)
		break
	case 3
		object.value9 = 1
		object.value8--
		if object.value8 == 0
			object.value6 = 0
			object.value10 = 8
			object.value7 = 0
			object.value12 = 3
			object.state = 2
		end if
		break
	end switch
	switch object.value12
	case 0
		object.value11 = 0x100000
		object.value13 = 12
		break
	case 1
		object.value14++
		if object.value14 == 19
			object.value14 = 0
			object.value15++
			if object.value15 >= 30
				object.value15 = 30
				object.value6 = 3
				object.value12 = 2
			end if
		end if
		GetTableValue(object.value16, object.value14, ChemicalDropper_table56)
		break
	case 2
		break
	case 3
		object.value11 += 0x10000
		if object.value11 >= 0x580000
			object.value11 = 0x580000
		end if
		temp0 = object.value11
		temp0 >>= 16
		temp0 -= 16
		temp0 /= 24
		GetTableValue(object.value13, temp0, ChemicalDropper_table57)
		break
	case 4
		object.value14++
		switch object.value14
		case 8
			object.value17 = 1
			break
		case 20
			object.value17 = 2
			break
		case 32
			temp0 = object.xpos
			if object.direction == FLIP_NONE
				temp0 -= object.value11
				temp0 += 0xC0000
			else
				temp0 += object.value11
				temp0 -= 0xC0000
			end if
			temp1 = object.ypos
			temp1 -= 0x260000
			CreateTempObject(TypeName[Chemical Drop], 0, temp0, temp1)
			object[tempObjectPos].drawOrder = 2
			break
		case 40
			object.value17 = 1
			break
		case 48
			object.value17 = 0
			object.value12 = 5
			object.value14 = 0
			if object.value18 == 0
				object.state = 3
			else
				object.state = 0
			end if
			object.value18 ^= 1
			break
		end switch
		break
	case 5
		object.value11 -= 0x10000
		if object.value11 <= 0x100000
			object.value11 = 0x100000
			object.value12 = 0
		end if
		temp0 = object.value11
		temp0 >>= 16
		temp0 -= 16
		temp0 /= 24
		GetTableValue(object.value13, temp0, ChemicalDropper_table57)
		break
	end switch
end event


event ObjectDraw
	if object.state < 4
		temp0 = object.xpos
		if object.direction == FLIP_NONE
			temp0 -= object.value11
		else
			temp0 += object.value11
		end if
		temp1 = object.ypos
		temp1 -= 0x380000
		if object.value12 == 1
			DrawSpriteFX(object.value16, FX_FLIP, object.xpos, object.ypos)
			DrawSpriteFX(object.value15, FX_FLIP, temp0, temp1)
		end if
		if object.value12 == 2
			DrawSpriteFX(object.value15, FX_FLIP, temp0, temp1)
		end if
		if object.value12 == 3
			DrawSpriteFX(object.value15, FX_FLIP, temp0, temp1)
		end if
		if object.value12 == 4
			if object.value14 < 32
				DrawSpriteFX(object.value15, FX_FLIP, temp0, temp1)
			end if
		end if
		temp0 = object.xpos
		if object.direction == FLIP_NONE
			temp0 -= object.value11
		else
			temp0 += object.value11
		end if
		temp1 = object.ypos
		temp1 -= 0x380000
		DrawSpriteFX(object.value13, FX_FLIP, temp0, temp1)
		switch object.value17
		case 0
			DrawSpriteFX(18, FX_FLIP, temp0, temp1)
			DrawSpriteFX(13, FX_FLIP, temp0, temp1)
			break
		case 1
			DrawSpriteFX(16, FX_FLIP, temp0, temp1)
			DrawSpriteFX(14, FX_FLIP, temp0, temp1)
			break
		case 2
			DrawSpriteFX(17, FX_FLIP, temp0, temp1)
			DrawSpriteFX(15, FX_FLIP, temp0, temp1)
			break
		end switch
		temp0 = object.xpos
		if object.direction == FLIP_NONE
			temp0 += 0x40000
		else
			temp0 -= 0x40000
		end if
		temp1 = object.ypos
		temp1 += 0x190000
		temp2 = 0
		while temp2 < object.value8
			if temp2 == object.value10
				DrawSpriteFX(object.value9, FX_FLIP, temp0, temp1)
			else
				DrawSpriteFX(1, FX_FLIP, temp0, temp1)
			end if
			temp1 += 0x80000
			temp2++
		loop
		DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)
	else
		DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)
	end if
end event


event ObjectStartup
	CheckCurrentStageFolder("Zone02")
	if checkResult == 1
		LoadSpriteSheet("CPZ/Objects.gif")
		SpriteFrame(-5, -68, 37, 52, 55, 74)
		SpriteFrame(-4, -4, 8, 8, 61, 147)
		SpriteFrame(-5, -4, 10, 8, 59, 138)
		SpriteFrame(-6, -4, 12, 8, 57, 129)
		SpriteFrame(-5, -60, 8, 3, 93, 74)
		SpriteFrame(-5, -60, 8, 5, 93, 78)
		SpriteFrame(-4, -60, 6, 8, 93, 84)
		SpriteFrame(-4, -60, 6, 13, 93, 93)
		SpriteFrame(-5, -60, 8, 14, 93, 107)
		SpriteFrame(-4, -50, 8, 8, 93, 122)
		SpriteFrame(-4, -46, 8, 8, 93, 122)
		SpriteFrame(-4, -4, 8, 8, 93, 122)
		SpriteFrame(0, 0, 48, 24, 93, 131)
		SpriteFrame(1, 24, 22, 2, 74, 189)
		SpriteFrame(6, 24, 16, 6, 74, 192)
		SpriteFrame(11, 24, 16, 8, 74, 199)
		SpriteFrame(-2, 24, 14, 6, 74, 208)
		SpriteFrame(-4, 24, 15, 8, 74, 215)
		SpriteFrame(0, 0, 0, 0, 0, 0)
		SpriteFrame(1, 22, 22, 2, 70, 131)
		SpriteFrame(1, 20, 22, 4, 70, 131)
		SpriteFrame(1, 18, 22, 6, 70, 131)
		SpriteFrame(1, 16, 22, 8, 70, 131)
		SpriteFrame(1, 14, 22, 10, 70, 131)
		SpriteFrame(1, 12, 22, 12, 70, 131)
		SpriteFrame(1, 10, 22, 14, 70, 131)
		SpriteFrame(1, 8, 22, 16, 70, 131)
		SpriteFrame(1, 6, 22, 18, 70, 131)
		SpriteFrame(1, 4, 22, 20, 70, 131)
		SpriteFrame(1, 2, 22, 22, 70, 131)
		SpriteFrame(1, 0, 22, 24, 70, 131)
		SpriteFrame(0, 0, 72, 24, 93, 131)
		SpriteFrame(3, 3, 18, 29, 97, 189)
		SpriteFrame(0, 0, 96, 24, 93, 131)
		SpriteFrame(3, 3, 18, 29, 117, 189)
		SpriteFrame(0, 0, 28, 24, 93, 131)
		SpriteFrame(0, 2, 24, 4, 121, 141)
		SpriteFrame(-5, -68, 29, 12, 55, 74)
		SpriteFrame(8, -56, 24, 24, 68, 86)
		SpriteFrame(17, -32, 14, 16, 77, 110)
		SpriteFrame(-15, -32, 22, 24, 81, 156)
		SpriteFrame(-15, -24, 30, 16, 104, 156)
		SpriteFrame(-15, -23, 31, 15, 104, 173)
	else
		LoadSpriteSheet("MBZ/Objects.gif")
		SpriteFrame(-5, -68, 37, 52, 34, 138)
		SpriteFrame(-4, -4, 8, 8, 38, 130)
		SpriteFrame(-5, -4, 10, 8, 36, 121)
		SpriteFrame(-6, -4, 12, 8, 34, 112)
		SpriteFrame(-5, -60, 8, 3, 72, 138)
		SpriteFrame(-5, -60, 8, 5, 72, 142)
		SpriteFrame(-4, -60, 6, 8, 72, 148)
		SpriteFrame(-4, -60, 6, 13, 72, 157)
		SpriteFrame(-5, -60, 8, 14, 72, 171)
		SpriteFrame(-4, -50, 8, 8, 104, 155)
		SpriteFrame(-4, -46, 8, 8, 104, 155)
		SpriteFrame(-4, -4, 8, 8, 104, 155)
		SpriteFrame(0, 0, 48, 24, 70, 113)
		SpriteFrame(1, 24, 22, 2, 81, 163)
		SpriteFrame(6, 24, 16, 6, 81, 166)
		SpriteFrame(11, 24, 16, 8, 81, 173)
		SpriteFrame(-2, 24, 14, 6, 81, 182)
		SpriteFrame(-4, 24, 15, 8, 113, 156)
		SpriteFrame(0, 0, 0, 0, 0, 0)
		SpriteFrame(1, 22, 22, 2, 47, 113)
		SpriteFrame(1, 20, 22, 4, 47, 113)
		SpriteFrame(1, 18, 22, 6, 47, 113)
		SpriteFrame(1, 16, 22, 8, 47, 113)
		SpriteFrame(1, 14, 22, 10, 47, 113)
		SpriteFrame(1, 12, 22, 12, 47, 113)
		SpriteFrame(1, 10, 22, 14, 47, 113)
		SpriteFrame(1, 8, 22, 16, 47, 113)
		SpriteFrame(1, 6, 22, 18, 47, 113)
		SpriteFrame(1, 4, 22, 20, 47, 113)
		SpriteFrame(1, 2, 22, 22, 47, 113)
		SpriteFrame(1, 0, 22, 24, 47, 113)
		SpriteFrame(0, 0, 72, 24, 70, 113)
		SpriteFrame(3, 3, 18, 29, 1, 64)
		SpriteFrame(0, 0, 96, 24, 70, 113)
		SpriteFrame(3, 3, 18, 29, 21, 64)
		SpriteFrame(0, 0, 28, 24, 70, 113)
		SpriteFrame(0, 2, 24, 4, 98, 123)
		SpriteFrame(-5, -68, 29, 12, 34, 138)
		SpriteFrame(8, -56, 24, 24, 47, 150)
		SpriteFrame(17, -32, 14, 16, 56, 174)
		SpriteFrame(-15, -32, 22, 24, 81, 138)
		SpriteFrame(-15, -24, 30, 16, 104, 138)
		SpriteFrame(-15, -23, 31, 15, 135, 138)
	end if
end event

event RSDKDraw
	DrawSprite(0)
end event

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