Files
gtav-src/script/dev_ng/singleplayer/scripts/RandomChar/Epsilon/Epsilon3.sc
T
2025-09-29 00:52:08 +02:00

812 lines
28 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 "RC_Helper_Functions.sch"
USING "CompletionPercentage_public.sch"
USING "initial_scenes_Epsilon.sch"
USING "commands_recording.sch"
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
//
// MISSION NAME : Epsilon3.sc
// AUTHOR : David Roberts
// DESCRIPTION : MARNIE appears in the woods.
//
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
g_structRCScriptArgs sRCLauncherDataLocal
STRING leadInAnimDict = "rcmepsilonism3"
ENUM eRC_MainState
RC_LEAD_IN = -1,
RC_MEET_MARNIE = 0,
RC_LEAVE_AREA = 1,
RC_FAILED = 2
ENDENUM
ENUM eRC_SubState
SS_SETUP = 0,
SS_UPDATE,
SS_SKIPPED,
SS_CLEANUP
ENDENUM
ENUM FAILED_REASON
FAILED_GENERIC,
FAILED_WOMAN_DIED,
FAILED_WOMAN_HURT,
FAILED_WOMAN_SCARED
ENDENUM
CONST_INT MARNIE 0
// Mission state
eRC_MainState m_eState = RC_LEAD_IN
eRC_SubState m_eSubState = SS_SETUP
// Player location
STRING sSceneHandleMarnie = "Marnie"
structPedsForConversation convStruct
FAILED_REASON failedReason = FAILED_GENERIC
BOOL bConv = FALSE
BOOL bExitState = FALSE
BOOL bLeadInCloseStop = FALSE
SEQUENCE_INDEX seqWalkAway
SEQUENCE_INDEX siEps3Flee
SCENARIO_BLOCKING_INDEX mScenarioBlocker
REL_GROUP_HASH relGroupPlayer
BOOL bTriggeredMusic = FALSE
INT iConvTimer
INT iConvCloseTimer // Special timer for when you're particularly close to Marnie
INT iConvDelay // We change the delay on her conversation after she says her "go away" dialogue
INT iConvLinesSaid = 0
FLOAT fHintFov = 40.0
FLOAT fHintFollow = 0.25
FLOAT fHintPitchOrbit = 0.80
FLOAT fHintSide = -0.80
FLOAT fHintVert = 0.04
// ===========================================================================================================
// Termination
// ===========================================================================================================
// -----------------------------------------------------------------------------------------------------------
// Script Cleanup
// -----------------------------------------------------------------------------------------------------------
/// PURPOSE:
/// Safely cleans up the script
PROC Script_Cleanup()
// Ensure launcher is cleaned up
RC_CLEANUP_LAUNCHER()
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[MARNIE])
IF IS_PED_HEADTRACKING_PED(sRCLauncherDataLocal.pedID[MARNIE], PLAYER_PED_ID())
TASK_CLEAR_LOOK_AT(sRCLauncherDataLocal.pedID[MARNIE])
ENDIF
ENDIF
// Remove scenario blocks
REMOVE_SCENARIO_BLOCKING_AREA(mScenarioBlocker)
// 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
SAFE_RELEASE_PED(sRCLauncherDataLocal.pedID[MARNIE])
//Cleanup the scene created by the launcher
RC_CleanupSceneEntities(sRCLauncherDataLocal, FALSE)
TERMINATE_THIS_THREAD()
ENDPROC
// -----------------------------------------------------------------------------------------------------------
// Script Pass
// -----------------------------------------------------------------------------------------------------------
/// PURPOSE:
/// Adds needed contacts, completion %, cleans up and passes script.
PROC Script_Passed()
IF PREPARE_MUSIC_EVENT("EPS3_STOP")
IF TRIGGER_MUSIC_EVENT("EPS3_STOP")
CPRINTLN(DEBUG_MISSION, "Playing audio - EPS3_STOP")
ENDIF
ENDIF
// This is for the reminder e-mails for epsilon
IF (g_savedGlobals.sAmbient.iEpsilonLastEmailSentDay = 0)
g_savedGlobals.sAmbient.iEpsilonLastEmailSentDay = GET_CLOCK_DAY_OF_MONTH()
ENDIF
//Set epsilon step stat
INT iCurrent
STAT_GET_INT(NUM_EPSILON_STEP,iCurrent)
IF iCurrent < 6
STAT_SET_INT(NUM_EPSILON_STEP,6)
SET_ACHIEVEMENT_PROGRESS_SAFE(ENUM_TO_INT(ACH20),6)
CPRINTLN(debug_dan,"Epsilon progress:",6)
ENDIF
REMOVE_PED_FOR_DIALOGUE(convStruct, 3)
Random_Character_Passed(CP_RAND_C_EPS3)
Script_Cleanup()
ENDPROC
/// PURPOSE:
/// Sets the new mission state and initialises the substate.
PROC SetState(eRC_MainState in)
m_eState = in
m_eSubState = SS_SETUP
ENDPROC
// ===========================================================================================================
// DEBUG FUNCTIONS
// ===========================================================================================================
#IF IS_DEBUG_BUILD
/// 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()
IF PREPARE_MUSIC_EVENT("EPS3_STOP")
IF TRIGGER_MUSIC_EVENT("EPS3_STOP")
CPRINTLN(DEBUG_MISSION, "Playing audio - EPS3_STOP")
ENDIF
ENDIF
Script_Passed()
ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
IF IS_CUTSCENE_ACTIVE()
WAIT_FOR_CUTSCENE_TO_STOP()
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[MARNIE])
TASK_PLAY_ANIM(sRCLauncherDataLocal.pedID[MARNIE], leadInAnimDict, "base_loop", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION)
CPRINTLN(DEBUG_MISSION, "Animate Marnie - base loop")
ENDIF
SetState(RC_LEAVE_AREA)
ELSE
IF PREPARE_MUSIC_EVENT("EPS3_STOP")
IF TRIGGER_MUSIC_EVENT("EPS3_STOP")
CPRINTLN(DEBUG_MISSION, "Playing audio - EPS3_STOP")
ENDIF
ENDIF
Script_Passed()
ENDIF
ENDIF
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)
IF NOT IS_CUTSCENE_ACTIVE()
bExitState = FALSE
RC_REQUEST_CUTSCENE("EP_3_RCM_ALT1")
REQUEST_ADDITIONAL_TEXT("EPS3", MISSION_TEXT_SLOT)
SetState(RC_MEET_MARNIE)
ENDIF
ENDIF
// Check for Fail
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)
WAIT_FOR_CUTSCENE_TO_STOP()
IF PREPARE_MUSIC_EVENT("EPS_FAIL")
IF TRIGGER_MUSIC_EVENT("EPS_FAIL")
CPRINTLN(DEBUG_MISSION, "Playing audio - EPS3_FAIL")
ENDIF
ENDIF
Random_Character_Failed()
Script_Cleanup()
ENDIF
ENDPROC
#ENDIF
// ===========================================================================================================
// MISSION FUNCTIONS & PROCEDURES
// ===========================================================================================================
/// PURPOSE:
/// performs the lead in if need be, and goes onto next stage
PROC STATE_LeadIn()
RC_PLAYER_TRIGGER_SCENE_LOCK_IN()
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[MARNIE])
AND IS_ENTITY_ALIVE(PLAYER_PED_ID())
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[MARNIE]) <= 9.0
SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVEBLENDRATIO_WALK)
ENDIF
ENDIF
SWITCH m_eSubState
CASE SS_SETUP
REQUEST_ANIM_DICT(leadInAnimDict)
REQUEST_ADDITIONAL_TEXT("EPS3", MISSION_TEXT_SLOT)
WHILE NOT HAS_ANIM_DICT_LOADED(leadInAnimDict)
AND NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
WAIT(0)
ENDWHILE
// Get the PLAYER relationship group
IF IS_PED_UNINJURED(PLAYER_PED_ID())
relGroupPlayer = GET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID())
ENDIF
IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[MARNIE])
//SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(sRCLauncherDataLocal.pedID[MARNIE], FALSE)
SET_PED_RELATIONSHIP_GROUP_HASH(sRCLauncherDataLocal.pedID[MARNIE], relGroupPlayer)
SET_PED_CONFIG_FLAG(sRCLauncherDataLocal.pedID[MARNIE], PCF_KeepRelationshipGroupAfterCleanUp, TRUE)
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[MARNIE])
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sRCLauncherDataLocal.pedID[MARNIE], TRUE)
SET_PED_KEEP_TASK(sRCLauncherDataLocal.pedID[MARNIE], TRUE)
ENDIF
bConv = FALSE
ADD_PED_FOR_DIALOGUE(convStruct, 3, sRCLauncherDataLocal.pedID[MARNIE], "MARNIE")
OPEN_SEQUENCE_TASK(seqWalkAway)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<1817.3235, 4708.1060, 38.1031>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_WANDER_STANDARD(NULL)
CLOSE_SEQUENCE_TASK(seqWalkAway)
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[MARNIE]) >= 4.0
IF NOT IS_GAMEPLAY_HINT_ACTIVE()
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[MARNIE])
IF IS_PLAYER_IN_FIRST_PERSON_CAMERA()
SET_GAMEPLAY_ENTITY_HINT(sRCLauncherDataLocal.pedID[MARNIE], <<0,0,-0.5>>, TRUE, 30000)
ELSE
SET_GAMEPLAY_ENTITY_HINT(sRCLauncherDataLocal.pedID[MARNIE], <<-0.75,0,-0.5>>, TRUE, 30000)
ENDIF
SET_GAMEPLAY_HINT_FOV(fHintFov)
SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR(fHintFollow)
SET_GAMEPLAY_HINT_BASE_ORBIT_PITCH_OFFSET(fHintPitchOrbit)
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(fHintSide)
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_VERTICAL_OFFSET(fHintVert)
SET_GAMEPLAY_HINT_CAMERA_BLEND_TO_FOLLOW_PED_MEDIUM_VIEW_MODE(TRUE)
//B* 2264625: Activate multihead blinders early
SET_MULTIHEAD_SAFE(TRUE)
ENDIF
ELSE
STOP_GAMEPLAY_HINT_BEING_CANCELLED_THIS_UPDATE(TRUE)
ENDIF
ENDIF
m_eSubState = SS_UPDATE
BREAK
CASE SS_UPDATE
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[MARNIE])
IF bLeadInCloseStop = FALSE
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[MARNIE]) <= 3.0
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<1847.705200,4703.013672,36.584274>>, <<1844.083740,4709.531738,39.737553>>, 5.000000)
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<1842.976929,4705.945801,36.780891>>, <<1842.160522,4707.851563,40.105244>>, 2.500000)
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<1843.526733,4704.969238,36.837273>>, <<1844.177734,4703.326172,40.253311>>, 2.500000)
// Stop the player
IF IS_GAMEPLAY_HINT_ACTIVE()
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
ELSE
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
ENDIF
TASK_TURN_PED_TO_FACE_ENTITY(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[MARNIE])
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[MARNIE], 7000)
bLeadInCloseStop = TRUE
CPRINTLN(DEBUG_MISSION, "Player too close to Mary Ann, making him stop")
ENDIF
ENDIF
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[MARNIE]) >= 4.0
IF NOT IS_GAMEPLAY_HINT_ACTIVE()
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[MARNIE])
SET_GAMEPLAY_ENTITY_HINT(sRCLauncherDataLocal.pedID[MARNIE], <<-0.75,0,-0.5>>, TRUE, 30000)
SET_GAMEPLAY_HINT_FOV(fHintFov)
SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR(fHintFollow)
SET_GAMEPLAY_HINT_BASE_ORBIT_PITCH_OFFSET(fHintPitchOrbit)
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(fHintSide)
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_VERTICAL_OFFSET(fHintVert)
SET_GAMEPLAY_HINT_CAMERA_BLEND_TO_FOLLOW_PED_MEDIUM_VIEW_MODE(TRUE)
ENDIF
ELSE
STOP_GAMEPLAY_HINT_BEING_CANCELLED_THIS_UPDATE(TRUE)
ENDIF
ENDIF
ENDIF
IF NOT bConv
bConv = CREATE_CONVERSATION(convStruct, "EPS3AUD", "EP3_RCM_L1", CONV_PRIORITY_HIGH)
IF bConv
AND IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[MARNIE])
TASK_LOOK_AT_ENTITY(sRCLauncherDataLocal.pedID[MARNIE], PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
TASK_PLAY_ANIM(sRCLauncherDataLocal.pedID[MARNIE], leadInAnimDict, "leadin", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION| AF_HOLD_LAST_FRAME)
ENDIF
ELSE
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
WAIT(500)
m_eSubState = SS_CLEANUP
ENDIF
ENDIF
BREAK
CASE SS_CLEANUP
CPRINTLN(DEBUG_MISSION, "Cleaning up RC_lead_in")
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[MARNIE])
IF IS_PED_HEADTRACKING_PED(sRCLauncherDataLocal.pedID[MARNIE], PLAYER_PED_ID())
TASK_CLEAR_LOOK_AT(sRCLauncherDataLocal.pedID[MARNIE])
ENDIF
ENDIF
SetState(RC_MEET_MARNIE)
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Triggers the mocap cutscene and completes mission once finished
PROC STATE_MeetMarnie()
SWITCH m_eSubState
CASE SS_SETUP
CPRINTLN(DEBUG_MISSION, "Init RC_MEET_MARNIE")
bTriggeredMusic = FALSE
IF IS_REPLAY_IN_PROGRESS()
IF IS_REPLAY_BEING_SET_UP()
END_REPLAY_SETUP()
CPRINTLN(DEBUG_MISSION, "Ending replay setup")
ENDIF
RC_REQUEST_CUTSCENE("EP_3_RCM_ALT1")
REQUEST_ADDITIONAL_TEXT("EPS3", MISSION_TEXT_SLOT)
WHILE NOT HAS_CUTSCENE_LOADED()
AND NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
WAIT(0)
CPRINTLN(DEBUG_MISSION, "Waiting for cutscene to load for replay")
ENDWHILE
RC_END_Z_SKIP(FALSE, FALSE, FALSE)
CPRINTLN(DEBUG_MISSION, "End Z skip")
ENDIF
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
RC_PLAYER_TRIGGER_SCENE_LOCK_IN()
ELIF RC_IS_CUTSCENE_OK_TO_START()
CPRINTLN(DEBUG_MISSION, "Start cutscene")
// Start mocap scene
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[MARNIE])
REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.pedID[MARNIE], sSceneHandleMarnie, CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "MICHAEL", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
// Cleanup launcher which will remove lead-in blip
RC_CLEANUP_LAUNCHER()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_LOW)
START_CUTSCENE()
WAIT(0)
STOP_GAMEPLAY_HINT()
IF Is_Replay_In_Progress()
SAFE_FADE_SCREEN_IN_FROM_BLACK(DEFAULT, FALSE)
ENDIF
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(<<1842.190186,4707.640137,36.875866>>, <<1845.486084,4701.726074,40.280556>>, 9.0,
<<1819.4010, 4707.2886, 38.1416>>, 274.5804)
RC_START_CUTSCENE_MODE(<< 1835.53, 4705.86, 38.1 >>)
// Monitor cutscene
m_eSubState = SS_UPDATE
ENDIF
BREAK
CASE SS_UPDATE
IF WAS_CUTSCENE_SKIPPED()
CPRINTLN(DEBUG_MISSION, "Cutscene skipped at ", GET_CUTSCENE_TIME())
m_eSubState = SS_SKIPPED
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("MICHAEL")
REPLAY_STOP_EVENT()
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
//TASK_GO_STRAIGHT_TO_COORD(PLAYER_PED_ID(), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PLAYER_PED_ID(), <<0,3,0>>), PEDMOVEBLENDRATIO_WALK)
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVEBLENDRATIO_WALK)
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT)
bExitState = TRUE
ENDIF
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sSceneHandleMarnie)
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[MARNIE])
TASK_PLAY_ANIM(sRCLauncherDataLocal.pedID[MARNIE], leadInAnimDict, "base_loop", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_USE_KINEMATIC_PHYSICS, 0.01)
SAFE_TELEPORT_ENTITY(sRCLauncherDataLocal.pedID[MARNIE], <<1843.82, 4705.74, 40.80>>, 143.14, TRUE)
FORCE_PED_AI_AND_ANIMATION_UPDATE(sRCLauncherDataLocal.pedID[MARNIE], TRUE)
CPRINTLN(DEBUG_MISSION, "Animate Marnie - base loop")
ENDIF
ENDIF
IF NOT bExitState
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
ENDIF
IF HAS_CUTSCENE_FINISHED()
RC_END_CUTSCENE_MODE()
m_eSubState = SS_CLEANUP // Complete mission
ELSE
IF NOT bTriggeredMusic
IF PREPARE_MUSIC_EVENT("EPS3_START")
IF TRIGGER_MUSIC_EVENT("EPS3_START")
CPRINTLN(DEBUG_MISSION, "Playing audio - EPS3_START")
bTriggeredMusic = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE SS_SKIPPED
SET_CUTSCENE_FADE_VALUES(false, false, FALSE, false)
SAFE_FADE_SCREEN_OUT_TO_BLACK(250, FALSE)
IF IS_CUTSCENE_PLAYING()
WAIT_FOR_CUTSCENE_TO_STOP()
ENDIF
RC_END_CUTSCENE_MODE()
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[MARNIE])
TASK_PLAY_ANIM(sRCLauncherDataLocal.pedID[MARNIE], leadInAnimDict, "base_loop", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_USE_KINEMATIC_PHYSICS)
SAFE_TELEPORT_ENTITY(sRCLauncherDataLocal.pedID[MARNIE], <<1843.82, 4705.74, 40.80>>, 143.14, TRUE)
CPRINTLN(DEBUG_MISSION, "Animate Marnie - base loop (skip)")
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("MICHAEL")
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
//TASK_GO_STRAIGHT_TO_COORD(PLAYER_PED_ID(), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PLAYER_PED_ID(), <<0,3,0>>), PEDMOVEBLENDRATIO_WALK)
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVEBLENDRATIO_WALK)
bExitState = TRUE
ENDIF
ENDIF
WAIT(250)
SAFE_FADE_SCREEN_IN_FROM_BLACK(250, FALSE)
m_eSubState = SS_CLEANUP
BREAK
CASE SS_CLEANUP
//B* 2264625: Deactivate multihead blinders
SET_MULTIHEAD_SAFE(FALSE)
CPRINTLN(DEBUG_MISSION, "Cleanup RC_MEET_MARNIE")
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE)
SetState(RC_LEAVE_AREA)
BREAK
ENDSWITCH
ENDPROC
PROC STATE_LeaveArea()
SWITCH m_eSubState
CASE SS_SETUP
CPRINTLN(DEBUG_MISSION, "Init RC_LEAVE_AREA")
PRINT_NOW("EPS3_LEAVE", DEFAULT_GOD_TEXT_TIME, 1)
iConvTimer = GET_GAME_TIMER() + 7500
iConvCloseTimer = GET_GAME_TIMER()
iConvDelay = 10000
m_eSubState = SS_UPDATE
CPRINTLN(DEBUG_MISSION, "Now running RC_LEAVE_AREA")
BREAK
CASE SS_UPDATE
IF bExitState = TRUE
// IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_MOVE_LR)
// OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_MOVE_UD)
// OR IS_DISABLED_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_MOVE_LR)
// OR IS_DISABLED_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_MOVE_UD)
// OR GET_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_MOVE_LR) != 0
// OR GET_CONTROL_NORMAL(PLAYER_CONTROL, INPUT_MOVE_UD) != 0
// IF IsPedPerformingTask(PLAYER_PED_ID(), SCRIPT_TASK_GO_STRAIGHT_TO_COORD)
// CLEAR_PED_TASKS(PLAYER_PED_ID())
// bExitState = FALSE
// CPRINTLN(DEBUG_MISSION, "Cancelled exit movement")
// ELSE
// bExitState = FALSE
// CPRINTLN(DEBUG_MISSION, "Not performing task")
// ENDIF
// ELSE
// CPRINTLN(DEBUG_MISSION, "Control not pressed")
// ENDIF
ENDIF
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[MARNIE]) <= 1.4
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[MARNIE])
AND (GET_GAME_TIMER() - iConvCloseTimer) > 5000
IF IS_MESSAGE_BEING_DISPLAYED()
IF CREATE_CONVERSATION(convStruct, "EPS3AUD", "EP3_FOLLOW", CONV_PRIORITY_HIGH, DO_NOT_DISPLAY_SUBTITLES)
iConvTimer = GET_GAME_TIMER()
iConvLinesSaid++
ENDIF
ELSE
IF CREATE_CONVERSATION(convStruct, "EPS3AUD", "EP3_FOLLOW", CONV_PRIORITY_HIGH)
iConvTimer = GET_GAME_TIMER()
iConvLinesSaid++
ENDIF
ENDIF
ENDIF
ELIF NOT IS_MESSAGE_BEING_DISPLAYED()
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND (GET_GAME_TIMER() - iConvTimer) > iConvDelay
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[MARNIE])
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[MARNIE]) <= 10
IF iConvLinesSaid < 5
IF CREATE_CONVERSATION(convStruct, "EPS3AUD", "EP3_FOLLOW", CONV_PRIORITY_HIGH)
iConvTimer = GET_GAME_TIMER()
iConvLinesSaid++
ENDIF
ELSE
IF CREATE_CONVERSATION(convStruct, "EPS3AUD", "EP3_AMB", CONV_PRIORITY_HIGH)
iConvTimer = GET_GAME_TIMER()
iConvDelay = 1000
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[MARNIE])
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF iConvLinesSaid < 5
IF NOT IS_PED_HEADTRACKING_PED(sRCLauncherDataLocal.pedID[MARNIE], PLAYER_PED_ID())
TASK_LOOK_AT_ENTITY(sRCLauncherDataLocal.pedID[MARNIE], PLAYER_PED_ID(), -1)
ENDIF
ENDIF
ELSE
IF IS_PED_HEADTRACKING_PED(sRCLauncherDataLocal.pedID[MARNIE], PLAYER_PED_ID())
TASK_CLEAR_LOOK_AT(sRCLauncherDataLocal.pedID[MARNIE])
ENDIF
ENDIF
IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[MARNIE]) >= 100
AND NOT IS_SPHERE_VISIBLE(GET_ENTITY_COORDS(sRCLauncherDataLocal.pedID[MARNIE]), 3)
m_eSubState = SS_CLEANUP
ENDIF
IF GET_IS_PETROL_DECAL_IN_RANGE(GET_ENTITY_COORDS(sRCLauncherDataLocal.pedID[MARNIE], FALSE), 5.0)
OR IS_BULLET_IN_AREA(GET_ENTITY_COORDS(sRCLauncherDataLocal.pedID[MARNIE], FALSE), 5.0, FALSE)
OR IS_PROJECTILE_TYPE_WITHIN_DISTANCE(GET_ENTITY_COORDS(sRCLauncherDataLocal.pedID[MARNIE], FALSE), WEAPONTYPE_GRENADELAUNCHER, 5.0, FALSE)
OR IS_PROJECTILE_TYPE_WITHIN_DISTANCE(GET_ENTITY_COORDS(sRCLauncherDataLocal.pedID[MARNIE], FALSE), WEAPONTYPE_RPG, 5.0, FALSE)
OR IS_PROJECTILE_TYPE_WITHIN_DISTANCE(GET_ENTITY_COORDS(sRCLauncherDataLocal.pedID[MARNIE], FALSE), WEAPONTYPE_GRENADE, 5.0, FALSE)
OR IS_PROJECTILE_TYPE_WITHIN_DISTANCE(GET_ENTITY_COORDS(sRCLauncherDataLocal.pedID[MARNIE], FALSE), WEAPONTYPE_MOLOTOV, 5.0, FALSE)
OR IS_PROJECTILE_TYPE_WITHIN_DISTANCE(GET_ENTITY_COORDS(sRCLauncherDataLocal.pedID[MARNIE], FALSE), WEAPONTYPE_FLARE, 5.0, FALSE)
TRIGGER_MUSIC_EVENT("EPS_FAIL")
OPEN_SEQUENCE_TASK(siEps3Flee)
TASK_PLAY_ANIM(NULL, "rcmepsilonism3", "outro")
TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 200, -1)
CLOSE_SEQUENCE_TASK(siEps3Flee)
TASK_PERFORM_SEQUENCE(sRCLauncherDataLocal.pedID[MARNIE], siEps3Flee)
failedReason = FAILED_WOMAN_SCARED
SetState(RC_FAILED)
ENDIF
IF IS_PED_INJURED(sRCLauncherDataLocal.pedID[MARNIE])
OR IS_PED_RAGDOLL(sRCLauncherDataLocal.pedID[MARNIE])
TRIGGER_MUSIC_EVENT("EPS_FAIL")
TASK_PERFORM_SEQUENCE(sRCLauncherDataLocal.pedID[MARNIE], siEps3Flee)
failedReason = FAILED_WOMAN_HURT
SetState(RC_FAILED)
ENDIF
ELSE
TRIGGER_MUSIC_EVENT("EPS_FAIL")
failedReason = FAILED_WOMAN_DIED
SetState(RC_FAILED)
ENDIF
BREAK
CASE SS_CLEANUP
IF PREPARE_MUSIC_EVENT("EPS3_STOP")
IF TRIGGER_MUSIC_EVENT("EPS3_STOP")
CPRINTLN(DEBUG_MISSION, "Playing audio - EPS3_STOP")
ASSIGN_BUFFER_TO_DYNAMIC_EMAIL_THREAD(DYNAMIC_THREAD_EPSILON3)
CPRINTLN(DEBUG_MISSION, "EPSCARS.SC - WAITING TO SEND")
FIRE_EMAIL_INTO_DYNAMIC_THREAD(DYNAMIC_THREAD_EPSILON3, CULTINITIAL)
OVERRIDE_CONTENT_FOR_DYNAMIC_THREAD(DYNAMIC_THREAD_EPSILON3, "EPS_1STEMAIL")
Script_Passed()
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
INT iFailStage = 0
BOOL bDoneFailDialogue
/// PURPOSE:
/// Main mission failed fade state
PROC STATE_Failed()
SWITCH iFailStage
CASE 0
CLEAR_PRINTS()
// set if there is any fail dialogue to play
bDoneFailDialogue = TRUE
// IF failedReason = FAILED_WOMAN_SCARED
// bDoneFailDialogue = FALSE
// ENDIF
STRING sFailReason
SWITCH failedReason
CASE FAILED_GENERIC
CPRINTLN(DEBUG_MISSION,"MISSION_FAILED reason=FAILED_GENERIC")
BREAK
CASE FAILED_WOMAN_DIED
sFailReason = "EPS3_FAILKILL" // ~r~Marnie died.
CPRINTLN(DEBUG_MISSION,"MISSION_FAILED reason=FAILED_WOMAN_DIED")
BREAK
CASE FAILED_WOMAN_HURT
sFailReason = "EPS3_FAILHURT" // ~r~Marnie was hurt.
CPRINTLN(DEBUG_MISSION,"MISSION_FAILED reason=FAILED_WOMAN_HURT")
BREAK
CASE FAILED_WOMAN_SCARED
sFailReason = "EPS3_FAILSCARE" // ~r~Marnie was scared off.
CPRINTLN(DEBUG_MISSION,"MISSION_FAILED reason=FAILED_WOMAN_SCARED")
BREAK
ENDSWITCH
IF failedReason = FAILED_GENERIC
Random_Character_Failed()
ELSE
Random_Character_Failed_With_Reason(sFailReason)
ENDIF
iFailStage = 1
BREAK
CASE 1
IF GET_MISSION_FLOW_SAFE_TO_CLEANUP()
// Do a check here to see if we need to warp the player at all
// (only set the fail warp locations if we can't leave the player where he was)
//MISSION_FLOW_SET_FAIL_WARP_LOCATION(<< 822.7919, 1278.0978, 359.4304 >>, 105.0195)
//SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION(<<823.432, 1280.526, 359.923>>, -90.133)
Script_Cleanup()
ELSE
// not finished fading out
// you may want to handle dialogue etc here.
IF bDoneFailDialogue = FALSE
IF failedReason = FAILED_WOMAN_SCARED
bDoneFailDialogue = CREATE_CONVERSATION(convStruct, "FAN2AU", "FAN2_SCARED", CONV_PRIORITY_HIGH, DO_NOT_DISPLAY_SUBTITLES)
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
// ===========================================================================================================
// Script Loop
// ===========================================================================================================
SCRIPT(g_structRCScriptArgs sRCLauncherDataIn)
sRCLauncherDataLocal = sRCLauncherDataIn
RC_TakeEntityOwnership(sRCLauncherDataLocal)
SET_MISSION_FLAG(TRUE)
mScenarioBlocker = Eps4_Scenario_Blocker() //also used in this mission
// 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("EPS_FAIL")
IF TRIGGER_MUSIC_EVENT("EPS_FAIL")
CPRINTLN(DEBUG_MISSION, "Playing audio - EPS3_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_3(sRCLauncherDataLocal)
WAIT(0)
ENDWHILE
g_bSceneAutoTrigger = FALSE
START_REPLAY_SETUP(<<1843.1725, 4701.2490, 37.5487>>, 320.2838)
SetState(RC_MEET_MARNIE)
ENDIF
IF NOT Is_Replay_In_Progress()
IF NOT IS_CUTSCENE_ACTIVE()
// Request mocap cutcene
RC_REQUEST_CUTSCENE("EP_3_RCM_ALT1", TRUE)
ENDIF
ENDIF
ADD_CONTACT_TO_PHONEBOOK(CHAR_MARNIE, MICHAEL_BOOK, FALSE)
// Loop within here until the mission passes or fails
WHILE(TRUE)
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("SF_AsTT")
WAIT(0)
UPDATE_MISSION_NAME_DISPLAYING(sRCLauncherDataLocal.sIntroCutscene)
SWITCH(m_eState)
CASE RC_LEAD_IN
STATE_LeadIn()
BREAK
CASE RC_MEET_MARNIE
STATE_MeetMarnie()
BREAK
CASE RC_LEAVE_AREA
STATE_LeaveArea()
BREAK
CASE RC_FAILED
STATE_Failed()
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