865 lines
25 KiB
Python
Executable File
865 lines
25 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 "cutscene_public.sch"
|
||
USING "commands_cutscene.sch"
|
||
USING "commands_entity.sch"
|
||
USING "commands_script.sch"
|
||
USING "script_player.sch"
|
||
USING "randomChar_public.sch"
|
||
USING "CompletionPercentage_public.sch"
|
||
USING "email_public.sch"
|
||
USING "RC_Helper_Functions.sch"
|
||
USING "initial_scenes_Epsilon.sch"
|
||
USING "commands_recording.sch"
|
||
|
||
#IF IS_DEBUG_BUILD
|
||
USING "select_mission_stage.sch"
|
||
#ENDIF
|
||
// *****************************************************************************************
|
||
// *****************************************************************************************
|
||
// *****************************************************************************************
|
||
//
|
||
// MISSION NAME : Epsilon1.sc
|
||
// AUTHOR : David Roberts
|
||
// DESCRIPTION : At dawn one morning, MICHAEL finds a RED TRUCK with a dent on
|
||
// it’s right FENDER in a pass in the countryside.
|
||
//
|
||
// *****************************************************************************************
|
||
// *****************************************************************************************
|
||
// *****************************************************************************************
|
||
g_structRCScriptArgs sRCLauncherDataLocal
|
||
|
||
ENUM eRC_MainState
|
||
RC_INIT = 0,
|
||
RC_LEAD_IN,
|
||
RC_MEET_TOM,
|
||
RC_MICHAEL_PASS_OUT,
|
||
RC_MICHAEL_DUMPED,
|
||
RC_PASSED,
|
||
RC_STAGE_FAIL
|
||
ENDENUM
|
||
|
||
ENUM eRC_SubState
|
||
SS_SETUP = 0,
|
||
SS_UPDATE,
|
||
SS_CLEANUP
|
||
ENDENUM
|
||
|
||
ENUM GOON_AI
|
||
AI_FIGHT_INIT,
|
||
AI_FIGHTING,
|
||
AI_WAITING,
|
||
AI_WAIT_INIT
|
||
ENDENUM
|
||
|
||
STRUCT EpsilonGoon
|
||
PED_INDEX ped
|
||
BLIP_INDEX blip
|
||
GOON_AI AI
|
||
SEQUENCE_INDEX seqInd
|
||
ENDSTRUCT
|
||
|
||
ENUM CONV_STATE
|
||
CONV_WAITING,
|
||
CONV_DOLINE,
|
||
CONV_SPEAKING
|
||
ENDENUM
|
||
|
||
CONST_INT CP_AFTER_MOCAP 0 // Checkpoint
|
||
CONST_INT TOM 0
|
||
CONST_INT EPSILON_VEHICLE 0
|
||
CONST_INT MAX_GOONS 3
|
||
CONST_INT MAX_TAUNTS 4
|
||
|
||
|
||
// Mission state
|
||
eRC_MainState m_eState = RC_INIT
|
||
eRC_SubState m_eSubState = SS_SETUP
|
||
|
||
STRING sSceneHandleEpsilonVeh = "red_epsilon_truck"
|
||
PED_INDEX TomPed
|
||
MODEL_NAMES modelTom = CS_TOM
|
||
MODEL_NAMES modelVeh = BISON
|
||
VEHICLE_INDEX epsVeh
|
||
|
||
STRING sFailReason = "DEFAULT"
|
||
STRING sOnGroundDict = "GET_UP@DIRECTIONAL@TRANSITION@PRONE_TO_SEATED@STANDARD"
|
||
structPedsForConversation convStruct
|
||
VECTOR dumpCoords = <<1971.7144, 2870.0461, 48.9397>> // Coords for where Michael is dumped in his underpants
|
||
VECTOR tomLoc = <<1975.8699, 2865.3984, 49.1545>>
|
||
|
||
FLOAT epsVehSpeed = 15
|
||
|
||
BOOL bFading = FALSE
|
||
BOOL bTomConv = FALSE
|
||
BOOL bTriggeredMusic = FALSE
|
||
|
||
BOOL bTruckConv = FALSE
|
||
|
||
BOOL bAnimPlaying = FALSE
|
||
|
||
CAMERA_INDEX camDumped
|
||
CAMERA_INDEX camDumped1
|
||
|
||
#IF IS_DEBUG_BUILD
|
||
CONST_INT MAX_SKIP_MENU_LENGTH 2
|
||
MissionStageMenuTextStruct mSkipMenu[MAX_SKIP_MENU_LENGTH]
|
||
#ENDIF
|
||
|
||
/// PURPOSE:
|
||
/// Tells what side of a plane a point is on
|
||
/// PARAMS:
|
||
/// pNorm - plane normal
|
||
/// pOrg - plane origin
|
||
/// v - point we want to check
|
||
/// RETURNS:
|
||
/// Returns -1 if behind plane, +1 if in front and 0 if on plane
|
||
FUNC INT GET_PLANE_SIDE(VECTOR pNorm, VECTOR pOrg, VECTOR v)
|
||
FLOAT dot = DOT_PRODUCT(v - pOrg, pNorm)
|
||
IF (dot < 0)
|
||
RETURN -1 // it's behind the plane
|
||
ELIF (dot > 0)
|
||
RETURN 1 // it's in front of the plane
|
||
ENDIF
|
||
|
||
RETURN 0 // ON PLANE
|
||
ENDFUNC
|
||
|
||
// ===========================================================================================================
|
||
// 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")
|
||
|
||
|
||
SAFE_RELEASE_PED(TomPed)
|
||
SAFE_RELEASE_VEHICLE(epsVeh)
|
||
SET_MODEL_AS_NO_LONGER_NEEDED(modelVeh)
|
||
SET_MODEL_AS_NO_LONGER_NEEDED(modelTom)
|
||
CLEAR_PICKUP_REWARD_TYPE_SUPPRESSION(PICKUP_REWARD_TYPE_WEAPON)
|
||
|
||
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
|
||
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
||
RESTORE_PLAYER_PED_WEAPONS(PLAYER_PED_ID())
|
||
ENDIF
|
||
|
||
IF IS_ENTITY_ALIVE(GET_PLAYERS_LAST_VEHICLE())
|
||
SET_VEHICLE_DOORS_LOCKED(GET_PLAYERS_LAST_VEHICLE(), VEHICLELOCK_UNLOCKED)
|
||
ENDIF
|
||
ENDIF
|
||
|
||
RC_END_CUTSCENE_MODE() // Return script systems to normal.
|
||
|
||
SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
||
SAFE_RELEASE_PED(TomPed)
|
||
REMOVE_ANIM_DICT(sOnGroundDict)
|
||
|
||
// Cleanup scene entities created by the RC launcher
|
||
RC_CleanupSceneEntities(sRCLauncherDataLocal, TRUE)
|
||
DISABLE_CELLPHONE(FALSE)
|
||
TERMINATE_THIS_THREAD()
|
||
ENDPROC
|
||
|
||
/// PURPOSE:
|
||
/// Sets the new mission state and initialises the substate.
|
||
PROC SetState(eRC_MainState in)
|
||
m_eState = in
|
||
m_eSubState = SS_SETUP
|
||
ENDPROC
|
||
|
||
/// PURPOSE:
|
||
/// Sets the fail reason, and goes to the fail stage
|
||
/// PARAMS:
|
||
/// sFail - the fail reason
|
||
PROC SET_MISSION_FAILED(STRING sFail)
|
||
STOP_SCRIPTED_CONVERSATION(FALSE)
|
||
CLEAR_PRINTS()
|
||
|
||
sFailReason = sFail
|
||
SetState(RC_STAGE_FAIL)
|
||
ENDPROC
|
||
|
||
/// PURPOSE:
|
||
/// Fails and cleans up the mission correctly
|
||
PROC STATE_FAIL()
|
||
|
||
STOP_SCRIPTED_CONVERSATION(FALSE)
|
||
CLEAR_PRINTS()
|
||
|
||
SWITCH m_eSubState
|
||
CASE SS_SETUP
|
||
IF PREPARE_MUSIC_EVENT("EPS1_FAIL")
|
||
IF TRIGGER_MUSIC_EVENT("EPS1_FAIL")
|
||
CPRINTLN(DEBUG_MISSION, "Playing audio - EPS1_FAIL")
|
||
ENDIF
|
||
ENDIF
|
||
|
||
IF ARE_STRINGS_EQUAL(sFailReason,"DEFAULT")
|
||
Random_Character_Failed()
|
||
ELSE
|
||
Random_Character_Failed_With_Reason(sFailReason, TRUE)
|
||
ENDIF
|
||
|
||
m_eSubState = SS_UPDATE
|
||
BREAK
|
||
|
||
CASE SS_UPDATE
|
||
IF GET_MISSION_FLOW_SAFE_TO_CLEANUP()
|
||
Script_Cleanup() // script_cleanup should terminate the thread
|
||
ELSE
|
||
ENDIF
|
||
BREAK
|
||
ENDSWITCH
|
||
ENDPROC
|
||
|
||
// -----------------------------------------------------------------------------------------------------------
|
||
// Script Pass
|
||
// -----------------------------------------------------------------------------------------------------------
|
||
/// PURPOSE:
|
||
/// Adds needed contacts, completion %, cleans up and passes script.
|
||
PROC Script_Passed()
|
||
|
||
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
|
||
SET_PED_RESET_FLAG(PLAYER_PED_ID(),PRF_DisableDustOffAnims, TRUE)
|
||
ENDIF
|
||
|
||
IF PREPARE_MUSIC_EVENT("EPS1_STOP")
|
||
IF TRIGGER_MUSIC_EVENT("EPS1_STOP")
|
||
CPRINTLN(DEBUG_MISSION, "Playing audio - EPS1_STOP")
|
||
ENDIF
|
||
ENDIF
|
||
|
||
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
|
||
CLEAR_PLAYER_WANTED_LEVEL(GET_PLAYER_INDEX())
|
||
ENDIF
|
||
|
||
Random_Character_Passed(CP_RAND_C_EPS1)
|
||
|
||
// TODO: Move email into comms? We can reset donation in a code ID then...
|
||
WHILE NOT REGISTER_EMAIL_FROM_CHARACTER_TO_PLAYER(EMAIL_EPSILON1_DONATE, CT_AMBIENT, BIT_MICHAEL, CHAR_MARNIE, 15000, 10000)
|
||
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
|
||
SET_PED_RESET_FLAG(PLAYER_PED_ID(),PRF_DisableDustOffAnims, TRUE)
|
||
ENDIF
|
||
WAIT(0)
|
||
ENDWHILE
|
||
|
||
// Reset donations - pity the fool who has donated before this
|
||
CPRINTLN(DEBUG_RANDOM_CHAR, "Resetting donation to Epsilon Program for new mission request.")
|
||
g_savedGlobals.sRandomChars.g_iCurrentEpsilonPayment = 0
|
||
|
||
//Set epsilon step stat
|
||
INT iCurrent
|
||
STAT_GET_INT(NUM_EPSILON_STEP,iCurrent)
|
||
IF iCurrent < 2
|
||
STAT_SET_INT(NUM_EPSILON_STEP,2)
|
||
SET_ACHIEVEMENT_PROGRESS_SAFE(ENUM_TO_INT(ACH20),2)
|
||
CPRINTLN(debug_dan,"Epsilon progress:",2)
|
||
ENDIF
|
||
|
||
// Terminate script
|
||
Script_Cleanup()
|
||
ENDPROC
|
||
|
||
/// PURPOSE:
|
||
/// Creates Tom
|
||
PROC CREATE_TOM()
|
||
|
||
IF NOT DOES_ENTITY_EXIST(TomPed)
|
||
TomPed = CREATE_PED(PEDTYPE_MISSION, modelTom, tomLoc)
|
||
ENDIF
|
||
|
||
IF IS_ENTITY_ALIVE(TomPed)
|
||
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(TomPed, TRUE)
|
||
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(TomPed, TRUE)
|
||
SET_PED_KEEP_TASK(TomPed, TRUE)
|
||
ENDIF
|
||
ENDPROC
|
||
|
||
// ===========================================================================================================
|
||
// DEBUG FUNCTIONS
|
||
// ===========================================================================================================
|
||
#IF IS_DEBUG_BUILD
|
||
|
||
/// PURPOSE:
|
||
/// Sets Michael to look like he's in the fight again
|
||
PROC RESET_EPS1()
|
||
SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), <<-1635.2100, 4204.3101, 83.0421>>)
|
||
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
|
||
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
|
||
SAFE_DELETE_VEHICLE(epsVeh)
|
||
RESTORE_MISSION_START_OUTFIT()
|
||
DISABLE_CELLPHONE(FALSE)
|
||
//REMOVE_GOONS(FALSE)
|
||
//iGoonTaunt = 0
|
||
ENDPROC
|
||
|
||
PROC EPS1_DEBUG_SKIP_STATE(eRC_MainState eMissionStageToSkipTo)
|
||
|
||
RC_START_Z_SKIP()
|
||
STOP_SCRIPTED_CONVERSATION(FALSE)
|
||
CLEAR_PRINTS()
|
||
|
||
|
||
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
|
||
SET_ENTITY_HEALTH(PLAYER_PED_ID(), MAX_HEALTH_VALUE)
|
||
ENDIF
|
||
|
||
IF PREPARE_MUSIC_EVENT("EPS1_STOP")
|
||
IF TRIGGER_MUSIC_EVENT("EPS1_STOP")
|
||
CPRINTLN(DEBUG_MISSION, "Playing audio - EPS1_STOP")
|
||
ENDIF
|
||
ENDIF
|
||
|
||
SWITCH eMissionStageToSkipTo
|
||
CASE RC_MEET_TOM
|
||
RESET_EPS1()
|
||
RC_END_CUTSCENE_MODE()
|
||
RC_REQUEST_CUTSCENE("EP_1_RCM_Concat")
|
||
setState(eMissionStageToSkipTo)
|
||
BREAK
|
||
|
||
CASE RC_MICHAEL_PASS_OUT
|
||
RESET_EPS1()
|
||
setState(eMissionStageToSkipTo)
|
||
BREAK
|
||
|
||
CASE RC_MICHAEL_DUMPED
|
||
CREATE_TOM()
|
||
setState(eMissionStageToSkipTo)
|
||
BREAK
|
||
|
||
CASE RC_PASSED
|
||
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
|
||
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_BED, FALSE)
|
||
ENDIF
|
||
DISABLE_CELLPHONE(FALSE)
|
||
setState(RC_PASSED)
|
||
BREAK
|
||
|
||
DEFAULT
|
||
CERRORLN(DEBUG_MISSION, " BARRY3_DEBUG_SKIP_STATE tried to skip to ", eMissionStageToSkipTo)
|
||
SCRIPT_ASSERT("Script cannot handle the given debug skip-to state")
|
||
BREAK
|
||
ENDSWITCH
|
||
|
||
RC_END_Z_SKIP()
|
||
ENDPROC
|
||
|
||
/// PURPOSE:
|
||
/// Check for Forced Pass or Fail
|
||
PROC DEBUG_Check_Debug_Keys()
|
||
|
||
// Check for Pass
|
||
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S))
|
||
WAIT_FOR_CUTSCENE_TO_STOP()
|
||
RC_END_Z_SKIP()
|
||
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
|
||
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
||
ENDIF
|
||
SetState(RC_PASSED)
|
||
ENDIF
|
||
|
||
// Check for Fail
|
||
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
|
||
WAIT_FOR_CUTSCENE_TO_STOP()
|
||
RC_END_Z_SKIP()
|
||
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
|
||
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
||
ENDIF
|
||
Random_Character_Failed()
|
||
Script_Cleanup()
|
||
TERMINATE_THIS_THREAD()
|
||
// Forward skip
|
||
ELIF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J))
|
||
RC_END_Z_SKIP()
|
||
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
|
||
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
||
ENDIF
|
||
|
||
SWITCH (m_eState)
|
||
CASE RC_INIT
|
||
CPRINTLN(DEBUG_MISSION, "Attempted j skip - you cannot skip initialisation")
|
||
BREAK
|
||
|
||
CASE RC_MEET_TOM
|
||
EPS1_DEBUG_SKIP_STATE(RC_MICHAEL_DUMPED)
|
||
BREAK
|
||
|
||
CASE RC_MICHAEL_PASS_OUT
|
||
EPS1_DEBUG_SKIP_STATE(RC_MICHAEL_DUMPED)
|
||
BREAK
|
||
|
||
CASE RC_MICHAEL_DUMPED
|
||
EPS1_DEBUG_SKIP_STATE(RC_PASSED)
|
||
BREAK
|
||
|
||
CASE RC_PASSED
|
||
CPRINTLN(DEBUG_MISSION, "Attempted j skip - you cannot skip mission pass")
|
||
BREAK
|
||
|
||
CASE RC_STAGE_FAIL
|
||
CPRINTLN(DEBUG_MISSION, "Attempted j skip - you cannot skip during fail")
|
||
BREAK
|
||
|
||
DEFAULT
|
||
CERRORLN(DEBUG_MISSION, " DEBUG_Check_Debug_Keys tried to j skip from ", m_eState)
|
||
SCRIPT_ASSERT("Unhandled j skip")
|
||
BREAK
|
||
ENDSWITCH
|
||
|
||
//back skip
|
||
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)
|
||
SWITCH (m_eState)
|
||
CASE RC_INIT
|
||
CPRINTLN(DEBUG_MISSION, "Attempted p skip - there are no skippable stages before initialisation")
|
||
BREAK
|
||
|
||
CASE RC_MEET_TOM
|
||
CPRINTLN(DEBUG_MISSION, "Attempted p skip - there are no skippable stages before meeting barry cutscene")
|
||
BREAK
|
||
|
||
CASE RC_MICHAEL_PASS_OUT
|
||
EPS1_DEBUG_SKIP_STATE(RC_MEET_TOM)
|
||
BREAK
|
||
|
||
CASE RC_MICHAEL_DUMPED
|
||
EPS1_DEBUG_SKIP_STATE(RC_MEET_TOM)
|
||
BREAK
|
||
|
||
CASE RC_PASSED
|
||
CPRINTLN(DEBUG_MISSION, "Attempted p skip - you cannot skip mission pass")
|
||
BREAK
|
||
|
||
CASE RC_STAGE_FAIL
|
||
CPRINTLN(DEBUG_MISSION, "Attempted p skip - you cannot skip during fail")
|
||
BREAK
|
||
|
||
DEFAULT
|
||
CERRORLN(DEBUG_MISSION, " DEBUG_Check_Debug_Keys tried to p skip from ", m_eState)
|
||
SCRIPT_ASSERT("Unhandled p skip")
|
||
BREAK
|
||
ENDSWITCH
|
||
ENDIF
|
||
|
||
INT i_new_state
|
||
IF LAUNCH_MISSION_STAGE_MENU(mSkipMenu, i_new_state)
|
||
CPRINTLN(DEBUG_MISSION, "Z skip menu used so doing z skip ", i_new_state)
|
||
i_new_state+=2 //+2 because you can't skip to init or lead in which is 0 or 1 and you can't skip to mission passed this way
|
||
EPS1_DEBUG_SKIP_STATE(INT_TO_ENUM(eRC_MainState, i_new_state))
|
||
ENDIF
|
||
ENDPROC
|
||
#ENDIF
|
||
|
||
// ===========================================================================================================
|
||
// MISSION FUNCTIONS & PROCEDURES
|
||
// ===========================================================================================================
|
||
|
||
/// PURPOSE:
|
||
/// Initialises mission
|
||
PROC STATE_MISSION_INIT()
|
||
|
||
REQUEST_MODEL(modelVeh)
|
||
REQUEST_MODEL(modelTom)
|
||
REQUEST_ADDITIONAL_TEXT("EPS1",MISSION_TEXT_SLOT)
|
||
REQUEST_ANIM_DICT(sOnGroundDict)
|
||
|
||
|
||
WHILE NOT HAS_ANIM_DICT_LOADED(sOnGroundDict)
|
||
OR NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
|
||
OR NOT HAS_MODEL_LOADED(modelVeh)
|
||
OR NOT HAS_MODEL_LOADED(modelTom)
|
||
WAIT(0)
|
||
ENDWHILE
|
||
|
||
SET_WANTED_LEVEL_MULTIPLIER(0.1)
|
||
SUPPRESS_PICKUP_REWARD_TYPE(PICKUP_REWARD_TYPE_WEAPON)
|
||
ADD_PED_FOR_DIALOGUE(convStruct, 0, PLAYER_PED_ID(), "MICHAEL")
|
||
|
||
CPRINTLN(DEBUG_MISSION, "Added Michael to conv")
|
||
|
||
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
|
||
STORE_PLAYER_PED_WEAPONS(PLAYER_PED_ID())
|
||
REMOVE_ALL_PED_WEAPONS(PLAYER_PED_ID())
|
||
ENDIF
|
||
|
||
#IF IS_DEBUG_BUILD
|
||
mSkipMenu[0].sTxtLabel = "Intro"
|
||
mSkipMenu[1].sTxtLabel = "Michael dumped"
|
||
#ENDIF
|
||
|
||
SetState(RC_LEAD_IN)
|
||
ENDPROC
|
||
|
||
/// PURPOSE:
|
||
/// Michael comments about the car before the mocap
|
||
PROC STATE_RC_LEAD_IN()
|
||
|
||
RC_PLAYER_TRIGGER_SCENE_LOCK_IN()
|
||
|
||
SWITCH m_eSubState
|
||
CASE SS_SETUP
|
||
|
||
CPRINTLN(DEBUG_MISSION, "Init lead in")
|
||
//RC_END_CUTSCENE_MODE()
|
||
bTruckConv = FALSE
|
||
|
||
m_eSubState = SS_UPDATE
|
||
BREAK
|
||
|
||
CASE SS_UPDATE
|
||
IF NOT bTruckConv
|
||
bTruckConv = CREATE_CONVERSATION(convStruct, "EPS1AU", "EPS1_TRUCK", CONV_PRIORITY_HIGH)
|
||
CPRINTLN(DEBUG_MISSION, "Play lead-in truck conv")
|
||
ELSE
|
||
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
||
IF TIMERB() > 1000
|
||
m_eSubState = SS_CLEANUP
|
||
ENDIF
|
||
ELSE
|
||
SETTIMERB(0)
|
||
ENDIF
|
||
ENDIF
|
||
BREAK
|
||
|
||
CASE SS_CLEANUP
|
||
CPRINTLN(DEBUG_MISSION, "Cleaning up lead in")
|
||
SetState(RC_MEET_TOM)
|
||
BREAK
|
||
ENDSWITCH
|
||
|
||
ENDPROC
|
||
|
||
/// PURPOSE:
|
||
/// Triggers the mocap cutscene and creates goons once finished
|
||
PROC STATE_MeetTom()
|
||
|
||
RC_PLAYER_TRIGGER_SCENE_LOCK_IN()
|
||
|
||
SWITCH m_eSubState
|
||
|
||
CASE SS_SETUP
|
||
|
||
CPRINTLN(DEBUG_MISSION, "Init RC_MEET_TOM")
|
||
|
||
bFading = FALSE
|
||
bTriggeredMusic = FALSE
|
||
|
||
IF RC_IS_CUTSCENE_OK_TO_START()
|
||
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.vehID[EPSILON_VEHICLE])
|
||
//SAFE_TELEPORT_ENTITY(sRCLauncherDataLocal.vehID[EPSILON_VEHICLE], <<-1630.38, 4200.79, 83.01>>, 87.49)
|
||
REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.vehID[EPSILON_VEHICLE], sSceneHandleEpsilonVeh, CU_ANIMATE_EXISTING_SCRIPT_ENTITY, BISON)
|
||
ENDIF
|
||
|
||
// Cleanup launcher which will remove lead-in blip
|
||
RC_CLEANUP_LAUNCHER()
|
||
|
||
REPLAY_START_EVENT(REPLAY_IMPORTANCE_LOW)
|
||
|
||
START_CUTSCENE() // Start mocap scene
|
||
SET_CUTSCENE_FADE_VALUES()
|
||
WAIT(0)
|
||
|
||
STOP_GAMEPLAY_HINT()
|
||
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(<<-1612.51282, 4201.78369, 82.21470>>, <<-1634.40173, 4205.39160, 83.02481>>, 12.0,
|
||
<< -1652.0852, 4207.4897, 83.1525 >>, 231.8747)
|
||
RC_START_CUTSCENE_MODE(<< -1630.38, 4200.79, 83.01 >>)
|
||
CLEAR_AREA_OF_VEHICLES(<< -1630.38, 4200.79, 83.01 >>, 70.0)
|
||
m_eSubState = SS_UPDATE // Monitor cutscene
|
||
ENDIF
|
||
BREAK
|
||
|
||
CASE SS_UPDATE
|
||
|
||
IF HAS_CUTSCENE_FINISHED()
|
||
IF IS_SCREEN_FADED_OUT()
|
||
m_eSubState = SS_CLEANUP
|
||
ENDIF
|
||
ELSE
|
||
IF NOT bTriggeredMusic
|
||
IF PREPARE_MUSIC_EVENT("EPS1_START")
|
||
IF TRIGGER_MUSIC_EVENT("EPS1_START")
|
||
CPRINTLN(DEBUG_MISSION, "Playing audio - EPS1_START")
|
||
bTriggeredMusic = TRUE
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
|
||
IF (GET_CUTSCENE_TIME() >= 25500)
|
||
IF NOT bFading
|
||
SAFE_FADE_SCREEN_OUT_TO_BLACK(500, TRUE)
|
||
bFading = TRUE
|
||
ENDIF
|
||
ELIF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
|
||
|
||
WAIT_FOR_CUTSCENE_TO_STOP(FALSE, FALSE, FALSE)
|
||
CPRINTLN(DEBUG_MISSION, "Cutscene skipped")
|
||
m_eSubState = SS_CLEANUP
|
||
ENDIF
|
||
ENDIF
|
||
BREAK
|
||
|
||
CASE SS_CLEANUP
|
||
REPLAY_STOP_EVENT()
|
||
CPRINTLN(DEBUG_MISSION, "Cleaning up RC_MEET_TOM")
|
||
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE)
|
||
SetState(RC_MICHAEL_PASS_OUT)
|
||
BREAK
|
||
ENDSWITCH
|
||
ENDPROC
|
||
|
||
/// PURPOSE:
|
||
/// Player passes out
|
||
PROC STATE_MICHAEL_PASS_OUT()
|
||
|
||
SWITCH m_eSubState
|
||
|
||
CASE SS_SETUP
|
||
CPRINTLN(DEBUG_MISSION, "Init RC_MICHAEL_PASS_OUT")
|
||
CREATE_TOM()
|
||
bTomConv = FALSE
|
||
m_eSubState = SS_UPDATE
|
||
BREAK
|
||
|
||
CASE SS_UPDATE
|
||
m_eSubState = SS_CLEANUP
|
||
BREAK
|
||
|
||
CASE SS_CLEANUP
|
||
CPRINTLN(DEBUG_MISSION, "Cleaning up RC_MICHAEL_PASS_OUT")
|
||
SetState(RC_MICHAEL_DUMPED)
|
||
BREAK
|
||
ENDSWITCH
|
||
ENDPROC
|
||
|
||
/// PURPOSE:
|
||
/// Player is dumped somewhere weird in only underpants. Pass script when vehicle drives away
|
||
PROC STATE_MICHAEL_DUMPED()
|
||
|
||
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
|
||
SET_PED_RESET_FLAG(PLAYER_PED_ID(),PRF_DisableDustOffAnims, TRUE)
|
||
ENDIF
|
||
|
||
SWITCH m_eSubState
|
||
CASE SS_SETUP
|
||
|
||
CPRINTLN(DEBUG_MISSION, "Init RC_MICHAEL_DUMPED")
|
||
|
||
bAnimPlaying = FALSE
|
||
DISABLE_CELLPHONE(TRUE)
|
||
CREATE_TOM() //just in case something happened to Tom
|
||
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_BED, FALSE)
|
||
SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), dumpCoords, 201.2074)
|
||
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
|
||
NEW_LOAD_SCENE_START_SPHERE(dumpCoords, 100, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
|
||
ENDIF
|
||
IF NOT DOES_ENTITY_EXIST(epsVeh)
|
||
epsVeh = CREATE_VEHICLE(modelVeh, <<1970.3618, 2859.5945, 49.2307>>, 151.6095)//<<1989.4264, 2838.8040, 49.1869>>, 195.9715)
|
||
ENDIF
|
||
|
||
IF IS_ENTITY_ALIVE(TomPed)
|
||
SET_PED_CAN_BE_TARGETTED(TomPed, FALSE)
|
||
SET_PED_RELATIONSHIP_GROUP_HASH(TomPed, RELGROUPHASH_PLAYER)
|
||
SET_PED_KEEP_TASK(TomPed, TRUE)
|
||
|
||
IF IS_ENTITY_ALIVE(epsVeh)
|
||
SET_VEHICLE_COLOURS(epsVeh,0,0)
|
||
SET_VEHICLE_EXTRA_COLOURS(epsVeh,0,0)
|
||
SET_VEHICLE_ON_GROUND_PROPERLY(epsVeh)
|
||
SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(epsVeh, 0)
|
||
TASK_WARP_PED_INTO_VEHICLE(TomPed, epsVeh)
|
||
SET_VEHICLE_DOORS_LOCKED(epsVeh, VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
|
||
SET_VEHICLE_ENGINE_ON(epsVeh, TRUE, TRUE)
|
||
ENDIF
|
||
ENDIF
|
||
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
|
||
TASK_PLAY_ANIM(PLAYER_PED_ID(), sOnGroundDict, "back_armsdown", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING)
|
||
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID(), TRUE)
|
||
ENDIF
|
||
|
||
IF DOES_ENTITY_EXIST(TomPed)
|
||
ADD_PED_FOR_DIALOGUE(convStruct, 4, TomPed, "CRIS")
|
||
ENDIF
|
||
|
||
bTomConv = FALSE
|
||
|
||
m_eSubState = SS_UPDATE
|
||
BREAK
|
||
|
||
CASE SS_UPDATE
|
||
IF IS_NEW_LOAD_SCENE_ACTIVE()
|
||
IF IS_NEW_LOAD_SCENE_LOADED()
|
||
NEW_LOAD_SCENE_STOP()
|
||
camDumped = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<1966.059448,2861.492920,50.106567>>,<<5.965983,0.000000,-30.250603>>,50.0)
|
||
SET_CAM_ACTIVE(camDumped, TRUE)
|
||
|
||
camDumped1 = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<1970.628662,2872.504883,49.440811>>,<<5.712656,-0.000000,-160.952347>>,50.0)
|
||
|
||
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
||
ELSE
|
||
CPRINTLN(DEBUG_MISSION, "Waiting for load scene to finish")
|
||
ENDIF
|
||
ELSE
|
||
IF IS_ENTITY_ALIVE(TomPed)
|
||
IF IS_ENTITY_ALIVE(epsVeh)
|
||
IF IS_PED_SITTING_IN_VEHICLE_SEAT(TomPed, epsVeh, VS_DRIVER)
|
||
IF bAnimPlaying
|
||
IF NOT bTomConv
|
||
bTomConv = CREATE_CONVERSATION(convStruct, "EPS1AU", "EPS1_CAR", CONV_PRIORITY_HIGH)
|
||
ELSE
|
||
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
||
TASK_VEHICLE_DRIVE_WANDER(TomPed, epsVeh, epsVehSpeed, DRIVINGMODE_AVOIDCARS_STOPFORPEDS_OBEYLIGHTS)
|
||
MAKE_PED_DRUNK(PLAYER_PED_ID(), 30000)
|
||
STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP()
|
||
SET_CAM_ACTIVE(camDumped1, FALSE)
|
||
DISABLE_CELLPHONE(FALSE)
|
||
m_eSubState = SS_CLEANUP
|
||
ELSE
|
||
IF TIMERA() > 10000
|
||
IF NOT IS_CAM_ACTIVE(camDumped1)
|
||
SET_CAM_ACTIVE(camDumped1, TRUE)
|
||
SET_CAM_ACTIVE(camDumped, FALSE)
|
||
SET_CAM_PARAMS(camDumped1,<<1970.766479,2872.220703,49.472328>>,<<5.712656,-0.000000,-160.952347>>, 50.0, 5000, GRAPH_TYPE_DECEL, GRAPH_TYPE_DECEL)
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
ELSE
|
||
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
|
||
IF (GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(),SCRIPT_TASK_PLAY_ANIM) = PERFORMING_TASK)
|
||
CPRINTLN(DEBUG_MISSION, "Playing anim, set ragdoll now")
|
||
SET_PED_TO_RAGDOLL(PLAYER_PED_ID(), 16000, 16000, TASK_RELAX)
|
||
APPLY_FORCE_TO_ENTITY(PLAYER_PED_ID(), APPLY_TYPE_EXTERNAL_FORCE, <<0, -5, 2>>, <<0,0.5,0>>, ENUM_TO_INT(PED_COMP_TORSO), true, true, TRUE)
|
||
bAnimPlaying = TRUE
|
||
//SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
||
//SET_GAMEPLAY_CAM_RELATIVE_PITCH()
|
||
WAIT(1000)
|
||
SETTIMERA(0)
|
||
SAFE_FADE_SCREEN_IN_FROM_BLACK(2000, FALSE)
|
||
SET_CAM_PARAMS(camDumped, <<1966.352417,2861.772217,50.316555>>,<<4.433831,-0.000000,-30.380865>>, 50.0, 10000, GRAPH_TYPE_LINEAR, GRAPH_TYPE_LINEAR)
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
ELSE
|
||
TASK_WARP_PED_INTO_VEHICLE(TomPed, epsVeh)
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
ENDIF
|
||
BREAK
|
||
|
||
CASE SS_CLEANUP
|
||
REPLAY_RECORD_BACK_FOR_TIME(10.0, 0.0, REPLAY_IMPORTANCE_LOWEST)
|
||
CPRINTLN(DEBUG_MISSION, "Cleaning up RC_MICHAEL_DUMPED")
|
||
SetState(RC_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]")
|
||
IF PREPARE_MUSIC_EVENT("EPS1_FAIL")
|
||
IF TRIGGER_MUSIC_EVENT("EPS1_FAIL")
|
||
CPRINTLN(DEBUG_MISSION, "Playing audio - EPS1_FAIL")
|
||
ENDIF
|
||
ENDIF
|
||
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_EPSILON_1(sRCLauncherDataLocal)
|
||
WAIT(0)
|
||
ENDWHILE
|
||
g_bSceneAutoTrigger = FALSE
|
||
ENDIF
|
||
|
||
// unlock the car
|
||
IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.vehID[EPSILON_VEHICLE])
|
||
SET_VEHICLE_DOORS_LOCKED(sRCLauncherDataLocal.vehID[EPSILON_VEHICLE], VEHICLELOCK_UNLOCKED)
|
||
ENDIF
|
||
|
||
// Request mocap cutcene
|
||
RC_REQUEST_CUTSCENE("EP_1_RCM_Concat", TRUE)
|
||
|
||
// Loop within here until the mission passes or fails
|
||
WHILE(TRUE)
|
||
|
||
WAIT(0)
|
||
|
||
UPDATE_MISSION_NAME_DISPLAYING(sRCLauncherDataLocal.sIntroCutscene)
|
||
|
||
SWITCH(m_eState)
|
||
CASE RC_INIT
|
||
STATE_MISSION_INIT()
|
||
BREAK
|
||
|
||
CASE RC_LEAD_IN
|
||
STATE_RC_LEAD_IN()
|
||
BREAK
|
||
|
||
CASE RC_MEET_TOM
|
||
STATE_MeetTom()
|
||
BREAK
|
||
|
||
CASE RC_MICHAEL_PASS_OUT
|
||
STATE_MICHAEL_PASS_OUT()
|
||
BREAK
|
||
|
||
CASE RC_MICHAEL_DUMPED
|
||
STATE_MICHAEL_DUMPED()
|
||
BREAK
|
||
|
||
CASE RC_PASSED
|
||
Script_Passed()
|
||
BREAK
|
||
|
||
CASE RC_STAGE_FAIL
|
||
STATE_FAIL()
|
||
BREAK
|
||
|
||
ENDSWITCH
|
||
|
||
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("SF_Epsilonism1")
|
||
|
||
// 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
|