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

306 lines
11 KiB
Python
Executable File

//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
USING "rage_builtins.sch"
USING "globals.sch"
USING "CompletionPercentage_public.sch"
USING "commands_entity.sch"
USING "commands_script.sch"
USING "cutscene_public.sch"
USING "script_player.sch"
USING "randomChar_public.sch"
USING "RC_Helper_Functions.sch"
USING "initial_scenes_Nigel.sch"
USING "commands_recording.sch"
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
//
// MISSION NAME : Nigel1.sc
// AUTHOR : Joanna Wright
// DESCRIPTION : Random character mission, watch cutscene
//
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
g_structRCScriptArgs sRCLauncherDataLocal
structPedsForConversation sDialogue
ENUM eRC_MainState
RC_MEET_NIGEL = 0,
RC_LEADOUT
ENDENUM
ENUM eRC_SubState
SS_SETUP = 0,
SS_UPDATE,
SS_CLEANUP
ENDENUM
// Mission state
eRC_MainState m_eState = RC_MEET_NIGEL
eRC_SubState m_eSubState = SS_SETUP
BOOL bEndConv = FALSE
SCENARIO_BLOCKING_INDEX mScenarioBlocker
CONST_INT NIGEL 0
CONST_INT MRS_THORNHILL 1
INT iCutsceneStage
// ===========================================================================================================
// Termination
// ===========================================================================================================
// -----------------------------------------------------------------------------------------------------------
// Script Cleanup
// -----------------------------------------------------------------------------------------------------------
/// PURPOSE:
/// Safely cleans up the script
PROC Script_Cleanup()
// Ensure launcher is cleaned up
RC_CLEANUP_LAUNCHER()
// If the mission was triggered then additional mission cleanup will be required.
IF (Random_Character_Cleanup_If_Triggered())
CPRINTLN(DEBUG_MISSION, "...Random Character Script was triggered so additional cleanup required")
ENDIF
ENABLE_VEHICLES_NEAR_NIGEL1(TRUE)
REMOVE_PED_FOR_DIALOGUE(sDialogue, 2)
REMOVE_SCENARIO_BLOCKING_AREA(mScenarioBlocker)
CLEAR_PED_NON_CREATION_AREA()
//Cleanup the scene created by the launcher
RC_CleanupSceneEntities(sRCLauncherDataLocal, TRUE)
TERMINATE_THIS_THREAD()
ENDPROC
// -----------------------------------------------------------------------------------------------------------
// Script Pass
// -----------------------------------------------------------------------------------------------------------
/// PURPOSE:
/// Adds needed contacts, completion %, cleans up and passes script.
PROC Script_Passed()
ADD_CONTACT_TO_PHONEBOOK(CHAR_NIGEL, TREVOR_BOOK)
Random_Character_Passed(CP_RAND_C_NIG1)
Script_Cleanup()
ENDPROC
// ===========================================================================================================
// DEBUG FUNCTIONS
// ===========================================================================================================
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// Check for Forced Pass or Fail
PROC DEBUG_Check_Debug_Keys()
// Check for Pass / j skip
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)) OR (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J))
WAIT_FOR_CUTSCENE_TO_STOP()
// Reset camera behind player
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
Script_Passed()
ENDIF
// Check for Fail
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
WAIT_FOR_CUTSCENE_TO_STOP()
Random_Character_Failed()
Script_Cleanup()
ENDIF
ENDPROC
#ENDIF
// ===========================================================================================================
// MISSION FUNCTIONS & PROCEDURES
// ===========================================================================================================
/// PURPOSE:
/// Sets the new mission state and initialises the substate.
PROC SetState(eRC_MainState in)
m_eState = in
m_eSubState = SS_SETUP
ENDPROC
/// PURPOSE:
/// Triggers the mocap cutscene and completes mission once finished
PROC STATE_MeetNigel()
SET_RANDOM_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
SWITCH m_eSubState
CASE SS_SETUP
CPRINTLN(DEBUG_MISSION, "Init: RC_MEET_NIGEL")
RC_REQUEST_CUTSCENE("NMT_1_RCM", TRUE)
iCutsceneStage = 0
m_eSubState = SS_UPDATE
BREAK
CASE SS_UPDATE
SWITCH iCutsceneStage
CASE 0
IF RC_IS_CUTSCENE_OK_TO_START()
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[NIGEL])
REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.pedID[NIGEL], "Nigel", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[MRS_THORNHILL])
REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.pedID[MRS_THORNHILL], "MRS_Thornhill", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
RC_CLEANUP_LAUNCHER()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_LOW)
START_CUTSCENE()
iCutsceneStage++
ENDIF
BREAK
CASE 1
IF IS_CUTSCENE_PLAYING()
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<-1103.326904,786.843994,157.713257>>, <<-1090.286499,788.601440,168.522827>>, 10.0, <<-1107.0227, 788.9111, 163.0734>>, 187.0703, GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR())
SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(<<-1107.0227, 788.9111, 163.0734>>, 187.0703)
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 100, TRUE, TRUE) // B*1569275 Ensure area is cleared
ENDIF
RC_START_CUTSCENE_MODE(<< -1098.9072, 787.6641, 163.0641 >>)
SAFE_FADE_SCREEN_IN_FROM_BLACK(500, FALSE) // Just in case screen is faded out
iCutsceneStage++
ENDIF
BREAK
CASE 2
IF NOT IS_CUTSCENE_PLAYING()
RC_END_CUTSCENE_MODE()
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE)
IF NOT IS_ENTITY_ALIVE(sRCLauncherDataLocal.vehID[0])
CREATE_NIGEL_VEHICLE(sRCLauncherDataLocal.vehID[0], <<-1084.4558, 787.2556, 163.9860>>, 100.8542, FALSE, TRUE)
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.vehID[0])
SAFE_TELEPORT_ENTITY(sRCLauncherDataLocal.vehID[0], <<-1094.4845, 785.5936, 163.2927>>, 102.2748)
SET_VEHICLE_ON_GROUND_PROPERLY(sRCLauncherDataLocal.vehID[0])
SET_DISABLE_PRETEND_OCCUPANTS(sRCLauncherDataLocal.vehID[0], TRUE)
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[NIGEL])
SET_PED_RELATIONSHIP_GROUP_HASH(sRCLauncherDataLocal.pedID[NIGEL], RELGROUPHASH_PLAYER)
CLEAR_PED_TASKS_IMMEDIATELY(sRCLauncherDataLocal.pedID[NIGEL])
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sRCLauncherDataLocal.pedID[NIGEL], TRUE)
SET_PED_INTO_VEHICLE(sRCLauncherDataLocal.pedID[NIGEL], sRCLauncherDataLocal.vehID[0], VS_DRIVER)
SET_PED_KEEP_TASK(sRCLauncherDataLocal.pedID[NIGEL], TRUE)
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[MRS_THORNHILL])
SET_PED_RELATIONSHIP_GROUP_HASH(sRCLauncherDataLocal.pedID[MRS_THORNHILL], RELGROUPHASH_PLAYER)
CLEAR_PED_TASKS_IMMEDIATELY(sRCLauncherDataLocal.pedID[MRS_THORNHILL])
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sRCLauncherDataLocal.pedID[MRS_THORNHILL], TRUE)
SET_PED_INTO_VEHICLE(sRCLauncherDataLocal.pedID[MRS_THORNHILL], sRCLauncherDataLocal.vehID[0], VS_FRONT_RIGHT)
SET_PED_KEEP_TASK(sRCLauncherDataLocal.pedID[MRS_THORNHILL], TRUE)
ENDIF
SET_VEHICLE_ENGINE_ON(sRCLauncherDataLocal.vehID[0], TRUE, TRUE)
TASK_VEHICLE_DRIVE_WANDER(sRCLauncherDataLocal.pedID[NIGEL], sRCLauncherDataLocal.vehID[0], 20, DRIVINGMODE_STOPFORCARS)
ENDIF
REPLAY_STOP_EVENT()
SAFE_RELEASE_PED(sRCLauncherDataLocal.pedID[NIGEL])
SAFE_RELEASE_PED(sRCLauncherDataLocal.pedID[MRS_THORNHILL])
SAFE_RELEASE_VEHICLE(sRCLauncherDataLocal.vehID[0])
CPRINTLN(DEBUG_MISSION, "Cleaning up RC_MEET_NIGEL")
m_eState = RC_LEADOUT
m_eSubState = SS_SETUP
ENDIF
BREAK
ENDSWITCH
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Trevor comments on Nigel etc
PROC STATE_Leadout()
SWITCH m_eSubState
CASE SS_SETUP
CPRINTLN(DEBUG_MISSION, "Init: RC_LEADOUT")
bEndConv = FALSE
ADD_PED_FOR_DIALOGUE(sDialogue, 2, PLAYER_PED_ID(), "TREVOR")
m_eSubState = SS_UPDATE
BREAK
CASE SS_UPDATE
IF NOT bEndConv
bEndConv = CREATE_CONVERSATION(sDialogue, "NIG1AAU", "NIG1A_COMM", CONV_PRIORITY_MEDIUM)
ELSE
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
CPRINTLN(DEBUG_MISSION, "Conv finished")
m_eSubState = SS_CLEANUP // Complete mission
ENDIF
ENDIF
BREAK
CASE SS_CLEANUP
CPRINTLN(DEBUG_MISSION, "Cleaning up RC_LEADOUT")
Script_Passed()
BREAK
ENDSWITCH
ENDPROC
// ===========================================================================================================
// Script Loop
// ===========================================================================================================
SCRIPT(g_structRCScriptArgs sRCLauncherDataIn)
sRCLauncherDataLocal = sRCLauncherDataIn
RC_TakeEntityOwnership(sRCLauncherDataLocal)
SET_MISSION_FLAG(TRUE)
// 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))
PRINT_LAUNCHER_DEBUG("Force cleanup [TERMINATING]")
Random_Character_Failed()
Script_Cleanup()
ENDIF
IF Is_Replay_In_Progress() // Set up the initial scene for replays
g_bSceneAutoTrigger = TRUE
eInitialSceneStage = IS_REQUEST_SCENE
WHILE NOT SetupScene_NIGEL_1(sRCLauncherDataLocal)
WAIT(0)
ENDWHILE
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE)
g_bSceneAutoTrigger = FALSE
ENDIF
mScenarioBlocker = Nigel1_Scenario_Blocker()
SET_NIGEL1_PED_NON_CREATION_AREA()
// Loop within here until the mission passes or fails
WHILE(TRUE)
WAIT(0)
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("SF_NAMT")
UPDATE_MISSION_NAME_DISPLAYING(sRCLauncherDataLocal.sIntroCutscene)
SWITCH(m_eState)
CASE RC_MEET_NIGEL
STATE_MeetNigel()
BREAK
CASE RC_LEADOUT
STATE_Leadout()
BREAK
ENDSWITCH
// Check debug completion/failure
#IF IS_DEBUG_BUILD
DEBUG_Check_Debug_Keys()
#ENDIF
ENDWHILE
// Script should never reach here. Always terminate with cleanup function.
ENDSCRIPT