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

//-------Aliases-------//
private alias 2 : TYPE_HALFPIPE

// Function declarations
reserve function Halfpipe_SetupVertices
reserve function Halfpipe_SetupFaces

// Static Values
public value Halfpipe_value21 = 0;
public value Halfpipe_value5 = 0;
public value Halfpipe_value13 = 0;
public value Halfpipe_value6 = 0;
public value Halfpipe_value8 = 0;
public value Halfpipe_value14 = 0;
public value Halfpipe_value16 = 0;
public value Halfpipe_value17 = 0;
public value Halfpipe_value18 = 0;
public value Halfpipe_value9 = 0;
public value Halfpipe_value10 = 0;
public value Halfpipe_value11 = 0;
public value Halfpipe_value19 = 0;
public value Halfpipe_value15 = 0;
public value Halfpipe_value20 = 0;
public value Halfpipe_value7 = 0;
public value Halfpipe_value12 = 0;

// Tables
public table Halfpipe_table6
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
	0, 0, 0, 0, 0, 0, 0, 0
end table

public table Halfpipe_table7
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
	0, 0, 0, 0, 0, 0, 0, 0
end table

public table Halfpipe_table8
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
	0, 0, 0, 0, 0, 0, 0, 0
end table

public table Halfpipe_table9
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
	0, 0, 0, 0, 0, 0, 0, 0
end table

public table Halfpipe_table10
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
	0, 0, 0, 0, 0, 0, 0, 0
end table

public table Halfpipe_table11
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
	0, 0, 0, 0, 0, 0, 0, 0
end table

public table Halfpipe_table13
	0, 0, 0, 0
end table

public table Halfpipe_table12
	19, 19, 19, 19, 17, 17, 45, 17
end table

public table Halfpipe_table5
	0, 2, 4, 6, 8, 10, 12, 14, 16, -2, -4, -6, -8, -10, -12, -14, -16
end table

public table Halfpipe_table4
	0, 0, 0, 0, 0, 0, 0, 0
end table

public table Halfpipe_table14
	38, -0x4000, 0x1100, 0, -0x4400, 0xD00, 0, -0x3C00, 0xD00, 0, -0x4000, 0x900, 0, -0x4000, -0x91C, 0, -0x3A37, -0x1A96, 0, -0x305E, -0x29E9, 0, -0x2298, -0x35D7, 0, -0x1208, -0x3D68, 0, 0, -0x4000, 0, 0x1208, -0x3D68, 0, 0x2298, -0x35D7, 0, 0x305E, -0x29E9, 0, 0x3A37, -0x1A96, 0, 0x4000, -0x91C, 0, 0x4000, 0x900, 0, 0x4000, 0x1100, 0, 0x3C00, 0xD00, 0, 0x4400, 0xD00, 0, -0x4000, 0x1100, 0, -0x4400, 0xD00, 0, -0x3C00, 0xD00, 0, -0x4000, 0x900, 0, -0x4000, -0x91C, 0, -0x3A37, -0x1A96, 0, -0x305E, -0x29E9, 0, -0x2298, -0x35D7, 0, -0x1208, -0x3D68, 0, 0, -0x4000, 0, 0x1208, -0x3D68, 0, 0x2298, -0x35D7, 0, 0x305E, -0x29E9, 0, 0x3A37, -0x1A96, 0, 0x4000, -0x91C, 0, 0x4000, 0x900, 0, 0x4000, 0x1100, 0, 0x3C00, 0xD00, 0, 0x4400, 0xD00, 0
end table

public table Halfpipe_table15
	22, 0, 1, 3, 2, 3, 0, 1, 20, 19, 2, 0, 2, 21, 19, 2, 1, 20, 22, 3, 2, 2, 21, 22, 3, 2, 3, 22, 23, 4, 1, 4, 23, 24, 5, 0, 5, 24, 25, 6, 0, 6, 25, 26, 7, 0, 7, 26, 27, 8, 1, 8, 27, 28, 9, 0, 9, 28, 29, 10, 0, 10, 29, 30, 11, 1, 11, 30, 31, 12, 0, 12, 31, 32, 13, 0, 13, 32, 33, 14, 0, 14, 33, 34, 15, 1, 16, 17, 15, 18, 3, 16, 35, 36, 17, 2, 17, 36, 15, 34, 2, 16, 35, 37, 18, 2, 18, 37, 34, 15, 2
end table

public table Halfpipe_table16
	20, 0, 1, 20, 19, 2, 0, 2, 21, 19, 2, 1, 20, 22, 3, 2, 2, 21, 22, 3, 2, 3, 22, 23, 4, 1, 4, 23, 24, 5, 0, 5, 24, 25, 6, 0, 6, 25, 26, 7, 0, 7, 26, 27, 8, 1, 8, 27, 28, 9, 0, 9, 28, 29, 10, 0, 10, 29, 30, 11, 1, 11, 30, 31, 12, 0, 12, 31, 32, 13, 0, 13, 32, 33, 14, 0, 14, 33, 34, 15, 1, 16, 35, 36, 17, 2, 17, 36, 15, 34, 2, 16, 35, 37, 18, 2, 18, 37, 34, 15, 2
end table

