mirror of
https://github.com/reaaLx/nx1-gsc-dump.git
synced 2025-04-23 09:35:45 +00:00
1460 lines
45 KiB
Plaintext
1460 lines
45 KiB
Plaintext
//****************************************************************************
|
|
// **
|
|
// 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;
|
|
|
|
//*******************************************************************
|
|
// VTOL *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
vtol_start()
|
|
{
|
|
level._player maps\_nx_utility::move_player_to_start_point( "playerstart_vtol_new" );
|
|
|
|
thread maps\nx_skyscraper_fx::set_vision_and_fog("vtol", 0); // set appropriate vision and fog
|
|
|
|
maps\nx_skyscraper_util::player_weapon_init( true );
|
|
|
|
thread maps\_utility::set_ambient( "amb_skyscraper_office_int" );
|
|
|
|
maps\nx_skyscraper_util::spawn_baker();
|
|
baker_teleport = GetEnt ("baker_vtol_teleport", "targetname");
|
|
level.baker disable_pain();
|
|
//issue_color_orders ("r80", "allies");
|
|
level.baker ForceTeleport( baker_teleport.origin, baker_teleport.angles);
|
|
|
|
// Show cloud ring.
|
|
thread fx_show_cloud_ring();
|
|
}
|
|
|
|
vtol_sequence()
|
|
{
|
|
/* // Gameplay removed to accomodate animatic
|
|
// allow player to kill more civilians before failing the mission
|
|
level._friendlyfire[ "friend_kill_points" ] = -100;
|
|
|
|
thread autosave_now();
|
|
thread vtol_player_fire_blockers();
|
|
thread vtol_attack_spawn_closet();
|
|
thread vtol_scientists();
|
|
thread lab_vtol_setup();
|
|
// thread vtol_dialog();
|
|
thread vtol_temp_timing();
|
|
thread vtol_enemies_logic();
|
|
thread cover_health_watcher( "vtol_cover_c" );
|
|
thread cover_health_watcher( "vtol_cover_d" );
|
|
thread cover_health_watcher( "vtol_cover_e" );
|
|
thread cover_health_watcher( "vtol_cover_f" );
|
|
*/
|
|
thread maps\_utility::set_ambient( "amb_skyscraper_office_int" );
|
|
thread autosave_now();
|
|
thread vtol_control();
|
|
// thread vtol_fire_hurt_volumes();
|
|
thread vtol_squad_control();
|
|
thread vtol_enemy_control();
|
|
thread vtol_player_fire_blockers();
|
|
thread vtol_collapse_temp_dialogue();
|
|
// thread laser_setup();
|
|
level.baker thread baker_office_movement();
|
|
|
|
thread office_enemies_logic();
|
|
|
|
// Prepare for sat view pip
|
|
thread maps\nx_skyscraper_util::play_pip_bink( "skyscraper_view_pip1", undefined, "play_orbital_pip_1" );
|
|
exploder( "fx_vtol_ambient" );
|
|
|
|
flag_wait( "flag_vtol_floor_collapse_done" );
|
|
thread autosave_now();
|
|
thread fx_kill_vtol_fx();
|
|
Exploder( "fx_office_inferno" );
|
|
level waittill ("office_enemies_dead");
|
|
// maps\nx_skyscraper_rappel::rappel_sequence();
|
|
}
|
|
|
|
// new vtol encounter stuff
|
|
|
|
vtol_control()
|
|
{
|
|
level endon ("destroy_all_vtols");
|
|
level.lab_vtol2 = spawn_vehicle_from_targetname_and_drive( "lab_vtol_spawner2" );
|
|
level.lab_vtol2.ignoreAll = true;
|
|
level.lab_vtol2 godon();
|
|
setsaveddvar( "r_spotlightbrightness", "2.5" );
|
|
level.lab_vtol2 thread maps\_attack_heli::heli_spotlight_on( undefined, true );
|
|
level.lab_vtol2 SetLookAtEnt( level._player );
|
|
level.lab_vtol2 maps\_nx_chinese_vtol::vtol_enable_turrets();
|
|
foreach ( turret in level.lab_vtol2.mgturret )
|
|
{
|
|
turret SetAISpread( 40 );
|
|
}
|
|
flag_wait( "flag_uav_blow_shutters" );
|
|
level.lab_vtol2 thread maps\_attack_heli::heli_spotlight_off();
|
|
Exploder( "fx_vtol_dust" );
|
|
//thread add_dialogue_line( "Baker", "Keep VTOL incoming!", "g" );
|
|
level.baker dialogue_queue( "sky_bak_vtol_vtolincoming" );
|
|
wait 0.5;
|
|
uav_target = GetEnt( "stair_target00", "targetname" );
|
|
thread heli_target_missile_with_fire( level.lab_vtol2, uav_target, 1.0, -100 );
|
|
|
|
wait 0.35;
|
|
// slomo
|
|
//
|
|
uav_target = GetEnt( "stair_target01", "targetname" );
|
|
thread heli_target_missile_with_fire( level.lab_vtol2, uav_target, 1.0, -100 );
|
|
// physics push
|
|
explo_base = GetEnt( "stair_base01", "targetname");
|
|
PhysicsExplosionSphere( explo_base.origin, 300, 299, 3 );
|
|
wait 0.2;
|
|
explo_base = GetEnt( "stair_base02", "targetname");
|
|
PhysicsExplosionSphere( explo_base.origin, 300, 299, 3 );
|
|
wait 0.15;
|
|
vtol_column = GetEnt( "vtol_column", "targetname" );
|
|
vtol_column delete();
|
|
explo_base = GetEnt( "stair_base03", "targetname");
|
|
PhysicsExplosionSphere( explo_base.origin, 300, 299, 3 );
|
|
//thread vtol_slow_mo();
|
|
uav_target = GetEnt( "stair_target02", "targetname" );
|
|
thread heli_target_missile_with_fire( level.lab_vtol2, uav_target, 1.0, -100 );
|
|
wait 0.35;
|
|
uav_target = GetEnt( "stair_target03", "targetname" );
|
|
thread heli_target_missile_with_fire( level.lab_vtol2, uav_target, 1.0, -100 );
|
|
shutters = GetEnt( "shutters01", "targetname" );
|
|
shutters delete();
|
|
exploder( "fx_vtol_exp_dust_01" );
|
|
wait 0.1;
|
|
shutters = GetEnt( "shutters01b", "targetname" );
|
|
shutters delete();
|
|
wait 0.9;
|
|
flag_set( "flag_baker_move1" );
|
|
//flag_wait( "flag_baker_pos1" );
|
|
// shoot rockets near the player until he moves on
|
|
//wait 5.0;
|
|
//walltarget = GetEnt( "vtol_walltarget01", "targetname" );
|
|
//while( !flag( "flag_baker_pos1" ))
|
|
/* while( !flag( "flag_spawn_wave2" ))
|
|
{
|
|
MagicBullet( "rpgx_straight", level.lab_vtol2.origin + (0, 100, -100), level._player.origin + (0, RandomIntRange(-175, 175), RandomIntRange(200, 250)));
|
|
wait 1.5;
|
|
} */
|
|
flag_wait( "flag_spawn_wave2" );
|
|
//level.lab_vtol2 thread maps\_attack_heli::heli_spotlight_off();
|
|
wait 0.1;
|
|
level.lab_vtol2 delete();
|
|
level.lab_vtol3 = spawn_vehicle_from_targetname_and_drive( "lab_vtol_spawner3" );
|
|
level.lab_vtol3.ignoreAll = true;
|
|
level.lab_vtol3 godon();
|
|
setsaveddvar( "r_spotlightbrightness", "2.5" );
|
|
//level.lab_vtol3 thread maps\_attack_heli::heli_spotlight_on( undefined, true );
|
|
level.lab_vtol3 SetLookAtEnt( level._player );
|
|
level.lab_vtol3 maps\_nx_chinese_vtol::vtol_enable_turrets();
|
|
foreach ( turret in level.lab_vtol3.mgturret )
|
|
{
|
|
turret SetAISpread( 40 );
|
|
}
|
|
wait 3.5;
|
|
//wait 0.5;
|
|
uav_target = GetEnt( "pos1_target01", "targetname" );
|
|
thread heli_target_missile_with_fire( level.lab_vtol3, uav_target, 1.0, -100 );
|
|
wait 0.35;
|
|
shutters = GetEnt( "shutters02", "targetname" );
|
|
shutters delete();
|
|
exploder( "fx_vtol_exp_dust_02" );
|
|
|
|
uav_target = GetEnt( "pos1_target02", "targetname" );
|
|
thread heli_target_missile_with_fire( level.lab_vtol3, uav_target, 1.0, -100 );
|
|
wait 0.35;
|
|
uav_target = GetEnt( "pos1_target03", "targetname" );
|
|
thread heli_target_missile_with_fire( level.lab_vtol3, uav_target, 1.0, -100 );
|
|
//
|
|
explo_base = GetEnt( "explo_base03", "targetname");
|
|
PhysicsExplosionSphere( explo_base.origin, 300, 299, 3 );
|
|
wait 0.35;
|
|
// physics push the blocks and kill any nearby dudes
|
|
explo_base = GetEnt( "explo_base01", "targetname");
|
|
PhysicsExplosionSphere( explo_base.origin, 20, 19, 3 );
|
|
volume = GetEnt( "enemy_kill_volume", "targetname" );
|
|
ai = GetAIArray();
|
|
foreach( guy in ai )
|
|
{
|
|
if( guy IsTouching( volume) && !guy is_hero() )
|
|
guy kill();
|
|
}
|
|
//
|
|
coverbox = GetEnt( "coverbox01", "targetname" );
|
|
coverbox delete();
|
|
shutters = GetEnt( "shutters03", "targetname" );
|
|
shutters delete();
|
|
coverbox = GetEnt( "coverbox02", "targetname" );
|
|
coverbox delete();
|
|
wait 1.0;
|
|
flag_set( "flag_baker_move2" );
|
|
|
|
// shoot rockets near the player until he moves on
|
|
//flag_wait( "flag_spawn_wave3" );
|
|
/* while( !flag( "flag_spawn_wave3" ))
|
|
{
|
|
MagicBullet( "rpgx_straight", level.lab_vtol3.origin + (0, 100, -100), level._player.origin + (0, RandomIntRange(-175, 175), RandomIntRange(225, 275)));
|
|
wait 1.5;
|
|
} */
|
|
flag_wait( "flag_spawn_wave3" );
|
|
flag_wait( "flag_baker_explo_pos" );
|
|
// physics push the blocks
|
|
explo_base = GetEnt( "explo_base02", "targetname");
|
|
thread heli_target_missile_with_fire( level.lab_vtol3, explo_base, 0.0, -100 );
|
|
wait 0.1;
|
|
flag_set( "flag_baker_blown_up" );
|
|
PhysicsExplosionSphere( explo_base.origin, 200, 199, 3 );
|
|
/* volume = GetEnt( "enemy_kill_volume2", "targetname" );
|
|
ai = GetAIArray();
|
|
foreach( guy in ai )
|
|
{
|
|
if( guy IsTouching( volume) && !guy is_hero() && !guy.magic_bullet_shield )
|
|
guy kill();
|
|
} */
|
|
//flag_wait( "flag_baker_pos2" );
|
|
wait 5.0;
|
|
//
|
|
//level.lab_vtol3 thread maps\_attack_heli::heli_spotlight_off();
|
|
wait 0.1;
|
|
level.lab_vtol3 delete();
|
|
level.lab_vtol4 = spawn_vehicle_from_targetname_and_drive( "lab_vtol_spawner4" );
|
|
level.lab_vtol4.ignoreAll = true;
|
|
level.lab_vtol4 godon();
|
|
setsaveddvar( "r_spotlightbrightness", "2.5" );
|
|
//level.lab_vtol4 thread maps\_attack_heli::heli_spotlight_on( undefined, true );
|
|
level.lab_vtol4 SetLookAtEnt( level._player );
|
|
level.lab_vtol4 maps\_nx_chinese_vtol::vtol_enable_turrets();
|
|
foreach ( turret in level.lab_vtol4.mgturret )
|
|
{
|
|
turret SetAISpread( 20 );
|
|
}
|
|
wait 1.5;
|
|
uav_target = GetEnt( "pos2_target01", "targetname" );
|
|
thread heli_target_missile_with_fire( level.lab_vtol4, uav_target, 1.0, -100 );
|
|
wait 0.35;
|
|
uav_target = GetEnt( "pos2_target02", "targetname" );
|
|
thread heli_target_missile_with_fire( level.lab_vtol4, uav_target, 1.0, -100 );
|
|
wait 0.35;
|
|
uav_target = GetEnt( "pos2_target03", "targetname" );
|
|
thread heli_target_missile_with_fire( level.lab_vtol4, uav_target, 1.0, -100 );
|
|
coverbox = GetEnt( "coverbox03", "targetname" );
|
|
coverbox delete();
|
|
//
|
|
vtol_column = GetEnt( "vtol_column02", "targetname" );
|
|
vtol_column delete();
|
|
wait 0.5;
|
|
coverbox = GetEnt( "coverbox04", "targetname" );
|
|
coverbox delete();
|
|
//
|
|
vtol_column = GetEnt( "vtol_column03", "targetname" );
|
|
vtol_column delete();
|
|
|
|
// check if player is in volume and shellshock him if he is
|
|
//volume = GetEnt( "shellshock_volume", "targetname" );
|
|
//if( level._player IsTouching( volume ))
|
|
// level._player shellshock("default", 3);
|
|
wait 1.0;
|
|
flag_set( "flag_baker_move3" );
|
|
flag_wait( "flag_baker_end_pos" );
|
|
flag_wait( "flag_player_move_end" );
|
|
uav_target = GetEnt( "pos3_target01", "targetname" );
|
|
thread heli_target_missile_with_fire( level.lab_vtol4, uav_target, 1.0, -100 );
|
|
wait 0.35;
|
|
uav_target = GetEnt( "pos3_target02", "targetname" );
|
|
thread heli_target_missile_with_fire( level.lab_vtol4, uav_target, 1.0, -100 );
|
|
//coverbox = GetEnt( "coverbox07", "targetname" );
|
|
//coverbox delete();
|
|
//coverbox = GetEnt( "coverbox08", "targetname" );
|
|
//coverbox delete();
|
|
wait 0.75;
|
|
coverbox = GetEnt( "coverbox05", "targetname" );
|
|
coverbox delete();
|
|
coverbox = GetEnt( "coverbox06", "targetname" );
|
|
coverbox delete();
|
|
wait 2.0;
|
|
uav_target = GetEnt( "pos3_target03", "targetname" );
|
|
thread heli_target_missile_with_fire( level.lab_vtol4, uav_target, 1.0, -100 );
|
|
wait 0.75;
|
|
coverbox = GetEnt( "coverbox09", "targetname" );
|
|
coverbox delete();
|
|
coverbox = GetEnt( "coverbox10", "targetname" );
|
|
coverbox delete();
|
|
coverbox = GetEnt( "coverbox11", "targetname" );
|
|
coverbox delete();
|
|
flag_wait( "flag_vtol_delete" );
|
|
level.lab_vtol4 delete();
|
|
|
|
}
|
|
|
|
heli_target_missile_with_fire(heli, target, delay, fire_offset2)
|
|
{
|
|
fire_offset = 100;
|
|
MagicBullet( "rpgx_straight", heli.origin + (0, fire_offset, fire_offset2), target.origin);
|
|
wait( delay );
|
|
PlayFX( level._effect["explosion_type_1"], target.origin );
|
|
// wait 0.2;
|
|
// PlayFX( level._effect["nx_smoke_n_fire_plume_preseed"], target.origin );
|
|
}
|
|
|
|
vtol_fire_hurt_volumes()
|
|
{
|
|
flag_wait( "flag_baker_move1" );
|
|
hurt_volume = GetEnt( "hurt_volume1", "targetname" );
|
|
//while(1)
|
|
while( !flag( "flag_baker_move2" ) )
|
|
{
|
|
if( level._player IsTouching( hurt_volume ))
|
|
{
|
|
level._player StunPlayer( 1.5 );
|
|
level._player thread play_sound_on_entity( "breathing_hurt" );
|
|
if( level._player.health > 34 )
|
|
level._player.health = level._player.health - 34;
|
|
else
|
|
//level._player.health = 0;
|
|
level._player kill();
|
|
}
|
|
wait 1.5;
|
|
}
|
|
hurt_volume = GetEnt( "hurt_volume2", "targetname" );
|
|
while( !flag( "flag_baker_move3" ) )
|
|
{
|
|
if( level._player IsTouching( hurt_volume ))
|
|
{
|
|
level._player StunPlayer( 1.5 );
|
|
level._player thread play_sound_on_entity( "breathing_hurt" );
|
|
if( level._player.health > 34 )
|
|
level._player.health = level._player.health - 34;
|
|
else
|
|
//level._player.health = 0;
|
|
level._player kill();
|
|
}
|
|
wait 1.5;
|
|
}
|
|
hurt_volume = GetEnt( "hurt_volume3", "targetname" );
|
|
while( 1 )
|
|
{
|
|
if( level._player IsTouching( hurt_volume ))
|
|
{
|
|
level._player StunPlayer( 1.5 );
|
|
level._player thread play_sound_on_entity( "breathing_hurt" );
|
|
if( level._player.health > 34 )
|
|
level._player.health = level._player.health - 34;
|
|
else
|
|
//level._player.health = 0;
|
|
level._player kill();
|
|
}
|
|
wait 1.5;
|
|
}
|
|
}
|
|
|
|
vtol_squad_control()
|
|
{
|
|
level endon ("destroy_all_vtols");
|
|
//level.baker = spawn_targetname( "baker_uav", true);
|
|
//level.baker magic_bullet_shield();
|
|
level.baker.ignoreme = true;
|
|
level.baker.ignorerandombulletdamage = true;
|
|
level.baker.ignoresupression = true;
|
|
level.baker.disableBulletWhizbyReaction = true;
|
|
level.baker disable_pain();
|
|
level.baker.dontavoidplayer = true;
|
|
level.baker.goalradius = 8;
|
|
// Add objective marker on Baker
|
|
//Objective_Add( 1, "current", "Follow Baker to the exfil point" );
|
|
//Objective_OnEntity( 1, level.baker );
|
|
|
|
flag_wait( "flag_baker_move" );
|
|
thread add_dialogue_line( "Baker", "Tangos up ahead!", "g" );
|
|
node_baker = getnode( "node_baker_cover", "targetname" );
|
|
level.baker SetGoalNode( node_baker );
|
|
level.baker waittill( "goal" );
|
|
|
|
flag_wait( "flag_baker_move0" );
|
|
node_baker = getnode( "node_baker_cover00", "targetname" );
|
|
level.baker SetGoalNode( node_baker );
|
|
level.baker waittill( "goal" );
|
|
|
|
flag_wait( "flag_baker_move1" );
|
|
// first delete the ai blocker
|
|
ai_blocker = GetEnt( "brush_ai_blocker", "targetname" );
|
|
ai_blocker delete();
|
|
//thread add_dialogue_line( "Baker", "It's targetting us. Get to hard cover", "g" );
|
|
level.baker dialogue_queue( "sky_bak_vtol_targetingusgetcover" );
|
|
// Baker Melee anim stuff
|
|
node_baker = getnode( "node_baker_melee_start", "targetname" );
|
|
level.baker SetGoalNode( node_baker );
|
|
level.baker waittill( "goal" );
|
|
anim_node = GetEnt( "node_baker_melee", "targetname" );
|
|
melee_victim = spawn_targetname( "baker_melee_victim", true );
|
|
melee_victim.animname = "victim";
|
|
guys = [];
|
|
guys["ally_01"] = level.baker;
|
|
guys["victim"] = melee_victim;
|
|
|
|
anim_node anim_single( guys, "baker_vtol_melee" );
|
|
melee_victim kill();
|
|
|
|
|
|
// End Baker Melee anim stuff
|
|
node_baker = getnode( "node_baker_cover01", "targetname" );
|
|
level.baker SetGoalNode( node_baker );
|
|
level.baker waittill( "goal" );
|
|
flag_wait( "flag_spawn_wave2" );
|
|
//thread add_dialogue_line( "Baker", "Team A, we can't handle this VTOL! Get us KillSat clearance now!", "g" );
|
|
level.baker dialogue_queue( "sky_bak_vtol_needkillsatclearance" );
|
|
flag_set( "flag_baker_pos1" );
|
|
flag_wait( "flag_baker_move2" );
|
|
//thread add_dialogue_line( "Baker", "Keep moving up !", "g" );
|
|
level.baker dialogue_queue( "sky_bak_vtol_keepmovingup" );
|
|
// Baker getting blown up anim
|
|
// first delete the ai blocker
|
|
ai_blocker = GetEnt( "brush_ai_blocker2", "targetname" );
|
|
ai_blocker delete();
|
|
wait 0.1;
|
|
// then send baker to his node
|
|
/* node_baker = getnode( "node_baker_blownup", "targetname" );
|
|
level.baker SetGoalNode( node_baker );
|
|
level.baker.ignoreall = true;
|
|
level.baker waittill( "goal" );
|
|
anim_node = GetEnt( "node_anim_baker_thrown", "targetname" );
|
|
anim_node anim_reach_solo( level.baker, "corner_standR_explosion_divedown" ); */
|
|
flag_set( "flag_baker_explo_pos" );
|
|
//flag_wait( "flag_spawn_wave3" );
|
|
//flag_wait( "flag_baker_blown_up" );
|
|
//thread vtol_slow_mo();
|
|
|
|
// check if player is in volume and shellshock him if he is
|
|
/* volume = GetEnt( "shellshock_volume", "targetname" );
|
|
if( level._player IsTouching( volume ))
|
|
{
|
|
level._player AllowStand( false );
|
|
level._player AllowCrouch( false );
|
|
level._player shellshock("default", 4);
|
|
earthquake( 3, 0.2, level._player.origin, 2000 );
|
|
}
|
|
anim_node anim_single_solo( level.baker, "corner_standR_explosion_divedown" ); */
|
|
// baker getup anim
|
|
/* anim_node = GetEnt( "node_anim_baker_getup", "targetname" );
|
|
anim_node anim_single_solo( level.baker, "hunted_pronehide_2_stand_v2" );
|
|
level.baker.ignoreall = false; */
|
|
//if( level._player IsTouching( volume ))
|
|
//{
|
|
/* level._player AllowStand( true );
|
|
level._player AllowCrouch( true );
|
|
if( level._player IsTouching( volume ))
|
|
level._player Allowprone( false );
|
|
wait 0.1;
|
|
level._player Allowprone( true ); */
|
|
//}
|
|
// first delete the ai blocker
|
|
ai_blocker = GetEnt( "brush_ai_blocker3", "targetname" );
|
|
ai_blocker delete();
|
|
// End Baker getting blown up anim
|
|
node_baker = getnode( "node_baker_cover02", "targetname" );
|
|
level.baker SetGoalNode( node_baker );
|
|
level.baker waittill( "goal" );
|
|
//add_dialogue_line( "Team A", "We're on the horn with C&C now, but this is a tall order. We'll need time.", "purple", 4 );
|
|
radio_dialogue( "sky_teama_vtol_onthehorn" );
|
|
//add_dialogue_line( "Baker", "The sooner the better!", "green", 2 );
|
|
level.baker dialogue_queue( "sky_bak_vtol_soonerthebetter" );
|
|
flag_set( "flag_baker_pos2" );
|
|
flag_wait( "flag_baker_move3" );
|
|
wait 1.5;
|
|
//thread add_dialogue_line( "Baker", "Behind the pillar. Go!", "g" );
|
|
level.baker dialogue_queue( "sky_bak_vtol_getbehindpillar" );
|
|
//add_dialogue_line( "Team A", "Any time is good, Team A!", "green", 2 );
|
|
level.baker dialogue_queue( "sky_bak_vtol_anytimeisgood" );
|
|
node_baker = getnode( "node_baker_cover03", "targetname" );
|
|
level.baker SetGoalNode( node_baker );
|
|
level.baker waittill( "goal" );
|
|
flag_set( "flag_baker_end_pos" );
|
|
//add_dialogue_line( "Baker", "We've got an uplink to C&C, patching you through now.", "green", 2 );
|
|
radio_dialogue( "sky_teama_vtol_uplink" );
|
|
}
|
|
|
|
vtol_enemy_control()
|
|
{
|
|
flag_wait( "flag_baker_move" );
|
|
spawners = getentarray( "uav_enemies_wave1", "targetname" );
|
|
//array_thread( spawners, ::spawn_ai );
|
|
foreach( spawner in spawners )
|
|
{
|
|
// spawn and then add a wait to offset animations
|
|
spawner spawn_ai();
|
|
wait 0.2;
|
|
}
|
|
flag_wait( "flag_spawn_wave2" );
|
|
spawners = getentarray( "uav_enemies_wave2", "targetname" );
|
|
//array_thread( spawners, ::spawn_ai );
|
|
foreach( spawner in spawners )
|
|
{
|
|
// spawn and then add a wait to offset animations
|
|
spawner spawn_ai();
|
|
wait 0.2;
|
|
}
|
|
flag_wait( "flag_spawn_wave3" );
|
|
// spawn dudes
|
|
spawners = getentarray( "uav_enemies_wave3", "targetname" );
|
|
//array_thread( spawners, ::spawn_ai );
|
|
foreach( spawner in spawners )
|
|
{
|
|
// spawn and then add a wait to offset animations
|
|
spawner spawn_ai();
|
|
wait 0.2;
|
|
}
|
|
}
|
|
|
|
vtol_slow_mo()
|
|
{
|
|
// Don't slomo the mission critical speech
|
|
SoundSetTimeScaleFactor( "Mission", 0 );
|
|
SoundSetTimeScaleFactor( "Shellshock", 0 );
|
|
SoundSetTimeScaleFactor( "Voice", 0 );
|
|
SoundSetTimeScaleFactor( "Menu", 0 );
|
|
SoundSetTimeScaleFactor( "Effects1", 0 );
|
|
SoundSetTimeScaleFactor( "Effects2", 0 );
|
|
SoundSetTimeScaleFactor( "Announcer", 0 );
|
|
SoundSetTimeScaleFactor( "Music", 0 );
|
|
SoundSetTimeScaleFactor( "vignette3d", 1 );
|
|
SoundSetTimeScaleFactor( "vignette2d", 1 );
|
|
|
|
slomoLerpTime_in = 2.5;
|
|
slomoLerpTime_out = 0.65;
|
|
slomobreachplayerspeed = 0.1;
|
|
//slomoSpeed = 0.225;
|
|
//slomoDuration = 10;
|
|
slomoSpeed = 0.2;
|
|
slomoDuration = 8;
|
|
|
|
//music_stop();
|
|
|
|
// Start slo motion
|
|
slowmo_start();
|
|
slowmo_setspeed_slow( slomoSpeed );
|
|
slowmo_setlerptime_in( slomoLerpTime_in );
|
|
slowmo_lerp_in();
|
|
|
|
level._player SetMoveSpeedScale( slomobreachplayerspeed );
|
|
|
|
// Wait slo mo duration
|
|
wait slomoDuration * slomoSpeed;
|
|
|
|
// Stop slo motion
|
|
slowmo_setlerptime_out( slomoLerpTime_out );
|
|
slowmo_lerp_out();
|
|
slowmo_end();
|
|
level._player SetMoveSpeedScale( 1.0 );
|
|
}
|
|
|
|
vtol_collapse_temp_dialogue()
|
|
{
|
|
flag_wait( "flag_uav_crash" );
|
|
|
|
// Play sat view pip
|
|
flag_set ("play_orbital_pip_1");
|
|
// timed out to match the currently blocked in vtol crash scene
|
|
wait 1.5;
|
|
//thread add_dialogue_line( "Baker", "Finally. Specter, lase the VTOL while I get its attention.", "g" );
|
|
level.baker dialogue_queue( "sky_bak_vtol_lasevtol" );
|
|
wait 4.0;
|
|
//thread add_dialogue_line( "Baker", "Ready? 1.. 2.. 3...", "g" );
|
|
level.baker dialogue_queue( "sky_bak_vtol_readyon3" );
|
|
//wait 0.5;
|
|
//thread add_dialogue_line( "Baker", "Now! Over here, you bucket of bolts!", "g" );
|
|
level.baker dialogue_queue( "sky_bak_vtol_now" );
|
|
wait 1.75;
|
|
//thread add_dialogue_line( "Baker", "Way to go! Now we just need to figure out a new way out of here.", "g" );
|
|
level.baker dialogue_queue( "sky_bak_vtol_waytogo" );
|
|
//thread add_dialogue_line( "Baker", "Fffffuuuuuuuuu.....!", "g" );
|
|
level.baker dialogue_queue( "sky_bak_vtol_fuuu" );
|
|
}
|
|
|
|
vtol_collapse_reposition_player()
|
|
{
|
|
flag_wait( "flag_vtol_floor_collapse_done" );
|
|
level._player maps\_nx_utility::move_player_to_start_point( "playerstart_vtol_floor_collapse" );
|
|
}
|
|
|
|
// end new vtol encounter stuff
|
|
//
|
|
//
|
|
//
|
|
|
|
lab_vtol_setup()
|
|
{
|
|
//trigger = GetEnt ("vtol_attack", "targetname");
|
|
//trigger waittill ("trigger");
|
|
level waittill ("spawn_vtol");
|
|
|
|
level.lab_vtol = spawn_vehicle_from_targetname_and_drive( "lab_vtol_spawner" );
|
|
|
|
level.lab_vtol.targetname = "lab_vtol";
|
|
level.lab_vtol godon();
|
|
|
|
foreach ( turret in level.lab_vtol.mgturret )
|
|
{
|
|
turret SetAISpread( 15 );
|
|
}
|
|
|
|
|
|
// Start it out generally looking towrds where the player came from
|
|
//target = GetEnt( "vtol_rocket_target_a" , "targetname");
|
|
//level.lab_vtol SetLookAtEnt( target );
|
|
|
|
level.lab_vtol SetVehicleTeam( "allies" );
|
|
//level.lab_vtol vtol_behavior();
|
|
floor_collapse();
|
|
}
|
|
/*
|
|
vtol_scientists()
|
|
{
|
|
vtol_scientists = [];
|
|
vtol_scientists [ vtol_scientists.size ] = spawn_targetname ( "vtol_scientist_runner_1" );
|
|
vtol_scientists [ vtol_scientists.size ] = spawn_targetname ( "vtol_scientist_runner_2" );
|
|
vtol_scientists [ vtol_scientists.size ] = spawn_targetname ( "vtol_scientist_runner_3" );
|
|
foreach ( scientist in vtol_scientists)
|
|
{
|
|
scientist.ignoreall = true;
|
|
scientist.goalradius = 64;
|
|
// scientist waittill ( "goal" );
|
|
// scientist delete();
|
|
}
|
|
}
|
|
|
|
vtol_behavior()
|
|
{
|
|
self endon ("death");
|
|
|
|
// Destroy the path back to the staircase
|
|
fire_rocket_1 = GetStruct( "fire_rocket_1", "script_noteworthy" );
|
|
fire_rocket_1 waittill ( "trigger" );
|
|
self thread vtol_rocket_attack ( "vtol_rocket_target_a" );
|
|
|
|
// Wait until the end of the first path is reached
|
|
done_with_intro = GetStruct( "vtol_done_with_intro", "script_noteworthy" );
|
|
done_with_intro waittill ( "trigger" );
|
|
|
|
// Start trying to kill Player and Baker
|
|
self SetVehicleTeam( "axis" );
|
|
self thread maps\_attack_heli::heli_spotlight_on( undefined, true );
|
|
self vehicle_detachfrompath();
|
|
|
|
// Destroy the second target.
|
|
self vtol_rocket_attack ( "vtol_rocket_target_c" );
|
|
|
|
self vtol_move_to( "vtol_position_c" );
|
|
|
|
iprintln( "Moving to position c" );
|
|
|
|
// Wait until the player moves forward, or the conversation indicates they should move forward
|
|
flag_wait_any ( "vtol_target_area_d", "force_vtol_move_d" );
|
|
|
|
self vtol_move_to( "vtol_position_d" );
|
|
|
|
iprintln( "Moving to position d" );
|
|
|
|
// Wait until the player moves forward, or the conversation indicates they should move forward
|
|
flag_wait_any ( "vtol_target_area_e", "force_vtol_move_e" );
|
|
// Destroy the cover piece
|
|
self thread vtol_rocket_attack ( "vtol_cover_d" );
|
|
|
|
self vtol_move_to( "vtol_position_e" );
|
|
|
|
iprintln( "Moving to position e" );
|
|
|
|
// Wait until the player moves forward, or the conversation indicates they should move forward
|
|
flag_wait_any ( "vtol_target_area_f", "force_vtol_move_f" );
|
|
// Destroy the cover piece
|
|
self thread vtol_rocket_attack ( "vtol_cover_e" );
|
|
|
|
self vtol_move_to( "vtol_position_f" );
|
|
iprintln( "Moving to position f" );
|
|
|
|
self vehicle_resumepath();
|
|
|
|
level waittill ( "baker_distracts_vtol" );
|
|
self SetLookAtEnt( level.baker );
|
|
|
|
foreach ( turret in level.lab_vtol.mgturret)
|
|
{
|
|
// Make it miss Baker at least sometimes while he's distracting it.
|
|
turret SetTurretTargetPosition( level.baker.origin );
|
|
turret SetAISpread( 2 );
|
|
}
|
|
self vehicle_detachfrompath();
|
|
heli_goal = GetStruct( "vtol_position_final", "script_noteworthy" );
|
|
// self AttachPath ( heli_goal);
|
|
iprintln( "Moving to final position" );
|
|
self.currentnode = heli_goal;
|
|
}
|
|
|
|
vtol_move_to( goal )
|
|
{
|
|
heli_goal = GetStruct( goal , "script_noteworthy" );
|
|
self SetVehGoalPos( heli_goal.origin, true );
|
|
}
|
|
*/
|
|
vtol_player_fire_blockers()
|
|
{
|
|
// First make sure they have no collision initially.
|
|
blocker_a = GetEnt ( "fire_block_a", "targetname" );
|
|
blocker_c = GetEnt ( "fire_block_c", "targetname" );
|
|
blocker_a NotSolid();
|
|
blocker_c NotSolid();
|
|
|
|
}
|
|
/*
|
|
vtol_kill_zone ( targetname )
|
|
{
|
|
level endon ( "floor_collapsed" );
|
|
kill_zone = GetEnt ( targetname, "targetname" );
|
|
kill_zone waittill ( "trigger" );
|
|
level.lab_vtol SetLookAtEnt ( level._player );
|
|
add_dialogue_line( "Baker", "You're gonna get killed out there! Get to hard cover!", "green", 2 );
|
|
wait 2;
|
|
if ( level._player isTouching ( kill_zone ))
|
|
foreach ( turret in level.lab_vtol.mgturret)
|
|
{
|
|
turret SetTurretTargetPosition( level._player.origin );
|
|
turret SetAISpread( 2 );
|
|
level._player kill();
|
|
}
|
|
vtol_kill_zone ( targetname );
|
|
}
|
|
|
|
vtol_attack_spawn_closet()
|
|
{
|
|
level endon ( "floor_collapsed" );
|
|
// To prevent the player from making a dash for the spawn closet.
|
|
flag_wait ( "vtol_target_area_g" );
|
|
level.lab_vtol thread vtol_rocket_attack ( "vtol_rocket_target_g" );
|
|
vtol_kill_zone ( "vtol_target_area_g" );
|
|
}
|
|
|
|
vtol_baker_distraction_timeout()
|
|
{
|
|
// Eventually, there should be a time limit on how long Baker can survive in the open.
|
|
}
|
|
|
|
vtol_enemies_logic()
|
|
{
|
|
// Baker will advance when the cover is destroyed, even if there are enemies nearby. He's running for his life, after all.
|
|
level.baker.fixednode = true;
|
|
|
|
level.vtol_enemies = [];
|
|
|
|
// Wave 1
|
|
vtol_enemies_spawn_function ( "vtol_wave_1_enemy_spawner_1" );
|
|
vtol_enemies_spawn_function ( "vtol_wave_1_enemy_spawner_2" );
|
|
|
|
flag_wait_any ( "vtol_target_area_e", "force_vtol_move_e", "vtol_spawn_wave_2" );
|
|
|
|
// Wave 2
|
|
vtol_enemies_spawn_function ( "vtol_wave_2_enemy_spawner_1" );
|
|
vtol_enemies_spawn_function ( "vtol_wave_2_enemy_spawner_2" );
|
|
|
|
flag_wait_any ( "vtol_target_area_f", "force_vtol_move_f", "vtol_spawn_wave_3" );
|
|
|
|
// Wave 3
|
|
vtol_enemies_spawn_function ( "vtol_wave_3_enemy_spawner_1" );
|
|
vtol_enemies_spawn_function ( "vtol_wave_3_enemy_spawner_2" );
|
|
|
|
waittill_dead_or_dying ( level.vtol_enemies );
|
|
// iprintln ( "Everybody dead!" );
|
|
flag_set ( "vtol_enemies_dead" );
|
|
|
|
// Back to regular behavior
|
|
level.baker.fixednode = false;
|
|
|
|
}
|
|
|
|
vtol_enemies_spawn_function( targetname )
|
|
{
|
|
enemy = spawn_targetname ( targetname);
|
|
level.vtol_enemies[level.vtol_enemies.size] = enemy;
|
|
enemy SetIsVisibleInXray();
|
|
// These guys shouldn't pose much of an actual threat
|
|
enemy.accuracy = 0.5;
|
|
//enemy.health = 25;
|
|
// Make sure they don't ragdoll through the floor (which is a script_brushmodel), or bleed all over it
|
|
enemy.skipBloodPool = true;
|
|
enemy.noragdoll = true;
|
|
// And they know where Baker is right away.
|
|
enemy getEnemyInfo( level.baker );
|
|
}
|
|
|
|
|
|
vtol_rocket_attack ( targetname )
|
|
{
|
|
self endon ( "death" );
|
|
target = GetEnt( targetname , "targetname" );
|
|
destination = target.origin;
|
|
self SetLookAtEnt( target);
|
|
// Can't seem to get proper rockets to aim precisely
|
|
// self thread maps\_attack_heli::heli_fire_missiles( target, 2, .5 );
|
|
// MagicBullet( "rpgx_straight", (self GetTagOrigin("tag_missile_left")), (target.origin + randomvectorrange ( 1, 3)) );
|
|
// wait .3;
|
|
rocket = MagicBullet( "rpgx_straight", (self GetTagOrigin( "tag_missile_right" )), (destination + randomvectorrange ( 1, 3)) );
|
|
rocket waittill ( "death" );
|
|
|
|
// Start a fire at the target location. Should set up a way to turn these all off later.
|
|
PlayLoopedFX( level._effect[ "firelp_large_pm_bh1" ] , 2, destination );
|
|
|
|
self ClearLookAtEnt();
|
|
self SetLookAtEnt( level.baker );
|
|
}
|
|
|
|
vtol_baker_behavior()
|
|
{
|
|
|
|
}
|
|
|
|
cover_health_watcher( cover_targetname )
|
|
{
|
|
cover = GetEnt ( cover_targetname, "targetname");
|
|
cover SetCanDamage( true );
|
|
while ( 1 )
|
|
{
|
|
// Wait until hit by the VTOL's rocket
|
|
cover waittill ("damage", damage, attacker, direction_vec, point, type );
|
|
if ( type == "MOD_PROJECTILE")
|
|
break;
|
|
wait .1;
|
|
}
|
|
PlayFX( level._effect[ "concrete_pillar_explosion"], cover.origin, (-1,0,0) );
|
|
cover delete();
|
|
|
|
cover = GetEnt ( cover_targetname + "_2", "targetname");
|
|
cover SetCanDamage( true );
|
|
|
|
while ( 1 )
|
|
{
|
|
// Wait until hit by the VTOL's second rocket
|
|
cover waittill ("damage", damage, attacker, direction_vec, point, type );
|
|
if ( type == "MOD_PROJECTILE")
|
|
break;
|
|
wait .1;
|
|
}
|
|
|
|
PlayFX( level._effect[ "concrete_pillar_explosion"], cover.origin, (-1,0,0) );
|
|
cover delete();
|
|
|
|
}
|
|
|
|
vtol_temp_timing()
|
|
{
|
|
flag_wait ("vtol_target_area_a");
|
|
level notify ("spawn_vtol");
|
|
// wait for first rocket
|
|
fire_rocket_1 = GetStruct( "fire_rocket_1", "script_noteworthy" );
|
|
fire_rocket_1 waittill ( "trigger" );
|
|
level.lab_vtol thread vtol_rocket_attack ( "vtol_rocket_target_a" );
|
|
|
|
// Baker takes cover
|
|
issue_color_orders ("r81", "allies");
|
|
|
|
done_with_intro = GetStruct( "vtol_done_with_intro", "script_noteworthy" );
|
|
done_with_intro waittill ( "trigger" );
|
|
|
|
wait 1;
|
|
|
|
level.lab_vtol thread vtol_rocket_attack ( "vtol_rocket_target_c" );
|
|
|
|
flag_set ("vtol_spawn_wave_2");
|
|
// Baker takes cover
|
|
level.lab_vtol vtol_move_to( "vtol_position_d" );
|
|
// wait for enemies dead, dialog done
|
|
wait 1;
|
|
|
|
issue_color_orders ("r82", "allies");
|
|
|
|
// level.lab_vtol thread vtol_rocket_attack ( "vtol_cover_c" );
|
|
wait 2;
|
|
// level.lab_vtol thread vtol_rocket_attack ( "vtol_cover_c_2" );
|
|
wait 4;
|
|
|
|
issue_color_orders ("r83", "allies");
|
|
// level.lab_vtol thread vtol_rocket_attack ( "vtol_cover_d" );
|
|
wait 2;
|
|
|
|
flag_set ("vtol_spawn_wave_3");
|
|
// level.lab_vtol thread vtol_rocket_attack ( "vtol_cover_d_2" );
|
|
wait 6;
|
|
// wait for enemies dead, dialog done
|
|
level.lab_vtol vtol_move_to( "vtol_position_e" );
|
|
wait 6;
|
|
issue_color_orders ("r85", "allies");
|
|
// level.lab_vtol thread vtol_rocket_attack ( "vtol_cover_e" );
|
|
wait 2;
|
|
// level.lab_vtol thread vtol_rocket_attack ( "vtol_cover_e_2" );
|
|
level.lab_vtol vtol_move_to( "vtol_position_f" );
|
|
wait 1;
|
|
// level.lab_vtol thread vtol_rocket_attack ( "vtol_cover_f" );
|
|
wait 0.2;
|
|
// level.lab_vtol thread vtol_rocket_attack ( "vtol_cover_f_2" );
|
|
|
|
flag_wait ("vtol_enemies_dead");
|
|
|
|
thread laser_setup();
|
|
}
|
|
|
|
vtol_dialog()
|
|
{
|
|
level notify ("spawn_vtol");
|
|
add_dialogue_line( "Baker", "We're at the exfil location.", "green", 2 );
|
|
add_dialogue_line( "Baker", "Specter, cover me while I make an exit.", "green", 3 );
|
|
|
|
// Wait until player approaches
|
|
// flag_wait ("vtol_target_area_c");
|
|
add_dialogue_line( "Baker", "VTOL incoming!", "green", 2 );
|
|
issue_color_orders ("r82", "allies");
|
|
|
|
add_dialogue_line( "Baker", "It's targeting us! Get to hard cover!", "green", 2 );
|
|
add_dialogue_line( "Baker (To Team A) ", "Team A, we can't handle this VTOL! Get us KillSat clearance now!", "green", 4 );
|
|
add_dialogue_line( "Team A", "We're on the horn with C&C now, but this is a tall order. We'll need time.", "purple", 4 );
|
|
add_dialogue_line( "Baker", "The sooner the better!", "green", 2 );
|
|
|
|
// Baker advances to next cover piece
|
|
issue_color_orders ("r83", "allies");
|
|
thread add_dialogue_line( "Baker (To Player)", "Keep moving up. We've got to find new cover!", "green", 3 );
|
|
|
|
// Time to move forward.
|
|
flag_set ("force_vtol_move_e");
|
|
add_dialogue_line( "Baker (To Team A)", "Any time is good, Team A!", "green", 2 );
|
|
add_dialogue_line( "Team A", "Still clearing confirmation. Just hang on a bit longer.", "purple", 3 );
|
|
|
|
// Baker advances to next cover piece
|
|
issue_color_orders ("r85", "allies");
|
|
add_dialogue_line( "Baker (To Player)", "This cover isn't gonna last, get behind that pillar!", "green", 4 );
|
|
add_dialogue_line( "Baker ", "Keep the pillar between you and the VTOL!", "green", 3 );
|
|
|
|
// Time to move forward.
|
|
flag_set ("force_vtol_move_f");
|
|
|
|
flag_wait ("vtol_enemies_dead");
|
|
|
|
add_dialogue_line( "Team A", "We've got an uplink to C&C, patching you through now.", "purple", 3 );
|
|
thread add_dialogue_line( "Mission Control", "Confirmed. KillSat SH6-0151 is clear of your horizon. Designate your target.", "blue", 4 );
|
|
level notify ("laser_ready");
|
|
|
|
add_dialogue_line( "Baker (To Player)", "Finally. Specter, lase the VTOL while I get its attention.", "green", 3 );
|
|
add_dialogue_line( "Baker (To Player)", "Ready? 1.. 2.. 3...", "green", 3 );
|
|
|
|
// Baker runs out to the left.
|
|
issue_color_orders ("r83", "allies");
|
|
thread add_dialogue_line( "Baker", "Now! Over here, you bucket of bolts!", "green", 2 );
|
|
|
|
|
|
level notify ("baker_distracts_vtol");
|
|
thread laser_setup();
|
|
level.baker SetEntityTarget( level.lab_vtol );
|
|
level.lab_vtol waittill ("death");
|
|
thread add_dialogue_line( "Baker", "Way to go! Now we just need to figure out a new way out of here.", "green", 3 );
|
|
level.lab_vtol waittill ("crash_done");
|
|
add_dialogue_line( "Baker", "Fffffuuuuuuuuu.....!", "green", 3 );
|
|
|
|
}
|
|
*/
|
|
floor_collapse()
|
|
{
|
|
// Wait until the VTOL actually impacts and explodes.
|
|
// level.lab_vtol waittill ("crash_done");
|
|
flag_wait ("flag_getup");
|
|
thread office_enemies_logic();
|
|
thread fx_kill_vtol_fx();
|
|
Exploder( "fx_office_inferno" );
|
|
|
|
// Show cloud ring.
|
|
thread fx_show_cloud_ring();
|
|
|
|
// Get rid of the floor.
|
|
floor = GetEnt ("collapsing_floor", "targetname");
|
|
floor_ai = GetEnt ("collapsing_floor_ai", "targetname");
|
|
floor delete();
|
|
floor_ai delete();
|
|
thread maps\nx_skyscraper_fx::set_vision_and_fog("exterior_up_high", 1); // set appropriate vision and fog
|
|
ClearAllCorpses();
|
|
|
|
level notify ("floor_collapsed");
|
|
}
|
|
|
|
office_enemies_logic()
|
|
{
|
|
|
|
level.office_enemies = [];
|
|
|
|
// Wave 1
|
|
office_enemies_spawn_function ("office_wave_1_enemy_spawner_1");
|
|
office_enemies_spawn_function ("office_wave_1_enemy_spawner_2");
|
|
office_enemies_spawn_function ("office_wave_1_enemy_spawner_3");
|
|
office_enemies_spawn_function ("office_wave_1_enemy_spawner_4");
|
|
office_enemies_spawn_function ("office_wave_1_enemy_spawner_5");
|
|
office_enemies_spawn_function ("office_wave_1_enemy_spawner_6");
|
|
office_enemies_spawn_function ("office_wave_1_enemy_spawner_7");
|
|
office_enemies_spawn_function ("office_wave_1_enemy_spawner_8");
|
|
|
|
foreach (enemy in level.office_enemies)
|
|
{
|
|
enemy.ignoreall = true;
|
|
}
|
|
flag_wait( "flag_vtol_floor_collapse_done" );
|
|
foreach (enemy in level.office_enemies)
|
|
{
|
|
enemy.ignoreall = false;
|
|
}
|
|
|
|
waittill_dead_or_dying ( level.office_enemies );
|
|
level notify ("office_enemies_dead");
|
|
// iprintln ("Everybody dead!");
|
|
|
|
}
|
|
|
|
office_enemies_spawn_function( targetname )
|
|
{
|
|
enemy = spawn_targetname ( targetname);
|
|
level.office_enemies[level.office_enemies.size] = enemy;
|
|
enemy SetIsVisibleInXray();
|
|
// These guys shouldn't pose much of an actual threat
|
|
enemy getEnemyInfo( level.baker );
|
|
}
|
|
//*******************************************************************
|
|
// Laser targeted Laser! *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
laser_setup()
|
|
{
|
|
// level waittill ("laser_ready");
|
|
//flag_wait( "flag_uav_crash" );
|
|
//wait 14;
|
|
// When the player presses the fire button, send this notify
|
|
level._player notifyOnPlayerCommand( "fired_laser", "+attack" );
|
|
//thread check_for_laser_targeting_device();
|
|
thread force_laser_targeting_device();
|
|
thread laser_targeting_device_logic();
|
|
thread satellite_orbit();
|
|
// level.lab_vtol waittill ("death");
|
|
flag_wait( "flag_vtol_floor_collapse_done" );
|
|
level._player LaserForceOff();
|
|
level._player notify ("laser_off");
|
|
}
|
|
|
|
/*
|
|
check_for_laser_targeting_device()
|
|
{
|
|
|
|
while ( level._player GetCurrentWeapon() != "m9")
|
|
{
|
|
wait .1;
|
|
}
|
|
|
|
iprintln ("ltd");
|
|
waittillframeend;
|
|
|
|
level._player thread laser_targeting_device_logic();
|
|
|
|
level._player waittill ("weapon_change");
|
|
/*
|
|
while ( level._player GetCurrentWeapon() == "m9")
|
|
{
|
|
wait .0.05;
|
|
}
|
|
*/
|
|
/*
|
|
iprintln ("not ltd");
|
|
level._player allowFire( true );
|
|
waittillframeend;
|
|
|
|
check_for_laser_targeting_device();
|
|
}
|
|
*/
|
|
|
|
force_laser_targeting_device()
|
|
{
|
|
// Give the player the "laser designator"
|
|
level._player GiveWeapon( "m9" );
|
|
level.player_weapon = level._player GetCurrentWeapon();
|
|
level._player EnableWeapons();
|
|
// Force the player to use the designator
|
|
level._player SwitchToWeapon( "m9" );
|
|
level._player DisableWeaponSwitch();
|
|
level._player DisableOffhandWeapons();
|
|
//level.lab_vtol godoff();
|
|
|
|
// level.lab_vtol waittill ("death");
|
|
flag_wait( "flag_vtol_floor_collapse_done" );
|
|
|
|
// Back to the regular weapons
|
|
level._player EnableOffhandWeapons();
|
|
level._player EnableWeaponSwitch();
|
|
level._player SwitchToWeapon( "lancer_xray" );
|
|
level._player allowFire( true );
|
|
}
|
|
|
|
laser_targeting_device_logic()
|
|
{
|
|
level endon ("floor_collapsed");
|
|
// level._player endon ("weapon_change");
|
|
level._player allowFire( false );
|
|
lock_on_meter_init();
|
|
thread lock_on_meter();
|
|
|
|
level._player.lock_on_complete = 2;
|
|
level._player.cool_down_complete = 3;
|
|
|
|
level._player.lock_on_percent = 0;
|
|
while ( 1 )
|
|
{
|
|
level._player waittill( "fired_laser" );
|
|
thread laser_code_pattern();
|
|
// thread draw_orbital_laser();
|
|
level._player laser_designate_target();
|
|
//level._player LaserForceOn();
|
|
// level notify ("laser_off");
|
|
level._player LaserForceOff();
|
|
thread cool_down_meter();
|
|
}
|
|
}
|
|
|
|
laser_code_pattern()
|
|
{
|
|
delay = 0.05;
|
|
level endon ("laser_off");
|
|
level endon ("floor_collapsed");
|
|
while ( 1 )
|
|
{
|
|
level._player LaserForceOn();
|
|
wait (delay + RandomFloat (0.2));
|
|
level._player LaserForceOff();
|
|
wait delay;
|
|
}
|
|
}
|
|
|
|
laser_designate_target()
|
|
{
|
|
// level._player endon ("weapon_change");
|
|
|
|
// self waittill( "fired_laser" );
|
|
|
|
trace = self get_laser_designated_trace();
|
|
prior_entity = trace[ "entity" ];
|
|
|
|
while( level._player AttackButtonPressed() )
|
|
{
|
|
trace = self get_laser_designated_trace();
|
|
position = trace[ "position" ];
|
|
entity = trace[ "entity" ];
|
|
if ( isdefined( prior_entity ) && isdefined( entity ) && entity.classname == "script_vehicle" )
|
|
{
|
|
if ( prior_entity == entity )
|
|
{
|
|
prior_entity = entity;
|
|
level._player.lock_on_percent += ( .05 / level._player.lock_on_complete );
|
|
iprintln("lock-on: " + level._player.lock_on_percent);
|
|
if ( level._player.lock_on_percent >= 1 )
|
|
{
|
|
iprintln ("locked!!!");
|
|
level._player.lock_on_percent = 0;
|
|
level notify( "laser_coordinates_received" );
|
|
thread draw_orbital_laser( entity );
|
|
break;
|
|
}
|
|
level notify( "lock_on_start" );
|
|
wait .05;
|
|
}
|
|
else
|
|
{
|
|
iprintln("lock-on dropped");
|
|
level._player.lock_on_percent -= ( .05 / level._player.cool_down_complete );
|
|
if( level._player.lock_on_percent < 0 )
|
|
{
|
|
level._player.lock_on_percent = 0;
|
|
}
|
|
iprintln("dropped: " + level._player.lock_on_percent);
|
|
level notify("lock_on_dropped");
|
|
wait .05;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
|
|
level._player.lock_on_percent -= ( .05 / level._player.cool_down_complete );
|
|
if( level._player.lock_on_percent < 0 )
|
|
{
|
|
level._player.lock_on_percent = 0;
|
|
}
|
|
iprintln ("no target: " + level._player.lock_on_percent);
|
|
level notify("lock_on_dropped");
|
|
wait .05;
|
|
trace = self get_laser_designated_trace();
|
|
prior_entity = trace[ "entity" ];
|
|
}
|
|
}
|
|
|
|
// take away laser
|
|
level notify( "laser_off" );
|
|
}
|
|
|
|
lock_on_meter_init()
|
|
{
|
|
level.lock_on_fill_max_height = 115;
|
|
|
|
level._player.lock_on_frame = NewHudElem( );
|
|
level._player.lock_on_frame.alignX = "center";
|
|
level._player.lock_on_frame.alignY = "bottom";
|
|
level._player.lock_on_frame.horzAlign = "center";
|
|
level._player.lock_on_frame.vertAlign = "bottom";
|
|
level._player.lock_on_frame.x = 2;
|
|
level._player.lock_on_frame.y = -120;
|
|
level._player.lock_on_frame setShader( "hud_temperature_gauge", 35, 150 );
|
|
level._player.lock_on_frame.alpha = 1;
|
|
level._player.lock_on_frame.sort = 4;
|
|
|
|
level._player.lock_on_fill = NewHudElem( );
|
|
level._player.lock_on_fill.alignX = "center";
|
|
level._player.lock_on_fill.alignY = "bottom";
|
|
level._player.lock_on_fill.horzAlign = "center";
|
|
level._player.lock_on_fill.vertAlign = "bottom";
|
|
level._player.lock_on_fill.x = 2;
|
|
level._player.lock_on_fill.y = -152;
|
|
level._player.lock_on_fill setShader( "white", 10, 1 );
|
|
level._player.lock_on_fill.color = ( 1, .9, 0 );
|
|
level._player.lock_on_fill.alpha = 1;
|
|
level._player.lock_on_fill.sort = 1;
|
|
|
|
thread lock_on_meter_wait_for_destroy();
|
|
}
|
|
|
|
lock_on_meter_wait_for_destroy()
|
|
{
|
|
level waittill("laser_coordinates_received");
|
|
|
|
level._player.lock_on_frame destroy();
|
|
level._player.lock_on_fill destroy();
|
|
}
|
|
|
|
cool_down_meter()
|
|
{
|
|
level endon ("laser_coordinates_received");
|
|
level endon( "fired_laser" );
|
|
|
|
while( 1 )
|
|
{
|
|
level._player.lock_on_percent -= ( .05 / level._player.cool_down_complete );
|
|
if( level._player.lock_on_percent < 0 )
|
|
{
|
|
level._player.lock_on_percent = 0;
|
|
break;
|
|
}
|
|
iprintln ("cool down: " + level._player.lock_on_percent);
|
|
wait .05;
|
|
}
|
|
}
|
|
|
|
lock_on_meter()
|
|
{
|
|
level endon ("laser_coordinates_received");
|
|
|
|
while( 1 )
|
|
{
|
|
level waittill ( "lock_on_start" );
|
|
|
|
if( level._player.lock_on_percent <= 1 )
|
|
{
|
|
level._player.lock_on_fill setShader( "white", 10, int(level.lock_on_fill_max_height * level._player.lock_on_percent) );
|
|
if( level._player.lock_on_percent < 1 )
|
|
{
|
|
level._player.lock_on_fill scaleOverTime( level._player.lock_on_complete * (1 - level._player.lock_on_percent), 10, level.lock_on_fill_max_height );
|
|
}
|
|
}
|
|
|
|
level waittill_any ("lock_on_dropped", "laser_coordinates_received", "laser_off");
|
|
|
|
if( level._player.lock_on_percent >= 0 )
|
|
{
|
|
level._player.lock_on_fill setShader( "white", 10, int(level.lock_on_fill_max_height * level._player.lock_on_percent) );
|
|
if( level._player.lock_on_percent > 0 )
|
|
{
|
|
level._player.lock_on_fill scaleOverTime( level._player.cool_down_complete * level._player.lock_on_percent, 10, 1 );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
get_laser_designated_trace()
|
|
{
|
|
eye = self geteye();
|
|
angles = self getplayerangles();
|
|
|
|
forward = anglestoforward( angles );
|
|
end = eye + vector_multiply( forward, 3000 );
|
|
trace = bullettrace( eye, end, true, self );
|
|
|
|
if ( trace ["fraction"] >= 1 )
|
|
{
|
|
trace[ "position" ] = undefined;
|
|
}
|
|
|
|
entity = trace[ "entity" ];
|
|
if ( isdefined( entity ) )
|
|
{
|
|
|
|
if ( isdefined( entity.targetname ) && entity.targetname == "fake_uav")
|
|
{
|
|
entity = GetEnt ("real_uav", "targetname");
|
|
}
|
|
trace[ "position" ] = entity.origin;
|
|
}
|
|
|
|
return trace;
|
|
}
|
|
|
|
draw_orbital_laser( target )
|
|
{
|
|
// level waittill ( "laser_coordinates_received" );
|
|
|
|
wait 1;
|
|
|
|
// satellite = GetEnt ("fake_satellite", "targetname");
|
|
// time = 3;
|
|
|
|
//trace = level._player get_laser_designated_trace();
|
|
|
|
//if ( isdefined( trace[ "position" ]) )
|
|
|
|
//{
|
|
//target = trace[ "position" ];
|
|
// normal = trace[ "normal" ];
|
|
|
|
//xoffset = Randomfloat ( 1 );
|
|
//yoffset = Randomfloat ( 1 );
|
|
|
|
// direction = (satellite.origin - target.origin);
|
|
// normalized_direction = VectorNormalize( direction );
|
|
|
|
// thread draw_line_for_time( satellite.origin, (target + (xoffset,yoffset,0 )) , 1, 0, 0, 0.05 );
|
|
// time -= 0.05;
|
|
// PlayFX ( level._effect[ "nx_laser_orbital_strike" ], (target.origin + (xoffset,yoffset, 0)), normalized_direction );
|
|
// PlayFX( level._effect[ "laser_impact" ], (target + (xoffset,yoffset, 0)), normal );
|
|
laserPos = target GetTagOrigin( "tag_deathfx" );
|
|
PlayFXOnTag( level._effect[ "nx_laser_orbital_strike" ], target, "tag_deathfx" );
|
|
PlayFXOnTag( level._effect[ "nx_laser_orbital_runner" ], target, "tag_deathfx" );
|
|
|
|
wait 1.4;
|
|
|
|
PlayFX( level._effect[ "nx_laser_orbital_strike_short" ], laserPos );
|
|
|
|
wait 0.1;
|
|
|
|
StopFXOnTag( level._effect[ "nx_laser_orbital_strike" ], target, "tag_deathfx", true );
|
|
RadiusDamage( target.origin, 100, 1000, 1000, level._player );
|
|
//}
|
|
|
|
}
|
|
|
|
satellite_orbit()
|
|
{
|
|
level endon ("floor_collapsed");
|
|
satellite = GetEnt ("fake_satellite", "targetname");
|
|
starting_point = satellite.origin;
|
|
|
|
while ( 1 )
|
|
{
|
|
satellite MoveTo ( satellite.origin + (6000, 24064,0), 24);
|
|
satellite waittill ("movedone");
|
|
satellite.origin = starting_point;
|
|
}
|
|
}
|
|
|
|
baker_office_movement()
|
|
{
|
|
flag_wait( "flag_vtol_floor_collapse_done" );
|
|
level.baker enable_ai_color( );
|
|
issue_color_orders( "r87", "allies" );
|
|
trigger_wait_targetname( "trig_baker_enters_office" );
|
|
|
|
thread vtol_enemies_to_hallway();
|
|
issue_color_orders( "r88", "allies" );
|
|
self.ignoreme = false;
|
|
self waittill( "goal" );
|
|
|
|
self.ignoreall = true;
|
|
|
|
baker_aim = GetEnt( "origin_baker_shoot_glass", "targetname" );
|
|
Assert( IsDefined( baker_aim ));
|
|
|
|
glass = GetGlass( "glass_exfiltration_office" );
|
|
blocker = GetEnt( "brush_exfiltration_office", "targetname" );
|
|
Assert( IsDefined( glass ));
|
|
Assert( IsDefined( blocker ));
|
|
|
|
wait 0.5;
|
|
|
|
if( !IsGlassDestroyed( glass ))
|
|
{
|
|
self SetEntityTarget( baker_aim );
|
|
self shoot();
|
|
self shoot();
|
|
self ClearEntityTarget();
|
|
wait 0.05;
|
|
DestroyGlass( glass );
|
|
}
|
|
|
|
wait 0.5;
|
|
//DeleteGlass( glass );
|
|
blocker ConnectPaths();
|
|
blocker delete();
|
|
|
|
issue_color_orders( "r89", "allies" );
|
|
wait 4;
|
|
self.ignoreall = false;
|
|
|
|
level waittill( "office_enemies_dead" );
|
|
|
|
issue_color_orders( "r90", "allies" );
|
|
}
|
|
|
|
vtol_enemies_to_hallway()
|
|
{
|
|
level endon( "office_enemies_dead" );
|
|
|
|
hallway = GetEnt( "vol_exfil_hallway_attack", "targetname" );
|
|
Assert( IsDefined( hallway ));
|
|
|
|
trigger_wait_targetname( "trig_exfil_player_in_hallway" );
|
|
|
|
foreach( guy in level.office_enemies )
|
|
{
|
|
if( IsAlive( guy ))
|
|
{
|
|
guy SetGoalVolumeAuto( hallway );
|
|
wait 0.05;
|
|
}
|
|
}
|
|
}
|
|
|
|
fx_kill_vtol_fx()
|
|
{
|
|
Stop_Exploder( "fx_vtol_ambient" );
|
|
Stop_Exploder( "fx_vtol_dust" );
|
|
Stop_Exploder( "fx_vtol_exp_dust_01" );
|
|
Stop_Exploder( "fx_vtol_exp_dust_02" );
|
|
}
|