Files
2025-09-29 00:52:08 +02:00

1688 lines
67 KiB
Scheme
Executable File

// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
//
// SCRIPT NAME : TRI_Triathlon_Cutscenes.sch
// AUTHOR : Carlos Mijares (CM)
// DESCRIPTION : Functions and procedures that handle cutscenes in every
// Triathlon race.
//
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
// ===================================
// FILE INCLUDES
// ===================================
USING "TRI_Head.sch"
USING "tri_helpers.sch"
// ===================================
// E N D FILE INCLUDES
// ===================================
// =====================================
// TRIATHLON CUTSCENE VARIABLES
// =====================================
CAMERA_INDEX camScene_End
CAMERA_INDEX camIntroSkyview_Start
CAMERA_INDEX camIntroSkyview_End
CAMERA_INDEX camIntroWater_Start
CAMERA_INDEX camIntroWater_End
CAMERA_INDEX camIntroRacer_Start
CAMERA_INDEX camIntroRacer_End
CAMERA_INDEX camIntroIECam
CAMERA_INDEX camIntroCatchupCam1, camIntroCatchupCam2
VECTOR vIntensityPosStart
VECTOR vIntensityPosEnd
VECTOR vIntensityRotStart
VECTOR vIntensityRotEnd
VECTOR vEnergyPosStart
VECTOR vEnergyPosEnd
VECTOR vEnergyRotStart
VECTOR vEnergyRotEnd
INT iChatterCount = 0
FLOAT fDelay = GET_RANDOM_FLOAT_IN_RANGE(7.0, 9.0)
FLOAT fCheeerDelay = GET_RANDOM_FLOAT_IN_RANGE(1.0, 3.0)
PED_INDEX pedChattering
structTimer timerCutsceneCamera
structTimer diagTimer
structTimer cheerTimer
ENUM TRI_CUTSCENE_STAGE
TRI_CUTSCENE_STAGE_SETUP, //0
TRI_CUTSCENE_STAGE_SIGN_IN,
TRI_CUTSCENE_STAGE_SIGN_IN_WAIT,
TRI_CUTSCENE_STAGE_HELI_CREATE,
TRI_CUTSCENE_STAGE_HELI_WAIT,
TRI_CUTSCENE_STAGE_HELI_HOVER,
TRI_CUTSCENE_STAGE_SKYVIEW,
TRI_CUTSCENE_STAGE_SKYVIEW_HELP,
TRI_CUTSCENE_STAGE_SKYVIEW_WAIT,
TRI_CUTSCENE_STAGE_WATER,
TRI_CUTSCENE_STAGE_WATER_WAIT,
TRI_CUTSCENE_STAGE_WATER_WAIT_HELI,
TRI_CUTSCENE_STAGE_BIKE,
TRI_CUTSCENE_STAGE_BIKE_WAIT,
TRI_CUTSCENE_STAGE_FINISH_LINE,
TRI_CUTSCENE_STAGE_FINISH_LINE_WAIT,
TRI_CUTSCENE_STAGE_RACER,
TRI_CUTSCENE_STAGE_RACER_WAIT,
TRI_CUTSCENE_STAGE_INTENSITY,
TRI_CUTSCENE_STAGE_INTENSITY_WAIT,
TRI_CUTSCENE_STAGE_ENERGY,
TRI_CUTSCENE_STAGE_ENERGY_WAIT,
TRI_CUTSCENE_STAGE_HP_LOSS,
TRI_CUTSCENE_STAGE_HP_LOSS_WAIT,
TRI_CUTSCENE_STAGE_GAME_CAM,
TRI_CUTSCENE_STAGE_GAME_CAM_WAIT,
TRI_CUTSCENE_STAGE_CLEANUP
ENDENUM
STRUCT TRI_OUTRO_SCENE_DATA
TEXT_LABEL_31 texOutroDict
INT iOutroSceneID
OBJECT_INDEX oBottle
ENDSTRUCT
TRI_OUTRO_SCENE_DATA sOutroSceneData
TRI_CUTSCENE_STAGE eCurrentCutsceneStage = TRI_CUTSCENE_STAGE_SETUP
// =====================================
// E N D TRIATHLON CUTSCENE VARIABLES
// =====================================
// ====================================================
// TRIATHLON CUTSCENE FUNCTIONS AND PROCEDURES
// ====================================================
PROC TRI_PLAY_CAM_SNAP_DOWN_FROM_BOARD(TRIATHLON_RACE_INDEX &eTriRace)
INT iDuration = 600
VECTOR vCamPos, vCamRot
SET_CAM_ACTIVE(camIntroIECam, TRUE)
enumCharacterList ePed = GET_CURRENT_PLAYER_PED_ENUM()
// Pick where we're setting the cam to now.
IF (eTriRace = TRIATHLON_RACE_VESPUCCI)
IF (ePed = CHAR_FRANKLIN)
vCamPos = <<-1340.1471, -1015.2643, 23.0>>
vCamRot = <<80.0, 0.0, -160.0018>>
ELIF (ePed = CHAR_MICHAEL)
vCamPos = <<-1341.5535, -1016.5138, 23.0>>
vCamRot = <<80.0, 0.0, -66.7842>>
ELIF (ePed = CHAR_TREVOR)
vCamPos = <<-1340.8750, -1015.0278, 23.0>>
vCamRot = <<80.0, 0.0854, -133.9209>>
ENDIF
ELIF (eTriRace = TRIATHLON_RACE_ALAMO_SEA)
IF (ePed = CHAR_FRANKLIN)
vCamPos = <<1760.1621, 3904.5063, 50.0>>
vCamRot = <<80.0, 0.0, -121.7289>>
ELIF (ePed = CHAR_MICHAEL)
vCamPos = <<1761.2694, 3901.9807, 50.0>>
vCamRot = <<80.0, 0.0, -28.4583>>
ELIF (ePed = CHAR_TREVOR)
vCamPos = <<1760.7273, 3903.4209, 50.0>>
vCamRot = <<80.0, 0.1610, -95.6354>>
ENDIF
ELSE
IF (ePed = CHAR_FRANKLIN)
vCamPos = <<-2279.9561, 414.1333, 190.0>>
vCamRot = <<80.0, 0.0, 164.7893>>
ELIF (ePed = CHAR_MICHAEL)
vCamPos = <<-2282.2585, 412.3413, 190.0>>
vCamRot = <<80.0, 0.0, -101.9460>>
ELIF (ePed = CHAR_TREVOR)
vCamPos = <<-2280.8669, 413.3051, 190.0>>
vCamRot = <<80.0, 0.1686, -175.5375>>
ENDIF
ENDIF
SET_CAM_COORD(camIntroIECam, vCamPos)
SET_CAM_ROT(camIntroIECam, vCamRot)
TRIGGER_SCREENBLUR_FADE_OUT(TO_FLOAT(iDuration))
RENDER_SCRIPT_CAMS(TRUE, FALSE)
CPRINTLN(DEBUG_TRIATHLON, "TRI_PLAY_CAM_SNAP_DOWN_FROM_BOARD :: vCamPos=", vCamPos, ", vCamRot=", vCamRot)
ENDPROC
PROC PLAY_TRI_CAM_SNAP_UPWARD_AFTER_OUTRO()
INT iDuration = 700
// Put the camera we're going to interp to where the cam is now.
VECTOR vCamPos, vCamRot
IF DOES_CAM_EXIST(camScene_End)
vCamPos = GET_CAM_COORD(camScene_End)
vCamRot = GET_CAM_ROT(camScene_End)
ENDIF
camIntroIECam = CREATE_CAMERA()
SET_CAM_COORD(camIntroIECam, vCamPos)
SET_CAM_ROT(camIntroIECam, vCamRot)
SET_CAM_FOV(camIntroIECam, 30.0)
SET_CAM_ACTIVE(camIntroIECam, TRUE)
// Destroy the cam after, to prevent pops.
IF DOES_CAM_EXIST(camScene_End)
DESTROY_CAM(camScene_End)
ENDIF
// Move cam up, and rotate it up.
VECTOR vEndPos, vEndRot
vEndPos = vCamPos + <<0,0,20.0>>
vEndRot = vCamRot + <<70.0,0,0>>
SET_CAM_PARAMS(camIntroIECam, vEndPos, vEndRot, 30, iDuration)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
TRIGGER_SCREENBLUR_FADE_IN(TO_FLOAT(iDuration))
PLAY_SOUND_FRONTEND(-1, "QUIT_WHOOSH", "HUD_MINI_GAME_SOUNDSET")
CPRINTLN(DEBUG_TRIATHLON, "PLAY_TRI_CAM_SNAP_UPWARD_AFTER_OUTRO :: vCamPos=", vCamPos, ", vCamRot=", vCamRot)
ENDPROC
FUNC FLOAT TRI_GET_RACER_FINISH_TELEPORT_HEADING(TRIATHLON_RACE_INDEX eTriRace, INT iRacer)
FLOAT fRetVal
SWITCH eTriRace
CASE TRIATHLON_RACE_VESPUCCI
SWITCH iRacer
CASE 1
fRetVal = 214.1666
BREAK
CASE 2
fRetVal = 136.9917
BREAK
ENDSWITCH
BREAK
CASE TRIATHLON_RACE_ALAMO_SEA
SWITCH iRacer
CASE 1
fRetVal = 20.6779
BREAK
CASE 2
fRetVal = 335.9650
BREAK
ENDSWITCH
BREAK
CASE TRIATHLON_RACE_IRONMAN
SWITCH iRacer
CASE 1
fRetVal = 192.4683
BREAK
CASE 2
fRetVal = 190.4380
BREAK
ENDSWITCH
BREAK
ENDSWITCH
RETURN fRetVal
ENDFUNC
FUNC VECTOR TRI_GET_RACER_FINISH_TELEPORT_POS(TRIATHLON_RACE_INDEX eTriRace, INT iRacer)
VECTOR vRetVal = <<0,0,0>>
SWITCH eTriRace
CASE TRIATHLON_RACE_VESPUCCI
SWITCH iRacer
CASE 1
vRetVal = <<-1333.5430, -1034.3549, 6.6195>>
BREAK
CASE 2
vRetVal = <<-1328.6180, -1045.0208, 6.5493>>
BREAK
ENDSWITCH
BREAK
CASE TRIATHLON_RACE_ALAMO_SEA
SWITCH iRacer
CASE 1
vRetVal = <<1755.5608, 3891.0405, 33.7649>>
BREAK
CASE 2
vRetVal = <<1759.7052, 3889.2129, 33.7466>>
BREAK
ENDSWITCH
BREAK
CASE TRIATHLON_RACE_IRONMAN
SWITCH iRacer
CASE 1
vRetVal = <<-2299.4753, 465.9030, 173.4305>>
BREAK
CASE 2
vRetVal = <<-2300.4429, 462.9010, 173.4523>>
BREAK
ENDSWITCH
BREAK
ENDSWITCH
RETURN vRetVal
ENDFUNC
PROC TRI_CLEAR_RACERS_FROM_OUTRO_CUTSCENE(TRI_RACE_STRUCT &thisRace, TRIATHLON_RACE_INDEX &eTriRace)
VECTOR vScenePos
IF eTriRace = TRIATHLON_RACE_VESPUCCI
vScenePos = <<-1329.3944, -1051.3582, 6.5187>>
ELIF eTriRace = TRIATHLON_RACE_ALAMO_SEA
vScenePos = <<1757.5648, 3897.9070, 33.8581>>
ELSE
vScenePos = <<-2306.3442, 454.1608, 173.4667>>
ENDIF
VECTOR vMoveDirection = vScenePos - GET_ENTITY_COORDS( PLAYER_PED_ID(), FALSE )
FLOAT fMagnitude = VMAG( vMoveDirection )
#IF IS_DEBUG_BUILD
DEBUG_RECORD_ENTITY_FLOAT( thisRace.Racer[0].Driver, "fMagnitude", fMagnitude )
#ENDIF
INT i=1
VECTOR vRacerPos
FLOAT fDistance
FOR i = 1 TO 7
vRacerPos = GET_ENTITY_COORDS( thisRace.Racer[i].Driver, FALSE )
fDistance = VDIST( vRacerPos, vScenePos )
#IF IS_DEBUG_BUILD
DEBUG_RECORD_ENTITY_FLOAT( thisRace.Racer[i].Driver, "vDistance", fDistance )
#ENDIF
IF fDistance < fMagnitude
CPRINTLN( DEBUG_TRIATHLON, "moving racer[", i, "], too close to the outro scene position." )
SET_ENTITY_COORDS( thisRace.Racer[i].Driver, vScenePos + vMoveDirection, FALSE, TRUE )
ENDIF
ENDFOR
#IF IS_DEBUG_BUILD
DEBUG_RECORD_LINE( "vMoveDirection", vScenePos, vScenePos + vMoveDirection, (<<255,0,0>>), (<<0,0,255>>) )
#ENDIF
ENDPROC
/// PURPOSE:
///
/// PARAMS:
/// thisTOSData -
/// thisRace -
/// eTriRace -
/// bWonRace -
/// uses camIntroIECam camera index.
PROC PLAY_TRI_OUTRO_SYNC_SCENE_WINLOSS(TRI_OUTRO_SCENE_DATA &thisTOSData, TRI_RACE_STRUCT &thisRace, TRIATHLON_RACE_INDEX &eTriRace, BOOL bWonRace)
FLOAT fHeading
VECTOR vScenePos
IF eTriRace = TRIATHLON_RACE_VESPUCCI
fHeading = 201.6718
vScenePos = <<-1332.92249, -1043.14160, 6.65>>
ELIF eTriRace = TRIATHLON_RACE_ALAMO_SEA
fHeading = 25.4602
vScenePos = <<1759.43518, 3894.69409, 33.789>>
ELSE
fHeading = 167.8617
vScenePos = <<-2304.44312, 462.66916, 173.4493>>
ENDIF
enumCharacterList ePed = GET_CURRENT_PLAYER_PED_ENUM()
STRING sPlayer
IF (ePed = CHAR_MICHAEL)
sPlayer = "michael"
fHeading -= 180.0 // Michael's anims are backwards.
ELIF (ePed = CHAR_FRANKLIN)
sPlayer = "franklin"
fHeading -= 180.0 // Franklin's anims are backwards.
ELIF (ePed = CHAR_TREVOR)
sPlayer = "trevor"
fHeading -= 180.0 // Trevor's anims are backwards.
ENDIF
thisTOSData.iOutroSceneID = CREATE_SYNCHRONIZED_SCENE(vScenePos, (<<0,0,fHeading>>))
TEXT_LABEL_31 texAnim = PICK_STRING(bWonRace, "win", "lose")
texAnim += "_race_"
texAnim += sPlayer
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
CLEAR_PED_TASKS_IMMEDIATELY(thisRace.Racer[0].Driver)
CLEAR_PED_PROP(thisRace.Racer[0].Driver, ANCHOR_EYES)
CLEAR_PED_PROP(thisRace.Racer[0].Driver, ANCHOR_HEAD)
CLEAR_AREA_OF_PEDS(vScenePos, 3.0)
DISABLE_NAVMESH_IN_AREA(<< vScenePos.x - 3.0, vScenePos.y - 3.0, vScenePos.z - 3.0 >>, << vScenePos.x + 3.0, vScenePos.y + 3.0, vScenePos.z + 3.0 >>, TRUE)
TASK_SYNCHRONIZED_SCENE(thisRace.Racer[0].Driver, thisTOSData.iOutroSceneID, thisTOSData.texOutroDict, texAnim, INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
CPRINTLN(DEBUG_TRIATHLON, "PLAY_TRI_OUTRO_SYNC_SCENE_WINLOSS, thisTOSData.iOutroSceneID=", thisTOSData.iOutroSceneID, ", thisTOSData.texOutroDict=", thisTOSData.texOutroDict, ", texAnim=", texAnim)
texAnim += "_cam"
IF DOES_CAM_EXIST(camScene_End)
DESTROY_CAM(camScene_End)
ENDIF
camScene_End = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", FALSE)
SET_CAM_ACTIVE(camScene_End, TRUE)
PLAY_SYNCHRONIZED_CAM_ANIM(camScene_End, thisTOSData.iOutroSceneID, texAnim, thisTOSData.texOutroDict)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
TRI_CLEAR_RACERS_FROM_OUTRO_CUTSCENE( thisRace, eTriRace )
//SET_CAM_ACTIVE_WITH_INTERP(camScene_End, camIntroIECam, 600)
INT iFinishedCount = TRI_GET_NUM_RACERS_FINISHED(thisRace)
INT iIndex, iRacerNum
iRacerNum = 1
CPRINTLN( DEBUG_TRIATHLON, "Finished count is ", iFinishedCount )
IF iFinishedCount >= 4
CPRINTLN( DEBUG_TRIATHLON, "4 racers have finished..." )
// Teleport 2 racers
REPEAT COUNT_OF(thisRace.Racer) iIndex
IF thisRace.Racer[iIndex].Driver <> PLAYER_PED_ID()
IF NOT IS_ENTITY_DEAD(thisRace.Racer[iIndex].Driver)
IF HAS_TRI_RACER_FINISHED_RACE(thisRace, thisRace.Racer[iIndex])
CPRINTLN( DEBUG_TRIATHLON, "Racer ", iIndex, " has finished the race." )
SET_ENTITY_COORDS(thisRace.Racer[iIndex].Driver, TRI_GET_RACER_FINISH_TELEPORT_POS(eTriRace, iRacerNum))
SET_ENTITY_HEADING(thisRace.Racer[iIndex].Driver, TRI_GET_RACER_FINISH_TELEPORT_HEADING(eTriRace, iRacerNum))
IF (thisRace.Racer[iIndex].iRank = 1)
STRING szTempAnim = GET_RANDOM_ANIM_CLIP_FROM_TRI_ANIM_DICTIONARY(szTriAnimDicts[0])
TASK_PLAY_ANIM(thisRace.Racer[iIndex].Driver, szTriAnimDicts[0], szTempAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING, GET_RANDOM_FLOAT_IN_RANGE(0.0, 1.0))
ELSE
STRING szTempAnim = GET_RANDOM_ANIM_CLIP_FROM_TRI_ANIM_DICTIONARY(szTriAnimDicts[1])
TASK_PLAY_ANIM(thisRace.Racer[iIndex].Driver, szTriAnimDicts[1], szTempAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING, GET_RANDOM_FLOAT_IN_RANGE(0.0, 1.0))
ENDIF
++iRacerNum
ENDIF
ENDIF
IF iRacerNum > 2
iIndex = thisRace.iRacerCnt
ENDIF
ENDIF
ENDREPEAT
ELSE
REPEAT COUNT_OF(thisRace.Racer) iIndex
IF thisRace.Racer[iIndex].Driver <> PLAYER_PED_ID()
IF NOT IS_ENTITY_DEAD(thisRace.Racer[iIndex].Driver)
IF HAS_TRI_RACER_FINISHED_RACE(thisRace, thisRace.Racer[iIndex])
SET_ENTITY_COORDS(thisRace.Racer[iIndex].Driver, TRI_GET_RACER_FINISH_TELEPORT_POS(eTriRace, iRacerNum))
SET_ENTITY_HEADING(thisRace.Racer[iIndex].Driver, TRI_GET_RACER_FINISH_TELEPORT_HEADING(eTriRace, iRacerNum))
IF (thisRace.Racer[iIndex].iRank = 1)
STRING szTempAnim = GET_RANDOM_ANIM_CLIP_FROM_TRI_ANIM_DICTIONARY(szTriAnimDicts[0])
TASK_PLAY_ANIM(thisRace.Racer[iIndex].Driver, szTriAnimDicts[0], szTempAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING, GET_RANDOM_FLOAT_IN_RANGE(0.0, 1.0))
ELSE
STRING szTempAnim = GET_RANDOM_ANIM_CLIP_FROM_TRI_ANIM_DICTIONARY(szTriAnimDicts[1])
TASK_PLAY_ANIM(thisRace.Racer[iIndex].Driver, szTriAnimDicts[1], szTempAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING, GET_RANDOM_FLOAT_IN_RANGE(0.0, 1.0))
ENDIF
iIndex = thisRace.iRacerCnt
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDIF
CPRINTLN(DEBUG_TRIATHLON, "PLAY_TRI_OUTRO_SYNC_SCENE_WINLOSS, Cam texAnim=", texAnim)
ENDPROC
PROC PLAY_TRI_OUTRO_SYNC_SCENE_WATER_BOTTLE(TRI_OUTRO_SCENE_DATA &thisTOSData, TRI_RACE_STRUCT &thisRace, VECTOR vScenePos, FLOAT fHeading)
thisTOSData.iOutroSceneID = CREATE_SYNCHRONIZED_SCENE(vScenePos, (<<0,0,fHeading>>))
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(thisTOSData.iOutroSceneID, FALSE)
enumCharacterList ePed = GET_CURRENT_PLAYER_PED_ENUM()
TEXT_LABEL_31 texAnim = "triathlon_outro_"
IF ePed = CHAR_MICHAEL
texAnim += "michael"
ELIF ePed = CHAR_FRANKLIN
texAnim += "franklin"
ELIF ePed = CHAR_TREVOR
texAnim += "trevor"
ENDIF
CLEAR_PED_TASKS_IMMEDIATELY(thisRace.Racer[0].Driver)
TASK_SYNCHRONIZED_SCENE(thisRace.Racer[0].Driver, thisTOSData.iOutroSceneID, thisTOSData.texOutroDict, texAnim, INSTANT_BLEND_IN, REALLY_SLOW_BLEND_OUT, SYNCED_SCENE_TAG_SYNC_OUT)
CPRINTLN(DEBUG_TRIATHLON, "PLAY_TRI_OUTRO_SYNC_SCENE_WATER_BOTTLE, thisTOSData.iOutroSceneID=", thisTOSData.iOutroSceneID, ", thisTOSData.texOutroDict=", thisTOSData.texOutroDict, ", texAnim=", texAnim)
FADE_UP_PED_LIGHT()
TEXT_LABEL_31 texCamAnim = texAnim
texCamAnim += "_cam"
IF DOES_CAM_EXIST(camScene_End)
DESTROY_CAM(camScene_End)
ENDIF
camScene_End = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", FALSE)
SET_CAM_ACTIVE(camScene_End, TRUE)
PLAY_SYNCHRONIZED_CAM_ANIM(camScene_End, thisTOSData.iOutroSceneID, texCamAnim, thisTOSData.texOutroDict)
//RENDER_SCRIPT_CAMS(TRUE, FALSE)
SET_CAM_ACTIVE_WITH_INTERP(camScene_End, camIntroIECam, 600)
PLAY_SOUND_FRONTEND(-1, "QUIT_WHOOSH", "HUD_MINI_GAME_SOUNDSET")
CPRINTLN(DEBUG_TRIATHLON, "PLAY_TRI_OUTRO_SYNC_SCENE_WATER_BOTTLE, Cam texCamAnim=", texCamAnim)
TEXT_LABEL_31 texBottleAnim = texAnim
texBottleAnim += "_bottle"
thisTOSData.oBottle = CREATE_OBJECT(PROP_ENERGY_DRINK, vScenePos)
PLAY_SYNCHRONIZED_ENTITY_ANIM(thisTOSData.oBottle, thisTOSData.iOutroSceneID, texBottleAnim, thisTOSData.texOutroDict, INSTANT_BLEND_IN)
CPRINTLN(DEBUG_TRIATHLON, "PLAY_TRI_OUTRO_SYNC_SCENE_WATER_BOTTLE, bottle texBottleAnim=", texBottleAnim)
ENDPROC
PROC UPDATE_TRI_OUTRO_ASSETS(TRI_RACE_STRUCT &thisRace, TRI_OUTRO_SCENE_DATA &thisTOSData)
IF thisRace.Racer[0].iGateCur >= thisRace.iGateCnt - 3 AND NOT IS_TRI_CONTROL_FLAG_SET(TCF_OUTRO_ASSETS_REQUESTED)
SET_TRI_CONTROL_FLAG(TCF_OUTRO_ASSETS_REQUESTED)
thisTOSData.texOutroDict = "mini@triathlon"
enumCharacterList ePed = GET_CURRENT_PLAYER_PED_ENUM()
IF ePed = CHAR_MICHAEL
thisTOSData.texOutroDict += "michael"
ELIF ePed = CHAR_FRANKLIN
thisTOSData.texOutroDict += "franklin"
ELIF ePed = CHAR_TREVOR
thisTOSData.texOutroDict += "trevor"
ENDIF
REQUEST_ANIM_DICT(thisTOSData.texOutroDict)
CPRINTLN(DEBUG_TRIATHLON, "UPDATE_TRI_OUTRO_ASSETS :: requested ", thisTOSData.texOutroDict)
REQUEST_MODEL(PROP_ENERGY_DRINK)
ENDIF
ENDPROC
FUNC BOOL HAVE_TRI_OUTRO_ASSETS_LOADED(TRI_OUTRO_SCENE_DATA &thisTOSData)
IF NOT HAS_ANIM_DICT_LOADED(thisTOSData.texOutroDict)
CPRINTLN(DEBUG_TRIATHLON, "HAVE_TRI_OUTRO_ASSETS_LOADED waiting on ", thisTOSData.texOutroDict)
RETURN FALSE
ENDIF
IF NOT HAS_MODEL_LOADED(PROP_ENERGY_DRINK)
CPRINTLN(DEBUG_TRIATHLON, "HAVE_TRI_OUTRO_ASSETS_LOADED waiting on PROP_ENERGY_DRINK")
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Create the cutscene cameras for the current race.
PROC Tri_Cutscenes_Create_Cameras()
DEBUG_MESSAGE("[TRI_Triathlon_Cutscenes->Tri_Cutscenes_Create_Cameras] Started procedure.")
SWITCH eCurrentTriRace
// Triathlon 1
CASE TRIATHLON_RACE_ALAMO_SEA
// Sky view cameras.
IF NOT DOES_CAM_EXIST(camIntroSkyview_Start)
camIntroSkyview_Start = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<2405.7759, 4282.3945, 35.6522>>, <<-1.3334, 0.0000, 95.4363>>, 30.30)
ENDIF
IF NOT DOES_CAM_EXIST(camIntroSkyview_End)
camIntroSkyview_End = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<2405.5820, 4280.5117, 33.9315>>, <<5.2742, -0.0000, 91.9419>>, 50.0)
ENDIF
// Water cameras.
IF NOT DOES_CAM_EXIST(camIntroWater_Start)
camIntroWater_Start = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<2386.6360, 4295.4775, 32.2856>>, <<-1.1846, 0.6029, -150.5774>>, 24.0182)
ENDIF
IF NOT DOES_CAM_EXIST(camIntroWater_End)
camIntroWater_End = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<2386.8499, 4295.0957, 32.2766>>, <<-1.1846, 0.6029, -150.5774>>, 24.0182)
ENDIF
// Racer and spectator cameras.
IF NOT DOES_CAM_EXIST(camIntroRacer_Start)
camIntroRacer_Start = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, << 2403.0247, 4281.1650, 33.5233 >>, << -5.6822, 0.0000, 95.0976 >>, 50.0)
ENDIF
IF NOT DOES_CAM_EXIST(camIntroRacer_End)
camIntroRacer_End = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, << 2402.9746, 4281.7417, 33.5233 >>, << -5.6822, 0.0000, 95.0976 >>, 50.0)
ENDIF
IF NOT DOES_CAM_EXIST(camIntroCatchupCam1)
camIntroCatchupCam1 = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<2398.0886, 4282.6377, 33.2085>>, <<-6.7472, 0.0000, 99.2434>>, 40.0100 )
ENDIF
IF NOT DOES_CAM_EXIST(camIntroCatchupCam2)
camIntroCatchupCam2 = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<2397.4504, 4282.5605, 33.1346>>, <<-5.6170, -0.0000, 98.3052>>, 40.0100 )
ENDIF
vIntensityPosStart = <<2389.7273, 4251.5620, 40.2787>>//<<2390.8015, 4288.4790, 32.5432>>
vIntensityRotStart = <<-20.5590, 0.6028, -3.2381>>//<<-7.2814, -0.0240, -133.1707>>
vIntensityPosEnd = <<2405.3708, 4256.7573, 40.7256>>//<<2391.5134, 4284.8232, 32.5181>>
vIntensityRotEnd = <<-14.5943, 0.6248, 41.4011>>//<<-2.6823, -0.0240, -133.1707>>
// cam 4
vEnergyPosStart = <<2396.3472, 4271.7251, 32.4817>>//<<2396.8118, 4271.3403, 33.2084>>//<< 2400.2520, 4283.3398, 33.7358 >>
vEnergyRotStart = <<2.6718, -0.0000, 3.2264>>//<<-5.2101, 0.0000, 4.2778>>//<< -7.4578, -0.0240, 151.5870 >>
vEnergyPosEnd = <<2396.2920, 4272.7051, 32.5122>>//<<2396.5664, 4272.7051, 33.1121>>//<< 2399.2461, 4283.8843, 33.7362 >>
vEnergyRotEnd = <<2.0511, 0.0000, 3.2264>>//<<-3.9804, 0.0000, 4.2778>>//<< -7.4578, -0.0240, 151.5870 >>
IF NOT DOES_CAM_EXIST(camIntroIECam)
camIntroIECam = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vIntensityPosStart, vIntensityRotStart, 50.0)
ENDIF
DEBUG_MESSAGE("[TRI_Triathlon_Cutscenes->Tri_Cutscenes_Create_Cameras] Cutscene cameras made in Triathlon 1.")
BREAK
// Triathlon 2
CASE TRIATHLON_RACE_VESPUCCI
// Sky view cameras.
IF NOT DOES_CAM_EXIST(camIntroSkyview_Start)
camIntroSkyview_Start = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<-1260.5, -2048.5, 15.4>>, <<16.4, -0.0, 45.2>>, 30.30)
ENDIF
IF NOT DOES_CAM_EXIST(camIntroSkyview_End)
camIntroSkyview_End = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<-1261.4497, -2047.3550, 7.0256>>, <<-2.7528, 0.0163, 45.8717>>, 50.0)
ENDIF
// Water cameras.
IF NOT DOES_CAM_EXIST(camIntroWater_Start)
camIntroWater_Start = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<-1261.4224, -2022.1317, 3.0495>>, <<5.1381, -0.0000, 147.5967>>, 33.6646)
ENDIF
IF NOT DOES_CAM_EXIST(camIntroWater_End)
camIntroWater_End = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<-1261.7815, -2022.6979, 3.1098>>, <<5.1381, -0.0000, 147.5967>>, 33.6646)
ENDIF
// Racer and spectator cameras.
IF NOT DOES_CAM_EXIST(camIntroRacer_Start)
camIntroRacer_Start = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, << -1266.98, -2046.60, 4.84 >>, << -5.35, 0.00, 10.12 >>, 25.11)
ENDIF
IF NOT DOES_CAM_EXIST(camIntroRacer_End)
camIntroRacer_End = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, << -1266.49, -2046.57, 4.84 >>, << -5.35, 0.00, 12.21 >>, 25.11)
ENDIF
IF NOT DOES_CAM_EXIST(camIntroCatchupCam1)
camIntroCatchupCam1 = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<-1265.7010, -2041.5682, 4.6619>>, <<-5.0125, -0.0000, 50.3428>>, 40.0349)
ENDIF
IF NOT DOES_CAM_EXIST(camIntroCatchupCam2)
camIntroCatchupCam2 = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<-1266.1606, -2041.1896, 4.6097>>, <<-5.0125, -0.0000, 50.3428>>, 40.0349)
ENDIF
vIntensityPosStart = <<-1300.0, -2059.4, 12.3>>//<<-1265.2870, -2041.0748, 5.0353>>
vIntensityRotStart = <<-16.4,- 0.0, -52.8>>//<<-15.4951, -0.0000, 94.5429>>
vIntensityPosEnd = <<-1287.3, -2066.5, 10.7>>//<<-1265.2870, -2041.0748, 5.0353>>
vIntensityRotEnd = <<-10.0,- 0.0, -15.2>>//<<-15.4951, -0.0000, 71.3706>>
vEnergyPosStart = <<-1277.9, -2047.9, 4.3>>//<< -1270.3761, -2045.4255, 4.4269 >>
vEnergyRotStart = <<-2.3,- 0.0, -56.3>>//<< -1.7076, -0.0000, -21.4116 >>
vEnergyPosEnd = <<-1276.8, -2046.7, 4.3>>//<< -1271.6577, -2044.9227, 4.4269 >>
vEnergyRotEnd = <<-2.3,- 0.0, -56.3>>//<< -1.7076, -0.0000, -21.4116 >>
IF NOT DOES_CAM_EXIST(camIntroIECam)
camIntroIECam = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vIntensityPosStart, vIntensityRotStart, 50.0)
ENDIF
DEBUG_MESSAGE("[TRI_Triathlon_Cutscenes->Tri_Cutscenes_Create_Cameras] Flythrough cameras made in Triathlon 2.")
BREAK
// Triathlon 3
CASE TRIATHLON_RACE_IRONMAN
IF NOT DOES_CAM_EXIST(camIntroSkyview_Start)
camIntroSkyview_Start = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, << 1589.0675, 3834.8213, 54.2202 >>, << 5.3341, -0.0003, 71.4501 >>, 50.0)
ENDIF
IF NOT DOES_CAM_EXIST(camIntroSkyview_End)
camIntroSkyview_End = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<1590.1229, 3820.2156, 34.9406>>, <<5.1632, -0.0000, 36.9737>>, 50.0)
ENDIF
// Water cameras.
IF NOT DOES_CAM_EXIST(camIntroWater_Start)
camIntroWater_Start = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<1566.3325, 3823.0542, 32.7110>>, <<-1.0620, 0.0000, -63.9708>>, 32.5918 )
ENDIF
IF NOT DOES_CAM_EXIST(camIntroWater_End)
camIntroWater_End = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<1567.1281, 3823.4412, 32.6946>>, <<-1.0620, 0.0000, -63.9708>>, 32.5918 )
ENDIF
// Racer and spectator cameras.
IF NOT DOES_CAM_EXIST(camIntroRacer_Start)
camIntroRacer_Start = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<1585.4115, 3832.3213, 33.2760>>, <<6.1917, -0.0000, -152.8082>>, 28.6127 )
ENDIF
IF NOT DOES_CAM_EXIST(camIntroRacer_End)
camIntroRacer_End = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<1585.7034, 3831.7537, 33.3460>>, <<6.7344, -0.0000, -152.8082>>, 28.6127 )
ENDIF
IF NOT DOES_CAM_EXIST(camIntroCatchupCam1)
camIntroCatchupCam1 = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<1589.5148, 3827.8237, 34.0188>>, <<-5.4725, 0.0000, 51.0998>>, 40.0333 )
ENDIF
IF NOT DOES_CAM_EXIST(camIntroCatchupCam2)
camIntroCatchupCam2 = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<1588.8525, 3828.3591, 33.9373>>, <<-5.4725, 0.0000, 51.0998>>, 40.0333 )
ENDIF
DEBUG_MESSAGE("[TRI_Triathlon_Cutscenes->Tri_Cutscenes_Create_Cameras] Flythrough cameras made in Triathlon 3.")
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Request cutscene assets for the current race.
PROC Tri_Cutscenes_Request_Assets()
DEBUG_MESSAGE("[TRI_Triathlon_Cutscenes->Tri_Cutscenes_Request_Assets] Started procedure.")
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ENDPROC
/// PURPOSE:
/// Load cutscene assets for the current race.
FUNC BOOL Tri_Cutscenes_Load_Assets()
DEBUG_MESSAGE("[TRI_Triathlon_Cutscenes->Tri_Cutscenes_Load_Assets] Started procedure.")
RENDER_SCRIPT_CAMS(FALSE, FALSE)
RETURN FALSE
ENDFUNC
/*
[2] amb@busstop@char2@idle_a idle_a // Looks like he's waiting. Not ideal, but best one found yet.
[3] amb@queue@impatient@idle_a idle_a // Looking ahead, shaking head in impatience. Fits ok.
idle_b // Swinging his arms. This looks good.
idle_c // Looks at his watch, scratches his head. Might be acceptable for now.
[4] amb@queue@impatient@idle_b idle_e // He looks behind him a couple of times, to both sides, then looks up. Looks good.
*/
/// PURPOSE:
/// Play racer animations during the intro.
/// TODO: Find a way to randomly choose which animation is set to who, so the same
/// racers aren't always playing the same animation at every race start.
/// Do this only once we have all animation variations.
PROC Tri_Cutscenes_Play_Racer_Intro_Anims(TRI_RACE_STRUCT& thisRace)
INT iRacerCounter//, iAnim
// STRING sAnim
FLOAT fStartPhase
REPEAT thisRace.iRacerCnt iRacerCounter
//iAnim = GET_RANDOM_INT_IN_RANGE(0, 6)
fStartPhase = GET_RANDOM_FLOAT_IN_RANGE()
IF NOT IS_ENTITY_DEAD(thisRace.Racer[iRacerCounter].Driver)
// sAnim = PICK_STRING(iAnim = 0, "idle_a",
// PICK_STRING(iAnim = 1, "idle_b",
// PICK_STRING(iAnim = 2, "idle_c",
// PICK_STRING(iAnim = 3, "idle_d",
// PICK_STRING(iAnim = 4, "idle_e", "idle_f")))))
IF iRacerCounter <> 0
TASK_PLAY_ANIM(thisRace.Racer[iRacerCounter].Driver, szTriAnimDicts[2], "idle_f", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING, fStartPhase)
ELSE
TASK_PLAY_ANIM(thisRace.Racer[iRacerCounter].Driver, szTriAnimDicts[2], "idle_a", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING, fStartPhase)
ENDIF
ENDIF
ENDREPEAT
ENDPROC
PROC SET_TRI_INTRO_ANIM_SPEEDS(TRI_RACE_STRUCT& thisRace)
IF NOT IS_TRI_CONTROL_FLAG_SET(TCF_INTRO_ANIM_SPEEDS_SET)
INT iRacerCounter
FLOAT fSpeed
STRING sDict = "mini@triathlon"
REPEAT thisRace.iRacerCnt iRacerCounter
PED_INDEX ped = thisRace.Racer[iRacerCounter].Driver
// Make the player playback at 1.0 and the other racers at a reasonable value other than 1.0
IF iRacerCounter = 0
fSpeed = 1.0
ELSE
fSpeed = PICK_FLOAT(GET_RANDOM_FLOAT_IN_RANGE() <= TRI_ANIM_PLAYBACK_LOW_PROB, GET_RANDOM_FLOAT_IN_RANGE(TRI_ANIM_PLAYBACK_LOW_LOW, TRI_ANIM_PLAYBACK_LOW_HI), GET_RANDOM_FLOAT_IN_RANGE(TRI_ANIM_PLAYBACK_HI_LOW, TRI_ANIM_PLAYBACK_HI_HI))
ENDIF
IF NOT IS_ENTITY_DEAD(ped)
IF IS_ENTITY_PLAYING_ANIM(ped, sDict, "idle_a")
SET_ENTITY_ANIM_SPEED(ped, sDict, "idle_a", fSpeed)
CPRINTLN(DEBUG_TRIATHLON, "[tri_cutscenes.sch::SET_TRI_INTRO_ANIM_SPEEDS] iRacer[", iRacerCounter, "] set with fSpeed=", fSpeed)
ELIF IS_ENTITY_PLAYING_ANIM(ped, sDict, "idle_b")
SET_ENTITY_ANIM_SPEED(ped, sDict, "idle_b", fSpeed)
CPRINTLN(DEBUG_TRIATHLON, "[tri_cutscenes.sch::SET_TRI_INTRO_ANIM_SPEEDS] iRacer[", iRacerCounter, "] set with fSpeed=", fSpeed)
ELIF IS_ENTITY_PLAYING_ANIM(ped, sDict, "idle_c")
SET_ENTITY_ANIM_SPEED(ped, sDict, "idle_c", fSpeed)
CPRINTLN(DEBUG_TRIATHLON, "[tri_cutscenes.sch::SET_TRI_INTRO_ANIM_SPEEDS] iRacer[", iRacerCounter, "] set with fSpeed=", fSpeed)
ELIF IS_ENTITY_PLAYING_ANIM(ped, sDict, "idle_d")
SET_ENTITY_ANIM_SPEED(ped, sDict, "idle_d", fSpeed)
CPRINTLN(DEBUG_TRIATHLON, "[tri_cutscenes.sch::SET_TRI_INTRO_ANIM_SPEEDS] iRacer[", iRacerCounter, "] set with fSpeed=", fSpeed)
ELIF IS_ENTITY_PLAYING_ANIM(ped, sDict, "idle_e")
SET_ENTITY_ANIM_SPEED(ped, sDict, "idle_e", fSpeed)
CPRINTLN(DEBUG_TRIATHLON, "[tri_cutscenes.sch::SET_TRI_INTRO_ANIM_SPEEDS] iRacer[", iRacerCounter, "] set with fSpeed=", fSpeed)
ELIF IS_ENTITY_PLAYING_ANIM(ped, sDict, "idle_f")
SET_ENTITY_ANIM_SPEED(ped, sDict, "idle_f", fSpeed)
CPRINTLN(DEBUG_TRIATHLON, "[tri_cutscenes.sch::SET_TRI_INTRO_ANIM_SPEEDS] iRacer[", iRacerCounter, "] set with fSpeed=", fSpeed)
ENDIF
ENDIF
ENDREPEAT
ENDIF
SET_TRI_CONTROL_FLAG(TCF_INTRO_ANIM_SPEEDS_SET)
ENDPROC
/// PURPOSE:
/// Stop playing racer animations in intro.
PROC Tri_Cutscenes_Setup_Racer_Intro_Anims(TRI_RACE_STRUCT& Race)
CPRINTLN(DEBUG_TRIATHLON, "Tri_Cutscenes_Setup_Racer_Intro_Anims called")
// INT iRacerCounter
// FLOAT fWait
//
// REPEAT Race.iRacerCnt iRacerCounter
// fWait = GET_RANDOM_FLOAT_IN_RANGE(0, ANIM_WAIT_THRESHOLD)
// Race.Racer[iRacerCounter].fAnimWait = fWait
// CPRINTLN(DEBUG_TRIATHLON, "iRacer[", iRacerCounter, "] has an fWait of ", fWait)
// ENDREPEAT
/// PURPOSE:
/// Does the waiting around while the player animates during the countdown.
/// PARAMS:
/// Race -
INT p
REPEAT Race.iRacerCnt p
IF NOT IS_ENTITY_DEAD(Race.Racer[p].Driver)
INT iAnim = GET_RANDOM_INT_IN_RANGE(1, 14)
STRING sAnim
IF p <> 0
sAnim = PICK_STRING(iAnim = 1, "ig_2_gen_warmup_01",
PICK_STRING(iAnim = 2, "ig_2_gen_warmup_02",
PICK_STRING(iAnim = 3, "ig_2_gen_warmup_03",
PICK_STRING(iAnim = 4, "ig_2_gen_warmup_04",
PICK_STRING(iAnim = 5, "ig_2_gen_warmup_05",
PICK_STRING(iAnim = 6, "ig_2_gen_warmup_06",
PICK_STRING(iAnim = 7, "ig_2_gen_warmup_07",
PICK_STRING(iAnim = 8, "ig_2_gen_warmup_08",
PICK_STRING(iAnim = 9, "ig_2_gen_warmup_09",
PICK_STRING(iAnim = 10, "ig_2_gen_warmup_10",
PICK_STRING(iAnim = 11, "ig_2_gen_warmup_11",
PICK_STRING(iAnim = 12, "ig_2_gen_warmup_12",
"ig_2_gen_warmup_13"))))))))))))
TASK_PLAY_ANIM(Race.Racer[p].Driver, "mini@triathlon", sAnim, INSTANT_BLEND_IN, default, default, AF_ABORT_ON_PED_MOVEMENT | AF_EXIT_AFTER_INTERRUPTED, 0.02)
ELSE
sAnim = "ig_2_gen_warmup_01"
CLEAR_PED_TASKS_IMMEDIATELY(Race.Racer[p].Driver)
IF IS_TRI_CONTROL_FLAG_SET(TCF_TRI_SKIPPED_CUTSCENE)
TASK_PLAY_ANIM(Race.Racer[p].Driver, "mini@triathlon", sAnim, INSTANT_BLEND_IN, default, default, AF_ABORT_ON_PED_MOVEMENT | AF_EXIT_AFTER_INTERRUPTED, 0.15)
ELSE
TASK_PLAY_ANIM(Race.Racer[p].Driver, "mini@triathlon", sAnim, INSTANT_BLEND_IN, default, default, AF_ABORT_ON_PED_MOVEMENT | AF_EXIT_AFTER_INTERRUPTED, 0.25)
ENDIF
ENDIF
FORCE_PED_AI_AND_ANIMATION_UPDATE(Race.Racer[p].Driver)
CPRINTLN(DEBUG_TRIATHLON, "[tri_helpers.sch::HANDLE_TRI_COUNTDOWN_ANIMS] Setting iRacer[", p, "] with ", sAnim)
ENDIF
ENDREPEAT
ENDPROC
/// PURPOSE:
/// Advance to the next stage in the cutscene.
PROC Tri_Cutscenes_Update_Current_Stage_And_Restart_Timer(TRI_CUTSCENE_STAGE eNewCutsceneStage)
RESTART_TIMER_NOW(timerCutsceneCamera)
eCurrentCutsceneStage = eNewCutsceneStage
ENDPROC
/// PURPOSE:
/// Destroy intro cutscene cameras.
PROC DESTROY_TRI_INTRO_CUTSCENE_CAMERAS()
CPRINTLN(DEBUG_TRIATHLON, "[TRI_Triathlon_Cutscenes.sch->DESTROY_TRI_INTRO_CUTSCENE_CAMERAS] Procedure started.")
IF DOES_CAM_EXIST(camIntroSkyview_Start)
DESTROY_CAM(camIntroSkyview_Start)
CPRINTLN(DEBUG_TRIATHLON, "[TRI_Triathlon_Cutscenes.sch->DESTROY_TRI_INTRO_CUTSCENE_CAMERAS] Destroying camera: camIntroSkyview_Start.")
ENDIF
IF DOES_CAM_EXIST(camIntroSkyview_End)
DESTROY_CAM(camIntroSkyview_End)
CPRINTLN(DEBUG_TRIATHLON, "[TRI_Triathlon_Cutscenes.sch->DESTROY_TRI_INTRO_CUTSCENE_CAMERAS] Destroying camera: camIntroSkyview_End.")
ENDIF
IF DOES_CAM_EXIST(camIntroWater_Start)
DESTROY_CAM(camIntroWater_Start)
CPRINTLN(DEBUG_TRIATHLON, "[TRI_Triathlon_Cutscenes.sch->DESTROY_TRI_INTRO_CUTSCENE_CAMERAS] Destroying camera: camIntroWater_Start.")
ENDIF
IF DOES_CAM_EXIST(camIntroWater_End)
DESTROY_CAM(camIntroWater_End)
CPRINTLN(DEBUG_TRIATHLON, "[TRI_Triathlon_Cutscenes.sch->DESTROY_TRI_INTRO_CUTSCENE_CAMERAS] Destroying camera: camIntroWater_End.")
ENDIF
IF DOES_CAM_EXIST(camIntroRacer_Start)
DESTROY_CAM(camIntroRacer_Start)
CPRINTLN(DEBUG_TRIATHLON, "[TRI_Triathlon_Cutscenes.sch->DESTROY_TRI_INTRO_CUTSCENE_CAMERAS] Destroying camera: camIntroRacer_Start.")
ENDIF
IF DOES_CAM_EXIST(camIntroRacer_End)
DESTROY_CAM(camIntroRacer_End)
CPRINTLN(DEBUG_TRIATHLON, "[TRI_Triathlon_Cutscenes.sch->DESTROY_TRI_INTRO_CUTSCENE_CAMERAS] Destroying camera: camIntroRacer_End.")
ENDIF
// IF DOES_CAM_EXIST(camIntroIECam)
// DESTROY_CAM(camIntroIECam)
// CPRINTLN(DEBUG_TRIATHLON, "[TRI_Triathlon_Cutscenes.sch->DESTROY_TRI_INTRO_CUTSCENE_CAMERAS] Destroying camera: camIntroIECam.")
// ENDIF
ENDPROC
PROC UPDATE_TRI_CHEERING_PEDS(TRI_RACE_STRUCT &thisRace, FLOAT minDelay = 1.0, FLOAT fMaxDelay = 3.0)
IF NOT IS_TIMER_STARTED(cheerTimer)
RESTART_TIMER_NOW(cheerTimer)
ENDIF
IF (IS_PED_INJURED(pedChattering) OR NOT IS_ANY_SPEECH_PLAYING(pedChattering)) AND TIMER_DO_WHEN_READY(cheerTimer, fCheeerDelay)
// Find the range from the player we're going to grab a cheering ped from
VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE)
VECTOR vCheeringRange = (<<1,1,1>>) * TRI_CHEERING_RANGE
SET_SCENARIO_PEDS_TO_BE_RETURNED_BY_NEXT_COMMAND(TRUE)
PED_INDEX pedCheering = GET_RANDOM_PED_AT_COORD(vPlayerPos, vCheeringRange, PEDTYPE_LAST_PEDTYPE)
// Make sure the cheering ped isn't a racer
IF DOES_ENTITY_EXIST(pedCheering) AND NOT IS_PED_INJURED(pedCheering) AND GET_ENTITY_MODEL(pedCheering) <> A_M_Y_RoadCyc_01
STRING sVoice = PICK_STRING(IS_PED_MALE(pedCheering), "WAVELOAD_PAIN_MALE", "WAVELOAD_PAIN_FEMALE")
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedCheering, "WHOOP", sVoice, SPEECH_PARAMS_FORCE_NORMAL)
fCheeerDelay = GET_RANDOM_FLOAT_IN_RANGE(minDelay, fMaxDelay)
RESTART_TIMER_NOW(cheerTimer)
ENDIF
ENDIF
IF VDIST2(GET_ENTITY_COORDS(thisRace.Racer[0].Driver), thisRace.sGate[thisRace.iGateCnt - 1].vPos) < 1000 AND NOT IS_TRI_CONTROL_FLAG_SET(TCF_BIG_CHEERS_PLAYED)
PLAY_TRI_BIG_CHEERS(thisRace)
SET_TRI_CONTROL_FLAG(TCF_BIG_CHEERS_PLAYED)
ENDIF
ENDPROC
PROC HANDLE_TRI_INTRO_AUDIO(TRI_RACE_STRUCT &thisRace)
IF NOT IS_TIMER_STARTED(diagTimer)
RESTART_TIMER_NOW(diagTimer)
ENDIF
IF NOT IS_TIMER_STARTED(cheerTimer)
RESTART_TIMER_NOW(cheerTimer)
ENDIF
//We want some level of cheering peds during countdown if we can
UPDATE_TRI_CHEERING_PEDS(thisRace, 4.0, 6.0)
IF TIMER_DO_WHEN_READY(diagTimer, fDelay)
STRING sVoice
pedChattering = thisRace.Racer[GET_RANDOM_INT_IN_RANGE(1, 8)].Driver
IF iChatterCount % 2 = 0
IF GET_RANDOM_BOOL()
sVoice = "A_M_Y_TRIATHLON_01_MINI_01"
ELSE
sVoice = "A_M_Y_TRIATHLON_01_MINI_02"
ENDIF
ELSE
IF GET_RANDOM_BOOL()
sVoice = "A_M_Y_TRIATHLON_01_MINI_03"
ELSE
sVoice = "A_M_Y_TRIATHLON_01_MINI_04"
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(pedChattering) AND NOT IS_PED_INJURED(pedChattering)
iChatterCount++
fDelay = GET_RANDOM_FLOAT_IN_RANGE(7.0, 10.0)
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedChattering, "TRIATHLON_WARMUP", sVoice, SPEECH_PARAMS_FORCE_SHOUTED_CRITICAL)
RESTART_TIMER_NOW(diagTimer)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Goggles for Michael are 7
/// Goggles for Franklin are 2
/// Goggles for Trevor are 5, cap is 22(?), hair is 3 for cap.
PROC SETUP_TRI_PED_PROPS()
CPRINTLN(DEBUG_TRIATHLON, "SETUP_TRI_PED_PROPS called")
enumCharacterList eChar = GET_CURRENT_PLAYER_PED_ENUM()
IF eChar = CHAR_MICHAEL
SET_PED_PROP_INDEX(PLAYER_PED_ID(), ANCHOR_EYES, 7)
SET_PED_PROP_INDEX(PLAYER_PED_ID(), ANCHOR_HEAD, 22)
SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_HAIR, 1, 0)
ELIF eChar = CHAR_FRANKLIN
SET_PED_PROP_INDEX(PLAYER_PED_ID(), ANCHOR_EYES, 2)
ELIF eChar = CHAR_TREVOR
SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_HAIR, 1, 0)
SET_PED_PROP_INDEX(PLAYER_PED_ID(), ANCHOR_HEAD, 22)
SET_PED_PROP_INDEX(PLAYER_PED_ID(), ANCHOR_EYES, 5)
ELSE
CPRINTLN(DEBUG_TENNIS, "Player other than the main 3 is selected. No components set.")
ENDIF
ENDPROC
/// Purpose:
/// Change the player's outfit to his Triathlon outfit.
PROC SET_PLAYER_TRI_OUTFIT()
CPRINTLN(DEBUG_TRIATHLON, "[TriathlonSP.sc->SET_PLAYER_TRI_OUTFIT] Procedure started.")
//Save all current props
GET_PED_VARIATIONS(PLAYER_PED_ID(), Tri_Master.sPlayerVariation)
STORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID(), FALSE)
Tri_Master.bVariationRestored = FALSE
//B*1475521 - Clear Blood and Damage
CLEAR_PED_BLOOD_DAMAGE(PLAYER_PED_ID())
SET_ENTITY_HEALTH(PLAYER_PED_ID(),GET_ENTITY_MAX_HEALTH(PLAYER_PED_ID()))
// Store for Franklin, he keeps his hair.
INT iHairDrawable, iHairTexture, iBerdDrawable, iBerdTexture
iHairDrawable = GET_PED_DRAWABLE_VARIATION(PLAYER_PED_ID(), PED_COMP_HAIR)
iHairTexture = GET_PED_TEXTURE_VARIATION(PLAYER_PED_ID(), PED_COMP_HAIR)
iBerdDrawable = GET_PED_DRAWABLE_VARIATION(PLAYER_PED_ID(), PED_COMP_BERD)
iBerdTexture = GET_PED_TEXTURE_VARIATION(PLAYER_PED_ID(), PED_COMP_BERD)
// If the player came here with a helmet, store the hat, if any, underneath it.
// GET_PED_HELMET_STORED_HAT_PROP_INDEX(PLAYER_PED_ID())
// GET_PED_HELMET_STORED_HAT_TEX_INDEX(PLAYER_PED_ID())
#IF IS_DEBUG_BUILD
PRINT_PED_VARIATIONS(PLAYER_PED_ID())
#ENDIF
SET_PED_DEFAULT_COMPONENT_VARIATION(PLAYER_PED_ID())
IF DOES_ENTITY_EXIST(PLAYER_PED_ID())
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
KNOCK_OFF_PED_PROP(PLAYER_PED_ID(),TRUE,TRUE,TRUE,TRUE)
CLEAR_PED_STORED_HAT_PROP(PLAYER_PED_ID())
CPRINTLN(DEBUG_TRIATHLON, "[TriathlonSP.sc->SET_PLAYER_TRI_OUTFIT] Removing all player head props, if he has one on.")
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_TORSO, 13, 0)
SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_LEG, 12, 0)
SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_FEET, 8, 0)
SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_BERD, iBerdDrawable, iBerdTexture) //(berd)
CPRINTLN(DEBUG_TRIATHLON, "[TriathlonSP.sc->SET_PLAYER_TRI_OUTFIT] Triathlon outfit has been set for Michael.")
CPRINTLN(DEBUG_TRIATHLON, "[TriathlonSP.sc->SET_PLAYER_TRI_OUTFIT] iBerdDrawable=", iBerdDrawable, ", iBerdTexture=", iBerdTexture)
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_TORSO, 10, 0)
SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_LEG, 10, 0)
SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_FEET, 4, 0)
SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_BERD, iBerdDrawable, iBerdTexture) //(berd)
CPRINTLN(DEBUG_TRIATHLON, "[TriathlonSP.sc->SET_PLAYER_TRI_OUTFIT] Triathlon outfit has been set for Trevor.")
CPRINTLN(DEBUG_TRIATHLON, "[TriathlonSP.sc->SET_PLAYER_TRI_OUTFIT] iBerdDrawable=", iBerdDrawable, ", iBerdTexture=", iBerdTexture)
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_TORSO, 5, 0)
SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_LEG, 5, 0)
SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_FEET, 3, 0)
SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_HAIR, iHairDrawable, iHairTexture)
SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_BERD, iBerdDrawable, iBerdTexture) //(berd)
CPRINTLN(DEBUG_TRIATHLON, "[TriathlonSP.sc->SET_PLAYER_TRI_OUTFIT] Triathlon outfit has been set for Franklin.")
CPRINTLN(DEBUG_TRIATHLON, "[TriathlonSP.sc->SET_PLAYER_TRI_OUTFIT] iHairDrawable=", iHairDrawable, ", iHairTexture=", iHairTexture)
CPRINTLN(DEBUG_TRIATHLON, "[TriathlonSP.sc->SET_PLAYER_TRI_OUTFIT] iBerdDrawable=", iBerdDrawable, ", iBerdTexture=", iBerdTexture)
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL IS_PLAYER_WEARING_TRI_OUTFIT()
IF IS_ENTITY_DEAD( PLAYER_PED_ID() )
RETURN FALSE
ENDIF
PED_VARIATION_STRUCT sPlayerVariation
GET_PED_VARIATIONS( PLAYER_PED_ID(), sPlayerVariation )
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
IF sPlayerVariation.iDrawableVariation[ENUM_TO_INT( PED_COMP_TORSO )] = 13
AND sPlayerVariation.iDrawableVariation[ENUM_TO_INT( PED_COMP_LEG )] = 12
AND sPlayerVariation.iDrawableVariation[ENUM_TO_INT( PED_COMP_FEET )] = 8
RETURN TRUE
ENDIF
BREAK
CASE CHAR_TREVOR
IF sPlayerVariation.iDrawableVariation[ENUM_TO_INT( PED_COMP_TORSO )] = 10
AND sPlayerVariation.iDrawableVariation[ENUM_TO_INT( PED_COMP_LEG )] = 10
AND sPlayerVariation.iDrawableVariation[ENUM_TO_INT( PED_COMP_FEET )] = 4
RETURN TRUE
ENDIF
BREAK
CASE CHAR_FRANKLIN
IF sPlayerVariation.iDrawableVariation[ENUM_TO_INT( PED_COMP_TORSO )] = 5
AND sPlayerVariation.iDrawableVariation[ENUM_TO_INT( PED_COMP_LEG )] = 5
AND sPlayerVariation.iDrawableVariation[ENUM_TO_INT( PED_COMP_FEET )] = 3
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC TASK_TRI_HELI(PED_INDEX &pedPilot, VEHICLE_INDEX &vehChopper)
IF NOT IS_PED_INJURED(pedPilot) AND NOT IS_ENTITY_DEAD(vehChopper) AND NOT IS_PED_INJURED(PLAYER_PED_ID())
// TASK_HELI_CHASE(pedPilot, PLAYER_PED_ID(), (<<50, 50, 35>>))
// TASK_HELI_MISSION(pedPilot, vehChopper, NULL, PLAYER_PED_ID(), (<<0.0,0.0,0.0>>), MISSION_PROTECT, 30.0, 25, -1.0, CEIL(35), CEIL(35))
TASK_VEHICLE_HELI_PROTECT(pedPilot, vehChopper, PLAYER_PED_ID(), 30, DF_SteerAroundObjects, 25, 35)
CPRINTLN(DEBUG_TRIATHLON, "TASK_TRI_HELI :: FLY_CHASE_HELI_FLY!")
ENDIF
ENDPROC
/// PURPOSE:
/// Play the intro cutscene for the current race.
PROC Tri_Cutscenes_Play_Intro(VECTOR vScriptStartPos, TRI_RACE_STRUCT& Race, FLOAT fPlayerHeading, CAMERA_INDEX &camTriSky, VEHICLE_INDEX &vehChopper, PED_INDEX &pedPilot)
SET_TRI_CONTROL_FLAG(TCF_TRI_CUTSCENE_PLAYING)
UNUSED_PARAMETER(fPlayerHeading)
HANDLE_TRI_INTRO_AUDIO(Race)
FLOAT fCutTime
VECTOR vHPLossStartPos, vHPLossEndPos, vHPLossStartRot, vHPLossEndRot
// Cam 5
IF eCurrentTriRace = TRIATHLON_RACE_ALAMO_SEA
vHPLossStartPos = <<2391.1677, 4283.4873, 32.2649>>//<<2391.0835, 4283.2949, 32.2649>>//<<2392.4084, 4282.7051, 33.8151>>
vHPLossStartRot = <<7.3105, 0.0009, -116.2334>>//<<8.0232, 0.0009, -109.3500>>//<<-14.6657, -0.0240, -100.1658>>
vHPLossEndPos = <<2391.8623, 4283.1465, 32.3712>>//<<2391.0835, 4283.2949, 32.2649>>//<<2390.7314, 4283.0068, 34.2611>>
vHPLossEndRot = <<7.7310, 0.0009, -115.5986>>//<<10.4965, 0.0009, -109.3500>>//<<-14.6657, -0.0240, -100.1658>>
ELIF eCurrentTriRace = TRIATHLON_RACE_VESPUCCI
vHPLossStartPos = <<-1269.5, -2036.2, 3.1>> //<< -1273.2681, -2038.3073, 3.4913 >>
vHPLossStartRot = <<16.2, 0.0, -167.1 >>//<< 5.5019, -0.0000, -108.7474 >>
vHPLossEndPos = <<-1269.5, -2036.2, 3.1>>//<< -1277.3439, -2036.9229, 3.0768 >>
vHPLossEndRot = <<17.8, 0.0, -165.5>>//<< 5.5019, -0.0000, -108.7474 >>
ENDIF
// Check if the player has skipped the cutscene, and if not, check for input to skip.
IF NOT IS_TRI_CONTROL_FLAG_SET(TCF_TRI_SKIPPED_CUTSCENE) AND eCurrentCutsceneStage > TRI_CUTSCENE_STAGE_SETUP
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
IF eCurrentCutsceneStage > TRI_CUTSCENE_STAGE_SKYVIEW_WAIT
DEBUG_MESSAGE("[TRI_Triathlon_Cutscenes.sch->Tri_Cutscenes_Play_Intro] Player wants to skip cutscene. Return to game camera.")
SET_TRI_CONTROL_FLAG(TCF_TRI_SKIPPED_CUTSCENE)
DEBUG_MESSAGE("[TRI_Triathlon_Cutscenes.sch->Tri_Cutscenes_Play_Intro] Cutscene skipped.")
eCurrentCutsceneStage = TRI_CUTSCENE_STAGE_CLEANUP
IF DOES_ENTITY_EXIST(TRI_Master.oPencil)
IF IS_ENTITY_ATTACHED(TRI_Master.oPencil)
DETACH_ENTITY(TRI_Master.oPencil)
ENDIF
ENDIF
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ELSE
DO_SCREEN_FADE_OUT( 0 )
DEBUG_MESSAGE("[TRI_Triathlon_Cutscenes.sch->Tri_Cutscenes_Play_Intro] Player wants to skip cutscene. Return to game camera." )
SET_TRI_CONTROL_FLAG(TCF_TRI_SKIPPED_CUTSCENE)
IF DOES_ENTITY_EXIST(TRI_Master.oPencil)
DETACH_ENTITY(TRI_Master.oPencil)
ENDIF
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
eCurrentCutsceneStage = TRI_CUTSCENE_STAGE_HELI_CREATE
ENDIF
ENDIF
ENDIF
SWITCH eCurrentCutsceneStage
// Cutscene set up.
CASE TRI_CUTSCENE_STAGE_SETUP
// Set cameras early enough so they don't pop at the start.
Tri_Cutscenes_Create_Cameras()
IF IS_SCREEN_FADED_OUT() AND VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), vScriptStartPos) > 1000
// Load script start area.
LOAD_SCENE(vScriptStartPos)
VECTOR vPlayerPos
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
CPRINTLN(DEBUG_TRIATHLON, "LOAD_SCENE :: TRI_CUTSCENE_STAGE_SETUP, vScriptStartPos=", vScriptStartPos, ", playerPos=", vPlayerPos)
ENDIF
CLEAR_PRINTS()
IF NOT IS_TIMER_STARTED(timerCutsceneCamera)
START_TIMER_NOW(timerCutsceneCamera)
ELSE
RESTART_TIMER_NOW(timerCutsceneCamera)
ENDIF
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
CPRINTLN(DEBUG_TRIATHLON, "[TRI_Triathlon_Helpers.sch->READY_PLAYER_CHARACTER_FOR_TRIATHLON] Unequipping possible player weapon.")
//Tri_Cutscenes_Update_Current_Stage_And_Restart_Timer(TRI_CUTSCENE_STAGE_HELI_CREATE)
Tri_Cutscenes_Update_Current_Stage_And_Restart_Timer(TRI_CUTSCENE_STAGE_SIGN_IN)
BREAK
CASE TRI_CUTSCENE_STAGE_SIGN_IN
IF GET_SYNCHRONIZED_SCENE_PHASE( iSynchSceneIntro ) >= 0.75 //0.74
Tri_Cutscenes_Update_Current_Stage_And_Restart_Timer(TRI_CUTSCENE_STAGE_SIGN_IN_WAIT)
VECTOR vDest, vStart, vHeading
FLOAT fHeading
IF eCurrentTriRace = TRIATHLON_RACE_ALAMO_SEA
vStart = <<2384.3933, 4317.6313, 49.1586>>//<<2338.2388, 4378.1123, 120.2957>>
vDest = <<2383.0474, 4244.2207, 46.9973>>//<<2388.5806, 4256.2310, 31.5247>>
vHeading = vDest - vStart
fHeading = GET_HEADING_FROM_VECTOR_2D(vHeading.x, vHeading.y)
ELIF eCurrentTriRace = TRIATHLON_RACE_VESPUCCI
vStart = <<-1254.4238, -2008.6199, 20.4530>>//<<-1273.9961, -2022.5023, 30.7509>>//<<-1241.9432, -1941.1986, 84.1085>>//<<-1261.2136, -1971.7616, 57.7592>>//
vDest = <<-1307.8572, -2062.9504, 14.3542>>//<<-1302.4484, -2058.4885, 16.6435>>//<<-1298.9327, -2063.5742, 5.5249>>//<<-1287.3, -2066.5, 10.7>> //
fHeading = 148.1232
ELIF eCurrentTriRace = TRIATHLON_RACE_IRONMAN
vStart = <<1612.5658, 3863.6152, 48.4078>>//<<1483.1023, 3768.6030, 138.9427>>
vDest = <<1551.9393, 3818.1523, 49.4007>>//<<1593.7911, 3847.5664, 32.1028>>
vHeading = vDest - vStart
fHeading = GET_HEADING_FROM_VECTOR_2D(vHeading.x, vHeading.y)
ENDIF
IF NOT IS_PED_INJURED(pedPilot) AND NOT IS_ENTITY_DEAD(vehChopper)
SET_ENTITY_COORDS(vehChopper, vStart)
SET_ENTITY_HEADING(vehChopper, fHeading)
TASK_HELI_MISSION(pedPilot, vehChopper, NULL, NULL, vDest, MISSION_GOTO, 30.0, 3.0, fHeading, 1, 1)
CPRINTLN(DEBUG_TRIATHLON, "vehChopper tasked in intro")
ENDIF
ENDIF
//eCurrentCutsceneStage = TRI_CUTSCENE_STAGE_SIGN_IN_WAIT
BREAK
CASE TRI_CUTSCENE_STAGE_SIGN_IN_WAIT
IF GET_SYNCHRONIZED_SCENE_PHASE( iSynchSceneIntro ) >= 1.0 //0.74
Tri_Cutscenes_Update_Current_Stage_And_Restart_Timer(TRI_CUTSCENE_STAGE_HELI_CREATE)
ENDIF
BREAK
CASE TRI_CUTSCENE_STAGE_HELI_CREATE
IF NOT IS_ENTITY_DEAD(Tri_Master.pedTableGuy)
TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(Tri_Master.pedTableGuy, GET_ENTITY_COORDS(Tri_Master.pedTableGuy), 2.0)
ENDIF
IF NOT TRI_Master.bOutfitChanged
// Set the racer outfits.
SET_PLAYER_TRI_OUTFIT()
// Set up goggles and swim caps for the main player characters
SETUP_TRI_PED_PROPS()
TRI_Master.bOutfitChanged = TRUE
ENDIF
IF NOT IS_TRI_CONTROL_FLAG_SET( TCF_TRI_SKIPPED_CUTSCENE )
eCurrentCutsceneStage = TRI_CUTSCENE_STAGE_HELI_WAIT
ELSE
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), Race.Racer[0].vStartPos )
SET_ENTITY_HEADING( PLAYER_PED_ID(), Race.Racer[0].fStartHead )
ENDIF
Tri_Cutscenes_Play_Racer_Intro_Anims(Race)
eCurrentCutsceneStage = TRI_CUTSCENE_STAGE_CLEANUP
ENDIF
BREAK
CASE TRI_CUTSCENE_STAGE_HELI_WAIT
FLOAT fTime
VECTOR vPos, vLook
//INT iDuration
IF eCurrentTriRace = TRIATHLON_RACE_ALAMO_SEA
fTime = 0.0//7.98
vPos = <<2407.5278, 4280.5791, 51.4604>>//<<2429.2104, 4284.1646, 45.1134>>
vLook = <<10.5419, 0.0000, 91.9416>>//<<-11.8552, -0.0000, 115.8075>>
//iDuration = 0//3215//5000
ELIF eCurrentTriRace = TRIATHLON_RACE_VESPUCCI
fTime = 0.0//6.43
vPos = <<-1261.8286, -2046.9830, 18.0698>>//<<-1260.5, -2048.5, 15.4>> //<<-1260.4017, -2048.6079, 16.1657>>
vLook = <<9.3682, 0.0163, 45.8717>>//<<16.4, -0.0, 45.2>>//<<-14.0170, -0.0000, 72.6713>>
//iDuration = 0//3215//5000
ELIF eCurrentTriRace = TRIATHLON_RACE_IRONMAN
fTime = 0.0
vPos = <<1590.8025, 3819.3125, 45.5862>>//<<1605.2433, 3822.2114, 53.5891>>
vLook = <<14.8126, -0.0000, 36.9737>>//<<-31.9753, 0.0000, 57.0484>>
//iDuration = 0//4000
ENDIF
IF eCurrentTriRace <> TRIATHLON_RACE_IRONMAN
PRINT_HELP("TRI_INTRO_GOAL")
//CLEAR_THIS_PRINT("TRI_INTRO_GOAL")
//PRINT_HELP("TRI_INTRO_LEGS")
ENDIF
IF GET_TIMER_IN_SECONDS(timerCutsceneCamera) > fTime
// Play racer animations during the intro.
IF DOES_CAM_EXIST(camIntroIECam)
DESTROY_CAM(camIntroIECam)
ENDIF
camIntroIECam = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vPos, vLook, 50.0)
SET_CAM_ACTIVE( camIntroIECam, TRUE )
IF DOES_ENTITY_EXIST(TRI_Master.oPencil)
DETACH_ENTITY(TRI_Master.oPencil)
ENDIF
//SET_CAM_PARAMS(camTriSky, vPos, vLook, 50, iDuration)
eCurrentCutsceneStage = TRI_CUTSCENE_STAGE_HELI_HOVER
ELIF IS_TRI_CONTROL_FLAG_SET(TCF_TRI_SKIPPED_CUTSCENE)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), Race.Racer[0].vStartPos )
SET_ENTITY_HEADING( PLAYER_PED_ID(), Race.Racer[0].fStartHead )
ENDIF
Tri_Cutscenes_Play_Racer_Intro_Anims(Race)
eCurrentCutsceneStage = TRI_CUTSCENE_STAGE_CLEANUP
ENDIF
BREAK
CASE TRI_CUTSCENE_STAGE_HELI_HOVER
IF eCurrentTriRace = TRIATHLON_RACE_ALAMO_SEA
fTime = 0.0//12.65
ELIF eCurrentTriRace = TRIATHLON_RACE_VESPUCCI
fTime = 0.0//12.61
ELIF eCurrentTriRace = TRIATHLON_RACE_IRONMAN
fTime = 0.0//14.12
ENDIF
IF GET_TIMER_IN_SECONDS(timerCutsceneCamera) > fTime
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), Race.Racer[0].vStartPos )
SET_ENTITY_HEADING( PLAYER_PED_ID(), Race.Racer[0].fStartHead )
ENDIF
Tri_Cutscenes_Play_Racer_Intro_Anims(Race)
IF NOT IS_PED_INJURED(pedPilot) AND NOT IS_ENTITY_DEAD(vehChopper)
// IF eCurrentTriRace = TRIATHLON_RACE_IRONMAN
// TASK_HELI_MISSION(pedPilot, vehChopper, NULL, NULL, GET_ENTITY_COORDS(vehChopper), MISSION_GOTO, 30.0, 3.0, GET_ENTITY_HEADING(PLAYER_PED_ID()), 1, 1)
// ENDIF
Tri_Cutscenes_Update_Current_Stage_And_Restart_Timer(TRI_CUTSCENE_STAGE_SKYVIEW)
CPRINTLN(DEBUG_TRIATHLON, "vehChopper tasked to hover")
ENDIF
ELIF IS_TRI_CONTROL_FLAG_SET(TCF_TRI_SKIPPED_CUTSCENE)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), Race.Racer[0].vStartPos )
SET_ENTITY_HEADING( PLAYER_PED_ID(), Race.Racer[0].fStartHead )
ENDIF
Tri_Cutscenes_Play_Racer_Intro_Anims(Race)
eCurrentCutsceneStage = TRI_CUTSCENE_STAGE_CLEANUP
ENDIF
BREAK
// Show skyview of race.
CASE TRI_CUTSCENE_STAGE_SKYVIEW
IF DOES_CAM_EXIST(camTriSky)
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
IF IS_TRI_CONTROL_FLAG_SET(TCF_TRI_SKIPPED_CUTSCENE)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), Race.Racer[0].vStartPos )
SET_ENTITY_HEADING( PLAYER_PED_ID(), Race.Racer[0].fStartHead )
ENDIF
Tri_Cutscenes_Play_Racer_Intro_Anims(Race)
eCurrentCutsceneStage = TRI_CUTSCENE_STAGE_CLEANUP
ELSE
IF eCurrentTriRace <> TRIATHLON_RACE_IRONMAN
SET_CAM_ACTIVE_WITH_INTERP(camIntroSkyview_End, camIntroIECam, 6215)
ELSE
SET_CAM_ACTIVE_WITH_INTERP(camIntroSkyview_End, camIntroIECam, 8125)
ENDIF
RENDER_SCRIPT_CAMS(TRUE, FALSE)
eCurrentCutsceneStage = TRI_CUTSCENE_STAGE_SKYVIEW_HELP
ENDIF
ELSE
CLEAR_TRI_CONTROL_FLAG(TCF_TRI_CUTSCENE_PLAYING)
ENDIF
BREAK
CASE TRI_CUTSCENE_STAGE_SKYVIEW_HELP
SET_TRI_INTRO_ANIM_SPEEDS(Race)
IF eCurrentTriRace <> TRIATHLON_RACE_IRONMAN
IF (GET_TIMER_IN_SECONDS(timerCutsceneCamera) > 6.215)//9.0 )
Tri_Cutscenes_Update_Current_Stage_And_Restart_Timer(TRI_CUTSCENE_STAGE_WATER)
ENDIF
ELSE
IF GET_TIMER_IN_SECONDS(timerCutsceneCamera) > 8.125//9.0
Tri_Cutscenes_Update_Current_Stage_And_Restart_Timer(TRI_CUTSCENE_STAGE_WATER)
ENDIF
ENDIF
IF IS_SCREEN_FADED_IN() AND NOT IS_SCREEN_FADING_IN()
IF eCurrentTriRace = TRIATHLON_RACE_IRONMAN
PRINT_HELP("TRI_INTRO_IM1")
ENDIF
eCurrentCutsceneStage = TRI_CUTSCENE_STAGE_SKYVIEW_WAIT
ENDIF
IF IS_TRI_CONTROL_FLAG_SET(TCF_TRI_SKIPPED_CUTSCENE)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), Race.Racer[0].vStartPos )
SET_ENTITY_HEADING( PLAYER_PED_ID(), Race.Racer[0].fStartHead )
ENDIF
CLEAR_HELP()
Tri_Cutscenes_Play_Racer_Intro_Anims(Race)
eCurrentCutsceneStage = TRI_CUTSCENE_STAGE_CLEANUP
ENDIF
BREAK
// Wait for skyview to complete.
CASE TRI_CUTSCENE_STAGE_SKYVIEW_WAIT
IF eCurrentTriRace = TRIATHLON_RACE_IRONMAN
fCutTime = 8.125//9.0
ELSE
fCutTime = 6.125
ENDIF
IF (GET_TIMER_IN_SECONDS(timerCutsceneCamera) > fCutTime )
Tri_Cutscenes_Update_Current_Stage_And_Restart_Timer(TRI_CUTSCENE_STAGE_WATER)
ENDIF
IF IS_TRI_CONTROL_FLAG_SET(TCF_TRI_SKIPPED_CUTSCENE)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), Race.Racer[0].vStartPos )
SET_ENTITY_HEADING( PLAYER_PED_ID(), Race.Racer[0].fStartHead )
ENDIF
CLEAR_HELP()
Tri_Cutscenes_Play_Racer_Intro_Anims(Race)
eCurrentCutsceneStage = TRI_CUTSCENE_STAGE_CLEANUP
ENDIF
BREAK
// Show water.
CASE TRI_CUTSCENE_STAGE_WATER
IF DOES_CAM_EXIST(camIntroWater_Start)
//Cam 2
IF eCurrentTriRace = TRIATHLON_RACE_ALAMO_SEA
SET_CAM_ACTIVE_WITH_INTERP(camIntroWater_End, camIntroWater_Start, 5000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
ELIF eCurrentTriRace = TRIATHLON_RACE_VESPUCCI
SET_CAM_ACTIVE_WITH_INTERP(camIntroWater_End, camIntroWater_Start, 5000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
ELSE
SET_CAM_ACTIVE_WITH_INTERP(camIntroWater_End, camIntroWater_Start, 6000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
ENDIF
IF NOT IS_ENTITY_DEAD(vehChopper)
IF eCurrentTriRace = TRIATHLON_RACE_ALAMO_SEA
SET_ENTITY_COORDS(vehChopper, <<2386.2920, 4232.5552, 36.9120>>)
ELIF eCurrentTriRace = TRIATHLON_RACE_VESPUCCI
SET_ENTITY_COORDS(vehChopper, <<-1306.7081, -2067.3142, 13.6222>>)
// ELIF eCurrentTriRace = TRIATHLON_RACE_IRONMAN
// SET_ENTITY_COORDS(vehChopper, <<-1269.0126, -2041.7416, 3.0650>>)
ENDIF
ENDIF
IF eCurrentTriRace = TRIATHLON_RACE_IRONMAN
CLEAR_THIS_PRINT("TRI_INTRO_IM2")
PRINT_HELP("TRI_INTRO_IM2")
ELSE
CLEAR_THIS_PRINT("TRI_INTRO_GOAL")
IF IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
PRINT_HELP("TRI_INTNS_KM")
ELSE
PRINT_HELP("TRI_INTNS")
ENDIF
ENDIF
IF eCurrentTriRace = TRIATHLON_RACE_IRONMAN
eCurrentCutsceneStage = TRI_CUTSCENE_STAGE_WATER_WAIT
ELSE
eCurrentCutsceneStage = TRI_CUTSCENE_STAGE_WATER_WAIT_HELI
ENDIF
ELSE
CLEAR_TRI_CONTROL_FLAG(TCF_TRI_CUTSCENE_PLAYING)
ENDIF
BREAK
CASE TRI_CUTSCENE_STAGE_WATER_WAIT_HELI
IF GET_TIMER_IN_SECONDS(timerCutsceneCamera) > 1.5
FLOAT fHeliHeading
VECTOR vChopperPos
IF NOT IS_PED_INJURED(PLAYER_PED_ID()) AND NOT IS_ENTITY_DEAD(vehChopper)
vChopperPos = GET_ENTITY_COORDS(vehChopper)
fHeliHeading = GET_HEADING_BETWEEN_VECTORS(vChopperPos, GET_ENTITY_COORDS(PLAYER_PED_ID()))
ENDIF
IF NOT IS_PED_INJURED(pedPilot) AND NOT IS_ENTITY_DEAD(vehChopper)
TASK_HELI_MISSION(pedPilot, vehChopper, NULL, NULL, vChopperPos, MISSION_GOTO, 30.0, 3.0, fHeliHeading, 1, 1)
ENDIF
eCurrentCutsceneStage = TRI_CUTSCENE_STAGE_WATER_WAIT
ENDIF
BREAK
// Wait for water cam to complete.
CASE TRI_CUTSCENE_STAGE_WATER_WAIT
IF eCurrentTriRace = TRIATHLON_RACE_IRONMAN
fCutTime = 6.0
ELSE
fCutTime = 5.0
ENDIF
IF (GET_TIMER_IN_SECONDS(timerCutsceneCamera) > fCutTime )
IF eCurrentTriRace = TRIATHLON_RACE_IRONMAN
IF NOT IS_ENTITY_DEAD( PLAYER_PED_ID() )
TASK_PLAY_ANIM(PLAYER_PED_ID(), szTriAnimDicts[2], "idle_a", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING, 0.5)
ENDIF
Tri_Cutscenes_Update_Current_Stage_And_Restart_Timer(TRI_CUTSCENE_STAGE_RACER)
ELSE
IF DOES_CAM_EXIST(camIntroSkyview_Start)
DESTROY_CAM(camIntroSkyview_Start)
ENDIF
IF DOES_CAM_EXIST(camIntroIECam)
DESTROY_CAM(camIntroIECam)
ENDIF
// Cam 3 heli cam
SHAKE_SCRIPT_GLOBAL( "WOBBLY_SHAKE", 0.0002 )
camIntroSkyview_Start = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vIntensityPosStart, vIntensityRotStart, 35.0)
camIntroIECam = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vIntensityPosEnd, vIntensityRotEnd, 35.0)
Tri_Cutscenes_Update_Current_Stage_And_Restart_Timer(TRI_CUTSCENE_STAGE_INTENSITY)
ENDIF
ENDIF
BREAK
//Show Intensiy help and set the cam to lerp sideways a little
CASE TRI_CUTSCENE_STAGE_INTENSITY
IF DOES_CAM_EXIST(camIntroIECam) AND DOES_CAM_EXIST( camIntroSkyview_Start )
SET_CAM_ACTIVE_WITH_INTERP(camIntroIECam, camIntroSkyview_Start, 6100, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
CLEAR_THIS_PRINT("TRI_INTNS")
IF IS_PC_VERSION()
IF IS_THIS_PRINT_BEING_DISPLAYED( "TRI_INTNS_KM")
CLEAR_THIS_PRINT("TRI_INTNS_KM")
ENDIF
ENDIF
PRINT_HELP("TRI_NRG_INTRO")
eCurrentCutsceneStage = TRI_CUTSCENE_STAGE_INTENSITY_WAIT
Race.Racer[0].iRank = 1
//TRI_Race_Draw_Hud(Race)
ENDIF
BREAK
//Wait for Intensity cam to complete
CASE TRI_CUTSCENE_STAGE_INTENSITY_WAIT
IF (GET_TIMER_IN_SECONDS(timerCutsceneCamera) > 6.0 )
IF NOT IS_ENTITY_DEAD( PLAYER_PED_ID() )
TASK_PLAY_ANIM(PLAYER_PED_ID(), szTriAnimDicts[2], "idle_d", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING, 0.05)
ENDIF
IF DOES_CAM_EXIST(camIntroSkyview_Start)
DESTROY_CAM(camIntroSkyview_Start)
ENDIF
IF DOES_CAM_EXIST(camIntroSkyview_End)
DESTROY_CAM(camIntroSkyview_End)
ENDIF
// Cam 4
camIntroSkyview_End = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vEnergyPosEnd, vEnergyRotEnd, 20.7)
camIntroSkyview_Start = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vEnergyPosStart, vEnergyRotStart, 20.7)
Tri_Cutscenes_Update_Current_Stage_And_Restart_Timer(TRI_CUTSCENE_STAGE_ENERGY)
ENDIF
//TRI_Race_Draw_Hud(Race)
BREAK
//Show Energy help and set the cam to lerp backwards a little
CASE TRI_CUTSCENE_STAGE_ENERGY
IF DOES_CAM_EXIST(camIntroIECam)
SET_CAM_ACTIVE_WITH_INTERP(camIntroSkyview_End, camIntroSkyview_Start, 4100, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR )
//SET_CAM_PARAMS(camIntroIECam, vEnergyPosEnd, vEnergyRotEnd, 50.0, 9000)
CLEAR_THIS_PRINT("TRI_NRG_INTRO")
PRINT_HELP("TRI_HP_LOSS")
eCurrentCutsceneStage = TRI_CUTSCENE_STAGE_ENERGY_WAIT
TRI_Race_Draw_Hud(Race)
ENDIF
BREAK
//Wait for Energy cam to complete
CASE TRI_CUTSCENE_STAGE_ENERGY_WAIT
STOP_SCRIPT_GLOBAL_SHAKING(TRUE)
IF (GET_TIMER_IN_SECONDS(timerCutsceneCamera) > 4.1 )
IF DOES_CAM_EXIST(camIntroSkyview_Start)
DESTROY_CAM(camIntroSkyview_Start)
ENDIF
// Cam 5
camIntroSkyview_Start = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vHPLossStartPos, vHPLossStartRot, 20.7)
Tri_Cutscenes_Update_Current_Stage_And_Restart_Timer(TRI_CUTSCENE_STAGE_HP_LOSS)
ENDIF
TRI_Race_Draw_Hud(Race)
BREAK
CASE TRI_CUTSCENE_STAGE_HP_LOSS
IF DOES_CAM_EXIST(camIntroIECam)
CPRINTLN(DEBUG_TRIATHLON, "vStartPos ", vHPLossStartPos, ", vStartRot ", vHPLossStartRot)
CPRINTLN(DEBUG_TRIATHLON, "vEndPos ", vHPLossEndPos, ", vEndRot ", vHPLossEndRot)
SET_CAM_PARAMS(camIntroIECam, vHPLossEndPos, vHPLossEndRot, 20.7)
SET_CAM_ACTIVE_WITH_INTERP(camIntroIECam, camIntroSkyview_Start, 4000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR )
CLEAR_THIS_PRINT("TRI_HP_LOSS")
eCurrentCutsceneStage = TRI_CUTSCENE_STAGE_HP_LOSS_WAIT
ENDIF
TRI_Race_Draw_Hud(Race)
BREAK
CASE TRI_CUTSCENE_STAGE_HP_LOSS_WAIT
IF (GET_TIMER_IN_SECONDS(timerCutsceneCamera) > 4.0 )
Tri_Cutscenes_Update_Current_Stage_And_Restart_Timer(TRI_CUTSCENE_STAGE_CLEANUP)
ENDIF
TRI_Race_Draw_Hud(Race)
BREAK
// Show finish line.
CASE TRI_CUTSCENE_STAGE_RACER
IF DOES_CAM_EXIST(camIntroRacer_Start)
IF eCurrentTriRace = TRIATHLON_RACE_ALAMO_SEA
SET_CAM_ACTIVE_WITH_INTERP(camIntroRacer_End, camIntroRacer_Start, 4000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
ELIF eCurrentTriRace = TRIATHLON_RACE_VESPUCCI
SET_CAM_ACTIVE_WITH_INTERP(camIntroRacer_End, camIntroRacer_Start, 4000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
ELSE
SET_CAM_ACTIVE_WITH_INTERP(camIntroRacer_End, camIntroRacer_Start, 6000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
ENDIF
IF eCurrentTriRace = TRIATHLON_RACE_IRONMAN
CLEAR_THIS_PRINT("TRI_INTRO_IM2")
PRINT_HELP("TRI_INTRO_IM3")
ENDIF
eCurrentCutsceneStage = TRI_CUTSCENE_STAGE_RACER_WAIT
ELSE
CLEAR_TRI_CONTROL_FLAG(TCF_TRI_CUTSCENE_PLAYING)
ENDIF
BREAK
// Wait for finish line cam to complete.
CASE TRI_CUTSCENE_STAGE_RACER_WAIT
IF (GET_TIMER_IN_SECONDS(timerCutsceneCamera) > 6.0 )
Tri_Cutscenes_Update_Current_Stage_And_Restart_Timer(TRI_CUTSCENE_STAGE_CLEANUP)
// SET_CAM_ACTIVE(camIntroRacer_Start, TRUE)
// IF eCurrentTriRace = TRIATHLON_RACE_ALAMO_SEA
// SET_CAM_PARAMS(camIntroRacer_Start, (<<2396.6938, 4290.7183, 32.7631>>), (<<-4.6996, -0.0000, 162.4670>>), 50, 0)
// SET_CAM_PARAMS(camIntroRacer_Start, (<<2397.2419, 4290.5449, 32.7631>>), (<<-4.6996, -0.0000, 162.4670>>), 50, 4000)
// CPRINTLN(DEBUG_TRIATHLON, "TRIATHLON_RACE_ALAMO_SEA, cam params for final")
// ELIF eCurrentTriRace = TRIATHLON_RACE_VESPUCCI
// SET_CAM_PARAMS(camIntroRacer_Start, (<<-1261.9166, -2035.0470, 4.5939>>), (<<-10.4041, 0.0000, 106.0351>>), 50, 0)
// SET_CAM_PARAMS(camIntroRacer_Start, (<<-1261.6249, -2036.0605, 4.5939>>), (<<-10.4041, 0.0000, 106.0351>>), 50, 4000)
// CPRINTLN(DEBUG_TRIATHLON, "TRIATHLON_RACE_VESPUCCI, cam params for final")
// ELIF eCurrentTriRace = TRIATHLON_RACE_IRONMAN
// SET_CAM_PARAMS(camIntroRacer_Start, (<<1583.9034, 3822.2495, 35.5762>>), (<<-19.7925, 0.0000, 12.9743>>), 50, 0)
// SET_CAM_PARAMS(camIntroRacer_Start, (<<1585.5526, 3824.0723, 35.5680>>), (<<-19.7925, 0.0000, 12.9743>>), 50, 4000)
// CPRINTLN(DEBUG_TRIATHLON, "TRIATHLON_RACE_IRONMAN, cam params for final")
// ENDIF
ENDIF
BREAK
// Return to game camera.
CASE TRI_CUTSCENE_STAGE_GAME_CAM
// RENDER_SCRIPT_CAMS(FALSE, TRUE)
eCurrentCutsceneStage = TRI_CUTSCENE_STAGE_GAME_CAM_WAIT
BREAK
// Wait for game camera to finish setting.
CASE TRI_CUTSCENE_STAGE_GAME_CAM_WAIT
IF (GET_TIMER_IN_SECONDS(timerCutsceneCamera) > 4.0 )
Tri_Cutscenes_Update_Current_Stage_And_Restart_Timer(TRI_CUTSCENE_STAGE_CLEANUP)
ENDIF
BREAK
// Clean up cutscene cameras.
CASE TRI_CUTSCENE_STAGE_CLEANUP
IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID()) AND IS_PLAYER_WEARING_TRI_OUTFIT()
CLEAR_HELP()
DISPLAY_RADAR(TRUE)
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(900)
ENDIF
//RENDER_SCRIPT_CAMS(FALSE, FALSE)
SET_CAM_ACTIVE_WITH_INTERP( camIntroCatchupCam2, camIntroCatchupCam1, 5000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR )
// Stop playing racer animations.
Tri_Cutscenes_Setup_Racer_Intro_Anims(Race)
TASK_TRI_HELI(pedPilot, vehChopper)
// The player's startup animation may change his heading, so ensure he's facing the race course once the cutscene ends.
// IF NOT IS_ENTITY_DEAD(Race.Racer[0].Driver)
// IF GET_ENTITY_HEADING(Race.Racer[0].Driver) <> fPlayerHeading
// SET_ENTITY_HEADING(Race.Racer[0].Driver, fPlayerHeading)
// CPRINTLN(DEBUG_TRIATHLON, "[TRI_Triathlon_Cutscenes.sch->Tri_Cutscenes_Play_Intro] Player heading differs from original heading. Setting player heading to: ", fPlayerHeading)
// ELSE
// CPRINTLN(DEBUG_TRIATHLON, "[TRI_Triathlon_Cutscenes.sch->Tri_Cutscenes_Play_Intro] Player heading is the same as original heading: ", fPlayerHeading)
// ENDIF
// ENDIF
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
CLEAR_TRI_CONTROL_FLAG(TCF_TRI_SKIPPED_CUTSCENE)
CLEAR_TRI_CONTROL_FLAG(TCF_TRI_CUTSCENE_PLAYING)
ENDIF
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_TRIATHLON, "GET_TIMER_IN_SECONDS(", GET_TIMER_IN_SECONDS(timerCutsceneCamera), ")")
IF IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_SCRIPT_PAD_DOWN) OR IS_DISABLED_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_SCRIPT_PAD_DOWN)
CPRINTLN(DEBUG_TRIATHLON, "camera tag")
ENDIF
#ENDIF
ENDPROC
// ====================================================
// E N D TRIATHLON CUTSCENE FUNCTIONS AND PROCEDURES
// ====================================================
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
//
// END OF FILE - DO NOT ADD ANYTHING BELOW THIS BLOCK!
//
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************