1709 lines
59 KiB
Python
Executable File
1709 lines
59 KiB
Python
Executable File
// Includes
|
|
//USING "chase_hint_cam.sch" CHASE_HINT_CAM_STRUCT localChaseHintCamStruct
|
|
|
|
USING "Race_Control.sch"
|
|
USING "minigame_big_message.sch"
|
|
USING "rich_presence_public.sch"
|
|
USING "taxi_functions.sch"
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
USING "debug_Races.sch"
|
|
#ENDIF
|
|
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
//
|
|
// SCRIPT NAME : mission_Race.sc
|
|
// AUTHOR : David Roberts
|
|
// DESCRIPTION : Handles the Street and Sea Races
|
|
//
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
|
|
INT iRaceFailTimeout = -1
|
|
|
|
TEXT_LABEL_23 emptyTextLabel = ""
|
|
INT iRaceID = -1
|
|
|
|
INT iMissionEndTimeout = -1
|
|
|
|
INT iMissionStartTime = 0
|
|
|
|
INT iBS = 0
|
|
|
|
//VECTOR vRewardDest
|
|
|
|
//SIMPLE_USE_CONTEXT sComplexUseContext
|
|
//SIMPLE_USE_CONTEXT sLeaderboardContext
|
|
INT iLoadLeaderboardTimer
|
|
|
|
// Fail screen variables
|
|
MG_FAIL_SPLASH sFailSplash
|
|
SCRIPT_SCALEFORM_BIG_MESSAGE sBigMessage
|
|
STRING sFailMessage
|
|
BOOL bShouldRetry
|
|
|
|
VEHICLE_INDEX viCityRaceCar
|
|
BOOL bCreateCar = TRUE
|
|
|
|
BOOL bSetupLeaderboard = TRUE
|
|
BOOL bDrawLeaderboard = FALSE
|
|
BOOL bWaitToShowProfile
|
|
BOOL bOnlineButtons
|
|
BOOL bPlayMedalSound = TRUE
|
|
BOOL bIntroSkipped = FALSE
|
|
BOOL bReadyToWalk = TRUE
|
|
BOOL bBlowKiss = TRUE
|
|
|
|
//SC_LEADERBOARD_CONTROL_STRUCT sclbControl
|
|
END_SCREEN_DATASET esdEndScreen
|
|
//STREAMVOL_ID streamVolume
|
|
|
|
OBJECT_INDEX oiDumpsterOne
|
|
VECTOR vDumpsterOnePos = <<-1107.184082,-1170.246582,1.159090>>
|
|
VECTOR vDumpsterOneRot = <<0.01, -0.01, -44.69>>
|
|
OBJECT_INDEX oiDumpsterTwo
|
|
VECTOR vDumpsterTwoPos = <<-1105.14, -1171.53, 1.16>>
|
|
VECTOR vDumpsterTwoRot = <<-0.13, -0.21, -65.97>>
|
|
OBJECT_INDEX oiDumpsterThree
|
|
VECTOR vDumpsterThreePos = <<-928.308228,-1070.007935,1.155174>>
|
|
VECTOR vDumpsterThreeRot = <<-0.06, 0.07, -42.91>>
|
|
OBJECT_INDEX oiDumpsterFour
|
|
VECTOR vDumpsterFourPos = <<-1104.51, -1173.58, 1.15>>
|
|
VECTOR vDumpsterFourRot = <<0.00, 0.00, -46.41>>
|
|
|
|
|
|
// ===========================================================================================================
|
|
// Cleanup
|
|
// ===========================================================================================================
|
|
/// PURPOSE:
|
|
/// Cleans up the script
|
|
/// PARAMS:
|
|
/// b_delete_racers - should the AI racers be deleted?
|
|
PROC SCRIPT_CLEANUP(BOOL b_delete_racers)//, BOOL b_delete_second_place = TRUE)
|
|
|
|
IF sRaceHUD.iPlayerPosition = 1 OR sRaceHUD.iPlayerPosition = 2 OR sRaceHUD.iPlayerPosition = 3
|
|
SWITCH sRaceData.eRaceTrack
|
|
|
|
// Sea Races
|
|
CASE SEA_RACE_01
|
|
REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL (CP_MG_SNCA)
|
|
BREAK
|
|
CASE SEA_RACE_02
|
|
REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL (CP_MG_SSC)
|
|
BREAK
|
|
CASE SEA_RACE_03
|
|
REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL (CP_MG_SCAN)
|
|
BREAK
|
|
CASE SEA_RACE_04
|
|
REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL (CP_MG_SLOS)
|
|
BREAK
|
|
|
|
// Street Races
|
|
CASE STREET_RACE_01
|
|
REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL (CP_MG_SRLS)
|
|
BREAK
|
|
CASE STREET_RACE_02
|
|
REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL (CP_MG_SRCC)
|
|
BREAK
|
|
CASE STREET_RACE_04
|
|
REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL (CP_MG_SRAP)
|
|
BREAK
|
|
CASE STREET_RACE_05
|
|
REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL (CP_MG_SRFW)
|
|
BREAK
|
|
CASE STREET_RACE_06
|
|
REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL (CP_MG_SRVC)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF sRaceHUD.iPlayerPosition = 1 AND NOT g_savedGlobals.sStreetRaceData.bPhonecallDone
|
|
IF (IS_BIT_SET(g_savedGlobals.sStreetRaceData.iRaceWon, ENUM_TO_INT(STREET_RACE_LOS_SANTOS)) OR sRaceData.eRaceTrack = STREET_RACE_01)
|
|
AND (IS_BIT_SET(g_savedGlobals.sStreetRaceData.iRaceWon, ENUM_TO_INT(STREET_RACE_CITY_CIRCUIT)) OR sRaceData.eRaceTrack = STREET_RACE_02)
|
|
AND (IS_BIT_SET(g_savedGlobals.sStreetRaceData.iRaceWon, ENUM_TO_INT(STREET_RACE_AIRPORT)) OR sRaceData.eRaceTrack = STREET_RACE_04)
|
|
AND (IS_BIT_SET(g_savedGlobals.sStreetRaceData.iRaceWon, ENUM_TO_INT(STREET_RACE_FREEWAY)) OR sRaceData.eRaceTrack = STREET_RACE_05)
|
|
AND (IS_BIT_SET(g_savedGlobals.sStreetRaceData.iRaceWon, ENUM_TO_INT(STREET_RACE_VESPUCCI_CANALS)) OR sRaceData.eRaceTrack = STREET_RACE_06)
|
|
IF REGISTER_CALL_FROM_CHARACTER_TO_PLAYER(CALL_RACES_DONE, CT_AMBIENT, BIT_FRANKLIN, CHAR_HAO, 3, 10000, 10000)
|
|
g_savedGlobals.sStreetRaceData.bPhonecallDone = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_STATIC_BLIP_CATEGORY_VISIBILITY(STATIC_BLIP_CATEGORY_SAVEHOUSE, TRUE)
|
|
SET_STATIC_BLIP_CATEGORY_VISIBILITY(STATIC_BLIP_CATEGORY_SHOP, TRUE)
|
|
|
|
// Release candidate ID
|
|
MISSION_OVER(sRaceData.iCandidateID)
|
|
MISSION_FLOW_CLEAR_DISPLAY_MISSION_TITLE()
|
|
|
|
SAFE_RELEASE_OBJECT(oiDumpsterOne)
|
|
SAFE_RELEASE_OBJECT(oiDumpsterTwo)
|
|
SAFE_RELEASE_OBJECT(oiDumpsterThree)
|
|
SAFE_RELEASE_OBJECT(oiDumpsterFour)
|
|
|
|
// Do common cleanup
|
|
RACE_CLEANUP(b_delete_racers)
|
|
SUPPRESS_LARGE_VEHICLES(FALSE)
|
|
SAFE_RELEASE_VEHICLE(viCityRaceCar)
|
|
CLEAR_RANK_REDICTION_DETAILS()
|
|
CLEANUP_SOCIAL_CLUB_LEADERBOARD(sclbControl)
|
|
|
|
IF sRaceData.eRaceType = RACETYPE_SEA
|
|
CLEAR_CUSTOM_RADIO_TRACK_LIST("RADIO_16_SILVERLAKE")
|
|
ENDIF
|
|
SET_AMBIENT_ZONE_STATE("AZ_DISTANT_VEHICLES_CITY_CENTRE", TRUE)
|
|
SET_AMBIENT_ZONE_STATE("AZ_COUNTRYSIDE_DISTANT_CARS_ZONE_01", TRUE)
|
|
SET_AMBIENT_ZONE_STATE("AZ_COUNTRYSIDE_DISTANT_CARS_ZONE_02", TRUE)
|
|
SET_AMBIENT_ZONE_STATE("AZ_COUNTRYSIDE_DISTANT_CARS_ZONE_03", TRUE)
|
|
|
|
// Cleanup race blip
|
|
SWITCH sRaceData.eRaceTrack
|
|
|
|
// Sea Races
|
|
CASE SEA_RACE_01
|
|
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_SEA_RACE1, FALSE)
|
|
SET_BIT(g_savedGlobals.sSeaRaceData.iRaceLeaveArea, ENUM_TO_INT(SEA_RACE_EAST))
|
|
BREAK
|
|
CASE SEA_RACE_02
|
|
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_SEA_RACE2, FALSE)
|
|
SET_BIT(g_savedGlobals.sSeaRaceData.iRaceLeaveArea, ENUM_TO_INT(SEA_RACE_NORTH))
|
|
BREAK
|
|
CASE SEA_RACE_03
|
|
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_SEA_RACE3, FALSE)
|
|
SET_BIT(g_savedGlobals.sSeaRaceData.iRaceLeaveArea, ENUM_TO_INT(SEA_RACE_CANYON))
|
|
BREAK
|
|
CASE SEA_RACE_04
|
|
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_SEA_RACE4, FALSE)
|
|
SET_BIT(g_savedGlobals.sSeaRaceData.iRaceLeaveArea, ENUM_TO_INT(SEA_RACE_CITY))
|
|
BREAK
|
|
|
|
// Street Races
|
|
CASE STREET_RACE_01
|
|
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_STREET_RACE1, FALSE)
|
|
SET_BIT(g_savedGlobals.sStreetRaceData.iRaceLeaveArea, ENUM_TO_INT(STREET_RACE_LOS_SANTOS))
|
|
BREAK
|
|
CASE STREET_RACE_02
|
|
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_STREET_RACE2, FALSE)
|
|
SET_BIT(g_savedGlobals.sStreetRaceData.iRaceLeaveArea, ENUM_TO_INT(STREET_RACE_CITY_CIRCUIT))
|
|
BREAK
|
|
CASE STREET_RACE_04
|
|
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_STREET_RACE4, FALSE)
|
|
SET_BIT(g_savedGlobals.sStreetRaceData.iRaceLeaveArea, ENUM_TO_INT(STREET_RACE_AIRPORT))
|
|
BREAK
|
|
CASE STREET_RACE_05
|
|
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_STREET_RACE5, FALSE)
|
|
SET_BIT(g_savedGlobals.sStreetRaceData.iRaceLeaveArea, ENUM_TO_INT(STREET_RACE_FREEWAY))
|
|
BREAK
|
|
CASE STREET_RACE_06
|
|
SET_STATIC_BLIP_ACTIVE_STATE(STATIC_BLIP_MINIGAME_STREET_RACE6, FALSE)
|
|
SET_BIT(g_savedGlobals.sStreetRaceData.iRaceLeaveArea, ENUM_TO_INT(STREET_RACE_VESPUCCI_CANALS))
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
CLEAR_ADDITIONAL_TEXT(MISSION_TEXT_SLOT, TRUE)
|
|
|
|
WAIT(1000)
|
|
|
|
ENABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_VEH_CIN_CAM)
|
|
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
|
|
|
|
// Reseting this here, in case MG_UPDATE_FAIL_SPLASH_SCREEN failed to cleanup. (Very important this gets reset)
|
|
SET_NO_LOADING_SCREEN(FALSE)
|
|
|
|
SET_DEFAULT_RICH_PRESENCE_FOR_SP()
|
|
|
|
// End race script
|
|
TERMINATE_THIS_THREAD()
|
|
ENDPROC
|
|
|
|
// ===========================================================================================================
|
|
// Debug
|
|
// ===========================================================================================================
|
|
#IF IS_DEBUG_BUILD
|
|
|
|
/// PURPOSE: Check for Forced Pass or Fail
|
|
PROC DEBUG_Check_Debug_Keys()
|
|
|
|
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S))
|
|
CLEAR_PRINTS()
|
|
SAFE_RACE_FADE_IN()
|
|
END_RACE_CUTSCENE()
|
|
CHECK_FOR_TRACK_UNLOCK()
|
|
SCRIPT_CLEANUP(FALSE)
|
|
|
|
ELIF(IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
|
|
CLEAR_PRINTS()
|
|
SAFE_RACE_FADE_IN()
|
|
END_RACE_CUTSCENE()
|
|
SCRIPT_CLEANUP(FALSE)
|
|
ENDIF
|
|
ENDPROC
|
|
#ENDIF
|
|
|
|
/// PURPOSE:
|
|
/// Creates a car in a City Race (Street Race 2) driveway
|
|
/// This is needed to stop AI racers crashing into a driveway...
|
|
PROC CREATE_CITY_RACE_CAR()
|
|
IF bCreateCar AND sRaceData.eRaceTrack = STREET_RACE_02
|
|
INT iCurrentWaypoint
|
|
WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(sRaceWaypointRecording, GET_ENTITY_COORDS(PLAYER_PED_ID()), iCurrentWaypoint)
|
|
IF iCurrentWaypoint > 50 AND iCurrentWaypoint < 70
|
|
IF NOT DOES_ENTITY_EXIST(viCityRaceCar)
|
|
REQUEST_MODEL(BALLER)
|
|
IF HAS_MODEL_LOADED(BALLER)
|
|
viCityRaceCar = CREATE_VEHICLE(Baller, <<-1080.727661,454.448883,76.541245>>, -32.274254)
|
|
ENDIF
|
|
ENDIF
|
|
ELIF iCurrentWaypoint > 90
|
|
IF DOES_ENTITY_EXIST(viCityRaceCar)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(baller)
|
|
SAFE_RELEASE_VEHICLE(viCityRaceCar)
|
|
bCreateCar = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Creates some dumpsters near the canals in city race six
|
|
/// This is needed to stop AI racers driving into the canal...
|
|
PROC CREATE_CANAL_DUMPSTERS()
|
|
IF sRaceData.eRaceTrack = STREET_RACE_06
|
|
IF HAS_MODEL_LOADED(prop_dumpster_02a)
|
|
IF NOT DOES_ENTITY_EXIST(oiDumpsterOne)
|
|
oiDumpsterOne = CREATE_OBJECT( prop_dumpster_02a ,vDumpsterOnePos)
|
|
SET_ENTITY_ROTATION (oiDumpsterOne, vDumpsterOneRot)
|
|
FREEZE_ENTITY_POSITION(oiDumpsterOne, TRUE)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(oiDumpsterTwo)
|
|
oiDumpsterTwo = CREATE_OBJECT( prop_dumpster_02a ,vDumpsterTwoPos)
|
|
SET_ENTITY_ROTATION (oiDumpsterTwo, vDumpsterTwoRot)
|
|
FREEZE_ENTITY_POSITION(oiDumpsterTwo, TRUE)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(oiDumpsterThree)
|
|
oiDumpsterThree = CREATE_OBJECT( prop_dumpster_02a ,vDumpsterThreePos)
|
|
SET_ENTITY_ROTATION (oiDumpsterThree, vDumpsterThreeRot)
|
|
FREEZE_ENTITY_POSITION(oiDumpsterThree, TRUE)
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(oiDumpsterFour)
|
|
oiDumpsterFour = CREATE_OBJECT( prop_dumpster_02a ,vDumpsterFourPos)
|
|
SET_ENTITY_ROTATION (oiDumpsterFour, vDumpsterFourRot)
|
|
FREEZE_ENTITY_POSITION(oiDumpsterFour, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// ===========================================================================================================
|
|
// Race States
|
|
// ===========================================================================================================
|
|
/// PURPOSE: Faded start
|
|
/*PROC RACE_SETUP()
|
|
|
|
UPDATE_MISSION_NAME_DISPLAYING(emptyTextLabel, FALSE, FALSE, FALSE, FALSE, iRaceID)
|
|
|
|
SWITCH eRaceSubState
|
|
|
|
CASE RACE_SUBSTATE_SETUP
|
|
|
|
// Fade out screen and setup systems for cutscene
|
|
CPRINTLN(DEBUG_MISSION, "Mission Race: RACE_SETUP")
|
|
SAFE_RACE_FADE_OUT()
|
|
START_RACE_CUTSCENE()
|
|
eRaceSubState = RACE_SUBSTATE_RUNNING
|
|
BREAK
|
|
|
|
CASE RACE_SUBSTATE_RUNNING
|
|
|
|
// Setup vehicles
|
|
SETUP_PLAYER_COUNTDOWN()
|
|
SETUP_AI_RACERS()
|
|
|
|
IF sRaceData.eRaceType = RACETYPE_CAR OR sRaceData.eRaceType = RACETYPE_BIKE
|
|
VECTOR behind_pos
|
|
behind_pos = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(sTrackData.vStartGrid[sTrackData.iNumAIRacers], sTrackData.fStartGrid[sTrackData.iNumAIRacers], <<0.0, -15.0, 0.0>>)
|
|
SET_ENTITY_COORDS(sPlayerVehicle.vehPlayerVehicle, behind_pos)
|
|
SET_ENTITY_HEADING(sPlayerVehicle.vehPlayerVehicle, sTrackData.fStartGrid[sTrackData.iNumAIRacers])
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(sPlayerVehicle.vehPlayerVehicle)
|
|
BRING_VEHICLE_TO_HALT(sPlayerVehicle.vehPlayerVehicle, 0, 2)
|
|
ENDIF
|
|
|
|
// Race information has been collected from the cloud
|
|
eRaceSubState = RACE_SUBSTATE_CLEANUP
|
|
BREAK
|
|
|
|
CASE RACE_SUBSTATE_CLEANUP
|
|
|
|
// Head over to the grid lineup
|
|
eRaceState = RACE_STATE_LINEUP
|
|
eRaceSubState = RACE_SUBSTATE_SETUP
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC*/
|
|
|
|
/// PURPOSE:
|
|
/// Restarts the race
|
|
PROC RESTART_RACE(BOOL bFromPass = TRUE)
|
|
IF bFromPass
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
SAFE_FADE_SCREEN_OUT_TO_BLACK(500, FALSE)
|
|
ELSE
|
|
SAFE_FADE_SCREEN_OUT_TO_BLACK()
|
|
ENDIF
|
|
|
|
// B*2259879 - Clear Vehicles
|
|
IF sRaceData.eRaceType = RACETYPE_BIKE
|
|
CPRINTLN(DEBUG_MISSION, "Street Race: CLEANING UP VEHICLES FOR B*2259879")
|
|
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 50.0)
|
|
SAFE_DELETE_VEHICLE(sPlayerVehicle.vehPlayerVehicle)
|
|
SAFE_REMOVE_BLIP(sPlayerVehicle.biPlayerVehicle)
|
|
ENDIF
|
|
|
|
VEHICLE_INDEX viTemp
|
|
IF sRaceData.eRaceType = RACETYPE_CAR
|
|
IF NOT IS_PLAYER_IN_SUITABLE_RACE_CAR()
|
|
CREATE_VEHICLE_FOR_REPLAY(viTemp, GET_ENTITY_COORDS(PLAYER_PED_ID()), 0, TRUE, TRUE, FALSE, FALSE, TRUE, BUFFALO)
|
|
sPlayerVehicle.vehPlayerVehicle = viTemp
|
|
ENDIF
|
|
ELIF sRaceData.eRaceType = RACETYPE_BIKE
|
|
IF NOT IS_PLAYER_ON_SUITABLE_BIKE()
|
|
CREATE_VEHICLE_FOR_REPLAY(viTemp, GET_ENTITY_COORDS(PLAYER_PED_ID()), 0, TRUE, TRUE, FALSE, FALSE, TRUE, BATI)
|
|
sPlayerVehicle.vehPlayerVehicle = viTemp
|
|
ENDIF
|
|
ELIF sRaceData.eRaceType = RACETYPE_SEA
|
|
IF NOT IS_PLAYER_IN_SUITABLE_SEA_VEHICLE()
|
|
CREATE_VEHICLE_FOR_REPLAY(viTemp, GET_ENTITY_COORDS(PLAYER_PED_ID()), 0, TRUE, TRUE, FALSE, FALSE, TRUE, SEASHARK)
|
|
sPlayerVehicle.vehPlayerVehicle = viTemp
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CLEAR_AREA_OF_PROJECTILES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 100.0)
|
|
STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 100.0)
|
|
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0)
|
|
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
|
|
|
|
sRaceHUD.iCurrentCheckPoint = 0
|
|
|
|
CLEANUP_CHECKPOINTS()
|
|
CLEANUP_RACERS(TRUE)
|
|
SAFE_DELETE_PED(piRewardPed)
|
|
RACE_INIT()
|
|
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), sTrackData.vStartGrid[sTrackData.iNumAIRacers])
|
|
NEW_LOAD_SCENE_START_SPHERE(sTrackData.vStartGrid[sTrackData.iNumAIRacers], 500)
|
|
BOOL bWaiting = TRUE
|
|
INT iLoadFailTime = GET_GAME_TIMER() + 30000
|
|
WHILE bWaiting
|
|
IF IS_NEW_LOAD_SCENE_LOADED()
|
|
bWaiting = FALSE
|
|
ENDIF
|
|
IF GET_GAME_TIMER() > iLoadFailTime
|
|
bWaiting = FALSE
|
|
ENDIF
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
SETUP_PLAYER_PRECUTSCENE()
|
|
|
|
SETUP_AI_RACERS()
|
|
WAIT(1000) // Waiting for a while after creating the racers so their wheels have time to load in and seasharks are positioned correctly on the water
|
|
SETUP_PLAYER_COUNTDOWN()
|
|
START_RACE_CUTSCENE()
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
WAIT(0)
|
|
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 500.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
sRaceHUD.uiCountdown.iBitFlags = 0
|
|
|
|
INT i_index
|
|
FOR i_index = 0 TO sTrackData.iNumAIRacers-1
|
|
IF IS_PED_UNINJURED(sRacer[i_index].piDriver)
|
|
CLEAR_PED_TASKS(sRacer[i_index].piDriver)
|
|
ENDIF
|
|
IF IS_VEHICLE_OK(sRacer[i_index].viCar)
|
|
BRING_VEHICLE_TO_HALT(sRacer[i_index].viCar, 0.1, 1)
|
|
SET_ENTITY_COORDS_GROUNDED(sRacer[i_index].viCar, sTrackData.vStartGrid[i_index])
|
|
SET_ENTITY_HEADING(sRacer[i_index].viCar, sTrackData.fStartGrid[i_index])
|
|
ENDIF
|
|
ENDFOR
|
|
WAIT(500) // Waiting a while after this so vehicles are positioned properly
|
|
|
|
IF sRaceData.eRaceTrack = STREET_RACE_02
|
|
WAIT(1000) // Wait an extra second for street race 2 as the player can be a long distance away
|
|
ENDIF
|
|
|
|
SAFE_FADE_SCREEN_IN_FROM_BLACK()
|
|
|
|
START_AUDIO_SCENE("RACE_INTRO_GENERIC")
|
|
|
|
RESTART_TIMER_NOW(sRaceHUD.uiCountdown.CountdownTimer)
|
|
ENABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_VEH_CIN_CAM)
|
|
ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
|
|
eRaceState = RACE_STATE_COUNTDOWN
|
|
eRaceSubState = RACE_SUBSTATE_SETUP
|
|
ENDPROC
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
/// PURPOSE:
|
|
/// Debug skip back to the lineup state
|
|
PROC P_SKIP_TO_LINEUP()
|
|
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P))
|
|
CLEANUP_RACERS(TRUE)
|
|
SAFE_DELETE_PED(piGridGirlOne)
|
|
SAFE_DELETE_PED(piGridGirlTwo)
|
|
SAFE_DELETE_PED(piGridGirlThree)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
INT i_index = 0
|
|
REPEAT COUNT_OF(gridCamera) i_index
|
|
IF DOES_CAM_EXIST(gridCamera[i_index])
|
|
DESTROY_CAM(gridCamera[i_index])
|
|
ENDIF
|
|
ENDREPEAT
|
|
WAIT(0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
eRaceState = RACE_STATE_LINEUP
|
|
eRaceSubState = RACE_SUBSTATE_SETUP
|
|
ENDIF
|
|
ENDPROC
|
|
#ENDIF
|
|
|
|
/// PURPOSE: Shows racers on the starting grid
|
|
PROC RACE_LINEUP()
|
|
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
UPDATE_MISSION_NAME_DISPLAYING(emptyTextLabel, FALSE, FALSE, FALSE, FALSE, iRaceID)
|
|
|
|
CREATE_CANAL_DUMPSTERS()
|
|
|
|
GET_RACE_BEST_TIMES(sRaceData.eRaceTrack)
|
|
|
|
INT i_index = 0
|
|
|
|
SWITCH eRaceSubState
|
|
|
|
CASE RACE_SUBSTATE_SETUP
|
|
|
|
SET_STATIC_BLIP_CATEGORY_VISIBILITY(STATIC_BLIP_CATEGORY_SAVEHOUSE, FALSE)
|
|
SET_STATIC_BLIP_CATEGORY_VISIBILITY(STATIC_BLIP_CATEGORY_SHOP, FALSE)
|
|
|
|
IF IS_PLAYER_ONLINE()
|
|
SC_LEADERBOARD_CACHE_CLEAR_ALL()
|
|
ENDIF
|
|
|
|
PLAY_INTRO_SOUND(FALSE)
|
|
|
|
//IF sRaceData.eRaceType = RACETYPE_CAR OR sRaceData.eRaceType = RACETYPE_BIKE
|
|
// SETUP_PLAYER_COUNTDOWN()
|
|
/*VECTOR behind_pos
|
|
behind_pos = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(sTrackData.vStartGrid[sTrackData.iNumAIRacers], sTrackData.fStartGrid[sTrackData.iNumAIRacers], <<0.0, -15.0, 0.0>>)
|
|
SET_ENTITY_COORDS_GROUNDED(sPlayerVehicle.vehPlayerVehicle, behind_pos)
|
|
SET_ENTITY_HEADING(sPlayerVehicle.vehPlayerVehicle, sTrackData.fStartGrid[sTrackData.iNumAIRacers])
|
|
//SET_VEHICLE_ON_GROUND_PROPERLY(sPlayerVehicle.vehPlayerVehicle)
|
|
BRING_VEHICLE_TO_HALT(sPlayerVehicle.vehPlayerVehicle, 0, 2)*/
|
|
//ENDIF
|
|
/*IF sRaceData.eRaceType = RACETYPE_BIKE
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
GIVE_PED_HELMET(PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF*/
|
|
SETUP_PLAYER_PRECUTSCENE()
|
|
//WAIT(0)
|
|
|
|
START_AUDIO_SCENE("RACE_INTRO_GENERIC")
|
|
SET_AMBIENT_ZONE_STATE("AZ_DISTANT_VEHICLES_CITY_CENTRE", FALSE)
|
|
SET_AMBIENT_ZONE_STATE("AZ_COUNTRYSIDE_DISTANT_CARS_ZONE_01", FALSE)
|
|
SET_AMBIENT_ZONE_STATE("AZ_COUNTRYSIDE_DISTANT_CARS_ZONE_02", FALSE)
|
|
SET_AMBIENT_ZONE_STATE("AZ_COUNTRYSIDE_DISTANT_CARS_ZONE_03", FALSE)
|
|
|
|
REQUEST_ADDITIONAL_TEXT("HAO1", MISSION_TEXT_SLOT)
|
|
|
|
// Start cutscene
|
|
START_RACE_CUTSCENE()
|
|
|
|
SET_CELLPHONE_PROFILE_TO_NORMAL()
|
|
|
|
// Fade out screen and setup systems for cutscene
|
|
CPRINTLN(DEBUG_MISSION, "Street Race: RACE_SETUP")
|
|
|
|
// Removed for B* 1453786 at advice of systems code
|
|
//streamVolume = STREAMVOL_CREATE_FRUSTUM(vStartPos, vStartRot, 100, FLAG_MAPDATA)
|
|
|
|
CREATE_RACE_CAMERAS()
|
|
|
|
//ANIMPOSTFX_STOP("SwitchSceneNeutral")
|
|
ANIMPOSTFX_PLAY("SwitchSceneFranklin", 0, FALSE)
|
|
|
|
// Setup vehicles
|
|
SETUP_AI_RACERS()
|
|
|
|
// Setup the grid girls
|
|
SETUP_GRID_GIRLS()
|
|
|
|
bPlayedIntroSound = FALSE
|
|
bIntroSkipped = FALSE
|
|
|
|
IF IS_VEHICLE_OK(sPlayerVehicle.vehPlayerVehicle)
|
|
IF sRaceData.eRaceType = RACETYPE_SEA
|
|
//PREPARE_MUSIC_EVENT("MGSR_START")
|
|
//SET_VEH_RADIO_STATION(sPlayerVehicle.vehPlayerVehicle, "RADIO_16_SILVERLAKE")
|
|
SET_RADIO_TO_STATION_NAME("RADIO_16_SILVERLAKE")
|
|
FREEZE_RADIO_STATION("RADIO_16_SILVERLAKE")
|
|
CPRINTLN(DEBUG_MISSION, "About to set custom radio track list")
|
|
SET_CUSTOM_RADIO_TRACK_LIST("RADIO_16_SILVERLAKE", "SEA_RACE_RADIO_PLAYLIST", TRUE)
|
|
CPRINTLN(DEBUG_MISSION, "About to unfreeze radio station")
|
|
UNFREEZE_RADIO_STATION("RADIO_16_SILVERLAKE")
|
|
CPRINTLN(DEBUG_MISSION, "About to enable vehicle radio")
|
|
SET_VEHICLE_RADIO_ENABLED(sPlayerVehicle.vehPlayerVehicle, TRUE)
|
|
ELSE
|
|
//SET_VEH_RADIO_STATION(sPlayerVehicle.vehPlayerVehicle, "RADIO_07_DANCE_01")
|
|
SET_RADIO_TO_STATION_NAME("RADIO_07_DANCE_01")
|
|
ENDIF
|
|
SET_FRONTEND_RADIO_ACTIVE(true)
|
|
ENDIF
|
|
|
|
/*WAIT(0)
|
|
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND IS_VEHICLE_OK(sPlayerVehicle.vehPlayerVehicle)
|
|
VECTOR targetPos
|
|
FLOAT fSpeed
|
|
targetPos = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(sTrackData.vStartGrid[sTrackData.iNumAIRacers], sTrackData.fStartGrid[sTrackData.iNumAIRacers], <<0.0, 2.3, 0.0>>)
|
|
fSpeed = 3.0
|
|
SET_VEHICLE_FORWARD_SPEED(sPlayerVehicle.vehPlayerVehicle, fSpeed)
|
|
TASK_VEHICLE_DRIVE_TO_COORD(PLAYER_PED_ID(), sPlayerVehicle.vehPlayerVehicle, targetPos, fSpeed, DRIVINGSTYLE_NORMAL, GET_ENTITY_MODEL(sPlayerVehicle.vehPlayerVehicle), DF_ForceStraightLine|DRIVINGMODE_PLOUGHTHROUGH, 0.5, 15.0)
|
|
ENDIF*/
|
|
|
|
eRaceSubState = RACE_SUBSTATE_RUNNING
|
|
BREAK
|
|
|
|
CASE RACE_SUBSTATE_RUNNING
|
|
|
|
// Camera running?
|
|
IF CONTROL_RACE_CAMERAS()
|
|
SET_GRID_GIRLS_FOR_COUNTDOWN(0.32)
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
ENDIF
|
|
// Got to race countdown
|
|
eRaceState = RACE_STATE_COUNTDOWN
|
|
eRaceSubState = RACE_SUBSTATE_SETUP
|
|
ENDIF
|
|
|
|
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
|
|
SAFE_FADE_SCREEN_OUT_TO_BLACK()
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
bIntroSkipped = TRUE
|
|
SAFE_DELETE_PED(piGridGirlTwo)
|
|
SAFE_DELETE_PED(piGridGirlThree)
|
|
//WAIT(1000)
|
|
eRaceSubState = RACE_SUBSTATE_CLEANUP
|
|
ENDIF
|
|
|
|
IF sRaceData.eRaceTrack = STREET_RACE_06
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_PreventGoingIntoStillInVehicleState, TRUE)
|
|
ENDIF
|
|
FOR i_index = 0 TO sTrackData.iNumAIRacers-1
|
|
IF IS_PED_UNINJURED(sRacer[i_index].piDriver)
|
|
SET_PED_RESET_FLAG(sRacer[i_index].piDriver, PRF_PreventGoingIntoStillInVehicleState, TRUE)
|
|
ENDIF
|
|
ENDFOR
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE RACE_SUBSTATE_CLEANUP
|
|
|
|
IF sRaceData.eRaceType = RACETYPE_SEA
|
|
SETUP_PLAYER_COUNTDOWN()
|
|
ENDIF
|
|
SET_GRID_GIRLS_FOR_COUNTDOWN(0.27)
|
|
|
|
// Removed for B* 1453786 at advice of systems code
|
|
//STREAMVOL_DELETE(streamVolume)
|
|
|
|
UPDATE_RACE_CHECKPOINTS(FALSE)
|
|
|
|
// Set camera behind player
|
|
IF sRaceData.eRaceType = RACETYPE_SEA
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
WAIT(0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
ELSE
|
|
IF bIntroSkipped
|
|
SETUP_PLAYER_COUNTDOWN()
|
|
FOR i_index = 0 TO sTrackData.iNumAIRacers-1
|
|
IF IS_PED_UNINJURED(sRacer[i_index].piDriver)
|
|
CLEAR_PED_TASKS(sRacer[i_index].piDriver)
|
|
ENDIF
|
|
IF IS_VEHICLE_OK(sRacer[i_index].viCar)
|
|
BRING_VEHICLE_TO_HALT(sRacer[i_index].viCar, 0.1, 1)
|
|
SET_ENTITY_COORDS_GROUNDED(sRacer[i_index].viCar, sTrackData.vStartGrid[i_index])
|
|
SET_ENTITY_HEADING(sRacer[i_index].viCar, sTrackData.fStartGrid[i_index])
|
|
ENDIF
|
|
ENDFOR
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
WAIT(500)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
ELSE
|
|
//RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SAFE_FADE_SCREEN_IN_FROM_BLACK()
|
|
|
|
UPDATE_RACE_CHECKPOINTS(FALSE)
|
|
|
|
// Cleanup cameras
|
|
i_index = 0
|
|
REPEAT COUNT_OF(gridCamera) i_index
|
|
IF DOES_CAM_EXIST(gridCamera[i_index])
|
|
DESTROY_CAM(gridCamera[i_index])
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
//SET_GAMEPLAY_CAM_RELATIVE_PITCH()
|
|
//SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
|
|
// Got to race countdown
|
|
eRaceState = RACE_STATE_COUNTDOWN
|
|
eRaceSubState = RACE_SUBSTATE_SETUP
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
P_SKIP_TO_LINEUP()
|
|
#ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE: Countdown UI
|
|
PROC RACE_COUNTDOWN()
|
|
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
CREATE_CANAL_DUMPSTERS()
|
|
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
|
|
CONTROL_RACE_CAMERAS()
|
|
|
|
GET_RACE_BEST_TIMES(sRaceData.eRaceTrack)
|
|
|
|
SWITCH eRaceSubState
|
|
|
|
CASE RACE_SUBSTATE_SETUP
|
|
SAFE_FADE_SCREEN_IN_FROM_BLACK()
|
|
REQUEST_MINIGAME_COUNTDOWN_UI(sRaceHUD.uiCountdown)
|
|
REQUEST_SCRIPT_AUDIO_BANK("HUD_321_GO", TRUE)
|
|
bRacersReleased = FALSE
|
|
iBoostTimer = -1
|
|
eBoostState = BS_READY
|
|
CLEAR_BITMASK_AS_ENUM(sRaceHUD.uiCountdown.iBitFlags, CNTDWN_UI_Played_Go)
|
|
CLEAR_BITMASK_AS_ENUM(sRaceHUD.uiCountdown.iBitFlags, CNTDWN_UI_Played_1)
|
|
CLEAR_BITMASK_AS_ENUM(sRaceHUD.uiCountdown.iBitFlags, CNTDWN_UI_Played_2)
|
|
CLEAR_BITMASK_AS_ENUM(sRaceHUD.uiCountdown.iBitFlags, CNTDWN_UI_Played_3)
|
|
CANCEL_TIMER(sRaceHUD.uiCountdown.CountdownTimer)
|
|
|
|
// Request textures for the end of the race here
|
|
REQUEST_STREAMED_TEXTURE_DICT("MPHUD")
|
|
REQUEST_STREAMED_TEXTURE_DICT("SPROffroad")
|
|
REQUEST_STREAMED_TEXTURE_DICT("SHARED")
|
|
REQUEST_ADDITIONAL_TEXT("SP_SPR", MINIGAME_TEXT_SLOT)
|
|
uiLeaderboard[0] = REQUEST_SC_LEADERBOARD_UI()
|
|
sBigMessage.siMovie = REQUEST_MG_BIG_MESSAGE()
|
|
MG_INIT_FAIL_SPLASH_SCREEN(sFailSplash)
|
|
|
|
IF IS_VEHICLE_OK(sPlayerVehicle.vehPlayerVehicle) AND sRaceData.eRaceType <> RACETYPE_SEA
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
SET_VEHICLE_HANDBRAKE(sPlayerVehicle.vehPlayerVehicle, TRUE)
|
|
ENDIF
|
|
|
|
eRaceSubState = RACE_SUBSTATE_RUNNING
|
|
BREAK
|
|
|
|
CASE RACE_SUBSTATE_RUNNING
|
|
REQUEST_SCRIPT_AUDIO_BANK("HUD_321_GO", TRUE)
|
|
|
|
IF HAS_MINIGAME_COUNTDOWN_UI_LOADED(sRaceHUD.uiCountdown)
|
|
|
|
IF UPDATE_MINIGAME_COUNTDOWN_UI(sRaceHUD.uiCountdown, TRUE, FALSE, FALSE, 3, TRUE)
|
|
eRaceSubState = RACE_SUBSTATE_CLEANUP
|
|
ENDIF
|
|
|
|
// See B*929855 - allow racers to move as soon as "GO" appears
|
|
IF IS_BITMASK_AS_ENUM_SET(sRaceHUD.uiCountdown.iBitFlags, CNTDWN_UI_Played_Go)
|
|
IF iBoostTimer < 0
|
|
iBoostTimer = GET_GAME_TIMER() + BOOST_START_WINDOW
|
|
ENDIF
|
|
IF bRacersReleased = FALSE
|
|
bRacersReleased = TRUE
|
|
INIT_RACE_HUD()
|
|
STOP_AUDIO_SCENE("RACE_INTRO_GENERIC")
|
|
START_RACE_MIXER()
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
ENDIF
|
|
IF IS_VEHICLE_OK(sPlayerVehicle.vehPlayerVehicle)
|
|
IF sRaceData.eRaceType = RACETYPE_SEA
|
|
INT i_index
|
|
FOR i_index = 0 TO sTrackData.iNumAIRacers - 1
|
|
IF IS_VEHICLE_OK(sRacer[i_index].viCar)
|
|
SET_BOAT_ANCHOR(sRacer[i_index].viCar, FALSE)
|
|
ENDIF
|
|
ENDFOR
|
|
SET_BOAT_ANCHOR(sPlayerVehicle.vehPlayerVehicle, FALSE)
|
|
ELSE
|
|
SET_VEHICLE_HANDBRAKE(sPlayerVehicle.vehPlayerVehicle, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
//SET_FRONTEND_RADIO_ACTIVE(true)
|
|
CPRINTLN(DEBUG_MISSION, "Street Race: Starting race at game time ", GET_GAME_TIMER())
|
|
ENDIF
|
|
UPDATE_RACE_AI()
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE RACE_SUBSTATE_CLEANUP
|
|
|
|
CLEANUP_GRID_GIRLS()
|
|
|
|
// Release countdown timer
|
|
RELEASE_MINIGAME_COUNTDOWN_UI(sRaceHUD.uiCountdown)
|
|
|
|
// Enable controls and go to race!
|
|
END_RACE_CUTSCENE()
|
|
|
|
INT i_index
|
|
i_index = 0
|
|
REPEAT COUNT_OF(gridCamera) i_index
|
|
IF DOES_CAM_EXIST(gridCamera[i_index])
|
|
DESTROY_CAM(gridCamera[i_index])
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
// Update states
|
|
eRaceState = RACE_STATE_ACTIVE
|
|
eRaceSubState = RACE_SUBSTATE_SETUP
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
UPDATE_RACE_CHECKPOINTS(FALSE)
|
|
HANDLE_START_BOOST()
|
|
CHECK_PLAYER_SHOOTING_IN_COUNTDOWN()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
P_SKIP_TO_LINEUP()
|
|
#ENDIF
|
|
ENDPROC
|
|
|
|
FUNC BOOL RIVALS_FINISHED()
|
|
IF iRaceFailTimeout < 0
|
|
INT i_index
|
|
FOR i_index = 0 TO sTrackData.iNumAIRacers-1
|
|
IF sRacer[i_index].iCurrentLap > sTrackData.iNumLaps
|
|
iRaceFailTimeout = GET_GAME_TIMER() + 120000
|
|
ENDIF
|
|
ENDFOR
|
|
ENDIF
|
|
|
|
IF iRaceFailTimeout > 0
|
|
IF GET_GAME_TIMER() > iRaceFailTimeout
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE: Handles the main race
|
|
PROC RACE_ACTIVE()
|
|
|
|
HIDE_STREET_AND_CAR_NAMES_THIS_FRAME()
|
|
|
|
DISABLE_SELECTOR_THIS_FRAME()
|
|
|
|
GET_RACE_BEST_TIMES(sRaceData.eRaceTrack)
|
|
|
|
IF sRaceData.eRaceTrack = STREET_RACE_02
|
|
IF (sRaceHUD.iCurrentCheckPoint > 7 AND sRaceHUD.iCurrentCheckPoint < 17) OR (sRaceHUD.iCurrentLap = 1 AND sRaceHUD.iCurrentCheckPoint < 2)
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
ELIF sRaceHUD.iCurrentCheckPoint < 8
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.4)
|
|
ELSE
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.1)
|
|
ENDIF
|
|
ELSE
|
|
IF sRaceHUD.iCurrentLap = 1 AND sRaceHUD.iCurrentCheckPoint < 3
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
ELSE
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.1)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH eRaceSubState
|
|
|
|
CASE RACE_SUBSTATE_SETUP
|
|
CPRINTLN(DEBUG_MISSION, "Mission Race: RACE_UPDATE")
|
|
|
|
IF sRaceData.eRaceType = RACETYPE_SEA
|
|
STOP_SOUND(iIntroSound)
|
|
RELEASE_SCRIPT_AUDIO_BANK()
|
|
/*ELSE
|
|
STOP_STREAM()*/
|
|
ENDIF
|
|
|
|
// Used for respawning the player's car if it become stuck
|
|
racesRespawnState = RACES_RESPAWN_SET
|
|
iPlayerWantsToRecoverVehicleTimer = -1
|
|
|
|
// Set the start time for the oddjob
|
|
iMissionStartTime = GET_GAME_TIMER()
|
|
|
|
iRaceFailTimeout = -1
|
|
|
|
INIT_STOPPED_SOUND()
|
|
|
|
bCreateCar = TRUE
|
|
|
|
UPDATE_RACE_CHECKPOINTS()
|
|
|
|
iPreviousPosition = sRaceHUD.iPlayerPosition
|
|
iPositionConvTimer = GET_GAME_TIMER() + POSITION_CONV_TIME
|
|
|
|
IF sRaceData.eRaceType <> RACETYPE_SEA AND g_savedGlobals.sStreetRaceData.iSlipstreamHelpCount < 3
|
|
//ADD_HELP_TO_FLOW_QUEUE("FM_IHELP_SLP", FHP_HIGH) // You can slipstream by driving close behind another racer. This will give you a speed boost.
|
|
PRINT_HELP("FM_IHELP_SLP") // You can slipstream by driving close behind another racer. This will give you a speed boost.
|
|
g_savedGlobals.sStreetRaceData.iSlipstreamHelpCount++
|
|
ENDIF
|
|
|
|
eRaceSubState = RACE_SUBSTATE_RUNNING
|
|
BREAK
|
|
|
|
CASE RACE_SUBSTATE_RUNNING
|
|
|
|
UPDATE_RACE_AI()
|
|
UPDATE_PLAYER_POS()
|
|
//CAM_HINT_FOR_NEXT_CAR()
|
|
UPDATE_RACE_HUD()
|
|
CHECK_RACE_CONVS()
|
|
CREATE_CITY_RACE_CAR()
|
|
|
|
IF iReplayRecordWarpTimer > GET_GAME_TIMER()
|
|
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() //Fix for bug 2226208
|
|
ENDIF
|
|
|
|
IF RIVALS_FINISHED()
|
|
CPRINTLN(DEBUG_MISSION, "Mission Race: Rivals finished a while back so abandoning race")
|
|
failReason = FAIL_ABANDONED_RACE
|
|
eRaceState = RACE_STATE_FAIL
|
|
eRaceSubState = RACE_SUBSTATE_SETUP
|
|
ENDIF
|
|
|
|
IF IS_PLAYER_IN_VEHICLE()
|
|
AND UPDATE_RACE_CHECKPOINTS()
|
|
IF sRaceData.eRaceType = RACETYPE_SEA
|
|
//TRIGGER_MUSIC_EVENT("MGSR_STOP")
|
|
CLEAR_CUSTOM_RADIO_TRACK_LIST("RADIO_16_SILVERLAKE")
|
|
STOP_AUDIO_SCENE("SEA_RACE_DURING_RACE")
|
|
START_AUDIO_SCENE("SEA_RACES_OUTRO")
|
|
ELSE
|
|
STOP_AUDIO_SCENE("STREET_RACE_DURING_RACE")
|
|
START_AUDIO_SCENE("STREET_RACE_OUTRO")
|
|
ENDIF
|
|
|
|
// create the white version of the finish blip for race over
|
|
INT iR, iG, iB, iA
|
|
VECTOR currentCheckpoint
|
|
currentCheckpoint = sTrackData.vCheckPoint[sTrackData.iNumCheckpoints - 1]
|
|
GET_HUD_COLOUR(HUD_COLOUR_WHITE, iR, iG, iB, iA)
|
|
IF ciPreviousCheckPoint != NULL
|
|
DELETE_CHECKPOINT(ciPreviousCheckPoint)
|
|
ENDIF
|
|
ciPreviousCheckPoint = CREATE_CHECKPOINT(CHECKPOINT_RACE_GROUND_FLAG,(currentCheckpoint+<<0,0,fCheckpointDrawSize>>), sTrackData.vCheckPoint[0], (CHECKPOINT_VISUAL_SIZE * CHECKPOINT_VISUAL_SIZE_MODIFIER), iR, iG, iB, 180)
|
|
eRaceSubState = RACE_SUBSTATE_CLEANUP
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE RACE_SUBSTATE_CLEANUP
|
|
PLAYER_INDEX piPlayer
|
|
piPlayer = GET_PLAYER_INDEX()
|
|
IF IS_PLAYER_PLAYING(piPlayer)
|
|
IF IS_SPECIAL_ABILITY_ACTIVE(piPlayer)
|
|
SPECIAL_ABILITY_DEACTIVATE(piPlayer)
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_PHONE_ONSCREEN()
|
|
HANG_UP_AND_PUT_AWAY_PHONE()
|
|
ENDIF
|
|
|
|
CLEANUP_RACER_BLIPS()
|
|
|
|
eRaceState = RACE_STATE_END
|
|
eRaceSubState = RACE_SUBSTATE_SETUP
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
HANDLE_START_BOOST()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
P_SKIP_TO_LINEUP()
|
|
#ENDIF
|
|
ENDPROC
|
|
|
|
PROC GIVE_PLAYER_WINNINGS()
|
|
// Give the player their winnings, sea races don't have fees or prizes
|
|
IF sRaceData.eRaceType <> RACETYPE_SEA
|
|
FLOAT fRaceFee
|
|
fRaceFee = TO_FLOAT(sRaceData.iRaceFee)
|
|
IF sRaceHUD.iPlayerPosition = 1
|
|
fRaceFee*=4.5
|
|
CREDIT_BANK_ACCOUNT(CHAR_FRANKLIN, BAAC_UNLOGGED_SMALL_ACTION, ROUND(fRaceFee))
|
|
ELIF sRaceHUD.iPlayerPosition = 2
|
|
CREDIT_BANK_ACCOUNT(CHAR_FRANKLIN, BAAC_UNLOGGED_SMALL_ACTION, ROUND(fRaceFee))
|
|
ELIF sRaceHUD.iPlayerPosition = 3
|
|
fRaceFee*=0.5
|
|
CREDIT_BANK_ACCOUNT(CHAR_FRANKLIN, BAAC_UNLOGGED_SMALL_ACTION, ROUND(fRaceFee))
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNC BOOL RANK_PREDICT_DONE()
|
|
IF IS_PLAYER_ONLINE() AND NETWORK_HAVE_ONLINE_PRIVILEGES() AND sclbControl.ReadDataStruct.m_LeaderboardId > 0
|
|
IF scLB_rank_predict.bFinishedRead
|
|
AND NOT scLB_rank_predict.bFinishedWrite
|
|
INIT_RACE_LEADERBOARD(sRaceData.eRaceTrack, sRaceHUD.iPlayerPosition, iFinalRaceTime, sRaceHUD.iBestTime, sPlayerVehicle.vehPlayerVehicle)
|
|
scLB_rank_predict.bFinishedWrite = TRUE
|
|
ENDIF
|
|
IF GET_RANK_PREDICTION_DETAILS(sclbControl)
|
|
sclb_useRankPrediction = TRUE
|
|
RETURN TRUE
|
|
ENDIF
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE: Race has been completed
|
|
PROC RACE_END()
|
|
//VEHICLE_INDEX viPlayer
|
|
|
|
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_PAUSE_ALTERNATE) // B*2239651 - Disabling pause_alternate during end screens (to avoid clash when exiting leaderboards)
|
|
|
|
HIDE_STREET_AND_CAR_NAMES_THIS_FRAME()
|
|
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
SWITCH eRaceSubState
|
|
|
|
CASE RACE_SUBSTATE_SETUP
|
|
CPRINTLN(DEBUG_MISSION, "Mission Race: RACE_END")
|
|
REQUEST_LOAD_MODEL(A_F_Y_Genhot_01)
|
|
REQUEST_ANIM_DICT(sAnimDict)
|
|
//eRaceSubState = RACE_SUBSTATE_RUNNING
|
|
//INIT_RACE_RESULTS(mptRaceResultPlacement)
|
|
//SETUP_SOCIAL_CLUB_LEADERBOARD_READ_DATA(sclbControl, FMMC_TYPE_RACE, "", "", ciRACE_SUB_TYPE_STANDARD, sTrackData.iNumLaps)
|
|
iFinalRaceTime = GET_GAME_TIMER() - sRaceHUD.iStartTime
|
|
//iEndScreenTimer = GET_GAME_TIMER() + END_SCREEN_TIME
|
|
iQuitDelayTimer = -1
|
|
iLoadLeaderboardTimer = GET_GAME_TIMER() + 1000
|
|
bSetupLeaderboard = TRUE
|
|
bDrawLeaderboard = FALSE
|
|
bWaitToShowProfile = FALSE
|
|
bPlayMedalSound = TRUE
|
|
IF sTrackData.iNumLaps < 2
|
|
// If this was a single lap or point to point race, make the best time equal to the full race time
|
|
sRaceHUD.iBestTime = iFinalRaceTime
|
|
ENDIF
|
|
CLEAR_HELP()
|
|
bAllowLeaderboard = TRUE
|
|
SETUP_RACE_LEADERBOARD(sRaceData.eRaceTrack)
|
|
//INIT_RACE_LEADERBOARD(sRaceData.eRaceTrack, sRaceHUD.iPlayerPosition, iFinalRaceTime, sRaceHUD.iBestTime, sPlayerVehicle.vehPlayerVehicle)
|
|
INIT_RESULT_SCREEN_BUTTONS(sRaceResults)
|
|
bOnlineButtons = IS_PLAYER_ONLINE()
|
|
//INIT_SIMPLE_USE_CONTEXT(sLeaderboardContext, FALSE)
|
|
//ADD_SIMPLE_USE_CONTEXT_INPUT(sLeaderboardContext, "HUD_INPUT43", FRONTEND_CONTROL, INPUT_FRONTEND_LEADERBOARD)
|
|
INIT_RACE_RESULTS(esdEndScreen, sRaceData.eRaceTrack, sRaceHUD.iPlayerPosition, sTrackData.iNumAIRacers+1, iFinalRaceTime)//, sRaceHUD.iBestTime)
|
|
|
|
/*IF sRaceData.eRaceType = RACETYPE_SEA AND IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
viPlayer = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
IF IS_VEHICLE_OK(viPlayer)
|
|
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(viPlayer, 20.0)
|
|
SET_BOAT_ANCHOR(viPlayer, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF*/
|
|
|
|
// url:bugstar:7104254 - Double check the vehicle engine/petrol tank isn't on fire so we can proceed, if damaged repair it.
|
|
IF GET_VEHICLE_ENGINE_HEALTH(sPlayerVehicle.vehPlayerVehicle) <= 0.0
|
|
OR GET_VEHICLE_PETROL_TANK_HEALTH(sPlayerVehicle.vehPlayerVehicle) <= 0.0
|
|
SET_VEHICLE_ENGINE_HEALTH(sPlayerVehicle.vehPlayerVehicle, 800.0)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(sPlayerVehicle.vehPlayerVehicle, 800.0)
|
|
STOP_ENTITY_FIRE(sPlayerVehicle.vehPlayerVehicle)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_OK(sPlayerVehicle.vehPlayerVehicle)
|
|
SET_VEHICLE_STOP_INSTANTLY_WHEN_PLAYER_INACTIVE(sPlayerVehicle.vehPlayerVehicle, FALSE)
|
|
ENDIF
|
|
PLAYER_INDEX piPlayer
|
|
piPlayer = GET_PLAYER_INDEX()
|
|
IF IS_PLAYER_PLAYING(piPlayer)
|
|
SET_PLAYER_CONTROL(piPlayer, FALSE)
|
|
ENDIF
|
|
|
|
IF sRaceData.eRaceType = RACETYPE_SEA
|
|
PLAYSTATS_ODDJOB_DONE(GET_GAME_TIMER() - iMissionStartTime, ENUM_TO_INT(MINIGAME_SEA_RACES), ENUM_TO_INT(sRaceData.eRaceTrack))
|
|
ELSE
|
|
PLAYSTATS_ODDJOB_DONE(GET_GAME_TIMER() - iMissionStartTime, ENUM_TO_INT(MINIGAME_STREET_RACES), ENUM_TO_INT(sRaceData.eRaceTrack))
|
|
FLOAT fPlayerHeading, fCheckpointHeading, fDiff
|
|
fPlayerHeading = GET_ENTITY_HEADING(PLAYER_PED_ID())
|
|
fCheckpointHeading = GET_HEADING_BETWEEN_VECTORS(GET_ENTITY_COORDS(PLAYER_PED_ID()), sTrackData.vCheckPoint[0])
|
|
fDiff = fPlayerHeading - fCheckpointHeading
|
|
IF fDiff < 20 AND fDiff > -20
|
|
TASK_VEHICLE_DRIVE_TO_COORD(PLAYER_PED_ID(), sPlayerVehicle.vehPlayerVehicle, sTrackData.vCheckPoint[0], 25, DRIVINGSTYLE_RACING, GET_ENTITY_MODEL(sPlayerVehicle.vehPlayerVehicle), DRIVINGMODE_AVOIDCARS_RECKLESS | DF_ForceStraightLine, 3.0, 5.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//streamVolume = STREAMVOL_CREATE_SPHERE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 20.0, FLAG_MAPDATA)
|
|
|
|
eRaceSubState = RACE_SUBSTATE_RUNNING
|
|
BREAK
|
|
|
|
CASE RACE_SUBSTATE_RUNNING
|
|
//viPlayer = GET_PLAYERS_LAST_VEHICLE()
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
SETUP_RACE_LEADERBOARD(sRaceData.eRaceTrack)
|
|
|
|
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
SET_MOUSE_CURSOR_THIS_FRAME()
|
|
ENDIF
|
|
|
|
IF ciPreviousCheckPoint != NULL
|
|
IF DOES_CAM_EXIST(sRaceResults.ciCityRaceFinishCam[0])
|
|
DELETE_CHECKPOINT(ciPreviousCheckPoint)
|
|
ciPreviousCheckPoint = NULL
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_OK(sPlayerVehicle.vehPlayerVehicle)
|
|
IF City_Race_Manage_Finish_Camera(sPlayerVehicle.vehPlayerVehicle, sRaceResults, sRaceData.eRaceTrack)
|
|
IF RANK_PREDICT_DONE()
|
|
IF sRaceData.eRaceType = RACETYPE_SEA AND IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
//viPlayer = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
IF IS_VEHICLE_OK(sPlayerVehicle.vehPlayerVehicle)
|
|
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(sPlayerVehicle.vehPlayerVehicle, 20.0)
|
|
AND CAN_ANCHOR_BOAT_HERE(sPlayerVehicle.vehPlayerVehicle)
|
|
SET_BOAT_ANCHOR(sPlayerVehicle.vehPlayerVehicle, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF iQuitDelayTimer < 0
|
|
iQuitDelayTimer = GET_GAME_TIMER() + QUIT_BUTTON_DELAY
|
|
IF sRaceData.eRaceTrack = STREET_RACE_06 AND sRaceHUD.iPlayerPosition <> 1
|
|
// Special case repositioning for street race 6 if the player doesn't win the race
|
|
SET_ENTITY_COORDS(sPlayerVehicle.vehPlayerVehicle, <<-1051.5194, -1147.2173, 1.0868>>)
|
|
SET_ENTITY_HEADING(sPlayerVehicle.vehPlayerVehicle, 303.3337)
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
SET_VEHICLE_FORWARD_SPEED(sPlayerVehicle.vehPlayerVehicle, 0.0)
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sPlayerVehicle.vehPlayerVehicle) AND IS_VEHICLE_SEAT_FREE(sPlayerVehicle.vehPlayerVehicle)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), sPlayerVehicle.vehPlayerVehicle)
|
|
ENDIF
|
|
IF sRaceData.eRaceType = RACETYPE_SEA
|
|
SETUP_SEA_RACERS_AT_END()
|
|
ELSE
|
|
CLEANUP_RACERS(TRUE)
|
|
ENDIF
|
|
IF sRaceResults.eCRCutFinish = CR_FINISH_IDLE
|
|
SETUP_END_SCENE(sPlayerVehicle.vehPlayerVehicle)
|
|
ENDIF
|
|
//DRAW_RACE_RESULTS(mptRaceResultPlacement, sRaceData.eRaceTrack, sRaceHUD.iPlayerPosition, sTrackData.iNumAIRacers+1, iFinalRaceTime)
|
|
IF IS_PLAYER_ONLINE() AND NETWORK_HAVE_ONLINE_PRIVILEGES() AND iQuitDelayTimer > 0 AND GET_GAME_TIMER() > iQuitDelayTimer
|
|
IF bDrawLeaderboard
|
|
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
|
|
PLAY_SOUND_FRONTEND(-1,"LEADER_BOARD","HUD_FRONTEND_DEFAULT_SOUNDSET")
|
|
CLEANUP_SIMPLE_USE_CONTEXT(sRaceResults.ucInstructions)
|
|
INIT_RESULT_SCREEN_BUTTONS(sRaceResults)
|
|
bDrawLeaderboard = FALSE
|
|
ELSE
|
|
// Check for if it's OK to add the Profile button to the leaderboard buttons
|
|
IF bWaitToShowProfile
|
|
IF SHOULD_PROFILE_BUTTON_BE_AVAILABLE_FOR_LEADERBOARD(sclbControl)
|
|
CLEANUP_SIMPLE_USE_CONTEXT(sRaceResults.ucInstructions)
|
|
INIT_SIMPLE_USE_CONTEXT(sRaceResults.ucInstructions, FALSE, FALSE, TRUE, TRUE)
|
|
ADD_SIMPLE_USE_CONTEXT_INPUT(sRaceResults.ucInstructions, "HUD_INPUT43", FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
|
|
ADD_SIMPLE_USE_CONTEXT_INPUT(sRaceResults.ucInstructions, "SCLB_PROFILE", FRONTEND_CONTROL, INPUT_FRONTEND_SELECT)
|
|
bWaitToShowProfile = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_LEADERBOARD)
|
|
PLAY_SOUND_FRONTEND(-1,"LEADER_BOARD","HUD_FRONTEND_DEFAULT_SOUNDSET")
|
|
CLEANUP_SIMPLE_USE_CONTEXT(sRaceResults.ucInstructions)
|
|
INIT_SIMPLE_USE_CONTEXT(sRaceResults.ucInstructions, FALSE, FALSE, TRUE, TRUE)
|
|
ADD_SIMPLE_USE_CONTEXT_INPUT(sRaceResults.ucInstructions, "HUD_INPUT43", FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
|
|
IF SHOULD_PROFILE_BUTTON_BE_AVAILABLE_FOR_LEADERBOARD(sclbControl)
|
|
ADD_SIMPLE_USE_CONTEXT_INPUT(sRaceResults.ucInstructions, "SCLB_PROFILE", FRONTEND_CONTROL, INPUT_FRONTEND_SELECT)
|
|
bWaitToShowProfile = FALSE
|
|
ELSE
|
|
bWaitToShowProfile = TRUE
|
|
ENDIF
|
|
bDrawLeaderboard = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bPlayMedalSound
|
|
IF sRaceHUD.iPlayerPosition <= 1
|
|
PLAY_SOUND_FRONTEND(-1, "MEDAL_UP", "HUD_MINI_GAME_SOUNDSET")
|
|
ELSE
|
|
PLAY_SOUND_FRONTEND(-1, "RACE_PLACED", "HUD_AWARDS")
|
|
ENDIF
|
|
bPlayMedalSound = FALSE
|
|
ENDIF
|
|
|
|
IF bDrawLeaderboard
|
|
IF IS_PLAYER_ONLINE()
|
|
DRAW_RACE_LEADERBOARD(uiLeaderboard)
|
|
UPDATE_SIMPLE_USE_CONTEXT(sRaceResults.ucInstructions)
|
|
ELSE
|
|
IF DO_SIGNED_OUT_WARNING(iBS)
|
|
iBS = 0
|
|
CLEANUP_SIMPLE_USE_CONTEXT(sRaceResults.ucInstructions)
|
|
INIT_RESULT_SCREEN_BUTTONS(sRaceResults)
|
|
bDrawLeaderboard = FALSE
|
|
bOnlineButtons = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
DRAW_RACE_RESULTS(esdEndScreen)
|
|
IF (IS_PLAYER_ONLINE() <> bOnlineButtons)
|
|
CLEANUP_SIMPLE_USE_CONTEXT(sRaceResults.ucInstructions)
|
|
INIT_RESULT_SCREEN_BUTTONS(sRaceResults)
|
|
bOnlineButtons = IS_PLAYER_ONLINE()
|
|
ENDIF
|
|
IF GET_GAME_TIMER() > iQuitDelayTimer
|
|
//DRAW_RESULT_SCREEN_INSTRUCTIONS(sRaceResults)
|
|
|
|
UPDATE_SIMPLE_USE_CONTEXT(sRaceResults.ucInstructions)
|
|
|
|
IF IS_CONTROL_JUST_PRESSED( FRONTEND_CONTROL, INPUT_FRONTEND_ENDSCREEN_ACCEPT)
|
|
|
|
FORCE_ENDSCREEN_ANIM_OUT(esdEndScreen)
|
|
SET_ENTITY_CAN_BE_DAMAGED(sPlayerVehicle.vehPlayerVehicle, true)
|
|
eRaceSubState = RACE_SUBSTATE_CLEANUP
|
|
|
|
ELIF IS_CONTROL_JUST_PRESSED( FRONTEND_CONTROL, INPUT_FRONTEND_ENDSCREEN_EXPAND)
|
|
|
|
PLAY_SOUND_FRONTEND(-1,"LEADER_BOARD","HUD_FRONTEND_DEFAULT_SOUNDSET")
|
|
WAIT(0)
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
CLEANUP_RACE_LEADERBOARD(esdEndScreen, uiLeaderboard[0])
|
|
GIVE_PLAYER_WINNINGS()
|
|
//STREAMVOL_DELETE(streamVolume)
|
|
CLEANUP_SIMPLE_USE_CONTEXT(sRaceResults.ucInstructions)
|
|
CLEAR_RANK_REDICTION_DETAILS()
|
|
IF IS_VEHICLE_OK(sPlayerVehicle.vehPlayerVehicle)
|
|
SET_ENTITY_CAN_BE_DAMAGED(sPlayerVehicle.vehPlayerVehicle, true)
|
|
ENDIF
|
|
IF sRaceData.eRaceType = RACETYPE_SEA
|
|
IF IS_VEHICLE_OK(sPlayerVehicle.vehPlayerVehicle)
|
|
SET_BOAT_ANCHOR(sPlayerVehicle.vehPlayerVehicle, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
RESTART_RACE()
|
|
Stop_Finish_Cam(sRaceResults, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
RANK_PREDICT_DONE() // Added for B* 2057456 - preloading all social club data
|
|
ENDSCREEN_PREPARE(esdEndScreen, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
IF bSetupLeaderboard
|
|
IF GET_GAME_TIMER() > iLoadLeaderboardTimer
|
|
SETUP_RACE_LEADERBOARD(sRaceData.eRaceTrack)
|
|
bSetupLeaderboard = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
/*IF GET_GAME_TIMER() > iEndScreenTimer
|
|
eRaceSubState = RACE_SUBSTATE_CLEANUP
|
|
ENDIF*/
|
|
BREAK
|
|
|
|
CASE RACE_SUBSTATE_CLEANUP
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
|
|
IF RENDER_ENDSCREEN(esdEndScreen)
|
|
IF sRaceData.eRaceType = RACETYPE_SEA
|
|
//viPlayer = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
IF IS_VEHICLE_OK(sPlayerVehicle.vehPlayerVehicle)
|
|
SET_BOAT_ANCHOR(sPlayerVehicle.vehPlayerVehicle, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//STREAMVOL_DELETE(streamVolume)
|
|
|
|
// Reward stage
|
|
IF END_SCENE_IS_VALID()
|
|
IF IS_PED_UNINJURED(piRewardPed)
|
|
TASK_PLAY_ANIM(piRewardPed, sAnimDict, "_grid_girl_end", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, 5500)
|
|
ENDIF
|
|
eRaceState = RACE_STATE_REWARD
|
|
eRaceSubState = RACE_SUBSTATE_SETUP
|
|
ELSE
|
|
// sea race, no end scene for this race
|
|
CLEANUP_RACE_LEADERBOARD(esdEndScreen, uiLeaderboard[0])
|
|
CLEANUP_SIMPLE_USE_CONTEXT(sRaceResults.ucInstructions)
|
|
Stop_Finish_Cam(sRaceResults, FALSE, TRUE)
|
|
IF DOES_CAM_EXIST(sRaceResults.ciCityRaceFinishCam[4])
|
|
IF NOT IS_CAM_INTERPOLATING(sRaceResults.ciCityRaceFinishCam[4])
|
|
IF DOES_CAM_EXIST(sRaceResults.ciCityRaceFinishCam[3])
|
|
SET_CAM_MOTION_BLUR_STRENGTH(sRaceResults.ciCityRaceFinishCam[3],0.0)
|
|
ENDIF
|
|
SET_CAM_MOTION_BLUR_STRENGTH(sRaceResults.ciCityRaceFinishCam[4],0.0)
|
|
WAIT(0)
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP()
|
|
INT i_index
|
|
i_index = 0
|
|
REPEAT 8 i_index
|
|
IF DOES_CAM_EXIST(sRaceResults.ciCityRaceFinishCam[i_index])
|
|
DESTROY_CAM(sRaceResults.ciCityRaceFinishCam[i_index])
|
|
ENDIF
|
|
ENDREPEAT
|
|
eRaceState = RACE_STATE_REWARD
|
|
eRaceSubState = RACE_SUBSTATE_CLEANUP
|
|
ENDIF
|
|
ELSE
|
|
eRaceState = RACE_STATE_REWARD
|
|
eRaceSubState = RACE_SUBSTATE_CLEANUP
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
PROC MAKE_REWARD_PED_WALK()
|
|
IF bReadyToWalk
|
|
IF IS_PED_UNINJURED(piRewardPed)
|
|
//IF GET_GAME_TIMER() > iMissionEndTimeout
|
|
VECTOR targetPos
|
|
IF sRaceData.eRaceTrack = STREET_RACE_01
|
|
targetPos = <<-193.889465,-1608.291748,32.996201>>
|
|
ELIF sRaceData.eRaceTrack = STREET_RACE_02
|
|
targetPos = <<315.518982,334.954834,104.468964>>//<<271.950775,345.988983,104.469872>>
|
|
ELIF sRaceData.eRaceTrack = STREET_RACE_04
|
|
targetPos = <<-679.861633,-2360.600098,12.865215>>
|
|
ELIF sRaceData.eRaceTrack = STREET_RACE_05
|
|
targetPos = <<816.6395, -1170.4956, 27.6677>>
|
|
ELIF sRaceData.eRaceTrack = STREET_RACE_06
|
|
targetPos = <<-997.567810,-1153.996948,1.157350>>
|
|
ELSE
|
|
targetPos = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(GET_ENTITY_COORDS(piRewardPed), GET_ENTITY_HEADING(piRewardPed), <<0.0, 5.0, 0.0>>)
|
|
ENDIF
|
|
SEQUENCE_INDEX siLeave
|
|
OPEN_SEQUENCE_TASK(siLeave)
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, targetPos, PEDMOVE_WALK, -1)
|
|
IF sRaceData.eRaceTrack = STREET_RACE_04
|
|
TASK_START_SCENARIO_IN_PLACE(NULL, "WORLD_HUMAN_SMOKING", 0, TRUE)
|
|
ELSE
|
|
TASK_WANDER_STANDARD(NULL, fRewardPedHeading)
|
|
ENDIF
|
|
CLOSE_SEQUENCE_TASK(siLeave)
|
|
IF IS_ENTITY_PLAYING_ANIM(piRewardPed, sAnimDict, "_grid_girl_end")
|
|
STOP_ANIM_TASK(piRewardPed, sAnimDict, "_grid_girl_end")
|
|
ENDIF
|
|
CLEAR_PED_TASKS(piRewardPed)
|
|
TASK_PERFORM_SEQUENCE(piRewardPed, siLeave)
|
|
FORCE_PED_MOTION_STATE(piRewardPed,MS_ON_FOOT_WALK,FALSE,FAUS_DEFAULT, TRUE)
|
|
//FORCE_PED_AI_AND_ANIMATION_UPDATE(piRewardPed, TRUE)
|
|
CLEAR_SEQUENCE_TASK(siLeave)
|
|
//iMissionEndTimeout = GET_GAME_TIMER() + 1000
|
|
//eRaceSubState = RACE_SUBSTATE_CLEANUP
|
|
|
|
CPRINTLN(DEBUG_MISSION, "Making grid girl walk")
|
|
|
|
bReadyToWalk = FALSE
|
|
//ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Scripted scene showing a ped giving the prize money to the winner
|
|
PROC RACE_REWARD()
|
|
HIDE_STREET_AND_CAR_NAMES_THIS_FRAME()
|
|
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
SWITCH eRaceSubState
|
|
|
|
CASE RACE_SUBSTATE_SETUP
|
|
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
|
|
/*IF IS_PED_UNINJURED(piRewardPed)
|
|
|
|
SEQUENCE_INDEX siReward
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
//vRewardDest = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PLAYER_PED_ID(), <<1,5,0>>)
|
|
OPEN_SEQUENCE_TASK(siReward)
|
|
//TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vRewardDest, PEDMOVE_WALK)
|
|
//TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID())
|
|
TASK_PLAY_ANIM(NULL, sAnimDict, "_grid_girl_end", INSTANT_BLEND_IN)//, INSTANT_BLEND_OUT)
|
|
//TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vRewardDest, PEDMOVE_WALK)
|
|
TASK_WANDER_STANDARD(NULL, fRewardPedHeading)
|
|
CLOSE_SEQUENCE_TASK(siReward)
|
|
TASK_PERFORM_SEQUENCE(piRewardPed, siReward)
|
|
CLEAR_SEQUENCE_TASK(siReward)
|
|
ENDIF
|
|
ENDIF*/
|
|
|
|
IF IS_PED_UNINJURED(piRewardPed) AND IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), piRewardPed, -1, SLF_FAST_TURN_RATE | SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
|
|
Stop_Finish_Cam(sRaceResults)
|
|
CLEANUP_RACE_LEADERBOARD(esdEndScreen, uiLeaderboard[0])
|
|
CLEANUP_SIMPLE_USE_CONTEXT(sRaceResults.ucInstructions)
|
|
//SET_GAMEPLAY_CAM_RELATIVE_PITCH(-12.0135)
|
|
//SET_GAMEPLAY_CAM_RELATIVE_HEADING(-124.8084)
|
|
|
|
//iConvFailTimer = -1
|
|
//iMissionEndTimeout = -1
|
|
iMissionEndTimeout = GET_GAME_TIMER() + 2500
|
|
//bConversationStarted = FALSE
|
|
bReadyToWalk = TRUE
|
|
bBlowKiss = TRUE
|
|
eRaceSubState = RACE_SUBSTATE_RUNNING
|
|
BREAK
|
|
|
|
CASE RACE_SUBSTATE_RUNNING
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
|
|
IF City_Race_Manage_Reward_Camera(sRaceResults) //AND GET_GAME_TIMER() > iMissionEndTimeout
|
|
//iMissionEndTimeout = GET_GAME_TIMER() + 1000
|
|
//MAKE_REWARD_PED_WALK()
|
|
eRaceSubState = RACE_SUBSTATE_CLEANUP
|
|
ENDIF
|
|
|
|
IF IS_PED_UNINJURED(piRewardPed)
|
|
IF GET_GAME_TIMER() > iMissionEndTimeout
|
|
MAKE_REWARD_PED_WALK()
|
|
ENDIF
|
|
|
|
IF bBlowKiss AND IS_ENTITY_PLAYING_ANIM(piRewardPed, sAnimDict, "_grid_girl_end") AND GET_ENTITY_ANIM_CURRENT_TIME(piRewardPed, sAnimDict, "_grid_girl_end") > 0.165
|
|
PLAY_SOUND_FROM_ENTITY(-1, "KISS", piRewardPed, "ROAD_RACE_SOUNDSET")
|
|
bBlowKiss = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE RACE_SUBSTATE_CLEANUP
|
|
//IF GET_GAME_TIMER() > iMissionEndTimeout
|
|
GIVE_PLAYER_WINNINGS()
|
|
|
|
//SET_GAMEPLAY_CAM_RELATIVE_PITCH()
|
|
//SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
|
|
IF IS_PED_UNINJURED(PLAYER_PED_ID())
|
|
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
Stop_Reward_Cam(sRaceResults)
|
|
INT i_index
|
|
i_index = 0
|
|
REPEAT 8 i_index
|
|
IF DOES_CAM_EXIST(sRaceResults.ciCityRaceFinishCam[i_index])
|
|
DESTROY_CAM(sRaceResults.ciCityRaceFinishCam[i_index])
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
// Terminate script
|
|
IF sRaceData.eRaceType = RACETYPE_SEA
|
|
SCRIPT_CLEANUP(FALSE)
|
|
ELSE
|
|
SCRIPT_CLEANUP(TRUE)
|
|
ENDIF
|
|
//ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
/// PURPOSE: Race has been failed
|
|
PROC RACE_FAIL()
|
|
|
|
HIDE_STREET_AND_CAR_NAMES_THIS_FRAME()
|
|
|
|
SWITCH eRaceSubState
|
|
|
|
CASE RACE_SUBSTATE_SETUP
|
|
CPRINTLN(DEBUG_MISSION, "Mission Race: RACE_FAIL")
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
ENDIF
|
|
CLEANUP_CHECKPOINTS()
|
|
//CLEANUP_RACERS(FALSE)
|
|
|
|
IF sRaceData.eRaceType = RACETYPE_SEA
|
|
STOP_AUDIO_SCENE("SEA_RACE_DURING_RACE")
|
|
ELSE
|
|
STOP_AUDIO_SCENE("STREET_RACE_DURING_RACE")
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_OK(sPlayerVehicle.vehPlayerVehicle)
|
|
SET_VEHICLE_STOP_INSTANTLY_WHEN_PLAYER_INACTIVE(sPlayerVehicle.vehPlayerVehicle, FALSE)
|
|
ENDIF
|
|
SET_PLAYER_CONTROL(GET_PLAYER_INDEX(), FALSE)
|
|
DISABLE_CONTROL_ACTION(CAMERA_CONTROL, INPUT_VEH_CIN_CAM)
|
|
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
|
|
|
|
HANG_UP_AND_PUT_AWAY_PHONE()
|
|
|
|
sFailMessage = ""
|
|
SWITCH failReason
|
|
CASE FAIL_DEFAULT
|
|
CPRINTLN(DEBUG_MISSION, "MISSION_FAILED reason=FAILED_DEFAULT")
|
|
BREAK
|
|
CASE FAIL_RIVAL_ATTACKED
|
|
CPRINTLN(DEBUG_MISSION, "MISSION_FAILED reason=FAIL_RIVAL_ATTACKED")
|
|
//PRINT_NOW("RACES_R_INJ", DEFAULT_GOD_TEXT_TIME, 1) // Franklin attacked a rival racer.
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
|
|
sFailMessage = "RACES_R_INJ"
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
sFailMessage = "RACES_R_INJ_M"
|
|
ELSE
|
|
sFailMessage = "RACES_R_INJ_T"
|
|
ENDIF
|
|
BREAK
|
|
CASE FAIL_RIVAL_DEAD
|
|
CPRINTLN(DEBUG_MISSION, "MISSION_FAILED reason=FAIL_RIVAL_DEAD")
|
|
//PRINT_NOW("RACES_R_DEAD", DEFAULT_GOD_TEXT_TIME, 1) // A rival racer died.
|
|
sFailMessage = "RACES_R_DEAD"
|
|
BREAK
|
|
CASE FAIL_WRECKED
|
|
CPRINTLN(DEBUG_MISSION, "MISSION_FAILED reason=FAIL_WRECKED")
|
|
//PRINT_NOW("RACES_WRECK", DEFAULT_GOD_TEXT_TIME, 1) // Franklin's vehicle was wrecked.
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
|
|
sFailMessage = "RACES_WRECK"
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
sFailMessage = "RACES_WRECK_M"
|
|
ELSE
|
|
sFailMessage = "RACES_WRECK_T"
|
|
ENDIF
|
|
BREAK
|
|
CASE FAIL_ABANDONED_RACE
|
|
CPRINTLN(DEBUG_MISSION, "MISSION_FAILED reason=FAIL_ABANDONED_RACE")
|
|
//PRINT_NOW("RACES_ABAND", DEFAULT_GOD_TEXT_TIME, 1) // Franklin abandoned the race.
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
|
|
sFailMessage = "RACES_ABAND"
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
sFailMessage = "RACES_ABAND_M"
|
|
ELSE
|
|
sFailMessage = "RACES_ABAND_T"
|
|
ENDIF
|
|
BREAK
|
|
CASE FAIL_MISSED_CHECKPOINT
|
|
CPRINTLN(DEBUG_MISSION, "MISSION_FAILED reason=FAIL_MISSED_CHECKPOINT")
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
|
|
sFailMessage = "RACES_MISS"
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
sFailMessage = "RACES_MISS_M"
|
|
ELSE
|
|
sFailMessage = "RACES_MISS_T"
|
|
ENDIF
|
|
BREAK
|
|
CASE FAIL_ALERTED_COPS
|
|
CPRINTLN(DEBUG_MISSION, "MISSION_FAILED reason=FAIL_ALERTED_COPS")
|
|
//PRINT_NOW("RACES_COPS", DEFAULT_GOD_TEXT_TIME, 1) // Franklin alerted the cops.
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN
|
|
sFailMessage = "RACES_COPS"
|
|
ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
sFailMessage = "RACES_COPS_M"
|
|
ELSE
|
|
sFailMessage = "RACES_COPS_T"
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
/*INIT_SIMPLE_USE_CONTEXT(sComplexUseContext, FALSE)
|
|
ADD_SIMPLE_USE_CONTEXT_INPUT(sComplexUseContext, "IB_YES", FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
|
|
ADD_SIMPLE_USE_CONTEXT_INPUT(sComplexUseContext, "IB_NO", FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)*/
|
|
|
|
IF IS_STRING_NULL_OR_EMPTY(sFailMessage)
|
|
// Terminate script
|
|
SCRIPT_CLEANUP(FALSE)
|
|
ELSE
|
|
//SET_SCALEFORM_BIG_MESSAGE(sBigMessage, "SPR_UI_FAILD", sFailMessage, 4000, HUD_COLOUR_RED)//, MG_BIG_MESSAGE_MISSION_FAILED)
|
|
iRaceFailTimeout = GET_GAME_TIMER() + 4000
|
|
eRaceSubState = RACE_SUBSTATE_RUNNING
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE RACE_SUBSTATE_RUNNING
|
|
/*UPDATE_SCALEFORM_BIG_MESSAGE(sBigMessage)
|
|
IF GET_GAME_TIMER() > iRaceFailTimeout
|
|
// Switch to the retry menu
|
|
SET_SCALEFORM_BIG_MESSAGE(sBigMessage, "SPR_UI_FAILD", "SPR_UI_FRETRY", 4000, HUD_COLOUR_RED)//, MG_BIG_MESSAGE_MISSION_FAILED)
|
|
eRaceSubState = RACE_SUBSTATE_CLEANUP
|
|
ENDIF*/
|
|
IF MG_UPDATE_FAIL_SPLASH_SCREEN(sBigMessage, sFailSplash, "SPR_UI_FAILD", sFailMessage, bShouldRetry)
|
|
IF bShouldRetry
|
|
PLAY_SOUND_FRONTEND(-1,"YES","HUD_FRONTEND_DEFAULT_SOUNDSET")
|
|
WAIT(0)
|
|
RESTART_RACE(FALSE)
|
|
ELSE
|
|
// Terminate script
|
|
//ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
|
|
PLAY_SOUND_FRONTEND(-1,"NO","HUD_FRONTEND_DEFAULT_SOUNDSET")
|
|
WAIT(0)
|
|
sRaceHUD.iPlayerPosition = 99
|
|
SET_PLAYER_CONTROL(GET_PLAYER_INDEX(), TRUE)
|
|
SCRIPT_CLEANUP(FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
/*CASE RACE_SUBSTATE_CLEANUP
|
|
UPDATE_SCALEFORM_BIG_MESSAGE(sBigMessage)
|
|
|
|
SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
|
|
SET_INPUT_EXCLUSIVE(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
|
|
UPDATE_SIMPLE_USE_CONTEXT(sComplexUseContext)
|
|
IF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
|
|
//ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
|
|
PLAY_SOUND_FRONTEND(-1,"YES","HUD_FRONTEND_DEFAULT_SOUNDSET")
|
|
WAIT(0)
|
|
RESTART_RACE(FALSE)
|
|
ELIF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
|
|
// Terminate script
|
|
//ENABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
|
|
PLAY_SOUND_FRONTEND(-1,"NO","HUD_FRONTEND_DEFAULT_SOUNDSET")
|
|
WAIT(0)
|
|
sRaceHUD.iPlayerPosition = 99
|
|
SET_PLAYER_CONTROL(GET_PLAYER_INDEX(), TRUE)
|
|
SCRIPT_CLEANUP(FALSE)
|
|
ENDIF
|
|
BREAK*/
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
// Main script thread
|
|
SCRIPT (RACE_DATA launcherRaceData)
|
|
CPRINTLN(DEBUG_MISSION, "Mission Race: Launched!")
|
|
|
|
//Grab race data
|
|
sRaceData = launcherRaceData
|
|
|
|
// Setup callback when player is killed, arrested or goes to multiplayer
|
|
IF (HAS_FORCE_CLEANUP_OCCURRED(DEFAULT_FORCE_CLEANUP_FLAGS|FORCE_CLEANUP_FLAG_DEBUG_MENU|FORCE_CLEANUP_FLAG_REPEAT_PLAY))
|
|
CPRINTLN(DEBUG_MISSION, "Mission Race: FORCE CLEANUP")
|
|
sRaceHUD.iPlayerPosition = 99
|
|
SCRIPT_CLEANUP(FALSE)
|
|
ENDIF
|
|
|
|
// Now on mission
|
|
SET_MISSION_FLAG(TRUE)
|
|
|
|
IF sRaceData.eRaceType = RACETYPE_SEA
|
|
MINIGAME_DISPLAY_MISSION_TITLE(ENUM_TO_INT(MINIGAME_SEA_RACES))
|
|
SET_RICH_PRESENCE_FOR_SP_MINIGAME(MINIGAME_SEA_RACES)
|
|
ELSE
|
|
MINIGAME_DISPLAY_MISSION_TITLE(ENUM_TO_INT(MINIGAME_STREET_RACES))
|
|
SET_RICH_PRESENCE_FOR_SP_MINIGAME(MINIGAME_STREET_RACES)
|
|
ENDIF
|
|
SWITCH sRaceData.eRaceTrack
|
|
CASE STREET_RACE_01 iRaceID=1 BREAK
|
|
CASE STREET_RACE_02 iRaceID=2 BREAK
|
|
CASE STREET_RACE_04 iRaceID=4 BREAK
|
|
CASE STREET_RACE_05 iRaceID=5 BREAK
|
|
CASE STREET_RACE_06 iRaceID=6 BREAK
|
|
CASE SEA_RACE_01 iRaceID=1 BREAK
|
|
CASE SEA_RACE_02 iRaceID=2 BREAK
|
|
CASE SEA_RACE_03 iRaceID=3 BREAK
|
|
CASE SEA_RACE_04 iRaceID=4 BREAK
|
|
ENDSWITCH
|
|
|
|
// Initial setup
|
|
CPRINTLN(DEBUG_MISSION, "Mission Race: Initialising...")
|
|
RACE_INIT()
|
|
|
|
DISABLE_TAXI_HAILING(TRUE)
|
|
SUPPRESS_LARGE_VEHICLES(TRUE)
|
|
|
|
// Create the canal blocking dumpsters for street race 6
|
|
IF sRaceData.eRaceTrack = STREET_RACE_06
|
|
REQUEST_MODEL(prop_dumpster_02a)
|
|
ENDIF
|
|
|
|
// Street race main loop.
|
|
WHILE TRUE
|
|
|
|
// Check current race state
|
|
SWITCH eRaceState
|
|
|
|
CASE RACE_STATE_LINEUP
|
|
RACE_LINEUP()
|
|
BREAK
|
|
|
|
CASE RACE_STATE_COUNTDOWN
|
|
RACE_COUNTDOWN()
|
|
BREAK
|
|
|
|
CASE RACE_STATE_ACTIVE
|
|
RACE_ACTIVE()
|
|
BREAK
|
|
|
|
CASE RACE_STATE_END
|
|
RACE_END()
|
|
BREAK
|
|
|
|
CASE RACE_STATE_REWARD
|
|
RACE_REWARD()
|
|
BREAK
|
|
|
|
CASE RACE_STATE_FAIL
|
|
RACE_FAIL()
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DEBUG_Check_Debug_Keys()
|
|
#ENDIF
|
|
|
|
// Wait until next frame.
|
|
WAIT(0)
|
|
|
|
ENDWHILE
|
|
|
|
// Should never reach here.
|
|
CPRINTLN(DEBUG_MISSION, "Mission Race: Reached ENDSCRIPT!!!")
|
|
|
|
ENDSCRIPT
|