public table Halfpipe_table17
	34, -0x4000, 0x900, 0, -0x4000, -0x91C, 0, -0x3A37, -0x1A96, 0, -0x305E, -0x29E9, 0, -0x2298, -0x35D7, 0, -0x2059, -0x36DE, 0, -0x1449, -0x3C5D, 0, -0x1208, -0x3D68, 0, 0, -0x4000, 0, 0x1208, -0x3D68, 0, 0x1449, -0x3C5D, 0, 0x2059, -0x36DE, 0, 0x2298, -0x35D7, 0, 0x305E, -0x29E9, 0, 0x3A37, -0x1A96, 0, 0x4000, -0x91C, 0, 0x4000, 0x900, 0, -0x4000, 0x900, 0, -0x4000, -0x91C, 0, -0x3A37, -0x1A96, 0, -0x305E, -0x29E9, 0, -0x2298, -0x35D7, 0, -0x1ED7, -0x378F, 0, -0x15CB, -0x3BAF, 0, -0x1208, -0x3D68, 0, 0, -0x4000, 0, 0x1208, -0x3D68, 0, 0x15CB, -0x3BAF, 0, 0x1ED7, -0x378F, 0, 0x2298, -0x35D7, 0, 0x305E, -0x29E9, 0, 0x3A37, -0x1A96, 0, 0x4000, -0x91C, 0, 0x4000, 0x900, 0
end table

public table Halfpipe_table18
	16, 0, 17, 18, 1, 1, 1, 18, 19, 2, 0, 2, 19, 20, 3, 0, 3, 20, 21, 4, 0, 4, 21, 22, 5, 1, 5, 22, 23, 6, 2, 6, 23, 24, 7, 1, 7, 24, 25, 8, 0, 8, 25, 26, 9, 0, 9, 26, 27, 10, 1, 10, 27, 28, 11, 2, 11, 28, 29, 12, 1, 12, 29, 30, 13, 0, 13, 30, 31, 14, 0, 14, 31, 32, 15, 0, 15, 32, 33, 16, 1
end table

public table Halfpipe_table19
	51, -0x4000, 0x900, 0, -0x4000, -0x91C, 0, -0x3A37, -0x1A96, 0, -0x305E, -0x29E9, 0, -0x2298, -0x35D7, 0, -0x1ED7, -0x378F, 0, -0x15CB, -0x3BAF, 0, -0x1208, -0x3D68, 0, 0, -0x4000, 0, 0x1208, -0x3D68, 0, 0x15CB, -0x3BAF, 0, 0x1ED7, -0x378F, 0, 0x2298, -0x35D7, 0, 0x305E, -0x29E9, 0, 0x3A37, -0x1A96, 0, 0x4000, -0x91C, 0, 0x4000, 0x900, 0, -0x4000, 0x900, 0, -0x4000, -0x91C, 0, -0x3A37, -0x1A96, 0, -0x305E, -0x29E9, 0, -0x2298, -0x35D7, 0, -0x1E46, -0x37D1, 0, -0x165C, -0x3B6D, 0, -0x1208, -0x3D68, 0, 0, -0x4000, 0, 0x1208, -0x3D68, 0, 0x165C, -0x3B6D, 0, 0x1E46, -0x37D1, 0, 0x2298, -0x35D7, 0, 0x305E, -0x29E9, 0, 0x3A37, -0x1A96, 0
	0x4000, -0x91C, 0, 0x4000, 0x900, 0, -0x4000, 0x900, 0, -0x4000, -0x91C, 0, -0x3A37, -0x1A96, 0, -0x305E, -0x29E9, 0, -0x2298, -0x35D7, 0, -0x1D55, -0x383F, 0, -0x174D, -0x3AFF, 0, -0x1208, -0x3D68, 0, 0, -0x4000, 0, 0x1208, -0x3D68, 0, 0x174D, -0x3AFF, 0, 0x1D55, -0x383F, 0, 0x2298, -0x35D7, 0, 0x305E, -0x29E9, 0, 0x3A37, -0x1A96, 0, 0x4000, -0x91C, 0, 0x4000, 0x900, 0
end table

public table Halfpipe_table20
	32, 0, 17, 18, 1, 1, 1, 18, 19, 2, 0, 2, 19, 20, 3, 0, 3, 20, 21, 4, 0, 4, 21, 22, 5, 1, 5, 22, 23, 6, 2, 6, 23, 24, 7, 1, 7, 24, 25, 8, 0, 8, 25, 26, 9, 0, 9, 26, 27, 10, 1, 10, 27, 28, 11, 2, 11, 28, 29, 12, 1, 12, 29, 30, 13, 0, 13, 30, 31, 14, 0, 14, 31, 32, 15, 0, 15, 32, 33, 16, 1, 17, 34, 35, 18, 1, 18, 35, 36, 19, 1, 19, 36, 37, 20, 1, 20, 37, 38, 21, 1, 21, 38, 39, 22, 1, 22, 39, 40, 23, 2, 23, 40, 41, 24, 1, 24, 41, 42, 25, 1, 25, 42, 43, 26, 1, 26, 43, 44, 27, 1, 27, 44, 45, 28, 2, 28, 45, 46, 29, 1, 29, 46, 47, 30, 1, 30, 47, 48, 31, 1, 31, 48, 49, 32, 1, 32, 49, 50, 33, 1
end table

