3379 lines
97 KiB
Plaintext
3379 lines
97 KiB
Plaintext
#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 );
|
|
//} |