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

736 lines
28 KiB
Python
Executable File

// MISSION NAME : Abigail1.sc
// AUTHOR :
// DESCRIPTION : Michael meets Abigail which unlocks diving for submarine scraps
//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 "replay_public.sch"
USING "RC_Helper_Functions.sch"
USING "RC_Threat_Public.sch"
USING "initial_scenes_Abigail.sch"
USING "chase_hint_cam.sch" CHASE_HINT_CAM_STRUCT localChaseHintCamStruct
USING "commands_recording.sch"
#IF IS_DEBUG_BUILD
USING "select_mission_stage.sch"
#ENDIF
CONST_INT CP_CONFRONT_ABIGAIL 0
g_structRCScriptArgs sRCLauncherDataLocal
MODEL_NAMES modelAbigailCar = ASEA
VEHICLE_INDEX vehAbigail
VECTOR vAbigailVehCoords = <<-1573.7334, 5164.5078, 18.5576>>
FLOAT fAbigailVehHeading = 175.9451
ENUM MISSION_STAGE_TRACK
MST_LEADIN,
MST_CUTSCENE,
MST_CONFRONT_ABIGAIL,
MST_LOSE_WANTED_LEVEL,
MST_ABIGAIL_FLEE,
MST_FAILED
ENDENUM
ENUM STAGE_PROGRESS
SP_SETUP,
SP_RUNNING,
SP_CLEANUP
ENDENUM
CONST_INT Z_SKIP_INTRO 0
CONST_INT Z_SKIP_ABIGAIL_ON_JETTY 1
CONST_INT Z_SKIP_ABIGAIL_IN_CAR 2
CONST_INT Z_SKIP_ABIGAIL_AT_AIRPORT 3
#IF IS_DEBUG_BUILD
CONST_INT MAX_SKIP_MENU_LENGTH 4
MissionStageMenuTextStruct mSkipMenu[MAX_SKIP_MENU_LENGTH]
#ENDIF
CONST_FLOAT fAbigailEscapeDist 250.0
CONST_INT ABIGAIL 0
CONST_INT MAX_FOLLOW_CONV_LINES 7
CONST_INT MAX_CHASE_CONV_LINES 15
CONST_INT FOLLOW_CONV_TIME 10000
CONST_INT CHASE_CONV_TIME 10000
CONST_FLOAT ABIGAIL_TALK_ZONE 20.0
MISSION_STAGE_TRACK msTrack = MST_LEADIN
STAGE_PROGRESS sProgress = SP_SETUP
PED_INDEX pedAbigail
BLIP_INDEX blipAbigail
INT iControlTimer
INT iTextTimer
structPedsForConversation sDialogue
BOOL bThreatenedConv
BOOL bInCarConv
BOOL bArriveConv
BOOL bDisplayedLoseCopsObjective
INT iFollowConvTimer
INT iChaseConvTimer
SEQUENCE_INDEX seqEscapePlanA //get into vehicle, drive away
INT iFollowLinesSaid
INT iChaseLinesSaid
VECTOR vDriveToPoint = <<-1014.0543, -2474.0132, 19.1091>>
BOOL bCutsceneSkipped
INT iCutsceneStage
INT iAbigailHelpTextTimer
SCENARIO_BLOCKING_INDEX blockScenarios
/// PURPOSE:
/// Safely cleans up the script
PROC Script_Cleanup(BOOL b_terminate_thread)
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: Script Cleanup") #ENDIF
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
SET_WANTED_LEVEL_MULTIPLIER(1.0)
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelAbigailCar, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(modelAbigailCar)
SAFE_REMOVE_BLIP(blipAbigail)
SAFE_RELEASE_PED(pedAbigail)
IF IS_ENTITY_ALIVE(vehAbigail)
SET_VEHICLE_DOORS_LOCKED(vehAbigail,VEHICLELOCK_UNLOCKED) // B*1541812 Allow player into Abigail's car if he's threatened her
ENDIF
SAFE_RELEASE_VEHICLE(vehAbigail)
RC_CLEANUP_LAUNCHER()
REMOVE_PED_FOR_DIALOGUE(sDialogue, 3)
RC_CleanupSceneEntities(sRCLauncherDataLocal, FALSE)
REMOVE_SCENARIO_BLOCKING_AREA(blockScenarios)
IF b_terminate_thread = TRUE
TERMINATE_THIS_THREAD()
ENDIF
ENDPROC
/// PURPOSE:
/// Adds needed contacts, completion %, cleans up and passes script.
PROC Script_Passed()
CPRINTLN(DEBUG_MISSION, "Abigail 2: Passed")
Random_Character_Passed()
Script_Cleanup(TRUE)
ENDPROC
/// PURPOSE:
/// Changes the mission's current stage
/// PARAMS:
/// msStage - Mission stage to switch to
PROC SET_STAGE(MISSION_STAGE_TRACK msStage)
msTrack = msStage
sProgress = SP_SETUP
ENDPROC
/// PURPOSE:
/// advance stage if jacked or car ruined
FUNC BOOL SHOULD_ABIGAIL_FLEE_PLAYER()
IF IS_PLAYER_PLAYING(PLAYER_ID())
AND GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: SHOULD_ABIGAIL_FLEE_PLAYER - Player has a wanted level") #ENDIF
RETURN TRUE
ENDIF
IF IS_ENTITY_ALIVE(vehAbigail)
IF HAS_PLAYER_THREATENED_PED(pedAbigail)
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: SHOULD_ABIGAIL_FLEE_PLAYER - HAS_PLAYER_THREATENED_PED returned true") #ENDIF
RETURN TRUE
ENDIF
IF IS_PED_BEING_JACKED(pedAbigail)
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: SHOULD_ABIGAIL_FLEE_PLAYER - pedAbigail is being jacked out") #ENDIF
RETURN TRUE
ENDIF
IF IS_ENTITY_ALIVE(vehAbigail)
IF IS_PED_IN_VEHICLE(pedAbigail, vehAbigail)
AND HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(vehAbigail, PLAYER_PED_ID())
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: SHOULD_ABIGAIL_FLEE_PLAYER - player damaged vehAbigail when pedAbigail was inside it") #ENDIF
RETURN TRUE
ENDIF
IF IS_VEHICLE_TYRE_BURST(vehAbigail, SC_WHEEL_CAR_FRONT_LEFT)
OR IS_VEHICLE_TYRE_BURST(vehAbigail, SC_WHEEL_CAR_FRONT_RIGHT)
OR IS_VEHICLE_TYRE_BURST(vehAbigail, SC_WHEEL_CAR_REAR_LEFT)
OR IS_VEHICLE_TYRE_BURST(vehAbigail, SC_WHEEL_CAR_REAR_RIGHT)
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: SHOULD_ABIGAIL_FLEE_PLAYER - a tyre on vehAbigail is burst") #ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Handles displaying the hint camera and text for Abigail.
PROC MANAGE_ABIGAIL_HINT_CAMERA()
IF IS_ENTITY_ALIVE(pedAbigail)
IF (GET_GAME_TIMER() - iAbigailHelpTextTimer) > 1000
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT) // Prevent swinging punches when using hint camera
CONTROL_ENTITY_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, pedAbigail, "ABGAIL2_HINT") // Press ~INPUT_VEH_CIN_CAM~ to toggle focus on Abigail. // B*1508037 - No hint cam when on foot
ENDIF
ELSE
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
ENDIF
ENDPROC
/// PURPOSE:
/// Wait for any leadin to finish here
PROC STAGE_LEADIN()
REQUEST_ADDITIONAL_TEXT("ABGAIL2", MISSION_TEXT_SLOT)
REQUEST_MODEL(modelAbigailCar)
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // Wait for any pre-engage comment to finish
AND HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
AND HAS_MODEL_LOADED(modelAbigailCar)
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: Pre-mission conversation finished and assets loaded") #ENDIF
SET_WANTED_LEVEL_MULTIPLIER(0.1)
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelAbigailCar, TRUE)
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.vehID[0])
vehAbigail = sRCLauncherDataLocal.vehID[0]
SET_ENTITY_AS_MISSION_ENTITY(vehAbigail, TRUE, TRUE)
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: Grabbed vehAbigail from sRCLauncherDataLocal.vehID[0]") #ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(modelAbigailCar)
ELSE
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: Couldn't vehAbigail from sRCLauncherDataLocal.vehID[0]") #ENDIF
ENDIF
msTrack = MST_CUTSCENE
ELSE
RC_PLAYER_TRIGGER_SCENE_LOCK_IN()
ENDIF
ENDPROC
/// PURPOSE:
/// Plays the scripted cutscene
PROC STAGE_CUTSCENE()
SWITCH sProgress
CASE SP_SETUP
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: Starting state MST_CUTSCENE") #ENDIF
RC_REQUEST_CUTSCENE("ABIGAIL_MCS_2")
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
bCutsceneSkipped = FALSE
iCutsceneStage = 0
sProgress = SP_RUNNING
BREAK
CASE SP_RUNNING
SWITCH iCutsceneStage
CASE 0
IF RC_IS_CUTSCENE_OK_TO_START()
IF IS_ENTITY_ALIVE(pedAbigail)
REGISTER_ENTITY_FOR_CUTSCENE(pedAbigail, "ABIGAIL", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
RC_CLEANUP_LAUNCHER()
START_CUTSCENE()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
iCutsceneStage++
ENDIF
BREAK
CASE 1
IF IS_CUTSCENE_PLAYING()
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(<<-950.64136, -1507.60071, 4.17325>>, <<-953.25787, -1500.43884, 4.17084>>, 8.0, <<-970.3301, -1526.6260, 4.0877>>, 306.1)
RC_START_CUTSCENE_MODE(<<-1592.84, 5214.04, 3.01>>)
CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 100.0) // B*1436470
SAFE_FADE_SCREEN_IN_FROM_BLACK(500, FALSE) // Just in case screen is faded out
REMOVE_ANIM_DICT("rcmabigail") // Pre-cutscene anims no longer required
iCutsceneStage++
ENDIF
BREAK
CASE 2
IF IS_CUTSCENE_PLAYING()
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("ABIGAIL", GET_NPC_PED_MODEL(CHAR_ABIGAIL))
AND IS_ENTITY_ALIVE(pedAbigail)
TASK_FOLLOW_NAV_MESH_TO_COORD(pedAbigail, <<-1579.27, 5194.96, 2.99>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: Received Abigail exit state so set her to walk away") #ENDIF
ENDIF
IF WAS_CUTSCENE_SKIPPED()
bCutsceneSkipped = TRUE
ENDIF
ELSE
REPLAY_STOP_EVENT()
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: Mocap cutscene finished") #ENDIF
IF bCutsceneSkipped = TRUE
IF IS_ENTITY_ALIVE(pedAbigail)
CLEAR_PED_TASKS_IMMEDIATELY(pedAbigail)
SAFE_TELEPORT_ENTITY(pedAbigail, <<-1587.11, 5204.18, 3.02>>, 210.9196)
TASK_FOLLOW_NAV_MESH_TO_COORD(pedAbigail, <<-1579.27, 5194.96, 2.99>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
FORCE_PED_AI_AND_ANIMATION_UPDATE(pedAbigail)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
WAIT(500)
ENDIF
SAFE_FADE_SCREEN_IN_FROM_BLACK()
RC_END_CUTSCENE_MODE()
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE)
CREDIT_BANK_ACCOUNT(CHAR_MICHAEL, BAAC_UNLOGGED_SMALL_ACTION, 10) // B*1483000
iAbigailHelpTextTimer = GET_GAME_TIMER()
SET_STAGE(MST_CONFRONT_ABIGAIL)
ENDIF
BREAK
ENDSWITCH
BREAK
ENDSWITCH
ENDPROC
PROC SETUP_ABIGAIL_VEHICLE()
IF NOT IS_ENTITY_ALIVE(vehAbigail)
vehAbigail = CREATE_VEHICLE(modelAbigailCar, vAbigailVehCoords, fAbigailVehHeading)
SET_MODEL_AS_NO_LONGER_NEEDED(modelAbigailCar)
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: Created new vehAbigail as it didn't exist") #ENDIF
ENDIF
IF IS_ENTITY_ALIVE(vehAbigail) // Check again as we might have grabbed it from sRCLauncherDataLocal.vehID[0]
SET_VEHICLE_DOORS_LOCKED(vehAbigail,VEHICLELOCK_LOCKOUT_PLAYER_ONLY)
SET_VEHICLE_COLOUR_COMBINATION(vehAbigail, 1)
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelAbigailCar, TRUE)
SET_VEHICLE_DISABLE_TOWING(vehAbigail, TRUE)
ENDIF
ENDPROC
PROC SETUP_ABIGAIL_PED()
IF IS_ENTITY_ALIVE(pedAbigail)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedAbigail, TRUE)
ADD_PED_FOR_DIALOGUE(sDialogue, 3, pedAbigail, "ABIGAIL")
SET_PED_FLEE_ATTRIBUTES(pedAbigail, FA_DISABLE_HANDS_UP, TRUE)
SET_PED_FLEE_ATTRIBUTES(pedAbigail, FA_CAN_SCREAM, TRUE)
SET_PED_FLEE_ATTRIBUTES(pedAbigail, FA_DISABLE_COWER, TRUE)
SET_PED_CONFIG_FLAG(pedAbigail, PCF_DisableGoToWritheWhenInjured, TRUE)
SET_PED_CONFIG_FLAG(pedAbigail, PCF_GetOutUndriveableVehicle, TRUE)
SET_PED_CONFIG_FLAG(pedAbigail, PCF_GetOutBurningVehicle, TRUE)
SET_PED_CONFIG_FLAG(pedAbigail, PCF_RunFromFiresAndExplosions, TRUE)
SET_PED_CAN_BE_TARGETTED(pedAbigail, TRUE) // B*1508059 - Ensure Abigail can be locked on
SET_PED_PATH_CAN_DROP_FROM_HEIGHT(pedAbigail, FALSE) // See B*1789556 - Prevent Abigail climbing over stair railings
SET_PED_PATH_CAN_USE_CLIMBOVERS(pedAbigail, FALSE) // See B*1789556 - Prevent Abigail climbing over stair railings
ENDIF
ENDPROC
PROC ABI2_RESET_VARS()
iControlTimer = 0
iTextTimer = 0
bThreatenedConv = FALSE
bInCarConv = FALSE
bArriveConv = FALSE
bDisplayedLoseCopsObjective = FALSE
iFollowConvTimer = 0
iChaseConvTimer = 0
iFollowLinesSaid = 0
iChaseLinesSaid = 0
ENDPROC
PROC STAGE_CONFRONT_ABIGAIL()
SWITCH sProgress
CASE SP_SETUP
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: Starting state MST_CONFRONT_ABIGAIL") #ENDIF
blockScenarios = ADD_SCENARIO_BLOCKING_AREA(<<-1578.62, 5194.44, 2.99>>-<<10, 10, 10>>, <<-1578.62, 5194.44, 2.99>>+<<10, 10, 10>>) // B*1483144 - Stop the scenario peds at the bottom of the stair spawning
SETUP_ABIGAIL_VEHICLE()
IF IS_ENTITY_ALIVE(pedAbigail)
SETUP_ABIGAIL_PED()
IF IS_VEHICLE_OK(vehAbigail)
IF NOT DOES_BLIP_EXIST(blipAbigail)
blipAbigail = CREATE_PED_BLIP(pedAbigail)
ENDIF
INIT_FLASH_BLIP_AND_TEXT(blipAbigail, "", "", iControlTimer, iTextTimer, TRUE, FALSE)
OPEN_SEQUENCE_TASK(seqEscapePlanA)
IF NOT IS_PED_IN_VEHICLE(pedAbigail, vehAbigail) // In case we're z skipping
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-1579.27, 5194.96, 2.99>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-1567.85, 5178.12, 14.78>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-1571.85, 5181.21, 16.88>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-1579.01, 5174.08, 18.57>>, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_NO_STOPPING)
TASK_ENTER_VEHICLE(NULL, vehAbigail, DEFAULT_TIME_BEFORE_WARP, VS_DRIVER, PEDMOVEBLENDRATIO_WALK)
ENDIF
TASK_VEHICLE_DRIVE_TO_COORD_LONGRANGE(NULL, vehAbigail, vDriveToPoint, 20.0, DRIVINGMODE_AVOIDCARS, 10.0)
TASK_VEHICLE_PARK(NULL, vehAbigail, vDriveToPoint, 49.5670, PARK_TYPE_PULL_OVER)
TASK_LEAVE_VEHICLE(NULL, vehAbigail, ECF_DONT_CLOSE_DOOR)
TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 250, -1)
CLOSE_SEQUENCE_TASK(seqEscapePlanA)
TASK_PERFORM_SEQUENCE(pedAbigail, seqEscapePlanA)
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: Tasking pedAbigail to drive to airport") #ENDIF
ELSE
TASK_WANDER_STANDARD(pedAbigail)
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: Tasking pedAbigail to wander") #ENDIF
ENDIF
ENDIF
iFollowConvTimer = GET_GAME_TIMER()
sProgress = SP_RUNNING
BREAK
CASE SP_RUNNING
MANAGE_ABIGAIL_HINT_CAMERA()
IF NOT IS_ENTITY_ALIVE(pedAbigail)
REPLAY_RECORD_BACK_FOR_TIME(3.0)
IF GET_PLAYER_WANTED_LEVEL(GET_PLAYER_INDEX()) = 0
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: STAGE_CONFRONT_ABIGAIL - pedAbigail isn't alive") #ENDIF
sProgress = SP_CLEANUP
ELSE
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: STAGE_CONFRONT_ABIGAIL - pedAbigail isn't alive but player has a wanted level") #ENDIF
SET_STAGE(MST_LOSE_WANTED_LEVEL)
ENDIF
// Abigail is alive so ok to do all of the following...
ELIF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), pedAbigail) > fAbigailEscapeDist
IF GET_PLAYER_WANTED_LEVEL(GET_PLAYER_INDEX()) = 0
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: STAGE_CONFRONT_ABIGAIL - pedAbigail more than fAbigailEscapeDist away from player") #ENDIF
sProgress = SP_CLEANUP
ELSE
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: STAGE_CONFRONT_ABIGAIL - pedAbigail more than fAbigailEscapeDist away from player but player has a wanted level") #ENDIF
SET_STAGE(MST_LOSE_WANTED_LEVEL)
ENDIF
ELIF SHOULD_ABIGAIL_FLEE_PLAYER()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
SET_STAGE(MST_ABIGAIL_FLEE)
ELIF IS_ENTITY_AT_COORD(pedAbigail, vDriveToPoint, <<5.0, 5.0, 5.0>>)
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: pedAbigail arrived at vEndPoint") #ENDIF
SET_STAGE(MST_LOSE_WANTED_LEVEL)
ELSE
FLASH_BLIP_AND_TEXT(blipAbigail, "", "", iControlTimer, iTextTimer, FALSE)
IF bInCarConv = FALSE
IF IS_ENTITY_ALIVE(vehAbigail)
AND IS_PED_IN_VEHICLE(pedAbigail, vehAbigail, TRUE)
AND IS_ENTITY_IN_RANGE_ENTITY(pedAbigail, PLAYER_PED_ID(), ABIGAIL_TALK_ZONE)
AND CREATE_CONVERSATION(sDialogue, "SONARAU", "SONAR_INCAR", CONV_PRIORITY_MEDIUM)
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: Started SONAR_INCAR conversation") #ENDIF
bInCarConv = TRUE
ENDIF
IF iFollowLinesSaid < MAX_FOLLOW_CONV_LINES
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND (GET_GAME_TIMER() - iFollowConvTimer) > FOLLOW_CONV_TIME
AND IS_ENTITY_IN_RANGE_ENTITY(pedAbigail, PLAYER_PED_ID(), ABIGAIL_TALK_ZONE)
AND NOT IS_PED_RAGDOLL(pedAbigail)
AND (CREATE_CONVERSATION(sDialogue, "SONARAU", "SONAR_FOLLOW", CONV_PRIORITY_MEDIUM))
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: Started SONAR_FOLLOW conversation") #ENDIF
iFollowConvTimer = GET_GAME_TIMER()
iFollowLinesSaid++
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: iFollowLinesSaid = ", iFollowLinesSaid) #ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE SP_CLEANUP
Script_Passed()
BREAK
ENDSWITCH
ENDPROC
PROC SET_ABIGAIL_BLIP_TO_RED()
IF NOT DOES_BLIP_EXIST(blipAbigail)
AND IS_ENTITY_ALIVE(pedAbigail)
blipAbigail = CREATE_PED_BLIP(pedAbigail)
ENDIF
IF DOES_BLIP_EXIST(blipAbigail)
AND GET_BLIP_COLOUR(blipAbigail) != BLIP_COLOUR_RED
SET_BLIP_AS_FRIENDLY(blipAbigail, FALSE)
SET_BLIP_COLOUR(blipAbigail, BLIP_COLOUR_RED)
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: Set blipAbigail to red") #ENDIF
ENDIF
ENDPROC
PROC STAGE_LOSE_WANTED_LEVEL()
SWITCH sProgress
CASE SP_SETUP
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: Starting state MST_LOSE_WANTED_LEVEL") #ENDIF
sProgress = SP_RUNNING
BREAK
CASE SP_RUNNING
MANAGE_ABIGAIL_HINT_CAMERA()
IF NOT IS_ENTITY_ALIVE(pedAbigail)
REPLAY_RECORD_BACK_FOR_TIME(3.0)
bArriveConv = TRUE
SAFE_REMOVE_BLIP(blipAbigail)
IF GET_PLAYER_WANTED_LEVEL(GET_PLAYER_INDEX()) = 0
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: STAGE_LOSE_WANTED_LEVEL - pedAbigail isn't alive and player's wanted level is 0") #ENDIF
sProgress = SP_CLEANUP
ENDIF
ELSE
IF bArriveConv = FALSE
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND IS_ENTITY_IN_RANGE_ENTITY(pedAbigail, PLAYER_PED_ID(), ABIGAIL_TALK_ZONE)
AND CREATE_CONVERSATION(sDialogue, "SONARAU", "SONAR_ARRIVE", CONV_PRIORITY_MEDIUM)
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: Started SONAR_ARRIVE conversation") #ENDIF
bArriveConv = TRUE
SET_ABIGAIL_BLIP_TO_RED()
ENDIF
IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), pedAbigail) > fAbigailEscapeDist
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: STAGE_LOSE_WANTED_LEVEL - pedAbigail more than fAbigailEscapeDist away from player") #ENDIF
sProgress = SP_CLEANUP
ENDIF
ENDIF
IF bDisplayedLoseCopsObjective = FALSE
AND bArriveConv = TRUE
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_ENTITY_ALIVE(pedAbigail) // Don't increase wanted level if player has already got a wanted level before killing Abigail
SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), 0)
SET_PLAYER_WANTED_LEVEL(GET_PLAYER_INDEX(), 3)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
ENDIF
PRINT_NOW("ABGAIL2_WANTED", DEFAULT_GOD_TEXT_TIME, 1) // "Lose the cops."
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: Displayed lose cops objective") #ENDIF
bDisplayedLoseCopsObjective = TRUE
ENDIF
BREAK
CASE SP_CLEANUP
Script_Passed()
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Abigail runs away on foot
PROC STAGE_ABIGAIL_FLEE()
SWITCH sProgress
CASE SP_SETUP
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: Starting state MST_ABIGAIL_FLEE") #ENDIF
SET_ABIGAIL_BLIP_TO_RED()
IF IS_ENTITY_ALIVE(vehAbigail)
SET_VEHICLE_DOORS_LOCKED(vehAbigail,VEHICLELOCK_UNLOCKED) // B*1541812 Allow player into Abigail's car if he's threatened her
ENDIF
sProgress = SP_RUNNING
BREAK
CASE SP_RUNNING
MANAGE_ABIGAIL_HINT_CAMERA()
IF NOT IS_ENTITY_ALIVE(pedAbigail)
REPLAY_RECORD_BACK_FOR_TIME(3.0)
IF GET_PLAYER_WANTED_LEVEL(GET_PLAYER_INDEX()) = 0
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: STAGE_ABIGAIL_FLEE - pedAbigail isn't alive") #ENDIF
sProgress = SP_CLEANUP
ELSE
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: STAGE_ABIGAIL_FLEE - pedAbigail isn't alive but player has a wanted level") #ENDIF
SET_STAGE(MST_LOSE_WANTED_LEVEL)
ENDIF
ELIF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), pedAbigail) > fAbigailEscapeDist
IF GET_PLAYER_WANTED_LEVEL(GET_PLAYER_INDEX()) = 0
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: STAGE_ABIGAIL_FLEE - pedAbigail more than fAbigailEscapeDist away from player") #ENDIF
sProgress = SP_CLEANUP
ELSE
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: STAGE_ABIGAIL_FLEE - pedAbigail more than fAbigailEscapeDist away from player but player has a wanted level") #ENDIF
SET_STAGE(MST_LOSE_WANTED_LEVEL)
ENDIF
ELSE
IF NOT IsPedPerformingTask(pedAbigail, SCRIPT_TASK_SMART_FLEE_PED)
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: Tasking Abigail to flee the player") #ENDIF
TASK_SMART_FLEE_PED(pedAbigail, PLAYER_PED_ID(), 250, -1)
ENDIF
IF bThreatenedConv = FALSE
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND IS_ENTITY_IN_RANGE_ENTITY(pedAbigail, PLAYER_PED_ID(), ABIGAIL_TALK_ZONE)
AND NOT IS_PED_RAGDOLL(pedAbigail)
AND CREATE_CONVERSATION(sDialogue, "SONARAU", "SONAR_SHOOTS", CONV_PRIORITY_MEDIUM)
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: Started SONAR_SHOOTS conversation") #ENDIF
bThreatenedConv = TRUE
ENDIF
ELSE
IF iChaseLinesSaid < MAX_CHASE_CONV_LINES
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND (GET_GAME_TIMER() - iChaseConvTimer) > CHASE_CONV_TIME
AND IS_ENTITY_IN_RANGE_ENTITY(pedAbigail, PLAYER_PED_ID(), ABIGAIL_TALK_ZONE)
AND NOT IS_PED_RAGDOLL(pedAbigail)
AND CREATE_CONVERSATION(sDialogue, "SONARAU", "SONAR_CHASE", CONV_PRIORITY_MEDIUM)
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: Started SONAR_CHASE conversation") #ENDIF
iChaseConvTimer = GET_GAME_TIMER()
iChaseLinesSaid++
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: iChaseLinesSaid = ", iChaseLinesSaid) #ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE SP_CLEANUP
Script_Passed()
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Fail the mission
PROC STAGE_FAILED()
SWITCH sProgress
CASE SP_SETUP
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: Starting state MST_FAILED") #ENDIF
CLEAR_PRINTS()
CLEAR_HELP()
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
SAFE_REMOVE_BLIP(blipAbigail)
Random_Character_Failed()
sProgress = SP_RUNNING
BREAK
CASE SP_RUNNING
IF GET_MISSION_FLOW_SAFE_TO_CLEANUP()
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: GET_MISSION_FLOW_SAFE_TO_CLEANUP returned true") #ENDIF
SAFE_DELETE_PED(pedAbigail)
SAFE_DELETE_VEHICLE(vehAbigail)
Script_Cleanup(TRUE)
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Ensures the player, Abigail and her car are in the correct places for the z skip.
PROC ABI2_SETUP_FOR_Z_SKIP(VECTOR v_player_ped, FLOAT f_player_ped, VECTOR v_player_car, FLOAT f_player_car, VECTOR v_abigail_ped, FLOAT f_abigail_ped, VECTOR v_abigail_car, FLOAT f_abigail_car)
IF IS_VECTOR_ZERO(v_player_ped)
VEHICLE_INDEX veh_player
WHILE NOT CREATE_PLAYER_VEHICLE(veh_player, CHAR_MICHAEL, v_player_car, f_player_car)
WAIT(0)
ENDWHILE
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), veh_player)
SAFE_RELEASE_VEHICLE(veh_player)
ELIF NOT IS_REPLAY_IN_PROGRESS()
SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), v_player_ped, f_player_ped)
ENDIF
REQUEST_MODEL(modelAbigailCar)
WHILE NOT HAS_MODEL_LOADED(modelAbigailCar)
WAIT(0)
ENDWHILE
WHILE NOT RC_CREATE_NPC_PED(pedAbigail, CHAR_ABIGAIL, v_abigail_ped, f_abigail_ped, "RC ABIGAIL 2")
WAIT(0)
ENDWHILE
vehAbigail = CREATE_VEHICLE(modelAbigailCar, v_abigail_car, f_abigail_car)
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelAbigailCar, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(modelAbigailCar)
SETUP_ABIGAIL_VEHICLE()
IF IS_VECTOR_ZERO(v_abigail_ped)
SET_PED_INTO_VEHICLE(pedAbigail, vehAbigail)
ENDIF
ENDPROC
/// PURPOSE:
/// Handles debug skipping.
/// PARAMS:
/// i_new_state - The state to debug skip to.
PROC ABI2_DEBUG_SKIP_STATE(INT i_new_state)
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "Starting debug skip to ", i_new_state, "...") #ENDIF
WAIT_FOR_CUTSCENE_TO_STOP(FALSE, FALSE, FALSE)
RC_START_Z_SKIP()
SAFE_DELETE_PED(pedAbigail)
SAFE_DELETE_VEHICLE(vehAbigail)
Script_Cleanup(FALSE)
ABI2_RESET_VARS()
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 100, TRUE)
SWITCH i_new_state
CASE Z_SKIP_INTRO
ABI2_SETUP_FOR_Z_SKIP(<<-1590.9642, 5211.7168, 3.0098>>, 37.4745, <<0,0,0>>, 0, <<-1596.090, 5218.102, 3.045>>, 125.5, <<-1584.0127, 5158.5386, 18.6057>>, 210.5309)
SET_STAGE(MST_CUTSCENE)
BREAK
CASE Z_SKIP_ABIGAIL_ON_JETTY
ABI2_SETUP_FOR_Z_SKIP(<<-1595.2010, 5217.4946, 3.0009>>, 208.2675, <<-1580.2358, 5169.5854, 18.5846>>, 189.4926, <<-1587.11, 5204.18, 3.02>>, -143.87, vAbigailVehCoords, fAbigailVehHeading)
SET_STAGE(MST_CONFRONT_ABIGAIL)
BREAK
CASE Z_SKIP_ABIGAIL_IN_CAR
ABI2_SETUP_FOR_Z_SKIP(<<0,0,0>>, 0, <<-1580.2358, 5169.5854, 18.5846>>, 189.4926, <<0,0,0>>, 0, vAbigailVehCoords, fAbigailVehHeading)
SET_STAGE(MST_CONFRONT_ABIGAIL)
BREAK
CASE Z_SKIP_ABIGAIL_AT_AIRPORT
ABI2_SETUP_FOR_Z_SKIP(<<0,0,0>>, 0, <<-973.0429, -2405.9248, 19.1698>>, 151.3282, <<0,0,0>>, 0, <<-982.9420, -2422.9114, 19.1683>>, 148.0451)
bInCarConv = TRUE
iFollowLinesSaid = MAX_FOLLOW_CONV_LINES
SET_STAGE(MST_CONFRONT_ABIGAIL)
BREAK
ENDSWITCH
IF NOT IS_REPLAY_BEING_SET_UP()
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()))
ENDIF
END_REPLAY_SETUP()
RC_END_Z_SKIP()
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "Finished debug skip to ", i_new_state) #ENDIF
ENDPROC
#IF IS_DEBUG_BUILD
PROC DEBUG_Check_Debug_Keys()
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "S key pressed so passing mission") #ENDIF
Script_Passed()
ELIF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "F key pressed so failing mission") #ENDIF
SET_STAGE(MST_FAILED)
ENDIF
INT i_new_state
IF LAUNCH_MISSION_STAGE_MENU(mSkipMenu, i_new_state)
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "Z skip menu used so doing z skip") #ENDIF
ABI2_DEBUG_SKIP_STATE(i_new_state)
ENDIF
ENDPROC
#ENDIF
SCRIPT(g_structRCScriptArgs sRCLauncherDataIn)
sRCLauncherDataLocal = sRCLauncherDataIn
RC_TakeEntityOwnership(sRCLauncherDataLocal)
SET_MISSION_FLAG(TRUE)
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(TRUE)
ENDIF
#IF IS_DEBUG_BUILD
mSkipMenu[Z_SKIP_INTRO].sTxtLabel = "Intro - abigail_mcs_2"
mSkipMenu[Z_SKIP_ABIGAIL_ON_JETTY].sTxtLabel = "Abigail on jetty"
mSkipMenu[Z_SKIP_ABIGAIL_IN_CAR].sTxtLabel = "Abigail in car"
mSkipMenu[Z_SKIP_ABIGAIL_AT_AIRPORT].sTxtLabel = "Abigail at airport"
#ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[0])
pedAbigail = sRCLauncherDataLocal.pedID[0]
SET_ENTITY_AS_MISSION_ENTITY(pedAbigail, TRUE, TRUE)
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "ABIGAIL 2: Grabbed pedAbigail from sRCLauncherDataLocal.pedID[0]") #ENDIF
ENDIF
ABI2_RESET_VARS()
IF IS_REPLAY_IN_PROGRESS()
INT istage = GET_REPLAY_MID_MISSION_STAGE()
IF g_bShitskipAccepted = TRUE
istage++
ENDIF
SWITCH istage
CASE CP_CONFRONT_ABIGAIL
START_REPLAY_SETUP(<<-1595.2010, 5217.4946, 3.0009>>, 208.2675)
ABI2_DEBUG_SKIP_STATE(Z_SKIP_ABIGAIL_ON_JETTY)
BREAK
ENDSWITCH
ENDIF
WHILE(TRUE)
WAIT(0)
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("SF_WLB")
UPDATE_MISSION_NAME_DISPLAYING(sRCLauncherDataLocal.sIntroCutscene)
#IF IS_DEBUG_BUILD
DEBUG_Check_Debug_Keys()
#ENDIF
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
SWITCH(msTrack)
CASE MST_LEADIN
STAGE_LEADIN()
BREAK
CASE MST_CUTSCENE
STAGE_CUTSCENE()
BREAK
CASE MST_CONFRONT_ABIGAIL
STAGE_CONFRONT_ABIGAIL()
BREAK
CASE MST_LOSE_WANTED_LEVEL
STAGE_LOSE_WANTED_LEVEL()
BREAK
CASE MST_ABIGAIL_FLEE
STAGE_ABIGAIL_FLEE()
BREAK
CASE MST_FAILED
STAGE_FAILED()
BREAK
ENDSWITCH
ENDIF
ENDWHILE
ENDSCRIPT