// IW6 GSC SOURCE // Generated by https://github.com/xensik/gsc-tool intro_setup() { thread maps\jungle_ghosts_util::cull_distance_logic(); thread maps\jungle_ghosts_util::fade_out_in( "black", undefined, 1 ); level.player setclienttriggeraudiozone( "jungle_ghosts_falling_through_air", 1.5 ); thread maps\_utility::vision_set_fog_changes( "", 1 ); var_0 = maps\_utility::spawn_anim_model( "player_harness", ( 0, 0, 0 ) ); level.harness_model = var_0; var_1 = common_scripts\utility::getstruct( "parachute_anim_ent_player", "targetname" ); var_2 = maps\_utility::spawn_anim_model( "player_rig", var_1.origin ); var_2 hide(); thread sunflare_toggle(); level.player enableinvulnerability(); maps\jungle_ghosts_util::move_player_to_start( "player_freefall_start" ); var_3 = level.player common_scripts\utility::spawn_tag_origin(); level.player playerlinkto( var_3 ); var_3 movegravity( ( 500, 900, 100 ), 15 ); level.player freezecontrols( 1 ); maps\_utility::trigger_wait_targetname( "player_freefall_impact" ); level.player unlink(); var_3 delete(); level.player clearclienttriggeraudiozone( 0.8 ); level.player playrumbleonentity( "grenade_rumble" ); thread maps\jungle_ghosts_util::fade_out_in( "white", undefined, 0.4 ); level.player freezecontrols( 0 ); thread setup_friendlies(); thread setup_jungle_enemies(); thread close_to_waterfall_enemy_logic(); thread parachute_intro_fx(); level.player allowstand( 1 ); level.player setstance( "stand" ); level.player allowsprint( 0 ); level.player allowcrouch( 0 ); maps\_utility::delaythread( 1, maps\jungle_ghosts_util::hud_on, 0 ); var_2 common_scripts\utility::delaycall( 0.4, ::show ); level.player playerlinktoblend( var_2, "tag_player", 0.4, 0.2, 0.2 ); level.player playerlinktodelta( var_2, "tag_player", 1, 12, 12, 5, 20 ); level.player notify( "start_falling_anim" ); var_4 = [ var_2, var_0 ]; level thread chute_flies_up(); var_1 maps\_anim::anim_single( var_4, "para_crash" ); var_2 attach( "viewmodel_knife_iw6", "tag_weapon_right" ); level.player notify( "done_falling" ); var_1 thread maps\_anim::anim_loop( var_4, "para_idle", "stop_idle" ); parachute_waittill_player_cuts(); thread player_landing_sound(); var_1 notify( "stop_idle" ); var_2 maps\_utility::anim_stopanimscripted(); level.player playerlinktoblend( var_2, "tag_player", 0.4, 0, 0 ); thread cut_exploders(); var_1 maps\_anim::anim_single( var_4, "para_cut" ); var_2 detach( "viewmodel_knife_iw6", "tag_weapon_right" ); var_2 delete(); level.player unlink(); thread tree_delete(); var_0 delete(); thread maps\_utility::autosave_stealth(); thread hill_fx(); thread maps\jungle_ghosts_util::do_bokeh( "hill_pos_1" ); thread stand_player_up(); thread do_birds(); level thread jungle_stealth_settings(); thread connect_dropdown_traverse(); thread first_distant_sat_launch(); thread dead_pilot_hang(); level.did_inactive_vo = 0; level.laser_count = 0; common_scripts\utility::flag_wait( "jungle_entrance" ); if ( !common_scripts\utility::flag( "_stealth_spotted" ) ) maps\_utility::autosave_stealth(); thread maps\jungle_ghosts_util::battle_chatter_controller_friendlies(); } sunflare_toggle() { common_scripts\utility::exploder( "sunflare" ); while ( level.player.origin[1] < 9330 ) wait 1; maps\_utility::stop_exploder( "sunflare" ); } cut_exploders() { var_0 = "j_RightDown4"; var_1 = "j_LeftDown4"; var_2 = common_scripts\utility::spawn_tag_origin(); var_3 = common_scripts\utility::spawn_tag_origin(); var_2.origin = level.harness_model gettagorigin( var_0 ) - ( 0, 0, 2 ); var_3.origin = level.harness_model gettagorigin( var_1 ); var_2 linkto( level.harness_model ); var_3 linkto( level.harness_model ); wait 0.85; playfxontag( common_scripts\utility::getfx( "vfx_parachute_strap_cut" ), var_2, "tag_origin" ); level.player playrumbleonentity( "grenade_rumble" ); wait 2.5; playfxontag( common_scripts\utility::getfx( "vfx_parachute_strap_cut" ), var_3, "tag_origin" ); level.player playrumbleonentity( "grenade_rumble" ); } player_landing_sound() { wait 4.6; level.player thread maps\_utility::play_sound_on_entity( "scn_jungle_tree_jumpland" ); level.player thread maps\_gameskill::blood_splat_on_screen( "bottom" ); level.player thread maps\_gameskill::grenade_dirt_on_screen( "bottom" ); level.player thread maps\_gameskill::blood_splat_on_screen( "right" ); level.player thread maps\_gameskill::grenade_dirt_on_screen( "right" ); } #using_animtree("generic_human"); dead_pilot_hang() { var_0 = getentarray( "dead_guy_chutes", "targetname" ); var_0[0].linker = var_0[0] common_scripts\utility::spawn_tag_origin(); var_0[1].linker = var_0[1] common_scripts\utility::spawn_tag_origin(); var_1 = 286; var_0[0].linker.origin = var_0[0].origin + ( 0, 0, var_1 ); var_0[1].linker.origin = var_0[1].origin + ( 0, 0, var_1 ); var_0[0] linkto( var_0[0].linker, "tag_origin" ); var_0[1] linkto( var_0[1].linker, "tag_origin" ); var_2 = common_scripts\utility::get_target_ent( "lt_jokes" ); var_2.animname = "dead_jungle_pilot"; var_2 attach( "head_pilot_a", "", 1 ); var_2.anim_ent = var_2 common_scripts\utility::spawn_tag_origin(); var_2 linkto( var_2.anim_ent, "tag_origin" ); var_2.anim_ent linkto( var_0[0].linker, "tag_origin" ); var_2 useanimtree( #animtree ); var_2.anim_ent thread maps\_anim::anim_loop_solo( var_2, "dead_idle", "dead_hang_ender" ); for (;;) { var_0[0].linker rotateto( var_0[0].linker.angles + ( 0.5, 0, 0 ), 6, 0, 0 ); var_0[1].linker rotateto( var_0[1].linker.angles - ( 0.5, 0, 0 ), 6, 0, 0 ); wait 5; var_0[0].linker rotateto( var_0[0].linker.angles - ( 0.5, 0, 0 ), 6, 0, 0 ); var_0[1].linker rotateto( var_0[1].linker.angles + ( 0.5, 0, 0 ), 6, 0, 0 ); wait 5; var_0[0].linker rotateto( var_0[0].linker.angles - ( 0.5, 0, 0 ), 6, 0, 0 ); var_0[1].linker rotateto( var_0[1].linker.angles + ( 0.5, 0, 0 ), 6, 0, 0 ); wait 5; var_0[0].linker rotateto( var_0[0].linker.angles + ( 0.5, 0, 0 ), 6, 0, 0 ); var_0[1].linker rotateto( var_0[1].linker.angles - ( 0.5, 0, 0 ), 6, 0, 0 ); wait 5; } } tree_delete() { var_0 = getentarray( "intro_trees", "targetname" ); foreach ( var_2 in var_0 ) var_2 delete(); } hill_fx() { common_scripts\utility::exploder( "wind" ); common_scripts\utility::flag_wait( "hill_pos_1" ); common_scripts\utility::flag_wait_any( "crash_arrive", "_stealth_spotted" ); wait 3.5; maps\_utility::stop_exploder( "wind" ); common_scripts\utility::exploder( "nonwind" ); if ( level.ps3 ) common_scripts\utility::exploder( "crash_site_fire_nonwind_ps3" ); else common_scripts\utility::exploder( "crash_site_fire_nonwind" ); } jungle_moving_foliage_settings() { setsaveddvar( "r_reactiveMotionPlayerRadius", 100 ); setsaveddvar( "r_reactiveMotionActorRadius", 20 ); setsaveddvar( "r_reactiveMotionActorVelocityMax", 0.5 ); setsaveddvar( "r_reactiveMotionEffectorStrengthScale", 10 ); setsaveddvar( "r_reactiveMotionWindDir", ( 1, 1, 1 ) ); setsaveddvar( "r_reactiveMotionWindFrequencyScale", 0.03 ); setsaveddvar( "r_reactiveMotionWindAmplitudeScale", 2 ); setsaveddvar( "r_reactiveMotionWindStrength", 0 ); maps\jungle_ghosts_util::adjust_moving_grass( 0.8, 1, 0.4, 0.15 ); } keep_up_with_player( var_0 ) { self endon( var_0 ); thread keep_up_with_player_reset( var_0 ); self.orig_speed = self.moveplaybackrate; for (;;) { if ( maps\_utility::ent_flag( "override_follow_logic" ) ) { wait 0.1; continue; } var_1 = distance2d( self.origin, level.player.origin ); var_2 = 250; if ( var_1 > var_2 && !common_scripts\utility::within_fov( level.player.origin, level.player.angles, self.origin, cos( 90 ) ) ) { self.moveplaybackrate = 1.25; var_1 = distance2d( self.origin, level.player.origin ); while ( var_1 > 100 && !common_scripts\utility::within_fov( level.player.origin, level.player.angles, self.origin, cos( 90 ) ) ) { var_1 = distance2d( self.origin, level.player.origin ); wait 0.05; } self.moveplaybackrate = self.orig_speed; } common_scripts\utility::waitframe(); } } keep_up_with_player_reset( var_0 ) { self waittill( var_0 ); self.moveplaybackrate = self.orig_speed; } parachute_waittill_player_cuts() { notifyoncommand( "cut", "+melee" ); notifyoncommand( "cut", "+melee_breath" ); notifyoncommand( "cut", "+melee_zoom" ); thread draw_cut_hint(); level.player waittill( "cut" ); if ( isdefined( level.cut_hint ) ) { var_0 = 1.5; thread fade_out_cut_hint( var_0 ); thread destroy_hint( var_0 ); } } destroy_hint( var_0 ) { wait( var_0 ); foreach ( var_2 in level.cut_hint ) var_2 destroy(); } draw_cut_hint() { level.player endon( "cut" ); wait 5; var_0 = 125; var_1 = 0; var_2 = 1; var_3 = level.player maps\_hud_util::createclientfontstring( "default", 2 ); var_3.x = var_1 * -1; var_3.y = var_0; var_3.horzalign = "right"; var_3.alignx = "right"; var_3 set_default_hud_stuff(); var_3 settext( &"JUNGLE_GHOSTS_MELEE_HINT" ); if ( !level.console && !level.player usinggamepad() ) var_3.fontscale = 2; else var_3.fontscale = 2 * var_2; var_4 = []; var_4["text"] = var_3; level.cut_hint = var_4; thread pulse_cut_hint(); } set_default_hud_stuff() { level.player endon( "cut" ); self.alignx = "center"; self.aligny = "middle"; self.horzalign = "center"; self.vertalign = "middle"; self.hidewhendead = 1; self.hidewheninmenu = 1; self.sort = 205; self.foreground = 1; self.alpha = 0; } pulse_cut_hint() { level.player endon( "cut" ); for (;;) { fade_in_cut_hint(); fade_out_cut_hint(); } } fade_in_cut_hint( var_0 ) { level.player endon( "cut" ); if ( !isdefined( var_0 ) ) var_0 = 1.5; foreach ( var_2 in level.cut_hint ) { var_2 fadeovertime( var_0 ); var_2.alpha = 0.95; } wait( var_0 ); } fade_out_cut_hint( var_0 ) { if ( !isdefined( var_0 ) ) var_0 = 1.5; foreach ( var_2 in level.cut_hint ) { var_2 fadeovertime( var_0 ); var_2.alpha = 0; } wait( var_0 ); } chute_flies_up() { wait 2.2; var_0 = level.player common_scripts\utility::spawn_tag_origin(); var_0 setmodel( "parachute_hanging_static" ); var_0 show(); var_0.origin = level.player.origin + ( 280, 0, -130 ); wait 4; var_0 delete(); } parachute_sway_settings() { wait 0.15; var_0 = level.player getplayerangles(); var_0 = ( 0, var_0[1], 0 ); var_1 = anglestoright( var_0 ); var_2 = var_1 * 10; var_3 = var_2 * -1; level endon( "player_landed" ); var_4 = level.player.origin + var_2; var_5 = level.player.origin + var_3; var_6 = 12; self moveto( var_4, var_6 * 0.5 ); wait( var_6 * 0.5 ); for (;;) { var_6 = randomintrange( 13, 18 ); self moveto( var_5, var_6, var_6 * 0.1, var_6 * 0.9 ); wait( var_6 ); self moveto( var_4, var_6, var_6 * 0.1, var_6 * 0.9 ); wait( var_6 ); } } parachute_intro_fx() { level endon( "player_landed" ); thread parachute_intro_sound(); level.player thread parachute_heartbeat(); common_scripts\utility::exploder( 1 ); level.player waittill( "done_falling" ); setblur( 5, 0.1 ); wait 2; setblur( 0, 2 ); heartbeat(); wait 1; do_bird_single(); heartbeat(); wait 2; heartbeat(); wait 3; heartbeat(); } parachute_heartbeat() { level.player endon( "done_falling" ); for (;;) { heartbeat(); wait 1.5; } } heartbeat() { setblur( 5, 0.25 ); level.player thread maps\_utility::play_sound_on_entity( "breathing_heartbeat" ); wait 0.25; setblur( 0, 0.25 ); } parachute_intro_sound() { thread parachute_player_land_sounds(); level endon( "player_landed" ); level.player thread maps\_utility::play_sound_on_entity( "scn_jungle_tree_landing" ); level.player common_scripts\utility::delaycall( 3.0, ::setclienttriggeraudiozonepartial, "jungle_ghosts_intro_alley_no_ping", "mix" ); } parachute_player_land_sounds() { common_scripts\utility::flag_wait( "player_landed" ); level.player playrumbleonentity( "grenade_rumble" ); wait 0.5; level.player playrumbleonentity( "grenade_rumble" ); } first_distant_sat_launch() { common_scripts\utility::flag_wait( "jungle_entrance" ); level.player thread common_scripts\utility::play_sound_in_space( "jg_sat_launch_distant_first", level.player.origin ); wait 0.3; earthquake( 0.1, 4, level.player.origin, 850 ); level.player playrumblelooponentity( "damage_light" ); wait 4.0; level.player stoprumble( "damage_light" ); } connect_dropdown_traverse() { var_0 = getent( "dropdown_disconnect", "targetname" ); var_0 disconnectpaths(); common_scripts\utility::flag_wait( "hill_pos_1" ); var_0.origin = var_0.origin + ( 0, 0, 1000 ); var_0 connectpaths(); } stand_player_up() { level.player.ground_ref_ent = common_scripts\utility::spawn_tag_origin(); level.player playersetgroundreferenceent( level.player.ground_ref_ent ); level.player thread enable_tired( 75 ); level.player allowstand( 0 ); level.player allowcrouch( 0 ); level.player allowprone( 1 ); level.player setstance( "prone" ); thread maps\_utility::player_speed_set( 75, 0.1 ); level.player setbobrate( 2.25 ); level.player disableinvulnerability(); while ( level.player.origin[0] < -7900 ) common_scripts\utility::waitframe(); level.player thread transition_stance_cover( 6, 3, 2, 75 ); wait 1.5; level.player allowcrouch( 1 ); level.player allowprone( 0 ); level.player setstance( "crouch" ); level.player maps\_utility::play_sound_on_entity( "scn_player_get_up_to_crouch" ); while ( level.player.origin[0] < -7510 ) common_scripts\utility::waitframe(); level.player thread transition_stance_cover( 6, 3, 2, 75 ); wait 1.5; level.player allowstand( 1 ); level.player allowcrouch( 0 ); level.player allowprone( 0 ); level.player setstance( "stand" ); level.player maps\_utility::play_sound_on_entity( "scn_player_get_up_to_stand" ); while ( level.player.origin[0] < -7346 ) common_scripts\utility::waitframe(); level.player allowstand( 1 ); level.player allowcrouch( 1 ); level.player allowprone( 1 ); while ( level.player.origin[0] < -7346 ) common_scripts\utility::waitframe(); var_0 = [ "p226_tactical+silencerpistol_sp+tactical_sp" ]; wait 0.25; level.player clearclienttriggeraudiozone( 0.1 ); maps\jungle_ghosts_util::arm_player( var_0 ); maps\jungle_ghosts_util::hud_on( 1 ); wait 1; while ( level.player.origin[0] < -6877 ) common_scripts\utility::waitframe(); common_scripts\utility::flag_set( "intro_lines" ); level.player thread disable_tired( 1 ); setsaveddvar( "cg_footsteps", 1 ); if ( level.start_point == "parachute" ) maps\_introscreen::introscreen( 1 ); wait 3; level thread player_spotted_logic(); } transition_stance_cover( var_0, var_1, var_2, var_3 ) { level.player disable_tired(); level.player allowjump( 0 ); thread maps\_utility::player_speed_set( 25, 3 ); level.player setbobrate( 2.25 ); setblur( var_0, var_1 ); level.player thread stumble( level.player.angles + ( 0, 0, 35 ), 0.75, 0.75 ); wait( var_1 ); setblur( 0, var_2 ); level.player thread enable_tired( var_3 ); } enable_tired( var_0 ) { init_default_tired(); self.limp_strength = 1.0; self.ground_ref_ent = spawn( "script_model", ( 0, 0, 0 ) ); self playersetgroundreferenceent( self.ground_ref_ent ); maps\_utility::player_speed_set( var_0, 3 ); self.player_speed = var_0; level.player setbobrate( 2.25 ); thread tired(); } init_default_tired() { level.player_tired = []; level.player_tired["pitch"]["min"] = -3; level.player_tired["pitch"]["max"] = 4; level.player_tired["yaw"]["min"] = -8; level.player_tired["yaw"]["max"] = 5; level.player_tired["roll"]["min"] = 3; level.player_tired["roll"]["max"] = 5; } disable_tired( var_0, var_1 ) { self notify( "stop_limp" ); self notify( "stop_random_blur" ); if ( !isdefined( var_1 ) ) var_1 = 0; if ( isdefined( var_0 ) ) { self playersetgroundreferenceent( undefined ); setsaveddvar( "player_sprintUnlimited", "0" ); self notify( "stop_limp_forgood" ); level.player maps\_utility::player_speed_percent( 90, 5 ); level.player setbobrate( 1.1 ); self allowstand( 1 ); self allowcrouch( 1 ); self allowsprint( 1 ); self allowjump( 1 ); } else { var_2 = randomfloatrange( 0.65, 1.25 ); var_3 = adjust_angles_to_player( ( 0, 0, 0 ) ); self.ground_ref_ent rotateto( var_3, var_2, 0, var_2 / 2 ); self.ground_ref_ent waittill( "rotatedone" ); } setblur( 0, randomfloatrange( 0.5, 0.75 ) ); } tired( var_0 ) { self endon( "stop_limp" ); self allowsprint( 0 ); self allowjump( 0 ); thread player_random_blur(); thread player_hurt_sounds(); for (;;) { if ( self playerads() > 0.3 ) { wait 0.05; continue; } var_1 = self getvelocity(); var_2 = abs( var_1[0] ) + abs( var_1[1] ); if ( var_2 < 10 ) { wait 0.05; continue; } var_3 = var_2 / self.player_speed; var_4 = randomfloatrange( level.player_tired["pitch"]["min"], level.player_tired["pitch"]["max"] ); if ( randomint( 100 ) < 20 ) var_4 = var_4 * 1.5; var_5 = randomfloatrange( level.player_tired["roll"]["min"], level.player_tired["roll"]["max"] ); var_6 = randomfloatrange( level.player_tired["yaw"]["min"], level.player_tired["yaw"]["max"] ); var_7 = ( var_4, var_6, var_5 ); var_7 = var_7 * var_3; var_7 = var_7 * self.limp_strength; var_8 = randomfloatrange( 0.15, 0.45 ); var_9 = randomfloatrange( 0.65, 1.25 ); thread stumble( var_7, var_8, var_9 ); wait( var_8 ); self waittill( "recovered" ); } } stumble( var_0, var_1, var_2, var_3 ) { self endon( "stop_stumble" ); self endon( "stop_limp" ); var_0 = adjust_angles_to_player( var_0 ); self notify( "stumble" ); self.ground_ref_ent rotateto( var_0, var_1, var_1 / 4 * 3, var_1 / 4 ); self.ground_ref_ent waittill( "rotatedone" ); var_4 = ( randomfloat( 4 ) - 4, randomfloat( 5 ), 0 ); var_4 = adjust_angles_to_player( var_4 ); self.ground_ref_ent rotateto( var_4, var_2, 0, var_2 / 2 ); self.ground_ref_ent waittill( "rotatedone" ); if ( !isdefined( var_3 ) ) self notify( "recovered" ); } player_random_blur() { self endon( "dying" ); self endon( "stop_random_blur" ); for (;;) { wait 0.05; if ( randomint( 100 ) > 10 ) continue; var_0 = randomint( 3 ) + 4; var_1 = randomfloatrange( 0.1, 0.3 ); var_2 = randomfloatrange( 0.3, 1 ); setblur( var_0 * 1.2, var_1 ); wait( var_1 ); setblur( 0, var_2 ); wait( var_2 ); wait( randomfloatrange( 0, 1.5 ) ); common_scripts\utility::waittill_notify_or_timeout( "blur", 5 ); } } player_hurt_sounds() { self endon( "stop_limp" ); for (;;) { if ( player_playing_hurt_sounds() ) { wait 0.05; continue; } self notify( "blur" ); common_scripts\utility::play_sound_in_space( "breathing_limp_start" ); common_scripts\utility::play_sound_in_space( "breathing_limp_better" ); wait( randomfloatrange( 0, 1 ) ); self waittill( "stumble" ); } } player_playing_hurt_sounds() { if ( level.player.health < 50 ) return 1; else return 0; } adjust_angles_to_player( var_0 ) { var_1 = var_0[0]; var_2 = var_0[2]; var_3 = anglestoright( self.angles ); var_4 = anglestoforward( self.angles ); var_5 = ( var_3[0], 0, var_3[1] * -1 ); var_6 = ( var_4[0], 0, var_4[1] * -1 ); var_7 = var_5 * var_1; var_7 = var_7 + var_6 * var_2; return var_7 + ( 0, var_0[1], 0 ); } assign_archetypes() { foreach ( var_1 in level.alpha ) var_1.animarchetype = "jungle_soldier"; } setup_jungle_enemies() { setsaveddvar( "laserradius", 0.4 ); maps\_utility::array_spawn_function_targetname( "jungle_patroller", ::jungle_enemy_logic, "zero", 1 ); maps\_utility::array_spawn_function_targetname( "lookout_guys", ::lookout_guys_logic ); maps\_utility::array_spawn_function_targetname( "right_meeting_guys", ::right_meeting_guys_logic ); maps\_utility::array_spawn_function_targetname( "left_meeting_guys", ::left_meeting_guys_logic ); level.jungle_enemies = maps\_utility::array_spawn_targetname( "jungle_patroller", 1 ); var_0 = maps\_utility::array_spawn_targetname( "lookout_guys", 1 ); waittillframeend; level.jungle_enemies = common_scripts\utility::array_combine( level.jungle_enemies, var_0 ); level.right_meeting_guys = maps\_utility::array_spawn_targetname( "right_meeting_guys", 1 ); level.left_meeting_guys = maps\_utility::array_spawn_targetname( "left_meeting_guys", 1 ); level.meeting_guys = common_scripts\utility::array_combine( level.right_meeting_guys, level.left_meeting_guys ); waittillframeend; level.jungle_enemies = common_scripts\utility::array_combine( level.jungle_enemies, level.meeting_guys ); level thread meeting_guys_vo( level.left_meeting_guys ); level thread meeting_guys_vo( level.right_meeting_guys ); thread setup_hill_enemies(); } jungle_stealth_settings() { var_0 = []; var_0["prone"] = 100; var_0["crouch"] = 400; var_0["stand"] = 600; var_1 = []; var_1["prone"] = 500; var_1["crouch"] = 1500; var_1["stand"] = 2000; maps\_stealth_utility::stealth_detect_ranges_set( var_0, var_1 ); var_2 = []; var_2["player_dist"] = 600; var_2["sight_dist"] = 200; var_2["detect_dist"] = 100; var_2["found_dist"] = 50; var_2["found_dog_dist"] = 50; maps\_stealth_utility::stealth_corpse_ranges_custom( var_2 ); } player_spotted_count() { maps\_utility::ent_flag_wait( "_stealth_behavior_first_reaction" ); if ( level.laser_count < 5 ) { self laserforceon(); level.laser_count++; } thread delay_notify_alive(); if ( !maps\_utility::is_in_array( level.stealth_player_aware_enemies, self ) ) level.stealth_player_aware_enemies = common_scripts\utility::add_to_array( level.stealth_player_aware_enemies, self ); self waittill( "death" ); level.laser_count--; level.stealth_player_aware_enemies = common_scripts\utility::array_remove( level.stealth_player_aware_enemies, self ); } delay_notify_alive() { self endon( "death" ); if ( maps\jungle_ghosts_util::isdefined_and_alive( self ) ) level notify( "enemy_stealth_reaction" ); } player_spotted_logic() { level endon( "waterfall_approach" ); for (;;) { level.player setmovespeedscale( 0.75 ); common_scripts\utility::flag_wait( "_stealth_spotted" ); level.player setmovespeedscale( 0.9 ); setsaveddvar( "player_sprintSpeedScale", 1.4 ); common_scripts\utility::flag_waitopen( "_stealth_spotted" ); if ( common_scripts\utility::flag( "waterfall_approach" ) ) thread maps\jungle_ghosts_util::stop_music_jg( 1 ); } } alert_on_chopper_damage() { self endon( "death" ); self waittill( "damage" ); var_0 = common_scripts\utility::get_array_of_closest( self.origin, getaiarray( "axis" ) ); for ( var_1 = 0; var_1 < 3 || var_1 < var_0.size; var_1++ ) { if ( maps\jungle_ghosts_util::isdefined_and_alive( var_0[var_1] ) ) { var_0[var_1] thread maps\jungle_ghosts_util::manually_alert_me(); wait( randomfloatrange( 0.5, 1 ) ); } } } jungle_enemy_logic( var_0, var_1 ) { maps\jungle_ghosts_util::enemy_weapons_force_use_silencer(); self endon( "death" ); if ( !common_scripts\utility::flag( "second_distant_sat_launch" ) ) maps\_utility::set_moveplaybackrate( 0.7 ); else maps\_utility::set_moveplaybackrate( 1 ); if ( isdefined( self.target ) ) thread maps\_patrol::patrol(); thread set_nearest_stealth_group(); maps\_utility::disable_long_death(); self.diequietly = 1; self.no_pain_sound = 1; self.skipbloodpool = 1; thread player_spotted_count(); thread jungle_enemy_sfx(); maps\_utility::set_ai_bcvoice( "shadowcompany" ); thread maps\_utility::set_battlechatter( 0 ); maps\_utility::ent_flag_init( "stealth_kill" ); if ( !common_scripts\utility::flag( "second_distant_sat_launch" ) ) thread maps\_patrol_anims_creepwalk::enable_creepwalk(); if ( isdefined( var_0 ) ) { if ( var_0 == "zero" ) self.grenadeammo = 0; else self.grenadeammo = var_0; } if ( isdefined( var_1 ) ) { self.stealth_blockers = 0; self._stealth.logic.alert_level.min_bulletwhizby_altert_dist = 500; } } jungle_enemy_sfx() { self endon( "death" ); var_0 = 1000000; while ( !isdefined( level.meeting_guys ) ) wait 0.1; if ( maps\_utility::is_in_array( level.meeting_guys, self ) ) return; if ( isdefined( self.script_noteworthy ) ) { if ( self.script_noteworthy == "tall_grass_patroller" || self.script_noteworthy == "no_chatter" ) return; } var_1 = [ "jungleg_safr_salvageteametato", "jungleg_safr_lookslikeuhhzerosurvivors", "jungleg_safr_maintainsweepchutes", "jungleg_safr_standbyforrules", "jungleg_safr_team2reportingzero", "jungleg_safr_team3hasrecovered", "jungleg_safr_primarytargetrecoveredall" ]; var_1 = common_scripts\utility::array_randomize( var_1 ); var_2 = 0; for (;;) { var_3 = distancesquared( self.origin, level.player.origin ); if ( var_3 <= var_0 ) { if ( maps\jungle_ghosts_util::is_moving() ) play_foilage_sound_custom(); var_4 = var_1[var_2]; maps\_utility::play_sound_on_tag( var_4, undefined, 1 ); var_2++; if ( var_2 > var_1.size - 1 ) var_2 = 0; wait( randomintrange( 5, 8 ) ); } wait 2; } } play_foilage_sound_custom() { thread maps\_utility::play_sound_on_tag( "scn_tree_snap", undefined, 1 ); wait 0.1; thread maps\_utility::play_sound_on_tag( "scn_bush_movement", undefined, 1 ); wait 0.25; thread maps\_utility::play_sound_on_tag( "scn_tree_snap", undefined, 1 ); } lookout_guys_logic() { maps\jungle_ghosts_util::enemy_weapons_force_use_silencer(); thread jungle_enemy_logic( "zero", 1 ); maps\_utility::trigger_wait_targetname( "jungle_entrance" ); thread lookout_animation(); } right_meeting_guys_logic() { maps\jungle_ghosts_util::enemy_weapons_force_use_silencer(); thread jungle_enemy_logic( "zero", 1 ); var_0 = common_scripts\utility::getstruct( "right_meeting", "targetname" ); thread meeting_animation( var_0, "meeting_trig" ); } left_meeting_guys_logic() { maps\jungle_ghosts_util::enemy_weapons_force_use_silencer(); thread jungle_enemy_logic( "zero", 1 ); var_0 = common_scripts\utility::getstruct( "left_meeting", "targetname" ); thread meeting_animation( var_0, undefined ); } meeting_animation( var_0, var_1 ) { self endon( "death" ); var_2 = undefined; switch ( self.script_noteworthy ) { case "guy1": var_2 = "meeting_idle1"; break; case "guy2": var_2 = "meeting_idle2"; break; case "guy3": var_2 = "meeting_idle3"; break; } var_0 thread maps\jungle_ghosts_util::stealth_ai_idle( self, var_2, undefined, undefined ); if ( isdefined( var_1 ) ) { thread stealth_anim_interupt_detection( "meeting" ); self endon( "abort_meeting" ); maps\_utility::trigger_wait_targetname( var_1 ); self notify( "stop_meeting_vo" ); var_0 notify( "stop_loop" ); self.animname = self.script_noteworthy; var_0 maps\_anim::anim_single_solo( self, "meeting" ); self notify( "meeting" ); self.animname = self.og_animname; thread maps\_patrol::patrol(); } else { thread stealth_anim_interupt_detection( "death" ); var_3 = maps\_stealth_shared_utilities::group_get_flagname( "_stealth_spotted" ); common_scripts\utility::flag_wait( var_3 ); wait( randomintrange( 1, 3 ) ); maps\jungle_ghosts_util::manually_alert_me(); self.goalradius = 250; self setgoalentity( level.player ); } } meeting_guys_vo( var_0 ) { level endon( "_stealth_spotted" ); var_1 = [ "jungleg_saf1_hqisreportingsurvivors", "jungleg_saf2_howmany", "jungleg_saf1_twosofartheyre", "jungleg_saf2_vasquezsaidhesaw", "jungleg_saf1_conflictingreportsfromthe" ]; var_2 = [ "jungleg_saf3_team2iscoverng", "jungleg_saf4_idontunderstandwho", "jungleg_saf3_itswhowasnton", "jungleg_saf4_copythattheyrealready", "jungleg_saf3_weregoingtobe" ]; var_3 = [ "jungleg_saf1_noimsayinghe", "jungleg_saf4_howdoyoueven", "jungleg_saf1_itdoesntmatterwhat", "jungleg_saf4_weregonnaneedmore", "jungleg_saf2_lesscomplainingmore", "jungleg_saf4_myteamsonit" ]; var_4 = [ var_1, var_2, var_3 ]; foreach ( var_6 in var_0 ) var_6 endon( "stop_meeting_vo" ); for (;;) { foreach ( var_13, var_9 in var_4 ) { foreach ( var_11 in var_9 ) { var_6 = common_scripts\utility::random( var_0 ); if ( !maps\jungle_ghosts_util::isdefined_and_alive( var_6 ) ) return; else var_6 maps\_utility::play_sound_on_tag( var_11, undefined, 1 ); } } wait 5; } } lookout_animation() { if ( !isdefined( self ) ) return; self.og_animname = self.animname; self.animname = self.script_noteworthy; thread stealth_anim_interupt_detection( "helpup_lookout" ); var_0 = common_scripts\utility::getstruct( "lookout_scene", "targetname" ); var_0 thread maps\_anim::anim_single_solo( self, "helpup_lookout" ); wait 0.05; self setanimtime( maps\_utility::getanim( "helpup_lookout" ), 0.7 ); self.animname = self.og_animname; maps\_utility::notify_delay( "helpup_lookout", 5 ); self.patrol_walk_anim = "active_patrolwalk_gundown"; thread maps\_patrol::patrol(); } stealth_anim_interupt_detection( var_0 ) { self endon( var_0 ); thread maps\_stealth_utility::stealth_enemy_endon_alert(); common_scripts\utility::waittill_any( "enemy_stealth_reaction", "damage", "stealth_enemy_endon_alert", "enemy_awareness_reaction", "bulletwhizby" ); self stopanimscripted(); var_1 = get_my_meeting_group(); if ( isdefined( var_1 ) ) { var_1 = maps\_utility::array_removedead_or_dying( var_1 ); maps\_utility::array_notify( var_1, "abort_meeting" ); } } get_my_meeting_group() { if ( maps\_utility::is_in_array( level.left_meeting_guys, self ) ) return level.left_meeting_guys; else if ( maps\_utility::is_in_array( level.right_meeting_guys, self ) ) return level.right_meeting_guys; else return undefined; } hill_enemy_stealth_logic() { maps\jungle_ghosts_util::enemy_weapons_force_use_silencer(); self endon( "death" ); maps\_utility::disable_long_death(); thread player_spotted_count(); thread set_nearest_stealth_group(); maps\_stealth_utility::stealth_pre_spotted_function_custom( ::jungle_prespotted_func ); maps\_utility::set_ai_bcvoice( "shadowcompany" ); thread maps\_utility::set_battlechatter( 0 ); thread maps\_patrol_anims_creepwalk::enable_creepwalk(); maps\_utility::forceuseweapon( "sc2010+silencer_sp", "primary" ); self.grenadeammo = 0; if ( isdefined( self.script_noteworthy ) && self.script_noteworthy == "cliff_looker" ) { thread cliff_guy_logic(); return; } level endon( "_stealth_spotted" ); self laserforceon(); } set_nearest_stealth_group() { self endon( "death" ); if ( common_scripts\utility::flag( "second_distant_sat_launch" ) ) return; self.og_script_stealthgroup = self.script_stealthgroup; for (;;) { var_0[0] = self; var_1 = maps\_utility::get_closest_ai( self.origin, "axis", var_0 ); if ( isdefined( var_1 ) ) { if ( distance( var_1.origin, self.origin ) < 600 ) { if ( isdefined( var_1.script_stealthgroup ) && var_1.script_stealthgroup != self.script_stealthgroup ) self.script_stealthgroup = var_1.script_stealthgroup; } else if ( self.script_stealthgroup != self.og_script_stealthgroup ) self.script_stealthgroup = self.og_script_stealthgroup; } wait 1; } } cliff_guy_logic() { self endon( "death" ); self.animname = "generic"; var_0 = common_scripts\utility::getstruct( self.target, "targetname" ); self forceteleport( var_0.origin, var_0.angles ); var_0 maps\_stealth_utility::stealth_ai_idle_and_react( self, "cliff_look", "cliff_look_react" ); } hill_enemy_on_spotted() { self endon( "death" ); common_scripts\utility::flag_wait( "_stealth_spotted" ); maps\_utility::disable_cqbwalk(); self stopanimscripted(); maps\_utility::set_moveplaybackrate( 1 ); } jungle_prespotted_func() { wait( level.stealth_spotted_time ); } stealth_hard_reset() { self.ignoreme = 1; self.ignoreall = 1; maps\_stealth_utility::disable_stealth_for_ai(); wait 1; maps\_stealth_utility::enable_stealth_for_ai(); self.ignoreme = 0; self.ignoreall = 0; } knife_victim_death_func() { self startragdoll(); } jungle_friendly_logic() { self.disableplayeradsloscheck = 1; maps\_utility::ent_flag_init( "stealth_kill" ); maps\_utility::ent_flag_init( "override_follow_logic" ); self.grenadeammo = 0; thread maps\_utility::magic_bullet_shield( 1 ); thread maps\_stealth_utility::stealth_default(); thread maps\jungle_ghosts_util::friendly_jungle_stealth_color_behavior(); self.maxsightdistsqrd = 810000; maps\_utility::set_ai_bcvoice( "taskforce" ); self.npcid = 0; maps\_utility::disable_surprise(); maps\_utility::set_force_color( "r" ); } setup_hill_enemies() { maps\_utility::array_spawn_function_targetname( "hill_patrollers", ::hill_enemy_stealth_logic ); maps\_utility::array_spawn_function_targetname( "hill_patrollers", ::hill_enemy_on_spotted ); maps\_utility::array_spawn_function_targetname( "plane_meeting_guys", ::plane_meeting_guys_logic ); thread hill_chopper(); common_scripts\utility::flag_wait( "hill_pos_1" ); if ( !common_scripts\utility::flag( "_stealth_spotted" ) ) maps\_utility::autosave_stealth(); if ( common_scripts\utility::flag( "_stealth_spotted" ) ) { level.hill_patrollers = maps\_utility::array_spawn_targetname( "hill_patrollers", 1 ); level thread handle_enemies_behind_player(); } else { level.hill_patrollers = maps\_utility::array_spawn_targetname( "hill_patrollers", 1 ); var_0 = maps\_utility::array_spawn_targetname( "plane_meeting_guys", 1 ); level.hill_patrollers = common_scripts\utility::array_combine( var_0, level.hill_patrollers ); level thread handle_enemies_behind_player(); } common_scripts\utility::flag_wait( "hill_pos_4" ); wait 2; while ( level.hill_patrollers.size != 0 ) { level.hill_patrollers = maps\_utility::array_removedead( level.hill_patrollers ); wait 2; } common_scripts\utility::flag_set( "hill_clear" ); } heli_guys_logic() { self.ignoreme = 1; self.ignoreall = 1; } plane_meeting_guys_logic() { thread jungle_enemy_logic( "zero", 1 ); var_0 = common_scripts\utility::getstruct( "plane_meeting", "targetname" ); thread meeting_animation( var_0 ); } spawn_hill_enemies_hot() { var_0 = getent( "hill_main_volume", "targetname" ); var_1 = getent( "hill_main_volume", "targetname" ); level.hill_patrollers = common_scripts\utility::array_removeundefined( level.hill_patrollers ); var_2 = getentarray( "hill_hot_enemies", "targetname" ); var_3 = maps\jungle_ghosts_util::enemy_weapons_force_use_silencer; maps\_utility::array_spawn_function_targetname( "hill_hot_enemies", var_3 ); level.hill_holders = []; level.hill_squad = []; level.hill_squad = maps\jungle_ghosts_util::create_a_squad_from_spawner( var_2[0], level.hill_squad, 5 ); level thread maps\jungle_ghosts_util::squad_manager( level.hill_squad ); wait 5; level.hill_holders = maps\jungle_ghosts_util::spawn_ai_from_spawner_send_to_volume( var_2[1], 5, var_1 ); level.hill_patrollers = common_scripts\utility::array_combine( level.hill_holders, level.hill_squad ); } handle_enemies_behind_player() { level endon( "waterfall_approach" ); common_scripts\utility::flag_wait( "hill_pos_1" ); if ( common_scripts\utility::flag( "_stealth_spotted" ) ) return; common_scripts\utility::flag_wait( "_stealth_spotted" ); var_0 = undefined; if ( isdefined( level.jungle_enemies ) ) { if ( common_scripts\utility::flag( "hill_pos_4" ) ) common_scripts\utility::array_thread( level.jungle_enemies, maps\jungle_ghosts_util::delete_if_player_cant_see_me ); else { level.jungle_enemies = maps\_utility::array_removedead_or_dying( level.jungle_enemies ); if ( level.jungle_enemies.size > 2 ) { var_0 = common_scripts\utility::get_array_of_closest( level.player.origin, level.jungle_enemies ); for ( var_1 = 2; var_1 < var_0.size; var_1++ ) var_0[var_1] maps\jungle_ghosts_util::delete_if_player_cant_see_me(); var_0 = common_scripts\utility::array_removeundefined( var_0 ); } else if ( level.jungle_enemies.size != 0 ) var_0 = level.jungle_enemies; if ( isdefined( var_0 ) ) { foreach ( var_3 in var_0 ) { var_3 maps\_utility::enable_sprint(); var_4 = level.player; var_3 setgoalentity( var_4 ); var_3 thread set_flag_when_close( var_4 ); } } } } } hill_chopper() { maps\_utility::array_spawn_function_targetname( "heli_guys", ::heli_guys_logic ); var_0 = maps\_vehicle::spawn_vehicle_from_targetname( "hill_heli" ); var_0 vehicle_turnengineoff(); var_0 endon( "death" ); var_0 thread alert_on_chopper_damage(); common_scripts\utility::flag_wait( "hill_pos_1" ); level.player setclienttriggeraudiozonepartial( "jungle_ghosts_intro_no_vehicle_npc", "mix" ); var_0 vehicle_turnengineon(); thread hill_heli_fade_in_sounds(); common_scripts\utility::flag_wait_any( "crash_arrive", "_stealth_spotted" ); var_0 maps\_vehicle::gopath(); wait 10; var_0 vehicle_setspeedimmediate( 40, 10 ); } hill_heli_fade_in_sounds() { level.player clearclienttriggeraudiozone( 3.0 ); } hill_reenforcements() { level.spawned_reenforcements = 0; common_scripts\utility::flag_wait( "hill_pos_4" ); send_hill_reenforcements_if_hot(); common_scripts\utility::flag_wait( "hill_pos_5" ); if ( level.spawned_reenforcements == 0 ) send_hill_reenforcements_if_hot(); } send_hill_reenforcements_if_hot() { level endon( "waterfall_approach" ); if ( common_scripts\utility::flag( "_stealth_spotted" ) ) { level.spawned_reenforcements = 1; var_0 = getent( "hilltop_volume_1", "targetname" ); var_1 = getent( "hill_backup_left", "targetname" ); var_2 = maps\jungle_ghosts_util::spawn_ai_from_spawner_send_to_volume( var_1, 4, var_0 ); level.hill_patrollers = common_scripts\utility::array_combine( level.hill_patrollers, var_2 ); common_scripts\utility::flag_set( "player_agro_near_execution" ); } } set_flag_when_close( var_0 ) { self endon( "death" ); level endon( "hill_flanked" ); for (;;) { var_1 = distancesquared( self.origin, var_0.origin ); if ( var_1 <= 202500 ) { common_scripts\utility::flag_set( "hill_flanked" ); iprintlnbold( "enemies flanking!" ); return; } wait 0.5; } } setup_friendlies() { thread battlechatter_setup(); thread jungle_vo(); common_scripts\utility::flag_wait( "waterfall_approach" ); maps\_utility::array_spawn_function_targetname( "alpha_team", ::jungle_friendly_logic ); level.alpha = maps\_utility::array_spawn_targetname( "alpha_team", 1 ); foreach ( var_1 in level.alpha ) { if ( var_1.script_friendname == "Elias" ) { level.alpha1 = var_1; level.alpha1.animname = "alpha1"; level.alpha1 maps\_utility::forceuseweapon( "honeybadger", "primary" ); level.alpha1.name = "Elias"; continue; } level.alpha2 = var_1; level.alpha2.animname = "alpha2"; level.alpha2 maps\_utility::forceuseweapon( "honeybadger", "primary" ); } level.alpha1.animname = "alpha1"; common_scripts\utility::flag_set( "friendlies_ready" ); assign_archetypes(); level thread friendly_navigation(); thread delete_bloomdome(); thread waterfall_execution(); level.player thread maps\jungle_ghosts_util::stream_waterfx( "stop_water_footsteps", "step_run_plr_water" ); thread maps\jungle_ghosts_util::stop_music_jg( 1 ); } battlechatter_setup() { common_scripts\utility::waitframe(); var_0 = getaiarray(); foreach ( var_2 in var_0 ) var_2 thread maps\_utility::set_battlechatter( 0 ); } friendly_navigation() { common_scripts\utility::flag_wait( "friendlies_ready" ); foreach ( var_1 in level.alpha ) { var_1 maps\_utility::set_moveplaybackrate( 1 ); var_1.ignoreall = 1; } } bravo_friendly_logic() { self.ignoreall = 1; self.ignoreme = 1; self.goalradius = 32; self.disableplayeradsloscheck = 1; thread maps\_utility::magic_bullet_shield( 1 ); maps\_utility::set_ai_bcvoice( "taskforce" ); thread maps\_stealth_utility::stealth_default(); thread maps\jungle_ghosts_util::friendly_jungle_stealth_color_behavior(); if ( self.script_friendname == "Merrick" ) level.merrick = self; else level.hesh = self; } delete_bloomdome() { var_0 = getentarray( "bloomdome", "targetname" ); foreach ( var_2 in var_0 ) var_2 delete(); } close_to_waterfall_enemy_logic() { thread final_jungle_ai_cleanup(); level endon( "waterfall_trig" ); level endon( "hostage_flag_set" ); common_scripts\utility::flag_wait( "waterfall_approach" ); var_0 = getent( "hilltop_volume_1", "targetname" ); for (;;) { var_1 = getaiarray( "axis" ); foreach ( var_3 in var_1 ) { if ( maps\jungle_ghosts_util::isdefined_and_alive( var_3 ) ) { if ( common_scripts\utility::flag( "_stealth_spotted" ) ) { if ( level.player.origin[1] > 850 && var_3.origin[1] > -350 ) { var_3 setgoalpos( var_3.origin ); var_3 setgoalvolumeauto( var_0 ); var_3 maps\_stealth_utility::disable_stealth_for_ai(); continue; } var_3 setgoalentity( level.player ); } } } wait 1; } } final_jungle_ai_cleanup() { level common_scripts\utility::waittill_any( "waterfall_trig", "hostage_flag_set" ); var_0 = getaiarray( "axis" ); foreach ( var_2 in var_0 ) { if ( isdefined( var_2.script_noteworthy ) ) { if ( var_2.script_noteworthy != "guard1" && var_2.script_noteworthy != "guard2" && var_2.script_noteworthy != "execution_guards" ) var_2 delete(); continue; } var_2 delete(); } } waterfall_execution() { common_scripts\utility::trigger_off( "mid_stream", "targetname" ); common_scripts\utility::trigger_off( "waterfall_to_stream", "targetname" ); level thread maps\jungle_ghosts_stream::friendly_stream_navigation(); slomo_sound_scale_setup(); maps\_utility::array_spawn_function_targetname( "bravo_team", ::bravo_friendly_logic ); var_0 = maps\_utility::spawn_targetname( "guard_a_1", 1 ); var_0.ignoreme = 1; var_1 = maps\_utility::spawn_targetname( "guard_a_2", 1 ); var_1.ignoreme = 1; var_2 = maps\_utility::spawn_targetname( "guard_b_1", 1 ); var_2.ignoreme = 1; var_3 = maps\_utility::spawn_targetname( "guard_b_2", 1 ); var_3.ignoreme = 1; level.bravo = maps\_utility::array_spawn_targetname( "bravo_team", 1 ); maps\_utility::friendlyfire_warnings_off(); var_4 = level.bravo[0]; var_4.deathfunc = ::knife_victim_death_func; var_5 = level.bravo[1]; var_5.deathfunc = ::knife_victim_death_func; var_4.animname = "hostage_a"; var_5.animname = "hostage_b"; var_0.animname = "guard_a_1"; var_1.animname = "guard_a_2"; var_2.animname = "guard_b_1"; var_3.animname = "guard_b_2"; var_0.skipbloodpool = 1; var_1.skipbloodpool = 1; var_2.skipbloodpool = 1; var_3.skipbloodpool = 1; var_6 = spawnstruct(); var_6.guard_a_1 = var_0; var_6.guard_a_2 = var_1; var_6.guard_b_1 = var_2; var_6.guard_b_2 = var_3; var_6.hostage_a = var_4; var_6.hostage_b = var_5; var_6.guard_a_2 thread check_guard_death_to_stop_pistol_fire(); var_6.guard_a_2.allowdeath = 1; var_6.guard_b_2.allowdeath = 1; var_4 maps\_utility::gun_remove(); var_6.outcome_decided = 0; var_6.a_guys = [ var_0, var_1, var_4 ]; var_6.b_guys = [ var_2, var_3, var_5 ]; var_6.a_bad_guys = [ var_0, var_1 ]; var_6.b_bad_guys = [ var_2, var_3 ]; common_scripts\utility::array_thread( var_6.a_bad_guys, ::check_hostage_flag_a ); common_scripts\utility::array_thread( var_6.b_bad_guys, ::check_hostage_flag_b ); var_6.anim_ent_a = common_scripts\utility::get_target_ent( "hostage_a_anim_ent" ); var_6.anim_ent_b = common_scripts\utility::get_target_ent( "hostage_b_anim_ent" ); var_6.anim_ent_c = common_scripts\utility::get_target_ent( "elias_walkin" ); common_scripts\utility::array_thread( var_6.a_guys, maps\_utility::disable_long_death ); var_7 = getent( "waterfall_spotted", "targetname" ); var_6 thread monitor_player_close( var_7 ); var_6.anim_ent_a thread maps\_anim::anim_loop( var_6.a_guys, "rescue_a_idle", "stop_loop" ); var_6.anim_ent_b thread maps\_anim::anim_loop( var_6.b_guys, "rescue_b_idle", "stop_loop" ); var_6 thread scene_vo(); common_scripts\utility::flag_wait_any( "waterfall_trig", "hostage_flag_set" ); common_scripts\utility::flag_set( "player_at_execution" ); thread hostage_timer(); common_scripts\utility::flag_wait_any( "took_long_enough_to_rescue", "hostage_a_group_shot", "hostage_b_group_shot", "got_close_enough_to_rescue" ); level thread set_friendlies_to_not_shoot_at_hostages_mid_anim(); var_6 thread friendlies_execute_enemies( var_6.anim_ent_a ); var_6.a_bad_guys = maps\_utility::array_removedead( var_6.a_bad_guys ); var_6.b_bad_guys = maps\_utility::array_removedead( var_6.b_bad_guys ); common_scripts\utility::array_thread( var_6.a_bad_guys, ::auto_kill_enemies ); common_scripts\utility::array_thread( var_6.b_bad_guys, ::auto_kill_enemies ); var_6.anim_ent_a maps\_utility::anim_stopanimscripted(); var_6.anim_ent_b maps\_utility::anim_stopanimscripted(); var_6.a_guys = maps\_utility::array_removedead( var_6.a_guys ); var_6.b_guys = maps\_utility::array_removedead( var_6.b_guys ); if ( common_scripts\utility::flag( "hostage_a_group_shot" ) ) { var_6.anim_ent_a thread maps\_anim::anim_single( var_6.a_guys, "rescue_a_shot" ); var_6.anim_ent_b maps\_anim::anim_single( var_6.b_guys, "rescue_b" ); } else if ( common_scripts\utility::flag( "hostage_b_group_shot" ) ) { var_6.anim_ent_a thread maps\_anim::anim_single( var_6.a_guys, "rescue_a" ); var_6.anim_ent_b maps\_anim::anim_single( var_6.b_guys, "rescue_b_shot" ); } else { var_6.anim_ent_b thread maps\_anim::anim_single( var_6.b_guys, "rescue_b" ); var_6.anim_ent_a maps\_anim::anim_single( var_6.a_guys, "rescue_a" ); } common_scripts\utility::flag_set( "player_rescued_hostage" ); wait 4; var_6.anim_ent_c maps\_anim::anim_reach_solo( level.alpha1, "elias_rescue" ); common_scripts\utility::flag_set( "starting_elias_rescue" ); var_6.anim_ent_c thread maps\_anim::anim_single_solo( level.alpha1, "elias_rescue" ); maps\_utility::delaythread( 5.3, maps\jungle_ghosts_anim::set_missile_reply ); maps\_utility::delaythread( 3.3, maps\jungle_ghosts_anim::set_missile_reaction ); common_scripts\utility::flag_wait( "second_distant_sat_launch" ); var_8 = common_scripts\utility::get_target_ent( "river_blocker" ); var_8 connectpaths(); var_8 delete(); common_scripts\utility::trigger_on( "mid_stream", "targetname" ); common_scripts\utility::trigger_on( "waterfall_to_stream", "targetname" ); common_scripts\utility::flag_wait( "obj_get_to_river" ); wait 1; thread maps\jungle_ghosts_util::music_stealth_tension_loop(); } check_guard_death_to_stop_pistol_fire() { level.fire_notetracks = 0; level.execution_guy_dead = 0; self waittill( "death" ); level.execution_guy_dead = 1; } auto_kill_enemies() { self endon( "death" ); wait 8; self kill(); } hostage_timer() { wait 9; common_scripts\utility::flag_set( "took_long_enough_to_rescue" ); } check_hostage_flag_a() { level endon( "hostage_flag_set" ); thread check_whizby(); self waittill( "damage" ); common_scripts\utility::flag_set( "hostage_a_group_shot" ); common_scripts\utility::flag_set( "hostage_flag_set" ); } check_hostage_flag_b() { level endon( "hostage_flag_set" ); thread check_whizby(); self waittill( "damage" ); common_scripts\utility::flag_set( "hostage_b_group_shot" ); common_scripts\utility::flag_set( "hostage_flag_set" ); } check_whizby() { level endon( "hostage_flag_set" ); self waittill( "bulletwhizby" ); common_scripts\utility::flag_set( "got_close_enough_to_rescue" ); common_scripts\utility::flag_set( "hostage_flag_set" ); } scene_vo() { self.guard_a_1 endon( "death" ); level endon( "got_close_enough_to_rescue" ); level endon( "took_long_enough_to_rescue" ); level endon( "hostage_a_group_shot" ); level endon( "hostage_b_group_shot" ); common_scripts\utility::flag_wait( "squad_to_waterfall" ); wait 2; self.guard_a_1 maps\_utility::smart_dialogue( "jungleg_saf1_wherestherestof" ); wait 1; self.guard_a_1 maps\_utility::smart_dialogue( "jungleg_saf1_howmanymenwere" ); wait 2; self.guard_a_1 maps\_utility::play_sound_on_tag( "jungleg_saf1_yourfriendisgoing", undefined, 1 ); } friendlies_execute_enemies( var_0 ) { if ( !self.outcome_decided ) { self.outcome_decided = 1; thread execution_slowmo( var_0 ); wait 0.4; if ( isalive( self.guard_a_1 ) ) magicbullet( level.alpha[0].weapon, level.alpha[0] gettagorigin( "tag_flash" ), self.guard_a_1 geteye() ); common_scripts\utility::array_thread( level.alpha, maps\_utility::set_baseaccuracy, 1000 ); common_scripts\utility::array_thread( self.a_bad_guys, maps\_utility::set_ignoreall, 0 ); common_scripts\utility::array_thread( self.a_bad_guys, maps\_utility::set_ignoreme, 0 ); common_scripts\utility::array_thread( self.b_bad_guys, maps\_utility::set_ignoreall, 0 ); common_scripts\utility::array_thread( self.b_bad_guys, maps\_utility::set_ignoreme, 0 ); common_scripts\utility::flag_wait( "player_rescued_hostage" ); wait 3; common_scripts\utility::array_thread( level.alpha, maps\_utility::set_baseaccuracy, 1 ); maps\_utility::activate_trigger_with_targetname( "squad_covers_helpup" ); wait 3; level.squad = common_scripts\utility::array_combine( level.alpha, level.bravo ); common_scripts\utility::array_thread( level.squad, maps\_utility::disable_ai_color ); } } monitor_player_close( var_0 ) { var_0 waittill( "trigger" ); self notify( "player_interupted" ); common_scripts\utility::flag_set( "got_close_enough_to_rescue" ); } execution_slowmo( var_0 ) { if ( distance( level.player.origin, var_0.origin ) > 500 || !level.player maps\_utility::point_in_fov( var_0.origin ) ) return; level.player thread maps\_utility::play_sound_on_entity( "weap_sniper_breathin" ); level thread player_heartbeat(); setslowmotion( 1, 0.5, 0.15 ); wait 1; setslowmotion( 0.5, 1, 0.15 ); level notify( "stop_player_heartbeat" ); level.player thread maps\_utility::play_sound_on_entity( "ui_camera_whoosh_in" ); } do_birds() { maps\_utility::trigger_wait_targetname( "jungle_entrance" ); level endon( "hill_pos_6" ); for (;;) { do_bird_single(); wait( randomintrange( 20, 45 ) ); } } do_bird_single_enemy( var_0 ) { var_1 = vectornormalize( anglestoforward( self.angles ) ); var_2 = self.origin + var_1 * randomintrange( 10, 30 ); var_3 = var_2 + ( 0, 0, 1000 ); var_4 = randomintrange( -100, 100 ); var_5 = maps\_utility::groundpos( var_3 ) + ( var_4, var_4, 0 ); thread common_scripts\utility::play_sound_in_space( "anml_bird_startle_foliage", var_5 ); wait 0.5; maps\interactive_models\_birds::birds_spawnandflyaway( "parakeets", var_5, ( 1000, 0, 1000 ), randomintrange( 3, 8 ) ); } do_bird_single( var_0 ) { var_1 = vectornormalize( anglestoforward( level.player getplayerangles() ) ); var_2 = level.player.origin + var_1 * 1200; var_3 = var_2 + ( 0, 0, 1000 ); var_4 = randomintrange( -300, 300 ); var_5 = maps\_utility::groundpos( var_3 ) + ( var_4, var_4, 0 ); if ( randomint( 100 ) < 33 ) { thread common_scripts\utility::play_sound_in_space( "anml_bird_startle_foliage", var_5 ); wait 0.5; } maps\interactive_models\_birds::birds_spawnandflyaway( "parakeets", var_5, ( 500, 0, 500 ), randomintrange( 3, 8 ) ); } birds_on_baddy() { self endon( "death" ); if ( isdefined( self.doing_enemy_birds ) ) return; self.doing_enemy_birds = 1; do_bird_single_enemy(); wait 25; self.doing_enemy_birds = undefined; } motion_tracker_setup() { common_scripts\utility::flag_wait( "jungle_entrance" ); var_0 = undefined; var_1 = 2; var_2 = var_1; level.motion_tracker_sweep_speed = var_1; level.motion_tracker_sweep_range = 1600; setsaveddvar( "MotionTrackerRange", level.motion_tracker_sweep_range ); setsaveddvar( "MotionTrackerSweepInterval", level.motion_tracker_sweep_speed ); for (;;) { var_3 = getaiarray( "axis" ); if ( var_3.size != 0 ) { var_3 = sortbydistance( var_3, level.player.origin ); var_4 = distancesquared( var_3[0].origin, level.player.origin ); if ( var_4 < 160000 ) var_0 = 0.5; else if ( var_4 < 360000 ) var_0 = 1; else if ( var_4 < 640000 ) var_0 = 1.5; else var_0 = var_1; if ( var_0 != var_2 ) { update_motion_tracker_speed( var_0 ); var_2 = var_0; } } else if ( var_2 != var_1 ) { update_motion_tracker_speed( var_1 ); var_2 = var_1; } wait 1; } } update_motion_tracker_speed( var_0 ) { setsaveddvar( "MotionTrackerSweepInterval", var_0 ); } jungle_vo( var_0 ) { switch ( level.start_point ) { case "jungle_corridor": case "jungle": case "parachute": case "default": common_scripts\utility::flag_wait( "player_landed" ); maps\jungle_ghosts_util::waittill_x_passed( -7949 ); level.player maps\_utility::play_sound_on_entity( "jungleg_els_everyonereportin" ); wait 1; level.player maps\_utility::play_sound_on_entity( "jungleg_hsh_itsheshimwith" ); wait 0.75; level.player maps\_utility::play_sound_on_entity( "jungleg_els_goodkeeganswithme" ); maps\jungle_ghosts_util::waittill_x_passed( -7750 ); level.player maps\_utility::play_sound_on_entity( "jungleg_els_adam" ); level.player maps\_utility::play_sound_on_entity( "jungleg_hsh_sawhimgetsnagged" ); maps\jungle_ghosts_util::waittill_x_passed( -7406 ); level.player maps\_utility::play_sound_on_entity( "jungleg_hsh_shitgetdown" ); wait 0.5; level.player maps\_utility::play_sound_on_entity( "jungleg_hsh_lookslikewegot" ); wait 0.7; level.player maps\_utility::play_sound_on_entity( "jungleg_els_werecomingtoyou" ); case "e3": maps\jungle_ghosts_util::waittill_x_passed( -6983 ); level.player maps\_utility::play_sound_on_entity( "jungleg_els_adamifyoucan" ); common_scripts\utility::flag_set( "obj_regroup" ); wait 0.5; level.player maps\_utility::play_sound_on_entity( "jungleg_els_staylowandquiet" ); wait 0.5; level.player maps\_utility::play_sound_on_entity( "jungleg_els_youcandothis" ); common_scripts\utility::flag_wait( "jungle_entrance" ); wait 1; level.player maps\_utility::play_sound_on_entity( "jungleg_hsh_whatthehellwas" ); wait 0.5; level.player maps\_utility::play_sound_on_entity( "jungleg_els_atremormaybe" ); wait 0.5; level.player maps\_utility::play_sound_on_entity( "jungleg_els_butivebeenwrong" ); wait 0.25; level.player maps\_utility::play_sound_on_entity( "jungleg_hsh_westillhavepatrols" ); common_scripts\utility::flag_wait( "early_jungle_flag" ); level.player maps\_utility::play_sound_on_entity( "jungleg_hsh_youllhaveagroup" ); wait 1; level.player maps\_utility::play_sound_on_entity( "jungleg_els_copythatstaysafe" ); wait 1; common_scripts\utility::flag_wait( "mid_jungle_flag" ); level.player maps\_utility::play_sound_on_entity( "jungleg_hsh_theseguysaregetting" ); wait 0.5; level.player maps\_utility::play_sound_on_entity( "jungleg_hsh_leftleftside" ); wait 0.25; level.player maps\_utility::play_sound_on_entity( "jungleg_els_heshhesh" ); wait 1; case "jungle_hill": common_scripts\utility::flag_wait( "crash_arrive" ); level.player maps\_utility::play_sound_on_entity( "jungleg_els_theyremovingthroughthe" ); level.player maps\_utility::play_sound_on_entity( "jungleg_els_stayclearofthat" ); common_scripts\utility::flag_wait_any( "hill_clear", "hill_pos_6" ); level.player thread maps\_utility::play_sound_on_entity( "jungleg_els_loganwecansee" ); common_scripts\utility::flag_wait( "waterfall_see_friendlies" ); common_scripts\utility::flag_wait( "friendlies_ready" ); maps\_utility::autosave_stealth(); if ( !level.was_spotted ) { level.alpha2 maps\_utility::smart_dialogue( "jungleg_kgn_nicework" ); wait 0.5; level.alpha2 maps\_utility::smart_dialogue( "jungleg_kgn_kidsgoodelias" ); } else if ( !common_scripts\utility::flag( "player_agro_near_execution" ) ) { level.alpha1 maps\_utility::smart_dialogue( "jungleg_els_weheardgunfire" ); wait 0.25; level.alpha1 maps\_utility::smart_dialogue( "jungleg_els_youok" ); } else level.alpha2 maps\_utility::smart_dialogue( "jungleg_kgn_youtryingtoget" ); wait 0.25; level.alpha1 maps\_utility::smart_dialogue( "jungleg_els_gotheshandmerrick" ); common_scripts\utility::flag_set( "obj_save_team" ); case "waterfall": common_scripts\utility::flag_wait( "waterfall_trig" ); if ( !common_scripts\utility::flag( "hostage_flag_set" ) && !common_scripts\utility::flag( "got_close_enough_to_rescue" ) ) { level thread stop_execution_dialoigue_on_shot(); level.alpha1 maps\_utility::smart_dialogue( "jungleg_els_heshweseeyou" ); wait 0.25; if ( !common_scripts\utility::flag( "hostage_flag_set" ) && !common_scripts\utility::flag( "got_close_enough_to_rescue" ) ) level.alpha1 maps\_utility::smart_dialogue( "jungleg_els_adamdoit" ); } common_scripts\utility::flag_wait( "player_rescued_hostage" ); common_scripts\utility::flag_wait( "starting_elias_rescue" ); common_scripts\utility::flag_wait( "second_distant_sat_launch" ); level.player playrumblelooponentity( "damage_heavy" ); wait 3; level.player stoprumble( "damage_heavy" ); common_scripts\utility::flag_wait( "do_jungleg_bkr_coughingcatchingbreath" ); common_scripts\utility::flag_set( "obj_get_to_river" ); } } set_friendlies_to_not_shoot_at_hostages_mid_anim() { wait 5; common_scripts\utility::array_thread( level.alpha, maps\jungle_ghosts_util::generic_ignore_on ); wait 10; common_scripts\utility::array_thread( level.alpha, maps\jungle_ghosts_util::generic_ignore_off ); } stop_execution_dialoigue_on_shot() { common_scripts\utility::flag_wait_any( "took_long_enough_to_rescue", "hostage_flag_set", "got_close_enough_to_rescue" ); maps\jungle_ghosts_util::dialogue_stop(); maps\_utility::radio_dialogue_stop(); } do_story_line( var_0 ) { common_scripts\utility::flag_set( "doing_story_vo" ); maps\_utility::radio_dialogue_stop(); maps\_utility::smart_radio_dialogue( var_0 ); common_scripts\utility::flag_clear( "doing_story_vo" ); } do_safe_radio_line( var_0 ) { if ( !common_scripts\utility::flag( "_stealth_spotted" ) && !common_scripts\utility::flag( "doing_story_vo" ) ) { level.vo_activity = 1; maps\_utility::smart_radio_dialogue( var_0 ); level.vo_activity = 0; } } slomo_sound_scale_setup() { soundsettimescalefactor( "Music", 0 ); soundsettimescalefactor( "Menu", 0 ); soundsettimescalefactor( "local3", 0.0 ); soundsettimescalefactor( "Mission", 0.0 ); soundsettimescalefactor( "Announcer", 0.0 ); soundsettimescalefactor( "Bulletimpact", 0.6 ); soundsettimescalefactor( "Voice", 0.4 ); soundsettimescalefactor( "effects2", 0.2 ); soundsettimescalefactor( "local", 0.4 ); soundsettimescalefactor( "physics", 0.2 ); soundsettimescalefactor( "ambient", 0.5 ); soundsettimescalefactor( "auto", 0.5 ); } player_heartbeat() { level endon( "stop_player_heartbeat" ); for (;;) { level.player playlocalsound( "breathing_heartbeat" ); wait 0.5; } }