//**************************************************************************** // ** // Confidential - (C) Activision Publishing, Inc. 2010 ** // ** //**************************************************************************** // ** // Module: MISSION DESCRIPTION ** // ** // Created: 7/15/2011 - Ken Moodie ** // ** //**************************************************************************** #include maps\_utility; #include maps\_utility_code; #include maps\_nx_objective_util; #include common_scripts\utility; #include maps\_anim; #include maps\_vehicle; #include maps\_nx_utility; #include maps\nx_skyscraper_util; //******************************************************************* // LAB EXIT * // * //******************************************************************* start_lab_exit() { level._player maps\_nx_utility::move_player_to_start_point( "playerstart_lab_exit" ); thread maps\nx_skyscraper_fx::set_vision_and_fog("interior", 0); // set appropriate vision and fog maps\nx_skyscraper_util::player_weapon_init( true ); level._player SwitchToWeapon( "lancer_xray" ); thread maps\_utility::set_ambient( "amb_skyscraper_office_int" ); maps\nx_skyscraper_util::spawn_baker(); baker_teleport = GetEnt ("baker_lab_exit_teleport", "targetname"); level.baker ForceTeleport( baker_teleport.origin, baker_teleport.angles); wait 0.05; } //******************************************************************* // * // * //******************************************************************* sequence_lab_exit() { thread autosave_now(); // Baker level.baker thread baker_movement_lab_exit(); // Disable vault trigger trigger = GetEnt( "trig_baker_enter_vault", "targetname" ); Assert( IsDefined( trigger )); trigger trigger_off(); // turn on xray for motor and other objects thread xray_on_for_models(); // Spawn enemies outside of vault thread spawn_it_lab_enemies(); //audio alarms start thread audio_intruder_alarm(); // Send in security enemies thread spawn_security_door_enemies( "actor_security_door_enemy" ); // Switch from silenced lancer to full-auto lancer thread weapons_hot(); // Main security doors close thread security_door_close(); // Baker / Player stop doors thread security_door_stuck(); // Remove motor xray models to conserve xray count thread remove_motor_parts(); trigger_wait_targetname( "trig_halon_button" ); } audio_intruder_alarm() { alarms = audio_intruder_alarm_add(); /* intruder_sound01 = spawn( "sound_emitter", ( -1067, 373, 30927 ) ); intruder_sound01 PlayloopSound( "emt_ss_intruder_alarm" ); //play sound on ent intruder_sound02 = spawn( "sound_emitter", ( -1068, -344, 30927 ) ); intruder_sound02 PlayloopSound( "emt_ss_intruder_alarm" ); //play sound on ent intruder_sound03 = spawn( "sound_emitter", ( 481, 463, 30927 ) ); intruder_sound03 PlayloopSound( "emt_ss_intruder_alarm" ); //play sound on ent */ // Stop alarm sound flag_wait( "flag_halon_finished" ); alarms audio_intruder_alarm_remove(); /* intruder_sound01 stopsounds(); intruder_sound02 stopsounds(); intruder_sound03 stopsounds(); wait 0.1; intruder_sound01 delete(); intruder_sound02 delete(); intruder_sound03 delete(); */ } audio_intruder_alarm_add() { horns = GetEntArray( "model_alarm_horn", "script_noteworthy" ); alarms = []; foreach( horn in horns ) { intruder_sound = spawn( "sound_emitter", horn.origin ); intruder_sound PlayloopSound( "emt_ss_intruder_alarm" ); //play sound on ent alarms = add_to_array( level.alarms, intruder_sound ); } return alarms; } audio_intruder_alarm_remove() { foreach( alarm in self ) { alarm stopsounds(); } wait 0.1; foreach( alarm in self ) { alarm delete(); } } //******************************************************************* // * // * //******************************************************************* weapons_hot() { level waittill( "notify_switch_lancer" ); level._player TakeWeapon( "lancer_silencer_xray" ); level._player GiveWeapon( "lancer_xray" ); level._player SwitchToWeapon( "lancer_xray" ); } remove_motor_parts() { motor_parts = GetEntArray( "model_xray_motor_parts", "script_noteworthy" ); Assert( IsDefined( motor_parts )); trigger_wait_targetname( "trig_halon_button" ); foreach( part in motor_parts ) { part delete(); } } //******************************************************************* // * // * //******************************************************************* baker_movement_lab_exit() { self disable_pain(); // Dialogue - Baker: "Weapons hot! Switch to full auto!" level.baker thread dialogue_queue( "sky_bak_labex_weaponshot" ); //thread add_dialogue_line( "Baker", "Weapons hot! Switch to full auto!", "green" ); wait 1; level notify( "notify_switch_lancer" ); issue_color_orders ("r51", "allies"); trigger_wait_targetname( "trig_lab_exit_security_doors" ); issue_color_orders( "r52", "allies" ); // Dialogue - Baker: "Fuck! Security doors!" level.baker dialogue_queue( "sky_bak_labex_securitydoors" ); //thread add_dialogue_line( "Baker", "Fuck! Security doors!", "green" ); wait 3; issue_color_orders( "r53", "allies" ); self set_fixednode_false(); // Dialogue - Baker: "Use Xray to find and shoot the door's motor." level.baker dialogue_queue( "sky_bak_labex_xrayshootmotor" ); //thread add_dialogue_line( "Baker", "Use Xray to find and shoot the door's motor.", "green" ); while( ( level.enemies[ "it_lab1a" ].size + level.enemies[ "it_lab1b" ].size ) > 3 ) { level.enemies[ "it_lab1a" ] = remove_dead_from_array( level.enemies[ "it_lab1a" ] ); level.enemies[ "it_lab1b" ] = remove_dead_from_array( level.enemies[ "it_lab1b" ] ); wait 0.05; } issue_color_orders( "r54", "allies" ); while( ( level.enemies[ "it_lab1a" ].size + level.enemies[ "it_lab1b" ].size ) > 0 ) { level.enemies[ "it_lab1a" ] = remove_dead_from_array( level.enemies[ "it_lab1a" ] ); level.enemies[ "it_lab1b" ] = remove_dead_from_array( level.enemies[ "it_lab1b" ] ); wait 0.05; } issue_color_orders( "r61", "allies" ); self waittill( "goal" ); level notify( "notify_baker_at_goal" ); level.baker dialogue_queue( "sky_bak_labex_takepoint" ); //thread add_dialogue_line( "Baker", "Spectre, take point! I'll watch your back. Go! Go! Go!", "green" ); trigger_wait_targetname( "trig_lab_exit_powercore" ); self enable_cqbwalk(); } //******************************************************************* // * // * //******************************************************************* spawn_it_lab_enemies() { thread spawn_it_lab_enemies_lab1a(); thread spawn_it_lab_enemies_lab1b(); //thread spawn_it_lab_enemies_lab2(); thread lab1a_fixednode_off(); } //******************************************************************* // * // * //******************************************************************* lab1a_fixednode_off() { level waittill( "notify_security_doors_opening" ); foreach( guy in level.enemies[ "it_lab1a" ] ) { guy set_fixednode_false(); } } //******************************************************************* // * // * //******************************************************************* spawn_it_lab_enemies_lab1a() { level.enemies[ "it_lab1a" ] = []; enemy_spawner = GetEnt( "actor_spawn_escape_enemies_1", "targetname" ); Assert( IsDefined( enemy_spawner )); trigger_wait_targetname( "trig_lab_exit_security_doors" ); issue_color_orders( "p1", "axis" ); number_of_enemies = 5; for( i = 0; i < number_of_enemies; i++ ) { enemy_spawner.count = 1; enemy = enemy_spawner spawn_ai(); enemy SetIsVisibleInXray(); enemy SetEngagementMinDist( 129, 128 ); level.enemies[ "it_lab1a" ] = add_to_array( level.enemies[ "it_lab1a" ], enemy ); wait 2; } level notify( "notify_it_lab1a_enemies_spawned" ); // Keep them stocked if player starts killing them before destroying motor while( !flag( "flag_security_doors_opening" )) { level.enemies[ "it_lab1a" ] = remove_dead_from_array( level.enemies[ "it_lab1a" ] ); if( level.enemies[ "it_lab1a" ].size < number_of_enemies ) { enemy_spawner.count = 1; enemy = enemy_spawner spawn_ai(); enemy SetIsVisibleInXray(); enemy SetEngagementMinDist( 129, 128 ); level.enemies[ "it_lab1a" ] = add_to_array( level.enemies[ "it_lab1a" ], enemy ); wait 2; } wait 0.05; } level.enemies[ "it_lab1a" ] = remove_dead_from_array( level.enemies[ "it_lab1a" ] ); waittill_dead( level.enemies[ "it_lab1a" ] ); level notify( "notify_it_lab1a_enemies_dead" ); } //******************************************************************* // * // * //******************************************************************* spawn_it_lab_enemies_lab1b() { level.enemies[ "it_lab1b" ] = []; level waittill( "notify_it_lab1a_enemies_spawned" ); while( level.enemies[ "it_lab1a" ].size > 2 ) { level.enemies[ "it_lab1a" ] = remove_dead_from_array( level.enemies[ "it_lab1a" ] ); wait 0.05; } enemy_spawner = GetEnt( "actor_spawn_escape_enemies_1", "targetname" ); Assert( IsDefined( enemy_spawner )); issue_color_orders( "p1", "axis" ); for( i = 0; i < 2; i++ ) { enemy_spawner.count = 1; enemy = enemy_spawner spawn_ai(); enemy set_fixednode_false(); enemy SetIsVisibleInXray(); enemy SetEngagementMinDist( 129, 128 ); level.enemies[ "it_lab1b" ] = add_to_array( level.enemies[ "it_lab1b" ], enemy ); wait 2; } level notify( "notify_it_lab1b_enemies_spawned" ); level.enemies[ "it_lab1b" ] = remove_dead_from_array( level.enemies[ "it_lab1b" ] ); waittill_dead( level.enemies[ "it_lab1b" ] ); level notify( "notify_it_lab1b_enemies_dead" ); } //******************************************************************* // * // * //******************************************************************* spawn_it_lab_enemies_lab2() { level.enemies[ "it_lab2" ] = []; trigger_wait_targetname( "trig_lab_exit_spawn_lab2_enemies" ); enemy_spawner = GetEnt( "actor_spawn_escape_enemies_2", "targetname" ); Assert( IsDefined( enemy_spawner )); issue_color_orders( "o1", "axis" ); for( i = 0; i < 2; i++ ) { enemy_spawner.count = 1; enemy = enemy_spawner spawn_ai(); enemy set_fixednode_false(); enemy SetIsVisibleInXray(); enemy SetEngagementMinDist( 129, 128 ); level.enemies[ "it_lab2" ] = add_to_array( level.enemies[ "it_lab2" ], enemy ); wait 1; } level.enemies[ "it_lab2" ] = remove_dead_from_array( level.enemies[ "it_lab2" ] ); waittill_dead( level.enemies[ "it_lab2" ] ); level notify( "notify_it_lab2_enemies_dead" ); } //******************************************************************* // * // * //******************************************************************* spawn_it_lab_enemies_group( enemy_spawnername, group_name, number, color, trigger, aggressive_mode ) { enemy_spawner = GetEnt( enemy_spawnername, "targetname" ); Assert( IsDefined( enemy_spawner )); trigger_wait_targetname( trigger ); issue_color_orders( color, "axis" ); level.enemies[ group_name ] = []; for( i = 0; i < number; i++ ) { enemy_spawner.count = 1; enemy = enemy_spawner spawn_ai(); if( aggressive_mode ) enemy.aggressivemode = true; enemy set_fixednode_false(); level.enemies[ group_name ] = add_to_array( level.enemies[ group_name ], enemy ); wait 0.5; } waittill_dead( level.enemies[ group_name ] ); level notify( "notify_" + group_name + "_enemies_dead" ); } //******************************************************************* // * // * //******************************************************************* security_door_close() { top_doors = GetEntArray( "brushmodel_security_door_top", "targetname" ); bottom_doors = GetEntArray( "brushmodel_security_door_bottom", "targetname" ); trigger_wait_targetname( "trig_lab_exit_security_doors" ); Assert( IsDefined( top_doors )); Assert( IsDefined( bottom_doors )); // Close security doors foreach( door in top_doors ) { door MoveTo( ( door.origin[0], door.origin[1], door.origin[2] - 85 ), 5 ); } foreach( door in bottom_doors ) { door MoveTo( ( door.origin[0], door.origin[1], door.origin[2] + 85 ), 5 ); } wait 5; level notify( "notify_security_door_closed" ); } //******************************************************************* // * // * //******************************************************************* security_door_stuck() { top_doors = GetEntArray( "brushmodel_security_door_2_top", "targetname" ); bottom_door = GetEnt( "brushmodel_security_door_2_bottom", "script_noteworthy" ); mantle = GetEnt( "model_lab_exit_mantle", "script_noteworthy" ); blocker = GetEnt( "brushmodel_security_door_blocker", "targetname" ); Assert( IsDefined( top_doors )); Assert( IsDefined( bottom_door )); Assert( IsDefined( mantle )); Assert( IsDefined( blocker )); // Break baker's path mantle LinkTo( bottom_door ); trigger_wait_targetname( "trig_lab_exit_security_doors" ); // Close security doors time = 5; foreach( door in top_doors ) { door MoveTo( ( door.origin[0], door.origin[1], door.origin[2] - 85 ), time ); } bottom_door MoveTo( ( bottom_door.origin[0], bottom_door.origin[1], bottom_door.origin[2] + 85 ), time ); wait time; level notify( "notify_security_doors_closed" ); // Player shoots switch door_motor = GetEnt( "brushmodel_security_door_motor", "targetname" ); Assert( IsDefined( door_motor )); door_motor SetCanDamage( true ); door_motor SetCanRadiusDamage( false ); level notify( "notify_lab_exit_motor_search_starting" ); while( 1 ) { door_motor waittill( "damage", damage, attacker ); if( attacker == level._player ) break; } PlayFXOnTag( GetFX( "spark_fountain" ), door_motor, "tag_origin" ); //StopFXOnTag( GetFX( "spark_fountain" ), door_motor, "tag_origin" ); level notify( "notify_security_doors_opening" ); flag_set( "flag_security_doors_opening" ); // Doors open up time = 10; foreach( door in top_doors ) { door MoveTo( ( door.origin[0], door.origin[1], door.origin[2] + 85 ), time ); } bottom_door MoveTo( ( bottom_door.origin[0], bottom_door.origin[1], bottom_door.origin[2] - 85 ), time ); wait time; blocker ConnectPaths(); blocker delete(); level notify( "notify_security_doors_opened" ); } xray_on_for_models() { objects = GetEntArray( "model_xray_motor_parts", "script_noteworthy" ); foreach( obj in objects ) { obj SetIsVisibleInXray( true ); } } //******************************************************************* // * // * //******************************************************************* spawn_security_door_enemies( sEnemy ) { enemies = []; spawners = GetEntArray( sEnemy, "script_noteworthy" ); Assert( IsDefined( spawners )); trigger_wait_targetname( "trig_lab_exit_security_doors" ); array_thread( spawners, ::add_spawn_function, ::spawnfunc_spawn_security_door_enemies ); for( i = 0; i < spawners.size; i++ ) { enemies[ i ] = spawners[ i ] spawn_ai(); wait 0.5; } level waittill( "notify_security_door_closed" ); foreach( guy in enemies ) { if( isalive( guy )) { guy delete(); } } } //******************************************************************* // * // * //******************************************************************* spawnfunc_spawn_security_door_enemies() { self.ignoreall = true; }