public table Halfpipe_table21
	79, -0x3800, 0xA00, 0, -0x3800, 0xA00, 0, -0x3800, 0xA00, 0, -0x3800, 0xA00, 0, -0x2E00, 0x2400, 0, -0x2E00, 0x2400, 0, -0x2E00, 0x2400, 0, -0x2E00, 0x2400, 0, -0x1A00, 0x3600, 0, -0x1A00, 0x3600, 0, -0x1A00, 0x3600, 0, -0x1A00, 0x3600, 0, 0, 0x4000, 0, 0, 0x4000, 0, 0, 0x4000, 0, 0, 0x4000, 0, 0x1A00, 0x3600, 0, 0x1A00, 0x3600, 0, 0x1A00, 0x3600, 0, 0x1A00, 0x3600, 0, 0x2E00, 0x2400, 0, 0x2E00, 0x2400, 0, 0x2E00, 0x2400, 0, 0x2E00, 0x2400, 0, 0x3800, 0xA00, 0, 0x3800, 0xA00, 0, 0x3800, 0xA00, 0, 0x3800, 0xA00, 0, -0x4000, 0x900, 0, -0x4000, -0x91C, 0, -0x3A37, -0x1A96, 0, -0x305E, -0x29E9, 0, -0x2298, -0x35D7, 0, -0x1D55, -0x383F, 0
	-0x174D, -0x3AFF, 0, -0x1208, -0x3D68, 0, 0, -0x4000, 0, 0x1208, -0x3D68, 0, 0x174D, -0x3AFF, 0, 0x1D55, -0x383F, 0, 0x2298, -0x35D7, 0, 0x305E, -0x29E9, 0, 0x3A37, -0x1A96, 0, 0x4000, -0x91C, 0, 0x4000, 0x900, 0, -0x4000, 0x900, 0, -0x4000, -0x91C, 0, -0x3A37, -0x1A96, 0, -0x305E, -0x29E9, 0, -0x2298, -0x35D7, 0, -0x1C64, -0x38AD, 0, -0x183E, -0x3A91, 0, -0x1208, -0x3D68, 0, 0, -0x4000, 0, 0x1208, -0x3D68, 0, 0x183E, -0x3A91, 0, 0x1C64, -0x38AD, 0, 0x2298, -0x35D7, 0, 0x305E, -0x29E9, 0, 0x3A37, -0x1A96, 0, 0x4000, -0x91C, 0, 0x4000, 0x900, 0, -0x4000, 0x900, 0, -0x4000, -0x91C, 0, -0x3A37, -0x1A96, 0, -0x305E, -0x29E9, 0, -0x2298, -0x35D7, 0, -0x1BD3, -0x38EF, 0, -0x18CF, -0x3A50, 0, -0x1208, -0x3D68, 0, 0, -0x4000, 0, 0x1208, -0x3D68, 0, 0x18CF, -0x3A50, 0, 0x1BD3, -0x38EF, 0, 0x2298, -0x35D7, 0, 0x305E, -0x29E9, 0, 0x3A37, -0x1A96, 0, 0x4000, -0x91C, 0, 0x4000, 0x900, 0
end table

public table Halfpipe_table22
	39, 0, 1, 2, 3, 5, 4, 5, 6, 7, 5, 8, 9, 10, 11, 5, 12, 13, 14, 15, 5, 16, 17, 18, 19, 5, 20, 21, 22, 23, 5, 24, 25, 26, 27, 5, 28, 45, 46, 29, 1, 29, 46, 47, 30, 1, 30, 47, 48, 31, 1, 31, 48, 49, 32, 1, 32, 49, 50, 33, 1, 33, 50, 51, 34, 2, 34, 51, 52, 35, 1, 35, 52, 53, 36, 1, 36, 53, 54, 37, 1, 37, 54, 55, 38, 1, 38, 55, 56, 39, 2, 39, 56, 57, 40, 1, 40, 57, 58, 41, 1, 41, 58, 59, 42, 1, 42, 59, 60, 43, 1, 43, 60, 61, 44, 1, 45, 62, 63, 46, 1, 46, 63, 64, 47, 0, 47, 64, 65, 48, 0, 48, 65, 66, 49, 0, 49, 66, 67, 50, 1, 50, 67, 68, 51, 2, 51, 68, 69, 52, 1, 52, 69, 70, 53, 0, 53, 70, 71, 54, 0, 54, 71, 72, 55, 1, 55, 72, 73, 56, 2, 56, 73, 74, 57, 1, 57, 74, 75, 58, 0, 58, 75, 76, 59, 0, 59, 76, 77, 60, 0, 60, 77, 78, 61, 1
end table

public table Halfpipe_table23
	34, -0x4000, 0x900, 0, -0x4000, -0x91C, 0, -0x3A37, -0x1A96, 0, -0x305E, -0x29E9, 0, -0x2298, -0x35D7, 0, -0x1BD3, -0x38EF, 0, -0x18CF, -0x3A50, 0, -0x1208, -0x3D68, 0, 0, -0x4000, 0, 0x1208, -0x3D68, 0, 0x18CF, -0x3A50, 0, 0x1BD3, -0x38EF, 0, 0x2298, -0x35D7, 0, 0x305E, -0x29E9, 0, 0x3A37, -0x1A96, 0, 0x4000, -0x91C, 0, 0x4000, 0x900, 0, -0x4000, 0x900, 0, -0x4000, -0x91C, 0, -0x3A37, -0x1A96, 0, -0x305E, -0x29E9, 0, -0x2298, -0x35D7, 0, -0x1A51, -0x39A0, 0, -0x1A51, -0x39A0, 0, -0x1208, -0x3D68, 0, 0, -0x4000, 0, 0x1208, -0x3D68, 0, 0x1A51, -0x39A0, 0, 0x1A51, -0x39A0, 0, 0x2298, -0x35D7, 0, 0x305E, -0x29E9, 0, 0x3A37, -0x1A96, 0, 0x4000, -0x91C, 0, 0x4000, 0x900, 0
