// IW6 GSC SOURCE // Generated by https://github.com/xensik/gsc-tool start() { maps\black_ice_util::player_start( "player_start_swim" ); level.player setclienttriggeraudiozone( "blackice_camera", 0 ); maps\_utility::battlechatter_off( "allies" ); maps\_utility::battlechatter_off( "axis" ); thread underwater_sfx(); thread maps\black_ice_audio::sfx_camera_intro(); thread swim_godrays(); maps\_utility::music_play( "mus_blackice_intro" ); level.const_expected_num_swim_allies = 2; level._allies_swim = maps\black_ice_util::spawn_allies_swim(); foreach ( var_1 in level._allies ) var_1 hide(); } main() { level.g_friendlynamedist_old = getdvarint( "g_friendlyNameDist" ); setsaveddvar( "g_friendlyNameDist", 0 ); level.breach_anim_node = common_scripts\utility::getstruct( "breach_anim_node", "script_noteworthy" ); level.allies_breach_anim_node = common_scripts\utility::getstruct( "vignette_introbreach_allies", "script_noteworthy" ); level.snake_cam_anim_node = common_scripts\utility::getstruct( "Intro_Snake", "script_noteworthy" ); ally_setup(); player_setup(); enemy_setup(); props_setup(); snake_cam_logic(); thread swim_godrays(); player_swim_setup(); enemy_swim_setup(); thread maps\black_ice_anim::swim_intro_anims(); swim_detonate_logic(); } section_post_inits() { common_scripts\utility::array_call( getentarray( "opt_hide_swim", "script_noteworthy" ), ::hide ); } swim_check_node_distance() { var_0 = 10000; var_1 = cos( 45 ); while ( !common_scripts\utility::flag( "flag_swim_player_drop_tank" ) ) { var_2 = distancesquared( level.player geteye(), level.breach_pos ); if ( var_2 < var_0 ) { if ( maps\_utility::within_fov_2d( level.player geteye(), level.player.angles, level.breach_pos, var_1 ) ) { common_scripts\utility::flag_set( "flag_swim_player_drop_tank" ); level notify( "notify_begin_camp_logic" ); } } wait( level.timestep ); } } section_flag_inits() { common_scripts\utility::flag_init( "flag_detonate_fail" ); common_scripts\utility::flag_init( "flag_underwater_sfx" ); common_scripts\utility::flag_init( "flag_outofwater_sfx" ); common_scripts\utility::flag_init( "flag_swim_player_drop_tank" ); common_scripts\utility::flag_init( "flag_swim_breach_detonate" ); common_scripts\utility::flag_init( "flag_all_enemies_dead" ); common_scripts\utility::flag_init( "flag_player_breaching" ); common_scripts\utility::flag_init( "flag_player_clear_to_breach" ); common_scripts\utility::flag_init( "flag_intro_above_ice" ); common_scripts\utility::flag_init( "flag_snake_cam_below_water" ); } section_precache() { maps\_utility::add_hint_string( "detonate_string", &"BLACK_ICE_SWIM_DETONATE", ::detonate_string_func ); precacheshader( "dogcam_frame_bot" ); precacheshader( "dogcam_frame_top" ); precacheshader( "dogcam_bracket_l" ); precacheshader( "dogcam_bracket_r_nd" ); precacheshader( "dogcam_center" ); precacheshader( "dogcam_timestamp_no_record" ); precacheshader( "scubamask_overlay_delta" ); precacheshader( "black" ); } ally_setup() { for ( var_0 = 0; var_0 < level.const_expected_num_swim_allies; var_0++ ) { level._allies_swim[var_0].animname = "scuba_ally"; level._allies_swim[var_0] thread maps\_underwater::friendly_bubbles(); level._allies_swim[var_0] thread maps\black_ice_fx::fx_intro_friendly_glowsticks(); level._allies_swim[var_0].launcher = maps\_utility::spawn_anim_model( "ascend_launcher_non_anim" ); level._allies_swim[var_0].launcher linkto( level._allies_swim[var_0], "TAG_STOWED_BACK", ( 0, 1, 5 ), ( 0, 0, 30 ) ); } } enemy_setup() { var_0 = getentarray( "snake_cam_enemy", "script_noteworthy" ); var_1 = maps\_utility::array_spawn( var_0 ); for ( var_2 = 0; var_2 < var_1.size; var_2++ ) { var_3 = var_1[var_2]; var_3 maps\_utility::set_battlechatter( 0 ); var_3.combatmode = "no_cover"; var_3.ignoreall = 1; var_3.ignoreme = 1; var_3.newenemyreactiondistsq_old = self.newenemyreactiondistsq; var_3.newenemyreactiondistsq = 0; var_3.grenadeammo = 0; var_3.animname = "snake_cam_enemy"; } level.snake_cam_enemies = var_1; } player_setup() { level.snake_cam_dummy = getent( "snake_terrain_cam", "targetname" ); level.snake_cam_dummy.animname = "snake_cam"; level.snake_cam_dummy maps\_anim::setanimtree(); maps\black_ice_util::player_animated_sequence_restrictions(); level.player playerlinkweaponviewtodelta( level.snake_cam_dummy, "tag_player", 1, 0, 0, 0, 0, 1 ); level.player playerlinkedsetviewznear( 0 ); level.player thread snake_cam_hud(); thread maps\black_ice_fx::snake_cam_fx(); thread snake_cam_vision_flicker(); level.player lerpfov( 45, level.timestep ); } snake_cam_hud() { maps\black_ice_util::black_ice_hide_hud(); level.player takeweapon( "fraggrenade" ); level.player takeweapon( "flash_grenade" ); self.hud_elements = []; var_0 = maps\_hud_util::create_client_overlay( "nightvision_overlay_goggles", 0.3 ); self.hud_elements[self.hud_elements.size] = var_0; var_0 = maps\_hud_util::createclienticon( "dogcam_center", 600, 300 ); var_0 maps\_hud_util::setpoint( "CENTER", undefined, 0, 0, 0 ); self.hud_elements[self.hud_elements.size] = var_0; var_0 = level.player maps\_hud_util::createclienticon( "dogcam_frame_top", 600, 40 ); var_0 maps\_hud_util::setpoint( "TOP", "TOP", 0, -20, 0 ); self.hud_elements[self.hud_elements.size] = var_0; var_0 = level.player maps\_hud_util::createclienticon( "dogcam_frame_bot", 600, 80 ); var_0 maps\_hud_util::setpoint( "BOTTOM", "BOTTOM", 0, 32, 0 ); self.hud_elements[self.hud_elements.size] = var_0; var_0 = level.player maps\_hud_util::createclienticon( "dogcam_bracket_r_nd", 60, 400 ); var_0 maps\_hud_util::setpoint( "RIGHT", "RIGHT", 0, 0, 0 ); self.hud_elements[self.hud_elements.size] = var_0; var_0 = level.player maps\_hud_util::createclienticon( "dogcam_bracket_l", 69, 400 ); var_0 maps\_hud_util::setpoint( "LEFT", "LEFT", 0, 0, 0 ); self.hud_elements[self.hud_elements.size] = var_0; var_0 = level.player maps\_hud_util::createclienticon( "dogcam_timestamp_no_record", 200, 25 ); var_0 maps\_hud_util::setpoint( "LEFT BOTTOM", "LEFT BOTTOM", 14, -25, 0 ); self.hud_elements[self.hud_elements.size] = var_0; var_0 = level.player maps\_hud_util::createclientfontstring( "default", 0.8 ); var_0 maps\_hud_util::setpoint( "RIGHT BOTTOM", "LEFT BOTTOM", 188.5, -34, 0 ); var_0 settext( "00 : 00 00" ); var_0.alpha = 0.4; var_0 thread snake_cam_time_countup(); self.hud_elements[self.hud_elements.size] = var_0; } snake_cam_time_countup() { self endon( "death" ); var_0 = gettime(); for (;;) { var_1 = ""; var_2 = ""; var_3 = ""; var_4 = gettime(); var_5 = int( var_4 / 60000 ); var_4 = var_4 - var_5 * 60000; if ( var_5 < 10 ) var_1 = "0"; var_6 = int( var_4 / 1000 ); var_4 = var_4 - var_6 * 1000; if ( var_6 < 10 ) var_2 = "0"; var_7 = int( var_4 / 10 ); if ( var_7 < 10 ) var_3 = "0"; self settext( var_1 + var_5 + " : " + var_2 + var_6 + " " + var_3 + var_7 ); wait( level.timestep ); } } snake_cam_hud_cleanup() { foreach ( var_1 in level.player.hud_elements ) { var_1 destroy(); var_1 = undefined; } level.player.hud_elements = undefined; } snake_cam_vision_flicker() { var_0 = 0.06; var_1 = 0; level.player maps\_utility::vision_set_fog_changes( "black_ice_snakecam", 0 ); while ( !common_scripts\utility::flag( "flag_snake_cam_below_water" ) ) { if ( !common_scripts\utility::flag( "flag_snake_cam_below_water" ) ) { if ( var_1 ) { level.player maps\_utility::vision_set_fog_changes( "black_ice_snakecam", var_0 ); var_1 = 0; } else { level.player maps\_utility::vision_set_fog_changes( "black_ice_snakecam_dark", var_0 ); var_1 = 1; } } wait( var_0 ); } level.player maps\_utility::vision_set_fog_changes( "black_ice_infil_dark", 0.2 ); } snake_cam_logic() { thread set_snakecam_dof(); thread black_fade( 0, 7, 0.1, 1 ); wait 1; thread maps\_utility::smart_radio_dialogue( "black_ice_mrk_wereinposition" ); wait 2; thread maps\_utility::smart_radio_dialogue( "black_ice_hsh_rogeractual" ); wait 3; thread maps\_utility::smart_radio_dialogue( "black_ice_mrk_eyescomingup" ); wait 1; thread snake_cam_dialogue(); thread swim_intro_dialogue(); thread maps\black_ice_anim::snake_cam_enemy_anims(); thread maps\black_ice_anim::swim_props_first_frame_anims(); thread maps\black_ice_anim::swim_vehicles_snake_cam_anims(); thread snake_cam_shake_rumble(); thread snake_cam_input_logic(); level waittill( "notify_underwater_transition" ); snake_cam_transition_to_underwater(); } snake_cam_dialogue() { level waittill( "notify_snake_cam_dialogue_line2_1" ); thread maps\_utility::smart_radio_dialogue( "black_ice_hsh_lastpatrolisinbound" ); level waittill( "notify_snake_cam_dialogue_line2_2" ); maps\_utility::smart_radio_dialogue( "black_ice_mrk_copybravo" ); thread maps\_utility::smart_radio_dialogue( "black_ice_mrk_isthatallof" ); level waittill( "notify_snake_cam_dialogue_line2_3" ); maps\_utility::smart_radio_dialogue( "black_ice_hsh_rogeritsafullhouse" ); thread maps\_utility::smart_radio_dialogue( "black_ice_hsh_seeyoutopside" ); level waittill( "notify_snake_cam_dialogue_line2_4" ); thread maps\_utility::smart_radio_dialogue( "black_ice_mrk_adamletsgo" ); } swim_intro_dialogue() { level waittill( "notify_snake_cam_dialogue_line3_1" ); maps\_utility::smart_radio_dialogue( "black_ice_mrk_chargesaresetand" ); thread maps\_utility::smart_radio_dialogue( "black_ice_mrk_letsintroduceourselveson" ); level waittill( "notify_swim_dialog5_1" ); thread maps\_utility::smart_radio_dialogue( "blackice_bkr_markdropthem" ); wait 1; if ( !common_scripts\utility::flag( "flag_swim_breach_detonate" ) ) maps\_utility::display_hint( "detonate_string" ); wait 3.0; var_0 = 2.0; if ( !common_scripts\utility::flag( "flag_swim_breach_detonate" ) ) maps\_utility::smart_radio_dialogue( "blackice_bkr_dropthemrook" ); wait( var_0 ); if ( !common_scripts\utility::flag( "flag_swim_breach_detonate" ) ) maps\_utility::smart_radio_dialogue( "blackice_bkr_setoffcharges" ); wait( var_0 ); if ( !common_scripts\utility::flag( "flag_swim_breach_detonate" ) ) maps\_utility::smart_radio_dialogue( "blackice_bkr_windowsclosing" ); wait( var_0 ); if ( !common_scripts\utility::flag( "flag_swim_breach_detonate" ) ) maps\_utility::smart_radio_dialogue( "blackice_bkr_theyremoving" ); wait( var_0 ); if ( !common_scripts\utility::flag( "flag_swim_breach_detonate" ) ) { setdvar( "ui_deadquote", &"BLACK_ICE_SWIM_DETONATE_FAIL" ); common_scripts\utility::flag_set( "flag_detonate_fail" ); maps\_utility::missionfailedwrapper(); } } snake_cam_shake_rumble() { level.player_rumble_ent = maps\black_ice_util::get_rumble_ent_linked( level.snake_cam_dummy ); wait 0.05; level.player_rumble_ent.intensity = 0; level waittill( "notify_rumble_snowmobile_1" ); thread player_rumble_bump( 0.08, 0.0, 0.2, 0, 0.5 ); level waittill( "notify_rumble_snowmobile_2" ); thread player_rumble_bump( 0.13, 0.0, 0.2, 0, 0.5 ); level waittill( "notify_rumble_truck_1" ); thread player_rumble_bump( 0.18, 0.0, 0.2, 0, 1.15 ); level waittill( "notify_rumble_truck_2" ); thread player_rumble_bump( 0.6, 0.0, 0.3, 0, 0.75 ); level waittill( "notify_rumble_truck_3" ); thread player_rumble_bump( 0.6, 0.0, 0.6, 0, 1.25 ); level waittill( "notify_rumble_truck_off" ); thread player_rumble_bump( 0.0, 0.0, 0.75, 0, 0.01 ); level waittill( "notify_rumble_cam_1" ); thread player_rumble_bump( 0.22, 0.0, 0.01, 0, 0.3 ); level waittill( "notify_rumble_cam_2" ); thread player_rumble_bump( 0.21, 0.0, 0.1, 0, 0.4 ); level waittill( "notify_rumble_cam_3" ); thread player_rumble_bump( 0.18, 0.0, 0.1, 0, 0.55 ); level waittill( "notify_rumble_cam_4" ); thread player_rumble_bump( 0.21, 0.0, 0.1, 0, 0.75 ); wait 4; level.player_rumble_ent delete(); } player_rumble_bump( var_0, var_1, var_2, var_3, var_4 ) { level notify( "notify_new_rumble_bump" ); level endon( "notify_new_rumble_bump" ); level.player_rumble_ent maps\_utility::rumble_ramp_to( var_0, var_2 ); wait( var_2 + var_3 ); level.player_rumble_ent maps\_utility::rumble_ramp_to( var_1, var_4 ); } snake_cam_noise( var_0 ) { level endon( "notify_underwater_transition" ); level notify( "snake_cam_noise" ); var_1 = level.snake_cam_dummy.noise_amplitude; var_2 = 0.1; var_3 = 150; var_4 = gettime(); while ( gettime() - var_4 < var_3 ) { var_5 = ( randomfloatrange( -1 * var_1, var_1 ), randomfloatrange( -1 * var_1, var_1 ), randomfloatrange( -1 * var_1, var_1 ) ); level.snake_cam_dummy.angles = level.snake_cam_dummy.angles + var_5; wait( var_2 ); } thread snake_cam_noise_falloff( var_1 ); } snake_cam_noise_falloff( var_0 ) { level endon( "notify_underwater_transition" ); level endon( "snake_cam_noise" ); var_1 = level.snake_cam_dummy.noise_min_amplitude; var_2 = 0.1; var_3 = 100; var_4 = 0.75; for (;;) { var_5 = gettime(); while ( gettime() - var_5 < var_3 ) { var_6 = ( randomfloatrange( -1 * var_0, var_0 ), randomfloatrange( -1 * var_0, var_0 ), randomfloatrange( -1 * var_0, var_0 ) ); level.snake_cam_dummy.angles = level.snake_cam_dummy.angles + var_6; wait( var_2 ); } var_0 = var_0 * var_4; if ( var_0 < var_1 ) var_0 = var_1; } } snake_cam_input_logic() { level endon( "notify_underwater_transition" ); var_0 = 0; var_1 = level.snake_cam_dummy.angles; var_2 = 45; var_3 = var_1[1] - var_2; var_4 = var_1[1] + var_2; var_5 = 12; var_6 = var_1[0] - var_5; var_7 = var_1[0] + var_5 / 2; var_8 = var_1[1]; var_9 = var_1[1]; var_10 = var_1[0]; var_11 = var_1[0]; var_12 = 0.075; var_13 = var_12 * ( var_2 / var_5 ); var_14 = 0; var_15 = 0; var_16 = 0; var_17 = 0; var_18 = 1000; var_19 = undefined; var_20 = 0.6; var_21 = 0.48; level.snake_cam_dummy.noise_min_amplitude = 0.09; level.snake_cam_dummy.noise_amplitude = level.snake_cam_dummy.noise_min_amplitude; thread snake_cam_noise( level.snake_cam_dummy.angles ); if ( !level.console && !level.player common_scripts\utility::is_player_gamepad_enabled() ) level.player enablemousesteer( 1 ); for (;;) { var_22 = level.player getnormalizedcameramovement(); if ( !level.console && !level.player common_scripts\utility::is_player_gamepad_enabled() ) var_22 = ( var_22[0], var_22[1] * -1, var_22[2] ); if ( var_22[1] || var_22[0] ) { var_14 = common_scripts\utility::ter_op( var_22[1] > 0, 1, -1 ); var_16 = common_scripts\utility::ter_op( var_22[0] > 0, 1, -1 ); if ( !var_0 || var_14 != var_15 || var_16 != var_17 ) { if ( !isdefined( var_19 ) || gettime() - var_19 > var_18 ) { var_19 = gettime(); level.snake_cam_dummy.noise_amplitude = var_20; } else level.snake_cam_dummy.noise_amplitude = var_21; var_0 = 1; thread snake_cam_noise( level.snake_cam_dummy.angles ); thread maps\black_ice_audio::sfx_camera_mvmt(); } var_9 = common_scripts\utility::ter_op( var_22[1] > 0, var_3, var_4 ); var_11 = common_scripts\utility::ter_op( var_22[0] > 0, var_6, var_7 ); var_8 = var_8 + ( var_9 - var_8 ) * var_12 * abs( var_22[1] ); var_10 = var_10 + ( var_11 - var_10 ) * var_13 * abs( var_22[0] ); level.snake_cam_dummy.angles = ( var_10, var_8, var_1[2] ); var_15 = var_14; var_17 = var_16; } else { var_15 = 0; var_17 = 0; var_0 = 0; } wait( level.timestep ); } } snake_cam_transition_to_underwater() { var_0 = 0.5; var_1 = 0; var_2 = 1.0; thread black_fade( var_0, var_1, var_2 ); wait( var_0 ); thread snake_cam_hud_cleanup(); level.player visionsetnakedforplayer( "", 0 ); level.player lerpfov( 60, level.timestep ); level.player unlink(); thread borescope_pip(); level notify( "snake_cam_transition_to_underwater_complete" ); } black_fade( var_0, var_1, var_2, var_3 ) { var_4 = maps\_hud_util::create_client_overlay( "black", 0, level.player ); if ( var_0 > 0 ) var_4 fadeovertime( var_0 ); var_4.alpha = 1; if ( isdefined( var_3 ) ) var_4.foreground = 0; wait( var_0 ); wait( var_1 ); level notify( "notify_snakecam_on" ); if ( var_2 > 0 ) var_4 fadeovertime( var_2 ); var_4.alpha = 0; wait( var_2 ); var_4 destroy(); } borescope_pip() { level.pip = level.player newpip(); level.pip.rendertotexture = 1; level.pip.entity = spawn( "script_model", level.borescope gettagorigin( "tag_camera" ) ); level.pip.entity setmodel( "tag_origin" ); level.pip.entity.origin = level.borescope gettagorigin( "tag_camera" ); level.pip.entity.angles = level.borescope gettagangles( "tag_camera" ); level.pip.visionsetnaked = "black_ice_snakecam"; level.pip.entity linkto( level.borescope, "tag_camera", ( 0, 0, 5 ), ( 0, 0, 0 ) ); wait( level.timestep ); level.pip.tag = "tag_origin"; level.pip.fov = 45; level.pip.freecamera = 1; level.pip.enableshadows = 0; level.pip.x = 300; level.pip.y = 240; level.pip.width = 240; level.pip.height = 135; level.pip.enable = 1; level.borescope waittill( "death" ); level.pip.enable = 0; level.pip.entity delete(); level.pip = undefined; } player_swim_setup() { level.spring_cam_max_clamp = 30; level.spring_cam_min_clamp = 20; level.breach_pt = common_scripts\utility::getstruct( "breach_point", "script_noteworthy" ); level.breach_pos = level.breach_pt.origin + ( 0, 0, 0 ); maps\black_ice_util::setup_player_for_animated_sequence( 0, undefined, undefined, level.player.angles, 0 ); var_0 = maps\_utility::spawn_anim_model( "player_scuba", level.player_rig.origin ); level.player_scuba = var_0; level.player allowswim( 1 ); level.player enableslowaim( 0.5, 0.5 ); setsaveddvar( "player_swimSpeed", 0.0 ); setsaveddvar( "player_swimVerticalSpeed", 0.0 ); level.player playerlinktodelta( level.player_rig, "tag_player", 1, 0, 0, 0, 0, 1 ); level.player.hud_scubamask = level.player maps\_hud_util::create_client_overlay( "scubamask_overlay_delta", 1, level.player ); level.player.hud_scubamask.foreground = 0; level.player.hud_scubamask.sort = -99; level.player.hud_scubamask.enablehudlighting = 1; level.player thread maps\_underwater::player_scuba(); level.player maps\_underwater::underwater_hud_enable( 1 ); init_swim_vars(); init_swim(); thread player_weapon_hack(); maps\black_ice_util::player_animated_sequence_restrictions(); wait( level.timestep ); level.player lerpviewangleclamp( 0, 0, 0, level.spring_cam_min_clamp, level.spring_cam_min_clamp, level.spring_cam_min_clamp, level.spring_cam_min_clamp ); } player_weapon_hack() { level.player giveweapon( "test_detonator_black_ice" ); level.player setweaponammoclip( "test_detonator_black_ice", 0 ); level.player giveweapon( "aps_underwater+swim" ); level.player switchtoweapon( "aps_underwater+swim" ); wait 1.3; level.player switchtoweapon( "test_detonator_black_ice" ); } player_swim_rubberband() { level endon( "notify_swim_end" ); var_0 = 80.0; var_1 = 40.0; var_2 = 130000.0; var_3 = 35000.0; var_4 = 500000.0; var_5 = 0.0; var_6 = 0.0; var_7 = 0.0; for (;;) { if ( isdefined( level._allies_swim[0].origin ) ) { var_6 = distancesquared( level._allies_swim[0].origin, level.breach_pos ); var_7 = distancesquared( level.player geteye(), level.breach_pos ); var_5 = var_7 - var_6; if ( var_5 > var_4 ) { setdvar( "ui_deadquote", &"BLACK_ICE_SWIM_FAIL_DISTANCE" ); maps\_utility::missionfailedwrapper(); } } var_8 = maps\black_ice_util::normalize_value( var_3, var_2, var_5 ); var_9 = maps\black_ice_util::factor_value_min_max( var_1, var_0, var_8 ); level.player.target_swim_speed = var_9; wait( level.timestep ); } } player_swim_water_current_logic() { level endon( "notify_swim_end" ); var_0 = []; var_0[0] = [ -200.0, 4400 ]; var_0[1] = [ -150.0, 3200 ]; var_0[2] = [ -100.0, 2000 ]; for (;;) { if ( level.player.origin[2] < var_0[0][0] ) { level.player.target_water_current = ( 0, 0, 1 ) * var_0[0][1]; level.player.water_current_delta = 0.2; } else if ( level.player.origin[2] < var_0[1][0] ) { level.player.target_water_current = ( 0, 0, 1 ) * var_0[1][1]; level.player.water_current_delta = 0.2; } else if ( level.player.origin[2] < var_0[2][0] ) { level.player.target_water_current = ( 0, 0, 1 ) * var_0[2][1]; level.player.water_current_delta = 0.2; } else { level.player.target_water_current = ( 0, 0, 0 ); level.player.water_current_delta = 0.1; } wait( level.timestep ); } } init_swim_vars() { level.player.target_swim_speed = 0.0; level.player.swim_speed_delta = 0.03; level.player.target_water_current = ( 0, 0, 0 ); level.player.water_current_delta = 0.1; } init_swim() { common_scripts\utility::flag_set( "flag_underwater_sfx" ); maps\_utility::vision_set_fog_changes( "black_ice_infil", 0 ); setsaveddvar( "r_snowAmbientColor", ( 0.035, 0.04, 0.04 ) ); thread infil_lights_and_vision(); common_scripts\utility::exploder( "underwater_amb" ); level.player.hint_active = 0; thread swim_check_node_distance(); } player_lerp_swim_vars() { level endon( "notify_swim_end" ); var_0 = self.target_swim_speed; var_1 = self.target_water_current; for (;;) { var_0 = var_0 + ( self.target_swim_speed - var_0 ) * self.swim_speed_delta; setsaveddvar( "player_swimSpeed", var_0 ); var_1 = var_1 + ( self.target_water_current - var_1 ) * self.water_current_delta; setsaveddvar( "player_swimWaterCurrent", var_1 ); wait( level.timestep ); } } enemy_swim_setup() { level.ice_breach_enemies = []; var_0 = getentarray( "ice_breach_enemy", "script_noteworthy" ); foreach ( var_2 in var_0 ) { var_3 = var_2 dospawn(); var_3.swimmer = 1; var_3.noragdoll = 1; var_3.deathfunction = maps\black_ice_anim::swim_enemy_death_anim_override; var_3 maps\_utility::set_battlechatter( 0 ); var_3.combatmode = "no_cover"; var_3.ignoreall = 1; var_3.ignoreme = 1; var_3.nodrop = 1; var_3.disablearrivals = 1; var_3.newenemyreactiondistsq_old = self.newenemyreactiondistsq; var_3.newenemyreactiondistsq = 0; var_3.grenadeammo = 0; var_3 allowedstances( "stand", "crouch" ); var_3 hidepart_allinstances( "tag_weapon" ); var_3 hidepart_allinstances( "tag_clip" ); var_3 maps\_utility::disable_pain(); var_3 thread maps\_utility::magic_bullet_shield(); var_3.animname = "ice_breach_enemy"; level.ice_breach_enemies[level.ice_breach_enemies.size] = var_3; } thread maps\_swim_ai_common::override_water_footsteps(); maps\black_ice_anim::swim_enemies_first_frame_anims(); } props_setup() { level.breach_props = []; create_persistent_ice_breach_props(); level.breach_vehicles["gaz71"] = maps\_utility::spawn_anim_model( "gaz71" ); level.breach_vehicles["gaztiger"] = maps\_utility::spawn_anim_model( "gaztiger" ); level.breach_vehicles["bm21_2"] = maps\_utility::spawn_anim_model( "bm21_2" ); level.vehicles_no_breach["bm21_3"] = maps\_utility::spawn_anim_model( "bm21_3" ); level.vehicles_no_breach["gaztiger_2"] = maps\_utility::spawn_anim_model( "gaztiger_2" ); level.vehicles_no_breach["snowmobile_1"] = maps\_utility::spawn_anim_model( "snowmobile_1" ); level.vehicles_no_breach["snowmobile_2"] = maps\_utility::spawn_anim_model( "snowmobile_2" ); thread maps\black_ice_fx::intro_turn_on_vehicle_drive_in_treadfx(); level.breach_mines = getentarray( "limpet_mine", "targetname" ); level.borescope = maps\_utility::spawn_anim_model( "borescope" ); thread mine_blink_fx(); level.breach_props["ice_chunks1"] hide(); level.breach_props["ice_chunks2"] hide(); level.breach_props["breach_water"] hide(); } prop_attach_coll() { var_0 = getent( self.coll, "targetname" ); if ( isdefined( var_0 ) ) { var_1 = ( 0, 0, 0 ); switch ( self.model ) { case "ch_crate64x64": var_1 = ( 0, 0, 36 ); break; case "com_ammo_pallet": var_1 = ( 0, 0, 28 ); break; case "oil_barrel": var_1 = ( 0, 0, 22 ); break; case "bi_basecamp_tire": break; case "com_plasticcase_green_big_idf_iw6": var_1 = ( 0, 0, 16 ); break; case "com_pallet_2_snow": var_1 = ( 0, 0, 4 ); break; } var_0.origin = self.origin + var_1; var_0.angles = self.angles; var_0 linkto( self ); } } create_persistent_ice_breach_props( var_0 ) { if ( !isdefined( level.breach_props ) ) level.breach_props = []; if ( !isdefined( level.tag_anim_rig_models ) ) level.tag_anim_rig_models = []; var_1 = maps\black_ice_util::setup_tag_anim_rig( "introbreach_props", "introbreach_props", 4, 1 ); for ( var_2 = 0; var_2 < level.tag_anim_rig_models.size; var_2++ ) { if ( isdefined( level.tag_anim_rig_models[var_2].coll ) ) level.tag_anim_rig_models[var_2] prop_attach_coll(); } level.breach_props["introbreach_props"] = var_1; level.breach_props["ice_chunks1"] = getent( "ice_chunks1", "targetname" ); level.breach_props["ice_chunks1"].animname = "ice_chunks1"; level.breach_props["ice_chunks1"] maps\_utility::assign_animtree(); level.breach_props["ice_chunks2"] = getent( "ice_chunks2", "targetname" ); level.breach_props["ice_chunks2"].animname = "ice_chunks2"; level.breach_props["ice_chunks2"] maps\_utility::assign_animtree(); level.breach_props["breach_water"] = maps\_utility::spawn_anim_model( "breach_water" ); level.breach_props["breach_water"] thread retarget_breach_water(); level.breach_vehicles = []; level.breach_vehicles["bm21_1"] = maps\_utility::spawn_anim_model( "bm21_1" ); if ( isdefined( var_0 ) && var_0 ) { level.breach_anim_node thread maps\_anim::anim_loop_solo( level.breach_props["ice_chunks1"], "intro_breach_loop", "stop_loop" ); level.breach_anim_node maps\_anim::anim_last_frame_solo( level.breach_props["introbreach_props"], "intro_breach" ); level.breach_anim_node maps\_anim::anim_last_frame_solo( level.breach_props["breach_water"], "intro_breach" ); level.breach_anim_node maps\_anim::anim_last_frame_solo( level.breach_vehicles["bm21_1"], "intro_breach" ); } } mine_blink_fx() { foreach ( var_1 in level.breach_mines ) { wait( level.timestep ); playfxontag( common_scripts\utility::getfx( "mine_light" ), var_1, "tag_fx" ); wait 0.1; } } destroy_breach_mines_and_fx() { foreach ( var_1 in level.breach_mines ) { wait( level.timestep ); stopfxontag( common_scripts\utility::getfx( "mine_light" ), var_1, "tag_fx" ); var_1 delete(); } } swim_detonate_logic() { level waittill( "notify_pullout_detonator" ); level.player enableweapons(); level.player switchtoweapon( "test_detonator_black_ice" ); level.player allowfire( 0 ); wait 2.0; swim_wait_for_detonate(); thread swim_player_start_breach(); wait 0.5; thread swim_breach_dialog(); ice_breach_logic(); } swim_breach_dialog() { wait 0.2; maps\_utility::radio_dialogue_stop(); if ( common_scripts\utility::flag( "flag_player_clear_to_breach" ) ) { wait 0.4; thread maps\_utility::smart_radio_dialogue( "blackice_bkr_takeemout" ); } else { wait 0.1; thread maps\_utility::smart_radio_dialogue( "blackice_bkr_toosoon" ); } } swim_player_start_breach() { var_0 = weaponfiretime( "test_detonator_black_ice" ); wait( var_0 ); level.player switchtoweapon( "aps_underwater+swim" ); setsaveddvar( "player_swimCombatTimer", 5000 ); setsaveddvar( "g_friendlyNameDist", level.g_friendlynamedist_old ); level.g_friendlynamedist_old = undefined; wait 1.4; level.player takeweapon( "test_detonator_black_ice" ); if ( isdefined( level.black_ice_hud_ammocounterhide ) ) setsaveddvar( "ammoCounterHide", level.black_ice_hud_ammocounterhide ); level.player allowfire( 1 ); } swim_surface_dialog() { thread maps\_utility::smart_radio_dialogue( "blackice_bkr_wereclear" ); wait 2.0; level waittill( "notify_swim_dialog7_1" ); thread maps\_utility::smart_radio_dialogue( "black_ice_mrk_dropyourtanksand" ); wait 5.0; if ( !common_scripts\utility::flag( "flag_swim_player_drop_tank" ) ) thread maps\_utility::smart_radio_dialogue( "black_ice_mrk_doubletimeit" ); wait 2.5; if ( !common_scripts\utility::flag( "flag_swim_player_drop_tank" ) ) thread maps\_utility::smart_radio_dialogue( "black_ice_hsh_takingfire" ); wait 3.5; if ( !common_scripts\utility::flag( "flag_swim_player_drop_tank" ) ) thread maps\_utility::smart_radio_dialogue( "black_ice_hsh_getuphere" ); wait 5; if ( !common_scripts\utility::flag( "flag_swim_player_drop_tank" ) ) thread maps\_utility::smart_radio_dialogue( "black_ice_hsh_whereareyoualpha" ); wait 6; var_0 = [ &"BLACK_ICE_HESH_KILLED", &"BLACK_ICE_KEEGAN_KILLED" ]; if ( !common_scripts\utility::flag( "flag_swim_player_drop_tank" ) ) { setdvar( "ui_deadquote", var_0[randomint( var_0.size - 1 )] ); maps\_utility::missionfailedwrapper(); } } swim_wait_for_detonate() { level.player allowfire( 1 ); while ( !level.player attackbuttonpressed() ) wait( level.timestep ); level.player allowfire( 0 ); thread maps\black_ice_audio::sfx_breach_detonate(); common_scripts\utility::flag_set( "flag_swim_breach_detonate" ); } detonate_string_func() { return common_scripts\utility::ter_op( level.player attackbuttonpressed() || common_scripts\utility::flag( "flag_detonate_fail" ), 1, 0 ); } ice_breach_logic() { thread maps\black_ice_fx::intro_detonation_sequence_fx(); earthquake( 0.6, 1.5, level.player.origin, 100 ); level.player shellshock( "default_nosound", 1.5 ); wait 0.75; handle_ice_plugs(); thread destroy_breach_mines_and_fx(); level.breach_props["ice_chunks1"] show(); level.breach_props["breach_water"] show(); level.breach_props["introbreach_props"] thread ice_breach_process_prop_fx(); thread maps\black_ice_anim::swim_breach_anims(); thread props_cleanup(); for ( var_0 = 0; var_0 < level.ice_breach_enemies.size; var_0++ ) { level.ice_breach_enemies[var_0] thread ice_breach_process_enemy( var_0 ); wait( level.timestep ); level.ice_breach_enemies[var_0] thread ice_breach_process_enemy_fx(); } wait_till_breach_end_conditions(); maps\_utility::autosave_by_name( "swim_forward" ); thread maps\black_ice_anim::swim_allies_swim_forward(); thread player_surface_logic(); thread swim_surface_dialog(); thread scuba_ally_swap(); level waittill( "notify_begin_camp_logic" ); } handle_ice_plugs() { var_0 = getentarray( "ice_plug", "script_noteworthy" ); foreach ( var_2 in var_0 ) { var_2 hide(); var_2 delete(); } common_scripts\utility::array_call( getentarray( "opt_hide_swim", "script_noteworthy" ), ::show ); level notify( "icehole_open" ); } ice_breach_process_prop_fx() { wait 1.0; var_0 = self.model; var_1 = getnumparts( var_0 ); for ( var_2 = 0; var_2 < var_1; var_2++ ) { var_3 = getpartname( var_0, var_2 ); switch ( var_3 ) { case "tag_origin_new_props": break; case "mdl_ch_crate64x64_snow_001": break; default: wait( level.timestep ); playfxontag( level._effect["water_bubble_cloud_descent_med"], self, var_3 ); break; } } } ice_breach_process_enemy_fx() { wait 0.25; playfxontag( level._effect["water_bubble_cloud_descent_med"], self, "j_mainroot" ); playfxontag( level._effect["water_bubble_cloud_descent_med"], self, "J_Ankle_ri" ); playfxontag( level._effect["water_bubble_cloud_descent_med"], self, "J_Ankle_LE" ); } infil_lights_and_vision() { common_scripts\utility::flag_wait( "flag_swim_breach_detonate" ); if ( maps\_utility::is_gen4() && !level.ps4 ) setsaveddvar( "r_mbEnable", 2 ); wait 1; maps\_utility::vision_set_fog_changes( "black_ice_infil_bright", 1.3 ); var_0 = getentarray( "light_infil_script_top", "targetname" ); foreach ( var_2 in var_0 ) thread light_brighten( var_2, 0.7 ); var_4 = getentarray( "light_infil_script_top2", "targetname" ); foreach ( var_2 in var_4 ) thread light_brighten( var_2, 0.4 ); level waittill( "notify_icehole_godrays" ); common_scripts\utility::exploder( "intro_icehole_godray" ); level waittill( "player_water_breach" ); maps\_utility::stop_exploder( "intro_icehole_godray" ); } light_brighten( var_0, var_1 ) { var_2 = var_0 getlightintensity(); var_3 = var_1; var_4 = 0.12; while ( var_2 < var_3 ) { var_2 = var_2 + var_4; var_0 setlightintensity( var_2 ); wait( level.timestep ); } } player_surface_logic() { level waittill( "notify_swim_allow_movement" ); level.player.target_swim_speed = 40; setsaveddvar( "player_swimVerticalSpeed", 40.0 ); level.player thread player_lerp_swim_vars(); thread player_swim_rubberband(); thread player_swim_water_current_logic(); thread maps\black_ice_anim::swim_truck_surface_anim(); while ( !common_scripts\utility::flag( "flag_swim_player_drop_tank" ) ) wait( level.timestep ); common_scripts\utility::flag_set( "flag_player_breaching" ); if ( !isdefined( level._bravo ) || level._bravo.size < 2 ) maps\black_ice_util::spawn_bravo(); surface_breach(); common_scripts\utility::flag_clear( "flag_underwater_sfx" ); common_scripts\utility::flag_set( "flag_outofwater_sfx" ); thread player_post_swim(); if ( isdefined( level.breach_anim_node ) ) level.breach_anim_node notify( "stop_loop" ); if ( isdefined( level.allies_breach_anim_node ) ) level.allies_breach_anim_node notify( "stop_loop" ); } surface_breach() { thread maps\black_ice_anim::swim_ally_surface_anim(); level.player.disablereload = 1; level.player disableweapons(); level.player disableoffhandweapons(); level.player disableweaponswitch(); level.player.hint_active = undefined; level notify( "notify_swim_end" ); thread player_water_breach_moment(); thread maps\black_ice_audio::sfx_player_exits_water(); thread maps\black_ice_audio::sfx_heli_over(); maps\black_ice_anim::swim_player_surface_anim(); } scuba_ally_swap() { level waittill( "notify_ally_swim_surface_anims_done" ); level.launchers_attached = 1; if ( isdefined( level._allies_swim ) ) { level._allies_swim = []; maps\_utility::array_delete( level._allies_swim ); } } scuba_surface( var_0, var_1, var_2, var_3, var_4 ) { var_5 = var_3.animname; var_3.animname = "scuba_ally"; var_3 maps\_utility::ent_flag_init( "flag_camp_move_ally" ); wait( var_0 ); thread maps\_anim::anim_single_solo( var_1, var_2 ); common_scripts\utility::flag_wait( "player_water_breach" ); var_3 forceteleport( var_1.origin, var_1.angles ); var_3 attach( level.scr_model["ascend_launcher_non_anim"], "TAG_STOWED_BACK" ); var_6 = var_1 getanimtime( var_1 maps\_utility::getanim( var_2 ) ); if ( isdefined( var_1.launcher ) ) { var_1.launcher unlink(); var_1.launcher delete(); } var_1 delete(); var_3 show(); thread maps\_anim::anim_single_solo( var_3, var_2, undefined, 0.1 ); wait 0.05; var_3 setanimtime( var_3 maps\_utility::getanim( var_2 ), var_6 ); wait( getanimlength( var_3 maps\_utility::getanim( var_2 ) ) * ( 1.0 - var_6 ) ); var_3.animname = var_5; if ( !isdefined( var_4 ) || var_3 maps\_utility::ent_flag( "flag_camp_move_ally" ) ) return; var_7 = var_3.newenemyreactiondistsq; var_3.newenemyreactiondistsq = 0; var_3 maps\_utility::disable_ai_color(); var_3 thread maps\_utility::follow_path( getnode( var_4, "targetname" ) ); var_3 maps\_utility::ent_flag_wait( "flag_camp_move_ally" ); var_3 notify( "stop_going_to_node" ); var_3 maps\_utility::enable_ai_color(); for (;;) { var_8 = maps\_utility::get_closest_ai( var_3.origin, "axis" ); if ( isdefined( var_8 ) ) { var_9 = distancesquared( var_3.origin, var_8.origin ); if ( var_9 > var_7 ) { var_3.newenemyreactiondistsq = var_7; break; } } wait 0.1; } } bravo_post_snake_cam( var_0, var_1, var_2, var_3 ) { var_1 maps\_utility::ent_flag_init( "flag_camp_move_ally" ); wait( var_0 ); var_4 = getnode( var_2, "targetname" ); var_1 forceteleport( var_4.origin, var_4.angles ); var_1 attach( level.scr_model["ascend_launcher_non_anim"], "TAG_STOWED_BACK" ); var_1 show(); if ( isdefined( var_3 ) ) { var_5 = var_1.animname; var_1.animname = "scuba_ally"; thread maps\_anim::anim_single_solo( var_1, var_3 ); wait( getanimlength( var_1 maps\_utility::getanim( var_3 ) ) ); var_1.animname = var_5; } if ( !isdefined( var_2 ) || var_1 maps\_utility::ent_flag( "flag_camp_move_ally" ) ) return; var_6 = var_1.newenemyreactiondistsq; var_1.newenemyreactiondistsq = 0; var_1 maps\_utility::disable_ai_color(); var_1 thread maps\_utility::follow_path( var_4 ); var_1 maps\_utility::ent_flag_wait( "flag_camp_move_ally" ); var_1 notify( "stop_going_to_node" ); var_1 maps\_utility::enable_ai_color(); for (;;) { var_7 = maps\_utility::get_closest_ai( var_1.origin, "axis" ); if ( isdefined( var_7 ) ) { var_8 = distancesquared( var_1.origin, var_7.origin ); if ( var_8 > var_6 ) { var_1.newenemyreactiondistsq = var_6; break; } } wait 0.1; } } wait_till_breach_end_conditions() { level waittill( "notify_swim_end_breach" ); } player_water_breach_moment() { while ( !common_scripts\utility::flag( "player_water_breach" ) ) wait( level.timestep ); } player_post_swim() { maps\black_ice_util::player_animated_sequence_cleanup(); level.player allowswim( 0 ); level.player disableslowaim(); if ( isdefined( level.player_scuba ) ) { level.player_scuba delete(); level.player_scuba = undefined; } } ice_breach_process_enemy( var_0 ) { thread ice_breach_process_enemy_anim( var_0 ); thread ice_breach_process_enemy_dmg( var_0 ); } ice_breach_process_enemy_anim( var_0 ) { self endon( "death" ); while ( !maps\black_ice_util::check_anim_time( self.animname, "introbreach_opfor" + var_0, 1.0 ) ) wait( level.timestep ); if ( isdefined( self.magic_bullet_shield ) && self.magic_bullet_shield ) maps\_utility::stop_magic_bullet_shield(); self.allowdeath = 1; self kill(); } ice_breach_process_enemy_dmg( var_0 ) { self endon( "death" ); self waittill( "damage", var_1, var_2, var_3, var_4, var_5 ); if ( var_5 != "MOD_EXPLOSIVE" ) { if ( var_3 != ( 0, 0, 0 ) ) playfx( common_scripts\utility::getfx( "swim_ai_blood_impact" ), var_4, var_3 ); } if ( isdefined( self.magic_bullet_shield ) && self.magic_bullet_shield ) maps\_utility::stop_magic_bullet_shield(); self.allowdeath = 1; self kill(); } props_cleanup() { level.breach_vehicles["gaztiger"] thread prop_destroy( level.breach_anim_node, "intro_breach", maps\black_ice_fx::turn_off_gaztiger_underwater_lights_fx ); level.breach_vehicles["bm21_2"] thread prop_destroy( level.breach_anim_node, "intro_breach", maps\black_ice_fx::turn_off_bm21_2_underwater_lights_fx ); } prop_destroy( var_0, var_1, var_2 ) { var_0 waittill( var_1 ); if ( isdefined( var_2 ) ) [[ var_2 ]](); self delete(); } destroy_persistent_ice_breach_props() { if ( isdefined( level.tag_anim_rig_models ) ) { for ( var_0 = 0; var_0 < level.tag_anim_rig_models.size; var_0++ ) level.tag_anim_rig_models[var_0] delete(); } if ( isdefined( level.breach_props ) ) { if ( isdefined( level.breach_props["introbreach_props"] ) ) level.breach_props["introbreach_props"] delete(); } if ( isdefined( level.breach_vehicles ) ) { if ( isdefined( level.breach_vehicles["bm21_1"] ) ) level.breach_vehicles["bm21_1"] delete(); } if ( isdefined( level.surface_truck ) ) maps\black_ice_anim::swim_truck_surface_destroy(); } underwater_sfx() { wait 1; common_scripts\utility::flag_wait( "flag_outofwater_sfx" ); maps\_utility::battlechatter_on( "allies" ); maps\_utility::battlechatter_on( "axis" ); } player_heartbeat() { level endon( "stop_player_heartbeat" ); for (;;) { self playlocalsound( "breathing_heartbeat" ); wait 0.5; } } check_analog_movement() { var_0 = level.player getnormalizedmovement(); if ( var_0[0] == 0 && var_0[1] == 0 ) return 0; else return 1; } retarget_breach_water() { self retargetscriptmodellighting( getent( "infil_lighttarget", "targetname" ) ); } set_snakecam_dof() { maps\_art::dof_enable_script( 0, 211.65, 8, 10000, 30000, 0.3, 2.0 ); level waittill( "flag_snake_cam_below_water" ); if ( maps\_utility::is_gen4() ) setsaveddvar( "r_mbEnable", 0 ); maps\_art::dof_disable_script( 1 ); common_scripts\utility::flag_wait( "player_water_breach" ); thread maps\black_ice_camp::camp_mblur_changes(); maps\_art::dof_enable_script( 0, 100, 3, 5000, 7000, 0.4, 0 ); wait 2; maps\_art::dof_enable_script( 0, 1, 1, 500, 7000, 10, 1 ); wait 3; maps\_art::dof_disable_script( 1 ); } swim_godrays() { var_0 = getent( "swim_gr_origin", "targetname" ); if ( maps\_utility::is_gen4() ) maps\black_ice_util::god_rays_from_world_location( var_0.origin, "flag_swim_breach_detonate", "player_water_breach", undefined, undefined ); }