//**************************************************************************** // ** // Confidential - (C) Activision Publishing, Inc. 2010 ** // ** //**************************************************************************** // ** // Module: MISSION DESCRIPTION ** // ** // Created: 8/30/2011 Brian Marvin ** // ** //**************************************************************************** #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; //******************************************************************* // * // * //******************************************************************* start_lab_to_vault() { level._player maps\_nx_utility::move_player_to_start_point( "playerstart_lab_to_vault" ); thread maps\nx_skyscraper_fx::set_vision_and_fog("robotics_01", 0); // set appropriate vision and fog maps\nx_skyscraper_util::player_weapon_init( false ); thread maps\_utility::set_ambient( "amb_skyscraper_robotics_int" ); maps\nx_skyscraper_util::spawn_baker(); baker_teleport = GetEnt ("origin_baker_lab_to_vault_teleport", "targetname"); Assert( IsDefined( baker_teleport )); level.baker ForceTeleport( baker_teleport.origin, baker_teleport.angles); // Stealth stuff stealth_settings(); } sequence_lab_to_vault() { // Global level.enemies[ "patrol" ] = []; // Set up low cover //thread low_cover_on( 64, false ); // Prep UAV flyby thread event_uav_catwalk_flyby_1(); // Halon anims thread vista_setup(); // Lab life thread event_lab_life(); // Wait for melee to finish or player to make it to hallway flag = "flag_script_lab_to_vault_start"; thread set_flag_on_trigger_targetname( "entering_lab_hallway", flag ); level thread set_flag_on_notify( "notify_synced_melee_complete", flag ); flag_wait( flag ); thread autosave_now(); // Baker level.baker thread baker_movement_lab_to_vault(); // Stealth blown thread event_lab_to_vault_stealth_blown(); // Patrol in room sequence_lab_to_vault_patrol(); //low_cover_off(); // Catwalk //event_lab_to_vault_uav_catwalk(); trigger_wait_targetname( "trig_crawlspace_player_drops" ); thread autosave_now(); } //******************************************************************* // * // * //******************************************************************* sequence_lab_to_vault_patrol() { trigger_wait_targetname( "entering_lab_hallway" ); // spawn patrol sequence level.enemies[ "patrol" ] = spawn_patrol_enemies(); level._player.maxvisibledist = 128; PlayFXOnTag( level._effect[ "spotlight_dynamic" ], level.enemies[ "patrol" ][ 0 ], "TAG_WEAPON_RIGHT" ); // Wait until player kills or player waits notify_name = "notify_patrol_dead"; time = 40; //thread sequence_lab_to_vault_patrol_kill( notify_name ); //thread sequence_lab_to_vault_patrol_wait( time, notify_name ); //level waittill( "notify_patrol_dead" ); trigger_wait_targetname( "trig_crawlspace_player_in" ); StopFXonTag( level._effect[ "spotlight_dynamic" ], level.enemies[ "patrol" ][ 0 ], "TAG_WEAPON_RIGHT" ); level notify( "notify_stopped_spotlight" ); level._player.maxvisibledist = 8192; } //******************************************************************* // * // * //******************************************************************* sequence_lab_to_vault_patrol_kill( notify_name ) { level endon( notify_name ); // Wait for player to kill one of the patrol while( level.enemies[ "patrol" ].size > 1 ) { level.enemies[ "patrol" ] = remove_dead_from_array( level.enemies[ "patrol" ] ); wait 0.05; } // Have baker kill other guy if( isalive( level.enemies[ "patrol" ][ 0 ] )) { level.baker SetLookAtEntity( level.enemies[ "patrol" ][ 0 ] ); level.baker Shoot(); MagicBullet( "lancer_silencer_xray", level.baker.origin, level.enemies[ "patrol" ][ 0 ].origin ); level.enemies[ "patrol" ][ 0 ] kill(); } level.enemies[ "patrol" ] = []; level notify( notify_name ); } //******************************************************************* // * // * //******************************************************************* sequence_lab_to_vault_patrol_wait( time, notify_name ) { level endon( notify_name ); wait time; foreach( guy in level.enemies[ "patrol" ] ) { if( isalive( guy )) { guy delete(); } } level.enemies[ "patrol" ] = []; level notify( notify_name ); } //******************************************************************* // * // * //******************************************************************* event_lab_to_vault_uav_catwalk() { level.baker waittill( "goal" ); uav_spawner = GetEnt( "vehicle_uav_catwalk_1", "targetname" ); uav = uav_spawner maps\_attack_heli::SAV_setup( "pathing" ); uav Vehicle_SetSpeedImmediate( 5, 5, 1 ); PlayFXOnTag( level._effect[ "spotlight_dynamic" ], uav, "tag_origin" ); uav waittill( "reached_dynamic_path_end" ); uav delete(); level notify( "notify_uav_catwalk_encounter_finished" ); } //******************************************************************* // * // * //******************************************************************* event_lab_to_vault_stealth_blown() { level endon( "macguffin_obtained" ); flag_clear( "flag_stealth_off" ); trigger_wait_targetname( "entering_lab_hallway" ); murder_squad_spawner = GetEnt( "vehicle_uav_murder_squad", "script_noteworthy" ); Assert( IsDefined( murder_squad_spawner )); thread event_lab_to_vault_stealth_blown_noticed(); while( 1 ) { if( level._player ButtonPressed( "BUTTON_RTRIG" )) break; if( flag( "flag_stealth_off" )) break; wait 0.05; } SetDvar( "ui_deadquote", "You broke stealth (placeholder)" ); maps\_utility::missionFailedWrapper(); /* iprintlnbold( "You broke stealth. A gaggle of UAVs arrives to murder you." ); // Send in the murder squad UAV murder_squad = undefined; position = undefined; while( 1 ) { if( !IsDefined( murder_squad )) { murder_squad_spawner.count = 1; murder_squad = murder_squad_spawner maps\_attack_heli::SAV_setup( "pathing" ); murder_squad.baseaccuracy = 1000; position = level._player GetEye() + vector_multiply( AnglesToForward( level._player.angles ), 128 ); murder_squad Vehicle_Teleport( position, (-1) * level._player.angles ); murder_squad SetLookAtEnt( level._player ); } else { trace = BulletTrace( level._player GetEye(), murder_squad.origin, false ); if( IsDefined( trace )) { position = level._player GetEye() + vector_multiply( AnglesToForward( level._player.angles ), 128 ); } else { position = level._player GetEye() + vector_multiply( (-1) * AnglesToForward( level._player.angles ), 128 ); } murder_squad SetVehGoalPos( position ); murder_squad SetLookAtEnt( level._player ); murder_squad FireWeapon( "TAG_FLASH" ); murder_squad FireWeapon( "TAG_FLASH2" ); } wait 0.05; } */ } //******************************************************************* // * // * //******************************************************************* event_lab_to_vault_stealth_blown_noticed() { level endon( "macguffin_obtained" ); level waittill( "_stealth_spotted" ); flag_set( "flag_stealth_off" ); } //******************************************************************* // * // * //******************************************************************* set_flag_on_trigger_targetname( tTrigger, flag ) { trigger_wait_targetname( tTrigger ); flag_set( flag ); } //******************************************************************* // * // * //******************************************************************* set_flag_on_notify( notify_msg, flag ) { self waittill( notify_msg ); flag_set( flag ); } //******************************************************************* // * // * //******************************************************************* spawn_patrol_enemies() { patrol_spawners = GetEntArray( "actor_patrol", "script_noteworthy" ); uav_spawner = GetEnt( "vehicle_uav_patrol_walkway", "targetname" ); Assert( IsDefined( patrol_spawners )); Assert( IsDefined( uav_spawner )); enemies = []; array_thread( patrol_spawners, ::add_spawn_function, ::spawnfunc_patrol_enemies ); uav_spawner add_spawn_function( ::spawnfunc_patrol_enemies ); foreach( spawner in patrol_spawners ) { guy = spawner spawn_ai(); enemies = add_to_array( enemies, guy ); wait 0.5; } uav = uav_spawner maps\_attack_heli::SAV_setup( "pathing" );; PlayFXOnTag( level._effect[ "spotlight_white" ], uav, "tag_origin" ); uav Vehicle_SetSpeed( 1.2 ); return enemies; } spawnfunc_patrol_enemies() { self endon( "death" ); self waittill( "reached_path_end" ); self delete(); } spawnfunc_patrol_uav() { self endon( "death" ); self waittill( "reached_dynamic_path_end" ); self delete(); } //******************************************************************* // * // * //******************************************************************* baker_movement_lab_to_vault() { self.ignoreme = true; self.ignoreall = true; self.goalradius = 8; self enable_cqbwalk(); // Dialogue - Baker: " Alright, follow me. Hold your fire and stay frosty. We've gotta stay absolutely quiet from here on out." level.baker dialogue_queue( "sky_bak_lab2vault_stayfrosty" ); //thread add_dialogue_line( "Baker", " Alright, follow me. Hold your fire and stay frosty.", "g" ); //thread add_dialogue_line( "Baker", " We've gotta stay absolutely quiet from here on out.", "g" ); wait 1; // Baker goes up and opens door self enable_ai_color(); issue_color_orders( "r303", "allies" ); self waittill( "goal" ); // Dialogue: Baker - "What the fuck is all of this?" level.baker dialogue_queue( "sky_bak_labent_wtf" ); trigger_wait_targetname( "trig_lab_to_vault_vista" ); wait 4; issue_color_orders( "r44", "allies" ); trigger_wait_targetname( "trig_baker_opens_door" ); // Patrol sequence, baker enters door // Dialogue: Baker - "Patrol coming. In here" level.baker dialogue_queue( "sky_bak_labent_patrolcoming" ); //thread add_dialogue_line( "Baker", "Patrol coming. In here.", "g" ); door = GetEnt( "door", "targetname" ); //hinge brush model object for door. node_door = getent( "node_door", "targetname" ); //called on script_origin node, grabs KVP, and assigns to variable. attachments = GetEntArray( door.target, "targetname" ); main_door = GetEnt( "brushmodel_main_door", "targetname" ); Assert( IsDefined( door )); Assert( IsDefined( node_door )); Assert( IsDefined( main_door )); for ( i = 0; i < attachments.size; i++ ) { attachments[ i ] LinkTo( door ); } main_door LinkTo( door ); // self.animname = "baker"; node_door anim_reach_solo( self, "hunted_open_barndoor" ); //blends into first frame of open door anim based off cover right anim pose. Also ends anim in cover right position. door thread hunted_style_door_open(); //function to open door that is based off door open anim. Not sure where this is defined. node_door anim_single_solo( self, "hunted_open_barndoor" ); //play anim to open door. // Fix paths on other side of door and send baker into room main_door ConnectPaths(); // Door closes when player passes through door thread door_close(); // Dialogue - Baker: "Stay low." level.baker dialogue_queue( "sky_bak_lab2vault_staylow" ); //thread add_dialogue_line( "Baker", "Stay low.", "g" ); self enable_ai_color(); issue_color_orders( "r46", "allies" ); self disable_cqbwalk(); self AllowedStances( "crouch" ); level.baker dialogue_queue( "sky_bak_lab2vault_highroad" ); //thread add_dialogue_line( "Baker", "The vault is on the other side of the factory. We're taking the high road.", "g" ); wait 10; trigger_wait_targetname( "trig_crawlspace_player_in" ); self waittill( "goal" ); issue_color_orders( "r48", "allies" ); // Dialogue - Baker: "Team A, we're about 30 meters to the target. What is your status?" level.baker dialogue_queue( "sky_bak_lab2vault_teamastatus" ); //thread add_dialogue_line( "Baker", "Team A, we're about 30 meters to the target. What is your status?", "g" ); // Dialogue - Team A: "Team A is in position and ready. Over." radio_dialogue( "sky_teama_lab2vault_inposition" ); //thread add_dialogue_line( "Team A", "Team A is in position and ready.", "r" ); // Dialogue - Baker: "Roger Team A. Maintain radio silence while we secure the control room. Team B out." level.baker dialogue_queue( "sky_bak_lab2vault_radiosilence" ); //thread add_dialogue_line( "Baker", "Roger Team A. Maintain radio silence while we secure the control room. Team B out.", "g" ); /* node = GetNode( "node_baker_drop_down", "targetname" ); Assert( IsDefined( node )); self ForceTeleport( node.origin, node.angles ); */ //self waittill( "goal" ); //thread add_dialogue_line( "Baker", "We need these scientists to gain access to the vault. Subdue the one below, I'll take care of his buddy.", "g" ); // Baker waits for player to drop down trigger_wait_targetname( "trig_crawlspace_player_arrived" ); issue_color_orders( "r302", "allies" ); trigger_wait_targetname( "trig_crawlspace_player_drops" ); thread cleanup_halon_life(); self AllowedStances( "stand", "crouch", "prone" ); } //******************************************************************* // * // * //******************************************************************* door_close() { trigger_wait_targetname( "trig_lab_to_vault_player_in_room" ); self RotateTo( self.angles - ( 0, 100, 0 ), 1 ); } //******************************************************************* // * // * //******************************************************************* event_uav_catwalk_flyby_1() { trigger_wait_targetname( "trig_crawlspace_player_in" ); uav_spawner = GetEnt( "vehicle_uav_catwalk_flyby_1", "targetname" ); Assert( IsDefined( uav_spawner )); uav = uav_spawner maps\_attack_heli::SAV_setup( "pathing" ); PlayFXOnTag( level._effect[ "spotlight_white" ], uav, "tag_origin" ); uav Vehicle_SetSpeedImmediate( 5, 5, 1 ); uav waittill( "reached_dynamic_path_end" ); uav delete(); } //******************************************************************* // * // * //******************************************************************* cleanup_halon_life() { } //******************************************************************* // * // * //******************************************************************* vista_setup() { trigger_wait_targetname( "entering_lab_hallway" ); thread robot_arm_move( "model_robot_arm_3", "origin_robot_arm_3_pos_2" ); thread robot_arm_move_slide( "model_robot_arm_slide_1", ( 1, 0, 0 ) ); thread robot_arm_move_slide( "model_robot_arm_slide_2", ( -1, 0, 0 ) ); flag_set( "flag_halon_robot_arms_moving" ); // Hide halon encounter transports transports = GetEntArray( "halon_transports", "script_noteworthy" ); Assert( IsDefined( transports )); foreach( thing in transports ) { thing hide(); } thread vista_transport(); thread vista_scientist(); thread vista_uavs(); } //******************************************************************* // * // * //******************************************************************* vista_transport() { level.transport_movers = [ "model_mover_vista", "model_mover_vista2", "model_mover_vista3" ]; thread vista_transport_straight( level.transport_movers[ 0 ] ); thread vista_transport_dropoff( level.transport_movers[ 1 ], 4 ); thread vista_transport_straight( level.transport_movers[ 2 ], 8 ); thread vista_transport_cleanup(); } //******************************************************************* // * // * //******************************************************************* vista_transport_cleanup() { trigger_wait_targetname( "trig_crawlspace_player_drops" ); level notify( "notify_lab_to_vault_vista_stop" ); foreach( thing in level.transport_movers ) { thing_ent = GetEnt( thing, "targetname" ); thing_ent_items = GetEntArray( thing_ent.target, "targetname" ); foreach( item in thing_ent_items ) { item delete(); } thing_ent delete(); } } //******************************************************************* // * // * //******************************************************************* vista_uavs() { uav_spawners = GetEntArray( "vehicle_uav_patrol", "script_noteworthy" ); Assert( IsDefined( uav_spawners )); level.enemies[ "vista_uavs" ] = array_spawn( uav_spawners ); foreach( uav in level.enemies[ "vista_uavs" ] ) { PlayFXOnTag( level._effect[ "spotlight_white" ], uav, "tag_origin" ); uav Vehicle_SetSpeed( 6 ); } } //******************************************************************* // * // * //******************************************************************* vista_uavs_cleanup() { trigger_wait_targetname( "trig_crawlspace_player_drops" ); foreach( uav in level.enemies[ "vista_uavs" ] ) { StopFXOnTag( level._effect[ "spotlight_white" ], uav, "tag_origin" ); uav delete(); } } //******************************************************************* // * // * //******************************************************************* vista_scientist() { level.enemies[ "scientists" ][ 0 ] = vista_scientist_anim( "actor_halon_scientist_1", "scientist", "escalator_up_generic_guy_idle", "origin_halon_conveyor_1", 0 ); level.enemies[ "scientists" ][ 1 ] = vista_scientist_anim( "actor_halon_scientist_2", "scientist", "escalator_up_generic_guy_idle", "origin_halon_conveyor_2", 0 ); level.enemies[ "scientists" ][ 2 ] = vista_scientist_anim( "actor_halon_scientist_3", "scientist", "civilian_directions_2_A_idle", "origin_halon_conveyor_3", 0 ); level.enemies[ "scientists" ][ 3 ] = vista_scientist_anim( "actor_halon_scientist_4", "scientist", "escalator_up_generic_guy_idle", "origin_halon_conveyor_4", 0 ); level.enemies[ "scientists" ][ 4 ] = vista_scientist_anim( "actor_halon_scientist_5", "scientist", "cliff_guardB_idle", "origin_halon_floor_1", 0 ); level.enemies[ "scientists" ][ 5 ] = vista_scientist_anim( "actor_halon_scientist_6", "scientist", "escalator_up_generic_guy_idle", "origin_halon_conveyor_5", 0 ); level.enemies[ "scientists" ][ 6 ] = vista_scientist_anim( "actor_halon_scientist_7", "scientist", "civilian_directions_2_A_idle", "origin_halon_conveyor_6", 0 ); thread vista_scientist_anim( "actor_halon_scientist_8", "ally_01", "lobby_walk", "origin_halon_floor_2", 2, true ); thread vista_scientist_cleanup(); } //******************************************************************* // * // * //******************************************************************* vista_scientist_anim( tSpawner, animname1, anim1, tOrigin, delay, single_anim ) { spawner = GetEnt( tSpawner, "targetname" ); origin = GetEnt( tOrigin, "targetname" ); //spawner add_spawn_function( ::spawnfunc_melee_enemy, origin ); Assert( IsDefined( spawner )); Assert( IsDefined( origin )); wait( delay ); enemy = spawner spawn_ai(); Assert( IsDefined( enemy )); enemy gun_remove(); enemy.animname = animname1; if( IsDefined( single_anim )) { if( single_anim ) { guys[ 0 ] = enemy; origin anim_single( guys, anim1 ); enemy delete(); return; } } else origin thread anim_loop_solo( enemy, anim1 ); return enemy; } //******************************************************************* // * // * //******************************************************************* vista_scientist_cleanup() { trigger_wait_targetname( "trig_crawlspace_player_drops" ); foreach( thing in level.enemies[ "scientists" ] ) { thing delete(); } } //******************************************************************* // * // * //******************************************************************* vista_transport_straight( tMover, delay ) { level endon( "notify_lab_to_vault_vista_stop" ); start_point = GetEnt( "origin_mover_vista_1", "targetname" ); Assert( IsDefined( start_point )); mover = GetEnt( tMover, "targetname" ); Assert( IsDefined( mover )); Assert( IsDefined( mover.target )); mover_load = GetEntArray( mover.target, "targetname" ); foreach( thing in mover_load ) { thing LinkTo( mover ); } CONST_INITIAL_ANGLES = mover.angles; current_goal = undefined; if( IsDefined( delay )) wait( delay ); while( 1 ) { mover.origin = start_point.origin; mover.angles = CONST_INITIAL_ANGLES; current_goal = GetEnt( start_point.target, "targetname" ); mover MoveTo( current_goal.origin, 2 ); wait( 2 ); mover RotateYaw( 90, 2 ); wait( 2 ); current_goal = GetEnt( current_goal.target, "targetname" ); mover MoveTo( current_goal.origin, 8 ); wait( 8 ); } } //******************************************************************* // * // * //******************************************************************* vista_transport_dropoff( tMover, delay ) { level endon( "notify_lab_to_vault_vista_stop" ); start_point = GetEnt( "origin_mover_vista_3", "targetname" ); Assert( IsDefined( start_point )); mover = GetEnt( tMover, "targetname" ); Assert( IsDefined( mover )); Assert( IsDefined( mover.target )); mover_load = GetEntArray( mover.target, "targetname" ); foreach( thing in mover_load ) { thing LinkTo( mover ); } CONST_INITIAL_ANGLES = mover.angles; current_goal = undefined; loaded = true; if( IsDefined( delay )) wait( delay ); while( 1 ) { mover.origin = start_point.origin; mover.angles = CONST_INITIAL_ANGLES; current_goal = GetEnt( start_point.target, "targetname" ); mover MoveTo( current_goal.origin, 2 ); wait( 2 ); mover RotateYaw( 90, 2 ); wait( 2 ); current_goal = GetEnt( "origin_mover_vista_dropoff1", "targetname" ); mover MoveTo( current_goal.origin, 4 ); wait 4; mover RotateYaw( -90, 2 ); current_goal2 = GetEnt( "origin_mover_vista_dropoff2", "targetname" ); mover MoveTo( current_goal2.origin, 4 ); wait 4; if( loaded ) { foreach( thing in mover_load ) { thing Unlink(); } loaded = false; } else { foreach( thing in mover_load ) { thing LinkTo( mover ); } loaded = true; } wait( 4 ); mover MoveTo( current_goal.origin, 4 ); wait( 2 ); mover RotateYaw( 90, 2 ); wait( 2 ); current_goal = GetEnt( "origin_mover_vista_end2", "targetname" ); mover MoveTo( current_goal.origin, 4 ); wait( 4 ); } } //******************************************************************* // * // * //******************************************************************* event_lab_life() { trigger_wait_targetname( "trig_lab_to_vault_lab_life" ); walker_spawn = GetEnt( "actor_lab_walk_1", "targetname" ); Assert( IsDefined( walker_spawn )); walker_origin = GetEnt( "origin_lab_walk_1", "targetname" ); Assert( IsDefined( walker_origin )); walker = walker_spawn spawn_ai(); walker.animname = "ally_01"; walker_array[0] = walker; walker_origin anim_single( walker_array, "lobby_walk" ); walker delete(); } //******************************************************************* // * // * //******************************************************************* robot_arm_move( tArm, tPos ) { level endon( "notify_stop_robot_anims" ); arm = GetEnt( tArm, "targetname" ); Assert( IsDefined( arm )); arm SetIsVisibleInXray(); down_dist = 128; over_dist = 256; time = 4; while( 1 ) { pos1 = arm.origin; /* pos = pos1 - (0,0,down_dist); arm MoveTo( pos, time ); wait time; arm MoveTo( pos1, time ); wait time; */ arm RotateYaw( 180, time ); wait time; /* pos1 = arm.origin; pos = pos1 - (0,0,down_dist); arm MoveTo( pos, time ); wait time; arm MoveTo( pos1, time ); wait time; */ arm RotateYaw( -180, time ); wait time; } } //******************************************************************* // * // * //******************************************************************* robot_arm_move_slide( tArm, move_vector ) { level endon( "notify_stop_robot_anims" ); arm = GetEnt( tArm, "targetname" ); Assert( IsDefined( arm )); arm SetIsVisibleInXray(); down_dist = 128; over_dist = 256; time = RandomFloatRange( 1, 2 ); pos1 = arm.origin; pos2 = pos1 + vector_multiply( move_vector, over_dist ); while( 1 ) { pos = pos1 - (0,0,down_dist); arm MoveTo( pos, time ); wait time; arm MoveTo( pos1, time ); wait time; arm MoveTo( pos2, time ); wait time; pos = pos2 - (0,0,down_dist); arm MoveTo( pos, time ); wait time; arm MoveTo( pos2, time ); wait time; arm MoveTo( pos1, time ); wait time; } }