end table

public table Halfpipe_table24
	16, 0, 17, 18, 1, 1, 1, 18, 19, 2, 0, 2, 19, 20, 3, 0, 3, 20, 21, 4, 0, 4, 21, 22, 5, 1, 5, 22, 23, 6, 2, 6, 23, 24, 7, 1, 7, 24, 25, 8, 0, 8, 25, 26, 9, 0, 9, 26, 27, 10, 1, 10, 27, 28, 11, 2, 11, 28, 29, 12, 1, 12, 29, 30, 13, 0, 13, 30, 31, 14, 0, 14, 31, 32, 15, 0, 15, 32, 33, 16, 1
end table

function Halfpipe_SetupVertices
	temp1 = object[0].xpos
	temp1 >>= 16
	temp1 += 376
	temp2 = object[0].ypos
	temp2 >>= 16
	Get16x16TileInfo(temp0, temp1, temp2, TILEINFO_ANGLEA)
	if temp0 == 1
		temp2 += 128
		temp2 &= 0xFF80
		object[0].iypos = temp2
	end if
	temp1 += 16
	temp3 = Halfpipe_value15
	temp3 += 64
	temp3 &= 511
	temp3 >>= 7
	switch temp3
	case 0
		Get16x16TileInfo(temp0, temp1, temp2, TILEINFO_ANGLEA)
		GetTableValue(Halfpipe_value16, temp0, Halfpipe_table5)
		temp1 += 16
		Get16x16TileInfo(temp0, temp1, temp2, TILEINFO_ANGLEA)
		GetTableValue(Halfpipe_value17, temp0, Halfpipe_table5)
		temp1 += 16
		Get16x16TileInfo(temp0, temp1, temp2, TILEINFO_ANGLEA)
		GetTableValue(Halfpipe_value18, temp0, Halfpipe_table5)
		break
	case 1
		Get16x16TileInfo(temp0, temp1, temp2, TILEINFO_ANGLEA)
		GetTableValue(Halfpipe_value18, temp0, Halfpipe_table5)
		temp1 += 16
		Get16x16TileInfo(temp0, temp1, temp2, TILEINFO_ANGLEA)
		GetTableValue(Halfpipe_value17, temp0, Halfpipe_table5)
		temp1 += 16
		Get16x16TileInfo(temp0, temp1, temp2, TILEINFO_ANGLEA)
		GetTableValue(Halfpipe_value16, temp0, Halfpipe_table5)
		break
	case 2
		Get16x16TileInfo(temp0, temp1, temp2, TILEINFO_ANGLEA)
		GetTableValue(Halfpipe_value16, temp0, Halfpipe_table5)
		FlipSign(Halfpipe_value16)
		temp1 += 16
		Get16x16TileInfo(temp0, temp1, temp2, TILEINFO_ANGLEA)
		GetTableValue(Halfpipe_value17, temp0, Halfpipe_table5)
		temp1 += 16
		Get16x16TileInfo(temp0, temp1, temp2, TILEINFO_ANGLEA)
		GetTableValue(Halfpipe_value18, temp0, Halfpipe_table5)
		FlipSign(Halfpipe_value18)
		break
	case 3
		Get16x16TileInfo(temp0, temp1, temp2, TILEINFO_ANGLEA)
		GetTableValue(Halfpipe_value18, temp0, Halfpipe_table5)
		FlipSign(Halfpipe_value18)
		temp1 += 16
		Get16x16TileInfo(temp0, temp1, temp2, TILEINFO_ANGLEA)
		GetTableValue(Halfpipe_value17, temp0, Halfpipe_table5)
		temp1 += 16
		Get16x16TileInfo(temp0, temp1, temp2, TILEINFO_ANGLEA)
		GetTableValue(Halfpipe_value16, temp0, Halfpipe_table5)
		FlipSign(Halfpipe_value16)
		break
	end switch
	temp0 = stage.curYBoundary2
	temp0 <<= 16
	object[0].ypos += 0x80000
	if object[0].ypos >= temp0
		object[0].ypos -= temp0
	end if
	object[0].value22 += 0x80000
	if object[0].value22 >= temp0
		object[0].value22 -= temp0
	end if
	MatrixRotateXYZ(MAT_WORLD, Halfpipe_value19, Halfpipe_value15, Halfpipe_value20)
	MatrixTranslateXYZ(MAT_TEMP, Halfpipe_value9, Halfpipe_value10, Halfpipe_value11)
	MatrixMultiply(MAT_WORLD, MAT_TEMP)
	temp0 = 1
	while temp0 == 1
		if object[arrayPos5].ypos < object[0].ypos
			object[arrayPos5].priority = PRIORITY_ACTIVE
			if object[arrayPos5].value7 == 1
				vertexBuffer[4094].x = object[arrayPos5].value1
				vertexBuffer[4094].y = object[arrayPos5].value2
				vertexBuffer[4094].z = 0
				vertexBuffer[4095].x = object[arrayPos5].value8
				vertexBuffer[4095].y = object[arrayPos5].value9
				vertexBuffer[4095].z = 0
				TransformVertices(MAT_WORLD, 0xFFE, 0x1000)
				object[arrayPos5].value3 = object[0].value22
				object[arrayPos5].value4 = vertexBuffer[4094].x
				object[arrayPos5].value5 = vertexBuffer[4094].y
				object[arrayPos5].value6 = vertexBuffer[4094].z
				object[arrayPos5].value11 = vertexBuffer[4095].x
				object[arrayPos5].value12 = vertexBuffer[4095].y
				object[arrayPos5].value13 = vertexBuffer[4095].z
			else
				vertexBuffer[4095].x = object[arrayPos5].value1
				vertexBuffer[4095].y = object[arrayPos5].value2
				vertexBuffer[4095].z = 0
				TransformVertices(MAT_WORLD, 0xFFF, 0x1000)
				object[arrayPos5].value3 = object[0].value22
				object[arrayPos5].value4 = vertexBuffer[4095].x
				object[arrayPos5].value5 = vertexBuffer[4095].y
				object[arrayPos5].value6 = vertexBuffer[4095].z
			end if
			arrayPos5++
		else
			temp0 = 0
		end if
	loop
	temp2 = Halfpipe_value6
	temp2 &= 7
	GetTableValue(Halfpipe_value21, temp2, Halfpipe_table4)
	Halfpipe_value6++
	temp0 = 0
	arrayPos0 = Halfpipe_value5
	GetTableValue(temp1, temp0, Halfpipe_value21)
	temp0++
	while temp1 > 0
		GetTableValue(vertexBuffer[arrayPos0].x, temp0, Halfpipe_value21)
		temp0++
		GetTableValue(vertexBuffer[arrayPos0].y, temp0, Halfpipe_value21)
		temp0++
		GetTableValue(vertexBuffer[arrayPos0].z, temp0, Halfpipe_value21)
		temp0++
		arrayPos0++
		temp1--
	loop
	SetTableValue(Halfpipe_value9, Halfpipe_value7, Halfpipe_table6)
	SetTableValue(Halfpipe_value10, Halfpipe_value7, Halfpipe_table7)
	SetTableValue(Halfpipe_value11, Halfpipe_value7, Halfpipe_table8)
	SetTableValue(Halfpipe_value19, Halfpipe_value7, Halfpipe_table9)
	SetTableValue(Halfpipe_value15, Halfpipe_value7, Halfpipe_table10)
	SetTableValue(Halfpipe_value20, Halfpipe_value7, Halfpipe_table11)
	switch temp2
	case 0
	case 1
	case 2
	case 3
	case 4
	case 7
		GetTableValue(temp0, temp2, Halfpipe_table12)
		temp0 += Halfpipe_value5
		TransformVertices(MAT_WORLD, Halfpipe_value5, temp0)
		vertexBuffer[4095].x = 0
		vertexBuffer[4095].y = 0
		vertexBuffer[4095].z = 0x2000
		TransformVertices(MAT_WORLD, 0xFFF, 0x1000)
		Halfpipe_value9 = vertexBuffer[4095].x
		Halfpipe_value10 = vertexBuffer[4095].y
		Halfpipe_value11 = vertexBuffer[4095].z
		Halfpipe_value19 += Halfpipe_value16
		Halfpipe_value15 += Halfpipe_value17
		Halfpipe_value20 += Halfpipe_value18
		MatrixRotateXYZ(MAT_WORLD, Halfpipe_value19, Halfpipe_value15, Halfpipe_value20)
		MatrixTranslateXYZ(MAT_TEMP, Halfpipe_value9, Halfpipe_value10, Halfpipe_value11)
		MatrixMultiply(MAT_WORLD, MAT_TEMP)
		TransformVertices(MAT_WORLD, temp0, arrayPos0)
		break
	case 5
		GetTableValue(temp0, temp2, Halfpipe_table12)
		temp0 += Halfpipe_value5
		TransformVertices(MAT_WORLD, Halfpipe_value5, temp0)
		vertexBuffer[4094].x = 0
		vertexBuffer[4094].y = 0
		vertexBuffer[4094].z = 0xC00
		vertexBuffer[4095].x = 0
		vertexBuffer[4095].y = 0
		vertexBuffer[4095].z = 0x2000
		TransformVertices(MAT_WORLD, 0xFFE, 0x1000)
		Halfpipe_value9 = vertexBuffer[4094].x
		Halfpipe_value10 = vertexBuffer[4094].y
		Halfpipe_value11 = vertexBuffer[4094].z
		temp3 = Halfpipe_value16
		temp3 *= 12
		temp3 >>= 5
		Halfpipe_value19 += temp3
		temp3 = Halfpipe_value17
		temp3 *= 12
		temp3 >>= 5
		Halfpipe_value15 += temp3
		temp3 = Halfpipe_value18
		temp3 *= 12
		temp3 >>= 5
		Halfpipe_value20 += temp3
		MatrixRotateXYZ(MAT_WORLD, Halfpipe_value19, Halfpipe_value15, Halfpipe_value20)
		MatrixTranslateXYZ(MAT_TEMP, Halfpipe_value9, Halfpipe_value10, Halfpipe_value11)
		MatrixMultiply(MAT_WORLD, MAT_TEMP)
		temp1 = temp0
		temp1 += 17
		TransformVertices(MAT_WORLD, temp0, temp1)
		Halfpipe_value9 = vertexBuffer[4095].x
		Halfpipe_value10 = vertexBuffer[4095].y
		Halfpipe_value11 = vertexBuffer[4095].z
		GetTableValue(Halfpipe_value19, Halfpipe_value7, Halfpipe_table9)
		GetTableValue(Halfpipe_value15, Halfpipe_value7, Halfpipe_table10)
		GetTableValue(Halfpipe_value20, Halfpipe_value7, Halfpipe_table11)
		Halfpipe_value19 += Halfpipe_value16
		Halfpipe_value15 += Halfpipe_value17
		Halfpipe_value20 += Halfpipe_value18
		MatrixRotateXYZ(MAT_WORLD, Halfpipe_value19, Halfpipe_value15, Halfpipe_value20)
		MatrixTranslateXYZ(MAT_TEMP, Halfpipe_value9, Halfpipe_value10, Halfpipe_value11)
		MatrixMultiply(MAT_WORLD, MAT_TEMP)
		TransformVertices(MAT_WORLD, temp1, arrayPos0)
		break
	case 6
		GetTableValue(temp0, temp2, Halfpipe_table12)
		temp0 += Halfpipe_value5
		TransformVertices(MAT_WORLD, Halfpipe_value5, temp0)
		vertexBuffer[4094].x = 0
		vertexBuffer[4094].y = 0
		vertexBuffer[4094].z = 0x1400
		vertexBuffer[4095].x = 0
		vertexBuffer[4095].y = 0
		vertexBuffer[4095].z = 0x2000
		TransformVertices(MAT_WORLD, 0xFFE, 0x1000)
		Halfpipe_value9 = vertexBuffer[4094].x
		Halfpipe_value10 = vertexBuffer[4094].y
		Halfpipe_value11 = vertexBuffer[4094].z
		temp3 = Halfpipe_value16
		temp3 *= 20
		temp3 >>= 5
		Halfpipe_value19 += temp3
		temp3 = Halfpipe_value17
		temp3 *= 20
		temp3 >>= 5
		Halfpipe_value15 += temp3
		temp3 = Halfpipe_value18
		temp3 *= 20
		temp3 >>= 5
		Halfpipe_value20 += temp3
		MatrixRotateXYZ(MAT_WORLD, Halfpipe_value19, Halfpipe_value15, Halfpipe_value20)
		MatrixTranslateXYZ(MAT_TEMP, Halfpipe_value9, Halfpipe_value10, Halfpipe_value11)
		MatrixMultiply(MAT_WORLD, MAT_TEMP)
		temp1 = temp0
		temp1 += 17
		TransformVertices(MAT_WORLD, temp0, temp1)
		Halfpipe_value9 = vertexBuffer[4095].x
		Halfpipe_value10 = vertexBuffer[4095].y
		Halfpipe_value11 = vertexBuffer[4095].z
		GetTableValue(Halfpipe_value19, Halfpipe_value7, Halfpipe_table9)
		GetTableValue(Halfpipe_value15, Halfpipe_value7, Halfpipe_table10)
		GetTableValue(Halfpipe_value20, Halfpipe_value7, Halfpipe_table11)
		Halfpipe_value19 += Halfpipe_value16
		Halfpipe_value15 += Halfpipe_value17
		Halfpipe_value20 += Halfpipe_value18
		MatrixRotateXYZ(MAT_WORLD, Halfpipe_value19, Halfpipe_value15, Halfpipe_value20)
		MatrixTranslateXYZ(MAT_TEMP, Halfpipe_value9, Halfpipe_value10, Halfpipe_value11)
		MatrixMultiply(MAT_WORLD, MAT_TEMP)
		TransformVertices(MAT_WORLD, temp1, arrayPos0)
		break
	end switch
	Halfpipe_value7++
	Halfpipe_value7 %= 40
	Halfpipe_value5 = arrayPos0
	if Halfpipe_value5 >= Halfpipe_value8
		Halfpipe_value5 = 0
	end if
