1688 lines
67 KiB
Scheme
Executable File
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!
|
|
//
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|