#include maps\_utility; #include common_scripts\utility; #include maps\_hud_util; #include maps\_anim; #include maps\_stealth_utility; #include maps\_slowmo_breach; #include maps\af_caves_code; #include maps\_vehicle; #include maps\_riotshield; #using_animtree( "generic_human" ); main_af_caves_backhalf_preload() { //thread destructible_management(); PreCacheShellShock( "af_cave_collapse" ); PreCacheItem( "hellfire_missile_af_caves_end" ); PreCacheModel( "weapon_rpd_MG_Setup" ); PreCacheItem( "m4_grenadier" ); PreCacheModel( "com_computer_keyboard_obj" ); level.overlookDudesDead = 0; level.ledgeKillfirmFinal = false; level.ledgeKillfirm = 0; level.ledgeEnemiesKilledByPlayer = 0; level.riotshields = GetEntArray( "riotshield", "targetname" ); level.priceLedgeHelpCooldown = 2; //seconds you have to wait since the last time Price killed an enemy to give him super accuracy level.riotShieldInstructed = false; level.aColornodeTriggersBackhalf = []; level.gettingflankednaggiven = false; trigs = GetEntArray( "trigger_multiple", "classname" ); foreach ( trigger in trigs ) { if ( ( IsDefined( trigger.script_noteworthy ) ) && ( GetSubStr( trigger.script_noteworthy, 0, 19 ) == "colornodes_backhalf" ) ) level.aColornodeTriggersBackhalf = array_add( level.aColornodeTriggersBackhalf, trigger ); } setDvarIfUninitialized( "caves_fire", "1" ); flag_init( "can_talk" ); flag_set( "can_talk" ); //ledge flag_init( "ledge_sequence_dialogue_over" ); flag_init( "shephered_ledge_dialogue_starting" ); flag_init( "shephered_ledge_dialogue_done" ); //overlook flag_init( "unload_overlook_dudes" ); flag_init( "overlook_dudes_decimated" ); //skylight flag_init( "unload_skylight_dudes" ); flag_init( "smoke_thrown" ); flag_init( "price_has_given_flank_hint" ); flag_init( "stop_smoke" ); //Breach flag_init( "start_breach_nags" ); flag_init( "breach_door_closed" ); flag_init( "control_room_breached" ); flag_init( "control_room_explosion" ); flag_init( "control_room_getting_breached" ); flag_init( "control_room_door_opened" ); flag_init( "control_room_doors_closed" ); flag_init( "keyboard_activated" ); flag_init( "player_detonated_explosives" ); flag_init( "price_at_the_keyboard" ); //Airstrip flag_init( "start_airstrip_aftermath_fx" ); flag_init( "end_cave_collapse" ); flag_init( "player_escaped" ); flag_init( "danger_close_dialogue_start" ); flag_init( "danger_close_dialogue_end" ); flag_init( "price_falling_back" ); flag_init( "danger_close_moment_over" ); flag_init( "danger_close_last_missile_has_hit" ); flag_init( "unload_airstrip_blackhawk_dudes" ); //objectives flag_init( "obj_ledge_traverse_given" ); flag_init( "obj_ledge_traverse_complete" ); flag_init( "obj_overlook_to_skylight_given" ); flag_init( "obj_overlook_to_skylight_complete" ); flag_init( "obj_breach_given" ); flag_init( "obj_breach_complete" ); flag_init( "obj_door_controls_given" ); flag_init( "obj_door_controls_complete" ); flag_init( "obj_escape_given" ); flag_init( "obj_escape_complete" ); flag_init( "obj_hummer_given" ); flag_init( "obj_hummer_complete" ); flag_init( "obj_hummer_gunner_given" ); flag_init( "obj_hummer_gunner_complete" ); flag_init( "obj_level_end_given" ); flag_init( "obj_level_end_complete" ); } main_af_caves_backhalf_postload() { camo_right_damaged = getentarray( "camo_right_damaged", "targetname" ); camo_left_damaged = getentarray( "camo_left_damaged", "targetname" ); array_thread( camo_right_damaged, ::hide_entity ); array_thread( camo_left_damaged, ::hide_entity ); rock_rubble1 = GetEnt( "rock_rubble1", "targetname" ); rock_rubble1 NotSolid(); rock_rubble1 Hide(); rock_rubble1 ConnectPaths(); netting_destroyed = GetEntArray( "netting_destroyed", "targetname" ); foreach ( destroyed_piece in netting_destroyed ) destroyed_piece Hide(); // generic_damage_triggers = GetEntArray( "generic_damage", "targetname" ); array_thread( generic_damage_triggers,::generic_damage_triggers_think ); //dialogue backhalf_dialogue(); //vehicles aVehicleSpawners = maps\_vehicle::_getvehiclespawnerarray(); array_thread( aVehicleSpawners, ::add_spawn_function, ::vehicle_think ); array_thread( GetVehicleNodeArray( "plane_sound", "script_noteworthy" ), maps\_mig29::plane_sound_node ); array_thread( GetVehicleNodeArray( "uav_sound", "script_noteworthy" ), maps\_ucav::plane_sound_node ); array_thread( GetVehicleNodeArray( "fire_missile", "script_noteworthy" ), maps\_ucav::fire_missile_node ); //Ledge array_spawn_function_targetname( "hostiles_ledge_fight", ::AI_ledge_hostiles_think ); array_spawn_function_noteworthy( "ledge_prone_guy", ::AI_ledge_prone_guy_think ); //Overlook array_spawn_function_noteworthy( "overlook_heli_fastropers", ::AI_overlook_heli_fastropers_think ); //Skylight array_spawn_function_noteworthy( "skylight_heli_fastropers", ::AI_skylight_heli_fastropers_think ); array_spawn_function_noteworthy( "riotshield_flanker", ::AI_riotshield_flanker_think ); array_spawn_function_noteworthy( "shotgun_flanker", ::AI_shotgun_flanker_think ); //array_spawn_function_noteworthy( "riotshield_flanker_long", ::AI_riotshield_flanker_think, "longSprint" ); //Control Room //array_spawn_function_noteworthy( "flashlight", ::attach_flashlight ); //Airstrip array_spawn_function_noteworthy( "airstrip_littlebird_hostiles", ::AI_airstrip_littlebird_hostiles_think ); array_spawn_function_noteworthy( "airstrip_heli_fastropers", ::AI_airstrip_heli_fastropers_think ); array_spawn_function_targetname( "ambient_airstrip", ::AI_ambient_airstrip_think ); array_spawn_function_targetname( "airstrip_runners", ::AI_airstrip_runners_think ); array_spawn_function_noteworthy( "ignored", ::AI_ignored_think ); littlebird_airstrip = GetEnt( "littlebird_airstrip", "targetname" ); littlebird_airstrip thread add_spawn_function( ::littlebird_airstrip_think ); blackhawk_airstrip = GetEnt( "blackhawk_airstrip", "targetname" ); blackhawk_airstrip thread add_spawn_function( ::blackhawk_airstrip_think ); thread fx_management(); //thread debug(); } AA_backhalf_init() { thread AA_ledge_init(); } /**************************************************************************** LEDGE FIGHT ****************************************************************************/ AA_ledge_init() { flag_wait( "steamroom_halfway_point" ); level.spawnerCallbackThread = ::AI_think; thread AAA_sequence_ledge_to_cave(); thread dialogue_ledge_to_cave(); thread obj_ledge_traverse(); thread music_ledge_to_breach(); flag_wait( "obj_ledge_traverse_complete" ); thread AA_overlook_init(); } music_ledge_to_breach() { level endon( "control_room_explosion" ); flag_wait( "player_clear_steamroom" ); MusicStop(); time = musicLength( "af_caves_goingloud" ); while ( !flag( "control_room_explosion" ) ) { MusicPlayWrapper( "af_caves_goingloud" ); wait( time ); //wait( 196 ); music_stop( 1 ); wait( 1.1 ); } } AAA_sequence_ledge_to_cave() { //to do ....remove door opening here, will be in Sean's script //thread steamroom_door_full_open(); //flag_wait( "player_approaching_steamroom_exit" ); flag_wait( "steamroom_done" );// SRS changed to a flag I can control in script turn_off_stealth(); level.price.goalvolume = 64; level.price PushPlayer( false ); level.price.pathrandompercent = 50; level.price enable_ai_color(); level.price thread force_weapon_when_player_not_looking( "m4_grenadier" ); triggersEnable( "colornodes_backhalf_ledge_start", "script_noteworthy", true ); triggersEnable( "colornodes_backhalf_ledge", "script_noteworthy", true ); activate_trigger_with_noteworthy( "colornodes_backhalf_ledge_start" ); /*----------------------- CANYON VEHICLES -------------------------*/ thread convoy_loop( "canyon_convoy", "control_room_breached", 1.5, 2.2 ); //flag_wait( "player_approaching_steamroom_exit" ); // SRS this flag wasn't doing anything since it was being checked earlier in the thread air_convoy_ledge = spawn_vehicles_from_targetname_and_drive( "air_convoy_ledge" ); //get overlook fastropers ready thread blackhawk_overlook_rappel_think(); flag_wait( "player_clear_steamroom" ); thread autosave_by_name( "ledge_start" ); zodiacs_canyon_start = spawn_vehicles_from_targetname_and_drive( "zodiacs_canyon_start" ); zodiacs_canyon = spawn_vehicles_from_targetname_and_drive( "zodiacs_canyon" ); flag_wait( "player_ledge_stairs_01" ); level.price.ignoreme = true; level.price.IgnoreRandomBulletDamage = true; thread price_has_awesome_accuracy_while_player_is_using_shield( "ledge_gunners_dead" ); uav_bridge_01 = spawn_vehicle_from_targetname_and_drive( "uav_bridge_01" ); uav_bridge_01 thread uav_bridge_01_think(); flag_wait( "player_ledge_corner_01" ); thread spawn_vehicles_from_targetname_and_drive_on_flag( "jets_canyon_01", "shephered_ledge_dialogue_done" ); flag_wait( "player_crossed_bridge" ); level.priceLedgeHelpCooldown = .1; // let Price be accurate more ofthen now that we're closer flag_wait( "player_ledge_last_stairs" ); level.price.ignoreme = false; level.price.IgnoreRandomBulletDamage = false; flag_wait( "player_inside_overlook" ); level.player notify( "done_with_ledge_sequence" ); battlechatter_on( "allies" ); battlechatter_on( "axis" ); level.price set_battlechatter( true ); thread overlook_autosaves(); } price_has_awesome_accuracy_while_player_is_using_shield( sFlagToEndOn ) { level.player endon( "death" ); level.price endon( "death" ); level.price.baseaccuracy = .1; level.price.old_baseaccuracy = level.price.baseaccuracy; level.lasttimePriceKilledEnemy = GetTime(); wait( 0.05 ); while ( !flag( sFlagToEndOn ) ) { if ( ( player_is_using_riot_shield() ) && ( price_hasnt_killed_a_fool_in_the_last_few_seconds( level.priceLedgeHelpCooldown ) ) ) { level.price.baseaccuracy = 50; } else { level.price.baseaccuracy = level.price.old_baseaccuracy; } //level.player waittill_either_or_timeout( "weapon_change", "done_with_ledge_sequence" ); wait( 2 ); } //make price have average accuracy level.price.baseaccuracy = 2; } price_hasnt_killed_a_fool_in_the_last_few_seconds( iSeconds ) { //only give Price awesome accuracy if it's been at lease XX seconds since his last kill currentTime = GetTime(); timeElapsed = currentTime - level.lasttimePriceKilledEnemy; if ( currentTime == level.lasttimePriceKilledEnemy ) return false; else if ( timeElapsed > ( iSeconds * 1000 ) ) return true; else return false; } AI_ledge_prone_guy_think() { self endon( "death" ); self.ignoreme = true; flag_wait( "player_ledge_bridge_crossing" ); self.ignoreme = false; } AI_ledge_hostiles_think() { self.DropWeapon = false; baseaccuracyFactor = undefined; switch( level.gameSkill ) { case 0:// easy doorFlashChanceFactor = 1; baseaccuracyFactor = 1000; break; case 1:// regular doorFlashChanceFactor = 1.3; baseaccuracyFactor = 1000; break; case 2:// hardened doorFlashChanceFactor = 1.5; baseaccuracyFactor = 1000; break; case 3:// veteran doorFlashChanceFactor = 1.5; baseaccuracyFactor = 1000; break; } self.interval = 0; self.ignoresuppression = true; self.suppressionwait = 0; self.disableBulletWhizbyReaction = true; self.baseaccuracy = self.baseaccuracy * baseaccuracyFactor; self.accuracy = self.accuracy * baseaccuracyFactor; while ( IsDefined( self ) ) { self waittill( "death", attacker ); //Final killfirm if all dead if ( flag( "ledge_gunners_dead" ) ) { //Captain Price We're clear. Move in. if ( ( !flag( "player_inside_overlook" ) ) && ( level.ledgeKillfirmFinal == false ) ) { level.ledgeKillfirmFinal = true; radio_dialogue( "riot_killfirm_final" ); } } if ( ( IsDefined( attacker ) ) && ( attacker == level.price ) ) { if ( ( flag( "can_talk" ) ) && ( !flag( "ledge_gunners_dead" ) ) ) { wait( 0.05 ); //Otherwise, generic killfirm //Good night //He's down //Got 'em //Got one. flag_clear( "can_talk" ); if ( level.ledgeKillfirm == 3 ) level.ledgeKillfirm = 0; radio_dialogue( "riot_killfirm_0" + level.ledgeKillfirm ); level.ledgeKillfirm++; flag_set( "can_talk" ); } level.lasttimePriceKilledEnemy = GetTime(); } else if ( ( IsDefined( attacker ) ) && ( IsPlayer( attacker ) ) ) { level.ledgeEnemiesKilledByPlayer++; if ( level.ledgeEnemiesKilledByPlayer > 4 ) { thread maps\_spawner::kill_spawnerNum( 71 ); } } } } dialogue_ledge_to_cave() { //flag_wait( "player_approaching_steamroom_exit" ); flag_wait( "steamroom_done" );// SRS changed to a script controlled flag flag_set( "obj_ledge_traverse_given" ); //Shadow Company HQ Avatar One this is Oxide, we've lost contact with multiple squads near the steam room. I need a camera sweep of the catwalk, over. stealth wiretap //radio_dialogue( "afcaves_schq_catwalk" ); //Shadow Company 4 Roger that Oxide, UAV is online. Standby. stealth wiretap //radio_dialogue( "afcaves_sc4_uavonline" ); flag_wait( "player_clear_steamroom" ); flag_wait( "steamroom_ambush_finish_dialogue_ended" ); //flag_wait( "player_ledge_riotshields" ); ////Captain Price Grab a riot shield...we'll need cover out here. radio_dialogue( "afcaves_pri_pickupriotsheild" ); delayThread( 2, ::dialogue_nag_riotshield, "ledge_gunners_dead", "player_crossed_bridge" ); wait( 1 ); flag_wait( "can_talk" ); flag_clear( "can_talk" ); flag_set( "shephered_ledge_dialogue_starting" ); //Shadow Company 4 Oxide, Avatar One. We have unauthorized personnel on the catwalk. I repeat, we have unauthorized personnel on the catwalk. radio_dialogue( "afcaves_sc4_gettingthis" ); flag_set( "shephered_ledge_dialogue_done" ); flag_set( "can_talk" ); /*----------------------- LEDGE GUNNERS DEAD -------------------------*/ flag_wait( "ledge_gunners_dead" ); level.player notify( "done_with_ledge_sequence" ); wait( 3 ); flag_set( "ledge_sequence_dialogue_over" ); } dialogue_nag_riotshield( sFlagToEndOn1, sFlagToEndOn2 ) { flag_wait( "player_ledge_stairs_01" ); iRiotShieldPickupHintNumber = 0; iRiotShieldCrouchHintNumber = 0; iRiotShieldSwitchHintNumber = 0; iRiotShieldMoveUpNumber = 0; iCatWalkChatterNumber = 0; while ( true ) { if ( ( flag( sFlagToEndOn1 ) ) || ( flag( sFlagToEndOn2 ) ) ) return; //No riot shield, but near a pickup if ( ( !player_has_riot_shield() ) && ( player_is_near_a_riot_shield_pickup() ) ) { if ( flag( "can_talk" ) ) { flag_clear( "can_talk" ); if ( iRiotShieldPickupHintNumber == 3 ) iRiotShieldPickupHintNumber = 0; //Captain Price Soap, grab a riot shield and lead the way. I'll take care of any shooters! //Captain Price 11 5 Soap, grab a riot shield. We'll need all the cover we can get. //Grab a riot shield. We're completely exposed out here. radio_dialogue( "pickupriotsheild_0" + iRiotShieldPickupHintNumber ); iRiotShieldPickupHintNumber++; flag_set( "can_talk" ); level.player waittill_notify_or_timeout( "weapon_change", 5 ); } } //Player has the shield else if ( player_has_riot_shield() ) { //Have we given the general instruction yet? if ( level.riotShieldInstructed == false ) { if ( flag( "can_talk" ) ) { flag_clear( "can_talk" ); //Captain Price 11 3 Take point with the riot shield. I'll take care of any resistance. radio_dialogue( "afcaves_pri_takepoint2" ); level.riotShieldInstructed = true; flag_set( "can_talk" ); } } //Player has it, but is not using it else if ( !player_is_using_riot_shield() ) { if ( flag( "can_talk" ) ) { flag_clear( "can_talk" ); if ( iRiotShieldSwitchHintNumber == 2 ) iRiotShieldSwitchHintNumber = 0; //Switch to the shield, we're exposed out here! //Bring up the riot shield, Soap! //Give us some cover with that riot shield, Soap! radio_dialogue( "switchriotsheild_0" + iRiotShieldSwitchHintNumber ); iRiotShieldSwitchHintNumber++; flag_set( "can_talk" ); } } //Player is using it, but not crouched else if ( !player_is_crouched() ) { if ( flag( "can_talk" ) ) { flag_clear( "can_talk" ); if ( iRiotShieldCrouchHintNumber == 2 ) iRiotShieldCrouchHintNumber = 0; //Captain Price 11 3 Stay low with that shield so I can get a clean shot //Captain Price 11 3 Keep low with that shield. //Crouch down with that shield, Soap! I'll take care of the shooters. radio_dialogue( "crouchriotsheild_0" + iRiotShieldCrouchHintNumber ); iRiotShieldCrouchHintNumber++; flag_set( "can_talk" ); } } else if ( level.riotShieldInstructed == true ) { if ( ( iCatWalkChatterNumber < 3 ) && ( flag( "can_talk" ) ) ) { //Shadow Company 5 Oxide, Disciple Nine, we've got hostile contact approximately 50 meters from the nest, over. stealth wiretap //Shadow Company HQ All personnel - be advised, we have two enemy foot-mobiles on the catwalk heading to the crow's nest. stealth wiretap //Shadow Company HQ Terminate with extreme prejudice. flag_clear( "can_talk" ); radio_dialogue( "catwalk_enemy_chatter_0" + iCatWalkChatterNumber ); iCatWalkChatterNumber++; if ( iCatWalkChatterNumber == 0 ) { radio_dialogue( "catwalk_enemy_chatter_0" + iCatWalkChatterNumber ); iCatWalkChatterNumber++; } flag_set( "can_talk" ); } else { if ( flag( "can_talk" ) ) { flag_clear( "can_talk" ); if ( iRiotShieldMoveUpNumber == 1 ) iRiotShieldMoveUpNumber = 0; //Captain Price Move up. //Captain Price Take point with the shield and draw their fire. I'll cover you. radio_dialogue( "riotsheildmove_0" + iRiotShieldMoveUpNumber ); iRiotShieldMoveUpNumber++; flag_set( "can_talk" ); } } } } level.player waittill_notify_or_timeout( "weapon_change", 1 ); wait( 1 ); } } uav_bridge_01_think() { while ( IsDefined( self ) ) wait( 2 ); uav_bridge_02 = spawn_vehicle_from_targetname_and_drive( "uav_bridge_02" ); } player_is_crouched() { if ( level.player GetStance() == "crouch" ) return true; else return false; } player_is_using_riot_shield() { if ( !player_has_riot_shield() ) return false; else { currentWeapon = level.player GetCurrentWeapon(); if ( currentWeapon == "riotshield" ) return true; else return false; } } player_has_riot_shield() { weapons = level.player GetWeaponsListAll(); if ( !isdefined( weapons ) ) return false; foreach ( weapon in weapons ) { if ( IsSubStr( weapon, "riotshield" ) ) return true; } return false; } player_is_near_a_riot_shield_pickup() { playerDistSquared = 1024 * 1024; foreach ( weapon in level.riotshields ) { if ( !isdefined( weapon ) ) continue; if ( DistanceSquared( weapon.origin, level.player.origin ) < playerDistSquared ) return true; } return false; } /**************************************************************************** OVERLOOK FIGHT ****************************************************************************/ AA_overlook_init() { thread AAA_sequence_overlook_to_breach(); thread dialogue_overlook_to_breach(); thread obj_overlook_to_skylight(); flag_wait( "player_enter_skylight" ); thread AA_breach_init(); } AAA_sequence_overlook_to_breach() { flag_wait( "obj_ledge_traverse_complete" ); triggersEnable( "colornodes_backhalf_overlook_to_breach", "script_noteworthy", true ); level.price cqb_walk( "off" ); level.price.neverEnableCQB = true; level.price.sprint = undefined; level.price.fixednodesaferadius = 1024; level.fixednodesaferadius_default = 1024; /*----------------------- OVERLOOK CAVE -------------------------*/ //get fastropers ready for skylight area blackhawk_skylight_01 = spawn_vehicle_from_targetname_and_drive( "blackhawk_skylight_01" ); rappelSoundOrg = blackhawk_skylight_01.origin; /*----------------------- SKYLIGHT AREA - FASTROPERS -------------------------*/ flag_wait( "player_enter_skylight" ); //thread overlook_grenade_hints(); flag_set( "unload_skylight_dudes" ); /*------------------------- SKYLIGHT - MAKE ALL IN OVERLOOK SEEK THE PLAYER -------------------------*/ volume_overlook = GetEnt( "volume_overlook", "targetname" ); aAI = volume_overlook get_ai_touching_volume( "axis" ); array_thread( aAI, ::AI_player_seek ); aSmokeOrgs = GetEntArray( "smoke_org_skylight", "targetname" ); thread smoke_throw( aSmokeOrgs, "stop_smoke" ); wait( 1 ); flag_set( "smoke_thrown" ); if ( isdefined( blackhawk_skylight_01 ) ) { //Butcher Two roping into sector Papa Quebec! delaythread( 2,::play_sound_in_space, "afcaves_sc5_papaquebec", rappelSoundOrg ); } thread dialougue_nag_smokefight(); /*----------------------- SKYLIGHT AREA - CLEANUP -------------------------*/ flag_wait( "obj_overlook_to_skylight_complete" ); if ( isdefined( blackhawk_skylight_01 ) ) { skylight1_heli_depart = getstruct( "skylight1_heli_depart", "targetname" ); blackhawk_skylight_01 thread vehicle_paths_then_delete( skylight1_heli_depart ); } } //overlook_grenade_hints() //{ // if ( level.gameskill > 1 ) // return; // level endon( "player_in_skylight_area" ); // // thread player_grenade_usage_monitor(); //} // //player_grenade_usage_monitor() //{ // level endon( "player_in_skylight_area" ); // level.player endon( "death" ); // level endon( "player_used_flash" ); // while ( true ) // { // flag_wait_or_timeout( "player_used_flash", 120 ); // if ( !flag( "player_used_flash" ) ) // { // hint // } // } //} overlook_autosaves() { thread overlook_to_skylight_autosaves_every_3_dudes(); level endon( "player_in_skylight_area" ); flag_wait( "overlook_dudes_dead" ); thread autosave_by_name( "overlook_dudes_dead" ); } overlook_to_skylight_autosaves_every_3_dudes() { dudesKilled = 0; level endon( "player_in_skylight_area" ); while( true ) { level waittill( "player_killed_an_enemy" ); dudesKilled++; if ( dudesKilled > 2 ) { thread autosave_by_name( "overlook_timed_autosave" ); dudesKilled = 0; } } } vehicle_paths_then_delete( node ) { if ( !isdefined( self) ) return; self endon( "death" ); self thread vehicle_paths( node ); self waittill( "reached_dynamic_path_end" ); self Delete(); } dialogue_overlook_to_breach() { flag_wait( "ledge_sequence_dialogue_over" ); //Shadow Company HQ Butcher One-Five, rendezvous at the nest and prepare to escort Gold Eagle to the LZ. radio_dialogue( "afcaves_schq_escourtgoldeagle" ); //Captain Price Gold Eagle must be Shepherd! We're running out of time, let's go! radio_dialogue( "afcaves_pri_mustbeshepherd" ); flag_wait( "player_inside_overlook" ); //Strategy nags if ( ( flag( "player_in_skylight_area" ) ) || ( flag( "overlook_dudes_decimated" ) ) ) return; wait( 10 ); if ( ( flag( "player_in_skylight_area" ) ) || ( flag( "overlook_dudes_decimated" ) ) ) return; if( player_has_frags() ) { //Captain Price They're using shields! Throw some frags! level.price dialogue_execute( "afcaves_pri_sheildsthrowfrags" ); if ( ( flag( "player_in_skylight_area" ) ) || ( flag( "overlook_dudes_decimated" ) ) ) return; wait( 10 ); } else if( player_has_flash() ) { //Captain Price They're using shields! Use flash grenades! level.price dialogue_execute( "afcaves_pri_sheildsuseflash" ); if ( ( flag( "player_in_skylight_area" ) ) || ( flag( "overlook_dudes_decimated" ) ) ) return; wait( 10 ); } if ( ( flag( "player_in_skylight_area" ) ) || ( flag( "overlook_dudes_decimated" ) ) ) return; //Captain Price Try to flank them! level.price dialogue_execute( "afcaves_pri_trytoflank" ); if ( ( flag( "player_in_skylight_area" ) ) || ( flag( "overlook_dudes_decimated" ) ) ) return; wait( 10 ); if ( ( flag( "player_in_skylight_area" ) ) || ( flag( "overlook_dudes_decimated" ) ) ) return; //Captain Price Soap! Hit them from the sides! level.price dialogue_execute( "afcaves_pri_hitfromsides" ); if ( ( flag( "player_in_skylight_area" ) ) || ( flag( "overlook_dudes_decimated" ) ) ) return; wait( 10 ); if ( ( flag( "player_in_skylight_area" ) ) || ( flag( "overlook_dudes_decimated" ) ) ) return; //Captain Price Try to flank and hit them from the sides! level.price dialogue_execute( "afcaves_pri_flankandhitsides" ); //flag_wait( "unload_overlook_dudes" ); //radio_dialogue( "afcaves_sc5_rapellingin" ); // SRS we play this earlier now per steve. maybe check a flag to see if we weren't able to play it earlier? //Shepherd Backup priority items and burn the rest. Fire teams - just delay 'em until we're ready to pull out. //radio_dialogue( "afcaves_shp_burntherest" ); } player_has_frags() { if ( level.player GetWeaponAmmoStock( "fraggrenade" ) > 0 ) return true; else return false; } player_has_flash() { if ( level.player GetWeaponAmmoStock( "flash_grenade" ) > 0 ) return true; else return false; } dialougue_nag_smokefight() { while ( !flag( "player_in_skylight_area" ) ) wait( 3 ); thread autosave_by_name( "skylight" ); //Captain Price The're using thermal through the smoke! level.price dialogue_execute( "afcaves_pri_usingthermal" ); //Captain Price Soap! They're digging in, Shepherd must be close! We have to break through! level.price dialogue_execute( "afcaves_pri_moveright" ); flag_set( "price_has_given_flank_hint" ); wait( 5 ); if ( ( flag( "player_going_around_skylight_flank" ) ) || ( flag( "player_on_other_side_skylight" ) ) || ( flag( "player_approaching_breach" ) ) ) { flag_set( "stop_smoke" ); return; } skylight_flanker = GetEnt( "skylight_flanker", "script_noteworthy" ); skylight_flanker notify( "trigger", level.player ); if ( flag( "can_talk" ) ) { flag_clear( "can_talk" ); //Captain Price I'll draw their fire through the smoke! Watch for flanking routes! level.price dialogue_execute( "afcaves_pri_drawfire" ); flag_set( "can_talk" ); } wait( 15 ); if ( ( flag( "player_going_around_skylight_flank" ) ) || ( flag( "player_on_other_side_skylight" ) ) || ( flag( "player_approaching_breach" ) ) ) { flag_set( "stop_smoke" ); return; } if ( flag( "can_talk" ) ) { flag_clear( "can_talk" ); //Captain Price Switching to thermal! Keep an eye on our flanks! level.price dialogue_execute( "afcaves_pri_switchingtotherm" ); flag_set( "can_talk" ); } } AI_overlook_heli_fastropers_think() { //called from spawn func self endon( "death" ); self.ignoreme = true; self waittill( "jumpedout" ); self.ignoreme = false; } AI_think( guy ) { if ( guy.team == "axis" ) guy thread AI_axis_death_think(); } AI_axis_death_think() { self waittill( "death", attacker ); if ( ( isdefined( attacker ) ) && ( isplayer( attacker ) ) ) level notify( "player_killed_an_enemy" ); if ( ( isdefined( self.script_deathflag ) ) && ( self.script_deathflag == "overlook_dudes_dead" ) ) { level.overlookDudesDead++; if ( level.overlookDudesDead > 4 ) { flag_set( "overlook_dudes_decimated" ); } } } AI_skylight_heli_fastropers_think() { //called from spawn func self endon( "death" ); self.ignoreme = true; self waittill( "jumpedout" ); self.ignoreme = false; if ( self.code_classname == "actor_enemy_riotshield" ) { self riotshield_sprint_on(); wait( RandomFloatRange( 4.8, 5.2 ) ); self riotshield_sprint_off(); } } AI_riotshield_flanker_think( longSprint ) { self endon( "death" ); self.useChokePoints = false; //self.goalradius = 128; //self.script_moveoverride = 1; if ( self.code_classname == "actor_enemy_riotshield" ) { self riotshield_sprint_on(); wait( RandomFloatRange( 4.8, 5.2 ) ); if ( IsDefined( longSprint ) ) { wait( RandomFloatRange( 7, 8 ) ); } self riotshield_sprint_off(); } } AI_shotgun_flanker_think() { self endon( "death" ); self.goalradius = 64; } blackhawk_overlook_rappel_think() { /*----------------------- OVERLOOK HELI -------------------------*/ blackhawk_overlook_rappel = spawn_vehicle_from_targetname_and_drive( "blackhawk_overlook_rappel" ); blackhawk_overlook_rappel endon( "death" ); /*----------------------- OVERLOOK HELI FASTROPERS -------------------------*/ flag_wait( "player_inside_overlook" ); flag_set( "unload_overlook_dudes" ); /*----------------------- OTHER AMBIENT BLACKHAWK -------------------------*/ blackhawk_overlook_01 = spawn_vehicle_from_targetname_and_drive( "blackhawk_overlook_01" ); /*----------------------- OVERLOOK HELI FASTROPERS -------------------------*/ //heli takes off blackhawk_overlook_rappel waittill( "unloaded" ); wait( 5 ); if ( isdefined( blackhawk_overlook_rappel ) ) { overlook_heli_depart = getstruct( "overlook_heli_depart", "targetname" ); blackhawk_overlook_rappel thread vehicle_paths_then_delete( overlook_heli_depart ); } } /**************************************************************************** BREACH CONTROL ROOM ****************************************************************************/ AA_breach_init() { thread AAA_sequence_breach_to_airstrip(); thread breach_room_tvs(); thread controlroom_sheppard_close_the_door(); thread controlroom_breach_destruction(); thread music_control_room(); thread obj_breach(); thread obj_door_controls(); thread obj_escape(); thread leftover_skylight_enemies_seek_player(); thread dialogue_breach_to_airstrip(); thread breach_nags(); flag_wait( "obj_escape_complete" ); thread AA_airstrip_init(); } breach_room_tvs() { flag_wait( "obj_door_controls_given" ); CinematicInGame( "afcaves_countdown_hires" ); } leftover_skylight_enemies_seek_player() { level endon( "skylight_dudes_dead" ); flag_wait( "player_enter_skylight" ); flag_wait_either( "player_on_other_side_skylight", "player_has_flanked_skylight" ); aAI = GetAIArray( "axis" ); array_thread( aAI,::leftover_skylight_enemies_think ); } leftover_skylight_enemies_think() { self endon( "death" ); volume_skylight_defend = getent( "volume_skylight_defend", "targetname" ); volume_skylight_breach_hall = getent( "volume_skylight_breach_hall", "targetname" ); //track the player when he is in their volume, otherwise, fight from the smoke volume while( true ) { wait( 1 ); if ( ( level.player istouching( volume_skylight_defend ) ) || ( level.player istouching( volume_skylight_breach_hall ) ) ) { self thread AI_player_seek(); level.price.baseaccuracy = 50; } else { self notify( "stop_seeking" ); self SetGoalPos( self.origin ); self SetGoalVolumeAuto( volume_skylight_defend ); self.goalradius = 2048; level.price.baseaccuracy = 2; } } } AAA_sequence_breach_to_airstrip() { level endon( "mission failed" ); flag_wait_either( "player_right_near_breach", "skylight_dudes_dead" ); thread autosave_by_name( "breach" ); flag_set( "stop_smoke" ); flag_set( "obj_overlook_to_skylight_complete" ); /*----------------------- SKYLIGHT - MAKE ALL IN SKYLIGHT SEEK THE PLAYER -------------------------*/ breach_safe_volume = GetEnt( "breach_safe_volume", "targetname" ); aAI = breach_safe_volume get_ai_touching_volume( "axis" ); array_thread( aAI, ::AI_player_seek ); /*----------------------- PRICE HEADS TOWARDS BREACH -------------------------*/ triggersEnable( "skylight_finished_colornodes", "script_noteworthy", true ); activate_trigger_with_noteworthy( "skylight_finished_colornodes" ); /*------------------------ GUY CLOSES BREACH DOOR -------------------------*/ flag_wait( "breach_door_closed" ); level.slomoBasevision = "af_caves_indoors_breachroom"; level.price.fixednodesaferadius = 64; level.fixednodesaferadius_default = undefined; triggersEnable( "colornodes_backhalf_breach_start", "script_noteworthy", true ); activate_trigger_with_noteworthy( "colornodes_backhalf_breach_start" ); /*----------------------- SETUP ROOM -------------------------*/ c4_packs = GetEntArray( "c4barrelPacks", "targetname" ); array_thread( c4_packs, ::c4_packs_think ); flag_wait( "control_room_getting_breached" ); aAI = getaiarray( "axis" ); array_thread( aAI,::breach_enemies_think ); flag_wait( "control_room_breached" ); level.player SetMoveSpeedScale( 1 ); //control_room_runners = array_spawn( getentarray( "control_room_runners", "targetname" ), true ); //array_thread( control_room_runners,::control_room_runners_think ); thread c4_barrels(); thread control_room_cleared_monitor(); /*----------------------- AUTO DOOR CLOSES -------------------------*/ exitdoor_left = make_door_from_prefab( "exitdoor_left" ); exitdoor_right = make_door_from_prefab( "exitdoor_right" ); exitdoor_left.openangles = 90; exitdoor_right.openangles = -90; exitdoor_left.closeangles = -90; exitdoor_right.closeangles = 90; exitdoor_left thread control_door_close( "left" ); exitdoor_right thread control_door_close( "right", "control_room_doors_closed" ); flag_wait( "control_room_cleared" ); thread price_control_room_think(); /*----------------------- KEYBOARD OBJECTIVE -------------------------*/ flag_wait( "obj_door_controls_given" ); thread escape_timer_invisible( 20 ); keyboards = GetEntArray( "keyboard", "targetname" ); array_thread( keyboards, ::keyboard_think ); flag_wait( "keyboard_activated" ); exitdoor_left thread control_door_open( "left" ); exitdoor_right thread control_door_open( "right" ); flag_set( "control_room_door_opened" ); /*----------------------- PRE-EXPLOSION -------------------------*/ flag_wait( "player_approaching_exit_to_airstrip" ); thread pre_self_destruct_explosions(); node_price_escape_final = GetNode( "node_price_escape_final", "targetname" ); level.price SetGoalNode( node_price_escape_final ); /*----------------------- PLAYER ESCAPED -------------------------*/ flag_wait( "player_touching_cave_exit" ); wait( .3 ); kill_timer(); flag_set( "player_escaped" ); } breach_enemies_think() { self endon( "death" ); wait( .5 ); self.health = 1; //only have extra guys on vet if ( level.gameskill < 3 ) { if ( ( isdefined( self.script_noteworthy ) ) && ( self.script_noteworthy == "veteran" ) ) { self delete(); } } while( true ) { self waittill( "damage", amount, attacker, direction_vec, point, type ); if ( ( isdefined( attacker ) ) && ( isplayer( attacker ) ) ) self kill(); } } price_control_room_think() { flag_wait( "control_room_cleared" ); //give price regular baseaccuracy in case it was jacked way up during skylight fight level.price.baseaccuracy = 2; thread autosave_now(); level.price cqb_walk( "off" ); level.price.neverEnableCQB = true; level.price PushPlayer( true ); price_computer_node = getent( "price_computer_node", "targetname" ); price_computer_node anim_reach_solo( level.price, "laptop_stand_idle_start" ); thread price_keyboard_anim(); //triggersEnable( "colornodes_backhalf_door_control", "script_noteworthy", true ); //activate_trigger_with_noteworthy( "colornodes_backhalf_door_control" ); level.price thread keyboard_sounds(); flag_wait( "control_room_door_opened" ); /*----------------------- DOOR OPENED, PRICE TAKES OFF -------------------------*/ level.price disable_ai_color(); price_computer_node notify( "stop_idle" ); level.price anim_stopanimscripted(); node_price_escape_cover = GetNode( "node_price_escape_cover", "targetname" ); level.price SetGoalNode( node_price_escape_cover ); } price_keyboard_anim() { price_computer_node = getent( "price_computer_node", "targetname" ); level.price endon( "stop_loop" ); while( !flag( "control_room_door_opened" ) ) { price_computer_node thread anim_loop_solo( level.price, "laptop_stand_idle", "stop_idle" ); level.price waittill( "nag_anim" ); price_computer_node notify( "stop_idle" ); price_computer_node anim_single_solo( level.price, "laptop_stand_yell" ); } } keyboard_sounds() { org = spawn( "script_origin", self.origin + ( 0, 0, 32 ) ); org thread delete_on_flag( "control_room_door_opened" ); org endon( "death" ); level endon( "control_room_door_opened" ); while( true ) { self waittillmatch( "looping anim", "end" ); org playsound( "scn_afcaves_enter_code_typing" ); } } delete_on_flag( sFlag ) { self endon( "death" ); flag_wait( sFlag ); self StopSounds(); wait( .1 ); self delete(); } control_room_cleared_monitor() { flag_wait( "breach_room_guys_dead" ); flag_set( "control_room_cleared" ); } //control_room_runners_think() //{ // self endon( "death" ); // self.health = 1; // self.disablelongdeath = 1; // self.ignoreme = true; // self.ignoreall = true; // self.goalradius = 64; // self cqb_walk( "off" ); // self.neverEnableCQB = true; // flag_wait( "control_room_cleared" ); // // control_room_volume = getent( "control_room_volume", "script_noteworthy" ); // if ( !self istouching( control_room_volume ) ) // { // self.diequietly = true; // self kill(); // } // else // { // self.ignoreme = false; // self.ignoreall = false; // // } // aAI_to_delete = []; // aAI_to_delete[ 0 ] = self; // thread AI_delete_when_out_of_sight( aAI_to_delete, 256 ); // wait( 2 ); // self setgoalpos( self.origin ); //} pre_self_destruct_explosions() { level notify ( "pre_explosion_happening" ); timesLooped = 0; while( true ) { thread exploder( "escape_tunnel_pre_explosion" ); thread play_sound_in_space( "af_caves_selfdestruct", level.player.origin ); level.player PlayRumbleOnEntity( "damage_heavy" ); if ( flag( "player_touching_cave_exit" ) ) break; timesLooped++; if ( timesLooped > 6 ) { level thread mission_failed_out_of_time(); break; } if ( timesLooped == 1 ) { Earthquake( .2, 1.75, level.player.origin, 1000 ); wait( 1 ); } else if ( timesLooped == 2 ) { Earthquake( .3, 1.75, level.player.origin, 1000 ); wait( 1.5 ); } else if ( timeslooped == 5 ) { exploder( "control_room_detonate" ); Earthquake( .3, 1.75, level.player.origin, 1000 ); wait( 1 ); } else { Earthquake( .4, 1.75, level.player.origin, 1000 ); wait( .75 ); } } } keyboard_think() { self glow(); self MakeUsable(); // Hold ^3&&1^7 to override the door lock. self SetHintString( &"AF_CAVES_USE_KEYBOARD" ); self waittill( "trigger" ); //self thread play_sound_in_space( "scn_afcaves_enter_code_typing" ); keyboards = GetEntArray( "keyboard", "targetname" ); array_notify( keyboards, "trigger" ); self MakeUnusable(); self stopGlow(); if ( !flag( "keyboard_activated" ) ) flag_set( "keyboard_activated" ); } dialogue_breach_to_airstrip() { flag_wait( "obj_overlook_to_skylight_complete" ); flag_set( "obj_breach_given" ); wait( randomfloatrange( 1, 1.25 ) ); if ( !flag( "control_room_breached" ) ) { //Shadow Company 6 Oxide, Butcher Five-Actual. I've got a severed det cord - we're gonna need ten mikes to get the trunk rigged and the EBC primed, over. radio_dialogue( "afcaves_sc6_severeddet" ); } if ( !flag( "control_room_getting_breached" ) ) { //Shadow Company HQ Negative, Gold Eagle wants those charges hot in less than three mikes. Get it done, out. radio_dialogue( "afcaves_schq_chargeshot" ); } flag_set( "start_breach_nags" ); flag_wait( "control_room_cleared" ); //flag_wait( "control_room_runners_dead" ); wait( 1 ); //Shepherd All units be advised this is Gold Eagle. The site has been compromised. radio_dialogue( "afcaves_shp_sitecompromised" ); //Shepherd I am executing directive one-one-six bravo. If you're still inside, your service will be honored. Shepherd out. echoing P.A. announcement radio_dialogue( "afcaves_shp_directive116" ); control_room_volume = getent( "control_room_volume", "script_noteworthy" ); if ( level.player istouching( control_room_volume ) ) { thread autosave_by_name( "timer_start" ); } //Captain Price Overide the door controls! Hurry! level.price dialogue_execute( "afcaves_pri_overridecontrol" ); level.price notify( "nag_anim" ); flag_set( "obj_door_controls_given" ); thread dialogue_nag_control_room_door(); flag_wait( "control_room_door_opened" ); wait( 2 ); //Captain Price RUUNN!!! level.price dialogue_execute( "afcaves_pri_run" ); flag_set( "obj_escape_given" ); wait( .5 ); if ( !flag( "player_touching_cave_exit" ) ) { //Captain Price Keep moving! This place is gonna blow!! level.price dialogue_execute( "afcaves_pri_gonnablow" ); } } breach_nags() { level endon( "control_room_getting_breached" ); level endon( "control_room_breached" ); level endon( "control_room_cleared" ); flag_wait( "breach_door_closed" ); flag_wait( "start_breach_nags" ); wait( 1 ); iNagNumber = 0; while( true ) { level.price dialogue_execute( "breach_nag_0" + iNagNumber ); iNagNumber++; if ( iNagNumber > 3 ) iNagNumber = 0; wait( randomfloatrange( 10, 15 ) ); } } control_door_open( side, sFlagToSet ) { angles = self.openangles; time = 4; self RotateTo( self.angles + ( 0, angles, 0 ), 4, 1.5, 1.5 ); self thread play_sound_on_entity( "af_caves_escape_door_open" ); wait( time ); if ( IsDefined( sFlagToSet ) ) flag_set( sFlagToSet ); } control_door_close( side, sFlagToSet ) { angles = self.closeangles; time = 7; self RotateTo( self.angles + ( 0, angles, 0 ), time, .5, .5 ); wait( time - 1 ); if ( side == "left" ) self thread play_sound_on_entity( "af_caves_escape_door_close" ); if ( IsDefined( sFlagToSet ) ) flag_set( sFlagToSet ); } dialogue_nag_control_room_door() { price_computer_node = getent( "price_computer_node", "targetname" ); level.player endon( "death" ); while ( true ) { wait( 6 ); if ( flag( "control_room_door_opened" ) ) break; //Captain Price Override the door controls! Use the keyboard! level.price dialogue_execute( "afcaves_pri_usekeyboard" ); level.price notify( "nag_anim" ); wait( 6 ); if ( flag( "control_room_door_opened" ) ) break; level.price notify( "nag_anim" ); //Price Open the door! We're running out of time! level.price dialogue_execute( "afcaves_pri_openthedoor" ); wait( 6 ); if ( flag( "control_room_door_opened" ) ) break; level.price notify( "nag_anim" ); //Price Come onnn...come onnn... level.price dialogue_execute( "afcaves_pri_comeoncomeon" ); wait( 6 ); if ( flag( "control_room_door_opened" ) ) break; level.price notify( "nag_anim" ); //Captain Price Soap! Get that door open! level.price dialogue_execute( "afcaves_pri_getdooropen" ); } } music_control_room() { //level endon( "end_cave_collapse" ); flag_wait( "control_room_explosion" ); MusicStop(); time = musicLength( "af_caves_controlroom" ); flag_wait( "control_room_cleared" ); while ( true ) { MusicPlayWrapper( "af_caves_controlroom" ); wait( time ); //wait( 279 ); music_stop( 1 ); wait( 1.1 ); } } controlroom_sheppard_close_the_door() { /*----------------------- BREACH SETUP -------------------------*/ icon_trigger = GetEnt( "trigger_breach_icon", "targetname" ); icon_trigger trigger_off(); wait( 2 ); //hide the breach door model for now breach_door = level.breach_doors[ 2 ]; breach_door Hide(); breach_path_clip = GetEnt( "breach_solid", "targetname" ); breach_path_clip NotSolid(); breach_path_clip ConnectPaths(); old_door = GetEnt( "blast_door_slam", "targetname" );// this is the wood door old_door.origin = breach_door.origin; startAngles = old_door.angles; old_door.angles += ( 0, -74, 0 ); /*----------------------- GUY CLOSES BREACH DOOR -------------------------*/ flag_wait( "player_approaching_breach" ); guy = spawn_targetname( "control_room_door_close_guy", true ); guy set_ignoreme( true ); guy set_ignoreall( true ); guy thread magic_bullet_shield(); node = GetNode( "sheppard_door_peek", "targetname" ); node anim_generic_reach( guy, "alert2look_cornerR" ); node anim_generic( guy, "alert2look_cornerR" ); flag_set( "breach_door_closed" ); old_door RotateYaw( 74, .50 ); old_door thread play_sound_in_space( "scn_afcaves_doorslam_brace", old_door.origin ); breach_path_clip Solid(); breach_path_clip DisconnectPaths(); wait( .66 ); old_door Hide(); old_door NotSolid(); breach_door Show(); wait .5; icon_trigger trigger_on(); if ( IsDefined( guy ) ) { guy stop_magic_bullet_shield(); guy Delete(); } } controlroom_breach_destruction() { level waittill( "A door in breach group 1 has been activated." ); level notify( "breach_activated" ); flag_set( "control_room_getting_breached" ); wait( 2.3 ); flag_set( "control_room_explosion" ); wait( .7 ); flag_set( "control_room_breached" ); } controlroom_guys_think()// making the guys in the rear wait till the slowmo has ended before they shoot. { self endon( "death" ); self.dontEverShoot = true; level waittill( "A door in breach group 1 has been activated." ); wait 12; self.dontEverShoot = undefined; } /**************************************************************************** AIRSTRIP ****************************************************************************/ AA_airstrip_init() { thread AAA_sequence_airstrip(); thread airstip_owned_enemies(); thread airstrip_damage_state(); thread dialogue_airstrip(); thread airstrip_tower_destruction(); thread tower_explosion(); thread music_airstrip(); thread obj_level_end(); } tower_explosion() { flag_wait( "tower_explosion" ); trig = GetEnt( "tower_trigger", "targetname" ); trig notify( "trigger" ); } airstip_owned_enemies() { flag_wait( "danger_close_dialogue_end" ); wait( 2 ); airstrip_runners = GetEntArray( "airstrip_runners", "targetname" ); array_spawn( airstrip_runners, true ); flag_wait( "danger_close_last_missile_has_hit" ); ambient_airstrip = GetEntArray( "ambient_airstrip", "targetname" ); array_spawn( ambient_airstrip, true ); } airstrip_damage_state() { camo_right_damaged = getentarray( "camo_right_damaged", "targetname" ); camo_left_damaged = getentarray( "camo_left_damaged", "targetname" ); camo_right_pristine = getentarray( "camo_right_pristine", "targetname" ); camo_left_pristine = getentarray( "camo_left_pristine", "targetname" ); flag_wait( "danger_close_last_missile_has_hit" ); array_thread( camo_right_pristine, ::hide_entity ); array_thread( camo_left_pristine, ::hide_entity ); array_thread( camo_right_damaged, ::show_entity ); array_thread( camo_left_damaged, ::show_entity ); } AAA_sequence_airstrip() { flag_wait( "obj_escape_complete" ); battlechatter_off( "allies" ); /*----------------------- CAVE COLLAPSE AND PLAYER SHELLSHOCK -------------------------*/ //exploder( "control_room_detonate" ); //wait( 1 ); level.player PlayLocalSound( "af_caves_selfdestruct" ); cave_exit_playerview_02 = GetEnt( "cave_exit_playerview_02", "targetname" ); cave_exit_playerview_01 = GetEnt( "cave_exit_playerview_01", "targetname" ); dummy = spawn_tag_origin(); dummy.origin = level.player.origin; dummy.angles = cave_exit_playerview_01.angles; PlayFXOnTag( getfx( "cave_explosion_exit" ), dummy, "tag_origin" ); Earthquake( 1, 1, level.player.origin, 100 ); level notify( "player_invulnerable" ); zoffset = ( 0, 0, 10 ); playerOrg = spawn_tag_origin(); playerOrg.origin = level.player.origin + zoffset; playerOrg.angles = cave_exit_playerview_01.angles + ( 0, -10, 70 ); level.player PlayerLinkToBlend( playerOrg, "tag_player", 1 ); level.player AllowSprint( false ); level.player DisableWeapons(); level.player setMoveSpeedScale( .2 ); level.player enableinvulnerability(); wait( .5 ); PlayFXOnTag( getfx( "player_cave_escape" ), dummy, "tag_origin" ); wait( .5 ); /*----------------------- FIRST CUT TO BLACKOUT -------------------------*/ level.black_overlay = create_client_overlay( "black", 1 ); level.black_overlay.foreground = false; array_thread( level.fx_start_to_ledge, ::pauseEffect ); array_thread( level.fx_ledge_to_airstrip, ::pauseEffect ); level.price.IgnoreRandomBulletDamage = true; level.price disable_pain(); level.price.ignoreall = true; level.price PushPlayer( true ); airstrip_danger_close_shooters = array_spawn( getentarray( "airstrip_danger_close_shooters", "targetname" ), true ); array_thread ( airstrip_danger_close_shooters,::airstrip_danger_close_shooters_think ); flag_set( "player_detonated_explosives" ); // turn off the barrels below //level.player PlayerLinkToDelta( playerOrg, "tag_player", 1, 0, 20, 10, 10 ); shellshockTime = 17; level.player ShellShock( "af_cave_collapse", shellshockTime ); thread autosave_now( true ); level.player AllowStand( false ); level.player AllowProne( false ); level.player AllowSprint( false ); level.player AllowJump( false ); level.player AllowCrouch( true ); SetBlur( 2, .1 ); SetSavedDvar( "ui_hidemap", 1 ); SetSavedDvar( "hud_showStance", "0" ); //SetSavedDvar( "compass", "1" ); thread airstrip_heli_crash_destruction(); /*----------------------- BLOCK EXIT -------------------------*/ rock_rubble1 = GetEnt( "rock_rubble1", "targetname" ); rock_rubble1 Solid(); rock_rubble1 Show(); rock_rubble1 DisconnectPaths(); /*----------------------- PRICE RUNS FORWARD -------------------------*/ level.price.moveplaybackrate = .5; SetSavedDvar( "g_friendlyNameDist", 0 ); //price_fallforward = GetEnt( "price_fallforward", "targetname" ); //price_fallforward anim_first_frame_solo( level.price, price_fallforward.animation ); price_fighting_cave_exit = GetEnt( "price_fighting_cave_exit", "targetname" ); price_fighting_cave_exit anim_first_frame_solo( level.price, price_fighting_cave_exit.animation ); wait( .1 ); dummy Delete(); wait( 2 ); playerOrg.origin = cave_exit_playerview_01.origin; level.player unlink(); level.player.origin = playerOrg.origin; level.player SetOrigin( playerOrg.origin ); level.player PlayerLinkToBlend( playerOrg, "tag_player", 1 ); flag_set( "danger_close_dialogue_start" ); wait( 1 ); /*----------------------- FIRST BLACKOUT FADE UP -------------------------*/ level.black_overlay FadeOverTime( 2 ); level.black_overlay.alpha = 0; wait( 1 ); //price_fallforward thread anim_custom_animmode_solo( level.price, "gravity", price_fallforward.animation ); price_fighting_cave_exit thread anim_custom_animmode_solo( level.price, "gravity", price_fighting_cave_exit.animation ); //wait( 0.05 ); //level.price SetAnimTime( level.scr_anim[ "price" ][ price_fallforward.animation ], .6 ); //node_price_fallforward = GetNode( "node_price_fallforward", "targetname" ); level.price disable_ai_color(); level.price cqb_walk( "off" ); level.price.neverEnableCQB = true; //level.price SetGoalNode( node_price_fallforward ); wait( 2.5 ); SetBlur( .2, 1.5 ); wait( 1 ); playerOrg RotateTo( playerOrg.angles + ( 40, 0, -70 ), 12, 5, 5 ); SetBlur( 2, 1.5 ); wait( 1.5 ); SetBlur( .2, 1 ); thread exploder( "under_fire_2" ); wait( 1 ); thread exploder( "under_fire" ); SetBlur( 3, 1 ); wait( 2 ); /*----------------------- BLACKOUT BEGIN -------------------------*/ level.black_overlay FadeOverTime( 2 ); level.black_overlay.alpha = 1; SetBlur( 3, .5 ); //flag_set( "danger_close_dialogue_start" ); wait( 2 ); level.player Unlink(); level.player SetOrigin( cave_exit_playerview_01.origin ); level.player SetPlayerAngles( cave_exit_playerview_01.angles ); level.player FreezeControls( true ); level.player AllowStand( true ); level.player AllowSprint( true ); level.player AllowJump( true ); level.player AllowCrouch( true ); level.player AllowProne( true ); //level.player SetStance( "stand" ); /*----------------------- SETUP PRICE FALLING BACK -------------------------*/ price_fallback = GetEnt( "price_fallback", "targetname" ); level.price anim_stopanimscripted(); price_fallback anim_first_frame_solo( level.price, "launchfacility_a_c4_plant_short" ); flag_wait( "danger_close_dialogue_end" ); wait( 1.5 ); /*----------------------- PRICE RUNS BACKWARDS -------------------------*/ flag_set_delayed( "price_falling_back", .1 ); price_fallback thread anim_custom_animmode_solo( level.price, "gravity", "launchfacility_a_c4_plant_short" ); //level.price SetAnimTime( level.scr_anim[ "price" ][ price_fallback.animation ], .2 ); node_price_fallback = GetNode( "node_price_fallback", "targetname" ); level.price SetGoalNode( node_price_fallback ); level.price.goalradius = 32; wait( .5 ); /*----------------------- BLACKOUT END -------------------------*/ level.black_overlay FadeOverTime( 2 ); level.black_overlay.alpha = 0; wait( 1 ); SetBlur( 0, 3 ); level.player FreezeControls( false ); /*----------------------- DANGER CLOSE MOMENT -------------------------*/ thread danger_close_firestorm(); wait( 1 ); SetSavedDvar( "ui_hidemap", 0 ); SetSavedDvar( "hud_showStance", "1" ); wait( 1 ); SetSavedDvar( "g_friendlyNameDist", 15000 ); level.price.moveplaybackrate = 1.0; level.player setMoveSpeedScale( 1 ); //thread danger_close_firestorm(); wait( 3 ); level.player EnableWeapons(); level.player disableinvulnerability(); /*----------------------- PRICE LEADS PLAYER OUT -------------------------*/ wait( 3 ); level.price.IgnoreRandomBulletDamage = false; level.price enable_pain(); level.price.ignoreall = false; level.price cqb_walk( "off" ); level.price.neverEnableCQB = true; level.price enable_ai_color(); level.price.fixednodesaferadius = 0; level.fixednodesaferadius_default = 0; triggersEnable( "colornodes_backhalf_airstrip_start", "script_noteworthy", true ); activate_trigger_with_noteworthy( "colornodes_backhalf_airstrip_start" ); triggersEnable( "colornodes_backhalf_airstrip", "script_noteworthy", true ); /*----------------------- AIRSTRIP START -------------------------*/ thread spawn_vehicles_from_targetname_and_drive_on_flag( "littlebird_airstrip", "player_airstrip_start" ); delayThread( 1, ::spawn_vehicle_from_targetname_and_drive, "blackhawk_airstrip" ); flag_wait( "player_airstrip_start" ); level.price PushPlayer( false ); /*----------------------- AIRSTRIP MIDPOINT -------------------------*/ flag_wait( "player_airstrip_midpoint" ); thread autosave_by_name( "airstrip_fight_start" ); level.price.fixednodesaferadius = 1024; level.fixednodesaferadius_default = 1024; /*----------------------- AIRSTRIP END TENT -------------------------*/ flag_wait( "player_approaching_end_tent" ); thread autosave_by_name( "airstrip_fight_start" ); flag_wait( "player_entering_end_tent" ); /*----------------------- LEVEL END -------------------------*/ flag_wait( "level_exit" ); level.price.IgnoreRandomBulletDamage = true; level.price disable_pain(); level.price set_ignoreme( true ); level.price set_ignoreall( false ); level.player enableinvulnerability(); level.player.ignoreme = true; level.black_overlay FadeOverTime( 3 ); level.black_overlay.alpha = 1; //delaythread( 3,::freeze_player_at_end ); //Captain Price Shepherd mentioned Zodiacs...there must riveracess nearby - let's go! level.price dialogue_execute( "afcaves_pri_rivernearby" ); maps\_loadout::SavePlayerWeaponStatePersistent( "af_caves" ); nextmission(); } freeze_player_at_end() { level.player FreezeControls( true ); } airstrip_danger_close_shooters_think() { self endon( "death" ); self.grenadeammo = 0; while( !flag( "danger_close_last_missile_has_hit" ) ) { self.goalradius = 32; wait( .1 ); } flag_wait( "danger_close_last_missile_has_hit" ); self kill(); } blackhawk_airstrip_think() { self endon( "death" ); //self.enableRocketDeath = true; self thread blackhawk_airstrip_crash_locations(); flag_set( "unload_airstrip_blackhawk_dudes" ); self waittill( "unloaded" ); blackhawk_airstrip_heli_depart = getstruct( "blackhawk_airstrip_heli_depart", "targetname" ); self thread vehicle_paths( blackhawk_airstrip_heli_depart ); self Vehicle_SetSpeed( 50 ); self waittill( "reached_dynamic_path_end" ); self Delete(); } blackhawk_airstrip_crash_locations() { self endon( "death" ); blackhawk_crash_locs = getentarray( "blackhawk_crash_loc", "script_noteworthy" ); while( true ) { self.perferred_crash_location = getClosest( self.origin, blackhawk_crash_locs ); wait( 1 ); } } AI_airstrip_runners_think() { self endon( "death" ); self.ignoreme = true; self.ignoreall = true; flag_wait( "danger_close_last_missile_has_hit" ); self DoDamage( self.health + 1000, self.origin ); } littlebird_airstrip_think() { self endon( "death" ); self.enableRocketDeath = true; self waittill( "unloaded" ); self Vehicle_SetSpeed( 10 ); self thread vehicle_liftoff( 32 ); wait( 2 ); self Vehicle_SetSpeed( 50 ); airstrip_littlebird_01_depart = getstruct( "airstrip_littlebird_01_depart", "targetname" ); self thread vehicle_paths( airstrip_littlebird_01_depart ); self waittill( "reached_dynamic_path_end" ); self Delete(); } AI_airstrip_heli_fastropers_think() { self endon( "death" ); self cqb_walk( "on" ); self.ignoreme = true; self waittill( "jumpedout" ); self.ignoreme = false; } AI_airstrip_littlebird_hostiles_think() { self endon( "death" ); self cqb_walk( "on" ); self.ignoreme = true; self waittill( "jumpedout" ); self.ignoreme = false; //self thread AI_player_seek(); } danger_close_firestorm() { missileOrgs = GetEntArray( "missileOrgs", "targetname" ); missileOrgs = get_array_of_farthest( level.player.origin, missileOrgs ); lastMissile = undefined; i = 0; foreach ( missileOrg in missileOrgs ) { i++; targetOrg = GetEnt( missileOrg.target, "targetname" ); missile = MagicBullet( "hellfire_missile_af_caves_end", missileOrg.origin, targetOrg.origin ); missile thread play_sound_on_entity( "scn_afcaves_incoming" ); if ( i == missileOrgs.size ) lastMissile = true; missile thread missile_impact_think( lastMissile ); wait( .2 ); } wait( 2 ); flag_set( "start_airstrip_aftermath_fx" ); wait( 2 ); flag_set( "danger_close_moment_over" ); //array_thread( level.createfxent, ::restartEffect ); } missile_impact_think( lastMissile ) { dummy = Spawn( "script_origin", self.origin ); dummy LinkTo( self ); self waittill( "death" ); //scale duration if ( IsDefined( lastMissile ) ) { flag_set( "danger_close_last_missile_has_hit" ); dummy thread play_sound_in_space( "exp_javelin_armor_destroy" ); Earthquake( .5, 1.5, level.player.origin, 5000 ); //thread exploder( "escape_cave_exit" ); thread exploder( "rpg_damage" ); RadiusDamage( dummy.origin, 512, 1000, 1000 ); } else { Earthquake( .2, 2.5, level.player.origin, 5000 ); } level.player PlayRumbleOnEntity( "damage_heavy" ); //RadiusDamage( dummy.origin, 512, 1000, 1000 ); wait( 0.05 ); dummy Delete(); if ( IsDefined( lastMissile ) ) { SetBlur( 3, .1 ); wait( 1 ); SetBlur( 0, 3 ); } } dialogue_airstrip() { flag_wait( "obj_escape_complete" ); /*----------------------- DANGER CLOSE DIALOGUE -------------------------*/ flag_wait( "danger_close_dialogue_start" ); //Shepherd Excalibur, this is Gold Eagle. Fire mission - target package Romeo - danger close. radio_dialogue( "afcaves_shp_dangerclose" ); //Shadow Company HQ That's within a hundred meters of your position sir! radio_dialogue( "afcaves_schq_100meters" ); flag_set( "danger_close_dialogue_end" ); //Shepherd That's not a suggestion! Send it! radio_dialogue( "afcaves_shp_sendit" ); //Shadow Company HQ Roger, fire mission danger close! thread radio_dialogue( "afcaves_schq_firemissionclose" ); flag_wait( "price_falling_back" ); //Captain Price Soaap!! Incomiiing!!! Get down! Get down! level.price thread dialogue_execute( "afcaves_pri_fallback2" ); /*----------------------- LEVEL END DIALOGUE -------------------------*/ flag_wait( "danger_close_moment_over" ); //Captain Price Since when does Shepherd care about danger close... level.price dialogue_execute( "afcaves_pri_sincewhen" ); thread autosave_by_name( "airstrip_fight_start" ); wait( 1.5 ); flag_set( "obj_level_end_given" ); //Captain Price Let's go! Stay close and follow me! level.price dialogue_execute( "afcaves_pri_stayclose" ); battlechatter_on( "allies" ); level.price set_battlechatter( true ); wait( 2 ); if ( !flag( "player_airstrip_start" ) ) { //Captain Price To the west, Soap, Go! level.price thread dialogue_execute( "afcaves_pri_tothewest" ); } flag_wait( "player_airstrip_start" ); //Shadow Company HQ Sir, sandstorm activity is picking up here. It's too risky for flight ops. radio_dialogue( "afcaves_schq_riskyforflightops" ); //Shepherd Understood. Head for the tunnel. We'll take the Zodiacs. stealth wiretap radio_dialogue( "afcaves_shp_takezodiacs" ); //Shadow Company HQ Yes sir! stealth wiretap radio_dialogue( "afcaves_schq_yessir2" ); /*----------------------- AIRSTRIP MIDPOINT -------------------------*/ flag_wait( "player_airstrip_midpoint" ); /*----------------------- AIRSTRIP END TENT -------------------------*/ /*----------------------- LEVEL END DIALOGUE -------------------------*/ flag_wait( "player_entering_end_tent" ); //Captain Price Head for the tunnel! He's getting away! level.price dialogue_execute( "afcaves_pri_gettingaway2" ); wait( 10 ); if ( !flag( "level_exit" ) ) { //Captain Price Soap! Follow me! Let's go! level.price dialogue_execute( "afcaves_pri_followmeletsgo" ); } } music_airstrip() { //musicstop(); } airstrip_tower_destruction() { trig = GetEnt( "tower_trigger", "targetname" ); trig waittill( "trigger" ); RadiusDamage( trig.origin, 256, 1000, 900 ); Earthquake( 0.2, 1, level.player.origin, 1024 ); level.player PlayRumbleOnEntity( "damage_light" ); trig thread play_sound_in_space( "explo_wood_tower", trig.origin ); // exploder( "tower" ); volume = GetEnt( "tower_victims", "targetname" ); mg = GetEnt( "tower_mg", "script_noteworthy" ); owner = mg GetTurretOwner(); if ( IsAlive( owner ) ) owner notify( "stop_using_built_in_burst_fire" ); mg Hide(); volume = GetEnt( "tower_victims", "targetname" ); array_thread( GetCorpseArray(), ::delete_corpse_in_volume, volume ); } littlebird_on_fire() { self endon( "death" ); while ( true ) { playfxOnTag( getfx( "littlebird_fire_trail" ), self, "tag_deathfx" ); wait( .1 ); } } airstrip_heli_crash_destruction() { littlebird_crasher = spawn_vehicle_from_targetname_and_drive( "littlebird_crasher" ); littlebird_crasher.perferred_crash_location = GetEnt( "airstip_crash", "script_noteworthy" ); littlebird_crasher SetLookAtEnt( level.player ); littlebird_crasher godon(); flag_wait( "danger_close_moment_over" ); littlebird_crasher thread littlebird_on_fire(); wait( 2.5 ); littlebird_crasher godoff(); littlebird_crasher notify( "death" ); littlebird_crasher ClearLookAtEnt(); littlebird_crasher waittill( "crash_done" ); exploder( "helicrash_01" ); Earthquake( 0.3, 1, level.player.origin, 1024 ); level.player PlayRumbleOnEntity( "damage_light" ); pristine_netting = GetEntArray( "netting_pristine", "targetname" ); foreach ( nondestroyed_piece in pristine_netting ) { nondestroyed_piece Hide(); } netting_destroyed = GetEntArray( "netting_destroyed", "targetname" ); foreach ( destroyed_piece in netting_destroyed ) { destroyed_piece Show(); } flag_wait( "player_approaching_end_tent" ); } /**************************************************************************** OBJECTIVES ****************************************************************************/ obj_ledge_traverse() { flag_wait( "obj_ledge_traverse_given" ); objective_number = 6; // Traverse the rock bridge Objective_Add( objective_number, "active", &"AF_CAVES_OBJ_LEDGE_TRAVERSE" ); Objective_Current( objective_number ); Objective_OnEntity( objective_number, level.price, ( 0, 0, 70 ) ); // Capt. MacTavish //Objective_SetPointerTextOverride( objective_number, &"OILRIG_OBJ_SOAP" ); flag_wait( "player_ledge_stairs_01" ); Objective_Position( objective_number, ( 0, 0, 0 ) ); obj_position = GetEnt( "obj_ledge_gunners", "targetname" ); Objective_Position( objective_number, obj_position.origin ); //Objective_SetPointerTextOverride( objective_number ); flag_wait( "player_ledge_end" ); Objective_Position( objective_number, ( 0, 0, 0 ) ); Objective_OnEntity( objective_number, level.price, ( 0, 0, 70 ) ); Objective_State( objective_number, "done" ); flag_set( "obj_ledge_traverse_complete" ); } obj_overlook_to_skylight() { flag_wait( "obj_ledge_traverse_complete" ); objective_number = 6; // Locate Shepherd.\n Objective_Add( objective_number, "active", &"AF_CAVES_LOCATE_SHEPHERD" ); Objective_Current( objective_number ); Objective_OnEntity( objective_number, level.price, ( 0, 0, 70 ) ); flag_wait_any( "price_has_given_flank_hint", "obj_overlook_to_skylight_complete" ); Objective_String_NoMessage( objective_number, &"AF_CAVES_OBJ_FLANK_AND_KILL" ); Objective_Position( objective_number, ( 0, 0, 0 ) ); obj_position = GetEnt( "obj_flank_skylight_01", "targetname" ); Objective_Position( objective_number, obj_position.origin ); flag_wait_any( "player_going_around_skylight_flank", "player_on_other_side_skylight", "obj_overlook_to_skylight_complete" ); obj_position = GetEnt( "obj_flank_skylight_02", "targetname" ); Objective_Position( objective_number, obj_position.origin ); flag_wait_any( "skylight_dudes_dead", "player_right_near_breach", "obj_overlook_to_skylight_complete" ); Objective_State( objective_number, "done" ); if ( !flag( "obj_overlook_to_skylight_complete" ) ) flag_set( "obj_overlook_to_skylight_complete" ); } obj_breach() { //"breach the control room" flag_wait( "obj_breach_given" ); objective_number = 6; // Reach Shepherd's Command Center Objective_Add( objective_number, "active", &"AF_CAVES_OBJ_BREACH", ( 0, 0, 0 ) ); breach_positions = GetEntArray( "obj_breach", "targetname" ); // grab the script_slow_breach index off the nearest breach and put it on the entity assign_script_breachgroup_to_ents( breach_positions ); // find out which breaches should be added to the objective positions breach_indices = get_breach_indices_from_ents( breach_positions ); // add positions for these breaches objective_breach( objective_number, breach_indices[ 0 ], breach_indices[ 1 ], breach_indices[ 2 ], breach_indices[ 3 ] ); Objective_Current( objective_number ); flag_wait( "control_room_breached" ); objective_clearAdditionalPositions( objective_number ); flag_wait( "control_room_cleared" ); //flag_wait( "control_room_runners_dead" ); Objective_State( objective_number, "done" ); flag_set( "obj_breach_complete" ); } obj_door_controls() { //"override the door controls" flag_wait( "obj_door_controls_given" ); objective_number = 7; obj_position = GetEnt( "keyboard", "targetname" ); // Override the door controls Objective_Add( objective_number, "active", &"AF_CAVES_OBJ_DOOR_CONTROLS", obj_position.origin ); Objective_Current( objective_number ); flag_wait( "control_room_door_opened" ); Objective_State( objective_number, "done" ); flag_set( "obj_door_controls_complete" ); } obj_escape() { //"escape from the cave" flag_wait( "obj_escape_given" ); objective_number = 8; // Escape from the cave Objective_Add( objective_number, "active", &"AF_CAVES_OBJ_ESCAPE" ); Objective_Current( objective_number ); Objective_OnEntity( objective_number, level.price, ( 0, 0, 70 ) ); flag_wait( "player_escaped" ); Objective_Position( objective_number, ( 0, 0, 0 ) ); Objective_State( objective_number, "done" ); flag_set( "obj_escape_complete" ); } obj_level_end() { //"escape from the cave" flag_wait( "obj_level_end_given" ); objective_number = 6; // Follow Price. Objective_Add( objective_number, "active", &"AF_CAVES_LOCATE_SHEPHERD" ); Objective_Current( objective_number ); Objective_OnEntity( objective_number, level.price, ( 0, 0, 70 ) ); flag_wait( "level_exit" ); flag_set( "obj_level_end_complete" ); } obj_hummer() { //"mount the humvee turret" flag_wait( "obj_hummer_given" ); flag_wait( "obj_hummer_complete" ); } obj_hummer_gunner() { //"eliminate all enemy resistance" flag_wait( "obj_hummer_gunner_given" ); flag_wait( "obj_hummer_gunner_complete" ); } backhalf_dialogue() { /*----------------------- LEDGE -------------------------*/ //****Captain Price The clock's ticking! Let's go! stealth //level.scr_radio[ "afcaves_pri_clocksticking" ] = "afcaves_pri_clocksticking"; //Shadow Company HQ Avatar One this is Oxide, we've lost contact with multiple squads near the steam room. I need a camera sweep of the catwalk, over. stealth wiretap level.scr_radio[ "afcaves_schq_catwalk" ] = "afcaves_schq_catwalk"; //Shadow Company 4 Roger that Oxide, UAV is online. Standby. stealth wiretap level.scr_radio[ "afcaves_sc4_uavonline" ] = "afcaves_sc4_uavonline"; //Captain Price Grab a riot shield...we'll need cover out here. level.scr_radio[ "afcaves_pri_pickupriotsheild" ] = "afcaves_pri_pickupriotsheild"; //Captain Price Take point with the riot shield. I'll take care of any resistance. stealth level.scr_radio[ "afcaves_pri_takepoint2" ] = "afcaves_pri_takepoint2"; //Shadow Company 4 Oxide, Avatar One. We have unauthorized personnel on the catwalk. I repeat, we have unauthorized personnel on the catwalk. level.scr_radio[ "afcaves_sc4_gettingthis" ] = "afcaves_sc4_gettingthis"; //****Shadow Company HQ Avatar One, divert your camera feed to the facial recognition database at Langley. Break. Standby for fur- ( further orders. ) stealth wiretap level.scr_radio[ "afcaves_schq_facialrecog" ] = "afcaves_schq_facialrecog"; //****Shepherd Backup priority items and burn the rest. Fire teams - just delay 'em until we're ready to pull out. level.scr_radio[ "afcaves_shp_burntherest" ] = "afcaves_shp_burntherest"; //Shepherd It's Price. Backup priority items and burn the rest. All fire teams - just delay 'em until we're ready to leave. Shepherd out. stealth wiretap level.scr_radio[ "afcaves_shp_shepout" ] = "afcaves_shp_shepout"; //***Captain Price We're exposed! Go loud!! //level.scr_radio[ "afcaves_pri_exposedgoloud" ] = "afcaves_pri_exposedgoloud"; //Shadow Company 5 Oxide, Disciple Nine, we've got hostile contact approximately 50 meters from the nest, over. level.scr_radio[ "catwalk_enemy_chatter_00" ] = "afcaves_sc5_50meters"; //Shadow Company HQ Terminate with extreme prejudice. level.scr_radio[ "catwalk_enemy_chatter_01" ] = "afcaves_schq_prejudice"; //Shadow Company HQ All personnel - be advised, we have two enemy foot-mobiles on the catwalk heading to the crow's nest. level.scr_radio[ "catwalk_enemy_chatter_02" ] = "afcaves_schq_2enemies"; /*----------------------- RIOT ----- MOVE UP -------------------------*/ //Captain Price Move up. level.scr_radio[ "riotsheildmove_00" ] = "afcaves_pri_moveup"; //Captain Price Take point with the shield and draw their fire. I'll cover you. level.scr_radio[ "riotsheildmove_01" ] = "afcaves_pri_takepointdraw"; /*----------------------- RIOT ----- NEED TO CROUCH -------------------------*/ //Captain Price Stay low with that shield so I can get a clean shot! stealth level.scr_radio[ "crouchriotsheild_00" ] = "afcaves_pri_staylow"; //Captain Price Keep low with that shield! stealth level.scr_radio[ "crouchriotsheild_01" ] = "afcaves_pri_keeplow"; //Captain Price Crouch down with that shield, Soap! I'll take care of the shooters. stealth level.scr_radio[ "crouchriotsheild_02" ] = "afcaves_pri_crouchdown"; /*----------------------- RIOT ----- NEED TO SWITCH -------------------------*/ //Captain Price Switch to the shield, we're exposed out here! stealth level.scr_radio[ "switchriotsheild_00" ] = "afcaves_pri_switchtosheild"; //Captain Price Bring up the riot shield, Soap! stealth level.scr_radio[ "switchriotsheild_01" ] = "afcaves_pri_bringup"; //Captain Price Give us some cover with that riot shield, Soap! stealth level.scr_radio[ "switchriotsheild_02" ] = "afcaves_pri_giveuscover"; /*----------------------- RIOT ----- NEED TO PICKUP -------------------------*/ //Captain Price Soap, grab a riot shield and lead the way. I'll take care of any shooters! level.scr_radio[ "pickupriotsheild_00" ] = "afcaves_pri_pickupriotsheild2"; //Captain Price Soap, grab a riot shield. We'll need all the cover we can get. level.scr_radio[ "pickupriotsheild_01" ] = "afcaves_pri_pickupriotsheild3"; //Captain Price Grab a riot shield. We're completely exposed out here. level.scr_radio[ "pickupriotsheild_02" ] = "afcaves_pri_grabasheild"; /*----------------------- RIOT ----- KILLFIRMS -------------------------*/ //Captain Price We're clear. Move in. stealth level.scr_radio[ "riot_killfirm_final" ] = "afcaves_pri_wereclearmove"; //Captain Price Good night stealth level.scr_radio[ "riot_killfirm_00" ] = "afcaves_pri_goodnight2"; //Captain Price He's down stealth level.scr_radio[ "riot_killfirm_01" ] = "afcaves_pri_hesdown2"; //Captain Price Got 'em stealth level.scr_radio[ "riot_killfirm_02" ] = "afcaves_pri_gotem"; //Captain Price Got one. stealth level.scr_radio[ "riot_killfirm_03" ] = "afcaves_pri_gotone2"; /*----------------------- OVERLOOK -------------------------*/ //Shadow Company HQ Butcher One-Five, rendezvous at the nest and prepare to escort Gold Eagle to the LZ. level.scr_radio[ "afcaves_schq_escourtgoldeagle" ] = "afcaves_schq_escourtgoldeagle"; //Captain Price Gold Eagle must be Shepherd! We're running out of time, let's go! level.scr_radio[ "afcaves_pri_mustbeshepherd" ] = "afcaves_pri_mustbeshepherd"; //Shadow Company 5 Disciple Three rapelling in! stealth wiretap level.scr_radio[ "afcaves_sc5_rapellingin" ] = "afcaves_sc5_rapellingin"; /*----------------------- OVERLOOK STRATEGY NAGS -------------------------*/ //Captain Price Try to flank them! level.scr_sound[ "price" ][ "afcaves_pri_trytoflank" ] = "afcaves_pri_trytoflank"; //Captain Price They're using shields! Use flash grenades! level.scr_sound[ "price" ][ "afcaves_pri_sheildsuseflash" ] = "afcaves_pri_sheildsuseflash"; //Captain Price Soap! Hit them from the sides! level.scr_sound[ "price" ][ "afcaves_pri_hitfromsides" ] = "afcaves_pri_hitfromsides"; //Captain Price They're using shields! Throw some frags! level.scr_sound[ "price" ][ "afcaves_pri_sheildsthrowfrags" ] = "afcaves_pri_sheildsthrowfrags"; //Captain Price Try to flank and hit them from the sides! level.scr_sound[ "price" ][ "afcaves_pri_flankandhitsides" ] = "afcaves_pri_flankandhitsides"; /*----------------------- BREACH -------------------------*/ //Shadow Company 6 Oxide, Butcher Five-Actual. I've got a severed det cord - we're gonna need ten mikes to get the trunk rigged and the EBC primed, over. stealth wiretap level.scr_radio[ "afcaves_sc6_severeddet" ] = "afcaves_sc6_severeddet"; //Shadow Company HQ Negative, Gold Eagle wants those charges hot in less than three mikes. Get it done, out. stealth wiretap level.scr_radio[ "afcaves_schq_chargeshot" ] = "afcaves_schq_chargeshot"; /*----------------------- BREACH NAGS -------------------------*/ //Captain Price They've sealed the control room. Get a frame charge on the door! level.scr_sound[ "price" ][ "breach_nag_00" ] = "afcaves_pri_getframecharge"; //Captain Price Soap! We've got to go now! Breach the door! level.scr_sound[ "price" ][ "breach_nag_01" ] = "afcaves_pri_breachthedoor"; //Captain Price Blow the door! We can't let Shepherd escape! level.scr_sound[ "price" ][ "breach_nag_02" ] = "afcaves_pri_blowthedoor"; //Captain Price Get a charge on the door! Do it! level.scr_sound[ "price" ][ "breach_nag_03" ] = "afcaves_pri_chargedoit"; //Shadow Company HQ All fire teams, be advised - we have a positive ID. Enemy operators are ex-SAS and Task Force 141. Approach with extreme caution, over. stealth wiretap //level.scr_radio[ "" ] = ""; //****Shadow Company HQ All fire teams, be advised - enemy operators are ex-SAS and Task Force 141. Approach with extreme caution, over. stealth wiretap //level.scr_radio[ "afcaves_schq_exsas" ] = "afcaves_schq_exsas"; /*----------------------- SKYLIGHT -------------------------*/ //Captain Price I'm popping smoke! Move around the right flank! //level.scr_radio[ "afcaves_pri_poppingsmoke" ] = "afcaves_pri_poppingsmoke"; //Captain Price I'll draw their fire through the smoke! Watch for flanking routes! level.scr_sound[ "price" ][ "afcaves_pri_drawfire" ] = "afcaves_pri_drawfire"; //Captain Price Soap! They're digging in, Shepherd must be close! We have to break through! level.scr_sound[ "price" ][ "afcaves_pri_moveright" ] = "afcaves_pri_moveright"; //Captain Price The're using thermal through the smoke! level.scr_sound[ "price" ][ "afcaves_pri_usingthermal" ] = "afcaves_pri_usingthermal"; //Captain Price Switching to thermal! Keep an eye on our flanks! level.scr_sound[ "price" ][ "afcaves_pri_switchingtotherm" ] = "afcaves_pri_switchingtotherm"; /*----------------------- SKYLIGHT - GETTING FLANKED - TODO -------------------------*/ //Captain Price Eyes up! They're flanking us! level.scr_sound[ "price" ][ "afcaves_pri_eyesup" ] = "afcaves_pri_eyesup"; /*----------------------- BREACH ROOM -------------------------*/ //Captain Price Soap! Get that door open over there! Hit the panel! level.scr_sound[ "price" ][ "afcaves_pri_dooropen" ] = "afcaves_pri_dooropen"; //Captain Price Overide the door controls! Hurry! level.scr_sound[ "price" ][ "afcaves_pri_overridecontrol" ] = "afcaves_pri_overridecontrol"; //Captain Price Soap! Get that door open! level.scr_sound[ "price" ][ "afcaves_pri_getdooropen" ] = "afcaves_pri_getdooropen"; //Captain Price Override the door controls! Use the keyboard! level.scr_sound[ "price" ][ "afcaves_pri_usekeyboard" ] = "afcaves_pri_usekeyboard"; //Captain Price Open the door! We're running out of time! level.scr_sound[ "price" ][ "afcaves_pri_openthedoor" ] = "afcaves_pri_openthedoor"; //Captain Price Come onnn...come onnn... level.scr_sound[ "price" ][ "afcaves_pri_comeoncomeon" ] = "afcaves_pri_comeoncomeon"; //Shepherd All units be advised this is Gold Eagle. The site has been compromised. level.scr_radio[ "afcaves_shp_sitecompromised" ] = "afcaves_shp_sitecompromised"; //Shepherd I am executing directive one-one-six bravo. If you're still inside, your service will be honored. Shepherd out. echoing P.A. announcement level.scr_radio[ "afcaves_shp_directive116" ] = "afcaves_shp_directive116"; /*----------------------- ESCAPE -------------------------*/ //Captain Price RUUNN!!! level.scr_sound[ "price" ][ "afcaves_pri_run" ] = "afcaves_pri_run"; //Captain Price Keep moving! This place is gonna blow!!! level.scr_sound[ "price" ][ "afcaves_pri_gonnablow" ] = "afcaves_pri_gonnablow"; /*----------------------- AIRSTRIP - ALL -------------------------*/ //****Shadow Company 6 Get ready to move in! evil marine radio through a gas mask //level.scr_radio[ "afcaves_sc6_getready" ] = "afcaves_sc6_getready"; //****Shadow Company 9 Weapons free, take 'em out! evil marine radio through a gas mask //level.scr_radio[ "afcaves_sc9_weaponsfree" ] = "afcaves_sc9_weaponsfree"; //****Shadow Company 8 Low vis from the tower, you'll have to take 'em on the ground! evil marine radio through a gas mask //level.scr_radio[ "afcaves_sc8_lowvis" ] = "afcaves_sc8_lowvis"; //****Shadow Company 9 Oscar and Romeo teams, sweep the blast zone, pattern Papa Alpha. evil marine radio through a gas mask //level.scr_radio[ "afcaves_sc9_blastzone" ] = "afcaves_sc9_blastzone"; //radio_dialogue( "afcaves_sc9_blastzone" ); //****Shadow Company 9 Roger that. evil marine radio through a gas mask //level.scr_radio[ "afcaves_sc9_rogerthat" ] = "afcaves_sc9_rogerthat"; //radio_dialogue( "afcaves_sc9_rogerthat" ); /*----------------------- AIRSTRIP - STORY DIALOGUE -------------------------*/ //Shadow Company HQ Sir, sandstorm activity is picking up here. It's too risky for flight ops. stealth wiretap level.scr_radio[ "afcaves_schq_riskyforflightops" ] = "afcaves_schq_riskyforflightops"; //Shepherd Understood. Head for the tunnel. We'll take the Zodiacs. stealth wiretap level.scr_radio[ "afcaves_shp_takezodiacs" ] = "afcaves_shp_takezodiacs"; //Shadow Company HQ Yes sir! stealth wiretap level.scr_radio[ "afcaves_schq_yessir2" ] = "afcaves_schq_yessir2"; //Captain Price Head for the tunnel! He's getting away! level.scr_sound[ "price" ][ "afcaves_pri_gettingaway2" ] = "afcaves_pri_gettingaway2"; //Captain Price Shepherd mentioned Zodiacs...there must riveracess nearby - let's go! level.scr_sound[ "price" ][ "afcaves_pri_rivernearby" ] = "afcaves_pri_rivernearby"; /*----------------------- AIRSTRIP - PRICE GUIDANCE -------------------------*/ //Captain Price Let's go! Stay close and follow me! level.scr_sound[ "price" ][ "afcaves_pri_stayclose" ] = "afcaves_pri_stayclose"; //Captain Price Head for that humvee, I'll cover you! level.scr_sound[ "price" ][ "afcaves_pri_headforhumvee" ] = "afcaves_pri_headforhumvee"; //Captain Price Soap! Follow me! Let's go! level.scr_sound[ "price" ][ "afcaves_pri_followmeletsgo" ] = "afcaves_pri_followmeletsgo"; //Captain Price To the west, Soap, Go! level.scr_sound[ "price" ][ "afcaves_pri_tothewest" ] = "afcaves_pri_tothewest"; //Captain Price Come to me, I'll cover you. Go! level.scr_sound[ "price" ][ "afcaves_pri_cometome" ] = "afcaves_pri_cometome"; //Captain Price Make a run for that tower, dead ahead! I'll cover you! level.scr_sound[ "price" ][ "afcaves_pri_towerahead" ] = "afcaves_pri_towerahead"; //Captain Price Move forward to that tower! level.scr_sound[ "price" ][ "afcaves_pri_forwardtotower" ] = "afcaves_pri_forwardtotower"; //Captain Price Move west towards the tower! Follow me! level.scr_sound[ "price" ][ "afcaves_pri_movewesttower" ] = "afcaves_pri_movewesttower"; /*----------------------- AIRSTRIP - HUMMER GAMEPLAY -------------------------*/ //Captain Price Targets to the west! Light em up! level.scr_sound[ "price" ][ "afcaves_pri_targetswest" ] = "afcaves_pri_targetswest"; //Captain Price Sniper from from the tower! Take it out! level.scr_sound[ "price" ][ "afcaves_pri_sniperfromtower" ] = "afcaves_pri_sniperfromtower"; /*----------------------- AIRSTRIP - DANGER CLOSE -------------------------*/ //Shepherd Excalibur, this is Gold Eagle. Fire mission - target package Romeo - danger close. stealth wiretap level.scr_radio[ "afcaves_shp_dangerclose" ] = "afcaves_shp_dangerclose"; //Shadow Company HQ That's within a hundred meters of your position sir! stealth wiretap level.scr_radio[ "afcaves_schq_100meters" ] = "afcaves_schq_100meters"; //Shepherd That's not a suggestion! Send it! stealth wiretap level.scr_radio[ "afcaves_shp_sendit" ] = "afcaves_shp_sendit"; //Shadow Company HQ Roger, fire mission danger close! stealth wiretap level.scr_radio[ "afcaves_schq_firemissionclose" ] = "afcaves_schq_firemissionclose"; //Captain Price Soaap!! Incomiiing!!! Fall baack, fall baaack!!! //level.scr_sound[ "price" ][ "afcaves_pri_fallback" ] = "afcaves_pri_fallback"; //Captain Price Soaap!! Incomiiing!!! Get down! Get down level.scr_sound[ "price" ][ "afcaves_pri_fallback2" ] = "afcaves_pri_fallback2"; //Get the hell out...Artillery inbound //level.scr_sound[ "price" ][ "afcaves_pri_fallback3" ] = "afcaves_pri_fallback3"; //Captain Price Since when does Shepherd care about danger close... level.scr_sound[ "price" ][ "afcaves_pri_sincewhen" ] = "afcaves_pri_sincewhen"; } /**************************************************************************** UTILITY ****************************************************************************/ riot_shield_quick_sprint() { self endon( "death" ); self riotshield_sprint_on(); wait( RandomFloatRange( 2.8, 3.2 ) ); // self waittill( "goal" ); self riotshield_sprint_off(); } vehicle_think() { switch( self.vehicletype ) { case "zodiac": self thread vehicle_zodiac_think(); break; case "littlebird": self thread vehicle_littlebird_think(); break; } } vehicle_zodiac_think() { PlayFXOnTag( getfx( "zodiac_wake_geotrail_oilrig" ), self, "tag_origin" ); } vehicle_littlebird_think() { self endon( "death" ); if ( self.classname == "script_vehicle_littlebird_armed" ) { self thread maps\_attack_heli::heli_default_missiles_on(); waittillframeend; foreach ( turret in self.mgturret ) { turret SetMode( "manual" ); turret StopFiring(); } } } triggersEnable( triggerName, noteworthyOrTargetname, bool ) { AssertEx( IsDefined( bool ), "Must specify true/false parameter for triggersEnable() function" ); aTriggers = GetEntArray( triggername, noteworthyOrTargetname ); AssertEx( IsDefined( aTriggers ), triggerName + " does not exist" ); if ( bool == true ) array_thread( aTriggers, ::trigger_on ); else array_thread( aTriggers, ::trigger_off ); } dialogue_execute( sLineToExecute ) { self endon( "death" ); self dialogue_queue( sLineToExecute ); } dialogue_execute_temp( sLineToExecute ) { hint_temp( sLineToExecute, 3 ); } radio_dialogue_temp( sLineToExecute ) { hint_temp( sLineToExecute, 1.5 ); } hint_temp( string, timeOut ) { hintfade = 0.5; level endon( "clearing_hints" ); if ( IsDefined( level.tempHint ) ) level.tempHint destroyElem(); level.tempHint = createFontString( "default", 1.5 ); level.tempHint setPoint( "BOTTOM", undefined, 0, -60 ); level.tempHint.color = ( 1, 1, 1 ); level.tempHint SetText( string ); level.tempHint.alpha = 0; level.tempHint FadeOverTime( 0.5 ); level.tempHint.alpha = 1; level.tempHint.sort = 2; wait( 0.5 ); level.tempHint endon( "death" ); if ( IsDefined( timeOut ) ) wait( timeOut ); else return; level.tempHint FadeOverTime( hintfade ); level.tempHint.alpha = 0; wait( hintfade ); level.tempHint destroyElem(); } AI_player_seek() { if ( !isdefined( self ) ) return; self endon( "death" ); self ClearGoalVolume(); self endon( "stop_seeking" ); if ( self.code_classname == "actor_enemy_riotshield" ) self thread riot_shield_quick_sprint(); //self enable_danger_react( 3 ); //self.fixednode = false; //self.ignoreSuppression = true; //self.goalradius = 800; //self.interval = 0; //self.baseaccuracy = 5; //self.neverEnableCQB = true; //self.grenadeawareness = 0; //self.ignoreSuppression = true; //self.goalheight = 100; //self.aggressivemode = true; //dont linger at cover when you cant see your enemy newGoalRadius = Distance( self.origin, level.player.origin ); while ( IsAlive( self ) ) { wait 1; self.goalradius = newGoalRadius; //self SetGoalPos( self LastKnownPos( level.player ) ); self SetGoalEntity( level.player ); //self SetGoalPos( level.player.origin ); newGoalRadius -= 175; if ( newGoalRadius < 512 ) { newGoalRadius = 512; return; } } } smoke_throw( aSmokeOrgs, sFlagToStop ) { level endon( sFlagToStop ); while ( true ) { smokeTarget = undefined; foreach ( org in aSmokeOrgs ) { //MagicGrenade( "smoke_grenade_american_no_visblock", org.origin, org.origin + ( 0, 0, 1), RandomFloat( 1.1 ) ); PlayFX( getfx( "smokescreen" ), org.origin ); org thread play_sound_in_space( "smokegrenade_explode_default" ); wait( RandomFloatRange( .1, .3 ) ); } wait( 28 ); if ( flag( sFlagToStop ) ) break; } } make_door_from_prefab( sTargetname ) { ents = GetEntArray( sTargetname, "targetname" ); door_org = undefined; door_models = []; door_brushes = []; foreach ( ent in ents ) { if ( ent.code_classname == "script_brushmodel" ) { door_brushes[ door_brushes.size ] = ent; if ( ( IsDefined( self.script_noteworthy ) ) && ( self.script_noteworthy == "blocker" ) ) door_blocker = ent; continue; } if ( ent.code_classname == "script_model" ) { door_models[ door_models.size ] = ent; continue; } } door_org = Spawn( "script_origin", ( 0, 0, 0 ) ); door_org.origin = door_brushes[ 0 ].origin; door_org.angles = door_brushes[ 0 ].angles; foreach ( model in door_models ) model LinkTo( door_org ); foreach ( brush in door_brushes ) brush LinkTo( door_org ); door = door_org; return door; } escape_timer_invisible( iSeconds ) { level endon( "obj_escape_complete" ); level endon( "kill_timer" ); /*----------------------- TIMER SETUP -------------------------*/ //level.hudTimerIndex = 20; //level.timer = maps\_hud_util::get_countdown_hud(); //level.timer SetPulseFX( 30, 900000, 700 );// something, decay start, decay duration // Reach exit in: //level.timer.label = &"AF_CAVES_TIME_REMAINING"; //level.timer SetTenthsTimer( iSeconds ); /*----------------------- TIMER EXPIRED -------------------------*/ thread timer_tick(); wait( iSeconds ); //level.timer Destroy(); level thread mission_failed_out_of_time(); } timer_tick() { level endon( "obj_escape_complete" ); level endon( "kill_timer" ); while ( true ) { wait( 1 ); level.player thread play_sound_on_entity( "countdown_beep" ); } } mission_failed_out_of_time() { level.player endon( "death" ); level endon( "kill_timer" ); level notify( "mission failed" ); MusicStop( 1 ); // Mission failed level.player PlayLocalSound( "af_caves_selfdestruct" ); //exploder( "control_room_detonate" ); PlayFX( getfx( "player_death_explosion" ), level.player.origin ); Earthquake( 1, 1, level.player.origin, 100 ); // You did not reach the cave exit in time. SetDvar( "ui_deadquote", &"AF_CAVES_RAN_OUT_OF_TIME" ); level notify( "mission failed" ); maps\_utility::missionFailedWrapper(); level.player kill(); level notify( "kill_timer" ); } kill_timer() { level notify( "kill_timer" ); //if ( IsDefined( level.timer ) ) //level.timer Destroy(); } cooking_destructible_think() { //vehicle_slamraam_destroyed } generic_damage_triggers_think() { } spawn_vehicles_from_targetname_and_drive_on_flag( sTargetname, sFlag ) { flag_wait( sFlag ); spawn_vehicles_from_targetname_and_drive( sTargetname ); } AI_ambient_airstrip_think() { self endon( "death" ); self.health = 1; self.noragdoll = true; self.ignoreall = true; self.diequietly = true; self disable_pain(); self set_allowdeath( true ); self gun_remove(); self thread AI_ambient_airstrip_ignored_by_price(); reference = self.spawner; animation = self.spawner.animation; self.deathanim = level.scr_anim[ "generic" ][ animation + "_death" ]; self.fxSmokeTag = []; self.fxFireTag = []; /*----------------------- WAIT FOR A FLAG, IF APPLICABLE -------------------------*/ if ( IsDefined( self.script_flag ) ) { reference anim_generic_first_frame( self, animation ); flag_wait( self.script_flag ); } /*----------------------- SPECIFICS PER ANIM -------------------------*/ slowDownRate = undefined; timesLooped = undefined; switch( animation ) { case "civilian_leaning_death": break; case "hunted_dazed_walk_B_blind": self.fxSmokeTag[ 0 ] = "tag_origin"; timesLooped = 2; break; case "hunted_dazed_walk_C_limp": timesLooped = 4; slowDownRate = .7; self.fxSmokeTag[ 0 ] = "tag_origin"; break; case "civilian_crawl_2": slowDownRate = .5; self.fxSmokeTag[ 0 ] = "tag_bipod"; // self.fxFireTag[ 0 ] = "tag_stowed_hip_rear"; // self.fxFireTag[ 0 ] = "tag_stowed_hip_le"; self.fxFireTag[ 0 ] = "tag_shield_back"; // self.fxFireTag[ 1 ] = "tag_reflector_arm_ri"; // self.fxFireTag[ 4 ] = "tag_reflector_arm_le"; self.a.pose = "prone"; break; case "civilian_crawl_1": self.fxSmokeTag[ 0 ] = "tag_origin"; self.fxFireTag[ 0 ] = "tag_shield_back"; self.a.pose = "prone"; break; } if ( self.fxSmokeTag.size ) self thread play_looping_fx_on_tags( self.fxSmokeTag, "smoke" ); if ( self.fxFireTag.size ) self thread play_looping_fx_on_tags( self.fxFireTag, "fire" ); if ( IsDefined( slowDownRate ) ) { reference thread anim_generic_custom_animmode( self, "gravity", animation ); wait( .1 ); self SetAnim( level.scr_anim[ "generic" ][ animation ], 1, 0.2, slowDownRate ); time = GetAnimLength( level.scr_anim[ "generic" ][ animation ] ); if ( !isdefined( timesLooped ) ) timesLooped = 3; wait( time * timesLooped ); } else { reference anim_generic_custom_animmode( self, "gravity", animation ); if ( isdefined( timesLooped ) ) anim_generic_custom_animmode( self, "gravity", animation ); } /*----------------------- PRE-DEATH SPECIFICS -------------------------*/ switch( animation ) { case "civilian_leaning_death": self.a.nodeath = true; break; } //self.a.nodeath = true; self.deathanim = undefined; self anim_stopanimscripted(); self.skipDeathAnim = true; self Kill(); } play_looping_fx_on_tags( aTags, sType ) { if ( getdvar( "caves_fire" ) == "0" ) return; self endon( "death" ); fx = undefined; if ( sType == "fire" ) { fx = getfx( "body_fire_01" ); } else if ( sType == "smoke" ) { fx = getfx( "body_smoke_01" ); } foreach ( tag in aTags ) { self thread play_fx_on_tag_till_dead( fx, tag, sType ); } } play_fx_on_tag_till_dead( fx, tag, sType ) { additionalDelay = 0; if ( sType == "smoke" ) additionalDelay = 3; // if somoke, wait an additional X time before playing fx again self endon( "death" ); while ( true ) { wait( additionalDelay ); PlayFXOnTag( fx, self, tag ); wait( .2 ); StopFXOnTag( fx, self, tag ); } } AI_ambient_airstrip_ignored_by_price() { self endon( "death" ); self.ignoreme = true; // distsquared = 128 * 128; // while( true ) // { // wait( .3 ); // if ( DistanceSquared( self.origin, level.price.origin ) < distsquared ) // break; // } // self.ignoreme = false; } backhalf_loadout() { // SRS take weapons so the player doesn't have 4 weapons when using a start point level.player TakeWeapon( level.primaryweapon ); level.player TakeWeapon( level.secondaryweapon ); level.player GiveWeapon( "masada_digital_eotech" ); level.player GiveWeapon( "deserteagle" ); level.player SwitchToWeapon( "masada_digital_eotech" ); } debug() { wait( .2 ); airstrip_player = GetEnt( "airstrip_player", "targetname" ); level.player SetOrigin( airstrip_player.origin ); level.player SetPlayerAngles( airstrip_player.angles ); wait( 1 ); ambient_airstrip = GetEntArray( "ambient_airstrip", "targetname" ); array_spawn( ambient_airstrip, true ); } c4_barrels() { c4_barrels = GetEntArray( "c4_barrel", "targetname" ); array_thread( c4_barrels, ::c4_barrels_think ); } c4_barrels_think() { level endon( "mission failed" ); level endon( "missionfailed" ); level endon( "player_detonated_explosives" ); level endon( "pre_explosion_happening" ); level endon( "player_touching_cave_exit" ); level endon( "player_escaped" ); level endon( "player_invulnerable" ); eDamageTrigger = self; eDamageTrigger SetCanDamage( true ); //determine barrel hitpoints based on difficulty eDamageTrigger.hitpoints = undefined; switch( level.gameSkill ) { case 0:// easy eDamageTrigger.hitpoints = 5; break; case 1:// regular eDamageTrigger.hitpoints = 4; break; case 2:// hardened eDamageTrigger.hitpoints = 2; break; case 3:// veteran eDamageTrigger.hitpoints = 1; break; } while ( !flag( "player_detonated_explosives" ) ) { eDamageTrigger waittill( "damage", damage, attacker, direction_vec, point, type, modelName, tagName, partName, idFlags ); if ( ( isdefined( attacker ) ) && ( isplayer( attacker ) ) ) { if ( idFlags & 8 ) // bullet penetration occurred continue; //dont explode if you shot through an enemy...unless on veteran if ( ( IsDefined( level.last_player_damage ) ) && ( level.last_player_damage == GetTime() ) && ( level.gameskill != 3 ) ) continue; //knock hitpoints down one if ( eDamageTrigger.hitpoints > 0 ) eDamageTrigger.hitpoints -= 1; //remove all hitpoints if it was a grenade, etc if ( IsDefined( type ) && ( IsSubStr( type, "MOD_GRENADE" ) || IsSubStr( type, "MOD_EXPLOSIVE" ) || IsSubStr( type, "MOD_PROJECTILE" ) ) ) break; //blow up the barrel if hitpoints is zero if ( eDamageTrigger.hitpoints == 0 ) break; } } thread c4_barrel_explode(); flag_set( "player_detonated_explosives" ); } c4_barrel_explode() { level notify( "c4_barrels_exploding" ); level endon( "c4_barrels_exploding" ); level endon ( "pre_explosion_happening" ); level endon ( "player_touching_cave_exit" ); level endon ( "player_escaped" ); level endon ( "player_invulnerable" ); level.player PlayLocalSound( "af_caves_selfdestruct" ); PlayFX( getfx( "player_death_explosion" ), level.player.origin ); Earthquake( 1, 1, level.player.origin, 100 ); // Mission Failed.\nYou shot and detonated the rigged explosives. SetDvar( "ui_deadquote", &"AF_CAVES_MISSIONFAIL_EXPLOSIVES" ); level notify( "mission failed" ); maps\_utility::missionFailedWrapper(); level.player kill(); } c4_packs_think() { self thread c4_barrels_think(); //make rigged c4 explosive as well wait( RandomFloatRange( 0, .6 ) ); if ( cointoss() ) { PlayFXOnTag( getfx( "light_c4_blink_nodlight" ), self, "tag_fx" ); } else { PlayFXOnTag( getfx( "c4_light_blink_dlight" ), self, "tag_fx" ); } flag_wait( "end_cave_collapse" ); //stopFXOnTag( getfx( "light_c4_blink_nodlight" ), self, "tag_fx" ); self Delete(); } AI_ignored_think() { self.ignoreme = true; } fx_management() { /*----------------------- CREATE ARRAYS OF FX FOR THE LEVEL -------------------------*/ level.fx_start_to_ledge = []; level.fx_ledge_to_airstrip = []; /*----------------------- GET VOLUMES THAT ENCOMPASS EFFECTS -------------------------*/ fx_volume_start_to_ledge = getent( "fx_volume_start_to_ledge", "targetname" ); fx_volume_ledge_to_airstrip = getent( "fx_volume_ledge_to_airstrip", "targetname" ); /*----------------------- CATALOG ALL FX BY VOLUME -------------------------*/ dummy = spawn( "script_origin", ( 0, 0, 0 ) ); for ( i = 0;i < level.createfxent.size;i++ ) { EntFx = level.createfxent[ i ]; dummy.origin = EntFx.v[ "origin" ]; if ( dummy istouching( fx_volume_start_to_ledge ) ) { level.fx_start_to_ledge[ level.fx_start_to_ledge.size ] = EntFx; continue; } if ( dummy istouching( fx_volume_ledge_to_airstrip ) ) { level.fx_ledge_to_airstrip[ level.fx_ledge_to_airstrip.size ] = EntFx; continue; } } dummy delete(); } //destructible_management() //{ // /*----------------------- // TURN OFF ALL DESTRUCTIBLES IN MY HALF // -------------------------*/ // fx_volume_ledge_to_airstrip = getentarray( "fx_volume_ledge_to_airstrip", "targetname" ); // thread mask_destructibles_in_volumes( fx_volume_ledge_to_airstrip ); // thread mask_interactives_in_volumes( fx_volume_ledge_to_airstrip ); // // flag_wait( "steamroom_halfway_point" ); // // /*----------------------- // TURN OFF ALL DESTRUCTIBLES IN START, RE-ENABLE ONES IN SECOND HALF // -------------------------*/ // fx_volume_start_to_ledge = getentarray( "fx_volume_start_to_ledge", "targetname" ); // mask_destructibles_in_volumes( fx_volume_start_to_ledge ); // mask_interactives_in_volumes( fx_volume_start_to_ledge ); // // activate_destructibles_in_volume( fx_volume_ledge_to_airstrip ); // activate_interactives_in_volume( fx_volume_ledge_to_airstrip ); //}