end function


function Halfpipe_SetupFaces
	temp0 = 0
	arrayPos0 = scene3D.faceCount
	GetTableValue(temp1, temp0, Halfpipe_value13)
	temp0++
	while temp1 > 0
		GetTableValue(faceBuffer[arrayPos0].a, temp0, Halfpipe_value13)
		faceBuffer[arrayPos0].a += Halfpipe_value5
		temp0++
		GetTableValue(faceBuffer[arrayPos0].b, temp0, Halfpipe_value13)
		faceBuffer[arrayPos0].b += Halfpipe_value5
		temp0++
		GetTableValue(faceBuffer[arrayPos0].c, temp0, Halfpipe_value13)
		faceBuffer[arrayPos0].c += Halfpipe_value5
		temp0++
		GetTableValue(faceBuffer[arrayPos0].d, temp0, Halfpipe_value13)
		faceBuffer[arrayPos0].d += Halfpipe_value5
		temp0++
		GetTableValue(temp2, temp0, Halfpipe_value13)
		temp0++
		switch temp2
		case 0
			faceBuffer[arrayPos0].flag = FACE_FADED
			faceBuffer[arrayPos0].color = SpecialSetup_value1
			break
		case 1
			faceBuffer[arrayPos0].flag = FACE_FADED
			faceBuffer[arrayPos0].color = SpecialSetup_value2
			break
		case 2
			faceBuffer[arrayPos0].flag = FACE_FADED
			faceBuffer[arrayPos0].color = -0x1F2000
			break
		case 3
			faceBuffer[arrayPos0].flag = FACE_FADED
			faceBuffer[arrayPos0].color = -0x1F5FE0
			break
		case 5
			faceBuffer[arrayPos0].flag = FACE_TEXTURED_C
			arrayPos1 = faceBuffer[arrayPos0].a
			vertexBuffer[arrayPos1].u = 17
			vertexBuffer[arrayPos1].v = 17
			arrayPos2 = Halfpipe_value12
			arrayPos2 %= 7
			if arrayPos2 == 0
				arrayPos2 = Halfpipe_value12
				arrayPos2 /= 7
				SetTableValue(arrayPos1, arrayPos2, Halfpipe_table13)
			end if
			Halfpipe_value12++
			arrayPos1 = faceBuffer[arrayPos0].b
			vertexBuffer[arrayPos1].u = 0x800
			vertexBuffer[arrayPos1].v = 0x800
			arrayPos1 = faceBuffer[arrayPos0].c
			vertexBuffer[arrayPos1].u = 16
			vertexBuffer[arrayPos1].v = 16
			break
		end switch
		arrayPos0++
		scene3D.faceCount++
		temp1--
	loop
