nx1-gsc-dump/maps/nx_lunar_escape_exterior.gsc

2859 lines
77 KiB
Plaintext
Raw Permalink Blame History

//****************************************************************************
// **
// Confidential - (C) Activision Publishing, Inc. 2011 **
// **
//****************************************************************************
// **
// Module: NX_LUNAR Exterior Escape Mission Script **
// **
// Created: 2/24/2010 - Daryl Kimoto **
// **
//****************************************************************************
#include maps\_utility;
#include maps\_utility_code;
#include maps\_nx_objective_util;
#include common_scripts\utility;
#include maps\_anim;
#include maps\_vehicle;
//#include maps\_stealth_utility;
//*******************************************************************
// *
// *
//*******************************************************************
main()
{
// maps\_stealth::main();
}
//*******************************************************************
// *
// *
//*******************************************************************
mission_flag_inits()
{
flag_init( "rover_battle_start" );
flag_init( "rover_turret_cooling" );
flag_init( "into_shadows_gunner_1_enemy_dead" );
flag_init( "into_shadows_gunner_2_enemy_dead" );
flag_init( "stealth_group_killed" );
flag_init( "into_shadows_stealth_kills_success" );
flag_init( "lsp_explosion_2_is_current" );
flag_init( "rover_battle_enemies_aware" );
}
//*******************************************************************
// *
// *
//*******************************************************************
airlock_exterior_start()
{
// Start the player and allies
maps\nx_lunar_util::lunar_start( "airlock_exterior_start", "airlock_exterior_eagle_start", "airlock_exterior_falcon_start" );
// Close the airlock door going back to crew
level thread maps\nx_lunar_util::open_lunar_door( "exterior_airlock_door_1" );
//set the sfx helemt state to the proper sound state
flag_set( "sfx_ext_surface_milsuit_depress" ); //(after going through airloack to depresurize)
// Open the airlock door to the exterior
level thread maps\nx_lunar_util::open_lunar_door( "exterior_airlock_door_2" );
// cue the vision set change for going to the exterior lunar surface.
thread maps\nx_lunar_fx::fx_crew_module_exit_vision_change();
// Init combat
maps\nx_lunar_util::lunar_combat_init();
}
airlock_exterior()
{
// Battle chatter
battlechatter_off( "allies" );
level.eagle pushplayer( false );
level.falcon pushplayer( false );
level.eagle thread airlock_exterior_ally_temporary_protection();
level.falcon thread airlock_exterior_ally_temporary_protection();
// Save the game
level thread autosave_now();
// Create effect of battle going on with magic bullets
level thread airlock_exterior_magic_shooting();
// Thread and spawn enemies and allies
level thread airlock_exterior_spawns();
flag_set( "sfx_ext_surface_milsuit_depress" );
level.eagle thread airlock_exterior_dialog();
// One of the enemies flanks the allies and kills a few unless the player is fast enough to kill him first
level thread airlock_exterior_enemy_flanker();
// Enemy and ally cleanup when down in the valley
level thread airlock_exterior_cleanup();
//set the flag for music to start
//flag_set( "music_battle_exterior" );
// Enemies run up from below
level thread airlock_road_runner_movement();
// Prevent traversal stacking (This carries over into the next check point)
level thread maps\nx_lunar_util::lunar_traversal_killer_by_flag( "valley_traversal_kill_ally_trigger", "rough_terrain" );
level thread maps\nx_lunar_util::lunar_traversal_killer_by_flag( "valley_traversal_kill_trigger", "rough_terrain" );
// Trigger volume at valley reached
flag_wait( "mining_valley" );
}
airlock_exterior_dialog()
{
level endon( "mining_valley" );
airlock_exterior_jumpdown_dialog();
// Dialog: Go! Go! Go!
radio_dialogue( "moon_eag_move_04" );
flag_wait( "airlock_exit_first_step_closer" );
flag_set( "music_battle_exterior" );
// Approaching friendlies
// Crow: Approaching on your six!
radio_dialogue( "moon_eag_ext_approachingsix" );
flag_wait( "airlock_exit_second_step_closer" );
// Battle chatter
battlechatter_off( "allies" );
// Dialog: Tangos moving to cover!
radio_dialogue( "moon_fal_ext_01" );
wait( 1.0 );
// Dialog: Oxygen Tanks Chatter
radio_dialogue( "jswc_eag_co_lm_oxtnks" );
// Dialog: Affirmative Chatter
radio_dialogue( "jswc_fal_resp_ack_co_gnrc_affirm" );
flag_wait( "valley_runners_spawned" );
// Battle chatter
battlechatter_on( "allies" );
wait( 3.0 );
// Dialog: Watch it! Across the chasm!
radio_dialogue( "moon_fal_ext_03" );
waittill_aigroupcleared( "enemy_airlock_exit" );
wait( 1.0 );
// Dialog: Ok - moving.
radio_dialogue( "moon_eag_move_09" );
}
airlock_exterior_jumpdown_dialog()
{
level endon( "airlock_exit_first_step_closer" );
look_right_target = create_tag_origin_from_script_origin( "airlock_to_exterior_look_right" );
look_middle_target = create_tag_origin_from_script_origin( "airlock_to_exterior_look_middle" );
look_left_target = create_tag_origin_from_script_origin( "airlock_to_exterior_look_left" );
SetSavedDvar( "ai_lookatblendvalue", 0.05 );
level.falcon SetLookAtEntity( look_left_target );
level.eagle SetLookAtEntity( look_middle_target );
wait( 1.5 );
level.eagle SetLookAtEntity( look_right_target );
// Friendlies seen.
// Riggs: Friendlies at 3 o'clock!
radio_dialogue( "moon_fal_ext_friendlies" );
level.falcon SetLookAtEntity( look_right_target );
// Jumpin down
// Crow: Let's give them support. Come on!
radio_dialogue( "moon_eag_ext_givesupport" );
level.eagle StopLookAt( 120 );
level.falcon StopLookAt( 400 );
// Turn on trigger for jump down
exterior_vista_jump_down = GetEnt( "exterior_vista_jump_down", "targetname" );
exterior_vista_jump_down trigger_on();
wait( 3.0 );
SetSavedDvar( "ai_lookatblendvalue", 0.2 );
}
create_tag_origin_from_script_origin( script_origin_name )
{
script_origin = GetEnt( script_origin_name, "targetname" );
tag_org = spawn_tag_origin();
tag_org.origin = script_origin.origin;
tag_org.angles = script_origin.angles;
return tag_org;
}
airlock_exterior_spawns()
{
level endon( "mining_valley" );
level thread maps\nx_lunar_util::trigger_choice_spawn( "spawn_low_to_high" );
level thread maps\nx_lunar_util::trigger_choice_spawn( "spawn_valley_runners" );
level thread maps\nx_lunar_util::trigger_choice_spawn( "spawn_enemy_airlock_exit_starter" );
level thread maps\nx_lunar_util::trigger_choice_spawn( "spawn_enemy_airlock_exit" );
level thread maps\nx_lunar_util::trigger_choice_spawn( "spawner_road_runners" );
array_spawn_function_targetname( "airlock_exterior_allies", maps\nx_lunar_util::lunar_ally_exterior_fleeing_fodder );
array_spawn_function_targetname( "airlock_exterior_allies", ::airlock_exterior_ally_random_shooting );
array_spawn_function_targetname( "airlock_exterior_allies", ::airlock_exterior_ally_temporary_protection );
maps\_nx_utility::spawn_targetname_and_return_array( "airlock_exterior_allies" );
}
airlock_exterior_magic_shooting()
{
airlock_shot_source_one = GetEnt( "airlock_to_exterior_magic_shot_source", "script_noteworthy" );
enemy_target_array = GetEntArray( "airlock_to_exterior_enemy_target", "targetname" );
// Fire random bullets until player moves closer
while( !flag( "airlock_exit_first_step_closer" ) )
{
wait RandomFloatRange( 0.10, 0.25 );
target_number = RandomIntRange( 0, enemy_target_array.size );
MagicBullet( "lunarrifle", airlock_shot_source_one.origin, enemy_target_array[target_number].origin );
}
run_thread_on_targetname( "enemy_airlock_exit_side_runner", maps\nx_lunar_util::spawn_ai_type_check );
maps\_nx_utility::spawn_targetname_and_return_array( "enemy_airlock_exit_side_runner" );
living_airlock_enemies = get_ai_group_ai( "enemy_airlock_exit" );
level thread maps\nx_lunar_util::clean_all_enemies( living_airlock_enemies );
// wait( 2.25 );
//
// // Dialog: Shit...
// level.eagle thread radio_dialogue( "moon_eag_ext_03" );
//
// wait( 2.0 );
//
// // 11.25 seconds to this point
// MagicBullet( "lunarrifle_silent", airlock_shot_source_two.origin, worker GetTagOrigin ("TAG_EYE") );
}
airlock_exterior_ally_random_shooting()
{
self endon( "death" );
ally_target_array = GetEntArray( "airlock_to_exterior_random_shot", "targetname" );
target_number = RandomIntRange( 0, ally_target_array.size );
target = ally_target_array[target_number];
while( !flag( "airlock_exit_second_step_closer" ) )
{
wait RandomFloatRange( 2.0, 3.0 );
target_number = RandomIntRange( 0, ally_target_array.size );
target = ally_target_array[target_number];
self SetEntityTarget( target );
}
self ClearEntityTarget( target );
}
airlock_exterior_ally_temporary_protection()
{
if( ( self != level.eagle ) && ( self != level.falcon ) )
{
self magic_bullet_shield();
}
self.ignorerandombulletdamage = true;
self.ignoresuppression = true;
self.disableBulletWhizbyReaction = true;
self disable_pain();
allies_move_trigger = GetEnt( "allies_move_forward", "targetname" );
allies_move_trigger waittill( "trigger" );
self.ignorerandombulletdamage = false;
self.ignoresuppression = false;
self.disableBulletWhizbyReaction = false;
self enable_pain();
if( ( self != level.eagle ) && ( self != level.falcon ) )
{
self stop_magic_bullet_shield();
}
}
airlock_exterior_enemy_flanker()
{
level endon( "mining_valley" );
airlock_allies_move_trigger = GetEnt( "allies_move_forward", "targetname" );
airlock_allies_move_trigger waittill( "trigger" );
// Spawn first exterior enemy
first_exterior_enemy_spawner = GetEnt( "first_exterior_enemy", "script_noteworthy" );
first_exterior_enemy = first_exterior_enemy_spawner spawn_ai();
// First exterior enemy thread
first_exterior_enemy thread first_exterior_enemy_thread();
}
first_exterior_enemy_thread()
{
self endon( "death" );
self thread enable_cqbwalk();
self.baseaccuracy = 100.0;
flag_wait( "exterior_exit_flank_killed" );
self enable_dontevershoot();
wait( 1.0 );
self.baseaccuracy = 0.8;
self disable_dontevershoot();
first_enemy_flee_node = GetNode( "first_enemy_flee_node", "targetname" );
self set_goal_radius( 10 );
self SetGoalNode( first_enemy_flee_node );
}
//airlock_exterior_scripted_squad_movement()
//{
// level endon( "mining_valley" );
// first_exterior_ally_movement_trigger = GetEnt( "first_exterior_ally_movement_trigger", "targetname" );
// first_exterior_ally_movement_trigger endon( "trigger" );
//
//
// first_exterior_enemy thread airlock_exterior_enemy_surprise();
// level.eagle.ignoreSuppression = true;
// level.falcon.ignoreSuppression = true;
//
// level.falcon set_goal_radius( 10 );
// falcon_exterior_first_kill_node = GetNode( "falcon_exterior_first_kill", "targetname" );
// level.falcon SetGoalNode ( falcon_exterior_first_kill_node );
//
// flag_wait( "exited_the_building" );
// issue_color_orders( "y100", "allies" );
// issue_color_orders( "r100", "allies" );
// level.eagle.shootObjective = "suppress";
//
// level.falcon waittill( "goal" );
//
// level.eagle.shootObjective = "normal";
//
// level.falcon.ignoreSuppression = false;
// level.eagle.ignoreSuppression = false;
//}
airlock_road_runner_movement()
{
level endon( "into_the_valley" );
level.falcon.oldbaseaccuracy = level.falcon.baseaccuracy;
level.eagle.oldbaseaccuracy = level.eagle.baseaccuracy;
flag_wait( "road_runners_running" );
SetThreatBias( "player_squad", "road_runners", 300000 );
SetThreatBias( "road_runners", "player_squad", 300000 );
level.falcon.baseaccuracy = 10.0;
level.eagle.baseaccuracy = 10.0;
// Battle chatter
battlechatter_off( "allies" );
wait( 1.0 );
// Dialog: Tangos low!
radio_dialogue( "moon_eag_ext_06" );
waittill_aigroupcleared( "road_runners" );
issue_color_orders( "r130", "allies" );
issue_color_orders( "y103", "allies" );
level.falcon.baseaccuracy = 0.0;
level.eagle.baseaccuracy = 0.0;
// Dialog: They're down.
radio_dialogue( "moon_eag_kill_low_03" );
// Battle chatter
battlechatter_on( "allies" );
}
airlock_exterior_cleanup()
{
flag_wait( "into_the_valley" );
road_runners = get_ai_group_ai( "road_runners" );
array_thread( road_runners, maps\_nx_utility::delete_ai_not_bullet_shielded );
enemy_airlock_exit = get_ai_group_ai( "enemy_airlock_exit" );
array_thread( enemy_airlock_exit, maps\_nx_utility::delete_ai_not_bullet_shielded );
// fodder_allies = get_ai_group_ai( "allies" );
// array_thread( fodder_allies, maps\_nx_utility::delete_ai_not_bullet_shielded );
}
//*******************************************************************
// *
// *
//*******************************************************************
mining_valley_start()
{
// Start the player and allies
maps\nx_lunar_util::lunar_start( "mining_valley_start", "mining_valley_eagle_start", "mining_valley_falcon_start" );
level thread maps\nx_lunar_util::trigger_choice_spawn( "spawn_valley_runners" );
//Init Combat
maps\nx_lunar_util::lunar_combat_init();
//Play the water treatment bink
thread maps\nx_lunar_util::lunar_water_treatment_screen_binks();
// Initial Vision
thread maps\nx_lunar_fx::fx_init_vision_surface();
spawn_trigger = GetEnt( "spawn_valley_runners", "targetname" );
spawn_trigger notify( "trigger" );
level.falcon.baseaccuracy = 0.0;
level.eagle.baseaccuracy = 0.0;
level thread maps\nx_lunar_util::lunar_traversal_killer_by_flag( "valley_traversal_kill_trigger", "rough_terrain" );
level thread maps\nx_lunar_util::lunar_traversal_killer_by_flag( "valley_traversal_kill_ally_trigger", "rough_terrain" );
}
mining_valley()
{
// Save the game
level thread autosave_by_name( "mining_valley" );
thread maps\nx_lunar_util::lunar_water_treatment_screen_binks();
// Battle chatter
battlechatter_on( "allies" );
// Make sure allies get into their valley positions
level.eagle pushplayer( true );
level.falcon pushplayer( true );
level thread mining_valley_spawns();
// Enemy gets pipes steaming and firing by shooting them
level thread mining_valley_pipe_attack();
level thread mining_valley_dialog();
flag_wait( "rough_terrain" );
}
mining_valley_dialog()
{
level endon( "rough_terrain" );
// // Dialog: Walker! Keep moving!
// radio_dialogue( "moon_eag_move_01" );
flag_wait( "into_the_valley" );
// Make sure allies don't push player around
level.eagle pushplayer( false );
level.falcon pushplayer( false );
level.falcon.baseaccuracy = 0.5;
level.eagle.baseaccuracy = 0.5;
// Dialog: Watch it!
radio_dialogue( "moon_eag_ext_19" );
maps\nx_lunar_util::waittill_number_of_enemies_killed( 1 );
level.falcon.baseaccuracy = 0.75;
level.eagle.baseaccuracy = 0.75;
// Dialog: He's down!
radio_dialogue( "moon_eag_kill_yell_01" );
maps\nx_lunar_util::waittill_number_of_enemies_killed( 3 );
level.falcon.baseaccuracy = 1.0;
level.eagle.baseaccuracy = 1.0;
// Dialog: That's a kill!
radio_dialogue( "moon_eag_kill_yell_02" );
maps\nx_lunar_util::waittill_all_enemies_dead_or_dying();
// Dialog: They're down!
radio_dialogue( "moon_eag_kill_yell_03" );
}
mining_valley_spawns()
{
level endon( "rough_terrain" );
level thread maps\nx_lunar_util::trigger_choice_spawn( "spawn_valley_backup" );
level thread maps\nx_lunar_util::trigger_choice_spawn( "enemy_valley_lane_runner" );
flag_wait( "into_the_valley" );
// Spawn more enemies based on the number currently alive
wait( .05 ); // Wait for clean up first
current_count = get_ai_group_sentient_count( "enemy_valley" );
valley_fillers = GetEntArray( "enemy_valley_backup", "targetname" )
run_thread_on_targetname( "enemy_valley_backup", maps\nx_lunar_util::spawn_ai_type_check );
spawn_limit = 7 - current_count;
maps\_nx_utility::spawn_targetname_and_return_array( "enemy_valley_backup", spawn_limit );
level thread mining_valley_enemy_movement();
}
mining_valley_enemy_movement()
{
level endon( "rough_terrain" );
wait( 5.0 );
while( !flag( "rough_terrain" ) )
{
issue_color_orders( "c100", "axis" );
issue_color_orders( "o101", "axis" );
wait RandomFloatRange( 10.0, 15.0 );
issue_color_orders( "c101", "axis" );
issue_color_orders( "o100", "axis" );
wait RandomFloatRange( 10.0, 15.0 );
}
}
mining_valley_traversal_killer()
{
level endon( "rough_terrain" );
while( 1 )
{
level thread maps\nx_lunar_util::hide_scriptmodels_by_targetname( "valley_traversal_blocker" );
flag_wait( "valley_traversal_kill" );
level thread maps\nx_lunar_util::show_scriptmodels_by_targetname( "valley_traversal_blocker" );
flag_waitopen( "valley_traversal_kill" );
}
}
mining_valley_pipe_attack()
{
level endon( "rough_terrain" );
valley_pipe_shooter = get_living_ai( "pipe_shooter", "script_noteworthy" );
if( IsDefined( valley_pipe_shooter ) )
{
valley_pipe_shooter endon( "death" );
valley_pipe_shooter thread mining_valley_pipe_attack_release();
valley_pipe_shooter.ignoreme = true;
valley_pipe_shooter.threatbias = -500000;
valley_pipe_shooter disable_dontevershoot();
valley_pipe_shooter.script_attackeraccuracy = 0;
while( IsAlive( valley_pipe_shooter ) )
{
flag_wait( "player_near_pipes" );
if( IsAlive( valley_pipe_shooter ) )
{
pipe_shooter_target = GetEnt( "pipe_shooter_target", "targetname" );
valley_pipe_shooter SetEntityTarget( pipe_shooter_target );
valley_pipe_shooter.ignoreme = true;
valley_pipe_shooter.threatbias = -500000;
wait( 1.0 );
pipe_shooter_target = GetEnt( "pipe_shooter_target", "targetname" );
valley_pipe_shooter ClearEntityTarget( pipe_shooter_target );
valley_pipe_shooter.favoriteenemy = level._player;
}
flag_waitopen( "player_near_pipes" );
if( IsAlive( valley_pipe_shooter ) )
{
valley_pipe_shooter.script_attackeraccuracy = 0.5;
pipe_shooter_target = GetEnt( "pipe_shooter_target", "targetname" );
valley_pipe_shooter ClearEntityTarget( pipe_shooter_target );
valley_pipe_shooter.ignoreme = false;
valley_pipe_shooter.threatbias = 500000;
}
}
}
}
mining_valley_pipe_attack_release()
{
level endon( "rough_terrain" );
pipe_shooter = self;
pipe_shooter endon( "death" );
flag_wait( "into_the_valley" );
pipe_shooter.suppressionwait = 2;
pipe_shooter.attackeraccuracy = 1;
}
mining_valley_cleanup()
{
allies_move_into_rough_terrain_trigger = GetEnt( "allies_move_into_rough_terrain", "targetname" );
allies_move_into_rough_terrain_trigger waittill( "trigger" );
enemy_valley = get_ai_group_ai( "enemy_valley" );
array_thread( enemy_valley, maps\_nx_utility::delete_ai_not_bullet_shielded );
}
//*******************************************************************
// *
// *
//*******************************************************************
rough_terrain_start()
{
// Start the player and allies
maps\nx_lunar_util::lunar_start( "rough_terrain_start", "rough_terrain_eagle_start", "rough_terrain_falcon_start" );
// Initial Vision
thread maps\nx_lunar_fx::fx_init_vision_surface();
//Init Combat
maps\nx_lunar_util::lunar_combat_init();
// Play water treatment binks
thread maps\nx_lunar_util::lunar_water_treatment_screen_binks();
}
rough_terrain()
{
level.falcon.baseaccuracy = 10.0;
level.eagle.baseaccuracy = 10.0;
level thread rough_terrain_meteors();
level thread rough_terrain_spawns();
level thread rough_terrain_enemy_retreat();
level thread rough_terrain_area_scan();
level thread rough_terrain_ally_and_player_speed_control();
maps\nx_lunar_util::waittill_all_enemies_dead_or_dying( 8 );
// Save the game
level thread autosave_now();
level.eagle pushplayer( true );
level.falcon pushplayer( true );
issue_color_orders( "y106", "allies" );
issue_color_orders( "r106", "allies" );
level thread rough_terrain_ally_movement();
level thread rough_terrain_dialog();
level thread rough_terrain_lsp_explosion();
flag_wait( "rover_battle" );
}
rough_terrain_dialog()
{
level endon( "rover_battle_start" );
wait( 1.0 );
// Battle chatter
battlechatter_off( "allies" );
// Dialog: This is the only way around, let's move.
level thread radio_dialogue( "moon_eag_ext_onlyway" );
rough_terrain_top_trigger = GetEnt( "allies_move_into_rough_terrain", "targetname" );
if( IsDefined( rough_terrain_top_trigger ) )
{
rough_terrain_top_trigger rough_terrain_up_path_dialog();
}
// Dialog: Tangos right<68>
level thread radio_dialogue( "moon_eag_int_14" );
// Dialog: Chatter Affirmative
level thread radio_dialogue( "jswc_fal_resp_ack_co_gnrc_affirm" );
wait( 0.5 );
// Crow: Use the terrain for cover!
level thread radio_dialogue( "moon_eag_ext_useterrain" );
maps\nx_lunar_util::waittill_number_of_enemies_killed( 4 );
// Dialog: Chatter Move
level thread radio_dialogue( "jswc_eag_order_move_noncombat" );
// Battle chatter
battlechatter_on( "allies" );
level waittill( "rough_terrain_enemies_cleared" );
battlechatter_off( "allies" );
// Dialog: Chatter Move
level thread radio_dialogue( "jswc_eag_order_move_noncombat" );
wait( 3.0 );
if( !flag( "rover_battle" ) )
{
// Dialog: We can go through here<72>
radio_dialogue( "moon_eag_ext_thruhere" );
}
}
rough_terrain_up_path_dialog()
{
trigger = self;
trigger endon( "trigger" );
wait( 5.5 );
// Riggs: Why are they attacking now?
radio_dialogue( "moon_fal_ext_whynow" );
wait( 1.0 );
// Crow: They're after the LSP transmitters.
radio_dialogue( "moon_eag_ext_afterlsp" );
wait( 0.5 );
// Crow: I gaurantee this isn't the only attack.
radio_dialogue( "moon_eag_ext_notonlyattack" );
// Crow: I only hope the other bases are faring better than us.
radio_dialogue( "moon_eag_ext_hopeothers" );
wait( 3.0 );
// Dialog: Look alert.
radio_dialogue( "moon_eag_livhal_01" );
maps\nx_lunar_util::waittill_targetname_triggered( "allies_move_into_rough_terrain" );
}
rough_terrain_area_scan()
{
level endon( "rover_battle" );
start_combat_trigger = GetEnt( "allies_move_into_rough_terrain", "targetname" );
start_combat_trigger endon( "trigger" );
maps\nx_lunar_util::waittill_all_enemies_dead_or_dying();
flag_wait( "rough_terrain_allies_heading_up" );
level.eagle maps\nx_lunar_util::ignore_everything();
level.falcon maps\nx_lunar_util::ignore_everything();
level.eagle thread rough_terrain_ally_scanning();
level.falcon rough_terrain_ally_scanning();
level.eagle cqb_aim();
level.falcon cqb_aim();
}
rough_terrain_ally_scanning()
{
ally = self;
start_combat_trigger = GetEnt( "allies_move_into_rough_terrain", "targetname" );
start_combat_trigger endon( "trigger" );
look_at_target_array = GetEntArray( "rough_terrain_look_around_target", "targetname" );
wait RandomFloatRange( 1.0, 3.0 );
while( 1 )
{
target_number = RandomIntRange( 0, look_at_target_array.size );
look_at_target = look_at_target_array[target_number];
ally cqb_aim( look_at_target );
wait RandomFloatRange( 4.0, 8.0 );
}
}
rough_terrain_enemy_retreat()
{
level endon( "rover_battle" );
maps\nx_lunar_util::waittill_targetname_triggered( "allies_move_into_rough_terrain" );
wait( 0.05 );
maps\nx_lunar_util::waittill_number_of_enemies_killed( 4 );
issue_color_orders( "p102", "axis" );
issue_color_orders( "y113", "allies" );
issue_color_orders( "r113", "allies" );
}
rough_terrain_ally_and_player_speed_control()
{
level endon( "rover_battle" );
level.eagle thread maps\nx_lunar_util::lunar_player_movement_control();
maps\nx_lunar_util::waittill_targetname_triggered( "allies_move_into_rough_terrain" );
level.falcon.baseaccuracy = 1.0;
level.eagle.baseaccuracy = 1.0;
level.eagle cqb_aim();
level.falcon cqb_aim();
level.eagle pushplayer( false );
level.falcon pushplayer( false );
level.eagle maps\nx_lunar_util::clear_ignore_everything();
level.falcon maps\nx_lunar_util::clear_ignore_everything();
level notify( "stop_player_movement_control" );
level.eagle.grenadeawareness = 0;
level.eagle.ignoreexplosionevents = true;
level.eagle.ignorerandombulletdamage = true;
level.eagle.ignoresuppression = true;
level.eagle.disableBulletWhizbyReaction = true;
level.eagle disable_pain();
level.falcon.grenadeawareness = 0;
level.falcon.ignoreexplosionevents = true;
level.falcon.ignorerandombulletdamage = true;
level.falcon.ignoresuppression = true;
level.falcon.disableBulletWhizbyReaction = true;
level.falcon disable_pain();
wait( 2.0 );
level.eagle.grenadeawareness = 1;
level.eagle.ignoreexplosionevents = false;
level.eagle.ignorerandombulletdamage = false;
level.eagle.ignoresuppression = false;
level.eagle.disableBulletWhizbyReaction = false;
level.eagle enable_pain();
level.falcon.grenadeawareness = 1;
level.falcon.ignoreexplosionevents = false;
level.falcon.ignorerandombulletdamage = false;
level.falcon.ignoresuppression = false;
level.falcon.disableBulletWhizbyReaction = false;
level.falcon enable_pain();
}
rough_terrain_spawns()
{
level thread maps\nx_lunar_util::trigger_choice_spawn( "spawn_plateau_battle" );
level thread maps\nx_lunar_util::trigger_choice_spawn( "allies_move_into_rough_terrain" );
level thread maps\nx_lunar_util::trigger_choice_spawn( "rough_terrain_final_wave" );
}
rough_terrain_ally_movement()
{
level endon( "rover_battle" );
// Wait until final wave has triggered and spawned
final_wave_trigger = GetEnt( "rough_terrain_final_wave", "targetname" );
final_wave_trigger waittill( "trigger" );
wait( 1.0 );
// maps\nx_lunar_util::waittill_number_of_enemies_remaining( 2 );
// Pull enemies out of cover
maps\nx_lunar_util::waittill_all_enemies_dead_or_dying();
level notify( "rough_terrain_enemies_cleared" );
// Move to Rover Battle start
issue_color_orders( "y115", "allies" );
issue_color_orders( "r115", "allies" );
}
rough_terrain_meteors()
{
level endon( "rover_battle" );
meteor_trigger = GetEnt( "meteor_shower_trigger", "targetname" );
meteor_trigger waittill( "trigger" );
meteor_1 = GetEnt( "meteor_1", "targetname" );
meteor_1_target = GetEnt( "meteor_1_target", "targetname" );
meteor_1 MoveTo( meteor_1_target.origin, 2.0, .5, .05 );
meteor_1 RotateTo( meteor_1_target.angles, 0.5, .05, .05 );
PlayFXOnTag( GetFx( "meteor_trail" ), meteor_1, "tag_origin" );
meteor_1a = GetEnt( "meteor_1a", "targetname" );
meteor_1a_target = GetEnt( "meteor_1a_target", "targetname" );
meteor_1a MoveTo( meteor_1a_target.origin, 1.50, .5, .05 );
meteor_1a RotateTo( meteor_1a_target.angles, 0.5, .05, .05 );
PlayFXOnTag( GetFx( "meteor_trail" ), meteor_1a, "tag_origin" );
wait( 3.0 );
meteor_1b = GetEnt( "meteor_1b", "targetname" );
meteor_1b_target = GetEnt( "meteor_1b_target", "targetname" );
meteor_1b MoveTo( meteor_1b_target.origin, 2.0, .5, .05 );
meteor_1b RotateTo( meteor_1b_target.angles, 0.5, .05, .05 );
PlayFXOnTag( GetFx( "meteor_trail" ), meteor_1b, "tag_origin" );
wait( 1.5 );
meteor_1c = GetEnt( "meteor_1c", "targetname" );
meteor_1c_target = GetEnt( "meteor_1c_target", "targetname" );
meteor_1c MoveTo( meteor_1c_target.origin, 1.30, .5, .05 );
meteor_1c RotateTo( meteor_1c_target.angles, 0.5, .05, .05 );
PlayFXOnTag( GetFx( "meteor_trail" ), meteor_1c, "tag_origin" );
wait( 0.5 );
meteor_1d = GetEnt( "meteor_1d", "targetname" );
meteor_1d_target = GetEnt( "meteor_1d_target", "targetname" );
meteor_1d MoveTo( meteor_1d_target.origin, 2.0, .5, .05 );
meteor_1d RotateTo( meteor_1d_target.angles, 0.25, .05, .05 );
PlayFXOnTag( GetFx( "meteor_trail" ), meteor_1d, "tag_origin" );
wait( 1.0 );
meteor_2 = GetEnt( "meteor_2", "targetname" );
meteor_2_target = GetEnt( "meteor_2_target", "targetname" );
meteor_2 MoveTo( meteor_2_target.origin, 1.0, .5, .05 );
meteor_2 RotateTo( meteor_2_target.angles, 0.5, .05, .05 );
PlayFXOnTag( GetFx( "meteor_trail" ), meteor_2, "tag_origin" );
// wait( 1.0 );
// meteor_3 = GetEnt( "meteor_3", "targetname" );
// meteor_3_target = GetEnt( "meteor_3_target", "targetname" );
// meteor_3 MoveTo( meteor_3_target.origin, 2, .5, .05 );
// meteor_3 RotateTo( meteor_3_target.angles, 1, .05, .05 );
wait( 5.0 );
meteor_1 delete();
meteor_1a delete();
meteor_1b delete();
meteor_1c delete();
meteor_1d delete();
meteor_2 delete();
// meteor_3 delete();
}
rough_terrain_lsp_explosion()
{
flag_wait( "transformer_one_explosion" );
// Tower delete after explosion
level thread rough_terrain_lsp_explosion_tower_delete();
level._player AllowSprint( false );
player_speed_set( 100, 0.5 );
level thread maps\nx_lunar_take_back_control::lsp_explosion_1();
level thread play_lsp_explode_sound();
wait( 2.5 );
PlayRumbleOnPosition( "heavy_3s", level._player.origin );
Earthquake( 0.25, 3.0, level._player.origin, 500 );
// Crow: One of the transmitters!
radio_dialogue( "moon_eag_ext_onetransmitter" );
// Crow: We can't afford to lose any more.
radio_dialogue( "moon_eag_ext_cantlose" );
// Crow: We've got to secure the LSP controls.
radio_dialogue( "moon_eag_ext_securelsp" );
player_speed_default( 4.0 );
level._player AllowSprint( true );
}
play_lsp_explode_sound()
{
mynodeEntitylsp = spawn("sound_emitter", (3806, -1592, -782));
mynodeEntitylsp PlaySound( "scn_lunar_lsp_explode", "scn_lunar_lsp_explode", true );
mynodeEntitylsp waittill( "scn_lunar_lsp_explode" );
mynodeEntitylsp delete();
}
rough_terrain_lsp_explosion_tower_delete()
{
wait( 0.75 );
// Get the first tower and delete (eventually replace with destroyed tower)
lsp_transmitter_tower_1 = GetEnt( "lsp_transmitter_tower_1", "targetname" );
lsp_transmitter_tower_1 delete();
}
rough_terrain_cleanup()
{
// tagDK<note>This clean up is now handled in the anim script for timing
// flag_wait( "vignette_falcon_death" );
// enemy_plateau = get_ai_group_ai( "enemy_plateau" );
// array_thread( enemy_plateau, maps\_nx_utility::delete_ai_not_bullet_shielded );
}
//*******************************************************************
// *
// *
//*******************************************************************
rover_battle_start()
{
// Start the player and allies
maps\nx_lunar_util::lunar_start( "rover_battle_start", "rover_battle_eagle_start", "rover_battle_falcon_start" );
// Initial Vision
thread maps\nx_lunar_fx::fx_init_vision_surface();
// Init combat
maps\nx_lunar_util::lunar_combat_init();
}
rover_battle()
{
// Make sure that flags are on for next section.
maps\nx_lunar_util::all_triggers_on( "into_shadows_triggers" );
// Battle chatter
battlechatter_off( "allies" );
// Setup vehicle bay shutters to open
level thread maps\nx_lunar_anim::top_floor_reopen();
// Setup Supplies
level thread maps\nx_lunar_util::show_scriptmodels_by_targetname( "into_shadows_supplies" );
// Save the game
level thread autosave_by_name( "rover_battle_1" );
level thread rover_battle_dialog();
//play the sfx and music for the rover scene here
level thread rover_intro_scene_sfx_and_music();
// Prepare rover troops before rover is spawned
array_spawn_function_targetname( "rover_enemies", maps\nx_lunar_util::lunar_enemy_rover_backup );
array_spawn_function_targetname( "rover_ground_enemies", maps\nx_lunar_util::lunar_enemy_rover_backup );
// Commenting to see how it goes without a new gunner
// array_spawn_function_targetname( "rover_enemies", ::keep_turret_manned_spawn_func );
// array_spawn_function_targetname( "rover_ground_enemies", ::keep_turret_manned_spawn_func );
// Start gameplay
flag_wait( "rover_battle_start" );
level thread autosave_by_name( "rover_battle_2" );
level.battle_rover thread vehicle_unload();
level thread rover_battle_enemy_order_progression();
issue_color_orders( "y107", "allies" );
level.eagle.oldbaseaccuracy = level.eagle.baseaccuracy;
level.eagle.baseaccuracy = 0.3;
level.battle_rover.main_turret.secsOfFiringBeforeReload = 15;
level.battle_rover.main_turret.reloadDuration = 3;
level.battle_rover.main_turret TurretFireEnable(); // vignette disables the turret
level.battle_rover.main_turret MakeUnusable();
// Ben's test line
// level.battle_rover.main_turret thread draw_line_of_site();
// Keep track of gunners and associate scripts
level.battle_rover thread rover_battle_gunner_tracker();
// Influence grenades when player is out of the box
level.battle_rover thread rover_battle_grenade_tracker();
// Check enemy status for progression
level.battle_rover thread rover_battle_progression_tracker();
// Cleanup if necessary
level thread rover_battle_cleanup();
// tagTC<note> - GREENLIGHT END OF MISSION
rover_battle_greenlight_nextmission();
// Battle chatter
battlechatter_on( "allies" );
// Player moved forward to next checkpoint
flag_wait( "into_shadows" );
level.eagle pushplayer( true );
// Make sure eagle is heading to goal if the player jumps ahead without killing all enemies
remaining_enemies = get_ai_group_count( "enemy_rover_backup" );
if( remaining_enemies > 0 )
{
level.eagle set_goal_radius( 30 );
vehicle_bay_scan_node = GetNode( "vehicle_bay_scan_node", "targetname" );
level.eagle SetGoalNode ( vehicle_bay_scan_node );
}
// If turret is manned, make sure it is shooting the player if he makes a run for it
level.battle_rover.main_turret thread turret_attack_player();
level notify( "rover_battle_threat_removed" );
flag_set( "music_rover_battle_ends" );
level.eagle.baseaccuracy = level.eagle.oldbaseaccuracy;
// Release the enemies to move more freely if they're still alive
rover_backup = get_ai_group_ai( "enemy_rover_backup" );
array_thread( rover_backup, maps\nx_lunar_util::set_deadly_tracking_ai );
level.battle_rover notify( "keep_turret_manned_stop" );
}
greenlight_sfx_fadeout_lunar()
{
level._player setchannelvolumes( "snd_channelvolprio_level", "fadetoblack", 1.0 );
//JL: Not needed. The game resets the channels when it going back to the main menu or when starting a new level.
//wait 1.5;
//level._player deactivatechannelvolumes( "snd_channelvolprio_level", 0.2 );
}
// tagTC<note> - temp mission end for the greenlight demo
rover_battle_greenlight_nextmission()
{
level._player.health = 100;
level._player EnableInvulnerability();
wait( 3.0 );
level notify( "green_light_stop" );
wait( 4.0 );
thread greenlight_sfx_fadeout_lunar();
endmission_goto_frontend();
}
rover_intro_scene_sfx_and_music()
{
flag_wait( "vignette_falcon_death" );
flag_set( "music_rover_battle_starts" );
wait 0.4;
level._player playsound( "scn_lunar_rover_entrance" );
level._player setchannelvolumes( "snd_channelvolprio_shellshock", "lunar_rover_battle", 0.3 );
}
green_light_fade_to_black()
{
level._player.health = 100;
level._player EnableInvulnerability();
wait( 3.0 );
black = greenlight_create_overlay_element( "black", 0 );
black fadeovertime( 2 );
black.alpha = 1;
wait( 2.0 );
level notify( "green_light_stop" );
level._player FreezeControls( true );
// Stop progression
while( 1 )
{
wait( 1.0 );
}
}
greenlight_hud_hide( state )
{
wait 1;
if ( state )
{
SetSavedDvar( "compass", "0" );
SetSavedDvar( "ammoCounterHide", "1" );
SetSavedDvar( "hud_showstance", "0" );
level._nocompass = true;
}
else
{
SetSavedDvar( "compass", "1" );
SetSavedDvar( "ammoCounterHide", "0" );
SetSavedDvar( "hud_showstance", "1" );
level._nocompass = undefined;
}
}
greenlight_create_overlay_element( shader_name, start_alpha )
{
overlay = newHudElem();
overlay.x = 0;
overlay.y = 0;
overlay setshader( shader_name, 640, 480 );
overlay.alignX = "left";
overlay.alignY = "top";
overlay.horzAlign = "fullscreen";
overlay.vertAlign = "fullscreen";
overlay.alpha = start_alpha;
overlay.foreground = true;
return overlay;
}
rover_battle_enemy_order_progression()
{
level endon( "into_shadows" );
level endon( "moving_into_shadows" );
// Commented out to see how single gunner will work
// level.battle_rover thread keep_turret_manned();
issue_color_orders( "g100", "axis" );
maps\_nx_utility::spawn_targetname_and_return_array( "rover_ground_enemies" );
wait( 15.0 );
issue_color_orders( "g101", "axis" );
issue_color_orders( "b100", "axis" );
while( 1 )
{
wait( 10.0 );
issue_color_orders( "g102", "axis" );
issue_color_orders( "b101", "axis" );
wait( 10.0 );
issue_color_orders( "g101", "axis" );
issue_color_orders( "b102", "axis" );
wait( 10.0 );
enemies_alive = get_ai_group_sentient_count( "enemy_rover_backup" );
if( enemies_alive < 8 )
{
issue_color_orders( "g103", "axis" );
}
else
{
issue_color_orders( "g102", "axis" );
}
issue_color_orders( "b101", "axis" );
wait( 10.0 );
enemies_alive = get_ai_group_sentient_count( "enemy_rover_backup" );
if( enemies_alive < 6 )
{
issue_color_orders( "b103", "axis" );
issue_color_orders( "g101", "axis" );
}
else
{
issue_color_orders( "b102", "axis" );
issue_color_orders( "g101", "axis" );
}
}
}
rover_battle_progression_tracker()
{
level endon( "into_shadows" );
waittill_aigroupcount( "enemy_rover_backup", 5 );
level notify( "moving_into_shadows" );
issue_color_orders( "b101", "axis" );
issue_color_orders( "g101", "axis" );
waittill_aigroupcount( "enemy_rover_backup", 4 );
level thread maps\nx_lunar_util::all_triggers_off( "rover_battle_ally_triggers" );
issue_color_orders( "b100", "axis" );
issue_color_orders( "g100", "axis" );
waittill_aigroupcount( "enemy_rover_backup", 3 );
// Save the game
level thread autosave_by_name( "end_rover_battle" );
level.eagle pushplayer( true );
issue_color_orders( "y140", "allies" );
// Dialog: Alright lets finish them off...
radio_dialogue( "moon_eag_ext_24" );
rover_backup = get_ai_group_ai( "enemy_rover_backup" );
foreach( enemy in rover_backup )
{
enemy.pathrandompercent = 200;
enemy.favoriteenemy = level.eagle;
enemy.health = 50;
enemy.aggressivemode = true;
enemy setgoalentity( level.eagle );
enemy.goalradius = 400;
}
level.eagle.baseaccuracy = 50000.0;
waittill_aigroupcleared( "enemy_rover_backup" );
level notify( "rover_battle_threat_removed" );
level.eagle set_goal_radius( 30 );
vehicle_bay_scan_node = GetNode( "vehicle_bay_scan_node", "targetname" );
level.eagle SetGoalNode ( vehicle_bay_scan_node );
// Dialog: Keep moving forward <20> we need to get to the command center!
radio_dialogue( "moon_eag_ext_34" );
}
rover_battle_grenade_tracker()
{
rover_backup = get_ai_group_ai( "enemy_rover_backup" );
array_thread( rover_backup, ::rover_battle_remove_grenades );
while( !flag( "into_shadows" ) )
{
flag_waitopen( "rover_in_the_box" );
rover_backup = get_ai_group_ai( "enemy_rover_backup" );
array_thread( rover_backup, ::rover_battle_add_grenades );
flag_wait( "rover_in_the_box" );
rover_backup = get_ai_group_ai( "enemy_rover_backup" );
array_thread( rover_backup, ::rover_battle_remove_grenades );
}
rover_backup = get_ai_group_ai( "enemy_rover_backup" );
array_thread( rover_backup, ::rover_battle_add_grenades );
}
rover_battle_add_grenades()
{
self.grenadeammo = 3;
}
rover_battle_remove_grenades()
{
self.grenadeammo = 0;
}
// Ben's test line
draw_line_of_site()
{
self endon( "death" );
while ( 1 )
{
angles = self GetTagAngles( "tag_aim" );
forward = AnglesToForward( angles );
forward_scaled = vector_multiply( forward, 100 );
start = self GetTagOrigin( "tag_aim" );
end = start + forward_scaled;
line( start, end, ( 1, 0, 0 ), false, 1 );
wait( 0.0001 );
}
}
rover_battle_turret_cooling( battle_rover_gunner )
{
battle_rover_gunner endon( "death" );
level endon( "green_light_stop" );
level endon( "into_shadows" );
while( 1 )
{
// Rover is armed and shooting, waiting to overheat
level.battle_rover.main_turret waittill( "starting_reload" );
// Dialog: Take out that gunner!
// Dialog: Walker, take out that gunner!
// Dialog: The gun is cooling!
dialog_array = [ "moon_eag_ext_47", "moon_eag_ext_48", "moon_eag_ext_49" ];
random_dialog = RandomIntRange( 0, dialog_array.size );
random_chance = RandomIntRange( 1, 10 );
if( random_chance > 8 )
{
level thread radio_dialogue( dialog_array[ random_dialog ] );
}
wait( 3 );
}
}
rover_battle_aiming( battle_rover_gunner )
{
self rover_battle_aiming_worker( battle_rover_gunner );
//cleanup when rover_battle_aiming_worker ends on gunner death.
//can't have it continuing to aim at the player with no gunner.
wait 0.05;//waiting to make sure rover_battle_target_seeker is also ended.
level.battle_rover.main_turret ClearTargetEntity();
level.battle_rover.main_turret SetMode( "manual" );
}
rover_battle_aiming_worker( battle_rover_gunner )
{
battle_rover_gunner endon( "death" );
level endon( "into_shadows" );
while( IsAlive( battle_rover_gunner ) )
{
// Seek player when cannot see him and start firing at destructable cover
level thread rover_battle_target_seeker( battle_rover_gunner );
while( !battle_rover_gunner CanSee( level._player ) && flag( "rover_in_the_box" ) )
{
wait( RandomFloatRange( 0.2, 0.8 ) );
}
// Dialog: Get to cover!
// Dialog: Get back to cover!
// Dialog: Watch it!
dialog_array = [ "moon_eag_ext_08", "moon_eag_ext_18", "moon_eag_ext_19" ];
random_chance = RandomIntRange( 1, 10 );
if( random_chance > 7 )
{
random_dialog = RandomIntRange( 0, dialog_array.size );
level thread radio_dialogue( dialog_array[ random_dialog ] );
}
// Rover can see player
level.battle_rover notify( "rover_target_player" );
// in sentry mode, the turret will attack the player
level.battle_rover.main_turret SetMode( "sentry" );
level.battle_rover.main_turret ClearTargetEntity();
// Make sure rover is firing at the player
flag_waitopen( "rover_turret_cooling" );
// Wait until rover cannot see player to go into seek again
while( battle_rover_gunner CanSee( level._player ) )
{
wait( RandomFloatRange( 0.2, 0.8 ) );
}
// tagBR< note >: It is possible to get to the end of this while() loop without ever
// hitting a wait...which was causing an infinite loop.
wait 0.05;
}
}
rover_battle_target_seeker( battle_rover_gunner )
{
level.battle_rover endon( "rover_target_player" );
battle_rover_gunner endon( "death" );
// in manual_ai mode, the turret will target the things we explicitly set
level.battle_rover.main_turret SetMode( "manual_ai" );
level.battle_rover.main_turret ClearTargetEntity();
while( 1 )
{
// Fire at random target for duration
flag_waitopen( "rover_turret_cooling" );
// Get array of targets
rover_array_of_targets = GetEntArray( "rover_panel_target", "targetname" );
target_time = RandomIntRange( 1, 2 );
change_target_chance = 10;
for ( i = 0; i < target_time; i++ )
{
// Turret possibly changes target
if( change_target_chance > 6 )
{
// Choose a new random target
target_number = RandomIntRange( 0, 19 );
rover_target = rover_array_of_targets[target_number];
level.battle_rover.main_turret maps\_mgturret::set_turret_target( rover_target );
}
wait RandomFloatRange( 2.0, 4.5 );
change_target_chance = RandomIntRange( 1, 10 );
}
// Turret fire time
wait RandomFloatRange( 0.0, 4.5 );
}
}
rover_battle_gunner_tracker()
{
battle_rover_gunner = level.battle_rover.riders[1];
level endon( "into_shadows" );
level endon( "rover_battle_threat_removed" );
while( 1 )
{
// Rover gunner/cooling/aiming control
level thread rover_battle_aiming( battle_rover_gunner );
level thread rover_battle_turret_cooling( battle_rover_gunner );
// Wait until the current gunner dies
battle_rover_gunner waittill( "death", attacker );
if ( IsDefined( attacker ) && IsPlayer( attacker ) )
{
// Dialog: Great shot!
// Dialog: That's it!
// Dialog: Tango down!
dialog_array = [ "moon_eag_ext_23", "moon_eag_kill_yell_04", "moon_eag_kill_yell_05" ];
random_dialog = RandomIntRange( 0, dialog_array.size );
level thread radio_dialogue( dialog_array[ random_dialog ] );
}
// wait until rover is empty (this is necessary initially because the rover remains full for a while)
while( 1 )
{
if( level.battle_rover.riders.size == 0 )
{
break;
}
wait( 0.05 );
}
// Reset all cooling flags and effects
flag_clear( "rover_turret_cooling" );
// Wait until the gunner is in place.
while( 1 )
{
// New Gunner (get the new gunner)
battle_rover_gunner = level.battle_rover.riders[0];
if( IsDefined( battle_rover_gunner ) )
{
// Dialog: Watch it! New gunner!
// Dialog: Another one on the turret!
// Dialog: Another gunner!
dialog_array = [ "moon_eag_ext_newgun01", "moon_eag_ext_newgun03", "moon_eag_ext_newgun04" ];
random_dialog = RandomIntRange( 0, dialog_array.size );
level thread radio_dialogue( dialog_array[ random_dialog ] );
break;
}
wait( 0.05 );
}
}
}
keep_turret_manned()
{
self notify( "keep_turret_manned_stop" );
self endon( "keep_turret_manned_stop" );
while ( 1 )
{
self waittill( "gunner_dead" );
while ( 1 )
{
level.keep_turret_manned_actors = array_removeundefined( level.keep_turret_manned_actors );
if ( level.keep_turret_manned_actors.size == 0 )
{
wait 1;
continue;
}
chosen_actor = undefined;
foreach ( actor in level.keep_turret_manned_actors )
{
if ( isalive( actor ) )
{
actor.script_startingposition = 1; // Set the starting position to the gunner position
chosen_actor = actor;
break;
}
}
if ( isdefined( chosen_actor ) )
{
chosen_actor thread run_to_turret( self );
break;
}
wait 1;
}
}
}
run_to_turret( vehicle )
{
vehicle notify ( "run_to_turret" );
thread maps\_vehicle_aianim::guy_runtovehicle( self, vehicle );
vehicle thread maps\_vehicle_aianim::gunnerdead( self );
}
keep_turret_manned_spawn_func()
{
// Add self to array of keep_turret_manned_actors
if ( !isdefined( level.keep_turret_manned_actors ) )
{
level.keep_turret_manned_actors = [];
}
level.keep_turret_manned_actors = array_add( level.keep_turret_manned_actors, self );
}
rover_battle_dialog()
{
level endon( "into_shadows" );
level endon( "green_light_stop" );
level._player endon( "death" );
// wait( 0.5 );
//
// // Dialog: Get to cover!
// radio_dialogue( "moon_eag_ext_08" );
//
// wait( 2.0 );
//
// // Dialog: Damn it Falcon<6F>
// radio_dialogue( "moon_eag_ext_09" );
//
// wait( 1.0 );
flag_wait( "rover_battle_start" );
// Dialog: Keep the those troops off us!
radio_dialogue( "moon_eag_ext_10" );
wait( 5.0 );
// Dialog: They're blasting our cover apart!
radio_dialogue( "moon_eag_ext_12" );
gunner = level.battle_rover.riders[0];
if( IsAlive( gunner ) )
{
// Dialog: Take out that gunner!
radio_dialogue( "moon_eag_ext_47" );
}
// Dialog: Take a shot at the gunner when his gun is cooling!
// radio_dialogue( "moon_eag_ext_13" );
// Dialog: Alright lets clear them out...
// radio_dialogue( "moon_eag_ext_24" );
// Dialog: Careful! Keep out of line of sight from that gunner!
// radio_dialogue( "moon_eag_ext_14" );
enemies_close = GetEnt( "rover_battle_enemies_close", "targetname" );
enemies_close waittill( "trigger" );
// Dialog: They're closing in!
radio_dialogue( "moon_eag_ext_20" );
// Dialog: Get over here and take out that gunner!
// radio_dialogue( "moon_eag_ext_21" );
// Dialog: Get up here! You don't have a shot from back there!
// radio_dialogue( "moon_eag_ext_22" );
// Dialog: Great shot! Wait there's another on the gun!
// radio_dialogue( "moon_eag_ext_23" );
// Dialog: Get back here!
// radio_dialogue( "moon_eag_ext_25" );
// Dialog: Fall back!
// radio_dialogue( "moon_eag_ext_26" );
// Dialog: Get over here!
// radio_dialogue( "moon_eag_ext_27" );
// Dialog: We're almost out of cover! Take the shot!
// radio_dialogue( "moon_eag_ext_28" );
}
rover_battle_cleanup()
{
flag_wait( "rover_battle_start" );
rover_ai_remaining = get_ai_group_sentient_count( "enemy_rover_backup" );
if ( rover_ai_remaining < 1 )
{
enemy_rover_backup = get_ai_group_ai( "enemy_rover_backup" );
array_thread( enemy_rover_backup, maps\_nx_utility::delete_ai_not_bullet_shielded );
}
}
//*******************************************************************
// *
// *
//*******************************************************************
into_shadows_start()
{
// Start the player and allies
maps\nx_lunar_util::lunar_start( "into_shadows_start", "into_shadows_eagle_start" );
// Clean up Falcon
level.falcon stop_magic_bullet_shield();
level.falcon delete();
// Initial Vision
thread maps\nx_lunar_fx::fx_init_vision_surface();
// Init combat
maps\nx_lunar_util::lunar_combat_init();
// Make sure that flags are on for next section.
maps\nx_lunar_util::all_triggers_on( "into_shadows_triggers" );
level.eagle set_goal_radius( 30 );
// Follow eagle
self thread maps\nx_lunar::eagle_follow_objective();
// Setup vehicle bay shutters to open
level thread maps\nx_lunar_anim::top_floor_reopen();
// Setup Supplies
level thread maps\nx_lunar_util::show_scriptmodels_by_targetname( "into_shadows_supplies" );
}
into_shadows()
{
// Make sure all vehicle bay doors are open
maps\nx_lunar_get_to_the_armory::open_all_vehicle_bay_doors();
level thread maps\nx_lunar_util::open_lunar_door( "vehicle_hatch_breach", 0.2 );
level.eagle thread into_shadows_dialog();
level thread into_shadows_lsp_explosion();
flag_wait( "into_shadows" );
level.eagle thread maps\nx_lunar_util::lunar_player_movement_control();
// Alert new enemies if previous enemies were not all killed
rover_ai_remaining = get_ai_group_sentient_count( "enemy_rover_backup" );
if ( rover_ai_remaining > 0 )
{
flag_set( "rover_battle_enemies_aware" );
// Clear out previous objective so scripts can move on
level notify( "rover_enemies_cleared" );
flag_set( "player_made_it_to_shadows" );
flag_set( "player_in_kill_position_rover" );
}
else
{
level thread into_shadows_forced_cleanup();
flag_clear( "rover_battle_enemies_aware" );
// Save the game
level thread autosave_by_name( "into_shadows" );
}
// Setup spawning threads
level thread into_shadows_spawns();
// Rovers at the bay, unload, and fight/guard, death checks
level thread into_shadows_rover_unload_and_attack();
wait( 1.0 );
// Player nears the vehicle bay
flag_wait( "vehicle_bay_return" );
issue_color_orders( "y110", "allies" );
if( IsDefined( level.eagle.oldbaseaccuracy ) )
{
level.eagle.baseaccuracy = level.eagle.oldbaseaccuracy;
}
// maps\nx_lunar_get_to_the_armory::remove_vehicle_bay_blockers();
}
into_shadows_player_on_turret( rover_1, rover_2 )
{
level endon( "enemy_on_rovers_low_count" );
first_time_on = undefined;
while( !flag( "vehicle_bay_return" ) )
{
level._player waittill( "mount_turret" );
// Make sure turret is working
rover_1 turret_attack_player();
rover_2 turret_attack_player();
if( !IsDefined( first_time_on ) )
{
// Dialog: Clear them out!
level thread radio_dialogue( "moon_eag_ext_clearout" );
first_time_on = true;
}
// interior_goal_vol = GetEnt( "interior_bay_enemies", "targetname" );
// living_enemies = get_ai_group_ai( "enemy_on_rovers" );
// array_thread( living_enemies, ::into_shadows_change_goalvolume, interior_goal_vol );
vehicle_bay_rover_enemies = get_ai_group_ai( "enemy_on_rovers" );
vehicle_bay_rover_enemies array_thread( vehicle_bay_rover_enemies, ::into_shadows_player_on_turret_behavior );
level thread into_shadows_enemy_color_switcher();
// Temp invulnerability
level._player EnableInvulnerability();
level._player.script_attackeraccuracy = 0.1;
level._player waittill( "dismount_turret" );
// exterior_goal_vol = GetEnt( "exterior_bay_enemies", "targetname" );
// living_enemies = get_ai_group_ai( "enemy_on_rovers" );
// array_thread( living_enemies, ::into_shadows_change_goalvolume, exterior_goal_vol );
vehicle_bay_rover_enemies = get_ai_group_ai( "enemy_on_rovers" );
vehicle_bay_rover_enemies array_thread( vehicle_bay_rover_enemies, maps\nx_lunar_util::set_deadly_tracking_ai );
// Temp invulnerability
level._player DisableInvulnerability();
level._player.script_attackeraccuracy = 1.0;
}
}
into_shadows_enemy_color_switcher()
{
level._player endon( "dismount_turret" );
while( 1 )
{
issue_color_orders( "y101", "axis" );
issue_color_orders( "r101", "axis" );
wait RandomFloatRange( 2.0, 6.0 );
issue_color_orders( "y102", "axis" );
issue_color_orders( "r102", "axis" );
wait RandomFloatRange( 2.0, 6.0 );
}
}
//into_shadows_change_goalvolume( goal )
//{
// enemy = self;
// enemy endon( "death" );
//
// wait( 2.0 );
//
// enemy ClearGoalVolume();
// enemy ClearEntityTarget( enemy.target );
// enemy SetGoalVolumeAuto( goal );
//}
into_shadows_dialog()
{
level endon( "vehicle_bay_return" );
level thread into_shadows_move_on_dialog();
level thread into_shadows_upper_deck_dialog();
level thread into_shadows_kill_dialog();
into_shadows_initial_dialog();
wait( 2.0 );
level notify( "eagle_heading_to_shadows" );
wait( 0.05 );
into_shadows_move_to_shadows_dialog();
level notify( "stop_player_movement_control" );
level.eagle notify( "stealth_attack" );
into_shadows_move_to_kill_dialog();
into_shadows_stealth_kill_dialog();
}
into_shadows_initial_dialog()
{
level endon( "vehicle_bay_return" );
level endon( "vehicle_bay_shadow_enemies_aware" );
level endon( "rover_battle_enemies_aware" );
if( flag( "vehicle_bay_return" ) || flag( "vehicle_bay_shadow_enemies_aware" ) || flag( "rover_battle_enemies_aware" ) )
{
return;
}
// // Dialog: Walker, keep out of sight<68>
// radio_dialogue( "moon_eag_ext_keepout" );
wait( 1.0 );
// Wait for player to join Eagle
flag_wait( "into_shadows" );
level.eagle waittill ( "goal" );
if( !flag( "vehicle_bay_return" ) && !flag( "vehicle_bay_shadow_enemies_aware" ) && !flag( "rover_battle_enemies_aware" ) )
{
// Dialog: Hold fire! Shit...
radio_dialogue( "moon_eag_ext_29" );
wait( 0.5 );
// Dialog: We can<61>t do this head on<6F>
radio_dialogue( "moon_eag_ext_30" );
}
}
into_shadows_move_to_shadows_dialog()
{
level endon( "vehicle_bay_return" );
level endon( "vehicle_bay_shadow_enemies_aware" );
level endon( "rover_battle_enemies_aware" );
if( flag( "vehicle_bay_return" ) || flag( "vehicle_bay_shadow_enemies_aware" ) || flag( "rover_battle_enemies_aware" ) )
{
return;
}
// wait( 1.0 );
//
// // Dialog: They're headed our way. We have to get moving.
// radio_dialogue( "moon_eag_ext_31" );
// Dialog: Walker, follow me - stay in the shadows!
radio_dialogue( "moon_eag_ext_31" );
wait( 3.0 );
// Dialog: Come on, they're coming around!
radio_dialogue( "moon_eag_ext_comingaround" );
wait( 5.0 );
// Dialog: We can get behind them over here.
radio_dialogue( "moon_eag_ext_getbehind" );
flag_wait( "player_made_it_to_shadows" );
}
into_shadows_move_to_kill_dialog()
{
level endon( "vehicle_bay_return" );
level endon( "vehicle_bay_shadow_enemies_aware" );
level endon( "rover_battle_enemies_aware" );
// // Dialog: Hold your fire
// radio_dialogue( "moon_eag_ext_32" );
if( flag( "vehicle_bay_return" ) || flag( "vehicle_bay_shadow_enemies_aware" ) || flag( "rover_battle_enemies_aware" ) )
{
return;
}
wait( 5.0 );
// Dialog: Let's take these turrets.
radio_dialogue( "moon_eag_ext_taketheseturrets" );
flag_wait( "into_shadows_round_the_corner");
wait( 2.0 );
// Dialog: Alright, let's take these gunners down.
radio_dialogue( "moon_eag_ext_gunnersdown" );
level.eagle waittill ( "goal" );
}
into_shadows_stealth_kill_dialog()
{
level endon( "vehicle_bay_return" );
level endon( "vehicle_bay_shadow_enemies_aware" );
level endon( "rover_battle_enemies_aware" );
if( flag( "vehicle_bay_return" ) || flag( "vehicle_bay_shadow_enemies_aware" ) || flag( "rover_battle_enemies_aware" ) )
{
return;
}
// flag_wait( "player_in_kill_position_rover" );
// Dialog: Ready?
radio_dialogue( "moon_eag_ext_ready" );
wait( 0.75 );
// Dialog: Weapons Free!
radio_dialogue( "moon_eag_ext_33" );
flag_wait( "into_shadows_gunner_1_enemy_dead" );
flag_wait( "into_shadows_gunner_2_enemy_dead" );
wait( 1.0 );
// Dialog: They're down.
// Dialog: That's it.
dialog_array = [ "moon_eag_kill_yell_03", "moon_eag_kill_yell_04" ];
random_dialog = RandomIntRange( 0, dialog_array.size );
level thread radio_dialogue( dialog_array[random_dialog] );
wait( 1.0 );
// Dialog: Walker, get on that turret!
radio_dialogue( "moon_eag_ext_getturret" );
}
into_shadows_upper_deck_dialog()
{
level endon( "vehicle_bay_return" );
waittill_aigroupcount( "enemy_on_rovers", 15 );
level notify( "start_shadows_shutter_open" );
wait( 0.5 );
if( !flag( "vehicle_bay_return" ) )
{
// Dialog: Watch it, up high!
radio_dialogue( "moon_eag_ext_watchhigh" );
}
wait( 5.0 );
if( !flag( "vehicle_bay_return" ) )
{
// Dialog: Watch the right side!
radio_dialogue( "moon_eag_ext_rightside" );
}
}
into_shadows_kill_dialog()
{
level endon( "vehicle_bay_return" );
waittill_aigroupcount( "enemy_on_rovers", 17 );
// Dialog: He's down.
// Dialog: That's a kill.
// Dialog: Tango down!
// Dialog: Good hit.
dialog_array = [ "moon_eag_kill_yell_01", "moon_eag_kill_yell_02", "moon_eag_kill_yell_05", "moon_eag_kill_yell_06" ];
random_dialog = RandomIntRange( 0, dialog_array.size );
level thread radio_dialogue( dialog_array[random_dialog] );
waittill_aigroupcount( "enemy_on_rovers", 13 );
// Dialog: He's down.
// Dialog: That's a kill.
// Dialog: Tango down!
// Dialog: Good hit.
dialog_array = [ "moon_eag_kill_yell_01", "moon_eag_kill_yell_02", "moon_eag_kill_yell_05", "moon_eag_kill_yell_06" ];
random_dialog = RandomIntRange( 0, dialog_array.size );
level thread radio_dialogue( dialog_array[random_dialog] );
waittill_aigroupcount( "enemy_on_rovers", 7 );
// Dialog: He's down.
// Dialog: That's a kill.
// Dialog: Tango down!
// Dialog: Good hit.
dialog_array = [ "moon_eag_kill_yell_01", "moon_eag_kill_yell_02", "moon_eag_kill_yell_05", "moon_eag_kill_yell_06" ];
random_dialog = RandomIntRange( 0, dialog_array.size );
level thread radio_dialogue( dialog_array[random_dialog] );
}
into_shadows_move_on_dialog()
{
level endon( "vehicle_bay_return" );
level waittill( "into_shadows_all_enemies_spawned" );
waittill_aigroupcount( "enemy_on_rovers", 2 );
level notify( "enemy_on_rovers_low_count" );
// exterior_goal_vol = GetEnt( "exterior_bay_enemies", "targetname" );
// living_enemies = get_ai_group_ai( "enemy_on_rovers" );
// array_thread( living_enemies, ::into_shadows_change_goalvolume, exterior_goal_vol );
maps\nx_lunar_util::waittill_all_enemies_dead_or_dying( 15 );
// Dialog: Okay lets move in.
radio_dialogue( "moon_eag_ext_letsmove" );
flag_set( "vehicle_bay_return" );
}
into_shadows_lsp_explosion()
{
flag_set( "lsp_explosion_2_is_current" );
level thread maps\nx_lunar_take_back_control::lsp_explosion_2();
wait( 0.25 );
PlayRumbleOnPosition( "heavy_3s", level._player.origin );
Earthquake( 0.3, 3.0, level._player.origin, 500 );
wait( 0.5 );
thread audio_wait_for_volume_change();
// Dialog: Damn it, there goes another one.
level thread radio_dialogue( "moon_eag_ext_anothertrans" );
// Dialog: They're trying to take the base.
level thread radio_dialogue( "moon_eag_ext_takebase" );
flag_clear( "lsp_explosion_2_is_current" );
}
audio_wait_for_volume_change()
{
wait 3;
level._player deactivatechannelvolumes( "snd_channelvolprio_shellshock", 1 );
}
into_shadows_spawns()
{
level endon( "vehicle_bay_return" );
array_spawn_function_targetname( "vehicle_bay_rover_enemies_1", maps\nx_lunar_util::lunar_enemy_exterior_common );
array_spawn_function_targetname( "vehicle_bay_rover_enemies_1", ::into_shadows_idle_enemy_behavior );
array_spawn_function_targetname( "vehicle_bay_rover_enemies_2", maps\nx_lunar_util::lunar_enemy_exterior_shadows_rover_riders );
array_spawn_function_targetname( "rover_enemy_inside_vehicle_bay", maps\nx_lunar_util::lunar_enemy_exterior_long_range );
rover_battle_enemies_remaining = get_ai_group_sentient_count( "enemy_rover_backup" );
rover_enemies_group_1 = GetEntArray( "vehicle_bay_rover_enemies_1", "targetname" );
spawn_limit = 12 - rover_battle_enemies_remaining;
rover_1_enemies = maps\_nx_utility::spawn_targetname_and_return_array( "vehicle_bay_rover_enemies_1", spawn_limit );
waittill_aigroupcount( "enemy_on_rovers", 18 );
vehicle_bay_backup_enemies = maps\_nx_utility::spawn_targetname_and_return_array( "vehicle_bay_rover_enemies_backup" );
if( level._player IsUsingTurret() )
{
vehicle_bay_rover_enemies = get_ai_group_ai( "enemy_on_rovers" );
vehicle_bay_rover_enemies array_thread( vehicle_bay_rover_enemies, ::into_shadows_player_on_turret_behavior );
}
else
{
array_thread( vehicle_bay_backup_enemies, maps\nx_lunar_util::set_deadly_tracking_ai );
}
level waittill( "start_shadows_shutter_open" );
maps\_nx_utility::spawn_targetname_and_return_array( "rover_enemy_inside_vehicle_bay" );
wait( 0.05 );
level notify( "into_shadows_all_enemies_spawned" );
}
into_shadows_idle_enemy_behavior()
{
self disable_cqbwalk();
self.maxsightdistsqrd = 750 * 750;
self ClearEnemy();
self ClearPotentialThreat();
self.alertlevel = "noncombat";
}
/* into_shadows_stealth_shadows_switcher()
{
level endon( "vehicle_bay_shadow_enemies_aware" );
// Set initial visual range
// enemies_alive = get_ai_group_ai( "enemy_on_rovers" );
// array_thread( enemies_alive, ::into_shadows_player_out_of_shadows_behavior );
// while(1)
// {
// flag_wait( "currently_in_shadows" );
// // Lower visual range
enemies_alive = get_ai_group_ai( "enemy_on_rovers" );
array_thread( enemies_alive, ::into_shadows_player_in_shadows_behavior );
// wait( 0.05 );
// flag_waitopen( "currently_in_shadows" );
// // Raise visual range
// enemies_alive = get_ai_group_ai( "enemy_on_rovers" );
// array_thread( enemies_alive, ::into_shadows_player_out_of_shadows_behavior );
// wait( 0.05 );
// }
} */
into_shadows_rover_unload_and_attack()
{
bay_rover_1 = spawn_vehicle_from_targetname( "second_wave_rover_1" );
bay_rover_1.main_turret = bay_rover_1.mgturret[0];
bay_rover_2 = spawn_vehicle_from_targetname_and_drive( "second_wave_rover_2" );
bay_rover_2.main_turret = bay_rover_2.mgturret[0];
bay_rover_1.main_turret.hummer_turret_intial_mode = "manual";
bay_rover_2.main_turret.hummer_turret_intial_mode = "manual";
bay_rover_1 vehicle_lights_on( "running" );
bay_rover_2 vehicle_lights_on( "running" );
rover_array_of_targets = GetEntArray( "rover_bay_random_targets", "targetname" );
target_number = RandomIntRange( 0, 3 );
rover_target = rover_array_of_targets[target_number];
target_number = RandomIntRange( 0, 3 );
rover_target = rover_array_of_targets[target_number];
bay_rover_1_turret_gunner = bay_rover_1.riders[1];
bay_rover_1_driver = bay_rover_1.riders[0];
bay_rover_2_turret_gunner = bay_rover_2.riders[1];
level thread into_shadows_rover_turret_glow( bay_rover_1 );
level thread into_shadows_rover_turret_glow( bay_rover_2 );
wait( 0.5 );
vehicle_bay_rover_enemies = get_ai_group_ai( "enemy_on_rovers" );
issue_color_orders( "r100", "axis" );
// Until player can patch himself while on the turret
level._player thread into_shadows_player_on_turret( bay_rover_1.main_turret, bay_rover_2.main_turret );
// Eagle moves to shadows
level.eagle thread into_shadows_squad_movement( bay_rover_1, bay_rover_2 );
level thread into_shadows_rovers_attack( bay_rover_1.main_turret, bay_rover_2.main_turret );
level thread into_shadows_time_to_alert_counter( bay_rover_1_turret_gunner, bay_rover_2_turret_gunner, bay_rover_1.main_turret, bay_rover_2.main_turret );
level thread into_shadows_eagle_kill( bay_rover_1_turret_gunner, bay_rover_2_turret_gunner );
// Alert others if player is seen
array_thread( vehicle_bay_rover_enemies, ::into_shadows_enemy_vision );
bay_rover_1 thread vehicle_unload();
// Get driver into the vehicle bay
into_shadows_door_runner_node = GetNode( "into_shadows_door_runner_node", "targetname" );
bay_rover_1_driver SetGoalNode ( into_shadows_door_runner_node );
bay_rover_1_driver set_goal_radius( 10 );
bay_rover_1_driver enable_cqbwalk();
bay_rover_1_driver waittill( "goal" );
bay_rover_2 waittill( "unloaded" );
// Turn on specified mantles
maps\nx_lunar_util::all_mantles_on( "into_shadows_mantles" );
}
into_shadows_rover_turret_glow( vehicle )
{
self into_shadows_rover_turret_glow_worker( vehicle );
//when the worker script is killed, we cleanup here:
vehicle.mgturret[0] SetModel("nx_vehicle_chinese_lgv_main_turret");
}
into_shadows_rover_turret_glow_worker( vehicle )
{
level endon( "vehicle_bay_return" ); //if the playe skips using the turret.
level._player endon( "mount_turret" );
vehicle waittill( "gunner_dead" );
vehicle.mgturret[0] SetModel("nx_vehicle_ec_lgv_main_turret_obj");
vehicle waittill( "run_to_turret" );
}
into_shadows_death_alert_check( gunner_1, gunner_2, rover_1, rover_2 )
{
level endon( "vehicle_bay_shadow_enemies_aware" );
level endon( "into_shadows_alert_all" );
if( flag( "vehicle_bay_shadow_enemies_aware" ) )
{
return;
}
gunner_1 thread into_shadows_set_flag_on_dead_or_dying( "into_shadows_gunner_1_enemy_dead" );
gunner_2 thread into_shadows_set_flag_on_dead_or_dying( "into_shadows_gunner_2_enemy_dead" );
enemies_alive = get_ai_group_ai( "enemy_on_rovers" );
waittill_dead_or_dying( enemies_alive, 1 );
// rover_1 turret_attack_player();
// rover_2 turret_attack_player();
// Let flags get set before checking them
wait( 0.05 );
for ( i = 0; i < 4; i++ )
{
// Check if gunner guard was killed
if( flag( "into_shadows_gunner_1_enemy_dead" ) && !flag( "vehicle_bay_shadow_enemies_aware" ) )
{
// If killed was one of the intended two, wait
wait( 2.0 );
}
// Check if gunner guard was killed
if( flag( "into_shadows_gunner_2_enemy_dead" ) && !flag( "vehicle_bay_shadow_enemies_aware" ) )
{
// If killed was one of the intended two, wait
wait( 2.0 );
}
if( flag( "into_shadows_gunner_1_enemy_dead" ) && flag( "into_shadows_gunner_2_enemy_dead" ) && !flag( "vehicle_bay_shadow_enemies_aware" ) )
{
flag_set( "into_shadows_stealth_kills_success" );
wait( 2.0 );
}
}
}
into_shadows_time_to_alert_counter( gunner_1, gunner_2, rover_1, rover_2 )
{
into_shadows_death_alert_check( gunner_1, gunner_2, rover_1, rover_2 );
level notify( "stop_player_movement_control" );
// Wait minimal time
wait( 1.0 );
// Dialog: Watch it, you<6F>ve been spotted!
radio_dialogue( "moon_eag_ext_spotted" );
if( !flag( "into_shadows_stealth_kills_success" ) )
{
// Dialog: Weapons Free!
radio_dialogue( "moon_eag_ext_33" );
}
flag_set( "vehicle_bay_shadow_enemies_aware" );
// Set for progression
flag_set( "player_made_it_to_shadows" );
flag_set( "player_in_kill_position_rover" );
if( level._player IsUsingTurret() )
{
vehicle_bay_rover_enemies = get_ai_group_ai( "enemy_on_rovers" );
vehicle_bay_rover_enemies array_thread( vehicle_bay_rover_enemies, ::into_shadows_player_on_turret_behavior, true );
}
else
{
vehicle_bay_rover_enemies = get_ai_group_ai( "enemy_on_rovers" );
vehicle_bay_rover_enemies array_thread( vehicle_bay_rover_enemies, ::into_shadows_death_alert_behavior, true );
}
// Wake up Eagle
level.eagle maps\nx_lunar_util::clear_ignore_everything();
level.eagle disable_dontevershoot();
// Run aggressive behaviors on two special ai and target player
enemy_array = [gunner_1, gunner_2];
for ( i = 0; i < 2; i++ )
{
selected_enemy = enemy_array[i];
if( IsAlive( selected_enemy ) )
{
selected_enemy thread into_shadows_death_alert_behavior();
}
}
}
into_shadows_death_alert_behavior( first_time )
{
alerted_enemy = self;
alerted_enemy endon( "death" );
if( IsDefined( first_time ) )
{
wait RandomFloatRange( 0.0, 1.0 );
self enable_cqbwalk();
}
alerted_enemy maps\nx_lunar_util::set_deadly_tracking_ai( true );
}
into_shadows_player_on_turret_behavior( first_time )
{
alerted_enemy = self;
alerted_enemy endon( "death" );
if( IsDefined( first_time ) )
{
wait RandomFloatRange( 0.0, 1.0 );
self thread maps\nx_lunar_util::lunar_cqb_detect_and_switch( 750 );
}
alerted_enemy.maxsightdistsqrd = 8192 * 8192;
alerted_enemy ClearEnemy();
alerted_enemy ClearEntityTarget();
random_chance = RandomIntRange( 1, 10 );
if( random_chance < 6 )
{
alerted_enemy set_force_color( "r" );
}
else
{
alerted_enemy set_force_color( "y" );
}
alerted_enemy.favoriteenemy = level._player;
if( IsDefined( first_time ) )
{
alerted_enemy.baseaccuracy = 0.0;
// Slowly increase the enemy's accuracy
for( i = 0; i < 7; i++ )
{
wait( 1.0 );
alerted_enemy.baseaccuracy = alerted_enemy.baseaccuracy + 0.1;
}
}
}
into_shadows_set_flag_on_dead_or_dying( flag )
{
level endon( "vehicle_bay_shadow_enemies_aware" );
self waittill( "death" );
flag_set( flag );
}
into_shadows_rovers_attack( rover_1, rover_2 )
{
level waittill( "vehicle_bay_shadow_enemies_aware" );
// Give player a moment to understand that he screwed up
wait( 1.0 );
rover_1 turret_attack_player();
rover_2 turret_attack_player();
}
into_shadows_enemy_vision()
{
enemy = self;
enemy endon( "death" );
enemy endon( "turn_off_vision" );
starting_health = self.health;
while( 1 )
{
if( enemy CanSee( level._player ) )
{
level notify( "into_shadows_alert_all" );
break;
}
current_health = self.health;
if( current_health < starting_health )
{
level notify( "into_shadows_alert_all" );
break;
}
wait( 1.0 );
}
}
into_shadows_squad_movement( rover_1, rover_2 )
{
level.eagle maps\nx_lunar_util::ignore_everything();
level.eagle enable_dontevershoot();
if( !flag( "rover_battle_enemies_aware" ) )
{
level.eagle waittill ( "goal" );
}
flag_wait( "into_shadows" );
wait( 3.0 );
level waittill( "eagle_heading_to_shadows" );
wait( 0.5 );
level.eagle set_goal_radius( 10 );
to_the_shadows_node = GetNode( "to_the_shadows_node", "targetname" );
level.eagle SetGoalNode ( to_the_shadows_node );
if( !flag( "vehicle_bay_shadow_enemies_aware" ) )
{
flag_wait( "player_made_it_to_shadows" );
}
level.eagle set_goal_radius( 10 );
eagle_rover_shoot_node = GetNode( "eagle_rover_shoot_position", "targetname" );
level.eagle SetGoalNode ( eagle_rover_shoot_node );
flag_wait( "vehicle_bay_shadow_enemies_aware" );
level.eagle set_goal_radius( 10 );
into_shadows_eagle_perch_node = GetNode( "into_shadows_eagle_perch", "targetname" );
level.eagle SetGoalNode ( into_shadows_eagle_perch_node );
// This needs turret dismounts before implementation
// level._player waittill( "mount_turret" );
//
// rover_1.main_turret = bay_rover_1.mgturret[0];
// rover_2.main_turret = bay_rover_1.mgturret[0];
//
// gunner_1 = rover_1.main_turret GetTurretOwner();
// gunner_2 = rover_2.main_turret GetTurretOwner();
//
// if( !IsDefined( gunner_1 ) )
// {
// level.eagle thread run_to_turret( rover_1 );
// }
// else if( !IsDefined( gunner_2 ) )
// {
// level.eagle thread run_to_turret( rover_2 );
// }
}
//into_shadows_rover_target_seeker( vehicle, turret )
//{
// level endon( "vehicle_bay_shadow_enemies_aware" );
//
// if( flag( "vehicle_bay_shadow_enemies_aware" ) )
// {
// return;
// }
//
// turret turret_do_not_attack_player();
//
// vehicle waittill( "unloaded" );
//
// if( IsAlive( vehicle.riders[0] ) )
// {
// gunner = vehicle.riders[0];
// gunner endon( "death" );
// }
// else
// {
// return;
// }
//
// while( 1 )
// {
// turret turret_do_not_attack_player();
//
// // Pause for searching
// wait RandomFloatRange( 1.0, 4.0 );
//
// // Fire at random target for duration
// turret turret_attack_player();
//
// // Get array of targets
// rover_array_of_targets = GetEntArray( "rover_bay_random_targets", "targetname" );
//
// target_time = RandomIntRange( 1, 3 );
//
// change_target_chance = 10;
//
// for ( i = 0; i < target_time; i++ )
// {
// // Turret possibly changes target
// if( change_target_chance > 6 )
// {
// // Choose a new random target
// target_number = RandomIntRange( 0, 3 );
// rover_target = rover_array_of_targets[target_number];
// turret maps\_mgturret::set_turret_target( rover_target );
// // Turret explosion
// wait .2;
// PlayFX( level._effect[ "turret_explosion" ], rover_target.origin );
// }
//
// wait( 1.0 );
// change_target_chance = RandomIntRange( 1, 10 );
// }
//
// // Turret fire time
// wait RandomFloatRange( 1.0, 1.5 );
// }
//}
//into_shadows_enemy_target_seeker( exclude_1, exclude_2, vehicle )
//{
// if( flag( "vehicle_bay_shadow_enemies_aware" ) )
// {
// return;
// }
//
// vehicle waittill( "unloaded" );
//
// if( IsAlive( self ) )
// {
// enemy = self;
// enemy endon( "death" );
// }
// else
// {
// return;
// }
//
// if( enemy == exclude_1 || enemy == exclude_2 )
// {
// return;
// }
//
// // Get array of targets
// enemy_array_of_targets = GetEntArray( "rover_bay_random_squad_targets", "targetname" );
//
// enemy_target = undefined;
//
// wait RandomFloatRange( 1.0, 2.0 );
//
// while( !flag( "vehicle_bay_shadow_enemies_aware" ) )
// {
// // Pause fire time
// wait RandomFloatRange( 1.0, 2.0 );
//
// target_time = RandomIntRange( 1, 3 );
//
// change_target_chance = 10;
//
// for ( i = 0; i < target_time; i++ )
// {
// // Turret possibly changes target
// if( change_target_chance > 8 )
// {
// // Choose a new random target
// target_number = RandomIntRange( 0, 5 );
// enemy_target = enemy_array_of_targets[target_number];
// if( IsAlive( enemy ) )
// {
// enemy SetEntityTarget( enemy_target );
// enemy SetLookAtEntity( enemy_target );
// enemy Shoot();
//
// wait( 0.5 );
//
// enemy SetLookAtEntity( enemy_target );
// enemy Shoot();
// }
// else
// {
// break;
// }
// }
// change_target_chance = RandomIntRange( 1, 10 );
// }
// }
//
// if( IsAlive( enemy ) )
// {
// if( IsDefined( enemy_target ) )
// {
// enemy ClearEntityTarget( enemy_target );
// }
//
// enemy into_shadows_death_alert_behavior();
// }
//}
into_shadows_eagle_kill( gunner_1, gunner_2 )
{
level.eagle waittill_any( "stealth_attack", "vehicle_bay_shadow_enemies_aware" );
level.eagle maps\nx_lunar_util::clear_ignore_everything();
level.eagle ClearEnemy();
if( IsDefined( level.eagle.maxsightdistsqrd ) )
{
level.eagle.oldmaxsightdistsqrd = level.eagle.maxsightdistsqrd;
}
level.eagle.maxsightdistsqrd = 2000 * 2000;
level.eagle.oldbaseaccuracy = level.eagle.baseaccuracy;
gunner_1 notify( "turn_off_vision" );
gunner_2 notify( "turn_off_vision" );
enemy_array = [gunner_1, gunner_2];
waittill_dead_or_dying( enemy_array, 1, 23 );
if( IsAlive( gunner_1 ) && IsAlive( gunner_2 ) )
{
eagle_does_the_work = true;
}
else
{
// Dialog: He's down.
// Dialog: That's a kill.
// Dialog: Good hit.
dialog_array = [ "moon_eag_kill_yell_01", "moon_eag_kill_yell_02", "moon_eag_kill_yell_06" ];
random_dialog = RandomIntRange( 0, dialog_array.size );
level thread radio_dialogue( dialog_array[random_dialog] );
}
wait( 0.5 );
foreach( enemy in enemy_array )
{
if( IsAlive( enemy ) )
{
level.eagle.favoriteenemy = enemy;
level.eagle.baseaccuracy = 50000.0;
enemy.threatbias = 500000;
enemy.health = 1;
level.eagle SetLookAtEntity();
level.eagle OrientMode( "face enemy" );
level.eagle.fixednode = false;
level.eagle setgoalpos( level.eagle.origin );
level.eagle disable_dontevershoot();
MagicBullet( "lunarrifle", level.eagle.origin, enemy.origin );
level.eagle Shoot( 1, enemy.origin);
PlayFX( level._effect[ "charlie_impact" ], enemy.origin );
enemy kill();
enemy waittill( "death" );
level.eagle enable_dontevershoot();
level.eagle ClearEnemy();
level.eagle.baseaccuracy = 0.0;
wait( 1.0 );
}
else
{
wait( 0.05 );
}
}
level.eagle waittill( "goal" );
level.eagle disable_dontevershoot();
level.eagle ClearEnemy();
if( IsDefined( level.eagle.oldmaxsightdistsqrd ) )
{
level.eagle.maxsightdistsqrd = level.eagle.oldmaxsightdistsqrd;
}
if( IsDefined( level.eagle.oldbaseaccuracy ) )
{
level.eagle.baseaccuracy = level.eagle.oldbaseaccuracy;
}
}
into_shadows_cleanup()
{
}
into_shadows_forced_cleanup()
{
enemy_on_rovers = get_ai_group_ai( "enemy_on_rovers" );
array_thread( enemy_on_rovers, maps\_nx_utility::delete_ai_not_bullet_shielded );
}
//*******************************************************************
// *
// *
//*******************************************************************
turret_do_not_attack_player()
{
self SetMode( "manual" );
self ClearTargetEntity();
}
turret_attack_player()
{
self endon( "death" );
//early out if the turret gunner is already dead.
if ( !IsTurretActive( self ) )
{
return;
}
self SetMode( "sentry" );
self.ownervehicle waittill( "gunner_dead" );
self SetMode( "manual" );
}