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

3566 lines
156 KiB
Python
Executable File

// MISSION NAME : Minute1.sc
// AUTHOR : Kev Edwards
// DESCRIPTION : Help minutemen round up some mariachi band members
//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 "dialogue_public.sch"
USING "script_ped.sch"
USING "dialogue_public.sch"
USING "RC_Helper_Functions.sch"
USING "initial_scenes_Minute.sch"
USING "drunk_public.sch"
USING "CompletionPercentage_public.sch"
USING "RC_Threat_public.sch"
USING "chase_hint_cam.sch" CHASE_HINT_CAM_STRUCT localChaseHintCamStruct
#IF IS_DEBUG_BUILD
USING "select_mission_stage.sch"
#ENDIF
USING "commands_event.sch" // Required to use REMOVE_ALL_SHOCKING_EVENTS
USING "emergency_call.sch" // Required to use SUPPRESS_EMERGENCY_CALLS
USING "commands_recording.sch"
g_structRCScriptArgs sRCLauncherDataLocal
CONST_INT CP_GO_TO_BAR 0 // Checkpoints
CONST_INT CP_GO_IN_BAR 1
CONST_INT CP_CAR_CHASE 2
CONST_INT CP_MISSION_PASSED 3 // Only used for shitskips
CONST_INT Z_SKIP_INTRO 0 // Z Skips
CONST_INT Z_SKIP_GO_TO_BAR 1
CONST_INT Z_SKIP_GO_INSIDE_BAR 2
CONST_INT Z_SKIP_CHASE_CAR 3
CONST_INT Z_SKIP_STUN_MARIACHI 4
CONST_INT Z_SKIP_MISSION_PASSED 5
ENUM MIN1_MISSION_STATE
stateNULL,
stateIntro,
stateGoToBar,
stateGoInsideBar,
stateGoOutsideBar,
stateChaseMariachiCar,
stateStunMariachiPeds,
stateLeaveArea,
stateMissionPassed,
stateFailed,
NUM_MISSION_STATES
ENDENUM
MIN1_MISSION_STATE missionState = stateIntro // Stores the current MIN1_MISSION_STATE
MIN1_MISSION_STATE missionStateSkip = stateNULL // Used if needing to change to a MIN1_MISSION_STATE out of sequence
ENUM MIN1_STATE_MACHINE
MIN1_STATE_MACHINE_SETUP,
MIN1_STATE_MACHINE_LOOP,
MIN1_STATE_MACHINE_CLEANUP
ENDENUM
MIN1_STATE_MACHINE missionStateMachine = MIN1_STATE_MACHINE_SETUP
ENUM FAILED_REASON
FAILED_DEFAULT = 0,
FAILED_JOE_DIED,
FAILED_JOSEF_DIED,
FAILED_PATROL_VEHICLE_WRECKED,
FAILED_MARIACHI_DIED,
FAILED_MARIACHI_INJURED,
FAILED_ABANDONED_BUDDIES,
FAILED_MARIACHI_ESCAPED,
FAILED_JOE_INJURED,
FAILED_JOSEF_INJURED,
FAILED_ALERTED_COPS,
FAILED_THREW_EXPLOSIVES,
FAILED_PATROL_VEHICLE_ATTACKED,
FAILED_ABANDONED_JOE
ENDENUM
FAILED_REASON failReason
STRING failString
ENUM PATROL_VEHICLE_STATUS
PV_STATUS_PLAYER_NOT_INSIDE,
PV_STATUS_LOSE_WANTED_LEVEL,
PV_STATUS_GO_TO_DESTINATION
ENDENUM
PATROL_VEHICLE_STATUS pvStatus
ENUM MARIACHI_STATUS
MARIACHI_EXITING_HIS_VEHICLE,
MARIACHI_WAITING_TO_BE_STUNNED,
MARIACHI_HAS_BEEN_STUNNED,
MARIACHI_AFTER_STUNNED,
MARIACHI_GOING_TO_PATROL_VEHICLE,
MARIACHI_ENTERING_PATROL_VEHICLE,
MARIACHI_SAT_IN_PATROL_VEHICLE
ENDENUM
ENUM BUDDY_STATUS
BUDDY_WAITING_TO_GET_OUT,
BUDDY_GOING_TO_MARIACHI_PED,
BUDDY_AIMING_AT_MARIACHI_PED,
BUDDY_TRYING_TO_ENTER_PATROL_VEHICLE,
BUDDY_ENTERING_PATROL_VEHICLE,
BUDDY_SAT_IN_PATROL_VEHICLE
ENDENUM
BOOL bZSkipping = FALSE // Changes to TRUE if z skipping to prevent subsequent mission state changes etc
#IF IS_DEBUG_BUILD
CONST_INT MAX_SKIP_MENU_LENGTH 5
MissionStageMenuTextStruct mSkipMenu[MAX_SKIP_MENU_LENGTH]
WIDGET_GROUP_ID widgetGroup
BOOL bDebug_PrintToTTY = TRUE
INT iDebugSkipTime // Prevents skipping instantaneously
#ENDIF
VECTOR vPlayerCarRespot = <<323.6060, 3415.3496, 35.6612>>
CONST_FLOAT fPlayerCarRespot 254.7861
CONST_INT NUM_PED_MODELS 2
MODEL_NAMES modelPed[NUM_PED_MODELS]
CONST_INT MIN1_MODEL_MARIACHI_PED 0
CONST_INT MIN1_MODEL_DRUNK_PED_1 1
INT iCutsceneStage
INT iLeadInTimer
SEQUENCE_INDEX seqTrevorLeadIn
VEHICLE_INDEX vehCamperVan
structPedsForConversation sConversation
BOOL bStartedArrivedAtBarConversation
BOOL bStartedInBarConversation
BOOL bStartedDrunkPedConversation
BOOL bStartedBumpDrunkConversation
BOOL bStartedGetOutHereConversation
BOOL bStartedOutsideBarConversation
BOOL bStartedChaseVanConversation
BOOL bStartedOffRoadConversation
BOOL bStartedCrashedConversation
BOOL bStartedStunThemConversation
BOOL bStartedLeaveAreaConversation
BOOL bStartedCyaConversation
BOOL bStartedDriveToBarConversation
BOOL bFinishedDriveToBarConversation
BOOL bStartedStopDriveConversation
BOOL bStartedWrongWayConversation
BOOL bStartedAlmostThereConversation
BOOL bStartedBringVehicleConversation
BOOL bStartedNoJoeConversation
BOOL bStartedGoBackForJoeConversation
BOOL bStartedFleeConversation
INT iWaitConversationsPlayed
INT iGetInConversationsPlayed
INT iStoppedConversationsPlayed
BOOL bPatrolVehicleStoppedDuringChase
INT iFarBehindConversationsPlayed
BOOL bPlayedFarBehindConversation
INT iExitedVehicleConversationsPlayed
INT iGetBackInVehicleConversationsPlayed
INT iGotBackInVehicleConversationsPlayed
BOOL bAllowPlayExitedVehicleConversation
BOOL bAllowPlayGetBackInVehicleConversation
BOOL bAllowPlayGotBackInVehicleConversation
BOOL bStartedSingingStream
CONST_INT NUM_CRASH_CONVERSATIONS 4
VECTOR vCrashConversationPos[NUM_CRASH_CONVERSATIONS]
BOOL bStartedCrashConversation[NUM_CRASH_CONVERSATIONS]
INT iDoneCrashConversations
TEXT_LABEL_23 tSavedConversationRoot
TEXT_LABEL_23 tSavedConversationLabel
MODEL_NAMES modelPatrolVehicle
VEHICLE_INDEX vehPatrolVehicle
BLIP_INDEX blipPatrolVehicle
INT iNumToldToGetInPatrolVehicle
INT iNumToldToGoToDestination
BOOL bDisplayObjective
BOOL bPatrolVehicleDrivingAway
BOOL bDoneRollingStart
BOOL bPlayerIsCurrentlyInPatrolVehicle
FLOAT fWrongWayDistance
MODEL_NAMES modelMariachiCar
VEHICLE_INDEX vehMariachiCar
VECTOR vMariachiCar = << 1996.5011, 3063.1003, 46.7716 >>
FLOAT fMariachiCar = 56.146961
BOOL bUsePlaybackAIForMariachiCar
INT iRequiredHealth
FLOAT fCurrentPositionInRecording
BLIP_INDEX blipDestination
VECTOR vBarInside = << 1989.8622, 3047.6040, 46.21511 >>
VECTOR vBarOutside = << 1990.9784, 3054.2000, 46.2149 >>
INTERIOR_INSTANCE_INDEX interiorBar
BOOL bIsInteriorPinned
STRUCT COMPANION
PED_INDEX ped
VEHICLE_SEAT seatStart
VEHICLE_SEAT seatEnd
BUDDY_STATUS status
INT iInsultTimer
INT iNumInsultsGiven
INT iDelayBeforeNextInsult
ENDSTRUCT
CONST_INT NUM_BUDDIES 2
COMPANION pedBuddy[NUM_BUDDIES]
CONST_INT JOE 0
CONST_INT JOSEF 1
BLIP_INDEX blipJoe
CONST_INT NUM_MARIACHI_PEDS 2
PED_INDEX pedMariachi[NUM_MARIACHI_PEDS]
BLIP_INDEX blipMariachi[NUM_MARIACHI_PEDS]
VEHICLE_SEAT seatMariachi[NUM_MARIACHI_PEDS]
MARIACHI_STATUS statusMariachi[NUM_MARIACHI_PEDS]
BOOL bPlayedStunnedConversation[NUM_MARIACHI_PEDS]
BOOL bPlayedSoberConversation[NUM_MARIACHI_PEDS]
BOOL bCheckForTazeredAgain[NUM_MARIACHI_PEDS]
BOOL bHasBeenTazeredAgain[NUM_MARIACHI_PEDS]
FLOAT fSeekOffsetFromPatrolVehicle[NUM_MARIACHI_PEDS]
CONST_INT NUM_MARIACHI_DRUNK_CONVERSATIONS 4
CONST_INT NUM_MARIACHI_BUMP_CONVERSATIONS 3
CONST_INT NUM_MARIACHI_AIM_CONVERSATIONS 2
CONST_INT NUM_MARIACHI_SHOCK_CONVERSATIONS 1// There are 3 conversations for each mariachi but we only want to play 1 of each
CONST_INT NUM_MARIACHI_WALK_CONVERSATIONS 2
INT iMariachiConversationTimer[NUM_MARIACHI_PEDS]
INT iMariachiConversationDelay[NUM_MARIACHI_PEDS]
INT iNumPlayedDrunkConversations[NUM_MARIACHI_PEDS]
INT iNumPlayedBumpConversations[NUM_MARIACHI_PEDS]
INT iNumPlayedAimConversations[NUM_MARIACHI_PEDS]
INT iNumPlayedShockConversations[NUM_MARIACHI_PEDS]
INT iNumPlayedWalkConversations[NUM_MARIACHI_PEDS]
INT iMariachiExitVehicleTimer[NUM_MARIACHI_PEDS]
INT iPlayedStunnedConversation
CONST_INT NUM_HURRY_STUN_CONVERSATIONS 5
TEXT_LABEL_15 sHurryStunConversation[NUM_HURRY_STUN_CONVERSATIONS]
INT iHurryStunConversationsPlayed
INT iTimesStunnedMoreThanNecessary
INT iCurrentTimesStunnedDialogue
CONST_INT NUM_TIMES_STUNNED_DIALOGUE 3
STRING sTimesStunnedDialogueString[NUM_TIMES_STUNNED_DIALOGUE]
CONST_INT NUM_SHOT_VEHICLE_DIALOGUE 2
INT iCurrentShotVehicleDialogue
STRING sShotVehicleDialogueString[NUM_SHOT_VEHICLE_DIALOGUE]
VECTOR vOpenGroundWanderArea = <<2698.87769, 4110.84863, 42.11631>>
PED_INDEX pedWalkOutBar
VECTOR vWalkOutBarPed = << 1989.4276, 3051.9133, 46.1256 >>
CONST_FLOAT fWalkOutBarPed 332.6105
BOOL bPedGoneOutDoor
PED_INDEX pedJanet
BOOL bDoneJanetTalk
FLOAT fFailDist
INT iSingingDialogueTimer
INT iChaseDialogueTimer
INT iStunGunDialogueTimer
INT iNotStunnedDialogueTimer
INT iRollingStartTimer
INT iLookAroundTimer
INT iWaitConversationTimer
INT iMariachiCarTyresBurstTimer
INT iPatrolVehicleTyresBurstTimer
CONST_INT NUM_CHASE_CONVERSATIONS 7
BOOL bDoneChaseConversation[NUM_CHASE_CONVERSATIONS]
TEXT_LABEL_15 sChaseConversation[NUM_CHASE_CONVERSATIONS]
INT iDoneChaseConversations
REL_GROUP_HASH relGroupFriendly
SEQUENCE_INDEX fleeSequence
SEQUENCE_INDEX drunkSequence
VEHICLE_INDEX vehForReplay
INT iWantedFailedTimer
INT iDisableReplayCameraTimer //Fix for bug 2258455
/// PURPOSE:
/// Used in every MIN1_STATE_MACHINE_SETUP. Advances state machine to MIN1_STATE_MACHINE_LOOP.
PROC MIN1_STATE_SETUP(#IF IS_DEBUG_BUILD STRING s_text #ENDIF)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Initialising ", s_text) ENDIF #ENDIF
bZSkipping = FALSE
#IF IS_DEBUG_BUILD iDebugSkipTime = GET_GAME_TIMER() #ENDIF
missionStateMachine = MIN1_STATE_MACHINE_LOOP
ENDPROC
/// PURPOSE:
/// Used in every MIN1_STATE_MACHINE_CLEANUP. Advances state machine to MIN1_STATE_MACHINE_SETUP.
PROC MIN1_STATE_CLEANUP(#IF IS_DEBUG_BUILD STRING s_text #ENDIF)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Cleaning up ", s_text) ENDIF #ENDIF
CLEAR_PRINTS()
CLEAR_HELP(TRUE)
IF missionStateSkip = stateNULL
missionState = INT_TO_ENUM(MIN1_MISSION_STATE, ENUM_TO_INT(missionState) + 1)
ELSE
missionState = missionStateSkip
ENDIF
missionStateSkip = stateNULL
missionStateMachine = MIN1_STATE_MACHINE_SETUP
ENDPROC
/// PURPOSE:
/// Models required for a mission state are all loaded when the mission state inits, but this is a safety check to ensure a model is loaded before subsequently creating an entity using it.
PROC MIN1_ENSURE_MODEL_IS_LOADED(MODEL_NAMES e_model)
REQUEST_MODEL(e_model)
IF NOT HAS_MODEL_LOADED(e_model)
WHILE NOT HAS_MODEL_LOADED(e_model)
WAIT(0)
ENDWHILE
ENDIF
ENDPROC
/// PURPOSE:
/// Safely creates a vehicle.
PROC MIN1_CREATE_VEHICLE(VEHICLE_INDEX &veh_to_create, MODEL_NAMES e_model, VECTOR v_pos, FLOAT f_heading = 0.0, FLOAT fDirt = 0.0)
IF NOT DOES_ENTITY_EXIST(veh_to_create)
MIN1_ENSURE_MODEL_IS_LOADED(e_model)
veh_to_create = CREATE_VEHICLE(e_model, v_pos, f_heading)
SET_VEHICLE_DIRT_LEVEL(veh_to_create, fDirt)
ENDIF
ENDPROC
/// PURPOSE:
/// Safely spawn a ped.
PROC MIN1_CREATE_PED(PED_INDEX &ped_to_create, MODEL_NAMES e_model, VECTOR v_pos, FLOAT f_heading = 0.0)
IF NOT DOES_ENTITY_EXIST(ped_to_create)
MIN1_ENSURE_MODEL_IS_LOADED(e_model)
ped_to_create = CREATE_PED(PEDTYPE_MISSION, e_model, v_pos, f_heading)
SET_PED_DEFAULT_COMPONENT_VARIATION(ped_to_create)
REMOVE_ALL_PED_WEAPONS(ped_to_create)
ENDIF
ENDPROC
/// PURPOSE:
/// Safely spawn a ped inside a vehicle.
PROC MIN1_CREATE_PED_IN_VEHICLE(VEHICLE_INDEX veh, PED_INDEX &ped_to_create, MODEL_NAMES e_model, VEHICLE_SEAT seat)
IF NOT DOES_ENTITY_EXIST(ped_to_create)
AND DOES_ENTITY_EXIST(veh)
MIN1_ENSURE_MODEL_IS_LOADED(e_model)
ped_to_create = CREATE_PED_INSIDE_VEHICLE(veh, PEDTYPE_MISSION, e_model, seat)
SET_PED_DEFAULT_COMPONENT_VARIATION(ped_to_create)
REMOVE_ALL_PED_WEAPONS(ped_to_create)
ENDIF
ENDPROC
/// PURPOSE:
/// Safely remove all blips in this mission.
PROC MIN1_REMOVE_ALL_BLIPS()
SAFE_REMOVE_BLIP(blipPatrolVehicle)
SAFE_REMOVE_BLIP(blipDestination)
SAFE_REMOVE_BLIP(blipMariachi[0])
SAFE_REMOVE_BLIP(blipMariachi[1])
SAFE_REMOVE_BLIP(blipJoe)
ENDPROC
/// PURPOSE:
/// Safely remove all vehicles in this mission.
PROC MIN1_REMOVE_ALL_VEHICLES(BOOL b_delete = FALSE)
IF IS_ENTITY_ALIVE(vehMariachiCar)
SET_ENTITY_LOAD_COLLISION_FLAG(vehMariachiCar, FALSE)
ENDIF
IF IS_ENTITY_ALIVE(vehPatrolVehicle)
AND DOES_VEHICLE_HAVE_STUCK_VEHICLE_CHECK(vehPatrolVehicle)
REMOVE_VEHICLE_STUCK_CHECK(vehPatrolVehicle)
ENDIF
IF b_delete = TRUE
SAFE_DELETE_VEHICLE(vehMariachiCar)
SAFE_DELETE_VEHICLE(vehCamperVan)
SAFE_RELEASE_VEHICLE(vehPatrolVehicle) // Prevents the patrol vehicle being deleted at the end of the mission
SAFE_DELETE_VEHICLE(vehForReplay)
ELSE
SAFE_RELEASE_VEHICLE(vehMariachiCar)
SAFE_RELEASE_VEHICLE(vehCamperVan)
SAFE_RELEASE_VEHICLE(vehPatrolVehicle)
SAFE_RELEASE_VEHICLE(vehForReplay)
ENDIF
ENDPROC
/// PURPOSE:
/// Safely remove all peds in this mission.
PROC MIN1_REMOVE_ALL_PEDS(BOOL b_delete = FALSE, BOOL b_terminate_mission = TRUE)
IF b_delete = TRUE
IF b_terminate_mission = TRUE
SAFE_DELETE_PED(pedBuddy[JOE].ped)
SAFE_DELETE_PED(pedBuddy[JOSEF].ped)
ENDIF
SAFE_DELETE_PED(pedWalkOutBar)
SAFE_DELETE_PED(pedMariachi[0])
SAFE_DELETE_PED(pedMariachi[1])
SAFE_DELETE_PED(pedJanet)
ELSE
IF b_terminate_mission = TRUE
SAFE_RELEASE_PED(pedBuddy[JOE].ped)
SAFE_RELEASE_PED(pedBuddy[JOSEF].ped)
ENDIF
SAFE_RELEASE_PED(pedWalkOutBar)
SAFE_RELEASE_PED(pedMariachi[0])
SAFE_RELEASE_PED(pedMariachi[1])
SAFE_RELEASE_PED(pedJanet)
ENDIF
ENDPROC
/// PURPOSE:
/// Ensures props that the Mariachi car smashes through have their full physics loaded. Fixes B*578109.
PROC MIN1_SET_PROPS_TO_USE_FULL_PHYSICS(BOOL b_enable)
IF b_enable = TRUE
CREATE_FORCED_OBJECT(<<2142.74, 3355.45, 44.44>>,5,prop_fnc_farm_01e,TRUE)
CREATE_FORCED_OBJECT(<<2146.07, 3351.57, 44.50>>,5,prop_fnclink_01d,TRUE)
CREATE_FORCED_OBJECT(<<2067.85, 3266.79, 44.45>>,5,prop_sign_road_03a,TRUE) // B*1098655
ELSE
REMOVE_FORCED_OBJECT(<<2142.74, 3355.45, 44.44>>,5,prop_fnc_farm_01e)
REMOVE_FORCED_OBJECT(<<2146.07, 3351.57, 44.50>>,5,prop_fnclink_01d)
REMOVE_FORCED_OBJECT(<<2067.85, 3266.79, 44.45>>,5,prop_sign_road_03a)
ENDIF
ENDPROC
/// PURPOSE:
/// Switches off the road nodes along the road at the start of the car chase.
PROC MIN1_CHANGE_ROAD_NODES_FOR_CAR_CHASE(BOOL b_set_on)
IF b_set_on = TRUE
SET_ROADS_BACK_TO_ORIGINAL(<<1906,3000,0>>, <<2150,3500,100>>)
ELSE
SET_ROADS_IN_AREA(<<1906,3000,0>>, <<2150,3500,100>>, FALSE)
CLEAR_AREA_OF_VEHICLES(<<1995.33972, 3061.05371, 46.04894>>, 10, FALSE, FALSE, TRUE, TRUE)
CLEAR_AREA_OF_VEHICLES(<<1958.77063, 3090.40576, 45.94596>>, 40, FALSE, FALSE, TRUE, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Set road nodes off at start of car chase") ENDIF #ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Clean up everything conceivably setup in this mission.
/// PARAMS:
/// b_delete_entities - TRUE if should delete entites, FALSE if should remove entities for elegant cleanup.
/// b_terminate_mission - TRUE if cleaning up before terminating, FALSE if cleaning up before a debug skip.
PROC MIN1_MISSION_CLEANUP(BOOL b_delete_entities = FALSE, BOOL b_terminate_mission = FALSE)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Cleaning up mission...") ENDIF #ENDIF
CLEAR_PRINTS()
CLEAR_HELP()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
REMOVE_PED_FOR_DIALOGUE(sConversation, 2) // Trevor
REMOVE_PED_FOR_DIALOGUE(sConversation, 3) // Joe
REMOVE_PED_FOR_DIALOGUE(sConversation, 4) // Josef
REMOVE_PED_FOR_DIALOGUE(sConversation, 5) // Drunken hillbilly
REMOVE_PED_FOR_DIALOGUE(sConversation, 6) // Mariachi van ped
REMOVE_PED_FOR_DIALOGUE(sConversation, 7) // Mariachi van ped
REMOVE_PED_FOR_DIALOGUE(sConversation, 8) // Bar woman
IF IS_ENTITY_ALIVE(vehMariachiCar)
SET_LAST_DRIVEN_VEHICLE(vehMariachiCar) // B*1423496 Make sure the mariachi car doesn't get removed
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehMariachiCar)
STOP_PLAYBACK_RECORDED_VEHICLE(vehMariachiCar)
ENDIF
ENDIF
IF IS_ENTITY_ALIVE(vehPatrolVehicle) // Re-enable damage when we're going to clean up the mission
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(vehPatrolVehicle, FALSE)
SET_ENTITY_PROOFS(vehPatrolVehicle, FALSE, FALSE, FALSE, FALSE, FALSE)
ENDIF
MIN1_REMOVE_ALL_BLIPS()
MIN1_REMOVE_ALL_PEDS(b_delete_entities)
MIN1_REMOVE_ALL_VEHICLES(b_delete_entities)
REMOVE_VEHICLE_RECORDING(500, "Min1_Van")
INT i = 0
REPEAT NUM_PED_MODELS i
SET_MODEL_AS_NO_LONGER_NEEDED(modelPed[i])
ENDREPEAT
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelMariachiCar, FALSE)
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelPatrolVehicle, FALSE)
SET_MODEL_AS_NO_LONGER_NEEDED(modelMariachiCar)
SET_MODEL_AS_NO_LONGER_NEEDED(modelPatrolVehicle)
UNPIN_INTERIOR(interiorBar)
MIN1_SET_PROPS_TO_USE_FULL_PHYSICS(FALSE)
MIN1_CHANGE_ROAD_NODES_FOR_CAR_CHASE(TRUE)
REMOVE_ANIM_DICT("missminuteman_1ig_1")
TRIGGER_MUSIC_EVENT("MM1_STOP")
IF IS_AUDIO_SCENE_ACTIVE("MINUTE_01_SCENE")
STOP_AUDIO_SCENE("MINUTE_01_SCENE")
ENDIF
REMOVE_VEHICLE_ASSET(modelPatrolVehicle)
REMOVE_ANIM_DICT("move_m@drunk@verydrunk")
REMOVE_ANIM_SET("MOVE_M@BAIL_BOND_NOT_TAZERED")
REMOVE_ANIM_SET("MOVE_M@BAIL_BOND_TAZERED")
RC_CleanupSceneEntities(sRCLauncherDataLocal, FALSE)
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
STOP_STREAM() // Mariachi singing
IF b_terminate_mission = TRUE
SET_CREATE_RANDOM_COPS(TRUE)
SET_CREATE_RANDOM_COPS_ON_SCENARIOS(TRUE)
RELEASE_SUPPRESSED_EMERGENCY_CALLS() // B*1472113 - Prevent player calling the cops
SET_RANDOM_TRAINS(TRUE)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<322,3409,35>>-<<40,40,40>>, <<322,3409,35>>+<<40,40,40>>, TRUE)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<< 2710.43, 4141.74, 42.92 >> - <<100.0, 100.0, 100.0>>, << 2710.43, 4141.74, 42.92 >> + <<100.0, 100.0, 100.0>>, TRUE) // B*2082981
#IF IS_DEBUG_BUILD
IF DOES_WIDGET_GROUP_EXIST(widgetGroup)
DELETE_WIDGET_GROUP(widgetGroup)
ENDIF
#ENDIF
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Cleaned up mission") ENDIF #ENDIF
ENDPROC
/// PURPOSE:
/// Standard RC mission cleanup function.
PROC Script_Cleanup()
// Ensure launcher is cleaned up
RC_CLEANUP_LAUNCHER()
IF (Random_Character_Cleanup_If_Triggered())
MIN1_MISSION_CLEANUP(FALSE, TRUE)
ENDIF
RC_CleanupSceneEntities(sRCLauncherDataLocal, FALSE)
TERMINATE_THIS_THREAD()
ENDPROC
/// PURPOSE:
/// Standard RC mission passed function.
PROC Script_Passed()
SET_PLAYER_PED_WEAPON_UNLOCKED(CHAR_MICHAEL, WEAPONTYPE_STUNGUN, TRUE, TRUE) // See B*1138740
SET_PLAYER_PED_WEAPON_UNLOCKED(CHAR_FRANKLIN, WEAPONTYPE_STUNGUN, TRUE, TRUE)
SET_PLAYER_PED_WEAPON_UNLOCKED(CHAR_TREVOR, WEAPONTYPE_STUNGUN, TRUE, TRUE)
ADD_CONTACT_TO_PHONEBOOK(CHAR_JOE, TREVOR_BOOK)
WAIT(0)
ADD_CONTACT_TO_PHONEBOOK(CHAR_JOSEF, TREVOR_BOOK)
CREDIT_BANK_ACCOUNT(CHAR_TREVOR, BAAC_UNLOGGED_SMALL_ACTION, 500) // See B*1207293 // See B*1341071
Random_Character_Passed(CP_RAND_C_MIN1)
Script_Cleanup()
ENDPROC
/// PURPOSE:
/// Mission failed function.
PROC MIN1_MISSION_FAILED(FAILED_REASON reason = FAILED_DEFAULT)
IF bZSkipping = FALSE
failReason = reason
missionStateMachine = MIN1_STATE_MACHINE_CLEANUP
missionStateSkip = stateFailed
ENDIF
ENDPROC
/// PURPOSE:
/// Puts the desired ped into a group friendly to the player.
PROC MIN1_SET_PED_AS_PLAYER_FRIEND(PED_INDEX ped_to_set_as_friend)
IF IS_ENTITY_ALIVE(ped_to_set_as_friend)
relGroupFriendly = GET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID())
SET_PED_RELATIONSHIP_GROUP_HASH(ped_to_set_as_friend, relGroupFriendly)
SET_PED_CONFIG_FLAG(ped_to_set_as_friend, PCF_KeepRelationshipGroupAfterCleanUp, TRUE)
ENDIF
ENDPROC
/// PURPOSE:
/// Set up mission prior to going into any mission states.
PROC MIN1_MISSION_SETUP()
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Starting mission setup...") ENDIF #ENDIF
failReason = FAILED_DEFAULT
REQUEST_ADDITIONAL_TEXT("MIN1", MISSION_TEXT_SLOT)
WHILE NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
WAIT(0)
ENDWHILE
#IF IS_DEBUG_BUILD
mSkipMenu[Z_SKIP_INTRO].sTxtLabel = "Intro - mmb_1_rcm"
mSkipMenu[Z_SKIP_GO_TO_BAR].sTxtLabel = "Go to bar"
mSkipMenu[Z_SKIP_GO_INSIDE_BAR].sTxtLabel = "Enter bar"
mSkipMenu[Z_SKIP_CHASE_CAR].sTxtLabel = "Car chase"
mSkipMenu[Z_SKIP_STUN_MARIACHI].sTxtLabel = "Stun Mariachi"
IF NOT DOES_WIDGET_GROUP_EXIST(widgetGroup)
widgetGroup = START_WIDGET_GROUP("Minute 1 widgets")
ADD_WIDGET_BOOL("TTY Toggle - Print Mission Debug Info", bDebug_PrintToTTY)
STOP_WIDGET_GROUP()
ENDIF
#ENDIF
modelMariachiCar = TORNADO4
modelPatrolVehicle = PRANGER
modelPed[MIN1_MODEL_MARIACHI_PED] = S_M_M_MARIACHI_01
modelPed[MIN1_MODEL_DRUNK_PED_1] = A_M_M_HILLBILLY_01
pedBuddy[JOE].seatStart = VS_FRONT_RIGHT
pedBuddy[JOSEF].seatStart = VS_BACK_RIGHT
pedBuddy[JOE].seatEnd = VS_DRIVER
pedBuddy[JOSEF].seatEnd = VS_FRONT_RIGHT
interiorBar = GET_INTERIOR_AT_COORDS(vBarInside)
iCurrentShotVehicleDialogue = 0
sShotVehicleDialogueString[0] = "MIN1_SHOOT1"
sShotVehicleDialogueString[1] = "MIN1_SHOOT2"
vCrashConversationPos[0] = <<2212.9785, 3478.3857, 47.9132>>
vCrashConversationPos[1] = <<2268.7229, 3601.1167, 46.2687>>
vCrashConversationPos[2] = <<2392.1316, 3710.2808, 48.0988>>
vCrashConversationPos[3] = <<2632.2820, 3854.4854, 64.1631>>
tSavedConversationRoot = ""
iPatrolVehicleTyresBurstTimer = GET_GAME_TIMER()
REQUEST_VEHICLE_ASSET(modelPatrolVehicle) // B*1037225 - Prestream vehicle anims in case player exits car after the intro mocap
SUPPRESS_EMERGENCY_CALLS() // B*1472113 - Prevent player calling the cops
SET_CREATE_RANDOM_COPS(FALSE)
SET_CREATE_RANDOM_COPS_ON_SCENARIOS(FALSE)
//IF IS_REPEAT_PLAY_ACTIVE() // Remove the stun gun regardless
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
AND HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_STUNGUN)
REMOVE_WEAPON_FROM_PED(PLAYER_PED_ID(), WEAPONTYPE_STUNGUN) // B*1351410
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Player already had a stun gun so removed it") ENDIF #ENDIF
ENDIF
iWantedFailedTimer = -1
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<< 2710.43, 4141.74, 42.92 >> - <<100.0, 100.0, 100.0>>, << 2710.43, 4141.74, 42.92 >> + <<100.0, 100.0, 100.0>>, FALSE) // B*2082981
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Finished mission setup") ENDIF #ENDIF
ENDPROC
/// PURPOSE:
/// Loads the assets for the required mission stage.
PROC MIN1_LOAD_ASSETS_FOR_MISSION_STATE(MIN1_MISSION_STATE current_state)
SWITCH current_state
CASE stateIntro
REQUEST_MODEL(modelPatrolVehicle)
BREAK
CASE stateGoInsideBar
REQUEST_MODEL(modelPed[MIN1_MODEL_DRUNK_PED_1])
BREAK
CASE stateGoOutsideBar
REQUEST_MODEL(modelMariachiCar)
REQUEST_MODEL(modelPed[MIN1_MODEL_MARIACHI_PED])
REQUEST_VEHICLE_RECORDING(500, "Min1_Van")
REQUEST_VEHICLE_RECORDING(500, "Min1_PV")
REQUEST_ANIM_DICT("missminuteman_1ig_1")
BREAK
CASE stateStunMariachiPeds
REQUEST_ANIM_DICT("missminuteman_1ig_2")
REQUEST_ANIM_SET("MOVE_M@BAIL_BOND_NOT_TAZERED")
REQUEST_ANIM_SET("MOVE_M@BAIL_BOND_TAZERED")
BREAK
CASE stateMissionPassed
REQUEST_MODEL(modelMariachiCar)
BREAK
ENDSWITCH
BOOL b_assets_loaded = FALSE
WHILE b_assets_loaded = FALSE
SWITCH current_state
CASE stateIntro
IF HAS_MODEL_LOADED(modelPatrolVehicle)
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelPatrolVehicle, TRUE)
b_assets_loaded = TRUE
ENDIF
BREAK
CASE stateGoInsideBar
IF HAS_MODEL_LOADED(modelPed[MIN1_MODEL_DRUNK_PED_1])
b_assets_loaded = TRUE
ENDIF
BREAK
CASE stateGoOutsideBar
IF HAS_MODEL_LOADED(modelMariachiCar)
AND HAS_MODEL_LOADED(modelPed[MIN1_MODEL_MARIACHI_PED])
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(500, "Min1_Van")
AND HAS_VEHICLE_RECORDING_BEEN_LOADED(500, "Min1_PV")
AND HAS_ANIM_DICT_LOADED("missminuteman_1ig_1")
SET_VEHICLE_MODEL_IS_SUPPRESSED(modelMariachiCar, TRUE)
b_assets_loaded = TRUE
ENDIF
BREAK
CASE stateStunMariachiPeds
IF HAS_ANIM_DICT_LOADED("missminuteman_1ig_2")
AND HAS_CLIP_SET_LOADED("MOVE_M@BAIL_BOND_NOT_TAZERED")
AND HAS_CLIP_SET_LOADED("MOVE_M@BAIL_BOND_TAZERED")
b_assets_loaded = TRUE
ENDIF
BREAK
CASE stateMissionPassed
IF HAS_MODEL_LOADED(modelMariachiCar)
b_assets_loaded = TRUE
ENDIF
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Loading assets...") ENDIF #ENDIF
WAIT(0)
ENDWHILE
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Assets loaded") ENDIF #ENDIF
ENDPROC
/// PURPOSE:
/// Teleports the patrol vehicle for a debug skip, and ensures Trevor, Joe and Josef are sat inside it.
/// PARAMS:
/// b_recreate - TRUE if we need to delete and recreate the patrol vehicle.
/// b_set_rotation - TRUE if starting at the car chase so the car's rotation needs setting for the rolling start car recording, FALSE if simply create the patrol vehicle at the pos and heading.
PROC MIN1_SETUP_PATROL_VEHICLE(VECTOR v_spawn_pos, FLOAT f_spawn_pos, BOOL b_set_for_rolling_start = FALSE)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Starting setting up patrol vehicle...") ENDIF #ENDIF
IF NOT IS_ENTITY_ALIVE(vehPatrolVehicle)
MIN1_LOAD_ASSETS_FOR_MISSION_STATE(stateIntro)
MIN1_CREATE_VEHICLE(vehPatrolVehicle, modelPatrolVehicle, v_spawn_pos, f_spawn_pos, 10)
SET_MODEL_AS_NO_LONGER_NEEDED(modelPatrolVehicle)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Patrol vehicle didn't exist so created it") ENDIF #ENDIF
ENDIF
IF NOT IS_ENTITY_ALIVE(pedBuddy[JOE].ped)
AND IS_ENTITY_ALIVE(vehPatrolVehicle)
WHILE NOT CREATE_NPC_PED_INSIDE_VEHICLE(pedBuddy[JOE].ped, CHAR_JOE, vehPatrolVehicle, pedBuddy[JOE].seatStart)
WAIT(0)
ENDWHILE
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Joe didn't exist so created him") ENDIF #ENDIF
ENDIF
IF NOT IS_ENTITY_ALIVE(pedBuddy[JOSEF].ped)
AND IS_ENTITY_ALIVE(vehPatrolVehicle)
WHILE NOT CREATE_NPC_PED_INSIDE_VEHICLE(pedBuddy[JOSEF].ped, CHAR_JOSEF, vehPatrolVehicle, pedBuddy[JOSEF].seatStart)
WAIT(0)
ENDWHILE
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Josef didn't exist so created him") ENDIF #ENDIF
ENDIF
IF IS_ENTITY_ALIVE(vehPatrolVehicle)
SET_ENTITY_AS_MISSION_ENTITY(vehPatrolVehicle, TRUE, TRUE)
IF b_set_for_rolling_start = TRUE
START_PLAYBACK_RECORDED_VEHICLE(vehPatrolVehicle, 500, "Min1_PV")
PAUSE_PLAYBACK_RECORDED_VEHICLE(vehPatrolVehicle)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehPatrolVehicle, 1500)
ELSE
SET_VEHICLE_ON_GROUND_PROPERLY(vehPatrolVehicle)
ENDIF
SET_VEHICLE_AS_RESTRICTED(vehPatrolVehicle, 0)
SET_VEHICLE_ALARM(vehPatrolVehicle, FALSE)
SET_VEHICLE_DOORS_LOCKED(vehPatrolVehicle, VEHICLELOCK_UNLOCKED)
SET_VEHICLE_ALARM(vehPatrolVehicle, FALSE)
SET_VEHICLE_CAN_LEAK_OIL(vehPatrolVehicle, FALSE)
SET_VEHICLE_CAN_LEAK_PETROL(vehPatrolVehicle, FALSE)
SET_DISABLE_PRETEND_OCCUPANTS(vehPatrolVehicle, TRUE)
SET_ENTITY_LOD_DIST(vehPatrolVehicle, 200)
SET_VEHICLE_DIRT_LEVEL(vehPatrolVehicle, 10)
SET_VEHICLE_STRONG(vehPatrolVehicle, TRUE)
SET_VEHICLE_HAS_STRONG_AXLES(vehPatrolVehicle, TRUE)
INT i = 0
REPEAT NUM_BUDDIES i
IF IS_ENTITY_ALIVE(pedBuddy[i].ped)
IF i = 1 // Setting a hat on Joe causes B*1509088
SET_PED_PROP_INDEX(pedBuddy[i].ped, ANCHOR_HEAD, 0)
ENDIF
SET_PED_PROP_INDEX(pedBuddy[i].ped, ANCHOR_EYES, 0)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedBuddy[i].ped, TRUE)
IF NOT IS_PED_IN_VEHICLE(pedBuddy[i].ped, vehPatrolVehicle)
FREEZE_ENTITY_POSITION(pedBuddy[i].ped, FALSE) // B*886344
SET_PED_INTO_VEHICLE(pedBuddy[i].ped, vehPatrolVehicle, pedBuddy[i].seatStart)
ENDIF
MIN1_SET_PED_AS_PLAYER_FRIEND(pedBuddy[i].ped)
SET_PED_CAN_BE_TARGETTED(pedBuddy[i].ped, FALSE)
SET_PED_CAN_BE_DRAGGED_OUT(pedBuddy[i].ped, FALSE)
SET_PED_CONFIG_FLAG(pedBuddy[i].ped, PCF_WillFlyThroughWindscreen, FALSE)
SET_PED_CONFIG_FLAG(pedBuddy[i].ped, PCF_GetOutUndriveableVehicle, FALSE) // See B*922227
SET_PED_CONFIG_FLAG(pedBuddy[i].ped, PCF_GetOutBurningVehicle, TRUE)
SET_PED_CONFIG_FLAG(pedBuddy[i].ped, PCF_RunFromFiresAndExplosions, TRUE)
SET_PED_CONFIG_FLAG(pedBuddy[i].ped, PCF_UseKinematicModeWhenStationary, FALSE)
SET_PED_CONFIG_FLAG(pedBuddy[i].ped, PCF_DontAllowToBeDraggedOutOfVehicle, TRUE)
SET_PED_CONFIG_FLAG(pedBuddy[i].ped, PCF_DontInfluenceWantedLevel, TRUE)
SET_PED_CONFIG_FLAG(pedBuddy[i].ped, PCF_ForceDirectEntry, TRUE)
SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(pedBuddy[i].ped, FALSE)
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(pedBuddy[i].ped, TRUE)
IF i = JOE
ADD_PED_FOR_DIALOGUE(sConversation, 3, pedBuddy[JOE].ped, "JOE")
ELSE
ADD_PED_FOR_DIALOGUE(sConversation, 4, pedBuddy[JOSEF].ped, "JOSEF")
ENDIF
ENDIF
ENDREPEAT
IF NOT IS_REPLAY_BEING_SET_UP()
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPatrolVehicle)
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehPatrolVehicle, VS_DRIVER)
ENDIF
ENDIF
ENDIF
ADD_PED_FOR_DIALOGUE(sConversation, 2, PLAYER_PED_ID(), "TREVOR")
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Finished setting up patrol vehicle") ENDIF #ENDIF
ENDPROC
/// PURPOSE:
/// Create the car and Mariachi occupants.
PROC MIN1_SPAWN_MARIACHI_CAR(VECTOR v_spawn_pos, FLOAT f_spawn_pos, FLOAT f_skip_to_carrec_time, BOOL b_set_rotation = TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started creating Mariachi car and occupants...") ENDIF #ENDIF
CLEAR_AREA_OF_PROJECTILES(v_spawn_pos, 10)
CLEAR_AREA_OF_PROJECTILES(<<2032.00610, 3308.28491, 45.05850>>, 250) // For B*1084769
STOP_FIRE_IN_RANGE(v_spawn_pos, 10) // For B*1119875
MIN1_LOAD_ASSETS_FOR_MISSION_STATE(stateGoOutsideBar)
MIN1_CREATE_VEHICLE(vehMariachiCar, modelMariachiCar, v_spawn_pos, f_spawn_pos, 15)
SET_MODEL_AS_NO_LONGER_NEEDED(modelMariachiCar)
IF IS_ENTITY_ALIVE(vehMariachiCar)
IF b_set_rotation = TRUE
SET_ENTITY_ROTATION(vehMariachiCar, GET_ROTATION_OF_VEHICLE_RECORDING_ID_AT_TIME(GET_VEHICLE_RECORDING_ID(500, "Min1_Van"), 0))
ENDIF
SET_ENTITY_LOAD_COLLISION_FLAG(vehMariachiCar, TRUE)
SET_ENTITY_LOD_DIST(vehMariachiCar, 200)
SET_DISABLE_PRETEND_OCCUPANTS(vehMariachiCar, TRUE)
SET_VEHICLE_HAS_STRONG_AXLES(vehMariachiCar, TRUE)
MIN1_CREATE_PED_IN_VEHICLE(vehMariachiCar, pedMariachi[0], modelPed[MIN1_MODEL_MARIACHI_PED], VS_DRIVER)
MIN1_CREATE_PED_IN_VEHICLE(vehMariachiCar, pedMariachi[1], modelPed[MIN1_MODEL_MARIACHI_PED], VS_FRONT_RIGHT)
IF f_skip_to_carrec_time > -1
START_PLAYBACK_RECORDED_VEHICLE(vehMariachiCar, 500, "Min1_Van")
PAUSE_PLAYBACK_RECORDED_VEHICLE(vehMariachiCar)
SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(vehMariachiCar, f_skip_to_carrec_time)
ENDIF
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(modelPed[MIN1_MODEL_MARIACHI_PED])
INT i = 0
REPEAT NUM_MARIACHI_PEDS i
IF IS_ENTITY_ALIVE(pedMariachi[i])
SET_ENTITY_HEALTH(pedMariachi[i], 400)
SET_PED_MAX_HEALTH(pedMariachi[i], 400)
SET_PED_CONFIG_FLAG(pedMariachi[i], PCF_WillFlyThroughWindscreen, FALSE)
//SET_PED_CONFIG_FLAG(pedMariachi[i], PCF_GetOutUndriveableVehicle, TRUE) // See B*905867
SET_PED_CONFIG_FLAG(pedMariachi[i], PCF_GetOutBurningVehicle, TRUE)
SET_PED_CONFIG_FLAG(pedMariachi[i], PCF_RunFromFiresAndExplosions, TRUE)
SET_PED_CONFIG_FLAG(pedMariachi[i], PCF_PedsJackingMeDontGetIn, TRUE)
SET_PED_CONFIG_FLAG(pedMariachi[i], PCF_DontInfluenceWantedLevel, TRUE)
SET_PED_CONFIG_FLAG(pedMariachi[i], PCF_ForceDirectEntry, TRUE)
SET_PED_CONFIG_FLAG(pedMariachi[i], PCF_DisableGoToWritheWhenInjured, TRUE) // Hopefully fixes B*1407704
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(pedMariachi[i], TRUE)
SET_PED_SUFFERS_CRITICAL_HITS(pedMariachi[i], FALSE)
SET_PED_CAN_BE_TARGETTED(pedMariachi[i], FALSE)
SET_ENTITY_LOD_DIST(pedMariachi[i], 200)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedMariachi[i], TRUE)
IF i = 0
ADD_PED_FOR_DIALOGUE(sConversation, 6, pedMariachi[i], "MARIACHI1")
SET_PED_COMPONENT_VARIATION(pedMariachi[i], INT_TO_ENUM(PED_COMPONENT,0), 0, 2, 0) //(head)
ELSE
ADD_PED_FOR_DIALOGUE(sConversation, 7, pedMariachi[i], "MARIACHI2")
SET_PED_COMPONENT_VARIATION(pedMariachi[i], INT_TO_ENUM(PED_COMPONENT,0), 2, 1, 0) //(head)
ENDIF
ENDIF
ENDREPEAT
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Finished creating Mariachi car") ENDIF #ENDIF
ENDPROC
/// PURPOSE:
/// Handles debug skipping.
/// PARAMS:
/// i_new_state - The state to debug skip to.
PROC MIN1_DEBUG_SKIP_STATE(INT i_new_state)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Starting debug skip to ", i_new_state, "...") ENDIF #ENDIF
RC_START_Z_SKIP()
bZSkipping = TRUE
tSavedConversationRoot = ""
IF NOT IS_REPLAY_BEING_SET_UP()
SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), GET_ENTITY_COORDS(PLAYER_PED_ID())) // If doing a z skip ensure he's warped out of the patrol vehicle cos we need to delete it
ENDIF
MIN1_MISSION_CLEANUP(TRUE)
REMOVE_ALL_SHOCKING_EVENTS(FALSE) // B*1469724 - Try to let scenario peds respawn immediately
REMOVE_SHOCKING_EVENT_SPAWN_BLOCKING_AREAS() // B*1407724 - And another try
CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 100, TRUE)
iCurrentShotVehicleDialogue = 0
SWITCH i_new_state
CASE Z_SKIP_INTRO
missionStateSkip = stateIntro
BREAK
CASE Z_SKIP_GO_TO_BAR
MIN1_SETUP_PATROL_VEHICLE(<<321.687347,3408.640625,35.343765>>, -105.797066)
CREATE_VEHICLE_FOR_REPLAY(vehForReplay, vPlayerCarRespot, fPlayerCarRespot, FALSE, FALSE, FALSE, FALSE, FALSE)
missionStateSkip = stateGoToBar
BREAK
CASE Z_SKIP_GO_INSIDE_BAR
MIN1_SETUP_PATROL_VEHICLE(<< 1981.662720,3076.814209,46.637543 >>, -140.250092)
bIsInteriorPinned = FALSE
missionStateSkip = stateGoInsideBar
BREAK
CASE Z_SKIP_CHASE_CAR
MIN1_LOAD_ASSETS_FOR_MISSION_STATE(stateGoOutsideBar)
MIN1_SETUP_PATROL_VEHICLE(<< 1995.8782, 3058.1973, 46.6988 >>, 45.833717, TRUE)
MIN1_SPAWN_MARIACHI_CAR(vMariachiCar, fMariachiCar, 4000)
MIN1_CHANGE_ROAD_NODES_FOR_CAR_CHASE(FALSE)
missionStateSkip = stateChaseMariachiCar
BREAK
CASE Z_SKIP_STUN_MARIACHI
MIN1_LOAD_ASSETS_FOR_MISSION_STATE(stateGoOutsideBar)
MIN1_SETUP_PATROL_VEHICLE(<< 2673.9829, 4277.2314, 43.6559 >>, 25.4114)
MIN1_SPAWN_MARIACHI_CAR(<< 2668.0261, 4288.9590, 43.7695 >>, 28.0026, -1, FALSE)
missionStateSkip = stateStunMariachiPeds
BREAK
CASE Z_SKIP_MISSION_PASSED
MIN1_LOAD_ASSETS_FOR_MISSION_STATE(stateMissionPassed)
IF NOT IS_REPLAY_BEING_SET_UP()
SAFE_TELEPORT_ENTITY(PLAYER_PED_ID(), <<2698.2053, 4135.9048, 42.8234>>, 323.4031)
ENDIF
MIN1_CREATE_VEHICLE(vehMariachiCar, modelMariachiCar, <<2699.6541, 4141.0044, 42.6652>>, 312.6240, 15)
SET_MODEL_AS_NO_LONGER_NEEDED(modelMariachiCar)
missionStateSkip = stateMissionPassed
BREAK
ENDSWITCH
IF NOT IS_REPLAY_BEING_SET_UP()
WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID()))
ENDIF
IF i_new_state = Z_SKIP_CHASE_CAR
bStartedOutsideBarConversation = TRUE // If retrying the player is already in the patrol vehicle so don't play this
ENDIF
IF i_new_state = Z_SKIP_GO_TO_BAR
OR i_new_state = Z_SKIP_GO_INSIDE_BAR
OR i_new_state = Z_SKIP_CHASE_CAR
OR i_new_state = Z_SKIP_STUN_MARIACHI
END_REPLAY_SETUP(vehPatrolVehicle)
ELSE
END_REPLAY_SETUP()
ENDIF
IF i_new_state = Z_SKIP_MISSION_PASSED
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SAFE_FADE_SCREEN_IN_FROM_BLACK() // Screen needs to be fully faded back in before the mission complete GUI stuff will display
ENDIF
IF i_new_state = Z_SKIP_INTRO
RC_END_Z_SKIP(TRUE, FALSE)
ELSE
RC_END_Z_SKIP()
ENDIF
missionStateMachine = MIN1_STATE_MACHINE_CLEANUP
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Finished debug skip to ", i_new_state) ENDIF #ENDIF
ENDPROC
/// PURPOSE:
/// Setup Joe/Josef for cutscene.
PROC MIN1_SETUP_JOE_JOSEF_CUTSCENE_PROPS()
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() // B*1420964
#IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "MINUTE1: CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY is TRUE") #ENDIF
//SET_CUTSCENE_PED_PROP_VARIATION("Joe", ANCHOR_HEAD, 0, 0) // Setting a hat on Joe causes B*1509088
SET_CUTSCENE_PED_PROP_VARIATION("Joe", ANCHOR_EYES, 0, 0)
SET_CUTSCENE_PED_PROP_VARIATION("Josef", ANCHOR_HEAD, 0, 0)
SET_CUTSCENE_PED_PROP_VARIATION("Josef", ANCHOR_EYES, 0, 0)
ENDIF
ENDPROC
/// PURPOSE:
/// Make/stop Joe and Josef look at the player.
PROC MIN1_MAKE_BUDDIES_LOOK_AT_PLAYER(BOOL b_look_at_player)
INT i = 0
REPEAT NUM_BUDDIES i
IF IS_ENTITY_ALIVE(pedBuddy[i].ped)
IF b_look_at_player
TASK_LOOK_AT_ENTITY(pedBuddy[i].ped, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
ELSE
TASK_CLEAR_LOOK_AT(pedBuddy[i].ped)
ENDIF
ENDIF
ENDREPEAT
IF b_look_at_player
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Made buddies look at player") ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Stopped buddies looking at player") ENDIF #ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Returns TRUE if the player is in the patrol vehicle.
FUNC BOOL MIN1_IS_PLAYER_IN_PATROL_VEHICLE()
IF IS_ENTITY_ALIVE(vehPatrolVehicle)
AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPatrolVehicle)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Returns TRUE if a conversation can be played.
FUNC BOOL MIN1_ALLOW_CONVERSATION_TO_PLAY(BOOL b_check_for_interrupted_conversations = TRUE, BOOL b_check_for_god_text = TRUE)
IF bZSkipping = TRUE
RETURN FALSE
ENDIF
IF b_check_for_god_text = TRUE // If FALSE the conversation is set to not display subtitles ever, so play conversation regardless of whether there is god text onscreen or not
AND IS_MESSAGE_BEING_DISPLAYED()
AND GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) > 0 // B*665755 Support playing conversations over god text when subtitles are turned off
RETURN FALSE
ENDIF
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
RETURN FALSE
ENDIF
IF b_check_for_interrupted_conversations = TRUE
AND NOT ARE_STRINGS_EQUAL(tSavedConversationRoot, "") // A conversation has been interrupted and still needs to be restored
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Handles playing the conversation if the player exits the player vehicle.
PROC MIN1_MANAGE_EXIT_VEHICLE_CONVERSATION()
IF bStartedStopDriveConversation = FALSE
AND missionState = stateGoToBar
AND MIN1_ALLOW_CONVERSATION_TO_PLAY(FALSE)
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_GETSOUT", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_GETSOUT conversation") ENDIF #ENDIF
bStartedStopDriveConversation = TRUE
ENDIF
ENDPROC
/// PURPOSE:
/// State machine for objectives whenever the player is expected to drive in the patrol vehicle.
PROC MIN1_MANAGE_PATROL_VEHICLE_OBJECTIVES()
IF IS_ENTITY_ALIVE(vehPatrolVehicle)
SWITCH pvStatus
CASE PV_STATUS_PLAYER_NOT_INSIDE
IF missionState = stateGoToBar
AND GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
SAFE_REMOVE_BLIP(blipPatrolVehicle)
bDisplayObjective = TRUE
pvStatus = PV_STATUS_LOSE_WANTED_LEVEL
ELSE
HANDLE_BUDDY_HEAD_TRACK_WHILE_ENTERING_VEHICLE()
IF MIN1_IS_PLAYER_IN_PATROL_VEHICLE()
CLEAR_PRINTS()
SAFE_REMOVE_BLIP(blipPatrolVehicle)
bDisplayObjective = TRUE
IF missionState = stateGoToBar
pvStatus = PV_STATUS_LOSE_WANTED_LEVEL
ELSE
pvStatus = PV_STATUS_GO_TO_DESTINATION
ENDIF
ELSE
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND NOT DOES_BLIP_EXIST(blipPatrolVehicle)
blipPatrolVehicle = CREATE_VEHICLE_BLIP(vehPatrolVehicle)
IF iNumToldToGetInPatrolVehicle = 0
PRINT_NOW("MIN1_01", 5000, 1) // Get in the ~b~patrol vehicle.
iNumToldToGetInPatrolVehicle++
ELIF iNumToldToGetInPatrolVehicle = 1
PRINT_NOW("MIN1_08", 5000, 1) // Get back in the ~b~patrol vehicle.
iNumToldToGetInPatrolVehicle++
ELSE
CLEAR_PRINTS()
ENDIF
ENDIF
MIN1_MANAGE_EXIT_VEHICLE_CONVERSATION()
ENDIF
ENDIF
BREAK
CASE PV_STATUS_LOSE_WANTED_LEVEL
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0
CLEAR_PRINTS()
IF MIN1_IS_PLAYER_IN_PATROL_VEHICLE()
bDisplayObjective = TRUE
pvStatus = PV_STATUS_GO_TO_DESTINATION
ELSE
pvStatus = PV_STATUS_PLAYER_NOT_INSIDE
ENDIF
ELIF bDisplayObjective = TRUE
bDisplayObjective = FALSE
PRINT_NOW("MIN1_02", 5000, 1) // Lose the cops.
ENDIF
BREAK
CASE PV_STATUS_GO_TO_DESTINATION
IF missionState = stateGoToBar
AND GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
SAFE_REMOVE_BLIP(blipDestination)
bDisplayObjective = TRUE
pvStatus = PV_STATUS_LOSE_WANTED_LEVEL
ELSE
IF MIN1_IS_PLAYER_IN_PATROL_VEHICLE()
IF NOT DOES_BLIP_EXIST(blipDestination)
SWITCH missionState
CASE stateGoToBar
blipDestination = CREATE_COORD_BLIP(vBarInside)
BREAK
CASE stateChaseMariachiCar
IF IS_ENTITY_ALIVE(vehMariachiCar)
blipDestination = CREATE_BLIP_FOR_VEHICLE(vehMariachiCar, TRUE)
ENDIF
BREAK
ENDSWITCH
ENDIF
IF bDisplayObjective = TRUE
bDisplayObjective = FALSE
IF iNumToldToGoToDestination < 1
SWITCH missionState
CASE stateGoToBar
PRINT_NOW("MIN1_03", 5000, 1) // Go to the ~y~illegals.
BREAK
CASE stateChaseMariachiCar
PRINT_NOW("MIN1_06", 5000, 1) // Stop the ~r~mariachi band's car.
BREAK
ENDSWITCH
iNumToldToGoToDestination++
ELSE
CLEAR_PRINTS()
ENDIF
MIN1_MAKE_BUDDIES_LOOK_AT_PLAYER(FALSE)
ENDIF
IF GET_VEHICLE_TYRES_CAN_BURST(vehPatrolVehicle)
SET_VEHICLE_TYRES_CAN_BURST(vehPatrolVehicle, FALSE)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Set to can't burst patrol vehicle tyres") ENDIF #ENDIF
ENDIF
ELIF GET_ENTITY_SPEED(vehPatrolVehicle) < 1
SAFE_REMOVE_BLIP(blipDestination)
MIN1_MAKE_BUDDIES_LOOK_AT_PLAYER(TRUE)
IF NOT GET_VEHICLE_TYRES_CAN_BURST(vehPatrolVehicle)
SET_VEHICLE_TYRES_CAN_BURST(vehPatrolVehicle, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Set to can burst patrol vehicle tyres") ENDIF #ENDIF
ENDIF
pvStatus = PV_STATUS_PLAYER_NOT_INSIDE
ELSE
BRING_VEHICLE_TO_HALT(vehPatrolVehicle, 10.0, 1)
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDPROC
/// PURPOSE:
/// Resets the patrol vehicle variables.
PROC MIN1_RESET_PATROL_VEHICLE_VARS()
iNumToldToGetInPatrolVehicle = 1 // B*1299260
iNumToldToGoToDestination = 0
bDisplayObjective = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Patrol vehicle vars reset") ENDIF #ENDIF
ENDPROC
/// PURPOSE:
/// Resets the chase conversation variables.
PROC MIN1_RESET_CHASE_CONVERSATION_VARS()
INT i = 0
REPEAT NUM_CHASE_CONVERSATIONS i
bDoneChaseConversation[i] = FALSE
sChaseConversation[i] = "MIN1_CHASE"
sChaseConversation[i] += (i+1)
ENDREPEAT
iDoneChaseConversations = 0
i = 0
REPEAT NUM_CRASH_CONVERSATIONS i
bStartedCrashConversation[i] = FALSE
ENDREPEAT
iDoneCrashConversations = 0
ENDPROC
/// PURPOSE:
/// Resets the hurry stun conversation variables.
PROC MIN1_RESET_HURRY_STUN_CONVERSATION_VARS()
INT i = 0
REPEAT NUM_HURRY_STUN_CONVERSATIONS i
sHurryStunConversation[i] = "MIN1_HURRY"
sHurryStunConversation[i] += (i+1)
ENDREPEAT
iHurryStunConversationsPlayed = 0
ENDPROC
/// PURPOSE:
/// Handles playing the conversation when they've almost reached the bar.
PROC MIN1_MANAGE_ALMOST_THERE_CONVERSATION()
IF bStartedAlmostThereConversation = FALSE
AND MIN1_ALLOW_CONVERSATION_TO_PLAY()
AND MIN1_IS_PLAYER_IN_PATROL_VEHICLE()
AND IS_ENTITY_IN_RANGE_COORDS(vehPatrolVehicle, vBarOutside, 60) // Don't play until near to the bar
AND NOT IS_ENTITY_IN_RANGE_COORDS(vehPatrolVehicle, vBarOutside, 40) // ...but not too near
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_ALMOST", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_ALMOST conversation") ENDIF #ENDIF
bStartedAlmostThereConversation = TRUE
ENDIF
ENDPROC
/// PURPOSE:
/// Handles playing the conversation if the player drives away from the bar.
PROC MIN1_MANAGE_WRONG_WAY_CONVERSATION()
IF bStartedWrongWayConversation = FALSE
AND bFinishedDriveToBarConversation = TRUE
AND MIN1_ALLOW_CONVERSATION_TO_PLAY()
AND MIN1_IS_PLAYER_IN_PATROL_VEHICLE()
AND GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(vehPatrolVehicle, vBarOutside) > fWrongWayDistance+50
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_WRONG", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_WRONG conversation") ENDIF #ENDIF
bStartedWrongWayConversation = TRUE
ENDIF
ENDPROC
/// PURPOSE:
/// Play the next drive to bar conversation in the sequence.
PROC MIN1_MANAGE_DRIVE_TO_BAR_CONVERSATION()
IF bFinishedDriveToBarConversation = FALSE
IF bStartedDriveToBarConversation = FALSE
IF MIN1_ALLOW_CONVERSATION_TO_PLAY()
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_DRIVEA", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_DRIVEA conversation") ENDIF #ENDIF
bStartedDriveToBarConversation = TRUE
ENDIF
ELSE
IF ARE_STRINGS_EQUAL(tSavedConversationRoot, "")
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
tSavedConversationLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
IF NOT MIN1_IS_PLAYER_IN_PATROL_VEHICLE()
AND NOT IS_ENTITY_IN_RANGE_COORDS(vehPatrolVehicle, vBarOutside, 20) // B*1378563 Don't pause conversation as player has arrived at the bar
tSavedConversationRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Stopping and storing conversation ", tSavedConversationRoot) ENDIF #ENDIF
KILL_ANY_CONVERSATION()
ENDIF
ELIF ARE_STRINGS_EQUAL(tSavedConversationLabel, "NULL") // Wait until MIN1_DRIVEA conversation has finished
bFinishedDriveToBarConversation = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Finished MIN1_DRIVEA conversation") ENDIF #ENDIF
IF IS_ENTITY_ALIVE(vehPatrolVehicle)
fWrongWayDistance = GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(vehPatrolVehicle, vBarOutside)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: fWrongWayDistance = ", fWrongWayDistance) ENDIF #ENDIF
ENDIF
ENDIF
ELSE // A conversation has been stored so we need to check for conditions to restore it
IF MIN1_IS_PLAYER_IN_PATROL_VEHICLE()
AND MIN1_ALLOW_CONVERSATION_TO_PLAY(FALSE)
AND CREATE_CONVERSATION_FROM_SPECIFIC_LINE(sConversation, "MIN1AUD", tSavedConversationRoot, tSavedConversationLabel, CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Restoring conversation ", tSavedConversationRoot) ENDIF #ENDIF
tSavedConversationRoot = ""
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Checks the player doesn't abandon the patrol vehicle, and fails the mission if necessary.
PROC MIN1_MANAGE_ABANDONING_VEHICLE()
IF bZSkipping = FALSE
IF pvStatus = PV_STATUS_PLAYER_NOT_INSIDE
OR pvStatus = PV_STATUS_LOSE_WANTED_LEVEL
IF IS_ENTITY_ALIVE(vehPatrolVehicle)
AND NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPatrolVehicle)
AND GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), vehPatrolVehicle) > 100
MIN1_MISSION_FAILED(FAILED_ABANDONED_BUDDIES)
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Pin/unpin interior depending on distance. See B*1080382.
PROC MIN1_MANAGE_INTERIOR_PINNING()
IF IS_ENTITY_IN_RANGE_COORDS(vehPatrolVehicle, vBarOutside, 100)
IF bIsInteriorPinned = FALSE
PIN_INTERIOR_IN_MEMORY(interiorBar)
bIsInteriorPinned = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Pinned bar interior into memory") ENDIF #ENDIF
ENDIF
ELSE
IF bIsInteriorPinned = TRUE
UNPIN_INTERIOR(interiorBar)
bIsInteriorPinned = FALSE
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Unpinned bar interior from memory") ENDIF #ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// For B*1084002 - Prevent scenario peds in bar becoming agitated
PROC MIN1_DISABLE_TREVOR_AGITATION_TRIGGERS()
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_DisableAgitationTriggers, TRUE)
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_DisableAgitation, TRUE)
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_DisableTalk, TRUE)
ENDIF
ENDPROC
/// PURPOSE:
/// Handles playing the arrived at bar conversation.
PROC MIN1_MANAGE_ARRIVED_AT_BAR_CONVERSATION()
IF MIN1_ALLOW_CONVERSATION_TO_PLAY()
IF bStartedArrivedAtBarConversation = FALSE
IF CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_ATBAR", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_ATBAR conversation") ENDIF #ENDIF
bStartedArrivedAtBarConversation = TRUE
ENDIF
ELIF NOT DOES_BLIP_EXIST(blipDestination)
blipDestination = CREATE_COORD_BLIP(vBarInside, BLIPPRIORITY_HIGH, FALSE)
PRINT_NOW("MIN1_03", 5000, 1) // Go to the ~y~illegals.
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles playing the conversations is the player remains in the car outside the bar.
PROC MIN1_MANAGE_WAIT_CONVERSATIONS()
IF iWaitConversationsPlayed < 5
AND (GET_GAME_TIMER() - iWaitConversationTimer) > 10000
AND MIN1_IS_PLAYER_IN_PATROL_VEHICLE()
AND MIN1_ALLOW_CONVERSATION_TO_PLAY()
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_WAIT", CONV_PRIORITY_HIGH)
iWaitConversationsPlayed++
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_WAIT conversation, iWaitConversationsPlayed is now ", iWaitConversationsPlayed) ENDIF #ENDIF
iWaitConversationTimer = GET_GAME_TIMER()
ENDIF
ENDPROC
/// PURPOSE:
/// See B*947514. Handles Trevor looking for the mariachi inside the bar.
PROC MIN1_MANAGE_TREVOR_LOOKING_FOR_MARIACHI()
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
AND (GET_GAME_TIMER() - iLookAroundTimer) > 1500
AND GET_INTERIOR_FROM_ENTITY(PLAYER_PED_ID()) = interiorBar
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
TASK_LOOK_AT_COORD(PLAYER_PED_ID(), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PLAYER_PED_ID(), <<GET_RANDOM_FLOAT_IN_RANGE(-10,-1),5,GET_RANDOM_FLOAT_IN_RANGE(-1,1.5)>>), 2000)
ELSE
TASK_LOOK_AT_COORD(PLAYER_PED_ID(), GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PLAYER_PED_ID(), <<GET_RANDOM_FLOAT_IN_RANGE(1,10),5,GET_RANDOM_FLOAT_IN_RANGE(-1,1.5)>>), 2000)
ENDIF
iLookAroundTimer = GET_GAME_TIMER()
ENDIF
ENDPROC
/// PURPOSE:
/// Handles playing Janet's dialogue when Trevor walks into the bar.
PROC MIN1_MANAGE_JANET_CONVERSATION()
IF bDoneJanetTalk = FALSE
AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<1987.802856,3055.128418,45.215298>>, <<1986.586548,3053.183838,48.215187>>, 1.500000)
SET_SCENARIO_PEDS_TO_BE_RETURNED_BY_NEXT_COMMAND(TRUE)
IF GET_CLOSEST_PED(<<1983.41, 3054.88, 47.01>>, 3, TRUE, TRUE, pedJanet)
AND IS_ENTITY_ALIVE(pedJanet)
IF GET_ENTITY_MODEL(pedJanet) = IG_JANET
KILL_ANY_CONVERSATION() // Stop the drunk ped conversation if ongoing
ADD_PED_FOR_DIALOGUE(sConversation, 8, pedJanet, "JANET")
ADD_NON_CRITICAL_STANDARD_CONVERSATION_TO_BUFFER(sConversation, "MIN1AUD", "MIN1_BANNED", CONV_PRIORITY_AMBIENT_MEDIUM)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_BANNED conversation") ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Found a ped in the bar but it wasn't Janet, so no doing MIN1_BANNED conversation") ENDIF #ENDIF
ENDIF
bDoneJanetTalk = TRUE
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles playing the drunken hillbilly dialogue.
PROC MIN1_MANAGE_DRUNK_PED_CONVERSATION()
IF bStartedDrunkPedConversation = FALSE
IF MIN1_ALLOW_CONVERSATION_TO_PLAY()
ADD_NON_CRITICAL_STANDARD_CONVERSATION_TO_BUFFER(sConversation, "MIN1AUD", "MIN1_DRUNK", CONV_PRIORITY_AMBIENT_MEDIUM)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_DRUNK conversation") ENDIF #ENDIF
bStartedDrunkPedConversation = TRUE
ENDIF
ELIF bStartedBumpDrunkConversation = FALSE
IF IS_PED_FLEEING(pedWalkOutBar)
CPRINTLN(DEBUG_MISSION, "pedWalkOutBar is now fleeing")
IF RC_IS_THIS_CONVERSATION_ROOT_PLAYING("MIN1_DRUNK")
CPRINTLN(DEBUG_MISSION, "MIN1_DRUNK was playing so killing the conversation")
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
ENDIF
ADD_NON_CRITICAL_STANDARD_CONVERSATION_TO_BUFFER(sConversation, "MIN1AUD", "MIN1_BUMP", CONV_PRIORITY_AMBIENT_MEDIUM)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_BUMP conversation") ENDIF #ENDIF
bStartedBumpDrunkConversation = TRUE
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles hurling the drunk out of the bar door when the player approaches.
PROC MIN1_MANAGE_DRUNK_PED_OUT_DOOR()
IF bZSkipping = FALSE // Stops ped being spawned if skipping to chase car section
IF bPedGoneOutDoor = FALSE
IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vWalkOutBarPed, 20)
AND NOT DOES_ENTITY_EXIST(pedWalkOutBar)
MIN1_CREATE_PED(pedWalkOutBar, modelPed[MIN1_MODEL_DRUNK_PED_1], vWalkOutBarPed, fWalkOutBarPed)
SET_MODEL_AS_NO_LONGER_NEEDED(modelPed[MIN1_MODEL_DRUNK_PED_1])
SET_PED_CONFIG_FLAG(pedWalkOutBar, PCF_OpenDoorArmIK, TRUE) // B*1299271 Make the ped search for the door
SET_PED_COMBAT_ATTRIBUTES(pedWalkOutBar, CA_AGGRESSIVE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(pedWalkOutBar, CA_ALWAYS_FLEE, TRUE)
SET_PED_FLEE_ATTRIBUTES(pedWalkOutBar, FA_USE_VEHICLE, FALSE)
ADD_PED_FOR_DIALOGUE(sConversation, 5, pedWalkOutBar, "MIN1DRUNKMALE")
OPEN_SEQUENCE_TASK(drunkSequence)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<1992.0579, 3056.1792, 46.0630>>, PEDMOVE_WALK)
TASK_WANDER_IN_AREA(NULL, <<1994,3059,47>>, 5)
CLOSE_SEQUENCE_TASK(drunkSequence)
TASK_PERFORM_SEQUENCE(pedWalkOutBar, drunkSequence)
CLEAR_SEQUENCE_TASK(drunkSequence)
Make_Ped_Drunk_Constant(pedWalkOutBar)
bPedGoneOutDoor = TRUE
ENDIF
ELIF IS_ENTITY_ALIVE(pedWalkOutBar)
MIN1_MANAGE_DRUNK_PED_CONVERSATION()
SET_PED_RESET_FLAG(pedWalkOutBar, PRF_SearchForClosestDoor, TRUE) // B*1299271 Make the ped search for the door
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles the conversation inside the bar.
PROC MIN1_MANAGE_IN_BAR_CONVERSATION()
IF MIN1_ALLOW_CONVERSATION_TO_PLAY()
IF bStartedInBarConversation = FALSE
IF CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_INBAR", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_INBAR conversation") ENDIF #ENDIF
bStartedInBarConversation = TRUE
ENDIF
ELIF NOT DOES_BLIP_EXIST(blipPatrolVehicle)
IF IS_ENTITY_ALIVE(vehPatrolVehicle)
blipPatrolVehicle = CREATE_VEHICLE_BLIP(vehPatrolVehicle)
PRINT_NOW("MIN1_01", DEFAULT_GOD_TEXT_TIME, 1) // Get in the ~b~patrol vehicle.
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles the conversation in which Joe tells Trevor to get outside.
PROC MIN1_MANAGE_GET_OUT_HERE_CONVERSATION()
IF bStartedGetOutHereConversation = FALSE
AND MIN1_ALLOW_CONVERSATION_TO_PLAY(TRUE, FALSE)
AND IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), <<1987.8, 3053.5, 46.1>>, 1.5)
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_GETOUT", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_GETOUT conversation") ENDIF #ENDIF
bStartedGetOutHereConversation = TRUE
ENDIF
ENDPROC
/// PURPOSE:
/// Handles Joe telling the player to get into the patrol vehicle.
PROC MIN1_MANAGE_OUTSIDE_BAR_CONVERSATIONS()
IF bStartedOutsideBarConversation = FALSE
IF MIN1_ALLOW_CONVERSATION_TO_PLAY(TRUE, FALSE)
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_OUTBAR", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_OUTBAR conversation") ENDIF #ENDIF
REPLAY_RECORD_BACK_FOR_TIME(2.0, 4.0, REPLAY_IMPORTANCE_LOWEST)
bStartedOutsideBarConversation = TRUE
ENDIF
ELIF bStartedChaseVanConversation = FALSE // Don't play these remainders if the player has got into the patrol vehicle
IF iGetInConversationsPlayed < 3
AND NOT MIN1_IS_PLAYER_IN_PATROL_VEHICLE()
AND MIN1_ALLOW_CONVERSATION_TO_PLAY()
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_WAIT2", CONV_PRIORITY_HIGH)
iGetInConversationsPlayed++
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_WAIT2 conversation, iGetInConversationsPlayed is now ", iGetInConversationsPlayed) ENDIF #ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles playing the conversation upon spotting the Mariachi van.
PROC MIN1_MANAGE_START_CHASE_CONVERSATION()
IF bStartedOutsideBarConversation = TRUE
IF bStartedChaseVanConversation = FALSE
IF MIN1_IS_PLAYER_IN_PATROL_VEHICLE()
AND MIN1_ALLOW_CONVERSATION_TO_PLAY()
AND (GET_GAME_TIMER() - iStunGunDialogueTimer) > 5000
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_DRIVEB", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_DRIVEB conversation") ENDIF #ENDIF
bStartedChaseVanConversation = TRUE
bPlayerIsCurrentlyInPatrolVehicle = TRUE
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_CAR_CHASE, "Car chase", TRUE) // B*853089 Don't set the checkpoint until the player has got into the patrol vehicle outside the bar
ENDIF
ELIF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_STUNGUN) // B*573295
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
TEXT_LABEL_23 t_conversation_label = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
IF ARE_STRINGS_EQUAL(t_conversation_label, "MIN1_DRIVEB_4")
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_STUNGUN, 200, TRUE)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_STUNGUN, TRUE) // B*1353528
PLAY_SOUND_FRONTEND(-1, "STUN_COLLECT", "MINUTE_MAN_01_SOUNDSET")
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Gave stun gun to player") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles playing the anims on the mariachi peds while in their car.
PROC MIN1_MANAGE_MARIACHI_ANIMS()
IF bUsePlaybackAIForMariachiCar = FALSE // B*1256009 Prevent anim tasks stopping the ai playback task
INT i_random
INT i = 0
REPEAT NUM_MARIACHI_PEDS i
IF IS_ENTITY_ALIVE(pedMariachi[i])
IF NOT IsPedPerformingTask(pedMariachi[i], SCRIPT_TASK_PLAY_ANIM)
IF fCurrentPositionInRecording > 1100
i_random = 0 // Just use the base anims when nearing driving under AI playback
ELSE
i_random = GET_RANDOM_INT_IN_RANGE(0, 5)
ENDIF
IF i = 0
SWITCH i_random
CASE 0
TASK_PLAY_ANIM(pedMariachi[i], "missminuteman_1ig_1", "base_drunk_mariachi_01", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE)
BREAK
CASE 1
TASK_PLAY_ANIM(pedMariachi[i], "missminuteman_1ig_1", "idle_sing_1_mariachi_01", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE)
BREAK
CASE 2
TASK_PLAY_ANIM(pedMariachi[i], "missminuteman_1ig_1", "idle_sing_2_mariachi_01", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE)
BREAK
CASE 3
TASK_PLAY_ANIM(pedMariachi[i], "missminuteman_1ig_1", "idle_tequila_mariachi_01", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE)
BREAK
CASE 4
TASK_PLAY_ANIM(pedMariachi[i], "missminuteman_1ig_1", "idle_waive_mariachi_01", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE)
BREAK
ENDSWITCH
ELSE
SWITCH i_random
CASE 0
TASK_PLAY_ANIM(pedMariachi[i], "missminuteman_1ig_1", "base_drunk_mariachi_02", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE)
BREAK
CASE 1
TASK_PLAY_ANIM(pedMariachi[i], "missminuteman_1ig_1", "idle_sing_1_mariachi_02", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE)
BREAK
CASE 2
TASK_PLAY_ANIM(pedMariachi[i], "missminuteman_1ig_1", "idle_sing_2_mariachi_02", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE)
BREAK
CASE 3
TASK_PLAY_ANIM(pedMariachi[i], "missminuteman_1ig_1", "idle_tequila_mariachi_02", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE)
BREAK
CASE 4
TASK_PLAY_ANIM(pedMariachi[i], "missminuteman_1ig_1", "idle_waive_mariachi_02", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE)
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDIF
ENDPROC
/// PURPOSE:
/// Returns TRUE if we should play some drunken dialogue.
FUNC BOOL MIN1_TRY_TO_PLAY_SINGING_DIALOGUE()
IF fCurrentPositionInRecording > 1400
RETURN FALSE
ENDIF
IF bStartedChaseVanConversation = FALSE
RETURN FALSE
ENDIF
IF (GET_GAME_TIMER() - iSingingDialogueTimer) < 10000
RETURN FALSE
ENDIF
IF IS_ENTITY_ALIVE(vehMariachiCar)
AND NOT IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), vehMariachiCar, 50)
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Handles playing the drunken Mariachi dialogue.
PROC MIN1_MANAGE_SINGING_DIALOGUE()
IF MIN1_TRY_TO_PLAY_SINGING_DIALOGUE()
iSingingDialogueTimer = GET_GAME_TIMER()
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
ADD_NON_CRITICAL_STANDARD_CONVERSATION_TO_BUFFER(sConversation, "MIN1AUD", "MIN1_SING1", CONV_PRIORITY_AMBIENT_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_SING1 dialogue") ENDIF #ENDIF
ELSE
ADD_NON_CRITICAL_STANDARD_CONVERSATION_TO_BUFFER(sConversation, "MIN1AUD", "MIN1_SING2", CONV_PRIORITY_AMBIENT_MEDIUM, DO_NOT_DISPLAY_SUBTITLES)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_SING2 dialogue") ENDIF #ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles playing the van chase dialogue from Joe and Josef.
PROC MIN1_MANAGE_CHASE_CONVERSATIONS()
IF iDoneChaseConversations < NUM_CHASE_CONVERSATIONS
//AND fCurrentPositionInRecording < 1200 // B*1413441 Allow these conversations to play earlier
AND fCurrentPositionInRecording < 1250 // B*1563150 Don't allow these conversation to play near the end of the chase
AND bStartedChaseVanConversation = TRUE
//AND bStartedOffRoadConversation = TRUE // B*1413441 Allow these conversations to play earlier
AND (GET_GAME_TIMER() - iChaseDialogueTimer) > 12000
AND MIN1_IS_PLAYER_IN_PATROL_VEHICLE()
AND IS_ENTITY_ALIVE(vehMariachiCar)
AND IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), vehMariachiCar, 50)
AND MIN1_ALLOW_CONVERSATION_TO_PLAY()
INT i = GET_RANDOM_INT_IN_RANGE(0, NUM_CHASE_CONVERSATIONS)
IF bDoneChaseConversation[i] = FALSE
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", sChaseConversation[i], CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started ", sChaseConversation[i], " dialogue") ENDIF #ENDIF
bDoneChaseConversation[i] = TRUE
iChaseDialogueTimer = GET_GAME_TIMER()
iDoneChaseConversations++
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: iDoneChaseConversations = ", iDoneChaseConversations) ENDIF #ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles playing conversations when the player lands after big jumps.
PROC MIN1_MANAGE_CRASH_CONVERSATIONS()
IF iDoneCrashConversations < NUM_CRASH_CONVERSATIONS
AND MIN1_IS_PLAYER_IN_PATROL_VEHICLE()
AND MIN1_ALLOW_CONVERSATION_TO_PLAY()
INT i = 0
REPEAT NUM_CRASH_CONVERSATIONS i
IF bStartedCrashConversation[i] = FALSE
AND GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vCrashConversationPos[i]) < 10
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_CRASH2", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_CRASH2 dialogue") ENDIF #ENDIF
bStartedCrashConversation[i] = TRUE
iDoneCrashConversations++
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: iDoneCrashConversations = ", iDoneCrashConversations) ENDIF #ENDIF
ENDIF
ENDREPEAT
ENDIF
ENDPROC
/// PURPOSE:
/// Handles displaying the hint camera and text for the mariachi car.
PROC MIN1_MANAGE_MARIACHI_CAR_FOCUS_CAMERA()
IF bStartedChaseVanConversation = TRUE
AND IS_ENTITY_ALIVE(vehMariachiCar)
CONTROL_ENTITY_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, vehMariachiCar, "MIN1_05")
ENDIF
ENDPROC
/// PURPOSE:
/// Returns TRUE if either Mariachi leaves the van (probably getting dragged out by the player).
FUNC BOOL MIN1_HAS_EITHER_MARIACHI_LEFT_VAN()
IF IS_ENTITY_ALIVE(vehMariachiCar)
IF IS_ENTITY_ALIVE(pedMariachi[0])
AND NOT IS_PED_IN_VEHICLE(pedMariachi[0], vehMariachiCar)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: pedMariachi[0] left vehicle") ENDIF #ENDIF
RETURN TRUE
ENDIF
IF IS_ENTITY_ALIVE(pedMariachi[1])
AND NOT IS_PED_IN_VEHICLE(pedMariachi[1], vehMariachiCar)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: pedMariachi[1] left vehicle") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Returns TRUE if either Mariachi is low on health (probably due to being shot by the player).
FUNC BOOL MIN1_IF_EITHER_MARIACHI_ALMOST_DEAD()
IF IS_ENTITY_ALIVE(vehMariachiCar)
IF IS_ENTITY_ALIVE(pedMariachi[0])
AND GET_ENTITY_HEALTH(pedMariachi[0]) < 200
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: pedMariachi[0] health low") ENDIF #ENDIF
RETURN TRUE
ENDIF
IF IS_ENTITY_ALIVE(pedMariachi[1])
AND GET_ENTITY_HEALTH(pedMariachi[1]) < 200
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: pedMariachi[1] health low") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Checks player distance to the Mariachi peds, and fails mission if the distance gets too far.
PROC MIN1_MANAGE_ABANDONING_MARIACHI()
IF bZSkipping = FALSE
IF IS_ENTITY_ALIVE(vehMariachiCar)
IF DOES_BLIP_EXIST(blipDestination)
AND pvStatus = PV_STATUS_GO_TO_DESTINATION
UPDATE_CHASE_BLIP(blipDestination, vehMariachiCar, fFailDist, 0.8) // B*904083
ENDIF
ENDIF
INT i = 0
REPEAT NUM_MARIACHI_PEDS i
IF IS_ENTITY_ALIVE(pedMariachi[i])
AND GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), pedMariachi[i]) > fFailDist
IF missionState = stateStunMariachiPeds
AND IS_ENTITY_ALIVE(pedBuddy[JOE].ped)
AND IS_ENTITY_ALIVE(pedBuddy[JOSEF].ped)
AND GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), pedBuddy[JOE].ped) > (fFailDist/2) // B*1435725 Only fail for abandoning Joe/Josef if they're not in the patrol vehicle and are not close, else use FAILED_MARIACHI_ESCAPED
AND GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), pedBuddy[JOSEF].ped) > (fFailDist/2)
MIN1_MISSION_FAILED(FAILED_ABANDONED_BUDDIES)
ELSE
MIN1_MISSION_FAILED(FAILED_MARIACHI_ESCAPED)
ENDIF
ENDIF
ENDREPEAT
ENDIF
ENDPROC
/// PURPOSE:
/// Manages loading and playing the mariachi singing stream.
PROC MIN1_MANAGE_PLAYING_SINGING_STREAM()
IF bStartedSingingStream = FALSE
AND LOAD_STREAM("MARIACHI", "MINUTE_MAN_01_SOUNDSET")
AND IS_ENTITY_ALIVE(vehMariachiCar)
SET_AUDIO_FLAG("DisableReplayScriptStreamRecording", TRUE)
PLAY_STREAM_FROM_VEHICLE(vehMariachiCar) // Mariachi singing
SET_AUDIO_FLAG("DisableReplayScriptStreamRecording", FALSE)
bStartedSingingStream = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started singing stream") ENDIF #ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles playing the conversation in which Joe/Josef comment on the Mariachi driving offroad.
PROC MIN1_MANAGE_OFFROAD_CONVERSATION()
IF bStartedOffRoadConversation = FALSE
AND fCurrentPositionInRecording > 450
AND MIN1_ALLOW_CONVERSATION_TO_PLAY()
AND IS_ENTITY_ALIVE(vehMariachiCar)
AND MIN1_IS_PLAYER_IN_PATROL_VEHICLE()
AND IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), vehMariachiCar, 75)
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_OFFROAD", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_OFFROAD conversation") ENDIF #ENDIF
bStartedOffRoadConversation = TRUE
ENDIF
ENDPROC
/// PURPOSE:
/// Handles playing a conversation if the player stops his car during the chase.
PROC MIN1_MANAGE_STOPPED_CONVERSATIONS()
IF iStoppedConversationsPlayed < 3
AND IS_ENTITY_ALIVE(vehPatrolVehicle)
IF bPatrolVehicleStoppedDuringChase = FALSE // Patrol vehicle is moving
IF MIN1_ALLOW_CONVERSATION_TO_PLAY()
AND MIN1_IS_PLAYER_IN_PATROL_VEHICLE()
AND GET_ENTITY_SPEED(vehPatrolVehicle) < 1
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_STOP", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_STOP conversation") ENDIF #ENDIF
iStoppedConversationsPlayed++
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: iStoppedConversationsPlayed = ", iStoppedConversationsPlayed) ENDIF #ENDIF
bPatrolVehicleStoppedDuringChase = TRUE
ENDIF
ELSE // Patrol vehicle is stationary
IF GET_ENTITY_SPEED(vehPatrolVehicle) > 2
bPatrolVehicleStoppedDuringChase = FALSE
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles playing the conversation if the player lags behind in the chase.
PROC MIN1_MANAGE_FAR_BEHIND_CONVERSATIONS()
IF iFarBehindConversationsPlayed < 3
AND IS_ENTITY_ALIVE(vehPatrolVehicle)
AND IS_ENTITY_ALIVE(vehMariachiCar)
IF bPlayedFarBehindConversation = FALSE
IF MIN1_ALLOW_CONVERSATION_TO_PLAY()
AND MIN1_IS_PLAYER_IN_PATROL_VEHICLE()
AND GET_DISTANCE_BETWEEN_ENTITIES(vehPatrolVehicle, vehMariachiCar) > 100
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_BEHIND", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_BEHIND conversation") ENDIF #ENDIF
iFarBehindConversationsPlayed++
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: iFarBehindConversationsPlayed = ", iFarBehindConversationsPlayed) ENDIF #ENDIF
bPlayedFarBehindConversation = TRUE
ENDIF
ELIF GET_DISTANCE_BETWEEN_ENTITIES(vehPatrolVehicle, vehMariachiCar) < 75
bPlayedFarBehindConversation = FALSE // Reset flag so we can check again for the player lagging far behind and play another random conversation
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles playing the conversation if the player leaves the patrol vehicle during the chase.
PROC MIN1_MANAGE_LEAVE_VEHICLE_CONVERSATIONS()
IF bStartedChaseVanConversation = TRUE // Only start checking this after the player has got back in to start the start
AND fCurrentPositionInRecording < 1465 // Chase has almost ended so don't play any of these conversations
AND IS_ENTITY_ALIVE(vehPatrolVehicle)
IF bPlayerIsCurrentlyInPatrolVehicle = TRUE
IF NOT MIN1_IS_PLAYER_IN_PATROL_VEHICLE()
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Player exited patrol vehicle") ENDIF #ENDIF
bPlayerIsCurrentlyInPatrolVehicle = FALSE
bAllowPlayExitedVehicleConversation = TRUE
bAllowPlayGetBackInVehicleConversation = TRUE
ELIF MIN1_ALLOW_CONVERSATION_TO_PLAY()
IF iGotBackInVehicleConversationsPlayed < 3
AND bAllowPlayGotBackInVehicleConversation = TRUE
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_GOGO", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_GOGO conversation") ENDIF #ENDIF
iGotBackInVehicleConversationsPlayed++
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: iGotBackInVehicleConversationsPlayed = ", iGotBackInVehicleConversationsPlayed) ENDIF #ENDIF
bAllowPlayGotBackInVehicleConversation = FALSE
ENDIF
ENDIF
ELSE
IF MIN1_IS_PLAYER_IN_PATROL_VEHICLE()
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Player got in patrol vehicle") ENDIF #ENDIF
bPlayerIsCurrentlyInPatrolVehicle = TRUE
bAllowPlayGotBackInVehicleConversation = TRUE
ELIF MIN1_ALLOW_CONVERSATION_TO_PLAY()
IF iExitedVehicleConversationsPlayed < 3
AND bAllowPlayExitedVehicleConversation = TRUE
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_GETIN", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_GETIN conversation") ENDIF #ENDIF
iExitedVehicleConversationsPlayed++
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: iExitedVehicleConversationsPlayed = ", iExitedVehicleConversationsPlayed) ENDIF #ENDIF
bAllowPlayExitedVehicleConversation = FALSE
ENDIF
IF iGetBackInVehicleConversationsPlayed < 3
AND bAllowPlayGetBackInVehicleConversation = TRUE
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_BACKIN", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_BACKIN conversation") ENDIF #ENDIF
iGetBackInVehicleConversationsPlayed++
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: iGetBackInVehicleConversationsPlayed = ", iGetBackInVehicleConversationsPlayed) ENDIF #ENDIF
bAllowPlayGetBackInVehicleConversation = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Ensure the long chase conversation get stopped when the chase ends.
PROC MIN1_STOP_ANY_CHASE_CONVERSATIONS()
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
TEXT_LABEL_23 t_root = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
IF ARE_STRINGS_EQUAL(t_root, sChaseConversation[0])
OR ARE_STRINGS_EQUAL(t_root, sChaseConversation[1])
OR ARE_STRINGS_EQUAL(t_root, sChaseConversation[2])
OR ARE_STRINGS_EQUAL(t_root, sChaseConversation[3])
OR ARE_STRINGS_EQUAL(t_root, sChaseConversation[4])
OR ARE_STRINGS_EQUAL(t_root, sChaseConversation[5])
OR ARE_STRINGS_EQUAL(t_root, sChaseConversation[6])
KILL_FACE_TO_FACE_CONVERSATION()
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Car chase finished so stopped a long chase conversation") ENDIF #ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Returns true if the player is closer to the end of the chase route than the mariachi car.
FUNC BOOL MIN1_IS_PLAYER_NEARER_TO_END_OF_ROUTE()
IF IS_ENTITY_ALIVE(vehMariachiCar)
AND IS_ENTITY_ALIVE(PLAYER_PED_ID())
FLOAT f_dist_mariachi = GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(vehMariachiCar, vOpenGroundWanderArea)
FLOAT f_dist_player = GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vOpenGroundWanderArea)
IF f_dist_player < f_dist_mariachi
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Returns true if the player is closer to the end of the chase route than the mariachi car.
FUNC BOOL MIN1_IS_MARIACHI_CAR_DOING_JUMP()
IF IS_ENTITY_ALIVE(vehMariachiCar)
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(vehMariachiCar, <<2262, 3590, 58>>) < 15
OR GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(vehMariachiCar, <<2387, 3705, 53>>) < 15
OR GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(vehMariachiCar, <<2620, 3853, 72>>) < 15
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Handle starting the vehicle recording when there is a driver, and subsequently stopping the vehicle recording if the driver leaves.
PROC MIN1_MANAGE_MARIACHI_CAR_RECORDING()
IF IS_ENTITY_ALIVE(vehMariachiCar)
AND IS_ENTITY_ALIVE(vehPatrolVehicle)
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehMariachiCar)
fCurrentPositionInRecording = GET_POSITION_IN_RECORDING(vehMariachiCar)
//#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Recording playback pos = ", fCurrentPositionInRecording) ENDIF #ENDIF
IF IS_VEHICLE_SEAT_FREE(vehMariachiCar)
STOP_PLAYBACK_RECORDED_VEHICLE(vehMariachiCar)
ELSE
FLOAT fDist = GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), vehMariachiCar)
IF bUsePlaybackAIForMariachiCar = FALSE
IF fCurrentPositionInRecording > 1250 // See B*640795 - Go into AI mode when the mariachi car is passed all the hills
bUsePlaybackAIForMariachiCar = TRUE
SET_PLAYBACK_TO_USE_AI(vehMariachiCar, DRIVINGMODE_PLOUGHTHROUGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Setting Mariachi car to use AI") ENDIF #ENDIF
ELSE
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPatrolVehicle)
SET_PLAYBACK_SPEED(vehMariachiCar, 0.7)
ELIF MIN1_IS_PLAYER_NEARER_TO_END_OF_ROUTE() // B*1294781 Set to max speed if the player is closer to the end of the route
SET_PLAYBACK_SPEED(vehMariachiCar, 1.7)
ELIF MIN1_IS_MARIACHI_CAR_DOING_JUMP() // B*1294781 Set to normal speed if doing a jump
SET_PLAYBACK_SPEED(vehMariachiCar, 1.0)
ELIF fDist > 75
SET_PLAYBACK_SPEED(vehMariachiCar, 0.5)
ELIF fDist > 30
SET_PLAYBACK_SPEED(vehMariachiCar, 1.0)
ELIF fDist > 20
SET_PLAYBACK_SPEED(vehMariachiCar, 1.3)
ELIF fDist > 10
SET_PLAYBACK_SPEED(vehMariachiCar, 1.5)
ELSE
SET_PLAYBACK_SPEED(vehMariachiCar, 1.7)
ENDIF
ENDIF
ELSE
IF fDist > 75
SET_PLAYBACK_SPEED(vehMariachiCar, 0.5)
ELIF fDist > 30
SET_PLAYBACK_SPEED(vehMariachiCar, 1.0)
ELSE
SET_PLAYBACK_SPEED(vehMariachiCar, 1.3)
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Returns TRUE if the Mariachi vehicle has been damaged enough to stop or for some other reason.
FUNC BOOL MIN1_SHOULD_MARIACHI_VEHICLE_STOP()
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehMariachiCar)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Stopping Mariachi vehicle - playback not playing on car") ENDIF #ENDIF
SET_VEHICLE_ENGINE_HEALTH(vehMariachiCar, 200)
RETURN TRUE
ELIF bStartedCrashedConversation = FALSE
IF fCurrentPositionInRecording > 1465
AND MIN1_ALLOW_CONVERSATION_TO_PLAY()
AND IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), vehMariachiCar, 75)
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_CRASH", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_CRASH conversation") ENDIF #ENDIF
bStartedCrashedConversation = TRUE
ENDIF
ENDIF
IF MIN1_HAS_EITHER_MARIACHI_LEFT_VAN()
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Stopping Mariachi vehicle - at least one of the Mariachi has left the vehicle") ENDIF #ENDIF
RETURN TRUE
ENDIF
IF MIN1_IF_EITHER_MARIACHI_ALMOST_DEAD()
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Stopping Mariachi vehicle - at least one of the Mariachi has low health") ENDIF #ENDIF
RETURN TRUE
ENDIF
IF GET_ENTITY_HEALTH(vehMariachiCar) < iRequiredHealth
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Stopping Mariachi vehicle - entity health lower than threshold") ENDIF #ENDIF
RETURN TRUE
ENDIF
IF bUsePlaybackAIForMariachiCar = TRUE
IF IS_VEHICLE_STOPPED(vehMariachiCar)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Stopping Mariachi vehicle - IS_VEHICLE_STOPPED returned true") ENDIF #ENDIF
RETURN TRUE
ENDIF
IF GET_ENTITY_SPEED(vehMariachiCar) < 0.5
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Stopping Mariachi vehicle - GET_ENTITY_SPEED less than 0.5") ENDIF #ENDIF
RETURN TRUE
ENDIF
IF bUsePlaybackAIForMariachiCar = TRUE // Don't check while on car recording only while under AI playback
AND IS_ENTITY_UPSIDEDOWN(vehMariachiCar) // B*1377842 Get the mariachi out as soon as their car is upsidedown
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Stopping Mariachi vehicle - upside down") ENDIF #ENDIF
RETURN TRUE
ENDIF
ENDIF
IF (GET_GAME_TIMER() - iMariachiCarTyresBurstTimer) > 1000 // Check for burst tyres once a second
INT iTyresBurst = 0
IF IS_VEHICLE_TYRE_BURST(vehMariachiCar, SC_WHEEL_CAR_REAR_LEFT)
iTyresBurst++
ENDIF
IF IS_VEHICLE_TYRE_BURST(vehMariachiCar, SC_WHEEL_CAR_REAR_RIGHT)
iTyresBurst++
ENDIF
IF IS_VEHICLE_TYRE_BURST(vehMariachiCar, SC_WHEEL_CAR_FRONT_LEFT)
iTyresBurst++
ENDIF
IF IS_VEHICLE_TYRE_BURST(vehMariachiCar, SC_WHEEL_CAR_FRONT_RIGHT)
iTyresBurst++
ENDIF
IF iTyresBurst > 1 // B*1001500 - Stop car if any 2 tyres are burst
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Stopping Mariachi vehicle - 2 tyres are burst") ENDIF #ENDIF
RETURN TRUE
ELSE
iMariachiCarTyresBurstTimer = GET_GAME_TIMER()
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Handles performing a rolling start on the player's vehicle.
PROC MIN1_MANAGE_ROLLING_START()
IF bDoneRollingStart = FALSE
IF IS_VEHICLE_OK(vehPatrolVehicle)
IF iRollingStartTimer = -1
iRollingStartTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Rolling start underway") ENDIF #ENDIF
ELSE
IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehPatrolVehicle)
OR IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
OR IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_VEH_BRAKE)
OR IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_VEH_MOVE_LEFT)
OR IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_VEH_MOVE_RIGHT)
OR IS_VEHICLE_SEAT_FREE(vehPatrolVehicle)
OR (GET_GAME_TIMER() - iRollingStartTimer > 3000)
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehPatrolVehicle)
STOP_PLAYBACK_RECORDED_VEHICLE(vehPatrolVehicle)
ENDIF
REMOVE_VEHICLE_RECORDING(500, "Min1_PV")
bDoneRollingStart = TRUE
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Rolling start finished") ENDIF #ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles playing the conversation in which Joe tells Trevor to stun the Mariachi.
PROC MIN1_MANAGE_STUN_THEM_DIALOGUE()
IF bStartedStunThemConversation = FALSE
AND MIN1_ALLOW_CONVERSATION_TO_PLAY()
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_STUN", CONV_PRIORITY_HIGH, DO_NOT_DISPLAY_SUBTITLES)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_STUN conversation") ENDIF #ENDIF
bStartedStunThemConversation = TRUE
PRINT_NOW("MIN1_07", DEFAULT_GOD_TEXT_TIME, 1) // Use the stun-gun on the ~r~Mariachi.
ENDIF
ENDPROC
/// PURPOSE:
/// Handles playing the conversations when Trevor stuns the Mariachi.
PROC MIN1_MANAGE_STUNNED_MARIACHI_DIALOGUE(INT i)
IF bPlayedStunnedConversation[i] = FALSE
IF MIN1_ALLOW_CONVERSATION_TO_PLAY()
IF iPlayedStunnedConversation = 0
IF CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_CAR1", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_CAR1 conversation") ENDIF #ENDIF
iPlayedStunnedConversation = 1
bPlayedStunnedConversation[i] = TRUE
ENDIF
ELIF iPlayedStunnedConversation = 1
IF CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_CAR2", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_CAR2 conversation") ENDIF #ENDIF
iPlayedStunnedConversation = 2
bPlayedStunnedConversation[i] = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles playing the conversations when the Mariachi sober up.
PROC MIN1_MANAGE_SOBER_MARIACHI_DIALOGUE(INT i)
IF bPlayedSoberConversation[i] = FALSE
AND MIN1_ALLOW_CONVERSATION_TO_PLAY()
IF i = 0
IF CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_SOBER1", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_SOBER1 conversation") ENDIF #ENDIF
bPlayedSoberConversation[i] = TRUE
ENDIF
ELSE
IF CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_SOBER2", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_SOBER2 conversation") ENDIF #ENDIF
bPlayedSoberConversation[i] = TRUE
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles Joe telling the player to hurry up and stun the Mariachi.
PROC MIN1_MANAGE_HURRY_STUN_DIALOGUE()
IF iPlayedStunnedConversation < 2 // Don't play any of these conversations if player has stunned both Mariachi
AND iHurryStunConversationsPlayed < NUM_HURRY_STUN_CONVERSATIONS
AND bStartedStunThemConversation = TRUE // Wait until first told to stun them
AND MIN1_ALLOW_CONVERSATION_TO_PLAY()
AND IS_ENTITY_ALIVE(pedBuddy[JOE].ped)
AND GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), pedBuddy[JOE].ped) < 50
AND (GET_GAME_TIMER() - iNotStunnedDialogueTimer) > 20000*(iHurryStunConversationsPlayed+1)
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", sHurryStunConversation[iHurryStunConversationsPlayed], CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started ", sHurryStunConversation[iHurryStunConversationsPlayed], " conversation") ENDIF #ENDIF
iHurryStunConversationsPlayed++
ENDIF
ENDPROC
/// PURPOSE:
/// Handles playing Joe and Josef's insults when shepherding a Mariachi into the patrol vehicle.
PROC MIN1_MANAGE_JOE_JOSEF_INSULTS(INT i_buddy)
IF pedBuddy[i_buddy].iNumInsultsGiven < 3 // Don't repeat any insults
AND MIN1_ALLOW_CONVERSATION_TO_PLAY()
AND (GET_GAME_TIMER() - pedBuddy[i_buddy].iInsultTimer) > pedBuddy[i_buddy].iDelayBeforeNextInsult
AND NOT IS_ENTITY_IN_RANGE_ENTITY(vehPatrolVehicle, pedMariachi[i_buddy], 4) // Don't play if Mariachi is near to the patrol vehicle ie about to get in
AND IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), pedMariachi[i_buddy], 50) // Don't play if Mariachi is far away from player
IF i_buddy = JOE
IF CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_INSULT1", CONV_PRIORITY_MEDIUM)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_INSULT1 conversation for Joe") ENDIF #ENDIF
pedBuddy[i_buddy].iNumInsultsGiven++
pedBuddy[i_buddy].iInsultTimer = GET_GAME_TIMER()
pedBuddy[i_buddy].iDelayBeforeNextInsult = GET_RANDOM_INT_IN_RANGE(8000, 10000)
ENDIF
ELSE
IF CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_INSULT2", CONV_PRIORITY_MEDIUM)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_INSULT2 conversation for Josef") ENDIF #ENDIF
pedBuddy[i_buddy].iNumInsultsGiven++
pedBuddy[i_buddy].iInsultTimer = GET_GAME_TIMER()
pedBuddy[i_buddy].iDelayBeforeNextInsult = GET_RANDOM_INT_IN_RANGE(8000, 10000)
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Try to play one of the mariachi conversation when the objective is to stun them.
PROC MIN1_PLAY_MARIACHI_CONVERSATION(INT i_ped, STRING string_to_play, INT &i_counter, INT i_max)
IF i_counter < i_max
AND IS_ENTITY_ALIVE(PLAYER_PED_ID())
AND IS_ENTITY_ALIVE(pedMariachi[i_ped])
AND MIN1_ALLOW_CONVERSATION_TO_PLAY()
AND GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), pedMariachi[i_ped]) < 50
TEXT_LABEL_15 text_to_play = string_to_play
IF i_ped = 0
text_to_play += 1
ELSE
text_to_play += 2
ENDIF
IF CREATE_CONVERSATION(sConversation, "MIN1AUD", text_to_play, CONV_PRIORITY_HIGH)
i_counter++
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Played mariachi conversation ", text_to_play, " i_counter = ", i_counter, " i_max = ", i_max) ENDIF #ENDIF
iMariachiConversationTimer[i_ped] = GET_GAME_TIMER()
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Returns true if the mariachi has been damaged by an acceptable weapon.
FUNC BOOL MIN1_HAS_MARIACHI_BEEN_DAMAGED_BY_ALLOWED_WEAPON(INT i)
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(pedMariachi[i], WEAPONTYPE_STUNGUN, GENERALWEAPON_TYPE_INVALID)
OR HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(pedMariachi[i], WEAPONTYPE_UNARMED, GENERALWEAPON_TYPE_INVALID)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Play all the dialogue while the mariachi are being marched to the patrol vehicle.
PROC MIN1_MANAGE_GOING_TO_PATROL_VEHICLE_CONVERSATIONS(INT i)
MIN1_MANAGE_SOBER_MARIACHI_DIALOGUE(i)
IF (GET_GAME_TIMER() - iMariachiConversationTimer[i]) > iMariachiConversationDelay[i]
IF IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), pedMariachi[i])
MIN1_PLAY_MARIACHI_CONVERSATION(i, "MIN1_BUMP", iNumPlayedBumpConversations[i], NUM_MARIACHI_BUMP_CONVERSATIONS)
ELSE
MIN1_PLAY_MARIACHI_CONVERSATION(i, "MIN1_WALK", iNumPlayedWalkConversations[i], NUM_MARIACHI_WALK_CONVERSATIONS)
ENDIF
ENDIF
MIN1_MANAGE_JOE_JOSEF_INSULTS(i)
ENDPROC
/// PURPOSE:
/// Handles the drunken Mariachi getting into the patrol vehicle after being stunned.
PROC MIN1_MANAGE_MARIACHI_GETTING_INTO_PATROL_VEHICLE()
INT i = 0
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
AND IS_ENTITY_ALIVE(vehPatrolVehicle)
REPEAT NUM_MARIACHI_PEDS i
IF IS_ENTITY_ALIVE(pedMariachi[i])
SWITCH statusMariachi[i]
CASE MARIACHI_EXITING_HIS_VEHICLE
IF NOT IS_PED_IN_ANY_VEHICLE(pedMariachi[i])
SET_PED_CAN_BE_TARGETTED(pedMariachi[i], TRUE)
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(pedMariachi[i], vOpenGroundWanderArea) < 25
TASK_WANDER_IN_AREA(pedMariachi[i], vOpenGroundWanderArea, 10, 0, 0) // See B*1167158 - If mariachi car reaches the end of its route set their wander area to a specific patch of open ground
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Mariachi ", i, " is in range of open ground wander area") ENDIF #ENDIF
ELSE
TASK_WANDER_IN_AREA(pedMariachi[i], GET_ENTITY_COORDS(pedMariachi[i]), 10, 0, 0)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Mariachi ", i, " is not in range of open ground wander area") ENDIF #ENDIF
ENDIF
statusMariachi[i] = MARIACHI_WAITING_TO_BE_STUNNED
ELIF iMariachiExitVehicleTimer[i] > -1
IF (GET_GAME_TIMER() - iMariachiExitVehicleTimer[i]) > 3000 // B*1481321 - If failsafe timer has elapsed just warp them out somewhere if the door is blocked
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Mariachi ", i, " told to warp out if door is blocked") ENDIF #ENDIF
TASK_LEAVE_ANY_VEHICLE(pedMariachi[i], 0, ECF_DONT_CLOSE_DOOR)
iMariachiExitVehicleTimer[i] = -1
ENDIF
ENDIF
BREAK
CASE MARIACHI_WAITING_TO_BE_STUNNED
IF (GET_GAME_TIMER() - iMariachiConversationTimer[i]) > iMariachiConversationDelay[i]
IF IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), pedMariachi[i])
OR IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), pedMariachi[i])
MIN1_PLAY_MARIACHI_CONVERSATION(i, "MIN1_AIM", iNumPlayedAimConversations[i], NUM_MARIACHI_AIM_CONVERSATIONS)
ELIF IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), pedMariachi[i])
MIN1_PLAY_MARIACHI_CONVERSATION(i, "MIN1_BUMP", iNumPlayedBumpConversations[i], NUM_MARIACHI_BUMP_CONVERSATIONS)
ELSE
MIN1_PLAY_MARIACHI_CONVERSATION(i, "MIN1_DRNK", iNumPlayedDrunkConversations[i], NUM_MARIACHI_DRUNK_CONVERSATIONS)
ENDIF
ENDIF
SET_PED_RESET_FLAG(pedMariachi[i], PRF_PreventAllMeleeTakedowns, TRUE)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(pedMariachi[i], PLAYER_PED_ID())
IF MIN1_HAS_MARIACHI_BEEN_DAMAGED_BY_ALLOWED_WEAPON(i)
CLEAR_PED_LAST_WEAPON_DAMAGE(pedMariachi[i])
SAFE_REMOVE_BLIP(blipMariachi[i])
SET_PED_CAN_BE_TARGETTED(pedMariachi[i], FALSE)
SET_PED_CAN_BE_DRAGGED_OUT(pedMariachi[i], FALSE)
SET_PED_MOVEMENT_CLIPSET(pedMariachi[i], "MOVE_M@BAIL_BOND_NOT_TAZERED")
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Mariachi ", i, " now using MOVE_M@BAIL_BOND_NOT_TAZERED clipset") ENDIF #ENDIF
statusMariachi[i] = MARIACHI_HAS_BEEN_STUNNED
ENDIF
ENDIF
BREAK
CASE MARIACHI_HAS_BEEN_STUNNED
MIN1_PLAY_MARIACHI_CONVERSATION(i, "MIN1_SHOCK", iNumPlayedShockConversations[i], NUM_MARIACHI_SHOCK_CONVERSATIONS)
MIN1_MANAGE_STUNNED_MARIACHI_DIALOGUE(i)
IF NOT IS_PED_BEING_STUNNED(pedMariachi[i])
AND NOT IS_PED_GETTING_UP(pedMariachi[i])
TASK_CLEAR_LOOK_AT(pedMariachi[i])
Make_Ped_Sober(pedMariachi[i])
CLEAR_PED_TASKS(pedMariachi[i])
SET_PED_CAN_BE_DRAGGED_OUT(pedMariachi[i], FALSE)
IF i = 0
TASK_PLAY_ANIM(pedMariachi[i], "missminuteman_1ig_2", "tasered_1", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_TAG_SYNC_OUT)
ELSE
TASK_PLAY_ANIM(pedMariachi[i], "missminuteman_1ig_2", "tasered_2", SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_TAG_SYNC_OUT)
ENDIF
statusMariachi[i] = MARIACHI_AFTER_STUNNED
ENDIF
BREAK
CASE MARIACHI_AFTER_STUNNED
MIN1_MANAGE_SOBER_MARIACHI_DIALOGUE(i)
IF NOT IsPedPerformingTask(pedMariachi[i], SCRIPT_TASK_PLAY_ANIM)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Finished tazering anim on mariachi ", i) ENDIF #ENDIF
pedBuddy[i].iNumInsultsGiven = 0
pedBuddy[i].iInsultTimer = GET_GAME_TIMER() // Start the timer for Joe/Josef's insults while shepherding the Mariachi into the patrol vehicle
pedBuddy[i].iDelayBeforeNextInsult = 5000
statusMariachi[i] = MARIACHI_GOING_TO_PATROL_VEHICLE
ENDIF
BREAK
CASE MARIACHI_GOING_TO_PATROL_VEHICLE
IF bHasBeenTazeredAgain[i] = FALSE
AND bCheckForTazeredAgain[i] = TRUE
AND IS_PED_BEING_STUNNED(pedMariachi[i])
bHasBeenTazeredAgain[i] = TRUE
SET_PED_MOVEMENT_CLIPSET(pedMariachi[i], "MOVE_M@BAIL_BOND_TAZERED")
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Mariachi ", i, " now using MOVE_M@BAIL_BOND_TAZERED clipset") ENDIF #ENDIF
ENDIF
IF NOT IS_PED_BEING_STUNNED(pedMariachi[i])
AND NOT IS_PED_GETTING_UP(pedMariachi[i])
bCheckForTazeredAgain[i] = TRUE // Don't check for tazered again until they've got up for the first time
MIN1_MANAGE_GOING_TO_PATROL_VEHICLE_CONVERSATIONS(i)
IF GET_DISTANCE_BETWEEN_ENTITIES(pedMariachi[i], vehPatrolVehicle) > 5
IF NOT IS_ENTITY_PLAYING_ANIM(pedMariachi[i], "missminuteman_1ig_2", "handsup_base")
TASK_PLAY_ANIM(pedMariachi[i], "missminuteman_1ig_2", "handsup_base", REALLY_SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_SECONDARY|AF_UPPERBODY|AF_LOOPING|AF_TAG_SYNC_CONTINUOUS)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Mariachi ", i, " playing hands up anim") ENDIF #ENDIF
ENDIF
IF NOT IsPedPerformingTask(pedMariachi[i], SCRIPT_TASK_GOTO_ENTITY_OFFSET)
IF GET_DISTANCE_BETWEEN_ENTITIES(pedMariachi[i], vehPatrolVehicle) < 20
TASK_GOTO_ENTITY_OFFSET_XY(pedMariachi[i], vehPatrolVehicle, 20000, DEFAULT_SEEK_RADIUS, fSeekOffsetFromPatrolVehicle[i], 0.0, PEDMOVEBLENDRATIO_WALK)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Gave mariachi ", i," a task to go to the patrol vehicle, warp time is 20s") ENDIF #ENDIF
ELIF GET_DISTANCE_BETWEEN_ENTITIES(pedMariachi[i], vehPatrolVehicle) < 40 // B*1470057 - Longer warp time if further away
TASK_GOTO_ENTITY_OFFSET_XY(pedMariachi[i], vehPatrolVehicle, 40000, DEFAULT_SEEK_RADIUS, fSeekOffsetFromPatrolVehicle[i], 0.0, PEDMOVEBLENDRATIO_WALK)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Gave mariachi ", i," a task to go to the patrol vehicle, warp time is 40s") ENDIF #ENDIF
ELSE
TASK_GOTO_ENTITY_OFFSET_XY(pedMariachi[i], vehPatrolVehicle, 60000, DEFAULT_SEEK_RADIUS, fSeekOffsetFromPatrolVehicle[i], 0.0, PEDMOVEBLENDRATIO_WALK)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Gave mariachi ", i," a task to go to the patrol vehicle, warp time is 60s") ENDIF #ENDIF
ENDIF
ENDIF
ELSE
statusMariachi[i] = MARIACHI_ENTERING_PATROL_VEHICLE
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Mariachi ", i, " close to patrol vehicle so progressing to MARIACHI_ENTERING_PATROL_VEHICLE") ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE MARIACHI_ENTERING_PATROL_VEHICLE
IF IS_PED_SITTING_IN_VEHICLE(pedMariachi[i], vehPatrolVehicle) // Changed to sitting in vehicle for B*899751
SET_PED_KEEP_TASK(pedMariachi[i], TRUE)
statusMariachi[i] = MARIACHI_SAT_IN_PATROL_VEHICLE
ELIF IS_PED_BEING_STUNNED(pedMariachi[i])
statusMariachi[i] = MARIACHI_GOING_TO_PATROL_VEHICLE
ELSE
MIN1_MANAGE_GOING_TO_PATROL_VEHICLE_CONVERSATIONS(i)
IF IS_ENTITY_PLAYING_ANIM(pedMariachi[i], "missminuteman_1ig_2", "handsup_base")
AND GET_DISTANCE_BETWEEN_ENTITIES(pedMariachi[i], vehPatrolVehicle) < 3
STOP_ANIM_TASK(pedMariachi[i], "missminuteman_1ig_2", "handsup_base", REALLY_SLOW_BLEND_OUT)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Stopping mariachi ", i, " hands up anim") ENDIF #ENDIF
ENDIF
IF NOT IsPedPerformingTask(pedMariachi[i], SCRIPT_TASK_ENTER_VEHICLE)
TASK_ENTER_VEHICLE(pedMariachi[i], vehPatrolVehicle, 20000, seatMariachi[i], PEDMOVEBLENDRATIO_WALK, ECF_JACK_ANYONE|ECF_WARP_IF_DOOR_IS_BLOCKED)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Gave mariachi ", i," a task to enter the patrol vehicle, warp time is 20s") ENDIF #ENDIF
ENDIF
ENDIF
BREAK
CASE MARIACHI_SAT_IN_PATROL_VEHICLE
IF IS_ENTITY_PLAYING_ANIM(pedMariachi[i], "missminuteman_1ig_2", "handsup_base")
STOP_ANIM_TASK(pedMariachi[i], "missminuteman_1ig_2", "handsup_base", INSTANT_BLEND_OUT)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Stopping mariachi ", i, " hands up anim") ENDIF #ENDIF
ENDIF
IF NOT IS_PED_SITTING_IN_VEHICLE(pedMariachi[i], vehPatrolVehicle) // B*1235814 - Make mariachi get back in if player stuns him while in the vehicle
statusMariachi[i] = MARIACHI_GOING_TO_PATROL_VEHICLE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDREPEAT
ENDIF
ENDPROC
/// PURPOSE:
/// Returns TRUE if both Mariachi are stunned by stun-guns.
FUNC BOOL MIN1_ARE_BOTH_MARIACHI_STUNNED()
IF statusMariachi[0] > MARIACHI_HAS_BEEN_STUNNED
AND statusMariachi[1] > MARIACHI_HAS_BEEN_STUNNED
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Returns TRUE if Joe/Josef should leave the patrol vehicle.
FUNC BOOL MIN1_SHOULD_BUDDY_GET_OUT()
IF MIN1_ARE_BOTH_MARIACHI_STUNNED()
RETURN TRUE
ENDIF
IF IS_ENTITY_ALIVE(vehPatrolVehicle)
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPatrolVehicle)
RETURN TRUE
ENDIF
IF IS_ENTITY_ALIVE(vehMariachiCar)
AND GET_ENTITY_SPEED(vehPatrolVehicle) < 1
AND GET_DISTANCE_BETWEEN_ENTITIES(vehPatrolVehicle, vehMariachiCar) < 30
RETURN TRUE // Vehicle is almost stationary and within 30 metres
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Handles Joe/Josef aiming at the drunken Mariachi getting into the patrol vehicle.
PROC MIN1_MANAGE_BUDDIES_GUARDING_MARIACHI()
INT i = 0
IF IS_ENTITY_ALIVE(vehPatrolVehicle)
REPEAT NUM_BUDDIES i
IF IS_ENTITY_ALIVE(pedBuddy[i].ped)
AND IS_ENTITY_ALIVE(pedMariachi[i])
SWITCH pedBuddy[i].status
CASE BUDDY_WAITING_TO_GET_OUT
IF MIN1_SHOULD_BUDDY_GET_OUT()
GIVE_WEAPON_TO_PED(pedBuddy[i].ped, WEAPONTYPE_STUNGUN, 200, TRUE)
BRING_VEHICLE_TO_HALT(vehPatrolVehicle, 10.0, 2) // B*1397040 Prevent driving away with Josef still in the patrol vehicle
TASK_LEAVE_ANY_VEHICLE(pedBuddy[i].ped, i*1500 + 250, ECF_DONT_CLOSE_DOOR|ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP)
pedBuddy[i].status = BUDDY_GOING_TO_MARIACHI_PED
ENDIF
BREAK
CASE BUDDY_GOING_TO_MARIACHI_PED
IF NOT IS_PED_IN_VEHICLE(pedBuddy[i].ped, vehPatrolVehicle)
IF IS_ENTITY_IN_RANGE_ENTITY(pedBuddy[i].ped, pedMariachi[i], 5)
SET_PED_CONFIG_FLAG(pedBuddy[i].ped, PCF_UseKinematicModeWhenStationary, TRUE) // See B*771704 - Only set this when not in a car
pedBuddy[i].status = BUDDY_AIMING_AT_MARIACHI_PED
ELIF NOT IsPedPerformingTask(pedBuddy[i].ped, SCRIPT_TASK_GO_TO_ENTITY_WHILE_AIMING_AT_ENTITY)
SET_PED_CONFIG_FLAG(pedBuddy[i].ped, PCF_UseKinematicModeWhenStationary, TRUE) // See B*771704 - Only set this when not in a car
TASK_GO_TO_ENTITY_WHILE_AIMING_AT_ENTITY(pedBuddy[i].ped, pedMariachi[i], pedMariachi[i], PEDMOVEBLENDRATIO_RUN, FALSE)
ENDIF
ENDIF
BREAK
CASE BUDDY_AIMING_AT_MARIACHI_PED
IF statusMariachi[i] = MARIACHI_SAT_IN_PATROL_VEHICLE
pedBuddy[i].status = BUDDY_TRYING_TO_ENTER_PATROL_VEHICLE
ELSE
IF NOT IS_ENTITY_IN_RANGE_ENTITY(pedBuddy[i].ped, pedMariachi[i], 6)
pedBuddy[i].status = BUDDY_GOING_TO_MARIACHI_PED
ELIF NOT IsPedPerformingTask(pedBuddy[i].ped, SCRIPT_TASK_AIM_GUN_AT_ENTITY)
TASK_AIM_GUN_AT_ENTITY(pedBuddy[i].ped, pedMariachi[i], -1)
ENDIF
ENDIF
BREAK
CASE BUDDY_TRYING_TO_ENTER_PATROL_VEHICLE
IF IS_VEHICLE_SEAT_FREE(vehPatrolVehicle, pedBuddy[i].seatEnd)
IF i = JOE
SAFE_REMOVE_BLIP(blipJoe)
IF IS_THIS_PRINT_BEING_DISPLAYED("MIN1_10") // Park near ~b~Joe ~s~and exit the vehicle.
CLEAR_PRINTS()
ENDIF
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehPatrolVehicle, FALSE) // When Joe is told to enter vehicle, prevent player screwing around by getting back in
ELSE
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPatrolVehicle) // Josef's seat is free but the player is in the patrol vehicle driver's seat
AND MIN1_ALLOW_CONVERSATION_TO_PLAY()
AND IS_ENTITY_IN_RANGE_ENTITY(pedBuddy[i].ped, vehPatrolVehicle, 50)
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_NOJOSEF", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_NOJOSEF conversation") ENDIF #ENDIF
ENDIF
ENDIF
pedBuddy[i].status = BUDDY_ENTERING_PATROL_VEHICLE
ELSE
IF i = JOE // Joe needs to play dialogue and display an objective, Josef doesn't
IF NOT DOES_BLIP_EXIST(blipJoe)
blipJoe = CREATE_PED_BLIP(pedBuddy[i].ped, TRUE, TRUE)
PRINT_NOW("MIN1_10", DEFAULT_GOD_TEXT_TIME, 1) // Park near ~b~Joe ~s~and exit the vehicle.
ENDIF
IF bStartedBringVehicleConversation = FALSE
IF MIN1_ALLOW_CONVERSATION_TO_PLAY(TRUE, FALSE)
AND IS_ENTITY_IN_RANGE_ENTITY(pedBuddy[i].ped, vehPatrolVehicle, 50)
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_BRING", CONV_PRIORITY_HIGH, DO_NOT_DISPLAY_SUBTITLES) // No subs cos will be displaying at same time as MIN1_10 god text
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_BRING conversation") ENDIF #ENDIF
bStartedBringVehicleConversation = TRUE
ENDIF
ELSE
IF bStartedNoJoeConversation = FALSE
AND MIN1_ALLOW_CONVERSATION_TO_PLAY()
AND IS_ENTITY_IN_RANGE_ENTITY(pedBuddy[i].ped, vehPatrolVehicle, 50)
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_NOJO", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_NOJO conversation") ENDIF #ENDIF
bStartedNoJoeConversation = TRUE
ENDIF
ENDIF
ENDIF
IF NOT IS_ENTITY_IN_RANGE_ENTITY(pedBuddy[i].ped, vehPatrolVehicle, 100)
MIN1_MISSION_FAILED(FAILED_ABANDONED_JOE)
ELIF NOT IS_ENTITY_IN_RANGE_ENTITY(pedBuddy[i].ped, vehPatrolVehicle, 10)
IF NOT IsPedPerformingTask(pedBuddy[i].ped, SCRIPT_TASK_GO_TO_ENTITY)
TASK_GO_TO_ENTITY(pedBuddy[i].ped, vehPatrolVehicle, 30000, 5.0, PEDMOVEBLENDRATIO_RUN)
ENDIF
ELIF NOT IS_PED_FACING_PED(pedBuddy[i].ped, PLAYER_PED_ID(), 30)
TASK_TURN_PED_TO_FACE_ENTITY(pedBuddy[i].ped, PLAYER_PED_ID())
ELIF NOT IsPedPerformingTask(pedBuddy[i].ped, SCRIPT_TASK_STAND_STILL)
TASK_STAND_STILL(pedBuddy[i].ped, -1)
ENDIF
ENDIF
BREAK
CASE BUDDY_ENTERING_PATROL_VEHICLE
IF IS_PED_IN_VEHICLE(pedBuddy[i].ped, vehPatrolVehicle)
SET_PED_KEEP_TASK(pedBuddy[i].ped, TRUE)
pedBuddy[i].status = BUDDY_SAT_IN_PATROL_VEHICLE
ELIF NOT IsPedPerformingTask(pedBuddy[i].ped, SCRIPT_TASK_ENTER_VEHICLE) // See B*929660 - Deal with the TASK_ENTER_VEHICLE stopping for whatever reason
TASK_ENTER_VEHICLE(pedBuddy[i].ped, vehPatrolVehicle, 30000, pedBuddy[i].seatEnd, PEDMOVEBLENDRATIO_WALK, ECF_JACK_ANYONE|ECF_WARP_IF_DOOR_IS_BLOCKED)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Gave buddy ", i," a task to enter the patrol vehicle") ENDIF #ENDIF
ENDIF
BREAK
CASE BUDDY_SAT_IN_PATROL_VEHICLE
IF bStartedGoBackForJoeConversation = FALSE
AND i = JOSEF
AND statusMariachi[0] = MARIACHI_SAT_IN_PATROL_VEHICLE
AND statusMariachi[1] = MARIACHI_SAT_IN_PATROL_VEHICLE
AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPatrolVehicle) // Player is in the patrol vehicle with Josef and the two mariachis so Josef needs to say something
AND MIN1_ALLOW_CONVERSATION_TO_PLAY()
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_GOBACK2", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_GOBACK2 conversation") ENDIF #ENDIF
bStartedGoBackForJoeConversation = TRUE
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDREPEAT
ENDIF
ENDPROC
/// PURPOSE:
/// Plays the next line of dialogue to warn the player about excessively stunning the Mariachi.
PROC MIN1_PLAY_NEXT_TIMES_STUNNED_DIALOGUE()
IF iCurrentTimesStunnedDialogue < NUM_TIMES_STUNNED_DIALOGUE
AND (statusMariachi[0] != MARIACHI_SAT_IN_PATROL_VEHICLE OR statusMariachi[1] != MARIACHI_SAT_IN_PATROL_VEHICLE) // B*1515716 - If queued up don't allow this to play if they've both subsequently got in the vehicle
AND MIN1_ALLOW_CONVERSATION_TO_PLAY()
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", sTimesStunnedDialogueString[iCurrentTimesStunnedDialogue], CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_STOP conversation ", iCurrentTimesStunnedDialogue) ENDIF #ENDIF
iCurrentTimesStunnedDialogue++
ENDIF
ENDPROC
/// PURPOSE:
/// Handles playing dialogue if the player keeps stunning the Mariachi peds.
PROC MIN1_MANAGE_EXCESSIVE_STUN_DIALOGUE()
INT i = 0
REPEAT NUM_MARIACHI_PEDS i
IF statusMariachi[i] > MARIACHI_WAITING_TO_BE_STUNNED
AND IS_ENTITY_ALIVE(pedMariachi[i])
AND IS_PED_SHOOTING(PLAYER_PED_ID())
AND HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(pedMariachi[i], WEAPONTYPE_STUNGUN)
CLEAR_PED_LAST_WEAPON_DAMAGE(pedMariachi[i])
iTimesStunnedMoreThanNecessary++
IF iTimesStunnedMoreThanNecessary >= 8
SET_ENTITY_HEALTH(pedMariachi[i], 0)
ENDIF
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: iTimesStunnedMoreThanNecessary = ", iTimesStunnedMoreThanNecessary) ENDIF #ENDIF
ENDIF
ENDREPEAT
IF iTimesStunnedMoreThanNecessary < 8
AND iTimesStunnedMoreThanNecessary > (iCurrentTimesStunnedDialogue*2)
MIN1_PLAY_NEXT_TIMES_STUNNED_DIALOGUE()
ENDIF
ENDPROC
/// PURPOSE:
/// Handles playing the conversation in which Joe tells Trevor his task is done.
PROC MIN1_MANAGE_LEAVE_AREA_DIALOGUE()
IF bStartedLeaveAreaConversation = FALSE
AND MIN1_ALLOW_CONVERSATION_TO_PLAY()
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_OUTRO", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_OUTRO conversation") ENDIF #ENDIF
bStartedLeaveAreaConversation = TRUE
ENDIF
ENDPROC
/// PURPOSE:
/// Handles playing the conversation in which Joe/Josef say cya to Trevor.
PROC MIN1_MANAGE_CYA_DIALOGUE()
IF bStartedCyaConversation = FALSE
AND MIN1_ALLOW_CONVERSATION_TO_PLAY()
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_CYA", CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_CYA conversation") ENDIF #ENDIF
REPLAY_RECORD_BACK_FOR_TIME(2.0, 3.5, REPLAY_IMPORTANCE_LOWEST)
bStartedCyaConversation = TRUE
ENDIF
ENDPROC
/// PURPOSE:
/// Fails the mission if the player stuns anyone while the patrol vehicle is driving away. See B*1235814.
PROC MIN1_HANDLE_PLAYER_STUNNING_PEDS_WHEN_DRIVING_AWAY()
INT i = 0
REPEAT NUM_BUDDIES i
IF IS_ENTITY_ALIVE(pedBuddy[i].ped)
AND IS_PED_BEING_STUNNED(pedBuddy[i].ped)
AND GET_ENTITY_HEALTH(pedBuddy[i].ped) > 0
SET_ENTITY_HEALTH(pedBuddy[i].ped, 0)
ENDIF
ENDREPEAT
i = 0
REPEAT NUM_MARIACHI_PEDS i
IF IS_ENTITY_ALIVE(pedMariachi[i])
AND IS_PED_BEING_STUNNED(pedMariachi[i])
AND GET_ENTITY_HEALTH(pedMariachi[i]) > 0
SET_ENTITY_HEALTH(pedMariachi[i], 0)
ENDIF
ENDREPEAT
ENDPROC
/// PURPOSE:
/// Handles the patrol vehicle driving off when Joe, Josef and both Mariachi are inside it.
PROC MIN1_MANAGE_BUDDIES_DRIVING_AWAY()
IF pedBuddy[0].status = BUDDY_SAT_IN_PATROL_VEHICLE
AND pedBuddy[1].status = BUDDY_SAT_IN_PATROL_VEHICLE
AND statusMariachi[0] = MARIACHI_SAT_IN_PATROL_VEHICLE
AND statusMariachi[1] = MARIACHI_SAT_IN_PATROL_VEHICLE
AND IS_ENTITY_ALIVE(vehPatrolVehicle)
AND IS_ENTITY_ALIVE(pedBuddy[0].ped)
SET_VEHICLE_SIREN(vehPatrolVehicle, FALSE)
TASK_VEHICLE_DRIVE_WANDER(pedBuddy[0].ped, vehPatrolVehicle, 10, DRIVINGMODE_STOPFORCARS) // B*870427
SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(vehPatrolVehicle, TRUE) // B*538720 Attempt 1
SET_ENTITY_PROOFS(vehPatrolVehicle, FALSE, FALSE, FALSE, TRUE, FALSE) // B*538720 Attempt 2
//ADD_VEHICLE_STUCK_CHECK_WITH_WARP(vehPatrolVehicle, 10, 5000, TRUE, TRUE, TRUE, 10) // Increased from 1000ms to 5000ms to fix B*1294783 // Commented out, causes B*1532500
IF GET_VEHICLE_ENGINE_HEALTH(vehPatrolVehicle) < 500
SET_VEHICLE_ENGINE_HEALTH(vehPatrolVehicle, 500)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: vehPatrolVehicle engine health set to 500") ENDIF #ENDIF
ENDIF
IF GET_ENTITY_HEALTH(vehPatrolVehicle) < 500
SET_ENTITY_HEALTH(vehPatrolVehicle, 500)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: vehPatrolVehicle health set to 500") ENDIF #ENDIF
ENDIF
IF IS_VEHICLE_TYRE_BURST(vehPatrolVehicle, SC_WHEEL_CAR_FRONT_LEFT)
SET_VEHICLE_TYRE_FIXED(vehPatrolVehicle, SC_WHEEL_CAR_FRONT_LEFT)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: vehPatrolVehicle tyre SC_WHEEL_CAR_FRONT_LEFT fixed") ENDIF #ENDIF
ENDIF
IF IS_VEHICLE_TYRE_BURST(vehPatrolVehicle, SC_WHEEL_CAR_FRONT_RIGHT)
SET_VEHICLE_TYRE_FIXED(vehPatrolVehicle, SC_WHEEL_CAR_FRONT_RIGHT)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: vehPatrolVehicle tyre SC_WHEEL_CAR_FRONT_RIGHT fixed") ENDIF #ENDIF
ENDIF
IF IS_VEHICLE_TYRE_BURST(vehPatrolVehicle, SC_WHEEL_CAR_REAR_LEFT)
SET_VEHICLE_TYRE_FIXED(vehPatrolVehicle, SC_WHEEL_CAR_REAR_LEFT)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: vehPatrolVehicle tyre SC_WHEEL_CAR_REAR_LEFT fixed") ENDIF #ENDIF
ENDIF
IF IS_VEHICLE_TYRE_BURST(vehPatrolVehicle, SC_WHEEL_CAR_REAR_RIGHT)
SET_VEHICLE_TYRE_FIXED(vehPatrolVehicle, SC_WHEEL_CAR_REAR_RIGHT)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: vehPatrolVehicle tyre SC_WHEEL_CAR_REAR_RIGHT fixed") ENDIF #ENDIF
ENDIF
bPatrolVehicleDrivingAway = TRUE
ENDIF
ENDPROC
/// PURPOSE:
/// Returns true if the player is more than 50 metres away from Joe, Josef, the patrol vehicle and both Mariachi peds.
FUNC BOOL MIN1_IS_PLAYER_FAR_AWAY_FROM_ENTITIES()
INT i
IF IS_ENTITY_ALIVE(vehPatrolVehicle)
AND IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), vehPatrolVehicle, 50)
RETURN FALSE
ENDIF
i = 0
REPEAT NUM_BUDDIES i
IF IS_ENTITY_ALIVE(pedBuddy[i].ped)
AND IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), pedBuddy[i].ped, 50)
RETURN FALSE
ENDIF
ENDREPEAT
i = 0
REPEAT NUM_MARIACHI_PEDS i
IF IS_ENTITY_ALIVE(pedMariachi[i])
AND IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), pedMariachi[i], 50)
RETURN FALSE
ENDIF
ENDREPEAT
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Handles playing the dialogue if the player fails the mission causing Joe/Josef to flee.
PROC MIN1_MANAGE_JOE_JOSEF_FLEE_DIALOGUE()
IF bStartedFleeConversation = FALSE
AND failReason != FAILED_MARIACHI_ESCAPED // B*1083469 - Don't make Joe/Josef leave the car if the mariachi escape
IF IS_ENTITY_ALIVE(pedBuddy[JOE].ped)
ADD_PED_FOR_DIALOGUE(sConversation, 3, pedBuddy[JOE].ped, "JOE")
IF CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_FLEE1", CONV_PRIORITY_HIGH, DO_NOT_DISPLAY_SUBTITLES)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_FLEE1 conversation") ENDIF #ENDIF
bStartedFleeConversation = TRUE
ENDIF
ELIF IS_ENTITY_ALIVE(pedBuddy[JOSEF].ped)
ADD_PED_FOR_DIALOGUE(sConversation, 4, pedBuddy[JOSEF].ped, "JOSEF")
IF CREATE_CONVERSATION(sConversation, "MIN1AUD", "MIN1_FLEE2", CONV_PRIORITY_HIGH, DO_NOT_DISPLAY_SUBTITLES)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_FLEE2 conversation") ENDIF #ENDIF
bStartedFleeConversation = TRUE
ENDIF
ELSE
bStartedFleeConversation = TRUE
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Mission is failing so set alive peds to flee from the player.
PROC MIN1_SET_PED_TO_FLEE(PED_INDEX ped_to_flee)
IF IS_ENTITY_ALIVE(ped_to_flee)
IF IS_PED_IN_ANY_VEHICLE(ped_to_flee)
VEHICLE_INDEX veh_ped_is_in = GET_VEHICLE_PED_IS_IN(ped_to_flee)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND veh_ped_is_in = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: A ped is in the player's vehicle, so exit and flee") ENDIF #ENDIF
OPEN_SEQUENCE_TASK(fleeSequence)
TASK_LEAVE_ANY_VEHICLE(NULL, GET_RANDOM_INT_IN_RANGE(0, 250))
TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 100, -1)
CLOSE_SEQUENCE_TASK(fleeSequence)
TASK_PERFORM_SEQUENCE(ped_to_flee, fleeSequence)
CLEAR_SEQUENCE_TASK(fleeSequence)
ELSE
SET_PED_COMBAT_ATTRIBUTES(ped_to_flee, CA_LEAVE_VEHICLES, FALSE)
SET_PED_FLEE_ATTRIBUTES(ped_to_flee, FA_USE_VEHICLE, TRUE)
IF GET_PED_IN_VEHICLE_SEAT(veh_ped_is_in, VS_DRIVER) = ped_to_flee
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_ped_is_in)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: A ped is the driver of the vehicle, but carrec playback is ongoing so leave it running") ENDIF #ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: A ped is the driver of the vehicle, so set to drive wander") ENDIF #ENDIF
TASK_VEHICLE_DRIVE_WANDER(ped_to_flee, veh_ped_is_in, 30, DRIVINGMODE_AVOIDCARS_RECKLESS)
ENDIF
ELSE
IF GET_PED_IN_VEHICLE_SEAT(veh_ped_is_in, VS_FRONT_RIGHT) = ped_to_flee
AND IS_VEHICLE_SEAT_FREE(veh_ped_is_in, VS_DRIVER)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: A ped is in the front right and the driver seat is free, so shuffle across then drive wander") ENDIF #ENDIF
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(veh_ped_is_in)
STOP_PLAYBACK_RECORDED_VEHICLE(veh_ped_is_in)
ENDIF
OPEN_SEQUENCE_TASK(fleeSequence)
TASK_SHUFFLE_TO_NEXT_VEHICLE_SEAT(NULL, veh_ped_is_in)
TASK_VEHICLE_DRIVE_WANDER(NULL, veh_ped_is_in, 30, DRIVINGMODE_AVOIDCARS_RECKLESS)
CLOSE_SEQUENCE_TASK(fleeSequence)
TASK_PERFORM_SEQUENCE(ped_to_flee, fleeSequence)
CLEAR_SEQUENCE_TASK(fleeSequence)
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: A ped isn't in the player vehicle, but is sat in a rear seat or the driver seat is occupied by a non-player ped, so just flee") ENDIF #ENDIF
TASK_SMART_FLEE_PED(ped_to_flee, PLAYER_PED_ID(), 100, -1)
ENDIF
ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: A ped isn't in any vehicle, so just flee") ENDIF #ENDIF
TASK_SMART_FLEE_PED(ped_to_flee, PLAYER_PED_ID(), 100, -1)
ENDIF
SET_PED_KEEP_TASK(ped_to_flee, TRUE)
ENDIF
ENDPROC
/// PURPOSE:
/// Plays the next line of dialogue to warn the player about shooting the patrol vehicle.
PROC MIN1_PLAY_NEXT_SHOT_VEHICLE_DIALOGUE()
IF MIN1_ALLOW_CONVERSATION_TO_PLAY(FALSE)
AND CREATE_CONVERSATION(sConversation, "MIN1AUD", sShotVehicleDialogueString[iCurrentShotVehicleDialogue], CONV_PRIORITY_HIGH)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Started MIN1_SHOOT conversation ", iCurrentShotVehicleDialogue) ENDIF #ENDIF
iCurrentShotVehicleDialogue++
ENDIF
ENDPROC
/// PURPOSE:
/// Makes both buddies and both Mariachi flee the player.
PROC MIN1_MAKE_BUDDIES_AND_MARIACHI_FLEE()
IF failReason != FAILED_MARIACHI_ESCAPED // B*1083469 - Don't make Joe/Josef leave the car if the mariachi escape
MIN1_SET_PED_TO_FLEE(pedBuddy[JOE].ped)
MIN1_SET_PED_TO_FLEE(pedBuddy[JOSEF].ped)
ENDIF
MIN1_SET_PED_TO_FLEE(pedMariachi[0])
MIN1_SET_PED_TO_FLEE(pedMariachi[1])
ENDPROC
/// PURPOSE:
/// Stops playing ambient anims on the mission peds.
PROC MIN1_STOP_AMBIENT_ANIMS_ON_PED(PED_INDEX ped)
SET_PED_CAN_PLAY_AMBIENT_ANIMS(ped, FALSE)
SET_PED_CAN_PLAY_AMBIENT_BASE_ANIMS(ped, FALSE)
SET_PED_CAN_PLAY_GESTURE_ANIMS(ped, FALSE)
ENDPROC
/// PURPOSE:
/// Death checks for any mission critical entities.
PROC MIN1_DEATH_CHECKS()
IF ENUM_TO_INT(missionState) < (ENUM_TO_INT(NUM_MISSION_STATES)-1) // Don't check during stateFailed
IF ENUM_TO_INT(missionState) > ENUM_TO_INT(stateGoToBar)
AND GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
IF iWantedFailedTimer = -1
iWantedFailedTimer = GET_GAME_TIMER()
ELIF (GET_GAME_TIMER() - iWantedFailedTimer) > 2000
MIN1_MISSION_FAILED(FAILED_ALERTED_COPS)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(pedBuddy[JOE].ped)
IF IS_ENTITY_DEAD(pedBuddy[JOE].ped)
MIN1_MISSION_FAILED(FAILED_JOE_DIED)
ELSE
MIN1_STOP_AMBIENT_ANIMS_ON_PED(pedBuddy[JOE].ped)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(pedBuddy[JOE].ped, PLAYER_PED_ID())
MIN1_MISSION_FAILED(FAILED_JOE_INJURED)
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(pedBuddy[JOSEF].ped)
IF IS_ENTITY_DEAD(pedBuddy[JOSEF].ped)
MIN1_MISSION_FAILED(FAILED_JOSEF_DIED)
ELSE
MIN1_STOP_AMBIENT_ANIMS_ON_PED(pedBuddy[JOSEF].ped)
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(pedBuddy[JOSEF].ped, PLAYER_PED_ID())
MIN1_MISSION_FAILED(FAILED_JOSEF_INJURED)
ENDIF
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vehPatrolVehicle)
IF IS_ENTITY_DEAD(vehPatrolVehicle)
MIN1_MISSION_FAILED(FAILED_PATROL_VEHICLE_WRECKED)
ELSE
IF HAS_VEHICLE_GOT_PROJECTILE_ATTACHED(PLAYER_PED_ID(), vehPatrolVehicle, WEAPONTYPE_STICKYBOMB)
MIN1_MISSION_FAILED(FAILED_THREW_EXPLOSIVES)
ENDIF
IF IS_VEHICLE_DRIVEABLE(vehPatrolVehicle)
IF ENUM_TO_INT(missionState) < ENUM_TO_INT(stateLeaveArea) // B*538720 Attempt 3
IF IS_VEHICLE_STUCK_TIMER_UP(vehPatrolVehicle, VEH_STUCK_HUNG_UP, HUNG_UP_TIME)
OR IS_VEHICLE_STUCK_TIMER_UP(vehPatrolVehicle, VEH_STUCK_JAMMED, JAMMED_TIME)
OR IS_VEHICLE_STUCK_TIMER_UP(vehPatrolVehicle, VEH_STUCK_ON_ROOF, ROOF_TIME)
OR IS_VEHICLE_STUCK_TIMER_UP(vehPatrolVehicle, VEH_STUCK_ON_SIDE, ROOF_TIME) // Using ROOF_TIME instead of SIDE_TIME to fix B*934538
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: vehPatrolVehicle is stuck") ENDIF #ENDIF
MIN1_MISSION_FAILED(FAILED_PATROL_VEHICLE_WRECKED)
ENDIF
ENDIF
IF ENUM_TO_INT(missionState) < ENUM_TO_INT(stateStunMariachiPeds) // Fail mission if player shoots at patrol vehicle when not inside it, but only prior to stunning objective
AND IS_ENTITY_ALIVE(PLAYER_PED_ID())
AND NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPatrolVehicle)
AND HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(vehPatrolVehicle, PLAYER_PED_ID())
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(vehPatrolVehicle, WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON)
IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(vehPatrolVehicle, WEAPONTYPE_UNARMED, GENERALWEAPON_TYPE_INVALID) // B*1433041 Don't check for damage when unarmed
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: vehPatrolVehicle was damaged by WEAPONTYPE_UNARMED so not incrementing iCurrentShotVehicleDialogue") ENDIF #ENDIF
ELIF IS_ENTITY_ON_FIRE(vehPatrolVehicle) // B*1457651 B*1457673
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: vehPatrolVehicle was damaged by fire so just fail mission") ENDIF #ENDIF
MIN1_MISSION_FAILED(FAILED_PATROL_VEHICLE_ATTACKED)
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: vehPatrolVehicle was damaged by GENERALWEAPON_TYPE_ANYWEAPON. iCurrentShotVehicleDialogue = ", iCurrentShotVehicleDialogue) ENDIF #ENDIF
IF iCurrentShotVehicleDialogue = 0
OR iCurrentShotVehicleDialogue = 1
MIN1_PLAY_NEXT_SHOT_VEHICLE_DIALOGUE()
ELIF MIN1_ALLOW_CONVERSATION_TO_PLAY(FALSE)
MIN1_MISSION_FAILED(FAILED_PATROL_VEHICLE_ATTACKED)
ENDIF
ENDIF
CLEAR_ENTITY_LAST_WEAPON_DAMAGE(vehPatrolVehicle)
ENDIF
CLEAR_ENTITY_LAST_DAMAGE_ENTITY(vehPatrolVehicle)
ENDIF
IF (GET_GAME_TIMER() - iPatrolVehicleTyresBurstTimer) > 1000 // Check for burst tyres once a second
iPatrolVehicleTyresBurstTimer = GET_GAME_TIMER()
IF IS_VEHICLE_TYRE_BURST(vehPatrolVehicle, SC_WHEEL_CAR_REAR_LEFT)
AND IS_VEHICLE_TYRE_BURST(vehPatrolVehicle, SC_WHEEL_CAR_REAR_RIGHT)
AND IS_VEHICLE_TYRE_BURST(vehPatrolVehicle, SC_WHEEL_CAR_FRONT_LEFT)
AND IS_VEHICLE_TYRE_BURST(vehPatrolVehicle, SC_WHEEL_CAR_FRONT_RIGHT)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: All vehPatrolVehicle tyres burst") ENDIF #ENDIF
MIN1_MISSION_FAILED(FAILED_PATROL_VEHICLE_ATTACKED)
ENDIF
ENDIF
ELSE
MIN1_MISSION_FAILED(FAILED_PATROL_VEHICLE_WRECKED)
ENDIF
ENDIF
ENDIF
INT i = 0
REPEAT NUM_MARIACHI_PEDS i
IF DOES_ENTITY_EXIST(pedMariachi[i])
IF IS_ENTITY_DEAD(pedMariachi[i])
MIN1_MISSION_FAILED(FAILED_MARIACHI_DIED)
ELSE
MIN1_STOP_AMBIENT_ANIMS_ON_PED(pedMariachi[i])
IF NOT IS_PED_IN_ANY_VEHICLE(pedMariachi[i]) // Don't check for injuries when the player is chasing their car so he's allowed to pepper their car with gunfire
AND HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(pedMariachi[i], PLAYER_PED_ID())
AND NOT MIN1_HAS_MARIACHI_BEEN_DAMAGED_BY_ALLOWED_WEAPON(i)
MIN1_MISSION_FAILED(FAILED_MARIACHI_INJURED)
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDIF
ENDPROC
/// PURPOSE:
/// Main state for handling the intro cutscene.
PROC MS_INTRO()
SWITCH missionStateMachine
CASE MIN1_STATE_MACHINE_SETUP
MIN1_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_INTRO" #ENDIF)
RC_REQUEST_CUTSCENE("mmb_1_rcm", TRUE)
MIN1_SETUP_JOE_JOSEF_CUTSCENE_PROPS()
iCutsceneStage = 0
IF IS_SCREEN_FADED_IN() // Don't do gameplay hint if skipping to intro
AND NOT IS_REPLAY_IN_PROGRESS() // Or if replaying mission
AND IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[0])
AND GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[0]) > 7.0
AND NOT IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<329.287262,3403.302246,34.502598>>, <<336.421509,3385.255615,39.405560>>, 20.000000)
SET_GAMEPLAY_ENTITY_HINT(sRCLauncherDataLocal.pedID[0], (<<0, 0, 0>>), TRUE, -1, 3000)
SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR(0.45)
SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(-0.01)
SET_GAMEPLAY_HINT_FOV(25.00)
SET_GAMEPLAY_HINT_CAMERA_BLEND_TO_FOLLOW_PED_MEDIUM_VIEW_MODE(TRUE)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
OPEN_SEQUENCE_TASK(seqTrevorLeadIn)
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
TASK_LEAVE_ANY_VEHICLE(NULL)
ENDIF
TASK_FOLLOW_TO_OFFSET_OF_ENTITY(NULL, sRCLauncherDataLocal.pedID[0], <<0, -3, 0>>, PEDMOVEBLENDRATIO_WALK)
TASK_TURN_PED_TO_FACE_ENTITY(NULL, sRCLauncherDataLocal.pedID[0])
CLOSE_SEQUENCE_TASK(seqTrevorLeadIn)
TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), seqTrevorLeadIn)
CLEAR_SEQUENCE_TASK(seqTrevorLeadIn)
iLeadInTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Doing leadin focus camera") ENDIF #ENDIF
ELSE
iLeadInTimer = -1
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Not doing leadin focus camera") ENDIF #ENDIF
ENDIF
BREAK
CASE MIN1_STATE_MACHINE_LOOP
SWITCH iCutsceneStage
CASE 0
MIN1_SETUP_JOE_JOSEF_CUTSCENE_PROPS()
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
RC_PLAYER_TRIGGER_SCENE_LOCK_IN()
SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK)
ENDIF
IF iLeadInTimer = -1
OR (GET_GAME_TIMER() - iLeadInTimer) > 3000
IF RC_IS_CUTSCENE_OK_TO_START()
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[JOE])
pedBuddy[JOE].ped = sRCLauncherDataLocal.pedID[JOE]
SET_ENTITY_AS_MISSION_ENTITY(pedBuddy[JOE].ped, TRUE, TRUE)
REGISTER_ENTITY_FOR_CUTSCENE(pedBuddy[JOE].ped, "Joe", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_NPC_PED_MODEL(CHAR_JOE))
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: CU_ANIMATE_EXISTING_SCRIPT_ENTITY Joe") ENDIF #ENDIF
ELSE
REGISTER_ENTITY_FOR_CUTSCENE(pedBuddy[JOE].ped, "Joe", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_NPC_PED_MODEL(CHAR_JOE))
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[JOSEF])
pedBuddy[JOSEF].ped = sRCLauncherDataLocal.pedID[JOSEF]
SET_ENTITY_AS_MISSION_ENTITY(pedBuddy[JOSEF].ped, TRUE, TRUE)
REGISTER_ENTITY_FOR_CUTSCENE(pedBuddy[JOSEF].ped, "Josef", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_NPC_PED_MODEL(CHAR_JOSEF))
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: CU_ANIMATE_EXISTING_SCRIPT_ENTITY Josef") ENDIF #ENDIF
ELSE
REGISTER_ENTITY_FOR_CUTSCENE(pedBuddy[JOSEF].ped, "Josef", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_NPC_PED_MODEL(CHAR_JOSEF))
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.vehID[0])
vehPatrolVehicle = sRCLauncherDataLocal.vehID[0]
SET_ENTITY_AS_MISSION_ENTITY(vehPatrolVehicle, TRUE, TRUE)
REGISTER_ENTITY_FOR_CUTSCENE(vehPatrolVehicle, "MMB_Patrol_Vehicle", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, PRANGER)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: CU_ANIMATE_EXISTING_SCRIPT_ENTITY MMB_Patrol_Vehicle") ENDIF #ENDIF
ELSE
REGISTER_ENTITY_FOR_CUTSCENE(vehPatrolVehicle, "MMB_Patrol_Vehicle", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, PRANGER)
ENDIF
IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.vehID[1])
vehCamperVan = sRCLauncherDataLocal.vehID[1]
SET_ENTITY_AS_MISSION_ENTITY(vehCamperVan, TRUE, TRUE)
REGISTER_ENTITY_FOR_CUTSCENE(vehCamperVan, "MMB_Camper_Van", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, SURFER2)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: CU_ANIMATE_EXISTING_SCRIPT_ENTITY MMB_Camper_Van") ENDIF #ENDIF
ELSE
REGISTER_ENTITY_FOR_CUTSCENE(vehCamperVan, "MMB_Camper_Van", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, SURFER2)
ENDIF
RC_CLEANUP_LAUNCHER()
REPLAY_START_EVENT(REPLAY_IMPORTANCE_LOW)
START_CUTSCENE(CUTSCENE_PROCGRASS_FORCE_HD) // For B*1268419
IF IS_ENTITY_ALIVE(vehPatrolVehicle)
SET_VEHICLE_MODEL_PLAYER_WILL_EXIT_SCENE(GET_ENTITY_MODEL(vehPatrolVehicle))
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: set_vehicle_model_player_will_exit_scene") ENDIF #ENDIF
ENDIF
iCutsceneStage++
ENDIF
ENDIF
BREAK
CASE 1
IF IS_CUTSCENE_PLAYING()
IF IS_GAMEPLAY_HINT_ACTIVE()
STOP_GAMEPLAY_HINT()
ENDIF
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<331.741241,3402.092529,34.439514>>, <<318.007355,3410.159668,38.728088>>, 5.000000, vPlayerCarRespot, fPlayerCarRespot, GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR())
SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(vPlayerCarRespot, fPlayerCarRespot)
RC_START_CUTSCENE_MODE(<<327.85, 3405.70, 35.73>>)
SAFE_FADE_SCREEN_IN_FROM_BLACK(500, FALSE) // Just in case screen is faded out
iCutsceneStage++
ENDIF
BREAK
CASE 2
IF IS_CUTSCENE_PLAYING()
IF NOT DOES_ENTITY_EXIST(pedBuddy[JOE].ped)
AND DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Joe"))
pedBuddy[JOE].ped = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Joe"))
SET_ENTITY_AS_MISSION_ENTITY(pedBuddy[JOE].ped, TRUE, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Grabbed pedBuddy[JOE].ped from Joe") ENDIF #ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(pedBuddy[JOSEF].ped)
AND DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Josef"))
pedBuddy[JOSEF].ped = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Josef"))
SET_ENTITY_AS_MISSION_ENTITY(pedBuddy[JOSEF].ped, TRUE, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Grabbed pedBuddy[JOSEF].ped from Josef") ENDIF #ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(vehPatrolVehicle)
AND DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("MMB_Patrol_Vehicle"))
vehPatrolVehicle = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("MMB_Patrol_Vehicle"))
SET_ENTITY_AS_MISSION_ENTITY(vehPatrolVehicle, TRUE, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Grabbed vehPatrolVehicle from MMB_Patrol_Vehicle") ENDIF #ENDIF
ENDIF
IF NOT DOES_ENTITY_EXIST(vehCamperVan)
AND DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("MMB_Camper_Van"))
vehCamperVan = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("MMB_Camper_Van"))
SET_ENTITY_AS_MISSION_ENTITY(vehCamperVan, TRUE, TRUE)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Grabbed vehCamperVan from MMB_Camper_Van") ENDIF #ENDIF
ENDIF
ELSE
SET_VEHICLE_DOORS_SHUT(vehPatrolVehicle, TRUE) // See B*1340763 - Ensure the doors are closed whether skipping or not
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0) // See B*1015583 - Should be a cut rather than a blend
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
MIN1_SETUP_PATROL_VEHICLE(<<321.687347,3408.640625,35.343765>>, -105.797066)
RC_END_CUTSCENE_MODE()
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: IS_CUTSCENE_PLAYING returned false") ENDIF #ENDIF
missionStateMachine = MIN1_STATE_MACHINE_CLEANUP
ENDIF
BREAK
ENDSWITCH
BREAK
CASE MIN1_STATE_MACHINE_CLEANUP
REPLAY_STOP_EVENT()
MIN1_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_INTRO" #ENDIF)
RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE)
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Main state for handling going to the bar.
PROC MS_GO_TO_BAR()
SWITCH missionStateMachine
CASE MIN1_STATE_MACHINE_SETUP
MIN1_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_GO_TO_BAR" #ENDIF)
SAFE_RELEASE_VEHICLE(vehCamperVan)
SET_WANTED_LEVEL_MULTIPLIER(0.5)
MIN1_RESET_PATROL_VEHICLE_VARS()
pvStatus = PV_STATUS_GO_TO_DESTINATION
bStartedDriveToBarConversation = FALSE
bFinishedDriveToBarConversation = FALSE
bStartedStopDriveConversation = FALSE
bStartedWrongWayConversation = FALSE
bStartedAlmostThereConversation = FALSE
bIsInteriorPinned = FALSE
REPLAY_RECORD_BACK_FOR_TIME(0.0, 10.0, REPLAY_IMPORTANCE_LOWEST)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<322,3409,35>>-<<40,40,40>>, <<322,3409,35>>+<<40,40,40>>, FALSE) // See B*1217223 - Stop trailers spawning
BREAK
CASE MIN1_STATE_MACHINE_LOOP
IF IS_ENTITY_ALIVE(vehPatrolVehicle)
IF IS_ENTITY_IN_RANGE_COORDS(vehPatrolVehicle, vBarOutside, 20)
AND GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0
KILL_ANY_CONVERSATION()
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPatrolVehicle)
BRING_VEHICLE_TO_HALT(vehPatrolVehicle, 10.0, 1)
ENDIF
missionStateMachine = MIN1_STATE_MACHINE_CLEANUP
ELSE
MIN1_MANAGE_PATROL_VEHICLE_OBJECTIVES()
MIN1_MANAGE_DRIVE_TO_BAR_CONVERSATION()
MIN1_MANAGE_ALMOST_THERE_CONVERSATION()
MIN1_MANAGE_WRONG_WAY_CONVERSATION()
MIN1_MANAGE_ABANDONING_VEHICLE()
MIN1_MANAGE_INTERIOR_PINNING()
ENDIF
IF IS_INTERIOR_READY(interiorBar)
AND GET_INTERIOR_FROM_ENTITY(PLAYER_PED_ID()) = interiorBar
MIN1_MISSION_FAILED(FAILED_ABANDONED_BUDDIES)
ENDIF
ENDIF
BREAK
CASE MIN1_STATE_MACHINE_CLEANUP
MIN1_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_GO_TO_BAR" #ENDIF)
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Main state for handling going inside the bar.
PROC MS_GO_INSIDE_BAR()
SWITCH missionStateMachine
CASE MIN1_STATE_MACHINE_SETUP
MIN1_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_GO_INSIDE_BAR" #ENDIF)
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_GO_IN_BAR, "Enter bar")
MIN1_LOAD_ASSETS_FOR_MISSION_STATE(stateGoInsideBar)
MIN1_MAKE_BUDDIES_LOOK_AT_PLAYER(TRUE)
// See B*1793310 - bringing across the below fix from the ng branch as requested by Fredrik at SD
SET_SCENARIO_PEDS_SPAWN_IN_SPHERE_AREA(<<1985.25757, 3048.66968, 46.21502>>, 7.0, 20) // B*1766485 - Ensure bar gets populated // B*1779653 Ensure peds don't visibly spawn in front of bar
bStartedArrivedAtBarConversation = FALSE
bStartedDrunkPedConversation = FALSE
bStartedBumpDrunkConversation = FALSE
iWaitConversationsPlayed = 0
bPedGoneOutDoor = FALSE
bDoneJanetTalk = FALSE
REPLAY_RECORD_BACK_FOR_TIME(5.0, 10.0, REPLAY_IMPORTANCE_LOWEST)
SET_WANTED_LEVEL_MULTIPLIER(0.1)
iLookAroundTimer = GET_GAME_TIMER()
iWaitConversationTimer = GET_GAME_TIMER()
BREAK
CASE MIN1_STATE_MACHINE_LOOP
MIN1_DISABLE_TREVOR_AGITATION_TRIGGERS()
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<1991.563110,3049.608887,45.125618>>, <<1988.916260,3045.263184,48.125492>>, 5.000000)
missionStateMachine = MIN1_STATE_MACHINE_CLEANUP
ELSE
MIN1_MANAGE_ARRIVED_AT_BAR_CONVERSATION()
MIN1_MANAGE_WAIT_CONVERSATIONS()
MIN1_MANAGE_DRUNK_PED_OUT_DOOR()
MIN1_MANAGE_JANET_CONVERSATION()
MIN1_MANAGE_TREVOR_LOOKING_FOR_MARIACHI()
MIN1_MANAGE_INTERIOR_PINNING()
ENDIF
BREAK
CASE MIN1_STATE_MACHINE_CLEANUP
MIN1_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_GO_INSIDE_BAR" #ENDIF)
SAFE_REMOVE_BLIP(blipPatrolVehicle)
SAFE_REMOVE_BLIP(blipDestination)
SAFE_RELEASE_PED(pedWalkOutBar)
SAFE_RELEASE_PED(pedJanet)
IF IS_ENTITY_ALIVE(PLAYER_PED_ID())
TASK_CLEAR_LOOK_AT(PLAYER_PED_ID())
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Main state for handling returning back outside the bar.
PROC MS_GO_OUTSIDE_BAR()
SWITCH missionStateMachine
CASE MIN1_STATE_MACHINE_SETUP
MIN1_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_GO_OUTSIDE_BAR" #ENDIF)
KILL_ANY_CONVERSATION() // Stop the drunk ped conversation if ongoing
IF IS_ENTITY_ALIVE(vehPatrolVehicle)
SAFE_TELEPORT_ENTITY(vehPatrolVehicle, <<1995.878784,3058.194824,46.692181>>, 45.833717)
SET_VEHICLE_FORWARD_SPEED(vehPatrolVehicle, 0.1)
SET_ENTITY_HEALTH(vehPatrolVehicle, 1000)
SET_VEHICLE_DOOR_OPEN(vehPatrolVehicle, SC_DOOR_FRONT_LEFT)
ENDIF
REPLAY_RECORD_BACK_FOR_TIME(5.0, 10.0, REPLAY_IMPORTANCE_LOWEST)
MIN1_SPAWN_MARIACHI_CAR(vMariachiCar, fMariachiCar, 500)
MIN1_CHANGE_ROAD_NODES_FOR_CAR_CHASE(FALSE)
MIN1_MAKE_BUDDIES_LOOK_AT_PLAYER(TRUE)
bStartedInBarConversation = FALSE
bStartedGetOutHereConversation = FALSE
bStartedOutsideBarConversation = FALSE
iDisableReplayCameraTimer = GET_GAME_TIMER() + 1000 //Fix for bug 2223403
BREAK
CASE MIN1_STATE_MACHINE_LOOP
MIN1_DISABLE_TREVOR_AGITATION_TRIGGERS()
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<1990.334961,3053.546143,45.112350>>, <<1989.141846,3051.732666,48.112213>>, 3.000000)
missionStateMachine = MIN1_STATE_MACHINE_CLEANUP
ELSE
MIN1_MANAGE_IN_BAR_CONVERSATION()
MIN1_MANAGE_GET_OUT_HERE_CONVERSATION()
ENDIF
BREAK
CASE MIN1_STATE_MACHINE_CLEANUP
MIN1_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_GO_OUTSIDE_BAR" #ENDIF)
UNPIN_INTERIOR(interiorBar)
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Main state for handling chasing the Mariachi van.
PROC MS_CHASE_MARIACHI_CAR()
SWITCH missionStateMachine
CASE MIN1_STATE_MACHINE_SETUP
MIN1_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_CHASE_MARIACHI_CAR" #ENDIF)
MIN1_RESET_PATROL_VEHICLE_VARS()
MIN1_RESET_CHASE_CONVERSATION_VARS()
pvStatus = PV_STATUS_PLAYER_NOT_INSIDE
iRequiredHealth = 500
fFailDist = 200
bStartedChaseVanConversation = FALSE
bStartedSingingStream = FALSE
IF IS_ENTITY_ALIVE(vehMariachiCar)
IF NOT IS_AUDIO_SCENE_ACTIVE("MINUTE_01_SCENE")
START_AUDIO_SCENE("MINUTE_01_SCENE")
ENDIF
ADD_ENTITY_TO_AUDIO_MIX_GROUP(vehMariachiCar,"MINUTE_01_SCENE_MARIACHI_VEHICLE")
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehMariachiCar)
SET_VEHICLE_ACTIVE_DURING_PLAYBACK(vehMariachiCar, TRUE) // For B*1098655
UNPAUSE_PLAYBACK_RECORDED_VEHICLE(vehMariachiCar)
ENDIF
ENDIF
IF IS_ENTITY_ALIVE(vehPatrolVehicle)
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehPatrolVehicle)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Replaying from checkpoint so do a rolling start") ENDIF #ENDIF
bDoneRollingStart = FALSE
iRollingStartTimer = -1
UNPAUSE_PLAYBACK_RECORDED_VEHICLE(vehPatrolVehicle)
ELSE
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Not replaying from checkpoint so don't do a rolling start") ENDIF #ENDIF
bDoneRollingStart = TRUE
ENDIF
bUsePlaybackAIForMariachiCar = FALSE
bStartedOffRoadConversation = FALSE
bStartedCrashedConversation = FALSE
iGetInConversationsPlayed = 0
iStoppedConversationsPlayed = 0
bPatrolVehicleStoppedDuringChase = FALSE
iFarBehindConversationsPlayed = 0
iExitedVehicleConversationsPlayed = 0
iGetBackInVehicleConversationsPlayed = 0
iGotBackInVehicleConversationsPlayed = 0
bAllowPlayExitedVehicleConversation = FALSE
bAllowPlayGetBackInVehicleConversation = FALSE
bAllowPlayGotBackInVehicleConversation = FALSE
bPlayedFarBehindConversation = FALSE
REPLAY_RECORD_BACK_FOR_TIME(5.0, 10.0, REPLAY_IMPORTANCE_LOWEST)
SET_WANTED_LEVEL_MULTIPLIER(0.1)
WAIT(0)
MIN1_SET_PROPS_TO_USE_FULL_PHYSICS(TRUE)
iSingingDialogueTimer = GET_GAME_TIMER()
iChaseDialogueTimer = GET_GAME_TIMER()
iMariachiCarTyresBurstTimer = GET_GAME_TIMER()
iStunGunDialogueTimer = GET_GAME_TIMER()
SET_RANDOM_TRAINS(FALSE)
DELETE_ALL_TRAINS()
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_DRIVING)
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(MIN1_FAST_STOP)
BREAK
CASE MIN1_STATE_MACHINE_LOOP
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.25)
IF IS_ENTITY_ALIVE(vehMariachiCar)
MIN1_MANAGE_MARIACHI_CAR_RECORDING()
MIN1_MANAGE_ABANDONING_VEHICLE()
MIN1_MANAGE_ABANDONING_MARIACHI()
MIN1_MANAGE_PLAYING_SINGING_STREAM()
IF MIN1_SHOULD_MARIACHI_VEHICLE_STOP()
REPLAY_RECORD_BACK_FOR_TIME(5.0, 2.0, REPLAY_IMPORTANCE_LOWEST)
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED()
IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(vehMariachiCar)
STOP_PLAYBACK_RECORDED_VEHICLE(vehMariachiCar)
ENDIF
BRING_VEHICLE_TO_HALT(vehMariachiCar, 10.0, 1)
REMOVE_VEHICLE_RECORDING(500, "Min1_Van")
MIN1_STOP_ANY_CHASE_CONVERSATIONS()
missionStateMachine = MIN1_STATE_MACHINE_CLEANUP
ELSE
MIN1_MANAGE_PATROL_VEHICLE_OBJECTIVES()
MIN1_MANAGE_OUTSIDE_BAR_CONVERSATIONS()
MIN1_MANAGE_START_CHASE_CONVERSATION()
MIN1_MANAGE_SINGING_DIALOGUE()
MIN1_MANAGE_OFFROAD_CONVERSATION()
MIN1_MANAGE_STOPPED_CONVERSATIONS()
MIN1_MANAGE_FAR_BEHIND_CONVERSATIONS()
MIN1_MANAGE_LEAVE_VEHICLE_CONVERSATIONS()
MIN1_MANAGE_CHASE_CONVERSATIONS()
MIN1_MANAGE_CRASH_CONVERSATIONS()
MIN1_MANAGE_MARIACHI_ANIMS()
MIN1_MANAGE_MARIACHI_CAR_FOCUS_CAMERA()
MIN1_MANAGE_ROLLING_START()
ENDIF
ENDIF
BREAK
CASE MIN1_STATE_MACHINE_CLEANUP
MIN1_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_CHASE_MARIACHI_CAR" #ENDIF)
SAFE_REMOVE_BLIP(blipDestination)
SAFE_REMOVE_BLIP(blipPatrolVehicle)
KILL_CHASE_HINT_CAM(localChaseHintCamStruct)
MIN1_MAKE_BUDDIES_LOOK_AT_PLAYER(FALSE)
MIN1_SET_PROPS_TO_USE_FULL_PHYSICS(FALSE)
TRIGGER_MUSIC_EVENT("MM1_STOP")
STOP_STREAM() // Mariachi singing
REMOVE_ANIM_DICT("missminuteman_1ig_1")
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Main state for handling stunning the Mariachi peds.
PROC MS_STUN_MARIACHI_PEDS()
INT i
SWITCH missionStateMachine
CASE MIN1_STATE_MACHINE_SETUP
MIN1_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_STUN_MARIACHI_PEDS" #ENDIF)
IF NOT HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_STUNGUN)
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_STUNGUN, 200, TRUE)
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_STUNGUN, TRUE)
PLAY_SOUND_FRONTEND(-1, "STUN_COLLECT", "MINUTE_MAN_01_SOUNDSET")
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Gave stun gun to player") ENDIF #ENDIF
ENDIF
i = 0
REPEAT NUM_MARIACHI_PEDS i
IF IS_ENTITY_ALIVE(pedMariachi[i])
CLEAR_ENTITY_LAST_WEAPON_DAMAGE(pedMariachi[i]) // Clear this otherwise it'll fail as soon as they leave their car if the player has shot one of them during the chase
statusMariachi[i] = MARIACHI_EXITING_HIS_VEHICLE
bPlayedStunnedConversation[i] = FALSE
bPlayedSoberConversation[i] = FALSE
bCheckForTazeredAgain[i] = FALSE
bHasBeenTazeredAgain[i] = FALSE
iMariachiConversationTimer[i] = GET_GAME_TIMER()
iNumPlayedDrunkConversations[i] = 0
iNumPlayedBumpConversations[i] = 0
iNumPlayedAimConversations[i] = 0
iNumPlayedShockConversations[i] = 0
iNumPlayedWalkConversations[i] = 0
Make_Ped_Drunk_Constant(pedMariachi[i])
SET_PED_SUFFERS_CRITICAL_HITS(pedMariachi[i], TRUE) // B*1357897 Allow critical hits now he's out of the car
TASK_LOOK_AT_ENTITY(pedMariachi[i], PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV)
IF IS_PED_IN_ANY_VEHICLE(pedMariachi[i])
TASK_LEAVE_ANY_VEHICLE(pedMariachi[i], i*1500, ECF_DONT_CLOSE_DOOR|ECF_DONT_DEFAULT_WARP_IF_DOOR_BLOCKED) // Time delay so they don't get out in unison // B*1481321 Don't warp if door is blocked
ENDIF
IF NOT DOES_BLIP_EXIST(blipMariachi[i])
blipMariachi[i] = CREATE_BLIP_FOR_PED(pedMariachi[i], TRUE)
ENDIF
iMariachiExitVehicleTimer[i] = GET_GAME_TIMER()
ENDIF
ENDREPEAT
iMariachiConversationDelay[0] = 8000
iMariachiConversationDelay[1] = 10000
MIN1_RESET_HURRY_STUN_CONVERSATION_VARS()
pedBuddy[0].status = BUDDY_WAITING_TO_GET_OUT
pedBuddy[1].status = BUDDY_WAITING_TO_GET_OUT
fFailDist = 100
bStartedBringVehicleConversation = FALSE
bStartedNoJoeConversation = FALSE
bStartedGoBackForJoeConversation = FALSE
bStartedStunThemConversation = FALSE
iPlayedStunnedConversation = 0
iTimesStunnedMoreThanNecessary = 0
iCurrentTimesStunnedDialogue = 0
sTimesStunnedDialogueString[0] = "MIN1_STOP1"
sTimesStunnedDialogueString[1] = "MIN1_STOP2"
sTimesStunnedDialogueString[2] = "MIN1_STOP3"
seatMariachi[0] = VS_BACK_LEFT
seatMariachi[1] = VS_BACK_RIGHT
fSeekOffsetFromPatrolVehicle[0] = -3.0
fSeekOffsetFromPatrolVehicle[1] = 3.0
iNotStunnedDialogueTimer = GET_GAME_TIMER()
iSingingDialogueTimer = GET_GAME_TIMER()
SET_WANTED_LEVEL_MULTIPLIER(0.1)
REQUEST_VEHICLE_ASSET(modelPatrolVehicle)
REQUEST_ANIM_DICT("move_m@drunk@verydrunk") // B*1312957 - Preload drunk walk anims
MIN1_LOAD_ASSETS_FOR_MISSION_STATE(stateStunMariachiPeds)
SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE)
REPLAY_RECORD_BACK_FOR_TIME(5.0, 6.0, REPLAY_IMPORTANCE_LOWEST)
BREAK
CASE MIN1_STATE_MACHINE_LOOP
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0) // B*476749 - Limit the likelihood that ambient cars will drive through the area when everyone is out of their vehicles
IF MIN1_ARE_BOTH_MARIACHI_STUNNED()
missionStateMachine = MIN1_STATE_MACHINE_CLEANUP
ELSE
MIN1_MANAGE_ABANDONING_MARIACHI()
MIN1_MANAGE_MARIACHI_GETTING_INTO_PATROL_VEHICLE()
MIN1_MANAGE_BUDDIES_GUARDING_MARIACHI()
MIN1_MANAGE_STUN_THEM_DIALOGUE()
MIN1_MANAGE_HURRY_STUN_DIALOGUE()
MIN1_MANAGE_EXCESSIVE_STUN_DIALOGUE()
MIN1_MANAGE_SINGING_DIALOGUE()
ENDIF
BREAK
CASE MIN1_STATE_MACHINE_CLEANUP
REPLAY_RECORD_BACK_FOR_TIME(5.0, 5.0, REPLAY_IMPORTANCE_LOWEST)
MIN1_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_STUN_MARIACHI_PEDS" #ENDIF)
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Main state for handling the the Mariachi driving away at the end of the mission.
INT iTimeOutDriveAway = -1
PROC MS_LEAVE_AREA()
SWITCH missionStateMachine
CASE MIN1_STATE_MACHINE_SETUP
MIN1_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_LEAVE_AREA" #ENDIF)
MIN1_MAKE_BUDDIES_LOOK_AT_PLAYER(TRUE)
bStartedLeaveAreaConversation = FALSE
bStartedCyaConversation = FALSE
bPatrolVehicleDrivingAway = FALSE
BREAK
CASE MIN1_STATE_MACHINE_LOOP
IF MIN1_IS_PLAYER_FAR_AWAY_FROM_ENTITIES()
OR (iTimeOutDriveAway >= 0 AND GET_GAME_TIMER() >= iTimeOutDriveAway)
PRINTSTRING("timeout = ") PRINTINT(GET_GAME_TIMER() - iTimeOutDriveAway) PRINTNL()
IF IS_ENTITY_ALIVE(vehMariachiCar)
AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehMariachiCar)
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(MIN1_VEHICLE_TAKEN_AFTER_STUNS)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Achieved stat: MIN1_VEHICLE_TAKEN_AFTER_STUNS") ENDIF #ENDIF
ENDIF
missionStateMachine = MIN1_STATE_MACHINE_CLEANUP
ELIF bPatrolVehicleDrivingAway = FALSE
MIN1_MANAGE_ABANDONING_MARIACHI()
MIN1_MANAGE_LEAVE_AREA_DIALOGUE()
MIN1_MANAGE_MARIACHI_GETTING_INTO_PATROL_VEHICLE()
MIN1_MANAGE_BUDDIES_GUARDING_MARIACHI()
MIN1_MANAGE_BUDDIES_DRIVING_AWAY()
MIN1_MANAGE_EXCESSIVE_STUN_DIALOGUE()
ELSE
IF iTimeOutDriveAway < 0
iTimeOutDriveAway = GET_GAME_TIMER() + 30000
ENDIF
MIN1_MANAGE_CYA_DIALOGUE()
MIN1_HANDLE_PLAYER_STUNNING_PEDS_WHEN_DRIVING_AWAY()
ENDIF
BREAK
CASE MIN1_STATE_MACHINE_CLEANUP
MIN1_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_LEAVE_AREA" #ENDIF)
SAFE_REMOVE_BLIP(blipJoe)
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Starts the mission failed sequence.
PROC MS_FAILED()
SWITCH missionStateMachine
CASE MIN1_STATE_MACHINE_SETUP
MIN1_STATE_SETUP(#IF IS_DEBUG_BUILD "MS_FAILED" #ENDIF)
CLEAR_PRINTS()
CLEAR_HELP()
MIN1_REMOVE_ALL_BLIPS()
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
TRIGGER_MUSIC_EVENT("MM1_FAIL")
bStartedFleeConversation = FALSE
MIN1_MAKE_BUDDIES_AND_MARIACHI_FLEE()
IF IS_ENTITY_ALIVE(vehPatrolVehicle)
AND IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehPatrolVehicle)
BRING_VEHICLE_TO_HALT(vehPatrolVehicle, 10, 1)
ENDIF
SWITCH failReason
CASE FAILED_DEFAULT
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: MISSION_FAILED reason=FAILED_DEFAULT") ENDIF #ENDIF
BREAK
CASE FAILED_JOE_DIED
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: MISSION_FAILED reason=FAILED_JOE_DIED") ENDIF #ENDIF
failString = "MIN1_F1" // ~s~Joe died.
BREAK
CASE FAILED_JOSEF_DIED
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: MISSION_FAILED reason=FAILED_JOSEF_DIED") ENDIF #ENDIF
failString = "MIN1_F2" // ~s~Josef died.
BREAK
CASE FAILED_THREW_EXPLOSIVES
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: MISSION_FAILED reason=FAILED_THREW_EXPLOSIVES") ENDIF #ENDIF
failString = "MIN1_F3" // ~s~Trevor threw explosives at the patrol vehicle.
BREAK
CASE FAILED_PATROL_VEHICLE_WRECKED
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: MISSION_FAILED reason=FAILED_PATROL_VEHICLE_WRECKED") ENDIF #ENDIF
failString = "MIN1_F4" // ~s~The patrol vehicle was destroyed.
BREAK
CASE FAILED_MARIACHI_DIED
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: MISSION_FAILED reason=FAILED_MARIACHI_DIED") ENDIF #ENDIF
failString = "MIN1_F5" // ~s~A mariachi died.
BREAK
CASE FAILED_MARIACHI_INJURED
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: MISSION_FAILED reason=FAILED_MARIACHI_INJURED") ENDIF #ENDIF
failString = "MIN1_F6" // ~s~A mariachi was injured.
BREAK
CASE FAILED_ABANDONED_BUDDIES
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: MISSION_FAILED reason=FAILED_ABANDONED_BUDDIES") ENDIF #ENDIF
failString = "MIN1_F7" // ~s~Trevor abandoned Joe and Josef.
BREAK
CASE FAILED_MARIACHI_ESCAPED
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: MISSION_FAILED reason=FAILED_MARIACHI_ESCAPED") ENDIF #ENDIF
failString = "MIN1_F8" // ~s~The mariachi escaped.
BREAK
CASE FAILED_JOE_INJURED
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: MISSION_FAILED reason=FAILED_JOE_INJURED") ENDIF #ENDIF
failString = "MIN1_F9" // ~s~Joe was injured.
BREAK
CASE FAILED_JOSEF_INJURED
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: MISSION_FAILED reason=FAILED_JOSEF_INJURED") ENDIF #ENDIF
failString = "MIN1_F10" // ~s~Josef was injured.
BREAK
CASE FAILED_ALERTED_COPS
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: MISSION_FAILED reason=FAILED_ALERTED_COPS") ENDIF #ENDIF
failString = "MIN1_F12" // ~s~Trevor alerted the cops.
BREAK
CASE FAILED_PATROL_VEHICLE_ATTACKED
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: MISSION_FAILED reason=FAILED_PATROL_VEHICLE_ATTACKED") ENDIF #ENDIF
failString = "MIN1_F11" // ~s~The patrol vehicle was damaged.
BREAK
CASE FAILED_ABANDONED_JOE
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: MISSION_FAILED reason=FAILED_ABANDONED_JOE") ENDIF #ENDIF
failString = "MIN1_F15" // ~s~Trevor abandoned Joe.
BREAK
ENDSWITCH
IF failReason = FAILED_DEFAULT
Random_Character_Failed() // no fail reason
ELSE
Random_Character_Failed_With_Reason(failString)
ENDIF
BREAK
CASE MIN1_STATE_MACHINE_LOOP
IF GET_MISSION_FLOW_SAFE_TO_CLEANUP()
MIN1_STATE_CLEANUP(#IF IS_DEBUG_BUILD "MS_FAILED" #ENDIF)
MIN1_REMOVE_ALL_PEDS(TRUE, TRUE)
SAFE_DELETE_VEHICLE(vehMariachiCar)
SAFE_DELETE_VEHICLE(vehCamperVan)
SAFE_DELETE_VEHICLE(vehPatrolVehicle)
Script_Cleanup()
ELSE
// not finished fading out: handle dialogue etc here
MIN1_MANAGE_JOE_JOSEF_FLEE_DIALOGUE()
ENDIF
BREAK
ENDSWITCH
ENDPROC
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// Checks for debug keys being pressed.
PROC DEBUG_Check_Debug_Keys()
IF bZSkipping = FALSE
AND (GET_GAME_TIMER() - iDebugSkipTime) > 1000
AND ENUM_TO_INT(missionState) < (ENUM_TO_INT(NUM_MISSION_STATES)-1) // Don't check during stateFailed
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S))
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: S key pressed so passing mission") ENDIF #ENDIF
IF missionState = stateIntro
WAIT_FOR_CUTSCENE_TO_STOP()
ENDIF
MIN1_MAKE_BUDDIES_AND_MARIACHI_FLEE()
Script_Passed()
ENDIF
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: F key pressed so failing mission") ENDIF #ENDIF
IF missionState = stateIntro
WAIT_FOR_CUTSCENE_TO_STOP()
ENDIF
MIN1_MAKE_BUDDIES_AND_MARIACHI_FLEE()
MIN1_MISSION_FAILED(FAILED_DEFAULT)
ENDIF
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J))
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: J key pressed so doing z skip forwards") ENDIF #ENDIF
SWITCH missionState
CASE stateIntro
IF IS_CUTSCENE_ACTIVE()
STOP_CUTSCENE()
ENDIF
BREAK
CASE stateGoToBar
MIN1_DEBUG_SKIP_STATE(Z_SKIP_GO_INSIDE_BAR)
BREAK
CASE stateGoInsideBar
CASE stateGoOutsideBar
MIN1_DEBUG_SKIP_STATE(Z_SKIP_CHASE_CAR)
BREAK
CASE stateChaseMariachiCar
MIN1_DEBUG_SKIP_STATE(Z_SKIP_STUN_MARIACHI)
BREAK
CASE stateStunMariachiPeds
CASE stateLeaveArea
MIN1_DEBUG_SKIP_STATE(Z_SKIP_MISSION_PASSED)
BREAK
ENDSWITCH
ENDIF
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P))
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: P key pressed so doing z skip backwards") ENDIF #ENDIF
SWITCH missionState
CASE stateGoToBar
CASE stateGoInsideBar
MIN1_DEBUG_SKIP_STATE(Z_SKIP_INTRO)
BREAK
CASE stateGoOutsideBar
CASE stateChaseMariachiCar
MIN1_DEBUG_SKIP_STATE(Z_SKIP_GO_INSIDE_BAR)
BREAK
CASE stateStunMariachiPeds
MIN1_DEBUG_SKIP_STATE(Z_SKIP_CHASE_CAR)
BREAK
CASE stateLeaveArea
MIN1_DEBUG_SKIP_STATE(Z_SKIP_STUN_MARIACHI)
BREAK
ENDSWITCH
ENDIF
INT i_new_state
IF LAUNCH_MISSION_STAGE_MENU(mSkipMenu, i_new_state)
#IF IS_DEBUG_BUILD IF bDebug_PrintToTTY CPRINTLN(DEBUG_MISSION, "MINUTE1: Z skip menu used so doing z skip") ENDIF #ENDIF
MIN1_DEBUG_SKIP_STATE(i_new_state)
ENDIF
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()
ENDIF
MIN1_MISSION_SETUP()
IF IS_REPLAY_IN_PROGRESS()
RC_CleanupSceneEntities(sRCLauncherDataLocal, TRUE, TRUE)
INT istage = GET_REPLAY_MID_MISSION_STAGE()
IF g_bShitskipAccepted = TRUE
istage++
ENDIF
SWITCH istage
CASE CP_GO_TO_BAR
START_REPLAY_SETUP(<<321.9098, 3410.6528, 35.7119>>, 243.0269)
MIN1_DEBUG_SKIP_STATE(Z_SKIP_GO_TO_BAR)
BREAK
CASE CP_GO_IN_BAR
START_REPLAY_SETUP(<<1982.9250, 3078.1924, 45.9798>>, 216.8597)
MIN1_DEBUG_SKIP_STATE(Z_SKIP_GO_INSIDE_BAR)
BREAK
CASE CP_CAR_CHASE
START_REPLAY_SETUP(<<1993.5508, 3058.1018, 46.0548>>, 40.7551)
MIN1_DEBUG_SKIP_STATE(Z_SKIP_CHASE_CAR)
BREAK
CASE CP_MISSION_PASSED
START_REPLAY_SETUP(<<2698.2053, 4135.9048, 42.8234>>, 323.4031)
MIN1_DEBUG_SKIP_STATE(Z_SKIP_MISSION_PASSED)
BREAK
ENDSWITCH
ENDIF
WHILE(TRUE)
WAIT(0)
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("SF_TCBP")
IF iDisableReplayCameraTimer > GET_GAME_TIMER()
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() //Fix for bug 2258455
ENDIF
UPDATE_MISSION_NAME_DISPLAYING(sRCLauncherDataLocal.sIntroCutscene)
MIN1_DEATH_CHECKS()
SWITCH missionState
CASE stateIntro
MS_INTRO()
BREAK
CASE stateGoToBar
MS_GO_TO_BAR()
BREAK
CASE stateGoInsideBar
MS_GO_INSIDE_BAR()
BREAK
CASE stateGoOutsideBar
MS_GO_OUTSIDE_BAR()
BREAK
CASE stateChaseMariachiCar
MS_CHASE_MARIACHI_CAR()
BREAK
CASE stateStunMariachiPeds
MS_STUN_MARIACHI_PEDS()
BREAK
CASE stateLeaveArea
MS_LEAVE_AREA()
BREAK
CASE stateMissionPassed
Script_Passed()
BREAK
CASE stateFailed
MS_FAILED()
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
DEBUG_Check_Debug_Keys()
#ENDIF
ENDWHILE
ENDSCRIPT