end function


event ObjectMain
	scene3D.vertexCount = Halfpipe_value8
	scene3D.faceCount = Halfpipe_value14
	if 1 == 1
		object.value1 += object.value23
		temp0 = object.value23
		temp0 <<= 13
		object.value13 += temp0
		if object.value1 > 63
			object.value1 -= 64
			CallFunction(Halfpipe_SetupVertices)
			object.value2++
			object.value2 %= 40
			object.value3++
			object.value3 %= 40
			object.value20++
			object.value20 %= 40
			object.value21++
			object.value21 %= 40
		end if
	end if
	GetTableValue(object.value4, object.value2, Halfpipe_table6)
	GetTableValue(temp0, object.value3, Halfpipe_table6)
	temp0 -= object.value4
	temp0 *= object.value1
	temp0 >>= 6
	object.value4 += temp0
	FlipSign(object.value4)
	GetTableValue(object.value5, object.value2, Halfpipe_table7)
	GetTableValue(temp0, object.value3, Halfpipe_table7)
	temp0 -= object.value5
	temp0 *= object.value1
	temp0 >>= 6
	object.value5 += temp0
	FlipSign(object.value5)
	GetTableValue(object.value6, object.value2, Halfpipe_table8)
	GetTableValue(temp0, object.value3, Halfpipe_table8)
	temp0 -= object.value6
	temp0 *= object.value1
	temp0 >>= 6
	object.value6 += temp0
	FlipSign(object.value6)
	GetTableValue(temp1, object.value2, Halfpipe_table9)
	GetTableValue(temp0, object.value3, Halfpipe_table9)
	temp0 -= temp1
	temp0 *= object.value1
	temp0 >>= 6
	temp1 += temp0
	temp1 <<= 1
	if object.value10 != temp1
		temp0 = temp1
		temp0 -= object.value10
		temp0 >>= 1
		if temp0 == 0
			if object.value10 < temp1
				object.value10++
			else
				object.value10--
			end if
		else
			object.value10 += temp0
		end if
	end if
	GetTableValue(temp1, object.value2, Halfpipe_table10)
	GetTableValue(temp0, object.value3, Halfpipe_table10)
	temp0 -= temp1
	temp0 *= object.value1
	temp0 >>= 6
	temp1 += temp0
	temp1 <<= 1
	if object.value11 != temp1
		temp0 = temp1
		temp0 -= object.value11
		temp0 >>= 2
		if temp0 == 0
			if object.value11 < temp1
				object.value11++
			else
				object.value11--
			end if
		else
			object.value11 += temp0
		end if
	end if
	GetTableValue(temp1, object.value2, Halfpipe_table11)
	GetTableValue(temp0, object.value3, Halfpipe_table11)
	temp0 -= temp1
	temp0 *= object.value1
	temp0 >>= 6
	temp1 += temp0
	temp1 <<= 1
	if object.value12 != temp1
		temp0 = temp1
		temp0 -= object.value12
		temp0 >>= 1
		if temp0 == 0
			if object.value12 < temp1
				object.value12++
			else
				object.value12--
			end if
		else
			object.value12 += temp0
		end if
	end if
	object.value7 = object.value10
	object.value8 = object.value11
	object.value9 = object.value12
	object.value7 >>= 1
	object.value8 >>= 1
	object.value9 >>= 1
	GetTableValue(object.value14, object.value20, Halfpipe_table6)
	GetTableValue(temp0, object.value21, Halfpipe_table6)
	temp0 -= object.value14
	temp0 *= object.value1
	temp0 >>= 6
	object.value14 += temp0
	GetTableValue(object.value15, object.value20, Halfpipe_table7)
	GetTableValue(temp0, object.value21, Halfpipe_table7)
	temp0 -= object.value15
	temp0 *= object.value1
	temp0 >>= 6
	object.value15 += temp0
	GetTableValue(object.value16, object.value20, Halfpipe_table8)
	GetTableValue(temp0, object.value21, Halfpipe_table8)
	temp0 -= object.value16
	temp0 *= object.value1
	temp0 >>= 6
	object.value16 += temp0
	GetTableValue(object.value17, object.value20, Halfpipe_table9)
	GetTableValue(temp0, object.value21, Halfpipe_table9)
	temp0 -= object.value17
	temp0 *= object.value1
	temp0 >>= 6
	object.value17 += temp0
	GetTableValue(object.value18, object.value20, Halfpipe_table10)
	GetTableValue(temp0, object.value21, Halfpipe_table10)
	temp0 -= object.value18
	temp0 *= object.value1
	temp0 >>= 6
	object.value18 += temp0
	GetTableValue(object.value19, object.value20, Halfpipe_table11)
	GetTableValue(temp0, object.value21, Halfpipe_table11)
	temp0 -= object.value19
	temp0 *= object.value1
	temp0 >>= 6
	object.value19 += temp0
