Files
gtav-src/script/dev_ng/singleplayer/scripts/Ambient/Fairground/rollercoaster.sc
T
2025-09-29 00:52:08 +02:00

1098 lines
42 KiB
Python
Executable File

// *****************************************************************************************
// *****************************************************************************************
//
// MISSION NAME : rollercoaster.sc
// AUTHOR : Aaron Gandaa
// DESCRIPTION : This Controls The Rollercoaster
//
// *****************************************************************************************
// *****************************************************************************************
//----------------------
// INCLUDES
//----------------------
USING "rage_builtins.sch"
USING "globals.sch"
USING "rgeneral_include.sch"
USING "commands_brains.sch"
USING "RC_Helper_Functions.sch"
USING "net_fps_cam.sch"
USING "Fairground_Shared.sch"
USING "RC_Asset_Public.sch"
#IF IS_DEBUG_BUILD
USING "shared_debug.sch"
#ENDIF
//----------------------
// ENUM
//----------------------
ENUM eRCoasterState
RCS_SPEEDUP,
RCS_ACTIVE,
RCS_SLOWDOWN,
RCS_STOPPED
ENDENUM
ENUM eRCoasterSoundCmd
RCSND_NULL,
RCSND_PLAYBRAKES,
RCSND_PLAYPULLOFF,
RCSND_PLAYBIGSTOP,
RCSND_PLAYCROWD,
RCSND_PLAYRATCHET,
RCSND_STOPRATCHET
ENDENUM
//----------------------
// CONSTANTS
//----------------------
CONST_INT NUM_POINTS 234
//----------------------
// STRUCT
//----------------------
STRUCT SPEED_CHANGE
INT iPointIndex
FLOAT fNewFactor
eRCoasterSoundCmd sndCommand
ENDSTRUCT
STRUCT RCOASTER_CAR
VECTOR vPosition
FLOAT tIValue = 0.0
INT iPointIndex[4] // we interpolate between p1 and p2
OBJECT_INDEX mObjectID
FLOAT fPointIndex
BOOL bIsSourceCar
ENDSTRUCT
//----------------------
// VARIABLES
//----------------------
MODEL_NAMES dummyRCModel = PROP_LD_TEST_01
ASSET_REQUESTER asRequester
VECTOR vSplinePoint[NUM_POINTS]
VECTOR vCarOffset = <<0, 0, 1.7>>
INT iSplinePointsUsed
BOOL bInfiniteRide = FALSE
FLOAT tInterpolateRate = 0
RCOASTER_CAR sourceCar
RCOASTER_CAR targetCar
eRCoasterState rCoasterState
FIRST_PERSON_CAM_STRUCT fpsCam
BOOL bSkipped = FALSE
OBJECT_INDEX rollerCarTurnOffProp[4]
CAMERA_INDEX initialCamera
INT iRollerSoundID = -1
INT iRatchetSoundID = -1
INT iPadVibrateTime = 32
INT iPadVibrateFreq = 32
INT iPadRungSkip = 3
INT iNextSpeechTime = 0
#IF IS_DEBUG_BUILD
BOOL bShowDebugPoint
INT iDebugPoint
BOOL bShowDebugCar
BOOL bReset
#ENDIF
FLOAT fSinShakeFactor = 0.25
FLOAT fSpeedMultiple = 1.75
FLOAT fSpeedFactor = 1.0
INT iSpeedCounter = 0
SPEED_CHANGE speedChange[32]
INT iSpeedChangesUsed = 0
INT iSpeedPointShift = 0
//----------------------
// FUNCTIONS
//----------------------
/// PURPOSE:
/// Adds a point to the spline list
/// PARAMS:
/// x - xcoord
/// y - ycoord
/// z - zcoord
PROC ADD_SPEED_CHANGE(INT iRung, FLOAT sf, eRCoasterSoundCmd snd)
IF (iSpeedChangesUsed >= COUNT_OF(speedChange))
speedChange[COUNT_OF(speedChange) - 1].iPointIndex = 232
speedChange[COUNT_OF(speedChange) - 1].fNewFactor = 0.01
speedChange[COUNT_OF(speedChange) - 1].sndCommand = RCSND_NULL
SCRIPT_ASSERT("EXTEND SPEED CHANGE ARRAY")
EXIT
ENDIF
speedChange[iSpeedChangesUsed].iPointIndex = iRung + iSpeedPointShift
IF (speedChange[iSpeedChangesUsed].iPointIndex >= NUM_POINTS)
speedChange[iSpeedChangesUsed].iPointIndex = NUM_POINTS - 1
ENDIF
speedChange[iSpeedChangesUsed].fNewFactor = sf
speedChange[iSpeedChangesUsed].sndCommand = snd
iSpeedChangesUsed ++
ENDPROC
FUNC VECTOR GET_SPLINE_POINT(INT sp)
INT ind = (sp % iSplinePointsUsed)
RETURN vSplinePoint[ind]
ENDFUNC
/// PURPOSE:
/// Adds a point to the spline list
/// PARAMS:
/// x - xcoord
/// y - ycoord
/// z - zcoord
PROC ADD_ROLLER_COASTER_SPLINE_POINT(FLOAT x, FLOAT y, FLOAT z)
vSplinePoint[NUM_POINTS - 1 - iSplinePointsUsed].x = x
vSplinePoint[NUM_POINTS - 1 - iSplinePointsUsed].y = y
vSplinePoint[NUM_POINTS - 1 - iSplinePointsUsed].z = z
iSplinePointsUsed ++
ENDPROC
/// PURPOSE:
/// Adds all point to roller coaster spline
PROC SETUP_ROLLER_COASTER_POINTS()
iSplinePointsUsed = 0
ADD_ROLLER_COASTER_SPLINE_POINT( -1642.8782, -1123.9034, 16.8750)
ADD_ROLLER_COASTER_SPLINE_POINT( -1644.4199, -1125.7399, 16.8748)
ADD_ROLLER_COASTER_SPLINE_POINT( -1645.8953, -1127.4989, 16.8755)
ADD_ROLLER_COASTER_SPLINE_POINT( -1647.4370, -1129.3353, 16.8753)
ADD_ROLLER_COASTER_SPLINE_POINT( -1648.7561, -1130.9084, 16.8753)
ADD_ROLLER_COASTER_SPLINE_POINT( -1650.2980, -1132.7448, 16.8750)
ADD_ROLLER_COASTER_SPLINE_POINT( -1651.6171, -1134.3177, 16.8751)
ADD_ROLLER_COASTER_SPLINE_POINT( -1653.1589, -1136.1542, 16.8748)
ADD_ROLLER_COASTER_SPLINE_POINT( -1654.4781, -1137.7273, 16.8748)
ADD_ROLLER_COASTER_SPLINE_POINT( -1656.0354, -1139.5836, 16.8755)
ADD_ROLLER_COASTER_SPLINE_POINT( -1657.5308, -1141.3647, 16.8737)
ADD_ROLLER_COASTER_SPLINE_POINT( -1658.9907, -1143.1060, 16.8658)
ADD_ROLLER_COASTER_SPLINE_POINT( -1660.4988, -1144.9023, 16.6238)
ADD_ROLLER_COASTER_SPLINE_POINT( -1661.9602, -1146.6438, 16.1105)
ADD_ROLLER_COASTER_SPLINE_POINT( -1663.4008, -1148.3608, 15.6586)
ADD_ROLLER_COASTER_SPLINE_POINT( -1664.8406, -1150.0760, 15.3486)
ADD_ROLLER_COASTER_SPLINE_POINT( -1666.3196, -1151.8391, 15.2158)
ADD_ROLLER_COASTER_SPLINE_POINT( -1667.8478, -1153.6605, 15.2110)
ADD_ROLLER_COASTER_SPLINE_POINT( -1669.4388, -1155.5143, 15.2169)
ADD_ROLLER_COASTER_SPLINE_POINT( -1671.2697, -1156.9758, 15.2531)
ADD_ROLLER_COASTER_SPLINE_POINT( -1673.3928, -1158.0062, 15.3676)
ADD_ROLLER_COASTER_SPLINE_POINT( -1675.6748, -1158.6094, 15.5443)
ADD_ROLLER_COASTER_SPLINE_POINT( -1678.0298, -1158.7679, 15.7925)
ADD_ROLLER_COASTER_SPLINE_POINT( -1680.3654, -1158.4532, 16.0340)
ADD_ROLLER_COASTER_SPLINE_POINT( -1682.5842, -1157.6477, 16.2480)
ADD_ROLLER_COASTER_SPLINE_POINT( -1684.6084, -1156.4354, 16.4506)
ADD_ROLLER_COASTER_SPLINE_POINT( -1686.3657, -1154.8607, 16.6232)
ADD_ROLLER_COASTER_SPLINE_POINT( -1687.7472, -1152.9507, 16.7552)
ADD_ROLLER_COASTER_SPLINE_POINT( -1688.7185, -1150.8003, 16.8714)
ADD_ROLLER_COASTER_SPLINE_POINT( -1689.2633, -1148.5048, 16.9875)
ADD_ROLLER_COASTER_SPLINE_POINT( -1689.3574, -1146.1498, 17.1035)
ADD_ROLLER_COASTER_SPLINE_POINT( -1688.9308, -1143.8290, 17.2199)
ADD_ROLLER_COASTER_SPLINE_POINT( -1688.0691, -1141.6328, 17.3360)
ADD_ROLLER_COASTER_SPLINE_POINT( -1686.8066, -1139.6399, 17.4523)
ADD_ROLLER_COASTER_SPLINE_POINT( -1685.1660, -1137.9503, 17.5683)
ADD_ROLLER_COASTER_SPLINE_POINT( -1683.2061, -1136.6370, 17.6846)
ADD_ROLLER_COASTER_SPLINE_POINT( -1681.0320, -1135.7218, 17.8007)
ADD_ROLLER_COASTER_SPLINE_POINT( -1678.7236, -1135.2341, 17.9169)
ADD_ROLLER_COASTER_SPLINE_POINT( -1676.3694, -1135.2588, 18.0330)
ADD_ROLLER_COASTER_SPLINE_POINT( -1674.0613, -1135.7456, 18.1492)
ADD_ROLLER_COASTER_SPLINE_POINT( -1671.8885, -1136.6627, 18.2653)
ADD_ROLLER_COASTER_SPLINE_POINT( -1669.9409, -1137.9832, 18.3814)
ADD_ROLLER_COASTER_SPLINE_POINT( -1668.3221, -1139.7002, 18.4976)
ADD_ROLLER_COASTER_SPLINE_POINT( -1667.0603, -1141.6923, 18.6138)
ADD_ROLLER_COASTER_SPLINE_POINT( -1666.1997, -1143.8888, 18.7300)
ADD_ROLLER_COASTER_SPLINE_POINT( -1665.8157, -1146.2086, 18.8460)
ADD_ROLLER_COASTER_SPLINE_POINT( -1665.9152, -1148.5652, 18.9622)
ADD_ROLLER_COASTER_SPLINE_POINT( -1666.4609, -1150.8588, 19.0783)
ADD_ROLLER_COASTER_SPLINE_POINT( -1667.4324, -1153.0096, 19.1946)
ADD_ROLLER_COASTER_SPLINE_POINT( -1668.8496, -1154.8859, 19.3106)
ADD_ROLLER_COASTER_SPLINE_POINT( -1670.6064, -1156.4585, 19.4267)
ADD_ROLLER_COASTER_SPLINE_POINT( -1672.6309, -1157.6694, 19.5429)
ADD_ROLLER_COASTER_SPLINE_POINT( -1674.7874, -1158.4460, 19.6567)
ADD_ROLLER_COASTER_SPLINE_POINT( -1676.3906, -1158.7170, 19.7777)
ADD_ROLLER_COASTER_SPLINE_POINT( -1678.2314, -1158.8010, 19.9530)
ADD_ROLLER_COASTER_SPLINE_POINT( -1680.2209, -1158.6627, 20.1677)
ADD_ROLLER_COASTER_SPLINE_POINT( -1682.4105, -1158.2969, 20.4143)
ADD_ROLLER_COASTER_SPLINE_POINT( -1684.6401, -1157.6542, 20.6740)
ADD_ROLLER_COASTER_SPLINE_POINT( -1686.8926, -1156.7153, 20.9358)
ADD_ROLLER_COASTER_SPLINE_POINT( -1689.1161, -1155.4551, 21.1866)
ADD_ROLLER_COASTER_SPLINE_POINT( -1691.2562, -1153.8446, 21.4132)
ADD_ROLLER_COASTER_SPLINE_POINT( -1693.2592, -1151.8575, 21.6023)
ADD_ROLLER_COASTER_SPLINE_POINT( -1695.0718, -1149.4667, 21.7407)
ADD_ROLLER_COASTER_SPLINE_POINT( -1696.5510, -1146.8528, 21.8203)
ADD_ROLLER_COASTER_SPLINE_POINT( -1697.6345, -1144.2366, 21.8563)
ADD_ROLLER_COASTER_SPLINE_POINT( -1698.3623, -1141.6365, 21.8562)
ADD_ROLLER_COASTER_SPLINE_POINT( -1698.7628, -1139.0817, 21.8259)
ADD_ROLLER_COASTER_SPLINE_POINT( -1698.8662, -1136.6012, 21.7715)
ADD_ROLLER_COASTER_SPLINE_POINT( -1698.7009, -1134.2245, 21.6989)
ADD_ROLLER_COASTER_SPLINE_POINT( -1698.2970, -1131.9816, 21.6144)
ADD_ROLLER_COASTER_SPLINE_POINT( -1697.6823, -1129.9008, 21.5238)
ADD_ROLLER_COASTER_SPLINE_POINT( -1696.8884, -1128.0118, 21.4334)
ADD_ROLLER_COASTER_SPLINE_POINT( -1695.9435, -1126.3444, 21.3490)
ADD_ROLLER_COASTER_SPLINE_POINT( -1694.7991, -1124.8711, 21.2657)
ADD_ROLLER_COASTER_SPLINE_POINT( -1693.0948, -1123.2388, 21.1190)
ADD_ROLLER_COASTER_SPLINE_POINT( -1691.1541, -1121.8994, 20.9810)
ADD_ROLLER_COASTER_SPLINE_POINT( -1689.0249, -1120.8865, 20.8585)
ADD_ROLLER_COASTER_SPLINE_POINT( -1686.7622, -1120.2255, 20.7582)
ADD_ROLLER_COASTER_SPLINE_POINT( -1684.4233, -1119.9338, 20.6861)
ADD_ROLLER_COASTER_SPLINE_POINT( -1682.0681, -1120.0188, 20.6475)
ADD_ROLLER_COASTER_SPLINE_POINT( -1679.7571, -1120.4772, 20.6471)
ADD_ROLLER_COASTER_SPLINE_POINT( -1677.5493, -1121.2968, 20.6883)
ADD_ROLLER_COASTER_SPLINE_POINT( -1675.5024, -1122.4581, 20.7732)
ADD_ROLLER_COASTER_SPLINE_POINT( -1673.6677, -1123.9282, 20.9032)
ADD_ROLLER_COASTER_SPLINE_POINT( -1672.0916, -1125.6687, 21.0783)
ADD_ROLLER_COASTER_SPLINE_POINT( -1670.8145, -1127.6348, 21.2971)
ADD_ROLLER_COASTER_SPLINE_POINT( -1669.8662, -1129.7750, 21.5574)
ADD_ROLLER_COASTER_SPLINE_POINT( -1669.2704, -1132.0343, 21.8556)
ADD_ROLLER_COASTER_SPLINE_POINT( -1669.0382, -1134.3553, 22.1878)
ADD_ROLLER_COASTER_SPLINE_POINT( -1669.1746, -1136.6805, 22.5487)
ADD_ROLLER_COASTER_SPLINE_POINT( -1669.6760, -1138.9525, 22.9324)
ADD_ROLLER_COASTER_SPLINE_POINT( -1670.5276, -1141.1157, 23.3331)
ADD_ROLLER_COASTER_SPLINE_POINT( -1671.7087, -1143.1173, 23.7443)
ADD_ROLLER_COASTER_SPLINE_POINT( -1673.1904, -1144.9082, 24.1589)
ADD_ROLLER_COASTER_SPLINE_POINT( -1674.9377, -1146.4446, 24.5706)
ADD_ROLLER_COASTER_SPLINE_POINT( -1676.9064, -1147.6877, 24.9723)
ADD_ROLLER_COASTER_SPLINE_POINT( -1679.0508, -1148.6053, 25.3575)
ADD_ROLLER_COASTER_SPLINE_POINT( -1681.3174, -1149.1740, 25.7202)
ADD_ROLLER_COASTER_SPLINE_POINT( -1683.6499, -1149.3767, 26.0545)
ADD_ROLLER_COASTER_SPLINE_POINT( -1685.9912, -1149.2075, 26.3554)
ADD_ROLLER_COASTER_SPLINE_POINT( -1688.2795, -1148.6644, 26.6179)
ADD_ROLLER_COASTER_SPLINE_POINT( -1690.4568, -1147.7628, 26.8390)
ADD_ROLLER_COASTER_SPLINE_POINT( -1692.4642, -1146.5227, 27.0161)
ADD_ROLLER_COASTER_SPLINE_POINT( -1694.2517, -1144.9762, 27.1481)
ADD_ROLLER_COASTER_SPLINE_POINT( -1695.7679, -1143.1614, 27.2346)
ADD_ROLLER_COASTER_SPLINE_POINT( -1696.9746, -1141.1267, 27.2771)
ADD_ROLLER_COASTER_SPLINE_POINT( -1697.8401, -1138.9249, 27.2778)
ADD_ROLLER_COASTER_SPLINE_POINT( -1698.3427, -1136.6143, 27.2402)
ADD_ROLLER_COASTER_SPLINE_POINT( -1698.4657, -1134.2546, 27.1688)
ADD_ROLLER_COASTER_SPLINE_POINT( -1698.2115, -1131.9075, 27.0692)
ADD_ROLLER_COASTER_SPLINE_POINT( -1697.5850, -1129.6331, 26.9473)
ADD_ROLLER_COASTER_SPLINE_POINT( -1696.6025, -1127.4823, 26.7859)
ADD_ROLLER_COASTER_SPLINE_POINT( -1695.2893, -1125.5192, 26.5684)
ADD_ROLLER_COASTER_SPLINE_POINT( -1693.6843, -1123.7948, 26.2981)
ADD_ROLLER_COASTER_SPLINE_POINT( -1691.8325, -1122.3545, 25.9974)
ADD_ROLLER_COASTER_SPLINE_POINT( -1689.7773, -1121.2262, 25.6751)
ADD_ROLLER_COASTER_SPLINE_POINT( -1687.7130, -1120.2112, 25.2977)
ADD_ROLLER_COASTER_SPLINE_POINT( -1685.6340, -1119.2595, 24.7922)
ADD_ROLLER_COASTER_SPLINE_POINT( -1683.5103, -1118.3479, 24.1724)
ADD_ROLLER_COASTER_SPLINE_POINT( -1681.3713, -1117.4534, 23.4526)
ADD_ROLLER_COASTER_SPLINE_POINT( -1679.2483, -1116.5497, 22.6476)
ADD_ROLLER_COASTER_SPLINE_POINT( -1677.1699, -1115.6144, 21.7713)
ADD_ROLLER_COASTER_SPLINE_POINT( -1675.1399, -1114.6670, 20.8298)
ADD_ROLLER_COASTER_SPLINE_POINT( -1673.2024, -1113.7692, 19.8983)
ADD_ROLLER_COASTER_SPLINE_POINT( -1671.3074, -1112.8669, 19.0396)
ADD_ROLLER_COASTER_SPLINE_POINT( -1669.3944, -1111.9049, 18.3093)
ADD_ROLLER_COASTER_SPLINE_POINT( -1667.4021, -1110.8213, 17.7619)
ADD_ROLLER_COASTER_SPLINE_POINT( -1665.3357, -1109.6078, 17.4552)
ADD_ROLLER_COASTER_SPLINE_POINT( -1663.5355, -1108.4518, 17.3517)
ADD_ROLLER_COASTER_SPLINE_POINT( -1661.6692, -1107.1594, 17.3564)
ADD_ROLLER_COASTER_SPLINE_POINT( -1659.7676, -1105.7582, 17.4696)
ADD_ROLLER_COASTER_SPLINE_POINT( -1657.8624, -1104.2756, 17.6914)
ADD_ROLLER_COASTER_SPLINE_POINT( -1655.9844, -1102.7385, 18.0218)
ADD_ROLLER_COASTER_SPLINE_POINT( -1654.1650, -1101.1741, 18.4604)
ADD_ROLLER_COASTER_SPLINE_POINT( -1652.4335, -1099.6101, 19.0069)
ADD_ROLLER_COASTER_SPLINE_POINT( -1650.7800, -1098.0374, 19.6917)
ADD_ROLLER_COASTER_SPLINE_POINT( -1649.1323, -1096.3979, 20.4530)
ADD_ROLLER_COASTER_SPLINE_POINT( -1647.4886, -1094.7059, 21.0879)
ADD_ROLLER_COASTER_SPLINE_POINT( -1645.8455, -1092.9713, 21.3809)
ADD_ROLLER_COASTER_SPLINE_POINT( -1644.2002, -1091.1968, 21.0723)
ADD_ROLLER_COASTER_SPLINE_POINT( -1642.6226, -1089.4341, 20.1230)
ADD_ROLLER_COASTER_SPLINE_POINT( -1641.1335, -1087.7332, 18.9288)
ADD_ROLLER_COASTER_SPLINE_POINT( -1639.7681, -1086.1489, 17.8822)
ADD_ROLLER_COASTER_SPLINE_POINT( -1638.4410, -1084.6035, 17.2995)
ADD_ROLLER_COASTER_SPLINE_POINT( -1636.9349, -1082.8141, 17.1529)
ADD_ROLLER_COASTER_SPLINE_POINT( -1635.3969, -1080.9722, 17.1524)
ADD_ROLLER_COASTER_SPLINE_POINT( -1633.8970, -1079.2336, 17.1531)
ADD_ROLLER_COASTER_SPLINE_POINT( -1632.3602, -1077.3932, 17.1529)
ADD_ROLLER_COASTER_SPLINE_POINT( -1631.0459, -1075.8159, 17.1529)
ADD_ROLLER_COASTER_SPLINE_POINT( -1629.5092, -1073.9755, 17.1526)
ADD_ROLLER_COASTER_SPLINE_POINT( -1628.1962, -1072.3995, 17.1529)
ADD_ROLLER_COASTER_SPLINE_POINT( -1626.8193, -1070.7322, 17.4133)
ADD_ROLLER_COASTER_SPLINE_POINT( -1625.4014, -1069.0214, 17.9281)
ADD_ROLLER_COASTER_SPLINE_POINT( -1623.9257, -1067.2517, 18.5038)
ADD_ROLLER_COASTER_SPLINE_POINT( -1622.4509, -1065.4816, 19.0797)
ADD_ROLLER_COASTER_SPLINE_POINT( -1620.9749, -1063.7124, 19.6554)
ADD_ROLLER_COASTER_SPLINE_POINT( -1619.4995, -1061.9426, 20.2312)
ADD_ROLLER_COASTER_SPLINE_POINT( -1618.0242, -1060.1727, 20.8071)
ADD_ROLLER_COASTER_SPLINE_POINT( -1616.4891, -1058.3323, 21.2475)
ADD_ROLLER_COASTER_SPLINE_POINT( -1614.9408, -1056.5389, 21.5640)
ADD_ROLLER_COASTER_SPLINE_POINT( -1613.1627, -1054.9889, 21.7555)
ADD_ROLLER_COASTER_SPLINE_POINT( -1611.1027, -1053.8331, 21.9471)
ADD_ROLLER_COASTER_SPLINE_POINT( -1608.8370, -1053.1915, 22.1368)
ADD_ROLLER_COASTER_SPLINE_POINT( -1606.4882, -1053.0118, 22.3259)
ADD_ROLLER_COASTER_SPLINE_POINT( -1604.1523, -1053.3499, 22.5146)
ADD_ROLLER_COASTER_SPLINE_POINT( -1601.9521, -1054.1923, 22.7019)
ADD_ROLLER_COASTER_SPLINE_POINT( -1599.9624, -1055.4534, 22.8885)
ADD_ROLLER_COASTER_SPLINE_POINT( -1598.3180, -1057.1431, 23.0742)
ADD_ROLLER_COASTER_SPLINE_POINT( -1597.0596, -1059.1360, 23.2587)
ADD_ROLLER_COASTER_SPLINE_POINT( -1596.2314, -1061.3428, 23.4426)
ADD_ROLLER_COASTER_SPLINE_POINT( -1595.9446, -1063.6799, 23.6253)
ADD_ROLLER_COASTER_SPLINE_POINT( -1596.1294, -1066.0291, 23.8069)
ADD_ROLLER_COASTER_SPLINE_POINT( -1596.8149, -1068.2800, 23.9876)
ADD_ROLLER_COASTER_SPLINE_POINT( -1597.9860, -1070.3235, 24.1670)
ADD_ROLLER_COASTER_SPLINE_POINT( -1599.5387, -1072.0948, 24.3456)
ADD_ROLLER_COASTER_SPLINE_POINT( -1601.4530, -1073.4615, 24.5229)
ADD_ROLLER_COASTER_SPLINE_POINT( -1603.6150, -1074.3973, 24.6991)
ADD_ROLLER_COASTER_SPLINE_POINT( -1605.9164, -1074.8805, 24.8739)
ADD_ROLLER_COASTER_SPLINE_POINT( -1608.2719, -1074.8021, 25.0476)
ADD_ROLLER_COASTER_SPLINE_POINT( -1610.5616, -1074.2589, 25.2202)
ADD_ROLLER_COASTER_SPLINE_POINT( -1612.6801, -1073.2433, 25.3914)
ADD_ROLLER_COASTER_SPLINE_POINT( -1614.5176, -1071.7698, 25.5611)
ADD_ROLLER_COASTER_SPLINE_POINT( -1616.0275, -1069.9612, 25.7295)
ADD_ROLLER_COASTER_SPLINE_POINT( -1617.0846, -1067.8661, 25.8962)
ADD_ROLLER_COASTER_SPLINE_POINT( -1617.6753, -1065.5863, 26.0615)
ADD_ROLLER_COASTER_SPLINE_POINT( -1617.8007, -1063.2428, 26.2248)
ADD_ROLLER_COASTER_SPLINE_POINT( -1617.3602, -1060.9271, 26.3871)
ADD_ROLLER_COASTER_SPLINE_POINT( -1616.4683, -1058.7489, 26.5474)
ADD_ROLLER_COASTER_SPLINE_POINT( -1615.1421, -1056.8156, 26.7056)
ADD_ROLLER_COASTER_SPLINE_POINT( -1613.4026, -1055.2264, 26.8622)
ADD_ROLLER_COASTER_SPLINE_POINT( -1611.3824, -1054.0143, 27.0169)
ADD_ROLLER_COASTER_SPLINE_POINT( -1609.1584, -1053.2924, 27.1687)
ADD_ROLLER_COASTER_SPLINE_POINT( -1606.8099, -1053.0631, 27.3184)
ADD_ROLLER_COASTER_SPLINE_POINT( -1604.4631, -1053.3021, 27.4662)
ADD_ROLLER_COASTER_SPLINE_POINT( -1602.2571, -1054.0916, 27.6101)
ADD_ROLLER_COASTER_SPLINE_POINT( -1600.2434, -1055.3115, 27.7515)
ADD_ROLLER_COASTER_SPLINE_POINT( -1598.5408, -1056.9186, 27.8892)
ADD_ROLLER_COASTER_SPLINE_POINT( -1597.2394, -1058.8844, 28.0238)
ADD_ROLLER_COASTER_SPLINE_POINT( -1596.3568, -1061.0701, 28.1540)
ADD_ROLLER_COASTER_SPLINE_POINT( -1595.9899, -1063.3827, 28.2781)
ADD_ROLLER_COASTER_SPLINE_POINT( -1596.1273, -1065.7351, 28.3966)
ADD_ROLLER_COASTER_SPLINE_POINT( -1596.7319, -1068.0179, 28.5072)
ADD_ROLLER_COASTER_SPLINE_POINT( -1597.8579, -1070.0784, 28.6005)
ADD_ROLLER_COASTER_SPLINE_POINT( -1599.3303, -1071.9681, 28.6213)
ADD_ROLLER_COASTER_SPLINE_POINT( -1600.8860, -1073.8184, 28.4356)
ADD_ROLLER_COASTER_SPLINE_POINT( -1602.4453, -1075.6714, 27.9888)
ADD_ROLLER_COASTER_SPLINE_POINT( -1604.0881, -1077.6168, 27.4895)
ADD_ROLLER_COASTER_SPLINE_POINT( -1605.4225, -1079.2003, 27.0316)
ADD_ROLLER_COASTER_SPLINE_POINT( -1606.9303, -1080.9944, 26.8780)
ADD_ROLLER_COASTER_SPLINE_POINT( -1608.3499, -1082.6810, 26.9447)
ADD_ROLLER_COASTER_SPLINE_POINT( -1609.3530, -1083.8743, 27.4738)
ADD_ROLLER_COASTER_SPLINE_POINT( -1611.1270, -1085.9802, 28.7125)
ADD_ROLLER_COASTER_SPLINE_POINT( -1612.7308, -1087.8850, 29.8581)
ADD_ROLLER_COASTER_SPLINE_POINT( -1614.0735, -1089.4801, 30.4043)
ADD_ROLLER_COASTER_SPLINE_POINT( -1614.8247, -1090.3718, 30.4459)
ADD_ROLLER_COASTER_SPLINE_POINT( -1615.6266, -1091.3273, 30.3721)
ADD_ROLLER_COASTER_SPLINE_POINT( -1616.6858, -1092.5889, 30.0253)
ADD_ROLLER_COASTER_SPLINE_POINT( -1617.4144, -1093.4617, 29.5944)
ADD_ROLLER_COASTER_SPLINE_POINT( -1618.7480, -1095.0547, 28.8046)
ADD_ROLLER_COASTER_SPLINE_POINT( -1620.6028, -1097.2742, 27.7044)
ADD_ROLLER_COASTER_SPLINE_POINT( -1622.8733, -1099.9885, 26.3576)
ADD_ROLLER_COASTER_SPLINE_POINT( -1624.0875, -1101.4403, 25.6371)
ADD_ROLLER_COASTER_SPLINE_POINT( -1625.3727, -1102.9783, 24.8741)
ADD_ROLLER_COASTER_SPLINE_POINT( -1626.7218, -1104.5914, 24.0733)
ADD_ROLLER_COASTER_SPLINE_POINT( -1628.1248, -1106.2698, 23.2405)
ADD_ROLLER_COASTER_SPLINE_POINT( -1629.5734, -1108.0032, 22.3803)
ADD_ROLLER_COASTER_SPLINE_POINT( -1631.0604, -1109.7802, 21.4979)
ADD_ROLLER_COASTER_SPLINE_POINT( -1632.5737, -1111.5923, 20.5988)
ADD_ROLLER_COASTER_SPLINE_POINT( -1634.1086, -1113.4274, 19.6878)
ADD_ROLLER_COASTER_SPLINE_POINT( -1635.6544, -1115.2764, 18.7701)
ADD_ROLLER_COASTER_SPLINE_POINT( -1636.9026, -1116.7670, 18.0427)
ADD_ROLLER_COASTER_SPLINE_POINT( -1638.1215, -1118.2239, 17.4692)
ADD_ROLLER_COASTER_SPLINE_POINT( -1639.5778, -1119.9695, 17.0890)
ADD_ROLLER_COASTER_SPLINE_POINT( -1641.2195, -1121.9272, 16.8752)
CPRINTLN(DEBUG_AMBIENT, "[ROLLERCOASTER]: Points Used", iSplinePointsUsed)
ENDPROC
PROC SETUP_RCOASTER_CAR(RCOASTER_CAR &rp, INT index, FLOAT t = 0.0)
INT i
/*
rp.iPointIndex[0] = index + 2
rp.iPointIndex[1] = index + 1
rp.iPointIndex[2] = index
rp.iPointIndex[3] = index - 1
*/
rp.iPointIndex[0] = index - 2
rp.iPointIndex[1] = index - 1
rp.iPointIndex[2] = index
rp.iPointIndex[3] = index + 1
// wrap these so that they don't go over spline index
REPEAT COUNT_OF(rp.iPointIndex) i
IF (rp.iPointIndex[i] < 0)
rp.iPointIndex[i] += iSplinePointsUsed
ENDIF
IF (rp.iPointIndex[i] >= iSplinePointsUsed)
rp.iPointIndex[i] -= iSplinePointsUsed
ENDIF
ENDREPEAT
// set t
rp.tIValue = t
rp.vPosition = CALCULATE_SPLINE_POINT(vSplinePoint[rp.iPointIndex[0]], vSplinePoint[rp.iPointIndex[1]], vSplinePoint[rp.iPointIndex[2]], vSplinePoint[rp.iPointIndex[3]], rp.tIValue)
rp.vPosition += vCarOffset
rp.mObjectID = CREATE_OBJECT_NO_OFFSET(dummyRCModel, rp.vPosition)
IF IS_ENTITY_OK(rp.mObjectID)
SET_ENTITY_COLLISION(rp.mObjectID, FALSE)
SET_ENTITY_VISIBLE(rp.mObjectID, FALSE)
FREEZE_ENTITY_POSITION(rp.mObjectID, TRUE)
ENDIF
ENDPROC
PROC UPDATE_RCOASTER_CAR(RCOASTER_CAR &rp)
FLOAT oldt = rp.tIValue
rp.tIValue += (tInterpolateRate * fSpeedFactor * fSpeedMultiple * TIMESTEP())
IF (rp.tIValue >= 1.0)
rp.tIValue -= 1.0
/*
rp.iPointIndex[0] = rp.iPointIndex[1]
rp.iPointIndex[1] = rp.iPointIndex[2]
rp.iPointIndex[2] = rp.iPointIndex[3]
rp.iPointIndex[3] --
IF (rp.iPointIndex[3] < 0)
rp.iPointIndex[3] += iSplinePointsUsed
ENDIF
*/
rp.iPointIndex[0] = rp.iPointIndex[1]
rp.iPointIndex[1] = rp.iPointIndex[2]
rp.iPointIndex[2] = rp.iPointIndex[3]
rp.iPointIndex[3] ++
IF (rp.iPointIndex[3] >= iSplinePointsUsed)
rp.iPointIndex[3] -= iSplinePointsUsed
ENDIF
IF rp.iPointIndex[3] % iPadRungSkip = 0
SET_CONTROL_SHAKE(PLAYER_CONTROL, iPadVibrateTime, iPadVibrateFreq)
ENDIF
ENDIF
rp.vPosition = CALCULATE_SPLINE_POINT(vSplinePoint[rp.iPointIndex[0]], vSplinePoint[rp.iPointIndex[1]], vSplinePoint[rp.iPointIndex[2]], vSplinePoint[rp.iPointIndex[3]], rp.tIValue)
rp.vPosition += vCarOffset
IF IS_ENTITY_OK(rp.mObjectID) AND (oldt <> rp.tIValue)
SET_ENTITY_COORDS_NO_OFFSET(rp.mObjectID, rp.vPosition)
ENDIF
rp.fPointIndex = TO_FLOAT(rp.iPointIndex[1]) + rp.tIValue
ENDPROC
/// PURPOSE:
/// Hides the Rollercoaster Props
PROC HIDE_ROLLERCOASTER_PROPS()
INT i
// 140.00 DEGRESS
rollerCarTurnOffProp[0] = GET_CLOSEST_OBJECT_OF_TYPE(<<-1643.5242, -1124.6805, 17.4326>>, 2.0, PROP_ROLLER_CAR_01)
rollerCarTurnOffProp[1] = GET_CLOSEST_OBJECT_OF_TYPE(<<-1645.1455, -1126.6127, 17.4326>>, 2.0, PROP_ROLLER_CAR_02)
rollerCarTurnOffProp[2] = GET_CLOSEST_OBJECT_OF_TYPE(<<-1646.7676, -1128.5453, 17.4326>>, 2.0, PROP_ROLLER_CAR_02)
rollerCarTurnOffProp[3] = GET_CLOSEST_OBJECT_OF_TYPE(<<-1648.3896, -1130.4784, 17.4326>>, 2.0, PROP_ROLLER_CAR_02)
REPEAT COUNT_OF(rollerCarTurnOffProp) i
//
IF DOES_ENTITY_EXIST(rollerCarTurnOffProp[i])
SET_ENTITY_AS_MISSION_ENTITY(rollerCarTurnOffProp[i])
SET_ENTITY_VISIBLE(rollerCarTurnOffProp[i], FALSE)
SET_ENTITY_COLLISION(rollerCarTurnOffProp[i], FALSE)
SET_ENTITY_INVINCIBLE(rollerCarTurnOffProp[i], TRUE)
ENDIF
//SAFE_RELEASE_OBJECT(rollerCarTurnOffProp[i])
ENDREPEAT
ENDPROC
/// PURPOSE:
/// Shows the Rollercoaster Props
PROC SHOW_ROLLERCOASTER_PROPS()
INT i
IF NOT IS_ENTITY_OK(rollerCarTurnOffProp[0])
rollerCarTurnOffProp[0] = CREATE_OBJECT(PROP_ROLLER_CAR_01, <<-1643.5242, -1124.6805, 17.4326>>)
ENDIF
IF NOT IS_ENTITY_OK(rollerCarTurnOffProp[1])
rollerCarTurnOffProp[1] = CREATE_OBJECT(PROP_ROLLER_CAR_02, <<-1645.1455, -1126.6127, 17.4326>>)
ENDIF
IF NOT IS_ENTITY_OK(rollerCarTurnOffProp[2])
rollerCarTurnOffProp[2] = CREATE_OBJECT(PROP_ROLLER_CAR_02, <<-1646.7676, -1128.5453, 17.4326>>)
ENDIF
IF NOT IS_ENTITY_OK(rollerCarTurnOffProp[3])
rollerCarTurnOffProp[3] = CREATE_OBJECT(PROP_ROLLER_CAR_02, <<-1648.3896, -1130.4784, 17.4326>>)
ENDIF
REPEAT COUNT_OF(rollerCarTurnOffProp) i
IF IS_ENTITY_OK(rollerCarTurnOffProp[i])
SET_ENTITY_HEADING(rollerCarTurnOffProp[i], 140.0)
SET_ENTITY_VISIBLE(rollerCarTurnOffProp[i], TRUE)
SET_ENTITY_COLLISION(rollerCarTurnOffProp[i], TRUE)
FREEZE_ENTITY_POSITION(rollerCarTurnOffProp[i], TRUE)
SET_ENTITY_INVINCIBLE(rollerCarTurnOffProp[i], TRUE)
SAFE_RELEASE_OBJECT(rollerCarTurnOffProp[i])
ENDIF
ENDREPEAT
ENDPROC
PROC CALCULATE_SPEED_FACTOR()
FLOAT fPointDiff
FLOAT fSpeedDiff
FLOAT t
INT is2 = iSpeedCounter + 1
/*
IF (is2 >= COUNT_OF(speedChange))
is2 -= COUNT_OF(speedChange)
ENDIF
*/
IF (iSpeedCounter >= COUNT_OF(speedChange))
iSpeedCounter = 0
EXIT
ENDIF
IF (is2 >= COUNT_OF(speedChange))
EXIT
ENDIF
IF (sourceCar.fPointIndex < speedChange[iSpeedCounter].iPointIndex)
EXIT
ENDIF
IF (sourceCar.fPointIndex >= speedChange[is2].iPointIndex)
iSpeedCounter = is2
CPRINTLN(DEBUG_AMBIENT, "SPEED CHANGE HIT:", iSpeedCounter)
/*
IF IS_ENTITY_OK(PLAYER_PED_ID())
// sound
SWITCH (speedChange[iSpeedCounter].sndCommand)
CASE RCSND_PLAYBIGSTOP
CPRINTLN(DEBUG_AMBIENT, " - SPEED CHANGE BIG STOP")
PLAY_SOUND_FROM_ENTITY(-1, "BIG_STOP", PLAYER_PED_ID(), "LEVIATHAN_SOUNDSET")
BREAK
CASE RCSND_PLAYBRAKES
CPRINTLN(DEBUG_AMBIENT, " - SPEED CHANGE BRAKES")
PLAY_SOUND_FROM_ENTITY(-1, "BREAKS", PLAYER_PED_ID(), "LEVIATHAN_SOUNDSET")
BREAK
CASE RCSND_PLAYCROWD
CPRINTLN(DEBUG_AMBIENT, " - SPEED CHANGE CROWD")
PLAY_SOUND_FROM_ENTITY(-1, "CROWD", PLAYER_PED_ID(), "LEVIATHAN_SOUNDSET")
BREAK
CASE RCSND_PLAYPULLOFF
CPRINTLN(DEBUG_AMBIENT, " - SPEED CHANGE PULL OFF")
PLAY_SOUND_FROM_ENTITY(-1, "PULL_OFF", PLAYER_PED_ID(), "LEVIATHAN_SOUNDSET")
BREAK
CASE RCSND_PLAYRATCHET
SAFE_STOP_AND_RELEASE_SOUND_ID(iRatchetSoundID)
CPRINTLN(DEBUG_AMBIENT, " - SPEED CHANGE RATCHET")
iRatchetSoundID = GET_SOUND_ID()
PLAY_SOUND_FROM_ENTITY(iRatchetSoundID, "PULL_OFF", PLAYER_PED_ID(), "LEVIATHAN_SOUNDSET")
BREAK
CASE RCSND_STOPRATCHET
CPRINTLN(DEBUG_AMBIENT, " - SPEED CHANGE RATCHET STOP")
SAFE_STOP_AND_RELEASE_SOUND_ID(iRatchetSoundID)
BREAK
ENDSWITCH
ENDIF
*/
EXIT
ENDIF
IF (is2 >= COUNT_OF(speedChange))
EXIT
ENDIF
IF (speedChange[iSpeedCounter].fNewFactor = speedChange[is2].fNewFactor)
fspeedFactor = speedChange[iSpeedCounter].fNewFactor
EXIT
ENDIF
fPointDiff = TO_FLOAT(ABSI(speedChange[iSpeedCounter + 1].iPointIndex - speedChange[iSpeedCounter].iPointIndex))
fSpeedDiff = (speedChange[is2].fNewFactor - speedChange[iSpeedCounter].fNewFactor)
t = 1.0 - ((TO_FLOAT(speedChange[is2].iPointIndex) - sourceCar.fPointIndex) / fPointDiff)
fSpeedFactor = speedChange[iSpeedCounter].fNewFactor + (t * fSpeedDiff)
IF (speedChange[iSpeedCounter].fNewFactor < speedChange[is2].fNewFactor)
fSpeedFactor = CLAMP(fSpeedFactor, speedChange[iSpeedCounter].fNewFactor, speedChange[is2].fNewFactor)
ELSE
fSpeedFactor = CLAMP(fSpeedFactor, speedChange[is2].fNewFactor, speedChange[iSpeedCounter].fNewFactor)
ENDIF
ENDPROC
//----------------------
// DEBUG VARIABLES
//----------------------
#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID m_WidgetGroup
BOOL bQuitScript = FALSE
#ENDIF
//----------------------
// DEBUG FUNCTIONS
//----------------------
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// Setups Debug Widgets
PROC SETUP_DEBUG_WIDGETS()
SET_PROFILING_OF_THIS_SCRIPT(TRUE)
m_WidgetGroup = START_WIDGET_GROUP("Fairground - Rollercoaster")
ADD_WIDGET_BOOL("Quit Script", bQuitScript)
ADD_WIDGET_BOOL("Infinite Ride", bInfiniteRide)
ADD_WIDGET_FLOAT_SLIDER("fSinShake", fSinShakeFactor, 0.0, 10.0, 0.0025)
ADD_WIDGET_FLOAT_SLIDER("Multiple", fSpeedMultiple, 0.0, 30.0, 0.0025)
ADD_WIDGET_FLOAT_SLIDER("Interpolate Rate", tInterpolateRate, 0.0, 100.0, 0.0025)
ADD_WIDGET_FLOAT_SLIDER("Speed Factor", fSpeedFactor, 0.0, 20.0, 0.0025)
ADD_WIDGET_INT_READ_ONLY("Current Point", sourceCar.iPointIndex[1])
ADD_WIDGET_FLOAT_READ_ONLY("Rail Float", sourceCar.fPointIndex)
ADD_WIDGET_VECTOR_SLIDER("Car Offset", vCarOffset, -10.0, 10.0, 0.25)
ADD_WIDGET_INT_READ_ONLY("Speed Counter", iSpeedCounter)
ADD_WIDGET_INT_SLIDER("Pad Shake Time", iPadVibrateTime, 0, 5000, 16)
ADD_WIDGET_INT_SLIDER("Pad Shake Freq", iPadVibrateFreq, 0, 256, 1)
ADD_WIDGET_INT_SLIDER("Pad Rung Skip", iPadRungSkip, 1, 64, 1)
ADD_WIDGET_BOOL("Show Debug Point", bShowDebugPoint)
ADD_WIDGET_INT_SLIDER("Debug Point", iDebugPoint, -1, COUNT_OF(vSplinePoint) - 1, 1)
ADD_WIDGET_BOOL("Show Debug Car", bShowDebugCar)
START_WIDGET_GROUP("FPS Camera")
ADD_WIDGET_INT_SLIDER("Look X Limit", fpsCam.iLookXLimit, -360, 360, 1)
ADD_WIDGET_INT_SLIDER("Look Y Limit", fpsCam.iLookYLimit, -360, 360, 1)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
ENDPROC
/// PURPOSE:
/// Removes Debug Widgets
PROC CLEANUP_DEBUG_WIDGETS()
IF DOES_WIDGET_GROUP_EXIST(m_WidgetGroup)
DELETE_WIDGET_GROUP(m_WidgetGroup)
ENDIF
ENDPROC
#ENDIF
//----------------------
// SCRIPT FUNCTIONS
//----------------------
/// PURPOSE:
/// Cleanups Script and terminates thread - this should be the last function called
PROC SCRIPT_CLEANUP(BOOL bNice = FALSE)
CPRINTLN(DEBUG_AMBIENT, "Rollercoaster Cleanup Nice:", bNice)
STOP_STREAM()
IF IS_AUDIO_SCENE_ACTIVE("FAIRGROUND_RIDES_LEVIATHAN")
STOP_AUDIO_SCENE("FAIRGROUND_RIDES_LEVIATHAN")
ENDIF
IF (bNice)
CLEAR_HELP()
CLEAR_BIT(g_iRepeatPlayBits, ENUM_TO_INT(RPB_FROZEN_ON_ROLLERCOASTER))
SAFE_FADE_SCREEN_OUT_TO_BLACK()
ENDIF
#IF IS_DEBUG_BUILD
CLEANUP_DEBUG_WIDGETS()
#ENDIF
REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL(CP_FAIRG)
CLEAR_FIRST_PERSON_CAMERA(fpsCam)
SAFE_STOP_AND_RELEASE_SOUND_ID(iRollerSoundID)
SAFE_STOP_AND_RELEASE_SOUND_ID(iRatchetSoundID)
IS_ENTITY_OK(PLAYER_PED_ID())
IF IS_ENTITY_ATTACHED(PLAYER_PED_ID())
DETACH_ENTITY(PLAYER_PED_ID())
ENDIF
SHOW_ROLLERCOASTER_PROPS()
SET_ENTITY_COORDS_GROUNDED(PLAYER_PED_ID(), <<-1631.3481, -1112.6509, 12.0206>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), 316.4640)
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
SET_ENTITY_COLLISION(PLAYER_PED_ID(), TRUE)
RC_END_CUTSCENE_MODE()
IF (bNice)
CLEAR_HELP()
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK)
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK)
WAIT(125)
ENDIF
DISABLE_CELLPHONE(FALSE)
REACTIVATE_NAMED_WORLD_BRAINS_WAITING_TILL_OUT_OF_RANGE("fairgroundHub")
IF (bNice)
SAFE_FADE_SCREEN_IN_FROM_BLACK(500, FALSE)
DEBIT_BANK_ACCOUNT(GET_CURRENT_PLAYER_PED_ENUM(), BAAC_UNLOGGED_SMALL_ACTION, COST_ROLLERCOASTER)
ENDIF
UNLOAD_REQUESTED_ASSETS(asRequester)
TERMINATE_THIS_THREAD()
ENDPROC
//----------------------
// UPDATE FUNCTIONS
//----------------------
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// Updates Debug Widgets and draw debug stuff
PROC UPDATE_DEBUG_WIDGETS()
INT i
INT n
VECTOR v
IF (bQuitScript)
SCRIPT_CLEANUP()
ENDIF
IF (iDebugPoint > iSplinePointsUsed - 1)
iDebugPoint = 0
ENDIF
IF (iDebugPoint < 0)
iDebugPoint = iSplinePointsUsed - 1
ENDIF
IF (bShowDebugPoint)
DRAW_DEBUG_SPHERE(vSplinePoint[iDebugPoint], 0.125, 255, 0, 0, 255)
DRAW_DEBUG_CIRCLE(vSplinePoint[iDebugPoint], 1, 255, 0, 0, 255)
DRAW_DEBUG_LINE(vSplinePoint[iDebugPoint] + <<0, 0, -5>>, vSplinePoint[iDebugPoint] - <<0, 0, -5>>, 255, 0, 0, 255)
ENDIF
IF (bShowDebugCar)
DRAW_DEBUG_SPHERE(GET_ENTITY_COORDS(targetCar.mObjectID), 0.125, 0, 255, 0, 255)
DRAW_DEBUG_SPHERE(GET_ENTITY_COORDS(sourceCar.mObjectID), 0.125, 255, 0, 0, 255)
DRAW_DEBUG_LINE_WITH_TWO_COLOURS(GET_ENTITY_COORDS(targetCar.mObjectID), GET_ENTITY_COORDS(sourceCar.mObjectID), 0, 255, 0, 255, 255, 0, 0, 255)
DRAW_DEBUG_LINE(GET_ENTITY_COORDS(sourceCar.mObjectID), GET_ENTITY_COORDS(sourceCar.mObjectID) + (GET_ENTITY_FORWARD_VECTOR(sourceCar.mObjectID) * 2.0))
ENDIF
IF (bReset)
SETUP_RCOASTER_CAR(sourceCar, 0)
SETUP_RCOASTER_CAR(targetCar, 1)
tInterpolateRate = 0
ENDIF
IF (bShowDebugPoint)
i = 0
REPEAT COUNT_OF(speedChange) i
n = speedChange[i].iPointIndex
IF (n >= 0) AND (n < iSplinePointsUsed)
v = vSplinePoint[n]
DRAW_DEBUG_SPHERE(v, 0.0625)
DRAW_DEBUG_LINE(v, v + <<0, 0, 4 * speedChange[i].fNewFactor>>)
ENDIF
ENDREPEAT
ENDIF
ENDPROC
#ENDIF
PROC UPDATE_ROLLERCOASTER_STATE()
SWITCH (rCoasterState)
CASE RCS_SPEEDUP
tInterpolateRate += (GET_FRAME_TIME() / 2.0)
IF (tInterpolateRate >= 5.0)
tInterpolateRate = 5.0
rCoasterState = RCS_ACTIVE
ENDIF
BREAK
CASE RCS_ACTIVE
IF (sourceCar.iPointIndex[1] = (NUM_POINTS - 10)) AND (bInfiniteRide = FALSE)
rCoasterState = RCS_SLOWDOWN
IF IS_ENTITY_OK(PLAYER_PED_ID())
PLAY_SOUND_FROM_ENTITY(-1, "BIG_STOP", PLAYER_PED_ID())
ENDIF
ENDIF
BREAK
CASE RCS_SLOWDOWN
tInterpolateRate -= (GET_FRAME_TIME())
IF (tInterpolateRate <= 0.0)
tInterpolateRate = 0.0
rCoasterState = RCS_STOPPED
ENDIF
BREAK
CASE RCS_STOPPED
WAIT(1500)
SCRIPT_CLEANUP(TRUE)
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Updates the Rollercoaster
PROC UPDATE_ROLLERCOASTER()
UPDATE_ROLLERCOASTER_STATE()
UPDATE_RCOASTER_CAR(targetCar)
UPDATE_RCOASTER_CAR(sourceCar)
SET_ENTITY_ROTATION_FACE_ENTITY(sourceCar.mObjectID, targetCar.mObjectID)
ENDPROC
//----------------------
// MAIN SCRIPT
//----------------------
SCRIPT
INT i
VECTOR v
VECTOR v1, v2
FLOAT pitch, yaw
INT iCameraTimer
FLOAT fSinShake, fSinShakeYaw
CPRINTLN(DEBUG_AMBIENT, "[ROLLERCOASTER] - ROLLERCOASTER SETUP - 107")
IF HAS_FORCE_CLEANUP_OCCURRED(FORCE_CLEANUP_FLAG_DEBUG_MENU|FORCE_CLEANUP_FLAG_SP_TO_MP|FORCE_CLEANUP_FLAG_REPEAT_PLAY)
SCRIPT_CLEANUP()
ENDIF
WAIT(0)
RC_START_CUTSCENE_MODE(<<0, 0, 0>>, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE)
SET_BIT(g_iRepeatPlayBits, ENUM_TO_INT(RPB_FROZEN_ON_ROLLERCOASTER))
IF NOT DOES_CAM_EXIST(initialCamera)
initialCamera = CREATE_CAM_WITH_PARAMS("DEFAULT_SCRIPTED_CAMERA", <<-1652.2273, -1120.9301, 22.4479>>, <<9.2388, -0.0000, -131.6249>>, 50.1098, TRUE)
SET_CAM_PARAMS(initialCamera, <<-1652.2273, -1120.9301, 22.4479>>, <<9.2388, -0.0000, -131.6249>>, 50.1098)
SET_CAM_ACTIVE(initialCamera, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
CPRINTLN(DEBUG_AMBIENT, "[ROLLERCOASTER] - SETUP CAMERA")
ENDIF
IF IS_ENTITY_OK(PLAYER_PED_ID())
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID())
CPRINTLN(DEBUG_AMBIENT, "[ROLLERCOASTER] - FORCE PEDS OFF VEHICLE")
ENDIF
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), FALSE)
CLEAR_AREA_OF_PROJECTILES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 60.0)
STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 60.0)
ENDIF
CPRINTLN(DEBUG_AMBIENT, "[ROLLERCOASTER] - ASSET LOAD START")
ADD_ASSET_REQUEST_FOR_MODEL(asRequester, 0, dummyRCModel)
ADD_ASSET_REQUEST_FOR_MODEL(asRequester, 1, PROP_ROLLER_CAR_01)
ADD_ASSET_REQUEST_FOR_MODEL(asRequester, 2, PROP_ROLLER_CAR_02)
//ADD_ASSET_REQUEST_FROM_STRING(asRequester, 3, ASSET_AUDIOBANK, "SCRIPT\\FAIRGROUND_LEVIATHAN_01")
//ADD_ASSET_REQUEST_FROM_STRING(asRequester, 4, ASSET_AUDIOBANK, "SCRIPT\\FAIRGROUND_LEVIATHAN_02")
//ADD_ASSET_REQUEST_FROM_STRING(asRequester, 5, ASSET_AUDIOBANK, "SCRIPT\\FAIRGROUND_LEVIATHAN_03")
WHILE NOT LOAD_STREAM("LEVIATHON_RIDE_MASTER")
RC_DISABLE_CONTROL_ACTIONS_FOR_LEAD_IN()
IS_ENTITY_OK(PLAYER_PED_ID())
WAIT(0)
ENDWHILE
PLAY_STREAM_FRONTEND()
IF DOES_CAM_EXIST(initialCamera)
SET_CAM_PARAMS(initialCamera, <<-1651.5007, -1118.3954, 23.5181>>, <<3.4350, -0.0000, -152.2412>>, 50.1098, 5000)
iCameraTimer = GET_GAME_TIMER() + 5000
CPRINTLN(DEBUG_AMBIENT, "[ROLLERCOASTER] - START PAN")
ENDIF
WHILE NOT HAVE_ASSET_REQUESTS_LOADED(asRequester)
AND NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
RC_DISABLE_CONTROL_ACTIONS_FOR_LEAD_IN()
IS_ENTITY_OK(PLAYER_PED_ID())
WAIT(0)
ENDWHILE
IF IS_ENTITY_OK(GET_PLAYERS_LAST_VEHICLE())
CPRINTLN(DEBUG_AMBIENT, "[ROLLERCOASTER] - RESOLVE VEHICLE")
IF IS_ENTITY_SMALLER_THAN_MODEL(GET_PLAYERS_LAST_VEHICLE(), BAGGER)
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA( <<-1633.429810,-1111.998413,11.022523>>, <<-1661.270386,-1142.659790,25.517223>>, 12.000000, <<-1630.9520, -1107.5804, 12.0215>>, 51.9704)
ELIF IS_ENTITY_SMALLER_THAN_MODEL(GET_PLAYERS_LAST_VEHICLE(), SANDKING)
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA( <<-1633.429810,-1111.998413,11.022523>>, <<-1661.270386,-1142.659790,25.517223>>, 12.000000, <<-1636.3438, -1106.2410, 12.0261>>, 52.3427)
ENDIF
ENDIF
fSpeedFactor = 0.5
ADD_SPEED_CHANGE(1, 0.5, RCSND_PLAYPULLOFF)
ADD_SPEED_CHANGE(2, 0.5, RCSND_PLAYRATCHET)
ADD_SPEED_CHANGE(13, 0.5, RCSND_NULL)
ADD_SPEED_CHANGE(14, 0.3, RCSND_NULL)
ADD_SPEED_CHANGE(15, 0.2, RCSND_NULL)
ADD_SPEED_CHANGE(16, 0.1, RCSND_NULL)
ADD_SPEED_CHANGE(17, 0.05, RCSND_STOPRATCHET)
ADD_SPEED_CHANGE(18, 0.05, RCSND_NULL)
ADD_SPEED_CHANGE(19, 1.0, RCSND_PLAYPULLOFF)
ADD_SPEED_CHANGE(20, 1.0, RCSND_PLAYCROWD)
//ADD_SPEED_CHANGE(24, 1.0, RCSND_PLAYCROWD)
ADD_SPEED_CHANGE(31, 1.0, RCSND_PLAYPULLOFF)
ADD_SPEED_CHANGE(34, 1.0, RCSND_PLAYCROWD)
ADD_SPEED_CHANGE(45, 1.0, RCSND_PLAYCROWD)
ADD_SPEED_CHANGE(60, 1.0, RCSND_PLAYCROWD)
ADD_SPEED_CHANGE(69, 1.0, RCSND_PLAYCROWD)
ADD_SPEED_CHANGE(81, 1.0, RCSND_PLAYBIGSTOP)
ADD_SPEED_CHANGE(84, 0.75, RCSND_PLAYBRAKES)
ADD_SPEED_CHANGE(90, 0.75, RCSND_PLAYRATCHET)
ADD_SPEED_CHANGE(94, 0.75, RCSND_STOPRATCHET)
ADD_SPEED_CHANGE(95, 1.0, RCSND_PLAYPULLOFF)
ADD_SPEED_CHANGE(97, 1.0, RCSND_PLAYCROWD)
ADD_SPEED_CHANGE(118, 1.0, RCSND_PLAYCROWD)
ADD_SPEED_CHANGE(130, 1.0, RCSND_PLAYCROWD)
ADD_SPEED_CHANGE(155, 1.0, RCSND_PLAYCROWD)
ADD_SPEED_CHANGE(172, 1.0, RCSND_PLAYCROWD)
ADD_SPEED_CHANGE(184, 1.0, RCSND_PLAYCROWD)
ADD_SPEED_CHANGE(197, 1.0, RCSND_PLAYCROWD)
ADD_SPEED_CHANGE(216, 1.0, RCSND_PLAYCROWD)
ADD_SPEED_CHANGE(222, 1.0, RCSND_PLAYBIGSTOP)
ADD_SPEED_CHANGE(232, 0.01, RCSND_NULL)
DUMMY_REFERENCE_INT(iSpeedCounter)
SETUP_ROLLER_COASTER_POINTS()
HIDE_ROLLERCOASTER_PROPS()
#IF IS_DEBUG_BUILD
SETUP_DEBUG_WIDGETS()
#ENDIF
CPRINTLN(DEBUG_AMBIENT, "SETTING UP SOURCE CAR")
SETUP_RCOASTER_CAR(sourceCar, 1)
WAIT(0)
CPRINTLN(DEBUG_AMBIENT, "SETTING UP TARGET CAR")
SETUP_RCOASTER_CAR(targetCar, 2)
sourceCar.bIsSourceCar = TRUE
DISABLE_CELLPHONE(TRUE)
WAIT(0)
// attach player to camera
UPDATE_ROLLERCOASTER()
IF IS_ENTITY_OK(PLAYER_PED_ID()) AND IS_ENTITY_OK(sourceCar.mObjectID)
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-1648.4, -1127.6, 18.3>>)
ATTACH_ENTITY_TO_ENTITY(PLAYER_PED_ID(), sourceCar.mObjectID, 0, <<0, 0, 0>>, <<0, 0, 0>>)
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), FALSE)
ENDIF
WHILE (GET_GAME_TIMER() < iCameraTimer)
WAIT(0)
ENDWHILE
IF DOES_CAM_EXIST(initialCamera)
SET_CAM_ACTIVE(initialCamera, FALSE)
DESTROY_CAM(initialCamera)
ENDIF
// set up camera
IF IS_ENTITY_OK(PLAYER_PED_ID())
fpsCam.iLookXLimit = 60
fpsCam.iLookYLimit = 20
v = GET_PED_BONE_COORDS(PLAYER_PED_ID(), BONETAG_HEAD, <<0, -0.25, 0>>)
INIT_FIRST_PERSON_CAMERA(fpsCam, v, GET_ENTITY_ROTATION(sourceCar.mObjectID), 50.0, fpsCam.iLookXLimit, fpsCam.iLookYLimit)
ATTACH_CAM_TO_ENTITY(fpsCam.theCam, PLAYER_PED_ID(), <<0, 0, 0.5>>)
ENDIF
// update camera once
WAIT(0)
IF IS_ENTITY_OK(PLAYER_PED_ID()) AND IS_ENTITY_OK(targetCar.mObjectID)
GET_PITCH_AND_HEADING_FROM_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(targetCar.mObjectID), pitch, yaw)
UPDATE_FIRST_PERSON_CAMERA(fpsCam)
SET_CAM_ROT(fpsCam.theCam, <<pitch, 0, yaw>> + fpsCam.vCamRotOffsetCurrent)
ENDIF
START_AUDIO_SCENE("FAIRGROUND_RIDES_LEVIATHAN")
iNextSpeechTime = GET_GAME_TIMER() + 5000
/*
iRollerSoundID = GET_SOUND_ID()
IF IS_ENTITY_OK(PLAYER_PED_ID())
PLAY_SOUND_FROM_ENTITY(iRollerSoundID, "MAIN", PLAYER_PED_ID(), "LEVIATHAN_SOUNDSET")
ENDIF
*/
PRINT_HELP("FGND_SKIPRIDE")
SET_CONTROL_SHAKE(PLAYER_CONTROL, 1000, 255)
WHILE (TRUE)
#IF IS_DEBUG_BUILD
UPDATE_DEBUG_WIDGETS()
#ENDIF
CALCULATE_SPEED_FACTOR()
UPDATE_ROLLERCOASTER()
i = sourceCar.iPointIndex[1]
v1 = NORMALISE_VECTOR(GET_SPLINE_POINT(i + 1) - GET_SPLINE_POINT(i))
v2 = NORMALISE_VECTOR(GET_SPLINE_POINT(i + 4) - GET_SPLINE_POINT(i))
fSinShakeYaw = 1.0 - (DOT_PRODUCT(v2, v1))
fSinShake = SIN( ((sourceCar.fPointIndex) - FLOOR(sourceCar.fPointIndex)) * 360.0) * fSinShakeFactor
IF IS_ENTITY_OK(PLAYER_PED_ID()) AND IS_ENTITY_OK(targetCar.mObjectID)
GET_PITCH_AND_HEADING_FROM_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(targetCar.mObjectID), pitch, yaw)
UPDATE_FIRST_PERSON_CAMERA(fpsCam)
SET_CAM_ROT(fpsCam.theCam, <<pitch + fSinShake, 0, yaw + (fSinShake * (fSinShakeYaw * 2.0))>> + fpsCam.vCamRotOffsetCurrent)
ENDIF
RC_DISABLE_CONTROL_ACTIONS_FOR_LEAD_IN()
DISABLE_SELECTOR_THIS_FRAME()
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ENDIF
// Play audio comment every 8-13 seconds. Plays excited comment if speed > 0.5
IF GET_GAME_TIMER() > iNextSpeechTime //IF (GET_RANDOM_INT_IN_RANGE(0, 10) = 0)
IF fSpeedFactor > 0.01
IF fSpeedFactor > 0.5 //IF GET_RANDOM_BOOL()
PLAY_PED_AMBIENT_SPEECH_NATIVE(PLAYER_PED_ID(), "ROLLERCOASTER_CHAT_EXCITED", "SPEECH_PARAMS_FORCE_FRONTEND")
CPRINTLN(DEBUG_AMBIENT, "[ROLLERCOSTER]: PLAY EXCITED CHAT")
ELSE
PLAY_PED_AMBIENT_SPEECH_NATIVE(PLAYER_PED_ID(), "ROLLERCOASTER_CHAT_NORMAL", "SPEECH_PARAMS_FORCE_FRONTEND")
CPRINTLN(DEBUG_AMBIENT, "[ROLLERCOSTER]: PLAY NORMAL CHAT")
ENDIF
iNextSpeechTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(8000, 13000)
ENDIF
ENDIF
// handle quitting
IF (bSkipped = FALSE)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SKIP_CUTSCENE)
OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CONTEXT)
SAFE_FADE_SCREEN_OUT_TO_BLACK(500, FALSE)
bSkipped = TRUE
ENDIF
ELIF IS_SCREEN_FADED_OUT()
SCRIPT_CLEANUP(TRUE)
ELIF NOT IS_SCREEN_FADING_OUT()
bSkipped = FALSE
ENDIF
WAIT(0)
ENDWHILE
ENDSCRIPT