812 lines
28 KiB
Python
Executable File
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
|