end event


event ObjectDraw
	MatrixTranslateXYZ(MAT_WORLD, object.value4, object.value5, object.value6)
	MatrixRotateXYZ(MAT_VIEW, object.value7, object.value8, object.value9)
	MatrixInverse(1)
	MatrixRotateXYZ(MAT_TEMP, -8, 0, 0)
	MatrixMultiply(MAT_VIEW, MAT_TEMP)
	temp0 = object[2].xpos
	temp0 *= -64
	temp0 >>= 9
	temp1 = object[2].ypos
	temp1 *= -96
	temp1 >>= 9
	temp1 -= 512
	MatrixTranslateXYZ(MAT_TEMP, temp0, temp1, 0)
	MatrixMultiply(MAT_VIEW, MAT_TEMP)
	Draw3DScene()
end event


event ObjectStartup
	LoadSpriteSheet("Special/Objects.gif")
	object[0].type = TypeName[Halfpipe]
	object[0].priority = PRIORITY_ACTIVE
	object[0].xpos = 0x1C00000
	object[0].ypos = 0
	object[0].value13 = 0
	object[0].value22 = 0
	object[0].value1 = 0
	object[0].value2 = 0
	object[0].value3 = 1
	object[0].value20 = 2
	object[0].value21 = 3
	object[0].value23 = 17
	Halfpipe_value5 = 0
	Halfpipe_value6 = 0
	Halfpipe_value7 = 0
	Halfpipe_value8 = 0x1000
	Halfpipe_value9 = 0
	Halfpipe_value10 = 0
	Halfpipe_value11 = 0
	arrayPos5 = 32
	SetTableValue(Halfpipe_table14, 0, Halfpipe_table4)
	SetTableValue(Halfpipe_table14, 1, Halfpipe_table4)
	SetTableValue(Halfpipe_table14, 2, Halfpipe_table4)
	SetTableValue(Halfpipe_table14, 3, Halfpipe_table4)
	SetTableValue(Halfpipe_table17, 4, Halfpipe_table4)
	SetTableValue(Halfpipe_table19, 5, Halfpipe_table4)
	SetTableValue(Halfpipe_table21, 6, Halfpipe_table4)
	SetTableValue(Halfpipe_table23, 7, Halfpipe_table4)
	Halfpipe_value12 = 0
	scene3D.faceCount = 0
	temp7 = 0
	while temp7 < 4
		Halfpipe_value13 = Halfpipe_table15
		CallFunction(Halfpipe_SetupFaces)
		CallFunction(Halfpipe_SetupVertices)
		Halfpipe_value13 = Halfpipe_table16
		CallFunction(Halfpipe_SetupFaces)
		CallFunction(Halfpipe_SetupVertices)
		Halfpipe_value13 = Halfpipe_table16
		CallFunction(Halfpipe_SetupFaces)
		CallFunction(Halfpipe_SetupVertices)
		Halfpipe_value13 = Halfpipe_table16
		CallFunction(Halfpipe_SetupFaces)
		CallFunction(Halfpipe_SetupVertices)
		Halfpipe_value13 = Halfpipe_table18
		CallFunction(Halfpipe_SetupFaces)
		CallFunction(Halfpipe_SetupVertices)
		Halfpipe_value13 = Halfpipe_table20
		CallFunction(Halfpipe_SetupFaces)
		CallFunction(Halfpipe_SetupVertices)
		Halfpipe_value13 = Halfpipe_table22
		CallFunction(Halfpipe_SetupFaces)
		CallFunction(Halfpipe_SetupVertices)
		Halfpipe_value13 = Halfpipe_table24
		CallFunction(Halfpipe_SetupFaces)
		CallFunction(Halfpipe_SetupVertices)
		temp7++
	loop
	scene3D.vertexCount = Halfpipe_value5
	Halfpipe_value8 = Halfpipe_value5
	Halfpipe_value14 = scene3D.faceCount
	Halfpipe_value5 = 0
	scene3D.projectionX = 216
	scene3D.projectionY = 216
	scene3D.fogStrength = 80
	scene3D.fogColor = 0
end event

event RSDKDraw
	DrawSprite(0)
end event

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