16973 lines
628 KiB
Python
Executable File
16973 lines
628 KiB
Python
Executable File
//╔═════════════════════════════════════════════════════════════════════════════╗
|
|
//║ ║
|
|
//║ Author: Michael Wadelin Date: ║
|
|
//║ ║
|
|
//║ Prev: David Gentles ║
|
|
//║ ║
|
|
//╠═════════════════════════════════════════════════════════════════════════════╣
|
|
//║ ║
|
|
//║ FBI3 - By the Book ║
|
|
//║ ║
|
|
//║ Trevor tortures Mr. K for information ║
|
|
//║ ║
|
|
//║ * Trevor or Michael drives to the warehouse ║
|
|
//║ * Michael drives to fake location ║
|
|
//║ * Trevor tortures for real location ║
|
|
//║ * Michael drives to real location ║
|
|
//║ * Trevor tortures to find out he's Azerbaijani ║
|
|
//║ * Michael searches, not enough, asks for more ║
|
|
//║ * Trevor tortures to find out he has a beard ║
|
|
//║ * Michael searches, not enough, asks for more ║
|
|
//║ * Trevor tortures to find out he smokes Redwood cigarettes ║
|
|
//║ * Michael shoots the target ║
|
|
//║ * Trevor drives the torture victim to the airport ║
|
|
//║ ║
|
|
//║ Gameplay elements introduced: Torture ║
|
|
//║ Vehicle Introduced: ║
|
|
//║ Location: Torture warehouse, Chumash ║
|
|
//║ Notes: ║
|
|
//║ ║
|
|
//╚═════════════════════════════════════════════════════════════════════════════╝
|
|
|
|
//Compile out Title Update changes to header functions.
|
|
//Must be before includes.
|
|
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
|
|
|
|
//═════════════════════════════════╡ COMMAND HEADERS ╞═══════════════════════════════════
|
|
|
|
using "rage_builtins.sch"
|
|
using "globals.sch"
|
|
|
|
using "commands_misc.sch"
|
|
using "commands_pad.sch"
|
|
using "commands_script.sch"
|
|
|
|
using "commands_graphics.sch"
|
|
using "commands_object.sch"
|
|
using "script_player.sch"
|
|
using "script_debug.sch"
|
|
using "streamed_scripts.sch"
|
|
using "selector_public.sch"
|
|
using "model_enums.sch"
|
|
using "dialogue_public.sch"
|
|
using "player_ped_public.sch"
|
|
USING "flow_public_core_override.sch"
|
|
USING "commands_entity.sch"
|
|
using "script_blips.sch"
|
|
USING "select_mission_stage.sch"
|
|
USING "locates_public.sch"
|
|
USING "replay_public.sch"
|
|
USING "commands_cutscene.sch"
|
|
USING "cutscene_public.sch"
|
|
USING "script_ped.sch"
|
|
USING "mission_stat_public.sch"
|
|
USING "CompletionPercentage_public.sch"
|
|
USING "taxi_functions.sch"
|
|
USING "flow_public_GAME.sch"
|
|
USING "building_control_public.sch"
|
|
USING "asset_management_public.sch"
|
|
USING "player_scene_private.sch"
|
|
USING "flow_mission_trigger_public.sch"
|
|
USING "clearmissionarea.sch"
|
|
USING "cheat_controller_public.sch"
|
|
USING "commands_recording.sch"
|
|
|
|
//═════════════════════════════════╡ SOUND ╞═══════════════════════════════════
|
|
ENUM SOUND_LIST
|
|
SND_HEART_FLATLINE_LOOP = 0,
|
|
SND_HEART_BEEP_LOOP,
|
|
SND_HEART_BEEP,
|
|
SND_ELEC_HUM_LOOP,
|
|
SND_ELEC_ZAP_LOOP,
|
|
SND_ELEC_ATTACH_CLIP_LEFT,
|
|
SND_ELEC_ATTACH_CLIP_RIGHT,
|
|
SND_ELEC_DETACH_CLIP_LEFT,
|
|
SND_ELEC_DETACH_CLIP_RIGHT,
|
|
SND_ELEC_SPARK,
|
|
SND_TOOTH_PULL_LOOP,
|
|
SND_TOOTH_PULL_OUT,
|
|
SND_WATER_POUR_LOOP,
|
|
SND_WATER_PICK_UP,
|
|
SND_WRENCH_HIT,
|
|
SND_MENU_HIGHLIGHT_ELEC,
|
|
SND_MENU_HIGHLIGHT_PLIERS,
|
|
SND_MENU_HIGHLIGHT_WATER,
|
|
SND_MENU_HIGHLIGHT_WRENCH,
|
|
|
|
SND_LIST_SIZE
|
|
ENDENUM
|
|
|
|
//═════════════════════════════════╡ ENUMS ╞═══════════════════════════════════
|
|
|
|
ENUM MISSION_PED_FLAGS
|
|
mpf_party_coke_m_1,
|
|
mpf_party_coke_m_3,
|
|
mpf_party_coke_m_5,
|
|
mpf_party_coke_f_1,
|
|
|
|
mpf_party_b_m_1,
|
|
mpf_party_b_m_2,
|
|
mpf_party_b_f_1,
|
|
|
|
mpf_party_c_m_1,
|
|
mpf_party_c_m_2,
|
|
|
|
mpf_party_d_m_1,
|
|
mpf_party_d_m_2,
|
|
mpf_party_d_m_3,
|
|
mpf_party_d_f_1,
|
|
|
|
mpf_decoy_f,
|
|
mpf_decoy_m,
|
|
mpf_target,
|
|
|
|
mpf_num_peds
|
|
ENDENUM
|
|
|
|
ENUM MISSION_OBJECT_FLAGS
|
|
mof_target_ciggy,
|
|
mof_target_packet,
|
|
mof_decoy_f_ciggy,
|
|
mof_decoy_m_ciggy,
|
|
mof_coffee_table,
|
|
mof_coffee_mike,
|
|
mof_coffee_dave,
|
|
mof_coffee_chair,
|
|
mof_binoculars,
|
|
mof_mike_ciggy,
|
|
mof_turd,
|
|
mof_UV_face_object,
|
|
mof_num_objects
|
|
ENDENUM
|
|
|
|
ENUM SYNC_SCENES
|
|
SCENE_WEAPON_SELECT_IDLE = 0,
|
|
SCENE_WEAPON_SELECT_PICKUP_WRENCH,
|
|
SCENE_WEAPON_SELECT_PICKUP_PLIERS,
|
|
SCENE_WEAPON_SELECT_PICKUP_CLIP0,
|
|
SCENE_WEAPON_SELECT_PICKUP_WATER,
|
|
SCENE_WEAPON_SELECT_PICKUP_SYRINGE,
|
|
|
|
SCENE_WRENCH_LEFT,
|
|
SCENE_WRENCH_MID,
|
|
SCENE_WRENCH_RIGHT,
|
|
SCENE_WRENCH_IDLE,
|
|
|
|
SCENE_PLIERS_PULL_HARD,
|
|
SCENE_PLIERS_PULL_WEAK,
|
|
SCENE_PLIERS_ATTACH,
|
|
SCENE_PLIERS_PULL_OUT,
|
|
SCENE_PLIERS_PULL_OUT2,
|
|
SCENE_PLIERS_IDLE,
|
|
SCENE_PLIERS_READY_IN,
|
|
SCENE_PLIERS_READY_LOOP,
|
|
SCENE_PLIERS_READY_OUT,
|
|
|
|
SCENE_ELEC_IDLE,
|
|
SCENE_ELEC_SHOCK,
|
|
SCENE_ELEC_SPARK,
|
|
SCENE_ELEC_OUTRO,
|
|
SCENE_ELEC_LEFT_GRIP,
|
|
SCENE_ELEC_RIGHT_GRIP,
|
|
SCENE_ELEC_BOTH_GRIP,
|
|
|
|
SCENE_WATER_FLIP,
|
|
SCENE_WATER_IDLE,
|
|
SCENE_WATER_READY_TO_POUR,
|
|
SCENE_WATER_POUR,
|
|
SCENE_WATER_POUR_TO_READY,
|
|
SCENE_WATER_PRE_OUTRO,
|
|
SCENE_WATER_OUTRO,
|
|
SCENE_WATER_READY,
|
|
|
|
SCENE_SYRINGE_USE,
|
|
SCENE_SYRINGE_IDLE,
|
|
|
|
SCENE_RAG_IDLE,
|
|
|
|
SCENE_EXTRA_MR_K_FIDGET,
|
|
|
|
SCENE_COFFEE,
|
|
|
|
SCENE_SNIPE_PRONE,
|
|
SCENE_PARTY_A,
|
|
SCENE_PARTY_B,
|
|
SCENE_PARTY_C,
|
|
SCENE_PARTY_D,
|
|
|
|
SCENE_CUNTS,
|
|
|
|
NUMBER_OF_SCENES
|
|
ENDENUM
|
|
|
|
ENUM MISSION_FAIL
|
|
FAIL_INVALID = -1,
|
|
FAIL_FORCE_CLEANUP,
|
|
FAIL_GENERIC,
|
|
FAIL_MICHAEL_DEAD,
|
|
FAIL_TREVOR_DEAD,
|
|
FAIL_VICTIM_DEAD,
|
|
FAIL_DAVE_DEAD,
|
|
FAIL_STEVE_DEAD,
|
|
|
|
FAIL_CUNTS_SPOOKED,
|
|
FAIL_CUNTS_INNOCENT_DEAD,
|
|
|
|
FAIL_PARTY_SEEN_AT_PARTY,
|
|
FAIL_PARTY_SPOOKED,
|
|
FAIL_PARTY_PED_DEAD_INNOCENT,
|
|
FAIL_PARTY_PED_DEAD_INNOCENT_NO_ID,
|
|
|
|
FAIL_VEHICLE_DEAD_TREVOR, // trevors truck is mission critical for taking Mr K to the airport
|
|
FAIL_VEHICLE_STUCK_TREVOR,
|
|
|
|
FAIL_ABANDONED_DAVE,
|
|
FAIL_ABANDONED_MRK,
|
|
|
|
FAIL_COPS_WAREHOUSE
|
|
ENDENUM
|
|
MISSION_FAIL eMissionFail
|
|
|
|
ENUM MISSION_STAGE
|
|
ST_INIT = -1,
|
|
ST_0_DRIVE_TO_START,
|
|
ST_1_INTRO_CUT,
|
|
ST_2_DRIVE_TO_COORD_FIRST,
|
|
ST_3_TORTURE_FOR_FIRST,
|
|
ST_4_DRIVE_TO_COORD_SECOND,
|
|
ST_5_TORTURE_FOR_SECOND,
|
|
ST_6_REACT_TO_SECOND,
|
|
ST_7_TORTURE_FOR_THIRD,
|
|
ST_8_REACT_TO_THIRD,
|
|
ST_9_TORTURE_FINAL,
|
|
ST_10_REACT_FINAL,
|
|
ST_11_DRIVE_TO_AIRPORT,
|
|
ST_12_EXIT_CUT,
|
|
ST_13_PASSED_MISSION,
|
|
NUM_OF_STAGES
|
|
ENDENUM
|
|
|
|
ENUM TORTURE_WEAPONS
|
|
TOR_WATER,
|
|
TOR_RAG,
|
|
TOR_PLIERS,
|
|
TOR_CLIP0,
|
|
TOR_CLIP1,
|
|
TOR_WRENCH,
|
|
TOR_SYRINGE,
|
|
|
|
NO_OF_TORTURE_WEAPONS
|
|
ENDENUM
|
|
|
|
ENUM TORTURE_CAMERA
|
|
TC_RESET = 0,
|
|
TC_DONTUSE,
|
|
TC_HOTSWAP0, TC_HOTSWAP1,
|
|
TC_CIRCLE0, TC_CIRCLE1, TC_CIRCLE2, TC_CIRCLE3,
|
|
TC_WRENCH0, TC_WRENCH1, TC_WRENCH2, TC_WRENCH3, TC_WRENCH4, TC_WRENCH5, TC_WRENCH6, TC_WRENCH7, TC_WRENCH8, TC_WRENCH9,
|
|
TC_WPNSEL0, TC_WPNSEL1, TC_WPNSEL2,
|
|
TC_PLIERS0, TC_PLIERS1, TC_PLIERS2, TC_PLIERS3, TC_PLIERS4, TC_PLIERS5, TC_PLIERS6,
|
|
TC_BATTERY0, TC_BATTERY1,
|
|
TC_WATER0, TC_WATER1, TC_WATER2, TC_WATER3, TC_WATER4, TC_WATER5, TC_WATER6,
|
|
TC_SYRINGE0, TC_SYRINGE1,
|
|
TC_ELEC0, TC_ELEC1, TC_ELEC2
|
|
ENDENUM
|
|
|
|
ENUM SCOPE_STATE
|
|
SCOPESTATE_ENTERING_AIM,
|
|
SCOPESTATE_AIMING,
|
|
SCOPESTATE_NOT_AIMING
|
|
ENDENUM
|
|
|
|
ENUM HOUSE_SECTIONS
|
|
HS_HIGH_LEFT = 0,
|
|
HS_HIGH_RIGHT,
|
|
HS_LOW_LEFT,
|
|
HS_LOW_RIGHT,
|
|
HS_CENTRE,
|
|
HS_NUM_OF_HOUSE_SECTIONS
|
|
ENDENUM
|
|
VECTOR vHouseSectionCentre[HS_NUM_OF_HOUSE_SECTIONS]
|
|
|
|
ENUM MR_K_VARIATIONS
|
|
MR_K_FACE_BLOODY,
|
|
MR_K_NIPPLES_BURNED,
|
|
MR_K_LEG_BLOODY,
|
|
MR_K_CROTCH_BLOODY,
|
|
MR_K_TORSO_BLOODY,
|
|
MR_K_WET,
|
|
MR_K_RAG_FACE,
|
|
MR_K_CABLES,
|
|
MR_K_NUM_OF_VARIATIONS
|
|
ENDENUM
|
|
|
|
BOOL bMrKVariations[MR_K_NUM_OF_VARIATIONS]
|
|
|
|
ENUM CLEANUP_TYPE_FLAG
|
|
CTF_RESET,
|
|
CTF_INSTANT,
|
|
CTF_DEATH_ARREST_DELAYED,
|
|
CTF_MISSION_PASSED
|
|
ENDENUM
|
|
|
|
ENUM TARGET_PED_SLOT
|
|
PEDSLOT_NOT_ASSIGNED = -1,
|
|
PEDSLOT_UPPER_LEFT,
|
|
PEDSLOT_UPPER_CENTER,
|
|
PEDSLOT_UPPER_RIGHT,
|
|
PEDSLOT_LOWER_LEFT,
|
|
PEDSLOT_LOWER_CENTER,
|
|
PEDSLOT_LOWER_RIGHT,
|
|
PEDSLOT_NUM_OF_SLOTS
|
|
ENDENUM
|
|
|
|
ENUM CUTSCENE_SWITCH_ENUM
|
|
CUTSWITCH_FIRST,
|
|
CUTSWITCH_NORMAL,
|
|
CUTSWITCH_FINAL
|
|
ENDENUM
|
|
|
|
ENUM PARTY_CRASHED_STATE
|
|
PCS_NOT_CRASHED,
|
|
PCS_MISSED_SHOT,
|
|
PCS_KILLED_INNOCENT_MALE,
|
|
PCS_KILLED_INNOCENT_FEMALE,
|
|
PCS_TARGET_DOWN
|
|
ENDENUM
|
|
|
|
ENUM EKG_CAM_STATE
|
|
EKGCAM_TORTURE,
|
|
EKGCAM_INTERP_IN,
|
|
EKGCAM_LOOKING_AT,
|
|
EKGCAM_INTERP_OUT
|
|
ENDENUM
|
|
|
|
ENUM LIST_CUNT_PEDS
|
|
CUNTPED_ACTOR_M,
|
|
CUNTPED_ACTOR_F,
|
|
CUNTPED_CREW_CAM_GUY,
|
|
CUNTPED_CREW_SOUND_GUY,
|
|
CUNTPED_CREW_PRODUCER
|
|
ENDENUM
|
|
|
|
ENUM LIST_CUNT_PROPS
|
|
CUNTPROP_CAM,
|
|
CUNTPROP_BOOM,
|
|
CUNTPROP_CLIPBOARD
|
|
ENDENUM
|
|
|
|
|
|
|
|
//═════════════════════════════════╡ CONSTANTS ╞═══════════════════════════════════
|
|
|
|
CUTSCENE_SECTION cutSections_Mike = CS_SECTION_4 | CS_SECTION_5 | CS_SECTION_6 | CS_SECTION_7
|
|
CUTSCENE_SECTION cutSections_TrevLeadIn = CS_SECTION_1 | CS_SECTION_3 | CS_SECTION_5 | CS_SECTION_6 | CS_SECTION_7
|
|
CUTSCENE_SECTION cutSections_TrevFull = CS_SECTION_2 | CS_SECTION_3 | CS_SECTION_5 | CS_SECTION_6 | CS_SECTION_7
|
|
|
|
// Bit masks & shifters for storing replay info
|
|
CONST_INT BITMASK_TARGET_SLOT_0 (BIT0|BIT1|BIT2|BIT3|BIT4)
|
|
CONST_INT BITMASK_TARGET_SLOT_1 (BIT5|BIT6|BIT7|BIT8|BIT9)
|
|
CONST_INT BITMASK_TARGET_SLOT_2 (BIT10|BIT11|BIT12|BIT13|BIT14)
|
|
CONST_INT BITSHIFTER_TARGET_SLOT 5
|
|
|
|
CONST_INT BITMASK_VICTIMHEALTH (BIT0|BIT1|BIT2|BIT3|BIT4|BIT5|BIT6)
|
|
CONST_INT BITSHIFTER_VICTIMHEALTH 7
|
|
|
|
CONST_INT BITMASK_VICTIMVARS (BIT7|BIT8|BIT9|BIT10|BIT11|BIT12|BIT13|BIT14)
|
|
CONST_INT BITSHIFTER_VICTIMVARS 8
|
|
|
|
CONST_INT BITMASK_VICTIMTEETH (BIT15|BIT16|BIT17|BIT18)
|
|
CONST_INT BITSHIFTER_VICTIMTEETH 4
|
|
|
|
CONST_INT BITMASK_SYRINGES (BIT19|BIT20|BIT21|BIT22)
|
|
CONST_INT BITSHIFTER_SYRINGES 4
|
|
|
|
//═════════╡ VALUES ╞═════════
|
|
CONST_INT I_MAX_SYRINGE_USES 3
|
|
|
|
CONST_FLOAT F_ELECTRO_TIME 6.5 // how long to electrocute the victim for
|
|
CONST_FLOAT F_ELECTRO_DAMAGE 35.0 // overall damage received from the timed electrocution (for fun will be more)
|
|
CONST_FLOAT F_ELECTRO_DAMAGE_EXTRA 40.0 // overall damage received from the timed electrocution (for fun will be more)
|
|
|
|
CONST_INT I_TOOTH_PULL_ROT_SPEED 360 // degrees per second
|
|
CONST_FLOAT F_TOOTH_PULL_FORCE_LIMIT 5.0 // 5 seconds
|
|
CONST_FLOAT F_TOOTH_PULL_MIN_DURATION 0.1 // 0.2 seconds after starting to rotate the stick does the tooth begin to pull
|
|
CONST_FLOAT F_TOOTH_PULL_DAMAGE_OVERALL 25.0 // overall daamage received from having tooth pulled
|
|
CONST_FLOAT F_TOOTH_PULL_DAMAGE_FINAL 5.0 // final pull damage
|
|
CONST_INT I_TOOTH_STUBBORNNESS 3
|
|
CONST_FLOAT F_PERCENT_TOOTH_HEIGHT 0.6
|
|
|
|
CONST_FLOAT F_WRENCH_DAMAGE 25.0
|
|
|
|
CONST_FLOAT F_WATERBOARD_TIME 6.5
|
|
CONST_FLOAT F_WATERBOARD_DAMAGE 10.0
|
|
CONST_FLOAT F_WATERBOARD_DAMAGE_EXTRA 40.0
|
|
|
|
CONST_FLOAT fVictimMaxHealth 100.0
|
|
|
|
CONST_FLOAT fMaxBPM 200.0
|
|
CONST_FLOAT fMinBPM 80.0
|
|
|
|
CONST_FLOAT fSmokeChange 0.02
|
|
|
|
CONST_FLOAT F_ZOOM_SCOPE_CHECK 3.65
|
|
|
|
VECTOR TORTURE_LOAD_SCENE_COORD = <<141.946091,-2201.899658,3.686588>>
|
|
CONST_FLOAT TORTURE_LOAD_SCENE_RADIUS 10.0
|
|
|
|
CONST_INT I_TIME_BETWEEN_PLEES 2000
|
|
|
|
CONST_FLOAT F_SNIPE_CAM_ZOOM_DEFAULT 2.060
|
|
CONST_FLOAT F_SNIPE_CAM_ZOOM_MIN 1.464
|
|
|
|
//═════════╡ COORDINATES AND HEADINGS ╞═════════
|
|
|
|
VECTOR vTrevTurd = << 129.34, -2203.33, 5.03 >>
|
|
|
|
VECTOR vMichaelSpawnCoords = <<133.7404, -2196.8147, 6.1353>>
|
|
CONST_FLOAT fMichaelSpawnHeading 53.750
|
|
|
|
VECTOR vTrevorTortureCoords = << 142.8228, -2202.2410, 3.6867 >>
|
|
CONST_FLOAT fTrevorTortureHeading 211.8283
|
|
|
|
VECTOR vMichaelSnipeCoords = << -2956.2791, 314.3996, 29.6051 >>
|
|
CONST_FLOAT fMichaelSnipeHeading 76.1479
|
|
|
|
VECTOR vDaveSnipeCoords = << -2954.5432, 310.1234, 29.1099 >>
|
|
CONST_FLOAT fDaveSnipeHeading 75.1103
|
|
|
|
VECTOR vChairCoords = <<142.99, -2201.98, 4.07>>
|
|
VECTOR vChairRot = <<-0.45, 0.0, 96.61>>
|
|
|
|
VECTOR vTortureScene = vChairCoords
|
|
VECTOR vTortureRot = vChairRot + <<0,0,180>>
|
|
|
|
VECTOR vTableCoords = <<0,0,0>>
|
|
VECTOR vTableRot = <<0,0,0>>
|
|
|
|
VECTOR vBatteryCoords = <<0,0,0>>
|
|
VECTOR vBatteryRot = <<0,0,0>>
|
|
|
|
VECTOR vSmallTableCoords = <<143.1199, -2201.3455, 4.350>>
|
|
VECTOR vSmallTableRot = << 0, 0, 0 >>
|
|
|
|
VECTOR vMonitorCoords = <<143.1000, -2201.3455, 4.5020>>
|
|
VECTOR vMonitorRot = <<0.000, 0.0, 173.1000>>
|
|
|
|
// Warehouse vehicle coords
|
|
VECTOR vTrevorCarOutsideTortureCoord = << 120.0400, -2195.4614, 5.0328 >>
|
|
CONST_FLOAT fTrevorCarOutsideTortureHeading 309.4985
|
|
|
|
VECTOR vDaveCarOutsideTortureCoords = <<128.3181, -2195.5840, 5.0324>>
|
|
CONST_FLOAT fDaveCarOutsideTortureHeading 292.8319
|
|
|
|
VECTOR vOtherVehicleOutsideWarehouse = <<111.0266, -2189.0339, 4.9691>> //<<126.1588, -2187.4060, 4.9524>>
|
|
CONST_FLOAT fOtherVehicleOutsideWarehouse 268.2706 //270.3849
|
|
|
|
VECTOR vTaxiToStartCoords = << 169.2886, -2194.2666, 5.0330 >>
|
|
CONST_FLOAT fTaxiToStartHeading 90.0
|
|
|
|
VECTOR v_BlipRockfordHillsHouse = <<-876.0392, -13.2516, 41.5182>> //<< -876.2056, -13.9527, 41.4756 >>
|
|
|
|
|
|
// Drive to chumash
|
|
VECTOR vDriveTo2Coords = <<-2965.7070, 359.8771, 13.7698>> //<< -2980.6990, 372.7359, 13.7840 >>
|
|
|
|
VECTOR vCoffeeShopCarCoord = << -1263.8647, -892.5212, 10.4036 >>
|
|
CONST_FLOAT fCoffeeShopCarHeading 123.590
|
|
|
|
VECTOR vCoffeeShopMikeCoord = << -1268.4265, -888.1281, 10.4502 >>
|
|
CONST_FLOAT fCoffeeShopMikeHeading 208.924
|
|
|
|
VECTOR vCoffeeShopDaveCoord = << -1268.1293, -886.0143, 10.5154 >>
|
|
CONST_FLOAT fCoffeeShopDaveHeading 213.1984
|
|
|
|
|
|
// Drive to Airport
|
|
VECTOR vDriveToAirport = << -1033.5138, -2729.6450, 20.1064 >>
|
|
CONST_FLOAT fDriveToAirport 235.4340
|
|
|
|
VECTOR vTrevorCarDriveToAirportCoord = << 126.8514, -2198.8608, 6.1049 >> //5.0330 >>
|
|
CONST_FLOAT fTrevorCarSpawnHeading 311.4299
|
|
|
|
VECTOR vSteveCoords = << 141.6254, -2198.8315, 4.6875 >> //3.688 >>
|
|
CONST_FLOAT fSteveHeading 190.2745
|
|
//VECTOR vDaveCoords = << 148.5836, -2203.9780, 3.6016 >>
|
|
CONST_FLOAT fDaveHeading 45.5475
|
|
|
|
VECTOR vProneCoords = << -2956.042, 315.845, 29.638 >>
|
|
VECTOR vProneRotation = << 3.500, -0.000, 76.000 >>
|
|
VECTOR vProneCamStartCoord = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(<<-2955.5596, 316.1508, 30.1988>>, 77.1451, <<-0.075,0.25,0>>)
|
|
VECTOR vProneCamStartRot = <<-6.3088, 0.0000, 91.1270>>
|
|
FLOAT fProneCamStartFOV = 43.0
|
|
VECTOR vProneCamEndCoord = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(<<-2955.5596, 316.1508, 30.1988>>, 77.1451, <<0.075,0.25,0>>)
|
|
VECTOR vProneCamEndRot = <<-6.3088, 0.0000, 91.1270>>
|
|
FLOAT fProneCamEndFOV = 43.0
|
|
|
|
VECTOR vPartySyncCoord = <<-3095.699, 344.770, 13.460>>
|
|
VECTOR vPartySyncRot = <<0,0,75.0>>
|
|
|
|
VECTOR vCoffeeIGCoord = << -1267.915, -881.060, 11.727 >>
|
|
VECTOR vCoffeeIGRot = << -0.000, 0.000, -58.200 >>
|
|
|
|
VECTOR v_CuntsSceneCoord = <<-886.168, -12.005, 42.165>>
|
|
VECTOR v_CuntsSceneHeading = <<0,0,85.0>>
|
|
|
|
VECTOR vNewLoadSceneSnipeCoord = << -2955.3462, 316.2738, 30.2934 >>
|
|
VECTOR vNewLoadSceneSnipeDir = <<-3173.5278, 285.2572, 11.0148>> - vNewLoadSceneSnipeCoord
|
|
FLOAT fNewLoadSceneSnipeFarClip = 500.0
|
|
|
|
//═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
|
//════════════════════════════════════════════════════╡ START ASSET LIST ╞═════════════════════════════════════════════════════
|
|
//═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
|
|
|
MODEL_NAMES mnVictim = CS_MRK // IG_MRK
|
|
MODEL_NAMES mnTarget = U_M_M_PARTYTARGET
|
|
MODEL_NAMES mnPartyMale1 = U_M_Y_PARTY_01
|
|
MODEL_NAMES mnPartyFem = A_F_Y_BEVHILLS_04
|
|
|
|
MODEL_NAMES mnCuntActorM = G_M_M_ARMBOSS_01
|
|
MODEL_NAMES mnCuntActorF = A_F_M_BEVHILLS_01
|
|
MODEL_NAMES mnCuntCrewM = A_M_Y_HIPSTER_03
|
|
MODEL_NAMES mnCuntCrewF = A_F_Y_HIPSTER_04
|
|
MODEL_NAMES mnCuntCam = PROP_V_CAM_01
|
|
MODEL_NAMES mnCuntBoom = PROP_V_BMIKE_01
|
|
MODEL_NAMES mnCuntClipboard = P_AMB_CLIPBOARD_01
|
|
|
|
MODEL_NAMES mnBench = P_CS_TROLLEY_01_S
|
|
MODEL_NAMES mnSmallTable = V_ILEV_TORT_STOOL
|
|
MODEL_NAMES mnWrench = PROP_CS_WRENCH
|
|
MODEL_NAMES mnPliers = P_PLIERS_01_S
|
|
MODEL_NAMES mnBattery = PROP_TORTURE_01
|
|
MODEL_NAMES mnSyringe = PROP_SYRINGE_01
|
|
MODEL_NAMES mnChair = PROP_TORTURE_CH_01
|
|
MODEL_NAMES mnClip0 = P_LD_CROCCLIPS01_S //Prop_LD_crocclips01
|
|
MODEL_NAMES mnClip1 = P_LD_CROCCLIPS02_S //Prop_LD_crocclips02
|
|
MODEL_NAMES mnTooth = Prop_LD_tooth
|
|
MODEL_NAMES mnWater = GET_WEAPONTYPE_MODEL(WEAPONTYPE_PETROLCAN)
|
|
MODEL_NAMES mnRag = P_LOOSE_RAG_01_S
|
|
MODEL_NAMES mnMonitor = PROP_ECG_01
|
|
MODEL_NAMES mnArmTape = P_ARM_BIND_CUT_S
|
|
MODEL_NAMES mnUVFaceProp = P_WBOARD_CLTH_S //P_UV_WBOARD_CLTH_S
|
|
|
|
MODEL_NAMES mnTrevTurd = PROP_BIG_SHIT_01
|
|
|
|
STRING adPartyGetUpFlee = "missfbi3_party"
|
|
|
|
STRING adSteve = "MISSFBI3_STEVE_PHONE"
|
|
|
|
STRING adWrongHouse = "MISSFBI3_CamCrew"
|
|
|
|
STRING adSniping = "MISSFBI3_SNIPING"
|
|
STRING animProneMichael = "prone_michael"
|
|
STRING animProneDave = "prone_dave"
|
|
|
|
STRING adCoffee = "switch@michael@coffee_w_dave"
|
|
|
|
STRING shakeRoadVib = "ROAD_VIBRATION_SHAKE"
|
|
STRING shakeHand = "HAND_SHAKE"
|
|
|
|
STRING sfHeart = "ECG_MONITOR"
|
|
STRING sfTooth = "TEETH_PULLING"
|
|
|
|
STRING csTrevor = "Trevor"
|
|
STRING csDave = "Dave_FBI"
|
|
STRING csTrevorCar = "Trevors_car"
|
|
STRING csTable = "TORTURE_Trolley"
|
|
STRING csSmallTable = "Torture_table_for_ECG"
|
|
STRING csBattery = "TORTURE_Battery"
|
|
STRING csChair = "TORTURE_Chair"
|
|
STRING csMonitor = "TORTURE_ECG_Machine"
|
|
STRING csWrench = "TORTURE_Wrench"
|
|
STRING csPliers = "TORTURE_Pliers"
|
|
STRING csClip0 = "TORTURE_Battery_clip_right"
|
|
STRING csClip1 = "TORTURE_Battery_clip_left"
|
|
STRING csWater = "TORTURE_Jerrycan"
|
|
STRING csSyringe = "TORTURE_Syringe"// "PROP_SYRINGE_01"
|
|
STRING csSteve = "Steve_FBI"
|
|
STRING csMrK = "MR_K"
|
|
STRING csMrK_TL = "MRK_toothless"
|
|
STRING csTapeArmLeft = "Torture_Binding_Arm"
|
|
STRING csTapeArmRight = "Torture_Binding_Arm_2"
|
|
STRING csRag = "Torture_Rag"
|
|
STRING strMrKCSHandle
|
|
STRING strMrKCSHandle_DONT_ANIMATE
|
|
|
|
STRING godSwitchTrevor = "TFT_HTSWPTREV"
|
|
STRING godShootTarget = "TFT_SHOOT"
|
|
STRING godDriveToMalibu = "TFT_DRIVE2"
|
|
STRING godDriveToAirport = "TFT_DRIVE3"
|
|
STRING godMichaelGetIn = "CMN_GENGETIN"
|
|
STRING godMichaelGetBack = "CMN_GENGETBCK"
|
|
|
|
STRING sbTortureGeneral = "FBI_03_TORTURE_General"
|
|
STRING sbTortureElec = "FBI_03_TORTURE_Electric"
|
|
STRING sbTortureTeeth = "FBI_03_TORTURE_Teeth"
|
|
STRING sbTortureWater = "FBI_03_TORTURE_Water"
|
|
STRING sbTortureWrench = "FBI_03_TORTURE_Wrench"
|
|
|
|
STRING soundHeartBeat = "FBI_03_TORTURE_Heart_Monitor_Single"
|
|
STRING soundHeartFlatline = "FBI_03_TORTURE_Heart_Monitor_Flatline"
|
|
|
|
|
|
STRING audsceneZoom = "FBI_3_TORTURE_ZOOM"
|
|
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
STRING eventEarlyCutIn = "EARLYCUT_IN"
|
|
STRING fxBloodExtract = "scr_fbi3_blood_extraction"
|
|
STRING fxBloodMouth = "scr_fbi3_blood_mouth"
|
|
STRING fxBloodThrow = "scr_fbi3_blood_throwaway"
|
|
STRING fxElecSmoulder = "scr_fbi3_elec_smoulder"
|
|
STRING fxElecSparks = "scr_fbi3_elec_sparks"
|
|
STRING fxWaterPour = "scr_fbi3_dirty_water_pour"//"scr_fbi3_water_pouring"
|
|
|
|
STRING hlpTorture1 = "hlp_TOR1"
|
|
STRING hlpTorture2 = "hlp_TOR2"
|
|
STRING hlpTorture3 = "hlp_TOR3"
|
|
STRING hlpTorture4 = "hlp_TOR4"
|
|
STRING hlpWrench = "hlp_WRENCH"
|
|
STRING hlpPliers1 = "hlp_PLIER1"
|
|
STRING hlpPliers2 = "hlp_PLIER2"
|
|
STRING hlpBattery = "hlp_BATTERY"
|
|
STRING hlpChair = "hlp_CHAIR"
|
|
STRING hlpPour = "hlp_POUR"
|
|
STRING hlpSyringe = "hlp_SYRINGE"
|
|
STRING hlpMenu = "hlp_MENU"
|
|
|
|
STRING soundMenuHighlightElec = "FBI_03_TORTURE_Choose_Electric"
|
|
STRING soundMenuHighlightPliers = "FBI_03_TORTURE_Choose_Pliers"
|
|
STRING soundMenuHighlightWater = "FBI_03_TORTURE_Choose_Water"
|
|
STRING soundMenuHighlightWrench = "FBI_03_TORTURE_Choose_Wrench"
|
|
|
|
STRING soundElectricHum = "FBI_03_TORTURE_Electric_Hum"
|
|
STRING soundElectricZap = "FBI_03_TORTURE_Electric_Zap"
|
|
STRING soundElectricSpark = "FBI_03_TORTURE_Electric_Spark"
|
|
STRING soundToothPull = "FBI_03_TORTURE_Teeth_Pulling"
|
|
STRING soundToothPullOut = "FBI_03_TORTURE_Teeth_Tooth_Out"
|
|
STRING soundWaterPour = "FBI_03_TORTURE_Water_Pour_Water"
|
|
STRING soundWaterPickUp = "FBI_03_TORTURE_Water_Pick_Up"
|
|
STRING soundWrenchHit = "FBI_03_TORTURE_Wrench_Hit_Shin"
|
|
#ENDIF
|
|
|
|
|
|
//═════════════════════════════════╡ STRUCTS ╞═══════════════════════════════════
|
|
|
|
STRUCT PARTY_PED_STRUCT
|
|
PED_INDEX id
|
|
BOOL bFleeing
|
|
ENDSTRUCT
|
|
|
|
PARTY_PED_STRUCT peds[mpf_num_peds]
|
|
OBJECT_INDEX objs[mof_num_objects]
|
|
|
|
STRUCT sMenuObject
|
|
OBJECT_INDEX objObject
|
|
MODEL_NAMES model
|
|
VECTOR vDefaultCoords
|
|
VECTOR vDefaultRot
|
|
BOOL bIsHighlighted
|
|
VECTOR vAttachOffset
|
|
VECTOR vAttachRot
|
|
BOOL bHasPlayedAnim
|
|
STRING strLastPlayedDict
|
|
TEXT_LABEL_63 strLastPlayedAnim
|
|
BOOL bSelectable
|
|
INT iTimesSelected
|
|
STRING strCSName
|
|
ENDSTRUCT
|
|
sMenuObject menuWeapon[NO_OF_TORTURE_WEAPONS]
|
|
|
|
|
|
|
|
STRUCT SWAY_CAM_STRUCT
|
|
CAMERA_INDEX camInit
|
|
CAMERA_INDEX camDest
|
|
BOOL bInitialised
|
|
VECTOR vCamInitCoord
|
|
VECTOR vCamInitRot
|
|
FLOAT fCamInitFOV
|
|
VECTOR vCamDestCoord
|
|
VECTOR vCamDestRot
|
|
FLOAT fCamDestFOV
|
|
INT iSwayDuration
|
|
BOOL bShakeSwayCam
|
|
STRING sShakeType
|
|
FLOAT fShakeAmount
|
|
BOOL bSwayDirection
|
|
ENDSTRUCT
|
|
|
|
SWAY_CAM_STRUCT sSwayTorture
|
|
SWAY_CAM_STRUCT sSwaySniping
|
|
|
|
//═════════════════════════════════╡ VARIABLES ╞═══════════════════════════════════
|
|
|
|
MISSION_STAGE eMissionStage
|
|
LOCATES_HEADER_DATA sLocatesData
|
|
ASSET_MANAGEMENT_DATA sAssetData
|
|
CUTSCENE_PED_VARIATION sCutscenePedVariationRegister[10]
|
|
CLEANUP_QUEUE_ENTITY_STRUCT sEntityCleanupQueue[30]
|
|
VECTOR vTargetPedSlots[PEDSLOT_NUM_OF_SLOTS]
|
|
INT iTargetPedSlot[3]
|
|
|
|
//═════════╡ FLAGS ╞═════════
|
|
BOOL bStageSetup = FALSE
|
|
BOOL bDoSkip = FALSE
|
|
BOOL bMissionFailed = FALSE
|
|
BOOL bUpdateMissionFailed = FALSE
|
|
#IF IS_DEBUG_BUILD
|
|
BOOL b_draw_debug_info = FALSE
|
|
#ENDIF
|
|
|
|
STRING strOneShotLoaded = ""
|
|
INT i_EstablishHoldTimer
|
|
|
|
|
|
// Start/Drives
|
|
BOOL bSwitchedAtStart
|
|
BOOL bTrousersUp = FALSE
|
|
TEXT_LABEL_23 str_InteruptedRoot = ""
|
|
TEXT_LABEL_23 str_InteruptedLabel = ""
|
|
INT iDriveStoppedTimer = -1
|
|
INT iDriveComplaintTimer = 0
|
|
BOOL bMusicCueTriggered = FALSE
|
|
BOOL bMusicCueKilled = FALSE
|
|
|
|
BOOL bHeartbeatFrame = FALSE
|
|
BOOL bFlatLine = FALSE
|
|
|
|
BOOL bDisplayHeartMonitor = FALSE
|
|
BOOL bDisplayToothPull = FALSE
|
|
|
|
SYNC_SCENES eLastTorturePlayed = SCENE_WEAPON_SELECT_IDLE
|
|
|
|
BOOL bIdlingElectricity = FALSE
|
|
|
|
BOOL bHasChairPlayedAnim = FALSE
|
|
BOOL bHasPlayedPickupAnim = FALSE
|
|
BOOL bTortureMusicPlaying = FALSE
|
|
BOOL bPerformedPostTortureFadeIn = FALSE
|
|
BOOL bPlayedTortureSceneThisFrame = FALSE
|
|
BOOL bPlayedTortureSceneLastFrame = FALSE
|
|
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
|
|
ANIM_DATA sAnimDataBlank
|
|
|
|
BOOL bMenuRightPressed = FALSE
|
|
BOOL bMenuLeftPressed = FALSE
|
|
BOOL bInitialWeaponHighlighted = FALSE
|
|
BOOL bRevived = FALSE
|
|
BOOL bJustStarting = TRUE
|
|
BOOL bHasBeenSyringed = FALSE
|
|
INT i_MinPourTimer
|
|
BOOL bPlayedPliersInWhimper = FALSE
|
|
|
|
FLOAT fShockLoopTransition, fShockLoopInc
|
|
FLOAT fClipGripProgLeft, fClipGripProgRight
|
|
FLOAT fClipGripIncLeft, fClipGripIncRight
|
|
FLOAT fLeftWeight, fRightWeight, fIdleWeight, fBothWeight
|
|
FLOAT fLRBalance, fLRBalanceNorm
|
|
BOOL bElecgripSpike
|
|
|
|
INT iPreviousFrameRX = 0
|
|
INT iPreviousFrameRY = 0
|
|
INT iNumberOfSyringesUsed = 0
|
|
INT iMrKArrestTimer = -1
|
|
FLOAT fTargetHealth = 100.0
|
|
FLOAT fCurrentSFToothDepth = 0.0
|
|
FLOAT fCurrentSFToothAngle = 0.0
|
|
FLOAT fStartPhase = 0.0
|
|
INT i_SparkTimer = 0
|
|
INT iTortureStage = 0
|
|
INT iTortureWeaponStage
|
|
INT iWeaponSelDiaTimer = 0
|
|
INT iWeaponSelDiaDelay = 0
|
|
INT iTimeSinceLastShock = -1
|
|
VECTOR vWaterPourOffset = <<0.15, 0.025, 0.2>>
|
|
BOOL bHasRestraintPlayedAnim = FALSE
|
|
|
|
#ENDIF
|
|
|
|
EKG_CAM_STATE eEKGCamState = EKGCAM_TORTURE
|
|
BOOL bECGSetup = FALSE
|
|
BOOL bLookingAtECG = FALSE
|
|
|
|
CONST_INT NUMBER_OF_EVENT_FLAGS 5
|
|
BOOL bEventFlag[NUMBER_OF_EVENT_FLAGS]
|
|
BOOL bScoped[HS_NUM_OF_HOUSE_SECTIONS]
|
|
BOOL bStartedAsMichael = FALSE
|
|
BOOL bScopeAiming = FALSE
|
|
INT iAttemptToAimTimer = -1
|
|
BOOL bSnipeCamDirInit = FALSE
|
|
BOOL bDriveConversationFlags[3]
|
|
INT iNeedVehicleUses = 0
|
|
|
|
|
|
PARTY_CRASHED_STATE ePartyState = PCS_NOT_CRASHED
|
|
BOOL bManageParty = FALSE
|
|
BOOL bProneSetup = FALSE
|
|
BOOL bPlayingMusic = FALSE
|
|
BOOL bHasCokeSnortPlayed = FALSE
|
|
BOOL bTargetHasBeenIDed = FALSE
|
|
BOOL bTargetKilled = FALSE
|
|
|
|
BOOL bDisplaySwitchHUD = FALSE
|
|
BOOL bMadeSelection = FALSE
|
|
BOOL bSafeToSwitch = FALSE
|
|
BOOL bCutsceneLoaded = FALSE
|
|
BOOL bPromptedSWITCH = FALSE
|
|
BOOL bCutsceneSWITCHStarted = FALSE
|
|
BOOL bCutSceneSWITCHPreped = FALSE
|
|
BOOL bHasSwitchSetupCam = FALSE
|
|
BOOL bRunPostSwitchFocusCleanup = FALSE
|
|
BOOL bPlayedSwitchSting = FALSE
|
|
BOOL bMovedFocus = FALSE
|
|
BOOL bMichaelExited = FALSE
|
|
BOOL bDaveExited = FALSE
|
|
BOOL bTrevorExited = FALSE
|
|
BOOL bCamExited = FALSE
|
|
VECTOR v_FirstPersonCamRotPrev = <<0,0,0>>
|
|
BOOL bAimingAtTheTarget = FALSE
|
|
INT iAimTimer = -1
|
|
BOOL bDontPlayFullSnipeChat = FALSE
|
|
INT iCoffeeStage = 0
|
|
#IF IS_DEBUG_BUILD
|
|
BOOL b_SimulatedStreamingStuck = FALSE
|
|
#ENDIF
|
|
INT iSwitchFailTimer = -1
|
|
|
|
BOOL b_CuntPropPlayingAnim[3]
|
|
INT i_realCuntsStage
|
|
|
|
BOOL b_SpawnTrain
|
|
|
|
|
|
SCENARIO_BLOCKING_INDEX sba_airport
|
|
SCENARIO_BLOCKING_INDEX chairBlocker
|
|
SCENARIO_BLOCKING_INDEX sba_wrongLocation
|
|
SCENARIO_BLOCKING_INDEX sba_chumash_car_park
|
|
SCENARIO_BLOCKING_INDEX sba_coffee_shop
|
|
|
|
INTERIOR_INSTANCE_INDEX interior_torture
|
|
|
|
INT iCurrentMenuWeapon = 0
|
|
INT iRoadNodeSpeedZone[3]
|
|
INT rtECG
|
|
STRING sECGRenderTarget = "ECG"
|
|
INT rtScreen
|
|
INT iToothAlpha = 255
|
|
INT iWeaponSelStage = 0
|
|
INT iCokeSnortTimer = 0
|
|
INT iPartyBStage = 0
|
|
INT iPartyDStage = 0
|
|
INT iGateHashA = HASH("WrongLocationGateA")
|
|
INT iGateHashB = HASH("WrongLocationGateB")
|
|
INT iNumberOfTeethPulled = 0
|
|
INT iWrongHouseCut = -1
|
|
INT i_time_of_last_convo = 0
|
|
INT iFailTimer = -1
|
|
|
|
FLOAT fTortureForceApplied = 0
|
|
FLOAT fVictimHealth = 100.0
|
|
INT iLastHeartBeatTime
|
|
FLOAT fBPM_Base
|
|
FLOAT fBPM_Spike
|
|
FLOAT fBPM_SpikeStart
|
|
FLOAT fBPM_SpikeDesired
|
|
INT iBPM_SpikeInTime
|
|
INT iBPM_SpikeHoldTime
|
|
INT iBPM_SpikeReturnTime
|
|
INT iBPM_SpikeTimer
|
|
INT iUpdateEKGTimer
|
|
|
|
FLOAT fCurrentSFHealth = 0.0
|
|
FLOAT fCurrentSFBMP = 0.0
|
|
FLOAT fSmokeEvo = 0.0
|
|
FLOAT fAudioZoom = 0.0
|
|
FLOAT fAudioZoomPreviousFrame = 0.0
|
|
FLOAT fPullStrength
|
|
BOOL bPliersInMouth
|
|
BOOL bPlayerLockedIn
|
|
FLOAT fTortureShake = 0.5
|
|
BOOL bCustomPCControlsLoaded = FALSE
|
|
|
|
BOOL bStoredSniperSnapshot
|
|
WEAPON_INFO sSniperSnapshot
|
|
|
|
//═════════╡ Stages ╞═════════
|
|
INT i_mission_substage = 0
|
|
INT iSelectWeaponStage = 0
|
|
|
|
|
|
//═════════╡ Selector ╞═════════
|
|
SELECTOR_CAM_STRUCT sCamDetails
|
|
SELECTOR_PED_STRUCT sSelectorPeds
|
|
structPedsForConversation structConvoPeds
|
|
|
|
//═════════╡ PEDS ╞═════════
|
|
PED_INDEX pedVictim
|
|
PED_INDEX pedSteve
|
|
PED_INDEX pedDave
|
|
PED_INDEX pedCunts[5]
|
|
PED_INDEX pedProneMichael
|
|
PED_INDEX pedAirport[8]
|
|
|
|
//═════════╡ VEHICLES ╞═════════
|
|
VEHICLE_INDEX vehDriveToVeh
|
|
VEHICLE_INDEX vehReplay
|
|
VEHICLE_INDEX vehTrevor
|
|
VEHICLE_INDEX vehTrainStart
|
|
VEHICLE_INDEX vehWrongLocationCutscene
|
|
|
|
//═════════╡ OBJECTS ╞═════════
|
|
|
|
OBJECT_INDEX objCunts[3]
|
|
OBJECT_INDEX propPhoneDave
|
|
OBJECT_INDEX propPhoneSteve
|
|
OBJECT_INDEX objTable
|
|
OBJECT_INDEX objSmallTable
|
|
OBJECT_INDEX objBattery
|
|
OBJECT_INDEX objChair
|
|
OBJECT_INDEX objMonitor
|
|
OBJECT_INDEX objTooth
|
|
OBJECT_INDEX objTapeArmLeft
|
|
OBJECT_INDEX objTapeArmRight
|
|
|
|
//═════════╡ SEQUENCES ╞═════════
|
|
SEQUENCE_INDEX seqSequence
|
|
|
|
//═════════╡ WEAPONS ╞═════════
|
|
WEAPON_TYPE weapMichaelsSniper = WEAPONTYPE_SNIPERRIFLE
|
|
|
|
//═════════╡ PARTICLE ID ╞═════════
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
PTFX_ID ptfxBloodMouth
|
|
BOOL bFXBloodMouth = FALSE
|
|
PTFX_ID ptfxBloodThrow
|
|
BOOL bFXBloodThrow = FALSE
|
|
PTFX_ID ptfxElecSmoulder
|
|
BOOL bFXElecSmoulder = FALSE
|
|
PTFX_ID ptfxWaterPour
|
|
BOOL bFXWaterPour = FALSE
|
|
#ENDIF
|
|
|
|
//═════════╡ Scene ID ╞═════════
|
|
INT syncScene[NUMBER_OF_SCENES]
|
|
|
|
//═════════╡ Sound ID ╞═════════
|
|
|
|
//═════════╡ BLIPS ╞═════════
|
|
BLIP_INDEX blipLocate
|
|
|
|
//═════════╡ GROUPS ╞═════════
|
|
REL_GROUP_HASH grpCrew
|
|
|
|
//═════════╡ MODEL NAMES ╞═════════
|
|
|
|
//═════════╡ SCALEFORM ╞═════════
|
|
SCALEFORM_INDEX sfHeartMonitor
|
|
SCALEFORM_INDEX sfToothPull
|
|
|
|
//═════════╡ STRINGS ╞═════════
|
|
STRING sAudioBlock = "FB3AUD"
|
|
STRING sTextBlock = "FBI3"
|
|
|
|
//═════════╡ CAMERAS ╞═════════
|
|
CAMERA_INDEX camGeneralInit
|
|
CAMERA_INDEX camGeneralDest
|
|
CAMERA_INDEX camEKG
|
|
CAMERA_INDEX camSyncSceneAnimated
|
|
CAMERA_INDEX camTorture
|
|
CAMERA_INDEX camWrongLocation
|
|
CAMERA_INDEX cam_establish
|
|
|
|
//═════════╡ CONVERSATIONS ╞═════════
|
|
BOOL bTriggeringConversation
|
|
TEXT_LABEL_15 str_dialogue_root
|
|
TEXT_LABEL_15 str_dialogue_label
|
|
|
|
//═════════╡ DEBUG ╞═════════
|
|
#IF IS_DEBUG_BUILD
|
|
WIDGET_GROUP_ID widgetDebug
|
|
FLOAT debug_f_cam_rel_heading
|
|
FLOAT debug_f_cam_rel_pitch
|
|
FLOAT debug_f_scope_zoom
|
|
FLOAT debug_f_scope_speed_x
|
|
FLOAT debug_f_scope_speed_z
|
|
VECTOR debug_v_scope_cam_rot
|
|
|
|
MissionStageMenuTextStruct SkipMenuStruct[22] // struct containing the debug menu
|
|
|
|
INT iDebugCounter
|
|
#ENDIF
|
|
|
|
|
|
|
|
// ___ ___ _ __ ___ _ __ __ ___ _ __ common functions for David (PRE FAILCHECK)
|
|
// / __/ _ \| '_ ` _ \| '_ ` _ \ / _ \| '_ \
|
|
//| (_| (_) | | | | | | | | | | | (_) | | | |
|
|
// \___\___/|_| |_| |_|_| |_| |_|\___/|_| |_|
|
|
|
|
VECTOR VECTOR_ZERO = <<0.0, 0.0, 0.0>>
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
|
|
PROC DRAW_DEBUG_TEXT_WRAPPED( STRING strValue, INT iColR = 0, INT iColG = 0, INT iColB = 0, INT iColA = 255 )
|
|
|
|
CONST_FLOAT f_left 0.05
|
|
CONST_FLOAT f_top 0.25
|
|
CONST_FLOAT f_spacing 0.025
|
|
|
|
DRAW_DEBUG_TEXT_2D( strValue, <<f_left, f_top + iDebugCounter * f_spacing, 0.0>>, iColR, iColG, iColB, iColA )
|
|
iDebugCounter++
|
|
|
|
ENDPROC
|
|
|
|
PROC DRAW_DEBUG_TEXT_WRAPPED_STRING( STRING strName, STRING strValue, INT iColR = 0, INT iColG = 0, INT iColB = 0, INT iColA = 255 )
|
|
TEXT_LABEL_63 strTemp = strName
|
|
strTemp += ": "
|
|
strTemp += strValue
|
|
DRAW_DEBUG_TEXT_WRAPPED( strTemp, iColR, iColG, iColB, iColA )
|
|
ENDPROC
|
|
|
|
PROC DRAW_DEBUG_TEXT_WRAPPED_INT( STRING strName, INT iValue, INT iColR = 0, INT iColG = 0, INT iColB = 0, INT iColA = 255 )
|
|
TEXT_LABEL_63 strTemp = strName
|
|
strTemp += ": "
|
|
strTemp += iValue
|
|
DRAW_DEBUG_TEXT_WRAPPED( strTemp, iColR, iColG, iColB, iColA )
|
|
ENDPROC
|
|
|
|
PROC DRAW_DEBUG_TEXT_WRAPPED_FLOAT( STRING strName, FLOAT fValue, INT iColR = 0, INT iColG = 0, INT iColB = 0, INT iColA = 255 )
|
|
TEXT_LABEL_63 strTemp = strName
|
|
strTemp += ": "
|
|
strTemp += FLOAT_TO_STRING( fValue )
|
|
DRAW_DEBUG_TEXT_WRAPPED( strTemp, iColR, iColG, iColB, iColA )
|
|
ENDPROC
|
|
|
|
PROC DRAW_DEBUG_TEXT_WRAPPED_BOOL( STRING strName, BOOL bValue, INT iColR = 0, INT iColG = 0, INT iColB = 0, INT iColA = 255 )
|
|
TEXT_LABEL_63 strTemp = strName
|
|
strTemp += ": "
|
|
IF bValue
|
|
strTemp += "TRUE"
|
|
ELSE
|
|
strTemp += "FALSE"
|
|
ENDIF
|
|
DRAW_DEBUG_TEXT_WRAPPED( strTemp, iColR, iColG, iColB, iColA )
|
|
ENDPROC
|
|
|
|
#ENDIF
|
|
|
|
FUNC PED_VARIATION_STRUCT GET_DAVE_VARIATIONS(BOOL bIncludeSunGlasses)
|
|
|
|
PED_VARIATION_STRUCT sResult
|
|
|
|
sResult.iDrawableVariation[PED_COMP_HEAD] = 0
|
|
sResult.iTextureVariation[PED_COMP_HEAD] = 0
|
|
sResult.iDrawableVariation[PED_COMP_HAIR] = 0
|
|
sResult.iTextureVariation[PED_COMP_HAIR] = 0
|
|
sResult.iDrawableVariation[PED_COMP_BERD] = 0
|
|
sResult.iTextureVariation[PED_COMP_BERD] = 0
|
|
sResult.iDrawableVariation[PED_COMP_TORSO] = 0
|
|
sResult.iTextureVariation[PED_COMP_TORSO] = 2
|
|
sResult.iDrawableVariation[PED_COMP_LEG] = 0
|
|
sResult.iTextureVariation[PED_COMP_LEG] = 3
|
|
sResult.iDrawableVariation[PED_COMP_FEET] = 0
|
|
sResult.iTextureVariation[PED_COMP_FEET] = 0
|
|
sResult.iDrawableVariation[PED_COMP_SPECIAL] = 0
|
|
sResult.iTextureVariation[PED_COMP_SPECIAL] = 0
|
|
sResult.iDrawableVariation[PED_COMP_SPECIAL2] = 0
|
|
sResult.iTextureVariation[PED_COMP_SPECIAL2] = 0
|
|
sResult.iDrawableVariation[PED_COMP_HAND] = 0
|
|
sResult.iTextureVariation[PED_COMP_HAND] = 0
|
|
sResult.iDrawableVariation[PED_COMP_DECL] = 0
|
|
sResult.iTextureVariation[PED_COMP_DECL] = 0
|
|
sResult.iDrawableVariation[PED_COMP_JBIB] = 0
|
|
sResult.iTextureVariation[PED_COMP_JBIB] = 0
|
|
sResult.iPropIndex[ANCHOR_HEAD] = -1
|
|
sResult.iPropTexture[ANCHOR_HEAD] = 0
|
|
IF bIncludeSunGlasses
|
|
sResult.iPropIndex[ANCHOR_EYES] = 0
|
|
sResult.iPropTexture[ANCHOR_EYES] = 0
|
|
ELSE
|
|
sResult.iPropIndex[ANCHOR_EYES] = -1
|
|
sResult.iPropTexture[ANCHOR_EYES] = 0
|
|
ENDIF
|
|
sResult.iPropIndex[ANCHOR_EARS] = -1
|
|
sResult.iPropTexture[ANCHOR_EARS] = 0
|
|
sResult.iPropIndex[ANCHOR_HIP] = -1
|
|
sResult.iPropTexture[ANCHOR_HIP] = 0
|
|
sResult.iPropIndex[ANCHOR_LEFT_HAND] = -1
|
|
sResult.iPropTexture[ANCHOR_LEFT_HAND] = 0
|
|
sResult.iPropIndex[ANCHOR_LEFT_WRIST] = -1
|
|
sResult.iPropTexture[ANCHOR_LEFT_WRIST] = 0
|
|
sResult.iPropIndex[ANCHOR_RIGHT_HAND] = -1
|
|
sResult.iPropTexture[ANCHOR_RIGHT_HAND] = 0
|
|
sResult.iPropIndex[ANCHOR_RIGHT_WRIST] = -1
|
|
sResult.iPropTexture[ANCHOR_RIGHT_WRIST] = 0
|
|
sResult.iPropIndex[ANCHOR_MOUTH] = -1
|
|
sResult.iPropTexture[ANCHOR_MOUTH] = 0
|
|
|
|
|
|
RETURN sResult
|
|
|
|
ENDFUNC
|
|
|
|
//PURPOSE: Shutsdown the current pc minigame control scheme.
|
|
PROC SHUTDOWN_PC_CONTROLS()
|
|
|
|
IF bCustomPCControlsLoaded
|
|
SHUTDOWN_PC_SCRIPTED_CONTROLS()
|
|
bCustomPCControlsLoaded = FALSE
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
//PURPOSE: Sets a custom PC control scheme and unloads the previous scheme if necessary
|
|
PROC SET_PC_CONTROLS( STRING sPCControls )
|
|
|
|
SHUTDOWN_PC_CONTROLS()
|
|
|
|
INIT_PC_SCRIPTED_CONTROLS(sPCControls)
|
|
bCustomPCControlsLoaded = TRUE
|
|
|
|
ENDPROC
|
|
|
|
|
|
//PURPOSE: Warps the player and sets the correct character
|
|
FUNC BOOL SET_CURRENT_PLAYER_PED(SELECTOR_SLOTS_ENUM char, BOOL bWait = FALSE, BOOL bCleanUpModel = TRUE)
|
|
|
|
IF GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(GET_CURRENT_PLAYER_PED_ENUM()) != char
|
|
|
|
IF char = SELECTOR_PED_MULTIPLAYER
|
|
SCRIPT_ASSERT("NOT A PLAYABLE CHARACTER!")
|
|
ELSE
|
|
IF bWait
|
|
WHILE NOT SET_CURRENT_SELECTOR_PED(char, bCleanUpModel)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
sSelectorPeds.pedID[char] = PLAYER_PED_ID()
|
|
ELSE
|
|
IF SET_CURRENT_SELECTOR_PED(char, bCleanUpModel)
|
|
sSelectorPeds.pedID[char] = PLAYER_PED_ID()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
//PURPOSE: Returns the largest of the two integers
|
|
FUNC INT MAX_INTEGER(INT int1, INT int2)
|
|
IF int1 > int2
|
|
RETURN int1
|
|
ELSE
|
|
RETURN int2
|
|
ENDIF
|
|
ENDFUNC
|
|
|
|
//PURPOSE: Checks if a world point lies within a given screen area
|
|
FUNC BOOL IS_POINT_IN_SCREEN_AREA(vector vWorldCoord, float x1, float y1, float x2, float y2)
|
|
float sX, sY
|
|
GET_SCREEN_COORD_FROM_WORLD_COORD(vWorldCoord,sX,sY)
|
|
if sX>= x1 and sX<=x2
|
|
if sY>=y1 and sy<=y2
|
|
return TRUE
|
|
ENDIF
|
|
ENDIF
|
|
return FALSE
|
|
ENDFUNC
|
|
|
|
PROC SET_GAMEPLAY_CAM_WORLD_HEADING(FLOAT fHeading = 0.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(fHeading - GET_ENTITY_HEADING(PLAYER_PED_ID()))
|
|
ENDPROC
|
|
|
|
//PURPOSE: DELETES AN ATTACHED PROP
|
|
PROC DELETE_ATTACHED_PROP(OBJECT_INDEX &prop)
|
|
IF DOES_ENTITY_EXIST(prop)
|
|
IF IS_ENTITY_ATTACHED(prop)
|
|
DETACH_ENTITY(prop)
|
|
ENDIF
|
|
DELETE_OBJECT(prop)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: Does all the checks needed to see if a vehicle has rolled over
|
|
FUNC BOOL hasVehicleRolledOver(VEHICLE_INDEX thisVehicle)
|
|
IF IS_VEHICLE_DRIVEABLE(thisVehicle)
|
|
IF IS_VEHICLE_STUCK_TIMER_UP(thisVehicle, VEH_STUCK_ON_ROOF, ROOF_TIME)
|
|
//OR IS_VEHICLE_STUCK_TIMER_UP(thisVehicle, VEH_STUCK_JAMMED, ROOF_TIME)
|
|
OR IS_VEHICLE_STUCK_TIMER_UP(thisVehicle, VEH_STUCK_HUNG_UP, ROOF_TIME)
|
|
OR IS_VEHICLE_STUCK_TIMER_UP(thisVehicle, VEH_STUCK_ON_SIDE, ROOF_TIME)
|
|
RETURN TRUE
|
|
ELSE
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
FUNC PED_INDEX MIKE_PED_ID()
|
|
IF GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(GET_CURRENT_PLAYER_PED_ENUM()) = SELECTOR_PED_MICHAEL
|
|
RETURN PLAYER_PED_ID()
|
|
ELSE
|
|
RETURN sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]
|
|
ENDIF
|
|
ENDFUNC
|
|
|
|
FUNC PED_INDEX TREV_PED_ID()
|
|
IF GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(GET_CURRENT_PLAYER_PED_ENUM()) = SELECTOR_PED_TREVOR
|
|
RETURN PLAYER_PED_ID()
|
|
ELSE
|
|
RETURN sSelectorPeds.pedID[SELECTOR_PED_TREVOR]
|
|
ENDIF
|
|
ENDFUNC
|
|
|
|
PROC printLine(STRING sTextLine)
|
|
CDEBUG1LN(DEBUG_MIKE, "[***FBI 3***]: ", sTextLine, "\n")
|
|
ENDPROC
|
|
|
|
//PURPOSE: Checks if the player has killed the ped
|
|
FUNC BOOL HasPedBeenKilledByPlayer(PED_INDEX thisPed)
|
|
IF DOES_ENTITY_EXIST(thisPed)
|
|
IF IS_PED_INJURED(thisPed)
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(thisPed, PLAYER_PED_ID())
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
//PURPOSE: Checks if the player has shot the ped
|
|
FUNC BOOL HasPedBeenShotByPlayer(PED_INDEX thisPed)
|
|
IF DOES_ENTITY_EXIST(thisPed)
|
|
IF NOT IS_PED_INJURED(thisPed)
|
|
IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(thisPed, PLAYER_PED_ID())
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
//PURPOSE: Runs a conversation
|
|
PROC RunConversation(STRING convRoot, STRING convLabel = NULL, BOOL bAppendToothlessTag = FALSE)
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
|
|
TEXT_LABEL_15 strRoot = convRoot
|
|
IF bAppendToothlessTag
|
|
AND iNumberOfTeethPulled > 0
|
|
strRoot += "_TL"
|
|
ENDIF
|
|
|
|
bTriggeringConversation = TRUE
|
|
str_dialogue_root = strRoot
|
|
IF IS_STRING_NULL_OR_EMPTY(convLabel)
|
|
|
|
IF CREATE_CONVERSATION(structConvoPeds, sAudioBlock, str_dialogue_root, CONV_PRIORITY_HIGH)
|
|
bTriggeringConversation = FALSE
|
|
str_dialogue_root = ""
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
str_dialogue_label = convLabel
|
|
IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(structConvoPeds, sAudioBlock, str_dialogue_root, str_dialogue_label, CONV_PRIORITY_HIGH)
|
|
bTriggeringConversation = FALSE
|
|
str_dialogue_root = ""
|
|
str_dialogue_label = ""
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
//PURPOSE: Updates the conversation syste,
|
|
PROC UpdateConversationStarter()
|
|
IF bTriggeringConversation
|
|
|
|
IF IS_STRING_NULL_OR_EMPTY(str_dialogue_label)
|
|
IF CREATE_CONVERSATION(structConvoPeds, sAudioBlock, str_dialogue_root, CONV_PRIORITY_HIGH)
|
|
bTriggeringConversation = FALSE
|
|
str_dialogue_root = ""
|
|
ENDIF
|
|
ELSE
|
|
|
|
IF CREATE_CONVERSATION_FROM_SPECIFIC_LINE(structConvoPeds, sAudioBlock, str_dialogue_root, str_dialogue_label, CONV_PRIORITY_HIGH)
|
|
bTriggeringConversation = FALSE
|
|
str_dialogue_root = ""
|
|
str_dialogue_label = ""
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: Checks if the user has failed a level stage
|
|
PROC FailCheck()
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF DOES_ENTITY_EXIST(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
|
|
AND IS_VEHICLE_DRIVEABLE(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
|
|
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
|
|
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
|
|
ENDIF
|
|
ELSE
|
|
INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(NULL)
|
|
INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(NULL)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(MIKE_PED_ID())
|
|
IF IS_PED_INJURED(MIKE_PED_ID())
|
|
eMissionFail = FAIL_MICHAEL_DEAD
|
|
bMissionFailed = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(TREV_PED_ID())
|
|
IF IS_PED_INJURED(TREV_PED_ID())
|
|
eMissionFail = FAIL_TREVOR_DEAD
|
|
bMissionFailed = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(pedVictim)
|
|
IF IS_PED_INJURED(pedVictim)
|
|
eMissionFail = FAIL_VICTIM_DEAD
|
|
bMissionFailed = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(pedSteve)
|
|
IF IS_PED_INJURED(pedSteve)
|
|
eMissionFail = FAIL_STEVE_DEAD
|
|
bMissionFailed = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(pedDave)
|
|
IF IS_PED_INJURED(pedDave)
|
|
eMissionFail = FAIL_DAVE_DEAD
|
|
bMissionFailed = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Got too close to the party, fail
|
|
IF eMissionStage >= ST_4_DRIVE_TO_COORD_SECOND
|
|
AND eMissionStage < ST_11_DRIVE_TO_AIRPORT
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
AND (IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())))
|
|
OR IS_THIS_MODEL_A_PLANE(GET_ENTITY_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))))
|
|
AND GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), <<-3091.85, 346.71, 6.51>>) < 105
|
|
OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-3114.270752,353.227356,6.238481>>, <<-3082.558350,345.265533,21.124956>>, 23.125000)
|
|
eMissionFail = FAIL_PARTY_SEEN_AT_PARTY
|
|
bMissionFailed = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// trevor's car fucked (only this car is mission critical)
|
|
IF DOES_ENTITY_EXIST(vehTrevor)
|
|
IF eMissionStage > ST_1_INTRO_CUT
|
|
IF NOT IS_VEHICLE_DRIVEABLE(vehTrevor)
|
|
eMissionFail = FAIL_VEHICLE_DEAD_TREVOR
|
|
bMissionFailed = TRUE
|
|
ELSE
|
|
IF hasVehicleRolledOver(vehTrevor)
|
|
eMissionFail = FAIL_VEHICLE_STUCK_TREVOR
|
|
bMissionFailed = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH eMissionStage
|
|
CASE ST_0_DRIVE_TO_START
|
|
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
|
|
IF IS_COP_PED_IN_AREA_3D(<<126.393562,-2193.830811,13.532487>>-<<21.937500,14.687500,8.687500>>,
|
|
<<126.393562,-2193.830811,13.532487>>+<<21.937500,14.687500,8.687500>>)
|
|
eMissionFail = FAIL_COPS_WAREHOUSE
|
|
bMissionFailed = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE ST_2_DRIVE_TO_COORD_FIRST
|
|
|
|
BOOL bPedsShouldFlee
|
|
|
|
// Too close OR bullet/projectile hit near them
|
|
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), <<-893.271423,-6.694348,42.693260>>) < 10.0
|
|
eMissionFail = FAIL_CUNTS_SPOOKED
|
|
bMissionFailed = TRUE
|
|
// ELIF HAS_BULLET_IMPACTED_IN_AREA(<<-891.384644,-4.884975,34.978268>>, 35.250000, TRUE)
|
|
// OR IS_PROJECTILE_IN_AREA(<<-885.478577,-0.343218,46.963562>> - <<23.687500,32.937500,10.750000>>, <<-885.478577,-0.343218,46.963562>> + <<23.687500,32.937500,10.750000>>)
|
|
// bPedsShouldFlee = TRUE
|
|
// eMissionFail = FAIL_CUNTS_SPOOKED
|
|
// bMissionFailed = TRUE
|
|
ENDIF
|
|
|
|
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), <<-889.04, -11.79, 42.22>>) < 48.0
|
|
AND ((IS_PED_IN_ANY_HELI(PLAYER_PED_ID()) OR IS_PED_IN_ANY_PLANE(PLAYER_PED_ID()))
|
|
OR (IS_PED_IN_ANY_POLICE_VEHICLE(PLAYER_PED_ID()) AND IS_VEHICLE_SIREN_ON(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))))
|
|
bPedsShouldFlee = TRUE
|
|
eMissionFail = FAIL_CUNTS_SPOOKED
|
|
bMissionFailed = TRUE
|
|
ENDIF
|
|
|
|
INT i
|
|
FOR i = 0 TO 4
|
|
|
|
IF DOES_ENTITY_EXIST(pedCunts[i])
|
|
|
|
// Killed either of them fail
|
|
IF HasPedBeenKilledByPlayer(pedCunts[i])
|
|
CPRINTLN(DEBUG_MIKE, "CUNTS Dead")
|
|
bPedsShouldFlee = TRUE
|
|
eMissionFail = FAIL_CUNTS_INNOCENT_DEAD
|
|
bMissionFailed = TRUE
|
|
|
|
// attacked one of them
|
|
ELIF HasPedBeenShotByPlayer(pedCunts[i])
|
|
CPRINTLN(DEBUG_MIKE, "CUNTS Shot")
|
|
bPedsShouldFlee = TRUE
|
|
eMissionFail = FAIL_CUNTS_SPOOKED
|
|
bMissionFailed = TRUE
|
|
|
|
// Spooked
|
|
ELIF HAS_PED_RECEIVED_EVENT(pedCunts[i], EVENT_SHOT_FIRED)
|
|
OR HAS_PED_RECEIVED_EVENT(pedCunts[i], EVENT_SHOT_FIRED_BULLET_IMPACT)
|
|
OR HAS_PED_RECEIVED_EVENT(pedCunts[i], EVENT_SHOT_FIRED_WHIZZED_BY)
|
|
OR HAS_PED_RECEIVED_EVENT(pedCunts[i], EVENT_EXPLOSION_HEARD)
|
|
|
|
CPRINTLN(DEBUG_MIKE, "CUNTS Gunshot, explosion, etc")
|
|
bPedsShouldFlee = TRUE
|
|
eMissionFail = FAIL_CUNTS_SPOOKED
|
|
bMissionFailed = TRUE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDFOR
|
|
|
|
// Peds should fleed
|
|
IF bMissionFailed AND bPedsShouldFlee
|
|
|
|
REPEAT COUNT_OF(pedCunts) i
|
|
|
|
IF DOES_ENTITY_EXIST(pedCunts[i])
|
|
AND NOT IS_PED_INJURED(pedCunts[i])
|
|
AND NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(pedCunts[i], SCRIPT_TASK_SMART_FLEE_PED)
|
|
TASK_SMART_FLEE_PED(pedCunts[i], PLAYER_PED_ID(), 100.0, -1)
|
|
ENDIF
|
|
|
|
ENDREPEAT
|
|
|
|
IF b_CuntPropPlayingAnim[0]
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(objCunts[CUNTPROP_CLIPBOARD], NORMAL_BLEND_OUT, TRUE)
|
|
ACTIVATE_PHYSICS(objCunts[CUNTPROP_CLIPBOARD])
|
|
b_CuntPropPlayingAnim[0] = FALSE
|
|
ENDIF
|
|
IF b_CuntPropPlayingAnim[1]
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(objCunts[CUNTPROP_CAM], NORMAL_BLEND_OUT, TRUE)
|
|
ACTIVATE_PHYSICS(objCunts[CUNTPROP_CAM])
|
|
b_CuntPropPlayingAnim[1] = FALSE
|
|
ENDIF
|
|
IF b_CuntPropPlayingAnim[2]
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(objCunts[CUNTPROP_BOOM], NORMAL_BLEND_OUT, TRUE)
|
|
ACTIVATE_PHYSICS(objCunts[CUNTPROP_BOOM])
|
|
b_CuntPropPlayingAnim[2] = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(MIKE_PED_ID())
|
|
AND DOES_ENTITY_EXIST(pedDave)
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(MIKE_PED_ID(), pedDave) >= 150
|
|
eMissionFail = FAIL_ABANDONED_DAVE
|
|
bMissionFailed = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE ST_4_DRIVE_TO_COORD_SECOND
|
|
IF DOES_ENTITY_EXIST(MIKE_PED_ID())
|
|
AND DOES_ENTITY_EXIST(pedDave)
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(MIKE_PED_ID(), pedDave) >= 150
|
|
eMissionFail = FAIL_ABANDONED_DAVE
|
|
bMissionFailed = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE ST_11_DRIVE_TO_AIRPORT
|
|
IF DOES_ENTITY_EXIST(TREV_PED_ID())
|
|
AND DOES_ENTITY_EXIST(pedVictim)
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(TREV_PED_ID(), pedVictim) >= 150
|
|
eMissionFail = FAIL_ABANDONED_MRK
|
|
bMissionFailed = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
PROC DISPLAY_CHECK() //Run every frame, sand whenever a safeWait is called. Stops the display flickering when a wait is called
|
|
|
|
IF IS_NAMED_RENDERTARGET_REGISTERED(sECGRenderTarget)
|
|
|
|
SET_TEXT_RENDER_ID(rtECG)
|
|
|
|
IF bDisplayHeartMonitor
|
|
|
|
fVictimHealth = CLAMP(fVictimHealth, 0, 100)
|
|
|
|
DRAW_RECT_FROM_CORNER(0.0, 0.0, 1.0, 1.0, 0,0,0,255)
|
|
|
|
IF sfHeartMonitor != NULL
|
|
AND HAS_SCALEFORM_MOVIE_LOADED(sfHeartMonitor)
|
|
|
|
IF NOT bECGSetup
|
|
CDEBUG1LN(DEBUG_MIKE, "ECG: Setting_Color")
|
|
BEGIN_SCALEFORM_MOVIE_METHOD(sfHeartMonitor, "SET_COLOUR")
|
|
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(9)
|
|
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(235)
|
|
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(9)
|
|
END_SCALEFORM_MOVIE_METHOD()
|
|
bECGSetup = TRUE
|
|
ENDIF
|
|
|
|
DRAW_SCALEFORM_MOVIE(sfHeartMonitor, 0.2, 0.3, 0.4, 0.6, 255, 255, 255, 255)
|
|
ELSE
|
|
bECGSetup = FALSE
|
|
ENDIF
|
|
|
|
ELSE
|
|
DRAW_RECT_FROM_CORNER(0.0, 0.0, 1.0, 1.0, 0,0,0,255)
|
|
|
|
ENDIF
|
|
|
|
SET_TEXT_RENDER_ID(rtScreen)
|
|
|
|
ENDIF
|
|
|
|
IF bDisplayToothPull
|
|
SET_TEXT_RENDER_ID(rtScreen)
|
|
IF HAS_SCALEFORM_MOVIE_LOADED(sfToothPull)
|
|
DRAW_SCALEFORM_MOVIE(sfToothPull, 0.5, 0.825, 0.2, 0.3, 255, 255, 255, iToothAlpha)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bDisplaySwitchHUD
|
|
UPDATE_SELECTOR_HUD(sSelectorPeds, FALSE, TRUE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
PROC clearText(BOOL bClearConvo = TRUE, BOOL bClearGodText = TRUE, BOOL bClearHelp = TRUE)
|
|
IF bClearConvo
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
KILL_ANY_CONVERSATION()
|
|
ENDIF
|
|
ENDIF
|
|
IF bClearGodText
|
|
IF IS_MESSAGE_BEING_DISPLAYED()
|
|
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
CLEAR_PRINTS()
|
|
ENDIF
|
|
ENDIF
|
|
IF bClearHelp
|
|
IF IS_HELP_MESSAGE_BEING_DISPLAYED()
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
STRUCT sSound
|
|
INT SoundId = -1
|
|
BOOL bHasPlayed = FALSE
|
|
BOOL bHasPlayedAtAll = FALSE
|
|
ENDSTRUCT
|
|
sSound sndList[SND_LIST_SIZE]
|
|
|
|
//PURPOSE: Plays a sound
|
|
PROC PlaySound(SOUND_LIST ListName, STRING SoundName, BOOL PlayOnce = TRUE)
|
|
IF NOT sndList[ListName].bHasPlayed
|
|
IF NOT sndList[ListName].bHasPlayedAtAll
|
|
sndList[ListName].SoundId = GET_SOUND_ID()
|
|
ENDIF
|
|
PLAY_SOUND(sndList[ListName].SoundId, SoundName)
|
|
sndList[ListName].bHasPlayedAtAll = TRUE
|
|
IF PlayOnce
|
|
sndList[ListName].bHasPlayed = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
//PURPOSE: Plays a sound from an entity
|
|
PROC PlaySoundFromEntity(SOUND_LIST ListName, STRING SoundName, ENTITY_INDEX EntityIndex, BOOL PlayOnce = TRUE, STRING strSoundSet = NULL)
|
|
IF DOES_ENTITY_EXIST(EntityIndex)
|
|
IF NOT sndList[ListName].bHasPlayed
|
|
IF NOT sndList[ListName].bHasPlayedAtAll
|
|
sndList[ListName].SoundId = GET_SOUND_ID()
|
|
ENDIF
|
|
PLAY_SOUND_FROM_ENTITY(sndList[ListName].SoundId, SoundName, EntityIndex, strSoundSet)
|
|
sndList[ListName].bHasPlayedAtAll = TRUE
|
|
IF PlayOnce
|
|
sndList[ListName].bHasPlayed = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: Has the sound played at all in the mission
|
|
FUNC BOOL HasSoundPlayed(SOUND_LIST ListName)
|
|
IF sndList[ListName].bHasPlayedAtAll
|
|
RETURN TRUE
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
//PURPOSE: Release the sound and resources
|
|
PROC ReleaseSound(SOUND_LIST ListName)
|
|
IF HasSoundPlayed(ListName)
|
|
IF sndList[ListName].SoundId != -1
|
|
IF NOT HAS_SOUND_FINISHED(sndList[ListName].SoundId)
|
|
STOP_SOUND(sndList[ListName].SoundId)
|
|
ENDIF
|
|
RELEASE_SOUND_ID(sndList[ListName].SoundId)
|
|
sndList[ListName].SoundId = -1
|
|
ENDIF
|
|
sndList[ListName].bHasPlayed = FALSE
|
|
sndList[ListName].bHasPlayedAtAll = FALSE
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC LOAD_ONESHOT(STRING strName)
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(strOneShotLoaded)
|
|
// trying to load a different one shot, cancel the prev one
|
|
IF NOT ARE_STRINGS_EQUAL(strName, strOneShotLoaded)
|
|
CANCEL_MUSIC_EVENT(strOneShotLoaded)
|
|
strOneShotLoaded = strName
|
|
PREPARE_MUSIC_EVENT(strOneShotLoaded)
|
|
ELSE
|
|
// already equal, do nothing as we are attempting to load the same sound
|
|
ENDIF
|
|
|
|
// Nothing loaded, load a new one
|
|
ELSE
|
|
strOneShotLoaded = strName
|
|
PREPARE_MUSIC_EVENT(strOneShotLoaded)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL PLAY_ONESHOT()
|
|
|
|
IF IS_STRING_NULL_OR_EMPTY(strOneShotLoaded)
|
|
SCRIPT_ASSERT("Oneshot not requested")
|
|
ELSE
|
|
IF PREPARE_MUSIC_EVENT(strOneShotLoaded)
|
|
TRIGGER_MUSIC_EVENT(strOneShotLoaded)
|
|
CDEBUG1LN(DEBUG_MIKE, "Oneshot: ", strOneShotLoaded, " played")
|
|
strOneShotLoaded = ""
|
|
RETURN TRUE
|
|
ELSE
|
|
CDEBUG1LN(DEBUG_MIKE, "Oneshot not loaded")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
//PURPOSE: Safely adds the ped to dialogue, checking if that ped is dead. if so, adds the voice ID as NULL
|
|
PROC SAFE_ADD_PED_FOR_DIALOGUE(PED_INDEX thisPed, INT thisNumberID, STRING thisVoiceID)
|
|
IF DOES_ENTITY_EXIST(thisPed)
|
|
AND NOT IS_PED_INJURED(thisPed)
|
|
ADD_PED_FOR_DIALOGUE(structConvoPeds, thisNumberID, thisPed, thisVoiceID)
|
|
ELSE
|
|
REMOVE_PED_FOR_DIALOGUE(structConvoPeds, thisNumberID)
|
|
ADD_PED_FOR_DIALOGUE(structConvoPeds, thisNumberID, NULL, thisVoiceID)
|
|
PRINTLN("Failed to add [", thisVoiceID, "] for dialogue.")
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//═════════════════════════════════╡ CUTSCENE ╞═══════════════════════════════════
|
|
|
|
//PURPOSE: Checks if the cutscene is ready to skip
|
|
FUNC BOOL ReadyToSkipCutscene()
|
|
IF TIMERB() > 1000
|
|
RETURN TRUE
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
//PURPOSE: Shakes both cameras at the same time
|
|
PROC doCamShake(CAMERA_INDEX camInit, CAMERA_INDEX camDest, STRING ShakeName, FLOAT fAmplitudeScalar = 1.0)
|
|
IF DOES_CAM_EXIST(camInit)
|
|
SHAKE_CAM(camInit, ShakeName, fAmplitudeScalar)
|
|
ENDIF
|
|
IF DOES_CAM_EXIST(camDest)
|
|
SHAKE_CAM(camDest, ShakeName, fAmplitudeScalar)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: Changes shake amplitude
|
|
PROC setCamShakeAmp(CAMERA_INDEX camInit, CAMERA_INDEX camDest, FLOAT fAmplitudeScalar = 1.0)
|
|
IF DOES_CAM_EXIST(camInit)
|
|
AND IS_CAM_SHAKING(camInit)
|
|
SET_CAM_SHAKE_AMPLITUDE(camInit, fAmplitudeScalar)
|
|
ENDIF
|
|
IF DOES_CAM_EXIST(camDest)
|
|
AND IS_CAM_SHAKING(camDest)
|
|
SET_CAM_SHAKE_AMPLITUDE(camDest, fAmplitudeScalar)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: Stops both cams shaking
|
|
PROC stopCamShake(CAMERA_INDEX camInit, CAMERA_INDEX camDest, BOOL bStopImmediately = FALSE)
|
|
IF DOES_CAM_EXIST(camInit)
|
|
STOP_CAM_SHAKING(camInit, bStopImmediately)
|
|
ENDIF
|
|
IF DOES_CAM_EXIST(camDest)
|
|
STOP_CAM_SHAKING(camDest, bStopImmediately)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: Moves a camera between Init and Dest, for as long as duration
|
|
PROC doTwoPointCam(CAMERA_INDEX &camInit, CAMERA_INDEX &camDest, VECTOR camInitCoord, VECTOR camInitRot, FLOAT camInitFOV,
|
|
VECTOR camDestCoord, VECTOR camDestRot, FLOAT camDestFOV,
|
|
INT duration, CAMERA_GRAPH_TYPE GraphType = GRAPH_TYPE_LINEAR, STRING strTwoPointCamName = null)
|
|
IF DOES_CAM_EXIST(camInit)
|
|
DETACH_CAM(camInit)
|
|
STOP_CAM_POINTING(camInit)
|
|
ELSE
|
|
camInit = CREATE_CAMERA(CAMTYPE_SCRIPTED)
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(strTwoPointCamName)
|
|
TEXT_LABEL_23 strDebug = strTwoPointCamName
|
|
strDebug += "_Init"
|
|
SET_CAM_DEBUG_NAME(camInit, strDebug)
|
|
ENDIF
|
|
ENDIF
|
|
SET_CAM_COORD(camInit, camInitCoord)
|
|
SET_CAM_ROT(camInit, camInitRot)
|
|
SET_CAM_FOV(camInit, camInitFOV)
|
|
SET_CAM_ACTIVE(camInit, TRUE)
|
|
|
|
IF DOES_CAM_EXIST(camDest)
|
|
DETACH_CAM(camDest)
|
|
STOP_CAM_POINTING(camDest)
|
|
ELSE
|
|
camDest = CREATE_CAMERA(CAMTYPE_SCRIPTED)
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(strTwoPointCamName)
|
|
TEXT_LABEL_23 strDebug = strTwoPointCamName
|
|
strDebug += "_Dest"
|
|
SET_CAM_DEBUG_NAME(camDest, strDebug)
|
|
ENDIF
|
|
ENDIF
|
|
SET_CAM_COORD(camDest, camDestCoord)
|
|
SET_CAM_ROT(camDest, camDestRot)
|
|
SET_CAM_FOV(camDest, camDestFOV)
|
|
SET_CAM_ACTIVE(camDest, FALSE)
|
|
|
|
SET_CAM_ACTIVE_WITH_INTERP(camDest, camInit, duration, GraphType, GraphType)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
ENDPROC
|
|
|
|
//PURPOSE: Sets up a camera that sways slowly between two points
|
|
PROC setupSwayCam(SWAY_CAM_STRUCT &sCam, VECTOR camInitCoord, VECTOR camInitRot, FLOAT camInitFOV,
|
|
VECTOR camDestCoord, VECTOR camDestRot, FLOAT camDestFOV,
|
|
INT swayDuration, BOOL shakeSwayCam = FALSE, STRING shakeType = NULL,
|
|
FLOAT shakeAmount = 0.0, STRING strSwayCamName = null)
|
|
IF DOES_CAM_EXIST(sCam.camInit)
|
|
DESTROY_CAM(sCam.camInit)
|
|
ENDIF
|
|
sCam.camInit = CREATE_CAMERA(CAMTYPE_SCRIPTED, FALSE)
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(strSwayCamName)
|
|
TEXT_LABEL_23 strDebug = strSwayCamName
|
|
strDebug += "_Init"
|
|
SET_CAM_DEBUG_NAME(sCam.camInit, strDebug)
|
|
ENDIF
|
|
SET_CAM_AFFECTS_AIMING(sCam.camInit, FALSE)
|
|
|
|
IF DOES_CAM_EXIST(sCam.camDest)
|
|
DESTROY_CAM(sCam.camDest)
|
|
ENDIF
|
|
sCam.camDest = CREATE_CAMERA(CAMTYPE_SCRIPTED, FALSE)
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(strSwayCamName)
|
|
TEXT_LABEL_23 strDebug = strSwayCamName
|
|
strDebug += "_Dest"
|
|
SET_CAM_DEBUG_NAME(sCam.camDest, strDebug)
|
|
ENDIF
|
|
SET_CAM_AFFECTS_AIMING(sCam.camDest, FALSE)
|
|
|
|
sCam.vCamInitCoord = camInitCoord
|
|
sCam.vCamInitRot = camInitRot
|
|
sCam.fCamInitFOV = camInitFov
|
|
sCam.vCamDestCoord = camDestCoord
|
|
sCam.vCamDestRot = camDestRot
|
|
sCam.fCamDestFOV = camDestFOV
|
|
sCam.iSwayDuration = swayDuration
|
|
sCam.bShakeSwayCam = shakeSwayCam
|
|
sCam.sShakeType = shakeType
|
|
sCam.fShakeAmount = shakeAmount
|
|
sCam.bSwayDirection = FALSE
|
|
|
|
doTwoPointCam(sCam.camInit, sCam.camDest,
|
|
sCam.vCamInitCoord, sCam.vCamInitRot, sCam.fCamInitFOV,
|
|
sCam.vCamDestCoord, sCam.vCamDestRot, sCam.fCamDestFOV,
|
|
sCam.iSwayDuration/2, GRAPH_TYPE_SIN_ACCEL_DECEL)
|
|
sCam.bSwayDirection = TRUE
|
|
IF sCam.bShakeSwayCam
|
|
doCamShake(sCam.camInit, sCam.camDest, shakeType, shakeAmount)
|
|
ENDIF
|
|
SETTIMERA(0)
|
|
ENDPROC
|
|
|
|
//PURPOSE: Updates the swaying camera
|
|
PROC doSwayCam(SWAY_CAM_STRUCT &sCam)
|
|
|
|
IF TIMERA() >= sCam.iSwayDuration/2
|
|
|
|
IF NOT DOES_CAM_EXIST(sCam.camInit)
|
|
sCam.camInit = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, sCam.vCamInitCoord, sCam.vCamInitRot, sCam.fCamInitFOV, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_CAM_SHAKING(sCam.camInit)
|
|
SHAKE_CAM(sCam.camInit, sCam.sShakeType, sCam.fShakeAmount)
|
|
ENDIF
|
|
|
|
IF NOT DOES_CAM_EXIST(sCam.camDest)
|
|
sCam.camDest = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, sCam.vCamDestCoord, sCam.vCamDestRot, sCam.fCamDestFOV, TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_CAM_SHAKING(sCam.camDest)
|
|
SHAKE_CAM(sCam.camDest, sCam.sShakeType, sCam.fShakeAmount)
|
|
ENDIF
|
|
|
|
IF sCam.bSwayDirection = FALSE
|
|
SET_CAM_ACTIVE(sCam.camInit, TRUE)
|
|
SET_CAM_ACTIVE_WITH_INTERP(sCam.camDest, sCam.camInit, sCam.iSwayDuration/2, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL)
|
|
ELSE
|
|
SET_CAM_ACTIVE(sCam.camDest, TRUE)
|
|
SET_CAM_ACTIVE_WITH_INTERP(sCam.camInit, sCam.camDest, sCam.iSwayDuration/2, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL)
|
|
ENDIF
|
|
|
|
sCam.bSwayDirection = !sCam.bSwayDirection
|
|
SETTIMERA(0)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
//═════════════════════════════════╡ Sync Scene ╞═══════════════════════════════════
|
|
//PURPOSE: Returns true if the synchronized scene has a phase less than 1
|
|
FUNC BOOL IS_SYNCHRONIZED_SCENE_PLAYING(INT sceneID)
|
|
IF sceneID != -1
|
|
AND IS_SYNCHRONIZED_SCENE_RUNNING(sceneID)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(sceneID) < 1.0
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
//PURPOSE: Returns true if the synchronized scene has a phase great or equal to 1
|
|
FUNC BOOL HAS_SYNCHRONIZED_SCENE_FINISHED(INT sceneID)
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(sceneID)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(sceneID) >= 1.0
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
//PURPOSE: Set the scene ID to -1. If the entities involved in the scene have been destroyed, the scene is deleted
|
|
PROC DESTROY_SYNCHRONIZED_SCENE(INT &sceneID)
|
|
sceneID = -1
|
|
ENDPROC
|
|
|
|
//═════════════════════════════════╡ SAFE FADE ╞═══════════════════════════════════
|
|
|
|
//PURPOSE: Only fades out if the screen is faded in
|
|
PROC SAFE_FADE_OUT(INT iTime = DEFAULT_FADE_TIME)
|
|
IF IS_SCREEN_FADED_IN()
|
|
OR IS_SCREEN_FADING_IN()
|
|
DO_SCREEN_FADE_OUT(iTime)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: Only fades in if the screen is faded out
|
|
PROC SAFE_FADE_IN(INT iTime = DEFAULT_FADE_TIME)
|
|
IF IS_SCREEN_FADED_OUT()
|
|
OR IS_SCREEN_FADING_OUT()
|
|
DO_SCREEN_FADE_IN(iTime)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//═════════════════════════════════╡ TIDY UP ╞═══════════════════════════════════
|
|
//PURPOSE: Either deletes or sets the ped as no longer needed based on bImmediately
|
|
PROC TidyUpPed(PED_INDEX &pedTidy, BOOL bImmediately = FALSE)
|
|
IF DOES_ENTITY_EXIST(pedTidy)
|
|
AND pedTidy != PLAYER_PED_ID()
|
|
IF bImmediately
|
|
IF NOT IS_ENTITY_A_MISSION_ENTITY(pedTidy)
|
|
SET_ENTITY_AS_MISSION_ENTITY(pedTidy)
|
|
ENDIF
|
|
//DELETE_PED(pedTidy)
|
|
Add_Ped_To_Cleanup_Queue(sEntityCleanupQueue, pedTidy)
|
|
ELSE
|
|
IF NOT IS_PED_INJURED(pedTidy)
|
|
// CLEAR_PED_TASKS(pedTidy)
|
|
SET_PED_KEEP_TASK(pedTidy, TRUE)
|
|
ENDIF
|
|
|
|
SET_PED_AS_NO_LONGER_NEEDED(pedTidy)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: Either deletes or sets the vehicle as no longer needed based on bImmediately
|
|
PROC TidyUpVehicle(VEHICLE_INDEX &vehTidy, BOOL bImmediately = FALSE)
|
|
IF DOES_ENTITY_EXIST(vehTidy)
|
|
|
|
IF NOT IS_ENTITY_A_MISSION_ENTITY(vehTidy)
|
|
SET_ENTITY_AS_MISSION_ENTITY(vehTidy, TRUE, TRUE)
|
|
ENDIF
|
|
|
|
IF bImmediately
|
|
AND NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehTidy)
|
|
//DELETE_VEHICLE(vehTidy)
|
|
Add_Vehicle_To_Cleanup_Queue(sEntityCleanupQueue, vehTidy)
|
|
ELSE
|
|
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehTidy)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: Either deletes or sets the object as no longer needed based on bImmediately
|
|
PROC TidyUpObject(OBJECT_INDEX &objTidy, BOOL bImmediately = FALSE)
|
|
IF DOES_ENTITY_EXIST(objTidy)
|
|
IF NOT IS_ENTITY_A_MISSION_ENTITY(objTidy)
|
|
SET_ENTITY_AS_MISSION_ENTITY(objTidy, TRUE, TRUE)
|
|
ENDIF
|
|
IF bImmediately
|
|
IF IS_ENTITY_ATTACHED(objTidy)
|
|
DETACH_ENTITY(objTidy, FALSE)
|
|
ENDIF
|
|
//DELETE_OBJECT(objTidy)
|
|
Add_Object_To_Cleanup_Queue(sEntityCleanupQueue, objTidy)
|
|
ELSE
|
|
SET_OBJECT_AS_NO_LONGER_NEEDED(objTidy)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: Registers all the peds in the mission with the dialogue file. Handles if peds are dead or alive etc.
|
|
PROC ADD_ALL_PEDS_TO_DIALOGUE()
|
|
SAFE_ADD_PED_FOR_DIALOGUE(MIKE_PED_ID(), 0, "MICHAEL")
|
|
SAFE_ADD_PED_FOR_DIALOGUE(TREV_PED_ID(), 2, "TREVOR")
|
|
SAFE_ADD_PED_FOR_DIALOGUE(pedSteve, 3, "STEVE")
|
|
SAFE_ADD_PED_FOR_DIALOGUE(pedDave, 4, "DAVE")
|
|
SAFE_ADD_PED_FOR_DIALOGUE(pedVictim, 5, "MisterK")
|
|
ENDPROC
|
|
|
|
//PURPOSE: Adds the ped to the crew group, and applies all the ped attributes
|
|
PROC SET_PED_CREW(PED_INDEX thisPed)
|
|
IF DOES_ENTITY_EXIST(thisPed)
|
|
IF NOT IS_PED_INJURED(thisPed)
|
|
SET_PED_CAN_BE_DRAGGED_OUT(thisPed, FALSE)
|
|
SET_PED_CAN_BE_TARGETTED(thisPed, FALSE)
|
|
SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(thisPed, FALSE)
|
|
//SET_ENTITY_CAN_BE_DAMAGED_BY_RELATIONSHIP_GROUP(thisPed, FALSE, RELGROUPHASH_PLAYER)
|
|
IF thisPed != PLAYER_PED_ID()
|
|
SET_PED_RELATIONSHIP_GROUP_HASH(thisPed, grpCrew)
|
|
ENDIF
|
|
SET_PED_COMBAT_ATTRIBUTES(thisPed, CA_AGGRESSIVE, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(thisPed, CA_CAN_INVESTIGATE, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(thisPed, CA_PLAY_REACTION_ANIMS, FALSE)
|
|
SET_PED_COMBAT_ATTRIBUTES(thisPed, CA_WILL_SCAN_FOR_DEAD_PEDS, FALSE)
|
|
SET_PED_ALERTNESS(thisPed, AS_NOT_ALERT)
|
|
SET_PED_COMBAT_ABILITY(thisPed, CAL_POOR)
|
|
SET_PED_COMBAT_RANGE(thisPed, CR_NEAR)
|
|
SET_PED_GENERATES_DEAD_BODY_EVENTS(thisPed, FALSE)
|
|
SET_PED_SEEING_RANGE(thisPed, 0)
|
|
SET_PED_HEARING_RANGE(thisPed, 0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: Returns true if the scene is currently being played and the phase is inbetween the two limits
|
|
FUNC BOOL IS_SCENE_AT_PHASE(SYNC_SCENES thisScene, FLOAT fPhaseStart, FLOAT fPhaseEnd)
|
|
IF syncScene[thisScene] != -1
|
|
AND IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[thisScene])
|
|
FLOAT fPhase
|
|
fPhase = GET_SYNCHRONIZED_SCENE_PHASE(syncScene[thisScene])
|
|
IF fPhase > fPhaseStart AND fPhase < fPhaseEnd
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
//═════════════════════════════════╡ CUTSCENE ╞═══════════════════════════════════
|
|
|
|
//PURPOSE: Sets Mr K back to his original look
|
|
PROC RESET_MR_K_VARIATIONS()
|
|
SET_PED_COMPONENT_VARIATION(pedVictim, PED_COMP_HEAD, 0, 1)
|
|
SET_PED_COMPONENT_VARIATION(pedVictim, PED_COMP_BERD, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(pedVictim, PED_COMP_HAIR, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(pedVictim, PED_COMP_TORSO, 1, 0)
|
|
SET_PED_COMPONENT_VARIATION(pedVictim, PED_COMP_LEG, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(pedVictim, PED_COMP_HAND, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(pedVictim, PED_COMP_FEET, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(pedVictim, PED_COMP_SPECIAL, 2, 0)
|
|
SET_PED_COMPONENT_VARIATION(pedVictim, PED_COMP_SPECIAL2, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(pedVictim, PED_COMP_DECL, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(pedVictim, PED_COMP_DECL, 0, 0)
|
|
bMrKVariations[MR_K_CABLES] = TRUE
|
|
ENDPROC
|
|
|
|
//PURPOSE: Only use this when the cutscene is going to create the peds for you. Otherwise use Register them the normal way.
|
|
PROC Register_Torture_Ped_Variations_For_Cutscene_Prestreaming(BOOL bIncludeDave, BOOL bIncludeDavesGlasses, STRING strMrKHandle, BOOL bOnlyMrK = FALSE)
|
|
|
|
// NORMAL MR K
|
|
IF iNumberOfTeethPulled = 0
|
|
Register_Ped_Variation_For_Cutscene(sCutscenePedVariationRegister, strMrKHandle, PED_COMP_TEETH, 0, 0, CS_MRK)
|
|
|
|
// TOOTHLESS VERSION MR K
|
|
ELSE
|
|
Register_Ped_Variation_For_Cutscene(sCutscenePedVariationRegister, strMrKHandle, PED_COMP_TEETH, 1, iNumberOfTeethPulled, CS_MRK)
|
|
ENDIF
|
|
|
|
// Mr K
|
|
Register_Ped_Variation_For_Cutscene(sCutscenePedVariationRegister, strMrKHandle, PED_COMP_TORSO, 1, 0, CS_MRK)
|
|
Register_Ped_Variation_For_Cutscene(sCutscenePedVariationRegister, strMrKHandle, PED_COMP_SPECIAL, 0, 0, CS_MRK)
|
|
|
|
IF bMrKVariations[MR_K_FACE_BLOODY]
|
|
Register_Ped_Variation_For_Cutscene(sCutscenePedVariationRegister, strMrKHandle, PED_COMP_HEAD, 0, 2, CS_MRK)
|
|
ELSE
|
|
Register_Ped_Variation_For_Cutscene(sCutscenePedVariationRegister, strMrKHandle, PED_COMP_HEAD, 0, 1, CS_MRK)
|
|
ENDIF
|
|
IF bMrKVariations[MR_K_LEG_BLOODY]
|
|
Register_Ped_Variation_For_Cutscene(sCutscenePedVariationRegister, strMrKHandle, PED_COMP_FEET, 1, 0, CS_MRK)
|
|
ELSE
|
|
Register_Ped_Variation_For_Cutscene(sCutscenePedVariationRegister, strMrKHandle, PED_COMP_FEET, 0, 0, CS_MRK)
|
|
ENDIF
|
|
IF bMrKVariations[MR_K_CROTCH_BLOODY]
|
|
Register_Ped_Variation_For_Cutscene(sCutscenePedVariationRegister, strMrKHandle, PED_COMP_JBIB, 1, 0, CS_MRK)
|
|
ELSE
|
|
Register_Ped_Variation_For_Cutscene(sCutscenePedVariationRegister, strMrKHandle, PED_COMP_JBIB, 0, 0, CS_MRK)
|
|
ENDIF
|
|
IF bMrKVariations[MR_K_TORSO_BLOODY]
|
|
Register_Ped_Variation_For_Cutscene(sCutscenePedVariationRegister, strMrKHandle, PED_COMP_BERD, 1, 0, CS_MRK)
|
|
ELSE
|
|
Register_Ped_Variation_For_Cutscene(sCutscenePedVariationRegister, strMrKHandle, PED_COMP_BERD, 0, 0, CS_MRK)
|
|
ENDIF
|
|
IF bMrKVariations[MR_K_NIPPLES_BURNED]
|
|
Register_Ped_Variation_For_Cutscene(sCutscenePedVariationRegister, strMrKHandle, PED_COMP_DECL, 1, 0, CS_MRK)
|
|
ELSE
|
|
Register_Ped_Variation_For_Cutscene(sCutscenePedVariationRegister, strMrKHandle, PED_COMP_DECL, 0, 0, CS_MRK)
|
|
ENDIF
|
|
|
|
IF bMrKVariations[MR_K_WET]
|
|
Register_Ped_Variation_For_Cutscene(sCutscenePedVariationRegister, strMrKHandle, PED_COMP_SPECIAL2, 1, 0, CS_MRK)
|
|
ELSE
|
|
Register_Ped_Variation_For_Cutscene(sCutscenePedVariationRegister, strMrKHandle, PED_COMP_SPECIAL2, 0, 0, CS_MRK)
|
|
ENDIF
|
|
|
|
IF NOT bOnlyMrK
|
|
|
|
Register_Ped_Variation_For_Cutscene(sCutscenePedVariationRegister, csSteve, PED_COMP_TORSO, 0, 1)
|
|
Register_Ped_Variation_For_Cutscene(sCutscenePedVariationRegister, csSteve, PED_COMP_LEG, 0, 1)
|
|
|
|
// Dave
|
|
IF bIncludeDave
|
|
|
|
PED_COMPONENT comp
|
|
PED_PROP_POSITION prop
|
|
PED_VARIATION_STRUCT sDave = GET_DAVE_VARIATIONS(bIncludeDavesGlasses)
|
|
|
|
REPEAT NUM_PED_COMPONENTS comp
|
|
Register_Ped_Variation_For_Cutscene(sCutscenePedVariationRegister, csDave, comp, sDave.iDrawableVariation[comp], sDave.iTextureVariation[comp])
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(PED_PROP_POSITION) prop
|
|
Register_Ped_Prop_For_Cutscene(sCutscenePedVariationRegister, csDave, prop, sDave.iPropIndex[prop], sDave.iPropTexture[prop])
|
|
ENDREPEAT
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: Changes Mr K based on what is happening to him
|
|
PROC MANAGE_MR_K_VARIATIONS()
|
|
|
|
IF NOT bMrKVariations[MR_K_WET]
|
|
IF IS_SCENE_AT_PHASE(SCENE_WATER_POUR, 0.339, 1.000)
|
|
bMrKVariations[MR_K_WET] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
IF bMrKVariations[MR_K_FACE_BLOODY]
|
|
IF IS_SCENE_AT_PHASE(SCENE_WATER_POUR, 0.100, 1.000)
|
|
bMrKVariations[MR_K_FACE_BLOODY] = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_SCENE_AT_PHASE(SCENE_WRENCH_RIGHT, 0.245, 0.268)
|
|
IF NOT IS_CAM_SHAKING(camTorture)
|
|
SHAKE_CAM(camTorture, "JOLT_SHAKE", 1.5)
|
|
ENDIF
|
|
|
|
IF NOT bMrKVariations[MR_K_LEG_BLOODY]
|
|
bMrKVariations[MR_K_LEG_BLOODY] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_SCENE_AT_PHASE(SCENE_WRENCH_MID, 0.186, 0.217)
|
|
IF NOT IS_CAM_SHAKING(camTorture)
|
|
SHAKE_CAM(camTorture, "JOLT_SHAKE", 1.5)
|
|
ENDIF
|
|
|
|
IF NOT bMrKVariations[MR_K_CROTCH_BLOODY]
|
|
bMrKVariations[MR_K_CROTCH_BLOODY] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_SCENE_AT_PHASE(SCENE_WRENCH_LEFT, 0.395, 0.435)
|
|
IF NOT IS_CAM_SHAKING(camTorture)
|
|
SHAKE_CAM(camTorture, "JOLT_SHAKE", 1.5)
|
|
ENDIF
|
|
|
|
IF NOT bMrKVariations[MR_K_TORSO_BLOODY]
|
|
bMrKVariations[MR_K_TORSO_BLOODY] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT bMrKVariations[MR_K_NIPPLES_BURNED]
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_ELEC_OUTRO])
|
|
OR fSmokeEvo > 0.2
|
|
bMrKVariations[MR_K_NIPPLES_BURNED] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bMrKVariations[MR_K_FACE_BLOODY]
|
|
IF IS_SCENE_AT_PHASE(SCENE_PLIERS_PULL_OUT, 0.064, 0.087)
|
|
OR IS_SCENE_AT_PHASE(SCENE_PLIERS_PULL_OUT2, 0.06, 0.082)
|
|
bMrKVariations[MR_K_FACE_BLOODY] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(pedVictim)
|
|
AND NOT IS_PED_INJURED(pedVictim)
|
|
|
|
//CPRINTLN(DEBUG_MIKE, "**** FBI3: Mr K is alive")
|
|
|
|
PED_VARIATION_STRUCT sVictimVariation
|
|
GET_PED_VARIATIONS(pedVictim, sVictimVariation)
|
|
|
|
IF bMrKVariations[MR_K_CABLES]
|
|
IF IS_CUTSCENE_ACTIVE()
|
|
SET_PED_PRELOAD_VARIATION_DATA(pedVictim, PED_COMP_SPECIAL, 2, 0)
|
|
ELSE
|
|
IF HAS_PED_PRELOAD_VARIATION_DATA_FINISHED(pedVictim)
|
|
SET_PED_COMPONENT_VARIATION(pedVictim, PED_COMP_SPECIAL, 2, 0)
|
|
RELEASE_PED_PRELOAD_VARIATION_DATA(pedVictim)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bMrKVariations[MR_K_RAG_FACE]
|
|
IF sVictimVariation.iDrawableVariation[PED_COMP_TEETH] != 2
|
|
SET_PED_COMPONENT_VARIATION(pedVictim, PED_COMP_TEETH, 2, 0)
|
|
CPRINTLN(DEBUG_MIKE, "**** FBI3: RagFace set")
|
|
ENDIF
|
|
ELSE
|
|
IF iNumberOfTeethPulled = 0
|
|
IF sVictimVariation.iDrawableVariation[PED_COMP_TEETH] != 0
|
|
SET_PED_COMPONENT_VARIATION(pedVictim, PED_COMP_TEETH, 0, 0)
|
|
CPRINTLN(DEBUG_MIKE, "**** FBI3: No teeth pulled set")
|
|
ENDIF
|
|
ELIF sVictimVariation.iDrawableVariation[PED_COMP_TEETH] != 1
|
|
OR sVictimVariation.iTextureVariation[PED_COMP_TEETH] != iNumberOfTeethPulled
|
|
SET_PED_COMPONENT_VARIATION(pedVictim, PED_COMP_TEETH, 1, iNumberOfTeethPulled)
|
|
CPRINTLN(DEBUG_MIKE, "**** FBI3: ", iNumberOfTeethPulled, " teeth pulled out set")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bMrKVariations[MR_K_FACE_BLOODY]
|
|
IF sVictimVariation.iDrawableVariation[PED_COMP_HEAD] != 0
|
|
OR sVictimVariation.iTextureVariation[PED_COMP_HEAD] != 2
|
|
SET_PED_COMPONENT_VARIATION(pedVictim, PED_COMP_HEAD, 0, 2)
|
|
CPRINTLN(DEBUG_MIKE, "**** FBI3: Bloody face set")
|
|
ENDIF
|
|
ELSE
|
|
IF sVictimVariation.iDrawableVariation[PED_COMP_HEAD] != 0
|
|
OR sVictimVariation.iTextureVariation[PED_COMP_HEAD] != 1
|
|
SET_PED_COMPONENT_VARIATION(pedVictim, PED_COMP_HEAD, 0, 1)
|
|
CPRINTLN(DEBUG_MIKE, "**** FBI3: Bloody face removed")
|
|
ENDIF
|
|
ENDIF
|
|
IF bMrKVariations[MR_K_LEG_BLOODY]
|
|
IF sVictimVariation.iDrawableVariation[PED_COMP_FEET] != 1
|
|
OR sVictimVariation.iTextureVariation[PED_COMP_FEET] != 0
|
|
SET_PED_COMPONENT_VARIATION(pedVictim, PED_COMP_FEET, 1, 0)
|
|
CPRINTLN(DEBUG_MIKE, "**** FBI3: Bloody leg set")
|
|
ENDIF
|
|
ELSE
|
|
IF sVictimVariation.iDrawableVariation[PED_COMP_FEET] != 0
|
|
OR sVictimVariation.iTextureVariation[PED_COMP_FEET] != 0
|
|
SET_PED_COMPONENT_VARIATION(pedVictim, PED_COMP_FEET, 0, 0)
|
|
CPRINTLN(DEBUG_MIKE, "**** FBI3: Bloody leg removed")
|
|
ENDIF
|
|
ENDIF
|
|
IF bMrKVariations[MR_K_CROTCH_BLOODY]
|
|
IF sVictimVariation.iDrawableVariation[PED_COMP_JBIB] != 1
|
|
OR sVictimVariation.iTextureVariation[PED_COMP_JBIB] != 0
|
|
SET_PED_COMPONENT_VARIATION(pedVictim, PED_COMP_JBIB, 1, 0)
|
|
CPRINTLN(DEBUG_MIKE, "**** FBI3: Bloody crotch set")
|
|
ENDIF
|
|
ELSE
|
|
IF sVictimVariation.iDrawableVariation[PED_COMP_JBIB] != 0
|
|
OR sVictimVariation.iTextureVariation[PED_COMP_JBIB] != 0
|
|
SET_PED_COMPONENT_VARIATION(pedVictim, PED_COMP_JBIB, 0, 0)
|
|
CPRINTLN(DEBUG_MIKE, "**** FBI3: Bloody crotch removed")
|
|
ENDIF
|
|
ENDIF
|
|
IF bMrKVariations[MR_K_TORSO_BLOODY]
|
|
IF sVictimVariation.iDrawableVariation[PED_COMP_BERD] != 1
|
|
OR sVictimVariation.iTextureVariation[PED_COMP_BERD] != 0
|
|
SET_PED_COMPONENT_VARIATION(pedVictim, PED_COMP_BERD, 1, 0)
|
|
CPRINTLN(DEBUG_MIKE, "**** FBI3: Bloody torso set")
|
|
ENDIF
|
|
ELSE
|
|
IF sVictimVariation.iDrawableVariation[PED_COMP_BERD] != 0
|
|
OR sVictimVariation.iTextureVariation[PED_COMP_BERD] != 0
|
|
SET_PED_COMPONENT_VARIATION(pedVictim, PED_COMP_BERD, 0, 0)
|
|
CPRINTLN(DEBUG_MIKE, "**** FBI3: Bloody torso removed")
|
|
ENDIF
|
|
ENDIF
|
|
IF bMrKVariations[MR_K_NIPPLES_BURNED]
|
|
IF sVictimVariation.iDrawableVariation[PED_COMP_DECL] != 1
|
|
OR sVictimVariation.iTextureVariation[PED_COMP_DECL] != 0
|
|
SET_PED_COMPONENT_VARIATION(pedVictim, PED_COMP_DECL, 1, 0)
|
|
CPRINTLN(DEBUG_MIKE, "**** FBI3: Nipples burnt set")
|
|
ENDIF
|
|
ELSE
|
|
IF sVictimVariation.iDrawableVariation[PED_COMP_DECL] != 0
|
|
OR sVictimVariation.iTextureVariation[PED_COMP_DECL] != 0
|
|
SET_PED_COMPONENT_VARIATION(pedVictim, PED_COMP_DECL, 0, 0)
|
|
CPRINTLN(DEBUG_MIKE, "**** FBI3: Nipples burnt removed")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bMrKVariations[MR_K_WET]
|
|
IF sVictimVariation.iDrawableVariation[PED_COMP_SPECIAL2] != 1
|
|
OR sVictimVariation.iTextureVariation[PED_COMP_SPECIAL2] != 0
|
|
SET_PED_COMPONENT_VARIATION(pedVictim, PED_COMP_SPECIAL2, 1, 0)
|
|
CPRINTLN(DEBUG_MIKE, "**** FBI3: Wet face set")
|
|
ENDIF
|
|
ELSE
|
|
IF sVictimVariation.iDrawableVariation[PED_COMP_SPECIAL2] != 0
|
|
OR sVictimVariation.iTextureVariation[PED_COMP_SPECIAL2] != 0
|
|
SET_PED_COMPONENT_VARIATION(pedVictim, PED_COMP_SPECIAL2, 0, 0)
|
|
CPRINTLN(DEBUG_MIKE, "**** FBI3: Wet face removed")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DRIVE_HandleDriveConvo_MikeWithDave(STRING strMainConvo, VECTOR vDriveEndLocation, FLOAT fDistanceCutOff)
|
|
|
|
// Don't start the handling of Daves conversation until Dave has gotten in the vehicle
|
|
IF NOT bDriveConversationFlags[0]
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(pedDave)
|
|
iDriveStoppedTimer = GET_GAME_TIMER() + 5000
|
|
iDriveComplaintTimer = -1
|
|
str_InteruptedRoot = strMainConvo
|
|
bDriveConversationFlags[0] = TRUE
|
|
|
|
PRINTLN( "*** FBI 3 *** - ", "DAVE ENTERED CAR, SETTING INITIAL CONVO SETTING")
|
|
ENDIF
|
|
ELSE
|
|
|
|
// No stored conversation
|
|
IF IS_STRING_NULL_OR_EMPTY(str_InteruptedRoot)
|
|
AND IS_STRING_NULL_OR_EMPTY(str_InteruptedLabel)
|
|
|
|
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
|
|
OR (NOT IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND NOT IS_PED_SITTING_IN_ANY_VEHICLE(pedDave))
|
|
OR NOT IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
OR (NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND IS_VEHICLE_ALMOST_STOPPED(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())))
|
|
IF iDriveStoppedTimer = -1
|
|
iDriveStoppedTimer = GET_GAME_TIMER() + 2000
|
|
ENDIF
|
|
ELSE
|
|
iDriveStoppedTimer = -1
|
|
ENDIF
|
|
|
|
// Stop the current conversation if there is one on going
|
|
IF iDriveStoppedTimer != -1
|
|
AND GET_GAME_TIMER() > iDriveStoppedTimer
|
|
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
str_InteruptedRoot = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_ROOT()
|
|
str_InteruptedLabel = GET_STANDARD_CONVERSATION_LABEL_FOR_FUTURE_RESUMPTION()
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ELSE
|
|
str_InteruptedRoot = "NOCONVO"
|
|
str_InteruptedLabel = "NOCONVO"
|
|
ENDIF
|
|
IF NOT bDriveConversationFlags[1]
|
|
iDriveComplaintTimer = -1
|
|
bDriveConversationFlags[2] = FALSE
|
|
ELSE
|
|
iDriveComplaintTimer = -2
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// There is a conversation stored
|
|
ELSE
|
|
|
|
// check if we can resume the stored conversation
|
|
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) <= 0
|
|
AND IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
AND IS_PED_SITTING_IN_ANY_VEHICLE(pedDave)
|
|
AND NOT IS_VEHICLE_ALMOST_STOPPED(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
|
|
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ELSE
|
|
// start the drive to convo
|
|
IF NOT bDriveConversationFlags[1]
|
|
AND NOT ARE_STRINGS_EQUAL(str_InteruptedRoot, "NOCONVO")
|
|
IF NOT bDriveConversationFlags[2]
|
|
iDriveStoppedTimer = -1
|
|
bDriveConversationFlags[2] = TRUE
|
|
ENDIF
|
|
IF iDriveStoppedTimer = -1
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(MIKE_PED_ID())
|
|
AND IS_PED_SITTING_IN_VEHICLE(pedDave, GET_VEHICLE_PED_IS_IN(MIKE_PED_ID()))
|
|
iDriveStoppedTimer = GET_GAME_TIMER() + 5000
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELIF GET_GAME_TIMER() > iDriveStoppedTimer
|
|
|
|
RunConversation(str_InteruptedRoot)
|
|
str_InteruptedRoot = ""
|
|
str_InteruptedLabel = ""
|
|
bDriveConversationFlags[1] = TRUE
|
|
iDriveStoppedTimer = GET_GAME_TIMER()
|
|
|
|
ENDIF
|
|
|
|
// There is a conversation to resume
|
|
ELIF NOT IS_STRING_NULL_OR_EMPTY(str_InteruptedRoot)
|
|
AND NOT IS_STRING_NULL_OR_EMPTY(str_InteruptedLabel)
|
|
AND NOT ARE_STRINGS_EQUAL(str_InteruptedRoot, "NOCONVO")
|
|
AND NOT ARE_STRINGS_EQUAL(str_InteruptedLabel, "NOCONVO")
|
|
|
|
IF iDriveStoppedTimer = -1
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(MIKE_PED_ID())
|
|
AND IS_PED_SITTING_IN_VEHICLE(pedDave, GET_VEHICLE_PED_IS_IN(MIKE_PED_ID()))
|
|
iDriveStoppedTimer = GET_GAME_TIMER() + 2000
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELIF GET_GAME_TIMER() > iDriveStoppedTimer
|
|
|
|
RunConversation(str_InteruptedRoot, str_InteruptedLabel)
|
|
str_InteruptedRoot = ""
|
|
str_InteruptedLabel = ""
|
|
|
|
ENDIF
|
|
|
|
// Theres no covno to resume
|
|
ELSE
|
|
str_InteruptedRoot = ""
|
|
str_InteruptedLabel = ""
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Can't resume it, check if we can do a complaint from dave and which one to do
|
|
ELSE
|
|
bDriveConversationFlags[2] = FALSE
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
|
|
PRINTLN( "*** FBI 3 *** - ", "SETTING COMPLAINT DELAY")
|
|
|
|
IF iDriveComplaintTimer = -2
|
|
iDriveComplaintTimer = GET_GAME_TIMER() + 1000
|
|
PRINTLN( "*** FBI 3 *** - ", "SETTING COMPLAINT DELAY TO 1 SECOND")
|
|
|
|
ELIF iDriveComplaintTimer = -1
|
|
iDriveComplaintTimer = GET_GAME_TIMER() + 20000
|
|
PRINTLN( "*** FBI 3 *** - ", "SETTING COMPLAINT DELAY TO 20 SECONDS")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
|
|
IF iDriveComplaintTimer >= 0
|
|
AND GET_GAME_TIMER() > iDriveComplaintTimer
|
|
|
|
// wanted level complaint
|
|
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
|
|
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedDave, "FBI3_DLAA", "Dave", SPEECH_PARAMS_FORCE_NORMAL)
|
|
iDriveComplaintTimer = -1
|
|
|
|
PRINTLN( "*** FBI 3 *** - ", "PLAYING WANTED COMPLAINT")
|
|
|
|
ELIF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vDriveEndLocation) > fDistanceCutoff
|
|
// not got a vehicle complaint
|
|
IF NOT IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
AND NOT IS_PED_SITTING_IN_ANY_VEHICLE(pedDave)
|
|
AND iNeedVehicleUses < 2
|
|
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedDave, "NEED_A_VEHICLE", "Dave", SPEECH_PARAMS_FORCE_NORMAL)
|
|
iDriveComplaintTimer = -1
|
|
iNeedVehicleUses++
|
|
|
|
PRINTLN( "*** FBI 3 *** - ", "PLAYING NEED VEHICLE COMPLAINT")
|
|
|
|
// dave waiting for michael to get in or to drive.
|
|
ELIF NOT IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
OR IS_VEHICLE_ALMOST_STOPPED(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
|
|
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedDave, "FBI3_DKAA", "Dave", SPEECH_PARAMS_FORCE_NORMAL)
|
|
iDriveComplaintTimer = -1
|
|
|
|
PRINTLN( "*** FBI 3 *** - ", "PLAYING HURRY UP COMPLAINT")
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
INT iAssetRequests
|
|
|
|
PROC MANAGE_REAL_CUNTS_SCENE()
|
|
|
|
// STREAM IN/OUT the wrong location scene
|
|
//----------------------------------------------
|
|
|
|
// Stream in
|
|
IF NOT DOES_ENTITY_EXIST(pedCunts[0])
|
|
|
|
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_BlipRockfordHillsHouse) < 300
|
|
|
|
SWITCH iAssetRequests
|
|
CASE 0
|
|
Load_Asset_Model(sAssetData, mnCuntActorM)
|
|
iAssetRequests++
|
|
BREAK
|
|
CASE 1
|
|
IF HAS_MODEL_LOADED(mnCuntActorM)
|
|
Load_Asset_Model(sAssetData, mnCuntActorF)
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 2
|
|
IF HAS_MODEL_LOADED(mnCuntActorF)
|
|
Load_Asset_Model(sAssetData, mnCuntCrewM)
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 3
|
|
IF HAS_MODEL_LOADED(mnCuntCrewM)
|
|
Load_Asset_Model(sAssetData, mnCuntCrewF)
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 4
|
|
IF HAS_MODEL_LOADED(mnCuntCrewF)
|
|
Load_Asset_Model(sAssetData, mnCuntCam)
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 5
|
|
IF HAS_MODEL_LOADED(mnCuntCam)
|
|
Load_Asset_Model(sAssetData, mnCuntBoom)
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 6
|
|
IF HAS_MODEL_LOADED(mnCuntBoom)
|
|
Load_Asset_Model(sAssetData, mnCuntClipboard)
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 7
|
|
IF HAS_MODEL_LOADED(mnCuntClipboard)
|
|
Load_Asset_AnimDict(sAssetData, adWrongHouse)
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 8
|
|
IF HAS_ANIM_DICT_LOADED(adWrongHouse)
|
|
|
|
pedCunts[CUNTPED_ACTOR_M] = CREATE_PED(PEDTYPE_MISSION, mnCuntActorM, <<-887.3506, -12.2818, 42.1914>>, 224.8453)
|
|
pedCunts[CUNTPED_ACTOR_F] = CREATE_PED(PEDTYPE_MISSION, mnCuntActorF, <<-887.3506, -12.2818, 42.1914>>, 224.8453)
|
|
|
|
pedCunts[CUNTPED_CREW_PRODUCER] = CREATE_PED(PEDTYPE_MISSION, mnCuntCrewF, <<-887.3506, -12.2818, 42.1914>>, 224.8453)
|
|
pedCunts[CUNTPED_CREW_CAM_GUY] = CREATE_PED(PEDTYPE_MISSION, mnCuntCrewM, <<-887.3506, -12.2818, 42.1914>>, 224.8453)
|
|
pedCunts[CUNTPED_CREW_SOUND_GUY] = CREATE_PED(PEDTYPE_MISSION, mnCuntCrewM, <<-887.3506, -12.2818, 42.1914>>, 224.8453)
|
|
|
|
MISSION_PED_FLAGS i
|
|
FOR i = CUNTPED_ACTOR_M TO CUNTPED_CREW_PRODUCER
|
|
//SET_PED_CONFIG_FLAG( pedCunts[i], PCF_DisableShockingDrivingOnPavementEvents, FALSE )
|
|
SET_PED_CAN_EVASIVE_DIVE( pedCunts[i], FALSE )
|
|
ENDFOR
|
|
|
|
objCunts[CUNTPROP_CLIPBOARD] = CREATE_OBJECT(mnCuntClipboard, <<-887.3506, -12.2818, 42.1914>>)
|
|
objCunts[CUNTPROP_CAM] = CREATE_OBJECT(mnCuntCam, <<-887.3506, -12.2818, 42.1914>>)
|
|
objCunts[CUNTPROP_BOOM] = CREATE_OBJECT(mnCuntBoom, <<-887.3506, -12.2818, 42.1914>>)
|
|
|
|
Unload_Asset_Model(sAssetData, mnCuntActorM)
|
|
Unload_Asset_Model(sAssetData, mnCuntActorF)
|
|
Unload_Asset_Model(sAssetData, mnCuntCrewM)
|
|
Unload_Asset_Model(sAssetData, mnCuntCrewF)
|
|
Unload_Asset_Model(sAssetData, mnCuntCam)
|
|
Unload_Asset_Model(sAssetData, mnCuntBoom)
|
|
Unload_Asset_Model(sAssetData, mnCuntClipboard)
|
|
|
|
syncScene[SCENE_CUNTS] = CREATE_SYNCHRONIZED_SCENE(v_CuntsSceneCoord, v_CuntsSceneHeading)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(syncScene[SCENE_CUNTS], TRUE)
|
|
|
|
TASK_SYNCHRONIZED_SCENE(pedCunts[CUNTPED_ACTOR_M], syncScene[SCENE_CUNTS], adWrongHouse, "base_guy", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
TASK_SYNCHRONIZED_SCENE(pedCunts[CUNTPED_ACTOR_F], syncScene[SCENE_CUNTS], adWrongHouse, "base_gal", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
|
|
TASK_SYNCHRONIZED_SCENE(pedCunts[CUNTPED_CREW_PRODUCER], syncScene[SCENE_CUNTS], adWrongHouse, "base_prod", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
TASK_SYNCHRONIZED_SCENE(pedCunts[CUNTPED_CREW_CAM_GUY], syncScene[SCENE_CUNTS], adWrongHouse, "base_cman", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
TASK_SYNCHRONIZED_SCENE(pedCunts[CUNTPED_CREW_SOUND_GUY], syncScene[SCENE_CUNTS], adWrongHouse, "base_sman", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objCunts[CUNTPROP_CLIPBOARD], syncScene[SCENE_CUNTS], "base_clip", adWrongHouse, INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objCunts[CUNTPROP_CAM], syncScene[SCENE_CUNTS], "base_vcam", adWrongHouse, INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objCunts[CUNTPROP_BOOM], syncScene[SCENE_CUNTS], "base_bmik", adWrongHouse, INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
|
|
INIT_SYNCH_SCENE_AUDIO_WITH_POSITION("FBI_3_FIRST_ACTION", v_CuntsSceneCoord)
|
|
|
|
|
|
|
|
b_CuntPropPlayingAnim[0] = TRUE
|
|
b_CuntPropPlayingAnim[1] = TRUE
|
|
b_CuntPropPlayingAnim[2] = TRUE
|
|
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
// Steam out
|
|
ELSE
|
|
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_BlipRockfordHillsHouse) > 350
|
|
|
|
INT i
|
|
REPEAT COUNT_OF(pedCunts) i
|
|
IF NOT DOES_ENTITY_EXIST(pedCunts[i])
|
|
DELETE_PED(pedCunts[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(objCunts) i
|
|
IF DOES_ENTITY_EXIST(objCunts[i])
|
|
DELETE_OBJECT(objCunts[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
Unload_Asset_Model(sAssetData, mnCuntActorM)
|
|
Unload_Asset_Model(sAssetData, mnCuntActorF)
|
|
Unload_Asset_Model(sAssetData, mnCuntCrewF)
|
|
Unload_Asset_Model(sAssetData, mnCuntCrewM)
|
|
Unload_Asset_Model(sAssetData, mnCuntCam)
|
|
Unload_Asset_Model(sAssetData, mnCuntBoom)
|
|
Unload_Asset_Model(sAssetData, mnCuntClipboard)
|
|
Unload_Asset_Anim_Dict(sAssetData, adWrongHouse)
|
|
|
|
iAssetRequests = 0
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Play anims
|
|
IF DOES_ENTITY_EXIST(pedCunts[0])
|
|
|
|
SWITCH i_realCuntsStage
|
|
CASE 1
|
|
IF PREPARE_SYNCHRONIZED_AUDIO_EVENT("FBI_3_FIRST_ACTION", 0)
|
|
syncScene[SCENE_CUNTS] = CREATE_SYNCHRONIZED_SCENE(v_CuntsSceneCoord, v_CuntsSceneHeading)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(syncScene[SCENE_CUNTS], FALSE)
|
|
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(syncScene[SCENE_CUNTS], TRUE)
|
|
|
|
TASK_SYNCHRONIZED_SCENE(pedCunts[CUNTPED_ACTOR_M], syncScene[SCENE_CUNTS], adWrongHouse, "first_action_guy", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
TASK_SYNCHRONIZED_SCENE(pedCunts[CUNTPED_ACTOR_F], syncScene[SCENE_CUNTS], adWrongHouse, "first_action_gal", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
|
|
TASK_SYNCHRONIZED_SCENE(pedCunts[CUNTPED_CREW_PRODUCER], syncScene[SCENE_CUNTS], adWrongHouse, "first_action_prod", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
TASK_SYNCHRONIZED_SCENE(pedCunts[CUNTPED_CREW_CAM_GUY], syncScene[SCENE_CUNTS], adWrongHouse, "first_action_cman", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
TASK_SYNCHRONIZED_SCENE(pedCunts[CUNTPED_CREW_SOUND_GUY], syncScene[SCENE_CUNTS], adWrongHouse, "first_action_sman", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objCunts[CUNTPROP_CLIPBOARD], syncScene[SCENE_CUNTS], "first_action_clip", adWrongHouse, INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objCunts[CUNTPROP_CAM], syncScene[SCENE_CUNTS], "first_action_vcam", adWrongHouse, INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objCunts[CUNTPROP_BOOM], syncScene[SCENE_CUNTS], "first_action_bmik", adWrongHouse, INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
|
|
PLAY_SYNCHRONIZED_AUDIO_EVENT(syncScene[SCENE_CUNTS])
|
|
|
|
i_realCuntsStage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 2
|
|
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(syncScene[SCENE_CUNTS])
|
|
OR GET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_CUNTS]) >= 1.0
|
|
|
|
syncScene[SCENE_CUNTS] = CREATE_SYNCHRONIZED_SCENE(v_CuntsSceneCoord, v_CuntsSceneHeading)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(syncScene[SCENE_CUNTS], TRUE)
|
|
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(syncScene[SCENE_CUNTS], TRUE)
|
|
|
|
TASK_SYNCHRONIZED_SCENE(pedCunts[CUNTPED_ACTOR_M], syncScene[SCENE_CUNTS], adWrongHouse, "final_loop_guy", SLOW_BLEND_IN, NORMAL_BLEND_OUT)
|
|
TASK_SYNCHRONIZED_SCENE(pedCunts[CUNTPED_ACTOR_F], syncScene[SCENE_CUNTS], adWrongHouse, "final_loop_gal", SLOW_BLEND_IN, NORMAL_BLEND_OUT)
|
|
|
|
TASK_SYNCHRONIZED_SCENE(pedCunts[CUNTPED_CREW_PRODUCER], syncScene[SCENE_CUNTS], adWrongHouse, "final_loop_prod", SLOW_BLEND_IN, NORMAL_BLEND_OUT)
|
|
TASK_SYNCHRONIZED_SCENE(pedCunts[CUNTPED_CREW_CAM_GUY], syncScene[SCENE_CUNTS], adWrongHouse, "final_loop_cman", SLOW_BLEND_IN, NORMAL_BLEND_OUT)
|
|
TASK_SYNCHRONIZED_SCENE(pedCunts[CUNTPED_CREW_SOUND_GUY], syncScene[SCENE_CUNTS], adWrongHouse, "final_loop_sman", SLOW_BLEND_IN, NORMAL_BLEND_OUT)
|
|
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objCunts[CUNTPROP_CLIPBOARD], syncScene[SCENE_CUNTS], "final_loop_clip", adWrongHouse, SLOW_BLEND_IN, NORMAL_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objCunts[CUNTPROP_CAM], syncScene[SCENE_CUNTS], "final_loop_vcam", adWrongHouse, SLOW_BLEND_IN, NORMAL_BLEND_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objCunts[CUNTPROP_BOOM], syncScene[SCENE_CUNTS], "final_loop_bmik", adWrongHouse, SLOW_BLEND_IN, NORMAL_BLEND_OUT)
|
|
|
|
i_realCuntsStage++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL TORTURE_IsValidTortureScene(SYNC_SCENES eScene)
|
|
SWITCH eScene
|
|
CASE SCENE_ELEC_IDLE FALLTHRU
|
|
CASE SCENE_ELEC_LEFT_GRIP FALLTHRU
|
|
CASE SCENE_ELEC_OUTRO FALLTHRU
|
|
CASE SCENE_ELEC_RIGHT_GRIP FALLTHRU
|
|
CASE SCENE_ELEC_SHOCK FALLTHRU
|
|
CASE SCENE_ELEC_SPARK FALLTHRU
|
|
CASE SCENE_PLIERS_ATTACH FALLTHRU
|
|
CASE SCENE_PLIERS_IDLE FALLTHRU
|
|
CASE SCENE_PLIERS_PULL_HARD FALLTHRU
|
|
CASE SCENE_PLIERS_PULL_OUT FALLTHRU
|
|
CASE SCENE_PLIERS_PULL_OUT2 FALLTHRU
|
|
CASE SCENE_PLIERS_PULL_WEAK FALLTHRU
|
|
CASE SCENE_PLIERS_READY_IN FALLTHRU
|
|
CASE SCENE_PLIERS_READY_LOOP FALLTHRU
|
|
CASE SCENE_PLIERS_READY_OUT FALLTHRU
|
|
CASE SCENE_SYRINGE_IDLE FALLTHRU
|
|
CASE SCENE_SYRINGE_USE FALLTHRU
|
|
CASE SCENE_WATER_FLIP FALLTHRU
|
|
CASE SCENE_WATER_IDLE FALLTHRU
|
|
CASE SCENE_WATER_PRE_OUTRO FALLTHRU
|
|
CASE SCENE_WATER_OUTRO FALLTHRU
|
|
CASE SCENE_WATER_POUR FALLTHRU
|
|
CASE SCENE_WATER_POUR_TO_READY FALLTHRU
|
|
CASE SCENE_WATER_READY_TO_POUR FALLTHRU
|
|
CASE SCENE_WATER_READY FALLTHRU
|
|
CASE SCENE_WRENCH_IDLE FALLTHRU
|
|
CASE SCENE_WRENCH_LEFT FALLTHRU
|
|
CASE SCENE_WRENCH_MID FALLTHRU
|
|
CASE SCENE_WRENCH_RIGHT FALLTHRU
|
|
CASE SCENE_WEAPON_SELECT_IDLE FALLTHRU
|
|
CASE SCENE_WEAPON_SELECT_PICKUP_CLIP0 FALLTHRU
|
|
CASE SCENE_WEAPON_SELECT_PICKUP_PLIERS FALLTHRU
|
|
CASE SCENE_WEAPON_SELECT_PICKUP_SYRINGE FALLTHRU
|
|
CASE SCENE_WEAPON_SELECT_PICKUP_WATER FALLTHRU
|
|
CASE SCENE_WEAPON_SELECT_PICKUP_WRENCH
|
|
RETURN TRUE
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
STRUCT TORTURE_ANIM_DATA
|
|
STRING strAnimDict
|
|
STRING strTrevor
|
|
STRING strMrK
|
|
STRING strSteve
|
|
STRING strCam
|
|
STRING strWeapon
|
|
STRING strChair
|
|
STRING strECG
|
|
STRING strRag
|
|
STRING strTapeLH
|
|
STRING strTapeRH
|
|
STRING strBenchPositionerWrench
|
|
STRING strBenchPositionerClip0
|
|
STRING strBenchPositionerClip1
|
|
STRING strBenchPositionerJerrycan
|
|
STRING strBenchPositionerPliers
|
|
STRING strBenchPositionerBattery
|
|
STRING strBenchPositionerTrolley
|
|
STRING strBenchPositionerSyringe
|
|
STRING strBenchPositionerRag
|
|
STRING strWeaponSelectionOverride
|
|
BOOL bSeparateSynSceneTrevor = FALSE // when doing the weapon select we don't want to include trevor in the sync scene
|
|
BOOL bSeparateSynSceneMrK = FALSE // used when Mr K is playing his fidgeting loop
|
|
BOOL bAttachWeaponProp = TRUE // attach the weapon prop to the player's prop bone
|
|
BOOL bForceUpdateDueToCut = FALSE // a camera cut occurs here so force an update on the peds AI and ANIMATION
|
|
BOOL bScriptedAnimationTask = FALSE // indicates for this scene that a Trevor and Mr K will run a script anim task
|
|
|
|
ENDSTRUCT
|
|
|
|
FUNC BOOL TORTURE_GetTortureSceneAnimData(SYNC_SCENES eScene, TORTURE_ANIM_DATA &sAnimData)
|
|
|
|
IF TORTURE_IsValidTortureScene(eScene)
|
|
|
|
SWITCH eScene
|
|
// >>>> ELECTRICUTE SCENES
|
|
CASE SCENE_ELEC_IDLE
|
|
CASE SCENE_ELEC_LEFT_GRIP
|
|
CASE SCENE_ELEC_RIGHT_GRIP
|
|
CASE SCENE_ELEC_BOTH_GRIP
|
|
CASE SCENE_ELEC_SHOCK
|
|
sAnimData.StrAnimDict = "MISSFBI3_electrocute"
|
|
BREAK
|
|
|
|
CASE SCENE_ELEC_SPARK
|
|
sAnimData.StrAnimDict = "MISSFBI3_electrocute"
|
|
sAnimData.strTrevor = "Electrocute_Spark_Player"
|
|
sAnimData.strMrk = "Electrocute_Spark_Victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Electrocute_Spark_Cam"
|
|
sAnimData.strWeapon = "Electrocute_Spark"
|
|
sAnimData.strChair = ""
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = ""
|
|
sAnimData.strTapeLH = "Electrocute_Spark_hand_l"
|
|
sAnimData.strTapeRH = "Electrocute_Spark_hand_r"
|
|
sAnimData.bForceUpdateDueToCut = FALSE
|
|
BREAK
|
|
CASE SCENE_ELEC_OUTRO
|
|
sAnimData.StrAnimDict = "MISSFBI3_electrocute"
|
|
sAnimData.strTrevor = "Electrocute_Both_Outro_Player"
|
|
sAnimData.strMrk = "Electrocute_Both_Outro_Victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Electrocute_Both_Outro_Cam"
|
|
sAnimData.strWeapon = "Electrocute_Both_Outro"
|
|
sAnimData.strChair = "Electrocute_Both_Outro_Chair"
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = ""
|
|
sAnimData.strTapeLH = "Electrocute_Both_Outro_hand_l"
|
|
sAnimData.strTapeRH = "Electrocute_Both_Outro_hand_r"
|
|
sAnimData.bForceUpdateDueToCut = TRUE
|
|
BREAK
|
|
|
|
// >>> PLIER SCENES/TOOTH PULL
|
|
CASE SCENE_PLIERS_IDLE
|
|
sAnimData.StrAnimDict = "MISSFBI3_TOOTHPULL"
|
|
sAnimData.strTrevor = "Pull_Tooth_Idle_Player"
|
|
sAnimData.strMrk = "Pull_Tooth_Idle_Victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Pull_Tooth_Idle_Cam"
|
|
sAnimData.strWeapon = "Pull_Tooth_Idle_Pliers"
|
|
sAnimData.strChair = ""
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = ""
|
|
sAnimData.strTapeLH = "Pull_Tooth_Idle_hand_l"
|
|
sAnimData.strTapeRH = "Pull_Tooth_Idle_hand_r"
|
|
sAnimData.bForceUpdateDueToCut = FALSE
|
|
BREAK
|
|
CASE SCENE_PLIERS_ATTACH
|
|
sAnimData.StrAnimDict = "MISSFBI3_TOOTHPULL"
|
|
sAnimData.strTrevor = "Pull_Tooth_Intro_Player"
|
|
sAnimData.strMrk = "Pull_Tooth_Intro_Victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Pull_Tooth_Intro_Cam"
|
|
sAnimData.strWeapon = "Pull_Tooth_Intro_Pliers"
|
|
sAnimData.strChair = ""
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = ""
|
|
sAnimData.strTapeLH = "Pull_Tooth_Intro_hand_l"
|
|
sAnimData.strTapeRH = "Pull_Tooth_Intro_hand_r"
|
|
sAnimData.bForceUpdateDueToCut = FALSE
|
|
BREAK
|
|
CASE SCENE_PLIERS_PULL_WEAK
|
|
sAnimData.StrAnimDict = "MISSFBI3_TOOTHPULL"
|
|
sAnimData.strTrevor = "Pull_Tooth_Loop_Weak_Player"
|
|
sAnimData.strMrk = "Pull_Tooth_Loop_Weak_Victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Pull_Tooth_Loop_Weak_Cam"
|
|
sAnimData.strWeapon = "Pull_Tooth_Loop_Weak_Pliers"
|
|
sAnimData.strChair = ""
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = ""
|
|
sAnimData.strTapeLH = "Pull_Tooth_Loop_Weak_hand_l"
|
|
sAnimData.strTapeRH = "Pull_Tooth_Loop_Weak_hand_r"
|
|
sAnimData.bForceUpdateDueToCut = FALSE
|
|
sAnimData.bScriptedAnimationTask = TRUE
|
|
BREAK
|
|
CASE SCENE_PLIERS_PULL_HARD
|
|
sAnimData.StrAnimDict = "MISSFBI3_TOOTHPULL"
|
|
sAnimData.strTrevor = "Pull_Tooth_Loop_Player"
|
|
sAnimData.strMrk = "Pull_Tooth_Loop_Victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Pull_Tooth_Loop_Cam"
|
|
sAnimData.strWeapon = "Pull_Tooth_Loop_Pliers"
|
|
sAnimData.strChair = ""
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = ""
|
|
sAnimData.strTapeLH = "Pull_Tooth_Loop_hand_l"
|
|
sAnimData.strTapeRH = "Pull_Tooth_Loop_hand_r"
|
|
sAnimData.bForceUpdateDueToCut = FALSE
|
|
sAnimData.bScriptedAnimationTask = TRUE
|
|
BREAK
|
|
CASE SCENE_PLIERS_PULL_OUT
|
|
sAnimData.StrAnimDict = "MISSFBI3_TOOTHPULL"
|
|
sAnimData.strTrevor = "Pull_Tooth_Outro_Player"
|
|
sAnimData.strMrk = "Pull_Tooth_Outro_Victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Pull_Tooth_Outro_Cam"
|
|
sAnimData.strWeapon = "Pull_Tooth_Outro_Pliers"
|
|
sAnimData.strChair = "Pull_Tooth_Outro_Chair"
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = ""
|
|
sAnimData.strTapeLH = "Pull_Tooth_Outro_hand_l"
|
|
sAnimData.strTapeRH = "Pull_Tooth_Outro_hand_r"
|
|
sAnimData.bForceUpdateDueToCut = FALSE
|
|
BREAK
|
|
CASE SCENE_PLIERS_PULL_OUT2
|
|
sAnimData.StrAnimDict = "MISSFBI3_TOOTHPULL"
|
|
sAnimData.strTrevor = "Pull_Tooth_Outro_B_Player"
|
|
sAnimData.strMrk = "Pull_Tooth_Outro_B_Victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Pull_Tooth_Outro_B_Cam"
|
|
sAnimData.strWeapon = "Pull_Tooth_Outro_B_Pliers"
|
|
sAnimData.strChair = ""
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = ""
|
|
sAnimData.strTapeLH = "Pull_Tooth_Outro_B_hand_l"
|
|
sAnimData.strTapeRH = "Pull_Tooth_Outro_B_hand_r"
|
|
sAnimData.bForceUpdateDueToCut = FALSE
|
|
BREAK
|
|
CASE SCENE_PLIERS_READY_IN
|
|
sAnimData.StrAnimDict = "MISSFBI3_TOOTHPULL"
|
|
sAnimData.strTrevor = "Pull_Tooth_Ready_Intro_Player"
|
|
sAnimData.strMrk = "Pull_Tooth_Ready_Intro_Victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Pull_Tooth_Ready_Intro_Cam"
|
|
sAnimData.strWeapon = "Pull_Tooth_Ready_Intro_Pliers"
|
|
sAnimData.strChair = ""
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = ""
|
|
sAnimData.strTapeLH = "Pull_Tooth_Ready_Intro_hand_l"
|
|
sAnimData.strTapeRH = "Pull_Tooth_Ready_Intro_hand_r"
|
|
sAnimData.bForceUpdateDueToCut = FALSE
|
|
BREAK
|
|
CASE SCENE_PLIERS_READY_LOOP
|
|
sAnimData.StrAnimDict = "MISSFBI3_TOOTHPULL"
|
|
sAnimData.strTrevor = "Pull_Tooth_Ready_Loop_Player"
|
|
sAnimData.strMrk = "Pull_Tooth_Ready_Loop_Victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Pull_Tooth_Ready_Loop_Cam"
|
|
sAnimData.strWeapon = "Pull_Tooth_Ready_Loop_Pliers"
|
|
sAnimData.strChair = ""
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = ""
|
|
sAnimData.strTapeLH = "Pull_Tooth_Ready_Loop_hand_l"
|
|
sAnimData.strTapeRH = "Pull_Tooth_Ready_Loop_hand_r"
|
|
sAnimData.bForceUpdateDueToCut = FALSE
|
|
|
|
BREAK
|
|
CASE SCENE_PLIERS_READY_OUT
|
|
sAnimData.StrAnimDict = "MISSFBI3_TOOTHPULL"
|
|
sAnimData.strTrevor = "Pull_Tooth_Ready_Outro_Player"
|
|
sAnimData.strMrk = "Pull_Tooth_Ready_Outro_Victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Pull_Tooth_Ready_Outro_Cam"
|
|
sAnimData.strWeapon = "Pull_Tooth_Ready_Outro_Pliers"
|
|
sAnimData.strChair = ""
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = ""
|
|
sAnimData.strTapeLH = "Pull_Tooth_Ready_Outro_hand_l"
|
|
sAnimData.strTapeRH = "Pull_Tooth_Ready_Outro_hand_r"
|
|
sAnimData.bForceUpdateDueToCut = FALSE
|
|
BREAK
|
|
// >>> SYRINGE
|
|
CASE SCENE_SYRINGE_IDLE
|
|
sAnimData.StrAnimDict = "MISSFBI3_SYRINGE"
|
|
sAnimData.strTrevor = "Syringe_Idle_Player"
|
|
sAnimData.strMrk = "flatline_loop_Victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Syringe_Idle_Cam"
|
|
sAnimData.strWeapon = ""
|
|
sAnimData.strChair = "flatline_loop_chair"
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = ""
|
|
sAnimData.strTapeLH = "flatline_loop_hand_l"
|
|
sAnimData.strTapeRH = "flatline_loop_hand_r"
|
|
sAnimData.bForceUpdateDueToCut = TRUE
|
|
BREAK
|
|
CASE SCENE_SYRINGE_USE
|
|
sAnimData.strAnimDict = "MISSFBI3_SYRINGE"
|
|
sAnimData.strTrevor = "Syringe_Use_Player"
|
|
sAnimData.strMrk = "Syringe_Use_Victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Syringe_Use_Cam"
|
|
sAnimData.strWeapon = ""
|
|
sAnimData.strChair = "Syringe_Use_Chair"
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = ""
|
|
sAnimData.strTapeLH = "Syringe_Use_hand_l"
|
|
sAnimData.strTapeRH = "Syringe_Use_hand_r"
|
|
sAnimData.bForceUpdateDueToCut = TRUE
|
|
BREAK
|
|
// >>>> WATERBOARD
|
|
CASE SCENE_WATER_FLIP
|
|
sAnimData.strAnimDict = "MISSFBI3_WATERBOARD"
|
|
sAnimData.strTrevor = "Waterboard_kick_Player"
|
|
sAnimData.strMrk = "Waterboard_Kick_Victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Waterboard_Kick_Cam"
|
|
sAnimData.strWeapon = ""
|
|
sAnimData.strChair = "Waterboard_Kick_Chair"
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = "Waterboard_Kick_Rag"
|
|
sAnimData.strTapeLH = "Waterboard_Kick_hand_l"
|
|
sAnimData.strTapeRH = "Waterboard_Kick_hand_r"
|
|
sAnimData.bForceUpdateDueToCut = TRUE
|
|
BREAK
|
|
CASE SCENE_WATER_IDLE
|
|
sAnimData.strAnimDict = "MISSFBI3_WATERBOARD"
|
|
sAnimData.strTrevor = "Waterboard_Idle_Player"
|
|
sAnimData.strMrk = "Waterboard_Idle_Victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Waterboard_Idle_Cam"
|
|
sAnimData.strWeapon = ""
|
|
sAnimData.strChair = "Waterboard_Idle_Chair"
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = "Waterboard_Idle_Rag"
|
|
sAnimData.strTapeLH = "Waterboard_Idle_hand_l"
|
|
sAnimData.strTapeRH = "Waterboard_Idle_hand_r"
|
|
sAnimData.bForceUpdateDueToCut = FALSE
|
|
BREAK
|
|
CASE SCENE_WATER_PRE_OUTRO
|
|
sAnimData.strAnimDict = "MISSFBI3_WATERBOARD"
|
|
sAnimData.strTrevor = "Waterboard_Loop_To_Ready_Player"
|
|
sAnimData.strMrk = "Waterboard_Loop_Victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Waterboard_Loop_Cam"
|
|
sAnimData.strWeapon = ""
|
|
sAnimData.strChair = "Waterboard_Loop_Chair"
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = "Waterboard_Loop_Rag"
|
|
sAnimData.strTapeLH = "Waterboard_Loop_hand_l"
|
|
sAnimData.strTapeRH = "Waterboard_Loop_hand_r"
|
|
sAnimData.bForceUpdateDueToCut = FALSE
|
|
sAnimData.bSeparateSynSceneMrK = TRUE
|
|
BREAK
|
|
CASE SCENE_WATER_OUTRO
|
|
sAnimData.strAnimDict = "MISSFBI3_WATERBOARD"
|
|
sAnimData.strTrevor = "Waterboard_Outro_Player"
|
|
sAnimData.strMrk = "Waterboard_Outro_Victim"
|
|
sAnimData.strSteve = "Waterboard_Outro_Steve"
|
|
sAnimData.strCam = "Waterboard_Outro_Cam"
|
|
sAnimData.strWeapon = ""
|
|
sAnimData.strChair = "Waterboard_Outro_Chair"
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = "Waterboard_Outro_Rag"
|
|
sAnimData.strTapeLH = "Waterboard_Outro_hand_l"
|
|
sAnimData.strTapeRH = "Waterboard_Outro_hand_r"
|
|
sAnimData.bForceUpdateDueToCut = TRUE
|
|
BREAK
|
|
CASE SCENE_WATER_POUR
|
|
sAnimData.strAnimDict = "MISSFBI3_WATERBOARD"
|
|
sAnimData.strTrevor = "Waterboard_Loop_Player"
|
|
sAnimData.strMrk = "Waterboard_Loop_Victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Waterboard_Loop_Cam"
|
|
sAnimData.strWeapon = ""
|
|
sAnimData.strChair = "Waterboard_Loop_Chair"
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = "Waterboard_Loop_Rag"
|
|
sAnimData.strTapeLH = "Waterboard_Loop_hand_l"
|
|
sAnimData.strTapeRH = "Waterboard_Loop_hand_r"
|
|
sAnimData.bForceUpdateDueToCut = TRUE
|
|
BREAK
|
|
CASE SCENE_WATER_READY_TO_POUR
|
|
sAnimData.strAnimDict = "MISSFBI3_WATERBOARD"
|
|
sAnimData.strTrevor = "Waterboard_Ready_To_Loop_Player"
|
|
sAnimData.strMrk = "Waterboard_Ready_Loop_Victim" //"Waterboard_Ready_To_Loop_Victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Waterboard_Ready_To_Loop_Cam"
|
|
sAnimData.strWeapon = ""
|
|
sAnimData.strChair = "Waterboard_Ready_Loop_Chair" //"Waterboard_Ready_To_Loop_Chair"
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = "Waterboard_Ready_To_Loop_Rag"
|
|
sAnimData.strTapeLH = "Waterboard_Ready_Loop_hand_l" //"Waterboard_Ready_To_Loop_hand_l"
|
|
sAnimData.strTapeRH = "Waterboard_Ready_Loop_hand_r" //"Waterboard_Ready_To_Loop_hand_r"
|
|
sAnimData.bForceUpdateDueToCut = FALSE
|
|
sAnimData.bSeparateSynSceneMrK = TRUE
|
|
BREAK
|
|
CASE SCENE_WATER_POUR_TO_READY
|
|
sAnimData.strAnimDict = "MISSFBI3_WATERBOARD"
|
|
sAnimData.strTrevor = "Waterboard_Loop_To_Ready_Player"
|
|
sAnimData.strMrk = "Waterboard_Ready_Loop_Victim" //"Waterboard_Loop_To_Ready_Victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Waterboard_Loop_To_Ready_Cam"
|
|
sAnimData.strWeapon = ""
|
|
sAnimData.strChair = "Waterboard_Ready_Loop_Chair" //"Waterboard_Loop_To_Ready_Chair"
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = "Waterboard_Loop_To_Ready_Rag"
|
|
sAnimData.strTapeLH = "Waterboard_Ready_Loop_hand_l" //"Waterboard_Loop_To_Ready_hand_l"
|
|
sAnimData.strTapeRH = "Waterboard_Ready_Loop_hand_r" //"Waterboard_Loop_To_Ready_hand_r"
|
|
sAnimData.bForceUpdateDueToCut = TRUE
|
|
sAnimData.bSeparateSynSceneMrK = TRUE
|
|
BREAK
|
|
CASE SCENE_WATER_READY
|
|
sAnimData.strAnimDict = "MISSFBI3_WATERBOARD"
|
|
sAnimData.strTrevor = "Waterboard_Ready_Loop_Player"
|
|
sAnimData.strMrk = "Waterboard_Ready_Loop_Victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Waterboard_Ready_Loop_Cam"
|
|
sAnimData.strWeapon = ""
|
|
sAnimData.strChair = "Waterboard_Ready_Loop_Chair"
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = "Waterboard_Ready_Loop_Rag"
|
|
sAnimData.strTapeLH = "Waterboard_Ready_Loop_hand_l"
|
|
sAnimData.strTapeRH = "Waterboard_Ready_Loop_hand_r"
|
|
sAnimData.bForceUpdateDueToCut = FALSE
|
|
BREAK
|
|
// >>>> WRENCH ATTACK
|
|
CASE SCENE_WRENCH_IDLE
|
|
sAnimData.strAnimDict = "MISSFBI3_WRENCH"
|
|
sAnimData.strTrevor = "Wrench_Idle_Player"
|
|
sAnimData.strMrk = "Wrench_Idle_Victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Wrench_Idle_Cam"
|
|
sAnimData.strWeapon = "Wrench_Idle_Wrench"
|
|
sAnimData.strChair = "Wrench_Idle_Chair"
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = ""
|
|
sAnimData.strTapeLH = "Wrench_Idle_hand_l"
|
|
sAnimData.strTapeRH = "Wrench_Idle_hand_r"
|
|
sAnimData.bForceUpdateDueToCut = TRUE
|
|
sAnimData.bAttachWeaponProp = FALSE
|
|
BREAK
|
|
CASE SCENE_WRENCH_LEFT
|
|
sAnimData.strAnimDict = "MISSFBI3_WRENCH"
|
|
sAnimData.strTrevor = "Wrench_Attack_Left_Player"
|
|
sAnimData.strMrk = "Wrench_Attack_Left_Victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Wrench_Attack_Left_Cam"
|
|
sAnimData.strWeapon = "Wrench_Attack_Left_Wrench"
|
|
sAnimData.strChair = "Wrench_Attack_Left_Chair"
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = ""
|
|
sAnimData.strTapeLH = "Wrench_Attack_Left_hand_l"
|
|
sAnimData.strTapeRH = "Wrench_Attack_Left_hand_r"
|
|
sAnimData.bForceUpdateDueToCut = TRUE
|
|
sAnimData.bAttachWeaponProp = FALSE
|
|
BREAK
|
|
CASE SCENE_WRENCH_MID
|
|
sAnimData.strAnimDict = "MISSFBI3_WRENCH"
|
|
sAnimData.strTrevor = "Wrench_Attack_Mid_Player"
|
|
sAnimData.strMrk = "Wrench_Attack_Mid_Victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Wrench_Attack_Mid_Cam"
|
|
sAnimData.strWeapon = "Wrench_Attack_Mid_Wrench"
|
|
sAnimData.strChair = "Wrench_Attack_Mid_Chair"
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = ""
|
|
sAnimData.strTapeLH = "Wrench_Attack_Mid_hand_l"
|
|
sAnimData.strTapeRH = "Wrench_Attack_Mid_hand_r"
|
|
sAnimData.bForceUpdateDueToCut = TRUE
|
|
sAnimData.bAttachWeaponProp = FALSE
|
|
BREAK
|
|
CASE SCENE_WRENCH_RIGHT
|
|
sAnimData.strAnimDict = "MISSFBI3_WRENCH"
|
|
sAnimData.strTrevor = "Wrench_Attack_Right_Player"
|
|
sAnimData.strMrk = "Wrench_Attack_Right_Victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Wrench_Attack_Right_Cam"
|
|
sAnimData.strWeapon = "Wrench_Attack_Right_Wrench"
|
|
sAnimData.strChair = "Wrench_Attack_Right_Chair"
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = ""
|
|
sAnimData.strTapeLH = "Wrench_Attack_Right_hand_l"
|
|
sAnimData.strTapeRH = "Wrench_Attack_Right_hand_r"
|
|
sAnimData.bForceUpdateDueToCut = TRUE
|
|
sAnimData.bAttachWeaponProp = FALSE
|
|
BREAK
|
|
// >>> WEAPON SELECTION
|
|
CASE SCENE_WEAPON_SELECT_IDLE
|
|
sAnimData.strAnimDict = "MISSFBI3_WEAPON_SELECT"
|
|
sAnimData.strTrevor = "Weapon_Select_Loop"
|
|
sAnimData.strMrk = "waterboard_idle_victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = ""
|
|
sAnimData.strWeapon = ""
|
|
sAnimData.strChair = "waterboard_idle_chair"
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = ""
|
|
sAnimData.strTapeLH = "waterboard_idle_hand_l"
|
|
sAnimData.strTapeRH = "waterboard_idle_hand_r"
|
|
sAnimData.bSeparateSynSceneTrevor = TRUE
|
|
sAnimData.bSeparateSynSceneMrK = FALSE
|
|
sAnimData.bForceUpdateDueToCut = TRUE
|
|
sAnimData.bAttachWeaponProp = FALSE
|
|
sAnimData.strBenchPositionerWrench = "weapon_select_bench_wrench"
|
|
sAnimData.strBenchPositionerClip0 = "weapon_select_bench_clip1"
|
|
sAnimData.strBenchPositionerClip1 = "weapon_select_bench_clip2"
|
|
sAnimData.strBenchPositionerJerrycan = "weapon_select_bench_can"
|
|
sAnimData.strBenchPositionerPliers = "weapon_select_bench_pliers"
|
|
sAnimData.strBenchPositionerBattery = "weapon_select_bench_battery"
|
|
sAnimData.strBenchPositionerTrolley = "weapon_select_bench_bench"
|
|
sAnimData.strBenchPositionerSyringe = "weapon_select_bench_syringe"
|
|
sAnimData.strBenchPositionerRag = "weapon_select_bench_rag"
|
|
BREAK
|
|
CASE SCENE_WEAPON_SELECT_PICKUP_CLIP0
|
|
sAnimData.strAnimDict = "MISSFBI3_WEAPON_SELECT"
|
|
sAnimData.strTrevor = "Weapon_Select_Electrocute_Player"
|
|
sAnimData.strMrk = "waterboard_idle_Victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Weapon_Select_Electrocute_Cam"
|
|
sAnimData.strWeapon = "Weapon_Select_Electrocute"
|
|
sAnimData.strChair = "waterboard_idle_chair"
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = ""
|
|
sAnimData.strTapeLH = "waterboard_idle_hand_l"
|
|
sAnimData.strTapeRH = "waterboard_idle_hand_r"
|
|
sAnimData.bSeparateSynSceneTrevor = FALSE
|
|
sAnimData.bSeparateSynSceneMrK = TRUE
|
|
sAnimData.bForceUpdateDueToCut = TRUE
|
|
sAnimData.bAttachWeaponProp = FALSE
|
|
BREAK
|
|
CASE SCENE_WEAPON_SELECT_PICKUP_PLIERS
|
|
sAnimData.strAnimDict = "MISSFBI3_WEAPON_SELECT"
|
|
sAnimData.strTrevor = "Weapon_Select_Pliers_Player"
|
|
sAnimData.strMrk = "weapon_select_pliers_victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Weapon_Select_Pliers_Cam"
|
|
sAnimData.strWeapon = "Weapon_Select_Pliers_Pliers"
|
|
sAnimData.strChair = ""
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = ""
|
|
sAnimData.strTapeLH = "Weapon_Select_Pliers_hand_l"
|
|
sAnimData.strTapeRH = "Weapon_Select_Pliers_hand_r"
|
|
sAnimData.bSeparateSynSceneTrevor = FALSE
|
|
sAnimData.bSeparateSynSceneMrK = FALSE
|
|
sAnimData.bForceUpdateDueToCut = TRUE
|
|
sAnimData.bAttachWeaponProp = FALSE
|
|
sAnimData.strBenchPositionerWrench = "weapon_bench_toothpull_wrench"
|
|
sAnimData.strBenchPositionerClip0 = "weapon_bench_toothpull_clip1"
|
|
sAnimData.strBenchPositionerClip1 = "weapon_bench_toothpull_clip2"
|
|
sAnimData.strBenchPositionerJerrycan = "weapon_bench_toothpull_can"
|
|
sAnimData.strBenchPositionerPliers = "" // OMITTED
|
|
sAnimData.strBenchPositionerBattery = "weapon_bench_toothpull_battery"
|
|
sAnimData.strBenchPositionerTrolley = "weapon_bench_toothpull_trolley"
|
|
sAnimData.strBenchPositionerSyringe = "weapon_bench_toothpull_syringe"
|
|
sAnimData.strBenchPositionerRag = "weapon_bench_toothpull_rag"
|
|
BREAK
|
|
CASE SCENE_WEAPON_SELECT_PICKUP_SYRINGE
|
|
sAnimData.strAnimDict = "MISSFBI3_SYRINGE"
|
|
sAnimData.strTrevor = "Weapon_Select_Syringe_Player" //"flatline_intro_player"
|
|
sAnimData.strMrk = "flatline_intro_victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Weapon_Select_Syringe_Cam" //"flatline_intro_cam"
|
|
sAnimData.strWeapon = ""
|
|
sAnimData.strChair = "flatline_intro_chair"
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = ""
|
|
sAnimData.strTapeLH = "flatline_intro_hand_l"
|
|
sAnimData.strTapeRH = "flatline_intro_hand_r"
|
|
sAnimData.bSeparateSynSceneTrevor = FALSE
|
|
sAnimData.bSeparateSynSceneMrK = FALSE
|
|
sAnimData.bScriptedAnimationTask = FALSE
|
|
sAnimData.bAttachWeaponProp = TRUE
|
|
sAnimData.strBenchPositionerWrench = "weapon_bench_syringe_wrench"
|
|
sAnimData.strBenchPositionerClip0 = "weapon_bench_syringe_clip1"
|
|
sAnimData.strBenchPositionerClip1 = "weapon_bench_syringe_clip2"
|
|
sAnimData.strBenchPositionerJerrycan = "weapon_bench_syringe_can"
|
|
sAnimData.strBenchPositionerPliers = "weapon_bench_syringe_pliers"
|
|
sAnimData.strBenchPositionerBattery = "weapon_bench_syringe_battery"
|
|
sAnimData.strBenchPositionerTrolley = "weapon_bench_syringe_trolley"
|
|
sAnimData.strBenchPositionerSyringe = "" // OMITTED
|
|
sAnimData.strBenchPositionerRag = "weapon_bench_syringe_rag"
|
|
BREAK
|
|
CASE SCENE_WEAPON_SELECT_PICKUP_WATER
|
|
sAnimData.strAnimDict = "MISSFBI3_WEAPON_SELECT"
|
|
sAnimData.strTrevor = "Weapon_Select_Waterboard_Player"
|
|
sAnimData.strMrk = "waterboard_idle_victim"//"Weapon_Select_Waterboard_Victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Weapon_Select_Waterboard_Cam"
|
|
sAnimData.strWeapon = "Weapon_Select_Waterboard_jerryCan"
|
|
sAnimData.strChair = "waterboard_idle_chair" //"Weapon_Select_Waterboard_Chair"
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = "Weapon_Select_Waterboard_rag"
|
|
sAnimData.strTapeLH = "waterboard_idle_hand_l"//"Weapon_Select_Waterboard_Hand_L"
|
|
sAnimData.strTapeRH = "waterboard_idle_hand_r"//"Weapon_Select_Waterboard_Hand_R"
|
|
sAnimData.bSeparateSynSceneTrevor = FALSE
|
|
sAnimData.bSeparateSynSceneMrK = TRUE
|
|
sAnimData.bForceUpdateDueToCut = TRUE
|
|
sAnimData.bAttachWeaponProp = FALSE
|
|
sAnimData.strBenchPositionerWrench = "weapon_bench_waterboard_wrench"
|
|
sAnimData.strBenchPositionerClip0 = "weapon_bench_waterboard_clip1"
|
|
sAnimData.strBenchPositionerClip1 = "weapon_bench_waterboard_clip2"
|
|
sAnimData.strBenchPositionerJerrycan = "" // OMITTED
|
|
sAnimData.strBenchPositionerPliers = "weapon_bench_waterboard_pliers"
|
|
sAnimData.strBenchPositionerBattery = "weapon_bench_waterboard_battery"
|
|
sAnimData.strBenchPositionerTrolley = "weapon_bench_waterboard_trolley"
|
|
sAnimData.strBenchPositionerSyringe = "weapon_bench_waterboard_syringe"
|
|
sAnimData.strBenchPositionerRag = ""
|
|
BREAK
|
|
CASE SCENE_WEAPON_SELECT_PICKUP_WRENCH
|
|
sAnimData.strAnimDict = "MISSFBI3_WEAPON_SELECT"
|
|
sAnimData.strTrevor = "Weapon_Select_Wrench_Player"
|
|
sAnimData.strMrk = "waterboard_idle_victim"
|
|
sAnimData.strSteve = ""
|
|
sAnimData.strCam = "Weapon_Select_Wrench_Cam"
|
|
sAnimData.strWeapon = "Weapon_Select_Wrench_Wrench"
|
|
sAnimData.strChair = "waterboard_idle_chair"
|
|
sAnimData.strECG = ""
|
|
sAnimData.strRag = ""
|
|
sAnimData.strTapeLH = "waterboard_idle_hand_l"
|
|
sAnimData.strTapeRH = "waterboard_idle_hand_r"
|
|
sAnimData.bSeparateSynSceneTrevor = FALSE
|
|
sAnimData.bSeparateSynSceneMrK = TRUE
|
|
sAnimData.bForceUpdateDueToCut = TRUE
|
|
sAnimData.bAttachWeaponProp = FALSE
|
|
sAnimData.strBenchPositionerWrench = "" // OMMITED
|
|
sAnimData.strBenchPositionerClip0 = "weapon_bench_wrench_clip1"
|
|
sAnimData.strBenchPositionerClip1 = "weapon_bench_wrench_clip2"
|
|
sAnimData.strBenchPositionerJerrycan = "weapon_bench_wrench_can"
|
|
sAnimData.strBenchPositionerPliers = "weapon_bench_wrench_pliers"
|
|
sAnimData.strBenchPositionerBattery = "weapon_bench_wrench_battery"
|
|
sAnimData.strBenchPositionerTrolley = "weapon_bench_wrench_trolley"
|
|
sAnimData.strBenchPositionerSyringe = "weapon_bench_wrench_syringe"
|
|
sAnimData.strBenchPositionerRag = "weapon_bench_wrench_rag"
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC TORTURE_StopTortureWeaponAnim(sMenuObject &thisObject, FLOAT blendDelta)
|
|
|
|
IF thisObject.bHasPlayedAnim
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(thisObject.strLastPlayedDict)
|
|
AND NOT IS_STRING_NULL_OR_EMPTY(thisObject.strLastPlayedAnim)
|
|
IF IS_ENTITY_PLAYING_ANIM(thisObject.objObject, thisObject.strLastPlayedDict, thisObject.strLastPlayedAnim)
|
|
STOP_ENTITY_ANIM(thisObject.objObject, thisObject.strLastPlayedAnim, thisObject.strLastPlayedDict, blendDelta)
|
|
thisObject.bHasPlayedAnim = FALSE
|
|
ENDIF
|
|
ELSE
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(thisObject.objObject, blendDelta, FALSE)
|
|
thisObject.bHasPlayedAnim = FALSE
|
|
ENDIF
|
|
|
|
thisObject.strLastPlayedDict = ""
|
|
thisObject.strLastPlayedAnim = ""
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL TORTURE_PlaySyncScene(SYNC_SCENES eScene, BOOL bLoop = FALSE, FLOAT StartPhase = 0.0,
|
|
FLOAT BlendInDelta = INSTANT_BLEND_IN, FLOAT BlendOutDelta = INSTANT_BLEND_OUT,
|
|
SYNCED_SCENE_PLAYBACK_FLAGS PlaybackFlagsTorture = SYNCED_SCENE_NONE, SYNCED_SCENE_PLAYBACK_FLAGS PlaybackFlagsVictim = SYNCED_SCENE_NONE)
|
|
|
|
IF TORTURE_IsValidTortureScene(eScene)
|
|
AND NOT bPlayedTortureSceneLastFrame
|
|
AND NOT bPlayedTortureSceneThisFrame
|
|
|
|
TORTURE_ANIM_DATA sAnimData
|
|
IF TORTURE_GetTortureSceneAnimData(eScene, sAnimData)
|
|
AND NOT sAnimData.bScriptedAnimationTask
|
|
|
|
CPRINTLN(DEBUG_MIKE, "\n")
|
|
CPRINTLN(DEBUG_MIKE, "[*** TORTURE SYNCED SCENE ***]")
|
|
CPRINTLN(DEBUG_MIKE, " Scene Info")
|
|
CPRINTLN(DEBUG_MIKE, " AnimDict : ", sAnimData.strAnimDict)
|
|
CPRINTLN(DEBUG_MIKE, " Trevor : ", sAnimData.strTrevor)
|
|
CPRINTLN(DEBUG_MIKE, " Mr. K : ", sAnimData.strMrK)
|
|
CPRINTLN(DEBUG_MIKE, " Steve : ", sAnimData.strSteve)
|
|
CPRINTLN(DEBUG_MIKE, " Cam : ", sAnimData.strCam)
|
|
CPRINTLN(DEBUG_MIKE, " Weapon : ", sAnimData.strWeapon)
|
|
CPRINTLN(DEBUG_MIKE, " Chair : ", sAnimData.strChair)
|
|
CPRINTLN(DEBUG_MIKE, " ECG : ", sAnimData.strECG)
|
|
CPRINTLN(DEBUG_MIKE, " Rag : ", sAnimData.strRag)
|
|
CPRINTLN(DEBUG_MIKE, " Tape LH : ", sAnimData.strTapeLH)
|
|
CPRINTLN(DEBUG_MIKE, " Tape RH : ", sAnimData.strTapeRH)
|
|
CPRINTLN(DEBUG_MIKE, " EXTRA Wrench : ", sAnimData.strBenchPositionerWrench)
|
|
CPRINTLN(DEBUG_MIKE, " EXTRA Clip0 : ", sAnimData.strBenchPositionerClip0)
|
|
CPRINTLN(DEBUG_MIKE, " EXTRA Clip1 : ", sAnimData.strBenchPositionerClip1)
|
|
CPRINTLN(DEBUG_MIKE, " EXTRA JerryCan : ", sAnimData.strBenchPositionerJerrycan)
|
|
CPRINTLN(DEBUG_MIKE, " EXTRA Pliers : ", sAnimData.strBenchPositionerPliers)
|
|
CPRINTLN(DEBUG_MIKE, " EXTRA Battery : ", sAnimData.strBenchPositionerBattery)
|
|
CPRINTLN(DEBUG_MIKE, " EXTRA Trolley : ", sAnimData.strBenchPositionerTrolley)
|
|
CPRINTLN(DEBUG_MIKE, " EXTRA Trolley : ", sAnimData.strBenchPositionerSyringe)
|
|
CPRINTLN(DEBUG_MIKE, " EXTRA Trolley : ", sAnimData.strBenchPositionerRag)
|
|
|
|
CPRINTLN(DEBUG_MIKE, " Separate Sync Scene Trevor : ", sAnimData.bSeparateSynSceneTrevor)
|
|
CPRINTLN(DEBUG_MIKE, " Separate Sync Scene Mr K : ", sAnimData.bSeparateSynSceneMrK)
|
|
CPRINTLN(DEBUG_MIKE, " Force ped AI and ANIM update : ", sAnimData.bForceUpdateDueToCut)
|
|
CPRINTLN(DEBUG_MIKE, " Scripted Anim Task : ", sAnimData.bScriptedAnimationTask,"\n")
|
|
|
|
CPRINTLN(DEBUG_MIKE, " BLEND IN : ", BlendInDelta)
|
|
CPRINTLN(DEBUG_MIKE, " BLEND OUT : ", BlendOutDelta)
|
|
CPRINTLN(DEBUG_MIKE, " Attach weapon to PH : ", sAnimData.bAttachWeaponProp)
|
|
|
|
CPRINTLN(DEBUG_MIKE, "\n")
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
AND NOT bDoSkip
|
|
//BlendOutDelta = INSTANT_BLEND_OUT
|
|
BlendInDelta = INSTANT_BLEND_IN
|
|
sAnimData.bForceUpdateDueToCut = TRUE
|
|
SAFE_FADE_IN(DEFAULT_FADE_TIME_SHORT)
|
|
ENDIF
|
|
|
|
syncScene[eScene] = CREATE_SYNCHRONIZED_SCENE(vTortureScene, vTortureRot)
|
|
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(syncScene[eScene], TRUE)
|
|
|
|
// Mr K needs to play in a separate scync scene as hes using a loop of a different length
|
|
IF sAnimData.bSeparateSynSceneMrK
|
|
syncScene[SCENE_EXTRA_MR_K_FIDGET] = CREATE_SYNCHRONIZED_SCENE(vTortureScene, vTortureRot)
|
|
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(syncScene[SCENE_EXTRA_MR_K_FIDGET], TRUE)
|
|
ENDIF
|
|
|
|
// <<<<<<<<<<<<<< Trevor >>>>>>>>>>>>>>>
|
|
//---------------------------------------------------------
|
|
SET_PED_CURRENT_WEAPON_VISIBLE(TREV_PED_ID(), FALSE)
|
|
|
|
// Specific anims
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sAnimData.strTrevor)
|
|
IF NOT sAnimData.bSeparateSynSceneTrevor
|
|
|
|
TASK_SYNCHRONIZED_SCENE(TREV_PED_ID(), syncScene[eScene], sAnimData.strAnimDict, sAnimData.strTrevor, BlendInDelta, BlendOutDelta, PlaybackFlagsTorture)
|
|
|
|
// Weapon select idle
|
|
ELSE
|
|
TORTURE_ANIM_DATA sAnimDataTrevor
|
|
IF TORTURE_GetTortureSceneAnimData(SCENE_WEAPON_SELECT_IDLE, sAnimDataTrevor)
|
|
AND ARE_STRINGS_EQUAL(sAnimData.strAnimDict, sAnimDataTrevor.strAnimDict)
|
|
TASK_PLAY_ANIM_ADVANCED(TREV_PED_ID(),
|
|
sAnimDataTrevor.strAnimDict,
|
|
sAnimDataTrevor.strTrevor,
|
|
<< 144.053, -2203.052, 4.706 >>, << 0.000, 0.000, 180.000 >>,
|
|
INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1,
|
|
AF_NOT_INTERRUPTABLE | AF_OVERRIDE_PHYSICS | AF_EXTRACT_INITIAL_OFFSET | AF_LOOPING, 0.0)
|
|
|
|
ELSE
|
|
SCRIPT_ASSERT("NO SPECIFIC ANIMS NOR IS WEAPON SELECT IDLE LOADED FOR TREVOR!")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// <<<<<<<<<<<<<< Victim - Mr K >>>>>>>>>>>>>>>
|
|
//---------------------------------------------------------
|
|
|
|
SYNC_SCENES eMrKScene
|
|
IF sAnimData.bSeparateSynSceneMrK
|
|
eMrKScene = SCENE_EXTRA_MR_K_FIDGET
|
|
ELSE
|
|
eMrKScene = eScene
|
|
ENDIF
|
|
|
|
IF NOT IS_STRING_NULL(sAnimData.strMrK)
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(pedVictim, sAnimData.strAnimDict, sAnimData.strMrK, ANIM_DEFAULT)
|
|
TASK_SYNCHRONIZED_SCENE(pedVictim, syncScene[eMrKScene], sAnimData.strAnimDict, sAnimData.strMrK, BlendInDelta, BlendOutDelta, PlaybackFlagsVictim)
|
|
ENDIF
|
|
ELSE
|
|
SCRIPT_ASSERT("MR K HAS NO ANIM, HE MUST HAVE AN ANIM AT THIS POINT OF THE TORTURE")
|
|
ENDIF
|
|
|
|
// <<<<<<<<<<<<<< Chair >>>>>>>>>>>>>>>
|
|
//---------------------------------------------------------
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sAnimData.strChair)
|
|
IF IS_ENTITY_ATTACHED(objChair)
|
|
DETACH_ENTITY(objChair, FALSE)
|
|
ENDIF
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(objChair, sAnimData.strAnimDict, sAnimData.strChair, ANIM_DEFAULT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objChair, syncScene[eMrKScene], sAnimData.strChair, sAnimData.strAnimDict, BlendInDelta, BlendOutDelta, enum_to_int(PlaybackFlagsVictim))
|
|
bHasChairPlayedAnim = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF IS_ENTITY_ATTACHED(objChair)
|
|
DETACH_ENTITY(objChair, FALSE)
|
|
ENDIF
|
|
|
|
IF bHasChairPlayedAnim
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(objChair, BlendOutDelta, FALSE)
|
|
bHasChairPlayedAnim = FALSE
|
|
ENDIF
|
|
|
|
SET_ENTITY_COORDS(objChair, vChairCoords)
|
|
SET_ENTITY_ROTATION(objChair, vChairRot)
|
|
ENDIF
|
|
|
|
// <<<<<<<<<<<<<< Restraints >>>>>>>>>>>>>>>
|
|
//---------------------------------------------------------
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sAnimData.strTapeLH)
|
|
AND NOT IS_STRING_NULL_OR_EMPTY(sAnimData.strTapeRH)
|
|
IF IS_ENTITY_ATTACHED(objTapeArmLeft)
|
|
DETACH_ENTITY(objTapeArmLeft, FALSE)
|
|
ENDIF
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(objTapeArmLeft, sAnimData.strAnimDict, sAnimData.strTapeLH, ANIM_DEFAULT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objTapeArmLeft, syncScene[eMrKScene], sAnimData.strTapeLH, sAnimData.strAnimDict, BlendInDelta, BlendOutDelta, enum_to_int(PlaybackFlagsVictim))
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_ATTACHED(objTapeArmRight)
|
|
DETACH_ENTITY(objTapeArmRight, FALSE)
|
|
ENDIF
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(objTapeArmRight, sAnimData.strAnimDict, sAnimData.strTapeRH, ANIM_DEFAULT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objTapeArmRight, syncScene[eMrKScene], sAnimData.strTapeRH, sAnimData.strAnimDict, BlendInDelta, BlendOutDelta, enum_to_int(PlaybackFlagsVictim))
|
|
ENDIF
|
|
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
bHasRestraintPlayedAnim = TRUE
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
|
|
// <<<<<<<<<<<<<< Torture weapon >>>>>>>>>>>>>>>
|
|
//---------------------------------------------------------
|
|
IF eScene != SCENE_WEAPON_SELECT_IDLE // DO NOTHING WITH THE WEAPON IF THIS IS THE WEAPON SELECT SELECT SYNC SCENE
|
|
|
|
TORTURE_StopTortureWeaponAnim(menuWeapon[iCurrentMenuWeapon], BlendOutDelta)
|
|
IF iCurrentMenuWeapon = ENUM_TO_INT(TOR_CLIP1)
|
|
TORTURE_StopTortureWeaponAnim(menuWeapon[iCurrentMenuWeapon], BlendOutDelta)
|
|
ENDIF
|
|
|
|
// Sort out the weapons attachment
|
|
IF sAnimData.bAttachWeaponProp
|
|
|
|
IF NOT IS_ENTITY_ATTACHED(menuWeapon[iCurrentMenuWeapon].objObject)
|
|
ATTACH_ENTITY_TO_ENTITY(menuWeapon[iCurrentMenuWeapon].objObject, TREV_PED_ID(),
|
|
GET_PED_BONE_INDEX(TREV_PED_ID(), BONETAG_PH_R_HAND),
|
|
menuWeapon[iCurrentMenuWeapon].vAttachOffset,
|
|
menuWeapon[iCurrentMenuWeapon].vAttachRot)
|
|
ENDIF
|
|
IF iCurrentMenuWeapon = ENUM_TO_INT(TOR_CLIP0)
|
|
|
|
IF NOT IS_ENTITY_ATTACHED(menuWeapon[ENUM_TO_INT(TOR_CLIP1)].objObject)
|
|
ATTACH_ENTITY_TO_ENTITY(menuWeapon[ENUM_TO_INT(TOR_CLIP1)].objObject,
|
|
TREV_PED_ID(),
|
|
GET_PED_BONE_INDEX(TREV_PED_ID(), BONETAG_PH_L_HAND),
|
|
menuWeapon[ENUM_TO_INT(TOR_CLIP1)].vAttachOffset,
|
|
menuWeapon[ENUM_TO_INT(TOR_CLIP1)].vAttachRot)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
IF IS_ENTITY_ATTACHED(menuWeapon[iCurrentMenuWeapon].objObject)
|
|
DETACH_ENTITY(menuWeapon[iCurrentMenuWeapon].objObject, FALSE)
|
|
ENDIF
|
|
|
|
IF iCurrentMenuWeapon = ENUM_TO_INT(TOR_CLIP0)
|
|
IF IS_ENTITY_ATTACHED(menuWeapon[TOR_CLIP1].objObject)
|
|
DETACH_ENTITY(menuWeapon[TOR_CLIP1].objObject, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Play the weapon anim if one exists
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sAnimData.strWeapon)
|
|
|
|
TEXT_LABEL_63 strAnim = sAnimData.strWeapon
|
|
TEXT_LABEL_63 strAnimExtra = sAnimData.strWeapon
|
|
|
|
IF iCurrentMenuWeapon = ENUM_TO_INT(TOR_CLIP0)
|
|
strAnim += "_R_Clip"
|
|
strAnimExtra += "_L_Clip"
|
|
ENDIF
|
|
|
|
// Not attached so play as a synched scene
|
|
IF NOT sAnimData.bAttachWeaponProp
|
|
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(menuWeapon[iCurrentMenuWeapon].objObject, syncScene[eScene], strAnim, sAnimData.strAnimDict, BlendInDelta, BlendOutDelta, enum_to_int(PlaybackFlagsTorture))
|
|
menuWeapon[iCurrentMenuWeapon].strLastPlayedDict = ""
|
|
menuWeapon[iCurrentMenuWeapon].strLastPlayedAnim = ""
|
|
menuWeapon[iCurrentMenuWeapon].bHasPlayedAnim = TRUE
|
|
|
|
IF iCurrentMenuWeapon = ENUM_TO_INT(TOR_CLIP0)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(menuWeapon[ENUM_TO_INT(TOR_CLIP1)].objObject, syncScene[eScene], strAnimExtra, sAnimData.strAnimDict, BlendInDelta, BlendOutDelta, enum_to_int(PlaybackFlagsTorture))
|
|
menuWeapon[TOR_CLIP1].strLastPlayedDict = ""
|
|
menuWeapon[TOR_CLIP1].strLastPlayedAnim = ""
|
|
menuWeapon[TOR_CLIP1].bHasPlayedAnim = TRUE
|
|
ENDIF
|
|
|
|
// Is attached so play as a normal anim
|
|
ELSE
|
|
|
|
PLAY_ENTITY_ANIM(menuWeapon[iCurrentMenuWeapon].objObject,
|
|
strAnim, sAnimData.strAnimDict, BlendInDelta,
|
|
bLoop, TRUE, DEFAULT, StartPhase)
|
|
|
|
menuWeapon[TOR_CLIP1].strLastPlayedDict = sAnimData.strAnimDict
|
|
menuWeapon[TOR_CLIP1].strLastPlayedAnim = strAnim
|
|
menuWeapon[TOR_CLIP1].bHasPlayedAnim = TRUE
|
|
|
|
IF iCurrentMenuWeapon = ENUM_TO_INT(TOR_CLIP1)
|
|
TORTURE_StopTortureWeaponAnim(menuWeapon[iCurrentMenuWeapon], BlendOutDelta)
|
|
ENDIF
|
|
|
|
IF iCurrentMenuWeapon = ENUM_TO_INT(TOR_CLIP0)
|
|
PLAY_ENTITY_ANIM(menuWeapon[TOR_CLIP1].objObject,
|
|
strAnimExtra, sAnimData.strAnimDict, BlendInDelta,
|
|
bLoop, TRUE, DEFAULT, StartPhase)
|
|
menuWeapon[TOR_CLIP1].strLastPlayedDict = sAnimData.strAnimDict
|
|
menuWeapon[TOR_CLIP1].strLastPlayedAnim = strAnimExtra
|
|
menuWeapon[TOR_CLIP1].bHasPlayedAnim = TRUE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
// <<<<<<<<<< EXTRA ANIMATED WEAPONS >>>>>>>>>>>>>>
|
|
// this is for wepaon pickups, all the other torture props are moved out of the way of the weapon pickup currently playing
|
|
|
|
IF eScene = SCENE_WEAPON_SELECT_IDLE
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sAnimData.strBenchPositionerWrench)
|
|
|
|
IF IS_ENTITY_ATTACHED(menuWeapon[TOR_WRENCH].objObject)
|
|
DETACH_ENTITY(menuWeapon[TOR_WRENCH].objObject)
|
|
ENDIF
|
|
|
|
TORTURE_StopTortureWeaponAnim(menuWeapon[TOR_WRENCH], INSTANT_BLEND_OUT)
|
|
|
|
PLAY_ENTITY_ANIM(menuWeapon[TOR_WRENCH].objObject,
|
|
sAnimData.strBenchPositionerWrench,
|
|
"missfbi3_weapon_select",
|
|
BlendInDelta, TRUE, TRUE)
|
|
|
|
menuWeapon[TOR_WRENCH].strLastPlayedDict = "missfbi3_weapon_select"
|
|
menuWeapon[TOR_WRENCH].strLastPlayedAnim = sAnimData.strBenchPositionerWrench
|
|
menuWeapon[TOR_WRENCH].bHasPlayedAnim = TRUE
|
|
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(menuWeapon[TOR_WRENCH].objObject)
|
|
ENDIF
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sAnimData.strBenchPositionerPliers)
|
|
|
|
IF IS_ENTITY_ATTACHED(menuWeapon[TOR_PLIERS].objObject)
|
|
DETACH_ENTITY(menuWeapon[TOR_PLIERS].objObject)
|
|
ENDIF
|
|
|
|
TORTURE_StopTortureWeaponAnim(menuWeapon[TOR_PLIERS], INSTANT_BLEND_OUT)
|
|
|
|
PLAY_ENTITY_ANIM(menuWeapon[TOR_PLIERS].objObject,
|
|
sAnimData.strBenchPositionerPliers,
|
|
"missfbi3_weapon_select",
|
|
BlendInDelta, TRUE, TRUE)
|
|
|
|
menuWeapon[TOR_PLIERS].strLastPlayedDict = "missfbi3_weapon_select"
|
|
menuWeapon[TOR_PLIERS].strLastPlayedAnim = sAnimData.strBenchPositionerPliers
|
|
menuWeapon[TOR_PLIERS].bHasPlayedAnim = TRUE
|
|
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(menuWeapon[TOR_PLIERS].objObject)
|
|
ENDIF
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sAnimData.strBenchPositionerClip0)
|
|
|
|
IF IS_ENTITY_ATTACHED(menuWeapon[TOR_CLIP0].objObject)
|
|
DETACH_ENTITY(menuWeapon[TOR_CLIP0].objObject)
|
|
ENDIF
|
|
|
|
TORTURE_StopTortureWeaponAnim(menuWeapon[TOR_CLIP0], INSTANT_BLEND_OUT)
|
|
|
|
PLAY_ENTITY_ANIM(menuWeapon[TOR_CLIP0].objObject,
|
|
sAnimData.strBenchPositionerClip0,
|
|
"missfbi3_weapon_select",
|
|
BlendInDelta, TRUE, TRUE)
|
|
|
|
menuWeapon[TOR_CLIP0].strLastPlayedDict = "missfbi3_weapon_select"
|
|
menuWeapon[TOR_CLIP0].strLastPlayedAnim = sAnimData.strBenchPositionerClip0
|
|
menuWeapon[TOR_CLIP0].bHasPlayedAnim = TRUE
|
|
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(menuWeapon[TOR_CLIP0].objObject)
|
|
ENDIF
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sAnimData.strBenchPositionerClip1)
|
|
|
|
IF IS_ENTITY_ATTACHED(menuWeapon[TOR_CLIP1].objObject)
|
|
DETACH_ENTITY(menuWeapon[TOR_CLIP1].objObject)
|
|
ENDIF
|
|
|
|
TORTURE_StopTortureWeaponAnim(menuWeapon[TOR_CLIP1], INSTANT_BLEND_OUT)
|
|
|
|
PLAY_ENTITY_ANIM(menuWeapon[TOR_CLIP1].objObject,
|
|
sAnimData.strBenchPositionerClip1,
|
|
"missfbi3_weapon_select",
|
|
BlendInDelta, TRUE, TRUE)
|
|
|
|
menuWeapon[TOR_CLIP1].strLastPlayedDict = "missfbi3_weapon_select"
|
|
menuWeapon[TOR_CLIP1].strLastPlayedAnim = sAnimData.strBenchPositionerClip1
|
|
menuWeapon[TOR_CLIP1].bHasPlayedAnim = TRUE
|
|
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(menuWeapon[TOR_CLIP1].objObject)
|
|
ENDIF
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sAnimData.strBenchPositionerJerrycan)
|
|
|
|
IF IS_ENTITY_ATTACHED(menuWeapon[TOR_WATER].objObject)
|
|
DETACH_ENTITY(menuWeapon[TOR_WATER].objObject)
|
|
ENDIF
|
|
|
|
TORTURE_StopTortureWeaponAnim(menuWeapon[TOR_WATER], INSTANT_BLEND_OUT)
|
|
|
|
PLAY_ENTITY_ANIM(menuWeapon[TOR_WATER].objObject,
|
|
sAnimData.strBenchPositionerJerrycan,
|
|
"missfbi3_weapon_select",
|
|
BlendInDelta, TRUE, TRUE)
|
|
|
|
menuWeapon[TOR_WATER].strLastPlayedDict = "missfbi3_weapon_select"
|
|
menuWeapon[TOR_WATER].strLastPlayedAnim = sAnimData.strBenchPositionerJerrycan
|
|
menuWeapon[TOR_WATER].bHasPlayedAnim = TRUE
|
|
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(menuWeapon[TOR_WATER].objObject)
|
|
ENDIF
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sAnimData.strBenchPositionerRag)
|
|
|
|
IF IS_ENTITY_ATTACHED(menuWeapon[TOR_RAG].objObject)
|
|
DETACH_ENTITY(menuWeapon[TOR_RAG].objObject)
|
|
ENDIF
|
|
|
|
TORTURE_StopTortureWeaponAnim(menuWeapon[TOR_RAG], INSTANT_BLEND_OUT)
|
|
|
|
PLAY_ENTITY_ANIM(menuWeapon[TOR_RAG].objObject,
|
|
sAnimData.strBenchPositionerRag,
|
|
"missfbi3_weapon_select",
|
|
BlendInDelta, TRUE, TRUE)
|
|
|
|
menuWeapon[TOR_RAG].strLastPlayedDict = "missfbi3_weapon_select"
|
|
menuWeapon[TOR_RAG].strLastPlayedAnim = sAnimData.strBenchPositionerRag
|
|
menuWeapon[TOR_RAG].bHasPlayedAnim = TRUE
|
|
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(menuWeapon[TOR_RAG].objObject)
|
|
ENDIF
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sAnimData.strBenchPositionerSyringe)
|
|
|
|
IF IS_ENTITY_ATTACHED(menuWeapon[TOR_SYRINGE].objObject)
|
|
DETACH_ENTITY(menuWeapon[TOR_SYRINGE].objObject)
|
|
ENDIF
|
|
|
|
TORTURE_StopTortureWeaponAnim(menuWeapon[TOR_SYRINGE], INSTANT_BLEND_OUT)
|
|
|
|
PLAY_ENTITY_ANIM(menuWeapon[TOR_SYRINGE].objObject,
|
|
sAnimData.strBenchPositionerSyringe,
|
|
"missfbi3_weapon_select",
|
|
BlendInDelta, TRUE, TRUE)
|
|
|
|
menuWeapon[TOR_SYRINGE].strLastPlayedDict = "missfbi3_weapon_select"
|
|
menuWeapon[TOR_SYRINGE].strLastPlayedAnim = sAnimData.strBenchPositionerSyringe
|
|
menuWeapon[TOR_SYRINGE].bHasPlayedAnim = TRUE
|
|
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(menuWeapon[TOR_SYRINGE].objObject)
|
|
ENDIF
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sAnimData.strBenchPositionerTrolley)
|
|
|
|
IF IS_ENTITY_ATTACHED(objTable)
|
|
DETACH_ENTITY(objTable)
|
|
ENDIF
|
|
|
|
PLAY_ENTITY_ANIM(objTable,
|
|
sAnimData.strBenchPositionerTrolley,
|
|
"missfbi3_weapon_select",
|
|
BlendInDelta, TRUE, TRUE)
|
|
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objTable)
|
|
ENDIF
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sAnimData.strBenchPositionerBattery)
|
|
|
|
IF IS_ENTITY_ATTACHED(objBattery)
|
|
DETACH_ENTITY(objBattery)
|
|
ENDIF
|
|
|
|
PLAY_ENTITY_ANIM(objBattery,
|
|
sAnimData.strBenchPositionerBattery,
|
|
"missfbi3_weapon_select",
|
|
BlendInDelta, TRUE, TRUE)
|
|
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objBattery)
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
STRING strWeaponPosDic
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sAnimData.strWeaponSelectionOverride)
|
|
strWeaponPosDic = sAnimData.strWeaponSelectionOverride
|
|
ELSE
|
|
strWeaponPosDic = "missfbi3_weapon_select_trolley"
|
|
ENDIF
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sAnimData.strBenchPositionerWrench)
|
|
|
|
IF IS_ENTITY_ATTACHED(menuWeapon[TOR_WRENCH].objObject)
|
|
DETACH_ENTITY(menuWeapon[TOR_WRENCH].objObject)
|
|
ENDIF
|
|
|
|
TORTURE_StopTortureWeaponAnim(menuWeapon[TOR_WRENCH], INSTANT_BLEND_OUT)
|
|
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(menuWeapon[TOR_WRENCH].objObject,
|
|
syncScene[eScene],
|
|
sAnimData.strBenchPositionerWrench,
|
|
strWeaponPosDic,
|
|
BlendInDelta, BlendOutdelta, enum_to_int(PlaybackFlagsTorture | SYNCED_SCENE_LOOP_WITHIN_SCENE))
|
|
|
|
menuWeapon[TOR_WRENCH].strLastPlayedDict = ""
|
|
menuWeapon[TOR_WRENCH].strLastPlayedAnim = ""
|
|
menuWeapon[TOR_WRENCH].bHasPlayedAnim = TRUE
|
|
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(menuWeapon[TOR_WRENCH].objObject)
|
|
ENDIF
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sAnimData.strBenchPositionerClip0)
|
|
|
|
IF IS_ENTITY_ATTACHED(menuWeapon[TOR_CLIP0].objObject)
|
|
DETACH_ENTITY(menuWeapon[TOR_CLIP0].objObject)
|
|
ENDIF
|
|
|
|
TORTURE_StopTortureWeaponAnim(menuWeapon[TOR_CLIP0], INSTANT_BLEND_OUT)
|
|
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(menuWeapon[TOR_CLIP0].objObject,
|
|
syncScene[eScene],
|
|
sAnimData.strBenchPositionerClip0,
|
|
strWeaponPosDic,
|
|
BlendInDelta, BlendOutdelta, enum_to_int(PlaybackFlagsTorture | SYNCED_SCENE_LOOP_WITHIN_SCENE))
|
|
|
|
menuWeapon[TOR_CLIP0].strLastPlayedDict = ""
|
|
menuWeapon[TOR_CLIP0].strLastPlayedAnim = ""
|
|
menuWeapon[TOR_CLIP0].bHasPlayedAnim = TRUE
|
|
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(menuWeapon[TOR_CLIP0].objObject)
|
|
ENDIF
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sAnimData.strBenchPositionerClip1)
|
|
|
|
IF IS_ENTITY_ATTACHED(menuWeapon[TOR_CLIP1].objObject)
|
|
DETACH_ENTITY(menuWeapon[TOR_CLIP1].objObject)
|
|
ENDIF
|
|
|
|
TORTURE_StopTortureWeaponAnim(menuWeapon[TOR_CLIP1], INSTANT_BLEND_OUT)
|
|
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(menuWeapon[TOR_CLIP1].objObject,
|
|
syncScene[eScene],
|
|
sAnimData.strBenchPositionerClip1,
|
|
strWeaponPosDic,
|
|
BlendInDelta, BlendOutdelta, enum_to_int(PlaybackFlagsTorture | SYNCED_SCENE_LOOP_WITHIN_SCENE))
|
|
|
|
menuWeapon[TOR_CLIP1].strLastPlayedDict = ""
|
|
menuWeapon[TOR_CLIP1].strLastPlayedAnim = ""
|
|
menuWeapon[TOR_CLIP1].bHasPlayedAnim = TRUE
|
|
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(menuWeapon[TOR_CLIP1].objObject)
|
|
ENDIF
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sAnimData.strBenchPositionerPliers)
|
|
|
|
IF IS_ENTITY_ATTACHED(menuWeapon[TOR_PLIERS].objObject)
|
|
DETACH_ENTITY(menuWeapon[TOR_PLIERS].objObject)
|
|
ENDIF
|
|
|
|
TORTURE_StopTortureWeaponAnim(menuWeapon[TOR_PLIERS], INSTANT_BLEND_OUT)
|
|
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(menuWeapon[TOR_PLIERS].objObject,
|
|
syncScene[eScene],
|
|
sAnimData.strBenchPositionerPliers,
|
|
strWeaponPosDic,
|
|
BlendInDelta, BlendOutdelta, enum_to_int(PlaybackFlagsTorture | SYNCED_SCENE_LOOP_WITHIN_SCENE))
|
|
|
|
menuWeapon[TOR_PLIERS].strLastPlayedDict = ""
|
|
menuWeapon[TOR_PLIERS].strLastPlayedAnim = ""
|
|
menuWeapon[TOR_PLIERS].bHasPlayedAnim = TRUE
|
|
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(menuWeapon[TOR_PLIERS].objObject)
|
|
ENDIF
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sAnimData.strBenchPositionerJerrycan)
|
|
|
|
IF IS_ENTITY_ATTACHED(menuWeapon[TOR_WATER].objObject)
|
|
DETACH_ENTITY(menuWeapon[TOR_WATER].objObject)
|
|
ENDIF
|
|
|
|
TORTURE_StopTortureWeaponAnim(menuWeapon[TOR_WATER], INSTANT_BLEND_OUT)
|
|
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(menuWeapon[TOR_WATER].objObject,
|
|
syncScene[eScene],
|
|
sAnimData.strBenchPositionerJerrycan,
|
|
strWeaponPosDic,
|
|
BlendInDelta, BlendOutdelta, enum_to_int(PlaybackFlagsTorture | SYNCED_SCENE_LOOP_WITHIN_SCENE))
|
|
|
|
menuWeapon[TOR_WATER].strLastPlayedDict = ""
|
|
menuWeapon[TOR_WATER].strLastPlayedAnim = ""
|
|
menuWeapon[TOR_WATER].bHasPlayedAnim = TRUE
|
|
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(menuWeapon[TOR_WATER].objObject)
|
|
ENDIF
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sAnimData.strBenchPositionerSyringe)
|
|
|
|
IF IS_ENTITY_ATTACHED(menuWeapon[TOR_SYRINGE].objObject)
|
|
DETACH_ENTITY(menuWeapon[TOR_SYRINGE].objObject)
|
|
ENDIF
|
|
|
|
TORTURE_StopTortureWeaponAnim(menuWeapon[TOR_SYRINGE], INSTANT_BLEND_OUT)
|
|
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(menuWeapon[TOR_SYRINGE].objObject,
|
|
syncScene[eScene],
|
|
sAnimData.strBenchPositionerSyringe,
|
|
strWeaponPosDic,
|
|
BlendInDelta, BlendOutdelta, enum_to_int(PlaybackFlagsTorture | SYNCED_SCENE_LOOP_WITHIN_SCENE))
|
|
|
|
menuWeapon[TOR_SYRINGE].strLastPlayedDict = ""
|
|
menuWeapon[TOR_SYRINGE].strLastPlayedAnim = ""
|
|
menuWeapon[TOR_SYRINGE].bHasPlayedAnim = TRUE
|
|
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(menuWeapon[TOR_SYRINGE].objObject)
|
|
ENDIF
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sAnimData.strBenchPositionerRag)
|
|
|
|
IF IS_ENTITY_ATTACHED(menuWeapon[TOR_RAG].objObject)
|
|
DETACH_ENTITY(menuWeapon[TOR_RAG].objObject)
|
|
ENDIF
|
|
|
|
TORTURE_StopTortureWeaponAnim(menuWeapon[TOR_RAG], INSTANT_BLEND_OUT)
|
|
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(menuWeapon[TOR_RAG].objObject,
|
|
syncScene[eScene],
|
|
sAnimData.strBenchPositionerRag,
|
|
strWeaponPosDic,
|
|
BlendInDelta, BlendOutdelta, enum_to_int(PlaybackFlagsTorture | SYNCED_SCENE_LOOP_WITHIN_SCENE))
|
|
|
|
menuWeapon[TOR_RAG].strLastPlayedDict = ""
|
|
menuWeapon[TOR_RAG].strLastPlayedAnim = ""
|
|
menuWeapon[TOR_RAG].bHasPlayedAnim = TRUE
|
|
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(menuWeapon[TOR_RAG].objObject)
|
|
ENDIF
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sAnimData.strBenchPositionerTrolley)
|
|
|
|
IF IS_ENTITY_ATTACHED(objTable)
|
|
DETACH_ENTITY(objTable)
|
|
ENDIF
|
|
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objTable,
|
|
syncScene[eScene],
|
|
sAnimData.strBenchPositionerTrolley,
|
|
strWeaponPosDic,
|
|
BlendInDelta, BlendOutdelta, enum_to_int(PlaybackFlagsTorture | SYNCED_SCENE_LOOP_WITHIN_SCENE))
|
|
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objTable)
|
|
ENDIF
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sAnimData.strBenchPositionerBattery)
|
|
|
|
IF IS_ENTITY_ATTACHED(objBattery)
|
|
DETACH_ENTITY(objBattery)
|
|
ENDIF
|
|
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objBattery,
|
|
syncScene[eScene],
|
|
sAnimData.strBenchPositionerBattery,
|
|
strWeaponPosDic,
|
|
BlendInDelta, BlendOutdelta, enum_to_int(PlaybackFlagsTorture | SYNCED_SCENE_LOOP_WITHIN_SCENE))
|
|
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objBattery)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
// <<<<<<<<<<<<<< Agent Steve >>>>>>>>>>>>>>>
|
|
//---------------------------------------------------------
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sAnimData.strSteve)
|
|
TASK_SYNCHRONIZED_SCENE(pedSteve, syncScene[eScene], sAnimData.strAnimDict, sAnimData.strSteve, BlendInDelta, BlendOutDelta)
|
|
ELSE
|
|
IF NOT IS_ENTITY_DEAD(pedSteve)
|
|
AND GET_SCRIPT_TASK_STATUS(pedSteve, SCRIPT_TASK_PERFORM_SEQUENCE) != PERFORMING_TASK
|
|
CLEAR_PED_TASKS_IMMEDIATELY(pedSteve)
|
|
SET_ENTITY_COORDS(pedSteve, vSteveCoords)
|
|
SET_ENTITY_HEADING(pedSteve, fSteveHeading)
|
|
OPEN_SEQUENCE_TASK(seqSequence)
|
|
TASK_PLAY_ANIM_ADVANCED(NULL, adSteve, "steve_phone_idle_a", vSteveCoords, <<0,0,fSteveHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION)
|
|
TASK_PLAY_ANIM_ADVANCED(NULL, adSteve, "steve_phone_idle_a", vSteveCoords, <<0,0,fSteveHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS)
|
|
TASK_PLAY_ANIM_ADVANCED(NULL, adSteve, "steve_phone_idle_b", vSteveCoords, <<0,0,fSteveHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS)
|
|
TASK_PLAY_ANIM_ADVANCED(NULL, adSteve, "steve_phone_idle_a", vSteveCoords, <<0,0,fSteveHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS)
|
|
TASK_PLAY_ANIM_ADVANCED(NULL, adSteve, "steve_phone_idle_b", vSteveCoords, <<0,0,fSteveHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS)
|
|
SET_SEQUENCE_TO_REPEAT(seqSequence, REPEAT_FOREVER)
|
|
CLOSE_SEQUENCE_TASK(seqSequence)
|
|
TASK_PERFORM_SEQUENCE(pedSteve, seqSequence)
|
|
CLEAR_SEQUENCE_TASK(seqSequence)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(propPhoneSteve)
|
|
IF NOT IS_ENTITY_ATTACHED(propPhoneSteve)
|
|
ATTACH_ENTITY_TO_ENTITY(propPhoneSteve, pedSteve, GET_PED_BONE_INDEX(pedSteve, BONETAG_PH_L_HAND), <<0,0,0>>, <<0,0,0>>)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// <<<<<<<<<<<<<< Camera >>>>>>>>>>>>>>>
|
|
//---------------------------------------------------------
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sAnimData.strCam)
|
|
|
|
IF NOT DOES_CAM_EXIST(camTorture)
|
|
camTorture = CREATE_CAMERA(CAMTYPE_ANIMATED)
|
|
SET_CAM_DEBUG_NAME(camTorture, "Torture Cam")
|
|
ELSE
|
|
STOP_CAM_SHAKING(camTorture, TRUE)
|
|
ENDIF
|
|
|
|
SET_CAM_ACTIVE(camTorture, TRUE)
|
|
PLAY_SYNCHRONIZED_CAM_ANIM(camTorture, syncScene[eScene], sAnimData.strCam, sAnimData.strAnimDict)
|
|
|
|
// added bug 1890635
|
|
IF NOT IS_SCRIPT_GLOBAL_SHAKING()
|
|
ANIMATED_SHAKE_SCRIPT_GLOBAL("SHAKE_CAM_medium", "medium", "", fTortureShake)
|
|
ENDIF
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
ENDIF
|
|
|
|
// <<<<<<<<<<<<<< Rag >>>>>>>>>>>>>>>
|
|
//---------------------------------------------------------
|
|
CPRINTLN(DEBUG_MIKE, " Process Rag")
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sAnimData.strRag)
|
|
|
|
CPRINTLN(DEBUG_MIKE, " Rag(MAIN) anim found, detach rag and play animation")
|
|
|
|
IF IS_ENTITY_ATTACHED(menuWeapon[TOR_RAG].objObject)
|
|
DETACH_ENTITY(menuWeapon[TOR_RAG].objObject, FALSE)
|
|
ENDIF
|
|
|
|
TORTURE_StopTortureWeaponAnim(menuWeapon[TOR_RAG], BlendOutDelta)
|
|
|
|
// If being picked up for the water torture then use the anim dicitonary obtained from the scene ANIM DATA information
|
|
IF iCurrentMenuWeapon = enum_to_int(TOR_WATER)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(menuWeapon[TOR_RAG].objObject, syncScene[eScene], sAnimData.strRag, sAnimData.strAnimDict, BlendInDelta, BlendOutdelta, enum_to_int(PlaybackFlagsTorture | SYNCED_SCENE_LOOP_WITHIN_SCENE))
|
|
|
|
// Otherwise play using the weapon position dictionary.
|
|
ELSE
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(menuWeapon[TOR_RAG].objObject, syncScene[eScene], sAnimData.strRag, "missfbi3_weapon_select_trolley", BlendInDelta, BlendOutdelta, enum_to_int(PlaybackFlagsTorture | SYNCED_SCENE_LOOP_WITHIN_SCENE))
|
|
|
|
ENDIF
|
|
menuWeapon[TOR_RAG].bHasPlayedAnim = TRUE
|
|
|
|
IF sAnimData.bForceUpdateDueToCut
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(menuWeapon[TOR_RAG].objObject)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
//SET_SYNCHRONIZED_SCENE_PHASE(syncScene[eScene], StartPhase)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(syncScene[eScene], bLoop)
|
|
IF sAnimData.bSeparateSynSceneMrK
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(syncScene[SCENE_EXTRA_MR_K_FIDGET], TRUE)
|
|
ENDIF
|
|
|
|
IF sAnimData.bForceUpdateDueToCut
|
|
OR BlendInDelta = INSTANT_BLEND_IN
|
|
CPRINTLN(DEBUG_MIKE, "\n Force Updates")
|
|
CPRINTLN(DEBUG_MIKE, " ForceUpdateAIAnim Trev")
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(TREV_PED_ID())
|
|
CPRINTLN(DEBUG_MIKE, " ForceUpdateAIAnim MrK")
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(pedVictim)
|
|
CPRINTLN(DEBUG_MIKE, " ForceUpdateAIAnim Steve")
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(pedSteve)
|
|
CPRINTLN(DEBUG_MIKE, " ForceUpdateAIAnim Chair")
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objChair)
|
|
CPRINTLN(DEBUG_MIKE, " ForceUpdateAIAnim Weapon")
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(menuWeapon[iCurrentMenuWeapon].objObject)
|
|
IF iCurrentMenuWeapon = enum_to_int(TOR_CLIP0)
|
|
CPRINTLN(DEBUG_MIKE, " ForceUpdateAIAnim Clip1")
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(menuWeapon[TOR_CLIP1].objObject)
|
|
ENDIF
|
|
CPRINTLN(DEBUG_MIKE, " ForceUpdateAIAnim TapeArmLeft")
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objTapeArmLeft)
|
|
CPRINTLN(DEBUG_MIKE, " ForceUpdateAIAnim TapeArmRight")
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objTapeArmRight)
|
|
|
|
bPlayedTortureSceneThisFrame = TRUE
|
|
ENDIF
|
|
|
|
CPRINTLN(DEBUG_MIKE, "[*** END ***]\n")
|
|
|
|
eLastTorturePlayed = eScene
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
//PURPOSE: Makes Steve do a shocked reaction animation
|
|
PROC TORTURE_PlaySteveReaction()
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(pedSteve, adSteve, "steve_phone_reaction")
|
|
CLEAR_PED_TASKS_IMMEDIATELY(pedSteve)
|
|
SET_ENTITY_COORDS(pedSteve, vSteveCoords)
|
|
SET_ENTITY_HEADING(pedSteve, fSteveHeading)
|
|
OPEN_SEQUENCE_TASK(seqSequence)
|
|
TASK_PLAY_ANIM_ADVANCED(NULL, adSteve, "steve_phone_reaction", vSteveCoords, <<0,0,fSteveHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION)
|
|
TASK_PLAY_ANIM_ADVANCED(NULL, adSteve, "steve_phone_idle_a", vSteveCoords, <<0,0,fSteveHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS)
|
|
TASK_PLAY_ANIM_ADVANCED(NULL, adSteve, "steve_phone_idle_a", vSteveCoords, <<0,0,fSteveHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS)
|
|
TASK_PLAY_ANIM_ADVANCED(NULL, adSteve, "steve_phone_idle_b", vSteveCoords, <<0,0,fSteveHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS)
|
|
TASK_PLAY_ANIM_ADVANCED(NULL, adSteve, "steve_phone_idle_a", vSteveCoords, <<0,0,fSteveHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS)
|
|
TASK_PLAY_ANIM_ADVANCED(NULL, adSteve, "steve_phone_idle_b", vSteveCoords, <<0,0,fSteveHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS)
|
|
SET_SEQUENCE_TO_REPEAT(seqSequence, REPEAT_FOREVER)
|
|
CLOSE_SEQUENCE_TASK(seqSequence)
|
|
TASK_PERFORM_SEQUENCE(pedSteve, seqSequence)
|
|
CLEAR_SEQUENCE_TASK(seqSequence)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC TORTURE_InitWeapSelectionCam()
|
|
setupSwayCam(sSwayTorture, << 142.3567, -2202.3789, 6.6759 >>, << -41.1685, -9.3446, -125.0095 >>, 29.0273,
|
|
<< 142.2558, -2202.5918, 6.7048 >>, << -42.4644, -9.3446, -118.1968 >>, 29.0273, 10000, TRUE, shakeRoadVib, 0.1, "WEAP_SEL")
|
|
ENDPROC
|
|
|
|
//PURPOSE: Starts preloading the elements required for the torture scene
|
|
PROC TORTURE_LoadAssets(BOOL bAssetsForPeds, BOOL bAssetsForWeapons)
|
|
|
|
IF bAssetsForPeds
|
|
Load_Asset_Model(sAssetData, GET_NPC_PED_MODEL(CHAR_STEVE))
|
|
Load_Asset_Model(sAssetData, mnVictim)
|
|
Load_Asset_Model(sAssetData, PROP_NPC_PHONE)
|
|
Load_Asset_AnimDict(sAssetData, adSteve)
|
|
ENDIF
|
|
|
|
IF bAssetsForWeapons
|
|
Load_Asset_Model(sAssetData, mnSmallTable)
|
|
Load_Asset_Model(sAssetData, mnBench)
|
|
Load_Asset_Model(sAssetData, mnWrench)
|
|
Load_Asset_Model(sAssetData, mnPliers)
|
|
Load_Asset_Model(sAssetData, mnBattery)
|
|
Load_Asset_Model(sAssetData, mnClip0)
|
|
Load_Asset_Model(sAssetData, mnClip1)
|
|
Load_Asset_Model(sAssetData, mnSyringe)
|
|
Load_Asset_Model(sAssetData, mnWater)
|
|
Load_Asset_Model(sAssetData, mnRag)
|
|
Load_Asset_Model(sAssetData, mnChair)
|
|
Load_Asset_Model(sAssetData, mnMonitor)
|
|
Load_Asset_Model(sAssetData, mnArmTape)
|
|
ENDIF
|
|
|
|
Load_Asset_AnimDict(sAssetData, "missfbi3_weapon_select")
|
|
Load_Asset_AnimDict(sAssetData, "missfbi3_weapon_select_trolley")
|
|
Load_Asset_AnimDict(sAssetData, "SHAKE_CAM_medium")
|
|
Load_Asset_AnimDict(sAssetData, adSteve)
|
|
Load_Asset_Scaleform(sAssetData, sfHeart, sfHeartMonitor)
|
|
Load_Asset_Scaleform(sAssetData, sfTooth, sfToothPull)
|
|
Load_Asset_Model(sAssetData, mnUVFaceProp)
|
|
|
|
Load_Asset_Audiobank(sAssetData, sbTortureGeneral)
|
|
Load_Asset_Audiobank(sAssetData, "FBI_03_Torture_Chair")
|
|
|
|
Load_Asset_PTFX(sAssetData)
|
|
ENDPROC
|
|
|
|
//PURPOSE: Returns the menu object, created based on the passed information
|
|
PROC TORTURE_InitialiseMenuObject(sMenuObject &MenuObject, VECTOR DefaultCoords, VECTOR DefaultRot,
|
|
VECTOR AttachOffset, VECTOR AttachRot, BOOL Selectable, STRING csName, MODEL_NAMES modelName)
|
|
|
|
MenuObject.vDefaultCoords = DefaultCoords
|
|
MenuObject.vDefaultRot = DefaultRot
|
|
MenuObject.vAttachOffset = AttachOffset
|
|
MenuObject.vAttachRot = AttachRot
|
|
MenuObject.bHasPlayedAnim = FALSE
|
|
MenuObject.bSelectable = Selectable
|
|
MenuObject.strCSName = csName
|
|
MenuObject.model = modelName
|
|
|
|
ENDPROC
|
|
|
|
PROC TORTURE_DetachAllProps()
|
|
INT iCounter
|
|
FOR iCounter = 0 TO ENUM_TO_INT(NO_OF_TORTURE_WEAPONS)-1
|
|
IF DOES_ENTITY_EXIST(menuWeapon[iCounter].objObject)
|
|
// IF menuWeapon[iCounter].bHasPlayedAnim
|
|
// STOP_SYNCHRONIZED_ENTITY_ANIM(menuWeapon[iCounter].objObject, INSTANT_BLEND_OUT, FALSE)
|
|
// menuWeapon[iCounter].bHasPlayedAnim = FALSE
|
|
// ENDIF
|
|
IF IS_ENTITY_ATTACHED(menuWeapon[iCounter].objObject)
|
|
DETACH_ENTITY(menuWeapon[iCounter].objObject, FALSE)
|
|
ENDIF
|
|
SET_ENTITY_COLLISION(menuWeapon[iCounter].objObject, FALSE)
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
IF DOES_ENTITY_EXIST(propPhoneSteve)
|
|
IF IS_ENTITY_ATTACHED(propPhoneSteve)
|
|
DETACH_ENTITY(propPhoneSteve)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
//PURPOSE: Detaches Torture Props
|
|
PROC TORTURE_ResetAllProps(BOOL bPostCutscene)
|
|
|
|
CDEBUG2LN(DEBUG_MIKE, "TORTURE_ResetAllProps(bPostCutscene = ", bPostCutscene, ")")
|
|
|
|
INT iCounter
|
|
FOR iCounter = 0 TO ENUM_TO_INT(NO_OF_TORTURE_WEAPONS)-1
|
|
IF DOES_ENTITY_EXIST(menuWeapon[iCounter].objObject)
|
|
AND (NOT bPostCutscene OR CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(menuWeapon[iCounter].strCSName))
|
|
AND NOT IS_VECTOR_ZERO(menuWeapon[iCounter].vDefaultCoords)
|
|
AND NOT IS_VECTOR_ZERO(menuWeapon[iCounter].vDefaultRot)
|
|
CPRINTLN(DEBUG_MIKE, "**** FBI3 - Respositioning weapon: ", menuWeapon[iCounter].strCSName)
|
|
|
|
IF IS_ENTITY_ATTACHED(menuWeapon[iCounter].objObject)
|
|
DETACH_ENTITY(menuWeapon[iCounter].objObject, FALSE)
|
|
CPRINTLN(DEBUG_MIKE, " Detached weapon")
|
|
ENDIF
|
|
SET_ENTITY_COLLISION(menuWeapon[iCounter].objObject, FALSE)
|
|
SET_ENTITY_COORDS_NO_OFFSET(menuWeapon[iCounter].objObject, menuWeapon[iCounter].vDefaultCoords)
|
|
SET_ENTITY_ROTATION(menuWeapon[iCounter].objObject, menuWeapon[iCounter].vDefaultRot)
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(menuWeapon[iCounter].objObject)
|
|
CPRINTLN(DEBUG_MIKE, " Set weapon pos: ", menuWeapon[iCounter].vDefaultCoords)
|
|
CPRINTLN(DEBUG_MIKE, " Set weapon rot: ", menuWeapon[iCounter].vDefaultRot)
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
IF DOES_ENTITY_EXIST(objChair)
|
|
AND (NOT bPostCutscene OR CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(csChair))
|
|
SET_ENTITY_COORDS_NO_OFFSET(objChair, vChairCoords)
|
|
SET_ENTITY_ROTATION(objChair, vChairRot)
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objChair)
|
|
bHasChairPlayedAnim = FALSE
|
|
CDEBUG2LN(DEBUG_MIKE, "Postitioned: ", csChair)
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(objTable)
|
|
AND (NOT bPostCutscene OR CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(csTable))
|
|
AND NOT IS_VECTOR_ZERO(vTableCoords)
|
|
AND NOT IS_VECTOR_ZERO(vTableRot)
|
|
SET_ENTITY_COORDS_NO_OFFSET(objTable, vTableCoords)
|
|
SET_ENTITY_ROTATION(objTable, vTableRot)
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objTable)
|
|
CDEBUG2LN(DEBUG_MIKE, "Postitioned: ", csTable)
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(objMonitor)
|
|
AND (NOT bPostCutscene OR CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(csMonitor))
|
|
SET_ENTITY_COORDS_NO_OFFSET(objMonitor, vMonitorCoords)
|
|
SET_ENTITY_ROTATION(objMonitor, vMonitorRot)
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objMonitor)
|
|
CDEBUG2LN(DEBUG_MIKE, "Postitioned: ", csMonitor)
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(objBattery)
|
|
AND (NOT bPostCutscene OR CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(csBattery))
|
|
AND NOT IS_VECTOR_ZERO(vBatteryCoords)
|
|
AND NOT IS_VECTOR_ZERO(vBatteryRot)
|
|
SET_ENTITY_COORDS_NO_OFFSET(objBattery, vBatteryCoords)
|
|
SET_ENTITY_ROTATION(objBattery, vBatteryRot)
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objBattery)
|
|
CDEBUG2LN(DEBUG_MIKE, "Postitioned: ", csBattery)
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(objSmallTable)
|
|
AND (NOT bPostCutscene OR CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(csSmallTable))
|
|
SET_ENTITY_COORDS_NO_OFFSET(objSmallTable, vSmallTableCoords)
|
|
SET_ENTITY_ROTATION(objSmallTable, vSmallTableRot)
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objSmallTable)
|
|
CDEBUG2LN(DEBUG_MIKE, "Postitioned: ", csSmallTable)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE: Loads in and creates the torture scene elements
|
|
FUNC BOOL TORTURE_IsTortureReady(BOOL bCreatePeds, BOOL bCreateWeapons, BOOL bCreateVehicle)
|
|
|
|
BOOL bIsReady = TRUE
|
|
BOOL bCreatedEntityThisFrame
|
|
|
|
IF bCreateVehicle
|
|
IF NOT DOES_ENTITY_EXIST(vehTrevor)
|
|
IF HAS_MODEL_LOADED(GET_PLAYER_VEH_MODEL(CHAR_TREVOR))
|
|
IF NOT bCreatedEntityThisFrame
|
|
IF CREATE_PLAYER_VEHICLE(vehTrevor, CHAR_TREVOR, vTrevorCarDriveToAirportCoord, fTrevorCarSpawnHeading)
|
|
SET_VEHICLE_ENGINE_ON(vehTrevor, TRUE, TRUE)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vehTrevor, SC_DOOR_FRONT_LEFT, FALSE)
|
|
SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(vehTrevor, SC_DOOR_FRONT_RIGHT, FALSE)
|
|
CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() Trevor truck created")
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
// CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() Vehicle NOT created yet")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ELSE
|
|
// CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() Vehicle NOT created yet")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ELSE
|
|
// CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() Vehicle waiting for next frame, entity already created this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(objs[mof_turd])
|
|
IF HAS_MODEL_LOADED(mnTrevTurd)
|
|
IF NOT bCreatedEntityThisFrame
|
|
objs[mof_turd] = CREATE_OBJECT(mnTrevTurd, vTrevTurd)
|
|
Unload_Asset_Model(sAssetData, mnTrevTurd)
|
|
CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() Trevor's Turd CREATED")
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
// CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() TURD waiting for next frame, entity already created this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ELSE
|
|
// CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() Trevor's Turd NOT LOADED")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bCreatePeds
|
|
IF NOT DOES_ENTITY_EXIST(pedSteve)
|
|
IF HAS_MODEL_LOADED(GET_NPC_PED_MODEL(CHAR_STEVE))
|
|
AND HAS_ANIM_DICT_LOADED(adSteve)
|
|
IF NOT bCreatedEntityThisFrame
|
|
IF CREATE_NPC_PED_ON_FOOT(pedSteve, CHAR_STEVE, vSteveCoords, fSteveHeading, FALSE)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(pedSteve, TRUE)
|
|
SET_PED_COMPONENT_VARIATION(pedSteve, PED_COMP_TORSO, 0, 1)
|
|
SET_PED_COMPONENT_VARIATION(pedSteve, PED_COMP_LEG, 0, 1)
|
|
Unload_Asset_Model(sAssetData, GET_NPC_PED_MODEL(CHAR_STEVE))
|
|
SET_PED_CREW(pedSteve)
|
|
CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() Steve created")
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
// CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() Steve not yet created")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ELSE
|
|
// CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() Steve waiting for next frame, entity already created this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ELSE
|
|
// CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() Steve model/animation NOT YET LOADED")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(pedSteve)
|
|
IF NOT DOES_ENTITY_EXIST(propPhoneSteve)
|
|
IF HAS_MODEL_LOADED(PROP_NPC_PHONE)
|
|
IF NOT bCreatedEntityThisFrame
|
|
propPhoneSteve = CREATE_OBJECT(PROP_NPC_PHONE, GET_PED_BONE_COORDS(pedSteve, BONETAG_PH_L_HAND, <<0,0,0>>))
|
|
Unload_Asset_Model(sAssetData, PROP_NPC_PHONE)
|
|
CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() Phone created")
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
// CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() Phone waiting for next frame, entity already created this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ELSE
|
|
// CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() Phone NOT YET LOADED")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(propPhoneSteve)
|
|
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(propPhoneSteve, pedSteve)
|
|
IF IS_ENTITY_ATTACHED(propPhoneSteve)
|
|
DETACH_ENTITY(propPhoneSteve, FALSE)
|
|
ENDIF
|
|
|
|
// Preventing 'Check if entity is alive' assert
|
|
IF NOT IS_ENTITY_DEAD(pedSteve)
|
|
ATTACH_ENTITY_TO_ENTITY(propPhoneSteve, pedSteve, GET_PED_BONE_INDEX(pedSteve, BONETAG_PH_L_HAND), <<0,0,0>>, <<0,0,0>>, TRUE, FALSE, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
// CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() Phone doesn't exist")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
IF NOT DOES_ENTITY_EXIST(pedVictim)
|
|
IF HAS_MODEL_LOADED(mnVictim)
|
|
IF NOT bCreatedEntityThisFrame
|
|
pedVictim = CREATE_PED(PEDTYPE_MISSION, mnVictim, <<143.5551, -2201.5913, 3.6880>>, 261.2970)
|
|
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(pedVictim, TRUE)
|
|
Unload_Asset_Model(sAssetData, mnVictim)
|
|
RESET_MR_K_VARIATIONS() // sets Mr K's variations to standard
|
|
MANAGE_MR_K_VARIATIONS()
|
|
SET_PED_CREW(pedVictim)
|
|
CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() Mr K created")
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
// CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() MrK waiting for next frame, entity already created this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ELSE
|
|
// CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() Mr K NOT LOADED")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(pedVictim)
|
|
AND NOT IS_PED_INJURED(pedVictim)
|
|
IF NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(pedVictim)
|
|
// CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() Mr K STREAMING REQUESTS NOT COMPLETED")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
// Initialise torture weapon positions
|
|
IF HAS_ANIM_DICT_LOADED("missfbi3_weapon_select")
|
|
|
|
VECTOR vDefaultPos
|
|
VECTOR vDefaultRot
|
|
TORTURE_ANIM_DATA sAnimData
|
|
|
|
IF TORTURE_GetTortureSceneAnimData(SCENE_WEAPON_SELECT_IDLE, sAnimData)
|
|
IF menuWeapon[TOR_WRENCH].model = DUMMY_MODEL_FOR_SCRIPT
|
|
vDefaultPos = GET_ANIM_INITIAL_OFFSET_POSITION("missfbi3_weapon_select", sAnimData.strBenchPositionerWrench, vTortureScene, vTortureRot)
|
|
vDefaultRot = GET_ANIM_INITIAL_OFFSET_ROTATION("missfbi3_weapon_select", sAnimData.strBenchPositionerWrench, vTortureScene, vTortureRot)
|
|
TORTURE_InitialiseMenuObject(menuWeapon[TOR_WRENCH],
|
|
vDefaultPos,
|
|
vDefaultRot,
|
|
VECTOR_ZERO, VECTOR_ZERO, TRUE, "TORTURE_Wrench", mnWrench)
|
|
ENDIF
|
|
IF menuWeapon[TOR_PLIERS].model = DUMMY_MODEL_FOR_SCRIPT
|
|
vDefaultPos = GET_ANIM_INITIAL_OFFSET_POSITION("missfbi3_weapon_select", sAnimData.strBenchPositionerPliers, vTortureScene, vTortureRot)
|
|
vDefaultRot = GET_ANIM_INITIAL_OFFSET_ROTATION("missfbi3_weapon_select", sAnimData.strBenchPositionerPliers, vTortureScene, vTortureRot)
|
|
TORTURE_InitialiseMenuObject(menuWeapon[TOR_PLIERS],
|
|
vDefaultPos,
|
|
vDefaultRot,
|
|
VECTOR_ZERO, VECTOR_ZERO, TRUE, "TORTURE_Pliers", mnPliers)
|
|
ENDIF
|
|
IF menuWeapon[TOR_CLIP0].model = DUMMY_MODEL_FOR_SCRIPT
|
|
vDefaultPos = GET_ANIM_INITIAL_OFFSET_POSITION("missfbi3_weapon_select", sAnimData.strBenchPositionerClip0, vTortureScene, vTortureRot)
|
|
vDefaultRot = GET_ANIM_INITIAL_OFFSET_ROTATION("missfbi3_weapon_select", sAnimData.strBenchPositionerClip0, vTortureScene, vTortureRot)
|
|
TORTURE_InitialiseMenuObject(menuWeapon[TOR_CLIP0],
|
|
vDefaultPos,
|
|
vDefaultRot,
|
|
VECTOR_ZERO, VECTOR_ZERO, TRUE, "TORTURE_Battery_clip_right", mnClip0)
|
|
ENDIF
|
|
IF menuWeapon[TOR_CLIP1].model = DUMMY_MODEL_FOR_SCRIPT
|
|
vDefaultPos = GET_ANIM_INITIAL_OFFSET_POSITION("missfbi3_weapon_select", sAnimData.strBenchPositionerClip1, vTortureScene, vTortureRot)
|
|
vDefaultRot = GET_ANIM_INITIAL_OFFSET_ROTATION("missfbi3_weapon_select", sAnimData.strBenchPositionerClip1, vTortureScene, vTortureRot)
|
|
TORTURE_InitialiseMenuObject(menuWeapon[TOR_CLIP1],
|
|
vDefaultPos,
|
|
vDefaultRot,
|
|
VECTOR_ZERO, VECTOR_ZERO, FALSE, "TORTURE_Battery_clip_left", mnClip1)
|
|
ENDIF
|
|
IF menuWeapon[TOR_WATER].model = DUMMY_MODEL_FOR_SCRIPT
|
|
vDefaultPos = GET_ANIM_INITIAL_OFFSET_POSITION("missfbi3_weapon_select", sAnimData.strBenchPositionerJerrycan, vTortureScene, vTortureRot)
|
|
vDefaultRot = GET_ANIM_INITIAL_OFFSET_ROTATION("missfbi3_weapon_select", sAnimData.strBenchPositionerJerrycan, vTortureScene, vTortureRot)
|
|
TORTURE_InitialiseMenuObject(menuWeapon[TOR_WATER],
|
|
vDefaultPos,
|
|
vDefaultRot,
|
|
VECTOR_ZERO, VECTOR_ZERO, TRUE, "TORTURE_Jerrycan", mnWater)
|
|
ENDIF
|
|
IF menuWeapon[TOR_RAG].model = DUMMY_MODEL_FOR_SCRIPT
|
|
vDefaultPos = GET_ANIM_INITIAL_OFFSET_POSITION("missfbi3_weapon_select", sAnimData.strBenchPositionerRag, vTortureScene, vTortureRot)
|
|
vDefaultRot = GET_ANIM_INITIAL_OFFSET_ROTATION("missfbi3_weapon_select", sAnimData.strBenchPositionerRag, vTortureScene, vTortureRot)
|
|
TORTURE_InitialiseMenuObject(menuWeapon[TOR_RAG],
|
|
vDefaultPos,
|
|
vDefaultRot,
|
|
VECTOR_ZERO, VECTOR_ZERO, FALSE, "TORTURE_rag", mnRag)
|
|
ENDIF
|
|
IF menuWeapon[TOR_SYRINGE].model = DUMMY_MODEL_FOR_SCRIPT
|
|
vDefaultPos = GET_ANIM_INITIAL_OFFSET_POSITION("missfbi3_weapon_select", sAnimData.strBenchPositionerSyringe, vTortureScene, vTortureRot)
|
|
vDefaultRot = GET_ANIM_INITIAL_OFFSET_ROTATION("missfbi3_weapon_select", sAnimData.strBenchPositionerSyringe, vTortureScene, vTortureRot)
|
|
TORTURE_InitialiseMenuObject(menuWeapon[TOR_SYRINGE],
|
|
vDefaultPos,
|
|
vDefaultRot,
|
|
VECTOR_ZERO, VECTOR_ZERO, FALSE, "TORTURE_Syringe", mnSyringe)
|
|
ENDIF
|
|
|
|
IF IS_VECTOR_ZERO(vTableCoords)
|
|
OR IS_VECTOR_ZERO(vTableRot)
|
|
vTableCoords = GET_ANIM_INITIAL_OFFSET_POSITION("missfbi3_weapon_select", sAnimData.strBenchPositionerTrolley, vTortureScene, vTortureRot)
|
|
vTableRot = GET_ANIM_INITIAL_OFFSET_ROTATION("missfbi3_weapon_select", sAnimData.strBenchPositionerTrolley, vTortureScene, vTortureRot)
|
|
ENDIF
|
|
|
|
IF IS_VECTOR_ZERO(vBatteryCoords)
|
|
OR IS_VECTOR_ZERO(vBatteryRot)
|
|
vBatteryCoords = GET_ANIM_INITIAL_OFFSET_POSITION("missfbi3_weapon_select", sAnimData.strBenchPositionerBattery, vTortureScene, vTortureRot)
|
|
vBatteryRot = GET_ANIM_INITIAL_OFFSET_ROTATION("missfbi3_weapon_select", sAnimData.strBenchPositionerBattery, vTortureScene, vTortureRot)
|
|
ENDIF
|
|
|
|
IF bCreateWeapons
|
|
|
|
IF NOT DOES_ENTITY_EXIST(objTable)
|
|
IF HAS_MODEL_LOADED(mnBench)
|
|
IF NOT bCreatedEntityThisFrame
|
|
objTable = CREATE_OBJECT(mnBench, vTableCoords)
|
|
Unload_Asset_Model(sAssetData, mnBench)
|
|
SET_ENTITY_COORDS_NO_OFFSET(objTable, vTableCoords)
|
|
SET_ENTITY_ROTATION(objTable, vTableRot)
|
|
SET_ENTITY_COLLISION(objTable, FALSE)
|
|
FREEZE_ENTITY_POSITION(objTable, TRUE)
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
// CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() TortureTable waiting for next frame, entity already created this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ELSE
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(objSmallTable)
|
|
IF HAS_MODEL_LOADED(mnSmallTable)
|
|
IF NOT bCreatedEntityThisFrame
|
|
objSmallTable = CREATE_OBJECT(mnSmallTable, vSmallTableCoords)
|
|
Unload_Asset_Model(sAssetData, mnSmallTable)
|
|
SET_ENTITY_COORDS_NO_OFFSET(objSmallTable, vSmallTableCoords)
|
|
SET_ENTITY_ROTATION(objSmallTable, vSmallTableRot)
|
|
FREEZE_ENTITY_POSITION(objSmallTable, TRUE)
|
|
SET_ENTITY_COLLISION(objSmallTable, FALSE)
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
// CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() TortureStool waiting for next frame, entity already created this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ELSE
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(objBattery)
|
|
IF HAS_MODEL_LOADED(mnBattery)
|
|
IF NOT bCreatedEntityThisFrame
|
|
objBattery = CREATE_OBJECT(mnBattery, vBatteryCoords)
|
|
Unload_Asset_Model(sAssetData, mnBattery)
|
|
SET_ENTITY_COORDS_NO_OFFSET(objBattery, vBatteryCoords)
|
|
SET_ENTITY_ROTATION(objBattery, vBatteryRot)
|
|
SET_ENTITY_COLLISION(objBattery, FALSE)
|
|
FREEZE_ENTITY_POSITION(objBattery, TRUE)
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
// CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() Battery waiting for next frame, entity already created this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ELSE
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(objMonitor)
|
|
IF HAS_MODEL_LOADED(mnMonitor)
|
|
IF NOT bCreatedEntityThisFrame
|
|
objMonitor = CREATE_OBJECT(mnMonitor, vMonitorCoords)
|
|
Unload_Asset_Model(sAssetData, mnMonitor)
|
|
SET_ENTITY_COORDS_NO_OFFSET(objMonitor, vMonitorCoords)
|
|
SET_ENTITY_ROTATION(objMonitor, vMonitorRot)
|
|
FREEZE_ENTITY_POSITION(objMonitor, TRUE)
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
// CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() Monitor waiting for next frame, entity already created this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ELSE
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// IF DOES_ENTITY_EXIST(objMonitor)
|
|
IF NOT IS_NAMED_RENDERTARGET_REGISTERED(sECGRenderTarget)
|
|
REGISTER_NAMED_RENDERTARGET(sECGRenderTarget)
|
|
LINK_NAMED_RENDERTARGET(mnMonitor)
|
|
rtECG = GET_NAMED_RENDERTARGET_RENDER_ID(sECGRenderTarget)
|
|
ENDIF
|
|
// ELSE
|
|
// bIsReady = FALSE
|
|
// ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(objChair)
|
|
IF HAS_MODEL_LOADED(mnChair)
|
|
IF NOT bCreatedEntityThisFrame
|
|
objChair = CREATE_OBJECT(mnChair, vChairCoords)
|
|
Unload_Asset_Model(sAssetData, mnChair)
|
|
SET_ENTITY_COORDS_NO_OFFSET(objChair, vChairCoords)
|
|
SET_ENTITY_ROTATION(objChair, vChairRot)
|
|
SET_ENTITY_COLLISION(objChair, FALSE)
|
|
FREEZE_ENTITY_POSITION(objChair, TRUE)
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
// CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() Chair waiting for next frame, entity already created this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ELSE
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Chair has to exist for tape to be created
|
|
IF DOES_ENTITY_EXIST(objChair)
|
|
|
|
IF NOT DOES_ENTITY_EXIST(objTapeArmLeft)
|
|
IF HAS_MODEL_LOADED(mnArmTape)
|
|
IF NOT bCreatedEntityThisFrame
|
|
objTapeArmLeft = CREATE_OBJECT(mnArmTape, vTortureScene + <<0.1,0,0>>)
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
// CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() TapeArmLeft waiting for next frame, entity already created this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ELSE
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(objTapeArmRight)
|
|
IF HAS_MODEL_LOADED(mnArmTape)
|
|
IF NOT bCreatedEntityThisFrame
|
|
objTapeArmRight = CREATE_OBJECT(mnArmTape, vTortureScene - <<0.1,0,0>>)
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
// CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() TapeArmRight waiting for next frame, entity already created this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ELSE
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
INT i
|
|
REPEAT COUNT_OF(menuWeapon) i
|
|
IF NOT DOES_ENTITY_EXIST(menuWeapon[i].objObject)
|
|
IF HAS_MODEL_LOADED(menuWeapon[i].model)
|
|
IF NOT bCreatedEntityThisFrame
|
|
CPRINTLN(DEBUG_MIKE, "***** FBI3: Creating weapon: ", menuWeapon[i].strCSName)
|
|
menuWeapon[i].objObject = CREATE_OBJECT(menuWeapon[i].model, menuWeapon[i].vDefaultCoords)
|
|
SET_ENTITY_COORDS_NO_OFFSET(menuWeapon[i].objObject, menuWeapon[i].vDefaultCoords)
|
|
SET_ENTITY_ROTATION(menuWeapon[i].objObject, menuWeapon[i].vDefaultRot)
|
|
SET_ENTITY_COLLISION(menuWeapon[i].objObject, FALSE)
|
|
CPRINTLN(DEBUG_MIKE, " Set weapon pos: ", menuWeapon[i].vDefaultCoords)
|
|
CPRINTLN(DEBUG_MIKE, " Set weapon rot: ", menuWeapon[i].vDefaultRot)
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
// CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() Weapon:", menuWeapon[i].strCSName, " waiting for next frame, entity already created this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ELSE
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
bIsReady = FALSE
|
|
CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() defeault positions unable to initialise")
|
|
ENDIF
|
|
|
|
ELSE
|
|
bIsReady = FALSE
|
|
CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() missfbi3_weapon_select NOT LOADED and object defeault positions not initialised")
|
|
ENDIF
|
|
|
|
|
|
IF NOT HAS_ANIM_DICT_LOADED("missfbi3_weapon_select")
|
|
OR NOT HAS_ANIM_DICT_LOADED("missfbi3_weapon_select_trolley")
|
|
OR NOT HAS_ANIM_DICT_LOADED(adSteve)
|
|
OR NOT HAS_ANIM_DICT_LOADED("SHAKE_CAM_medium")
|
|
bIsReady = FALSE
|
|
// CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() Dictionaries NOT LOADED")
|
|
ENDIF
|
|
|
|
IF NOT HAS_SCALEFORM_MOVIE_LOADED(sfHeartMonitor)
|
|
OR NOT HAS_SCALEFORM_MOVIE_LOADED(sfToothPull)
|
|
bIsReady = FALSE
|
|
// CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() Scaleform NOT LOADED")
|
|
ENDIF
|
|
|
|
IF NOT REQUEST_SCRIPT_AUDIO_BANK(sbTortureGeneral)
|
|
bIsReady = FALSE
|
|
// CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() Audiobank: General NOT LOADED")
|
|
ENDIF
|
|
|
|
IF NOT HAS_PTFX_ASSET_LOADED()
|
|
bIsReady = FALSE
|
|
// CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady() PTFX NOT LOADED")
|
|
ENDIF
|
|
|
|
CDEBUG2LN(DEBUG_MIKE, "TORTURE_IsTortureReady(",bCreatePeds,",",bCreateWeapons,",",bCreateVehicle,") return: ", bIsReady)
|
|
RETURN bIsReady
|
|
ENDFUNC
|
|
|
|
//PURPOSE: Cleans up the menu object bools, stops the synchronized scene animation and tidies up the object based on bImmediately
|
|
PROC TORTURE_CleanupWeapon(sMenuObject &thisObject, BOOL bImmediately = FALSE)
|
|
IF DOES_ENTITY_EXIST(thisObject.objObject)
|
|
TORTURE_StopTortureWeaponAnim(thisObject, INSTANT_BLEND_OUT)
|
|
TidyUpObject(thisObject.objObject, bImmediately)
|
|
ENDIF
|
|
thisObject.bIsHighlighted = FALSE
|
|
thisObject.bHasPlayedAnim = FALSE
|
|
ENDPROC
|
|
|
|
//PURPOSE: Release all the sound resources
|
|
PROC TORTURE_ReleaseAllSounds()
|
|
ReleaseSound(SND_ELEC_HUM_LOOP)
|
|
ReleaseSound(SND_ELEC_ZAP_LOOP)
|
|
ReleaseSound(SND_ELEC_ATTACH_CLIP_LEFT)
|
|
ReleaseSound(SND_ELEC_ATTACH_CLIP_RIGHT)
|
|
ReleaseSound(SND_ELEC_SPARK)
|
|
ReleaseSound(SND_TOOTH_PULL_LOOP)
|
|
ReleaseSound(SND_TOOTH_PULL_OUT)
|
|
ReleaseSound(SND_WATER_POUR_LOOP)
|
|
ReleaseSound(SND_WATER_PICK_UP)
|
|
ReleaseSound(SND_WRENCH_HIT)
|
|
ENDPROC
|
|
|
|
//PURPOSE: Cleans up the torture scene
|
|
PROC TORTURE_CleanupEntitiesAndAssets()
|
|
|
|
IF DOES_ENTITY_EXIST(TREV_PED_ID())
|
|
AND NOT IS_PED_INJURED(TREV_PED_ID())
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(TREV_PED_ID())
|
|
FREEZE_ENTITY_POSITION(TREV_PED_ID(), TRUE)
|
|
ENDIF
|
|
SET_ENTITY_INVINCIBLE(TREV_PED_ID(), TRUE)
|
|
// url:bugstar:2107753
|
|
IF PLAYER_PED_ID() != TREV_PED_ID()
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(TREV_PED_ID(), FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
Unload_Asset_Model(sAssetData, mnSmallTable)
|
|
Unload_Asset_Model(sAssetData, mnBench)
|
|
Unload_Asset_Model(sAssetData, mnMonitor)
|
|
Unload_Asset_Model(sAssetData, mnChair)
|
|
Unload_Asset_Model(sAssetData, mnBattery)
|
|
Unload_Asset_Model(sAssetData, mnTooth)
|
|
|
|
Unload_Asset_Model(sAssetData, mnWrench)
|
|
Unload_Asset_Model(sAssetData, mnClip0)
|
|
Unload_Asset_Model(sAssetData, mnClip1)
|
|
Unload_Asset_Model(sAssetData, mnWater)
|
|
Unload_Asset_Model(sAssetData, mnRag)
|
|
Unload_Asset_Model(sAssetData, mnPliers)
|
|
Unload_Asset_Model(sAssetData, mnSyringe)
|
|
Unload_Asset_Model(sAssetData, mnArmTape)
|
|
Unload_Asset_Model(sAssetData, mnUVFaceProp)
|
|
|
|
Unload_Asset_Model(sAssetData, mnTrevTurd)
|
|
|
|
//Unload_Asset_PTFX(sAssetData)
|
|
Unload_Asset_Anim_Dict(sAssetData, adSteve)
|
|
Unload_Asset_Anim_Dict(sAssetData, "missfbi3_weapon_select")
|
|
Unload_Asset_Anim_Dict(sAssetData, "missfbi3_weapon_select_trolley")
|
|
Unload_Asset_Anim_Dict(sAssetData, "SHAKE_CAM_medium")
|
|
Unload_Asset_Scaleform(sAssetData, sfHeartMonitor)
|
|
Unload_Asset_Scaleform(sAssetData, sfToothPull)
|
|
Unload_Asset_Audio_Bank(sAssetData, sbTortureGeneral)
|
|
Unload_Asset_Audio_Bank(sAssetData, sbTortureElec)
|
|
Unload_Asset_Audio_Bank(sAssetData, sbTortureTeeth)
|
|
Unload_Asset_Audio_Bank(sAssetData, "FBI_03_Torture_Teeth_Pain")
|
|
Unload_Asset_Audio_Bank(sAssetData, sbTortureWater)
|
|
Unload_Asset_Audio_Bank(sAssetData, sbTortureWrench)
|
|
Unload_Asset_Audio_Bank(sAssetData, "FBI_03_Torture_Chair")
|
|
|
|
Unload_Asset_Model(sAssetData, GET_NPC_PED_MODEL(CHAR_STEVE))
|
|
Unload_Asset_Model(sAssetData, IG_MRK)
|
|
|
|
// solves the 0 bmp problem with the scaleform.
|
|
fCurrentSFBMP = -1
|
|
fCurrentSFHealth = -1
|
|
|
|
TORTURE_ReleaseAllSounds()
|
|
|
|
IF IS_NAMED_RENDERTARGET_REGISTERED(sECGRenderTarget)
|
|
RELEASE_NAMED_RENDERTARGET(sECGRenderTarget)
|
|
ENDIF
|
|
|
|
TidyUpObject(objTable, TRUE)
|
|
TidyUpObject(objSmallTable, TRUE)
|
|
TidyUpObject(objBattery, TRUE)
|
|
TidyUpObject(objChair, TRUE)
|
|
TidyUpObject(objMonitor, TRUE)
|
|
TidyUpObject(objTooth, TRUE)
|
|
TidyUpObject(objs[mof_turd], TRUE)
|
|
TidyUpObject(objTapeArmLeft, TRUE)
|
|
TidyUpObject(objTapeArmRight, TRUE)
|
|
TidyUpObject(propPhoneSteve, TRUE)
|
|
|
|
INT iCounter
|
|
FOR iCounter = 0 TO ENUM_TO_INT(NO_OF_TORTURE_WEAPONS)-1
|
|
TORTURE_CleanupWeapon(menuWeapon[iCounter], TRUE)
|
|
ENDFOR
|
|
TidyUpPed(pedSteve, TRUE)
|
|
TidyUpPed(pedVictim, TRUE)
|
|
TidyUpVehicle(vehTrevor, TRUE)
|
|
|
|
IF IS_CHEAT_DISABLED(CHEAT_TYPE_ALL)
|
|
DISABLE_CHEAT(CHEAT_TYPE_ALL, FALSE)
|
|
ENDIF
|
|
|
|
bECGSetup = FALSE
|
|
ENDPROC
|
|
|
|
//PURPOSE: Deletes an existing prop and registers it for the cutscene for recreate it (all this to avoid a bloody assert!)
|
|
PROC TORTURE_RegisterPropForCutscene(OBJECT_INDEX &prop, STRING handle, MODEL_NAMES model, CUTSCENE_USAGE usage)
|
|
IF usage = CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY
|
|
IF DOES_ENTITY_EXIST(prop)
|
|
//DELETE_ATTACHED_PROP(prop)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(prop, handle, CU_ANIMATE_EXISTING_SCRIPT_ENTITY, model)
|
|
ELSE
|
|
REGISTER_ENTITY_FOR_CUTSCENE(null, handle, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, model)
|
|
ENDIF
|
|
ELIF usage = CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY
|
|
OR usage = CU_ANIMATE_EXISTING_SCRIPT_ENTITY
|
|
IF DOES_ENTITY_EXIST(prop)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(prop, handle, usage, model)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: Registers Torture Props with the current loaded cutscene
|
|
PROC TORTURE_RegisterAllPropsForCutscene(BOOL bPropsNeededPostCutscene = TRUE, BOOL bDaveStartsWithPhone = FALSE)
|
|
|
|
TEXT_LABEL_23 strPhoneHandle
|
|
IF bDaveStartsWithPhone
|
|
strPhoneHandle = "DaveNortons_Phone"
|
|
ELSE
|
|
strPhoneHandle = "SteveHains_Phone"
|
|
ENDIF
|
|
|
|
IF NOT bPropsNeededPostCutscene
|
|
|
|
TORTURE_RegisterPropForCutscene(propPhoneSteve, strPhoneHandle, PROP_NPC_PHONE, CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
|
|
TORTURE_RegisterPropForCutscene(objTable, csTable, mnBench, CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
TORTURE_RegisterPropForCutscene(objSmallTable, csSmallTable, mnSmallTable, CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
TORTURE_RegisterPropForCutscene(objBattery, csBattery, mnBattery, CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
TORTURE_RegisterPropForCutscene(objChair, csChair, mnChair, CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
TORTURE_RegisterPropForCutscene(objMonitor, csMonitor, mnMonitor, CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
TORTURE_RegisterPropForCutscene(objTapeArmLeft, csTapeArmLeft, mnArmTape, CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
TORTURE_RegisterPropForCutscene(objTapeArmRight,csTapeArmRight, mnArmTape, CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
|
|
TORTURE_RegisterPropForCutscene(menuWeapon[TOR_WRENCH].objObject, csWrench, mnWrench, CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
TORTURE_RegisterPropForCutscene(menuWeapon[TOR_PLIERS].objObject, csPliers, mnPliers, CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
TORTURE_RegisterPropForCutscene(menuWeapon[TOR_CLIP0].objObject, csClip0, mnClip0, CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
TORTURE_RegisterPropForCutscene(menuWeapon[TOR_CLIP1].objObject, csClip1, mnClip1, CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
TORTURE_RegisterPropForCutscene(menuWeapon[TOR_WATER].objObject, csWater, mnWater, CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
TORTURE_RegisterPropForCutscene(menuWeapon[TOR_RAG].objObject, csRag, mnRag, CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
TORTURE_RegisterPropForCutscene(menuWeapon[TOR_SYRINGE].objObject, csSyringe, mnSyringe, CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
|
|
ELSE
|
|
TORTURE_RegisterPropForCutscene(propPhoneSteve, strPhoneHandle, PROP_NPC_PHONE, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY)
|
|
|
|
TORTURE_RegisterPropForCutscene(objTable, csTable, mnBench, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY)
|
|
TORTURE_RegisterPropForCutscene(objSmallTable, csSmallTable, mnSmallTable, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY)
|
|
TORTURE_RegisterPropForCutscene(objBattery, csBattery, mnBattery, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY)
|
|
TORTURE_RegisterPropForCutscene(objChair, csChair, mnChair, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY)
|
|
TORTURE_RegisterPropForCutscene(objMonitor, csMonitor, mnMonitor, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY)
|
|
TORTURE_RegisterPropForCutscene(objTapeArmLeft, csTapeArmLeft, mnArmTape, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY)
|
|
TORTURE_RegisterPropForCutscene(objTapeArmRight,csTapeArmRight, mnArmTape, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY)
|
|
|
|
TORTURE_RegisterPropForCutscene(menuWeapon[TOR_WRENCH].objObject, csWrench, mnWrench, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY)
|
|
TORTURE_RegisterPropForCutscene(menuWeapon[TOR_PLIERS].objObject, csPliers, mnPliers, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY)
|
|
TORTURE_RegisterPropForCutscene(menuWeapon[TOR_CLIP0].objObject, csClip0, mnClip0, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY)
|
|
TORTURE_RegisterPropForCutscene(menuWeapon[TOR_CLIP1].objObject, csClip1, mnClip1, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY)
|
|
TORTURE_RegisterPropForCutscene(menuWeapon[TOR_WATER].objObject, csWater, mnWater, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY)
|
|
TORTURE_RegisterPropForCutscene(menuWeapon[TOR_RAG].objObject, csRag, mnRag, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY)
|
|
TORTURE_RegisterPropForCutscene(menuWeapon[TOR_SYRINGE].objObject, csSyringe, mnSyringe, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: Attempts to grab a prop index from the cutscene
|
|
FUNC BOOL TORTURE_GetPropFromCutscene(OBJECT_INDEX &propId, STRING handle, MODEL_NAMES model = DUMMY_MODEL_FOR_SCRIPT)
|
|
ENTITY_INDEX entity
|
|
IF NOT IS_CUTSCENE_PLAYING()
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(propID)
|
|
//CPRINTLN(DEBUG_MIKE, "\n Attemping to grab prop: ", handle)
|
|
entity = GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(handle, model)
|
|
IF DOES_ENTITY_EXIST(entity)
|
|
propID = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(entity)
|
|
// RETAIN_ENTITY_IN_INTERIOR(entity, interiorGarage)
|
|
CDEBUG2LN(DEBUG_MIKE, " Succesfully grabbed prop: ", handle)
|
|
RETURN TRUE
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MIKE, " Failed to grab prop: ", handle)
|
|
RETURN FALSE
|
|
ENDIF
|
|
ELSE
|
|
//CPRINTLN(DEBUG_MIKE, " Already grabbed prop: ", handle)
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDFUNC
|
|
|
|
//PURPOSE: Grabs the indices of the torture props that have been created by the cutscene
|
|
FUNC BOOL TORTURE_GrabAllPropsFromCutscene(BOOL bDaveStartsWithPhone = FALSE)
|
|
IF NOT IS_CUTSCENE_PLAYING()
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
//CPRINTLN(DEBUG_MIKE, "\n\n*****Attempting to Grab Torture Props From Cutscene*****")
|
|
|
|
BOOL bFinished = TRUE
|
|
|
|
IF bDaveStartsWithPhone
|
|
IF NOT TORTURE_GetPropFromCutscene(propPhoneSteve, "DaveNortons_Phone", PROP_NPC_PHONE) bFinished = FALSE ENDIF
|
|
ELSE
|
|
IF NOT TORTURE_GetPropFromCutscene(propPhoneSteve, "SteveHains_Phone", PROP_NPC_PHONE) bFinished = FALSE ENDIF
|
|
ENDIF
|
|
|
|
IF NOT TORTURE_GetPropFromCutscene(objTable, csTable, mnBench) bFinished = FALSE ENDIF
|
|
IF NOT TORTURE_GetPropFromCutscene(objSmallTable, csSmallTable, mnSmallTable) bFinished = FALSE ENDIF
|
|
IF NOT TORTURE_GetPropFromCutscene(objChair, csChair, mnChair) bFinished = FALSE ENDIF
|
|
IF NOT TORTURE_GetPropFromCutscene(objMonitor, csMonitor , mnMonitor)
|
|
bFinished = FALSE
|
|
ELSE
|
|
IF DOES_ENTITY_EXIST(objMonitor)
|
|
IF NOT IS_NAMED_RENDERTARGET_REGISTERED(sECGRenderTarget)
|
|
REGISTER_NAMED_RENDERTARGET(sECGRenderTarget)
|
|
LINK_NAMED_RENDERTARGET(mnMonitor)
|
|
rtECG = GET_NAMED_RENDERTARGET_RENDER_ID(sECGRenderTarget)
|
|
ENDIF
|
|
ELSE
|
|
bFinished = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT TORTURE_GetPropFromCutscene(objBattery, csBattery, mnBattery) bFinished = FALSE ENDIF
|
|
IF NOT TORTURE_GetPropFromCutscene(objTapeArmLeft, csTapeArmLeft, mnArmTape) bFinished = FALSE ENDIF
|
|
IF NOT TORTURE_GetPropFromCutscene(objTapeArmRight, csTapeArmRight, mnArmTape) bFinished = FALSE ENDIF
|
|
|
|
IF NOT TORTURE_GetPropFromCutscene(menuWeapon[TOR_WRENCH].objObject, csWrench, mnWrench) bFinished = FALSE ENDIF
|
|
IF NOT TORTURE_GetPropFromCutscene(menuWeapon[TOR_WATER].objObject, csWater, mnWater) bFinished = FALSE ENDIF
|
|
IF NOT TORTURE_GetPropFromCutscene(menuWeapon[TOR_RAG].objObject, csRag, mnRag) bFinished = FALSE ENDIF
|
|
IF NOT TORTURE_GetPropFromCutscene(menuWeapon[TOR_CLIP0].objObject, csClip0, mnClip0) bFinished = FALSE ENDIF
|
|
IF NOT TORTURE_GetPropFromCutscene(menuWeapon[TOR_CLIP1].objObject, csClip1, mnClip1) bFinished = FALSE ENDIF
|
|
IF NOT TORTURE_GetPropFromCutscene(menuWeapon[TOR_PLIERS].objObject, csPliers, mnPliers) bFinished = FALSE ENDIF
|
|
IF NOT TORTURE_GetPropFromCutscene(menuWeapon[TOR_SYRINGE].objObject, csSyringe, mnSyringe) bFinished = FALSE ENDIF
|
|
|
|
RETURN bFinished
|
|
ENDFUNC
|
|
|
|
FUNC BOOL TORTURE_GrabAllPedsFromCutscene(MODEL_NAMES modMrK = DUMMY_MODEL_FOR_SCRIPT)
|
|
BOOL bFinished = TRUE
|
|
ENTITY_INDEX entity
|
|
|
|
IF NOT DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR])
|
|
entity = GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Trevor")
|
|
IF DOES_ENTITY_EXIST(entity)
|
|
sSelectorPeds.pedID[SELECTOR_PED_TREVOR] = GET_PED_INDEX_FROM_ENTITY_INDEX(entity)
|
|
ELSE
|
|
bFinished = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(pedVictim)
|
|
|
|
IF modMrK = DUMMY_MODEL_FOR_SCRIPT
|
|
entity = GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(strMrKCSHandle, mnVictim)
|
|
ELSE
|
|
entity = GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(strMrKCSHandle, modMrK)
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(entity)
|
|
pedVictim = GET_PED_INDEX_FROM_ENTITY_INDEX(entity)
|
|
//RESET_MR_K_VARIATIONS()
|
|
MANAGE_MR_K_VARIATIONS()
|
|
|
|
// RETAIN_ENTITY_IN_INTERIOR(pedVictim, interiorGarage)
|
|
ELSE
|
|
bFinished = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(pedSteve)
|
|
entity = GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(csSteve, IG_STEVEHAINS)
|
|
IF DOES_ENTITY_EXIST(entity)
|
|
pedSteve = GET_PED_INDEX_FROM_ENTITY_INDEX(entity)
|
|
// RETAIN_ENTITY_IN_INTERIOR(pedSteve, interiorGarage)
|
|
ELSE
|
|
bFinished = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN bFinished
|
|
ENDFUNC
|
|
|
|
PROC TORTURE_SpikeHeartRate(FLOAT fSpikePecentage, INT iSpikeInTime, INT iSpikeHoldTime, INT iSpikeReturnTime)
|
|
|
|
fBPM_SpikeDesired = (fMaxBPM - fBPM_Base) * fSpikePecentage
|
|
fBPM_SpikeStart = fBPM_Spike
|
|
iBPM_SpikeTimer = GET_GAME_TIMER()
|
|
iBPM_SpikeInTime = iSpikeInTime
|
|
iBPM_SpikeHoldTime = iSpikeHoldTime
|
|
iBPM_SpikeReturnTime = iSpikeReturnTime
|
|
|
|
ENDPROC
|
|
|
|
//PURPOSE: Sets the heartbeat bool true for one frame according to the BPM
|
|
PROC TORTURE_ManageHeartbeat()
|
|
|
|
CDEBUG1LN(DEBUG_MIKE, "TORTURE_ManageHeartbeat() CALLED")
|
|
|
|
FLOAT fHeartRate
|
|
|
|
IF bFlatLine
|
|
bHeartbeatFrame = FALSE
|
|
fBPM_Base = 0
|
|
fBPM_Spike = 0
|
|
fBPM_SpikeDesired = 0
|
|
fBPM_SpikeStart = 0
|
|
fHeartRate = 0
|
|
|
|
CDEBUG1LN(DEBUG_MIKE, "TORTURE_ManageHeartbeat(): FLATLINE")
|
|
|
|
// Calculate heart rate
|
|
ELSE
|
|
|
|
// Calculate the base rate off of the peds health
|
|
fBPM_Base = CLAMP(fMinBPM + ((1-(fVictimHealth/fVictimMaxHealth))*(fMaxBPM-fMinBPM)), 0, fMaxBPM)
|
|
|
|
// Calculate the spike heart rate
|
|
IF fBPM_SpikeDesired = 0
|
|
fBPM_Spike = 0
|
|
ELSE
|
|
INT iSpikeTimer = GET_GAME_TIMER() - iBPM_SpikeTimer
|
|
FLOAT fAlpha
|
|
// Spike in
|
|
IF iSpikeTimer <= iBPM_SpikeInTime
|
|
|
|
fAlpha = CLAMP(iSpikeTimer / TO_FLOAT(iBPM_SpikeInTime), 0.0, 1.0)
|
|
fBPM_Spike = LERP_FLOAT(fBPM_SpikeStart, fBPM_SpikeDesired, fAlpha)
|
|
|
|
// Spike hold
|
|
ELIF iSpikeTimer <= iBPM_SpikeHoldTime
|
|
|
|
|
|
fBPM_Spike = fBPM_SpikeDesired
|
|
|
|
// Spike return
|
|
ELIF iSpikeTimer <= iBPM_SpikeReturnTime
|
|
|
|
fAlpha = CLAMP( (iSpikeTimer - iBPM_SpikeHoldTime - iBPM_SpikeInTime) / TO_FLOAT(iBPM_SpikeReturnTime), 0.0, 1.0)
|
|
fBPM_Spike = LERP_FLOAT(fBPM_SpikeDesired, 0.0, fAlpha)
|
|
|
|
// Reset the spike
|
|
ELSE
|
|
|
|
fBPM_Spike = 0
|
|
fBPM_SpikeDesired = 0
|
|
fBPM_SpikeStart = 0
|
|
iBPM_SpikeTimer = 0
|
|
iBPM_SpikeInTime = 0
|
|
iBPM_SpikeHoldTime = 0
|
|
iBPM_SpikeReturnTime = 0
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Overall rate
|
|
fHeartRate = fBPM_Base + fBPM_Spike + GET_RANDOM_INT_IN_RANGE(0, 3)
|
|
|
|
IF GET_GAME_TIMER() - iLastHeartBeatTime >= ROUND(60000/fHeartRate)
|
|
bHeartbeatFrame = TRUE
|
|
iLastHeartBeatTime = GET_GAME_TIMER()
|
|
CDEBUG1LN(DEBUG_MIKE, "TORTURE_ManageHeartbeat(): heartBeat")
|
|
ELSE
|
|
bHeartbeatFrame = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// render target does not need the object to exist,
|
|
// the final cutscene in the torture room creates the object and the script does not have a handle to it
|
|
//IF DOES_ENTITY_EXIST(objMonitor)
|
|
IF sfHeartMonitor != NULL
|
|
AND HAS_SCALEFORM_MOVIE_LOADED(sfHeartMonitor)
|
|
IF GET_GAME_TIMER() - iUpdateEKGTimer > 500
|
|
IF fCurrentSFBMP != fHeartRate
|
|
fCurrentSFBMP = fHeartRate
|
|
INT iBPM = ROUND(fCurrentSFBMP)
|
|
FLOAT fRoundBPM = TO_FLOAT(iBPM)
|
|
BEGIN_SCALEFORM_MOVIE_METHOD(sfHeartMonitor, "SET_HEART_RATE")
|
|
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fRoundBPM)
|
|
END_SCALEFORM_MOVIE_METHOD()
|
|
ENDIF
|
|
iUpdateEKGTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
IF fCurrentSFHealth != fVictimHealth
|
|
fCurrentSFHealth = fVictimHealth
|
|
BEGIN_SCALEFORM_MOVIE_METHOD(sfHeartMonitor, "SET_HEALTH")
|
|
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fCurrentSFHealth)
|
|
END_SCALEFORM_MOVIE_METHOD()
|
|
ENDIF
|
|
IF NOT bFlatLine
|
|
IF bHeartbeatFrame
|
|
BEGIN_SCALEFORM_MOVIE_METHOD(sfHeartMonitor, "SET_HEART_BEAT")
|
|
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(3.5)
|
|
END_SCALEFORM_MOVIE_METHOD()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
|
|
//PURPOSE: Vibrates the pad based on the phases of various sync scenes
|
|
PROC TORTURE_ManagePadVibration()
|
|
INT iDuration, iFrequency = 0
|
|
FLOAT fPhase = 0
|
|
|
|
CONST_INT I_HEARTBEAT_VIBRATION_DUR 130
|
|
CONST_INT I_HEARTBEAT_VIBRATION_FREQ 130
|
|
|
|
INT iLeftTriggerDur, iLeftTriggerFreq = 0
|
|
INT iRightTriggerDur, iRightTriggerFreq = 0
|
|
|
|
//If it's a heartbeat frame, heartbeat!
|
|
IF bHeartbeatFrame
|
|
AND NOT bFlatLine
|
|
iDuration = MAX_INTEGER(iDuration, I_HEARTBEAT_VIBRATION_DUR)
|
|
iFrequency = MAX_INTEGER(iFrequency, I_HEARTBEAT_VIBRATION_FREQ)
|
|
ENDIF
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WRENCH_LEFT]) //Wrench smack
|
|
AND eLastTorturePlayed = SCENE_WRENCH_LEFT
|
|
fPhase = GET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_WRENCH_LEFT])
|
|
IF fPhase > 0.393 AND fPhase < 0.407
|
|
|
|
iDuration = MAX_INTEGER(iDuration, 260)
|
|
iFrequency = MAX_INTEGER(iFrequency, 255)
|
|
|
|
IF IS_XBOX_PLATFORM()
|
|
iRightTriggerDur = MAX_INTEGER(iRightTriggerDur, 260)
|
|
iRightTriggerFreq = MAX_INTEGER(iRightTriggerFreq, 255)
|
|
ENDIF
|
|
|
|
TORTURE_PlaySteveReaction()
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WRENCH_MID]) //Wrench smack
|
|
AND eLastTorturePlayed = SCENE_WRENCH_MID
|
|
fPhase = GET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_WRENCH_MID])
|
|
IF fPhase > 0.185 AND fPhase < 0.202
|
|
|
|
iDuration = MAX_INTEGER(iDuration, 260)
|
|
iFrequency = MAX_INTEGER(iFrequency, 255)
|
|
|
|
IF IS_XBOX_PLATFORM()
|
|
iRightTriggerDur = MAX_INTEGER(iRightTriggerDur, 260)
|
|
iRightTriggerFreq = MAX_INTEGER(iRightTriggerFreq, 255)
|
|
ENDIF
|
|
|
|
TORTURE_PlaySteveReaction()
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WRENCH_RIGHT]) //Wrench smack
|
|
AND eLastTorturePlayed = SCENE_WRENCH_RIGHT
|
|
fPhase = GET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_WRENCH_RIGHT])
|
|
IF fPhase > 0.245 AND fPhase < 0.268
|
|
|
|
iDuration = MAX_INTEGER(iDuration, 260)
|
|
iFrequency = MAX_INTEGER(iFrequency, 255)
|
|
|
|
IF IS_XBOX_PLATFORM()
|
|
iRightTriggerDur = MAX_INTEGER(iRightTriggerDur, 260)
|
|
iRightTriggerFreq = MAX_INTEGER(iRightTriggerFreq, 255)
|
|
ENDIF
|
|
|
|
TORTURE_PlaySteveReaction()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// As the pliers enter the victims mouth do a quick impulse
|
|
IF ( IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PLIERS_ATTACH] ) AND eLastTorturePlayed = SCENE_PLIERS_ATTACH )
|
|
OR ( IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PLIERS_READY_OUT] ) AND eLastTorturePlayed = SCENE_PLIERS_READY_OUT )
|
|
|
|
BOOL bAttached
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PLIERS_ATTACH] ) AND eLastTorturePlayed = SCENE_PLIERS_ATTACH
|
|
|
|
fPhase = GET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_PLIERS_ATTACH])
|
|
IF fPhase > 0.762 AND fPhase < 0.837
|
|
bAttached = TRUE
|
|
ENDIF
|
|
|
|
ELIF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PLIERS_READY_OUT] ) AND eLastTorturePlayed = SCENE_PLIERS_READY_OUT
|
|
|
|
fPhase = GET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_PLIERS_READY_OUT])
|
|
IF fPhase > 0.444 AND fPhase < 0.581
|
|
bAttached = TRUE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF bAttached
|
|
|
|
IF IS_XBOX_PLATFORM()
|
|
iRightTriggerDur = MAX_INTEGER(iRightTriggerDur, 130)
|
|
iRightTriggerFreq = MAX_INTEGER(iRightTriggerDur, 200)
|
|
ELSE
|
|
iDuration = MAX_INTEGER(iDuration, 130)
|
|
iFrequency = MAX_INTEGER(iFrequency, 200)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELIF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PLIERS_READY_IN] ) AND eLastTorturePlayed = SCENE_PLIERS_READY_IN
|
|
|
|
fPhase = GET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_PLIERS_READY_IN])
|
|
IF fPhase < 0.140
|
|
|
|
IF IS_XBOX_PLATFORM()
|
|
iRightTriggerDur = MAX_INTEGER(iRightTriggerDur, 100)
|
|
iRightTriggerFreq = MAX_INTEGER(iRightTriggerDur, 100)
|
|
ELSE
|
|
iDuration = MAX_INTEGER(iDuration, 100)
|
|
iFrequency = MAX_INTEGER(iFrequency, 100)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
|
|
// As the pliers are held in the mouth do shake
|
|
IF bPliersInMouth
|
|
INT iLocalDur, iLocalFreq
|
|
IF fPullStrength > 0.0
|
|
|
|
iLocalDur = 130
|
|
iLocalFreq = 20 + ROUND(20 * CLAMP(fTortureForceApplied/F_TOOTH_PULL_FORCE_LIMIT, 0.0, 1.0))
|
|
+ ROUND(215 * fPullStrength)
|
|
ELSE
|
|
|
|
IF IS_XBOX_PLATFORM()
|
|
IF bHeartbeatFrame
|
|
AND NOT bFlatLine
|
|
iLocalDur = I_HEARTBEAT_VIBRATION_DUR
|
|
iLocalFreq = I_HEARTBEAT_VIBRATION_FREQ
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF IS_XBOX_PLATFORM()
|
|
iRightTriggerDur = MAX_INTEGER(iRightTriggerDur, iLocalDur)
|
|
iRightTriggerFreq = MAX_INTEGER(iRightTriggerFreq, iLocalFreq)
|
|
ELSE
|
|
iDuration = MAX_INTEGER(iDuration, iLocalDur)
|
|
iFrequency = MAX_INTEGER(iFrequency, iLocalFreq)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PLIERS_PULL_OUT]) //Shake for when tooth pops out
|
|
AND eLastTorturePlayed = SCENE_PLIERS_PULL_OUT
|
|
fPhase = GET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_PLIERS_PULL_OUT])
|
|
IF fPhase > 0.014 AND fPhase < 0.032
|
|
|
|
IF IS_XBOX_PLATFORM()
|
|
iRightTriggerDur = MAX_INTEGER(iRightTriggerDur, 260)
|
|
iRightTriggerFreq = MAX_INTEGER(iRightTriggerFreq, 255)
|
|
ELSE
|
|
iDuration = MAX_INTEGER(iDuration, 260)
|
|
iFrequency = MAX_INTEGER(iFrequency, 255)
|
|
ENDIF
|
|
|
|
TORTURE_PlaySteveReaction()
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PLIERS_PULL_OUT2]) //Shake for when tooth pops out
|
|
AND eLastTorturePlayed = SCENE_PLIERS_PULL_OUT2
|
|
fPhase = GET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_PLIERS_PULL_OUT2])
|
|
IF fPhase > 0.06 AND fPhase < 0.082
|
|
|
|
IF IS_XBOX_PLATFORM()
|
|
iRightTriggerDur = MAX_INTEGER(iRightTriggerDur, 260)
|
|
iRightTriggerFreq = MAX_INTEGER(iRightTriggerFreq, 255)
|
|
ELSE
|
|
iDuration = MAX_INTEGER(iDuration, 260)
|
|
iFrequency = MAX_INTEGER(iFrequency, 255)
|
|
ENDIF
|
|
|
|
TORTURE_PlaySteveReaction()
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PLIERS_READY_OUT]) //Shakes for when plier reattach to teeth
|
|
AND eLastTorturePlayed = SCENE_PLIERS_PULL_OUT2
|
|
fPhase = GET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_PLIERS_READY_OUT])
|
|
IF fPhase > 0.562 AND fPhase < 1.0
|
|
|
|
IF IS_XBOX_PLATFORM()
|
|
iRightTriggerDur = MAX_INTEGER(iRightTriggerDur, 130)
|
|
iRightTriggerFreq = MAX_INTEGER(iRightTriggerFreq, 200)
|
|
ELSE
|
|
iDuration = MAX_INTEGER(iDuration, 130)
|
|
iFrequency = MAX_INTEGER(iFrequency, 200)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_ELEC_SPARK]) //Elec Spark buzz
|
|
AND eLastTorturePlayed = SCENE_ELEC_SPARK
|
|
fPhase = GET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_ELEC_SPARK])
|
|
IF fPhase > 0.142 AND fPhase < 0.213
|
|
|
|
IF IS_XBOX_PLATFORM()
|
|
iLeftTriggerDur = MAX_INTEGER(iLeftTriggerDur, 130)
|
|
iLeftTriggerFreq = MAX_INTEGER(iLeftTriggerFreq, 255)
|
|
iRightTriggerDur = MAX_INTEGER(iRightTriggerDur, 130)
|
|
iRightTriggerFreq = MAX_INTEGER(iRightTriggerFreq, 255)
|
|
ENDIF
|
|
|
|
iDuration = MAX_INTEGER(iDuration, 130)
|
|
iFrequency = MAX_INTEGER(iFrequency, 255)
|
|
|
|
TORTURE_PlaySteveReaction()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_ELEC_OUTRO]) //End electrocution buzz
|
|
AND eLastTorturePlayed = SCENE_ELEC_OUTRO
|
|
|
|
fPhase = GET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_ELEC_OUTRO])
|
|
IF fPhase > 0.0 AND fPhase < 0.198
|
|
|
|
IF IS_XBOX_PLATFORM()
|
|
iLeftTriggerDur = MAX_INTEGER(iLeftTriggerDur, 130)
|
|
iLeftTriggerFreq = MAX_INTEGER(iLeftTriggerFreq, 255)
|
|
iRightTriggerDur = MAX_INTEGER(iRightTriggerDur, 130)
|
|
iRightTriggerFreq = MAX_INTEGER(iRightTriggerFreq, 255)
|
|
ELSE
|
|
iDuration = MAX_INTEGER(iDuration, 130)
|
|
iFrequency = MAX_INTEGER(iFrequency, 255)
|
|
ENDIF
|
|
|
|
TORTURE_PlaySteveReaction()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
|
|
// Electrocution loop
|
|
IF fClipGripProgLeft >= 1.0 AND fClipGripProgRight >= 1.0
|
|
|
|
INT iLocalDur, iLocalFreq
|
|
iLocalDur = 130
|
|
iLocalFreq = ROUND(255 * fShockLoopTransition * CLAMP(fTortureForceApplied/F_ELECTRO_TIME, 0.5, 1.0))
|
|
|
|
IF IS_XBOX_PLATFORM()
|
|
iLeftTriggerDur = MAX_INTEGER(iLeftTriggerDur, iLocalDur)
|
|
iLeftTriggerFreq = MAX_INTEGER(iLeftTriggerFreq, iLocalFreq)
|
|
iRightTriggerDur = MAX_INTEGER(iRightTriggerDur, iLocalDur)
|
|
iRightTriggerFreq = MAX_INTEGER(iRightTriggerFreq, iLocalFreq)
|
|
ELSE
|
|
iDuration = MAX_INTEGER(iDuration, iLocalDur)
|
|
iFrequency = MAX_INTEGER(iFrequency, iLocalFreq)
|
|
ENDIF
|
|
|
|
CPRINTLN( DEBUG_MIKE, "TRIGGER SHAKE(ELECTRO): ", iLeftTriggerDur, iLeftTriggerFreq, iRightTriggerDur, iRightTriggerFreq )
|
|
|
|
ELSE
|
|
|
|
// Electrocution Left clamp
|
|
// Holding on by itself, small vibrate ONLY ON DURANGO
|
|
IF fClipGripProgLeft >= 1.0
|
|
|
|
IF IS_XBOX_PLATFORM()
|
|
IF bHeartbeatFrame
|
|
AND NOT bFlatLine
|
|
iLeftTriggerDur = MAX_INTEGER(iLeftTriggerDur, I_HEARTBEAT_VIBRATION_DUR )
|
|
iLeftTriggerFreq = MAX_INTEGER(iLeftTriggerFreq, I_HEARTBEAT_VIBRATION_FREQ )
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Impulse on clamp/release
|
|
ELIF fClipGripProgLeft > 0.704 AND fClipGripProgLeft < 1.0
|
|
|
|
INT iLocalDur, iLocalFreq
|
|
|
|
IF IS_CONTROL_PRESSED( FRONTEND_CONTROL, INPUT_SCRIPT_LT )
|
|
iLocalDur = 130
|
|
iLocalFreq = 200
|
|
ELSE
|
|
iLocalDur = 100
|
|
iLocalFreq = 100
|
|
ENDIF
|
|
|
|
IF IS_XBOX_PLATFORM()
|
|
iLeftTriggerDur = MAX_INTEGER(iLeftTriggerDur, iLocalDur )
|
|
iLeftTriggerFreq = MAX_INTEGER(iLeftTriggerFreq, iLocalFreq )
|
|
ELSE
|
|
iDuration = MAX_INTEGER(iDuration, iLocalDur )
|
|
iFrequency = MAX_INTEGER(iFrequency, iLocalFreq )
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
// Electrocution Right clamp
|
|
// Holding on by itself, small vibrate ONLY ON DURANGO
|
|
IF fClipGripProgRight >= 1.0
|
|
|
|
IF IS_XBOX_PLATFORM()
|
|
IF bHeartbeatFrame
|
|
AND NOT bFlatLine
|
|
iRightTriggerDur = MAX_INTEGER(iRightTriggerDur, I_HEARTBEAT_VIBRATION_DUR )
|
|
iRightTriggerFreq = MAX_INTEGER(iRightTriggerFreq, I_HEARTBEAT_VIBRATION_FREQ )
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Impulse on clamp/release
|
|
ELIF fClipGripProgRight > 0.704 AND fClipGripProgRight < 1.0
|
|
|
|
INT iLocalDur, iLocalFreq
|
|
|
|
// On Clamp
|
|
IF IS_CONTROL_PRESSED( FRONTEND_CONTROL, INPUT_SCRIPT_RT )
|
|
iLocalDur = 130
|
|
iLocalFreq = 200
|
|
|
|
// On Release
|
|
ELSE
|
|
iLocalDur = 100
|
|
iLocalFreq = 100
|
|
ENDIF
|
|
|
|
IF IS_XBOX_PLATFORM()
|
|
iRightTriggerDur = MAX_INTEGER(iRightTriggerDur, iLocalDur )
|
|
iRightTriggerFreq = MAX_INTEGER(iRightTriggerFreq, iLocalFreq )
|
|
ELSE
|
|
iDuration = MAX_INTEGER(iDuration, iLocalDur )
|
|
iFrequency = MAX_INTEGER(iFrequency, iLocalFreq )
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
|
|
#ENDIF
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WATER_FLIP]) //Shake for chair hitting ground
|
|
AND eLastTorturePlayed = SCENE_WATER_FLIP
|
|
fPhase = GET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_WATER_FLIP])
|
|
IF fPhase > 0.107 AND fPhase < 0.112
|
|
iDuration = MAX_INTEGER(iDuration, 260)
|
|
iFrequency = MAX_INTEGER(iFrequency, 255)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WATER_OUTRO]) //End water shake
|
|
AND eLastTorturePlayed = SCENE_WATER_OUTRO
|
|
fPhase = GET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_WATER_OUTRO])
|
|
IF fPhase > 0.0 AND fPhase < 0.043
|
|
iDuration = MAX_INTEGER(iDuration, 130)
|
|
iFrequency = MAX_INTEGER(iFrequency, 200)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_SYRINGE_USE]) //Smack for syringe plunge into chest
|
|
AND eLastTorturePlayed = SCENE_SYRINGE_USE
|
|
fPhase = GET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_SYRINGE_USE])
|
|
IF fPhase > 0.03 AND fPhase < 0.043
|
|
iDuration = MAX_INTEGER(iDuration, 260)
|
|
iFrequency = MAX_INTEGER(iFrequency, 255)
|
|
TORTURE_PlaySteveReaction()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WATER_POUR]) //If pouring water, shake
|
|
AND eLastTorturePlayed = SCENE_WATER_POUR
|
|
iDuration = MAX_INTEGER(iDuration, 130)
|
|
iFrequency = MAX_INTEGER(iFrequency, 200)
|
|
ENDIF
|
|
|
|
// Xbox one trigger shake
|
|
IF IS_XBOX_PLATFORM()
|
|
IF ( iLeftTriggerDur != 0 AND iLeftTriggerFreq != 0 )
|
|
OR ( iRightTriggerDur != 0 AND iRightTriggerFreq != 0 )
|
|
SET_CONTROL_TRIGGER_SHAKE( PLAYER_CONTROL, 0, 0, 0, 0 )
|
|
SET_CONTROL_TRIGGER_SHAKE( PLAYER_CONTROL, iLeftTriggerDur, iLeftTriggerFreq, iRightTriggerDur, iRightTriggerFreq )
|
|
CPRINTLN( DEBUG_MIKE, "TRIGGER SHAKE: ", iLeftTriggerDur, iLeftTriggerFreq, iRightTriggerDur, iRightTriggerFreq )
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Pad Shake
|
|
IF iDuration != 0 AND iFrequency != 0
|
|
SET_CONTROL_SHAKE(PLAYER_CONTROL, 0, 0)
|
|
SET_CONTROL_SHAKE(PLAYER_CONTROL, iDuration, iFrequency)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
//PURPOSE: Manage playing sound based on what scene is playing
|
|
PROC TORTURE_ManageSound()
|
|
|
|
IF bHeartbeatFrame
|
|
ReleaseSound(SND_HEART_FLATLINE_LOOP)
|
|
STOP_SOUND(sndList[SND_HEART_FLATLINE_LOOP].SoundId)
|
|
//PlaySoundFromEntity(SND_HEART_BEEP, soundHeartBeat, objMonitor, FALSE)
|
|
IF NOT sndList[SND_HEART_BEEP].bHasPlayedAtAll
|
|
sndList[SND_HEART_BEEP].SoundId = GET_SOUND_ID()
|
|
ENDIF
|
|
PLAY_SOUND_FROM_COORD( sndList[SND_HEART_BEEP].SoundId, soundHeartBeat, <<143.0145, -2201.3586, 4.3415>> )
|
|
sndList[SND_HEART_BEEP].bHasPlayedAtAll = TRUE
|
|
SET_VARIABLE_ON_SOUND(sndList[SND_HEART_BEEP].SoundId, "BPM", fBPM_Base + fBPM_Spike)
|
|
ELIF fBPM_Base + fBPM_Spike = 0
|
|
ReleaseSound(SND_HEART_BEEP)
|
|
STOP_SOUND(sndList[SND_HEART_BEEP].SoundId)
|
|
IF NOT sndList[SND_HEART_FLATLINE_LOOP].bHasPlayedAtAll
|
|
sndList[SND_HEART_FLATLINE_LOOP].SoundId = GET_SOUND_ID()
|
|
ENDIF
|
|
IF HAS_SOUND_FINISHED(sndList[SND_HEART_FLATLINE_LOOP].SoundId)
|
|
//PlaySoundFromEntity(SND_HEART_FLATLINE_LOOP, soundHeartFlatline, objMonitor, FALSE)
|
|
PLAY_SOUND_FROM_COORD( sndList[SND_HEART_FLATLINE_LOOP].SoundId, soundHeartFlatline, <<143.0145, -2201.3586, 4.3415>> )
|
|
sndList[SND_HEART_FLATLINE_LOOP].bHasPlayedAtAll = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
// WRENCH
|
|
IF IS_SCENE_AT_PHASE(SCENE_WRENCH_RIGHT, 0.245, 0.268)
|
|
OR IS_SCENE_AT_PHASE(SCENE_WRENCH_MID, 0.185, 0.202)
|
|
OR IS_SCENE_AT_PHASE(SCENE_WRENCH_LEFT, 0.393, 0.407)
|
|
PlaySoundFromEntity(SND_WRENCH_HIT, soundWrenchHit, pedVictim)
|
|
ELSE
|
|
sndList[SND_WRENCH_HIT].bHasPlayed = FALSE
|
|
ENDIF
|
|
|
|
// ELECTROCUTE
|
|
IF IS_SCENE_AT_PHASE(SCENE_WEAPON_SELECT_PICKUP_CLIP0, 0.222, 1.000)
|
|
IF NOT HasSoundPlayed(SND_ELEC_HUM_LOOP)
|
|
PlaySoundFromEntity(SND_ELEC_HUM_LOOP, soundElectricHum, objTable)
|
|
ENDIF
|
|
ELIF IS_SCENE_AT_PHASE(SCENE_ELEC_OUTRO, 0.904, 1.000)
|
|
ReleaseSound(SND_ELEC_HUM_LOOP)
|
|
ENDIF
|
|
|
|
IF fClipGripProgLeft > 0.704
|
|
PlaySoundFromEntity(SND_ELEC_ATTACH_CLIP_LEFT, "Electrical_Clamp_On", menuWeapon[TOR_CLIP0].objObject, TRUE, "FBI_03_Torture_Sounds")
|
|
sndList[SND_ELEC_DETACH_CLIP_LEFT].bHasPlayed = FALSE
|
|
ELSE
|
|
PlaySoundFromEntity(SND_ELEC_DETACH_CLIP_LEFT, "Electrical_Clamp_Off", menuWeapon[TOR_CLIP0].objObject, TRUE, "FBI_03_Torture_Sounds")
|
|
sndList[SND_ELEC_ATTACH_CLIP_LEFT].bHasPlayed = FALSE
|
|
ENDIF
|
|
|
|
IF fClipGripProgRight > 0.704
|
|
PlaySoundFromEntity(SND_ELEC_ATTACH_CLIP_RIGHT, "Electrical_Clamp_On", menuWeapon[TOR_CLIP1].objObject, TRUE, "FBI_03_Torture_Sounds")
|
|
sndList[SND_ELEC_DETACH_CLIP_RIGHT].bHasPlayed = FALSE
|
|
ELSE
|
|
PlaySoundFromEntity(SND_ELEC_DETACH_CLIP_RIGHT, "Electrical_Clamp_Off", menuWeapon[TOR_CLIP1].objObject, TRUE, "FBI_03_Torture_Sounds")
|
|
sndList[SND_ELEC_ATTACH_CLIP_RIGHT].bHasPlayed = FALSE
|
|
ENDIF
|
|
|
|
IF fShockLoopTransition > 0.0
|
|
IF NOT HasSoundPlayed(SND_ELEC_ZAP_LOOP)
|
|
PlaySoundFromEntity(SND_ELEC_ZAP_LOOP, soundElectricZap, pedVictim)
|
|
ENDIF
|
|
|
|
ELIF NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_ELEC_OUTRO])
|
|
OR IS_SCENE_AT_PHASE(SCENE_ELEC_OUTRO, 0.198, 1.000)
|
|
ReleaseSound(SND_ELEC_ZAP_LOOP)
|
|
ENDIF
|
|
|
|
IF IS_SCENE_AT_PHASE(SCENE_ELEC_SPARK, 0.146, 0.246)
|
|
PlaySoundFromEntity(SND_ELEC_SPARK, soundElectricSpark, TREV_PED_ID())
|
|
ELSE
|
|
sndList[SND_ELEC_SPARK].bHasPlayed = FALSE
|
|
ENDIF
|
|
|
|
// WATER
|
|
IF IS_SCENE_AT_PHASE(SCENE_WEAPON_SELECT_PICKUP_WATER, 0.140, 0.192)
|
|
PlaySoundFromEntity(SND_WATER_PICK_UP, soundWaterPickUp, TREV_PED_ID())
|
|
ELSE
|
|
sndList[SND_WATER_PICK_UP].bHasPlayed = FALSE
|
|
ENDIF
|
|
|
|
IF IS_SCENE_AT_PHASE(SCENE_WATER_POUR, 0.000, 1.000)
|
|
IF NOT HasSoundPlayed(SND_WATER_POUR_LOOP)
|
|
PlaySoundFromEntity(SND_WATER_POUR_LOOP, soundWaterPour, pedVictim)
|
|
ENDIF
|
|
ELSE
|
|
ReleaseSound(SND_WATER_POUR_LOOP)
|
|
ENDIF
|
|
|
|
// PLIERS
|
|
IF IS_SCENE_AT_PHASE(SCENE_PLIERS_PULL_OUT, 0.01, 0.02)
|
|
OR IS_SCENE_AT_PHASE(SCENE_PLIERS_PULL_OUT2, 0.06, 0.082)
|
|
PlaySoundFromEntity(SND_TOOTH_PULL_OUT, soundToothPullOut, TREV_PED_ID())
|
|
ELSE
|
|
sndList[SND_TOOTH_PULL_OUT].bHasPlayed = FALSE
|
|
ENDIF
|
|
|
|
IF bPliersInMouth
|
|
IF NOT HasSoundPlayed(SND_TOOTH_PULL_LOOP)
|
|
PlaySoundFromEntity(SND_TOOTH_PULL_LOOP, soundToothPull, pedVictim)
|
|
ENDIF
|
|
SET_VARIABLE_ON_SOUND(sndList[SND_TOOTH_PULL_LOOP].SoundId, "Intensity", fPullStrength)
|
|
ELSE
|
|
ReleaseSound(SND_TOOTH_PULL_LOOP)
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
//PURPOSE: Updates the camera to look at the ecg should the player be pressing the correct button
|
|
PROC TORTURE_UpdateLookAtECG()
|
|
|
|
SWITCH eEKGCamState
|
|
CASE EKGCAM_TORTURE
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WEAPON_SELECT_IDLE])
|
|
OR IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PLIERS_IDLE])
|
|
OR IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PLIERS_READY_LOOP])
|
|
OR IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WATER_IDLE])
|
|
OR IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WATER_READY])
|
|
OR IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_SYRINGE_IDLE])
|
|
OR IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WRENCH_IDLE])
|
|
OR bIdlingElectricity
|
|
//IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_RELOAD) // bug: 1661973
|
|
IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RRIGHT)
|
|
IF DOES_CAM_EXIST(camEKG)
|
|
DESTROY_CAM(camEKG)
|
|
ENDIF
|
|
clearText(FALSE, FALSE, TRUE)
|
|
eEKGCamState = EKGCAM_INTERP_IN
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE EKGCAM_INTERP_IN
|
|
|
|
IF NOT DOES_CAM_EXIST(camEKG)
|
|
|
|
camEKG = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<143.0422, -2200.8059, 4.8667>>, <<-24.0583, -0.0000, 174.2966>>, 21.9763, FALSE)
|
|
//camEKG = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<142.8827, -2200.8303, 4.9091>>, <<-27.9544, -0.0439, -168.1845>>, 22.9599, FALSE)
|
|
SET_CAM_DEBUG_NAME(camEKG, "camECG_1")
|
|
SHAKE_CAM(camEKG, shakeHand, 0.2)
|
|
SET_CAM_MOTION_BLUR_STRENGTH(camEKG, 0.1)
|
|
SET_CAM_ACTIVE_WITH_INTERP(camEKG, GET_RENDERING_CAM(), 500, GRAPH_TYPE_ACCEL)
|
|
|
|
ELSE
|
|
//IF NOT IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_RELOAD) // bug: 1661973
|
|
IF NOT IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RRIGHT)
|
|
|
|
eEKGCamState = EKGCAM_LOOKING_AT
|
|
|
|
ELSE
|
|
IF NOT IS_CAM_INTERPOLATING(camEKG)
|
|
|
|
IF DOES_CAM_EXIST(sSwayTorture.camInit)
|
|
DESTROY_CAM(sSwayTorture.camInit)
|
|
ENDIF
|
|
|
|
IF DOES_CAM_EXIST(sSwayTorture.camDest)
|
|
DESTROY_CAM(sSwayTorture.camDest)
|
|
ENDIF
|
|
|
|
eEKGCamState = EKGCAM_LOOKING_AT
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE EKGCAM_LOOKING_AT
|
|
|
|
//IF NOT IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_RELOAD) // bug: 1661973
|
|
IF NOT IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RRIGHT)
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WEAPON_SELECT_IDLE])
|
|
TORTURE_InitWeapSelectionCam()
|
|
SET_CAM_ACTIVE(camEKG, TRUE)
|
|
SET_CAM_ACTIVE_WITH_INTERP(sSwayTorture.camInit, camEKG, 500, GRAPH_TYPE_DECEL)
|
|
ELSE
|
|
IF DOES_CAM_EXIST(camTorture)
|
|
SET_CAM_ACTIVE_WITH_INTERP(camTorture, camEKG, 500, GRAPH_TYPE_DECEL)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
eEKGCamState = EKGCAM_INTERP_OUT
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE EKGCAM_INTERP_OUT
|
|
|
|
//IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_RELOAD) // bug: 1661973
|
|
IF NOT IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RRIGHT)
|
|
|
|
eEKGCamState = EKGCAM_TORTURE
|
|
|
|
ELSE
|
|
|
|
IF NOT IS_CAM_INTERPOLATING(camEKG)
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WEAPON_SELECT_IDLE])
|
|
IF NOT IS_CAM_INTERPOLATING(sSwayTorture.camInit)
|
|
TORTURE_InitWeapSelectionCam()
|
|
DESTROY_CAM(camEKG)
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_CAM_EXIST(camTorture)
|
|
SET_CAM_ACTIVE(camTorture, TRUE)
|
|
ENDIF
|
|
DESTROY_CAM(camEKG)
|
|
ENDIF
|
|
|
|
eEKGCamState = EKGCAM_TORTURE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF eEKGCamState = EKGCAM_TORTURE
|
|
bLookingAtECG = FALSE
|
|
ELSE
|
|
bLookingAtECG = TRUE
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC TORTURE_Store_Victim_State()
|
|
|
|
// Store the victims health
|
|
g_replay.iReplayInt[1] -= g_replay.iReplayInt[1] & BITMASK_VICTIMHEALTH // Wipe existing data
|
|
g_replay.iReplayInt[1] |= ROUND(fVictimHealth) // store data into bitfield
|
|
|
|
// Store the victims variations
|
|
g_replay.iReplayInt[1] -= g_replay.iReplayInt[1] & BITMASK_VICTIMVARS // Wipe existing data
|
|
INT iVariantsSet = 0
|
|
INT i
|
|
REPEAT COUNT_OF(bMrKVariations) i
|
|
IF bMrKVariations[i]
|
|
SET_BIT(iVariantsSet, i)
|
|
ELSE
|
|
CLEAR_BIT(iVariantsSet, i)
|
|
ENDIF
|
|
ENDREPEAT
|
|
g_replay.iReplayInt[1] |= SHIFT_LEFT(iVariantsSet, BITSHIFTER_VICTIMHEALTH) // store data into bitfield
|
|
|
|
// Store the number of teeth pulled
|
|
g_replay.iReplayInt[1] -= g_replay.iReplayInt[1] & BITMASK_VICTIMTEETH
|
|
g_replay.iReplayInt[1] |= SHIFT_LEFT(iNumberOfTeethPulled, BITSHIFTER_VICTIMHEALTH + BITSHIFTER_VICTIMVARS)
|
|
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
// Store the number of syringes used
|
|
g_replay.iReplayInt[1] -= g_replay.iReplayInt[1] & BITMASK_SYRINGES
|
|
g_replay.iReplayInt[1] |= SHIFT_LEFT(iNumberOfSyringesUsed, BITSHIFTER_VICTIMHEALTH + BITSHIFTER_VICTIMVARS + BITSHIFTER_VICTIMTEETH)
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC TORTURE_Request_Cutscene(BOOL bStreamPedDamageAboutToBeInflicted, TORTURE_WEAPONS eWeapon = TOR_WRENCH, INT iOptionalDamageType = 0)
|
|
|
|
IF IS_CUTSCENE_ACTIVE()
|
|
REMOVE_CUTSCENE()
|
|
ENDIF
|
|
|
|
BOOL bOverrideCutsceneAudioToToothless
|
|
|
|
IF NOT bStreamPedDamageAboutToBeInflicted
|
|
Register_Torture_Ped_Variations_For_Cutscene_Prestreaming(FALSE, FALSE, strMrKCSHandle)
|
|
ELSE
|
|
|
|
STRING strMrKCS
|
|
IF eWeapon = TOR_PLIERS
|
|
OR iNumberOfTeethPulled > 0
|
|
strMrKCS = csMrK_TL
|
|
bOverrideCutsceneAudioToToothless = TRUE
|
|
ELSE
|
|
strMrKCS = csMrK
|
|
ENDIF
|
|
|
|
Register_Torture_Ped_Variations_For_Cutscene_Prestreaming(FALSE, FALSE, strMrKCS)
|
|
|
|
SWITCH eWeapon
|
|
CASE TOR_PLIERS
|
|
IF NOT bMrKVariations[MR_K_FACE_BLOODY]
|
|
Register_Ped_Variation_For_Cutscene(sCutscenePedVariationRegister, strMrKCS, PED_COMP_HEAD, 0, 1, CS_MRK)
|
|
ENDIF
|
|
Register_Ped_Variation_For_Cutscene(sCutscenePedVariationRegister, strMrKCS, PED_COMP_TEETH, 1, iOptionalDamageType, CS_MRK)
|
|
BREAK
|
|
CASE TOR_CLIP0
|
|
IF NOT bMrKVariations[MR_K_NIPPLES_BURNED]
|
|
Register_Ped_Variation_For_Cutscene(sCutscenePedVariationRegister, strMrKCS, PED_COMP_DECL, 1, 0, CS_MRK)
|
|
ENDIF
|
|
BREAK
|
|
CASE TOR_WATER
|
|
IF NOT bMrKVariations[MR_K_WET]
|
|
Register_Ped_Variation_For_Cutscene(sCutscenePedVariationRegister, strMrKCS, PED_COMP_SPECIAL2, 1, 0, CS_MRK)
|
|
ENDIF
|
|
IF bMrKVariations[MR_K_FACE_BLOODY]
|
|
Register_Ped_Variation_For_Cutscene(sCutscenePedVariationRegister, strMrKCS, PED_COMP_HEAD, 0, 0, CS_MRK)
|
|
ENDIF
|
|
BREAK
|
|
CASE TOR_WRENCH
|
|
SWITCH iOptionalDamageType
|
|
CASE 0
|
|
IF NOT bMrKVariations[MR_K_LEG_BLOODY]
|
|
Register_Ped_Variation_For_Cutscene(sCutscenePedVariationRegister, strMrKCS, PED_COMP_FEET, 1, 0, CS_MRK)
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
IF NOT bMrKVariations[MR_K_TORSO_BLOODY]
|
|
Register_Ped_Variation_For_Cutscene(sCutscenePedVariationRegister, strMrKCS, PED_COMP_BERD, 1, 0, CS_MRK)
|
|
ENDIF
|
|
BREAK
|
|
CASE 2
|
|
IF NOT bMrKVariations[MR_K_CROTCH_BLOODY]
|
|
Register_Ped_Variation_For_Cutscene(sCutscenePedVariationRegister, strMrKCS, PED_COMP_JBIB, 1, 0, CS_MRK)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
// load the cutscene for the death anytime that the ped has arrested
|
|
IF fVictimHealth <= 0.0
|
|
|
|
//IF iTortureStage = 2
|
|
REQUEST_CUTSCENE("FBI_3_MCS_6p1_b")
|
|
//ENDIF
|
|
ELSE
|
|
|
|
IF bOverrideCutsceneAudioToToothless
|
|
OR iNumberOfTeethPulled > 0
|
|
SET_CUTSCENE_AUDIO_OVERRIDE("_TOOTHLESS")
|
|
ENDIF
|
|
|
|
SWITCH eMissionStage
|
|
CASE ST_3_TORTURE_FOR_FIRST
|
|
REQUEST_CUTSCENE("fbi_3_mcs_1")
|
|
BREAK
|
|
CASE ST_5_TORTURE_FOR_SECOND
|
|
REQUEST_CUTSCENE("fbi_3_mcs_3")
|
|
BREAK
|
|
CASE ST_7_TORTURE_FOR_THIRD
|
|
REQUEST_CUTSCENE("fbi_3_mcs_5")
|
|
BREAK
|
|
CASE ST_9_TORTURE_FINAL
|
|
REQUEST_CUTSCENE("FBI_3_mcs_6p2")
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL TORTURE_Is_Control_Pressed(CONTROL_ACTION eControlAction, BOOL bJustPressed, BOOL eCheckEKGCam)
|
|
|
|
IF bMissionFailed
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
IF bJustPressed
|
|
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, eControlAction)
|
|
IF NOT eCheckEKGCam
|
|
OR NOT bLookingAtECG
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, eControlAction)
|
|
IF NOT eCheckEKGCam
|
|
OR NOT bLookingAtECG
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
|
|
|
|
// PURPOSE: Fudge to allow PC to use a different button to pour, as pressing 'W' to do it doesn't make much sense.
|
|
PROC FUDGE_PC_POURING_CONTROL( INT &iLY )
|
|
|
|
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RT)
|
|
iLY = -100
|
|
ELSE
|
|
iLY = 0
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
|
|
|
|
//PURPOSE: Performs the torture sequences based on what the player's current torture weapon is, and the players input
|
|
FUNC BOOL TORTURE_ManageMinigame()
|
|
|
|
IF bMadeSelection
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
IF TOR_PLIERS != INT_TO_ENUM(TORTURE_WEAPONS, iCurrentMenuWeapon)
|
|
ALLOW_ALTERNATIVE_SCRIPT_CONTROLS_LAYOUT(FRONTEND_CONTROL)
|
|
ENDIF
|
|
|
|
TORTURE_WEAPONS eCurrentMenuWeapon
|
|
INT iLX = 0
|
|
INT iLY = 0
|
|
INT iRX = 0
|
|
INT iRY = 0
|
|
FLOAT fXChange = 0
|
|
FLOAT fYChange = 0
|
|
FLOAT fPercentHealComplete = 0
|
|
FLOAT fTortureTime = 0.0
|
|
FLOAT fToothDepth = 0.0
|
|
FLOAT fToothAngle = 0.0
|
|
FLOAT fStickHypot
|
|
FLOAT fStickAngleChange
|
|
|
|
SWITCH iTortureStage
|
|
CASE 0
|
|
eCurrentMenuWeapon = INT_TO_ENUM(TORTURE_WEAPONS, iCurrentMenuWeapon)
|
|
|
|
TORTURE_UpdateLookAtECG()
|
|
|
|
SWITCH eCurrentMenuWeapon
|
|
CASE TOR_WRENCH //Weapon is wrench
|
|
IF bJustStarting
|
|
|
|
IF HAS_ANIM_DICT_LOADED("MISSFBI3_WRENCH")
|
|
IF NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WRENCH_IDLE])
|
|
IF TORTURE_PlaySyncScene(SCENE_WRENCH_IDLE, TRUE)
|
|
|
|
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(hlpWrench)
|
|
AND NOT bLookingAtECG
|
|
PRINT_HELP_FOREVER(hlpWrench)
|
|
ENDIF
|
|
|
|
bJustStarting = FALSE
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
IF TORTURE_Is_Control_Pressed(INPUT_SCRIPT_RT, TRUE, TRUE)
|
|
|
|
BOOL bTortureStarted
|
|
|
|
fTortureTime = GET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_WRENCH_IDLE]) //Get phase of idle animation
|
|
// IF (fTortureTime > 0.090 AND fTortureTime < 0.150) //If trevor on left of victim, play left anim
|
|
// OR (fTortureTime > 0.305 AND fTortureTime < 0.370)
|
|
// OR (fTortureTime > 0.505 AND fTortureTime < 0.555)
|
|
// OR (fTortureTime > 0.590 AND fTortureTime < 0.620)
|
|
// OR (fTortureTime > 0.665 AND fTortureTime < 0.735)
|
|
// OR (fTortureTime > 0.920 AND fTortureTime < 0.990)
|
|
IF HAS_ANIM_EVENT_FIRED(PLAYER_PED_ID(), HASH("Left"))
|
|
|
|
IF TORTURE_PlaySyncScene(SCENE_WRENCH_LEFT)
|
|
TORTURE_Request_Cutscene(TRUE, TOR_WRENCH, 1)
|
|
|
|
clearText()
|
|
|
|
SWITCH eMissionStage
|
|
CASE ST_3_TORTURE_FOR_FIRST RunConversation("F3_ARM1", "") BREAK
|
|
CASE ST_5_TORTURE_FOR_SECOND RunConversation("F3_ARM2", "") BREAK
|
|
CASE ST_7_TORTURE_FOR_THIRD RunConversation("F3_ARM3", "") BREAK
|
|
CASE ST_9_TORTURE_FINAL RunConversation("F3_ARM4", "") BREAK
|
|
ENDSWITCH
|
|
|
|
bTortureStarted = TRUE
|
|
ENDIF
|
|
|
|
// ELIF(fTortureTime > 0.020 AND fTortureTime < 0.070) //If trevor on right of victim, play right anim
|
|
// OR (fTortureTime > 0.190 AND fTortureTime < 0.235)
|
|
// OR (fTortureTime > 0.400 AND fTortureTime < 0.410)
|
|
// OR (fTortureTime > 0.635 AND fTortureTime < 0.650)
|
|
// OR (fTortureTime > 0.775 AND fTortureTime < 0.845)
|
|
ELIF HAS_ANIM_EVENT_FIRED(PLAYER_PED_ID(), HASH("Right"))
|
|
|
|
IF TORTURE_PlaySyncScene(SCENE_WRENCH_RIGHT)
|
|
TORTURE_Request_Cutscene(TRUE, TOR_WRENCH, 0)
|
|
|
|
clearText()
|
|
|
|
SWITCH eMissionStage
|
|
CASE ST_3_TORTURE_FOR_FIRST RunConversation("F3_KNEE1", "") BREAK
|
|
CASE ST_5_TORTURE_FOR_SECOND RunConversation("F3_KNEE2", "") BREAK
|
|
CASE ST_7_TORTURE_FOR_THIRD RunConversation("F3_KNEE3", "") BREAK
|
|
CASE ST_9_TORTURE_FINAL RunConversation("F3_KNEE1", "") BREAK
|
|
ENDSWITCH
|
|
|
|
bTortureStarted = TRUE
|
|
ENDIF
|
|
|
|
ELSE //Otherwise play the middle anim
|
|
|
|
IF TORTURE_PlaySyncScene(SCENE_WRENCH_MID)
|
|
TORTURE_Request_Cutscene(TRUE, TOR_WRENCH, 2)
|
|
|
|
clearText()
|
|
|
|
SWITCH eMissionStage
|
|
CASE ST_3_TORTURE_FOR_FIRST RunConversation("F3_BALLS1", "") BREAK
|
|
CASE ST_5_TORTURE_FOR_SECOND RunConversation("F3_BALLS2", "") BREAK
|
|
CASE ST_7_TORTURE_FOR_THIRD RunConversation("F3_BALLS3", "") BREAK
|
|
CASE ST_9_TORTURE_FINAL RunConversation("F3_BALLS1", "") BREAK
|
|
ENDSWITCH
|
|
|
|
bTortureStarted = TRUE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF bTortureStarted
|
|
|
|
TORTURE_SpikeHeartRate(0.5, 3000, 2500, 7000)
|
|
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(FBI3_WRENCH)
|
|
|
|
bJustStarting = TRUE
|
|
iTortureStage++
|
|
|
|
ENDIF
|
|
ELSE
|
|
// Mr k begs
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
IF GET_GAME_TIMER() - i_time_of_last_convo > I_TIME_BETWEEN_PLEES
|
|
RunConversation("F3_NOWREN", "", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
CASE TOR_PLIERS //Weapon pliers
|
|
|
|
SWITCH iTortureWeaponStage
|
|
// IDLE: WAIT TO START PLIERS TORTURE
|
|
CASE 0
|
|
IF HAS_ANIM_DICT_LOADED("MISSFBI3_TOOTHPULL")
|
|
IF NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PLIERS_IDLE])
|
|
AND NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PLIERS_READY_IN])
|
|
AND NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PLIERS_READY_LOOP])
|
|
|
|
IF bJustStarting
|
|
|
|
IF TORTURE_PlaySyncScene(SCENE_PLIERS_IDLE, TRUE, 0.0, INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
|
|
iWeaponSelDiaTimer = GET_GAME_TIMER()
|
|
iWeaponSelDiaDelay = 14000
|
|
|
|
bJustStarting = FALSE
|
|
|
|
ENDIF
|
|
ELSE
|
|
|
|
IF TORTURE_PlaySyncScene(SCENE_PLIERS_READY_LOOP, TRUE, 0.0, INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
|
|
iWeaponSelDiaTimer = GET_GAME_TIMER()
|
|
iWeaponSelDiaDelay = 14000
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(hlpPliers1)
|
|
AND NOT bLookingAtECG
|
|
PRINT_HELP_FOREVER(hlpPliers1)
|
|
ENDIF
|
|
|
|
// Player has pressed to attach pliers
|
|
IF TORTURE_Is_Control_Pressed(INPUT_SCRIPT_RT, FALSE, TRUE)
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PLIERS_IDLE])
|
|
IF TORTURE_PlaySyncScene(SCENE_PLIERS_ATTACH, FALSE, 0.0, WALK_BLEND_IN, NORMAL_BLEND_OUT)
|
|
bPlayedPliersInWhimper = FALSE
|
|
iTortureWeaponStage++
|
|
ENDIF
|
|
ELIF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PLIERS_READY_LOOP])
|
|
IF TORTURE_PlaySyncScene(SCENE_PLIERS_READY_OUT, FALSE, 0.0, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
bPlayedPliersInWhimper = FALSE
|
|
iTortureWeaponStage++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
// Mr K begs
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PLIERS_IDLE])
|
|
IF GET_GAME_TIMER() - i_time_of_last_convo > I_TIME_BETWEEN_PLEES
|
|
RunConversation("F3_NOPLI", "", TRUE)
|
|
ENDIF
|
|
ELIF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PLIERS_READY_LOOP])
|
|
IF GET_GAME_TIMER() - i_time_of_last_convo > I_TIME_BETWEEN_PLEES/2
|
|
RunConversation("F3_HEAD", "", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// TRANSITION ATTACH: Stick pliers into Mr K's mouth for the first time
|
|
CASE 1
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PLIERS_ATTACH])
|
|
|
|
// Trevor speaks as he puts the pliers in
|
|
IF iWeaponSelStage = 0
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
RunConversation("F3_INMOUTH")
|
|
iWeaponSelStage++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Play one shot as the pliers go into Mr K's mouth
|
|
IF IS_SCENE_AT_PHASE(SCENE_PLIERS_ATTACH, 0.949, 1.0)
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(strOneShotLoaded)
|
|
PLAY_ONESHOT()
|
|
ENDIF
|
|
ENDIF
|
|
// Play a whimper from Mr K
|
|
IF IS_SCENE_AT_PHASE(SCENE_PLIERS_ATTACH, 0.949, 1.0)
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND IS_PED_IN_CURRENT_CONVERSATION(pedVictim)
|
|
AND IS_SCRIPTED_SPEECH_PLAYING(pedVictim)
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
ENDIF
|
|
IF NOT bPlayedPliersInWhimper
|
|
PLAY_SOUND_FROM_ENTITY(-1, "Teeth_Initial_Pain", pedVictim, "FBI_03_Torture_Sounds")
|
|
bPlayedPliersInWhimper = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Subsequent uses of the pliers after first putting themin his mouth this torture round
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PLIERS_READY_OUT])
|
|
IF IS_SCENE_AT_PHASE(SCENE_PLIERS_READY_OUT, 0.496, 1.0)
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND IS_PED_IN_CURRENT_CONVERSATION(pedVictim)
|
|
AND IS_SCRIPTED_SPEECH_PLAYING(pedVictim)
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
ENDIF
|
|
IF NOT bPlayedPliersInWhimper
|
|
PLAY_SOUND_FROM_ENTITY(-1, "Teeth_Initial_Pain", pedVictim, "FBI_03_Torture_Sounds")
|
|
bPlayedPliersInWhimper = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PLIERS_ATTACH])
|
|
AND NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PLIERS_READY_OUT])
|
|
|
|
TORTURE_ANIM_DATA sAnimData
|
|
TEXT_LABEL_63 strTemp
|
|
TEXT_LABEL_63 camAnim
|
|
TEXT_LABEL_63 camAnimDict
|
|
|
|
ANIM_DATA sAnimDataTrevorPullWeak, sAnimDataTrevorPullHard
|
|
ANIM_DATA sAnimDataPliersPullWeak, sAnimDataPliersPullHard
|
|
ANIM_DATA sAnimDataMrKPullWeak, sAnimDataMrKPullHard
|
|
ANIM_DATA sAnimDataMrKPullWeakFace, sAnimDataMrKPullHardFace
|
|
ANIM_DATA sAnimDataRestraintLPullWeak, sAnimDataRestraintLPullHard
|
|
ANIM_DATA sAnimDataRestraintRPullWeak, sAnimDataRestraintRPullHard
|
|
|
|
IF TORTURE_GetTortureSceneAnimData(SCENE_PLIERS_PULL_WEAK, sAnimData)
|
|
|
|
// Trevor
|
|
sAnimDataTrevorPullWeak.type = APT_SINGLE_ANIM
|
|
sAnimDataTrevorPullWeak.flags = AF_LOOPING | AF_OVERRIDE_PHYSICS
|
|
|
|
sAnimDataTrevorPullWeak.dictionary0 = sAnimData.strAnimDict
|
|
sAnimDataTrevorPullWeak.anim0 = sAnimData.strTrevor
|
|
sAnimDataTrevorPullWeak.weight0 = 1.0
|
|
|
|
// Pliers
|
|
sAnimDataPliersPullWeak.type = APT_SINGLE_ANIM
|
|
sAnimDataPliersPullWeak.flags = AF_LOOPING //| AF_OVERRIDE_PHYSICS
|
|
|
|
sAnimDataPliersPullWeak.dictionary0 = sAnimData.strAnimDict
|
|
sAnimDataPliersPullWeak.anim0 = sAnimData.strWeapon
|
|
sAnimDataPliersPullWeak.weight0 = 1.0
|
|
|
|
// Mr K
|
|
strTemp = sAnimData.strMrK
|
|
strTemp += "_facial"
|
|
|
|
sAnimDataMrKPullWeak.type = APT_SINGLE_ANIM
|
|
sAnimDataMrKPullWeak.flags = AF_LOOPING | AF_OVERRIDE_PHYSICS
|
|
|
|
sAnimDataMrKPullWeak.dictionary0 = sAnimData.strAnimDict
|
|
sAnimDataMrKPullWeak.anim0 = sAnimData.strMrK
|
|
sAnimDataMrKPullWeak.weight0 = 1.0
|
|
|
|
// Mr K face
|
|
sAnimDataMrKPullWeakFace.type = APT_SINGLE_ANIM
|
|
sAnimDataMrKPullWeakFace.flags = AF_LOOPING | AF_OVERRIDE_PHYSICS | AF_SECONDARY
|
|
|
|
sAnimDataMrKPullWeakFace.dictionary0 = sAnimData.strAnimDict
|
|
sAnimDataMrKPullWeakFace.anim0 = CONVERT_TEXT_LABEL_TO_STRING(strTemp)
|
|
sAnimDataMrKPullWeakFace.weight0 = 1.0
|
|
|
|
ENDIF
|
|
|
|
IF TORTURE_GetTortureSceneAnimData(SCENE_PLIERS_PULL_HARD, sAnimData)
|
|
|
|
// Trevor
|
|
sAnimDataTrevorPullHard.type = APT_SINGLE_ANIM
|
|
sAnimDataTrevorPullHard.flags = AF_LOOPING | AF_OVERRIDE_PHYSICS
|
|
|
|
sAnimDataTrevorPullHard.dictionary0 = sAnimData.strAnimDict
|
|
sAnimDataTrevorPullHard.anim0 = sAnimData.strTrevor
|
|
sAnimDataTrevorPullHard.weight0 = 0.0
|
|
|
|
// Pliers
|
|
sAnimDataPliersPullHard.type = APT_SINGLE_ANIM
|
|
sAnimDataPliersPullHard.flags = AF_LOOPING// | AF_OVERRIDE_PHYSICS
|
|
|
|
sAnimDataPliersPullHard.dictionary0 = sAnimData.strAnimDict
|
|
sAnimDataPliersPullHard.anim0 = sAnimData.strWeapon
|
|
sAnimDataPliersPullHard.weight0 = 0.0
|
|
|
|
// Mr K
|
|
strTemp = sAnimData.strMrK
|
|
strTemp += "_facial"
|
|
|
|
sAnimDataMrKPullHard.type = APT_SINGLE_ANIM
|
|
sAnimDataMrKPullHard.flags = AF_LOOPING | AF_OVERRIDE_PHYSICS
|
|
|
|
sAnimDataMrKPullHard.dictionary0 = sAnimData.strAnimDict
|
|
sAnimDataMrKPullHard.anim0 = sAnimData.strMrK
|
|
sAnimDataMrKPullHard.weight0 = 0.0
|
|
|
|
// Mr K face
|
|
sAnimDataMrKPullHardFace.type = APT_SINGLE_ANIM
|
|
sAnimDataMrKPullHardFace.flags = AF_LOOPING | AF_OVERRIDE_PHYSICS | AF_SECONDARY
|
|
|
|
sAnimDataMrKPullHardFace.dictionary0 = sAnimData.strAnimDict
|
|
sAnimDataMrKPullHardFace.anim0 = CONVERT_TEXT_LABEL_TO_STRING(strTemp)
|
|
sAnimDataMrKPullHardFace.weight0 = 0.0
|
|
|
|
camAnim = sAnimData.strCam
|
|
camAnimDict = sAnimData.strAnimDict
|
|
|
|
// Restraint Left
|
|
sAnimDataRestraintLPullWeak.type = APT_SINGLE_ANIM
|
|
sAnimDataRestraintLPullWeak.flags = AF_LOOPING
|
|
|
|
sAnimDataRestraintLPullWeak.dictionary0 = sAnimData.strAnimDict
|
|
sAnimDataRestraintLPullWeak.anim0 = sAnimData.strTapeLH
|
|
sAnimDataRestraintLPullWeak.weight0 = 1.0
|
|
|
|
// Restraint Right
|
|
sAnimDataRestraintRPullWeak.type = APT_SINGLE_ANIM
|
|
sAnimDataRestraintRPullWeak.flags = AF_LOOPING
|
|
|
|
sAnimDataRestraintRPullWeak.dictionary0 = sAnimData.strAnimDict
|
|
sAnimDataRestraintRPullWeak.anim0 = sAnimData.strTapeRH
|
|
sAnimDataRestraintRPullWeak.weight0 = 1.0
|
|
|
|
// Restraint Left
|
|
sAnimDataRestraintLPullHard.type = APT_SINGLE_ANIM
|
|
sAnimDataRestraintLPullHard.flags = AF_LOOPING
|
|
|
|
sAnimDataRestraintLPullHard.dictionary0 = sAnimData.strAnimDict
|
|
sAnimDataRestraintLPullHard.anim0 = sAnimData.strTapeLH
|
|
sAnimDataRestraintLPullHard.weight0 = 0.0
|
|
|
|
// Restraint Right
|
|
sAnimDataRestraintRPullHard.type = APT_SINGLE_ANIM
|
|
sAnimDataRestraintRPullHard.flags = AF_LOOPING
|
|
|
|
sAnimDataRestraintRPullHard.dictionary0 = sAnimData.strAnimDict
|
|
sAnimDataRestraintRPullHard.anim0 = sAnimData.strTapeRH
|
|
sAnimDataRestraintRPullHard.weight0 = 0.0
|
|
|
|
ENDIF
|
|
|
|
// Trevor & Mr K
|
|
TASK_SCRIPTED_ANIMATION(TREV_PED_ID(), sAnimDataTrevorPullWeak, sAnimDataTrevorPullHard, sAnimDataBlank, NORMAL_BLEND_DURATION, NORMAL_BLEND_DURATION)
|
|
TASK_SCRIPTED_ANIMATION(pedVictim, sAnimDataMrKPullWeak, sAnimDataMrKPullHard, sAnimDataBlank, NORMAL_BLEND_DURATION, NORMAL_BLEND_DURATION)
|
|
TASK_SCRIPTED_ANIMATION(pedVictim, sAnimDataMrKPullWeakFace, sAnimDataMrKPullHardFace, sAnimDataBlank, NORMAL_BLEND_DURATION, NORMAL_BLEND_DURATION)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(TREV_PED_ID(), FALSE, TRUE)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(pedVictim, FALSE, TRUE)
|
|
|
|
// Pliers
|
|
TORTURE_StopTortureWeaponAnim(menuWeapon[TOR_PLIERS], NORMAL_BLEND_OUT)
|
|
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(menuWeapon[TOR_PLIERS].objObject, TREV_PED_ID())
|
|
IF IS_ENTITY_ATTACHED(menuWeapon[TOR_PLIERS].objObject)
|
|
DETACH_ENTITY(menuWeapon[TOR_PLIERS].objObject)
|
|
ENDIF
|
|
ATTACH_ENTITY_TO_ENTITY(menuWeapon[TOR_PLIERS].objObject, TREV_PED_ID(), GET_PED_BONE_INDEX(TREV_PED_ID(), BONETAG_PH_R_HAND), <<0,0,0>>, <<0,0,0>>)
|
|
ENDIF
|
|
PLAY_ENTITY_SCRIPTED_ANIM(menuWeapon[TOR_PLIERS].objObject, sAnimDataPliersPullWeak, sAnimDataPliersPullHard, sAnimDataBlank, NORMAL_BLEND_DURATION, NORMAL_BLEND_DURATION)
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(menuWeapon[TOR_PLIERS].objObject)
|
|
|
|
// Tape cleanup
|
|
IF bHasRestraintPlayedAnim
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(objTapeArmLeft, NORMAL_BLEND_OUT, FALSE)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(objTapeArmRight, NORMAL_BLEND_OUT, FALSE)
|
|
bHasRestraintPlayedAnim = FALSE
|
|
ENDIF
|
|
|
|
// Tape Left
|
|
IF IS_ENTITY_ATTACHED(objTapeArmLeft)
|
|
DETACH_ENTITY(objTapeArmLeft)
|
|
ENDIF
|
|
PLAY_ENTITY_SCRIPTED_ANIM(objTapeArmLeft, sAnimDataRestraintLPullWeak, sAnimDataRestraintLPullHard, sAnimDataBlank, NORMAL_BLEND_DURATION, NORMAL_BLEND_DURATION)
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objTapeArmLeft)
|
|
|
|
// Tape Right
|
|
IF IS_ENTITY_ATTACHED(objTapeArmRight)
|
|
DETACH_ENTITY(objTapeArmRight)
|
|
ENDIF
|
|
PLAY_ENTITY_SCRIPTED_ANIM(objTapeArmRight, sAnimDataRestraintRPullWeak, sAnimDataRestraintRPullHard, sAnimDataBlank, NORMAL_BLEND_DURATION, NORMAL_BLEND_DURATION)
|
|
FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(objTapeArmRight)
|
|
|
|
// Cam
|
|
IF NOT DOES_CAM_EXIST(camTorture)
|
|
camTorture = CREATE_CAMERA(CAMTYPE_ANIMATED)
|
|
SET_CAM_DEBUG_NAME(camTorture, "Torture Cam")
|
|
ENDIF
|
|
|
|
PLAY_CAM_ANIM(camTorture, camAnim, camAnimDict, vTortureScene, vTortureRot, CAF_LOOPING)
|
|
SET_CAM_ACTIVE(camTorture, TRUE)
|
|
|
|
// added bug 1890635
|
|
IF NOT IS_SCRIPT_GLOBAL_SHAKING()
|
|
ANIMATED_SHAKE_SCRIPT_GLOBAL("SHAKE_CAM_medium", "medium", "", fTortureShake)
|
|
ENDIF
|
|
|
|
eLastTorturePlayed = SCENE_PLIERS_PULL_WEAK
|
|
bPliersInMouth = TRUE
|
|
TORTURE_SpikeHeartRate(0.5, 100, 500, 7000)
|
|
iTortureWeaponStage++
|
|
|
|
ENDIF
|
|
BREAK
|
|
// TOOTH YANKING
|
|
CASE 2
|
|
|
|
IF IS_SCRIPT_TASK_RUNNING_OR_STARTING(TREV_PED_ID(), SCRIPT_TASK_PLAY_ANIM)
|
|
|
|
// No longer holding the grip, go back to ready
|
|
IF NOT TORTURE_Is_Control_Pressed(INPUT_SCRIPT_RT, FALSE, TRUE)
|
|
|
|
IF TORTURE_PlaySyncScene(SCENE_PLIERS_READY_IN, FALSE, 0, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
|
|
//CLEAR_PED_SECONDARY_TASK(pedVictim)
|
|
//CLEAR_FACIAL_IDLE_ANIM_OVERRIDE(pedVictim)
|
|
|
|
// Stop speech
|
|
IF DOES_ENTITY_EXIST(TREV_PED_ID())
|
|
AND NOT IS_PED_INJURED(TREV_PED_ID())
|
|
|
|
IF IS_AMBIENT_SPEECH_PLAYING(TREV_PED_ID())
|
|
STOP_CURRENT_PLAYING_AMBIENT_SPEECH(TREV_PED_ID())
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(pedVictim)
|
|
AND NOT IS_PED_INJURED(pedVictim)
|
|
|
|
IF IS_AMBIENT_SPEECH_PLAYING(pedVictim)
|
|
STOP_CURRENT_PLAYING_AMBIENT_SPEECH(pedVictim)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
// kill mouth blood VFX
|
|
IF bFXBloodMouth
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfxBloodMouth)
|
|
STOP_PARTICLE_FX_LOOPED(ptfxBloodMouth)
|
|
ENDIF
|
|
bFXBloodMouth = FALSE
|
|
ENDIF
|
|
|
|
RunConversation("F3_HEAD", "", TRUE)
|
|
|
|
bPliersInMouth = FALSE
|
|
fPullStrength = 0
|
|
iTortureWeaponStage = 0
|
|
ENDIF
|
|
|
|
// Still holding grip
|
|
ELSE
|
|
|
|
bDisplayToothPull = TRUE
|
|
|
|
// Different help text displayed on PC if you're using keyboard and mouse.
|
|
IF NOT bLookingAtECG
|
|
|
|
IF NOT IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(hlpPliers2)
|
|
PRINT_HELP_FOREVER(hlpPliers2)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("HLP_PLIER2_KM")
|
|
PRINT_HELP_FOREVER("HLP_PLIER2_KM")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
GET_CONTROL_VALUE_OF_ANALOGUE_STICKS_UNBOUND(iLX, iLY, iRX, iRY, FALSE, TRUE) // Using unbound version so PC mouse works, and disabling look inversion.
|
|
|
|
fXChange = TO_FLOAT(iRX - iPreviousFrameRX)
|
|
fYChange = TO_FLOAT(iRY - iPreviousFrameRY)
|
|
|
|
fStickHypot = SQRT((TO_FLOAT(iRX)*TO_FLOAT(iRX))+(TO_FLOAT(iRY)*TO_FLOAT(iRY)))
|
|
|
|
IF fStickHypot > 100 // hypotenuse used to simulate a dead zone
|
|
OR IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
|
|
fStickAngleChange = GET_ANGLE_BETWEEN_2D_VECTORS(
|
|
TO_FLOAT(iRX),TO_FLOAT(iRY), // This frame
|
|
TO_FLOAT(iPreviousFrameRX),TO_FLOAT(iPreviousFrameRY)) // last frame
|
|
ELSE
|
|
fStickAngleChange = 0.0
|
|
ENDIF
|
|
|
|
// Update prev frame angle
|
|
iPreviousFrameRX = iRX
|
|
iPreviousFrameRY = iRY
|
|
|
|
// Calculate the new pull strength
|
|
IF ( fStickHypot > 100
|
|
OR IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL) )
|
|
AND fStickAngleChange > I_TOOTH_PULL_ROT_SPEED * TIMESTEP()
|
|
AND ((iRy > 0 AND fXChange < 0.0)
|
|
OR (iRx > 0 AND fYChange > 0.0)
|
|
OR (iRy < 0 AND fXChange > 0.0)
|
|
OR (iRx < 0 AND fYChange < 0.0))
|
|
fPullStrength += 0.5 * TIMESTEP()
|
|
ELSE
|
|
fPullStrength -= 0.25 * TIMESTEP()
|
|
ENDIF
|
|
fPullStrength = CLAMP(fPullStrength, 0.0, 1.0)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
DRAW_DEBUG_TEXT_WRAPPED_BOOL( "Using mouse?", IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL) )
|
|
|
|
DRAW_DEBUG_TEXT_WRAPPED_INT( "iLX", iLX )
|
|
DRAW_DEBUG_TEXT_WRAPPED_INT( "iLY", iLY )
|
|
DRAW_DEBUG_TEXT_WRAPPED_INT( "iRX", iRX )
|
|
DRAW_DEBUG_TEXT_WRAPPED_INT( "iRY", iRY )
|
|
|
|
DRAW_DEBUG_TEXT_WRAPPED_FLOAT( "fStickHypot", fStickHypot )
|
|
DRAW_DEBUG_TEXT_WRAPPED_FLOAT( "fStickAngleChange", fStickAngleChange )
|
|
DRAW_DEBUG_TEXT_WRAPPED_FLOAT( "fPullStrength", fPullStrength )
|
|
#ENDIF
|
|
|
|
// Update the anim weight and camera shake from the pull strength
|
|
SET_ANIM_WEIGHT(TREV_PED_ID(), fPullStrength, AF_PRIORITY_MEDIUM, 0)
|
|
SET_ANIM_WEIGHT(pedVictim, fPullStrength, AF_PRIORITY_MEDIUM, 0)
|
|
SET_ANIM_WEIGHT(pedVictim, fPullStrength, AF_PRIORITY_MEDIUM, 0, TRUE)
|
|
|
|
SET_ANIM_WEIGHT(objTapeArmLeft, fPullStrength, AF_PRIORITY_MEDIUM, 0, TRUE)
|
|
SET_ANIM_WEIGHT(objTapeArmRight, fPullStrength, AF_PRIORITY_MEDIUM, 0, TRUE)
|
|
SET_ANIM_WEIGHT(menuWeapon[TOR_PLIERS].objObject, fPullStrength, AF_PRIORITY_MEDIUM, 0, TRUE)
|
|
|
|
//SET_CAM_SHAKE_AMPLITUDE(camTorture, CLAMP(fPullStrength*3.5, 0.25, 3.5))
|
|
|
|
// Update the victims damage
|
|
IF fPullStrength > 0.50
|
|
|
|
fTortureForceApplied += fPullStrength * TIMESTEP()
|
|
fVictimHealth -= (F_TOOTH_PULL_DAMAGE_OVERALL-F_TOOTH_PULL_DAMAGE_FINAL) * ((fPullStrength * TIMESTEP())/F_TOOTH_PULL_FORCE_LIMIT)
|
|
|
|
IF NOT bFXBloodMouth
|
|
ptfxBloodMouth = START_PARTICLE_FX_LOOPED_ON_PED_BONE( fxBloodMouth, pedVictim,
|
|
<<0,0.1,0>>, VECTOR_ZERO,
|
|
BONETAG_HEAD)
|
|
bFXBloodMouth = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF bFXBloodMouth
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfxBloodMouth)
|
|
STOP_PARTICLE_FX_LOOPED(ptfxBloodMouth)
|
|
ENDIF
|
|
bFXBloodMouth = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Update tooth pull scaleform
|
|
fToothDepth = POW((fTortureForceApplied/F_TOOTH_PULL_FORCE_LIMIT), I_TOOTH_STUBBORNNESS)
|
|
fToothDepth *= F_PERCENT_TOOTH_HEIGHT
|
|
//Gets the decimal percentage of how pulled the tooth is, multiplied by itself to exp increase, so tough at start
|
|
|
|
fToothAngle = TO_FLOAT(iRx)*fToothDepth //Dampens the angle by the depth, so it wiggles more the more the tooth is out
|
|
IF (iRx > 0 AND fToothAngle < 5) //Add wiggle at start
|
|
fToothAngle = 5
|
|
ENDIF
|
|
IF (iRx < 0 AND fToothAngle > -5)
|
|
fToothAngle = -5
|
|
ENDIF
|
|
fToothAngle = ((fToothAngle/128)*30)+30 //Converts the iRx -128 to 128 range into 0 to 360 range
|
|
IF fCurrentSFToothAngle != fToothAngle
|
|
fCurrentSFToothAngle = fToothAngle
|
|
BEGIN_SCALEFORM_MOVIE_METHOD(sfToothPull, "SET_TEETH_ANGLE")
|
|
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fCurrentSFToothAngle)
|
|
END_SCALEFORM_MOVIE_METHOD()
|
|
ENDIF
|
|
fToothDepth *= 100 //Converts the decimal percentage complete into a percent, used for depth
|
|
IF fCurrentSFToothDepth != fToothDepth
|
|
fCurrentSFToothDepth = fToothDepth
|
|
BEGIN_SCALEFORM_MOVIE_METHOD(sfToothPull, "SET_TEETH_DEPTH")
|
|
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fCurrentSFToothDepth)
|
|
END_SCALEFORM_MOVIE_METHOD()
|
|
ENDIF
|
|
|
|
// >>>>>> Tooth has come loose, play pull outro
|
|
//-------------------------------------------------------
|
|
IF fTortureForceApplied >= F_TOOTH_PULL_FORCE_LIMIT
|
|
|
|
// Decide which tooth pull scene to play
|
|
FLOAT fToothRandom
|
|
fToothRandom = GET_RANDOM_FLOAT_IN_RANGE()
|
|
SYNC_SCENES eToothOutScene
|
|
IF fToothRandom >= 0.5
|
|
eToothOutScene = SCENE_PLIERS_PULL_OUT
|
|
ELSE
|
|
eToothOutScene = SCENE_PLIERS_PULL_OUT2
|
|
ENDIF
|
|
|
|
// PLAY TOOH PULL OUTRO
|
|
IF TORTURE_PlaySyncScene(eToothOutScene, FALSE, 0.0, INSTANT_BLEND_IN, SLOW_BLEND_OUT)
|
|
|
|
CLEAR_PED_SECONDARY_TASK(pedVictim)
|
|
//CLEAR_FACIAL_IDLE_ANIM_OVERRIDE(pedVictim)
|
|
|
|
// Stop the mouth blood loop
|
|
IF bFXBloodMouth
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfxBloodMouth)
|
|
STOP_PARTICLE_FX_LOOPED(ptfxBloodMouth)
|
|
ENDIF
|
|
bFXBloodMouth = FALSE
|
|
ENDIF
|
|
|
|
// kill mouth blood VFX
|
|
IF bFXBloodMouth
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfxBloodMouth)
|
|
STOP_PARTICLE_FX_LOOPED(ptfxBloodMouth)
|
|
ENDIF
|
|
bFXBloodMouth = FALSE
|
|
ENDIF
|
|
|
|
// Reset tooth pull scaleform
|
|
BEGIN_SCALEFORM_MOVIE_METHOD(sfToothPull, "SET_TEETH_ANGLE")
|
|
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(30.0)
|
|
END_SCALEFORM_MOVIE_METHOD()
|
|
BEGIN_SCALEFORM_MOVIE_METHOD(sfToothPull, "SET_TEETH_DEPTH")
|
|
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(100.0)
|
|
END_SCALEFORM_MOVIE_METHOD()
|
|
|
|
// Process conversations
|
|
clearText()
|
|
|
|
// Stop speech
|
|
IF DOES_ENTITY_EXIST(TREV_PED_ID())
|
|
AND NOT IS_PED_INJURED(TREV_PED_ID())
|
|
IF IS_AMBIENT_SPEECH_PLAYING(TREV_PED_ID())
|
|
STOP_CURRENT_PLAYING_AMBIENT_SPEECH(TREV_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iNumberOfTeethPulled++
|
|
SWITCH eMissionStage
|
|
CASE ST_3_TORTURE_FOR_FIRST RunConversation("F3_PHIT1", "", TRUE) BREAK
|
|
CASE ST_5_TORTURE_FOR_SECOND RunConversation("F3_PHIT2", "", TRUE) BREAK
|
|
CASE ST_7_TORTURE_FOR_THIRD RunConversation("F3_PHIT3", "", TRUE) BREAK
|
|
CASE ST_9_TORTURE_FINAL RunConversation("F3_PHIT4", "", TRUE) BREAK
|
|
ENDSWITCH
|
|
|
|
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(FBI3_TOOTH)
|
|
|
|
fTortureForceApplied = 0
|
|
bJustStarting = TRUE
|
|
bPliersInMouth = FALSE
|
|
fPullStrength = 0
|
|
iTortureStage++
|
|
ENDIF
|
|
ELSE
|
|
// Grunting and Screaming while pulling the tooth
|
|
IF fPullStrength > 0.25
|
|
IF DOES_ENTITY_EXIST(TREV_PED_ID())
|
|
AND NOT IS_PED_INJURED(TREV_PED_ID())
|
|
IF IS_SCRIPTED_SPEECH_PLAYING(TREV_PED_ID())
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ELSE
|
|
IF NOT IS_AMBIENT_SPEECH_PLAYING(TREV_PED_ID())
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(TREV_PED_ID(), "FBI3_BUAA", "Trevor", SPEECH_PARAMS_FORCE_NORMAL)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Mr K
|
|
IF DOES_ENTITY_EXIST(pedVictim)
|
|
AND NOT IS_PED_INJURED(pedVictim)
|
|
IF IS_SCRIPTED_SPEECH_PLAYING(pedVictim)
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
ELSE
|
|
IF NOT IS_AMBIENT_SPEECH_PLAYING(pedVictim)
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedVictim, "Toothpull_pain", "MisterK", SPEECH_PARAMS_FORCE_NORMAL)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
// Mr K
|
|
IF DOES_ENTITY_EXIST(pedVictim)
|
|
AND NOT IS_PED_INJURED(pedVictim)
|
|
IF NOT IS_AMBIENT_SPEECH_PLAYING(pedVictim)
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedVictim, "Pliers_Panting", "MisterK", SPEECH_PARAMS_FORCE_NORMAL)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
BREAK
|
|
CASE TOR_CLIP0 //Weapon is Electrocution
|
|
|
|
SWITCH iTortureWeaponStage
|
|
CASE 0
|
|
IF HAS_ANIM_DICT_LOADED("MISSFBI3_electrocute")
|
|
IF NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_ELEC_SPARK])
|
|
|
|
ANIM_DATA sAnimDataTrevorIdle, sAnimDataTrevorAttach, sAnimDataTrevorShock
|
|
ANIM_DATA sAnimDataMrKIdle, sAnimDataMrKAttach, sAnimDataMrKShock
|
|
ANIM_DATA sAnimDataMrKIdleFace, sAnimDataMrKAttachFace, sAnimDataMrKShockFace
|
|
ANIM_DATA sAnimDataWireLIdle, sAnimDataWireLAttach, sAnimDataWireLShock
|
|
ANIM_DATA sAnimDataWireRIdle, sAnimDataWireRAttach, sAnimDataWireRShock
|
|
|
|
TEXT_LABEL_63 camAnim
|
|
TEXT_LABEL_63 camAnimDict
|
|
|
|
sAnimDataTrevorIdle.type = APT_SINGLE_ANIM
|
|
sAnimDataTrevorIdle.flags = AF_LOOPING | AF_OVERRIDE_PHYSICS// | AF_EXTRACT_INITIAL_OFFSET
|
|
sAnimDataMrKIdle.type = APT_SINGLE_ANIM
|
|
sAnimDataMrKIdle.flags = AF_LOOPING | AF_OVERRIDE_PHYSICS// | AF_EXTRACT_INITIAL_OFFSET
|
|
sAnimDataMrKIdleFace.type = APT_SINGLE_ANIM
|
|
sAnimDataMrKIdleFace.flags = AF_LOOPING | AF_OVERRIDE_PHYSICS | AF_SECONDARY
|
|
sAnimDataWireLIdle.type = APT_SINGLE_ANIM
|
|
sAnimDataWireLIdle.flags = AF_LOOPING //| AF_OVERRIDE_PHYSICS// | AF_EXTRACT_INITIAL_OFFSET
|
|
sAnimDataWireRIdle.type = APT_SINGLE_ANIM
|
|
sAnimDataWireRIdle.flags = AF_LOOPING //| AF_OVERRIDE_PHYSICS// | AF_EXTRACT_INITIAL_OFFSET
|
|
|
|
sAnimDataTrevorAttach.type = APT_3_WAY_BLEND
|
|
sAnimDataTrevorAttach.flags = AF_LOOPING | AF_OVERRIDE_PHYSICS// | AF_EXTRACT_INITIAL_OFFSET
|
|
sAnimDataMrKAttach.type = APT_3_WAY_BLEND
|
|
sAnimDataMrKAttach.flags = AF_LOOPING | AF_OVERRIDE_PHYSICS// | AF_EXTRACT_INITIAL_OFFSET
|
|
sAnimDataMrKAttachFace.type = APT_3_WAY_BLEND
|
|
sAnimDataMrKAttachFace.flags = AF_LOOPING | AF_OVERRIDE_PHYSICS | AF_SECONDARY
|
|
sAnimDataWireLAttach.type = APT_3_WAY_BLEND
|
|
sAnimDataWireLAttach.flags = AF_LOOPING //| AF_OVERRIDE_PHYSICS// | AF_EXTRACT_INITIAL_OFFSET
|
|
sAnimDataWireRAttach.type = APT_3_WAY_BLEND
|
|
sAnimDataWireRAttach.flags = AF_LOOPING //| AF_OVERRIDE_PHYSICS// | AF_EXTRACT_INITIAL_OFFSET
|
|
|
|
sAnimDataTrevorShock.type = APT_SINGLE_ANIM
|
|
sAnimDataTrevorShock.flags = AF_LOOPING | AF_OVERRIDE_PHYSICS// | AF_EXTRACT_INITIAL_OFFSET
|
|
sAnimDataMrKShock.type = APT_SINGLE_ANIM
|
|
sAnimDataMrKShock.flags = AF_LOOPING | AF_OVERRIDE_PHYSICS// | AF_EXTRACT_INITIAL_OFFSET
|
|
sAnimDataMrKShockFace.type = APT_SINGLE_ANIM
|
|
sAnimDataMrKShockFace.flags = AF_LOOPING | AF_OVERRIDE_PHYSICS | AF_SECONDARY
|
|
sAnimDataWireLShock.type = APT_SINGLE_ANIM
|
|
sAnimDataWireLShock.flags = AF_LOOPING //| AF_OVERRIDE_PHYSICS// | AF_EXTRACT_INITIAL_OFFSET
|
|
sAnimDataWireRShock.type = APT_SINGLE_ANIM
|
|
sAnimDataWireRShock.flags = AF_LOOPING //| AF_OVERRIDE_PHYSICS// | AF_EXTRACT_INITIAL_OFFSET
|
|
|
|
// Set up animations for scripted animation task
|
|
camAnimDict = "MISSFBI3_electrocute"
|
|
camAnim = "Clamp_Wait_Loop_Cam"
|
|
|
|
// Stand IDLE with the clips ready to shock
|
|
sAnimDataTrevorIdle.dictionary0 = "MISSFBI3_electrocute"
|
|
sAnimDataTrevorIdle.anim0 = "Clamp_Wait_Loop_Player"
|
|
|
|
sAnimDataMrKIdle.dictionary0 = "MISSFBI3_electrocute"
|
|
sAnimDataMrKIdle.anim0 = "Clamp_Wait_Loop_Victim"
|
|
|
|
sAnimDataMrKIdleFace.dictionary0 = "MISSFBI3_electrocute"
|
|
sAnimDataMrKIdleFace.anim0 = "Clamp_Wait_Loop_Victim_facial"
|
|
sAnimDataMrKIdleFace.weight0 = 1.0
|
|
|
|
sAnimDataWireLIdle.dictionary0 = "MISSFBI3_electrocute"
|
|
sAnimDataWireLIdle.anim0 = "Clamp_Wait_Loop_l_clip"
|
|
|
|
sAnimDataWireRIdle.dictionary0 = "MISSFBI3_electrocute"
|
|
sAnimDataWireRIdle.anim0 = "Clamp_Wait_Loop_r_clip"
|
|
|
|
// Use left grip
|
|
sAnimDataTrevorAttach.dictionary0 = "MISSFBI3_electrocute"
|
|
sAnimDataTrevorAttach.anim0 = "Clamp_Left_Loop_Player"
|
|
sAnimDataTrevorAttach.weight0 = 0.0
|
|
|
|
sAnimDataMrKAttach.dictionary0 = "MISSFBI3_electrocute"
|
|
sAnimDataMrKAttach.anim0 = "Clamp_Left_Loop_Victim"
|
|
sAnimDataMrKAttach.weight0 = 0.0
|
|
|
|
sAnimDataMrKAttachFace.dictionary0 = "MISSFBI3_electrocute"
|
|
sAnimDataMrKAttachFace.anim0 = "Clamp_Left_Loop_Victim_facial"
|
|
sAnimDataMrKAttachFace.weight0 = 0.0
|
|
|
|
sAnimDataWireLAttach.dictionary0 = "MISSFBI3_electrocute"
|
|
sAnimDataWireLAttach.anim0 = "Clamp_Left_Loop_l_clip"
|
|
sAnimDataWireLAttach.weight0 = 0.0
|
|
|
|
sAnimDataWireRAttach.dictionary0 = "MISSFBI3_electrocute"
|
|
sAnimDataWireRAttach.anim0 = "Clamp_Left_Loop_r_clip"
|
|
sAnimDataWireRAttach.weight0 = 0.0
|
|
|
|
// Use right grip
|
|
sAnimDataTrevorAttach.dictionary2 = "MISSFBI3_electrocute"
|
|
sAnimDataTrevorAttach.anim2 = "Clamp_Right_Loop_Player"
|
|
sAnimDataTrevorAttach.weight2 = 0.0
|
|
|
|
sAnimDataMrKAttach.dictionary2 = "MISSFBI3_electrocute"
|
|
sAnimDataMrKAttach.anim2 = "Clamp_Right_Loop_Victim"
|
|
sAnimDataMrKAttach.weight2 = 0.0
|
|
|
|
sAnimDataMrKAttachFace.dictionary2 = "MISSFBI3_electrocute"
|
|
sAnimDataMrKAttachFace.anim2 = "Clamp_Right_Loop_Victim_facial"
|
|
sAnimDataMrKAttachFace.weight2 = 0.0
|
|
|
|
sAnimDataWireLAttach.dictionary2 = "MISSFBI3_electrocute"
|
|
sAnimDataWireLAttach.anim2 = "Clamp_Right_Loop_l_clip"
|
|
sAnimDataWireLAttach.weight2 = 0.0
|
|
|
|
sAnimDataWireRAttach.dictionary2 = "MISSFBI3_electrocute"
|
|
sAnimDataWireRAttach.anim2 = "Clamp_Right_Loop_r_clip"
|
|
sAnimDataWireRAttach.weight2 = 0.0
|
|
|
|
// Use both grips
|
|
sAnimDataTrevorAttach.dictionary1 = "MISSFBI3_electrocute"
|
|
sAnimDataTrevorAttach.anim1 = "Electrocute_Both_Loop_Player"
|
|
sAnimDataTrevorAttach.weight1 = 0.0
|
|
|
|
sAnimDataMrKAttach.dictionary1 = "MISSFBI3_electrocute"
|
|
sAnimDataMrKAttach.anim1 = "Electrocute_Both_Loop_Victim" //"clamp_both_idle_victim"
|
|
sAnimDataMrKAttach.weight1 = 0.0
|
|
|
|
sAnimDataMrKAttachFace.dictionary1 = "MISSFBI3_electrocute"
|
|
sAnimDataMrKAttachFace.anim1 = "Electrocute_Both_Loop_Victim_facial"
|
|
sAnimDataMrKAttachFace.weight1 = 0.0
|
|
|
|
sAnimDataWireLAttach.dictionary1 = "MISSFBI3_electrocute"
|
|
sAnimDataWireLAttach.anim1 = "electrocute_both_loop_l_clip"
|
|
sAnimDataWireLAttach.weight1 = 0.0
|
|
|
|
sAnimDataWireRAttach.dictionary1 = "MISSFBI3_electrocute"
|
|
sAnimDataWireRAttach.anim1 = "electrocute_both_loop_r_clip"
|
|
sAnimDataWireRAttach.weight1 = 0.0
|
|
|
|
// Electrocute
|
|
sAnimDataTrevorShock.dictionary0 = "MISSFBI3_electrocute"
|
|
sAnimDataTrevorShock.anim0 = "Electrocute_Both_Loop_Player"
|
|
sAnimDataTrevorShock.weight0 = 0.0
|
|
|
|
sAnimDataMrKShock.dictionary0 = "MISSFBI3_electrocute"
|
|
sAnimDataMrKShock.anim0 = "Electrocute_Both_Loop_Victim"
|
|
sAnimDataMrKShock.weight0 = 0.0
|
|
|
|
sAnimDataMrKShockFace.dictionary0 = "MISSFBI3_electrocute"
|
|
sAnimDataMrKShockFace.anim0 = "Electrocute_Both_Loop_Victim_facial"
|
|
sAnimDataMrKShockFace.weight0 = 0.0
|
|
|
|
sAnimDataWireLShock.dictionary0 = "MISSFBI3_electrocute"
|
|
sAnimDataWireLShock.anim0 = "electrocute_both_loop_l_clip"
|
|
sAnimDataWireLShock.weight0 = 0.0
|
|
|
|
sAnimDataWireRShock.dictionary0 = "MISSFBI3_electrocute"
|
|
sAnimDataWireRShock.anim0 = "electrocute_both_loop_r_clip"
|
|
sAnimDataWireRShock.weight0 = 0.0
|
|
|
|
|
|
FLOAT fBlendDuration
|
|
FLOAT fBlendDelta
|
|
IF bJustStarting
|
|
fBlendDuration = INSTANT_BLEND_DURATION
|
|
fBlendDelta = INSTANT_BLEND_IN
|
|
ELSE
|
|
fBlendDuration = SLOW_BLEND_DURATION
|
|
fBlendDelta = SLOW_BLEND_IN
|
|
ENDIF
|
|
|
|
IF bHasChairPlayedAnim
|
|
IF DOES_ENTITY_EXIST(objChair)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(objChair, INSTANT_BLEND_OUT, FALSE)
|
|
bHasChairPlayedAnim = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
TORTURE_StopTortureWeaponAnim(menuWeapon[TOR_CLIP0], -fBlendDelta)
|
|
TORTURE_StopTortureWeaponAnim(menuWeapon[TOR_CLIP1], -fBlendDelta)
|
|
|
|
IF NOT IS_ENTITY_ATTACHED(menuWeapon[TOR_CLIP0].objObject)
|
|
ATTACH_ENTITY_TO_ENTITY(menuWeapon[TOR_CLIP0].objObject, TREV_PED_ID(), GET_PED_BONE_INDEX(TREV_PED_ID(), BONETAG_PH_R_HAND), <<0,0,0>>, <<0,0,0>>)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_ATTACHED(menuWeapon[TOR_CLIP1].objObject)
|
|
ATTACH_ENTITY_TO_ENTITY(menuWeapon[TOR_CLIP1].objObject, TREV_PED_ID(), GET_PED_BONE_INDEX(TREV_PED_ID(), BONETAG_PH_L_HAND), <<0,0,0>>, <<0,0,0>>)
|
|
ENDIF
|
|
|
|
IF bHasRestraintPlayedAnim
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(objTapeArmLeft, -fBlendDelta, FALSE)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(objTapeArmRight, -fBlendDelta, FALSE)
|
|
bHasRestraintPlayedAnim = FALSE
|
|
ENDIF
|
|
|
|
VECTOR vCoord, vRot
|
|
vCoord = GET_ANIM_INITIAL_OFFSET_POSITION("MISSFBI3_electrocute", "Electrocute_Both_Loop_hand_l", vChairCoords, vChairRot-<<0,0,180>>)
|
|
vRot = GET_ANIM_INITIAL_OFFSET_ROTATION("MISSFBI3_electrocute", "Electrocute_Both_Loop_hand_l", vChairCoords, vChairRot-<<0,0,180>>)
|
|
SET_ENTITY_COORDS(objTapeArmLeft, vCoord)
|
|
SET_ENTITY_ROTATION(objTapeArmLeft, vRot)
|
|
PLAY_ENTITY_ANIM(objTapeArmLeft, "Electrocute_Both_Loop_hand_l", "MISSFBI3_electrocute", fBlendDelta, TRUE, FALSE)
|
|
vCoord = GET_ANIM_INITIAL_OFFSET_POSITION("MISSFBI3_electrocute", "Electrocute_Both_Loop_hand_r", vChairCoords, vChairRot-<<0,0,180>>)
|
|
vRot = GET_ANIM_INITIAL_OFFSET_ROTATION("MISSFBI3_electrocute", "Electrocute_Both_Loop_hand_r", vChairCoords, vChairRot-<<0,0,180>>)
|
|
SET_ENTITY_COORDS(objTapeArmRight, vCoord)
|
|
SET_ENTITY_ROTATION(objTapeArmRight, vRot)
|
|
PLAY_ENTITY_ANIM(objTapeArmRight, "Electrocute_Both_Loop_hand_r", "MISSFBI3_electrocute", fBlendDelta, TRUE, FALSE)
|
|
|
|
TASK_SCRIPTED_ANIMATION(TREV_PED_ID(), sAnimDataTrevorAttach, sAnimDataTrevorIdle, sAnimDataTrevorShock, fBlendDuration)
|
|
TASK_SCRIPTED_ANIMATION(pedVictim, sAnimDataMrKAttach, sAnimDataMrKIdle, sAnimDataMrKShock, fBlendDuration)
|
|
TASK_SCRIPTED_ANIMATION(pedVictim, sAnimDataMrKAttachFace, sAnimDataMrKIdleFace, sAnimDataMrKShockFace, fBlendDuration)
|
|
PLAY_ENTITY_SCRIPTED_ANIM(menuWeapon[TOR_CLIP0].objObject, sAnimDataWireRAttach, sAnimDataWireRIdle, sAnimDataWireRShock, fBlendDuration)
|
|
PLAY_ENTITY_SCRIPTED_ANIM(menuWeapon[TOR_CLIP1].objObject, sAnimDataWireLAttach, sAnimDataWireLIdle, sAnimDataWireLShock, fBlendDuration)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(TREV_PED_ID())
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(pedVictim)
|
|
|
|
bPlayedTortureSceneThisFrame = TRUE
|
|
SAFE_FADE_IN(DEFAULT_FADE_TIME_SHORT)
|
|
|
|
// Cam
|
|
IF NOT DOES_CAM_EXIST(camTorture)
|
|
camTorture = CREATE_CAMERA(CAMTYPE_ANIMATED, TRUE)
|
|
SET_CAM_DEBUG_NAME(camTorture, "Torture Cam")
|
|
ENDIF
|
|
|
|
PLAY_CAM_ANIM(camTorture, camAnim, camAnimDict, vTortureScene, vTortureRot, CAF_LOOPING)
|
|
SHAKE_CAM(camTorture, shakeRoadVib, 0.25)
|
|
|
|
// added bug 1890635
|
|
IF NOT IS_SCRIPT_GLOBAL_SHAKING()
|
|
ANIMATED_SHAKE_SCRIPT_GLOBAL("SHAKE_CAM_medium", "medium", "", fTortureShake)
|
|
ENDIF
|
|
|
|
// PTFX
|
|
IF NOT bFXElecSmoulder
|
|
ptfxElecSmoulder = START_PARTICLE_FX_LOOPED_ON_PED_BONE(fxElecSmoulder, pedVictim,
|
|
<<0,0.0,0>>, VECTOR_ZERO, BONETAG_NECK)
|
|
fSmokeEvo = 0.0
|
|
bFXElecSmoulder = TRUE
|
|
ENDIF
|
|
|
|
iTimeSinceLastShock = 0
|
|
bElecgripSpike = FALSE
|
|
bJustStarting = FALSE
|
|
iTortureWeaponStage++
|
|
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
// >>>> START OUTRO
|
|
// Either player has let go after the required electrocution time
|
|
IF ((fTortureForceApplied > F_ELECTRO_TIME OR (fTortureForceApplied > F_ELECTRO_TIME/4 AND fVictimHealth <= 20.0))
|
|
AND (NOT TORTURE_Is_Control_Pressed(INPUT_SCRIPT_LT, FALSE, TRUE)
|
|
OR NOT TORTURE_Is_Control_Pressed(INPUT_SCRIPT_RT, FALSE, TRUE) ) )
|
|
|
|
// OR they have electrocuted Mrk too much
|
|
OR fVictimHealth <= 0.0
|
|
|
|
IF TORTURE_PlaySyncScene(SCENE_ELEC_OUTRO, FALSE, 0.0, INSTANT_BLEND_IN, SLOW_BLEND_OUT)
|
|
|
|
CLEAR_PED_SECONDARY_TASK(pedVictim)
|
|
|
|
fTortureForceApplied = 0
|
|
fClipGripProgLeft = 0
|
|
fClipGripProgRight = 0
|
|
fClipGripIncLeft = 0
|
|
fClipGripIncRight = 0
|
|
fLRBalance = 0
|
|
fLRBalanceNorm = 0
|
|
fLeftWeight = 0
|
|
fRightWeight = 0
|
|
fIdleWeight = 0
|
|
fBothWeight = 0
|
|
fShockLoopTransition = 0
|
|
fShockLoopInc = 0
|
|
|
|
clearText()
|
|
|
|
RunConversation("F3_EHIT1")
|
|
|
|
iTortureStage++ //ELECTROCUTED, MOVE ONTO OUTRO SECTION
|
|
ENDIF
|
|
|
|
// >>>> SPARK ANIM
|
|
ELIF TORTURE_Is_Control_Pressed(INPUT_SCRIPT_RDOWN, TRUE, TRUE)
|
|
AND GET_GAME_TIMER() > i_SparkTimer
|
|
|
|
IF NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_ELEC_SPARK])
|
|
IF TORTURE_PlaySyncScene(SCENE_ELEC_SPARK, FALSE, DEFAULT, NORMAL_BLEND_IN, SLOW_BLEND_OUT)
|
|
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
ENDIF
|
|
RunConversation("F3_REACT", DEFAULT, TRUE)
|
|
|
|
fClipGripProgLeft = 0
|
|
fClipGripProgRight = 0
|
|
fClipGripIncLeft = 0
|
|
fClipGripIncRight = 0
|
|
fLRBalance = 0
|
|
fLRBalanceNorm = 0
|
|
fLeftWeight = 0
|
|
fRightWeight = 0
|
|
fIdleWeight = 0
|
|
fBothWeight = 0
|
|
fShockLoopTransition = 0
|
|
fShockLoopInc = 0
|
|
|
|
i_SparkTimer = GET_GAME_TIMER() + 500
|
|
iTortureWeaponStage++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF NOT IS_ENTITY_ATTACHED(menuWeapon[TOR_CLIP0].objObject)
|
|
ATTACH_ENTITY_TO_ENTITY(menuWeapon[ENUM_TO_INT(TOR_CLIP0)].objObject,
|
|
TREV_PED_ID(),
|
|
GET_PED_BONE_INDEX(TREV_PED_ID(), BONETAG_PH_R_HAND),
|
|
menuWeapon[ENUM_TO_INT(TOR_CLIP1)].vAttachOffset,
|
|
menuWeapon[ENUM_TO_INT(TOR_CLIP1)].vAttachRot)
|
|
ENDIF
|
|
|
|
IF NOT IS_ENTITY_ATTACHED(menuWeapon[TOR_CLIP1].objObject)
|
|
ATTACH_ENTITY_TO_ENTITY(menuWeapon[ENUM_TO_INT(TOR_CLIP1)].objObject,
|
|
TREV_PED_ID(),
|
|
GET_PED_BONE_INDEX(TREV_PED_ID(), BONETAG_PH_L_HAND),
|
|
menuWeapon[ENUM_TO_INT(TOR_CLIP1)].vAttachOffset,
|
|
menuWeapon[ENUM_TO_INT(TOR_CLIP1)].vAttachRot)
|
|
ENDIF
|
|
|
|
// >>>>> MANAGE ANIM BLENDING <<<<<
|
|
//----------------------------------
|
|
FLOAT fIncrement
|
|
fIncrement = TIMESTEP()/0.250
|
|
|
|
IF fClipGripProgLeft = 0.0
|
|
IF TORTURE_Is_Control_Pressed(INPUT_SCRIPT_LT, FALSE, TRUE)
|
|
fClipGripIncLeft = fIncrement
|
|
ENDIF
|
|
ELIF fClipGripProgLeft = 1.0
|
|
IF NOT TORTURE_Is_Control_Pressed(INPUT_SCRIPT_LT, FALSE, TRUE)
|
|
fClipGripIncLeft = -fIncrement //* 0.5 // slower out
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fClipGripProgRight = 0.0
|
|
IF TORTURE_Is_Control_Pressed(INPUT_SCRIPT_RT, FALSE, TRUE)
|
|
fClipGripIncRight = fIncrement
|
|
ENDIF
|
|
ELIF fClipGripProgRight = 1.0
|
|
IF NOT TORTURE_Is_Control_Pressed(INPUT_SCRIPT_RT, FALSE, TRUE)
|
|
fClipGripIncRight = -fIncrement //* 0.5 // slower out
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fClipGripProgLeft = CLAMP(fClipGripProgLeft + fClipGripIncLeft, 0.0, 1.0)
|
|
fClipGripProgRight = CLAMP(fClipGripProgRight + fClipGripIncRight, 0.0, 1.0)
|
|
|
|
fLRBalance = fClipGripProgRight - fClipGripProgLeft
|
|
fLRBalanceNorm = ((fClipGripProgRight - fClipGripProgLeft) + 1.0)/2.0
|
|
fLeftWeight = ABSF(CLAMP(fLRBalance, -1.0, 0.0))
|
|
fRightWeight = ABSF(CLAMP(fLRBalance, 0.0, 1.0))
|
|
fIdleWeight = 1 - ((fClipGripProgLeft * (1.0 - fLRBalanceNorm)) + (fClipGripProgRight * fLRBalanceNorm))
|
|
fBothWeight = 1 - ABSF(fLRBalance)
|
|
|
|
IF fClipGripProgLeft = 1.0 AND fClipGripProgRight = 1.0
|
|
IF fShockLoopTransition = 0.0
|
|
fShockLoopInc = TIMESTEP()/0.125
|
|
ENDIF
|
|
ELSE
|
|
IF fShockLoopTransition > 0.0
|
|
fShockLoopInc = -TIMESTEP()/0.125
|
|
ENDIF
|
|
ENDIF
|
|
|
|
fShockLoopTransition = CLAMP(fShockLoopTransition + fShockLoopInc, 0.0, 1.0)
|
|
|
|
SET_ANIM_WEIGHT(TREV_PED_ID(), fShockLoopTransition, AF_PRIORITY_HIGH)
|
|
SET_ANIM_WEIGHT(TREV_PED_ID(), fIdleWeight, AF_PRIORITY_MEDIUM)
|
|
SET_ANIM_WEIGHT(TREV_PED_ID(), fLeftWeight, AF_PRIORITY_LOW, 0)
|
|
SET_ANIM_WEIGHT(TREV_PED_ID(), fRightWeight, AF_PRIORITY_LOW, 2)
|
|
SET_ANIM_WEIGHT(TREV_PED_ID(), fBothWeight, AF_PRIORITY_LOW, 1)
|
|
|
|
SET_ANIM_WEIGHT(pedVictim, fShockLoopTransition, AF_PRIORITY_HIGH)
|
|
SET_ANIM_WEIGHT(pedVictim, fIdleWeight, AF_PRIORITY_MEDIUM)
|
|
SET_ANIM_WEIGHT(pedVictim, fLeftWeight, AF_PRIORITY_LOW, 0)
|
|
SET_ANIM_WEIGHT(pedVictim, fRightWeight, AF_PRIORITY_LOW, 2)
|
|
SET_ANIM_WEIGHT(pedVictim, fBothWeight, AF_PRIORITY_LOW, 1)
|
|
|
|
SET_ANIM_WEIGHT(pedVictim, fShockLoopTransition, AF_PRIORITY_HIGH, 0, TRUE)
|
|
SET_ANIM_WEIGHT(pedVictim, fIdleWeight, AF_PRIORITY_MEDIUM, 0, TRUE)
|
|
SET_ANIM_WEIGHT(pedVictim, fLeftWeight, AF_PRIORITY_LOW, 0, TRUE)
|
|
SET_ANIM_WEIGHT(pedVictim, fRightWeight, AF_PRIORITY_LOW, 2, TRUE)
|
|
SET_ANIM_WEIGHT(pedVictim, fBothWeight, AF_PRIORITY_LOW, 1, TRUE)
|
|
|
|
SET_ANIM_WEIGHT(menuWeapon[TOR_CLIP0].objObject, fShockLoopTransition, AF_PRIORITY_HIGH, 0, TRUE)
|
|
SET_ANIM_WEIGHT(menuWeapon[TOR_CLIP0].objObject, fIdleWeight, AF_PRIORITY_MEDIUM, 0, TRUE)
|
|
SET_ANIM_WEIGHT(menuWeapon[TOR_CLIP0].objObject, fLeftWeight, AF_PRIORITY_LOW, 0, TRUE)
|
|
SET_ANIM_WEIGHT(menuWeapon[TOR_CLIP0].objObject, fRightWeight, AF_PRIORITY_LOW, 2, TRUE)
|
|
SET_ANIM_WEIGHT(menuWeapon[TOR_CLIP0].objObject, fBothWeight, AF_PRIORITY_LOW, 1, TRUE)
|
|
|
|
SET_ANIM_WEIGHT(menuWeapon[TOR_CLIP1].objObject, fShockLoopTransition, AF_PRIORITY_HIGH, 0, TRUE)
|
|
SET_ANIM_WEIGHT(menuWeapon[TOR_CLIP1].objObject, fIdleWeight, AF_PRIORITY_MEDIUM, 0, TRUE)
|
|
SET_ANIM_WEIGHT(menuWeapon[TOR_CLIP1].objObject, fLeftWeight, AF_PRIORITY_LOW, 0, TRUE)
|
|
SET_ANIM_WEIGHT(menuWeapon[TOR_CLIP1].objObject, fRightWeight, AF_PRIORITY_LOW, 2, TRUE)
|
|
SET_ANIM_WEIGHT(menuWeapon[TOR_CLIP1].objObject, fBothWeight, AF_PRIORITY_LOW, 1, TRUE)
|
|
|
|
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(hlpBattery)
|
|
AND NOT bLookingAtECG
|
|
PRINT_HELP_FOREVER(hlpBattery)
|
|
ENDIF
|
|
|
|
IF fIdleWeight = 1.0
|
|
bIdlingElectricity = TRUE
|
|
ELSE
|
|
bIdlingElectricity = FALSE
|
|
ENDIF
|
|
|
|
// >>>>>> Process electrocution damage <<<<<<<
|
|
//---------------------------------------------
|
|
IF fShockLoopTransition = 1.0
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(strOneShotLoaded)
|
|
PLAY_ONESHOT()
|
|
ENDIF
|
|
|
|
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(FBI3_ELECTROCUTION)
|
|
|
|
fTortureForceApplied += TIMESTEP()
|
|
fVictimHealth -= (F_ELECTRO_DAMAGE/F_ELECTRO_TIME) * TIMESTEP()
|
|
fSmokeEvo += fSmokeChange
|
|
|
|
IF fTortureForceApplied > F_ELECTRO_TIME
|
|
OR fVictimHealth <= 20.0
|
|
IF NOT IS_SCRIPTED_CONVERSATION_ONGOING()
|
|
RunConversation("F3_ENOUGH1")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF (fClipGripProgLeft = 1.0 AND fClipGripProgRight = 0.0)
|
|
OR (fClipGripProgLeft = 0.0 AND fClipGripProgRight = 1.0)
|
|
|
|
IF NOT bElecgripSpike
|
|
TORTURE_SpikeHeartRate(0.5, 100, 500, 7000)
|
|
iWeaponSelDiaTimer = GET_GAME_TIMER()
|
|
iWeaponSelDiaDelay = 1500
|
|
bElecgripSpike = TRUE
|
|
ENDIF
|
|
|
|
ELSE
|
|
bElecgripSpike = FALSE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
// Manage Mr pleading and his pain noises
|
|
// Electrocution pain
|
|
IF fShockLoopTransition != 0.0
|
|
|
|
IF DOES_ENTITY_EXIST(pedVictim)
|
|
AND NOT IS_PED_INJURED(pedVictim)
|
|
|
|
IF iTimeSinceLastShock != -1
|
|
IF NOT IS_AMBIENT_SPEECH_PLAYING(pedVictim)
|
|
STOP_CURRENT_PLAYING_AMBIENT_SPEECH(pedVictim)
|
|
ENDIF
|
|
|
|
iTimeSinceLastShock = -1
|
|
ENDIF
|
|
|
|
IF IS_SCRIPTED_SPEECH_PLAYING(pedVictim)
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
ELSE
|
|
IF NOT IS_AMBIENT_SPEECH_PLAYING(pedVictim)
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedVictim, "Electrocution", "MisterK", SPEECH_PARAMS_FORCE_NORMAL)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
// Post electrocution panting and then pleading with Trevor not to do it
|
|
ELSE
|
|
|
|
IF DOES_ENTITY_EXIST(pedVictim)
|
|
AND NOT IS_PED_INJURED(pedVictim)
|
|
|
|
IF iTimeSinceLastShock = -1
|
|
iTimeSinceLastShock = GET_GAME_TIMER() + 2000
|
|
IF IS_AMBIENT_SPEECH_PLAYING(pedVictim)
|
|
STOP_CURRENT_PLAYING_AMBIENT_SPEECH(pedVictim)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_GAME_TIMER() <= iTimeSinceLastShock
|
|
IF NOT IS_AMBIENT_SPEECH_PLAYING(pedVictim)
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedVictim, "Pliers_Panting", "MisterK", SPEECH_PARAMS_FORCE)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_AMBIENT_SPEECH_PLAYING(pedVictim)
|
|
IF GET_GAME_TIMER() - i_time_of_last_convo > I_TIME_BETWEEN_PLEES
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
RunConversation("F3_JUMP", "", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF bFXElecSmoulder //Makes the smoke increase or decrease if player is being elec
|
|
AND DOES_PARTICLE_FX_LOOPED_EXIST(ptfxElecSmoulder)
|
|
fSmokeEvo = CLAMP(fSmokeEvo - fSmokeChange/2, 0.0, 1.0)
|
|
SET_PARTICLE_FX_LOOPED_EVOLUTION(ptfxElecSmoulder, "smoke", fSmokeEvo)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
|
|
BREAK
|
|
CASE 2
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_ELEC_SPARK])
|
|
|
|
IF IS_SCENE_AT_PHASE(SCENE_ELEC_SPARK, 0.110, 1.0)
|
|
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY( fxElecSparks,
|
|
menuWeapon[ENUM_TO_INT(TOR_CLIP0)].objObject,
|
|
VECTOR_ZERO, VECTOR_ZERO)
|
|
TORTURE_SpikeHeartRate(0.5, 100, 500, 7000)
|
|
iTortureWeaponStage = 0
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
BREAK
|
|
CASE TOR_WATER //Weapon is Waterboarding
|
|
|
|
SWITCH iTortureWeaponStage
|
|
|
|
// WAITING TO FLIP CHAIR
|
|
CASE 0
|
|
IF NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WATER_IDLE])
|
|
IF HAS_ANIM_DICT_LOADED("MISSFBI3_WATERBOARD")
|
|
// Idle with the jerry can
|
|
IF TORTURE_PlaySyncScene(SCENE_WATER_IDLE, TRUE, 0, SLOW_BLEND_IN, SLOW_BLEND_OUT)
|
|
bJustStarting = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF TORTURE_Is_Control_Pressed(INPUT_SCRIPT_RT, TRUE, TRUE)
|
|
IF TORTURE_PlaySyncScene(SCENE_WATER_FLIP)
|
|
CLEAR_HELP()
|
|
iTortureWeaponStage++
|
|
ENDIF
|
|
|
|
// Display help text and play dialogue
|
|
ELSE
|
|
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(hlpChair)
|
|
AND NOT bLookingAtECG
|
|
PRINT_HELP_FOREVER(hlpChair)
|
|
ENDIF
|
|
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
IF GET_GAME_TIMER() - i_time_of_last_convo > I_TIME_BETWEEN_PLEES
|
|
RunConversation("F3_CAN", "", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
// TRANSITION: FLIPPING CHAIR
|
|
CASE 1
|
|
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY() //If skipped chair kick, fade out
|
|
AND NOT bMissionFailed
|
|
SAFE_FADE_OUT(DEFAULT_FADE_TIME_SHORT)
|
|
ENDIF
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WATER_FLIP])
|
|
IF IS_SCREEN_FADED_OUT() //If faded out, move on
|
|
SET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_WATER_FLIP], 1.0)
|
|
SET_ENTITY_VISIBLE(menuWeapon[TOR_RAG].objObject, FALSE)
|
|
bMrKVariations[MR_K_RAG_FACE] = TRUE
|
|
|
|
IF NOT DOES_ENTITY_EXIST(objs[mof_UV_face_object])
|
|
AND HAS_MODEL_LOADED(mnUVFaceProp)
|
|
objs[mof_UV_face_object] = CREATE_OBJECT(mnUVFaceProp, GET_WORLD_POSITION_OF_ENTITY_BONE(pedVictim, GET_PED_BONE_INDEX(pedVictim, BONETAG_HEAD)))
|
|
ATTACH_ENTITY_TO_ENTITY(objs[mof_UV_face_object], pedVictim, GET_PED_BONE_INDEX(pedVictim, BONETAG_HEAD), <<0,0,0>>, <<0,0,0>>)
|
|
SET_ENTITY_VISIBLE(objs[mof_UV_face_object], FALSE)
|
|
ENDIF
|
|
ELSE
|
|
|
|
fTortureTime = GET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_WATER_FLIP])
|
|
|
|
// Place the rag on his face
|
|
IF fTortureTime >= 0.524
|
|
SET_ENTITY_VISIBLE(menuWeapon[TOR_RAG].objObject, FALSE)
|
|
bMrKVariations[MR_K_RAG_FACE] = TRUE
|
|
|
|
IF NOT DOES_ENTITY_EXIST(objs[mof_UV_face_object])
|
|
AND HAS_MODEL_LOADED(mnUVFaceProp)
|
|
objs[mof_UV_face_object] = CREATE_OBJECT(mnUVFaceProp, GET_WORLD_POSITION_OF_ENTITY_BONE(pedVictim, GET_PED_BONE_INDEX(pedVictim, BONETAG_HEAD)))
|
|
ATTACH_ENTITY_TO_ENTITY(objs[mof_UV_face_object], pedVictim, GET_PED_BONE_INDEX(pedVictim, BONETAG_HEAD), <<0,0,0>>, <<0,0,0>>)
|
|
SET_ENTITY_VISIBLE(objs[mof_UV_face_object], FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fTortureTime >= 0.096
|
|
IF fTortureTime <= 0.15
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedVictim, "FBI3_GBAA", "MisterK", SPEECH_PARAMS_FORCE)
|
|
ELSE
|
|
IF bMrKVariations[MR_K_RAG_FACE]
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND IS_PED_IN_CURRENT_CONVERSATION(pedVictim)
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
ENDIF
|
|
IF NOT IS_AMBIENT_SPEECH_PLAYING(pedVictim)
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedVictim, "FBI3_GCAA", "MisterK", SPEECH_PARAMS_FORCE)
|
|
ENDIF
|
|
ELSE
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
IF GET_GAME_TIMER() - i_time_of_last_convo > I_TIME_BETWEEN_PLEES/2
|
|
RunConversation("F3_CAN", "", TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
// finished flip, put in to ready idle
|
|
ELSE
|
|
IF TORTURE_PlaySyncScene(SCENE_WATER_READY, TRUE, 0, INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
IF bFXWaterPour
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfxWaterPour)
|
|
STOP_PARTICLE_FX_LOOPED(ptfxWaterPour)
|
|
ENDIF
|
|
bFXWaterPour = FALSE
|
|
ENDIF
|
|
iWeaponSelDiaTimer = GET_GAME_TIMER() + 2000
|
|
iTortureWeaponStage++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
// WAITING TO POUR
|
|
CASE 2
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WATER_READY])
|
|
|
|
IF NOT bLookingAtECG
|
|
|
|
IF NOT IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
|
|
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(hlpPour)
|
|
PRINT_HELP_FOREVER(hlpPour)
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
// Different help if using keyboard and mouse
|
|
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("HLP_POUR_KM")
|
|
PRINT_HELP_FOREVER("HLP_POUR_KM")
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
GET_CONTROL_VALUE_OF_ANALOGUE_STICKS(iLX, iLY, iRX, iRY)
|
|
|
|
FUDGE_PC_POURING_CONTROL(iLY) // Fudge for PC version so we can use a different control from Left stick for pouring.
|
|
|
|
// Started to pour, transition to pour
|
|
IF iLY < -50
|
|
AND NOT bLookingAtECG
|
|
IF TORTURE_PlaySyncScene(SCENE_WATER_READY_TO_POUR, FALSE, 0, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
clearText(FALSE, FALSE, TRUE)
|
|
iTortureWeaponStage++
|
|
ENDIF
|
|
ELSE
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
AND GET_GAME_TIMER() - i_time_of_last_convo > 8000
|
|
RunConversation("F3_BWAIT")
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(pedVictim)
|
|
AND NOT IS_PED_INJURED(pedVictim)
|
|
IF NOT IS_AMBIENT_SPEECH_PLAYING(pedVictim)
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedVictim, "FBI3_GCAA", "MisterK", SPEECH_PARAMS_FORCE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
|
|
// [TRANSITION]: FROM: READY TO: POUR
|
|
CASE 3
|
|
IF NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WATER_READY_TO_POUR])
|
|
|
|
GET_CONTROL_VALUE_OF_ANALOGUE_STICKS(iLX, iLY, iRX, iRY)
|
|
|
|
FUDGE_PC_POURING_CONTROL(iLY) // Fudge for PC version so we can use a different control from Left stick for pouring.
|
|
|
|
IF TORTURE_PlaySyncScene(SCENE_WATER_POUR, TRUE)
|
|
IF NOT bFXWaterPour
|
|
ptfxWaterPour = START_PARTICLE_FX_LOOPED_ON_ENTITY( fxWaterPour,
|
|
menuWeapon[ENUM_TO_INT(TOR_WATER)].objObject,
|
|
vWaterPourOffset, VECTOR_ZERO)
|
|
bFXWaterPour = TRUE
|
|
ENDIF
|
|
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(FBI3_WATERBOARD)
|
|
|
|
i_MinPourTimer = GET_GAME_TIMER()
|
|
iTortureWeaponStage++
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
// POURING LOOP
|
|
CASE 4
|
|
|
|
IF GET_GAME_TIMER() - i_MinPourTimer > 500
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(strOneShotLoaded)
|
|
PLAY_ONESHOT()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WATER_POUR])
|
|
AND GET_GAME_TIMER() - i_MinPourTimer > 1000
|
|
|
|
GET_CONTROL_VALUE_OF_ANALOGUE_STICKS(iLX, iLY, iRX, iRY)
|
|
|
|
FUDGE_PC_POURING_CONTROL(iLY) // Fudge for PC version so we can use a different control from Left stick for pouring.
|
|
|
|
// Player has finished this torture
|
|
|
|
IF (iLY >= -50 // Player released controls
|
|
AND (fTortureForceApplied > F_WATERBOARD_TIME // and torture time was exceeded....
|
|
OR (fTortureForceApplied > F_WATERBOARD_TIME/2.0 AND fVictimHealth <= 10.0))) // ....or victim was low on health
|
|
OR fVictimHealth <= 0 // OR Victim health deplease
|
|
|
|
IF TORTURE_PlaySyncScene(SCENE_WATER_PRE_OUTRO, FALSE, 0, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
CLEAR_HELP()
|
|
|
|
IF bFXWaterPour
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfxWaterPour)
|
|
STOP_PARTICLE_FX_LOOPED(ptfxWaterPour)
|
|
ENDIF
|
|
bFXWaterPour = FALSE
|
|
ENDIF
|
|
|
|
iTortureWeaponStage = 6
|
|
ENDIF
|
|
|
|
// Player let go early, do not finish the torture yet, transition to the ready loop
|
|
ELIF iLY >= -50
|
|
|
|
IF TORTURE_PlaySyncScene(SCENE_WATER_POUR_TO_READY, FALSE)
|
|
IF bFXWaterPour
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfxWaterPour)
|
|
STOP_PARTICLE_FX_LOOPED(ptfxWaterPour)
|
|
ENDIF
|
|
bFXWaterPour = FALSE
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(objs[mof_UV_face_object])
|
|
SET_ENTITY_VISIBLE(objs[mof_UV_face_object], FALSE)
|
|
ENDIF
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
iTortureWeaponStage = 5
|
|
ENDIF
|
|
|
|
// still trying to pour
|
|
ELIF iLY < -50
|
|
|
|
IF DOES_ENTITY_EXIST(objs[mof_UV_face_object])
|
|
SET_ENTITY_VISIBLE(objs[mof_UV_face_object], TRUE)
|
|
ENDIF
|
|
|
|
fTortureForceApplied += TIMESTEP()
|
|
IF fTortureForceApplied > F_WATERBOARD_TIME
|
|
fVictimHealth -= (F_WATERBOARD_DAMAGE_EXTRA/F_WATERBOARD_TIME) * TIMESTEP()
|
|
ELSE
|
|
fVictimHealth -= (F_WATERBOARD_DAMAGE/F_WATERBOARD_TIME) * TIMESTEP()
|
|
ENDIF
|
|
|
|
IF fTortureForceApplied > F_WATERBOARD_TIME
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
AND GET_GAME_TIMER() - i_time_of_last_convo > 1000
|
|
RunConversation("F3_ENOUGH2")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
CASE 5
|
|
IF NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WATER_POUR_TO_READY])
|
|
|
|
IF TORTURE_PlaySyncScene(SCENE_WATER_READY, TRUE, 0, NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
IF bFXWaterPour
|
|
ptfxWaterPour = START_PARTICLE_FX_LOOPED_ON_ENTITY( fxWaterPour,
|
|
menuWeapon[ENUM_TO_INT(TOR_WATER)].objObject,
|
|
vWaterPourOffset, VECTOR_ZERO)
|
|
bFXWaterPour = FALSE
|
|
ENDIF
|
|
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(FBI3_WATERBOARD)
|
|
iTortureWeaponStage = 2
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
CASE 6
|
|
//IF NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WATER_PRE_OUTRO])
|
|
TORTURE_ANIM_DATA sAnimData
|
|
IF TORTURE_GetTortureSceneAnimData(SCENE_WATER_PRE_OUTRO, sAnimData)
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(TREV_PED_ID(), sAnimData.strAnimDict, sAnimData.strTrevor)
|
|
// Play outro
|
|
IF TORTURE_PlaySyncScene(SCENE_WATER_OUTRO)
|
|
|
|
IF DOES_ENTITY_EXIST(objs[mof_UV_face_object])
|
|
DELETE_OBJECT(objs[mof_UV_face_object])
|
|
ENDIF
|
|
|
|
REMOVE_PARTICLE_FX_IN_RANGE(<<143.1187, -2202.0327, 3.6880>>, 10.0)
|
|
|
|
fTortureForceApplied = 0
|
|
iWeaponSelStage = 0
|
|
|
|
CPRINTLN(DEBUG_MIKE, menuWeapon[TOR_WATER].iTimesSelected)
|
|
|
|
iTortureStage++ //WATER POURED, MOVE ONTO OUTRO SECTION
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
BREAK
|
|
CASE TOR_SYRINGE //Victim dying, syringe is the weapon
|
|
IF NOT bHasBeenSyringed
|
|
IF NOT bHasPlayedPickupAnim
|
|
|
|
IF HAS_ANIM_DICT_LOADED("MISSFBI3_SYRINGE")
|
|
IF TORTURE_PlaySyncScene(SCENE_WEAPON_SELECT_PICKUP_SYRINGE)
|
|
fStartPhase = 0.0
|
|
|
|
LOAD_ONESHOT("FBI3_SYRINGE")
|
|
|
|
START_AUDIO_SCENE("FBI_3_TREVOR_TORTURE_ADRENALINE")
|
|
|
|
SET_PC_CONTROLS( "FBI3 MINIGAME DEFAULT" )
|
|
|
|
bHasPlayedPickupAnim = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
IF NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WEAPON_SELECT_PICKUP_SYRINGE])
|
|
OR GET_SCRIPT_TASK_STATUS(TREV_PED_ID(), SCRIPT_TASK_SYNCHRONIZED_SCENE) != PERFORMING_TASK
|
|
bFlatLine = TRUE
|
|
|
|
IF TORTURE_Is_Control_Pressed(INPUT_SCRIPT_RT, TRUE, TRUE)
|
|
|
|
IF TORTURE_PlaySyncScene(SCENE_SYRINGE_USE)
|
|
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(hlpSyringe)
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
|
|
SETTIMERB(1)
|
|
|
|
fTargetHealth = 5 //Make this non-zero to fix streaming of wrong cut
|
|
|
|
iNumberOfSyringesUsed++ //Increase the amount of syringes
|
|
IF iNumberOfSyringesUsed = 1 //Everytime the victim is syringed, the target's health increase less
|
|
fTargetHealth = 80
|
|
ELIF iNumberOfSyringesUsed = 2
|
|
fTargetHealth = 60
|
|
ELIF iNumberOfSyringesUsed = 3
|
|
fTargetHealth = 40
|
|
ELSE iNumberOfSyringesUsed = 4
|
|
fTargetHealth = 20
|
|
ENDIF
|
|
|
|
menuWeapon[TOR_SYRINGE].iTimesSelected++
|
|
bHasBeenSyringed = TRUE
|
|
iWeaponSelStage = 0
|
|
iTortureStage++
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
CPRINTLN(DEBUG_MIKE, "iTortureStage: ", iTortureStage, " ", iMrKArrestTimer, "***** iMrKArrestTimer", (GET_GAME_TIMER() - iMrKArrestTimer), "elapsed time")
|
|
|
|
IF iMrKArrestTimer != -1
|
|
AND GET_GAME_TIMER() - iMrKArrestTimer >= 15000
|
|
|
|
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(hlpSyringe)
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
|
|
CPRINTLN(DEBUG_MIKE,"***** VICTIM DIDN'T GET SYRINGE IN TIME")
|
|
|
|
iTortureStage = 2
|
|
|
|
//fVictimHealth = -1
|
|
|
|
ELIF NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_SYRINGE_IDLE])
|
|
AND NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_SYRINGE_USE])
|
|
|
|
IF TORTURE_PlaySyncScene(SCENE_SYRINGE_IDLE, TRUE, 0, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_LOOP_WITHIN_SCENE, SYNCED_SCENE_LOOP_WITHIN_SCENE)
|
|
iMrKArrestTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
ELIF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_SYRINGE_IDLE])
|
|
|
|
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(hlpSyringe)
|
|
AND NOT bLookingAtECG
|
|
PRINT_HELP_FOREVER(hlpSyringe)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
// Adjust BPM while picking up the syringe
|
|
ELSE
|
|
IF iWeaponSelStage = 0
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
RunConversation("F3_DIE")
|
|
iWeaponSelStage++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_WEAPON_SELECT_PICKUP_SYRINGE]) >= 0.2
|
|
bFlatLine = TRUE
|
|
bRevived = FALSE
|
|
IF DOES_ENTITY_EXIST(pedVictim)
|
|
AND NOT IS_PED_INJURED(pedVictim)
|
|
IF IS_AMBIENT_SPEECH_PLAYING(pedVictim)
|
|
STOP_CURRENT_PLAYING_AMBIENT_SPEECH(pedVictim)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_ENTITY_EXIST(pedVictim)
|
|
AND NOT IS_PED_INJURED(pedVictim)
|
|
IF NOT IS_AMBIENT_SPEECH_PLAYING(pedVictim)
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedVictim, "about_to_die", "MisterK", SPEECH_PARAMS_FORCE_NORMAL)
|
|
CPRINTLN(DEBUG_MIKE, "Play Mr K about_to_die")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
// Ped health has arrested, rerequest cutscene and stream variations
|
|
IF fVictimHealth <= 0
|
|
AND iTortureStage = 1
|
|
|
|
CPRINTLN(DEBUG_MIKE,"*****HIT ARREST AFTER TORTURE STAGE 0")
|
|
|
|
IF eCurrentMenuWeapon != TOR_WRENCH
|
|
IF eCurrentMenuWeapon = TOR_PLIERS
|
|
TORTURE_Request_Cutscene(TRUE, TOR_PLIERS, iNumberOfTeethPulled+1)
|
|
CPRINTLN(DEBUG_MIKE,"*****LOADED DEATH CUT WITH TOOTH PULL PREDICTED DAMAGE")
|
|
ELSE
|
|
TORTURE_Request_Cutscene(TRUE, eCurrentMenuWeapon)
|
|
CPRINTLN(DEBUG_MIKE,"*****LOADED DEATH CUT PREDICTED DAMAGE (NOT TOOTH PULL OR WRENCH)")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 1 //OUTRO ANIM STAGE
|
|
IF NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WRENCH_MID])
|
|
AND NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WRENCH_LEFT])
|
|
AND NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WRENCH_RIGHT])
|
|
AND NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PLIERS_PULL_OUT])
|
|
AND NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PLIERS_PULL_OUT2])
|
|
AND NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_ELEC_OUTRO])
|
|
AND NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_SYRINGE_USE])
|
|
AND (NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WATER_OUTRO]) OR (fVictimHealth <= 0 AND GET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_WATER_OUTRO]) >= 0.719))
|
|
|
|
TORTURE_ReleaseAllSounds()
|
|
|
|
IF DOES_ENTITY_EXIST(objTooth)
|
|
IF IS_ENTITY_ATTACHED(objTooth)
|
|
DETACH_ENTITY(objTooth)
|
|
ENDIF
|
|
DELETE_OBJECT(objTooth)
|
|
IF bFXBloodThrow
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfxBloodThrow)
|
|
STOP_PARTICLE_FX_LOOPED(ptfxBloodThrow)
|
|
ENDIF
|
|
bFXBloodThrow = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
IF bFXBloodMouth
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfxBloodMouth)
|
|
STOP_PARTICLE_FX_LOOPED(ptfxBloodMouth)
|
|
ENDIF
|
|
bFXBloodMouth = FALSE
|
|
ENDIF
|
|
IF bFXBloodThrow
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfxBloodThrow)
|
|
STOP_PARTICLE_FX_LOOPED(ptfxBloodThrow)
|
|
ENDIF
|
|
bFXBloodThrow = FALSE
|
|
ENDIF
|
|
IF bFXElecSmoulder
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfxElecSmoulder)
|
|
STOP_PARTICLE_FX_LOOPED(ptfxElecSmoulder)
|
|
ENDIF
|
|
bFXElecSmoulder = FALSE
|
|
ENDIF
|
|
IF bFXWaterPour
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfxWaterPour)
|
|
STOP_PARTICLE_FX_LOOPED(ptfxWaterPour)
|
|
ENDIF
|
|
bFXWaterPour = FALSE
|
|
ENDIF
|
|
|
|
TORTURE_ANIM_DATA sAnimData
|
|
IF TORTURE_GetTortureSceneAnimData(SCENE_ELEC_IDLE, sAnimData)
|
|
Unload_Asset_Anim_Dict(sAssetData, sAnimData.strAnimDict)
|
|
ENDIF
|
|
Unload_Asset_Audio_Bank(sAssetData, sbTortureElec)
|
|
IF IS_AUDIO_SCENE_ACTIVE("FBI_3_TREVOR_TORTURE_ELECTRIC")
|
|
STOP_AUDIO_SCENE("FBI_3_TREVOR_TORTURE_ELECTRIC")
|
|
ENDIF
|
|
|
|
IF TORTURE_GetTortureSceneAnimData(SCENE_PLIERS_IDLE, sAnimData)
|
|
Unload_Asset_Anim_Dict(sAssetData, sAnimData.strAnimDict)
|
|
ENDIF
|
|
Unload_Asset_Audio_Bank(sAssetData, sbTortureTeeth)
|
|
Unload_Asset_Audio_Bank(sAssetData, "FBI_03_Torture_Teeth_Pain")
|
|
IF IS_AUDIO_SCENE_ACTIVE("FBI_3_TREVOR_TORTURE_PLIERS")
|
|
STOP_AUDIO_SCENE("FBI_3_TREVOR_TORTURE_PLIERS")
|
|
ENDIF
|
|
|
|
IF TORTURE_GetTortureSceneAnimData(SCENE_WRENCH_IDLE, sAnimData)
|
|
Unload_Asset_Anim_Dict(sAssetData, sAnimData.strAnimDict)
|
|
ENDIF
|
|
Unload_Asset_Audio_Bank(sAssetData, sbTortureWrench)
|
|
IF IS_AUDIO_SCENE_ACTIVE("FBI_3_TREVOR_TORTURE_WRENCH")
|
|
STOP_AUDIO_SCENE("FBI_3_TREVOR_TORTURE_WRENCH")
|
|
ENDIF
|
|
|
|
IF TORTURE_GetTortureSceneAnimData(SCENE_WATER_IDLE, sAnimData)
|
|
Unload_Asset_Anim_Dict(sAssetData, sAnimData.strAnimDict)
|
|
ENDIF
|
|
Unload_Asset_Audio_Bank(sAssetData, sbTortureWater)
|
|
IF IS_AUDIO_SCENE_ACTIVE("FBI_3_TREVOR_TORTURE_WATER")
|
|
STOP_AUDIO_SCENE("FBI_3_TREVOR_TORTURE_WATER")
|
|
ENDIF
|
|
|
|
|
|
SET_ENTITY_VISIBLE(propPhoneSteve, TRUE)
|
|
|
|
// If ped has arrested
|
|
IF fVictimHealth <= 0
|
|
|
|
TORTURE_ResetAllProps(FALSE)
|
|
TORTURE_ReleaseAllSounds()
|
|
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(FBI3_HEART_STOPPED)
|
|
|
|
// Mr K dies
|
|
IF iNumberOfSyringesUsed >= I_MAX_SYRINGE_USES
|
|
|
|
CPRINTLN(DEBUG_MIKE,"***** ALL SYRINGES USED, GO STRAIGHT TO DEATH CUT")
|
|
iTortureStage = 2
|
|
|
|
// Allows to revive wtih adrenaline
|
|
ELSE
|
|
CPRINTLN(DEBUG_MIKE,"***** PLAYER HAS CHANCE TO USE SYRING")
|
|
|
|
iCurrentMenuWeapon = ENUM_TO_INT(TOR_SYRINGE)
|
|
iTortureStage = 0
|
|
fTortureForceApplied = 0
|
|
iWeaponSelStage = 0
|
|
bHasBeenSyringed = FALSE
|
|
bHasPlayedPickupAnim = FALSE
|
|
ENDIF
|
|
|
|
// Ped not arrested
|
|
ELSE
|
|
|
|
iTortureStage = 0
|
|
|
|
IF bTortureMusicPlaying
|
|
TRIGGER_MUSIC_EVENT("FBI3_TORTURE_DONE")
|
|
bTortureMusicPlaying = FALSE
|
|
ENDIF
|
|
|
|
IF TORTURE_GetTortureSceneAnimData(SCENE_SYRINGE_IDLE, sAnimData)
|
|
Unload_Asset_Anim_Dict(sAssetData, sAnimData.strAnimDict)
|
|
ENDIF
|
|
IF IS_AUDIO_SCENE_ACTIVE("FBI_3_TREVOR_TORTURE_ADRENALINE")
|
|
STOP_AUDIO_SCENE("FBI_3_TREVOR_TORTURE_ADRENALINE")
|
|
ENDIF
|
|
|
|
clearText()
|
|
|
|
CPRINTLN(DEBUG_MIKE,"***** VICTIM DIDN'T ARREST RETURN TRUE")
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
// Not finished playing outro
|
|
ELSE
|
|
|
|
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
|
|
AND NOT bMissionFailed
|
|
SAFE_FADE_OUT(DEFAULT_FADE_TIME_SHORT)
|
|
ENDIF
|
|
|
|
//>>>>>>>>> TOOTH PULL <<<<<<<<<<<<<<<<<
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PLIERS_PULL_OUT])
|
|
IF IS_SCREEN_FADED_OUT()
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
SET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_PLIERS_PULL_OUT], 1.0)
|
|
|
|
fVictimHealth -= F_TOOTH_PULL_DAMAGE_FINAL
|
|
|
|
// Stop torture audio if ped is not going to need the syringe
|
|
IF fVictimHealth > 0.0
|
|
IF bTortureMusicPlaying
|
|
TRIGGER_MUSIC_EVENT("FBI3_TORTURE_DONE")
|
|
bTortureMusicPlaying = FALSE
|
|
ENDIF
|
|
ELSE
|
|
// RE-REQUEST ped is going to arrest, need death cutscene ready
|
|
TORTURE_Request_Cutscene(TRUE, TOR_PLIERS, iNumberOfTeethPulled)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(pedVictim)
|
|
AND NOT IS_PED_INJURED(pedVictim)
|
|
IF IS_SCRIPTED_SPEECH_PLAYING(pedVictim)
|
|
CPRINTLN(DEBUG_MIKE, "Mr K scripted conversation is already going")
|
|
IF IS_AMBIENT_SPEECH_PLAYING(pedVictim)
|
|
STOP_CURRENT_PLAYING_AMBIENT_SPEECH(pedVictim)
|
|
CPRINTLN(DEBUG_MIKE, "Mr K is playing ambient speech, killing this")
|
|
ENDIF
|
|
ELSE
|
|
CPRINTLN(DEBUG_MIKE, "Mr K is not playing scripted conversation")
|
|
IF NOT IS_AMBIENT_SPEECH_PLAYING(pedVictim)
|
|
//SET_AUDIO_FLAG("ScriptedConvListenerMaySpeak", TRUE)
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedVictim, "Pliers_Panting", "MisterK", SPEECH_PARAMS_FORCE)
|
|
CPRINTLN(DEBUG_MIKE, "Play Mr K pliers_panting")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(objTooth)
|
|
|
|
IF IS_SCENE_AT_PHASE(SCENE_PLIERS_PULL_OUT, 0.071, 1.0)
|
|
|
|
objTooth = CREATE_OBJECT(mnTooth, GET_ENTITY_COORDS(TREV_PED_ID()))
|
|
|
|
START_PARTICLE_FX_NON_LOOPED_ON_PED_BONE( fxBloodExtract, pedVictim, <<0,0.1,0>>, VECTOR_ZERO,
|
|
BONETAG_HEAD)
|
|
IF NOT bFXBloodThrow
|
|
ptfxBloodThrow = START_PARTICLE_FX_LOOPED_ON_ENTITY(fxBloodThrow, objTooth,
|
|
VECTOR_ZERO, VECTOR_ZERO)
|
|
bFXBloodThrow = TRUE
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_ATTACHED(objTooth)
|
|
DETACH_ENTITY(objTooth)
|
|
ENDIF
|
|
ATTACH_ENTITY_TO_ENTITY(objTooth, TREV_PED_ID(),
|
|
GET_PED_BONE_INDEX(TREV_PED_ID(), BONETAG_PH_L_HAND),
|
|
VECTOR_ZERO, VECTOR_ZERO)
|
|
|
|
// Apply damage
|
|
fVictimHealth -= F_TOOTH_PULL_DAMAGE_FINAL
|
|
|
|
// Stop torture audio if ped is not going to need the syringe
|
|
IF fVictimHealth > 0.0
|
|
IF bTortureMusicPlaying
|
|
TRIGGER_MUSIC_EVENT("FBI3_TORTURE_DONE")
|
|
bTortureMusicPlaying = FALSE
|
|
ENDIF
|
|
ELSE
|
|
// RE-REQUEST ped is going to arrest, need death cutscene ready
|
|
TORTURE_Request_Cutscene(TRUE, TOR_PLIERS, iNumberOfTeethPulled)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
//>>>>>>>>> TOOTH PULL ALTERNATIVE (B) <<<<<<<<<<<<<<<<<
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PLIERS_PULL_OUT2])
|
|
IF IS_SCREEN_FADED_OUT()
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
SET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_PLIERS_PULL_OUT2], 1.0)
|
|
|
|
// Apply damage
|
|
fVictimHealth -= F_TOOTH_PULL_DAMAGE_FINAL
|
|
|
|
// Stop torture audio if ped is not going to need the syringe
|
|
IF fVictimHealth > 0.0
|
|
IF bTortureMusicPlaying
|
|
TRIGGER_MUSIC_EVENT("FBI3_TORTURE_DONE")
|
|
bTortureMusicPlaying = FALSE
|
|
ENDIF
|
|
ELSE
|
|
// RE-REQUEST ped is going to arrest, need death cutscene ready
|
|
TORTURE_Request_Cutscene(TRUE, TOR_PLIERS, iNumberOfTeethPulled)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(pedVictim)
|
|
AND NOT IS_PED_INJURED(pedVictim)
|
|
IF IS_SCRIPTED_SPEECH_PLAYING(pedVictim)
|
|
CPRINTLN(DEBUG_MIKE, "Mr K scripted conversation is already going")
|
|
IF IS_AMBIENT_SPEECH_PLAYING(pedVictim)
|
|
STOP_CURRENT_PLAYING_AMBIENT_SPEECH(pedVictim)
|
|
CPRINTLN(DEBUG_MIKE, "Mr K is playing ambient speech, killing this")
|
|
ENDIF
|
|
ELSE
|
|
CPRINTLN(DEBUG_MIKE, "Mr K is not playing scripted conversation")
|
|
IF NOT IS_AMBIENT_SPEECH_PLAYING(pedVictim)
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedVictim, "Pliers_Panting", "MisterK", SPEECH_PARAMS_FORCE)
|
|
CPRINTLN(DEBUG_MIKE, "Play Mr K pliers_panting")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(objTooth)
|
|
|
|
IF IS_SCENE_AT_PHASE(SCENE_PLIERS_PULL_OUT2, 0.071, 1.0)
|
|
|
|
objTooth = CREATE_OBJECT(mnTooth, GET_ENTITY_COORDS(TREV_PED_ID()))
|
|
|
|
START_PARTICLE_FX_NON_LOOPED_ON_PED_BONE( fxBloodExtract, pedVictim, <<0,0.1,0>>, VECTOR_ZERO,
|
|
BONETAG_HEAD)
|
|
IF NOT bFXBloodThrow
|
|
ptfxBloodThrow = START_PARTICLE_FX_LOOPED_ON_ENTITY(fxBloodThrow, objTooth,
|
|
VECTOR_ZERO, VECTOR_ZERO)
|
|
bFXBloodThrow = TRUE
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_ATTACHED(objTooth)
|
|
DETACH_ENTITY(objTooth)
|
|
ENDIF
|
|
|
|
ATTACH_ENTITY_TO_ENTITY(objTooth, TREV_PED_ID(),
|
|
GET_PED_BONE_INDEX(TREV_PED_ID(), BONETAG_PH_L_HAND),
|
|
VECTOR_ZERO, VECTOR_ZERO)
|
|
|
|
// Apply damage
|
|
fVictimHealth -= F_TOOTH_PULL_DAMAGE_FINAL
|
|
|
|
// Stop torture audio if ped is not going to need the syringe
|
|
IF fVictimHealth > 0.0
|
|
IF bTortureMusicPlaying
|
|
TRIGGER_MUSIC_EVENT("FBI3_TORTURE_DONE")
|
|
bTortureMusicPlaying = FALSE
|
|
ENDIF
|
|
ELSE
|
|
// RE-REQUEST ped is going to arrest, need death cutscene ready
|
|
TORTURE_Request_Cutscene(TRUE, TOR_PLIERS, iNumberOfTeethPulled)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//>>>>>>>>>>>>>>>>
|
|
// WRENCH LEFT
|
|
//>>>>>>>>>>>>>>>>
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WRENCH_LEFT])
|
|
|
|
// If skipped
|
|
IF IS_SCREEN_FADED_OUT()
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
SET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_WRENCH_LEFT], 1.0)
|
|
IF fTortureForceApplied != 1.0
|
|
fTortureForceApplied = 1.0
|
|
fVictimHealth -= F_WRENCH_DAMAGE
|
|
ENDIF
|
|
|
|
IF fVictimHealth <= 0.0
|
|
TORTURE_Request_Cutscene(TRUE, TOR_WRENCH, 1)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(pedVictim)
|
|
AND NOT IS_PED_INJURED(pedVictim)
|
|
IF IS_SCENE_AT_PHASE(SCENE_WRENCH_LEFT, 0.395, 0.435)
|
|
IF NOT IS_AMBIENT_SPEECH_PLAYING(pedVictim)
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedVictim, "FBI3_BSAA", "MisterK", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
// IF iNumberOfTeethPulled = 0
|
|
// PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedVictim, "Wrench_Pain", "MisterK", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
// ELSE
|
|
// PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedVictim, "Wrench_Pain_Toothless", "MisterK", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
// ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_SCENE_AT_PHASE(SCENE_WRENCH_LEFT, 0.395, 1.0)
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(strOneShotLoaded)
|
|
PLAY_ONESHOT()
|
|
ENDIF
|
|
|
|
IF fTortureForceApplied != 1.0
|
|
|
|
fTortureForceApplied = 1.0
|
|
fVictimHealth -= F_WRENCH_DAMAGE
|
|
|
|
IF fVictimHealth <= 0.0
|
|
TORTURE_Request_Cutscene(TRUE, TOR_WRENCH, 1)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
//>>>>>>>>>>>>>>>>
|
|
// WRENCH MID
|
|
//>>>>>>>>>>>>>>>>
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WRENCH_MID])
|
|
|
|
// IF skipped
|
|
IF IS_SCREEN_FADED_OUT()
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
SET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_WRENCH_MID], 1.0)
|
|
|
|
IF fTortureForceApplied != 1.0
|
|
fTortureForceApplied = 1.0
|
|
fVictimHealth -= F_WRENCH_DAMAGE
|
|
ENDIF
|
|
|
|
IF fVictimHealth <= 0.0
|
|
TORTURE_Request_Cutscene(TRUE, TOR_WRENCH, 2)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(pedVictim)
|
|
AND NOT IS_PED_INJURED(pedVictim)
|
|
IF IS_SCENE_AT_PHASE(SCENE_WRENCH_MID, 0.186, 0.217)
|
|
IF NOT IS_AMBIENT_SPEECH_PLAYING(pedVictim)
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedVictim, "FBI3_BSAA", "MisterK", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
// IF iNumberOfTeethPulled = 0
|
|
// PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedVictim, "Wrench_Pain", "MisterK", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
// ELSE
|
|
// PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedVictim, "Wrench_Pain_Toothless", "MisterK", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
// ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_SCENE_AT_PHASE(SCENE_WRENCH_MID, 0.180, 1.0)
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(strOneShotLoaded)
|
|
PLAY_ONESHOT()
|
|
ENDIF
|
|
|
|
IF fTortureForceApplied != 1.0
|
|
|
|
fTortureForceApplied = 1.0
|
|
fVictimHealth -= F_WRENCH_DAMAGE
|
|
|
|
IF fVictimHealth <= 0.0
|
|
TORTURE_Request_Cutscene(TRUE, TOR_WRENCH, 2)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
//>>>>>>>>>>>>>>>>
|
|
// WRENCH RIGHT
|
|
//>>>>>>>>>>>>>>>>
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WRENCH_RIGHT])
|
|
|
|
// If skipped
|
|
IF IS_SCREEN_FADED_OUT()
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
SET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_WRENCH_RIGHT], 1.0)
|
|
|
|
IF fTortureForceApplied != 1.0
|
|
fTortureForceApplied = 1.0
|
|
fVictimHealth -= F_WRENCH_DAMAGE
|
|
ENDIF
|
|
|
|
IF fVictimHealth <= 0.0
|
|
TORTURE_Request_Cutscene(TRUE, TOR_WRENCH, 0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(pedVictim)
|
|
AND NOT IS_PED_INJURED(pedVictim)
|
|
IF IS_SCENE_AT_PHASE(SCENE_WRENCH_RIGHT, 0.245, 0.268)
|
|
IF NOT IS_AMBIENT_SPEECH_PLAYING(pedVictim)
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedVictim, "FBI3_BSAA", "MisterK", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
// IF iNumberOfTeethPulled = 0
|
|
// PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedVictim, "Wrench_Pain", "MisterK", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
// ELSE
|
|
// PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedVictim, "Wrench_Pain_Toothless", "MisterK", SPEECH_PARAMS_FORCE_SHOUTED_CLEAR)
|
|
// ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_SCENE_AT_PHASE(SCENE_WRENCH_RIGHT, 0.245, 1.0)
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(strOneShotLoaded)
|
|
PLAY_ONESHOT()
|
|
ENDIF
|
|
|
|
IF fTortureForceApplied != 1.0
|
|
|
|
fTortureForceApplied += 1.0
|
|
fVictimHealth -= F_WRENCH_DAMAGE
|
|
|
|
IF fVictimHealth <= 0.0
|
|
TORTURE_Request_Cutscene(TRUE, TOR_WRENCH, 0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
/// <<<<<<<<< ELECTROCUTE >>>>>>>>>>>>
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_ELEC_OUTRO])
|
|
IF IS_SCREEN_FADED_OUT()
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
SET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_ELEC_OUTRO], 1.0)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(pedVictim)
|
|
AND NOT IS_PED_INJURED(pedVictim)
|
|
IF NOT IS_AMBIENT_SPEECH_PLAYING(pedVictim)
|
|
|
|
IF IS_SCENE_AT_PHASE(SCENE_WATER_OUTRO, 0.0, 0.198)
|
|
|
|
IF NOT IS_AMBIENT_SPEECH_PLAYING(pedVictim)
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedVictim, "Electrocution", "MisterK", SPEECH_PARAMS_FORCE)
|
|
CPRINTLN(DEBUG_MIKE, "Play Mr K Electrocution")
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF NOT IS_AMBIENT_SPEECH_PLAYING(pedVictim)
|
|
IF fVictimHealth <= 0.0
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedVictim, "about_to_die", "MisterK", SPEECH_PARAMS_FORCE)
|
|
CPRINTLN(DEBUG_MIKE, "Play Mr K about_to_die")
|
|
ELSE
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedVictim, "Pliers_Panting", "MisterK", SPEECH_PARAMS_FORCE)
|
|
CPRINTLN(DEBUG_MIKE, "Play Mr K Pliers_Panting")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF fVictimHealth > 0.0
|
|
IF bTortureMusicPlaying
|
|
TRIGGER_MUSIC_EVENT("FBI3_TORTURE_DONE")
|
|
bTortureMusicPlaying = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
|
|
/// <<<<<<<<< WATER >>>>>>>>>>>>
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WATER_OUTRO])
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
SET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_WATER_OUTRO], 1.0)
|
|
bMrKVariations[MR_K_RAG_FACE] = FALSE
|
|
SET_ENTITY_VISIBLE(menuWeapon[TOR_RAG].objObject, TRUE)
|
|
SET_ENTITY_VISIBLE(propPhoneSteve, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_VISIBLE(propPhoneSteve)
|
|
IF IS_SCENE_AT_PHASE(SCENE_WATER_OUTRO, 0.325, 1.0)
|
|
SET_ENTITY_VISIBLE(propPhoneSteve, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH iWeaponSelStage
|
|
CASE 0
|
|
IF DOES_ENTITY_EXIST(pedVictim)
|
|
AND NOT IS_PED_INJURED(pedVictim)
|
|
IF NOT IS_AMBIENT_SPEECH_PLAYING(pedVictim)
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedVictim, "FBI3_GCAA", "MisterK", SPEECH_PARAMS_FORCE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
RunConversation("F3_GETUP")
|
|
iWeaponSelStage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
IF IS_SCENE_AT_PHASE(SCENE_WATER_OUTRO, 0.179, 1.0)
|
|
bMrKVariations[MR_K_RAG_FACE] = FALSE
|
|
SET_ENTITY_VISIBLE(menuWeapon[TOR_RAG].objObject, TRUE)
|
|
IF DOES_ENTITY_EXIST(pedVictim)
|
|
AND NOT IS_PED_INJURED(pedVictim)
|
|
IF IS_AMBIENT_SPEECH_PLAYING(pedVictim)
|
|
STOP_CURRENT_PLAYING_AMBIENT_SPEECH(pedVictim)
|
|
ENDIF
|
|
ENDIF
|
|
iWeaponSelStage++
|
|
ELSE
|
|
IF DOES_ENTITY_EXIST(pedVictim)
|
|
AND NOT IS_PED_INJURED(pedVictim)
|
|
IF NOT IS_AMBIENT_SPEECH_PLAYING(pedVictim)
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedVictim, "FBI3_GCAA", "MisterK", SPEECH_PARAMS_FORCE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 2
|
|
IF fVictimHealth > 0
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
RunConversation("F3_TOWEL2", "", TRUE)
|
|
iWeaponSelStage++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 3
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
SWITCH eMissionStage
|
|
CASE ST_3_TORTURE_FOR_FIRST RunConversation("F3_BHIT1", "", TRUE) BREAK
|
|
CASE ST_5_TORTURE_FOR_SECOND RunConversation("F3_BHIT2", "", TRUE) BREAK
|
|
CASE ST_7_TORTURE_FOR_THIRD RunConversation("F3_BHIT3", "", TRUE) BREAK
|
|
CASE ST_9_TORTURE_FINAL RunConversation("F3_BHIT4", "", TRUE) BREAK
|
|
ENDSWITCH
|
|
iWeaponSelStage++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF fVictimHealth > 0.0
|
|
IF bTortureMusicPlaying
|
|
TRIGGER_MUSIC_EVENT("FBI3_TORTURE_DONE")
|
|
bTortureMusicPlaying = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
/// <<<<<<<< SYRINGE >>>>>>>>
|
|
/// ----------------------------------------------------------------------
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_SYRINGE_USE])
|
|
IF IS_SCREEN_FADED_OUT()
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
SET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_SYRINGE_USE], 1.0)
|
|
bFlatLine = FALSE
|
|
bJustStarting = FALSE
|
|
ELSE
|
|
SWITCH iWeaponSelStage
|
|
CASE 0
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
// Last shot
|
|
IF I_MAX_SYRINGE_USES - iNumberOfSyringesUsed = 0
|
|
runConversation("F3_OUT")
|
|
ELSE
|
|
runConversation("F3_DIE2")
|
|
ENDIF
|
|
iWeaponSelStage++
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
IF bFlatLine
|
|
IF fVictimHealth <= 0.0
|
|
CPRINTLN(DEBUG_MIKE,"***** SYRINGE USED, REQUEST CUTSCENE AGAIN WITHOUT PREDICTED DAMAGE (DAMAGE IS ALREADY DONE AT THIS POINT)")
|
|
fVictimHealth = 0.0000001
|
|
TORTURE_Request_Cutscene(FALSE)
|
|
iMrKArrestTimer = -1
|
|
ENDIF
|
|
|
|
IF IS_SCENE_AT_PHASE(SCENE_SYRINGE_USE, 0.045, 1.0)
|
|
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(strOneShotLoaded)
|
|
PLAY_ONESHOT()
|
|
ENDIF
|
|
|
|
IF bTortureMusicPlaying
|
|
TRIGGER_MUSIC_EVENT("FBI3_TORTURE_DONE")
|
|
bTortureMusicPlaying = FALSE
|
|
ENDIF
|
|
|
|
bFlatLine = FALSE
|
|
bJustStarting = FALSE
|
|
ENDIF
|
|
ELSE
|
|
IF bJustStarting = FALSE
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_SYRINGE_USE]) >= 0.689
|
|
|
|
fVictimHealth = fTargetHealth
|
|
bJustStarting = TRUE
|
|
iCurrentMenuWeapon = ENUM_TO_INT(TOR_WRENCH)
|
|
//INFORM_STAT_FBI_THREE_CARDIAC_ARREST()
|
|
ELSE
|
|
//Slide increase mr k health
|
|
fPercentHealComplete = CLAMP(GET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_SYRINGE_USE])/(0.689 - 0.045), 0.0, 1.0)
|
|
fVictimHealth = LERP_FLOAT(0, fTargetHealth, fPercentHealComplete)
|
|
|
|
IF NOT bRevived
|
|
AND IS_SCENE_AT_PHASE(SCENE_SYRINGE_USE, 0.176, 1.0)
|
|
AND IS_SAFE_TO_START_CONVERSATION()
|
|
runConversation("F3_WAKE", "", TRUE)
|
|
bRevived = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
/// Handle ped dead cutscene
|
|
IF iTortureStage = 2
|
|
IF HAS_CUTSCENE_LOADED()
|
|
|
|
CPRINTLN(DEBUG_MIKE,"***** DEATH SCENE STARTED")
|
|
|
|
TORTURE_DetachAllProps()
|
|
REGISTER_ENTITY_FOR_CUTSCENE(pedVictim, strMrKCSHandle, CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(null, strMrKCSHandle_DONT_ANIMATE, CU_DONT_ANIMATE_ENTITY, CS_MRK)
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(pedSteve, csSteve, CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
TORTURE_RegisterAllPropsForCutscene(FALSE)
|
|
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
SET_CUTSCENE_CAN_BE_SKIPPED(FALSE)
|
|
START_CUTSCENE()
|
|
|
|
iTortureStage++
|
|
ENDIF
|
|
|
|
ELIF iTortureStage = 3
|
|
IF IS_CUTSCENE_PLAYING()
|
|
SET_CUTSCENE_CAN_BE_SKIPPED(FALSE)
|
|
|
|
IF GET_CUTSCENE_TIME() >= 38000 - 4500
|
|
OR IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
|
|
|
|
CPRINTLN(DEBUG_MIKE,"*****DEATH SCENE FAIL START")
|
|
|
|
eMissionFail = FAIL_VICTIM_DEAD
|
|
bMissionFailed = TRUE
|
|
iFailTimer = GET_CUTSCENE_TIME()
|
|
iTortureStage++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(pedVictim)
|
|
AND NOT IS_PED_INJURED(pedVictim)
|
|
IF IS_AMBIENT_SPEECH_PLAYING(pedVictim)
|
|
SET_PED_CAN_PLAY_VISEME_ANIMS(pedVictim, FALSE, PVF_ALLOW_VISEME_ANIMS_AUDIO)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
#ENDIF
|
|
|
|
FUNC BOOL TORTURE_ManageWeaponSelection()
|
|
IF bMadeSelection
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
|
|
INT iRightX, iRightY, iLeftX, iLeftY
|
|
|
|
VECTOR vObject
|
|
FLOAT fObjectZ
|
|
FLOAT fHoverHeight
|
|
FLOAT fTempPhaseHolder
|
|
BOOL bMenuMovedThisFrame = FALSE
|
|
|
|
#ENDIF
|
|
|
|
IF NOT IS_CHEAT_DISABLED(CHEAT_TYPE_ALL)
|
|
DISABLE_CHEAT(CHEAT_TYPE_ALL, TRUE)
|
|
ENDIF
|
|
|
|
// manage the camera over trevor at the trolley weapon selection
|
|
IF iSelectWeaponStage < 2
|
|
IF IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
ENDIF
|
|
|
|
IF iSelectWeaponStage = 0
|
|
DESTROY_CAM(camGeneralInit)
|
|
DESTROY_CAM(camGeneralDest)
|
|
ENDIF
|
|
|
|
IF sSwayTorture.bInitialised
|
|
doSwayCam(sSwayTorture)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
SWITCH iSelectWeaponStage
|
|
CASE 0
|
|
IF NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WEAPON_SELECT_IDLE])
|
|
TORTURE_PlaySyncScene(SCENE_WEAPON_SELECT_IDLE, TRUE)
|
|
ENDIF
|
|
|
|
TORTURE_InitWeapSelectionCam()
|
|
doSwayCam(sSwayTorture)
|
|
|
|
INT iResult, i
|
|
iResult = -1
|
|
|
|
FOR i = 0 TO 3
|
|
TORTURE_WEAPONS eWeap
|
|
SWITCH i
|
|
CASE 0 eWeap = TOR_PLIERS BREAK
|
|
CASE 1 eWeap = TOR_CLIP0 BREAK
|
|
CASE 2 eWeap = TOR_WRENCH BREAK
|
|
CASE 3 eWeap = TOR_WATER BREAK
|
|
ENDSWITCH
|
|
|
|
IF iResult = -1
|
|
OR (iResult >= 0 AND menuWeapon[eWeap].iTimesSelected < menuWeapon[iResult].iTimesSelected)
|
|
iResult = enum_to_int(eWeap)
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
IF iResult != -1
|
|
iCurrentMenuWeapon = iResult
|
|
ENDIF
|
|
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
|
|
IF iCurrentMenuWeapon = ENUM_TO_INT(TOR_WRENCH)
|
|
fHoverHeight = 0.06
|
|
ELIF iCurrentMenuWeapon = ENUM_TO_INT(TOR_PLIERS)
|
|
fHoverHeight = 0.06
|
|
ELIF iCurrentMenuWeapon = ENUM_TO_INT(TOR_CLIP0)
|
|
fHoverHeight = 0.06
|
|
ELIF iCurrentMenuWeapon = ENUM_TO_INT(TOR_CLIP1)
|
|
fHoverHeight = 0.06
|
|
ELIF iCurrentMenuWeapon = ENUM_TO_INT(TOR_WATER)
|
|
fHoverHeight = 0.04
|
|
ELSE
|
|
fHoverHeight = 0.02
|
|
ENDIF
|
|
|
|
IF bInitialWeaponHighlighted
|
|
SET_ENTITY_COORDS_NO_OFFSET(menuWeapon[iCurrentMenuWeapon].objObject, menuWeapon[iCurrentMenuWeapon].vDefaultCoords+<<0,0,fHoverHeight>>)
|
|
menuWeapon[iCurrentMenuWeapon].bIsHighlighted = TRUE
|
|
ENDIF
|
|
|
|
iWeaponSelDiaTimer = GET_GAME_TIMER()
|
|
iWeaponSelDiaDelay = 5000
|
|
|
|
#ENDIF
|
|
|
|
SAFE_FADE_IN(DEFAULT_FADE_TIME_SHORT)
|
|
|
|
SET_PC_CONTROLS( "FBI3 MINIGAME SELECT")
|
|
|
|
iWeaponSelStage = 0
|
|
iSelectWeaponStage++
|
|
BREAK
|
|
CASE 1
|
|
//IF NOT IS_JAPANESE_VERSION()
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
|
|
// Manage the look at the ecg
|
|
TORTURE_UpdateLookAtECG()
|
|
|
|
|
|
IF NOT bLookingAtECG
|
|
IF IS_PC_VERSION()
|
|
AND IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
|
|
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("hlp_MENU2")
|
|
PRINT_HELP_FOREVER("hlp_MENU2")
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(hlpMenu)
|
|
PRINT_HELP_FOREVER(hlpMenu)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ALLOW_ALTERNATIVE_SCRIPT_CONTROLS_LAYOUT(FRONTEND_CONTROL)
|
|
GET_CONTROL_VALUE_OF_ANALOGUE_STICKS(iLeftX, iLeftY, iRightX, iRightY)
|
|
|
|
IF ( ((iLeftX > 50 OR iLeftY > 50) AND NOT bLookingAtECG)
|
|
OR TORTURE_Is_Control_Pressed(INPUT_SCRIPT_PAD_RIGHT, TRUE, TRUE)
|
|
OR TORTURE_Is_Control_Pressed(INPUT_SCRIPT_PAD_DOWN, TRUE, TRUE))
|
|
AND NOT bMenuRightPressed
|
|
bMenuRightPressed = TRUE
|
|
bMenuMovedThisFrame = TRUE
|
|
|
|
IF bInitialWeaponHighlighted
|
|
iCurrentMenuWeapon++
|
|
IF iCurrentMenuWeapon >= ENUM_TO_INT(TOR_SYRINGE)
|
|
iCurrentMenuWeapon = 0
|
|
ENDIF
|
|
|
|
WHILE NOT menuWeapon[iCurrentMenuWeapon].bSelectable
|
|
iCurrentMenuWeapon++
|
|
IF iCurrentMenuWeapon >= ENUM_TO_INT(TOR_SYRINGE)
|
|
iCurrentMenuWeapon = 0
|
|
ENDIF
|
|
ENDWHILE
|
|
ENDIF
|
|
ELSE
|
|
IF iLeftX <= 50
|
|
AND iLeftY <= 50
|
|
bMenuRightPressed = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
IF ( ((iLeftX < -50 OR iLeftY < -50) AND NOT bLookingAtECG)
|
|
OR TORTURE_Is_Control_Pressed(INPUT_SCRIPT_PAD_LEFT, TRUE, TRUE)
|
|
OR TORTURE_Is_Control_Pressed(INPUT_SCRIPT_PAD_UP, TRUE, TRUE))
|
|
AND NOT bMenuLeftPressed
|
|
bMenuLeftPressed = TRUE
|
|
bMenuMovedThisFrame = TRUE
|
|
|
|
IF bInitialWeaponHighlighted
|
|
iCurrentMenuWeapon--
|
|
IF iCurrentMenuWeapon < 0
|
|
iCurrentMenuWeapon = ENUM_TO_INT(TOR_SYRINGE)-1
|
|
ENDIF
|
|
|
|
WHILE NOT menuWeapon[iCurrentMenuWeapon].bSelectable
|
|
iCurrentMenuWeapon--
|
|
IF iCurrentMenuWeapon < 0
|
|
iCurrentMenuWeapon = ENUM_TO_INT(TOR_SYRINGE)-1
|
|
ENDIF
|
|
ENDWHILE
|
|
ENDIF
|
|
ELSE
|
|
IF iLeftX >= -50
|
|
AND iLeftY >= -50
|
|
bMenuLeftPressed = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bMenuMovedThisFrame
|
|
SWITCH INT_TO_ENUM(TORTURE_WEAPONS, iCurrentMenuWeapon)
|
|
CASE TOR_WRENCH
|
|
PlaySoundFromEntity(SND_MENU_HIGHLIGHT_WRENCH, soundMenuHighlightWrench,
|
|
menuWeapon[iCurrentMenuWeapon].objObject, FALSE)
|
|
BREAK
|
|
CASE TOR_PLIERS
|
|
PlaySoundFromEntity(SND_MENU_HIGHLIGHT_PLIERS, soundMenuHighlightPliers,
|
|
menuWeapon[iCurrentMenuWeapon].objObject, FALSE)
|
|
BREAK
|
|
CASE TOR_CLIP0
|
|
PlaySoundFromEntity(SND_MENU_HIGHLIGHT_ELEC, soundMenuHighlightElec,
|
|
menuWeapon[iCurrentMenuWeapon].objObject, FALSE)
|
|
BREAK
|
|
CASE TOR_WATER
|
|
PlaySoundFromEntity(SND_MENU_HIGHLIGHT_WATER, soundMenuHighlightWater,
|
|
menuWeapon[iCurrentMenuWeapon].objObject, FALSE)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
bInitialWeaponHighlighted = TRUE
|
|
ENDIF
|
|
|
|
INT iCounter
|
|
FOR iCounter = 0 TO ENUM_TO_INT(NO_OF_TORTURE_WEAPONS)-1
|
|
menuWeapon[iCounter].bIsHighlighted = FALSE
|
|
ENDFOR
|
|
|
|
FOR iCounter = 0 TO ENUM_TO_INT(NO_OF_TORTURE_WEAPONS)-1
|
|
IF bInitialWeaponHighlighted
|
|
IF iCounter = iCurrentMenuWeapon
|
|
menuWeapon[iCounter].bIsHighlighted = TRUE
|
|
IF iCounter = ENUM_TO_INT(TOR_CLIP0)
|
|
menuWeapon[ENUM_TO_INT(TOR_CLIP1)].bIsHighlighted = TRUE
|
|
ELIF iCounter = ENUM_TO_INT(TOR_WATER)
|
|
menuWeapon[ENUM_TO_INT(TOR_RAG)].bIsHighlighted = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
FOR iCounter = 0 TO ENUM_TO_INT(NO_OF_TORTURE_WEAPONS)-1
|
|
IF menuWeapon[iCounter].bIsHighlighted
|
|
IF iCounter = ENUM_TO_INT(TOR_WRENCH)
|
|
fHoverHeight = 0.06
|
|
ELIF iCounter = ENUM_TO_INT(TOR_PLIERS)
|
|
fHoverHeight = 0.06
|
|
ELIF iCounter = ENUM_TO_INT(TOR_CLIP0)
|
|
fHoverHeight = 0.08
|
|
ELIF iCounter = ENUM_TO_INT(TOR_CLIP1)
|
|
fHoverHeight = 0.06
|
|
ELIF iCounter = ENUM_TO_INT(TOR_WATER)
|
|
OR iCounter = ENUM_TO_INT(TOR_RAG)
|
|
fHoverHeight = 0.04
|
|
ELSE
|
|
fHoverHeight = 0.02
|
|
ENDIF
|
|
vObject = GET_ENTITY_COORDS(menuWeapon[iCounter].objObject)
|
|
fObjectZ = (menuWeapon[iCounter].vDefaultCoords.z + fHoverHeight - vObject.z)/2
|
|
fObjectZ = SQRT(fObjectZ*fObjectZ)/3.0
|
|
SLIDE_OBJECT( menuWeapon[iCounter].objObject, menuWeapon[iCounter].vDefaultCoords+<<0,0,fHoverHeight>>,
|
|
<<0,0,fObjectZ>>, FALSE)
|
|
|
|
// Weapon highlighting
|
|
IF iCounter != ENUM_TO_INT(TOR_CLIP1)
|
|
|
|
vObject = GET_ENTITY_COORDS(menuWeapon[iCounter].objObject)
|
|
// Manual positioning for the wrench
|
|
IF iCounter = ENUM_TO_INT(TOR_WRENCH)
|
|
vObject = <<144.0282, -2203.5342, 4.7336>>
|
|
ENDIF
|
|
|
|
IF iCounter != ENUM_TO_INT(TOR_RAG) // Rag does not need its own point lights
|
|
// Light the object
|
|
IF iCounter != ENUM_TO_INT(TOR_WATER) // jerry can does not need extra lighting on the object
|
|
DRAW_LIGHT_WITH_RANGE(<<vObject.x, vObject.y, vObject.z+0.05>>, 255, 255, 255, 0.2, 0.5)
|
|
ENDIF
|
|
|
|
// Little circle of light underneath the weapon
|
|
DRAW_LIGHT_WITH_RANGE(<<vObject.x, vObject.y, 4.69>> , 255, 255, 255, 0.2, 0.5)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
vObject = GET_ENTITY_COORDS(menuWeapon[iCounter].objObject)
|
|
fObjectZ = (menuWeapon[iCounter].vDefaultCoords.z - vObject.z)/2
|
|
fObjectZ = SQRT(fObjectZ*fObjectZ)/3.0
|
|
SLIDE_OBJECT( menuWeapon[iCounter].objObject, menuWeapon[iCounter].vDefaultCoords,
|
|
<<0,0,fObjectZ>>, FALSE)
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RDOWN)
|
|
AND NOT bMissionFailed
|
|
|
|
IF iCurrentMenuWeapon != enum_to_int(TOR_WRENCH)
|
|
IF iCurrentMenuWeapon = enum_to_int(TOR_PLIERS)
|
|
TORTURE_Request_Cutscene(TRUE, TOR_PLIERS, iNumberOfTeethPulled+1)
|
|
ELSE
|
|
TORTURE_Request_Cutscene(TRUE, int_to_enum(TORTURE_WEAPONS, iCurrentMenuWeapon))
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Select appropriate PC control scheme for the weapon selected.
|
|
IF IS_PC_VERSION()
|
|
IF iCurrentMenuWeapon = enum_to_int(TOR_CLIP0)
|
|
SET_PC_CONTROLS( "FBI3 MINIGAME ELECTRODES")
|
|
ELSE
|
|
SET_PC_CONTROLS( "FBI3 MINIGAME DEFAULT")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
menuWeapon[iCurrentMenuWeapon].iTimesSelected++
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
fStartPhase = 0.0
|
|
iTortureWeaponStage = 0
|
|
clearText(false, true, true)
|
|
iWeaponSelStage = 0
|
|
iSelectWeaponStage++
|
|
|
|
// not selected a weapon, run some random dialogue
|
|
ELSE
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
AND (GET_GAME_TIMER() - iWeaponSelDiaTimer >= iWeaponSelDiaDelay)
|
|
|
|
TEXT_LABEL_15 strTrevDia
|
|
TEXT_LABEL_15 strSteveDia
|
|
TEXT_LABEL_15 strMrKDia
|
|
|
|
SWITCH eMissionStage
|
|
CASE ST_3_TORTURE_FOR_FIRST
|
|
strTrevDia = "F3_HMM1"
|
|
strSteveDia = "F3_TORGO1"
|
|
strMrKDia = "F3_KMENU"
|
|
BREAK
|
|
CASE ST_5_TORTURE_FOR_SECOND
|
|
strTrevDia = "F3_HMM2"
|
|
strSteveDia = "F3_TORGO2"
|
|
strMrKDia = "F3_WTF2"
|
|
BREAK
|
|
CASE ST_7_TORTURE_FOR_THIRD
|
|
strTrevDia = "F3_HMM3"
|
|
strSteveDia = "F3_TORGO3"
|
|
strMrKDia = "F3_WTF3"
|
|
BREAK
|
|
CASE ST_9_TORTURE_FINAL
|
|
strTrevDia = "F3_HMM4"
|
|
strSteveDia = "F3_TORGO4"
|
|
strMrKDia = "F3_WTF4"
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
SWITCH iWeaponSelStage
|
|
CASE 0
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
RunConversation(strSteveDia)
|
|
iWeaponSelStage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
CASE 2
|
|
CASE 4
|
|
CASE 5
|
|
CASE 6
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
AND GET_GAME_TIMER() - i_time_of_last_convo > 1000
|
|
RunConversation(strMrKDia, "", TRUE)
|
|
iWeaponSelStage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 3
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
RunConversation(strTrevDia)
|
|
iWeaponSelStage++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
IF iWeaponSelStage > 6
|
|
iWeaponSelStage = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
// JP VERSION
|
|
//---------------------------------
|
|
#IF IS_JAPANESE_BUILD
|
|
TEXT_LABEL_15 strTrevDia
|
|
|
|
SWITCH eMissionStage
|
|
CASE ST_3_TORTURE_FOR_FIRST
|
|
strTrevDia = "F3_HMM1"
|
|
BREAK
|
|
CASE ST_5_TORTURE_FOR_SECOND
|
|
strTrevDia = "F3_HMM2"
|
|
BREAK
|
|
CASE ST_7_TORTURE_FOR_THIRD
|
|
strTrevDia = "F3_HMM3"
|
|
BREAK
|
|
CASE ST_9_TORTURE_FINAL
|
|
strTrevDia = "F3_HMM4"
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
SWITCH iWeaponSelStage
|
|
CASE 0
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
RunConversation(strTrevDia)
|
|
iWeaponSelStage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
|
|
bHasPlayedPickupAnim = TRUE
|
|
iSelectWeaponStage++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
#ENDIF
|
|
BREAK
|
|
CASE 2 //Play pickup anims
|
|
IF NOT bHasPlayedPickupAnim
|
|
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
|
|
TORTURE_ANIM_DATA sAnimData
|
|
|
|
SWITCH int_to_enum(TORTURE_WEAPONS, iCurrentMenuWeapon)
|
|
CASE TOR_WRENCH
|
|
IF TORTURE_PlaySyncScene(SCENE_WEAPON_SELECT_PICKUP_WRENCH, FALSE, fStartPhase)
|
|
|
|
IF TORTURE_GetTortureSceneAnimData(SCENE_WRENCH_IDLE, sAnimData)
|
|
Load_Asset_AnimDict(sAssetData, sAnimData.strAnimDict)
|
|
Load_Asset_Audiobank(sAssetData, sbTortureWrench)
|
|
|
|
LOAD_ONESHOT("FBI3_WRENCH_HIT")
|
|
START_AUDIO_SCENE("FBI_3_TREVOR_TORTURE_WRENCH")
|
|
|
|
IF TORTURE_GetTortureSceneAnimData(SCENE_WEAPON_SELECT_PICKUP_WRENCH, sAnimData)
|
|
FIND_ANIM_EVENT_PHASE(sAnimData.strAnimDict, sAnimData.strTrevor,
|
|
eventEarlyCutIn, fStartPhase, fTempPhaseHolder)
|
|
ENDIF
|
|
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
SWITCH eMissionStage
|
|
CASE ST_3_TORTURE_FOR_FIRST RunConversation("F3_WREN1", "", TRUE) BREAK
|
|
CASE ST_5_TORTURE_FOR_SECOND RunConversation("F3_WREN2", "", TRUE) BREAK
|
|
CASE ST_7_TORTURE_FOR_THIRD RunConversation("F3_WREN3", "", TRUE) BREAK
|
|
CASE ST_9_TORTURE_FINAL RunConversation("F3_WREN4", "", TRUE) BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
bHasPlayedPickupAnim = TRUE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
CASE TOR_CLIP0
|
|
IF TORTURE_PlaySyncScene(SCENE_WEAPON_SELECT_PICKUP_CLIP0, FALSE, fStartPhase)
|
|
|
|
IF TORTURE_GetTortureSceneAnimData(SCENE_ELEC_IDLE, sAnimData)
|
|
Load_Asset_AnimDict(sAssetData, sAnimData.strAnimDict)
|
|
Load_Asset_Audiobank(sAssetData, sbTortureElec)
|
|
|
|
LOAD_ONESHOT("FBI3_BATTERY_GRIPPED")
|
|
START_AUDIO_SCENE("FBI_3_TREVOR_TORTURE_ELECTRIC")
|
|
|
|
IF TORTURE_GetTortureSceneAnimData(SCENE_WEAPON_SELECT_PICKUP_CLIP0, sAnimData)
|
|
FIND_ANIM_EVENT_PHASE(sAnimData.strAnimDict, sAnimData.strTrevor,
|
|
eventEarlyCutIn, fStartPhase, fTempPhaseHolder)
|
|
ENDIF
|
|
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
RunConversation("F3_EWAIT")
|
|
ENDIF
|
|
bHasPlayedPickupAnim = TRUE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
CASE TOR_PLIERS
|
|
IF TORTURE_PlaySyncScene(SCENE_WEAPON_SELECT_PICKUP_PLIERS, FALSE, fStartPhase)
|
|
|
|
IF TORTURE_GetTortureSceneAnimData(SCENE_PLIERS_IDLE, sAnimData)
|
|
Load_Asset_AnimDict(sAssetData, sAnimData.strAnimDict)
|
|
Load_Asset_Model(sAssetData, mnTooth)
|
|
Load_Asset_Audiobank(sAssetData, sbTortureTeeth)
|
|
Load_Asset_Audiobank(sAssetData, "FBI_03_Torture_Teeth_Pain")
|
|
|
|
LOAD_ONESHOT("FBI3_TOOTH_PULLED")
|
|
START_AUDIO_SCENE("FBI_3_TREVOR_TORTURE_PLIERS")
|
|
|
|
IF TORTURE_GetTortureSceneAnimData(SCENE_WEAPON_SELECT_PICKUP_PLIERS, sAnimData)
|
|
FIND_ANIM_EVENT_PHASE(sAnimData.strAnimDict, sAnimData.strTrevor,
|
|
eventEarlyCutIn, fStartPhase, fTempPhaseHolder)
|
|
ENDIF
|
|
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
runConversation("F3_PWAIT")
|
|
ENDIF
|
|
bHasPlayedPickupAnim = TRUE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
CASE TOR_WATER
|
|
IF TORTURE_PlaySyncScene(SCENE_WEAPON_SELECT_PICKUP_WATER, FALSE, fStartPhase)
|
|
|
|
IF TORTURE_GetTortureSceneAnimData(SCENE_WATER_IDLE, sAnimData)
|
|
Load_Asset_AnimDict(sAssetData, sAnimData.strAnimDict)
|
|
Load_Asset_Audiobank(sAssetData, sbTortureWater)
|
|
|
|
LOAD_ONESHOT("FBI3_WATER_BOARDED")
|
|
START_AUDIO_SCENE("FBI_3_TREVOR_TORTURE_WATER")
|
|
|
|
IF TORTURE_GetTortureSceneAnimData(SCENE_WEAPON_SELECT_PICKUP_WATER, sAnimData)
|
|
FIND_ANIM_EVENT_PHASE(sAnimData.strAnimDict, sAnimData.strTrevor,
|
|
eventEarlyCutIn, fStartPhase, fTempPhaseHolder)
|
|
ENDIF
|
|
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
RunConversation("F3_KWAIT")
|
|
ENDIF
|
|
bHasPlayedPickupAnim = TRUE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF bHasPlayedPickupAnim
|
|
IF TORTURE_GetTortureSceneAnimData(SCENE_SYRINGE_IDLE, sAnimData)
|
|
Load_Asset_AnimDict(sAssetData, sAnimData.strAnimDict)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#ENDIF
|
|
|
|
ELSE
|
|
BOOL bSelectDone
|
|
bSelectDone = FALSE
|
|
#IF IS_JAPANESE_BUILD
|
|
bSelectDone = TRUE
|
|
#ENDIF
|
|
|
|
IF iCurrentMenuWeapon = ENUM_TO_INT(TOR_SYRINGE)
|
|
IF NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WEAPON_SELECT_PICKUP_SYRINGE])
|
|
bSelectDone = TRUE
|
|
ENDIF
|
|
|
|
ELIF NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WEAPON_SELECT_PICKUP_WRENCH])
|
|
AND NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WEAPON_SELECT_PICKUP_PLIERS])
|
|
AND NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WEAPON_SELECT_PICKUP_CLIP0])
|
|
AND NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WEAPON_SELECT_PICKUP_WATER])
|
|
AND NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WEAPON_SELECT_PICKUP_SYRINGE])
|
|
|
|
bSelectDone = TRUE
|
|
|
|
ENDIF
|
|
|
|
IF bSelectDone
|
|
|
|
iSelectWeaponStage = 0
|
|
|
|
RETURN TRUE
|
|
ELSE
|
|
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
|
|
AND NOT bMissionFailed
|
|
SAFE_FADE_OUT(DEFAULT_FADE_TIME_SHORT)
|
|
ENDIF
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WEAPON_SELECT_PICKUP_WRENCH])
|
|
IF IS_SCREEN_FADED_OUT()
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
SET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_WEAPON_SELECT_PICKUP_WRENCH], 1.0)
|
|
ELSE
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
SWITCH iWeaponSelStage
|
|
CASE 0 RunConversation("F3_NOWREN", "", TRUE) iWeaponSelStage++ BREAK
|
|
CASE 1
|
|
IF GET_GAME_TIMER() - i_time_of_last_convo > I_TIME_BETWEEN_PLEES
|
|
RunConversation("F3_NOWREN", "", TRUE)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WEAPON_SELECT_PICKUP_PLIERS])
|
|
IF IS_SCREEN_FADED_OUT()
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
SET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_WEAPON_SELECT_PICKUP_PLIERS], 1.0)
|
|
ELSE
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
SWITCH iWeaponSelStage
|
|
CASE 0 RunConversation("F3_NOPLI", "", TRUE) iWeaponSelStage++ BREAK
|
|
CASE 1
|
|
IF GET_GAME_TIMER() - i_time_of_last_convo > I_TIME_BETWEEN_PLEES
|
|
RunConversation("F3_NOPLI", "", TRUE)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WEAPON_SELECT_PICKUP_WATER])
|
|
IF IS_SCREEN_FADED_OUT()
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
SET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_WEAPON_SELECT_PICKUP_WATER], 1.0)
|
|
ELSE
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
SWITCH iWeaponSelStage
|
|
CASE 0 RunConversation("F3_NOCAN", "", TRUE) iWeaponSelStage++ BREAK
|
|
CASE 1 RunConversation("F3_CAN", "", TRUE) iWeaponSelStage++ BREAK
|
|
CASE 2
|
|
IF GET_GAME_TIMER() - i_time_of_last_convo > I_TIME_BETWEEN_PLEES
|
|
RunConversation("F3_CAN", "", TRUE)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WEAPON_SELECT_PICKUP_SYRINGE])
|
|
IF IS_SCREEN_FADED_OUT()
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
SET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_WEAPON_SELECT_PICKUP_SYRINGE], 1.0)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_WEAPON_SELECT_PICKUP_CLIP0])
|
|
IF IS_SCREEN_FADED_OUT()
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
SET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_WEAPON_SELECT_PICKUP_CLIP0], 1.0)
|
|
ELSE
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
SWITCH iWeaponSelStage
|
|
CASE 0 RunConversation("F3_NOJUMP", "", TRUE) iWeaponSelStage++ BREAK
|
|
CASE 1 RunConversation("F3_JUMP", "", TRUE) iWeaponSelStage++ BREAK
|
|
CASE 2
|
|
IF GET_GAME_TIMER() - i_time_of_last_convo > I_TIME_BETWEEN_PLEES
|
|
RunConversation("F3_JUMP", "", TRUE)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
//PURPOSE: Loads the assets needed for the sniping prone scene with Michael and Dave
|
|
FUNC BOOL PARTY_LoadAssets(BOOL bDriveToStage, BOOL bIncParty, BOOL bDontLoadProne = FALSE, BOOL bDontLoadCoffee = FALSE)
|
|
|
|
CONST_INT I_START_LOADING_COFFEE_ASSETS 0
|
|
CONST_INT I_START_LOADING_PRONE_ASSETS 0
|
|
CONST_INT I_START_LOADING_REPLAY_VEH_ASSETS 5
|
|
CONST_INT I_START_LOADING_PARTY_ASSETS 8
|
|
CONST_INT I_PARTY_LOADING_FINISHED 23
|
|
|
|
IF bDriveToStage
|
|
|
|
// Coffee
|
|
IF NOT bDontLoadCoffee
|
|
SWITCH iAssetRequests
|
|
CASE I_START_LOADING_COFFEE_ASSETS
|
|
Load_Asset_Model(sAssetData, P_ING_COFFEECUP_01)
|
|
iAssetRequests++
|
|
BREAK
|
|
CASE 1
|
|
IF HAS_MODEL_LOADED(P_ING_COFFEECUP_01)
|
|
Load_Asset_Model(sAssetData, PROP_NPC_PHONE)
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 2
|
|
IF HAS_MODEL_LOADED(PROP_NPC_PHONE)
|
|
Load_Asset_Model(sAssetData, PROP_CHAIR_01A)
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 3
|
|
IF HAS_MODEL_LOADED(PROP_CHAIR_01A)
|
|
Load_Asset_AnimDict(sAssetData, adCoffee)
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 4
|
|
IF HAS_ANIM_DICT_LOADED(adCoffee)
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
IF iAssetRequests < I_START_LOADING_REPLAY_VEH_ASSETS
|
|
iAssetRequests = I_START_LOADING_REPLAY_VEH_ASSETS
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Replay vehicle
|
|
IF iAssetRequests >= I_START_LOADING_REPLAY_VEH_ASSETS
|
|
IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE()
|
|
SWITCH iAssetRequests
|
|
CASE I_START_LOADING_REPLAY_VEH_ASSETS
|
|
CPRINTLN(DEBUG_MIKE, "PARTY_LoadAssets(): Made replay checkpoint vehicle model request MODEL:", GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
|
|
REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL()
|
|
// IF Load_Asset_Model(sAssetData, GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
|
|
// CPRINTLN(DEBUG_MIKE, "PARTY_LoadAssets(): Asset management requested MODEL:", GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
|
|
// ELSE
|
|
// CPRINTLN(DEBUG_MIKE, "PARTY_LoadAssets(): Asset management thinks MODEL:", GET_REPLAY_CHECKPOINT_VEHICLE_MODEL(), " is already loaded.")
|
|
// ENDIF
|
|
iAssetRequests++
|
|
BREAK
|
|
CASE 6
|
|
IF HAS_REPLAY_CHECKPOINT_VEHICLE_LOADED()
|
|
iAssetRequests = I_START_LOADING_PARTY_ASSETS
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
IF iAssetRequests <= I_START_LOADING_REPLAY_VEH_ASSETS
|
|
iAssetRequests = I_START_LOADING_PARTY_ASSETS
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
IF NOT bDontLoadProne
|
|
SWITCH iAssetRequests
|
|
CASE I_START_LOADING_PRONE_ASSETS
|
|
Load_Asset_AnimDict(sAssetData, adSniping)
|
|
iAssetRequests++
|
|
BREAK
|
|
CASE 1
|
|
IF HAS_ANIM_DICT_LOADED(adSniping)
|
|
Load_Asset_Model(sAssetData, PROP_NPC_PHONE)
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 2
|
|
IF HAS_MODEL_LOADED(PROP_NPC_PHONE)
|
|
Load_Asset_Weapon_Asset(sAssetData, weapMichaelsSniper, WRF_REQUEST_ALL_ANIMS, WEAPON_COMPONENT_SCOPE)
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 3
|
|
IF HAS_WEAPON_ASSET_LOADED(weapMichaelsSniper)
|
|
Load_Asset_Model(sAssetData, PROP_BINOC_01)
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 4
|
|
IF HAS_MODEL_LOADED(PROP_BINOC_01)
|
|
iAssetRequests = I_START_LOADING_PARTY_ASSETS
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ELSE
|
|
IF iAssetRequests < I_START_LOADING_PARTY_ASSETS
|
|
iAssetRequests = I_START_LOADING_PARTY_ASSETS
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF iAssetRequests >= I_START_LOADING_PARTY_ASSETS
|
|
IF bIncParty
|
|
SWITCH iAssetRequests
|
|
CASE I_START_LOADING_PARTY_ASSETS
|
|
Load_Asset_PTFX(sAssetData)
|
|
iAssetRequests++
|
|
BREAK
|
|
CASE 9
|
|
IF HAS_PTFX_ASSET_LOADED()
|
|
Load_Asset_Model(sAssetData, mnTarget)
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 10
|
|
IF HAS_MODEL_LOADED(mnTarget)
|
|
Load_Asset_Model(sAssetData, mnPartyMale1)
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 11
|
|
IF HAS_MODEL_LOADED(mnPartyMale1)
|
|
Load_Asset_Model(sAssetData, mnPartyFem)
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 12
|
|
IF HAS_MODEL_LOADED(mnPartyFem)
|
|
Load_Asset_Model(sAssetData, PROP_CS_CIGGY_01B)
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 13
|
|
IF HAS_MODEL_LOADED(PROP_CS_CIGGY_01B)
|
|
Load_Asset_Model(sAssetData, P_FAG_PACKET_01_S)
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 14
|
|
IF HAS_MODEL_LOADED(P_FAG_PACKET_01_S)
|
|
Load_Asset_Model(sAssetData, PROP_FBI3_COFFEE_TABLE)
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 15
|
|
IF HAS_MODEL_LOADED(PROP_FBI3_COFFEE_TABLE)
|
|
Load_Asset_AnimDict(sAssetData, "MISSFBI3_PARTY")
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 16
|
|
IF HAS_ANIM_DICT_LOADED("MISSFBI3_PARTY")
|
|
Load_Asset_AnimDict(sAssetData, "MISSFBI3_PARTY_B")
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 17
|
|
IF HAS_ANIM_DICT_LOADED("MISSFBI3_PARTY_B")
|
|
Load_Asset_AnimDict(sAssetData, "MISSFBI3_PARTY_C")
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 18
|
|
IF HAS_ANIM_DICT_LOADED("MISSFBI3_PARTY_C")
|
|
Load_Asset_AnimDict(sAssetData, "MISSFBI3_PARTY_D")
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 19
|
|
IF HAS_ANIM_DICT_LOADED("MISSFBI3_PARTY_D")
|
|
Load_Asset_AnimDict(sAssetData, "MISSFBI3_PARTY_E")
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 20
|
|
IF HAS_ANIM_DICT_LOADED("MISSFBI3_PARTY_E")
|
|
Load_Asset_AnimDict(sAssetData, adPartyGetUpFlee)
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 21
|
|
IF HAS_ANIM_DICT_LOADED(adPartyGetUpFlee)
|
|
Load_Asset_Audiobank(sAssetData, "FBI_03_Panic")
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 22
|
|
IF REQUEST_SCRIPT_AUDIO_BANK("FBI_03_Panic")
|
|
iAssetRequests = I_PARTY_LOADING_FINISHED
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
IF iAssetRequests < I_PARTY_LOADING_FINISHED
|
|
iAssetRequests = I_PARTY_LOADING_FINISHED
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF iAssetRequests = I_PARTY_LOADING_FINISHED
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
//PURPOSE: Sets up michael with the sniper with the max zoom scope. Also makes sure the ped has minimum 20 bullets.
|
|
PROC PARTY_GivePedCustomSniperRifle(PED_INDEX ped)
|
|
IF ped = MIKE_PED_ID()
|
|
CPRINTLN(DEBUG_MIKE, "GIVING CUSTOM SNIPER TO PLAYER")
|
|
ELSE
|
|
CPRINTLN(DEBUG_MIKE, "GIVING CUSTOM SNIPER TO PED")
|
|
ENDIF
|
|
IF NOT HAS_PED_GOT_WEAPON(ped, weapMichaelsSniper)
|
|
GIVE_WEAPON_TO_PED(ped, weapMichaelsSniper, 20, FALSE, FALSE)
|
|
GIVE_WEAPON_COMPONENT_TO_PED(ped, weapMichaelsSniper, WEAPONCOMPONENT_AT_SCOPE_MAX)
|
|
SET_CURRENT_PED_WEAPON(ped, weapMichaelsSniper, TRUE)
|
|
CPRINTLN(DEBUG_MIKE, "NEW WEAPON")
|
|
ELSE
|
|
SET_CURRENT_PED_WEAPON(ped, WEAPONTYPE_UNARMED, FALSE)
|
|
SET_PED_AMMO(ped, weapMichaelsSniper, 20)
|
|
GIVE_WEAPON_COMPONENT_TO_PED(ped, weapMichaelsSniper, WEAPONCOMPONENT_AT_SCOPE_MAX)
|
|
SET_CURRENT_PED_WEAPON(ped, weapMichaelsSniper, TRUE)
|
|
CPRINTLN(DEBUG_MIKE, "EXISTING SNIPER")
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
//PURPOSE: Checks if the player has looked at every bit of the house
|
|
PROC PARTY_ScopeCheck()
|
|
CONST_FLOAT fRadius 0.1
|
|
|
|
IF GET_FIRST_PERSON_AIM_CAM_ZOOM_FACTOR() >= F_ZOOM_SCOPE_CHECK
|
|
IF NOT bScoped[HS_CENTRE]
|
|
IF IS_SPHERE_VISIBLE(vHouseSectionCentre[HS_CENTRE], fRadius)
|
|
bScoped[HS_CENTRE] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT bScoped[HS_HIGH_LEFT]
|
|
IF IS_SPHERE_VISIBLE(vHouseSectionCentre[HS_HIGH_LEFT], fRadius)
|
|
bScoped[HS_HIGH_LEFT] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT bScoped[HS_HIGH_RIGHT]
|
|
IF IS_SPHERE_VISIBLE(vHouseSectionCentre[HS_HIGH_RIGHT], fRadius)
|
|
bScoped[HS_HIGH_RIGHT] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT bScoped[HS_LOW_LEFT]
|
|
IF IS_SPHERE_VISIBLE(vHouseSectionCentre[HS_LOW_LEFT], fRadius)
|
|
bScoped[HS_LOW_LEFT] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT bScoped[HS_LOW_RIGHT]
|
|
IF IS_SPHERE_VISIBLE(vHouseSectionCentre[HS_LOW_RIGHT], fRadius)
|
|
bScoped[HS_LOW_RIGHT] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: Sets all the scope booleans to false, ready to check if the player has looked at the entire house
|
|
PROC PARTY_ResetScopeCheck()
|
|
INT i
|
|
REPEAT COUNT_OF(bScoped) i
|
|
bScoped[i] = FALSE
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
PTFX_ID ptfx_Cigs[3]
|
|
|
|
//PURPOSE: Manages the activities of the party goers, some specific events based on where the player is looking, etc
|
|
PROC PARTY_ManagePartyScene(BOOL bStartMusic = FALSE)
|
|
|
|
CONST_FLOAT fTargetHeading 259.4096
|
|
|
|
IF NOT bPlayingMusic
|
|
TEXT_LABEL_15 strStream
|
|
|
|
SWITCH eMissionStage
|
|
CASE ST_6_REACT_TO_SECOND
|
|
strStream = "Party"
|
|
BREAK
|
|
CASE ST_8_REACT_TO_THIRD
|
|
strStream = "Party_2"
|
|
BREAK
|
|
CASE ST_10_REACT_FINAL
|
|
strStream = "Party_3"
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF LOAD_STREAM(strStream, "FBI_03_Torture_Sounds")
|
|
|
|
IF bStartMusic
|
|
SET_AUDIO_FLAG("DisableReplayScriptStreamRecording", TRUE)
|
|
PLAY_STREAM_FROM_POSITION(<<-3024.7515, 332.2954, 13.6596>>)
|
|
START_AUDIO_SCENE(audsceneZoom)
|
|
fAudioZoom = 0.0
|
|
fAudioZoomPreviousFrame = 0.0
|
|
SET_VARIABLE_ON_STREAM("ZoomLevel", fAudioZoom)
|
|
SET_AUDIO_SCENE_VARIABLE(audsceneZoom, "apply", fAudioZoom)
|
|
bPlayingMusic = TRUE
|
|
CPRINTLN(DEBUG_MIKE, "*** MUSIC STARTED FOR FBI3 ***")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
PARTY_ScopeCheck()
|
|
|
|
// PARTY TARGET AND DECOYS
|
|
IF eMissionStage = ST_10_REACT_FINAL
|
|
IF DOES_ENTITY_EXIST(peds[mpf_target].id)
|
|
AND NOT IS_PED_INJURED(peds[mpf_target].id)
|
|
AND NOT peds[mpf_target].bFleeing
|
|
|
|
IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(peds[mpf_target].id, SCRIPT_TASK_PERFORM_SEQUENCE)
|
|
|
|
SET_ENTITY_COORDS( peds[mpf_target].id, vTargetPedSlots[iTargetPedSlot[0]] )
|
|
|
|
OPEN_SEQUENCE_TASK(seqSequence)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_LH_Male_A", vTargetPedSlots[iTargetPedSlot[0]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_LH_Male_C", vTargetPedSlots[iTargetPedSlot[0]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_LH_Male_D", vTargetPedSlots[iTargetPedSlot[0]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_LH_Male_B", vTargetPedSlots[iTargetPedSlot[0]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_LH_Male_A", vTargetPedSlots[iTargetPedSlot[0]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_LH_Male_C", vTargetPedSlots[iTargetPedSlot[0]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_LH_Male_D", vTargetPedSlots[iTargetPedSlot[0]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_LH_Male_B", vTargetPedSlots[iTargetPedSlot[0]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_LH_Male_C", vTargetPedSlots[iTargetPedSlot[0]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_LH_Male_A", vTargetPedSlots[iTargetPedSlot[0]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_LH_Male_D", vTargetPedSlots[iTargetPedSlot[0]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_LH_Male_B", vTargetPedSlots[iTargetPedSlot[0]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
SET_SEQUENCE_TO_REPEAT(seqSequence, REPEAT_FOREVER)
|
|
CLOSE_SEQUENCE_TASK(seqSequence)
|
|
TASK_PERFORM_SEQUENCE(peds[mpf_target].id, seqSequence)
|
|
CLEAR_SEQUENCE_TASK(seqSequence)
|
|
|
|
ELSE
|
|
IF HAS_ANIM_EVENT_FIRED(peds[mpf_target].id, HASH("exhale"))
|
|
START_PARTICLE_FX_NON_LOOPED_ON_PED_BONE("cs_cig_exhale_mouth", peds[mpf_target].id, <<0,0,0>>,<<0,0,0>>, BONETAG_HEAD, 1.0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// decoy female smoker
|
|
IF DOES_ENTITY_EXIST(peds[mpf_decoy_f].id)
|
|
AND NOT IS_PED_INJURED(peds[mpf_decoy_f].id)
|
|
AND NOT peds[mpf_decoy_f].bFleeing
|
|
|
|
IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(peds[mpf_decoy_f].id, SCRIPT_TASK_PERFORM_SEQUENCE)
|
|
|
|
SET_ENTITY_COORDS( peds[mpf_decoy_f].id, vTargetPedSlots[iTargetPedSlot[1]] )
|
|
|
|
OPEN_SEQUENCE_TASK(seqSequence)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_LH_Female_A", vTargetPedSlots[iTargetPedSlot[1]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_LH_Female_C", vTargetPedSlots[iTargetPedSlot[1]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_LH_Female_D", vTargetPedSlots[iTargetPedSlot[1]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_LH_Female_B", vTargetPedSlots[iTargetPedSlot[1]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_LH_Female_A", vTargetPedSlots[iTargetPedSlot[1]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_LH_Female_C", vTargetPedSlots[iTargetPedSlot[1]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_LH_Female_D", vTargetPedSlots[iTargetPedSlot[1]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_LH_Female_B", vTargetPedSlots[iTargetPedSlot[1]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_LH_Female_C", vTargetPedSlots[iTargetPedSlot[1]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_LH_Female_A", vTargetPedSlots[iTargetPedSlot[1]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_LH_Female_D", vTargetPedSlots[iTargetPedSlot[1]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_LH_Female_B", vTargetPedSlots[iTargetPedSlot[1]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
SET_SEQUENCE_TO_REPEAT(seqSequence, REPEAT_FOREVER)
|
|
CLOSE_SEQUENCE_TASK(seqSequence)
|
|
TASK_PERFORM_SEQUENCE(peds[mpf_decoy_f].id, seqSequence)
|
|
CLEAR_SEQUENCE_TASK(seqSequence)
|
|
|
|
ELSE
|
|
IF HAS_ANIM_EVENT_FIRED(peds[mpf_decoy_f].id, HASH("exhale"))
|
|
START_PARTICLE_FX_NON_LOOPED_ON_PED_BONE("cs_cig_exhale_mouth", peds[mpf_decoy_f].id, <<0,0,0>>,<<0,0,0>>, BONETAG_HEAD, 1.0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// decoy male smoker
|
|
IF DOES_ENTITY_EXIST(peds[mpf_decoy_m].id)
|
|
AND NOT IS_PED_INJURED(peds[mpf_decoy_m].id)
|
|
AND NOT peds[mpf_decoy_m].bFleeing
|
|
|
|
IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(peds[mpf_decoy_m].id, SCRIPT_TASK_PERFORM_SEQUENCE)
|
|
|
|
SET_ENTITY_COORDS( peds[mpf_decoy_m].id, vTargetPedSlots[iTargetPedSlot[2]] )
|
|
|
|
OPEN_SEQUENCE_TASK(seqSequence)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_RH_Male_A", vTargetPedSlots[iTargetPedSlot[2]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_RH_Male_C", vTargetPedSlots[iTargetPedSlot[2]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_RH_Male_D", vTargetPedSlots[iTargetPedSlot[2]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_RH_Male_B", vTargetPedSlots[iTargetPedSlot[2]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_RH_Male_A", vTargetPedSlots[iTargetPedSlot[2]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_RH_Male_C", vTargetPedSlots[iTargetPedSlot[2]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_RH_Male_D", vTargetPedSlots[iTargetPedSlot[2]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_RH_Male_B", vTargetPedSlots[iTargetPedSlot[2]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_RH_Male_C", vTargetPedSlots[iTargetPedSlot[2]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_RH_Male_A", vTargetPedSlots[iTargetPedSlot[2]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_RH_Male_D", vTargetPedSlots[iTargetPedSlot[2]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
TASK_PLAY_ANIM_ADVANCED(null, "MISSFBI3_PARTY_E", "Target_Smoke_RH_Male_B", vTargetPedSlots[iTargetPedSlot[2]], <<0,0,fTargetHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_NOT_INTERRUPTABLE | AF_DISABLE_FORCED_PHYSICS_UPDATE)
|
|
SET_SEQUENCE_TO_REPEAT(seqSequence, REPEAT_FOREVER)
|
|
CLOSE_SEQUENCE_TASK(seqSequence)
|
|
TASK_PERFORM_SEQUENCE(peds[mpf_decoy_m].id, seqSequence)
|
|
CLEAR_SEQUENCE_TASK(seqSequence)
|
|
ELSE
|
|
IF HAS_ANIM_EVENT_FIRED(peds[mpf_decoy_m].id, HASH("exhale"))
|
|
START_PARTICLE_FX_NON_LOOPED_ON_PED_BONE("cs_cig_exhale_mouth", peds[mpf_decoy_m].id, <<0,0,0>>,<<0,0,0>>, BONETAG_HEAD, 1.0)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// COKE SCENE
|
|
IF NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PARTY_A])
|
|
|
|
// Coke snort scene
|
|
IF bScoped[HS_HIGH_LEFT] // player has looked here
|
|
AND eMissionStage != ST_8_REACT_TO_THIRD // not in the second stage when the target is standing watching the guy prepping the coke
|
|
AND (NOT bHasCokeSnortPlayed // the anim has not played before
|
|
OR (bHasCokeSnortPlayed AND GET_GAME_TIMER() - iCokeSnortTimer >= 15000) ) // the anim has played before but is was 90+ seconds ago
|
|
|
|
IF (NOT IS_PED_INJURED(peds[mpf_party_coke_m_1].id) AND NOT peds[mpf_party_coke_m_1].bFleeing)
|
|
OR (NOT IS_PED_INJURED(peds[mpf_party_coke_m_3].id) AND NOT peds[mpf_party_coke_m_3].bFleeing)
|
|
OR (NOT IS_PED_INJURED(peds[mpf_party_coke_m_5].id) AND NOT peds[mpf_party_coke_m_5].bFleeing)
|
|
OR (NOT IS_PED_INJURED(peds[mpf_party_coke_f_1].id) AND NOT peds[mpf_party_coke_f_1].bFleeing)
|
|
OR ((eMissionStage = ST_5_TORTURE_FOR_SECOND OR eMissionStage = ST_6_REACT_TO_SECOND OR eMissionStage = ST_7_TORTURE_FOR_THIRD OR eMissionStage = ST_8_REACT_TO_THIRD) AND NOT IS_PED_INJURED(peds[mpf_target].id) AND NOT peds[mpf_target].bFleeing)
|
|
syncScene[SCENE_PARTY_A] = CREATE_SYNCHRONIZED_SCENE(vPartySyncCoord, vPartySyncRot)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_coke_m_1].id) AND NOT peds[mpf_party_coke_m_1].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_coke_m_1].id, syncScene[SCENE_PARTY_A], "MISSFBI3_PARTY", "Snort_Coke_B_Male1", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
IF eMissionStage = ST_7_TORTURE_FOR_THIRD
|
|
OR eMissionStage = ST_8_REACT_TO_THIRD
|
|
IF NOT IS_PED_INJURED(peds[mpf_target].id) AND NOT peds[mpf_target].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_target].id, syncScene[SCENE_PARTY_A], "MISSFBI3_PARTY", "Snort_Coke_B_Male2", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
ENDIF
|
|
IF eMissionStage = ST_5_TORTURE_FOR_SECOND
|
|
OR eMissionStage = ST_6_REACT_TO_SECOND
|
|
IF NOT IS_PED_INJURED(peds[mpf_target].id) AND NOT peds[mpf_target].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_target].id, syncScene[SCENE_PARTY_A], "MISSFBI3_PARTY", "Snort_Coke_B_Male3", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_coke_m_3].id) AND NOT peds[mpf_party_coke_m_3].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_coke_m_3].id, syncScene[SCENE_PARTY_A], "MISSFBI3_PARTY", "Snort_Coke_B_Male3", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_coke_m_5].id) AND NOT peds[mpf_party_coke_m_5].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_coke_m_5].id, syncScene[SCENE_PARTY_A], "MISSFBI3_PARTY", "Snort_Coke_B_Male5", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_coke_f_1].id) AND NOT peds[mpf_party_coke_f_1].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_coke_f_1].id, syncScene[SCENE_PARTY_A], "MISSFBI3_PARTY", "Snort_Coke_B_Female", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
|
|
bHasCokeSnortPlayed = TRUE
|
|
iCokeSnortTimer = GET_GAME_TIMER()
|
|
|
|
// Coke prep scene
|
|
ELSE
|
|
IF (NOT IS_PED_INJURED(peds[mpf_party_coke_m_1].id) AND NOT peds[mpf_party_coke_m_1].bFleeing)
|
|
OR (NOT IS_PED_INJURED(peds[mpf_party_coke_m_3].id) AND NOT peds[mpf_party_coke_m_3].bFleeing)
|
|
OR (NOT IS_PED_INJURED(peds[mpf_party_coke_m_5].id) AND NOT peds[mpf_party_coke_m_5].bFleeing)
|
|
OR (NOT IS_PED_INJURED(peds[mpf_party_coke_f_1].id) AND NOT peds[mpf_party_coke_f_1].bFleeing)
|
|
OR ((eMissionStage = ST_5_TORTURE_FOR_SECOND OR eMissionStage = ST_6_REACT_TO_SECOND OR eMissionStage = ST_7_TORTURE_FOR_THIRD OR eMissionStage = ST_8_REACT_TO_THIRD) AND NOT IS_PED_INJURED(peds[mpf_target].id) AND NOT peds[mpf_target].bFleeing)
|
|
syncScene[SCENE_PARTY_A] = CREATE_SYNCHRONIZED_SCENE(vPartySyncCoord, vPartySyncRot)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_coke_m_1].id) AND NOT peds[mpf_party_coke_m_1].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_coke_m_1].id, syncScene[SCENE_PARTY_A], "MISSFBI3_PARTY", "Snort_Coke_A_Male1", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
IF eMissionStage = ST_5_TORTURE_FOR_SECOND
|
|
OR eMissionStage = ST_6_REACT_TO_SECOND
|
|
IF NOT IS_PED_INJURED(peds[mpf_target].id) AND NOT peds[mpf_target].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_target].id, syncScene[SCENE_PARTY_A], "MISSFBI3_PARTY", "Snort_Coke_A_Male3", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_coke_m_3].id) AND NOT peds[mpf_party_coke_m_3].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_coke_m_3].id, syncScene[SCENE_PARTY_A], "MISSFBI3_PARTY", "Snort_Coke_A_Male3", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
ENDIF
|
|
IF eMissionStage = ST_7_TORTURE_FOR_THIRD
|
|
OR eMissionStage = ST_8_REACT_TO_THIRD
|
|
IF NOT IS_PED_INJURED(peds[mpf_target].id) AND NOT peds[mpf_target].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_target].id, syncScene[SCENE_PARTY_A], "MISSFBI3_PARTY", "Snort_Coke_A_Male2", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_coke_m_5].id) AND NOT peds[mpf_party_coke_m_5].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_coke_m_5].id, syncScene[SCENE_PARTY_A], "MISSFBI3_PARTY", "Snort_Coke_A_Male5", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_coke_f_1].id) AND NOT peds[mpf_party_coke_f_1].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_coke_f_1].id, syncScene[SCENE_PARTY_A], "MISSFBI3_PARTY", "Snort_Coke_A_Female", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
// GUYS ON TOP BALCONY
|
|
IF NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PARTY_B])
|
|
|
|
SWITCH iPartyBStage
|
|
CASE 0
|
|
IF (NOT IS_PED_INJURED(peds[mpf_party_b_m_1].id) AND NOT peds[mpf_party_b_m_1].bFleeing)
|
|
OR (NOT IS_PED_INJURED(peds[mpf_party_b_m_2].id) AND NOT peds[mpf_party_b_m_2].bFleeing)
|
|
OR (NOT IS_PED_INJURED(peds[mpf_party_b_f_1].id) AND NOT peds[mpf_party_b_f_1].bFleeing)
|
|
syncScene[SCENE_PARTY_B] = CREATE_SYNCHRONIZED_SCENE(vPartySyncCoord, vPartySyncRot)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_b_m_1].id) AND NOT peds[mpf_party_b_m_1].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_b_m_1].id, syncScene[SCENE_PARTY_B], "MISSFBI3_PARTY_B", "Talk_Balcony_Loop_Male1", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_b_m_2].id) AND NOT peds[mpf_party_b_m_2].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_b_m_2].id, syncScene[SCENE_PARTY_B], "MISSFBI3_PARTY_B", "Talk_Balcony_Loop_Male2", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_b_f_1].id) AND NOT peds[mpf_party_b_f_1].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_b_f_1].id, syncScene[SCENE_PARTY_B], "MISSFBI3_PARTY_B", "Talk_Balcony_Loop_Female", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
iPartyBStage++
|
|
BREAK
|
|
CASE 1
|
|
IF (NOT IS_PED_INJURED(peds[mpf_party_b_m_1].id) AND NOT peds[mpf_party_b_m_1].bFleeing)
|
|
OR (NOT IS_PED_INJURED(peds[mpf_party_b_m_2].id) AND NOT peds[mpf_party_b_m_2].bFleeing)
|
|
OR (NOT IS_PED_INJURED(peds[mpf_party_b_f_1].id) AND NOT peds[mpf_party_b_f_1].bFleeing)
|
|
syncScene[SCENE_PARTY_B] = CREATE_SYNCHRONIZED_SCENE(vPartySyncCoord, vPartySyncRot)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_b_m_1].id) AND NOT peds[mpf_party_b_m_1].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_b_m_1].id, syncScene[SCENE_PARTY_B], "MISSFBI3_PARTY_B", "Walk_Inside_Male1", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_b_m_2].id) AND NOT peds[mpf_party_b_m_2].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_b_m_2].id, syncScene[SCENE_PARTY_B], "MISSFBI3_PARTY_B", "Walk_Inside_Male2", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_b_f_1].id) AND NOT peds[mpf_party_b_f_1].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_b_f_1].id, syncScene[SCENE_PARTY_B], "MISSFBI3_PARTY_B", "Walk_Inside_Female", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
iPartyBStage++
|
|
BREAK
|
|
CASE 2
|
|
IF (NOT IS_PED_INJURED(peds[mpf_party_b_m_1].id) AND NOT peds[mpf_party_b_m_1].bFleeing)
|
|
OR (NOT IS_PED_INJURED(peds[mpf_party_b_m_2].id) AND NOT peds[mpf_party_b_m_2].bFleeing)
|
|
OR (NOT IS_PED_INJURED(peds[mpf_party_b_f_1].id) AND NOT peds[mpf_party_b_f_1].bFleeing)
|
|
syncScene[SCENE_PARTY_B] = CREATE_SYNCHRONIZED_SCENE(vPartySyncCoord, vPartySyncRot)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_b_m_1].id) AND NOT peds[mpf_party_b_m_1].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_b_m_1].id, syncScene[SCENE_PARTY_B], "MISSFBI3_PARTY_B", "Talk_Inside_Loop_Male1", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_b_m_2].id) AND NOT peds[mpf_party_b_m_2].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_b_m_2].id, syncScene[SCENE_PARTY_B], "MISSFBI3_PARTY_B", "Talk_Inside_Loop_Male2", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_b_f_1].id) AND NOT peds[mpf_party_b_f_1].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_b_f_1].id, syncScene[SCENE_PARTY_B], "MISSFBI3_PARTY_B", "Talk_Inside_Loop_Female", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
iPartyBStage++
|
|
BREAK
|
|
CASE 3
|
|
IF (NOT IS_PED_INJURED(peds[mpf_party_b_m_1].id) AND NOT peds[mpf_party_b_m_1].bFleeing)
|
|
OR (NOT IS_PED_INJURED(peds[mpf_party_b_m_2].id) AND NOT peds[mpf_party_b_m_2].bFleeing)
|
|
OR (NOT IS_PED_INJURED(peds[mpf_party_b_f_1].id) AND NOT peds[mpf_party_b_f_1].bFleeing)
|
|
syncScene[SCENE_PARTY_B] = CREATE_SYNCHRONIZED_SCENE(vPartySyncCoord, vPartySyncRot)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_b_m_1].id) AND NOT peds[mpf_party_b_m_1].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_b_m_1].id, syncScene[SCENE_PARTY_B], "MISSFBI3_PARTY_B", "Walk_To_Balcony_Male1", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_b_m_2].id) AND NOT peds[mpf_party_b_m_2].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_b_m_2].id, syncScene[SCENE_PARTY_B], "MISSFBI3_PARTY_B", "Walk_To_Balcony_Male2", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_b_f_1].id) AND NOT peds[mpf_party_b_f_1].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_b_f_1].id, syncScene[SCENE_PARTY_B], "MISSFBI3_PARTY_B", "Walk_To_Balcony_Female", NORMAL_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
iPartyBStage = 0
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
// GUYS SMOKING WEED TOP RIGHT
|
|
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(syncScene[SCENE_PARTY_C])
|
|
|
|
IF (NOT IS_PED_INJURED(peds[mpf_party_c_m_1].id) AND NOT peds[mpf_party_c_m_1].bFleeing)
|
|
OR (NOT IS_PED_INJURED(peds[mpf_party_c_m_2].id) AND NOT peds[mpf_party_c_m_2].bFleeing)
|
|
syncScene[SCENE_PARTY_C] = CREATE_SYNCHRONIZED_SCENE(vPartySyncCoord, vPartySyncRot)
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(syncScene[SCENE_PARTY_C], TRUE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_c_m_1].id) AND NOT peds[mpf_party_c_m_1].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_c_m_1].id, syncScene[SCENE_PARTY_C], "MISSFBI3_PARTY_C", "Marijuana_Loop_A_Male1", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_c_m_2].id) AND NOT peds[mpf_party_c_m_2].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_c_m_2].id, syncScene[SCENE_PARTY_C], "MISSFBI3_PARTY_C", "Marijuana_Loop_A_Male2", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
// GUYS ON LOWER BALCONY
|
|
IF NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_PARTY_D])
|
|
|
|
SWITCH iPartyDStage
|
|
CASE 0
|
|
IF (NOT IS_PED_INJURED(peds[mpf_party_d_m_1].id) AND NOT peds[mpf_party_d_m_1].bFleeing)
|
|
OR (NOT IS_PED_INJURED(peds[mpf_party_d_m_2].id) AND NOT peds[mpf_party_d_m_2].bFleeing)
|
|
OR (NOT IS_PED_INJURED(peds[mpf_party_d_m_3].id) AND NOT peds[mpf_party_d_m_3].bFleeing)
|
|
OR (NOT IS_PED_INJURED(peds[mpf_party_d_f_1].id) AND NOT peds[mpf_party_d_f_1].bFleeing)
|
|
syncScene[SCENE_PARTY_D] = CREATE_SYNCHRONIZED_SCENE(vPartySyncCoord, vPartySyncRot)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_d_m_1].id) AND NOT peds[mpf_party_d_m_1].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_d_m_1].id, syncScene[SCENE_PARTY_D], "MISSFBI3_PARTY_D", "Stand_Talk_Loop_A_Male1", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_d_m_2].id) AND NOT peds[mpf_party_d_m_2].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_d_m_2].id, syncScene[SCENE_PARTY_D], "MISSFBI3_PARTY_D", "Stand_Talk_Loop_A_Male2", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_d_m_3].id) AND NOT peds[mpf_party_d_m_3].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_d_m_3].id, syncScene[SCENE_PARTY_D], "MISSFBI3_PARTY_D", "Stand_Talk_Loop_A_Male3", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_d_f_1].id) AND NOT peds[mpf_party_d_f_1].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_d_f_1].id, syncScene[SCENE_PARTY_D], "MISSFBI3_PARTY_D", "Stand_Talk_Loop_A_Female", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
iPartyDStage++
|
|
BREAK
|
|
CASE 1
|
|
IF (NOT IS_PED_INJURED(peds[mpf_party_d_m_1].id) AND NOT peds[mpf_party_d_m_1].bFleeing)
|
|
OR (NOT IS_PED_INJURED(peds[mpf_party_d_m_2].id) AND NOT peds[mpf_party_d_m_2].bFleeing)
|
|
OR (NOT IS_PED_INJURED(peds[mpf_party_d_m_3].id) AND NOT peds[mpf_party_d_m_3].bFleeing)
|
|
OR (NOT IS_PED_INJURED(peds[mpf_party_d_f_1].id) AND NOT peds[mpf_party_d_f_1].bFleeing)
|
|
syncScene[SCENE_PARTY_D] = CREATE_SYNCHRONIZED_SCENE(vPartySyncCoord, vPartySyncRot)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_d_m_1].id) AND NOT peds[mpf_party_d_m_1].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_d_m_1].id, syncScene[SCENE_PARTY_D], "MISSFBI3_PARTY_D", "Walk_From_A_To_B_Male1", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_d_m_2].id) AND NOT peds[mpf_party_d_m_2].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_d_m_2].id, syncScene[SCENE_PARTY_D], "MISSFBI3_PARTY_D", "Walk_From_A_To_B_Male2", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_d_m_3].id) AND NOT peds[mpf_party_d_m_3].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_d_m_3].id, syncScene[SCENE_PARTY_D], "MISSFBI3_PARTY_D", "Walk_From_A_To_B_Male3", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_d_f_1].id) AND NOT peds[mpf_party_d_f_1].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_d_f_1].id, syncScene[SCENE_PARTY_D], "MISSFBI3_PARTY_D", "Walk_From_A_To_B_Female", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
iPartyDStage++
|
|
BREAK
|
|
CASE 2
|
|
IF (NOT IS_PED_INJURED(peds[mpf_party_d_m_1].id) AND NOT peds[mpf_party_d_m_1].bFleeing)
|
|
OR (NOT IS_PED_INJURED(peds[mpf_party_d_m_2].id) AND NOT peds[mpf_party_d_m_2].bFleeing)
|
|
OR (NOT IS_PED_INJURED(peds[mpf_party_d_m_3].id) AND NOT peds[mpf_party_d_m_3].bFleeing)
|
|
OR (NOT IS_PED_INJURED(peds[mpf_party_d_f_1].id) AND NOT peds[mpf_party_d_f_1].bFleeing)
|
|
syncScene[SCENE_PARTY_D] = CREATE_SYNCHRONIZED_SCENE(vPartySyncCoord, vPartySyncRot)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_d_m_1].id) AND NOT peds[mpf_party_d_m_1].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_d_m_1].id, syncScene[SCENE_PARTY_D], "MISSFBI3_PARTY_D", "Stand_Talk_Loop_B_Male1", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_d_m_2].id) AND NOT peds[mpf_party_d_m_2].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_d_m_2].id, syncScene[SCENE_PARTY_D], "MISSFBI3_PARTY_D", "Stand_Talk_Loop_B_Male2", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_d_m_3].id) AND NOT peds[mpf_party_d_m_3].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_d_m_3].id, syncScene[SCENE_PARTY_D], "MISSFBI3_PARTY_D", "Stand_Talk_Loop_B_Male3", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_d_f_1].id) AND NOT peds[mpf_party_d_f_1].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_d_f_1].id, syncScene[SCENE_PARTY_D], "MISSFBI3_PARTY_D", "Stand_Talk_Loop_B_Female", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
iPartyDStage++
|
|
BREAK
|
|
CASE 3
|
|
IF (NOT IS_PED_INJURED(peds[mpf_party_d_m_1].id) AND NOT peds[mpf_party_d_m_1].bFleeing)
|
|
OR (NOT IS_PED_INJURED(peds[mpf_party_d_m_2].id) AND NOT peds[mpf_party_d_m_2].bFleeing)
|
|
OR (NOT IS_PED_INJURED(peds[mpf_party_d_m_3].id) AND NOT peds[mpf_party_d_m_3].bFleeing)
|
|
OR (NOT IS_PED_INJURED(peds[mpf_party_d_f_1].id) AND NOT peds[mpf_party_d_f_1].bFleeing)
|
|
syncScene[SCENE_PARTY_D] = CREATE_SYNCHRONIZED_SCENE(vPartySyncCoord, vPartySyncRot)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_d_m_1].id) AND NOT peds[mpf_party_d_m_1].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_d_m_1].id, syncScene[SCENE_PARTY_D], "MISSFBI3_PARTY_D", "Walk_From_B_To_A_Male1", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_d_m_2].id) AND NOT peds[mpf_party_d_m_2].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_d_m_2].id, syncScene[SCENE_PARTY_D], "MISSFBI3_PARTY_D", "Walk_From_B_To_A_Male2", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_d_m_3].id) AND NOT peds[mpf_party_d_m_3].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_d_m_3].id, syncScene[SCENE_PARTY_D], "MISSFBI3_PARTY_D", "Walk_From_B_To_A_Male3", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(peds[mpf_party_d_f_1].id) AND NOT peds[mpf_party_d_f_1].bFleeing
|
|
TASK_SYNCHRONIZED_SCENE(peds[mpf_party_d_f_1].id, syncScene[SCENE_PARTY_D], "MISSFBI3_PARTY_D", "Walk_From_B_To_A_Female", INSTANT_BLEND_IN, NORMAL_BLEND_OUT)
|
|
ENDIF
|
|
iPartyDStage = 0
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
// Manage the music coming from the party based on the zoom (yes I know this isn't realistic)
|
|
fAudioZoom = (1 - (GET_GAMEPLAY_CAM_FOV() - 5) / 45)
|
|
|
|
IF fAudioZoom != fAudioZoomPreviousFrame
|
|
SET_VARIABLE_ON_STREAM("ZoomLevel", fAudioZoom)
|
|
SET_AUDIO_SCENE_VARIABLE(audsceneZoom, "apply", fAudioZoom)
|
|
fAudioZoomPreviousFrame = fAudioZoom
|
|
ENDIF
|
|
|
|
IF ePartyState != PCS_NOT_CRASHED
|
|
IF fAudioZoom != fAudioZoomPreviousFrame
|
|
SET_PED_WALLA_DENSITY(fAudioZoom/1.5, 1)
|
|
ENDIF
|
|
ELSE
|
|
SET_PED_WALLA_DENSITY(0,0)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
//PURPOSE: Checks if the party scene is ready
|
|
FUNC BOOL PARTY_IsSceneReady(BOOL bDriveToStage, BOOL bIncParty, MISSION_STAGE eStage, BOOL bDontLoadProne = FALSE, BOOL bDontLoadCoffee = FALSE)
|
|
BOOL bIsReady = TRUE
|
|
BOOL bCreatedEntityThisFrame
|
|
|
|
IF bDriveToStage
|
|
|
|
IF NOT DOES_ENTITY_EXIST(vehDriveToVeh)
|
|
|
|
IF NOT bCreatedEntityThisFrame
|
|
IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE()
|
|
|
|
CPRINTLN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() CHECKPOINT VEHICLE AVAILABLE, CREATING - MODEL HASH:", GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
|
|
|
|
IF HAS_MODEL_LOADED(GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
|
|
vehDriveToVeh = CREATE_REPLAY_CHECKPOINT_VEHICLE(vCoffeeShopCarCoord, fCoffeeShopCarHeading)
|
|
CPRINTLN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() CREATED CHECKPOINT VEHICLE")
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() locally stored vehicle model NOT LOADED")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() CHECKPOINT VEHICLE UNAVAILABLE, CREATING DAVES DEFAULT")
|
|
// Creates default vehicle, Daves blue BMW
|
|
IF CREATE_NPC_VEHICLE(vehDriveToVeh, CHAR_DAVE, vCoffeeShopCarCoord, fCoffeeShopCarHeading, TRUE)
|
|
CPRINTLN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() CREATED DAVES DEFAULT")
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() VEH Wait for next frame, already created an entity this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// create dave
|
|
IF NOT DOES_ENTITY_EXIST(pedDave)
|
|
IF NOT bCreatedEntityThisFrame
|
|
IF CREATE_NPC_PED_ON_FOOT(pedDave, CHAR_DAVE, vCoffeeShopDaveCoord, fCoffeeShopDaveHeading, FALSE)
|
|
SET_ENTITY_LOD_DIST(pedDave, 100)
|
|
SET_PED_LOD_MULTIPLIER(pedDave, 1.5)
|
|
SET_PED_CREW(pedDave)
|
|
PED_VARIATION_STRUCT sDave
|
|
sDave = GET_DAVE_VARIATIONS(TRUE)
|
|
SET_PED_VARIATIONS(pedDave, sDave)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(GET_NPC_PED_MODEL(CHAR_DAVE))
|
|
bIsReady = FALSE
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
bIsReady = FALSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() Dave NOT LOADED")
|
|
ENDIF
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() PEDDAVE Wait for next frame, already created an entity this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ELIF NOT IS_PED_INJURED(pedDave)
|
|
IF NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(pedDave)
|
|
bIsReady = FALSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() Dave variations NOT LOADED")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bDontLoadCoffee
|
|
IF DOES_ENTITY_EXIST(pedDave)
|
|
IF NOT IS_PED_IN_VEHICLE(pedDave, vehDriveToVeh, TRUE)
|
|
SET_PED_INTO_VEHICLE(pedDave, vehDriveToVeh, VS_FRONT_RIGHT)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF DOES_ENTITY_EXIST(vehDriveToVeh)
|
|
AND NOT IS_PED_INJURED(MIKE_PED_ID())
|
|
AND NOT IS_PED_INJURED(pedDave)
|
|
|
|
IF NOT DOES_ENTITY_EXIST(objs[mof_coffee_mike])
|
|
OR NOT DOES_ENTITY_EXIST(objs[mof_coffee_dave])
|
|
OR NOT DOES_ENTITY_EXIST(objs[mof_coffee_chair])
|
|
OR NOT DOES_ENTITY_EXIST(propPhoneDave)
|
|
|
|
bIsReady = FALSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() Coffee not created")
|
|
|
|
IF NOT bCreatedEntityThisFrame
|
|
IF HAS_MODEL_LOADED(P_ING_COFFEECUP_01)
|
|
AND HAS_MODEL_LOADED(PROP_NPC_PHONE)
|
|
AND HAS_MODEL_LOADED(PROP_CHAIR_01A)
|
|
objs[mof_coffee_mike] = CREATE_OBJECT(P_ING_COFFEECUP_01, GET_ENTITY_COORDS(MIKE_PED_ID()))
|
|
objs[mof_coffee_dave] = CREATE_OBJECT(P_ING_COFFEECUP_01, GET_ENTITY_COORDS(pedDave))
|
|
|
|
CREATE_MODEL_HIDE(<<-1267.62, -880.46, 10.95>>, 0.25, PROP_CHAIR_01A, TRUE)
|
|
objs[mof_coffee_chair] = CREATE_OBJECT(PROP_CHAIR_01A, <<-1267.62, -880.46, 10.95>>)
|
|
chairBlocker = ADD_SCENARIO_BLOCKING_AREA(<<-1267.62, -880.46, 10.95>> - << 10.0, 10.0, 10.0 >>, <<-1267.62, -880.46, 10.95>> + << 10.0, 10.0, 10.0 >>)
|
|
propPhoneDave = CREATE_OBJECT(PROP_NPC_PHONE, GET_ENTITY_COORDS(pedDave))
|
|
|
|
ATTACH_ENTITY_TO_ENTITY(objs[mof_coffee_mike], MIKE_PED_ID(), GET_PED_BONE_INDEX(MIKE_PED_ID(), BONETAG_PH_L_HAND), <<0,0,0>>, <<0,0,0>>, TRUE, TRUE)
|
|
ATTACH_ENTITY_TO_ENTITY(objs[mof_coffee_dave], pedDave, GET_PED_BONE_INDEX(pedDave, BONETAG_PH_R_HAND), <<0,0,0>>, <<0,0,0>>, TRUE, TRUE)
|
|
ATTACH_ENTITY_TO_ENTITY(propPhoneDave, pedDave, GET_PED_BONE_INDEX(pedDave, BONETAG_PH_L_HAND), <<0,0,0>>, <<0,0,0>>, TRUE, TRUE)
|
|
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
bIsReady = FALSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() Coffee cup, phone and chair not loaded")
|
|
ENDIF
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() CoffeeCups/Chair/Phone Wait for next frame, already created an entity this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF NOT IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_COFFEE])
|
|
|
|
IF HAS_ANIM_DICT_LOADED(adCoffee)
|
|
|
|
syncScene[SCENE_COFFEE] = CREATE_SYNCHRONIZED_SCENE(vCoffeeIGCoord, vCoffeeIGRot)
|
|
TASK_SYNCHRONIZED_SCENE(MIKE_PED_ID(), syncScene[SCENE_COFFEE], adCoffee, "002291_02_fbi_3_coffee_w_dave_idle_mic", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT)
|
|
TASK_SYNCHRONIZED_SCENE(pedDave, syncScene[SCENE_COFFEE], adCoffee, "002291_02_fbi_3_coffee_w_dave_idle_dave", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objs[mof_coffee_chair], syncScene[SCENE_COFFEE], "002291_02_fbi_3_coffee_w_dave_idle_chair", adCoffee, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, enum_to_int(SYNCED_SCENE_DONT_INTERRUPT))
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(syncScene[SCENE_COFFEE], TRUE)
|
|
|
|
VECTOR v1, v2
|
|
v1 = GET_ANIM_INITIAL_OFFSET_POSITION(adCoffee, "002291_02_fbi_3_coffee_w_dave_exit_cam", vCoffeeIGCoord, vCoffeeIGRot, 0)
|
|
v2 = GET_ANIM_INITIAL_OFFSET_ROTATION(adCoffee, "002291_02_fbi_3_coffee_w_dave_exit_cam", vCoffeeIGCoord, vCoffeeIGRot, 0)
|
|
PRINTLN( v1 )
|
|
PRINTLN( v2 )
|
|
|
|
ELSE
|
|
bIsReady = FALSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() Coffee scene anim dict not loaded")
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELIF NOT bDontLoadProne
|
|
|
|
// create dave
|
|
IF NOT DOES_ENTITY_EXIST(pedDave)
|
|
IF NOT bCreatedEntityThisFrame
|
|
IF CREATE_NPC_PED_ON_FOOT(pedDave, CHAR_DAVE, vDaveSnipeCoords, fDaveSnipeHeading, FALSE)
|
|
SET_ENTITY_LOD_DIST(pedDave, 100)
|
|
SET_PED_LOD_MULTIPLIER(pedDave, 1.5)
|
|
SET_PED_CREW(pedDave)
|
|
PED_VARIATION_STRUCT sDave
|
|
sDave = GET_DAVE_VARIATIONS(TRUE)
|
|
SET_PED_VARIATIONS(pedDave, sDave)
|
|
bIsReady = FALSE
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(GET_NPC_PED_MODEL(CHAR_DAVE))
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
bIsReady = FALSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() Dave NOT LOADED")
|
|
ENDIF
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() PEDDAVE Wait for next frame, already created an entity this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ELIF NOT IS_PED_INJURED(pedDave)
|
|
IF NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(pedDave)
|
|
bIsReady = FALSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() Dave variations NOT LOADED")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// create fake michael
|
|
IF NOT DOES_ENTITY_EXIST(pedProneMichael)
|
|
IF NOT bCreatedEntityThisFrame
|
|
IF CREATE_PLAYER_PED_ON_FOOT(pedProneMichael, CHAR_MICHAEL, vMichaelSnipeCoords, fMichaelSnipeHeading, TRUE)
|
|
INT iQueue
|
|
REPEAT COUNT_OF(g_ambientSelectorPedDeleteQueue) iQueue
|
|
IF g_ambientSelectorPedDeleteQueue[iQueue] = MIKE_PED_ID()
|
|
OR g_ambientSelectorPedDeleteQueue[iQueue] = pedProneMichael
|
|
g_ambientSelectorPedDeleteQueue[iQueue] = NULL
|
|
ENDIF
|
|
ENDREPEAT
|
|
SET_PED_CREW(pedProneMichael)
|
|
bCreatedEntityThisFrame = TRUE
|
|
bIsReady = FALSE
|
|
ELSE
|
|
bIsReady = FALSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() fakeProneMichael NOT LOADED")
|
|
ENDIF
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() PEDPRONEMIKE Wait for next frame, already created an entity this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ELIF NOT IS_PED_INJURED(pedProneMichael)
|
|
IF NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(pedProneMichael)
|
|
bIsReady = FALSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() pedProneMichael variations NOT LOADED")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bProneSetup
|
|
IF DOES_ENTITY_EXIST(pedDave)
|
|
AND DOES_ENTITY_EXIST(pedProneMichael)
|
|
AND NOT IS_PED_INJURED(pedProneMichael)
|
|
AND NOT IS_PED_INJURED(pedDave)
|
|
IF HAS_ANIM_DICT_LOADED(adSniping)
|
|
AND HAS_WEAPON_ASSET_LOADED(weapMichaelsSniper)
|
|
AND HAS_MODEL_LOADED(PROP_NPC_PHONE)
|
|
AND HAS_MODEL_LOADED(PROP_BINOC_01)
|
|
|
|
SET_ENTITY_COORDS(MIKE_PED_ID(), << -3024.7515, 332.2954, 19.3610 >>)
|
|
SET_ENTITY_ROTATION(MIKE_PED_ID(), <<0,0,76.0353>>)
|
|
SET_ENTITY_VISIBLE(MIKE_PED_ID(), FALSE)
|
|
SET_ENTITY_COLLISION(MIKE_PED_ID(), FALSE)
|
|
FREEZE_ENTITY_POSITION(MIKE_PED_ID(), TRUE)
|
|
|
|
syncScene[SCENE_SNIPE_PRONE] = CREATE_SYNCHRONIZED_SCENE(vProneCoords, vProneRotation)
|
|
|
|
TASK_SYNCHRONIZED_SCENE(pedDave, syncScene[SCENE_SNIPE_PRONE], adSniping, animProneDave, INSTANT_BLEND_IN, INSTANT_BLEND_OUT, DEFAULT, DEFAULT, DEFAULT, AIK_DISABLE_HEAD_IK )
|
|
|
|
// phone
|
|
IF DOES_ENTITY_EXIST(propPhoneDave)
|
|
IF IS_ENTITY_ATTACHED(propPhoneDave)
|
|
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(propPhoneDave, pedDave)
|
|
DETACH_ENTITY(propPhoneDave, FALSE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
propPhoneDave = CREATE_OBJECT(PROP_NPC_PHONE, GET_PED_BONE_COORDS(pedDave, BONETAG_PH_R_HAND, <<0,0,0>>))
|
|
Unload_Asset_Model(sAssetData, PROP_NPC_PHONE)
|
|
ENDIF
|
|
IF NOT IS_ENTITY_ATTACHED(propPhoneDave)
|
|
ATTACH_ENTITY_TO_ENTITY(propPhoneDave, pedDave, GET_PED_BONE_INDEX(pedDave, BONETAG_PH_R_HAND), <<0,0,0>>, <<0,0,0>>, TRUE, FALSE, FALSE)
|
|
ENDIF
|
|
|
|
// binoculars
|
|
IF DOES_ENTITY_EXIST(objs[mof_binoculars])
|
|
IF IS_ENTITY_ATTACHED(objs[mof_binoculars])
|
|
IF NOT IS_ENTITY_ATTACHED_TO_ENTITY(objs[mof_binoculars], pedDave)
|
|
DETACH_ENTITY(objs[mof_binoculars], FALSE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
objs[mof_binoculars] = CREATE_OBJECT(PROP_BINOC_01, GET_PED_BONE_COORDS(pedDave, BONETAG_PH_L_HAND, <<0,0,0>>))
|
|
ENDIF
|
|
IF NOT IS_ENTITY_ATTACHED(objs[mof_binoculars])
|
|
ATTACH_ENTITY_TO_ENTITY(objs[mof_binoculars], pedDave, GET_PED_BONE_INDEX(pedDave, BONETAG_PH_L_HAND), <<0,0,0>>, <<0,0,0>>, TRUE, FALSE, FALSE)
|
|
ENDIF
|
|
|
|
TASK_SYNCHRONIZED_SCENE(pedProneMichael, syncScene[SCENE_SNIPE_PRONE], adSniping, animProneMichael,
|
|
INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
|
|
|
|
SET_SYNCHRONIZED_SCENE_LOOPED(syncScene[SCENE_SNIPE_PRONE], TRUE)
|
|
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(pedProneMichael)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(pedDave)
|
|
|
|
PARTY_GivePedCustomSniperRifle(MIKE_PED_ID())
|
|
PARTY_GivePedCustomSniperRifle(pedProneMichael)
|
|
|
|
IF NOT IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
ENDIF
|
|
|
|
bScopeAiming = FALSE
|
|
bSnipeCamDirInit = FALSE
|
|
bProneSetup = TRUE
|
|
bIsReady = FALSE
|
|
|
|
ELSE
|
|
bIsReady = FALSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() Animation and/or phone not loaded NOT LOADED")
|
|
ENDIF
|
|
ELSE
|
|
bIsReady = FALSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady Waiting for Peds to be created first")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
IF bIncParty
|
|
|
|
IF HAS_MODEL_LOADED(mnPartyMale1)
|
|
//AND HAS_MODEL_LOADED(mnPartyMale2)
|
|
AND HAS_MODEL_LOADED(mnPartyFem)
|
|
AND HAS_ANIM_DICT_LOADED("MISSFBI3_PARTY")
|
|
AND HAS_ANIM_DICT_LOADED("MISSFBI3_PARTY_B")
|
|
AND HAS_ANIM_DICT_LOADED("MISSFBI3_PARTY_C")
|
|
AND HAS_ANIM_DICT_LOADED("MISSFBI3_PARTY_D")
|
|
AND HAS_ANIM_DICT_LOADED(adPartyGetUpFlee)
|
|
AND REQUEST_MISSION_AUDIO_BANK("FBI_03_Panic")
|
|
|
|
// coke peds
|
|
IF NOT DOES_ENTITY_EXIST(peds[mpf_party_coke_m_1].id)
|
|
IF NOT bCreatedEntityThisFrame
|
|
peds[mpf_party_coke_m_1].id = CREATE_PED(PEDTYPE_MISSION, mnPartyMale1, vPartySyncCoord + <<0.5,0,0>>, 0)
|
|
SET_PED_NAME_DEBUG(peds[mpf_party_coke_m_1].id, "COKE_M_1")
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_coke_m_1].id, PED_COMP_HEAD, 0, 1)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_coke_m_1].id, PED_COMP_HAIR, 3, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_coke_m_1].id, PED_COMP_TORSO, 2, 2)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_coke_m_1].id, PED_COMP_LEG, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_coke_m_1].id, PED_COMP_SPECIAL, 1, 0)
|
|
SET_PED_PROP_INDEX(peds[mpf_party_coke_m_1].id, ANCHOR_EYES, 0, 1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[mpf_party_coke_m_1].id, TRUE)
|
|
SET_PED_STEERS_AROUND_PEDS(peds[mpf_party_coke_m_1].id, FALSE)
|
|
SET_PED_LOD_MULTIPLIER(peds[mpf_party_coke_m_1].id, 2.5)
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() COKE_M_1 Wait for next frame, already created an entity this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
IF eStage != ST_6_REACT_TO_SECOND
|
|
AND eStage != ST_5_TORTURE_FOR_SECOND
|
|
IF NOT DOES_ENTITY_EXIST(peds[mpf_party_coke_m_3].id)
|
|
IF NOT bCreatedEntityThisFrame
|
|
peds[mpf_party_coke_m_3].id = CREATE_PED(PEDTYPE_MISSION, mnPartyMale1, vPartySyncCoord + <<0.5,0.5,0>>, 0)
|
|
SET_PED_NAME_DEBUG(peds[mpf_party_coke_m_3].id, "COKE_M_3")
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_coke_m_3].id, PED_COMP_HEAD, 1, 2)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_coke_m_3].id, PED_COMP_HAIR, 1, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_coke_m_3].id, PED_COMP_TORSO, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_coke_m_3].id, PED_COMP_LEG, 1, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_coke_m_3].id, PED_COMP_SPECIAL, 2, 0)
|
|
SET_PED_PROP_INDEX(peds[mpf_party_coke_m_3].id, ANCHOR_HEAD, 1, 0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[mpf_party_coke_m_3].id, TRUE)
|
|
SET_PED_STEERS_AROUND_PEDS(peds[mpf_party_coke_m_3].id, FALSE)
|
|
SET_PED_LOD_MULTIPLIER(peds[mpf_party_coke_m_3].id, 2.5)
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() COKE_M_3 Wait for next frame, already created an entity this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(peds[mpf_party_coke_m_5].id)
|
|
IF NOT bCreatedEntityThisFrame
|
|
peds[mpf_party_coke_m_5].id = CREATE_PED(PEDTYPE_MISSION, mnPartyMale1, vPartySyncCoord + <<0.0,-0.5,0>>, 0)
|
|
SET_PED_NAME_DEBUG(peds[mpf_party_coke_m_5].id, "COKE_M_5")
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_coke_m_5].id, PED_COMP_HEAD, 0, 2)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_coke_m_5].id, PED_COMP_HAIR, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_coke_m_5].id, PED_COMP_TORSO, 1, 2)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_coke_m_5].id, PED_COMP_LEG, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_coke_m_5].id, PED_COMP_SPECIAL, 0, 0)
|
|
SET_PED_PROP_INDEX(peds[mpf_party_coke_m_5].id, ANCHOR_HEAD, 0, 0)
|
|
SET_PED_PROP_INDEX(peds[mpf_party_coke_m_5].id, ANCHOR_EYES, 0, 1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[mpf_party_coke_m_5].id, TRUE)
|
|
SET_PED_STEERS_AROUND_PEDS(peds[mpf_party_coke_m_5].id, FALSE)
|
|
SET_PED_LOD_MULTIPLIER(peds[mpf_party_coke_m_5].id, 2.5)
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() COKE_M_5 Wait for next frame, already created an entity this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(peds[mpf_party_coke_f_1].id)
|
|
IF NOT bCreatedEntityThisFrame
|
|
peds[mpf_party_coke_f_1].id = CREATE_PED(PEDTYPE_MISSION, mnPartyFem, vPartySyncCoord + <<-0.5,0.5,0>>, 0)
|
|
SET_PED_NAME_DEBUG(peds[mpf_party_coke_f_1].id, "COKE_F_1")
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_coke_f_1].id, PED_COMP_HEAD, 0, 1)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_coke_f_1].id, PED_COMP_HAIR, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_coke_f_1].id, PED_COMP_TORSO, 1, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_coke_f_1].id, PED_COMP_LEG, 1, 1)
|
|
SET_PED_PROP_INDEX(peds[mpf_party_coke_f_1].id, ANCHOR_EYES, 0, 1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[mpf_party_coke_f_1].id, TRUE)
|
|
SET_PED_STEERS_AROUND_PEDS(peds[mpf_party_coke_f_1].id, FALSE)
|
|
SET_PED_LOD_MULTIPLIER(peds[mpf_party_coke_f_1].id, 2.5)
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() COKE_F_1 Wait for next frame, already created an entity this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// party b
|
|
IF NOT DOES_ENTITY_EXIST(peds[mpf_party_b_m_1].id) AND NOT peds[mpf_party_b_m_1].bFleeing
|
|
IF NOT bCreatedEntityThisFrame
|
|
peds[mpf_party_b_m_1].id = CREATE_PED(PEDTYPE_MISSION, mnPartyMale1, vPartySyncCoord + <<0.5,0,0>>, 0)
|
|
SET_PED_NAME_DEBUG(peds[mpf_party_b_m_1].id, "B_M_1")
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_b_m_1].id, PED_COMP_HEAD, 1, 1)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_b_m_1].id, PED_COMP_HAIR, 3, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_b_m_1].id, PED_COMP_TORSO, 2, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_b_m_1].id, PED_COMP_LEG, 0, 1)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_b_m_1].id, PED_COMP_SPECIAL, 0, 0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[mpf_party_b_m_1].id, TRUE)
|
|
SET_PED_STEERS_AROUND_PEDS(peds[mpf_party_b_m_1].id, FALSE)
|
|
SET_PED_LOD_MULTIPLIER(peds[mpf_party_b_m_1].id, 2.5)
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() B_M_1 Wait for next frame, already created an entity this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(peds[mpf_party_b_m_2].id) AND NOT peds[mpf_party_b_m_2].bFleeing
|
|
IF NOT bCreatedEntityThisFrame
|
|
peds[mpf_party_b_m_2].id = CREATE_PED(PEDTYPE_MISSION, mnPartyMale1, vPartySyncCoord + <<0.0,0.5,0>>, 0)
|
|
SET_PED_NAME_DEBUG(peds[mpf_party_b_m_2].id, "B_M_2")
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_b_m_2].id, PED_COMP_HEAD, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_b_m_2].id, PED_COMP_HAIR, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_b_m_2].id, PED_COMP_TORSO, 1, 1)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_b_m_2].id, PED_COMP_LEG, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_b_m_2].id, PED_COMP_SPECIAL, 2, 0)
|
|
SET_PED_PROP_INDEX(peds[mpf_party_b_m_2].id, ANCHOR_EYES, 1, 0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[mpf_party_b_m_2].id, TRUE)
|
|
SET_PED_STEERS_AROUND_PEDS(peds[mpf_party_b_m_2].id, FALSE)
|
|
SET_PED_LOD_MULTIPLIER(peds[mpf_party_b_m_2].id, 2.5)
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() B_M_2 Wait for next frame, already created an entity this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(peds[mpf_party_b_f_1].id) AND NOT peds[mpf_party_b_f_1].bFleeing
|
|
IF NOT bCreatedEntityThisFrame
|
|
peds[mpf_party_b_f_1].id = CREATE_PED(PEDTYPE_MISSION, mnPartyFem, vPartySyncCoord + <<-0.5,0.5,0>>, 0)
|
|
SET_PED_NAME_DEBUG(peds[mpf_party_b_f_1].id, "B_F_1")
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_b_f_1].id, PED_COMP_HEAD, 0, 1)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_b_f_1].id, PED_COMP_HAIR, 1, 2)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_b_f_1].id, PED_COMP_TORSO, 0, 2)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_b_f_1].id, PED_COMP_LEG, 0, 1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[mpf_party_b_f_1].id, TRUE)
|
|
SET_PED_STEERS_AROUND_PEDS(peds[mpf_party_b_f_1].id, FALSE)
|
|
SET_PED_LOD_MULTIPLIER(peds[mpf_party_b_f_1].id, 2.5)
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() B_F_1 Wait for next frame, already created an entity this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//party c
|
|
IF NOT DOES_ENTITY_EXIST(peds[mpf_party_c_m_1].id) AND NOT peds[mpf_party_c_m_1].bFleeing
|
|
IF NOT bCreatedEntityThisFrame
|
|
peds[mpf_party_c_m_1].id = CREATE_PED(PEDTYPE_MISSION, mnPartyMale1, vPartySyncCoord + <<0.5,0,0>>, 0)
|
|
SET_PED_NAME_DEBUG(peds[mpf_party_c_m_1].id, "C_M_1")
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_c_m_1].id, PED_COMP_HEAD, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_c_m_1].id, PED_COMP_HAIR, 1, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_c_m_1].id, PED_COMP_TORSO, 1, 2)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_c_m_1].id, PED_COMP_LEG, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_c_m_1].id, PED_COMP_SPECIAL, 0, 0)
|
|
SET_PED_PROP_INDEX(peds[mpf_party_c_m_1].id, ANCHOR_HEAD, 0, 0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[mpf_party_c_m_1].id, TRUE)
|
|
SET_PED_STEERS_AROUND_PEDS(peds[mpf_party_c_m_1].id, FALSE)
|
|
SET_PED_LOD_MULTIPLIER(peds[mpf_party_c_m_1].id, 2.5)
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() C_M_1 Wait for next frame, already created an entity this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(peds[mpf_party_c_m_2].id) AND NOT peds[mpf_party_c_m_2].bFleeing
|
|
IF NOT bCreatedEntityThisFrame
|
|
peds[mpf_party_c_m_2].id = CREATE_PED(PEDTYPE_MISSION, mnPartyMale1, vPartySyncCoord + <<0.0,0.5,0>>, 0)
|
|
SET_PED_NAME_DEBUG(peds[mpf_party_c_m_2].id, "C_M_2")
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_c_m_2].id, PED_COMP_HEAD, 1, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_c_m_2].id, PED_COMP_HAIR, 3, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_c_m_2].id, PED_COMP_TORSO, 1, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_c_m_2].id, PED_COMP_LEG, 1, 1)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_c_m_2].id, PED_COMP_SPECIAL, 1, 0)
|
|
SET_PED_PROP_INDEX(peds[mpf_party_c_m_2].id, ANCHOR_EYES, 1, 0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[mpf_party_c_m_2].id, TRUE)
|
|
SET_PED_STEERS_AROUND_PEDS(peds[mpf_party_c_m_2].id, FALSE)
|
|
SET_PED_LOD_MULTIPLIER(peds[mpf_party_c_m_2].id, 2.5)
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() C_M_2 Wait for next frame, already created an entity this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// party d
|
|
IF NOT DOES_ENTITY_EXIST(peds[mpf_party_d_m_1].id) AND NOT peds[mpf_party_d_m_1].bFleeing
|
|
IF NOT bCreatedEntityThisFrame
|
|
peds[mpf_party_d_m_1].id = CREATE_PED(PEDTYPE_MISSION, mnPartyMale1, vPartySyncCoord + <<0.5,0,0>>, 0)
|
|
SET_PED_NAME_DEBUG(peds[mpf_party_d_m_1].id, "D_M_1")
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_d_m_1].id, PED_COMP_HEAD, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_d_m_1].id, PED_COMP_HAIR, 3, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_d_m_1].id, PED_COMP_TORSO, 2, 1)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_d_m_1].id, PED_COMP_LEG, 1, 2)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_d_m_1].id, PED_COMP_SPECIAL, 0, 0)
|
|
SET_PED_PROP_INDEX(peds[mpf_party_d_m_1].id, ANCHOR_HEAD, 0, 1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[mpf_party_d_m_1].id, TRUE)
|
|
SET_PED_STEERS_AROUND_PEDS(peds[mpf_party_d_m_1].id, FALSE)
|
|
SET_PED_LOD_MULTIPLIER(peds[mpf_party_d_m_1].id, 2.5)
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() D_M_1 Wait for next frame, already created an entity this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(peds[mpf_party_d_m_2].id) AND NOT peds[mpf_party_d_m_2].bFleeing
|
|
IF NOT bCreatedEntityThisFrame
|
|
peds[mpf_party_d_m_2].id = CREATE_PED(PEDTYPE_MISSION, mnPartyMale1, vPartySyncCoord + <<0.0,0.5,0>>, 0)
|
|
SET_PED_NAME_DEBUG(peds[mpf_party_d_m_2].id, "D_M_2")
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_d_m_2].id, PED_COMP_HEAD, 0, 1)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_d_m_2].id, PED_COMP_HAIR, 1, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_d_m_2].id, PED_COMP_TORSO, 0, 1)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_d_m_2].id, PED_COMP_LEG, 1, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_d_m_2].id, PED_COMP_SPECIAL, 1, 0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[mpf_party_d_m_2].id, TRUE)
|
|
SET_PED_STEERS_AROUND_PEDS(peds[mpf_party_d_m_2].id, FALSE)
|
|
SET_PED_LOD_MULTIPLIER(peds[mpf_party_d_m_2].id, 2.5)
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() D_M_2 Wait for next frame, already created an entity this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(peds[mpf_party_d_m_3].id) AND NOT peds[mpf_party_d_m_3].bFleeing
|
|
IF NOT bCreatedEntityThisFrame
|
|
peds[mpf_party_d_m_3].id = CREATE_PED(PEDTYPE_MISSION, mnPartyMale1, vPartySyncCoord + <<0.5,0.5,0>>, 0)
|
|
SET_PED_NAME_DEBUG(peds[mpf_party_d_m_3].id, "D_M_3")
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_d_m_3].id, PED_COMP_HEAD, 1, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_d_m_3].id, PED_COMP_HAIR, 3, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_d_m_3].id, PED_COMP_TORSO, 0, 2)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_d_m_3].id, PED_COMP_LEG, 0, 1)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_d_m_3].id, PED_COMP_SPECIAL, 2, 0)
|
|
SET_PED_PROP_INDEX(peds[mpf_party_d_m_3].id, ANCHOR_EYES, 0, 1)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[mpf_party_d_m_3].id, TRUE)
|
|
SET_PED_STEERS_AROUND_PEDS(peds[mpf_party_d_m_3].id, FALSE)
|
|
SET_PED_LOD_MULTIPLIER(peds[mpf_party_d_m_3].id, 2.5)
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() D_M_3 Wait for next frame, already created an entity this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(peds[mpf_party_d_f_1].id) AND NOT peds[mpf_party_d_f_1].bFleeing
|
|
IF NOT bCreatedEntityThisFrame
|
|
peds[mpf_party_d_f_1].id = CREATE_PED(PEDTYPE_MISSION, mnPartyFem, vPartySyncCoord + <<-0.5,0.5,0>>, 0)
|
|
SET_PED_NAME_DEBUG(peds[mpf_party_d_f_1].id, "D_F_1")
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_d_f_1].id, PED_COMP_HEAD, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_d_f_1].id, PED_COMP_HAIR, 1, 1)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_d_f_1].id, PED_COMP_TORSO, 0, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_party_d_f_1].id, PED_COMP_LEG, 0, 2)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[mpf_party_d_f_1].id, TRUE)
|
|
SET_PED_STEERS_AROUND_PEDS(peds[mpf_party_d_f_1].id, FALSE)
|
|
SET_PED_LOD_MULTIPLIER(peds[mpf_party_d_f_1].id, 2.5)
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() D_F_1 Wait for next frame, already created an entity this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Setup for the target
|
|
IF NOT DOES_ENTITY_EXIST(peds[mpf_target].id)
|
|
SWITCH eStage
|
|
CASE ST_6_REACT_TO_SECOND
|
|
FALLTHRU
|
|
CASE ST_8_REACT_TO_THIRD
|
|
// Doing coke OR standing watching coke prep
|
|
IF HAS_MODEL_LOADED(mnTarget)
|
|
IF NOT bCreatedEntityThisFrame
|
|
peds[mpf_target].id = CREATE_PED(PEDTYPE_MISSION, mnTarget, vPartySyncCoord + <<0.5,0,0>>, 0)
|
|
SET_PED_STEERS_AROUND_PEDS(peds[mpf_target].id, FALSE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[mpf_target].id, TRUE)
|
|
SET_PED_NAME_DEBUG(peds[mpf_target].id, "THE TARGET")
|
|
SET_PED_LOD_MULTIPLIER(peds[mpf_target].id, 2.5)
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
CPRINTLN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() THE TARGET Wait for next frame, already created an entity this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ELSE
|
|
bIsReady = FALSE // waiting on target model and cigarette packet
|
|
ENDIF
|
|
BREAK
|
|
CASE ST_10_REACT_FINAL
|
|
// Out on the balcony smoking
|
|
IF HAS_MODEL_LOADED(mnTarget)
|
|
AND HAS_MODEL_LOADED(PROP_CS_CIGGY_01B)
|
|
AND HAS_MODEL_LOADED(P_FAG_PACKET_01_S)
|
|
AND HAS_ANIM_DICT_LOADED("MISSFBI3_PARTY_E")
|
|
IF NOT bCreatedEntityThisFrame
|
|
peds[mpf_target].id = CREATE_PED(PEDTYPE_MISSION, mnTarget, vPartySyncCoord + <<0.5,0,0>>, 0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[mpf_target].id, TRUE)
|
|
SET_PED_STEERS_AROUND_PEDS(peds[mpf_target].id, FALSE)
|
|
SET_PED_NAME_DEBUG(peds[mpf_target].id, "THE TARGET")
|
|
objs[mof_target_ciggy] = CREATE_OBJECT(PROP_CS_CIGGY_01B, GET_ENTITY_COORDS(peds[mpf_target].id))
|
|
// bug 1715362
|
|
ATTACH_ENTITY_TO_ENTITY(objs[mof_target_ciggy], peds[mpf_target].id, GET_PED_BONE_INDEX(peds[mpf_target].id, BONETAG_PH_L_HAND), <<0,0,0>>, <<0,0,0>>, DEFAULT, DEFAULT, FALSE)
|
|
//SET_ENTITY_COLLISION(objs[mof_target_ciggy], FALSE)
|
|
ptfx_Cigs[0] = START_PARTICLE_FX_LOOPED_ON_ENTITY("cs_cig_smoke", objs[mof_target_ciggy], <<0,0,0>>, <<0,0,0>>, 1.0)
|
|
objs[mof_target_packet] = CREATE_OBJECT(P_FAG_PACKET_01_S, GET_ENTITY_COORDS(peds[mpf_target].id))
|
|
ATTACH_ENTITY_TO_ENTITY(objs[mof_target_packet], peds[mpf_target].id, GET_PED_BONE_INDEX(peds[mpf_target].id, BONETAG_PH_R_HAND), <<0,0,0>>, <<0,0,0>>, DEFAULT, DEFAULT, FALSE)
|
|
SET_ENTITY_COLLISION(objs[mof_target_packet], FALSE)
|
|
SET_PED_LOD_MULTIPLIER(peds[mpf_target].id, 2.5)
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() THE TARGET Wait for next frame, already created an entity this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ELSE
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
IF HAS_MODEL_LOADED(PROP_CS_CIGGY_01B)
|
|
AND HAS_ANIM_DICT_LOADED("MISSFBI3_PARTY_E")
|
|
// decoy
|
|
IF NOT DOES_ENTITY_EXIST(peds[mpf_decoy_m].id)
|
|
//IF HAS_MODEL_LOADED(mnPartyMale2)
|
|
IF HAS_MODEL_LOADED(mnPartyMale1)
|
|
IF NOT bCreatedEntityThisFrame
|
|
peds[mpf_decoy_m].id = CREATE_PED(PEDTYPE_MISSION, mnPartyMale1, vPartySyncCoord + <<0.5,0.5,0>>, 0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_decoy_m].id, PED_COMP_HEAD, 0,0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_decoy_m].id, PED_COMP_HAIR, 0,0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_decoy_m].id, PED_COMP_TORSO, 1,0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_decoy_m].id, PED_COMP_LEG, 0,0)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_decoy_m].id, PED_COMP_SPECIAL, 0,0)
|
|
SET_PED_PROP_INDEX(peds[mpf_decoy_m].id, ANCHOR_HEAD, 1, 1)
|
|
SET_PED_NAME_DEBUG(peds[mpf_decoy_m].id, "DECOY M")
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[mpf_decoy_m].id, TRUE)
|
|
SET_PED_STEERS_AROUND_PEDS(peds[mpf_decoy_m].id, FALSE)
|
|
objs[mof_decoy_m_ciggy] = CREATE_OBJECT(PROP_CS_CIGGY_01B, GET_ENTITY_COORDS(peds[mpf_decoy_m].id))
|
|
// bug 1715362
|
|
ATTACH_ENTITY_TO_ENTITY(objs[mof_decoy_m_ciggy], peds[mpf_decoy_m].id, GET_PED_BONE_INDEX(peds[mpf_decoy_m].id, BONETAG_PH_R_HAND), <<0,0,0>>, <<0,0,0>>, DEFAULT, DEFAULT, FALSE)
|
|
//SET_ENTITY_COLLISION(objs[mof_decoy_m_ciggy], FALSE)
|
|
ptfx_Cigs[1] = START_PARTICLE_FX_LOOPED_ON_ENTITY("cs_cig_smoke", objs[mof_decoy_m_ciggy], <<0,0,0>>, <<0,0,0>>, 1.0)
|
|
SET_PED_LOD_MULTIPLIER(peds[mpf_decoy_m].id, 2.5)
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() DECOY M Wait for next frame, already created an entity this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ELSE
|
|
bIsReady = FALSE // waiting on decoy model
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// female smoker
|
|
IF NOT DOES_ENTITY_EXIST(peds[mpf_decoy_f].id)
|
|
IF NOT bCreatedEntityThisFrame
|
|
|
|
peds[mpf_decoy_f].id = CREATE_PED(PEDTYPE_MISSION, mnPartyFem, vPartySyncCoord + <<0.0,0.5,0>>, 0)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(peds[mpf_decoy_f].id, TRUE)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_decoy_f].id, PED_COMP_HEAD, 0, 1)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_decoy_f].id, PED_COMP_HAIR, 0, 1)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_decoy_f].id, PED_COMP_TORSO, 1, 2)
|
|
SET_PED_COMPONENT_VARIATION(peds[mpf_decoy_f].id, PED_COMP_LEG, 1, 1)
|
|
SET_PED_PROP_INDEX(peds[mpf_decoy_f].id, ANCHOR_EYES, 1, 0)
|
|
SET_PED_NAME_DEBUG(peds[mpf_decoy_f].id, "DECOY F")
|
|
SET_PED_STEERS_AROUND_PEDS(peds[mpf_decoy_f].id, FALSE)
|
|
objs[mof_decoy_f_ciggy] = CREATE_OBJECT(PROP_CS_CIGGY_01B, GET_ENTITY_COORDS(peds[mpf_decoy_f].id))
|
|
// bug 1715362
|
|
ATTACH_ENTITY_TO_ENTITY(objs[mof_decoy_f_ciggy], peds[mpf_decoy_f].id, GET_PED_BONE_INDEX(peds[mpf_decoy_f].id, BONETAG_PH_L_HAND), <<0,0,0>>, <<0,0,0>>, DEFAULT, DEFAULT, FALSE)
|
|
//SET_ENTITY_COLLISION(objs[mof_decoy_f_ciggy], FALSE)
|
|
ptfx_Cigs[2] = START_PARTICLE_FX_LOOPED_ON_ENTITY("cs_cig_smoke", objs[mof_decoy_f_ciggy], <<0,0,0>>, <<0,0,0>>, 1.0)
|
|
SET_PED_LOD_MULTIPLIER(peds[mpf_decoy_f].id, 2.5)
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() DECOY F Wait for next frame, already created an entity this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
bIsReady = FALSE // not ready waiting on cigarette and anim dictionary
|
|
ENDIF
|
|
|
|
ELSE
|
|
bIsReady = FALSE // waiting on party ped male, female, and the party anims
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(objs[mof_coffee_table])
|
|
IF HAS_MODEL_LOADED(PROP_FBI3_COFFEE_TABLE)
|
|
IF NOT bCreatedEntityThisFrame
|
|
objs[mof_coffee_table] = CREATE_OBJECT_NO_OFFSET(PROP_FBI3_COFFEE_TABLE, <<-3099.3064, 342.8378, 13.5146>>)
|
|
SET_ENTITY_ROTATION(objs[mof_coffee_table], <<-0.0000, 0.0000, 75.3550>>)
|
|
bCreatedEntityThisFrame = TRUE
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady() mof_coffee_table Wait for next frame, already created an entity this frame")
|
|
bIsReady = FALSE
|
|
ENDIF
|
|
ELSE
|
|
bIsReady = FALSE // waiting on table model to load
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bIsReady
|
|
SET_AUDIO_FLAG("DisableReplayScriptStreamRecording", FALSE)
|
|
PARTY_ManagePartyScene()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CPRINTLN(DEBUG_MIKE, "PARTY_IsSnipingSceneReady(
|
|
BOOL bDriveToStage: ", bDriveToStage, ",
|
|
BOOL bIncParty: ", bIncParty, ",
|
|
MISSION_STAGE eStage: ", eStage, ",
|
|
BOOL bDontLoadProne: ", bDontLoadProne, ",
|
|
BOOL bDontLoadCoffee: ", bDontLoadCoffee,")
|
|
return: ", bIsReady)
|
|
|
|
RETURN bIsReady
|
|
ENDFUNC
|
|
|
|
//PURPOSE: Manages michael's zooming in and out also restricting the view through the scope
|
|
PROC PARTY_ManageProneAndScope()
|
|
BOOL bCorrectGameplayCam = FALSE
|
|
|
|
DISPLAY_RADAR(FALSE)
|
|
DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE()
|
|
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() //Fix for bug 2175240
|
|
|
|
WEAPON_TYPE weapMike
|
|
IF GET_CURRENT_PED_WEAPON(MIKE_PED_ID(), weapMike)
|
|
IF weapMike != weapMichaelsSniper
|
|
SET_CURRENT_PED_WEAPON(MIKE_PED_ID(), weapMichaelsSniper, TRUE)
|
|
ELSE
|
|
IF GET_AMMO_IN_PED_WEAPON(MIKE_PED_ID(), weapMichaelsSniper) <= 10
|
|
SET_PED_AMMO(MIKE_PED_ID(), weapMichaelsSniper, 20)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
weapMike = WEAPONTYPE_UNARMED
|
|
IF DOES_ENTITY_EXIST(pedProneMichael)
|
|
AND NOT IS_PED_INJURED(pedProneMichael)
|
|
IF GET_CURRENT_PED_WEAPON(pedProneMichael, weapMike)
|
|
|
|
IF weapMike != weapMichaelsSniper
|
|
SET_CURRENT_PED_WEAPON(pedProneMichael, weapMichaelsSniper, TRUE)
|
|
ENDIF
|
|
|
|
weapMike = WEAPONTYPE_UNARMED
|
|
IF GET_CURRENT_PED_WEAPON(pedProneMichael, weapMike)
|
|
IF weapMike = weapMichaelsSniper
|
|
ENTITY_INDEX tempEntity = GET_CURRENT_PED_WEAPON_ENTITY_INDEX(pedProneMichael)
|
|
|
|
IF DOES_ENTITY_EXIST(tempEntity)
|
|
REQUEST_WEAPON_HIGH_DETAIL_MODEL(GET_OBJECT_INDEX_FROM_ENTITY_INDEX(tempEntity))
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
// AIMING
|
|
IF bScopeAiming
|
|
IF NOT IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_AIM)
|
|
OR IS_SELECTOR_ONSCREEN()
|
|
OR bMissionFailed
|
|
CDEBUG2LN(DEBUG_MIKE,"AIMING STATE: Trigger NOT Pressed")
|
|
|
|
SET_ENTITY_VISIBLE(MIKE_PED_ID(), FALSE)
|
|
SET_ENTITY_COLLISION(MIKE_PED_ID(), FALSE)
|
|
//HIDE_PED_WEAPON_FOR_SCRIPTED_CUTSCENE(MIKE_PED_ID(), TRUE)
|
|
SET_PED_CURRENT_WEAPON_VISIBLE(MIKE_PED_ID(), FALSE, FALSE)
|
|
|
|
setupSwayCam(sSwaySniping, vProneCamStartCoord, vProneCamStartRot, fProneCamStartFOV,
|
|
vProneCamEndCoord, vProneCamEndRot, fProneCamEndFOV,
|
|
40000, TRUE, shakeHand, 0.5, "SNIPE")
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
|
|
SET_MICROPHONE_POSITION(FALSE, <<0,0,0>>, <<0,0,0>>, <<0,0,0>>)
|
|
USE_SCRIPT_CAM_FOR_AMBIENT_POPULATION_ORIGIN_THIS_FRAME(TRUE, TRUE)
|
|
bScopeAiming = FALSE
|
|
ELSE
|
|
CDEBUG2LN(DEBUG_MIKE,"AIMING STATE: Trigger Pressed")
|
|
|
|
IF eMissionStage = ST_10_REACT_FINAL
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FBI_3_MICHAEL_SNIPER_SCOPE_TARGET")
|
|
START_AUDIO_SCENE("FBI_3_MICHAEL_SNIPER_SCOPE_TARGET")
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FBI_3_MICHAEL_SNIPER_SCOPE")
|
|
START_AUDIO_SCENE("FBI_3_MICHAEL_SNIPER_SCOPE")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// IF IS_AUDIO_SCENE_ACTIVE("FBI_3_MICHAEL_VANTAGE_POINT_1")
|
|
// STOP_AUDIO_SCENE("FBI_3_MICHAEL_VANTAGE_POINT_1")
|
|
// ENDIF
|
|
// IF IS_AUDIO_SCENE_ACTIVE("FBI_3_MICHAEL_VANTAGE_POINT_2")
|
|
// STOP_AUDIO_SCENE("FBI_3_MICHAEL_VANTAGE_POINT_2")
|
|
// ENDIF
|
|
// IF IS_AUDIO_SCENE_ACTIVE("FBI_3_MICHAEL_VANTAGE_POINT_3")
|
|
// STOP_AUDIO_SCENE("FBI_3_MICHAEL_VANTAGE_POINT_3")
|
|
// ENDIF
|
|
|
|
VECTOR v_FirstPersonCamRot
|
|
v_FirstPersonCamRot = GET_FINAL_RENDERED_CAM_ROT()
|
|
|
|
FLOAT fXDiff
|
|
fXDiff = ABSF(v_FirstPersonCamRot.x - v_FirstPersonCamRotPrev.x)/TIMESTEP()
|
|
FLOAT fZDiff
|
|
fZDiff = ABSF(v_FirstPersonCamRot.z - v_FirstPersonCamRotPrev.z)/TIMESTEP()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
debug_v_scope_cam_rot = v_FirstPersonCamRot
|
|
debug_f_scope_speed_x = fXDiff
|
|
debug_f_scope_speed_z = fZDiff
|
|
debug_f_scope_zoom = GET_FIRST_PERSON_AIM_CAM_ZOOM_FACTOR()
|
|
#ENDIF
|
|
|
|
|
|
IF DOES_ENTITY_EXIST(peds[mpf_target].id)
|
|
AND NOT IS_PED_INJURED(peds[mpf_target].id)
|
|
AND (IS_POINT_IN_SCREEN_AREA(GET_ENTITY_COORDS(peds[mpf_target].id), 0.4, 0.4, 0.6, 0.6)
|
|
OR IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), peds[mpf_target].id))
|
|
AND GET_FIRST_PERSON_AIM_CAM_ZOOM_FACTOR() >= F_ZOOM_SCOPE_CHECK
|
|
AND fXDiff < 1.5
|
|
AND fZDiff < 1.5
|
|
IF iAimTimer = -1
|
|
iAimTimer = GET_GAME_TIMER() + 1000
|
|
ENDIF
|
|
ELSE
|
|
iAimTimer = -1
|
|
ENDIF
|
|
|
|
IF iAimTimer != -1
|
|
AND GET_GAME_TIMER() > iAimTimer
|
|
bAimingAtTheTarget = TRUE
|
|
ELSE
|
|
bAimingAtTheTarget = FALSE
|
|
ENDIF
|
|
|
|
v_FirstPersonCamRotPrev = v_FirstPersonCamRot
|
|
|
|
bCorrectGameplayCam = TRUE
|
|
ENDIF
|
|
|
|
// NOT AIMING
|
|
ELSE
|
|
|
|
IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_AIM)
|
|
AND NOT IS_SELECTOR_ONSCREEN()
|
|
AND NOT bMissionFailed
|
|
|
|
SET_PLAYER_FORCED_AIM(PLAYER_ID(), TRUE)
|
|
|
|
IF iAttemptToAimTimer = -1
|
|
iAttemptToAimTimer = GET_GAME_TIMER() + 32000
|
|
ENDIF
|
|
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
SET_MICROPHONE_POSITION(TRUE, GET_ENTITY_COORDS(pedProneMichael), GET_ENTITY_COORDS(pedProneMichael), GET_ENTITY_COORDS(pedProneMichael))
|
|
bCorrectGameplayCam = TRUE
|
|
bScopeAiming = TRUE
|
|
ELSE
|
|
// Hide the player if not already done so at this stage
|
|
SET_ENTITY_VISIBLE(MIKE_PED_ID(), FALSE)
|
|
SET_ENTITY_COLLISION(MIKE_PED_ID(), FALSE)
|
|
SET_PED_CURRENT_WEAPON_VISIBLE(MIKE_PED_ID(), FALSE, FALSE)
|
|
|
|
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_LOOK_LR)
|
|
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_LOOK_UD)
|
|
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_ATTACK)
|
|
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_ATTACK2)
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("FBI_3_MICHAEL_SNIPER_SCOPE")
|
|
STOP_AUDIO_SCENE("FBI_3_MICHAEL_SNIPER_SCOPE")
|
|
ENDIF
|
|
IF IS_AUDIO_SCENE_ACTIVE("FBI_3_MICHAEL_SNIPER_SCOPE_TARGET")
|
|
STOP_AUDIO_SCENE("FBI_3_MICHAEL_SNIPER_SCOPE_TARGET")
|
|
ENDIF
|
|
|
|
USE_SCRIPT_CAM_FOR_AMBIENT_POPULATION_ORIGIN_THIS_FRAME(TRUE, TRUE)
|
|
|
|
doSwayCam(sSwaySniping)
|
|
ENDIF
|
|
|
|
bAimingAtTheTarget = FALSE
|
|
ENDIF
|
|
|
|
|
|
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_SELECT_WEAPON)
|
|
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_SELECT_NEXT_WEAPON)
|
|
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_SELECT_PREV_WEAPON)
|
|
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_PHONE)
|
|
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_LOOK_BEHIND)
|
|
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_JUMP)
|
|
|
|
IF NOT IS_CHEAT_DISABLED(CHEAT_TYPE_ALL)
|
|
DISABLE_CHEAT(CHEAT_TYPE_ALL, TRUE)
|
|
ENDIF
|
|
|
|
SET_PED_NO_TIME_DELAY_BEFORE_SHOT(MIKE_PED_ID())
|
|
|
|
// Corrects the aim
|
|
IF bCorrectGameplayCam
|
|
FLOAT f_gcam_heading = GET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
FLOAT f_gcam_pitch = GET_GAMEPLAY_CAM_RELATIVE_PITCH()
|
|
|
|
CONST_FLOAT F_SNIPE_CAM_HEADING_DEFAULT 1.072
|
|
CONST_FLOAT F_SNIPE_CAM_PITCH_DEFAULT -7.008
|
|
|
|
CONST_FLOAT F_SNIPE_CAM_HEADING_MIN -13.920
|
|
CONST_FLOAT F_SNIPE_CAM_HEADING_MAX 15.755
|
|
CONST_FLOAT F_SNIPE_CAM_PITCH_MIN -12.941
|
|
CONST_FLOAT F_SNIPE_CAM_PITCH_MAX -1.999
|
|
|
|
IF bSnipeCamDirInit = FALSE
|
|
IF (f_gcam_heading <= F_SNIPE_CAM_HEADING_DEFAULT - 1.0 OR f_gcam_heading >= F_SNIPE_CAM_HEADING_DEFAULT + 1.0)
|
|
OR (f_gcam_pitch <= F_SNIPE_CAM_PITCH_DEFAULT - 1.0 OR f_gcam_pitch >= F_SNIPE_CAM_PITCH_DEFAULT + 1.0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(F_SNIPE_CAM_HEADING_DEFAULT)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(F_SNIPE_CAM_PITCH_DEFAULT)
|
|
ELSE
|
|
bSnipeCamDirInit = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_ENTITY_HEADING(MIKE_PED_ID(), 76.0353)
|
|
|
|
// Limits the movement of the scope to be locked within a certain range
|
|
SET_FIRST_PERSON_AIM_CAM_RELATIVE_HEADING_LIMITS_THIS_UPDATE(F_SNIPE_CAM_HEADING_MIN,F_SNIPE_CAM_HEADING_MAX)
|
|
SET_FIRST_PERSON_AIM_CAM_RELATIVE_PITCH_LIMITS_THIS_UPDATE(F_SNIPE_CAM_PITCH_MIN,F_SNIPE_CAM_PITCH_MAX)
|
|
SET_FIRST_PERSON_AIM_CAM_ZOOM_FACTOR_LIMITS_THIS_UPDATE(F_SNIPE_CAM_ZOOM_MIN, 10.0)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// PURPOSE: Manages the havoc when theplayers attempts a shot at the party
|
|
PROC PARTY_ManagePartyCrashed()
|
|
|
|
MISSION_PED_FLAGS x
|
|
|
|
IF ePartyState != PCS_NOT_CRASHED
|
|
FOR x = mpf_party_coke_m_1 TO mpf_target
|
|
IF DOES_ENTITY_EXIST(peds[x].id)
|
|
AND NOT IS_PED_INJURED(peds[x].id)
|
|
VECTOR vPedPos = GET_ENTITY_COORDS(peds[x].id)
|
|
|
|
IF NOT peds[x].bFleeing
|
|
IF vPedPos.z > 13.5
|
|
OPEN_SEQUENCE_TASK(seqSequence)
|
|
SWITCH x
|
|
CASE mpf_party_coke_m_1
|
|
TASK_PLAY_ANIM_ADVANCED(null, adPartyGetUpFlee, "Shot_Reaction_Male1", vPartySyncCoord, vPartySyncRot, NORMAL_BLEND_IN, WALK_BLEND_OUT, -1, AF_EXTRACT_INITIAL_OFFSET | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION)
|
|
BREAK
|
|
CASE mpf_party_coke_m_3
|
|
TASK_PLAY_ANIM_ADVANCED(null, adPartyGetUpFlee, "Shot_Reaction_Male3", vPartySyncCoord, vPartySyncRot, NORMAL_BLEND_IN, WALK_BLEND_OUT, -1, AF_EXTRACT_INITIAL_OFFSET | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION)
|
|
BREAK
|
|
CASE mpf_party_coke_m_5
|
|
TASK_PLAY_ANIM_ADVANCED(null, adPartyGetUpFlee, "Shot_Reaction_Male5", vPartySyncCoord, vPartySyncRot, NORMAL_BLEND_IN, WALK_BLEND_OUT, -1, AF_EXTRACT_INITIAL_OFFSET | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION)
|
|
BREAK
|
|
CASE mpf_party_coke_f_1
|
|
TASK_PLAY_ANIM_ADVANCED(null, adPartyGetUpFlee, "Shot_Reaction_Female", vPartySyncCoord, vPartySyncRot, NORMAL_BLEND_IN, WALK_BLEND_OUT, -1, AF_EXTRACT_INITIAL_OFFSET | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION)
|
|
BREAK
|
|
CASE mpf_target
|
|
SWITCH eMissionStage
|
|
CASE ST_6_REACT_TO_SECOND
|
|
TASK_PLAY_ANIM_ADVANCED(null, adPartyGetUpFlee, "Shot_Reaction_Male3", vPartySyncCoord, vPartySyncRot, NORMAL_BLEND_IN, WALK_BLEND_OUT, -1, AF_EXTRACT_INITIAL_OFFSET | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION)
|
|
BREAK
|
|
CASE ST_8_REACT_TO_THIRD
|
|
TASK_PLAY_ANIM_ADVANCED(null, adPartyGetUpFlee, "Shot_Reaction_Male2", vPartySyncCoord, vPartySyncRot, NORMAL_BLEND_IN, WALK_BLEND_OUT, -1, AF_EXTRACT_INITIAL_OFFSET | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION)
|
|
BREAK
|
|
ENDSWITCH
|
|
BREAK
|
|
ENDSWITCH
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(null, << -3111.2844, 352.5119, 13.4585 >>, PEDMOVE_RUN)
|
|
CLOSE_SEQUENCE_TASK(seqSequence)
|
|
TASK_PERFORM_SEQUENCE(peds[x].id, seqSequence)
|
|
CLEAR_SEQUENCE_TASK(seqSequence)
|
|
|
|
ELIF vPedPos.z <= 13.5
|
|
TASK_FOLLOW_NAV_MESH_TO_COORD(peds[x].id, << -3106.1372, 347.9758, 9.8209 >>, PEDMOVE_RUN)
|
|
ENDIF
|
|
|
|
peds[x].bFleeing = TRUE
|
|
ELSE
|
|
IF vPedPos.z > 13.5
|
|
IF IS_ENTITY_IN_ANGLED_AREA(peds[x].id, <<-3110.091064,355.796783,13.458379>>, <<-3113.502930,343.224304,16.231632>>, 6.812500)
|
|
DELETE_PED(peds[x].id)
|
|
ENDIF
|
|
ELIF vPedPos.z <= 13.5
|
|
IF IS_ENTITY_IN_ANGLED_AREA(peds[x].id, <<-3106.898193,346.120392,9.820868>>, <<-3104.993408,353.235138,13.080032>>, 6.812500)
|
|
DELETE_PED(peds[x].id)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
INT y
|
|
REPEAT COUNT_OF(ptfx_Cigs) y
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfx_Cigs[y])
|
|
STOP_PARTICLE_FX_LOOPED(ptfx_Cigs[y])
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
SWITCH ePartyState
|
|
CASE PCS_NOT_CRASHED
|
|
|
|
FOR x = mpf_party_coke_m_1 TO mpf_target
|
|
|
|
IF DOES_ENTITY_EXIST(peds[x].id)
|
|
|
|
// Ped was killed
|
|
IF IS_PED_INJURED(peds[x].id)
|
|
|
|
IF x = mpf_target
|
|
ePartyState = PCS_TARGET_DOWN
|
|
ELSE
|
|
IF GET_ENTITY_MODEL(peds[x].id) = mnPartyFem
|
|
ePartyState = PCS_KILLED_INNOCENT_FEMALE
|
|
ELSE
|
|
ePartyState = PCS_KILLED_INNOCENT_MALE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
i_mission_substage = 0
|
|
|
|
ELSE
|
|
// Missed shot, spooked the peds
|
|
IF HAS_PED_RECEIVED_EVENT(peds[x].id, EVENT_SHOT_FIRED)
|
|
OR HAS_PED_RECEIVED_EVENT(peds[x].id, EVENT_SHOT_FIRED_BULLET_IMPACT)
|
|
OR HAS_PED_RECEIVED_EVENT(peds[x].id, EVENT_SHOT_FIRED_WHIZZED_BY)
|
|
ePartyState = PCS_MISSED_SHOT
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
i_mission_substage = 0
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
// Start panic walla from party
|
|
IF ePartyState != PCS_NOT_CRASHED
|
|
FORCE_PED_PANIC_WALLA()
|
|
PLAY_SOUND_FROM_COORD(-1, "Party_panic", <<-3094.6677, 347.2250, 13.4458>>, "FBI_03_Torture_Sounds")
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE PCS_MISSED_SHOT
|
|
// Check if the player has killed an innocent or the target
|
|
FOR x = mpf_party_coke_m_1 TO mpf_target
|
|
IF DOES_ENTITY_EXIST(peds[x].id)
|
|
IF IS_PED_INJURED(peds[x].id)
|
|
IF x = mpf_target
|
|
ePartyState = PCS_TARGET_DOWN
|
|
ELSE
|
|
IF GET_ENTITY_MODEL(peds[x].id) = mnPartyFem
|
|
ePartyState = PCS_KILLED_INNOCENT_FEMALE
|
|
ELSE
|
|
ePartyState = PCS_KILLED_INNOCENT_MALE
|
|
ENDIF
|
|
ENDIF
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
i_mission_substage = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
BREAK
|
|
CASE PCS_KILLED_INNOCENT_MALE
|
|
// Swap to killed female
|
|
FOR x = mpf_party_coke_m_1 TO mpf_target
|
|
IF DOES_ENTITY_EXIST(peds[x].id)
|
|
IF IS_PED_INJURED(peds[x].id)
|
|
IF x != mpf_target
|
|
IF GET_ENTITY_MODEL(peds[x].id) = mnPartyFem
|
|
ePartyState = PCS_KILLED_INNOCENT_FEMALE
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
i_mission_substage = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
BREAK
|
|
CASE PCS_KILLED_INNOCENT_FEMALE
|
|
|
|
BREAK
|
|
CASE PCS_TARGET_DOWN
|
|
// Check if the player has killed an innocent or the target
|
|
FOR x = mpf_party_coke_m_1 TO mpf_target
|
|
IF DOES_ENTITY_EXIST(peds[x].id)
|
|
IF IS_PED_INJURED(peds[x].id)
|
|
IF x != mpf_target
|
|
IF GET_ENTITY_MODEL(peds[x].id) = mnPartyFem
|
|
ePartyState = PCS_KILLED_INNOCENT_FEMALE
|
|
ELSE
|
|
ePartyState = PCS_KILLED_INNOCENT_MALE
|
|
ENDIF
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
i_mission_substage = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL PARTY_HasTargetBeenSuccessfullyKilled()
|
|
|
|
IF ePartyState != PCS_NOT_CRASHED
|
|
SWITCH i_mission_substage
|
|
CASE 0
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
|
|
IF IS_CUTSCENE_ACTIVE()
|
|
REMOVE_CUTSCENE()
|
|
ENDIF
|
|
|
|
SWITCH ePartyState
|
|
CASE PCS_TARGET_DOWN
|
|
IF ARE_STRINGS_EQUAL(strMrKCSHandle, csMrK_TL)
|
|
SET_CUTSCENE_AUDIO_OVERRIDE("_TOOTHLESS")
|
|
ENDIF
|
|
REQUEST_CUTSCENE("fbi_3_mcs_7")
|
|
CPRINTLN(DEBUG_MIKE, "PARTY_HasTargetBeenSuccessfullyKilled() requesting MCS_7")
|
|
Register_Torture_Ped_Variations_For_Cutscene_Prestreaming(FALSE, FALSE, strMrKCSHandle)
|
|
|
|
IF bTargetHasBeenIDed
|
|
RunConversation("F3_KTARGET")
|
|
i_mission_substage = 3
|
|
ELSE
|
|
RunConversation("F3_RIGHTONE")
|
|
i_mission_substage = 301
|
|
ENDIF
|
|
BREAK
|
|
CASE PCS_MISSED_SHOT
|
|
IF bTargetHasBeenIDed
|
|
RunConversation("F3_SPOOKEDa")
|
|
eMissionFail = FAIL_PARTY_SPOOKED
|
|
i_mission_substage = 101
|
|
ELSE
|
|
RunConversation("F3_SPOOKEDe")
|
|
eMissionFail = FAIL_PARTY_SPOOKED
|
|
i_mission_substage = 2
|
|
ENDIF
|
|
BREAK
|
|
CASE PCS_KILLED_INNOCENT_MALE
|
|
IF bTargetHasBeenIDed
|
|
RunConversation("F3_WRNGM2")
|
|
eMissionFail = FAIL_PARTY_PED_DEAD_INNOCENT
|
|
i_mission_substage = 2
|
|
ELSE
|
|
RunConversation("F3_KILLWRNGM")
|
|
eMissionFail = FAIL_PARTY_PED_DEAD_INNOCENT_NO_ID
|
|
i_mission_substage = 2
|
|
ENDIF
|
|
BREAK
|
|
CASE PCS_KILLED_INNOCENT_FEMALE
|
|
RunConversation("F3_KILLWRNGF")
|
|
eMissionFail = FAIL_PARTY_PED_DEAD_INNOCENT
|
|
i_mission_substage = 2
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ELIF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
ENDIF
|
|
BREAK
|
|
CASE 101
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
IF ePartyState != PCS_TARGET_DOWN
|
|
IF NOT DOES_ENTITY_EXIST(peds[mpf_target].id)
|
|
RunConversation("F3_SPOOKEDb")
|
|
i_mission_substage = 2
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
|
|
// FAIL
|
|
CASE 2
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
bMissionFailed = TRUE
|
|
ENDIF
|
|
BREAK
|
|
|
|
// SUCCESS
|
|
CASE 301
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
RunConversation("F3_TELLSTEVE")
|
|
i_mission_substage = 3
|
|
ENDIF
|
|
BREAK
|
|
CASE 3
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
bSafeToSwitch = TRUE
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
//PURPOSE: Cleans up all the party and the sniping stuff
|
|
PROC PARTY_CleanupEntitiesAndAssets(BOOL bDontCleanupDrive = FALSE)
|
|
|
|
IF NOT bDontCleanupDrive
|
|
IF DOES_ENTITY_EXIST(MIKE_PED_ID())
|
|
AND NOT IS_PED_INJURED(MIKE_PED_ID())
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(MIKE_PED_ID())
|
|
FREEZE_ENTITY_POSITION(MIKE_PED_ID(), TRUE)
|
|
ENDIF
|
|
SET_ENTITY_INVINCIBLE(MIKE_PED_ID(), TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
DESTROY_SYNCHRONIZED_SCENE(syncScene[SCENE_COFFEE])
|
|
DESTROY_SYNCHRONIZED_SCENE(syncScene[SCENE_SNIPE_PRONE])
|
|
DESTROY_SYNCHRONIZED_SCENE(syncScene[SCENE_PARTY_A])
|
|
DESTROY_SYNCHRONIZED_SCENE(syncScene[SCENE_PARTY_B])
|
|
DESTROY_SYNCHRONIZED_SCENE(syncScene[SCENE_PARTY_C])
|
|
DESTROY_SYNCHRONIZED_SCENE(syncScene[SCENE_PARTY_D])
|
|
|
|
Unload_Asset_Model(sAssetData, mnPartyMale1)
|
|
Unload_Asset_Model(sAssetData, mnPartyFem)
|
|
Unload_Asset_Model(sAssetData, mnTarget)
|
|
//Unload_Asset_Model(sAssetData, mnPartyMale2)
|
|
Unload_Asset_Model(sAssetData, PROP_CS_CIGGY_01B)
|
|
Unload_Asset_Model(sAssetData, P_FAG_PACKET_01_S)
|
|
Unload_Asset_Model(sAssetData, P_ING_COFFEECUP_01)
|
|
Unload_Asset_Model(sAssetData, PROP_NPC_PHONE)
|
|
Unload_Asset_Model(sAssetData, PROP_CHAIR_01A)
|
|
Unload_Asset_Model(sAssetData, PROP_FBI3_COFFEE_TABLE)
|
|
Unload_Asset_Model(sAssetData, PROP_BINOC_01)
|
|
|
|
Unload_Asset_Anim_Dict(sAssetData, adCoffee)
|
|
Unload_Asset_Anim_Dict(sAssetData, adSniping)
|
|
Unload_Asset_Anim_Dict(sAssetData, "MISSFBI3_PARTY")
|
|
Unload_Asset_Anim_Dict(sAssetData, "MISSFBI3_PARTY_B")
|
|
Unload_Asset_Anim_Dict(sAssetData, "MISSFBI3_PARTY_C")
|
|
Unload_Asset_Anim_Dict(sAssetData, "MISSFBI3_PARTY_D")
|
|
Unload_Asset_Anim_Dict(sAssetData, "MISSFBI3_PARTY_E")
|
|
Unload_Asset_Anim_Dict(sAssetData, adPartyGetUpFlee)
|
|
|
|
Unload_Asset_Weapon_Asset(sAssetData, weapMichaelsSniper)
|
|
|
|
Unload_Asset_Audio_Bank(sAssetData, "FBI_03_Panic")
|
|
|
|
INT z
|
|
REPEAT COUNT_OF(ptfx_Cigs) z
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfx_Cigs[z])
|
|
STOP_PARTICLE_FX_LOOPED(ptfx_Cigs[z])
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF NOT bDontCleanupDrive
|
|
TidyUpVehicle(vehDriveToVeh, TRUE)
|
|
TidyUpPed(pedDave, TRUE)
|
|
ENDIF
|
|
TidyUpPed(pedProneMichael, TRUE)
|
|
TidyUpObject(propPhoneDave, TRUE)
|
|
|
|
MISSION_OBJECT_FLAGS y
|
|
FOR y = mof_target_ciggy TO mof_binoculars
|
|
TidyUpObject(objs[y], TRUE)
|
|
ENDFOR
|
|
|
|
MISSION_PED_FLAGS x
|
|
FOR x = mpf_party_coke_m_1 TO mpf_target
|
|
TidyUpPed(peds[x].id, TRUE)
|
|
ENDFOR
|
|
|
|
IF bPlayingMusic
|
|
STOP_AUDIO_SCENE(audsceneZoom)
|
|
STOP_STREAM()
|
|
bPlayingMusic = FALSE
|
|
ENDIF
|
|
|
|
IF chairBlocker != NULL
|
|
REMOVE_SCENARIO_BLOCKING_AREA(chairBlocker)
|
|
ENDIF
|
|
|
|
IF IS_CHEAT_DISABLED(CHEAT_TYPE_ALL)
|
|
DISABLE_CHEAT(CHEAT_TYPE_ALL, FALSE)
|
|
ENDIF
|
|
|
|
bProneSetup = FALSE
|
|
ENDPROC
|
|
|
|
|
|
//PURPOSE: Handles the switch from the free roaming before the mission starts to the torture loctation
|
|
FUNC BOOL SWITCH_Free_Roam_To_Torture()
|
|
IF NOT bMadeSelection
|
|
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
|
|
OR GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), <<128.64, -2200.98, 5.03>>) < 80.0
|
|
bDisplaySwitchHUD = FALSE
|
|
ELSE
|
|
bDisplaySwitchHUD = TRUE
|
|
g_sSelectorUI.bFX_SkipFadeOut = FALSE
|
|
IF NOT UPDATE_SELECTOR_HUD(sSelectorPeds, TRUE, TRUE)
|
|
IF bStartedAsMichael
|
|
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_TREVOR, TRUE)
|
|
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE)
|
|
ELSE
|
|
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE)
|
|
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, TRUE)
|
|
ENDIF
|
|
ELSE
|
|
IF bStartedAsMichael
|
|
cam_establish = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<116.5, -2184.8, 7.5>>, <<2.2, 0.1, -147.7>>, 39.5, TRUE)
|
|
SHAKE_CAM(cam_establish, "HAND_SHAKE", 0.4)
|
|
ELSE
|
|
cam_establish = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<122.2,-2182.5, 6.2>>,<<8.2, 0.9,-149.4>>, 39.9, TRUE)
|
|
SHAKE_CAM(cam_establish, "HAND_SHAKE", 0.4)
|
|
ENDIF
|
|
|
|
sCamDetails.pedTo = sSelectorPeds.pedID[sSelectorPeds.eNewSelectorPed]
|
|
sCamDetails.camTo = cam_establish
|
|
bMadeSelection = TRUE
|
|
i_EstablishHoldTimer = -1
|
|
clearText()
|
|
|
|
CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
SET_MAX_WANTED_LEVEL(0)
|
|
|
|
IF IS_CUTSCENE_ACTIVE()
|
|
REMOVE_CUTSCENE()
|
|
ENDIF
|
|
|
|
DISABLE_PROCOBJ_CREATION()
|
|
|
|
bCutsceneLoaded = FALSE
|
|
INCRAMENT_Pause_Outro_Count()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bMadeSelection
|
|
|
|
IF RUN_SWITCH_CAM_FROM_PLAYER_TO_CAM_LONG_RANGE(sCamDetails, cam_establish)
|
|
|
|
SWITCH_STATE swState = GET_PLAYER_SWITCH_STATE()
|
|
|
|
IF swState >= SWITCH_STATE_PAN
|
|
|
|
IF swState >= SWITCH_STATE_OUTRO
|
|
IF NOT bCutsceneLoaded
|
|
|
|
IF NOT IS_CUTSCENE_ACTIVE()
|
|
|
|
IF bStartedAsMichael
|
|
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("FBI_3_INT", cutSections_TrevFull)
|
|
Register_Ped_Variation_For_Cutscene_From_Ped(sCutscenePedVariationRegister, TREV_PED_ID(), csTrevor)
|
|
ELSE
|
|
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("FBI_3_INT", cutSections_Mike)
|
|
ENDIF
|
|
Register_Torture_Ped_Variations_For_Cutscene_Prestreaming(TRUE, FALSE, csMrK)
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
i_EstablishHoldTimer = GET_GAME_TIMER() + 4500
|
|
|
|
ELIF HAS_CUTSCENE_LOADED()
|
|
//ar_ALLOW_PLAYER_SWITCH_OUTRO()
|
|
bCutsceneLoaded = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Take control of trevor when posible
|
|
IF sCamDetails.bOKToSwitchPed
|
|
AND NOT sCamDetails.bPedSwitched
|
|
IF TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
|
|
// Swapping to Trevor
|
|
IF bStartedAsMichael
|
|
TASK_PLAY_ANIM_ADVANCED(TREV_PED_ID(), "missfbi3ig_0", "shit_loop_trev", << 129.173, -2203.357, 6.017 >>, <<0,0,79.5>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_USE_KINEMATIC_PHYSICS)
|
|
ELSE
|
|
TASK_PLAY_ANIM_ADVANCED(MIKE_PED_ID(), "missfbi3leadinout", "idle_c", vMichaelSpawnCoords, <<0,0,fMichaelSpawnHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_USE_KINEMATIC_PHYSICS)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(MIKE_PED_ID(), TRUE)
|
|
ENDIF
|
|
|
|
sCamDetails.bPedSwitched = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ELSE
|
|
// SWITCH complete
|
|
SET_PED_CREW(TREV_PED_ID())
|
|
SET_PED_CREW(MIKE_PED_ID())
|
|
bMadeSelection = FALSE
|
|
iAssetRequests = 0
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
//PURPOSE: Handles switching from the sniping scene to a cutscene instant start at the tortture room
|
|
FUNC BOOL SWITCH_Wronglocation_To_Torture_CUTSCENE()
|
|
|
|
// Start the switch
|
|
IF NOT bCutsceneSWITCHStarted
|
|
|
|
SET_GAME_PAUSES_FOR_STREAMING(FALSE)
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(TREV_PED_ID(), TRUE)
|
|
TORTURE_LoadAssets(TRUE, TRUE)
|
|
Load_Asset_NewLoadScene_Sphere(sAssetData, TORTURE_LOAD_SCENE_COORD, TORTURE_LOAD_SCENE_RADIUS, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
|
|
|
|
//clearText()
|
|
clearText(FALSE) // TU FIX: michael's conversation was getting killed here going straight to Dave phoning Steve.
|
|
bDisplaySwitchHUD = FALSE
|
|
bCutsceneSWITCHStarted = TRUE
|
|
bProneSetup = FALSE
|
|
bSafeToSwitch = FALSE
|
|
bHasSwitchSetupCam = FALSE
|
|
iAssetRequests = 0
|
|
|
|
// While running
|
|
ELSE
|
|
IF TORTURE_IsTortureReady(TRUE, TRUE, FALSE)
|
|
AND HAS_COLLISION_LOADED_AROUND_ENTITY(TREV_PED_ID())
|
|
//AND IS_NEW_LOAD_SCENE_LOADED()
|
|
AND bSafeToSwitch
|
|
|
|
CDEBUG1LN(DEBUG_MIKE, "TORTURE Torture ready, collision loaded, scene loaded, moving to new locate")
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("FBI_3_FOCUS_CAM_PHOTOSHOOT")
|
|
STOP_AUDIO_SCENE("FBI_3_FOCUS_CAM_PHOTOSHOOT")
|
|
ENDIF
|
|
START_AUDIO_SCENE("FBI_3_TREVOR_TORTURE_1")
|
|
|
|
doTwoPointCam(camGeneralInit, camGeneralDest, << 146.7890, -2204.1140, 5.6386 >>, << -10.8642, 7.4269, 61.6078 >>, 17.4610,
|
|
<< 146.7890, -2204.1140, 5.6386 >>, << -10.8642, 7.4269, 61.6078 >>, 16.0803,
|
|
5000)
|
|
doCamShake(camGeneralInit, camGeneralDest, shakeHand, 0.1)
|
|
bHasSwitchSetupCam = TRUE
|
|
|
|
IF DOES_CAM_EXIST(camWrongLocation)
|
|
DESTROY_CAM(camWrongLocation)
|
|
ENDIF
|
|
|
|
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_TREVOR)
|
|
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE, TCF_CLEAR_TASK_INTERRUPT_CHECKS)
|
|
SET_PED_CREW(TREV_PED_ID())
|
|
SET_PED_CREW(MIKE_PED_ID())
|
|
|
|
ANIMPOSTFX_PLAY("SwitchSceneTrevor", 0, FALSE)
|
|
PLAY_SOUND_FRONTEND(-1, "Hit_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
|
|
SET_GAME_PAUSES_FOR_STREAMING(TRUE)
|
|
Unload_Asset_NewLoadScene(sAssetData)
|
|
|
|
TORTURE_PlaySyncScene(SCENE_WEAPON_SELECT_IDLE, TRUE)
|
|
|
|
// Clean up wrong location scene
|
|
INT i
|
|
REPEAT COUNT_OF(pedCunts) i
|
|
IF DOES_ENTITY_EXIST(pedCunts[i])
|
|
DELETE_PED(pedCunts[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
REPEAT COUNT_OF(objCunts) i
|
|
IF DOES_ENTITY_EXIST(objCunts[i])
|
|
DELETE_OBJECT(objCunts[i])
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
Unload_Asset_Anim_Dict(sAssetData, adWrongHouse)
|
|
|
|
IF DOES_ENTITY_EXIST(pedDave)
|
|
DELETE_PED(pedDave)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vehTrevor)
|
|
DELETE_VEHICLE(vehTrevor)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vehDriveToVeh)
|
|
DELETE_VEHICLE(vehDriveToVeh)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vehReplay)
|
|
DELETE_VEHICLE(vehReplay)
|
|
ENDIF
|
|
|
|
REMOVE_SCENARIO_BLOCKING_AREA(sba_wrongLocation)
|
|
|
|
CLEAR_PED_NON_CREATION_AREA()
|
|
|
|
SET_PED_PATHS_BACK_TO_ORIGINAL(<<-890.959290,-4.526050,48.068375>> - <<35.000000,30.000000,10.437500>>,
|
|
<<-890.959290,-4.526050,48.068375>> + <<35.000000,30.000000,10.437500>>)
|
|
|
|
FADE_UP_PED_LIGHT()
|
|
|
|
bMadeSelection = FALSE
|
|
bCutsceneSWITCHStarted = FALSE
|
|
iAssetRequests = 0
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
//PURPOSE: Handles the switch from the torture room to the chumash drive
|
|
FUNC BOOL SWITCH_Torture_To_Coffee()
|
|
|
|
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_WEAPON_ICON)
|
|
|
|
// Start the switch
|
|
IF NOT bCutsceneSWITCHStarted
|
|
IF HAS_CUTSCENE_LOADED()
|
|
#IF IS_JAPANESE_BUILD
|
|
AND IS_SCREEN_FADED_OUT()
|
|
#ENDIF
|
|
|
|
|
|
|
|
SET_GAME_PAUSES_FOR_STREAMING(FALSE)
|
|
IF DOES_ENTITY_EXIST( MIKE_PED_ID() )
|
|
|
|
// CPRINTLN( DEBUG_MIKE, "*** FBI3 *** - ", "SWITCH_Torture_To_Coffee() Setting Mike as focus entity")
|
|
FREEZE_ENTITY_POSITION(MIKE_PED_ID(), FALSE)
|
|
SET_ENTITY_COORDS(MIKE_PED_ID(), vCoffeeShopMikeCoord)
|
|
SET_ENTITY_HEADING(MIKE_PED_ID(), fCoffeeShopMikeHeading)
|
|
FREEZE_ENTITY_POSITION(MIKE_PED_ID(), TRUE)
|
|
SET_FOCUS_ENTITY(MIKE_PED_ID())
|
|
|
|
IF IS_ENTITY_FOCUS( MIKE_PED_ID() )
|
|
// CPRINTLN( DEBUG_MIKE, "*** FBI3 *** - ", "SWITCH_Torture_To_Coffee() SUCCEEDED to set MIKE as focus ped")
|
|
// SCRIPT_ASSERT( "*** FBI3 *** - SWITCH_Torture_To_Coffee() SUCCEEDED to set MIKE as focus ped" )
|
|
ELSE
|
|
// CPRINTLN( DEBUG_MIKE, "*** FBI3 *** - ", "SWITCH_Torture_To_Coffee() FAILED to set MIKE as focus ped")
|
|
// SCRIPT_ASSERT( "*** FBI3 *** - SWITCH_Torture_To_Coffee() FAILED to set MIKE as focus ped" )
|
|
ENDIF
|
|
|
|
ELSE
|
|
// CPRINTLN( DEBUG_MIKE, "*** FBI3 *** - ", "SWITCH_Torture_To_Coffee() MIKE_PED_ID() does not exist cannot set ped as focus")
|
|
// SCRIPT_ASSERT( "*** FBI3 *** - SWITCH_Torture_To_Coffee() MIKE_PED_ID() does not exist cannot set ped as focus" )
|
|
ENDIF
|
|
|
|
|
|
IF Load_Asset_NewLoadScene_Frustum(sAssetData, <<-1270.9983, -891.1161, 12.0253>>, NORMALISE_VECTOR(<<-1267.3468, -870.2449, 16.8556>> - <<-1270.9983, -891.1161, 12.0253>>), 40.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
|
|
// CPRINTLN(DEBUG_MIKE, "LOAD SCENE STARTED")
|
|
ELSE
|
|
// CPRINTLN(DEBUG_MIKE, "LOAD SCENE COULDN'T START")
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("FBI_3_TREVOR_TORTURE_1")
|
|
STOP_AUDIO_SCENE("FBI_3_TREVOR_TORTURE_1")
|
|
ENDIF
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(pedSteve, csSteve, CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(pedVictim, strMrKCSHandle, CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(null, strMrKCSHandle_DONT_ANIMATE, CU_DONT_ANIMATE_ENTITY, CS_MRK)
|
|
TORTURE_DetachAllProps() // detach the weapons so the cutscene can animate them
|
|
TORTURE_RegisterAllPropsForCutscene(FALSE)
|
|
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
START_CUTSCENE( CUTSCENE_DO_NOT_REPOSITION_PLAYER_TO_SCENE_ORIGIN )
|
|
|
|
/*
|
|
IF NOT IS_REPLAY_RECORDING()
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
ENDIF
|
|
*/
|
|
|
|
clearText()
|
|
bDisplaySwitchHUD = FALSE
|
|
bCutsceneSWITCHStarted = TRUE
|
|
bProneSetup = FALSE
|
|
bPerformedPostTortureFadeIn = FALSE
|
|
bTrevorExited = FALSE
|
|
bCamExited = FALSE
|
|
iCoffeeStage = 0
|
|
iAssetRequests = 0
|
|
bMusicCueTriggered = FALSE
|
|
ENDIF
|
|
|
|
// While running
|
|
ELSE
|
|
|
|
SWITCH iCoffeeStage
|
|
CASE 0
|
|
IF IS_CUTSCENE_PLAYING()
|
|
SET_PAD_CAN_SHAKE_DURING_CUTSCENE(TRUE)
|
|
IF NOT bPerformedPostTortureFadeIn
|
|
SAFE_FADE_IN(DEFAULT_FADE_TIME_SHORT)
|
|
bPerformedPostTortureFadeIn = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
IF IS_REPLAY_RECORDING()
|
|
REPLAY_STOP_EVENT()
|
|
ENDIF
|
|
|
|
IF NOT IS_REPLAY_RECORDING()
|
|
REPLAY_RECORD_BACK_FOR_TIME(0.0, 8.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
ENDIF
|
|
|
|
bCamExited = TRUE
|
|
RESET_ADAPTATION()
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
|
|
bTrevorExited = TRUE
|
|
FREEZE_ENTITY_POSITION(TREV_PED_ID(), TRUE)
|
|
// CPRINTLN(DEBUG_MIKE, "Trevor exited cutscene")
|
|
ENDIF
|
|
|
|
IF PARTY_LoadAssets(TRUE, FALSE)
|
|
AND PARTY_IsSceneReady(TRUE, FALSE, ST_4_DRIVE_TO_COORD_SECOND)
|
|
AND HAS_COLLISION_LOADED_AROUND_ENTITY(MIKE_PED_ID())
|
|
AND IS_NEW_LOAD_SCENE_LOADED()
|
|
AND HAS_ANIM_DICT_LOADED(adCoffee)
|
|
AND bTrevorExited
|
|
AND bCamExited
|
|
|
|
// CPRINTLN( DEBUG_MIKE, "*** FBI3 *** - ", "SWITCH_Torture_To_Coffee() Exit cutscene and start coffee scene" )
|
|
|
|
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_MICHAEL)
|
|
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
|
|
SET_PED_CREW(TREV_PED_ID())
|
|
SET_PED_CREW(MIKE_PED_ID())
|
|
|
|
// bug 1695494
|
|
IF PLAYER_PED_ID() = MIKE_PED_ID()
|
|
AND IS_ENTITY_FOCUS(MIKE_PED_ID())
|
|
AND IS_NEW_LOAD_SCENE_ACTIVE()
|
|
// VECTOR vPedCoord
|
|
// vPedCoord = GET_ENTITY_COORDS( MIKE_PED_ID() )
|
|
// CPRINTLN( DEBUG_MIKE, "*** FBI3 ***", " - SWITCH_Torture_To_Coffee() PLAYER_PED is Michael, Michael is the focus entity, Michael is at = ", vPedCoord )
|
|
|
|
// CPRINTLN( DEBUG_MIKE, "*** FBI3 ***", "... clearing the focus... " )
|
|
SET_GAME_PAUSES_FOR_STREAMING(TRUE)
|
|
CLEAR_FOCUS()
|
|
|
|
// CPRINTLN( DEBUG_MIKE, "*** FBI3 ***", "... and unloading the new load scene" )
|
|
Unload_Asset_NewLoadScene(sAssetData)
|
|
|
|
ENDIF
|
|
|
|
TORTURE_CleanupEntitiesAndAssets()
|
|
FREEZE_ENTITY_POSITION(MIKE_PED_ID(), FALSE)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
SAFE_FADE_IN()
|
|
|
|
ADD_ALL_PEDS_TO_DIALOGUE()
|
|
|
|
// coffee scene
|
|
RunConversation("F3_COFFEE")
|
|
|
|
camSyncSceneAnimated = CREATE_CAMERA(CAMTYPE_ANIMATED, TRUE)
|
|
syncScene[SCENE_COFFEE] = CREATE_SYNCHRONIZED_SCENE(vCoffeeIGCoord, vCoffeeIGRot)
|
|
TASK_SYNCHRONIZED_SCENE(MIKE_PED_ID(), syncScene[SCENE_COFFEE], adCoffee, "002291_02_fbi_3_coffee_w_dave_exit_mic", INSTANT_BLEND_IN, WALK_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_TAG_SYNC_OUT)
|
|
TASK_SYNCHRONIZED_SCENE(pedDave, syncScene[SCENE_COFFEE], adCoffee, "002291_02_fbi_3_coffee_w_dave_exit_dave", INSTANT_BLEND_IN, WALK_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_TAG_SYNC_OUT)
|
|
PLAY_SYNCHRONIZED_ENTITY_ANIM(objs[mof_coffee_chair], syncScene[SCENE_COFFEE], "002291_02_fbi_3_coffee_w_dave_exit_chair", adCoffee, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, enum_to_int(SYNCED_SCENE_DONT_INTERRUPT))
|
|
PLAY_SYNCHRONIZED_CAM_ANIM(camSyncSceneAnimated, syncScene[SCENE_COFFEE], "002291_02_fbi_3_coffee_w_dave_exit_cam", adCoffee)
|
|
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(syncScene[SCENE_COFFEE], FALSE)
|
|
|
|
// added bug 1890635
|
|
IF IS_SCRIPT_GLOBAL_SHAKING()
|
|
STOP_SCRIPT_GLOBAL_SHAKING(TRUE)
|
|
ENDIF
|
|
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(MIKE_PED_ID())
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(pedDave)
|
|
|
|
SET_FORCE_FOOTSTEP_UPDATE(MIKE_PED_ID(), TRUE)
|
|
SET_FORCE_FOOTSTEP_UPDATE(pedDave, TRUE)
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
START_AUDIO_SCENE("FBI_3_MICHAEL_COFFEE_BREAK")
|
|
TRIGGER_MUSIC_EVENT("FBI3_BACK_TO_MICHAEL")
|
|
SETTIMERB(0)
|
|
|
|
DISPLAY_RADAR(FALSE)
|
|
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
ANIMPOSTFX_PLAY("SwitchSceneMichael", 0, FALSE)
|
|
PLAY_SOUND_FRONTEND(-1, "Hit_Out", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
|
|
sba_coffee_shop = ADD_SCENARIO_BLOCKING_AREA(<<-1267.129395,-887.206116,12.520452>> - <<12.437500,9.437500,2.500000>>,
|
|
<<-1267.129395,-887.206116,12.520452>> - <<12.437500,9.437500,2.500000>>)
|
|
|
|
CLEAR_AREA(<<-1267.129395,-887.206116,12.520452>>, 15.0, TRUE)
|
|
|
|
bPerformedPostTortureFadeIn = FALSE
|
|
bMichaelExited = FALSE
|
|
bDaveExited = FALSE
|
|
bCamExited = FALSE
|
|
iCoffeeStage++
|
|
ELSE
|
|
// CPRINTLN( DEBUG_MIKE, "*** FBI3 *** - ", "SWITCH_Torture_To_Coffee() waiting for everything to load so we can fade back in..." )
|
|
//
|
|
// IF PLAYER_PED_ID() = MIKE_PED_ID()
|
|
// CPRINTLN( DEBUG_MIKE, "*** FBI3 ***", " - PLAYER_PED_ID() = Mike " )
|
|
// ELIF PLAYER_PED_ID() = TREV_PED_ID()
|
|
// CPRINTLN( DEBUG_MIKE, "*** FBI3 ***", " - PLAYER_PED_ID() = Trev " )
|
|
// ENDIF
|
|
//
|
|
// VECTOR vCoord
|
|
// IF IS_ENTITY_FOCUS( MIKE_PED_ID() )
|
|
// CPRINTLN( DEBUG_MIKE, "*** FBI3 ***", " - Focus entity = Mike " )
|
|
// vCoord = GET_ENTITY_COORDS( MIKE_PED_ID() )
|
|
// CPRINTLN( DEBUG_MIKE, "*** FBI3 ***", " - Michael is at = ", vCoord )
|
|
// ELIF IS_ENTITY_FOCUS( TREV_PED_ID() )
|
|
// CPRINTLN( DEBUG_MIKE, "*** FBI3 ***", " - Focus entity = Trev " )
|
|
// vCoord = GET_ENTITY_COORDS( TREV_PED_ID() )
|
|
// CPRINTLN( DEBUG_MIKE, "*** FBI3 ***", " - Trevor is at = ", vCoord )
|
|
// ENDIF
|
|
//
|
|
// vCoord = GET_GAMEPLAY_CAM_COORD()
|
|
// CPRINTLN( DEBUG_MIKE, "*** FBI3 ***", " - Camera is at = ", vCoord )
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
IF NOT bMusicCueTriggered
|
|
IF TIMERB() > 3500
|
|
TRIGGER_MUSIC_EVENT("FBI3_MICHAEL_MUSIC_2")
|
|
bMusicCueTriggered = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_PLAYING(syncScene[SCENE_COFFEE])
|
|
|
|
IF IS_SCREEN_FADED_IN()
|
|
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
|
|
AND IS_SCENE_AT_PHASE(SCENE_COFFEE, 0.0, 0.675)
|
|
AND NOT bMissionFailed
|
|
CPRINTLN( DEBUG_MIKE, "*** FBI3 ***", "Coffee cutscene skipped, doing fade out" )
|
|
SAFE_FADE_OUT()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
HIDE_HUD_AND_RADAR_THIS_FRAME()
|
|
|
|
// Skip to the end of the cutscene
|
|
IF IS_SCREEN_FADED_OUT()
|
|
|
|
CPRINTLN( DEBUG_MIKE, "*** FBI3 ***", "Coffee scene is faded out stop new load scene and start a new 1" )
|
|
|
|
Unload_Asset_NewLoadScene(sAssetData)
|
|
Load_Asset_NewLoadScene_Frustum(sAssetData, <<-1272.1626, -880.3244, 12.8902>>, NORMALISE_VECTOR(<<-1270.2233, -883.1075, 12.5055>> - <<-1272.1626, -880.3244, 12.8902>>), 100)
|
|
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
DESTROY_CAM(camSyncSceneAnimated)
|
|
|
|
SET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_COFFEE], 1.0)
|
|
|
|
SET_ENTITY_COORDS(MIKE_PED_ID(), <<-1267.2947, -888.0948, 10.4967>>)
|
|
SET_ENTITY_HEADING(MIKE_PED_ID(), 209.4294)
|
|
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(MIKE_PED_ID())
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(pedDave)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
|
|
|
|
IF DOES_ENTITY_EXIST(objs[mof_coffee_dave])
|
|
IF IS_ENTITY_ATTACHED(objs[mof_coffee_dave])
|
|
DETACH_ENTITY(objs[mof_coffee_dave])
|
|
ENDIF
|
|
DELETE_OBJECT(objs[mof_coffee_dave])
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(objs[mof_coffee_mike])
|
|
IF IS_ENTITY_ATTACHED(objs[mof_coffee_mike])
|
|
DETACH_ENTITY(objs[mof_coffee_mike])
|
|
ENDIF
|
|
DELETE_OBJECT(objs[mof_coffee_mike])
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(propPhoneDave)
|
|
IF IS_ENTITY_ATTACHED(propPhoneDave)
|
|
DETACH_ENTITY(propPhoneDave)
|
|
ENDIF
|
|
DELETE_OBJECT(propPhoneDave)
|
|
ENDIF
|
|
|
|
IF NOT bMusicCueTriggered
|
|
TRIGGER_MUSIC_EVENT("FBI3_MICHAEL_MUSIC_2")
|
|
bMusicCueTriggered = TRUE
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
// Detach cups
|
|
IF IS_ENTITY_ATTACHED(objs[mof_coffee_mike])
|
|
//IF GET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_COFFEE]) >= 0.55
|
|
IF HAS_ANIM_EVENT_FIRED(MIKE_PED_ID(), GET_HASH_KEY("DetachCup"))
|
|
DETACH_ENTITY(objs[mof_coffee_mike], FALSE, TRUE)
|
|
FREEZE_ENTITY_POSITION(objs[mof_coffee_mike], TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_ENTITY_ATTACHED(objs[mof_coffee_dave])
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_COFFEE]) >= 0.675
|
|
DETACH_ENTITY(objs[mof_coffee_dave], TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Delete phone
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_COFFEE]) >= 0.90
|
|
|
|
IF DOES_ENTITY_EXIST(propPhoneDave)
|
|
IF IS_ENTITY_ATTACHED(propPhoneDave)
|
|
DETACH_ENTITY(propPhoneDave)
|
|
ENDIF
|
|
DELETE_OBJECT(propPhoneDave)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
// Blend out peds
|
|
IF NOT bDaveExited
|
|
//IF GET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_COFFEE]) >= 0.896
|
|
IF HAS_ANIM_EVENT_FIRED(pedDave, GET_HASH_KEY("ENDS_IN_WALK"))
|
|
|
|
OPEN_SEQUENCE_TASK(seqSequence)
|
|
TASK_FORCE_MOTION_STATE(null, enum_to_int(MS_ON_FOOT_WALK))
|
|
IF IS_VEHICLE_DRIVEABLE(vehDriveToVeh)
|
|
TASK_ENTER_VEHICLE(null, vehDriveToVeh, DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT, PEDMOVE_WALK)
|
|
ELSE
|
|
TASK_TURN_PED_TO_FACE_ENTITY(null, MIKE_PED_ID(), -1)
|
|
ENDIF
|
|
CLOSE_SEQUENCE_TASK(seqSequence)
|
|
TASK_PERFORM_SEQUENCE(pedDave, seqSequence)
|
|
CLEAR_SEQUENCE_TASK(seqSequence)
|
|
|
|
bDaveExited = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bMichaelExited
|
|
//IF GET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_COFFEE]) >= 0.928
|
|
IF HAS_ANIM_EVENT_FIRED(MIKE_PED_ID(), GET_HASH_KEY("WalkInterruptible"))
|
|
|
|
TASK_FORCE_MOTION_STATE(MIKE_PED_ID(), enum_to_int(MS_ON_FOOT_WALK))
|
|
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK, 1500, 192.2249, FALSE)
|
|
SET_FORCE_FOOTSTEP_UPDATE(MIKE_PED_ID(), FALSE)
|
|
|
|
bMichaelExited = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bMichaelExited
|
|
|
|
ENDIF
|
|
|
|
IF NOT IS_GAMEPLAY_CAM_RENDERING()
|
|
AND NOT IS_INTERPOLATING_FROM_SCRIPT_CAMS()
|
|
FLOAT fInterruptPhase, fDummy
|
|
IF FIND_ANIM_EVENT_PHASE(adCoffee, "002291_02_fbi_3_coffee_w_dave_exit_mic", "WalkInterruptible", fInterruptPhase, fDummy)
|
|
CPRINTLN(DEBUG_MIKE, "Interrupt Phase Start: ", fInterruptPhase, " End: ", fDummy)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(syncScene[SCENE_COFFEE]) >= fInterruptPhase - (3.0/16.667) // START BLEND OUT 2.5 seconds before the
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(212.243 - GET_ENTITY_HEADING(MIKE_PED_ID()))
|
|
RENDER_SCRIPT_CAMS(FALSE, TRUE, 3000, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
IF IS_SCREEN_FADED_IN()
|
|
OR NOT IS_NEW_LOAD_SCENE_ACTIVE()
|
|
OR IS_NEW_LOAD_SCENE_LOADED()
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
DISABLE_CELLPHONE(FALSE)
|
|
DISPLAY_RADAR(TRUE)
|
|
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(MIKE_PED_ID(), NORMAL_BLEND_OUT, TRUE)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(pedDave, NORMAL_BLEND_OUT, TRUE)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(objs[mof_coffee_chair], NORMAL_BLEND_OUT, TRUE)
|
|
|
|
DELETE_OBJECT(objs[mof_coffee_chair])
|
|
REMOVE_MODEL_HIDE(<<-1267.62, -880.46, 10.95>>, 0.25, PROP_CHAIR_01A)
|
|
|
|
DESTROY_CAM(camSyncSceneAnimated)
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedDave, TRUE)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehDriveToVeh)
|
|
SET_LOCATES_BUDDIES_TO_GET_INTO_NEAREST_CAR(sLocatesData, vehDriveToVeh)
|
|
ENDIF
|
|
|
|
SAFE_FADE_IN()
|
|
|
|
iDriveStoppedTimer = -1
|
|
iDriveComplaintTimer = -1
|
|
bEventFlag[0] = FALSE
|
|
bEventFlag[1] = FALSE
|
|
bEventFlag[2] = FALSE
|
|
bEventFlag[3] = FALSE
|
|
str_InteruptedLabel = ""
|
|
str_InteruptedRoot = ""
|
|
bManageParty = FALSE
|
|
bMadeSelection = FALSE
|
|
bCutsceneSWITCHStarted = FALSE
|
|
iAssetRequests = 0
|
|
bDisplayHeartMonitor = FALSE
|
|
|
|
Unload_Asset_NewLoadScene( sAssetData )
|
|
|
|
RETURN TRUE
|
|
ELSE
|
|
CPRINTLN( DEBUG_MIKE, "*** FBI3 ***", "Coffee scene waiting on new load scene while faded out" )
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF iCoffeeStage > 0
|
|
bDisplayHeartMonitor = FALSE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
//PURPOSE: Handles switching from the sniping scene to a cutscene instant start at the tortture room
|
|
FUNC BOOL SWITCH_Torture_To_Sniping_CUTSCENE()
|
|
|
|
// Start the switch
|
|
IF NOT bCutsceneSWITCHStarted
|
|
IF HAS_CUTSCENE_LOADED()
|
|
#IF IS_JAPANESE_BUILD
|
|
AND IS_SCREEN_FADED_OUT()
|
|
#ENDIF
|
|
|
|
SET_GAME_PAUSES_FOR_STREAMING(FALSE)
|
|
SET_FOCUS_ENTITY(MIKE_PED_ID())
|
|
CPRINTLN(DEBUG_MIKE, "SWITCH_Torture_To_Sniping_CUTSCENE() Setting Mike as focus entity")
|
|
//SET_ENTITY_LOAD_COLLISION_FLAG(TREV_PED_ID(), TRUE)
|
|
Load_Asset_NewLoadScene_Frustum(sAssetData, vNewLoadSceneSnipeCoord, vNewLoadSceneSnipeDir, fNewLoadSceneSnipeFarClip, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
|
|
|
|
SWITCH eMissionStage
|
|
CASE ST_5_TORTURE_FOR_SECOND
|
|
IF IS_AUDIO_SCENE_ACTIVE("FBI_3_TREVOR_TORTURE_2")
|
|
STOP_AUDIO_SCENE("FBI_3_TREVOR_TORTURE_2")
|
|
ENDIF
|
|
BREAK
|
|
CASE ST_7_TORTURE_FOR_THIRD
|
|
IF IS_AUDIO_SCENE_ACTIVE("FBI_3_TREVOR_TORTURE_3")
|
|
STOP_AUDIO_SCENE("FBI_3_TREVOR_TORTURE_3")
|
|
ENDIF
|
|
BREAK
|
|
CASE ST_9_TORTURE_FINAL
|
|
IF IS_AUDIO_SCENE_ACTIVE("FBI_3_TREVOR_TORTURE_4")
|
|
STOP_AUDIO_SCENE("FBI_3_TREVOR_TORTURE_4")
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT bStoredSniperSnapshot
|
|
IF DOES_ENTITY_EXIST(MIKE_PED_ID())
|
|
STORE_PLAYER_PED_WEAPONS(MIKE_PED_ID())
|
|
ENDIF
|
|
sSniperSnapshot = g_savedGlobals.sPlayerData.sInfo.sWeapons[CHAR_MICHAEL].sWeaponInfo[21]
|
|
g_savedGlobals.sPlayerData.sInfo.sWeapons[CHAR_MICHAEL].sWeaponInfo[21].iAmmoCount = 0
|
|
g_savedGlobals.sPlayerData.sInfo.sWeapons[CHAR_MICHAEL].sWeaponInfo[21].iModsAsBitfield = 0
|
|
g_savedGlobals.sPlayerData.sInfo.sWeapons[CHAR_MICHAEL].sWeaponInfo[21].iTint = 0
|
|
g_savedGlobals.sPlayerData.sInfo.sWeapons[CHAR_MICHAEL].sWeaponInfo[21].iCamo = 0
|
|
IF DOES_ENTITY_EXIST(MIKE_PED_ID())
|
|
RESTORE_PLAYER_PED_WEAPONS(MIKE_PED_ID())
|
|
ENDIF
|
|
bStoredSniperSnapshot = TRUE
|
|
ENDIF
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(pedSteve, csSteve, CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(pedVictim, strMrKCSHandle, CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(null, strMrKCSHandle_DONT_ANIMATE, CU_DONT_ANIMATE_ENTITY, CS_MRK)
|
|
TORTURE_DetachAllProps() // detach the weapons so the cutscene can animate them
|
|
TORTURE_RegisterAllPropsForCutscene(FALSE)
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
START_CUTSCENE()
|
|
|
|
IF NOT IS_REPLAY_RECORDING()
|
|
REPLAY_RECORD_BACK_FOR_TIME(10.0, 0.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
ENDIF
|
|
|
|
clearText()
|
|
bDisplaySwitchHUD = FALSE
|
|
bCutsceneSWITCHStarted = TRUE
|
|
bProneSetup = FALSE
|
|
bPerformedPostTortureFadeIn = FALSE
|
|
bTrevorExited = FALSE
|
|
bCamExited = FALSE
|
|
bRunPostSwitchFocusCleanup = FALSE
|
|
iAssetRequests = 0
|
|
ENDIF
|
|
|
|
// While running
|
|
ELSE
|
|
IF NOT bRunPostSwitchFocusCleanup
|
|
IF IS_CUTSCENE_PLAYING()
|
|
SET_PAD_CAN_SHAKE_DURING_CUTSCENE(TRUE)
|
|
IF NOT bPerformedPostTortureFadeIn
|
|
SAFE_FADE_IN(DEFAULT_FADE_TIME_SHORT)
|
|
bPerformedPostTortureFadeIn = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
|
|
FREEZE_ENTITY_POSITION(TREV_PED_ID(), TRUE)
|
|
bTrevorExited = TRUE
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
IF IS_REPLAY_RECORDING()
|
|
REPLAY_STOP_EVENT()
|
|
ENDIF
|
|
|
|
setupSwayCam(sSwaySniping, vProneCamStartCoord, vProneCamStartRot, fProneCamStartFOV,
|
|
vProneCamEndCoord, vProneCamEndRot, fProneCamEndFOV,
|
|
40000, TRUE, shakeHand, 0.5, "SNIPE")
|
|
|
|
doSwayCam(sSwaySniping)
|
|
|
|
ANIMPOSTFX_PLAY("SwitchSceneMichael", 0, FALSE)
|
|
PLAY_SOUND_FRONTEND(-1, "Hit_Out", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
|
|
bCamExited = TRUE
|
|
ENDIF
|
|
|
|
IF PARTY_LoadAssets(FALSE, TRUE)
|
|
AND PARTY_IsSceneReady(FALSE, TRUE, int_to_enum(MISSION_STAGE, enum_to_int(eMissionStage)+1))
|
|
AND HAS_COLLISION_LOADED_AROUND_ENTITY(MIKE_PED_ID())
|
|
AND IS_NEW_LOAD_SCENE_LOADED()
|
|
AND bTrevorExited
|
|
AND bCamExited
|
|
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_MICHAEL)
|
|
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
|
|
SET_PED_CREW(TREV_PED_ID())
|
|
SET_PED_CREW(MIKE_PED_ID())
|
|
|
|
TORTURE_CleanupEntitiesAndAssets()
|
|
|
|
SWITCH eMissionStage
|
|
CASE ST_5_TORTURE_FOR_SECOND
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FBI_3_MICHAEL_VANTAGE_POINT_1")
|
|
START_AUDIO_SCENE("FBI_3_MICHAEL_VANTAGE_POINT_1")
|
|
ENDIF
|
|
BREAK
|
|
CASE ST_7_TORTURE_FOR_THIRD
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FBI_3_MICHAEL_VANTAGE_POINT_2")
|
|
START_AUDIO_SCENE("FBI_3_MICHAEL_VANTAGE_POINT_2")
|
|
ENDIF
|
|
BREAK
|
|
CASE ST_9_TORTURE_FINAL
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FBI_3_MICHAEL_VANTAGE_POINT_3")
|
|
START_AUDIO_SCENE("FBI_3_MICHAEL_VANTAGE_POINT_3")
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
bRunPostSwitchFocusCleanup = TRUE
|
|
|
|
SAFE_FADE_IN()
|
|
|
|
CASCADE_SHADOWS_ENABLE_ENTITY_TRACKER(FALSE)
|
|
|
|
ENDIF
|
|
ELSE
|
|
//SET_ENTITY_LOAD_COLLISION_FLAG(TREV_PED_ID(), FALSE)
|
|
SET_GAME_PAUSES_FOR_STREAMING(TRUE)
|
|
CLEAR_FOCUS()
|
|
Unload_Asset_NewLoadScene(sAssetData)
|
|
|
|
bMadeSelection = FALSE
|
|
bCutsceneSWITCHStarted = FALSE
|
|
bPerformedPostTortureFadeIn = FALSE
|
|
iAssetRequests = 0
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
|
|
//PURPOSE: Handles switching from the sniping scene to a cutscene instant start at the tortture room
|
|
FUNC BOOL SWITCH_Sniping_To_Torture_CUTSCENE(MISSION_STAGE eStage = ST_10_REACT_FINAL)
|
|
|
|
IF NOT bCutSceneSWITCHPreped
|
|
SWITCH eStage
|
|
CASE ST_4_DRIVE_TO_COORD_SECOND FALLTHRU
|
|
CASE ST_6_REACT_TO_SECOND FALLTHRU
|
|
CASE ST_8_REACT_TO_THIRD
|
|
Load_Asset_NewLoadScene_Sphere(sAssetData, TORTURE_LOAD_SCENE_COORD, TORTURE_LOAD_SCENE_RADIUS, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
|
|
TORTURE_LoadAssets(FALSE, FALSE)
|
|
BREAK
|
|
CASE ST_10_REACT_FINAL
|
|
Load_Asset_NewLoadScene_Sphere(sAssetData, TORTURE_LOAD_SCENE_COORD, TORTURE_LOAD_SCENE_RADIUS, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
|
|
Load_Asset_Scaleform(sAssetData, sfHeart, sfHeartMonitor)
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(TREV_PED_ID(), TRUE)
|
|
SET_GAME_PAUSES_FOR_STREAMING(FALSE)
|
|
|
|
g_sSelectorUI.bFX_SkipFadeOut = TRUE
|
|
bRunPostSwitchFocusCleanup = FALSE
|
|
bPromptedSWITCH = FALSE
|
|
bCutSceneSWITCHPreped = TRUE
|
|
bTrevorExited = FALSE
|
|
bMovedFocus = FALSE
|
|
bPerformedPostTortureFadeIn = FALSE
|
|
iAssetRequests = 0
|
|
iSwitchFailTimer = -1
|
|
ENDIF
|
|
|
|
IF bCutSceneSWITCHPreped
|
|
AND bSafeToSwitch
|
|
// Start the switch
|
|
IF NOT bCutsceneSWITCHStarted
|
|
IF HAS_CUTSCENE_LOADED()
|
|
|
|
BOOL bStartCutscene
|
|
|
|
SWITCH eStage
|
|
CASE ST_4_DRIVE_TO_COORD_SECOND
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
AND NOT IS_SCREEN_FADING_OUT()
|
|
AND TORTURE_IsTortureReady(FALSE, FALSE, FALSE)
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(TREV_PED_ID(), "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(pedDave, csDave, CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(null, csSteve, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, IG_STEVEHAINS)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(null, strMrKCSHandle, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, mnVictim)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(null, strMrKCSHandle_DONT_ANIMATE, CU_DONT_ANIMATE_ENTITY, mnVictim)
|
|
|
|
TORTURE_RegisterAllPropsForCutscene(TRUE, TRUE)
|
|
TORTURE_DetachAllProps()
|
|
|
|
clearText()
|
|
bMadeSelection = TRUE
|
|
bDisplaySwitchHUD = FALSE
|
|
bManageParty = FALSE
|
|
bCutsceneSWITCHStarted = TRUE
|
|
bTortureMusicPlaying = FALSE
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("FBI_3_MICHAEL_DRIVE_CHUMASH")
|
|
STOP_AUDIO_SCENE("FBI_3_MICHAEL_DRIVE_CHUMASH")
|
|
ENDIF
|
|
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
START_CUTSCENE(CUTSCENE_SUPPRESS_FP_TRANSITION_FLASH)
|
|
|
|
CASCADE_SHADOWS_INIT_SESSION()
|
|
SET_MICROPHONE_POSITION(FALSE, <<0,0,0>>, <<0,0,0>>, <<0,0,0>>)
|
|
|
|
// DONT TRIGGER TORTURE MUSIC YET AS CUTSCENE STARTS WITH MICHAEL AND DAVE GETTING INTO POSITION
|
|
ENDIF
|
|
BREAK
|
|
CASE ST_6_REACT_TO_SECOND
|
|
FALLTHRU
|
|
CASE ST_8_REACT_TO_THIRD
|
|
|
|
IF IS_NEW_LOAD_SCENE_LOADED()
|
|
AND HAS_COLLISION_LOADED_AROUND_ENTITY(TREV_PED_ID())
|
|
AND TORTURE_IsTortureReady(FALSE, FALSE, FALSE)
|
|
#IF IS_DEBUG_BUILD
|
|
AND NOT b_SimulatedStreamingStuck
|
|
#ENDIF
|
|
|
|
IF IS_SCREEN_FADED_IN()
|
|
iSwitchFailTimer = -1
|
|
|
|
IF NOT UPDATE_SELECTOR_HUD(sSelectorPeds, FALSE)
|
|
SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_TREVOR, TRUE)
|
|
SET_SELECTOR_PED_ACTIVITY(sSelectorPeds, SELECTOR_PED_TREVOR, SELECTOR_ACTIVITY_TORTURE)
|
|
|
|
IF NOT bPromptedSWITCH
|
|
PRINT_NOW(godSwitchTrevor, DEFAULT_GOD_TEXT_TIME, 1)
|
|
bPromptedSWITCH = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bStartCutscene = TRUE
|
|
ENDIF
|
|
|
|
ELIF IS_SCREEN_FADED_OUT()
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
bStartCutscene = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF iSwitchFailTimer = -1
|
|
iSwitchFailTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
// Safety fade out after 7 seconds
|
|
IF IS_SCREEN_FADED_IN()
|
|
IF GET_GAME_TIMER() - iSwitchFailTimer > 7000
|
|
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
SAFE_FADE_OUT()
|
|
ENDIF
|
|
TEXT_LABEL_63 strDebug
|
|
strDebug = "iSwitchFailTimer: "
|
|
strDebug += GET_GAME_TIMER() - iSwitchFailTimer
|
|
DRAW_DEBUG_TEXT_2D(strDebug, <<0.05, 0.5, 0.0>>, 0,0,0, 255)
|
|
|
|
// Once faded out clean up
|
|
ELIF IS_SCREEN_FADED_OUT()
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_TREVOR
|
|
FREEZE_ENTITY_POSITION(MIKE_PED_ID(), TRUE)
|
|
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_TREVOR)
|
|
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
|
|
PARTY_CleanupEntitiesAndAssets()
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
IF DOES_CAM_EXIST(sSwaySniping.camInit)
|
|
DESTROY_CAM(sSwaySniping.camInit)
|
|
ENDIF
|
|
IF DOES_CAM_EXIST(sSwaySniping.camDest)
|
|
DESTROY_CAM(sSwaySniping.camDest)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bStartCutscene
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(TREV_PED_ID(), "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(null, csSteve, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, IG_STEVEHAINS)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(null, strMrKCSHandle, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, mnVictim)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(null, strMrKCSHandle_DONT_ANIMATE, CU_DONT_ANIMATE_ENTITY, mnVictim)
|
|
|
|
TORTURE_DetachAllProps()
|
|
TORTURE_RegisterAllPropsForCutscene(TRUE)
|
|
clearText()
|
|
bMadeSelection = TRUE
|
|
bDisplaySwitchHUD = FALSE
|
|
bManageParty = FALSE
|
|
bCutsceneSWITCHStarted = TRUE
|
|
bPlayedSwitchSting = FALSE
|
|
|
|
IF eMissionStage = ST_6_REACT_TO_SECOND
|
|
IF IS_AUDIO_SCENE_ACTIVE("FBI_3_MICHAEL_VANTAGE_POINT_1")
|
|
STOP_AUDIO_SCENE("FBI_3_MICHAEL_VANTAGE_POINT_1")
|
|
ENDIF
|
|
ELIF eMissionStage = ST_8_REACT_TO_THIRD
|
|
IF IS_AUDIO_SCENE_ACTIVE("FBI_3_MICHAEL_VANTAGE_POINT_2")
|
|
STOP_AUDIO_SCENE("FBI_3_MICHAEL_VANTAGE_POINT_2")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("FBI_3_MICHAEL_SNIPER_SCOPE")
|
|
STOP_AUDIO_SCENE("FBI_3_MICHAEL_SNIPER_SCOPE")
|
|
ENDIF
|
|
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
START_CUTSCENE( CUTSCENE_SUPPRESS_FP_TRANSITION_FLASH | CUTSCENE_DO_NOT_REPOSITION_PLAYER_TO_SCENE_ORIGIN )
|
|
SET_MICROPHONE_POSITION(FALSE, <<0,0,0>>, <<0,0,0>>, <<0,0,0>>)
|
|
|
|
TRIGGER_MUSIC_EVENT("FBI3_TORTURE")
|
|
bTortureMusicPlaying = TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE ST_10_REACT_FINAL
|
|
// if final switch just take control of trevor at the end
|
|
IF IS_NEW_LOAD_SCENE_LOADED()
|
|
AND HAS_COLLISION_LOADED_AROUND_ENTITY(TREV_PED_ID())
|
|
AND IS_NAMED_RENDERTARGET_REGISTERED(sECGRenderTarget)
|
|
AND HAS_SCALEFORM_MOVIE_LOADED( sfHeartMonitor )
|
|
#IF IS_DEBUG_BUILD
|
|
AND NOT b_SimulatedStreamingStuck
|
|
#ENDIF
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF IS_SCREEN_FADED_IN()
|
|
OR IS_SCREEN_FADED_OUT()
|
|
bStartCutscene = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Not loaded yet
|
|
ELSE
|
|
|
|
IF NOT IS_NAMED_RENDERTARGET_REGISTERED(sECGRenderTarget)
|
|
REGISTER_NAMED_RENDERTARGET(sECGRenderTarget)
|
|
|
|
IF NOT IS_NAMED_RENDERTARGET_LINKED(mnMonitor)
|
|
LINK_NAMED_RENDERTARGET(mnMonitor)
|
|
ENDIF
|
|
|
|
rtECG = GET_NAMED_RENDERTARGET_RENDER_ID(sECGRenderTarget)
|
|
ENDIF
|
|
|
|
IF IS_SCREEN_FADED_IN()
|
|
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
|
|
// start the safety fade timer
|
|
IF iSwitchFailTimer = -1
|
|
iSwitchFailTimer = GET_GAME_TIMER()
|
|
ENDIF
|
|
|
|
// Safety fade out after 7 seconds
|
|
IF GET_GAME_TIMER() - iSwitchFailTimer > 7000
|
|
SAFE_FADE_OUT()
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
TEXT_LABEL_63 strDebug
|
|
strDebug = "iSwitchFailTimer: "
|
|
strDebug += GET_GAME_TIMER() - iSwitchFailTimer
|
|
DRAW_DEBUG_TEXT_2D(strDebug, <<0.05, 0.5, 0.0>>, 0,0,0, 255)
|
|
|
|
// Once faded out clean up the current scene
|
|
ELIF IS_SCREEN_FADED_OUT()
|
|
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_TREVOR
|
|
FREEZE_ENTITY_POSITION(MIKE_PED_ID(), TRUE)
|
|
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_TREVOR)
|
|
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
|
|
PARTY_CleanupEntitiesAndAssets()
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
IF DOES_CAM_EXIST(sSwaySniping.camInit)
|
|
DESTROY_CAM(sSwaySniping.camInit)
|
|
ENDIF
|
|
IF DOES_CAM_EXIST(sSwaySniping.camDest)
|
|
DESTROY_CAM(sSwaySniping.camDest)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF bStartCutscene
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
|
|
REGISTER_ENTITY_FOR_CUTSCENE(TREV_PED_ID(), "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(null, strMrKCSHandle, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, IG_MRK)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(null, csTrevorCar, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_PLAYER_VEH_MODEL(CHAR_TREVOR))
|
|
REGISTER_ENTITY_FOR_CUTSCENE(null, strMrKCSHandle_DONT_ANIMATE, CU_DONT_ANIMATE_ENTITY, mnVictim)
|
|
|
|
TORTURE_DetachAllProps()
|
|
TORTURE_RegisterAllPropsForCutscene(FALSE)
|
|
|
|
bMrKVariations[MR_K_CABLES] = FALSE
|
|
|
|
clearText()
|
|
bMadeSelection = TRUE
|
|
bDisplaySwitchHUD = FALSE
|
|
bManageParty = FALSE
|
|
bCutsceneSWITCHStarted = TRUE
|
|
bPlayedSwitchSting = FALSE
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("FBI_3_MICHAEL_VANTAGE_POINT_3")
|
|
STOP_AUDIO_SCENE("FBI_3_MICHAEL_VANTAGE_POINT_3")
|
|
ENDIF
|
|
IF IS_AUDIO_SCENE_ACTIVE("FBI_3_MICHAEL_SNIPER_SCOPE_TARGET")
|
|
STOP_AUDIO_SCENE("FBI_3_MICHAEL_SNIPER_SCOPE_TARGET")
|
|
ENDIF
|
|
|
|
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
|
|
START_CUTSCENE()
|
|
SET_MICROPHONE_POSITION(FALSE, <<0,0,0>>, <<0,0,0>>, <<0,0,0>>)
|
|
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
CLEAR_AREA_OF_VEHICLES(vTortureScene, 500.0)
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
// While running
|
|
ELSE
|
|
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_WEAPON_ICON)
|
|
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_AREA_NAME)
|
|
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_DISTRICT_NAME)
|
|
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_STREET_NAME)
|
|
|
|
SWITCH eStage
|
|
CASE ST_4_DRIVE_TO_COORD_SECOND
|
|
|
|
IF NOT bRunPostSwitchFocusCleanup
|
|
IF IS_CUTSCENE_PLAYING()
|
|
PARTY_CleanupEntitiesAndAssets()
|
|
TORTURE_GrabAllPedsFromCutscene()
|
|
TORTURE_GrabAllPropsFromCutscene(TRUE)
|
|
|
|
IF GET_CUTSCENE_TIME() >= 13600
|
|
IF NOT bTortureMusicPlaying
|
|
AND GET_CUTSCENE_TIME() < 14600
|
|
AND HAS_CUTSCENE_CUT_THIS_FRAME()
|
|
TRIGGER_MUSIC_EVENT("FBI3_TORTURE")
|
|
bTortureMusicPlaying = TRUE
|
|
ANIMPOSTFX_PLAY("SwitchSceneTrevor", 0, FALSE)
|
|
PLAY_SOUND_FRONTEND(-1, "Hit_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
ENDIF
|
|
bDisplayHeartMonitor = TRUE
|
|
ENDIF
|
|
SET_PAD_CAN_SHAKE_DURING_CUTSCENE(TRUE)
|
|
ENDIF
|
|
|
|
TORTURE_ResetAllProps(TRUE)
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
CPRINTLN(DEBUG_MIKE, "************ CUTSCENE EXIT CAMERA ***********")
|
|
bCamExited = TRUE
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
|
|
|
|
CPRINTLN(DEBUG_MIKE, "************ CUTSCENE EXIT TREVOR ***********")
|
|
|
|
FREEZE_ENTITY_POSITION(MIKE_PED_ID(), TRUE)
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(TREV_PED_ID(), FALSE)
|
|
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_TREVOR)
|
|
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
|
|
FREEZE_ENTITY_POSITION(TREV_PED_ID(), FALSE)
|
|
|
|
bHasPlayedPickupAnim = FALSE
|
|
|
|
TORTURE_ManageWeaponSelection()
|
|
|
|
TORTURE_InitWeapSelectionCam()
|
|
TORTURE_PlaySyncScene(SCENE_WEAPON_SELECT_IDLE, TRUE)
|
|
|
|
START_AUDIO_SCENE("FBI_3_TREVOR_TORTURE_2")
|
|
|
|
SAFE_FADE_IN()
|
|
|
|
bRunPostSwitchFocusCleanup = TRUE
|
|
bTrevorExited = TRUE
|
|
ENDIF
|
|
ELSE
|
|
|
|
// SET_ENTITY_LOAD_COLLISION_FLAG(TREV_PED_ID(), FALSE) - Moved due to url:bugstar:2073069
|
|
SET_GAME_PAUSES_FOR_STREAMING(TRUE)
|
|
Unload_Asset_NewLoadScene(sAssetData)
|
|
|
|
bMadeSelection = FALSE
|
|
bCutsceneSWITCHStarted = FALSE
|
|
bCutSceneSWITCHPreped = FALSE
|
|
iAssetRequests = 0
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
BREAK
|
|
CASE ST_6_REACT_TO_SECOND
|
|
FALLTHRU
|
|
CASE ST_8_REACT_TO_THIRD
|
|
IF NOT bRunPostSwitchFocusCleanup
|
|
IF IS_CUTSCENE_PLAYING()
|
|
|
|
IF NOT bPlayedSwitchSting
|
|
ANIMPOSTFX_PLAY("SwitchSceneTrevor", 0, FALSE)
|
|
PLAY_SOUND_FRONTEND(-1, "Hit_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
bPlayedSwitchSting = TRUE
|
|
ENDIF
|
|
|
|
PARTY_CleanupEntitiesAndAssets()
|
|
TORTURE_GrabAllPedsFromCutscene()
|
|
TORTURE_GrabAllPropsFromCutscene()
|
|
SET_PAD_CAN_SHAKE_DURING_CUTSCENE(TRUE)
|
|
bDisplayHeartMonitor = TRUE
|
|
|
|
IF NOT bPerformedPostTortureFadeIn
|
|
SAFE_FADE_IN()
|
|
bPerformedPostTortureFadeIn = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
TORTURE_ResetAllProps(TRUE)
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
CPRINTLN(DEBUG_MIKE, "************ CUTSCENE EXIT CAMERA ***********")
|
|
bCamExited = TRUE
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
|
|
|
|
CPRINTLN(DEBUG_MIKE, "************ CUTSCENE EXIT TREVOR ***********")
|
|
|
|
FREEZE_ENTITY_POSITION(MIKE_PED_ID(), TRUE)
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_TREVOR
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(TREV_PED_ID(), FALSE)
|
|
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_TREVOR)
|
|
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
|
|
ENDIF
|
|
FREEZE_ENTITY_POSITION(TREV_PED_ID(), FALSE)
|
|
|
|
bHasPlayedPickupAnim = FALSE
|
|
|
|
TORTURE_ManageWeaponSelection()
|
|
|
|
TORTURE_InitWeapSelectionCam()
|
|
TORTURE_PlaySyncScene(SCENE_WEAPON_SELECT_IDLE, TRUE)
|
|
|
|
IF eMissionStage = ST_6_REACT_TO_SECOND
|
|
START_AUDIO_SCENE("FBI_3_TREVOR_TORTURE_3")
|
|
ELIF eMissionStage = ST_8_REACT_TO_THIRD
|
|
START_AUDIO_SCENE("FBI_3_TREVOR_TORTURE_4")
|
|
ENDIF
|
|
|
|
SAFE_FADE_IN()
|
|
|
|
bTrevorExited = TRUE
|
|
bRunPostSwitchFocusCleanup = TRUE
|
|
ENDIF
|
|
|
|
ELSE
|
|
// SET_ENTITY_LOAD_COLLISION_FLAG(TREV_PED_ID(), FALSE) - Moved due to url:bugstar:2073069
|
|
SET_GAME_PAUSES_FOR_STREAMING(TRUE)
|
|
Unload_Asset_NewLoadScene(sAssetData)
|
|
|
|
bRunPostSwitchFocusCleanup = FALSE
|
|
bMadeSelection = FALSE
|
|
bCutsceneSWITCHStarted = FALSE
|
|
bCutSceneSWITCHPreped = FALSE
|
|
iAssetRequests = 0
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE ST_10_REACT_FINAL
|
|
IF NOT bRunPostSwitchFocusCleanup
|
|
|
|
SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0)
|
|
|
|
// Manage moving the focus and start streaming the outside for after the cutscene
|
|
IF NOT bMovedFocus
|
|
SET_FOCUS_ENTITY(TREV_PED_ID())
|
|
CPRINTLN(DEBUG_MIKE, "SWITCH_Sniping_To_Torture_CUTSCENE() Setting Trevor as focus entity")
|
|
Unload_Asset_NewLoadScene(sAssetData)
|
|
//Load_Asset_NewLoadScene_Frustum(sAssetData, <<120.5339, -2202.8474, 8.2390>>, NORMALISE_VECTOR(<<127.7537, -2195.3679, 6.9974>>-<<120.5339, -2202.8474, 8.2390>>), 200.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
|
|
Load_Asset_NewLoadScene_Sphere(sAssetData, <<130.6803, -2193.3494, 5.0325>>, 500.0) //, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
|
|
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
DESTROY_ALL_CAMS()
|
|
bMovedFocus = TRUE
|
|
ENDIF
|
|
|
|
// Cutscene was skipped, kill the load scene and wait for the cutscene to exit
|
|
IF WAS_CUTSCENE_SKIPPED()
|
|
IF IS_SCREEN_FADED_OUT()
|
|
CPRINTLN(DEBUG_MIKE, "SWITCH_Sniping_To_Torture_CUTSCENE() Skipping the cutscene")
|
|
UNPIN_INTERIOR(interior_torture)
|
|
Unload_Asset_NewLoadScene(sAssetData)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
|
|
IF NOT bPlayedSwitchSting
|
|
ANIMPOSTFX_PLAY("SwitchSceneTrevor", 0, FALSE)
|
|
PLAY_SOUND_FRONTEND(-1, "Hit_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
|
|
bPlayedSwitchSting = TRUE
|
|
ENDIF
|
|
|
|
IF GET_CUTSCENE_TIME() < 38750
|
|
|
|
bDisplayHeartMonitor = TRUE
|
|
|
|
// flat line ecg
|
|
IF GET_CUTSCENE_TIME() > 15540
|
|
bFlatLine = TRUE
|
|
ENDIF
|
|
|
|
// turn off ecg
|
|
ELSE
|
|
|
|
bDisplayHeartMonitor = FALSE
|
|
|
|
bFlatLine = FALSE
|
|
STOP_SOUND(sndList[SND_HEART_FLATLINE_LOOP].SoundId)
|
|
ReleaseSound(SND_HEART_FLATLINE_LOOP)
|
|
|
|
ENDIF
|
|
|
|
IF NOT bPerformedPostTortureFadeIn
|
|
SAFE_FADE_IN()
|
|
bPerformedPostTortureFadeIn = TRUE
|
|
ENDIF
|
|
|
|
PARTY_CleanupEntitiesAndAssets()
|
|
TORTURE_GrabAllPedsFromCutscene(IG_MRK)
|
|
IF NOT DOES_ENTITY_EXIST(vehTrevor)
|
|
ENTITY_INDEX vehTemp
|
|
vehTemp = GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(csTrevorCar, GET_PLAYER_VEH_MODEL(CHAR_TREVOR))
|
|
IF DOES_ENTITY_EXIST(vehTemp)
|
|
vehTrevor = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(vehTemp)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA(TRUE)
|
|
CPRINTLN(DEBUG_MIKE, "************ CUTSCENE EXIT CAMERA ***********")
|
|
bCamExited = TRUE
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(strMrKCSHandle)
|
|
IF NOT IS_PED_IN_VEHICLE(pedVictim, vehTrevor)
|
|
SET_PED_INTO_VEHICLE(pedVictim, vehTrevor, VS_FRONT_RIGHT)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor")
|
|
|
|
CPRINTLN(DEBUG_MIKE, "************ CUTSCENE EXIT TREVOR ***********")
|
|
|
|
FREEZE_ENTITY_POSITION(MIKE_PED_ID(), TRUE)
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_TREVOR
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(TREV_PED_ID(), FALSE)
|
|
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_TREVOR)
|
|
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds)
|
|
ENDIF
|
|
FREEZE_ENTITY_POSITION(TREV_PED_ID(), FALSE)
|
|
|
|
IF NOT IS_PED_IN_VEHICLE(TREV_PED_ID(), vehTrevor)
|
|
SET_PED_INTO_VEHICLE(TREV_PED_ID(), vehTrevor)
|
|
ENDIF
|
|
|
|
SET_ENTITY_COORDS(vehTrevor, vTrevorCarDriveToAirportCoord)
|
|
SET_ENTITY_HEADING(vehTrevor, fTrevorCarSpawnHeading)
|
|
|
|
SET_VEHICLE_DOOR_SHUT(vehTrevor, SC_DOOR_FRONT_LEFT, TRUE)
|
|
SET_VEHICLE_DOOR_SHUT(vehTrevor, SC_DOOR_FRONT_RIGHT, TRUE)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vehTrevor)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
|
|
|
|
DISPLAY_RADAR(TRUE)
|
|
|
|
TORTURE_ResetAllProps(FALSE)
|
|
|
|
DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL])
|
|
|
|
bTrevorExited = TRUE
|
|
bRunPostSwitchFocusCleanup = TRUE
|
|
bFlatLine = FALSE
|
|
IF IS_SCREEN_FADED_OUT()
|
|
CPRINTLN(DEBUG_MIKE, "SWITCH_Sniping_To_Torture_CUTSCENE() Trevor exited on a fade, make sure the interior is unpinned now and the load scene has stopped")
|
|
UNPIN_INTERIOR(interior_torture)
|
|
Unload_Asset_NewLoadScene(sAssetData)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
IF IS_SCREEN_FADED_OUT()
|
|
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
|
|
Load_Asset_NewLoadScene_Sphere(sAssetData, <<130.6803, -2193.3494, 5.0325>>, 100.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION)
|
|
ELSE
|
|
IF IS_NEW_LOAD_SCENE_LOADED()
|
|
AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(TREV_PED_ID())
|
|
AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(pedVictim)
|
|
SAFE_FADE_IN()
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
CLEAR_FOCUS()
|
|
// SET_ENTITY_LOAD_COLLISION_FLAG(TREV_PED_ID(), FALSE) - Moved due to url:bugstar:2073069
|
|
SET_GAME_PAUSES_FOR_STREAMING(TRUE)
|
|
Unload_Asset_NewLoadScene(sAssetData)
|
|
|
|
bMadeSelection = FALSE
|
|
bCutsceneSWITCHStarted = FALSE
|
|
bCutSceneSWITCHPreped = FALSE
|
|
bRunPostSwitchFocusCleanup = FALSE
|
|
iAssetRequests = 0
|
|
bFlatLine = FALSE
|
|
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
|
|
|
|
|
|
//═════════════════════════════════╡ DEBUG PROCEDURES ╞═══════════════════════════════════
|
|
#IF IS_DEBUG_BUILD
|
|
|
|
//PURPOSE: Creates debug widgets
|
|
PROC Debug_CreateWidgets() //Called on mission setup
|
|
widgetDebug = START_WIDGET_GROUP("FBI3")
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Gameplay Cam Heading(relative)", debug_f_cam_rel_heading)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Gameplay Cam Pitch(relative)", debug_f_cam_rel_pitch)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Weapon Zoom level", debug_f_scope_zoom)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Scope speed x", debug_f_scope_speed_x)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Scope speed z", debug_f_scope_speed_z)
|
|
ADD_WIDGET_BOOL("Simulate Streaming Stuck", b_SimulatedStreamingStuck)
|
|
ADD_WIDGET_VECTOR_SLIDER("Scope cam rot", debug_v_scope_cam_rot, -99999, 99999, 0.1)
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
ADD_WIDGET_INT_READ_ONLY("TortureWeaponStage", iTortureWeaponStage)
|
|
#ENDIF
|
|
START_WIDGET_GROUP("Mr K Variations")
|
|
ADD_WIDGET_BOOL("CROTCH BLOODY", bMrKVariations[MR_K_CROTCH_BLOODY])
|
|
ADD_WIDGET_BOOL("FACE BLOODY", bMrKVariations[MR_K_FACE_BLOODY])
|
|
ADD_WIDGET_BOOL("LEG BLOODY", bMrKVariations[MR_K_LEG_BLOODY])
|
|
ADD_WIDGET_BOOL("NIPPLE BURNED", bMrKVariations[MR_K_NIPPLES_BURNED])
|
|
ADD_WIDGET_BOOL("RAG ON FACE", bMrKVariations[MR_K_RAG_FACE])
|
|
ADD_WIDGET_BOOL("TORSO BLOODY", bMrKVariations[MR_K_TORSO_BLOODY])
|
|
ADD_WIDGET_BOOL("WET", bMrKVariations[MR_K_WET])
|
|
ADD_WIDGET_INT_READ_ONLY("TEETH PULLED", iNumberOfTeethPulled)
|
|
STOP_WIDGET_GROUP()
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
START_WIDGET_GROUP("Electrocute scripted task debug")
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Input LT", fClipGripProgLeft)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Input RT", fClipGripProgRight)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Input Balance", fLRBalance)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Input Balance(Normalised)", fLRBalanceNorm)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("AnimWeight Idle", fIdleWeight)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("AnimWeight Attach Left", fLeftWeight)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("AnimWeight Attach Right", fRightWeight)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("AnimWeight Attach Both", fBothWeight)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("AnimWeight Shock", fShockLoopTransition)
|
|
STOP_WIDGET_GROUP()
|
|
#ENDIF
|
|
|
|
STOP_WIDGET_GROUP()
|
|
SET_LOCATES_HEADER_WIDGET_GROUP(widgetDebug)
|
|
ENDPROC
|
|
|
|
//PURPOSE: Updates any debug script each frame
|
|
PROC Debug_Update()
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)
|
|
eMissionStage = ST_13_PASSED_MISSION
|
|
ENDIF
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)
|
|
eMissionFail = FAIL_GENERIC
|
|
bMissionFailed = TRUE
|
|
ENDIF
|
|
|
|
SET_TEXT_RENDER_ID(rtScreen)
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
debug_f_cam_rel_heading = GET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
debug_f_cam_rel_pitch = GET_GAMEPLAY_CAM_RELATIVE_PITCH()
|
|
ENDIF
|
|
|
|
// Toggle debug info
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_HOME)
|
|
b_draw_debug_info = !b_draw_debug_info
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(b_draw_debug_info)
|
|
ENDIF
|
|
|
|
IF b_draw_debug_info
|
|
CONST_FLOAT f_left 0.05
|
|
CONST_FLOAT f_top 0.25
|
|
CONST_FLOAT f_spacing 0.025
|
|
|
|
TEXT_LABEL_63 str_debug_info
|
|
|
|
DRAW_DEBUG_TEXT_WRAPPED_INT( "Mission Stage", enum_to_int( eMissionStage ) )
|
|
|
|
str_debug_info = "Mission Substage: "
|
|
IF bStageSetup = FALSE
|
|
str_debug_info += "SETUP"
|
|
ELSE
|
|
str_debug_info += i_mission_substage
|
|
ENDIF
|
|
DRAW_DEBUG_TEXT_WRAPPED( str_debug_info )
|
|
|
|
DRAW_DEBUG_TEXT_WRAPPED_FLOAT( "Victim Health", fVictimHealth )
|
|
|
|
DRAW_DEBUG_TEXT_WRAPPED_FLOAT( "Torture Force", fTortureForceApplied )
|
|
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
|
|
DRAW_DEBUG_TEXT_WRAPPED_INT( "Torture Stage", iTortureStage )
|
|
|
|
DRAW_DEBUG_TEXT_WRAPPED_INT( "Torture Weapon Stage", iTortureWeaponStage )
|
|
|
|
str_debug_info = "Selected Weapon: "
|
|
SWITCH INT_TO_ENUM(TORTURE_WEAPONS, iCurrentMenuWeapon)
|
|
CASE TOR_CLIP0 str_debug_info += "TOR_CLIP0" BREAK
|
|
CASE TOR_CLIP1 str_debug_info += "TOR_CLIP1" BREAK
|
|
CASE TOR_PLIERS str_debug_info += "TOR_PLIERS" BREAK
|
|
CASE TOR_RAG str_debug_info += "TOR_RAG" BREAK
|
|
CASE TOR_SYRINGE str_debug_info += "TOR_SYRINGE" BREAK
|
|
CASE TOR_WATER str_debug_info += "TOR_WATER" BREAK
|
|
CASE TOR_WRENCH str_debug_info += "TOR_WRENCH" BREAK
|
|
ENDSWITCH
|
|
DRAW_DEBUG_TEXT_WRAPPED( str_debug_info )
|
|
|
|
DRAW_DEBUG_TEXT_WRAPPED_BOOL( "bMadeSelection", bMadeSelection )
|
|
|
|
DRAW_DEBUG_TEXT_WRAPPED_INT( "iNumberOfTeethPulled", iNumberOfTeethPulled )
|
|
|
|
DRAW_DEBUG_TEXT_WRAPPED_INT( "iNumberOfSyringesUsed", iNumberOfSyringesUsed )
|
|
|
|
DRAW_DEBUG_TEXT_WRAPPED_INT( "iAttemptToAimTimer", iAttemptToAimTimer - GET_GAME_TIMER() )
|
|
|
|
DRAW_DEBUG_TEXT_WRAPPED_INT( "iDriveComplaintTimer", iDriveComplaintTimer )
|
|
|
|
str_debug_info = "iDriveComplaintTimer(count down): "
|
|
IF iDriveComplaintTimer - GET_GAME_TIMER() >= 0
|
|
str_debug_info += iDriveComplaintTimer - GET_GAME_TIMER()
|
|
ELSE
|
|
str_debug_info += 0
|
|
ENDIF
|
|
DRAW_DEBUG_TEXT_WRAPPED( str_debug_info )
|
|
|
|
DRAW_DEBUG_TEXT_WRAPPED_BOOL( "bDisplayHeartMonitor", bDisplayHeartMonitor )
|
|
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
iDebugCounter = 0 // reset each frame
|
|
|
|
ENDPROC
|
|
|
|
#ENDIF
|
|
|
|
PROC GET_SKIP_STAGE_COORD_AND_HEADING(INT iStage, VECTOR &vCoord, FLOAT &fHeading)
|
|
|
|
SWITCH int_to_enum(MISSION_STAGE, iStage)
|
|
CASE ST_0_DRIVE_TO_START vCoord = g_startSnapshot.mPlayerStruct.vPos fHeading = g_startSnapshot.mPlayerStruct.fHeading BREAK
|
|
CASE ST_1_INTRO_CUT vCoord = <<126.6574, -2198.7236, 5.0325>> fHeading = 196.4746 BREAK
|
|
CASE ST_2_DRIVE_TO_COORD_FIRST vCoord = vDaveCarOutsideTortureCoords fHeading = fDaveCarOutsideTortureHeading BREAK
|
|
CASE ST_3_TORTURE_FOR_FIRST vCoord = vTrevorTortureCoords fHeading = fTrevorTortureHeading BREAK
|
|
CASE ST_4_DRIVE_TO_COORD_SECOND vCoord = <<-1270.1217, -883.5477, 10.9303>> fHeading = 219.3017 BREAK
|
|
CASE ST_5_TORTURE_FOR_SECOND vCoord = vTrevorTortureCoords fHeading = fTrevorTortureHeading BREAK
|
|
CASE ST_6_REACT_TO_SECOND vCoord = vMichaelSnipeCoords fHeading = fMichaelSnipeHeading BREAK
|
|
CASE ST_7_TORTURE_FOR_THIRD vCoord = vTrevorTortureCoords fHeading = fTrevorTortureHeading BREAK
|
|
CASE ST_8_REACT_TO_THIRD vCoord = vMichaelSnipeCoords fHeading = fMichaelSnipeHeading BREAK
|
|
CASE ST_9_TORTURE_FINAL vCoord = vTrevorTortureCoords fHeading = fTrevorTortureHeading BREAK
|
|
CASE ST_10_REACT_FINAL vCoord = vMichaelSnipeCoords fHeading = fMichaelSnipeHeading BREAK
|
|
CASE ST_11_DRIVE_TO_AIRPORT vCoord = vTrevorCarDriveToAirportCoord fHeading = fTrevorCarSpawnHeading BREAK
|
|
CASE ST_13_PASSED_MISSION vCoord = <<-1034.6471, -2729.8953, 19.0672>> fHeading = 240.9291 BREAK
|
|
ENDSWITCH
|
|
|
|
ENDPROC
|
|
|
|
//PURPOSE: Setsup the mission
|
|
PROC MissionSetup()
|
|
|
|
SET_MISSION_FLAG(TRUE)
|
|
|
|
// Handle replay
|
|
//----------------------------------------------------------------------
|
|
|
|
iTargetPedSlot[0] = enum_to_int(PEDSLOT_NOT_ASSIGNED)
|
|
iTargetPedSlot[1] = enum_to_int(PEDSLOT_NOT_ASSIGNED)
|
|
iTargetPedSlot[2] = enum_to_int(PEDSLOT_NOT_ASSIGNED)
|
|
|
|
IF IS_REPLAY_IN_PROGRESS()
|
|
b_SpawnTrain = FALSE
|
|
ELSE
|
|
b_SpawnTrain = TRUE
|
|
ENDIF
|
|
|
|
IF IS_REPLAY_IN_PROGRESS() // RETRIES
|
|
OR IS_REPEAT_PLAY_ACTIVE() // REPLAY VIA START MENU
|
|
|
|
INT iCheckpointToSkipTo
|
|
|
|
IF IS_REPLAY_IN_PROGRESS()
|
|
|
|
iCheckpointToSkipTo = GET_REPLAY_MID_MISSION_STAGE()
|
|
CPRINTLN(DEBUG_MIKE, "FBI3: Get_Replay_Mid_Mission_Stage() = ", iCheckpointToSkipTo)
|
|
IF g_bShitskipAccepted
|
|
iCheckpointToSkipTo += 1
|
|
CPRINTLN(DEBUG_MIKE, "FBI3: g_bShitskipAccepted")
|
|
ENDIF
|
|
|
|
ELIF IS_REPEAT_PLAY_ACTIVE()
|
|
|
|
iCheckpointToSkipTo = 0
|
|
|
|
ENDIF
|
|
|
|
CPRINTLN(DEBUG_MIKE, "FBI3: Checkpoint skipping to ", iCheckpointToSkipTo)
|
|
|
|
// Translate checkpoint into mission stage
|
|
SWITCH iCheckpointToSkipTo
|
|
// Make sure to always skip the drive section for mission replays via the mission replay menu.
|
|
CASE 0
|
|
IF IS_REPEAT_PLAY_ACTIVE()
|
|
eMissionStage = ST_1_INTRO_CUT
|
|
ELSE
|
|
eMissionStage = ST_0_DRIVE_TO_START
|
|
ENDIF
|
|
BREAK
|
|
CASE 1 eMissionStage = ST_1_INTRO_CUT BREAK
|
|
CASE 2 eMissionStage = ST_2_DRIVE_TO_COORD_FIRST BREAK
|
|
CASE 3
|
|
eMissionStage = ST_3_TORTURE_FOR_FIRST
|
|
// if has shit skipped here reset the replay vehicle, we don't know what the player took here
|
|
// and it hasn't been through the restriction logic
|
|
IF g_bShitskipAccepted
|
|
Reset_Vehicle_Snapshot(g_stageSnapshot.mVehicleStruct)
|
|
ENDIF
|
|
BREAK
|
|
CASE 4 eMissionStage = ST_4_DRIVE_TO_COORD_SECOND BREAK
|
|
CASE 5 eMissionStage = ST_5_TORTURE_FOR_SECOND BREAK
|
|
CASE 6 eMissionStage = ST_6_REACT_TO_SECOND BREAK
|
|
CASE 7 eMissionStage = ST_7_TORTURE_FOR_THIRD BREAK
|
|
CASE 8 eMissionStage = ST_8_REACT_TO_THIRD BREAK
|
|
CASE 9 eMissionStage = ST_9_TORTURE_FINAL BREAK
|
|
CASE 10 eMissionStage = ST_10_REACT_FINAL BREAK
|
|
CASE 11 eMissionStage = ST_11_DRIVE_TO_AIRPORT BREAK
|
|
CASE 12 eMissionStage = ST_12_EXIT_CUT BREAK
|
|
CASE 13 eMissionStage = ST_13_PASSED_MISSION BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT g_bShitskipAccepted
|
|
IF eMissionStage = ST_6_REACT_TO_SECOND
|
|
OR eMissionStage = ST_8_REACT_TO_THIRD
|
|
OR eMissionStage = ST_10_REACT_FINAL
|
|
bDontPlayFullSnipeChat = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CPRINTLN(DEBUG_MIKE, "FBI3: stage skipping to ", enum_to_int(eMissionStage))
|
|
|
|
// New replay streaming
|
|
IF IS_REPLAY_IN_PROGRESS()
|
|
VECTOR vSkipToCoord
|
|
FLOAT fSkipToHeading
|
|
GET_SKIP_STAGE_COORD_AND_HEADING(enum_to_int(eMissionStage), vSkipToCoord, fSkipToHeading)
|
|
START_REPLAY_SETUP(vSkipToCoord, fSkipToHeading)
|
|
CPRINTLN(DEBUG_MIKE, "FBI3: Using replay warp system - Warp Coord ", vSkipToCoord, " Warp Heading ", fSkipToHeading)
|
|
ENDIF
|
|
|
|
bDoSkip = TRUE
|
|
ENDIF
|
|
|
|
//SET_INTERIOR_CAPPED(INTERIOR_V_TORTURE, FALSE)
|
|
|
|
SET_PED_MODEL_IS_SUPPRESSED(mnTarget, TRUE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_MICHAEL), TRUE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_TREVOR), TRUE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_NPC_VEH_MODEL(CHAR_DAVE), TRUE)
|
|
|
|
//INFORM_MISSION_STATS_OF_MISSION_START_FBI_THREE()
|
|
REGISTER_SCRIPT_WITH_AUDIO()
|
|
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_FIB3_BEACH_HOUSE, BUILDINGSTATE_DESTROYED)
|
|
|
|
Load_Asset_Additional_Text(sAssetData, sTextBlock, MISSION_TEXT_SLOT)
|
|
Load_Asset_Additional_Text(sAssetData, sAudioBlock, MISSION_DIALOGUE_TEXT_SLOT)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
Debug_CreateWidgets()
|
|
#ENDIF
|
|
|
|
|
|
// Get the character started as from the replay snapshot
|
|
IF g_startSnapshot.eCharacter = CHAR_MICHAEL
|
|
bStartedAsMichael = TRUE
|
|
sSelectorPeds.eCurrentSelectorPed = SELECTOR_PED_MICHAEL
|
|
ELSE
|
|
bStartedAsMichael = FALSE
|
|
sSelectorPeds.eCurrentSelectorPed = SELECTOR_PED_TREVOR
|
|
ENDIF
|
|
|
|
ADD_RELATIONSHIP_GROUP("CREW", grpCrew)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, grpCrew)
|
|
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, grpCrew, RELGROUPHASH_PLAYER)
|
|
|
|
vHouseSectionCentre[HS_HIGH_LEFT] = << -3091.7322, 332.170875, 18.6771 >> //<< -3091.7322, 337.2985, 16.7714 >>
|
|
vHouseSectionCentre[HS_HIGH_RIGHT] = << -3091.7322, 362.594475, 18.6771 >> //<< -3091.7322, 357.5809, 16.7714 >>
|
|
vHouseSectionCentre[HS_LOW_LEFT] = << -3091.7322, 332.170875, 7.500 >> //<< -3091.7322, 337.2985, 9.4100 >>
|
|
vHouseSectionCentre[HS_LOW_RIGHT] = << -3091.7322, 362.594475, 7.500 >> //<< -3091.7322, 357.5809, 9.4100 >>
|
|
vHouseSectionCentre[HS_CENTRE] = << -3091.7322, 347.55375, 12.9600 >> //<< -3091.7322, 347.55375, 12.9600 >>
|
|
|
|
vTargetPedSlots[PEDSLOT_UPPER_LEFT] = <<-3092.78, 340.39, 14.48>>
|
|
vTargetPedSlots[PEDSLOT_UPPER_CENTER] = <<-3091.56, 344.96, 14.48>>
|
|
vTargetPedSlots[PEDSLOT_UPPER_RIGHT] = <<-3091.20, 354.61, 14.47>>
|
|
|
|
vTargetPedSlots[PEDSLOT_LOWER_LEFT] = <<-3092.49, 342.06, 10.82>>
|
|
vTargetPedSlots[PEDSLOT_LOWER_CENTER] = <<-3092.49, 349.96, 10.82>>
|
|
vTargetPedSlots[PEDSLOT_LOWER_RIGHT] = <<-3091.08, 355.04, 10.84>>
|
|
|
|
rtScreen = GET_DEFAULT_SCRIPT_RENDERTARGET_RENDER_ID()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
SkipMenuStruct[0].sTxtLabel = "[0] 0. Drive to the start"
|
|
SkipMenuStruct[1].sTxtLabel = "[1] 1. FBI_3_INT"
|
|
SkipMenuStruct[2].sTxtLabel = "[2] 2. Michael Drives 1st"
|
|
SkipMenuStruct[3].sTxtLabel = "[3] 3. Trevor Tortures 1st"
|
|
SkipMenuStruct[4].sTxtLabel = "[4] MCS_1 - Info Chumash"
|
|
SkipMenuStruct[4].bSelectable = FALSE
|
|
SkipMenuStruct[5].sTxtLabel = "[5] 4. Michael Drives 2nd"
|
|
SkipMenuStruct[6].sTxtLabel = "[6] MCS_2 - Arrive at Chumash"
|
|
SkipMenuStruct[6].bSelectable = FALSE
|
|
SkipMenuStruct[7].sTxtLabel = "[7] 5. Trevor Tortures 2nd"
|
|
SkipMenuStruct[8].sTxtLabel = "[8] MCS_3 - Info Build/Height/Age"
|
|
SkipMenuStruct[8].bSelectable = FALSE
|
|
SkipMenuStruct[9].sTxtLabel = "[9] 6. Michael Reacts to 2nd"
|
|
SkipMenuStruct[10].sTxtLabel = "[10] MCS_4p2 - Cutback"
|
|
SkipMenuStruct[10].bSelectable = FALSE
|
|
SkipMenuStruct[11].sTxtLabel = "[11] 7. Trevor Tortures 3rd"
|
|
SkipMenuStruct[12].sTxtLabel = "[12] MCS_5 - Info Beard"
|
|
SkipMenuStruct[12].bSelectable = FALSE
|
|
SkipMenuStruct[13].sTxtLabel = "[13] 8. Michael Reacts to 3rd"
|
|
SkipMenuStruct[14].sTxtLabel = "[14] MCS_5p2 - Cutback Smokes"
|
|
SkipMenuStruct[14].bSelectable = FALSE
|
|
SkipMenuStruct[15].sTxtLabel = "[15] 9. Trevor Tortures Final"
|
|
SkipMenuStruct[16].sTxtLabel = "[16] MCS_6p2 - Info Smoker"
|
|
SkipMenuStruct[16].bSelectable = FALSE
|
|
SkipMenuStruct[17].sTxtLabel = "[17] 10. Michael Kills Target"
|
|
SkipMenuStruct[18].sTxtLabel = "[18] MCS_7 - Get MrK into Truck"
|
|
SkipMenuStruct[18].bSelectable = FALSE
|
|
SkipMenuStruct[19].sTxtLabel = "[19] 11. Trevor Drives MrK to Airport"
|
|
SkipMenuStruct[20].sTxtLabel = "[20] 12. MCS_8 - Drop off MrK"
|
|
SkipMenuStruct[21].sTxtLabel = "[21] 13. Mission Passed at Airport"
|
|
#ENDIF
|
|
|
|
// Sort out the roads and paths
|
|
SET_ROADS_IN_AREA(<< 77.0999, -2243.1301, -2.8697 >>, << 306.7302, -2159.3760, 35.3531 >>, FALSE)
|
|
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<< 77.0999, -2243.1301, -2.8697 >>,<< 306.7302, -2159.3760, 35.3531 >>,FALSE)
|
|
|
|
ADD_SCENARIO_BLOCKING_AREA(
|
|
<<-3100.807129,357.957367,14.520833>> - <<2.937500,2.750000,1.312500>>,
|
|
<<-3100.807129,357.957367,14.520833>> + <<2.937500,2.750000,1.312500>>)
|
|
|
|
ADD_SCENARIO_BLOCKING_AREA(
|
|
<<-3091.965088,345.613770,10.923056>> - <<1.500000,1.875000,1.312500>>,
|
|
<<-3091.965088,345.613770,10.923056>> + <<1.500000,1.875000,1.312500>>)
|
|
|
|
// Dock vehicles coming in
|
|
ADD_SCENARIO_BLOCKING_AREA(
|
|
<<225.981720,-2079.282471,16.715635>> + <<1.000000,1.000000,1.000000>>,
|
|
<<225.981720,-2079.282471,16.715635>> - <<1.000000,1.000000,1.000000>>)
|
|
|
|
// Dock vehicles going out
|
|
ADD_SCENARIO_BLOCKING_AREA(
|
|
<<248.975784,-2184.234619,8.348366>> + <<1.000000,1.000000,1.000000>>,
|
|
<<248.975784,-2184.234619,8.348366>> - <<1.000000,1.000000,1.000000>>)
|
|
|
|
CLEAR_AREA(<<-3103.392090,349.964447,8.943123>>, 17.625000, TRUE)
|
|
|
|
ADD_SCENARIO_BLOCKING_AREA(
|
|
<<153.994003,-2189.285156,13.849371>>-<<29.875000,18.875000,10.187500>>,
|
|
<<153.994003,-2189.285156,13.849371>>+<<29.875000,18.875000,10.187500>>)
|
|
|
|
CLEAR_AREA(<<153.994003,-2189.285156,13.849371>>, 30.0, TRUE)
|
|
|
|
INT iCounter
|
|
FOR iCounter = 0 TO ENUM_TO_INT(NUMBER_OF_SCENES)-1
|
|
syncScene[iCounter] = -1
|
|
ENDFOR
|
|
|
|
// Grab the target/dummy target positions from the replay info
|
|
IF Is_Replay_In_Progress()
|
|
|
|
// retrieve the target and decoy slots from the packed bit field
|
|
iTargetPedSlot[0] = g_replay.iReplayInt[0] & BITMASK_TARGET_SLOT_0
|
|
iTargetPedSlot[1] = SHIFT_RIGHT(g_replay.iReplayInt[0], BITSHIFTER_TARGET_SLOT) & BITMASK_TARGET_SLOT_0
|
|
iTargetPedSlot[2] = SHIFT_RIGHT(g_replay.iReplayInt[0], 2*BITSHIFTER_TARGET_SLOT) & BITMASK_TARGET_SLOT_0
|
|
|
|
// Retrieve the victims health
|
|
fVictimHealth = TO_FLOAT(g_replay.iReplayInt[1] & BITMASK_VICTIMHEALTH)
|
|
|
|
// Retrieve the victims variations
|
|
INT iVarBitField = SHIFT_RIGHT(g_replay.iReplayInt[1] & BITMASK_VICTIMVARS, BITSHIFTER_VICTIMHEALTH)
|
|
INT i
|
|
REPEAT COUNT_OF(bMrKVariations) i
|
|
IF IS_BIT_SET(iVarBitField, i)
|
|
bMrKVariations[i] = TRUE
|
|
ELSE
|
|
bMrKVariations[i] = FALSE
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
// Retrieve the number of teeth pulled
|
|
iNumberOfTeethPulled = SHIFT_RIGHT(g_replay.iReplayInt[1] & BITMASK_VICTIMTEETH, BITSHIFTER_VICTIMHEALTH + BITSHIFTER_VICTIMVARS)
|
|
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
// Retrieve the numver of syringes used
|
|
iNumberOfSyringesUsed = SHIFT_RIGHT(g_replay.iReplayInt[1] & BITMASK_SYRINGES, BITSHIFTER_VICTIMHEALTH + BITSHIFTER_VICTIMVARS + BITSHIFTER_VICTIMTEETH)
|
|
#ENDIF
|
|
|
|
// not doing a replay so randomly pick the positions for the target/dummy targets
|
|
ELSE
|
|
|
|
iTargetPedSlot[0] = -1
|
|
iTargetPedSlot[1] = -1
|
|
iTargetPedSlot[2] = -1
|
|
|
|
// Store the target position
|
|
WHILE iTargetPedSlot[0] = -1
|
|
OR iTargetPedSlot[0] = enum_to_int(PEDSLOT_NUM_OF_SLOTS)
|
|
iTargetPedSlot[0] = GET_RANDOM_INT_IN_RANGE(0, enum_to_int(PEDSLOT_NUM_OF_SLOTS))
|
|
ENDWHILE
|
|
g_replay.iReplayInt[0] -= g_replay.iReplayInt[0] & BITMASK_TARGET_SLOT_0 // Wipe any stored data in this slot
|
|
g_replay.iReplayInt[0] |= iTargetPedSlot[0] // store data into bitfield
|
|
|
|
WHILE iTargetPedSlot[1] = -1
|
|
OR iTargetPedSlot[1] = iTargetPedSlot[0]
|
|
OR iTargetPedSlot[1] = enum_to_int(PEDSLOT_NUM_OF_SLOTS)
|
|
iTargetPedSlot[1] = GET_RANDOM_INT_IN_RANGE(0, enum_to_int(PEDSLOT_NUM_OF_SLOTS))
|
|
ENDWHILE
|
|
g_replay.iReplayInt[0] -= g_replay.iReplayInt[0] & BITMASK_TARGET_SLOT_1 // Wipe any stored data in this slot
|
|
g_replay.iReplayInt[0] |= SHIFT_LEFT(iTargetPedSlot[1], BITSHIFTER_TARGET_SLOT) // store data into bitfield
|
|
|
|
WHILE iTargetPedSlot[2] = -1
|
|
OR iTargetPedSlot[2] = iTargetPedSlot[0]
|
|
OR iTargetPedSlot[2] = iTargetPedSlot[1]
|
|
OR iTargetPedSlot[2] = enum_to_int(PEDSLOT_NUM_OF_SLOTS)
|
|
iTargetPedSlot[2] = GET_RANDOM_INT_IN_RANGE(0, enum_to_int(PEDSLOT_NUM_OF_SLOTS))
|
|
ENDWHILE
|
|
g_replay.iReplayInt[0] -= g_replay.iReplayInt[0] & BITMASK_TARGET_SLOT_2 // Wipe any stored data in this slot
|
|
g_replay.iReplayInt[0] |= SHIFT_LEFT(iTargetPedSlot[2], 2*BITSHIFTER_TARGET_SLOT) // store data into bitfield
|
|
|
|
TORTURE_Store_Victim_State()
|
|
|
|
ENDIF
|
|
|
|
interior_torture = GET_INTERIOR_AT_COORDS_WITH_TYPE(<< 143.3550, -2202.2996, 6.1902 >>, "v_torture")
|
|
IF IS_VALID_INTERIOR(interior_torture)
|
|
PIN_INTERIOR_IN_MEMORY(interior_torture)
|
|
ELSE
|
|
SCRIPT_ASSERT("INTERIOR NOT FOUND! V_TORTURE")
|
|
ENDIF
|
|
|
|
bMrKVariations[MR_K_CABLES] = TRUE
|
|
|
|
Reset_Cutscene_Ped_Variation_Streaming(sCutscenePedVariationRegister)
|
|
ENDPROC
|
|
|
|
//PURPOSE: Clears up the mission booleans. Leave bResetHotswap true unless occuring in Cardiac arrest
|
|
PROC MissionStageTidyUp()
|
|
INT iCounter
|
|
FOR iCounter = 0 TO NUMBER_OF_EVENT_FLAGS-1
|
|
bEventFlag[iCounter] = FALSE
|
|
ENDFOR
|
|
|
|
FOR iCounter = 0 TO 2
|
|
bDriveConversationFlags[iCounter] = FALSE
|
|
ENDFOR
|
|
|
|
str_InteruptedRoot = ""
|
|
str_InteruptedLabel = ""
|
|
|
|
bPromptedSWITCH = FALSE
|
|
bMadeSelection = FALSE
|
|
bHasPlayedPickupAnim = FALSE
|
|
fTortureForceApplied = 0
|
|
iSelectWeaponStage = 0
|
|
fSmokeEvo = 0
|
|
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
bJustStarting = TRUE
|
|
bHasBeenSyringed = FALSE
|
|
bMenuRightPressed = FALSE
|
|
bMenuLeftPressed = FALSE
|
|
iTortureStage = 0
|
|
|
|
IF bFXElecSmoulder
|
|
IF DOES_PARTICLE_FX_LOOPED_EXIST(ptfxElecSmoulder)
|
|
STOP_PARTICLE_FX_LOOPED(ptfxElecSmoulder)
|
|
ENDIF
|
|
bFXElecSmoulder = FALSE
|
|
ENDIF
|
|
#ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: Cleans up the mission
|
|
PROC MissionCleanup(CLEANUP_TYPE_FLAG cleanupType)
|
|
|
|
INT i
|
|
|
|
CPRINTLN(DEBUG_MIKE, "-------- FBI3: Start MissionCleanup()")
|
|
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
|
|
|
|
BOOL bImmediateCleanup
|
|
INT iCounter
|
|
|
|
SWITCH cleanupType
|
|
CASE CTF_RESET
|
|
bImmediateCleanup = TRUE
|
|
BREAK
|
|
CASE CTF_INSTANT
|
|
bImmediateCleanup = TRUE
|
|
BREAK
|
|
CASE CTF_DEATH_ARREST_DELAYED
|
|
bImmediateCleanup = FALSE
|
|
SET_CLEANUP_TO_RUN_ON_RESPAWN(RCI_FBI3)
|
|
BREAK
|
|
CASE CTF_MISSION_PASSED
|
|
bImmediateCleanup = FALSE
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF cleanupType != CTF_RESET
|
|
SET_BUILDING_STATE(BUILDINGNAME_IPL_FIB3_BEACH_HOUSE, BUILDINGSTATE_NORMAL)
|
|
//SET_INTERIOR_CAPPED(INTERIOR_V_TORTURE, TRUE)
|
|
ENDIF
|
|
|
|
IF IS_CUTSCENE_ACTIVE()
|
|
REMOVE_CUTSCENE()
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED( PLAYER_PED_ID() )
|
|
AND GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
|
|
IF GET_PED_COMP_ITEM_CURRENT_SP(TREV_PED_ID(), COMP_TYPE_LEGS) = GET_PED_COMP_ITEM_FROM_VARIATIONS(TREV_PED_ID(), 25, 0, COMP_TYPE_LEGS)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(TREV_PED_ID(), COMP_TYPE_LEGS, GET_PED_COMP_ITEM_FROM_VARIATIONS(TREV_PED_ID(), 0, 0, COMP_TYPE_LEGS), FALSE)
|
|
ENDIF
|
|
IF GET_PED_COMP_ITEM_CURRENT_SP(TREV_PED_ID(), COMP_TYPE_SPECIAL) = GET_PED_COMP_ITEM_FROM_VARIATIONS(TREV_PED_ID(), 12, 0, COMP_TYPE_SPECIAL)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(TREV_PED_ID(), COMP_TYPE_SPECIAL, GET_PED_COMP_ITEM_FROM_VARIATIONS(TREV_PED_ID(), 0, 0, COMP_TYPE_SPECIAL), FALSE)
|
|
ENDIF
|
|
IF GET_PED_COMP_ITEM_CURRENT_SP(TREV_PED_ID(), COMP_TYPE_FEET) = GET_PED_COMP_ITEM_FROM_VARIATIONS(TREV_PED_ID(), 11, 0, COMP_TYPE_FEET)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(TREV_PED_ID(), COMP_TYPE_FEET, GET_PED_COMP_ITEM_FROM_VARIATIONS(TREV_PED_ID(), 0, 0, COMP_TYPE_FEET), FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
PARTY_ResetScopeCheck()
|
|
Reset_Cutscene_Ped_Variation_Streaming(sCutscenePedVariationRegister)
|
|
|
|
// Cleanups that dont happen when not an immediate cleanup
|
|
IF bImmediateCleanup
|
|
|
|
FOR iCounter = 0 TO NUMBER_OF_EVENT_FLAGS-1
|
|
bEventFlag[iCounter] = FALSE
|
|
ENDFOR
|
|
|
|
IF IS_NAMED_RENDERTARGET_REGISTERED(sECGRenderTarget)
|
|
RELEASE_NAMED_RENDERTARGET(sECGRenderTarget)
|
|
ENDIF
|
|
|
|
IF bPlayingMusic
|
|
STOP_AUDIO_SCENE(audsceneZoom)
|
|
STOP_STREAM()
|
|
bPlayingMusic = FALSE
|
|
ENDIF
|
|
|
|
SET_FRONTEND_RADIO_ACTIVE(TRUE)
|
|
|
|
CPRINTLN(DEBUG_MIKE, "-------- FBI3: Immediate entity cleanup")
|
|
PARTY_CleanupEntitiesAndAssets()
|
|
TORTURE_CleanupEntitiesAndAssets()
|
|
|
|
REMOVE_DECALS_IN_RANGE(<<-3095.93, 344.02, 13.50>>, 34.375)
|
|
|
|
DESTROY_ALL_CAMS()
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
ENDIF
|
|
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
|
|
FOR iCounter = 0 TO ENUM_TO_INT(NUMBER_OF_SCENES)-1
|
|
syncScene[iCounter] = -1
|
|
ENDFOR
|
|
|
|
IF bHasChairPlayedAnim
|
|
IF DOES_ENTITY_EXIST(objChair)
|
|
STOP_SYNCHRONIZED_ENTITY_ANIM(objChair, INSTANT_BLEND_OUT, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
MissionStageTidyUp()
|
|
|
|
SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
|
SET_MAX_WANTED_LEVEL(5)
|
|
SET_CREATE_RANDOM_COPS(TRUE)
|
|
|
|
CLEAR_MISSION_LOCATION_TEXT_AND_BLIPS(sLocatesData)
|
|
|
|
//═════════╡ TORTURE ╞═════════
|
|
FOR iCounter = 0 TO ENUM_TO_INT(NO_OF_TORTURE_WEAPONS)-1
|
|
TORTURE_CleanupWeapon(menuWeapon[iCounter], TRUE)
|
|
ENDFOR
|
|
|
|
//═════════╡ BLIPS ╞═════════
|
|
IF DOES_BLIP_EXIST(blipLocate)
|
|
REMOVE_BLIP(blipLocate)
|
|
ENDIF
|
|
|
|
CPRINTLN(DEBUG_MIKE, "-------- FBI3: Object tidyUp")
|
|
//═════════╡ OBJECTS ╞═════════
|
|
TidyUpObject(objTable, bImmediateCleanup)
|
|
TidyUpObject(objSmallTable, bImmediateCleanup)
|
|
TidyUpObject(objBattery, bImmediateCleanup)
|
|
TidyUpObject(objChair, bImmediateCleanup)
|
|
TidyUpObject(objMonitor, bImmediateCleanup)
|
|
TidyUpObject(objTooth, bImmediateCleanup)
|
|
TidyUpObject(propPhoneDave, bImmediateCleanup)
|
|
TidyUpObject(propPhoneSteve, bImmediateCleanup)
|
|
TidyUpObject(objTapeArmLeft, bImmediateCleanup)
|
|
TidyUpObject(objTapeArmRight, bImmediateCleanup)
|
|
|
|
REPEAT COUNT_OF(objCunts) i
|
|
TidyUpObject(objCunts[i], bImmediateCleanup)
|
|
ENDREPEAT
|
|
|
|
MISSION_OBJECT_FLAGS eObj
|
|
REPEAT COUNT_OF(objs) eObj
|
|
TidyUpObject(objs[eObj], bImmediateCleanup)
|
|
ENDREPEAT
|
|
|
|
//═════════╡ VEHICLES ╞═════════)
|
|
TidyUpVehicle(vehTrevor, bImmediateCleanup)
|
|
TidyUpVehicle(vehDriveToVeh, bImmediateCleanup)
|
|
TidyUpVehicle(vehReplay, bImmediateCleanup)
|
|
IF bImmediateCleanup
|
|
DELETE_ALL_TRAINS()
|
|
ELSE
|
|
SET_MISSION_TRAIN_AS_NO_LONGER_NEEDED(vehTrainStart)
|
|
ENDIF
|
|
|
|
//═════════╡ PEDS ╞═════════
|
|
|
|
TidyUpPed(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], bImmediateCleanup)
|
|
TidyUpPed(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], bImmediateCleanup)
|
|
TidyUpPed(pedVictim, bImmediateCleanup)
|
|
TidyUpPed(pedSteve, bImmediateCleanup)
|
|
TidyUpPed(pedDave, bImmediateCleanup)
|
|
|
|
TidyUpPed(pedProneMichael, bImmediateCleanup)
|
|
|
|
REPEAT COUNT_OF(pedCunts) i
|
|
TidyUpPed(pedCunts[i], bImmediateCleanup)
|
|
ENDREPEAT
|
|
|
|
MISSION_PED_FLAGS ePedCounter
|
|
REPEAT COUNT_OF(peds) ePedCounter
|
|
TidyUpPed(peds[ePedCounter].id, bImmediateCleanup)
|
|
peds[ePedCounter].bFleeing = FALSE
|
|
ENDREPEAT
|
|
|
|
iPartyBStage = 0
|
|
iPartyDStage = 0
|
|
|
|
//Activate player control
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(),TRUE)
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
SET_ENTITY_COLLISION(PLAYER_PED_ID(), TRUE)
|
|
IF NOT IS_ENTITY_VISIBLE(PLAYER_PED_ID())
|
|
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
DISABLE_CELLPHONE(FALSE)
|
|
DISABLE_TAXI_HAILING(FALSE)
|
|
str_dialogue_root = ""
|
|
bTriggeringConversation = FALSE
|
|
|
|
IF IS_NAMED_RENDERTARGET_REGISTERED(sECGRenderTarget)
|
|
RELEASE_NAMED_RENDERTARGET(sECGRenderTarget)
|
|
ENDIF
|
|
|
|
//═════════╡ SEQUENCES ╞═════════
|
|
CLEAR_SEQUENCE_TASK(seqSequence)
|
|
|
|
//═════════╡ CAMS ╞═════════
|
|
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
DISPLAY_RADAR(TRUE)
|
|
|
|
STOP_GAMEPLAY_CAM_SHAKING(TRUE)
|
|
STOP_SCRIPT_GLOBAL_SHAKING(TRUE)
|
|
SET_WIDESCREEN_BORDERS(FALSE, 0)
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
ENDIF
|
|
|
|
//═════════╡ GROUPS ╞═════════
|
|
IF cleanupType != CTF_RESET
|
|
REMOVE_RELATIONSHIP_GROUP(grpCrew)
|
|
ENDIF
|
|
|
|
IF NOT IS_PLAYER_DEAD(PLAYER_ID())
|
|
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE)
|
|
ENDIF
|
|
|
|
// Flags
|
|
bHasChairPlayedAnim = FALSE
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
bHasRestraintPlayedAnim = FALSE
|
|
#ENDIF
|
|
ePartyState = PCS_NOT_CRASHED
|
|
|
|
IF cleanupType != CTF_RESET
|
|
UNREGISTER_SCRIPT_WITH_AUDIO()
|
|
#IF IS_DEBUG_BUILD
|
|
IF DOES_WIDGET_GROUP_EXIST(widgetDebug)
|
|
DELETE_WIDGET_GROUP(widgetDebug)
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
SET_PED_MODEL_IS_SUPPRESSED(mnTarget, FALSE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_MICHAEL), FALSE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_PLAYER_VEH_MODEL(CHAR_TREVOR), FALSE)
|
|
SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_NPC_VEH_MODEL(CHAR_DAVE), FALSE)
|
|
ENDIF
|
|
|
|
clearText(TRUE, TRUE, TRUE)
|
|
|
|
SET_TIME_SCALE(1.0)
|
|
SET_RANDOM_TRAINS(TRUE)
|
|
|
|
//Stopping a switch when cleaning up for a switch to MP will break
|
|
//the MP switch. #1618486
|
|
IF eMissionFail = FAIL_FORCE_CLEANUP
|
|
AND GET_CAUSE_OF_MOST_RECENT_FORCE_CLEANUP() != FORCE_CLEANUP_FLAG_SP_TO_MP
|
|
STOP_PLAYER_SWITCH()
|
|
ENDIF
|
|
|
|
bTortureMusicPlaying = FALSE
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(strOneShotLoaded)
|
|
CANCEL_MUSIC_EVENT(strOneShotLoaded)
|
|
strOneShotLoaded = ""
|
|
ENDIF
|
|
|
|
CLEAR_WEATHER_TYPE_PERSIST()
|
|
|
|
IF IS_CHEAT_DISABLED(CHEAT_TYPE_ALL)
|
|
DISABLE_CHEAT(CHEAT_TYPE_ALL, FALSE)
|
|
ENDIF
|
|
|
|
STOP_AUDIO_SCENES()
|
|
|
|
IF bPlayerLockedIn
|
|
CLEAR_BLOCKED_PLAYER_FOR_LEAD_IN()
|
|
bPlayerLockedIn = FALSE
|
|
ENDIF
|
|
|
|
CASCADE_SHADOWS_INIT_SESSION()
|
|
|
|
IF bStoredSniperSnapshot
|
|
IF DOES_ENTITY_EXIST(MIKE_PED_ID())
|
|
STORE_PLAYER_PED_WEAPONS(MIKE_PED_ID())
|
|
ENDIF
|
|
g_savedGlobals.sPlayerData.sInfo.sWeapons[CHAR_MICHAEL].sWeaponInfo[21] = sSniperSnapshot
|
|
IF DOES_ENTITY_EXIST(MIKE_PED_ID())
|
|
RESTORE_PLAYER_PED_WEAPONS(MIKE_PED_ID())
|
|
ENDIF
|
|
bStoredSniperSnapshot = FALSE
|
|
ENDIF
|
|
|
|
// cleanup anything that has already marked for cleanup
|
|
Update_Entity_Cleanup_Queue(sEntityCleanupQueue, TRUE)
|
|
|
|
g_sSelectorUI.bFX_SkipFadeOut = FALSE
|
|
|
|
iAttemptToAimTimer = -1
|
|
|
|
SHUTDOWN_PC_CONTROLS()
|
|
|
|
SET_MULTIHEAD_SAFE(FALSE)
|
|
|
|
ENDPROC
|
|
|
|
//PURPOSE: Sets up the mission based on the stage the player is skipping to
|
|
PROC MissionStageSkip()
|
|
|
|
IF bDoSkip
|
|
PRINTLN("PROCESSING SKIP")
|
|
IF IS_SCREEN_FADED_OUT()
|
|
|
|
PRINTLN("DOING SKIP CLEANUP")
|
|
MissionCleanup(CTF_RESET)
|
|
clearText()
|
|
|
|
Unload_Asset_NewLoadScene(sAssetData)
|
|
|
|
// Warping
|
|
// -----------------------------------------------
|
|
|
|
Start_Skip_Streaming(sAssetData)
|
|
|
|
IF NOT IS_REPLAY_BEING_SET_UP()
|
|
|
|
CPRINTLN(DEBUG_MIKE, "MISSION_STAGE_SKIP() Performing NON-REPLAY skip warping")
|
|
|
|
VECTOR vWarpCoord
|
|
FLOAT fWarpHeading
|
|
GET_SKIP_STAGE_COORD_AND_HEADING(enum_to_int(eMissionStage), vWarpCoord, fWarpHeading)
|
|
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), vWarpCoord)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), fWarpHeading)
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
Load_Asset_NewLoadScene_Sphere(sAssetData, vWarpCoord, 50.0)
|
|
|
|
CPRINTLN(DEBUG_MIKE, "MISSION_STAGE_SKIP() NON-REPLAY skip warp coord ", vWarpCoord, " warp heading ", fWarpHeading)
|
|
|
|
ENDIF
|
|
|
|
// Asset loading
|
|
// -----------------------------------------------
|
|
Load_Asset_Additional_Text(sAssetData, sTextBlock, MISSION_TEXT_SLOT)
|
|
Load_Asset_Additional_Text(sAssetData, sAudioBlock, MISSION_DIALOGUE_TEXT_SLOT)
|
|
|
|
SWITCH eMissionStage
|
|
CASE ST_0_DRIVE_TO_START
|
|
// Started as michael
|
|
IF bStartedAsMichael
|
|
SET_CURRENT_PLAYER_PED(SELECTOR_PED_MICHAEL, TRUE, TRUE)
|
|
// Started as Trevor
|
|
ELSE
|
|
SET_CURRENT_PLAYER_PED(SELECTOR_PED_TREVOR, TRUE, TRUE)
|
|
ENDIF
|
|
BREAK
|
|
CASE ST_1_INTRO_CUT
|
|
|
|
IF bStartedAsMichael
|
|
SET_CURRENT_PLAYER_PED(SELECTOR_PED_MICHAEL, TRUE, TRUE)
|
|
Load_Asset_Model(sAssetData, mnTrevTurd)
|
|
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("FBI_3_INT", cutSections_TrevFull)
|
|
ELSE
|
|
SET_CURRENT_PLAYER_PED(SELECTOR_PED_TREVOR, TRUE, TRUE)
|
|
Load_Asset_Model(sAssetData, PROP_CS_CIGGY_01B)
|
|
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("FBI_3_INT", cutSections_Mike)
|
|
ENDIF
|
|
|
|
Register_Torture_Ped_Variations_For_Cutscene_Prestreaming(TRUE, FALSE, strMrKCSHandle)
|
|
|
|
BREAK
|
|
CASE ST_2_DRIVE_TO_COORD_FIRST
|
|
|
|
SET_CURRENT_PLAYER_PED(SELECTOR_PED_MICHAEL, TRUE, TRUE)
|
|
|
|
IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE()
|
|
//Load_Asset_Model(sAssetData, GET_REPLAY_CHECKPOINT_VEHICLE_MODEL())
|
|
REQUEST_REPLAY_CHECKPOINT_VEHICLE_MODEL()
|
|
ENDIF
|
|
|
|
WHILE NOT CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], CHAR_TREVOR, vTrevorTortureCoords, fTrevorTortureHeading)
|
|
wait(0)
|
|
ENDWHILE
|
|
|
|
FREEZE_ENTITY_POSITION(TREV_PED_ID(), TRUE)
|
|
SET_ENTITY_INVINCIBLE(TREV_PED_ID(), TRUE)
|
|
|
|
SET_PED_CREW(MIKE_PED_ID())
|
|
SET_PED_CREW(TREV_PED_ID())
|
|
|
|
BREAK
|
|
CASE ST_3_TORTURE_FOR_FIRST
|
|
|
|
SET_CURRENT_PLAYER_PED(SELECTOR_PED_TREVOR, TRUE, TRUE)
|
|
|
|
WHILE NOT CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CHAR_MICHAEL, vCoffeeShopMikeCoord, fCoffeeShopMikeHeading)
|
|
wait(0)
|
|
ENDWHILE
|
|
FREEZE_ENTITY_POSITION(MIKE_PED_ID(), TRUE)
|
|
SET_ENTITY_INVINCIBLE(MIKE_PED_ID(), TRUE)
|
|
|
|
SET_PED_CREW(MIKE_PED_ID())
|
|
SET_PED_CREW(TREV_PED_ID())
|
|
|
|
TORTURE_LoadAssets(TRUE, TRUE)
|
|
BREAK
|
|
CASE ST_4_DRIVE_TO_COORD_SECOND
|
|
|
|
SET_CURRENT_PLAYER_PED(SELECTOR_PED_MICHAEL, TRUE, TRUE)
|
|
|
|
WHILE NOT CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], CHAR_TREVOR, vTrevorTortureCoords, fTrevorTortureHeading)
|
|
wait(0)
|
|
ENDWHILE
|
|
PRINTLN("DRIVE TO SECOND CREATED TREVOR")
|
|
|
|
FREEZE_ENTITY_POSITION(TREV_PED_ID(), TRUE)
|
|
SET_ENTITY_INVINCIBLE(TREV_PED_ID(), TRUE)
|
|
|
|
SET_PED_CREW(MIKE_PED_ID())
|
|
SET_PED_CREW(TREV_PED_ID())
|
|
|
|
WHILE NOT PARTY_LoadAssets(TRUE, FALSE, FALSE, TRUE)
|
|
wait(0)
|
|
ENDWHILE
|
|
BREAK
|
|
CASE ST_5_TORTURE_FOR_SECOND
|
|
|
|
SET_CURRENT_PLAYER_PED(SELECTOR_PED_TREVOR, TRUE, TRUE)
|
|
|
|
WHILE NOT CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CHAR_MICHAEL, vMichaelSnipeCoords, fMichaelSnipeHeading)
|
|
wait(0)
|
|
ENDWHILE
|
|
FREEZE_ENTITY_POSITION(MIKE_PED_ID(), TRUE)
|
|
SET_ENTITY_INVINCIBLE(MIKE_PED_ID(), TRUE)
|
|
|
|
SET_PED_CREW(MIKE_PED_ID())
|
|
SET_PED_CREW(TREV_PED_ID())
|
|
|
|
TORTURE_LoadAssets(TRUE, TRUE)
|
|
BREAK
|
|
CASE ST_6_REACT_TO_SECOND
|
|
|
|
SET_CURRENT_PLAYER_PED(SELECTOR_PED_MICHAEL, TRUE, TRUE)
|
|
|
|
WHILE NOT CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], CHAR_TREVOR, vTrevorTortureCoords, fTrevorTortureHeading)
|
|
wait(0)
|
|
ENDWHILE
|
|
FREEZE_ENTITY_POSITION(TREV_PED_ID(), TRUE)
|
|
SET_ENTITY_INVINCIBLE(TREV_PED_ID(), TRUE)
|
|
|
|
SET_PED_CREW(MIKE_PED_ID())
|
|
SET_PED_CREW(TREV_PED_ID())
|
|
|
|
WHILE NOT PARTY_LoadAssets(FALSE, TRUE)
|
|
wait(0)
|
|
ENDWHILE
|
|
BREAK
|
|
CASE ST_7_TORTURE_FOR_THIRD
|
|
|
|
SET_CURRENT_PLAYER_PED(SELECTOR_PED_TREVOR, TRUE, TRUE)
|
|
|
|
WHILE NOT CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CHAR_MICHAEL, vMichaelSnipeCoords, fMichaelSnipeHeading)
|
|
wait(0)
|
|
ENDWHILE
|
|
FREEZE_ENTITY_POSITION(MIKE_PED_ID(), TRUE)
|
|
SET_ENTITY_INVINCIBLE(MIKE_PED_ID(), TRUE)
|
|
|
|
SET_PED_CREW(MIKE_PED_ID())
|
|
SET_PED_CREW(TREV_PED_ID())
|
|
|
|
TORTURE_LoadAssets(TRUE, TRUE)
|
|
BREAK
|
|
CASE ST_8_REACT_TO_THIRD
|
|
SET_CURRENT_PLAYER_PED(SELECTOR_PED_MICHAEL, TRUE, TRUE)
|
|
|
|
WHILE NOT CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], CHAR_TREVOR, vTrevorTortureCoords, fTrevorTortureHeading)
|
|
wait(0)
|
|
ENDWHILE
|
|
FREEZE_ENTITY_POSITION(TREV_PED_ID(), TRUE)
|
|
SET_ENTITY_INVINCIBLE(TREV_PED_ID(), TRUE)
|
|
|
|
SET_PED_CREW(MIKE_PED_ID())
|
|
SET_PED_CREW(TREV_PED_ID())
|
|
|
|
WHILE NOT PARTY_LoadAssets(FALSE, TRUE)
|
|
wait(0)
|
|
ENDWHILE
|
|
BREAK
|
|
CASE ST_9_TORTURE_FINAL
|
|
SET_CURRENT_PLAYER_PED(SELECTOR_PED_TREVOR, TRUE, TRUE)
|
|
|
|
WHILE NOT CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CHAR_MICHAEL, vMichaelSnipeCoords, fMichaelSnipeHeading)
|
|
wait(0)
|
|
ENDWHILE
|
|
FREEZE_ENTITY_POSITION(MIKE_PED_ID(), TRUE)
|
|
SET_ENTITY_INVINCIBLE(MIKE_PED_ID(), TRUE)
|
|
|
|
SET_PED_CREW(MIKE_PED_ID())
|
|
SET_PED_CREW(TREV_PED_ID())
|
|
|
|
TORTURE_LoadAssets(TRUE, TRUE)
|
|
BREAK
|
|
CASE ST_10_REACT_FINAL
|
|
SET_CURRENT_PLAYER_PED(SELECTOR_PED_MICHAEL, TRUE, TRUE)
|
|
|
|
WHILE NOT CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], CHAR_TREVOR, vTrevorTortureCoords, fTrevorTortureHeading)
|
|
wait(0)
|
|
ENDWHILE
|
|
FREEZE_ENTITY_POSITION(TREV_PED_ID(), TRUE)
|
|
SET_ENTITY_INVINCIBLE(TREV_PED_ID(), TRUE)
|
|
|
|
SET_PED_CREW(MIKE_PED_ID())
|
|
SET_PED_CREW(TREV_PED_ID())
|
|
|
|
WHILE NOT PARTY_LoadAssets(FALSE, TRUE)
|
|
wait(0)
|
|
ENDWHILE
|
|
BREAK
|
|
CASE ST_11_DRIVE_TO_AIRPORT
|
|
SET_CURRENT_PLAYER_PED(SELECTOR_PED_TREVOR, TRUE, TRUE)
|
|
SET_PED_CREW(TREV_PED_ID())
|
|
Load_Asset_Model(sAssetData, IG_MRK)
|
|
BREAK
|
|
CASE ST_12_EXIT_CUT
|
|
SET_CURRENT_PLAYER_PED(SELECTOR_PED_TREVOR, TRUE, TRUE)
|
|
SET_PED_CREW(TREV_PED_ID())
|
|
|
|
IF ARE_STRINGS_EQUAL(strMrKCSHandle, csMrK_TL)
|
|
SET_CUTSCENE_AUDIO_OVERRIDE("_TOOTHLESS")
|
|
ENDIF
|
|
REQUEST_CUTSCENE("fbi_3_mcs_8")
|
|
Register_Torture_Ped_Variations_For_Cutscene_Prestreaming(TRUE, FALSE, strMrKCSHandle, TRUE)
|
|
|
|
BREAK
|
|
CASE ST_13_PASSED_MISSION
|
|
SET_CURRENT_PLAYER_PED(SELECTOR_PED_TREVOR, TRUE, TRUE)
|
|
SET_PED_CREW(TREV_PED_ID())
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
WHILE NOT Update_Skip_Streaming(sAssetData)
|
|
PRINTLN("UPDATING SKIP STREAMING")
|
|
wait(0)
|
|
ENDWHILE
|
|
|
|
//>>>>>>>>>>>>>> [FINISHED] SKIP STREAMING & PLAYER WARPING
|
|
|
|
SWITCH eMissionStage
|
|
CASE ST_0_DRIVE_TO_START
|
|
PED_VEH_DATA_STRUCT sVehData
|
|
VECTOR vClearCoord
|
|
IF bStartedAsMichael
|
|
CREATE_VEHICLE_FOR_PHONECALL_TRIGGER_REPLAY(vehReplay, FALSE, FALSE, FALSE, TRUE)
|
|
IF IS_THIS_MODEL_A_PLANE( GET_ENTITY_MODEL( vehReplay ) )
|
|
SET_VEHICLE_ENGINE_ON( vehReplay, TRUE, TRUE )
|
|
SET_VEHICLE_FORWARD_SPEED( vehReplay, 30.0 )
|
|
ENDIF
|
|
IF IS_REPLAY_BEING_SET_UP()
|
|
END_REPLAY_SETUP(vehReplay)
|
|
ENDIF
|
|
vClearCoord = GET_ENTITY_COORDS(vehReplay)
|
|
ELSE
|
|
GET_PLAYER_VEH_DATA(CHAR_TREVOR, sVehData)
|
|
CREATE_VEHICLE_FOR_PHONECALL_TRIGGER_REPLAY(vehTrevor, FALSE, FALSE, FALSE, TRUE, sVehData.model, sVehData.iColourCombo, CHAR_TREVOR)
|
|
IF IS_THIS_MODEL_A_PLANE( GET_ENTITY_MODEL( vehTrevor ) )
|
|
SET_VEHICLE_ENGINE_ON( vehTrevor, TRUE, TRUE )
|
|
SET_VEHICLE_FORWARD_SPEED( vehTrevor, 30.0 )
|
|
ENDIF
|
|
IF IS_REPLAY_BEING_SET_UP()
|
|
END_REPLAY_SETUP(vehTrevor)
|
|
ENDIF
|
|
vClearCoord = GET_ENTITY_COORDS(vehTrevor)
|
|
ENDIF
|
|
CLEAR_AREA_OF_VEHICLES(vClearCoord, 20.0)
|
|
|
|
BREAK
|
|
CASE ST_1_INTRO_CUT
|
|
|
|
WHILE NOT CREATE_NPC_VEHICLE(vehDriveToVeh, CHAR_DAVE, vDaveCarOutsideTortureCoords, fDaveCarOutsideTortureHeading, TRUE)
|
|
wait(0)
|
|
ENDWHILE
|
|
|
|
IF bStartedAsMichael
|
|
|
|
WHILE NOT CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], CHAR_TREVOR, << 129.173, -2203.357, 6.017 >>)
|
|
wait(0)
|
|
ENDWHILE
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(TREV_PED_ID(), TRUE)
|
|
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
|
|
// SET_PED_COMPONENT_VARIATION(TREV_PED_ID(), PED_COMP_LEG, 25, 0)
|
|
// SET_PED_COMPONENT_VARIATION(TREV_PED_ID(), PED_COMP_SPECIAL, 12, 0)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(TREV_PED_ID(), COMP_TYPE_LEGS, GET_PED_COMP_ITEM_FROM_VARIATIONS(TREV_PED_ID(), 25, 0, COMP_TYPE_LEGS))
|
|
SET_PED_COMP_ITEM_CURRENT_SP(TREV_PED_ID(), COMP_TYPE_SPECIAL, GET_PED_COMP_ITEM_FROM_VARIATIONS(TREV_PED_ID(), 12, 0, COMP_TYPE_SPECIAL))
|
|
SET_PED_COMP_ITEM_CURRENT_SP(TREV_PED_ID(), COMP_TYPE_FEET, GET_PED_COMP_ITEM_FROM_VARIATIONS(TREV_PED_ID(), 11, 0, COMP_TYPE_FEET))
|
|
|
|
#ENDIF
|
|
|
|
objs[mof_turd] = CREATE_OBJECT(mnTrevTurd, vTrevTurd)
|
|
Unload_Asset_Model(sAssetData, mnTrevTurd)
|
|
|
|
WHILE NOT CREATE_PLAYER_VEHICLE(vehTrevor, CHAR_TREVOR, vTrevorCarOutsideTortureCoord, fTrevorCarOutsideTortureHeading)
|
|
wait(0)
|
|
ENDWHILE
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehTrevor, FALSE)
|
|
ELSE
|
|
|
|
WHILE NOT CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CHAR_MICHAEL, vMichaelSpawnCoords, fMichaelSpawnHeading)
|
|
wait(0)
|
|
ENDWHILE
|
|
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(MIKE_PED_ID(), TRUE)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(MIKE_PED_ID(), TRUE)
|
|
|
|
objs[mof_mike_ciggy] = CREATE_OBJECT(PROP_CS_CIGGY_01B, GET_PED_BONE_COORDS(MIKE_PED_ID(), BONETAG_PH_R_HAND, <<0,0,0>>))
|
|
ATTACH_ENTITY_TO_ENTITY(objs[mof_mike_ciggy], MIKE_PED_ID(), GET_PED_BONE_INDEX(MIKE_PED_ID(), BONETAG_PH_R_HAND), <<0,0,0>>, <<0,0,0>>, TRUE, TRUE)
|
|
Unload_Asset_Model(sAssetData, PROP_CS_CIGGY_01B)
|
|
ENDIF
|
|
|
|
IF IS_REPLAY_BEING_SET_UP()
|
|
END_REPLAY_SETUP()
|
|
ELSE
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
BREAK
|
|
CASE ST_2_DRIVE_TO_COORD_FIRST
|
|
|
|
DISABLE_TAXI_HAILING(TRUE)
|
|
|
|
IF IS_REPLAY_CHECKPOINT_VEHICLE_AVAILABLE()
|
|
vehReplay = CREATE_REPLAY_CHECKPOINT_VEHICLE(vOtherVehicleOutsideWarehouse, fOtherVehicleOutsideWarehouse)
|
|
ENDIF
|
|
|
|
WHILE NOT CREATE_PLAYER_VEHICLE(vehTrevor, CHAR_TREVOR, vTrevorCarOutsideTortureCoord, fTrevorCarOutsideTortureHeading)
|
|
wait(0)
|
|
ENDWHILE
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehTrevor, FALSE)
|
|
|
|
WHILE NOT CREATE_NPC_VEHICLE(vehDriveToVeh, CHAR_DAVE, vDaveCarOutsideTortureCoords, fDaveCarOutsideTortureHeading, TRUE)
|
|
wait(0)
|
|
ENDWHILE
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vehDriveToVeh)
|
|
SET_VEHICLE_ENGINE_ON(vehDriveToVeh, TRUE, TRUE)
|
|
|
|
WHILE NOT CREATE_NPC_PED_INSIDE_VEHICLE(pedDave, CHAR_DAVE, vehDriveToVeh, VS_FRONT_RIGHT)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
PED_VARIATION_STRUCT sDave
|
|
sDave = GET_DAVE_VARIATIONS(TRUE)
|
|
SET_PED_VARIATIONS(pedDave, sDave)
|
|
SET_PED_CREW(pedDave)
|
|
|
|
SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
|
SET_MAX_WANTED_LEVEL(5)
|
|
SET_CREATE_RANDOM_COPS(TRUE)
|
|
|
|
IF IS_REPLAY_BEING_SET_UP()
|
|
END_REPLAY_SETUP(vehDriveToVeh)
|
|
ELSE
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehDriveToVeh)
|
|
ENDIF
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
|
|
BREAK
|
|
CASE ST_3_TORTURE_FOR_FIRST
|
|
|
|
DISABLE_TAXI_HAILING(TRUE)
|
|
|
|
WHILE NOT TORTURE_IsTortureReady(TRUE, TRUE, FALSE)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
START_AUDIO_SCENE("FBI_3_TREVOR_TORTURE_1")
|
|
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
SET_MAX_WANTED_LEVEL(0)
|
|
SET_CREATE_RANDOM_COPS(FALSE)
|
|
|
|
IF IS_REPLAY_BEING_SET_UP()
|
|
END_REPLAY_SETUP()
|
|
ELSE
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
TORTURE_PlaySyncScene(SCENE_WEAPON_SELECT_IDLE, TRUE)
|
|
|
|
doTwoPointCam(camGeneralInit, camGeneralDest, << 146.7890, -2204.1140, 5.6386 >>, << -10.8642, 7.4269, 61.6078 >>, 17.4610,
|
|
<< 146.7890, -2204.1140, 5.6386 >>, << -10.8642, 7.4269, 61.6078 >>, 16.0803,
|
|
5000)
|
|
doCamShake(camGeneralInit, camGeneralDest, shakeHand, 0.1)
|
|
bHasSwitchSetupCam = TRUE
|
|
wait(0)
|
|
|
|
TRIGGER_MUSIC_EVENT("FBI3_TORTURE_RT")
|
|
bTortureMusicPlaying = TRUE
|
|
BREAK
|
|
CASE ST_4_DRIVE_TO_COORD_SECOND
|
|
|
|
DISABLE_TAXI_HAILING(TRUE)
|
|
|
|
WHILE NOT PARTY_IsSceneReady(TRUE, FALSE, ST_INIT, FALSE, TRUE)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
SET_WEATHER_TYPE_NOW_PERSIST("EXTRASUNNY")
|
|
|
|
SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
|
SET_MAX_WANTED_LEVEL(5)
|
|
SET_CREATE_RANDOM_COPS(TRUE)
|
|
|
|
IF IS_REPLAY_BEING_SET_UP()
|
|
END_REPLAY_SETUP(vehDriveToVeh)
|
|
ELSE
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehDriveToVeh, VS_DRIVER)
|
|
ENDIF
|
|
|
|
TRIGGER_MUSIC_EVENT("FBI3_MICHAEL_MUSIC_1")
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
|
|
BREAK
|
|
CASE ST_5_TORTURE_FOR_SECOND
|
|
|
|
DISABLE_TAXI_HAILING(TRUE)
|
|
|
|
WHILE NOT TORTURE_IsTortureReady(TRUE, TRUE, FALSE)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
SET_WEATHER_TYPE_NOW_PERSIST("EXTRASUNNY")
|
|
|
|
TORTURE_PlaySyncScene(SCENE_WEAPON_SELECT_IDLE, TRUE)
|
|
START_AUDIO_SCENE("FBI_3_TREVOR_TORTURE_2")
|
|
TRIGGER_MUSIC_EVENT("FBI3_TORTURE_RT")
|
|
bTortureMusicPlaying = TRUE
|
|
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
SET_MAX_WANTED_LEVEL(0)
|
|
SET_CREATE_RANDOM_COPS(FALSE)
|
|
|
|
IF IS_REPLAY_BEING_SET_UP()
|
|
END_REPLAY_SETUP()
|
|
ELSE
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE ST_6_REACT_TO_SECOND
|
|
|
|
DISABLE_TAXI_HAILING(TRUE)
|
|
|
|
SET_WEATHER_TYPE_NOW_PERSIST("EXTRASUNNY")
|
|
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
SET_MAX_WANTED_LEVEL(0)
|
|
SET_CREATE_RANDOM_COPS(FALSE)
|
|
|
|
IF IS_REPLAY_BEING_SET_UP()
|
|
END_REPLAY_SETUP()
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
ELSE
|
|
//FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE) // DO NOT UNFREEZE FOR MICHAEL AS HE IS FLOATING IN MID AIR FOR A REASON HERE
|
|
ENDIF
|
|
|
|
WHILE NOT PARTY_IsSceneReady(FALSE, TRUE, ST_6_REACT_TO_SECOND)
|
|
wait(0)
|
|
ENDWHILE
|
|
|
|
setupSwayCam(sSwaySniping, vProneCamStartCoord, vProneCamStartRot, fProneCamStartFOV,
|
|
vProneCamEndCoord, vProneCamEndRot, fProneCamEndFOV,
|
|
40000, TRUE, shakeHand, 0.5, "SNIPE")
|
|
PARTY_ManagePartyScene()
|
|
PARTY_ManageProneAndScope()
|
|
BREAK
|
|
CASE ST_7_TORTURE_FOR_THIRD
|
|
|
|
DISABLE_TAXI_HAILING(TRUE)
|
|
|
|
WHILE NOT TORTURE_IsTortureReady(TRUE, TRUE, FALSE)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
SET_WEATHER_TYPE_NOW_PERSIST("EXTRASUNNY")
|
|
|
|
TORTURE_PlaySyncScene(SCENE_WEAPON_SELECT_IDLE, TRUE)
|
|
START_AUDIO_SCENE("FBI_3_TREVOR_TORTURE_3")
|
|
TRIGGER_MUSIC_EVENT("FBI3_TORTURE_RT")
|
|
bTortureMusicPlaying = TRUE
|
|
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
SET_MAX_WANTED_LEVEL(0)
|
|
SET_CREATE_RANDOM_COPS(FALSE)
|
|
|
|
IF IS_REPLAY_BEING_SET_UP()
|
|
END_REPLAY_SETUP()
|
|
ELSE
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE ST_8_REACT_TO_THIRD
|
|
|
|
DISABLE_TAXI_HAILING(TRUE)
|
|
|
|
SET_WEATHER_TYPE_NOW_PERSIST("EXTRASUNNY")
|
|
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
SET_MAX_WANTED_LEVEL(0)
|
|
SET_CREATE_RANDOM_COPS(FALSE)
|
|
|
|
IF IS_REPLAY_BEING_SET_UP()
|
|
END_REPLAY_SETUP()
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
ELSE
|
|
//FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
WHILE NOT PARTY_IsSceneReady(FALSE, TRUE, ST_8_REACT_TO_THIRD)
|
|
wait(0)
|
|
ENDWHILE
|
|
|
|
setupSwayCam(sSwaySniping, vProneCamStartCoord, vProneCamStartRot, fProneCamStartFOV,
|
|
vProneCamEndCoord, vProneCamEndRot, fProneCamEndFOV,
|
|
40000, TRUE, shakeHand, 0.5, "SNIPE")
|
|
PARTY_ManagePartyScene()
|
|
PARTY_ManageProneAndScope()
|
|
BREAK
|
|
CASE ST_9_TORTURE_FINAL
|
|
|
|
DISABLE_TAXI_HAILING(TRUE)
|
|
|
|
WHILE NOT TORTURE_IsTortureReady(TRUE, TRUE, FALSE)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
SET_WEATHER_TYPE_NOW_PERSIST("EXTRASUNNY")
|
|
|
|
TORTURE_PlaySyncScene(SCENE_WEAPON_SELECT_IDLE, TRUE)
|
|
START_AUDIO_SCENE("FBI_3_TREVOR_TORTURE_4")
|
|
TRIGGER_MUSIC_EVENT("FBI3_TORTURE_RT")
|
|
bTortureMusicPlaying = TRUE
|
|
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
SET_MAX_WANTED_LEVEL(0)
|
|
SET_CREATE_RANDOM_COPS(FALSE)
|
|
|
|
IF IS_REPLAY_BEING_SET_UP()
|
|
END_REPLAY_SETUP()
|
|
ELSE
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
BREAK
|
|
CASE ST_10_REACT_FINAL
|
|
|
|
DISABLE_TAXI_HAILING(TRUE)
|
|
|
|
SET_WEATHER_TYPE_NOW_PERSIST("EXTRASUNNY")
|
|
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
SET_MAX_WANTED_LEVEL(0)
|
|
SET_CREATE_RANDOM_COPS(FALSE)
|
|
|
|
IF IS_REPLAY_BEING_SET_UP()
|
|
END_REPLAY_SETUP()
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
|
|
ELSE
|
|
//FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
WHILE NOT PARTY_IsSceneReady(FALSE, TRUE, ST_10_REACT_FINAL)
|
|
wait(0)
|
|
ENDWHILE
|
|
|
|
setupSwayCam(sSwaySniping, vProneCamStartCoord, vProneCamStartRot, fProneCamStartFOV,
|
|
vProneCamEndCoord, vProneCamEndRot, fProneCamEndFOV,
|
|
40000, TRUE, shakeHand, 0.5, "SNIPE")
|
|
PARTY_ManagePartyScene()
|
|
PARTY_ManageProneAndScope()
|
|
BREAK
|
|
CASE ST_11_DRIVE_TO_AIRPORT
|
|
|
|
DISABLE_TAXI_HAILING(TRUE)
|
|
|
|
WHILE NOT CREATE_PLAYER_VEHICLE(vehTrevor, CHAR_TREVOR, vTrevorCarDriveToAirportCoord, fTrevorCarSpawnHeading)
|
|
Wait(0)
|
|
ENDWHILE
|
|
|
|
SET_WEATHER_TYPE_NOW_PERSIST("EXTRASUNNY")
|
|
|
|
IF NOT DOES_ENTITY_EXIST(pedVictim)
|
|
pedVictim = CREATE_PED_INSIDE_VEHICLE(vehTrevor, PEDTYPE_MISSION, IG_MRK, VS_FRONT_RIGHT)
|
|
RESET_MR_K_VARIATIONS()
|
|
bMrKVariations[MR_K_CABLES] = FALSE
|
|
MANAGE_MR_K_VARIATIONS()
|
|
ENDIF
|
|
SET_PED_CREW(pedVictim)
|
|
|
|
SET_PED_INTO_VEHICLE(TREV_PED_ID(), vehTrevor, VS_DRIVER)
|
|
SET_VEHICLE_ENGINE_ON(vehTrevor, TRUE, TRUE)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vehTrevor)
|
|
|
|
SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
|
SET_MAX_WANTED_LEVEL(5)
|
|
SET_CREATE_RANDOM_COPS(TRUE)
|
|
|
|
WHILE NOT IS_PED_INJURED(TREV_PED_ID()) AND NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(TREV_PED_ID())
|
|
AND NOT IS_PED_INJURED(pedVictim) AND NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(pedVictim)
|
|
wait(0)
|
|
ENDWHILE
|
|
|
|
IF IS_REPLAY_BEING_SET_UP()
|
|
END_REPLAY_SETUP(vehTrevor)
|
|
ELSE
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehTrevor)
|
|
ENDIF
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
|
|
|
|
BREAK
|
|
CASE ST_12_EXIT_CUT
|
|
|
|
SET_PED_NON_CREATION_AREA(
|
|
<<-1038.279907,-2738.568359,21.232233>>-<<97.250000,69.500000,2.312500>>,
|
|
<<-1038.279907,-2738.568359,21.232233>>+<<97.250000,69.500000,2.312500>>)
|
|
|
|
SET_PED_PATHS_IN_AREA(
|
|
<<-1038.279907,-2738.568359,21.232233>>-<<97.250000,69.500000,2.312500>>,
|
|
<<-1038.279907,-2738.568359,21.232233>>+<<97.250000,69.500000,2.312500>>, FALSE)
|
|
|
|
sba_airport = ADD_SCENARIO_BLOCKING_AREA(<<-1038.279907,-2738.568359,21.232233>>-<<97.250000,69.500000,2.312500>>,
|
|
<<-1038.279907,-2738.568359,21.232233>>+<<97.250000,69.500000,2.312500>>)
|
|
|
|
IF iRoadNodeSpeedZone[0] != -1
|
|
REMOVE_ROAD_NODE_SPEED_ZONE(iRoadNodeSpeedZone[0])
|
|
ENDIF
|
|
iRoadNodeSpeedZone[0] = ADD_ROAD_NODE_SPEED_ZONE(<<-1057.38, -2715.40, 19.12>>, 4.375, 0.0)
|
|
CLEAR_AREA_OF_VEHICLES(vDriveToAirport, 100)
|
|
|
|
IF bStoredSniperSnapshot
|
|
IF DOES_ENTITY_EXIST(MIKE_PED_ID())
|
|
STORE_PLAYER_PED_WEAPONS(MIKE_PED_ID())
|
|
ENDIF
|
|
g_savedGlobals.sPlayerData.sInfo.sWeapons[CHAR_MICHAEL].sWeaponInfo[21] = sSniperSnapshot
|
|
IF DOES_ENTITY_EXIST(MIKE_PED_ID())
|
|
RESTORE_PLAYER_PED_WEAPONS(MIKE_PED_ID())
|
|
ENDIF
|
|
bStoredSniperSnapshot = FALSE
|
|
ENDIF
|
|
|
|
DISABLE_TAXI_HAILING(TRUE)
|
|
|
|
SET_WEATHER_TYPE_NOW_PERSIST("EXTRASUNNY")
|
|
|
|
WHILE NOT CREATE_PLAYER_VEHICLE(vehTrevor, CHAR_TREVOR, <<-1034.6471, -2729.8953, 19.0672>>, 240.9291)
|
|
Wait(0)
|
|
ENDWHILE
|
|
|
|
IF IS_REPLAY_BEING_SET_UP()
|
|
END_REPLAY_SETUP(vehTrevor)
|
|
ELSE
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehTrevor)
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE ST_13_PASSED_MISSION
|
|
|
|
DISABLE_TAXI_HAILING(TRUE)
|
|
|
|
CLEAR_AREA_OF_VEHICLES(<<-1032.140869,-2730.226318,19.116234>>, 15.0, FALSE, FALSE, TRUE, TRUE)
|
|
|
|
SET_WEATHER_TYPE_NOW_PERSIST("EXTRASUNNY")
|
|
|
|
WHILE NOT CREATE_PLAYER_VEHICLE(vehTrevor, CHAR_TREVOR, <<-1034.6471, -2729.8953, 19.0672>>, 240.9291)
|
|
Wait(0)
|
|
ENDWHILE
|
|
|
|
IF IS_REPLAY_BEING_SET_UP()
|
|
END_REPLAY_SETUP(vehTrevor)
|
|
ELSE
|
|
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
|
|
SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), vehTrevor)
|
|
ENDIF
|
|
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
Unload_Asset_NewLoadScene(sAssetData)
|
|
|
|
ADD_ALL_PEDS_TO_DIALOGUE()
|
|
|
|
IF eMissionStage != ST_1_INTRO_CUT
|
|
AND eMissionStage != ST_12_EXIT_CUT
|
|
SAFE_FADE_IN()
|
|
ENDIF
|
|
bDoSkip = FALSE
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
// Check is a skip is being asked for, and dont allow skip during setup stage
|
|
// Stage skip not directly linked to number of stages
|
|
ELIF IS_SCREEN_FADED_IN()
|
|
AND NOT IS_CUTSCENE_PLAYING()
|
|
|
|
INT iCurrentStage
|
|
INT iReturnStage
|
|
|
|
IF TRANSLATE_TO_Z_MENU(SkipMenuStruct, enum_to_int(eMissionStage), iCurrentStage)
|
|
|
|
IF LAUNCH_MISSION_STAGE_MENU(SkipMenuStruct, iReturnStage, iCurrentStage, FALSE, "FBI 3", FALSE, TRUE,
|
|
KEY_Z, KEYBOARD_MODIFIER_NONE, TRUE, TRUE)
|
|
|
|
IF iReturnStage < iCurrentStage
|
|
fVictimHealth = 100 // reset victim health if jumping back for debug purposes
|
|
ENDIF
|
|
|
|
eMissionStage = int_to_enum(MISSION_STAGE, TRANSLATE_FROM_Z_MENU(SkipMenuStruct, iReturnStage) )
|
|
|
|
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME_SHORT)
|
|
|
|
IF IS_CUTSCENE_PLAYING()
|
|
STOP_CUTSCENE()
|
|
REMOVE_CUTSCENE()
|
|
ENDIF
|
|
|
|
bStageSetup = FALSE
|
|
bDoSkip = TRUE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
#ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: Performs necessary actions for player completing the mission, then calls cleanup
|
|
PROC MissionPassed()
|
|
|
|
#IF IS_JAPANESE_BUILD
|
|
// pass all these stats at the end of the mission for the japanese build
|
|
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(FBI3_TOOTH)
|
|
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(FBI3_WRENCH)
|
|
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(FBI3_WATERBOARD)
|
|
INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(FBI3_ELECTROCUTION)
|
|
#ENDIF
|
|
|
|
clearText()
|
|
MissionCleanup(CTF_MISSION_PASSED)
|
|
Mission_Flow_Mission_Passed()
|
|
TERMINATE_THIS_THREAD()
|
|
ENDPROC
|
|
|
|
//PURPOSE: Performs necessary actions for player failing the mission, then calls cleanup
|
|
PROC MissionFailed()
|
|
|
|
IF eMissionStage = ST_6_REACT_TO_SECOND
|
|
OR eMissionStage = ST_8_REACT_TO_THIRD
|
|
OR eMissionStage = ST_10_REACT_FINAL
|
|
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<-2955.2388, 311.2846, 29.0388>>, 76.5327)
|
|
ELIF eMissionStage = ST_3_TORTURE_FOR_FIRST
|
|
OR eMissionStage = ST_5_TORTURE_FOR_SECOND
|
|
OR eMissionStage = ST_7_TORTURE_FOR_THIRD
|
|
OR eMissionStage = ST_9_TORTURE_FINAL
|
|
MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<132.7334, -2197.0349, 5.1073>>, 292.9964)
|
|
SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION(<<135.6781, -2191.3748, 5.0119>>, 270.0899)
|
|
ENDIF
|
|
|
|
IF eMissionFail = FAIL_FORCE_CLEANUP
|
|
MISSION_FLOW_MISSION_FORCE_CLEANUP()
|
|
MissionCleanup(CTF_DEATH_ARREST_DELAYED)
|
|
TRIGGER_MUSIC_EVENT("FBI3_FAIL")
|
|
TERMINATE_THIS_THREAD()
|
|
ELSE
|
|
STRING strReason
|
|
SWITCH eMissionFail
|
|
CASE FAIL_GENERIC
|
|
strReason = "F_GEN"
|
|
BREAK
|
|
CASE FAIL_MICHAEL_DEAD
|
|
strReason = "F_MDEAD"
|
|
BREAK
|
|
CASE FAIL_TREVOR_DEAD
|
|
strReason = "F_TDEAD"
|
|
BREAK
|
|
CASE FAIL_VICTIM_DEAD
|
|
strReason = "F_KDEAD"
|
|
BREAK
|
|
CASE FAIL_DAVE_DEAD
|
|
strReason = "F_DDEAD"
|
|
BREAK
|
|
CASE FAIL_STEVE_DEAD
|
|
strReason = "F_SDEAD"
|
|
BREAK
|
|
|
|
CASE FAIL_VEHICLE_STUCK_TREVOR
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
strReason = "F_TRUCKSTUCK_M"
|
|
ELSE
|
|
strReason = "F_TRUCKSTUCK_T"
|
|
ENDIF
|
|
BREAK
|
|
CASE FAIL_VEHICLE_DEAD_TREVOR
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
|
|
strReason = "F_TRUCKDEAD_M"
|
|
ELSE
|
|
strReason = "F_TRUCKDEAD_T"
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE FAIL_CUNTS_SPOOKED
|
|
strReason = "F_PHOTO_SPOOK"
|
|
BREAK
|
|
CASE FAIL_CUNTS_INNOCENT_DEAD
|
|
strReason = "F_PHOTO_INN"
|
|
BREAK
|
|
|
|
CASE FAIL_PARTY_SEEN_AT_PARTY
|
|
strReason = "F_PRTY_SEEN"
|
|
BREAK
|
|
CASE FAIL_PARTY_SPOOKED
|
|
strReason = "F_PRTY_SPOOK"
|
|
BREAK
|
|
CASE FAIL_PARTY_PED_DEAD_INNOCENT_NO_ID
|
|
strReason = "F_PRTY_INN_ID"
|
|
BREAK
|
|
CASE FAIL_PARTY_PED_DEAD_INNOCENT
|
|
strReason = "F_PRTY_INN"
|
|
BREAK
|
|
|
|
CASE FAIL_ABANDONED_DAVE
|
|
strReason = "F_ABAN_D"
|
|
BREAK
|
|
CASE FAIL_ABANDONED_MRK
|
|
strReason = "F_ABAN_MRK"
|
|
BREAK
|
|
|
|
CASE FAIL_COPS_WAREHOUSE
|
|
strReason = "F_COPS"
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
MISSION_FLOW_MISSION_FAILED_WITH_REASON(strReason)
|
|
|
|
TRIGGER_MUSIC_EVENT("FBI3_FAIL")
|
|
|
|
bUpdateMissionFailed = TRUE
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC UpdateMissionFailed()
|
|
|
|
|
|
|
|
IF NOT GET_MISSION_FLOW_SAFE_TO_CLEANUP()
|
|
|
|
CPRINTLN(DEBUG_MIKE,"***** NOT SAFE TO CLEAN UP")
|
|
|
|
IF iFailTimer != -1
|
|
|
|
CPRINTLN(DEBUG_MIKE,"***** DEATH SCENE FAIL TIMER NOT NEGATIVE")
|
|
|
|
CPRINTLN(DEBUG_MIKE,"***** DEATH SCENE FAIL LOOKING TO START FADE, ", GET_CUTSCENE_TIME() - iFailTimer)
|
|
IF IS_CUTSCENE_PLAYING()
|
|
AND GET_CUTSCENE_TIME() - iFailTimer > 2500
|
|
IF NOT IS_SCREEN_FADING_OUT()
|
|
AND NOT IS_SCREEN_FADED_OUT()
|
|
CPRINTLN(DEBUG_MIKE,"***** DEATH SCENE FAIL START FADE")
|
|
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME_LONG)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
CPRINTLN(DEBUG_MIKE,"***** SAFE TO CLEAN UP - TERMINATE STRAIGHT AWAY")
|
|
|
|
// check if we need to respawn the player in a different position,
|
|
// if so call MISSION_FLOW_SET_FAIL_WARP_LOCATION() + SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION here
|
|
|
|
MissionCleanup(CTF_INSTANT)
|
|
TERMINATE_THIS_THREAD()
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//═════════════════════════════════╡ Stage FUNCTIONS AND PROCEDURES ╞═══════════════════════════════════
|
|
|
|
//PURPOSE: Performs the section where Michael or Trevor drives to the mission start
|
|
PROC stage0_DriveToStart()
|
|
|
|
//═════════╡ SETUP ╞═════════
|
|
IF NOT bStageSetup
|
|
|
|
DISABLE_CELLPHONE(FALSE)
|
|
|
|
// if started as michael need the trevor shitting anim
|
|
IF bStartedAsMichael
|
|
Load_Asset_AnimDict(sAssetData, "missfbi3ig_0")
|
|
Load_Asset_Audiobank(sAssetData, "FBI_03_TREVOR_SHITTING")
|
|
Load_Asset_Model(sAssetData, mnTrevTurd)
|
|
ELSE
|
|
Load_Asset_AnimDict(sAssetData, "missfbi3leadinout")
|
|
Load_Asset_Model(sAssetData, PROP_CS_CIGGY_01B)
|
|
ENDIF
|
|
|
|
CLEAR_AREA(<<125.25, -2189.42, 4.98>>, 35.0, TRUE)
|
|
bPlayerLockedIn = FALSE
|
|
bSwitchedAtStart = FALSE
|
|
bStageSetup = TRUE
|
|
i_mission_substage = 0
|
|
|
|
//═════════╡ UPDATE ╞═════════
|
|
ENDIF
|
|
|
|
IF bStageSetup
|
|
|
|
SWITCH i_mission_substage
|
|
CASE 0
|
|
IF NOT DOES_ENTITY_EXIST(vehDriveToVeh)
|
|
IF CREATE_NPC_VEHICLE(vehDriveToVeh, CHAR_DAVE, vDaveCarOutsideTortureCoords, fDaveCarOutsideTortureHeading, TRUE)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehDriveToVeh, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bStartedAsMichael
|
|
IF NOT DOES_ENTITY_EXIST(TREV_PED_ID())
|
|
IF HAS_ANIM_DICT_LOADED("missfbi3ig_0")
|
|
AND HAS_MODEL_LOADED(mnTrevTurd)
|
|
IF CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], CHAR_TREVOR, << 129.173, -2203.357, 6.017 >>)
|
|
// kick off shitting anim
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(TREV_PED_ID(), TRUE)
|
|
TASK_PLAY_ANIM_ADVANCED(TREV_PED_ID(), "missfbi3ig_0", "shit_loop_trev", << 129.173, -2203.357, 6.017 >>, <<0,0,79.5>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_USE_KINEMATIC_PHYSICS)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(TREV_PED_ID(), TRUE)
|
|
SET_PED_CONFIG_FLAG(TREV_PED_ID(), PCF_DisableExplosionReactions, TRUE)
|
|
|
|
SET_PED_COMP_ITEM_CURRENT_SP(TREV_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_DEFAULT, FALSE)
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
// SET_PED_COMPONENT_VARIATION(TREV_PED_ID(), PED_COMP_LEG, 25, 0)
|
|
// SET_PED_COMPONENT_VARIATION(TREV_PED_ID(), PED_COMP_SPECIAL, 12, 0)
|
|
// SET_PED_COMPONENT_VARIATION(TREV_PED_ID(), PED_COMP_FEET, 11, 0)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(TREV_PED_ID(), COMP_TYPE_LEGS, GET_PED_COMP_ITEM_FROM_VARIATIONS(TREV_PED_ID(), 25, 0, COMP_TYPE_LEGS), FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(TREV_PED_ID(), COMP_TYPE_SPECIAL, GET_PED_COMP_ITEM_FROM_VARIATIONS(TREV_PED_ID(), 12, 0, COMP_TYPE_SPECIAL), FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(TREV_PED_ID(), COMP_TYPE_FEET, GET_PED_COMP_ITEM_FROM_VARIATIONS(TREV_PED_ID(), 11, 0, COMP_TYPE_FEET), FALSE)
|
|
#ENDIF
|
|
|
|
objs[mof_turd] = CREATE_OBJECT(mnTrevTurd, vTrevTurd)
|
|
Unload_Asset_Model(sAssetData, mnTrevTurd)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(vehTrevor)
|
|
IF CREATE_PLAYER_VEHICLE(vehTrevor, CHAR_TREVOR, vTrevorCarOutsideTortureCoord, fTrevorCarOutsideTortureHeading)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehTrevor, FALSE)
|
|
SET_VEHICLE_DISABLE_TOWING(vehTrevor, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT DOES_ENTITY_EXIST(MIKE_PED_ID())
|
|
IF HAS_ANIM_DICT_LOADED("missfbi3leadinout")
|
|
AND HAS_MODEL_LOADED(PROP_CS_CIGGY_01B)
|
|
|
|
IF CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CHAR_MICHAEL, vMichaelSpawnCoords, fMichaelSpawnHeading)
|
|
SET_ENTITY_LOAD_COLLISION_FLAG(MIKE_PED_ID(), TRUE)
|
|
|
|
OPEN_SEQUENCE_TASK(seqSequence)
|
|
TASK_PLAY_ANIM_ADVANCED(NULL, "missfbi3leadinout", "idle_a", vMichaelSpawnCoords, <<0,0,fMichaelSpawnHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS)
|
|
TASK_PLAY_ANIM_ADVANCED(NULL, "missfbi3leadinout", "idle_b", vMichaelSpawnCoords, <<0,0,fMichaelSpawnHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS)
|
|
TASK_PLAY_ANIM_ADVANCED(NULL, "missfbi3leadinout", "idle_c", vMichaelSpawnCoords, <<0,0,fMichaelSpawnHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS)
|
|
TASK_PLAY_ANIM_ADVANCED(NULL, "missfbi3leadinout", "idle_b", vMichaelSpawnCoords, <<0,0,fMichaelSpawnHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS)
|
|
TASK_PLAY_ANIM_ADVANCED(NULL, "missfbi3leadinout", "idle_a", vMichaelSpawnCoords, <<0,0,fMichaelSpawnHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS)
|
|
TASK_PLAY_ANIM_ADVANCED(NULL, "missfbi3leadinout", "idle_c", vMichaelSpawnCoords, <<0,0,fMichaelSpawnHeading>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS)
|
|
SET_SEQUENCE_TO_REPEAT(seqSequence, REPEAT_FOREVER)
|
|
CLOSE_SEQUENCE_TASK(seqSequence)
|
|
TASK_PERFORM_SEQUENCE(MIKE_PED_ID(), seqSequence)
|
|
CLEAR_SEQUENCE_TASK(seqSequence)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(MIKE_PED_ID(), TRUE)
|
|
|
|
objs[mof_mike_ciggy] = CREATE_OBJECT(PROP_CS_CIGGY_01B, GET_PED_BONE_COORDS(MIKE_PED_ID(), BONETAG_PH_R_HAND, <<0,0,0>>))
|
|
ATTACH_ENTITY_TO_ENTITY(objs[mof_mike_ciggy], MIKE_PED_ID(), GET_PED_BONE_INDEX(MIKE_PED_ID(), BONETAG_PH_R_HAND), <<0,0,0>>, <<0,0,0>>, TRUE, TRUE)
|
|
Unload_Asset_Model(sAssetData, PROP_CS_CIGGY_01B)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
// Check everything has been created
|
|
IF DOES_ENTITY_EXIST(MIKE_PED_ID())
|
|
AND DOES_ENTITY_EXIST(TREV_PED_ID())
|
|
AND DOES_ENTITY_EXIST(vehDriveToVeh)
|
|
IF NOT bStartedAsMichael OR DOES_ENTITY_EXIST(vehTrevor)
|
|
SET_PED_CREW(MIKE_PED_ID())
|
|
SET_PED_CREW(TREV_PED_ID())
|
|
|
|
i_mission_substage++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
IF SWITCH_Free_Roam_To_Torture()
|
|
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
|
|
bSwitchedAtStart = TRUE
|
|
i_mission_substage++
|
|
ELSE
|
|
// Switch has been started
|
|
IF IS_SELECTOR_CAM_ACTIVE()
|
|
|
|
IF bMadeSelection
|
|
bDisplaySwitchHUD = FALSE
|
|
IF IS_MESSAGE_BEING_DISPLAYED()
|
|
clearText()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Player is traveling there
|
|
ELSE
|
|
|
|
IF NOT IS_CUTSCENE_ACTIVE()
|
|
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), << 129.173, -2203.357, 6.017 >>) < DEFAULT_CUTSCENE_LOAD_DIST
|
|
IF bStartedAsMichael
|
|
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("FBI_3_INT", cutSections_TrevLeadIn)
|
|
Register_Ped_Variation_For_Cutscene_From_Ped(sCutscenePedVariationRegister, TREV_PED_ID(), csTrevor)
|
|
ELSE
|
|
REQUEST_CUTSCENE_WITH_PLAYBACK_LIST("FBI_3_INT", cutSections_Mike)
|
|
ENDIF
|
|
Register_Torture_Ped_Variations_For_Cutscene_Prestreaming(TRUE, FALSE, strMrKCSHandle)
|
|
|
|
ENDIF
|
|
ELSE
|
|
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), << 129.173, -2203.357, 6.017 >>) > DEFAULT_CUTSCENE_UNLOAD_DIST
|
|
OR IS_PLAYER_CHANGING_CLOTHES()
|
|
REMOVE_CUTSCENE()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Michael arriving to see trevor shitting behind a dumpster
|
|
IF bStartedAsMichael
|
|
|
|
IS_PLAYER_AT_LOCATION_ON_FOOT(sLocatesData, << 129.173, -2203.357, 6.017 >>, <<0.1,0.1,0.1>>,
|
|
FALSE, "TFT_GOTOW", TRUE, TRUE)
|
|
|
|
IF DOES_ENTITY_EXIST(TREV_PED_ID()) AND NOT IS_PED_INJURED(TREV_PED_ID())
|
|
AND GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), TREV_PED_ID()) <= 7.312500
|
|
AND (NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) OR NOT IS_ENTITY_IN_AIR(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())))
|
|
|
|
IF NOT bPlayerLockedIn
|
|
BLOCK_PLAYER_FOR_LEAD_IN(TRUE)
|
|
bPlayerLockedIn = TRUE
|
|
|
|
//Deal with the player being in a vehicle.
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
VEHICLE_INDEX vehPlayer
|
|
vehPlayer = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
|
|
//Bring the vehicle out of critical state if it is in one.
|
|
IF GET_ENTITY_HEALTH(vehPlayer) < 1
|
|
SET_ENTITY_HEALTH(vehPlayer, 1)
|
|
ENDIF
|
|
IF GET_VEHICLE_ENGINE_HEALTH(vehPlayer) < 1
|
|
SET_VEHICLE_ENGINE_HEALTH(vehPlayer, 1)
|
|
ENDIF
|
|
IF GET_VEHICLE_PETROL_TANK_HEALTH(vehPlayer) < 1
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(vehPlayer, 1)
|
|
ENDIF
|
|
|
|
//Stop the vehicle.
|
|
BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(vehPlayer, 1.0, 2, 0.1)
|
|
|
|
//Get the player out.
|
|
TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID(), 0, ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Trigger the conversation and reaction
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
SAFE_ADD_PED_FOR_DIALOGUE(MIKE_PED_ID(), 0, "Michael")
|
|
SAFE_ADD_PED_FOR_DIALOGUE(TREV_PED_ID(), 2, "Trevor")
|
|
RunConversation("F3_MLDI")
|
|
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
|
|
|
|
TASK_PLAY_ANIM_ADVANCED(TREV_PED_ID(), "missfbi3ig_0", "shit_react_trev", << 129.173, -2203.357, 6.017 >>, <<0,0,79.5>>, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_HOLD_LAST_FRAME)
|
|
TASK_LOOK_AT_ENTITY(MIKE_PED_ID(), TREV_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
|
|
|
|
i_EstablishHoldTimer = -1
|
|
i_mission_substage++
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
// Trevor arriving to see Michael smoking
|
|
ELSE
|
|
IS_PLAYER_AT_LOCATION_ON_FOOT(sLocatesData, vMichaelSpawnCoords, <<0,0,0>>,
|
|
FALSE, "TFT_GOTOW", TRUE, TRUE)
|
|
|
|
IF DOES_ENTITY_EXIST(MIKE_PED_ID()) AND NOT IS_PED_INJURED(MIKE_PED_ID())
|
|
AND GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), MIKE_PED_ID()) <= 7.312500
|
|
AND (NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) OR NOT IS_ENTITY_IN_AIR(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())))
|
|
|
|
IF NOT bPlayerLockedIn
|
|
//Deal with the player being in a vehicle.
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
|
|
VEHICLE_INDEX vehPlayer
|
|
vehPlayer = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
|
|
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(vehPlayer, 2.5, 2, 0.5)
|
|
|
|
//Bring the vehicle out of critical state if it is in one.
|
|
IF GET_ENTITY_HEALTH(vehPlayer) < 1
|
|
SET_ENTITY_HEALTH(vehPlayer, 1)
|
|
ENDIF
|
|
IF GET_VEHICLE_ENGINE_HEALTH(vehPlayer) < 1
|
|
SET_VEHICLE_ENGINE_HEALTH(vehPlayer, 1)
|
|
ENDIF
|
|
IF GET_VEHICLE_PETROL_TANK_HEALTH(vehPlayer) < 1
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(vehPlayer, 1)
|
|
ENDIF
|
|
|
|
//Get the player out.
|
|
TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID(), 0, ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP)
|
|
|
|
BLOCK_PLAYER_FOR_LEAD_IN(TRUE)
|
|
bPlayerLockedIn = TRUE
|
|
ENDIF
|
|
ELSE
|
|
BLOCK_PLAYER_FOR_LEAD_IN(TRUE)
|
|
bPlayerLockedIn = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
|
|
SAFE_ADD_PED_FOR_DIALOGUE(MIKE_PED_ID(), 0, "Michael")
|
|
SAFE_ADD_PED_FOR_DIALOGUE(TREV_PED_ID(), 2, "Trevor")
|
|
RunConversation("F3_TLDI")
|
|
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
|
|
|
|
TASK_LOOK_AT_ENTITY(MIKE_PED_ID(), TREV_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
|
|
TASK_LOOK_AT_ENTITY(TREV_PED_ID(), MIKE_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
|
|
|
|
i_EstablishHoldTimer = -1
|
|
i_mission_substage++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_BLIP_EXIST(sLocatesData.LocationBlip)
|
|
AND (NOT DOES_BLIP_EXIST(g_CustomDropOffBlip) OR sLocatesData.LocationBlip != g_CustomDropOffBlip)
|
|
SET_TAXI_DROPOFF_LOCATION_FOR_BLIP(sLocatesData.LocationBlip, vTaxiToStartCoords, fTaxiToStartHeading)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 2
|
|
IF i_EstablishHoldTimer != -1
|
|
|
|
IF GET_GAME_TIMER() > i_EstablishHoldTimer
|
|
CPRINTLN(DEBUG_MIKE, "FBI3: Establish Complete")
|
|
CLEAR_PLAYER_TRIGGER_SCENE_LOCK_IN()
|
|
DISABLE_CELLPHONE(FALSE)
|
|
eMissionStage = ST_1_INTRO_CUT
|
|
ELSE
|
|
DISABLE_CONTROL_ACTION( PLAYER_CONTROL, INPUT_SELECT_WEAPON )
|
|
IF NOT IS_CELLPHONE_DISABLED()
|
|
DISABLE_CELLPHONE(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF bStartedAsMichael
|
|
CPRINTLN(DEBUG_MIKE, "FBI3: Trevor Leadin Complete")
|
|
CLEAR_PLAYER_TRIGGER_SCENE_LOCK_IN()
|
|
eMissionStage = ST_1_INTRO_CUT
|
|
ELSE
|
|
CPRINTLN(DEBUG_MIKE, "FBI3: Michael Leadin Complete")
|
|
CLEAR_PLAYER_TRIGGER_SCENE_LOCK_IN()
|
|
eMissionStage = ST_1_INTRO_CUT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF bPlayerLockedIn
|
|
UPDATE_BLOCKED_PLAYER_FOR_LEAD_IN(TRUE)
|
|
IF bStartedAsMichael
|
|
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//═════════╡ CLEANUP ╞═════════
|
|
IF eMissionStage != ST_0_DRIVE_TO_START
|
|
|
|
SETTIMERB(0)
|
|
stopCamShake(camGeneralInit, camGeneralDest)
|
|
MissionStageTidyUp()
|
|
ADD_ALL_PEDS_TO_DIALOGUE()
|
|
|
|
bStageSetup = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC stage1_IntroCut()
|
|
|
|
//═════════╡ SETUP ╞═════════
|
|
|
|
IF NOT bStageSetup
|
|
|
|
DISABLE_CELLPHONE(FALSE)
|
|
DISABLE_TAXI_HAILING(TRUE)
|
|
|
|
bMichaelExited = FALSE
|
|
bDaveExited = FALSE
|
|
bCamExited = FALSE
|
|
bTrousersUp = FALSE
|
|
bStageSetup = TRUE
|
|
i_mission_substage = 0
|
|
|
|
ENDIF
|
|
|
|
//═════════╡ UPDATE ╞═════════
|
|
|
|
IF bStageSetup
|
|
|
|
SWITCH i_mission_substage
|
|
CASE 0
|
|
IF HAS_CUTSCENE_LOADED()
|
|
AND NOT IS_ENTITY_ON_FIRE(MIKE_PED_ID())
|
|
AND NOT IS_ENTITY_ON_FIRE(TREV_PED_ID())
|
|
AND (NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
OR IS_SCREEN_FADED_OUT()
|
|
OR bSwitchedAtStart)
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(1, "1. Intro cutscene", FALSE, FALSE, NULL, FALSE)
|
|
|
|
Unload_Asset_Audio_Bank(sAssetData, "FBI_03_TREVOR_SHITTING")
|
|
|
|
Load_Asset_Scaleform(sAssetData, sfHeart, sfHeartMonitor)
|
|
|
|
IF PLAYER_PED_ID() = MIKE_PED_ID()
|
|
IF DOES_ENTITY_EXIST(TREV_PED_ID())
|
|
REGISTER_ENTITY_FOR_CUTSCENE(TREV_PED_ID(), "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
ELSE
|
|
REGISTER_ENTITY_FOR_CUTSCENE(MIKE_PED_ID(), "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
REGISTER_ENTITY_FOR_CUTSCENE(null, csDave, CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, IG_DAVENORTON)
|
|
|
|
IF DOES_ENTITY_EXIST(objs[mof_mike_ciggy])
|
|
DETACH_ENTITY(objs[mof_mike_ciggy])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(objs[mof_mike_ciggy], "CigLit_Michael", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
|
|
IF bPlayerLockedIn
|
|
CLEAR_BLOCKED_PLAYER_FOR_LEAD_IN()
|
|
bPlayerLockedIn = FALSE
|
|
ENDIF
|
|
|
|
TORTURE_RegisterAllPropsForCutscene(FALSE)
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
START_CUTSCENE(CUTSCENE_SUPPRESS_FP_TRANSITION_FLASH)
|
|
|
|
IF NOT IS_REPLAY_RECORDING()
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
ENDIF
|
|
|
|
i_mission_substage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
IF IS_CUTSCENE_PLAYING()
|
|
SAFE_FADE_IN()
|
|
|
|
DISPLAY_RADAR(TRUE)
|
|
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
IF DOES_CAM_EXIST(cam_establish)
|
|
DESTROY_CAM(cam_establish)
|
|
ENDIF
|
|
|
|
IF bStartedAsMichael
|
|
Unload_Asset_Anim_Dict(sAssetData, "MISSFBI3IG_0")
|
|
ELSE
|
|
bTrousersUp = TRUE
|
|
Unload_Asset_Anim_Dict(sAssetData, "missfbi3leadinout")
|
|
ENDIF
|
|
|
|
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(
|
|
<<115.668617,-2198.093262,5.032481>>, <<139.517273,-2197.381836,12.048586>>, 16.562500,
|
|
vOtherVehicleOutsideWarehouse, fOtherVehicleOutsideWarehouse)
|
|
|
|
VEHICLE_INDEX vehTemp
|
|
vehTemp = GET_PLAYERS_LAST_VEHICLE()
|
|
IF DOES_ENTITY_EXIST(vehTemp)
|
|
IF IS_VEHICLE_DRIVEABLE(vehTemp)
|
|
AND NOT IS_VEHICLE_RESTRICTED(vehTemp)
|
|
AND NOT IS_THIS_MODEL_A_BOAT(GET_ENTITY_MODEL(vehTemp))
|
|
AND NOT IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(vehTemp))
|
|
AND NOT IS_THIS_MODEL_A_PLANE(GET_ENTITY_MODEL(vehTemp))
|
|
|
|
IF IS_VEHICLE_A_PLAYER_PERSONAL_VEHICLE(vehTemp, CHAR_TREVOR)
|
|
IF NOT IS_ENTITY_A_MISSION_ENTITY(vehTemp)
|
|
SET_ENTITY_AS_MISSION_ENTITY(vehTemp, TRUE, TRUE)
|
|
ENDIF
|
|
vehTrevor = vehTemp
|
|
SET_VEHICLE_ENGINE_ON(vehTrevor, FALSE, TRUE)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehTrevor, FALSE)
|
|
ELSE
|
|
SET_MISSION_LAST_VEHICLE_AS_VEHICLE_GEN(vOtherVehicleOutsideWarehouse, fOtherVehicleOutsideWarehouse)
|
|
SET_VEHICLE_ENGINE_ON(vehTemp, FALSE, TRUE)
|
|
ENDIF
|
|
|
|
ELSE
|
|
IF NOT IS_ENTITY_A_MISSION_ENTITY(vehTemp)
|
|
SET_ENTITY_AS_MISSION_ENTITY(vehTemp, TRUE, TRUE)
|
|
ENDIF
|
|
DELETE_VEHICLE(vehTemp)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vehDriveToVeh)
|
|
IF IS_VEHICLE_DRIVEABLE(vehDriveToVeh)
|
|
SET_ENTITY_COORDS(vehDriveToVeh, vDaveCarOutsideTortureCoords)
|
|
SET_ENTITY_HEADING(vehDriveToVeh, fDaveCarOutsideTortureHeading)
|
|
SET_VEHICLE_ENGINE_ON(vehDriveToVeh, FALSE, TRUE)
|
|
ELSE
|
|
DELETE_VEHICLE(vehDriveToVeh)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vehTrevor)
|
|
IF IS_VEHICLE_DRIVEABLE(vehTrevor)
|
|
SET_ENTITY_COORDS(vehTrevor, vTrevorCarOutsideTortureCoord)
|
|
SET_ENTITY_HEADING(vehTrevor, fTrevorCarOutsideTortureHeading)
|
|
SET_VEHICLE_ENGINE_ON(vehTrevor, FALSE, TRUE)
|
|
ELSE
|
|
DELETE_VEHICLE(vehTrevor)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CLEAR_AREA_OF_PROJECTILES(vDaveCarOutsideTortureCoords, 100)
|
|
CLEAR_AREA_OF_OBJECTS(vDaveCarOutsideTortureCoords, 100)
|
|
i_mission_substage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 2
|
|
IF IS_CUTSCENE_PLAYING()
|
|
|
|
IF GET_CUTSCENE_CONCAT_SECTION_PLAYING() >= 5
|
|
IF NOT bMusicCueTriggered
|
|
TRIGGER_MUSIC_EVENT("FBI3_START")
|
|
bMusicCueTriggered = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_CUTSCENE_TIME() >= 170000
|
|
bDisplayHeartMonitor = TRUE
|
|
ENDIF
|
|
|
|
IF DOES_CUTSCENE_ENTITY_EXIST(csMonitor)
|
|
IF NOT IS_NAMED_RENDERTARGET_REGISTERED(sECGRenderTarget)
|
|
REGISTER_NAMED_RENDERTARGET(sECGRenderTarget)
|
|
|
|
IF NOT IS_NAMED_RENDERTARGET_LINKED(mnMonitor)
|
|
LINK_NAMED_RENDERTARGET(mnMonitor)
|
|
ENDIF
|
|
|
|
rtECG = GET_NAMED_RENDERTARGET_RENDER_ID(sECGRenderTarget)
|
|
ENDIF
|
|
|
|
SET_TEXT_RENDER_ID(rtECG)
|
|
DRAW_RECT_FROM_CORNER(0,0, 1.0, 1.0, 0, 0, 0, 255)
|
|
SET_TEXT_RENDER_ID(rtScreen)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
// Grab dave from the cutscene
|
|
IF NOT DOES_ENTITY_EXIST(pedDave)
|
|
ENTITY_INDEX entity
|
|
entity = GET_ENTITY_INDEX_OF_REGISTERED_ENTITY(csDave, IG_DAVENORTON)
|
|
IF DOES_ENTITY_EXIST(entity)
|
|
pedDave = GET_PED_INDEX_FROM_ENTITY_INDEX(entity)
|
|
SET_PED_CREW(pedDave)
|
|
CDEBUG1LN(DEBUG_MIKE, "******* GRABBED DAVE **********")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bTrousersUp
|
|
IF GET_CUTSCENE_TIME() >= 11700
|
|
IF IS_CUTSCENE_PLAYING()
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Trevor", PED_COMP_LEG, 0, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Trevor", PED_COMP_SPECIAL, 0, 0)
|
|
SET_CUTSCENE_PED_COMPONENT_VARIATION("Trevor", PED_COMP_FEET, 10, 0)
|
|
ENDIF
|
|
bTrousersUp = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
bCamExited = TRUE
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(csDave)
|
|
|
|
CDEBUG1LN(DEBUG_MIKE, "******* DAVE EXITED CUTSCENE **********")
|
|
bDaveExited = TRUE
|
|
|
|
IF DOES_ENTITY_EXIST(pedDave)
|
|
AND NOT IS_PED_INJURED(pedDave)
|
|
SET_ENTITY_COORDS(pedDave, <<133.0303, -2198.1868, 5.1692>>)
|
|
SET_ENTITY_HEADING(pedDave, 41.7744)
|
|
FORCE_PED_MOTION_STATE(pedDave, MS_ON_FOOT_WALK)
|
|
CDEBUG1LN(DEBUG_MIKE, "******* DAVE WARPED AFTER CUT **********")
|
|
ELSE
|
|
CDEBUG1LN(DEBUG_MIKE, "******* DAVE DOESNT EXIST/IS DEAD **********")
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
// Warp player upon exiting
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael")
|
|
IF IS_REPLAY_RECORDING()
|
|
REPLAY_STOP_EVENT()
|
|
ENDIF
|
|
|
|
CDEBUG1LN(DEBUG_MIKE, "******* MICHAEL EXITED CUTSCENE **********")
|
|
bMichaelExited = TRUE
|
|
|
|
// Take control of michael
|
|
IF PLAYER_PED_ID() != MIKE_PED_ID()
|
|
IF GET_CURRENT_PLAYER_PED_ENUM() != CHAR_MICHAEL
|
|
MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_MICHAEL)
|
|
TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE)
|
|
SET_PED_CREW(MIKE_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bTrousersUp
|
|
// SET_PED_COMPONENT_VARIATION(TREV_PED_ID(), PED_COMP_LEG, 0, 0)
|
|
// SET_PED_COMPONENT_VARIATION(TREV_PED_ID(), PED_COMP_SPECIAL, 0, 0)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(TREV_PED_ID(), COMP_TYPE_LEGS, GET_PED_COMP_ITEM_FROM_VARIATIONS(TREV_PED_ID(), 0, 0, COMP_TYPE_LEGS), FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(TREV_PED_ID(), COMP_TYPE_SPECIAL, GET_PED_COMP_ITEM_FROM_VARIATIONS(TREV_PED_ID(), 0, 0, COMP_TYPE_SPECIAL), FALSE)
|
|
SET_PED_COMP_ITEM_CURRENT_SP(TREV_PED_ID(), COMP_TYPE_FEET, GET_PED_COMP_ITEM_FROM_VARIATIONS(TREV_PED_ID(), 0, 0, COMP_TYPE_FEET), FALSE)
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehDriveToVeh)
|
|
SET_VEHICLE_ENGINE_ON(vehDriveToVeh, FALSE, FALSE)
|
|
ENDIF
|
|
|
|
// bug 2006026
|
|
// Cutting to the player walking down the steps,
|
|
// if the player is in first person cam view then do a 3rd person push
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT( CAM_VIEW_MODE_CONTEXT_ON_FOOT ) = CAM_VIEW_MODE_FIRST_PERSON
|
|
IF DOES_CAM_EXIST( cam_establish )
|
|
DESTROY_CAM( cam_establish )
|
|
ENDIF
|
|
cam_establish = CREATE_CAMERA( CAMTYPE_SCRIPTED, FALSE )
|
|
ATTACH_CAM_TO_ENTITY(cam_establish, PLAYER_PED_ID(), <<0.3996, -2.3506, 0.7873>>, FALSE)
|
|
POINT_CAM_AT_ENTITY(cam_establish, PLAYER_PED_ID(), <<0.4001, 0.6177, 0.3519>>, FALSE)
|
|
SET_CAM_ACTIVE( cam_establish, TRUE )
|
|
RENDER_SCRIPT_CAMS( TRUE, FALSE )
|
|
ENDIF
|
|
|
|
SET_ENTITY_COORDS(MIKE_PED_ID(), <<133.1413, -2201.8418, 6.1864>>)
|
|
SET_ENTITY_HEADING(MIKE_PED_ID(), 3.0596)
|
|
FORCE_PED_MOTION_STATE(MIKE_PED_ID(), MS_ON_FOOT_WALK)
|
|
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK, 2000)
|
|
SET_PLAYER_CLOTH_PIN_FRAMES(PLAYER_ID(), 1)
|
|
|
|
TRIGGER_MUSIC_EVENT("FBI3_BACK_TO_MICHAEL")
|
|
SETTIMERB(0)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
|
|
|
|
CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
|
|
SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
|
SET_MAX_WANTED_LEVEL(5)
|
|
|
|
ENDIF
|
|
|
|
IF bMichaelExited
|
|
AND bDaveExited
|
|
AND bCamExited
|
|
IF DOES_ENTITY_EXIST(vehDriveToVeh)
|
|
AND IS_VEHICLE_DRIVEABLE(vehDriveToVeh)
|
|
SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(vehDriveToVeh, TRUE)
|
|
ENDIF
|
|
|
|
ENABLE_PROCOBJ_CREATION()
|
|
|
|
Unload_Asset_Scaleform(sAssetData, sfHeartMonitor)
|
|
bECGSetup = FALSE
|
|
bDisplayHeartMonitor = FALSE
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
|
|
eMissionStage = ST_2_DRIVE_TO_COORD_FIRST
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//═════════╡ CLEANUP ╞═════════
|
|
IF eMissionStage != ST_1_INTRO_CUT
|
|
MissionStageTidyUp()
|
|
|
|
SETTIMERB(0)
|
|
stopCamShake(camGeneralInit, camGeneralDest)
|
|
MissionStageTidyUp()
|
|
ADD_ALL_PEDS_TO_DIALOGUE()
|
|
|
|
bStageSetup = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
//PURPOSE: Performs the section where Michael drives
|
|
PROC stage2_DriveToCoordFirst()
|
|
|
|
//═════════╡ SETUP ╞═════════
|
|
IF NOT bStageSetup
|
|
|
|
SET_WEATHER_TYPE_OVERTIME_PERSIST("EXTRASUNNY", 30)
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(2, "2. Michael Drives 1st", FALSE, FALSE, NULL, FALSE)
|
|
// if Trevors vehicle, wipe it from the snapshot
|
|
// IF DOES_ENTITY_EXIST(GET_PLAYERS_LAST_VEHICLE())
|
|
// AND IS_VEHICLE_A_PERSONAL_VEHICLE(GET_PLAYERS_LAST_VEHICLE())
|
|
// AND GET_PLAYER_PED_PERSONAL_VEHICLE_BELONGS_TO(GET_PLAYERS_LAST_VEHICLE()) = CHAR_TREVOR
|
|
IF g_stageSnapshot.mVehicleStruct.ePlayerCharacter = CHAR_TREVOR
|
|
AND g_stageSnapshot.mVehicleStruct.bPersonalVehicle
|
|
Reset_Vehicle_Snapshot(g_stageSnapshot.mVehicleStruct)
|
|
ENDIF
|
|
|
|
ADD_ALL_PEDS_TO_DIALOGUE()
|
|
|
|
IF b_SpawnTrain
|
|
Load_Asset_Model(sAssetData, FREIGHT)
|
|
Load_Asset_Model(sAssetData, FREIGHTCONT1)
|
|
Load_Asset_Model(sAssetData, FREIGHTCONT2)
|
|
Load_Asset_Model(sAssetData, FREIGHTGRAIN)
|
|
Load_Asset_Model(sAssetData, TANKERCAR)
|
|
Load_Asset_Model(sAssetData, FREIGHTCAR)
|
|
|
|
SET_RANDOM_TRAINS(FALSE)
|
|
DELETE_ALL_TRAINS()
|
|
ENDIF
|
|
|
|
ADD_DOOR_TO_SYSTEM(iGateHashA, PROP_LRGGATE_02_LD, <<-880.59, -9.56, 41.97>>)
|
|
ADD_DOOR_TO_SYSTEM(iGateHashB, PROP_LRGGATE_02_LD, <<-893.16, 8.63, 43.71>>)
|
|
|
|
IF NOT IS_DOOR_REGISTERED_WITH_SYSTEM(iGateHashA)
|
|
OR NOT IS_DOOR_REGISTERED_WITH_SYSTEM(iGateHashB)
|
|
SCRIPT_ASSERT("Gate(s) not found!")
|
|
ELSE
|
|
DOOR_SYSTEM_SET_DOOR_STATE(iGateHashA, DOORSTATE_LOCKED, TRUE, TRUE)
|
|
DOOR_SYSTEM_SET_DOOR_STATE(iGateHashB, DOORSTATE_LOCKED, TRUE, TRUE)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vehDriveToVeh)
|
|
AND IS_VEHICLE_DRIVEABLE(vehDriveToVeh)
|
|
SET_LOCATES_BUDDIES_TO_GET_INTO_NEAREST_CAR(sLocatesData, vehDriveToVeh)
|
|
ENDIF
|
|
|
|
RunConversation("F3_WHERE")
|
|
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedDave, TRUE)
|
|
|
|
CLEAR_AREA(<<-890.90, -4.30, 42.39>>, 38.688, TRUE)
|
|
|
|
sba_wrongLocation = ADD_SCENARIO_BLOCKING_AREA(<<-890.959290,-4.526050,48.068375>> - <<35.000000,30.000000,10.437500>>,
|
|
<<-890.959290,-4.526050,48.068375>> + <<35.000000,30.000000,10.437500>>)
|
|
|
|
SET_PED_NON_CREATION_AREA(<<-890.959290,-4.526050,48.068375>> - <<35.000000,30.000000,10.437500>>,
|
|
<<-890.959290,-4.526050,48.068375>> + <<35.000000,30.000000,10.437500>>)
|
|
|
|
SET_PED_PATHS_IN_AREA(<<-890.959290,-4.526050,48.068375>> - <<35.000000,30.000000,10.437500>>,
|
|
<<-890.959290,-4.526050,48.068375>> + <<35.000000,30.000000,10.437500>>, FALSE)
|
|
|
|
GIVE_WEAPON_TO_PED(pedDave, WEAPONTYPE_PISTOL, INFINITE_AMMO, FALSE)
|
|
|
|
// bug 2006026
|
|
IF GET_CAM_VIEW_MODE_FOR_CONTEXT( CAM_VIEW_MODE_CONTEXT_ON_FOOT ) = CAM_VIEW_MODE_FIRST_PERSON
|
|
RENDER_SCRIPT_CAMS( FALSE, TRUE, 2500, FALSE )
|
|
ENDIF
|
|
|
|
iNeedVehicleUses = 0
|
|
iWrongHouseCut = -1
|
|
iDriveStoppedTimer = -1
|
|
iDriveComplaintTimer = 0
|
|
i_mission_substage = 0
|
|
str_InteruptedRoot = ""
|
|
str_InteruptedLabel = ""
|
|
bStageSetup = TRUE
|
|
bEventFlag[1] = FALSE
|
|
bEventFlag[2] = FALSE
|
|
bEventFlag[3] = FALSE
|
|
bMusicCueTriggered = FALSE
|
|
bMusicCueKilled = FALSE
|
|
i_realCuntsStage = 0
|
|
b_CuntPropPlayingAnim[0] = FALSE
|
|
b_CuntPropPlayingAnim[1] = FALSE
|
|
b_CuntPropPlayingAnim[2] = FALSE
|
|
iAssetRequests = 0
|
|
ENDIF
|
|
|
|
//═════════╡ UPDATE ╞═════════
|
|
|
|
IF bStageSetup
|
|
|
|
MANAGE_REAL_CUNTS_SCENE()
|
|
|
|
SWITCH i_mission_substage
|
|
CASE 0
|
|
IF NOT bEventFlag[4]
|
|
IF IS_PED_IN_ANY_VEHICLE(pedDave)
|
|
bEventFlag[4] = TRUE
|
|
ELSE
|
|
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_ForcePlayerToEnterVehicleThroughDirectDoorOnly, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_PLAYER_AT_ANGLED_AREA_WITH_BUDDY_ANY_MEANS(sLocatesData, v_BlipRockfordHillsHouse,
|
|
<<-874.998962,-21.779987,40.751186>>, <<-871.393311,-6.139875,45.712112>>, 13.062500, TRUE, pedDave,
|
|
"TFT_DRIVE1", "TFT_RTNDAV", FALSE, TRUE)
|
|
|
|
i_realCuntsStage = 1
|
|
|
|
CLEAR_PRINTS()
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
|
|
// Grab the last vehicle the player was using
|
|
VEHICLE_INDEX vehLastVeh
|
|
vehLastVeh = GET_PLAYERS_LAST_VEHICLE()
|
|
IF DOES_ENTITY_EXIST(vehLastVeh)
|
|
IF NOT DOES_ENTITY_BELONG_TO_THIS_SCRIPT(vehLastVeh)
|
|
SET_ENTITY_AS_MISSION_ENTITY(vehLastVeh, TRUE, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
VECTOR vDimensionsMin, vDimensionsMax
|
|
GET_MODEL_DIMENSIONS(GET_ENTITY_MODEL(vehLastVeh), vDimensionsMin, vDimensionsMax)
|
|
|
|
IF IS_ENTITY_ON_FIRE(MIKE_PED_ID())
|
|
STOP_ENTITY_FIRE(MIKE_PED_ID())
|
|
ENDIF
|
|
IF IS_ENTITY_ON_FIRE(pedDave)
|
|
STOP_ENTITY_FIRE(pedDave)
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_ON_FIRE(vehLastVeh)
|
|
STOP_ENTITY_FIRE(vehLastVeh)
|
|
ENDIF
|
|
SET_VEHICLE_BODY_HEALTH(vehLastVeh, 1000)
|
|
SET_VEHICLE_PETROL_TANK_HEALTH(vehLastVeh, 1000)
|
|
SET_VEHICLE_ENGINE_HEALTH(vehLastVeh, 1000)
|
|
|
|
// Reposition player and their vehicle if they are in one and create the first camera
|
|
IF IS_PED_IN_VEHICLE(MIKE_PED_ID(), vehLastVeh)
|
|
AND IS_VEHICLE_DRIVEABLE(vehLastVeh)
|
|
AND NOT IS_VEHICLE_RESTRICTED(vehLastVeh)
|
|
AND NOT IS_THIS_MODEL_A_BIKE( GET_ENTITY_MODEL( vehLastVeh ) )
|
|
AND NOT IS_THIS_MODEL_A_QUADBIKE( GET_ENTITY_MODEL( vehLastVeh ) )
|
|
AND NOT IS_THIS_MODEL_A_BICYCLE( GET_ENTITY_MODEL( vehLastVeh ) )
|
|
AND ABSF(vDimensionsMax.z - vDimensionsMin.z) < 2.5
|
|
|
|
// this is the one the scripted cutscene will now refer to
|
|
vehWrongLocationCutscene = vehLastVeh
|
|
|
|
CLEAR_AREA(v_BlipRockfordHillsHouse, 10.0, TRUE)
|
|
|
|
TEXT_LABEL_15 strSeatName
|
|
IF IS_THIS_MODEL_A_BIKE(GET_ENTITY_MODEL(vehWrongLocationCutscene))
|
|
strSeatName = "seat_f"
|
|
ELSE
|
|
strSeatName = "seat_dside_f"
|
|
ENDIF
|
|
|
|
SET_ENTITY_COORDS(vehWrongLocationCutscene, <<-876.7368, -14.0188, 41.4273>>)
|
|
SET_ENTITY_HEADING(vehWrongLocationCutscene, 164.5692)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vehWrongLocationCutscene)
|
|
|
|
VECTOR camPos1, camPos2
|
|
|
|
// camPos1 = <<-874.6,-16.0, 42.8>> - GET_WORLD_POSITION_OF_ENTITY_BONE(vehLastVeh, GET_ENTITY_BONE_INDEX_BY_NAME(vehLastVeh, strSeatName))
|
|
// camPos1 = <<-874.5345, -15.5768, 42.7978>> - GET_WORLD_POSITION_OF_ENTITY_BONE(vehLastVeh, GET_ENTITY_BONE_INDEX_BY_NAME(vehLastVeh, strSeatName))
|
|
// CPRINTLN(DEBUG_MIKE, "OFFSET START: ", camPos1)
|
|
// camPos1 = << 1.74115, -1.80626, 0.810997 >> + GET_WORLD_POSITION_OF_ENTITY_BONE(vehWrongLocationCutscene, GET_ENTITY_BONE_INDEX_BY_NAME(vehWrongLocationCutscene, strSeatName))
|
|
camPos1 = << 1.79144, -1.3507, 0.80946 >> + <<0.0,0.0,0.15>> + GET_WORLD_POSITION_OF_ENTITY_BONE(vehWrongLocationCutscene, GET_ENTITY_BONE_INDEX_BY_NAME(vehWrongLocationCutscene, strSeatName))
|
|
|
|
// camPos2 = <<-874.0,-15.0, 42.8>> - GET_WORLD_POSITION_OF_ENTITY_BONE(vehLastVeh, GET_ENTITY_BONE_INDEX_BY_NAME(vehLastVeh, strSeatName))
|
|
// CPRINTLN(DEBUG_MIKE, "OFFSET END: ", camPos2)
|
|
camPos2 = << 2.34113, -0.806258, 0.810997 >> + <<0.0,0.0,0.15>> + GET_WORLD_POSITION_OF_ENTITY_BONE(vehWrongLocationCutscene, GET_ENTITY_BONE_INDEX_BY_NAME(vehWrongLocationCutscene, strSeatName))
|
|
|
|
camWrongLocation = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED,camPos1, <<-3.7418, -0.0529, 76.2490>>, 33.4690, TRUE)
|
|
SET_CAM_PARAMS(camWrongLocation, camPos2, <<-3.7418, -0.0529, 76.2490>>, 33.4690, 3000)
|
|
|
|
SHAKE_CAM(camWrongLocation, shakeHand, 0.5)
|
|
|
|
SET_ENTITY_COORDS(vehWrongLocationCutscene, <<-875.0729, -9.6045, 41.7469>>) //<<-875.2629, -9.0932, 41.7644>>)
|
|
SET_ENTITY_HEADING(vehWrongLocationCutscene, 162.8776)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vehWrongLocationCutscene)
|
|
TASK_VEHICLE_DRIVE_TO_COORD(PLAYER_PED_ID(), vehWrongLocationCutscene, <<-877.7476, -17.7999, 41.2598>>, 2.0, DRIVINGSTYLE_STRAIGHTLINE, GET_ENTITY_MODEL( GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())), DRIVINGMODE_PLOUGHTHROUGH, 0.1, 10.0)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
SET_VEHICLE_FORWARD_SPEED(vehWrongLocationCutscene, 2.0)
|
|
|
|
ELSE
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-878.9167, -13.8135, 41.5259>>)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), 84.7426)
|
|
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_IDLE)
|
|
TASK_TURN_PED_TO_FACE_ENTITY(PLAYER_PED_ID(), pedCunts[CUNTPED_ACTOR_M], -1)
|
|
|
|
IF GET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID())
|
|
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
|
|
ENDIF
|
|
|
|
CLEAR_AREA(v_BlipRockfordHillsHouse, 10.0, TRUE)
|
|
|
|
SET_ENTITY_COORDS(pedDave, <<-878.7094, -12.4876, 41.5789>>)
|
|
SET_ENTITY_HEADING(pedDave, 83.8295)
|
|
FORCE_PED_MOTION_STATE(pedDave, MS_ON_FOOT_IDLE)
|
|
TASK_TURN_PED_TO_FACE_ENTITY(pedDave, pedCunts[CUNTPED_ACTOR_M], -1)
|
|
|
|
camWrongLocation = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<-876.6390, -12.2161, 44.6939>>, <<-7.0418, 0.0000, 90.6103>>, 30.4, TRUE)
|
|
SET_CAM_PARAMS(camWrongLocation, <<-876.7625, -13.8252, 43.4649>>, <<-5.5399, 0.0000, 72.9562>>, 30.4, 7000)
|
|
ENDIF
|
|
|
|
|
|
SET_CAM_FAR_CLIP(camWrongLocation, 30.0)
|
|
|
|
IF DOES_ENTITY_EXIST(vehLastVeh)
|
|
AND IS_VEHICLE_DRIVEABLE(vehLastVeh)
|
|
AND GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(vehLastVeh, v_BlipRockfordHillsHouse) < 100.0
|
|
|
|
// Store the last vehicle the player was using ready for the 2nd drive
|
|
CPRINTLN(DEBUG_MIKE, "STORING THE LAST VEHICLE THE PLAYER USED")
|
|
OVERRIDE_REPLAY_CHECKPOINT_VEHICLE(vehLastVeh)
|
|
|
|
ENDIF
|
|
|
|
// Always clean up Trevors vehicle as it can never be used for this part of the mission
|
|
IF DOES_ENTITY_EXIST(vehTrevor)
|
|
DELETE_VEHICLE(vehTrevor)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vehDriveToVeh)
|
|
AND (NOT DOES_ENTITY_EXIST(vehWrongLocationCutscene) OR vehWrongLocationCutscene != vehDriveToVeh)
|
|
IF DOES_ENTITY_EXIST(vehLastVeh)
|
|
AND vehLastVeh = vehDriveToVeh
|
|
vehLastVeh = null
|
|
ENDIF
|
|
DELETE_VEHICLE(vehDriveToVeh)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vehReplay)
|
|
AND (NOT DOES_ENTITY_EXIST(vehWrongLocationCutscene) OR vehWrongLocationCutscene != vehReplay)
|
|
IF DOES_ENTITY_EXIST(vehLastVeh)
|
|
AND vehLastVeh = vehReplay
|
|
vehLastVeh = null
|
|
ENDIF
|
|
DELETE_VEHICLE(vehReplay)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(vehLastVeh)
|
|
AND (NOT DOES_ENTITY_EXIST(vehWrongLocationCutscene) OR vehWrongLocationCutscene != vehLastVeh)
|
|
DELETE_VEHICLE(vehLastVeh)
|
|
ENDIF
|
|
|
|
DISPLAY_RADAR(FALSE)
|
|
SHAKE_CAM(camWrongLocation, shakeHand, 0.2)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
// 1st look at
|
|
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), pedCunts[CUNTPED_ACTOR_F], -1, SLF_WHILE_NOT_IN_FOV | SLF_WIDEST_YAW_LIMIT, SLF_LOOKAT_VERY_HIGH)
|
|
TASK_LOOK_AT_ENTITY(pedDave, pedCunts[CUNTPED_ACTOR_F], -1, SLF_WHILE_NOT_IN_FOV | SLF_WIDEST_YAW_LIMIT, SLF_LOOKAT_VERY_HIGH)
|
|
|
|
TORTURE_LoadAssets(TRUE, TRUE)
|
|
|
|
STOP_AUDIO_SCENE("FBI_3_MICHAEL_DRIVE_FIRST")
|
|
START_AUDIO_SCENE("FBI_3_FOCUS_CAM_PHOTOSHOOT")
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
|
|
iWrongHouseCut = 0
|
|
i_mission_substage++
|
|
|
|
ELSE
|
|
IF NOT IS_NEW_LOAD_SCENE_ACTIVE()
|
|
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_BlipRockfordHillsHouse) < 50
|
|
Load_Asset_NewLoadScene_Frustum(sAssetData, <<-872.9581, -13.6342, 42.8937>>, <<-883.6840, -12.3810, 43.8704>> - <<-872.9581, -13.6342, 42.8937>>, 30.0)
|
|
ENDIF
|
|
ELSE
|
|
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), v_BlipRockfordHillsHouse) > 75
|
|
Unload_Asset_NewLoadScene(sAssetData)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bMusicCueTriggered
|
|
IF TIMERB() > 3500
|
|
OR IS_PED_IN_ANY_VEHICLE(MIKE_PED_ID(), TRUE)
|
|
TRIGGER_MUSIC_EVENT("FBI3_MICHAEL_MUSIC_1")
|
|
bMusicCueTriggered = TRUE
|
|
ENDIF
|
|
ELIF NOT bMusicCueKilled
|
|
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), v_BlipRockfordHillsHouse) < 25.0
|
|
TRIGGER_MUSIC_EVENT("FBI3_MICHAEL_ARRIVES_1")
|
|
bMusicCueKilled = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FBI_3_MICHAEL_DRIVE_FIRST")
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
START_AUDIO_SCENE("FBI_3_MICHAEL_DRIVE_FIRST")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Spawn a train if this is not a replay
|
|
IF b_SpawnTrain
|
|
IF NOT bEventFlag[3]
|
|
IF NOT DOES_ENTITY_EXIST(vehTrainStart)
|
|
AND HAS_MODEL_LOADED(FREIGHT)
|
|
AND HAS_MODEL_LOADED(FREIGHTCONT1)
|
|
AND HAS_MODEL_LOADED(FREIGHTCONT2)
|
|
AND HAS_MODEL_LOADED(FREIGHTGRAIN)
|
|
AND HAS_MODEL_LOADED(FREIGHTCAR)
|
|
AND HAS_MODEL_LOADED(TANKERCAR)
|
|
vehTrainStart = CREATE_MISSION_TRAIN(15, << 217.6160, -2215.7500, 11.6666 >>, TRUE)
|
|
Unload_Asset_Model(sAssetData, FREIGHT)
|
|
Unload_Asset_Model(sAssetData, FREIGHTCONT1)
|
|
Unload_Asset_Model(sAssetData, FREIGHTCONT2)
|
|
Unload_Asset_Model(sAssetData, FREIGHTGRAIN)
|
|
Unload_Asset_Model(sAssetData, TANKERCAR)
|
|
Unload_Asset_Model(sAssetData, FREIGHTCAR)
|
|
|
|
SET_TRAIN_SPEED(vehTrainStart, 15.0)
|
|
SET_TRAIN_CRUISE_SPEED(vehTrainStart, 15.0)
|
|
bEventFlag[3] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
// Remove train when out of range
|
|
IF DOES_ENTITY_EXIST(vehTrainStart)
|
|
IF GET_DISTANCE_BETWEEN_ENTITIES(vehTrainStart, MIKE_PED_ID()) > 200
|
|
SET_MISSION_TRAIN_AS_NO_LONGER_NEEDED(vehTrainStart)
|
|
vehTrainStart = NULL
|
|
SET_RANDOM_TRAINS(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Handle drive conversation with dave and all its interrupts
|
|
DRIVE_HandleDriveConvo_MikeWithDave("F3_DRV1", v_BlipRockfordHillsHouse, 30)
|
|
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
IF DOES_ENTITY_EXIST(vehWrongLocationCutscene)
|
|
AND IS_VEHICLE_DRIVEABLE(vehWrongLocationCutscene)
|
|
SET_VEHICLE_DEFORMATION_FIXED(vehWrongLocationCutscene)
|
|
ENDIF
|
|
i_mission_substage++
|
|
BREAK
|
|
CASE 2
|
|
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_WEAPON_ICON)
|
|
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
IF NOT IS_VEHICLE_STOPPED(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
|
|
IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-876.706604,-17.079636,40.987129>>, <<-875.831665,-13.647627,44.562244>>, 5.250000)
|
|
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), 1.0, -1)
|
|
IF IS_SCRIPT_TASK_RUNNING_OR_STARTING(PLAYER_PED_ID(), SCRIPT_TASK_VEHICLE_DRIVE_TO_COORD)
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
OVERRIDE_LODSCALE_THIS_FRAME(1.0)
|
|
|
|
IF SWITCH_Wronglocation_To_Torture_CUTSCENE()
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE, DEFAULT, FALSE) //Don't disable blinders
|
|
eMissionStage = ST_3_TORTURE_FOR_FIRST
|
|
ELSE
|
|
IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(PLAYER_PED_ID(), SCRIPT_TASK_LOOK_AT_ENTITY)
|
|
// 2nd look at tasked in case clearing the tasks removes the peds look at.
|
|
TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), pedCunts[CUNTPED_ACTOR_F], -1, SLF_WHILE_NOT_IN_FOV | SLF_WIDEST_YAW_LIMIT, SLF_LOOKAT_VERY_HIGH)
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
SWITCH iWrongHouseCut
|
|
CASE 0
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
|
|
IF NOT IS_REPLAY_RECORDING()
|
|
REPLAY_RECORD_BACK_FOR_TIME(8.0, 0.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
ENDIF
|
|
|
|
RunConversation("F3_CALL1Ai")
|
|
iWrongHouseCut++
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
TASK_CLEAR_LOOK_AT(pedDave)
|
|
TASK_USE_MOBILE_PHONE(pedDave, TRUE)
|
|
PLAY_SOUND_FROM_ENTITY(-1, "PED_PHONE_DIAL_01", pedDave)
|
|
SETTIMERB(0)
|
|
iWrongHouseCut++
|
|
ENDIF
|
|
BREAK
|
|
CASE 2
|
|
IF TIMERB() > 3500
|
|
RunConversation("F3_CALL1Aii")
|
|
iWrongHouseCut++
|
|
ENDIF
|
|
BREAK
|
|
CASe 3
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
TASK_USE_MOBILE_PHONE(pedDave, FALSE)
|
|
SETTIMERB(0)
|
|
iWrongHouseCut++
|
|
ENDIF
|
|
BREAK
|
|
CASE 4
|
|
IF TIMERB() > 1000
|
|
TASK_LOOK_AT_ENTITY(pedDave, MIKE_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV | SLF_SLOW_TURN_RATE)
|
|
iWrongHouseCut++
|
|
ENDIF
|
|
BREAK
|
|
CASE 5
|
|
IF TIMERB() > 2000
|
|
RunConversation("F3_COFFEE2")
|
|
iWrongHouseCut++
|
|
ENDIF
|
|
BREAK
|
|
CASE 6
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
SETTIMERB(0)
|
|
iWrongHouseCut++
|
|
ENDIF
|
|
BREAK
|
|
CASE 7
|
|
IF TIMERB() > 1000
|
|
IF IS_REPLAY_RECORDING()
|
|
REPLAY_STOP_EVENT()
|
|
ENDIF
|
|
|
|
bSafeToSwitch = TRUE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF iWrongHouseCut > -1 AND iWrongHouseCut <= 6
|
|
IF IS_SCREEN_FADED_OUT()
|
|
TORTURE_LoadAssets(TRUE, TRUE)
|
|
bSafeToSwitch = TRUE
|
|
ELSE
|
|
IF NOT IS_SCREEN_FADING_OUT()
|
|
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
|
|
AND NOT bMissionFailed
|
|
IF IS_REPLAY_RECORDING()
|
|
REPLAY_CANCEL_EVENT()
|
|
ENDIF
|
|
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//═════════╡ CLEANUP ╞════════
|
|
IF eMissionStage != ST_2_DRIVE_TO_COORD_FIRST
|
|
IF IS_REPLAY_RECORDING()
|
|
REPLAY_STOP_EVENT()
|
|
ENDIF
|
|
DISABLE_CELLPHONE(FALSE)
|
|
|
|
IF DOES_ENTITY_EXIST(vehTrainStart)
|
|
SET_MISSION_TRAIN_AS_NO_LONGER_NEEDED(vehTrainStart)
|
|
vehTrainStart = NULL
|
|
ENDIF
|
|
SET_RANDOM_TRAINS(TRUE)
|
|
|
|
MissionStageTidyUp()
|
|
bStageSetup = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: Performs the section where Trevor tortures the victim for the first time
|
|
PROC stage3_TortureForFirst()
|
|
|
|
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_WEAPON_ICON)
|
|
DISABLE_PLAYER_PED_STAT_UPDATES_THIS_FRAME()
|
|
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME()
|
|
|
|
//═════════╡ SETUP ╞═════════
|
|
IF NOT bStageSetup
|
|
|
|
ADD_ALL_PEDS_TO_DIALOGUE()
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(3, "3. Trevor Tortures First", FALSE, FALSE, NULL, FALSE)
|
|
TORTURE_Store_Victim_State()
|
|
|
|
DISPLAY_RADAR(FALSE)
|
|
|
|
DISABLE_CELLPHONE(TRUE)
|
|
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
bInitialWeaponHighlighted = FALSE
|
|
#ENDIF
|
|
|
|
i_mission_substage = 0
|
|
bStageSetup = TRUE
|
|
iAssetRequests = 0
|
|
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
SET_MAX_WANTED_LEVEL(0)
|
|
SET_CREATE_RANDOM_COPS(FALSE)
|
|
|
|
SET_PC_CONTROLS( "FBI3 MINIGAME SELECT")
|
|
SET_MULTIHEAD_SAFE(TRUE)
|
|
|
|
ENDIF
|
|
|
|
//═════════╡ UPDATE ╞═════════
|
|
IF bStageSetup
|
|
bDisplayHeartMonitor = TRUE
|
|
|
|
IF i_mission_substage < 5
|
|
IF IS_SCREEN_FADED_IN()
|
|
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
|
|
AND NOT bMissionFailed
|
|
SAFE_FADE_OUT()
|
|
ENDIF
|
|
ELIF IS_SCREEN_FADED_OUT()
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SWITCH i_mission_substage
|
|
CASE 0
|
|
SET_WEATHER_TYPE_NOW_PERSIST("EXTRASUNNY")
|
|
|
|
TRIGGER_MUSIC_EVENT("FBI3_TORTURE_START")
|
|
bTortureMusicPlaying = TRUE
|
|
|
|
IF NOT bHasSwitchSetupCam
|
|
doTwoPointCam(camGeneralInit, camGeneralDest, << 146.7890, -2204.1140, 5.6386 >>, << -10.8642, 7.4269, 61.6078 >>, 17.4610,
|
|
<< 146.7890, -2204.1140, 5.6386 >>, << -10.8642, 7.4269, 61.6078 >>, 16.0803,
|
|
5000)
|
|
doCamShake(camGeneralInit, camGeneralDest, shakeHand, 0.3)
|
|
ENDIF
|
|
|
|
SETTIMERB(0)
|
|
|
|
RunConversation("F3_CALL1B")
|
|
SAFE_FADE_IN()
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
PRINT_HELP_FOREVER(hlpTorture1)
|
|
#ENDIF
|
|
i_mission_substage++
|
|
BREAK
|
|
CASE 1
|
|
IF TIMERB() > 5000
|
|
OR IS_SCREEN_FADED_OUT()
|
|
doTwoPointCam(camGeneralInit, camGeneralDest, << 143.8915, -2202.9985, 7.5430 >>, << -73.9446, -17.3188, -160.2916 >>, 16.3626,
|
|
<< 143.6610, -2203.0364, 7.5307 >>, << -72.3070, -17.3188, -154.9457 >>, 16.3626,
|
|
5000)
|
|
doCamShake(camGeneralInit, camGeneralDest, shakeHand, 0.3)
|
|
SETTIMERB(0)
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
PRINT_HELP_FOREVER(hlpTorture2)
|
|
#ENDIF
|
|
i_mission_substage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 2
|
|
IF TIMERB() > 5000
|
|
OR IS_SCREEN_FADED_OUT()
|
|
doTwoPointCam(camGeneralInit, camGeneralDest, << 142.5872, -2200.3647, 4.5637 >>, << 7.3505, -5.0, -159.0778 >>, 24.4943,
|
|
<< 142.5258, -2200.3882, 4.5588 >>, << 7.3505, -5.0, -157.9305 >>, 24.4943,
|
|
5000)
|
|
doCamShake(camGeneralInit, camGeneralDest, shakeHand, 0.3)
|
|
SETTIMERB(0)
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
PRINT_HELP_FOREVER(hlpTorture3)
|
|
#ENDIF
|
|
i_mission_substage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 3
|
|
IF TIMERB() > 5000
|
|
OR IS_SCREEN_FADED_OUT()
|
|
doTwoPointCam(camGeneralInit, camGeneralDest, <<143.4552, -2204.9785, 4.8811>>, <<-3.6438, 2.7744, 7.1743>>, 18.4641,
|
|
<<143.4501, -2204.9922, 4.8>>, <<-3.6438, 2.7744, 7.1743>>, 18.4641,
|
|
5000)
|
|
doCamShake(camGeneralInit, camGeneralDest, shakeHand, 0.3)
|
|
SETTIMERB(0)
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
PRINT_HELP_FOREVER(hlpTorture4)
|
|
#ENDIF
|
|
i_mission_substage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 4
|
|
IF TIMERB() > 5000
|
|
OR IS_SCREEN_FADED_OUT()
|
|
TORTURE_ManageWeaponSelection()
|
|
SAFE_FADE_IN(DEFAULT_FADE_TIME_SHORT)
|
|
i_mission_substage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 5
|
|
IF TORTURE_ManageWeaponSelection()
|
|
#IF IS_JAPANESE_BUILD
|
|
TORTURE_Request_Cutscene(FALSE)
|
|
#ENDIF
|
|
IF NOT IS_REPLAY_RECORDING()
|
|
REPLAY_RECORD_BACK_FOR_TIME(2.0, 4.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
ENDIF
|
|
i_mission_substage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 6
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
IF TORTURE_ManageMinigame()
|
|
#ENDIF
|
|
SHUTDOWN_PC_CONTROLS()
|
|
SWITCH_Torture_To_Coffee()
|
|
IF NOT IS_REPLAY_RECORDING()
|
|
REPLAY_RECORD_BACK_FOR_TIME(15.0, 0.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
ENDIF
|
|
i_mission_substage++
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
ENDIF
|
|
#ENDIF
|
|
BREAK
|
|
CASE 7
|
|
IF SWITCH_Torture_To_Coffee()
|
|
eMissionStage = ST_4_DRIVE_TO_COORD_SECOND
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//═════════╡ CLEANUP ╞═════════
|
|
IF eMissionStage != ST_3_TORTURE_FOR_FIRST
|
|
clearText()
|
|
TORTURE_CleanupEntitiesAndAssets()
|
|
MissionStageTidyUp()
|
|
bStageSetup = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
//PURPOSE: Performs the section where Michael drives to the snipe location
|
|
PROC stage4_DriveToCoordSecond()
|
|
|
|
//═════════╡ SETUP ╞═════════
|
|
IF NOT bStageSetup
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(4, "4. Michael Drives 2nd")
|
|
TORTURE_Store_Victim_State()
|
|
|
|
ADD_ALL_PEDS_TO_DIALOGUE()
|
|
|
|
DISPLAY_RADAR(TRUE)
|
|
|
|
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
|
|
SET_PED_CONFIG_FLAG(MIKE_PED_ID(), PCF_ForceDirectEntry, TRUE)
|
|
|
|
i_mission_substage = 0
|
|
bStageSetup = TRUE
|
|
bMichaelExited = FALSE
|
|
bDaveExited = FALSE
|
|
|
|
SET_PED_NON_CREATION_AREA(<<-2969.646484,351.977753,16.206539>> - <<24.437500,26.125000,2.687500>>,
|
|
<<-2969.646484,351.977753,16.206539>> + <<24.437500,26.125000,2.687500>>)
|
|
|
|
SET_PED_PATHS_IN_AREA(<<-2969.646484,351.977753,16.206539>> - <<24.437500,26.125000,2.687500>>,
|
|
<<-2969.646484,351.977753,16.206539>> + <<24.437500,26.125000,2.687500>>, FALSE)
|
|
|
|
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<-2969.646484,351.977753,16.206539>> - <<24.437500,26.125000,2.687500>>,
|
|
<<-2969.646484,351.977753,16.206539>> + <<24.437500,26.125000,2.687500>>, FALSE)
|
|
|
|
sba_chumash_car_park = ADD_SCENARIO_BLOCKING_AREA(<<-2969.646484,351.977753,16.206539>> - <<24.437500,26.125000,2.687500>>,
|
|
<<-2969.646484,351.977753,16.206539>> + <<24.437500,26.125000,2.687500>>)
|
|
|
|
CLEAR_AREA(vDriveTo2Coords, 100.0, TRUE)
|
|
|
|
SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
|
SET_MAX_WANTED_LEVEL(5)
|
|
SET_CREATE_RANDOM_COPS(TRUE)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehDriveToVeh)
|
|
SET_LOCATES_BUDDIES_TO_GET_INTO_NEAREST_CAR(sLocatesData, vehDriveToVeh)
|
|
ENDIF
|
|
|
|
ePartyState = PCS_NOT_CRASHED
|
|
|
|
bMusicCueTriggered = FALSE
|
|
bMusicCueKilled = FALSE
|
|
iNeedVehicleUses = 0
|
|
iAssetRequests = 0
|
|
bEventFlag[0] = FALSE
|
|
|
|
SET_MULTIHEAD_SAFE(FALSE)
|
|
|
|
//═════════╡ UPDATE ╞═════════
|
|
ENDIF
|
|
|
|
IF bStageSetup
|
|
|
|
IF bManageParty
|
|
PARTY_ManagePartyScene(TRUE)
|
|
PARTY_ManagePartyCrashed()
|
|
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
SWITCH ePartyState
|
|
CASE PCS_MISSED_SHOT
|
|
//RunConversation("F3_SPOOKEDe")
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedDave, "GENERIC_SHOCKED_MED", "Dave", SPEECH_PARAMS_FORCE)
|
|
eMissionFail = FAIL_PARTY_SPOOKED
|
|
BREAK
|
|
CASE PCS_KILLED_INNOCENT_MALE
|
|
//RunConversation("F3_KILLWRNGM")
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedDave, "GENERIC_SHOCKED_MED", "Dave", SPEECH_PARAMS_FORCE)
|
|
eMissionFail = FAIL_PARTY_PED_DEAD_INNOCENT_NO_ID
|
|
BREAK
|
|
CASE PCS_KILLED_INNOCENT_FEMALE
|
|
//RunConversation("F3_KILLWRNGF")
|
|
PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(pedDave, "GENERIC_SHOCKED_MED", "Dave", SPEECH_PARAMS_FORCE)
|
|
eMissionFail = FAIL_PARTY_PED_DEAD_INNOCENT
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF NOT IS_AMBIENT_SPEECH_PLAYING(PLAYER_PED_ID())
|
|
IF ePartyState != PCS_NOT_CRASHED
|
|
bMissionFailed = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF ePartyState = PCS_NOT_CRASHED
|
|
|
|
SWITCH i_mission_substage
|
|
|
|
CASE 0
|
|
IF IS_AUDIO_SCENE_ACTIVE("FBI_3_MICHAEL_COFFEE_BREAK")
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE)
|
|
STOP_AUDIO_SCENE("FBI_3_MICHAEL_COFFEE_BREAK")
|
|
ENDIF
|
|
ENDIF
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("FBI_3_MICHAEL_DRIVE_CHUMASH")
|
|
IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
START_AUDIO_SCENE("FBI_3_MICHAEL_DRIVE_CHUMASH")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
DRIVE_HandleDriveConvo_MikeWithDave("F3_DRV2", vDriveTo2Coords, 30)
|
|
|
|
// Stream in and manage the party
|
|
//-------------------------------------------------------------
|
|
|
|
IF NOT bEventFlag[0]
|
|
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), <<-3102.10, 349.82, 16.71>>) < 250.0
|
|
bEventFlag[0] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), <<-3102.10, 349.82, 16.71>>) > 300.0
|
|
PARTY_CleanupEntitiesAndAssets(TRUE)
|
|
iAssetRequests = 0
|
|
bEventFlag[0] = FALSE
|
|
bManageParty = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bEventFlag[0]
|
|
IF PARTY_LoadAssets(FALSE, TRUE, TRUE)
|
|
AND PARTY_IsSceneReady(FALSE, TRUE, ST_2_DRIVE_TO_COORD_FIRST, TRUE)
|
|
bManageParty = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
// Chumash locate)
|
|
IF IS_PLAYER_AT_ANGLED_AREA_WITH_BUDDY_IN_ANY_VEHICLE(sLocatesData, vDriveTo2Coords, <<-2958.950928,370.906342,13.519890>>, <<-2967.798096,352.648590,16.831692>>, 4.625000,
|
|
TRUE, pedDave,
|
|
godDriveToMalibu, "TFT_RTNDAV", godMichaelGetIn, godMichaelGetBack, TRUE, TRUE, 2)
|
|
|
|
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
|
|
clearText(FALSE, TRUE, TRUE)
|
|
DISABLE_CELLPHONE(TRUE)
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
|
|
i_mission_substage++
|
|
|
|
ELSE
|
|
|
|
IF NOT IS_CUTSCENE_ACTIVE()
|
|
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vDriveTo2Coords) < DEFAULT_CUTSCENE_LOAD_DIST
|
|
IF ARE_STRINGS_EQUAL(strMrKCSHandle, csMrK_TL)
|
|
SET_CUTSCENE_AUDIO_OVERRIDE("_TOOTHLESS")
|
|
ENDIF
|
|
REQUEST_CUTSCENE("fbi_3_mcs_2")
|
|
Register_Torture_Ped_Variations_For_Cutscene_Prestreaming(TRUE, TRUE, strMrKCSHandle)
|
|
ENDIF
|
|
ELSE
|
|
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vDriveTo2Coords) > DEFAULT_CUTSCENE_UNLOAD_DIST
|
|
OR IS_PLAYER_CHANGING_CLOTHES()
|
|
REMOVE_CUTSCENE()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bMusicCueTriggered
|
|
IF NOT bMusicCueKilled
|
|
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vDriveTo2Coords) < 25.0
|
|
TRIGGER_MUSIC_EVENT("FBI3_MICHAEL_ARRIVES_2")
|
|
bMusicCueKilled = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
AND NOT (IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())))
|
|
OR IS_THIS_MODEL_A_PLANE(GET_ENTITY_MODEL(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))))
|
|
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), 4.0, 1, 0.1)
|
|
bSafeToSwitch = TRUE
|
|
|
|
i_mission_substage++
|
|
ENDIF
|
|
ELSE
|
|
bSafeToSwitch = TRUE
|
|
i_mission_substage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 2
|
|
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE)
|
|
AND NOT IS_PED_IN_ANY_VEHICLE(pedDave, TRUE)
|
|
SET_MULTIHEAD_SAFE(TRUE) //B* 2233643: Set blinders on early
|
|
i_mission_substage++
|
|
ELSE
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE)
|
|
IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(PLAYER_PED_ID(), SCRIPT_TASK_LEAVE_ANY_VEHICLE)
|
|
TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_PED_IN_ANY_VEHICLE(pedDave, TRUE)
|
|
IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(pedDave, SCRIPT_TASK_LEAVE_ANY_VEHICLE)
|
|
TASK_LEAVE_ANY_VEHICLE(pedDave, 500)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 3
|
|
IF SWITCH_Sniping_To_Torture_CUTSCENE(ST_4_DRIVE_TO_COORD_SECOND)
|
|
DISPLAY_RADAR(FALSE)
|
|
|
|
eMissionStage = ST_5_TORTURE_FOR_SECOND
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
//═════════╡ CLEANUP ╞═════════
|
|
IF eMissionStage != ST_4_DRIVE_TO_COORD_SECOND
|
|
IF DOES_BLIP_EXIST(blipLocate)
|
|
REMOVE_BLIP(blipLocate)
|
|
ENDIF
|
|
|
|
CLEAR_PED_NON_CREATION_AREA()
|
|
|
|
SET_PED_PATHS_BACK_TO_ORIGINAL(<<-2969.646484,351.977753,16.206539>> - <<24.437500,26.125000,2.687500>>,
|
|
<<-2969.646484,351.977753,16.206539>> + <<24.437500,26.125000,2.687500>>)
|
|
|
|
REMOVE_SCENARIO_BLOCKING_AREA(sba_chumash_car_park)
|
|
REMOVE_SCENARIO_BLOCKING_AREA(sba_coffee_shop)
|
|
|
|
DISABLE_CELLPHONE(FALSE)
|
|
MissionStageTidyUp()
|
|
|
|
bStageSetup = FALSE
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
//PURPOSE: Performs the section where Trevor tortures the victim for the third time
|
|
PROC stage5_TortureForSecond()
|
|
|
|
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_WEAPON_ICON)
|
|
DISABLE_PLAYER_PED_STAT_UPDATES_THIS_FRAME()
|
|
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME()
|
|
|
|
//═════════╡ SETUP ╞═════════
|
|
IF NOT bStageSetup
|
|
|
|
DISPLAY_RADAR(FALSE)
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(5, "5.Trevor Tortures Second")
|
|
TORTURE_Store_Victim_State()
|
|
|
|
ADD_ALL_PEDS_TO_DIALOGUE()
|
|
|
|
i_mission_substage = 0
|
|
bStageSetup = TRUE
|
|
iAssetRequests = 0
|
|
|
|
SET_WANTED_LEVEL_MULTIPLIER(0.0)
|
|
SET_MAX_WANTED_LEVEL(0)
|
|
SET_CREATE_RANDOM_COPS(FALSE)
|
|
|
|
SET_MULTIHEAD_SAFE(TRUE)
|
|
|
|
//═════════╡ UPDATE ╞═════════
|
|
ENDIF
|
|
|
|
IF bStageSetup
|
|
bDisplayHeartMonitor = TRUE
|
|
|
|
SWITCH i_mission_substage
|
|
CASE 0
|
|
IF TORTURE_ManageWeaponSelection()
|
|
#IF IS_JAPANESE_BUILD
|
|
TORTURE_Request_Cutscene(FALSE)
|
|
#ENDIF
|
|
IF NOT IS_REPLAY_RECORDING()
|
|
REPLAY_RECORD_BACK_FOR_TIME(2.0, 4.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
ENDIF
|
|
i_mission_substage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
IF TORTURE_ManageMinigame()
|
|
#ENDIF
|
|
SHUTDOWN_PC_CONTROLS()
|
|
SWITCH_Torture_To_Sniping_CUTSCENE()
|
|
IF NOT IS_REPLAY_RECORDING()
|
|
REPLAY_RECORD_BACK_FOR_TIME(15.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
ENDIF
|
|
i_mission_substage++
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
ENDIF
|
|
#ENDIF
|
|
BREAK
|
|
CASE 2
|
|
IF SWITCH_Torture_To_Sniping_CUTSCENE()
|
|
PARTY_ManagePartyScene()
|
|
PARTY_ManageProneAndScope()
|
|
eMissionStage = ST_6_REACT_TO_SECOND
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
//═════════╡ CLEANUP ╞═════════
|
|
IF eMissionStage != ST_5_TORTURE_FOR_SECOND
|
|
clearText()
|
|
|
|
MissionStageTidyUp()
|
|
iSelectWeaponStage = 0
|
|
|
|
bHasPlayedPickupAnim = FALSE
|
|
bStageSetup = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: Performs the section where Michael reacts to the information revealed for the third time
|
|
PROC stage6_ReactToSecond()
|
|
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() //Fix for bug 2175240
|
|
//═════════╡ SETUP ╞═════════
|
|
IF NOT bStageSetup
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(6, "6. Michael Reacts to 2nd")
|
|
TORTURE_Store_Victim_State()
|
|
|
|
DISPLAY_RADAR(FALSE)
|
|
|
|
|
|
DISABLE_CELLPHONE(TRUE)
|
|
ADD_ALL_PEDS_TO_DIALOGUE()
|
|
|
|
IF NOT bDontPlayFullSnipeChat
|
|
PRINT_NOW(godShootTarget, DEFAULT_GOD_TEXT_TIME, 1)
|
|
ENDIF
|
|
PARTY_ResetScopeCheck()
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(FBI3_ASSASSIN_TIME)
|
|
|
|
TRIGGER_MUSIC_EVENT("FBI3_BACK_TO_MICHAEL")
|
|
|
|
i_mission_substage = 0
|
|
bManageParty = TRUE
|
|
bStageSetup = TRUE
|
|
bSafeToSwitch = FALSE
|
|
iAssetRequests = 0
|
|
iAttemptToAimTimer = -1
|
|
|
|
SET_MULTIHEAD_SAFE(FALSE)
|
|
|
|
ENDIF
|
|
//═════════╡ UPDATE ╞═════════
|
|
IF bStageSetup
|
|
IF bManageParty
|
|
PARTY_ManagePartyScene(TRUE)
|
|
PARTY_ManageProneAndScope()
|
|
PARTY_ManagePartyCrashed()
|
|
ENDIF
|
|
|
|
IF ePartyState != PCS_NOT_CRASHED
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED(godShootTarget)
|
|
OR IS_THIS_PRINT_BEING_DISPLAYED(godSwitchTrevor)
|
|
CLEAR_PRINTS()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ePartyState = PCS_NOT_CRASHED
|
|
|
|
SWITCH i_mission_substage
|
|
CASE 0
|
|
// Jump ahead
|
|
IF bDontPlayFullSnipeChat
|
|
bDontPlayFullSnipeChat = FALSE
|
|
i_mission_substage = 2
|
|
|
|
// Normal sniping chat
|
|
ELSE
|
|
IF bScoped[HS_CENTRE]
|
|
OR (iAttemptToAimTimer != -1 AND GET_GAME_TIMER() > iAttemptToAimTimer)
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
RunConversation("F3_ZOOM1")
|
|
i_mission_substage++
|
|
|
|
ELIF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bEventFlag[0]
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
RunConversation("F3_SCOPE1")
|
|
bEventFlag[0] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
AND GET_GAME_TIMER() - i_time_of_last_convo > 5000
|
|
RunConversation("F3_ZOOMD")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
RunConversation("F3_SPOT1")
|
|
IF NOT IS_REPLAY_RECORDING()
|
|
REPLAY_RECORD_BACK_FOR_TIME(5.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
ENDIF
|
|
i_mission_substage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 2
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
IF ARE_STRINGS_EQUAL(strMrKCSHandle, csMrK_TL)
|
|
SET_CUTSCENE_AUDIO_OVERRIDE("_TOOTHLESS")
|
|
ENDIF
|
|
REQUEST_CUTSCENE("fbi_3_mcs_4p2")
|
|
Register_Torture_Ped_Variations_For_Cutscene_Prestreaming(FALSE, FALSE, strMrKCSHandle)
|
|
RunConversation("F3_SPOT1b")
|
|
i_mission_substage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 3
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
bSafeToSwitch = TRUE
|
|
i_mission_substage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 4
|
|
IF SWITCH_Sniping_To_Torture_CUTSCENE(ST_6_REACT_TO_SECOND)
|
|
DISPLAY_RADAR(FALSE)
|
|
|
|
eMissionStage = ST_7_TORTURE_FOR_THIRD
|
|
ELSE
|
|
IF bCutsceneSWITCHStarted
|
|
bManageParty = FALSE
|
|
ELSE
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
AND GET_GAME_TIMER() - i_time_of_last_convo > 15000
|
|
RunConversation("F3_PROMPT")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
// Party crashed
|
|
ELSE
|
|
IF PARTY_HasTargetBeenSuccessfullyKilled()
|
|
IF SWITCH_Sniping_To_Torture_CUTSCENE()
|
|
eMissionStage = ST_11_DRIVE_TO_AIRPORT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//═════════╡ CLEANUP ╞═════════
|
|
IF eMissionStage != ST_6_REACT_TO_SECOND
|
|
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED()
|
|
DISABLE_CELLPHONE(FALSE)
|
|
MissionStageTidyUp()
|
|
bStageSetup = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: Performs the section where Trevor tortures the victim for the fourth time
|
|
PROC stage7_TortureForThird()
|
|
|
|
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_WEAPON_ICON)
|
|
DISABLE_PLAYER_PED_STAT_UPDATES_THIS_FRAME()
|
|
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME()
|
|
|
|
//═════════╡ SETUP ╞═════════
|
|
IF NOT bStageSetup
|
|
DISPLAY_RADAR(FALSE)
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(7, "7. Trevor tortures thrid")
|
|
TORTURE_Store_Victim_State()
|
|
|
|
ADD_ALL_PEDS_TO_DIALOGUE()
|
|
|
|
iAssetRequests = 0
|
|
i_mission_substage = 0
|
|
bStageSetup = TRUE
|
|
|
|
SET_MULTIHEAD_SAFE(TRUE)
|
|
|
|
ENDIF
|
|
|
|
//═════════╡ UPDATE ╞═════════
|
|
|
|
IF bStageSetup
|
|
bDisplayHeartMonitor = TRUE
|
|
|
|
SWITCH i_mission_substage
|
|
CASE 0
|
|
IF TORTURE_ManageWeaponSelection()
|
|
#IF IS_JAPANESE_BUILD
|
|
TORTURE_Request_Cutscene(FALSE)
|
|
#ENDIF
|
|
i_mission_substage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
IF TORTURE_ManageMinigame()
|
|
#ENDIF
|
|
SHUTDOWN_PC_CONTROLS()
|
|
SWITCH_Torture_To_Sniping_CUTSCENE()
|
|
i_mission_substage++
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
ENDIF
|
|
#ENDIF
|
|
BREAK
|
|
CASE 2
|
|
IF SWITCH_Torture_To_Sniping_CUTSCENE()
|
|
PARTY_ManagePartyScene(TRUE)
|
|
PARTY_ManageProneAndScope()
|
|
eMissionStage = ST_8_REACT_TO_THIRD
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//═════════╡ CLEANUP ╞═════════
|
|
IF eMissionStage != ST_7_TORTURE_FOR_THIRD
|
|
clearText()
|
|
|
|
MissionStageTidyUp()
|
|
iSelectWeaponStage = 0
|
|
|
|
bHasPlayedPickupAnim = FALSE
|
|
bStageSetup = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: Performs the section where Michael reacts to the information revealed for the third time
|
|
PROC stage8_ReactToThird()
|
|
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() //Fix for bug 2175240
|
|
//═════════╡ SETUP ╞═════════
|
|
IF NOT bStageSetup
|
|
|
|
DISPLAY_RADAR(FALSE)
|
|
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(8, "8. Michael Reacts to 3rd")
|
|
TORTURE_Store_Victim_State()
|
|
|
|
DISABLE_CELLPHONE(TRUE)
|
|
ADD_ALL_PEDS_TO_DIALOGUE()
|
|
|
|
PARTY_ResetScopeCheck()
|
|
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(FBI3_ASSASSIN_TIME)
|
|
|
|
TRIGGER_MUSIC_EVENT("FBI3_BACK_TO_MICHAEL")
|
|
|
|
i_mission_substage = 0
|
|
bManageParty = TRUE
|
|
bStageSetup = TRUE
|
|
bSafeToSwitch = FALSE
|
|
iAssetRequests = 0
|
|
iAttemptToAimTimer = -1
|
|
|
|
SET_MULTIHEAD_SAFE(FALSE)
|
|
|
|
ENDIF
|
|
|
|
//═════════╡ UPDATE ╞═════════
|
|
IF bStageSetup
|
|
IF bManageParty
|
|
PARTY_ManagePartyScene(TRUE)
|
|
PARTY_ManageProneAndScope()
|
|
PARTY_ManagePartyCrashed()
|
|
ENDIF
|
|
|
|
IF ePartyState != PCS_NOT_CRASHED
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED(godSwitchTrevor)
|
|
CLEAR_PRINTS()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ePartyState = PCS_NOT_CRASHED
|
|
|
|
SWITCH i_mission_substage
|
|
CASE 0
|
|
IF bDontPlayFullSnipeChat
|
|
bDontPlayFullSnipeChat = FALSE
|
|
i_mission_substage = 2
|
|
ELSE
|
|
IF bScoped[HS_CENTRE]
|
|
OR (iAttemptToAimTimer != -1 AND GET_GAME_TIMER() > iAttemptToAimTimer)
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
RunConversation("F3_ZOOM2")
|
|
i_mission_substage++
|
|
|
|
ELIF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ENDIF
|
|
ELSE
|
|
IF NOT bEventFlag[0]
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
RunConversation("F3_SCOPE2")
|
|
bEventFlag[0] = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
AND GET_GAME_TIMER() - i_time_of_last_convo > 5000
|
|
RunConversation("F3_ZOOMD")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
RunConversation("F3_SPOT2")
|
|
i_mission_substage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 2
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
IF ARE_STRINGS_EQUAL(strMrKCSHandle, csMrK_TL)
|
|
SET_CUTSCENE_AUDIO_OVERRIDE("_TOOTHLESS")
|
|
ENDIF
|
|
REQUEST_CUTSCENE("FBI_3_MCS_5p2")
|
|
Register_Torture_Ped_Variations_For_Cutscene_Prestreaming(FALSE, FALSE, strMrKCSHandle)
|
|
RunConversation("F3_SPOT2b")
|
|
i_mission_substage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 3
|
|
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
bSafeToSwitch = TRUE
|
|
i_mission_substage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 4
|
|
IF SWITCH_Sniping_To_Torture_CUTSCENE(ST_8_REACT_TO_THIRD)
|
|
DISPLAY_RADAR(FALSE)
|
|
|
|
eMissionStage = ST_9_TORTURE_FINAL
|
|
ELSE
|
|
IF bCutsceneSWITCHStarted
|
|
bManageParty = FALSE
|
|
ELSE
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
AND GET_GAME_TIMER() - i_time_of_last_convo > 15000
|
|
RunConversation("F3_PROMPT")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
// Party crashed
|
|
ELSE
|
|
IF PARTY_HasTargetBeenSuccessfullyKilled()
|
|
IF SWITCH_Sniping_To_Torture_CUTSCENE()
|
|
eMissionStage = ST_11_DRIVE_TO_AIRPORT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//═════════╡ CLEANUP ╞═════════
|
|
IF eMissionStage != ST_8_REACT_TO_THIRD
|
|
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED()
|
|
DISABLE_CELLPHONE(FALSE)
|
|
MissionStageTidyUp()
|
|
bStageSetup = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: Performs the section where Trevor tortures the victim for the final time
|
|
PROC stage9_TortureFinal()
|
|
|
|
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_WEAPON_ICON)
|
|
DISABLE_PLAYER_PED_STAT_UPDATES_THIS_FRAME()
|
|
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME()
|
|
|
|
//═════════╡ SETUP ╞═════════
|
|
IF NOT bStageSetup
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(9, "9. Trevor tortures Final")
|
|
TORTURE_Store_Victim_State()
|
|
|
|
DISPLAY_RADAR(FALSE)
|
|
|
|
ADD_ALL_PEDS_TO_DIALOGUE()
|
|
|
|
i_mission_substage = 0
|
|
bStageSetup = TRUE
|
|
iAssetRequests = 0
|
|
|
|
SET_MULTIHEAD_SAFE(TRUE)
|
|
|
|
ENDIF
|
|
|
|
//═════════╡ UPDATE ╞═════════
|
|
IF bStageSetup
|
|
bDisplayHeartMonitor = TRUE
|
|
|
|
SWITCH i_mission_substage
|
|
CASE 0
|
|
IF TORTURE_ManageWeaponSelection()
|
|
#IF IS_JAPANESE_BUILD
|
|
TORTURE_Request_Cutscene(FALSE)
|
|
#ENDIF
|
|
i_mission_substage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
IF TORTURE_ManageMinigame()
|
|
#ENDIF
|
|
IF NOT IS_REPLAY_RECORDING()
|
|
REPLAY_RECORD_BACK_FOR_TIME(15.0, 5.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
ENDIF
|
|
SHUTDOWN_PC_CONTROLS()
|
|
SWITCH_Torture_To_Sniping_CUTSCENE()
|
|
i_mission_substage++
|
|
#IF NOT IS_JAPANESE_BUILD
|
|
ENDIF
|
|
#ENDIF
|
|
BREAK
|
|
CASE 2
|
|
IF SWITCH_Torture_To_Sniping_CUTSCENE()
|
|
PARTY_ManagePartyScene(TRUE)
|
|
PARTY_ManageProneAndScope()
|
|
eMissionStage = ST_10_REACT_FINAL
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//═════════╡ CLEANUP ╞═════════
|
|
IF eMissionStage != ST_9_TORTURE_FINAL
|
|
clearText()
|
|
|
|
MissionStageTidyUp()
|
|
iSelectWeaponStage = 0
|
|
|
|
bHasPlayedPickupAnim = FALSE
|
|
bStageSetup = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: Performs the section where Michael takes the final shot
|
|
PROC stage10_ReactFinal()
|
|
REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() //Fix for bug 2175240
|
|
//═════════╡ SETUP ╞═════════
|
|
IF NOT bStageSetup
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(10, "10. Michael Kills Target")
|
|
TORTURE_Store_Victim_State()
|
|
|
|
DISPLAY_RADAR(FALSE)
|
|
|
|
DISABLE_CELLPHONE(TRUE)
|
|
ADD_ALL_PEDS_TO_DIALOGUE()
|
|
|
|
bTargetKilled = FALSE
|
|
bTargetHasBeenIDed = FALSE
|
|
|
|
bMrKVariations[MR_K_WET] = FALSE
|
|
|
|
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(FBI3_ASSASSIN_TIME)
|
|
|
|
TRIGGER_MUSIC_EVENT("FBI3_BACK_TO_MICHAEL")
|
|
|
|
bManageParty = TRUE
|
|
bStageSetup = TRUE
|
|
i_mission_substage = 0
|
|
bSafeToSwitch = FALSE
|
|
iAssetRequests = 0
|
|
iAttemptToAimTimer = -1
|
|
ENDIF
|
|
|
|
//═════════╡ UPDATE ╞═════════
|
|
IF bStageSetup
|
|
IF bManageParty
|
|
PARTY_ManagePartyScene(TRUE)
|
|
PARTY_ManageProneAndScope()
|
|
PARTY_ManagePartyCrashed()
|
|
ENDIF
|
|
|
|
IF ePartyState != PCS_NOT_CRASHED
|
|
IF IS_THIS_PRINT_BEING_DISPLAYED(godSwitchTrevor)
|
|
CLEAR_PRINTS()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ePartyState = PCS_NOT_CRASHED
|
|
OR ePartyState = PCS_MISSED_SHOT
|
|
|
|
IF NOT bTargetKilled
|
|
AND DOES_ENTITY_EXIST(peds[mpf_target].id)
|
|
AND IS_PED_INJURED(peds[mpf_target].id)
|
|
|
|
IF NOT IS_REPLAY_RECORDING()
|
|
REPLAY_RECORD_BACK_FOR_TIME(4.0, 4.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
ENDIF
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
bTargetKilled = TRUE
|
|
CDEBUG1LN(DEBUG_MIKE, "TargetKilled = TRUE")
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF ePartyState = PCS_NOT_CRASHED
|
|
|
|
SWITCH i_mission_substage
|
|
CASE 0
|
|
IF bDontPlayFullSnipeChat
|
|
bDontPlayFullSnipeChat = FALSE
|
|
i_mission_substage = 2
|
|
ELSE
|
|
IF NOT IS_PED_INJURED(peds[mpf_target].id)
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
IF bScoped[HS_CENTRE]
|
|
OR (iAttemptToAimTimer != -1 AND GET_GAME_TIMER() > iAttemptToAimTimer)
|
|
i_mission_substage++
|
|
ELSE
|
|
IF NOT bEventFlag[0]
|
|
RunConversation("F3_SCOPE3")
|
|
bEventFlag[0] = TRUE
|
|
ELSE
|
|
IF GET_GAME_TIMER() - i_time_of_last_convo > 5000
|
|
RunConversation("F3_ZOOMD")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE 1
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
RunConversation("F3_SPOT3")
|
|
i_mission_substage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 2
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
RunConversation("F3_SPOT3l")
|
|
i_mission_substage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 3
|
|
IF DOES_ENTITY_EXIST(peds[mpf_target].id)
|
|
AND NOT IS_PED_INJURED(peds[mpf_target].id)
|
|
IF bAimingAtTheTarget
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
RunConversation("F3_SPOT3b")
|
|
i_mission_substage++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 4
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
RunConversation("F3_SPOT3c")
|
|
bTargetHasBeenIDed = TRUE
|
|
i_mission_substage++
|
|
ENDIF
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
// Party crashed
|
|
ELSE
|
|
IF PARTY_HasTargetBeenSuccessfullyKilled()
|
|
IF NOT IS_CUTSCENE_ACTIVE()
|
|
IF ARE_STRINGS_EQUAL(strMrKCSHandle, csMrK_TL)
|
|
SET_CUTSCENE_AUDIO_OVERRIDE("_TOOTHLESS")
|
|
ENDIF
|
|
REQUEST_CUTSCENE("fbi_3_mcs_7")
|
|
Register_Torture_Ped_Variations_For_Cutscene_Prestreaming(FALSE, FALSE, strMrKCSHandle)
|
|
ENDIF
|
|
|
|
IF SWITCH_Sniping_To_Torture_CUTSCENE()
|
|
eMissionStage = ST_11_DRIVE_TO_AIRPORT
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//═════════╡ CLEANUP ╞═════════
|
|
IF eMissionStage != ST_10_REACT_FINAL
|
|
INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED()
|
|
MissionStageTidyUp()
|
|
DISABLE_CELLPHONE(FALSE)
|
|
bStageSetup = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: Performs the section where Trevor drives the victim to the airport
|
|
PROC stage11_DriveToAirport()
|
|
|
|
//═════════╡ SETUP ╞═════════
|
|
IF NOT bStageSetup
|
|
|
|
SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(11, "12. Trevor Drives MrK to Airport", TRUE)
|
|
|
|
ADD_ALL_PEDS_TO_DIALOGUE()
|
|
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
|
|
|
|
SETTIMERB(0)
|
|
SET_PED_CONFIG_FLAG(pedVictim, PCF_GetOutBurningVehicle, FALSE)
|
|
|
|
IF DOES_ENTITY_EXIST(vehTrevor)
|
|
AND IS_VEHICLE_DRIVEABLE(vehTrevor)
|
|
SET_VEHICLE_DISABLE_TOWING(vehTrevor, TRUE)
|
|
ENDIF
|
|
|
|
SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
|
SET_MAX_WANTED_LEVEL(5)
|
|
SET_CREATE_RANDOM_COPS(TRUE)
|
|
|
|
SET_PED_CREW(pedVictim)
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(pedVictim, TRUE)
|
|
|
|
UNPIN_INTERIOR(interior_torture)
|
|
|
|
SET_VEHICLE_HAS_STRONG_AXLES(vehTrevor, TRUE)
|
|
|
|
START_AUDIO_SCENE("FBI_3_TREVOR_DRIVE_TO_AIRPORT")
|
|
|
|
SET_PED_NON_CREATION_AREA(
|
|
<<-1038.279907,-2738.568359,21.232233>>-<<97.250000,69.500000,2.312500>>,
|
|
<<-1038.279907,-2738.568359,21.232233>>+<<97.250000,69.500000,2.312500>>)
|
|
|
|
SET_PED_PATHS_IN_AREA(
|
|
<<-1038.279907,-2738.568359,21.232233>>-<<97.250000,69.500000,2.312500>>,
|
|
<<-1038.279907,-2738.568359,21.232233>>+<<97.250000,69.500000,2.312500>>, FALSE)
|
|
|
|
sba_airport = ADD_SCENARIO_BLOCKING_AREA(<<-1038.279907,-2738.568359,21.232233>>-<<97.250000,69.500000,2.312500>>,
|
|
<<-1038.279907,-2738.568359,21.232233>>+<<97.250000,69.500000,2.312500>>)
|
|
|
|
CLEAR_AREA(<<-1038.279907,-2738.568359,21.232233>>, 40.813, TRUE)
|
|
|
|
IF iRoadNodeSpeedZone[0] != -1
|
|
REMOVE_ROAD_NODE_SPEED_ZONE(iRoadNodeSpeedZone[0])
|
|
ENDIF
|
|
iRoadNodeSpeedZone[0] = ADD_ROAD_NODE_SPEED_ZONE(<<-1057.38, -2715.40, 19.12>>, 4.375, 0.0)
|
|
CLEAR_AREA_OF_VEHICLES(vDriveToAirport, 100)
|
|
|
|
IF bStoredSniperSnapshot
|
|
IF DOES_ENTITY_EXIST(MIKE_PED_ID())
|
|
STORE_PLAYER_PED_WEAPONS(MIKE_PED_ID())
|
|
ENDIF
|
|
g_savedGlobals.sPlayerData.sInfo.sWeapons[CHAR_MICHAEL].sWeaponInfo[21] = sSniperSnapshot
|
|
IF DOES_ENTITY_EXIST(MIKE_PED_ID())
|
|
RESTORE_PLAYER_PED_WEAPONS(MIKE_PED_ID())
|
|
ENDIF
|
|
bStoredSniperSnapshot = FALSE
|
|
ENDIF
|
|
|
|
SAFE_FADE_IN()
|
|
i_mission_substage = 0
|
|
iWeaponSelStage = 0
|
|
bStageSetup = TRUE
|
|
iAssetRequests = 0
|
|
|
|
IF NOT IS_REPLAY_RECORDING()
|
|
REPLAY_RECORD_BACK_FOR_TIME(2.0, 10.0, REPLAY_IMPORTANCE_HIGHEST)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
//═════════╡ UPDATE ╞═════════
|
|
IF bStageSetup
|
|
SWITCH i_mission_substage
|
|
CASE 0
|
|
// Set to stream in
|
|
IF NOT bEventFlag[0]
|
|
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vDriveToAirport) < 250
|
|
bEventFlag[0] = TRUE
|
|
ENDIF
|
|
// Set to stream out
|
|
ELSE
|
|
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vDriveToAirport) > 300
|
|
bEventFlag[0] = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT IS_CUTSCENE_ACTIVE()
|
|
IF bEventFlag[1] AND bEventFlag[2]
|
|
AND GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vDriveToAirport) < DEFAULT_CUTSCENE_LOAD_DIST
|
|
IF ARE_STRINGS_EQUAL(strMrKCSHandle, csMrK_TL)
|
|
SET_CUTSCENE_AUDIO_OVERRIDE("_TOOTHLESS")
|
|
ENDIF
|
|
REQUEST_CUTSCENE("fbi_3_mcs_8")
|
|
|
|
Register_Torture_Ped_Variations_For_Cutscene_Prestreaming(TRUE, FALSE, strMrKCSHandle, TRUE)
|
|
Register_Ped_Variation_For_Cutscene_From_Ped(sCutscenePedVariationRegister, pedAirport[0], "Ped_1")
|
|
Register_Ped_Variation_For_Cutscene_From_Ped(sCutscenePedVariationRegister, pedAirport[1], "Ped_2")
|
|
Register_Ped_Variation_For_Cutscene_From_Ped(sCutscenePedVariationRegister, pedAirport[2], "Ped_3")
|
|
Register_Ped_Variation_For_Cutscene_From_Ped(sCutscenePedVariationRegister, pedAirport[3], "Ped_4")
|
|
Register_Ped_Variation_For_Cutscene_From_Ped(sCutscenePedVariationRegister, pedAirport[4], "Ped_6")
|
|
Register_Ped_Variation_For_Cutscene_From_Ped(sCutscenePedVariationRegister, pedAirport[5], "Ped_7")
|
|
Register_Ped_Variation_For_Cutscene_From_Ped(sCutscenePedVariationRegister, pedAirport[6], "Ped_8")
|
|
Register_Ped_Variation_For_Cutscene_From_Ped(sCutscenePedVariationRegister, pedAirport[7], "Ped_11")
|
|
|
|
ENDIF
|
|
ELSE
|
|
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vDriveToAirport) > DEFAULT_CUTSCENE_UNLOAD_DIST
|
|
IF IS_CUTSCENE_ACTIVE()
|
|
REMOVE_CUTSCENE()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Stream in
|
|
IF bEventFlag[0]
|
|
IF (NOT bEventFlag[1] OR NOT bEventFlag[2])
|
|
|
|
SWITCH iAssetRequests
|
|
CASE 0
|
|
Load_Asset_Model(sAssetData, A_F_Y_BEVHILLS_01)
|
|
iAssetRequests++
|
|
BREAK
|
|
CASE 1
|
|
IF HAS_MODEL_LOADED(A_F_Y_BEVHILLS_01)
|
|
Load_Asset_Model(sAssetData, A_M_M_BEVHILLS_01)
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 2
|
|
IF HAS_MODEL_LOADED(A_M_M_BEVHILLS_01)
|
|
Load_Asset_Model(sAssetData, S_F_Y_AIRHOSTESS_01)
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
CASE 3
|
|
IF HAS_MODEL_LOADED(S_F_Y_AIRHOSTESS_01)
|
|
iAssetRequests++
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF iAssetRequests >= 4
|
|
|
|
IF NOT bEventFlag[1]
|
|
pedAirport[0] = CREATE_PED(PEDTYPE_MISSION, A_F_Y_BEVHILLS_01, <<-1031.32, -2735.31, 19.22>>)
|
|
SET_PED_KEEP_TASK(pedAirport[0], TRUE)
|
|
SET_PED_NAME_DEBUG(pedAirport[0], "Ped_1")
|
|
SET_PED_COMPONENT_VARIATION(pedAirport[0], INT_TO_ENUM(PED_COMPONENT,0), 0, 0, 0) //(head)
|
|
SET_PED_COMPONENT_VARIATION(pedAirport[0], INT_TO_ENUM(PED_COMPONENT,1), 0, 0, 0) //(berd)
|
|
SET_PED_COMPONENT_VARIATION(pedAirport[0], INT_TO_ENUM(PED_COMPONENT,2), 0, 0, 0) //(hair)
|
|
SET_PED_COMPONENT_VARIATION(pedAirport[0], INT_TO_ENUM(PED_COMPONENT,3), 0, 0, 0) //(uppr)
|
|
SET_PED_COMPONENT_VARIATION(pedAirport[0], INT_TO_ENUM(PED_COMPONENT,4), 23, 0, 0) //(lowr)
|
|
SET_PED_COMPONENT_VARIATION(pedAirport[0], INT_TO_ENUM(PED_COMPONENT,5), 0, 0, 0) //(hand)
|
|
SET_PED_COMPONENT_VARIATION(pedAirport[0], INT_TO_ENUM(PED_COMPONENT,6), 10, 0, 0) //(feet)
|
|
SET_PED_COMPONENT_VARIATION(pedAirport[0], INT_TO_ENUM(PED_COMPONENT,7), 0, 0, 0) //(teef)
|
|
SET_PED_COMPONENT_VARIATION(pedAirport[0], INT_TO_ENUM(PED_COMPONENT,8), 0, 0, 0) //(accs)
|
|
SET_PED_COMPONENT_VARIATION(pedAirport[0], INT_TO_ENUM(PED_COMPONENT,9), 0, 0, 0) //(task)
|
|
SET_PED_COMPONENT_VARIATION(pedAirport[0], INT_TO_ENUM(PED_COMPONENT,10), 0, 0, 0) //(decl)
|
|
|
|
|
|
|
|
pedAirport[1] = CREATE_PED(PEDTYPE_MISSION, A_F_Y_BEVHILLS_01, <<-1031.93, -2739.68, 19.66>>)
|
|
SET_PED_KEEP_TASK(pedAirport[1], TRUE)
|
|
SET_PED_NAME_DEBUG(pedAirport[1], "Ped_2")
|
|
|
|
pedAirport[2] = CREATE_PED(PEDTYPE_MISSION, A_F_Y_BEVHILLS_01, <<-1033.03, -2735.05, 19.17>>)
|
|
SET_PED_KEEP_TASK(pedAirport[2], TRUE)
|
|
SET_PED_NAME_DEBUG(pedAirport[2], "Ped_3")
|
|
SET_PED_COMPONENT_VARIATION(pedAirport[2], INT_TO_ENUM(PED_COMPONENT,0), 0, 2, 0) //(head)
|
|
SET_PED_COMPONENT_VARIATION(pedAirport[2], INT_TO_ENUM(PED_COMPONENT,2), 1, 1, 0) //(hair)
|
|
SET_PED_COMPONENT_VARIATION(pedAirport[2], INT_TO_ENUM(PED_COMPONENT,3), 1, 0, 0) //(uppr)
|
|
SET_PED_COMPONENT_VARIATION(pedAirport[2], INT_TO_ENUM(PED_COMPONENT,4), 1, 1, 0) //(lowr)
|
|
SET_PED_COMPONENT_VARIATION(pedAirport[2], INT_TO_ENUM(PED_COMPONENT,6), 0, 0, 0) //(feet)
|
|
SET_PED_COMPONENT_VARIATION(pedAirport[2], INT_TO_ENUM(PED_COMPONENT,8), 1, 0, 0) //(accs)
|
|
|
|
pedAirport[3] = CREATE_PED(PEDTYPE_MISSION, A_F_Y_BEVHILLS_01, <<-1042.16, -2729.93, 19.17>>)
|
|
SET_PED_KEEP_TASK(pedAirport[3], TRUE)
|
|
SET_PED_NAME_DEBUG(pedAirport[3], "Ped_4")
|
|
SET_PED_COMPONENT_VARIATION(pedAirport[3], INT_TO_ENUM(PED_COMPONENT,0), 0, 2, 0) //(head)
|
|
SET_PED_COMPONENT_VARIATION(pedAirport[3], INT_TO_ENUM(PED_COMPONENT,2), 4, 2, 0) //(hair)
|
|
SET_PED_COMPONENT_VARIATION(pedAirport[3], INT_TO_ENUM(PED_COMPONENT,3), 0, 2, 0) //(uppr)
|
|
SET_PED_COMPONENT_VARIATION(pedAirport[3], INT_TO_ENUM(PED_COMPONENT,4), 1, 0, 0) //(lowr)
|
|
SET_PED_COMPONENT_VARIATION(pedAirport[3], INT_TO_ENUM(PED_COMPONENT,6), 1, 0, 0) //(feet)
|
|
SET_PED_COMPONENT_VARIATION(pedAirport[3], INT_TO_ENUM(PED_COMPONENT,8), 0, 2, 0) //(accs)
|
|
|
|
pedAirport[4] = CREATE_PED(PEDTYPE_MISSION, S_F_Y_AIRHOSTESS_01, <<-1040.61, -2730.07, 19.17>>)
|
|
SET_PED_KEEP_TASK(pedAirport[4], TRUE)
|
|
SET_PED_NAME_DEBUG(pedAirport[4], "Ped_6")
|
|
|
|
pedAirport[5] = CREATE_PED(PEDTYPE_MISSION, A_M_M_BEVHILLS_01, <<-1030.32, -2738.53, 19.17>>)
|
|
SET_PED_KEEP_TASK(pedAirport[5], TRUE)
|
|
SET_PED_NAME_DEBUG(pedAirport[5], "Ped_7")
|
|
|
|
pedAirport[6] = CREATE_PED(PEDTYPE_MISSION, A_M_M_BEVHILLS_01, <<-1035.18, -2740.79, 19.17>>)
|
|
SET_PED_KEEP_TASK(pedAirport[6], TRUE)
|
|
SET_PED_NAME_DEBUG(pedAirport[6], "Ped_8")
|
|
|
|
pedAirport[7] = CREATE_PED(PEDTYPE_MISSION, S_F_Y_AIRHOSTESS_01, <<-1046.80, -2735.29, 19.59>>)
|
|
SET_PED_KEEP_TASK(pedAirport[7], TRUE)
|
|
SET_PED_NAME_DEBUG(pedAirport[7], "Ped_11")
|
|
SET_PED_COMPONENT_VARIATION(pedAirport[7], INT_TO_ENUM(PED_COMPONENT,0), 0, 0, 0) //(head)
|
|
SET_PED_COMPONENT_VARIATION(pedAirport[7], INT_TO_ENUM(PED_COMPONENT,2), 1, 0, 0) //(hair)
|
|
SET_PED_COMPONENT_VARIATION(pedAirport[7], INT_TO_ENUM(PED_COMPONENT,3), 1, 0, 0) //(uppr)
|
|
SET_PED_COMPONENT_VARIATION(pedAirport[7], INT_TO_ENUM(PED_COMPONENT,4), 0, 1, 0) //(lowr)
|
|
|
|
bEventFlag[1] = TRUE
|
|
|
|
ELIF NOT bEventFlag[2]
|
|
|
|
bEventFlag[2] = TRUE
|
|
|
|
IF NOT IS_PED_INJURED(pedAirport[0])
|
|
AND NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(pedAirport[0], SCRIPT_TASK_USE_NEAREST_SCENARIO_TO_POS)
|
|
AND DOES_SCENARIO_OF_TYPE_EXIST_IN_AREA(<<-1031.32, -2735.31, 19.22>>, "WORLD_HUMAN_SMOKING", 0.25, FALSE) // ped 1
|
|
TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(pedAirport[0], <<-1031.32, -2735.31, 19.22>>, 0.25, -1)
|
|
bEventFlag[2] = FALSE
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(pedAirport[1])
|
|
AND NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(pedAirport[1], SCRIPT_TASK_USE_NEAREST_SCENARIO_TO_POS)
|
|
AND DOES_SCENARIO_OF_TYPE_EXIST_IN_AREA(<<-1031.93, -2739.68, 19.66>>, "PROP_HUMAN_SEAT_CHAIR", 0.25, FALSE) // ped 2
|
|
TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(pedAirport[1], <<-1031.93, -2739.68, 19.66>>, 0.25, -1)
|
|
bEventFlag[2] = FALSE
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(pedAirport[2])
|
|
AND NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(pedAirport[2], SCRIPT_TASK_USE_NEAREST_SCENARIO_TO_POS)
|
|
AND DOES_SCENARIO_OF_TYPE_EXIST_IN_AREA(<<-1033.03, -2735.05, 19.17>>, "WORLD_HUMAN_HANG_OUT_STREET", 0.25, FALSE) // ped 3
|
|
TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(pedAirport[2], <<-1033.03, -2735.05, 19.17>>, 0.25, -1)
|
|
bEventFlag[2] = FALSE
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(pedAirport[3])
|
|
AND NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(pedAirport[3], SCRIPT_TASK_USE_NEAREST_SCENARIO_TO_POS)
|
|
AND DOES_SCENARIO_OF_TYPE_EXIST_IN_AREA(<<-1042.16, -2729.93, 19.17>>, "WORLD_HUMAN_DRINKING", 0.25, FALSE) // ped 4
|
|
TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(pedAirport[3], <<-1042.16, -2729.93, 19.17>>, 0.25, -1)
|
|
bEventFlag[2] = FALSE
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(pedAirport[4])
|
|
AND NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(pedAirport[4], SCRIPT_TASK_USE_NEAREST_SCENARIO_TO_POS)
|
|
AND DOES_SCENARIO_OF_TYPE_EXIST_IN_AREA(<<-1040.61, -2730.07, 19.17>>, "WORLD_HUMAN_LEANING", 0.25, FALSE) // ped 6
|
|
TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(pedAirport[4], <<-1040.61, -2730.07, 19.17>>, 0.25, -1)
|
|
bEventFlag[2] = FALSE
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(pedAirport[5])
|
|
AND NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(pedAirport[5], SCRIPT_TASK_USE_NEAREST_SCENARIO_TO_POS)
|
|
AND DOES_SCENARIO_OF_TYPE_EXIST_IN_AREA(<<-1030.32, -2738.53, 19.17>>, "WORLD_HUMAN_DRINKING", 0.25, FALSE) // ped 7
|
|
TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(pedAirport[5], <<-1030.32, -2738.53, 19.17>>, 0.25, -1)
|
|
bEventFlag[2] = FALSE
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(pedAirport[6])
|
|
AND NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(pedAirport[6], SCRIPT_TASK_USE_NEAREST_SCENARIO_TO_POS)
|
|
AND DOES_SCENARIO_OF_TYPE_EXIST_IN_AREA(<<-1035.18, -2740.79, 19.17>>, "WORLD_HUMAN_DRINKING", 0.25, FALSE) // ped 8
|
|
TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(pedAirport[6], <<-1035.18, -2740.79, 19.17>>, 0.25, -1)
|
|
bEventFlag[2] = FALSE
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(pedAirport[7])
|
|
AND NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(pedAirport[7], SCRIPT_TASK_USE_NEAREST_SCENARIO_TO_POS)
|
|
AND DOES_SCENARIO_OF_TYPE_EXIST_IN_AREA(<<-1046.80, -2735.29, 19.59>>, "PROP_HUMAN_SEAT_CHAIR", 0.25, FALSE) // ped 11
|
|
TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(pedAirport[7], <<-1046.80, -2735.29, 19.59>>, 0.25, -1)
|
|
bEventFlag[2] = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
// Stream out
|
|
ELSE
|
|
|
|
Unload_Asset_Model(sAssetData, A_F_Y_BEVHILLS_01)
|
|
Unload_Asset_Model(sAssetData, A_M_M_BEVHILLS_01)
|
|
Unload_Asset_Model(sAssetData, S_F_Y_AIRHOSTESS_01)
|
|
|
|
IF DOES_ENTITY_EXIST(pedAirport[0])
|
|
DELETE_PED(pedAirport[0])
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(pedAirport[1])
|
|
DELETE_PED(pedAirport[1])
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(pedAirport[2])
|
|
DELETE_PED(pedAirport[2])
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(pedAirport[3])
|
|
DELETE_PED(pedAirport[3])
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(pedAirport[4])
|
|
DELETE_PED(pedAirport[4])
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(pedAirport[5])
|
|
DELETE_PED(pedAirport[5])
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(pedAirport[6])
|
|
DELETE_PED(pedAirport[6])
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(pedAirport[7])
|
|
DELETE_PED(pedAirport[7])
|
|
ENDIF
|
|
|
|
bEventFlag[1] = FALSE
|
|
bEventFlag[2] = FALSE
|
|
bEventFlag[3] = FALSE
|
|
|
|
ENDIF
|
|
|
|
// Reached destination
|
|
IF IS_PLAYER_AT_LOCATION_WITH_BUDDY_IN_VEHICLE( sLocatesData, vDriveToAirport,<<5.062500,4.812500,2.812500>>, TRUE, pedVictim, vehTrevor,
|
|
godDriveToAirport, "", "", "CMN_GENGETBCKYT",
|
|
TRUE, TRUE, TRUE)
|
|
CLEAR_MISSION_LOCATE_STUFF(sLocatesData)
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
i_mission_substage++
|
|
|
|
ELSE
|
|
|
|
// Drive conversations
|
|
SWITCH iWeaponSelStage
|
|
CASE 0
|
|
// Initial trevor "you got a flight to catch" line
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
//RunConversation("F3_FLIGHT")
|
|
iWeaponSelStage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
// Drive banter
|
|
IF IS_SAFE_TO_START_CONVERSATION()
|
|
IF IS_PED_IN_VEHICLE(TREV_PED_ID(), vehTrevor)
|
|
AND IS_PED_IN_VEHICLE(pedVictim, vehTrevor)
|
|
AND TIMERB() >= 2000
|
|
|
|
RunConversation("F3_DRV3", "", TRUE)
|
|
|
|
IF sba_airport != NULL
|
|
REMOVE_SCENARIO_BLOCKING_AREA(sba_airport)
|
|
ENDIF
|
|
|
|
iWeaponSelStage++
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
CASE 2
|
|
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vDriveToAirport) < 100
|
|
IF NOT IS_SAFE_TO_START_CONVERSATION()
|
|
KILL_FACE_TO_FACE_CONVERSATION()
|
|
ELSE
|
|
RunConversation("F3_AIRPORT")
|
|
iWeaponSelStage++
|
|
ENDIF
|
|
ELSE
|
|
// Pause convo if 1 of the peds is out of the vehicle
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
IF NOT IS_PED_IN_VEHICLE(TREV_PED_ID(), vehTrevor)
|
|
OR NOT IS_PED_IN_VEHICLE(pedVictim, vehTrevor)
|
|
OR GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
|
|
PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
|
|
ELSE
|
|
PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(vehTrevor, 4.0, 2, 0.25)
|
|
eMissionStage = ST_12_EXIT_CUT
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//═════════╡ CLEANUP ╞═════════
|
|
IF eMissionStage != ST_11_DRIVE_TO_AIRPORT
|
|
IF DOES_BLIP_EXIST(blipLocate)
|
|
REMOVE_BLIP(blipLocate)
|
|
ENDIF
|
|
|
|
MissionStageTidyUp()
|
|
|
|
bStageSetup = FALSE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
//PURPOSE: Performs the section where Trevor drives the victim to the airport
|
|
PROC stage12_ExitCutscene()
|
|
|
|
//═════════╡ SETUP ╞═════════
|
|
IF NOT bStageSetup
|
|
|
|
i_mission_substage = 0
|
|
iWeaponSelStage = 0
|
|
bStageSetup = TRUE
|
|
iAssetRequests = 0
|
|
|
|
ENDIF
|
|
|
|
IF bStageSetup
|
|
|
|
SWITCH i_mission_substage
|
|
|
|
CASE 0
|
|
IF HAS_CUTSCENE_LOADED()
|
|
|
|
SET_ALL_RANDOM_PEDS_FLEE(PLAYER_ID(), TRUE)
|
|
|
|
IF NOT IS_PED_INJURED(pedVictim)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(pedVictim, strMrKCSHandle, CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
REGISTER_ENTITY_FOR_CUTSCENE(null, strMrKCSHandle_DONT_ANIMATE, CU_DONT_ANIMATE_ENTITY, CS_MRK)
|
|
REGISTER_ENTITY_FOR_CUTSCENE(vehTrevor, csTrevorCar, CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
|
|
|
|
IF NOT IS_PED_INJURED(pedAirport[0])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(pedAirport[0], "Ped_1", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) // A_F_Y_BEVHILLS_01
|
|
ELSE
|
|
REGISTER_ENTITY_FOR_CUTSCENE(null, "Ped_1", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, A_F_Y_BEVHILLS_01)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(pedAirport[1])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(pedAirport[1], "Ped_2", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) // A_F_Y_BEVHILLS_01
|
|
ELSE
|
|
REGISTER_ENTITY_FOR_CUTSCENE(null, "Ped_2", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, A_F_Y_BEVHILLS_01)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(pedAirport[2])
|
|
//REGISTER_ENTITY_FOR_CUTSCENE(pedAirport[2], "Ped_3", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) // A_F_Y_BEVHILLS_01
|
|
REGISTER_ENTITY_FOR_CUTSCENE(pedAirport[2], "Ped_3", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY) // A_F_Y_BEVHILLS_01
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(pedAirport[3])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(pedAirport[3], "Ped_4", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) // A_F_Y_BEVHILLS_01
|
|
ELSE
|
|
REGISTER_ENTITY_FOR_CUTSCENE(null, "Ped_4", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, A_F_Y_BEVHILLS_01)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(pedAirport[4])
|
|
//REGISTER_ENTITY_FOR_CUTSCENE(pedAirport[4], "Ped_6", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) // S_F_Y_AIRHOSTESS_01
|
|
REGISTER_ENTITY_FOR_CUTSCENE(pedAirport[4], "Ped_6", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY) // S_F_Y_AIRHOSTESS_01
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(pedAirport[5])
|
|
//REGISTER_ENTITY_FOR_CUTSCENE(pedAirport[5], "Ped_7", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) // A_M_M_BEVHILLS_01
|
|
REGISTER_ENTITY_FOR_CUTSCENE(pedAirport[5], "Ped_7", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(pedAirport[6])
|
|
//REGISTER_ENTITY_FOR_CUTSCENE(pedAirport[6], "Ped_8", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) // A_M_Y_BEVHILLS_01
|
|
REGISTER_ENTITY_FOR_CUTSCENE(pedAirport[6], "Ped_8", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY)
|
|
ENDIF
|
|
IF NOT IS_PED_INJURED(pedAirport[7])
|
|
REGISTER_ENTITY_FOR_CUTSCENE(pedAirport[7], "Ped_11", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) // S_F_Y_AIRHOSTESS_01
|
|
ELSE
|
|
REGISTER_ENTITY_FOR_CUTSCENE(null, "Ped_11", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, S_F_Y_AIRHOSTESS_01)
|
|
ENDIF
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
|
|
START_CUTSCENE()
|
|
|
|
IF NOT IS_REPLAY_RECORDING()
|
|
REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST)
|
|
ENDIF
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
IF IS_AUDIO_SCENE_ACTIVE("FBI_3_TREVOR_DRIVE_TO_AIRPORT")
|
|
STOP_AUDIO_SCENE("FBI_3_TREVOR_DRIVE_TO_AIRPORT")
|
|
ENDIF
|
|
|
|
i_mission_substage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
IF IS_CUTSCENE_PLAYING()
|
|
|
|
SAFE_FADE_IN()
|
|
|
|
SET_ROADS_IN_AREA(<<-909.826843,-2519.508057,61.213654>> - <<231.750000,250.000000,49.750000>>,
|
|
<<-909.826843,-2519.508057,61.213654>> + <<231.750000,250.000000,49.750000>>, FALSE)
|
|
|
|
IF IS_ENTITY_ON_FIRE(vehTrevor)
|
|
STOP_ENTITY_FIRE(vehTrevor)
|
|
ENDIF
|
|
IF IS_ENTITY_ON_FIRE(TREV_PED_ID())
|
|
STOP_ENTITY_FIRE(TREV_PED_ID())
|
|
ENDIF
|
|
IF IS_ENTITY_ON_FIRE(pedVictim)
|
|
STOP_ENTITY_FIRE(pedVictim)
|
|
ENDIF
|
|
CLEAR_AREA_OF_PEDS(<<-1036.71, -2731.66, 19.17>>, 5.0)
|
|
CLEAR_AREA_OF_VEHICLES(<<-950.40, -2561.11, 12.83>>, 250.0)
|
|
CLEAR_AREA_OF_PROJECTILES(<<-1032.90, -2731.43, 19.04>>, 30.0)
|
|
REMOVE_PARTICLE_FX_IN_RANGE(GET_ENTITY_COORDS(vehTrevor), 15.0)
|
|
|
|
// Sort the doors on trevors truck
|
|
SET_VEHICLE_DOOR_CONTROL(vehTrevor, SC_DOOR_FRONT_LEFT, DT_DOOR_INTACT, 0.0)
|
|
SET_VEHICLE_DOOR_CONTROL(vehTrevor, SC_DOOR_FRONT_LEFT, DT_DOOR_INTACT, 0.0)
|
|
|
|
i_mission_substage++
|
|
ENDIF
|
|
BREAK
|
|
CASE 2
|
|
IF NOT DOES_ENTITY_EXIST(pedAirport[0])
|
|
IF DOES_CUTSCENE_ENTITY_EXIST("Ped_1")
|
|
pedAirport[0] = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Ped_1"))
|
|
ENDIF
|
|
ELIF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Ped_1")
|
|
CPRINTLN(DEBUG_MIKE, "PED EXITED: Ped_1")
|
|
IF NOT IS_PED_INJURED(pedAirport[0])
|
|
IF DOES_SCENARIO_OF_TYPE_EXIST_IN_AREA(<<-1031.32, -2735.31, 19.22>>, "WORLD_HUMAN_SMOKING", 0.25, FALSE)
|
|
TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(pedAirport[0], <<-1031.32, -2735.31, 19.22>>, 0.25, -1)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(pedAirport[0])
|
|
CPRINTLN(DEBUG_MIKE, " Set into scneario")
|
|
ELSE
|
|
CPRINTLN(DEBUG_MIKE, " Failed to find scneario")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(pedAirport[1])
|
|
IF DOES_CUTSCENE_ENTITY_EXIST("Ped_2")
|
|
pedAirport[0] = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Ped_2"))
|
|
ENDIF
|
|
ELIF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Ped_2")
|
|
CPRINTLN(DEBUG_MIKE, "PED EXITED: Ped_2")
|
|
|
|
IF NOT IS_PED_INJURED(pedAirport[1])
|
|
IF DOES_SCENARIO_OF_TYPE_EXIST_IN_AREA(<<-1031.93, -2739.68, 19.66>>, "PROP_HUMAN_SEAT_CHAIR", 0.25, FALSE)
|
|
TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(pedAirport[1], <<-1031.93, -2739.68, 19.66>>, 0.25, -1)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(pedAirport[1])
|
|
CPRINTLN(DEBUG_MIKE, " Set into scneario")
|
|
ELSE
|
|
CPRINTLN(DEBUG_MIKE, " Failed to find scenario")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
// IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Ped_3")
|
|
// CPRINTLN(DEBUG_MIKE, "PED EXITED: Ped_3")
|
|
//
|
|
// IF NOT IS_PED_INJURED(pedAirport[2])
|
|
// IF DOES_SCENARIO_OF_TYPE_EXIST_IN_AREA(<<-1033.03, -2735.05, 19.17>>, "WORLD_HUMAN_HANG_OUT_STREET", 0.25, FALSE) // ped 3
|
|
// TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(pedAirport[2], <<-1033.03, -2735.05, 19.17>>, 0.25, -1)
|
|
// FORCE_PED_AI_AND_ANIMATION_UPDATE(pedAirport[2])
|
|
// CPRINTLN(DEBUG_MIKE, " Set into scneario")
|
|
// ELSE
|
|
// CPRINTLN(DEBUG_MIKE, " Failed to find scenario")
|
|
// ENDIF
|
|
// ENDIF
|
|
// ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(pedAirport[3])
|
|
IF DOES_CUTSCENE_ENTITY_EXIST("Ped_4")
|
|
pedAirport[3] = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Ped_4"))
|
|
ENDIF
|
|
ELIF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Ped_4")
|
|
CPRINTLN(DEBUG_MIKE, "PED EXITED: Ped_4")
|
|
IF NOT IS_PED_INJURED(pedAirport[3])
|
|
IF DOES_SCENARIO_OF_TYPE_EXIST_IN_AREA(<<-1042.16, -2729.93, 19.17>>, "WORLD_HUMAN_DRINKING", 0.25, FALSE) // ped 4
|
|
TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(pedAirport[3], <<-1042.16, -2729.93, 19.17>>, 0.25, -1)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(pedAirport[3])
|
|
CPRINTLN(DEBUG_MIKE, " Set into scneario")
|
|
ELSE
|
|
CPRINTLN(DEBUG_MIKE, " Failed to find scenario")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
// IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Ped_6")
|
|
// CPRINTLN(DEBUG_MIKE, "PED EXITED: Ped_6")
|
|
// IF NOT IS_PED_INJURED(pedAirport[4])
|
|
// IF DOES_SCENARIO_OF_TYPE_EXIST_IN_AREA(<<-1040.61, -2730.07, 19.17>>, "WORLD_HUMAN_LEANING", 0.25, FALSE) // ped 6
|
|
// TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(pedAirport[4], <<-1040.61, -2730.07, 19.17>>, 0.25, -1)
|
|
// FORCE_PED_AI_AND_ANIMATION_UPDATE(pedAirport[4])
|
|
// CPRINTLN(DEBUG_MIKE, " Set into scneario")
|
|
// ELSE
|
|
// CPRINTLN(DEBUG_MIKE, " Failed to find scenario")
|
|
// ENDIF
|
|
// ENDIF
|
|
// ENDIF
|
|
// IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Ped_7")
|
|
// CPRINTLN(DEBUG_MIKE, "PED EXITED: Ped_7")
|
|
// IF NOT IS_PED_INJURED(pedAirport[5])
|
|
// IF DOES_SCENARIO_OF_TYPE_EXIST_IN_AREA(<<-1030.32, -2738.53, 19.17>>, "WORLD_HUMAN_DRINKING", 0.25, FALSE) // ped 7
|
|
// TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(pedAirport[5], <<-1030.32, -2738.53, 19.17>>, 0.25, -1)
|
|
// FORCE_PED_AI_AND_ANIMATION_UPDATE(pedAirport[5])
|
|
// CPRINTLN(DEBUG_MIKE, " Set into scneario")
|
|
// ELSE
|
|
// CPRINTLN(DEBUG_MIKE, " Failed to find scenario")
|
|
// ENDIF
|
|
// ENDIF
|
|
// ENDIF
|
|
// IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Ped_8")
|
|
// CPRINTLN(DEBUG_MIKE, "PED EXITED: Ped_8")
|
|
// IF NOT IS_PED_INJURED(pedAirport[6])
|
|
// IF DOES_SCENARIO_OF_TYPE_EXIST_IN_AREA(<<-1034.21, -2740.14, 19.17>>, "WORLD_HUMAN_DRINKING", 0.25, FALSE) // ped 8
|
|
// TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(pedAirport[6], <<-1034.21, -2740.14, 19.17>>, 0.25, -1)
|
|
// FORCE_PED_AI_AND_ANIMATION_UPDATE(pedAirport[6])
|
|
// CPRINTLN(DEBUG_MIKE, " Set into scneario")
|
|
// ELSE
|
|
// CPRINTLN(DEBUG_MIKE, " Failed to find scenario")
|
|
// ENDIF
|
|
// ENDIF
|
|
// ENDIF
|
|
IF NOT DOES_ENTITY_EXIST(pedAirport[7])
|
|
IF DOES_CUTSCENE_ENTITY_EXIST("Ped_11")
|
|
pedAirport[7] = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Ped_11"))
|
|
ENDIF
|
|
ELIF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Ped_11")
|
|
CPRINTLN(DEBUG_MIKE, "PED EXITED: Ped_11")
|
|
IF NOT IS_PED_INJURED(pedAirport[7])
|
|
IF DOES_SCENARIO_OF_TYPE_EXIST_IN_AREA(<<-1046.80, -2735.29, 19.59>>, "PROP_HUMAN_SEAT_CHAIR", 0.25, FALSE) // ped 11
|
|
TASK_USE_NEAREST_SCENARIO_TO_COORD_WARP(pedAirport[7], <<-1046.80, -2735.29, 19.59>>, 0.25, -1)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(pedAirport[7])
|
|
CPRINTLN(DEBUG_MIKE, " Set into scneario")
|
|
ELSE
|
|
CPRINTLN(DEBUG_MIKE, " Failed to find scenario")
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
|
|
IF IS_REPLAY_RECORDING()
|
|
REPLAY_STOP_EVENT()
|
|
ENDIF
|
|
|
|
bCamExited = TRUE
|
|
ENDIF
|
|
|
|
IF bCamExited
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(csTrevorCar)
|
|
SET_VEHICLE_USE_CUTSCENE_WHEEL_COMPRESSION(vehTrevor, TRUE, FALSE, FALSE)
|
|
SET_VEHICLE_DOOR_SHUT(vehTrevor, SC_DOOR_FRONT_LEFT, TRUE)
|
|
SET_VEHICLE_DOOR_SHUT(vehTrevor, SC_DOOR_FRONT_RIGHT, TRUE)
|
|
SET_VEHICLE_ENGINE_ON(vehTrevor, TRUE, TRUE)
|
|
ENDIF
|
|
|
|
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(csTrevor)
|
|
|
|
IF sba_airport != NULL
|
|
REMOVE_SCENARIO_BLOCKING_AREA(sba_airport)
|
|
ENDIF
|
|
|
|
CLEAR_PED_NON_CREATION_AREA()
|
|
|
|
SET_PED_PATHS_BACK_TO_ORIGINAL(<<-1038.279907,-2738.568359,21.232233>>-<<97.250000,69.500000,2.312500>>,
|
|
<<-1038.279907,-2738.568359,21.232233>>+<<97.250000,69.500000,2.312500>>)
|
|
|
|
SET_ROADS_BACK_TO_ORIGINAL(<<-909.826843,-2519.508057,61.213654>> - <<231.750000,250.000000,49.750000>>,
|
|
<<-909.826843,-2519.508057,61.213654>> + <<231.750000,250.000000,49.750000>>)
|
|
|
|
SET_ALL_RANDOM_PEDS_FLEE(PLAYER_ID(), FALSE)
|
|
|
|
SET_PED_INTO_VEHICLE(TREV_PED_ID(), vehTrevor)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(TREV_PED_ID())
|
|
|
|
REMOVE_SCENARIO_BLOCKING_AREA(sba_airport)
|
|
REMOVE_ROAD_NODE_SPEED_ZONE(iRoadNodeSpeedZone[0])
|
|
|
|
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE, DEFAULT, FALSE)
|
|
eMissionStage = ST_13_PASSED_MISSION
|
|
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
//═════════╡ CLEANUP ╞═════════
|
|
IF eMissionStage != ST_12_EXIT_CUT
|
|
IF DOES_BLIP_EXIST(blipLocate)
|
|
REMOVE_BLIP(blipLocate)
|
|
ENDIF
|
|
|
|
IF iRoadNodeSpeedZone[0] != -1
|
|
REMOVE_ROAD_NODE_SPEED_ZONE(iRoadNodeSpeedZone[0])
|
|
iRoadNodeSpeedZone[0] = -1
|
|
ENDIF
|
|
|
|
MissionStageTidyUp()
|
|
|
|
bStageSetup = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: Contains the mission flow control structure
|
|
PROC MissionFlow()
|
|
|
|
bPlayedTortureSceneLastFrame = bPlayedTortureSceneThisFrame
|
|
bPlayedTortureSceneThisFrame = FALSE
|
|
|
|
SWITCH eMissionStage
|
|
CASE ST_0_DRIVE_TO_START stage0_DriveToStart() BREAK
|
|
CASE ST_1_INTRO_CUT stage1_IntroCut() BREAK
|
|
CASE ST_2_DRIVE_TO_COORD_FIRST stage2_DriveToCoordFirst() BREAK
|
|
CASE ST_3_TORTURE_FOR_FIRST stage3_TortureForFirst() BREAK
|
|
CASE ST_4_DRIVE_TO_COORD_SECOND stage4_DriveToCoordSecond() BREAK
|
|
CASE ST_5_TORTURE_FOR_SECOND stage5_TortureForSecond() BREAK
|
|
CASE ST_6_REACT_TO_SECOND stage6_ReactToSecond() BREAK
|
|
CASE ST_7_TORTURE_FOR_THIRD stage7_TortureForThird() BREAK
|
|
CASE ST_8_REACT_TO_THIRD stage8_ReactToThird() BREAK
|
|
CASE ST_9_TORTURE_FINAL stage9_TortureFinal() BREAK
|
|
CASE ST_10_REACT_FINAL stage10_ReactFinal() BREAK
|
|
CASE ST_11_DRIVE_TO_AIRPORT stage11_DriveToAirport() BREAK
|
|
CASE ST_12_EXIT_CUT stage12_ExitCutscene() BREAK
|
|
CASE ST_13_PASSED_MISSION
|
|
IF NOT bStageSetup
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH()
|
|
|
|
SAFE_FADE_IN()
|
|
bStageSetup = TRUE
|
|
ELSE
|
|
IF IS_SCREEN_FADED_IN()
|
|
MissionPassed()
|
|
ENDIF
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
|
|
IF NOT DOES_CAM_EXIST(camTorture)
|
|
OR NOT IS_CAM_ACTIVE(camTorture)
|
|
// bug 1890635
|
|
//OR NOT IS_CAM_RENDERING(camTorture)
|
|
IF IS_SCRIPT_GLOBAL_SHAKING()
|
|
STOP_SCRIPT_GLOBAL_SHAKING(TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// bug 1890635
|
|
// ELSE
|
|
// IF NOT IS_SCRIPT_GLOBAL_SHAKING()
|
|
// ANIMATED_SHAKE_SCRIPT_GLOBAL("SHAKE_CAM_medium", "medium", "", fTortureShake)
|
|
// ENDIF
|
|
// ENDIF
|
|
|
|
DUMMY_REFERENCE_FLOAT(fTortureShake)
|
|
|
|
IF bDisplayHeartMonitor
|
|
TORTURE_ManageHeartbeat()
|
|
TORTURE_ManagePadVibration()
|
|
TORTURE_ManageSound()
|
|
ENDIF
|
|
|
|
DISPLAY_CHECK()
|
|
|
|
MANAGE_MR_K_VARIATIONS()
|
|
|
|
ENDPROC
|
|
|
|
|
|
//═════════════════════════════════╡ MAIN SCRIPT ╞═══════════════════════════════════
|
|
|
|
SCRIPT
|
|
MissionSetup()
|
|
|
|
IF HAS_FORCE_CLEANUP_OCCURRED()
|
|
eMissionFail = FAIL_FORCE_CLEANUP
|
|
MissionFailed()
|
|
ENDIF
|
|
|
|
WHILE TRUE
|
|
|
|
REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_BTB")
|
|
|
|
IF iNumberOfTeethPulled = 0
|
|
strMrKCSHandle = csMrK
|
|
strMrKCSHandle_DONT_ANIMATE = csMrK_TL
|
|
ELSE
|
|
strMrKCSHandle = csMrK_TL
|
|
strMrKCSHandle_DONT_ANIMATE = csMrK
|
|
ENDIF
|
|
|
|
bDisplayHeartMonitor = FALSE
|
|
bDisplayToothPull = FALSE
|
|
bDisplaySwitchHUD = FALSE
|
|
bHeartbeatFrame = FALSE
|
|
|
|
Update_Entity_Cleanup_Queue(sEntityCleanupQueue)
|
|
Update_Asset_Management_System(sAssetData)
|
|
Update_Cutscene_Prestreaming(sCutscenePedVariationRegister)
|
|
|
|
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
|
|
i_time_of_last_convo = -1
|
|
ELSE
|
|
IF i_time_of_last_convo = -1
|
|
i_time_of_last_convo = GET_GAME_TIMER()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT bDoSkip
|
|
FailCheck()
|
|
ENDIF
|
|
|
|
MissionStageSkip()
|
|
|
|
IF NOT bDoSkip
|
|
UpdateConversationStarter()
|
|
MissionFlow()
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD Debug_Update() #ENDIF
|
|
|
|
IF bMissionFailed
|
|
IF NOT bUpdateMissionFailed
|
|
MissionFailed()
|
|
ELSE
|
|
UpdateMissionFailed()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_K)
|
|
IF DOES_ENTITY_EXIST(peds[mpf_target].id)
|
|
AND NOT IS_PED_INJURED(peds[mpf_target].id)
|
|
SET_ENTITY_HEALTH(peds[mpf_target].id, 0)
|
|
ENDIF
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDSCRIPT
|