1341 lines
41 KiB
Plaintext
1341 lines
41 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
section_main()
|
|
{
|
|
maps\_utility::add_hint_string( "up_hint", &"LOKI_HINT_UP", ::no_hint );
|
|
maps\_utility::add_hint_string( "down_hint", &"LOKI_HINT_DOWN", ::no_hint_down );
|
|
}
|
|
|
|
section_precache()
|
|
{
|
|
precacheshader( "green_block" );
|
|
}
|
|
|
|
section_flag_inits()
|
|
{
|
|
common_scripts\utility::flag_init( "cool_spawn_finished" );
|
|
common_scripts\utility::flag_init( "combat_one_wave2_started" );
|
|
common_scripts\utility::flag_init( "door_traversal_done" );
|
|
common_scripts\utility::flag_init( "stop_movement_hint" );
|
|
}
|
|
|
|
combat_one_start()
|
|
{
|
|
maps\loki_util::player_move_to_checkpoint_start( "combat_one" );
|
|
maps\loki_util::spawn_allies();
|
|
thread maps\loki_audio::sfx_set_combat_amb();
|
|
thread maps\loki_infil::setup_fuel_leak_lighting();
|
|
thread maps\loki_util::player_boundaries_on();
|
|
level.accuracy_ally = 0.6;
|
|
level.accuracy_enemy = 1.4;
|
|
level.allies[0].fixednode = 1;
|
|
level.allies[1].baseaccuracy = level.accuracy_ally;
|
|
level.allies[2].fixednode = 1;
|
|
level.allies[2].baseaccuracy = level.accuracy_ally;
|
|
var_0 = getnode( "cover_one_ally0_node1", "targetname" );
|
|
level.allies[0] setgoalnode( var_0 );
|
|
var_0 = getnode( "cover_one_ally1_node1", "targetname" );
|
|
level.allies[1] setgoalnode( var_0 );
|
|
var_0 = getnode( "cover_one_ally2_node1", "targetname" );
|
|
level.allies[2] setgoalnode( var_0 );
|
|
maps\loki_infil::create_redshirts();
|
|
|
|
foreach ( var_2 in level.redshirts )
|
|
{
|
|
var_0 = getnode( var_2.first_goal_node, "targetname" );
|
|
var_2 forceteleport( var_0.origin, var_0.angles );
|
|
}
|
|
|
|
level thread spawn_wave1_enemies( 1 );
|
|
level thread firstframe_combat_one_door();
|
|
}
|
|
|
|
combat_one()
|
|
{
|
|
thread maps\loki_audio::sfx_set_combat_amb();
|
|
maps\_utility::battlechatter_on( "allies" );
|
|
level.activebreaks = 0;
|
|
level.grenadesplashing = 0;
|
|
var_0 = getentarray( "breakTile", "targetname" );
|
|
var_1 = getentarray( "breakTileEdge", "targetname" );
|
|
common_scripts\utility::array_thread( var_0, ::do_tile_single, var_0, var_1 );
|
|
level thread track_ai();
|
|
level thread trigger_wave2();
|
|
level thread trigger_wave3();
|
|
level thread unlink_door_traversal_nodes();
|
|
level thread unlink_final_exposed_nodes();
|
|
level thread track_fuel_leak_hit();
|
|
level thread capsule_ninja();
|
|
level thread instant_explosion();
|
|
setsaveddvar( "actor_spaceLightingOffset", -6 );
|
|
thread maps\loki_audio::sfx_loki_breathing_logic( 1 );
|
|
var_2 = getent( "combat_one_traversal1", "targetname" );
|
|
level.combat_one_wave_node = var_2;
|
|
var_3 = getentarray( "sniper_sat_solarpanel", "targetname" );
|
|
common_scripts\utility::array_thread( var_3, ::solarpanels_damage_think );
|
|
common_scripts\utility::array_thread( var_3, ::solarpanels_damage_think_instant );
|
|
common_scripts\utility::flag_wait( "combat_one_done" );
|
|
}
|
|
|
|
start_fuel_leak_fx( var_0, var_1, var_2, var_3 )
|
|
{
|
|
var_4 = common_scripts\utility::spawn_tag_origin();
|
|
var_4.targetname = "fuel_leak_tag";
|
|
var_4.script_noteworthy = "combat_one_cleanup";
|
|
var_4 thread start_fuel_leak_fx_main( var_0, var_1, var_2, var_3 );
|
|
return var_4;
|
|
}
|
|
|
|
start_fuel_leak_lighting()
|
|
{
|
|
var_0 = getentarray( "combat_one_light", "script_noteworthy" );
|
|
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
wait 8.5;
|
|
var_2 setlightradius( 540 );
|
|
var_2 setlightintensity( 8.0 );
|
|
}
|
|
}
|
|
|
|
start_fuel_leak_fx_main( var_0, var_1, var_2, var_3 )
|
|
{
|
|
self endon( "death" );
|
|
level endon( "explosion" );
|
|
|
|
if ( isdefined( var_1 ) )
|
|
{
|
|
var_4 = var_2;
|
|
var_5 = var_3;
|
|
}
|
|
else
|
|
{
|
|
var_4 = common_scripts\utility::getstruct( var_0, "targetname" ).origin;
|
|
var_5 = common_scripts\utility::getstruct( var_0, "targetname" ).angles;
|
|
}
|
|
|
|
self.origin = var_4;
|
|
self.angles = var_5;
|
|
self.is_on_fire = 0;
|
|
thread stop_fuel_leak_fx();
|
|
level thread start_fuel_leak_lighting();
|
|
earthquake( 0.15, 0.5, var_4, 1000 );
|
|
playfxontag( common_scripts\utility::getfx( "vfx_fuel_leak_zerog" ), self, "tag_origin" );
|
|
thread maps\loki_audio::sfx_gas_line_fuel_burst( self );
|
|
var_6 = 1;
|
|
|
|
foreach ( var_8 in level.bullet_caused_fuel_leaks )
|
|
{
|
|
if ( distance( var_8.origin, var_4 ) < 36 && var_8.is_on_fire )
|
|
{
|
|
maps\loki_util::jkuprint( "close!!! skipping long fuel leak" );
|
|
var_6 = 0;
|
|
wait 1;
|
|
break;
|
|
}
|
|
else
|
|
var_6 = 1;
|
|
}
|
|
|
|
if ( var_6 )
|
|
{
|
|
thread maps\loki_audio::sfx_gas_line_fuel_leak( self );
|
|
wait 5;
|
|
}
|
|
|
|
thread maps\loki_audio::sfx_gas_line_ignite( self );
|
|
self.is_on_fire = 1;
|
|
playfxontag( common_scripts\utility::getfx( "spc_fire_puff_light" ), self, "tag_origin" );
|
|
playfxontag( common_scripts\utility::getfx( "loki_fuel_ignite_fast" ), self, "tag_origin" );
|
|
stopfxontag( common_scripts\utility::getfx( "vfx_fuel_leak_zerog" ), self, "tag_origin" );
|
|
wait 0.5;
|
|
|
|
if ( isdefined( var_1 ) || var_0 == "fuel_explosion_spark_point2" )
|
|
thread maps\loki_audio::sfx_gas_line_fire_lp( self, 0 );
|
|
else if ( level.bullet_caused_fuel_leaks.size < 2 && var_0 == "fuel_explosion_spark_point0" )
|
|
thread maps\loki_audio::sfx_gas_line_fire_lp( self, 0 );
|
|
else
|
|
thread maps\loki_audio::sfx_gas_line_fire_lp( self, 1 );
|
|
|
|
playfxontag( common_scripts\utility::getfx( "vfx_fuel_fire_zerog_cglight" ), self, "tag_origin" );
|
|
playfxontag( common_scripts\utility::getfx( "spc_fire_puff_big_single_runner" ), self, "tag_origin" );
|
|
stopfxontag( common_scripts\utility::getfx( "spc_fire_puff_light" ), self, "tag_origin" );
|
|
}
|
|
|
|
stop_fuel_leak_fx()
|
|
{
|
|
thread stop_fuel_leak_fx_explosion();
|
|
self waittill( "death" );
|
|
maps\loki_util::jkuprint( "deleting leak fx" );
|
|
thread maps\loki_audio::sfx_gas_line_stop_sfx( self );
|
|
stopfxontag( common_scripts\utility::getfx( "vfx_fuel_leak_zerog" ), self, "tag_origin" );
|
|
common_scripts\utility::waitframe();
|
|
stopfxontag( common_scripts\utility::getfx( "electrical_sparks_zerog_runner" ), self, "tag_origin" );
|
|
common_scripts\utility::waitframe();
|
|
stopfxontag( common_scripts\utility::getfx( "vfx_fuel_fire_zerog_cglight" ), self, "tag_origin" );
|
|
common_scripts\utility::waitframe();
|
|
stopfxontag( common_scripts\utility::getfx( "loki_fuel_ignite_fast_runner" ), self, "tag_origin" );
|
|
common_scripts\utility::waitframe();
|
|
stopfxontag( common_scripts\utility::getfx( "spc_fire_puff_big_single_runner" ), self, "tag_origin" );
|
|
self delete();
|
|
}
|
|
|
|
stop_fuel_leak_fx_explosion()
|
|
{
|
|
level waittill( "explosion" );
|
|
self notify( "death" );
|
|
}
|
|
|
|
start_fuel_explosion_fx( var_0, var_1, var_2, var_3, var_4 )
|
|
{
|
|
var_5 = common_scripts\utility::getstruct( var_0, "targetname" );
|
|
earthquake( var_3, 0.75, var_5.origin, 1200 );
|
|
var_6 = maps\loki_util::create_rumble_ent( var_4, "combat_one_cleanup", 3 );
|
|
var_6 playrumbleonentity( "light_1s" );
|
|
|
|
if ( !isdefined( var_2 ) )
|
|
playfx( common_scripts\utility::getfx( var_1 ), var_5.origin );
|
|
else
|
|
playfx( common_scripts\utility::getfx( var_1 ), var_5.origin, var_2 );
|
|
}
|
|
|
|
test_lights()
|
|
{
|
|
var_0 = getent( "combat_one", "targetname" );
|
|
var_1 = maps\_vignette_util::vignette_actor_spawn( "deadbody", "deadbody" );
|
|
var_1 forceteleport( var_0.origin, var_1.angles + ( 0, 180, 0 ) );
|
|
var_1 thread maps\_space_ai::space_actor_lights();
|
|
var_0 maps\_anim::anim_loop_solo( var_1, "test_loop" );
|
|
}
|
|
|
|
movement_hints()
|
|
{
|
|
level.player endon( "death" );
|
|
thread maps\_utility::display_hint_timeout( "up_hint", 2.75 );
|
|
thread maps\_utility::display_hint_timeout( "down_hint", 2 );
|
|
wait 2;
|
|
|
|
for (;;)
|
|
{
|
|
if ( level.player secondaryoffhandbuttonpressed() )
|
|
{
|
|
var_0 = gettime();
|
|
|
|
while ( level.player secondaryoffhandbuttonpressed() )
|
|
{
|
|
if ( gettime() - var_0 > 500 )
|
|
{
|
|
common_scripts\utility::flag_set( "stop_movement_hint" );
|
|
return;
|
|
}
|
|
|
|
common_scripts\utility::waitframe();
|
|
}
|
|
}
|
|
|
|
common_scripts\utility::waitframe();
|
|
}
|
|
}
|
|
|
|
no_hint()
|
|
{
|
|
if ( !isalive( level.player ) )
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
no_hint_down()
|
|
{
|
|
if ( !isalive( level.player ) || common_scripts\utility::flag( "stop_movement_hint" ) )
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
move_explosion_buildup_rumble()
|
|
{
|
|
var_0 = maps\loki_util::create_rumble_ent( 1000, "combat_one_cleanup" );
|
|
var_0 playrumblelooponentity( "steady_rumble" );
|
|
|
|
while ( !common_scripts\utility::flag( "explosion" ) )
|
|
{
|
|
var_1 = distance( var_0.origin, level.player.origin );
|
|
|
|
if ( var_1 > 666 )
|
|
var_0.origin = var_0.origin + ( 0, 0, -7 );
|
|
else if ( distance( var_0.origin, level.player.origin ) < 200 )
|
|
{
|
|
|
|
}
|
|
else
|
|
{
|
|
maps\loki_util::jkuprint( "fast move" );
|
|
var_0.origin = var_0.origin + ( 0, 0, -17 );
|
|
}
|
|
|
|
var_0 linkto( level.player );
|
|
common_scripts\utility::waitframe();
|
|
}
|
|
|
|
var_0 delete();
|
|
}
|
|
|
|
instant_explosion()
|
|
{
|
|
level.player endon( "death" );
|
|
level endon( "explosion_started" );
|
|
var_0 = getent( "combat_one_door_instant", "targetname" );
|
|
var_0 waittill( "trigger" );
|
|
level notify( "explosion" );
|
|
level.combat_one_wave_node notify( "explosion" );
|
|
maps\loki_util::jkuprint( "CHEATER!!!!" );
|
|
level thread moving_cover_pre_tele( 1 );
|
|
}
|
|
|
|
moving_cover_pre_tele( var_0 )
|
|
{
|
|
level.player endon( "death" );
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
var_0 = 0;
|
|
|
|
common_scripts\utility::flag_wait( "start_fuel_explosion" );
|
|
level notify( "explosion_started" );
|
|
thread maps\loki_audio::sfx_gas_line_explo_logic();
|
|
level.allies[0] notify( "start_fuel_explosion" );
|
|
thread maps\loki_fx::fx_fuel_explosion_pre_fx();
|
|
level thread move_explosion_buildup_rumble();
|
|
|
|
if ( !var_0 )
|
|
{
|
|
level thread maps\loki_moving_cover::firstframe_moving_cover();
|
|
wait 1.5;
|
|
}
|
|
else
|
|
maps\loki_moving_cover::firstframe_moving_cover( 1 );
|
|
|
|
var_1 = getent( "combat_one_explosion", "targetname" );
|
|
var_2 = maps\_utility::spawn_anim_model( "moving_cover_obj0" );
|
|
var_1 maps\_anim::anim_first_frame_solo( var_2, "explosion_part1" );
|
|
var_2 maps\loki_util::spawn_and_link_models_to_tags( "combat_one_cleanup", undefined, 1 );
|
|
level maps\_utility::delaythread( 0, ::start_fuel_explosion_fx, "fuel_explosion_point0", "fuel_explosion_zerog", undefined, 0.15, 800 );
|
|
level maps\_utility::delaythread( 0.6, ::start_fuel_explosion_fx, "fuel_explosion_point1", "fuel_explosion_zerog", undefined, 0.25, 600 );
|
|
level maps\_utility::delaythread( 1.0, ::start_fuel_explosion_fx, "fuel_explosion_point2", "fuel_explosion_zerog", undefined, 0.35, 400 );
|
|
level maps\_utility::delaythread( 1.4, ::start_fuel_explosion_fx, "fuel_explosion_point3", "fuel_explosion_zerog", undefined, 0.45, 200 );
|
|
common_scripts\utility::flag_set( "turn_off_creaks" );
|
|
|
|
if ( !var_0 )
|
|
level maps\_utility::delaythread( 0.75, ::explosion_anim, var_1, var_2 );
|
|
|
|
if ( !var_0 )
|
|
wait 0.6;
|
|
|
|
maps\_utility::radio_dialogue_clear_stack();
|
|
level thread maps\_utility::smart_radio_dialogue_interrupt( "loki_kgn_shit" );
|
|
|
|
if ( !var_0 )
|
|
wait 0.9;
|
|
|
|
level.player.og_health = level.player.health;
|
|
level.player.demigod = 1;
|
|
level.player playrumbleonentity( "light_1s" );
|
|
var_3 = common_scripts\utility::spawn_tag_origin();
|
|
var_4 = common_scripts\utility::spawn_tag_origin();
|
|
var_5 = common_scripts\utility::spawn_tag_origin();
|
|
var_3.origin = level.player.origin + ( 0, 0, 40 );
|
|
var_5.origin = level.player.origin;
|
|
var_3.angles = ( 0, 90, 0 );
|
|
var_5.angles = ( 0, 90, 0 );
|
|
var_5 linkto( var_3 );
|
|
var_3.angles = ( 330, 90, 0 );
|
|
var_4.origin = var_3.origin;
|
|
var_3 linkto( var_4 );
|
|
level.player playerlinktoblend( var_5, "tag_origin", 0.3, 0, 0 );
|
|
level.player hideviewmodel();
|
|
var_4 rotatevelocity( ( 175, 0, 0 ), 999, 0, 0 );
|
|
var_6 = bullettrace( level.player.origin, level.player.origin + ( 0, 0, 200 ), 0 );
|
|
var_7 = distance( level.player.origin, var_6["position"] );
|
|
maps\loki_util::jkuprint( "Distance above we can rotate you: " + var_7 );
|
|
var_4 movez( var_7, 0.65, 0, 0 );
|
|
level thread maps\loki_moving_cover::hit_panel( level.player, 0.65, 0.5, 2 );
|
|
level.player playrumbleonentity( "heavy_3s" );
|
|
|
|
if ( !var_0 )
|
|
wait 0.6;
|
|
|
|
level.player.demigod = 0;
|
|
level thread maps\loki_util::player_boundaries_off();
|
|
level thread maps\loki_moving_cover::white_hide();
|
|
common_scripts\utility::waitframe();
|
|
common_scripts\utility::waitframe();
|
|
common_scripts\utility::flag_set( "explosion" );
|
|
level notify( "explosion" );
|
|
level.combat_one_wave_node notify( "explosion" );
|
|
common_scripts\utility::flag_set( "combat_one_music_end" );
|
|
level.player unlink();
|
|
var_3 delete();
|
|
var_4 delete();
|
|
var_5 delete();
|
|
level notify( "stop_explosions" );
|
|
common_scripts\utility::flag_set( "combat_one_done" );
|
|
}
|
|
|
|
explosion_anim( var_0, var_1 )
|
|
{
|
|
var_2 = getentarray( "explosion_hide", "targetname" );
|
|
|
|
foreach ( var_4 in var_2 )
|
|
var_4 hide();
|
|
|
|
var_0 maps\_anim::anim_single_solo( var_1, "explosion_part1" );
|
|
}
|
|
|
|
move_start_exposed_guy()
|
|
{
|
|
level.exposed_guy endon( "death" );
|
|
level endon( "combat_one_wave2_started" );
|
|
level.exposed_guy waittill( "goal" );
|
|
maps\loki_util::jkuprint( "exposed guy waiting" );
|
|
wait 8;
|
|
var_0 = getnode( "exposed_guy_start", "targetname" );
|
|
var_0 disconnectnode();
|
|
maps\loki_util::jkuprint( "exposed guy getting reassigned" );
|
|
var_0 = getnode( "exposed_guy_move", "targetname" );
|
|
level.exposed_guy setgoalnode( var_0 );
|
|
}
|
|
|
|
track_ai()
|
|
{
|
|
level endon( "explosion" );
|
|
level.player endon( "death" );
|
|
common_scripts\utility::flag_wait( "first_wave_spawned" );
|
|
level thread move_start_exposed_guy();
|
|
var_0 = get_all_wave_guys();
|
|
|
|
while ( var_0.size > 3 )
|
|
{
|
|
if ( common_scripts\utility::flag( "combat_one_wave2_spawned" ) )
|
|
break;
|
|
|
|
var_0 = get_all_wave_guys();
|
|
common_scripts\utility::waitframe();
|
|
}
|
|
|
|
maps\loki_util::jkuprint( "w2: via tracker" );
|
|
maps\_utility::battlechatter_off( "allies" );
|
|
common_scripts\utility::flag_set( "combat_one_wave2_started" );
|
|
maps\_utility::activate_trigger_with_targetname( "combat_one_trig_wave1_color" );
|
|
maps\_utility::activate_trigger_with_targetname( "combat_one_trig_wave2" );
|
|
common_scripts\utility::waitframe();
|
|
var_0 = get_all_wave_guys();
|
|
|
|
while ( var_0.size > 2 )
|
|
{
|
|
if ( common_scripts\utility::flag( "combat_one_wave2_spawned" ) )
|
|
break;
|
|
|
|
var_0 = get_all_wave_guys();
|
|
common_scripts\utility::waitframe();
|
|
}
|
|
|
|
level thread start_fuel_leak_fx( "fuel_explosion_spark_point0" );
|
|
level thread start_fuel_leak_fx( "fuel_explosion_spark_point1" );
|
|
level thread smart_radio_dialogue_enable_bc( 0.33, "loki_kgn_watchyourfiredont", "combat_one_wave3_spawned", 1 );
|
|
var_0 = get_all_wave_guys();
|
|
|
|
while ( var_0.size > 1 )
|
|
{
|
|
if ( common_scripts\utility::flag( "combat_one_wave3_spawned" ) )
|
|
break;
|
|
|
|
var_0 = get_all_wave_guys();
|
|
common_scripts\utility::waitframe();
|
|
}
|
|
|
|
maps\loki_util::jkuprint( "w3: via tracker" );
|
|
maps\_utility::battlechatter_off( "allies" );
|
|
level maps\_utility::delaythread( 1.5, ::start_fuel_leak_fx, "fuel_explosion_spark_point2" );
|
|
wait 2.666;
|
|
level thread force_traversal( "combat_one_traversal1", "cover_one_ally0_node2", "combat_one_ally0_traversal3", "combat_one_traversal3" );
|
|
level.allies[2] maps\_utility::set_force_color( "r" );
|
|
level.allies[2].fixednode = 0;
|
|
maps\_utility::activate_trigger_with_targetname( "combat_one_trig_wave2_color" );
|
|
maps\_utility::activate_trigger_with_targetname( "combat_one_trig_wave3" );
|
|
common_scripts\utility::flag_wait( "cool_spawn_finished" );
|
|
level thread smart_radio_dialogue_enable_bc( 4, "loki_kgn_thompsonwevegottangos", undefined, 1 );
|
|
var_1 = gettime() + 4000;
|
|
common_scripts\utility::waitframe();
|
|
var_0 = get_all_wave_guys( 1 );
|
|
|
|
while ( var_0.size > 2 )
|
|
{
|
|
var_0 = get_all_wave_guys( 1 );
|
|
common_scripts\utility::waitframe();
|
|
}
|
|
|
|
maps\loki_util::jkuprint( "end: final stand" );
|
|
|
|
if ( !common_scripts\utility::flag( "start_fuel_explosion" ) && gettime() - var_1 > 1000 )
|
|
{
|
|
maps\_utility::battlechatter_off( "allies" );
|
|
level thread smart_radio_dialogue_enable_bc( 0.66, "loki_kgn_clearthehatchthats", undefined, 1 );
|
|
}
|
|
|
|
level thread link_final_exposed_nodes();
|
|
var_0 = get_all_wave_guys( 1 );
|
|
|
|
foreach ( var_3 in var_0 )
|
|
{
|
|
level thread maps\loki_util::reassign_goal_volume( var_3, "combat_one_final" );
|
|
var_3.health = 150;
|
|
}
|
|
|
|
var_0 = get_all_wave_guys( 1 );
|
|
|
|
while ( var_0.size > 0 )
|
|
{
|
|
var_0 = get_all_wave_guys( 1 );
|
|
common_scripts\utility::waitframe();
|
|
}
|
|
|
|
maps\loki_util::jkuprint( "end: via tracker" );
|
|
level notify( "player_can_move_to_door" );
|
|
maps\_utility::battlechatter_off( "allies" );
|
|
level maps\_utility::delaythread( 1, ::start_fuel_leak_fx, "fuel_explosion_spark_point3" );
|
|
level maps\_utility::delaythread( 2, ::start_fuel_leak_fx, "fuel_explosion_spark_point4" );
|
|
var_5 = 0.8;
|
|
level thread ally0_move_to_end();
|
|
level maps\_utility::delaythread( var_5, ::moving_cover_pre_tele );
|
|
maps\_utility::activate_trigger_with_targetname( "combat_one_trig_wave3_color" );
|
|
var_6 = common_scripts\utility::getstruct( "ally1_at_door", "targetname" );
|
|
level.allies[1] maps\_utility::clear_force_color();
|
|
level.allies[1] setgoalpos( var_6.origin );
|
|
var_7 = common_scripts\utility::getstruct( "ally2_at_door", "targetname" );
|
|
level.allies[2] maps\_utility::clear_force_color();
|
|
level.allies[2] setgoalpos( var_7.origin );
|
|
wait( var_5 );
|
|
|
|
if ( !common_scripts\utility::flag( "start_fuel_explosion" ) )
|
|
level maps\_utility::smart_radio_dialogue( "loki_kgn_entrancesecuredmovein" );
|
|
}
|
|
|
|
smart_radio_dialogue_enable_bc( var_0, var_1, var_2, var_3 )
|
|
{
|
|
level endon( "explosion" );
|
|
level endon( "player_can_move_to_door" );
|
|
|
|
if ( isdefined( var_2 ) )
|
|
level endon( var_2 );
|
|
|
|
wait( var_0 );
|
|
level maps\_utility::smart_radio_dialogue( var_1 );
|
|
wait( randomfloatrange( 1, 2 ) );
|
|
|
|
if ( isdefined( var_3 ) && var_3 )
|
|
maps\_utility::battlechatter_on( "allies" );
|
|
}
|
|
|
|
ally0_move_to_end()
|
|
{
|
|
level endon( "explosion" );
|
|
level.player endon( "death" );
|
|
var_0 = force_traversal( "combat_one_traversal1", "combat_one_ally0_traversal3", undefined, "combat_one_traversal4" );
|
|
|
|
if ( !var_0 )
|
|
{
|
|
maps\loki_util::jkuprint( "ally unable to animate last traversal" );
|
|
level.allies[0] stopanimscripted();
|
|
level.combat_one_wave_node maps\_anim::anim_reach_solo( level.allies[0], "hatch_idle" );
|
|
}
|
|
|
|
level.combat_one_wave_node thread maps\_anim::anim_loop_solo( level.allies[0], "hatch_idle", "explosion" );
|
|
|
|
if ( !common_scripts\utility::flag( "start_fuel_explosion" ) )
|
|
{
|
|
thread maps\loki_audio::sfx_end_combat_amb();
|
|
level thread maps\_utility::smart_radio_dialogue( "loki_kgn_throughherekick" );
|
|
}
|
|
|
|
wait 6;
|
|
var_1 = [ "loki_kgn_hurryupkickwe", "loki_kgn_letsmoveitkick" ];
|
|
level.allies[0] thread maps\loki_util::play_nag( var_1, "start_fuel_explosion", 3, 8, 1, 8, "start_fuel_explosion" );
|
|
}
|
|
|
|
set_goalvolume_after_node_reached( var_0, var_1 )
|
|
{
|
|
self endon( "death" );
|
|
level endon( "combat_one_wave2_started" );
|
|
self.og_goalradius = self.goalradius;
|
|
self.goalradius = 8;
|
|
self waittill( "goal" );
|
|
self waittill( "goal" );
|
|
self.goalradius = self.og_goalradius;
|
|
wait 10;
|
|
|
|
if ( !common_scripts\utility::flag( var_1 ) )
|
|
self setgoalvolumeauto( getent( var_0, "targetname" ) );
|
|
}
|
|
|
|
spawn_wave1_enemies( var_0 )
|
|
{
|
|
var_1 = maps\loki_util::spawn_space_ai_from_targetname( "combat_one_wave1_upper" );
|
|
var_1 thread set_goalvolume_after_node_reached( "combat_one_wave1", "combat_one_wave2_started" );
|
|
var_1 thread combat_one_enemy();
|
|
var_1 = maps\loki_util::spawn_space_ai_from_targetname( "combat_one_wave1_lower" );
|
|
var_1 thread set_goalvolume_after_node_reached( "combat_one_wave1", "combat_one_wave2_started" );
|
|
var_1 thread combat_one_enemy();
|
|
var_2 = cool_spawn( "combat_one_wave1_top", 3, var_0 );
|
|
level.exposed_guy = var_2[1];
|
|
|
|
foreach ( var_1 in var_2 )
|
|
{
|
|
var_1 thread set_goalvolume_after_node_reached( "combat_one_wave1", "combat_one_wave2_started" );
|
|
var_1 thread combat_one_enemy();
|
|
}
|
|
|
|
common_scripts\utility::flag_set( "first_wave_spawned" );
|
|
}
|
|
|
|
trigger_wave2()
|
|
{
|
|
level endon( "explosion" );
|
|
var_0 = getent( "combat_one_trig_wave2", "targetname" );
|
|
var_0 waittill( "trigger" );
|
|
maps\loki_util::jkuprint( "w2" );
|
|
level thread force_traversal( "combat_one_traversal1", "cover_one_ally2_node1", "combat_one_traversal1_post", "combat_one_traversal1" );
|
|
level thread force_traversal( "combat_one_traversal1", "cover_one_ally0_node1", "cover_one_ally0_node2", "combat_one_traversal2" );
|
|
var_1 = get_all_wave_guys();
|
|
|
|
foreach ( var_3 in var_1 )
|
|
{
|
|
if ( isdefined( self.og_goalradius ) )
|
|
self.goalradius = self.og_goalradius;
|
|
|
|
level thread maps\loki_util::reassign_goal_volume( var_3, "combat_one_wave2" );
|
|
}
|
|
|
|
var_5 = maps\loki_util::spawn_space_ais_from_targetname( "combat_one_wave2_new" );
|
|
|
|
foreach ( var_7 in var_5 )
|
|
var_7 thread combat_one_enemy();
|
|
}
|
|
|
|
trigger_wave3()
|
|
{
|
|
level endon( "explosion" );
|
|
var_0 = getent( "combat_one_trig_wave3", "targetname" );
|
|
var_0 waittill( "trigger" );
|
|
maps\loki_util::jkuprint( "w3" );
|
|
common_scripts\utility::flag_set( "combat_one_wave3_spawned" );
|
|
var_1 = get_all_wave_guys();
|
|
|
|
foreach ( var_3 in var_1 )
|
|
level thread maps\loki_util::reassign_goal_volume( var_3, "combat_one_wave3" );
|
|
|
|
level thread maps\loki_util::loki_autosave_now();
|
|
var_5 = door_traversal();
|
|
}
|
|
|
|
capsule_ninja()
|
|
{
|
|
level endon( "explosion" );
|
|
level endon( "player_can_move_to_door" );
|
|
common_scripts\utility::flag_wait( "door_traversal_done" );
|
|
common_scripts\utility::flag_wait( "trigger_capsule_ninja" );
|
|
var_0 = maps\loki_util::spawn_space_ai_from_targetname( "combat_one_capsule_ninja" );
|
|
var_0 thread maps\loki_util::loki_drop_weapon();
|
|
var_0.health = 250;
|
|
var_0.baseaccuracy = 50;
|
|
var_0.favoriteenemy = level.player;
|
|
var_0.ignoreme = 1;
|
|
|
|
for ( var_0.fixednode = 1; isalive( self ); self.baseaccuracy = 50 )
|
|
{
|
|
common_scripts\utility::flag_waitopen( "trigger_capsule_ninja" );
|
|
maps\loki_util::jkuprint( "ninja n-ap" );
|
|
self.favoriteenemy = undefined;
|
|
self.baseaccuracy = level.accuracy_enemy;
|
|
common_scripts\utility::flag_wait( "trigger_capsule_ninja" );
|
|
maps\loki_util::jkuprint( "ninja ap" );
|
|
self.favoriteenemy = level.player;
|
|
}
|
|
}
|
|
|
|
combat_one_enemy()
|
|
{
|
|
self.baseaccuracy = level.accuracy_enemy;
|
|
self.maxfaceenemydist = 1024;
|
|
thread maps\loki_util::loki_drop_weapon();
|
|
thread enemy_attack_player_when_flashing();
|
|
}
|
|
|
|
enemy_attack_player_when_flashing()
|
|
{
|
|
self endon( "death" );
|
|
level.player endon( "death" );
|
|
level endon( "player_can_move_to_door" );
|
|
|
|
while ( isalive( self ) )
|
|
{
|
|
common_scripts\utility::flag_wait( "player_too_close_to_door" );
|
|
maps\loki_util::jkuprint( "ap" );
|
|
self.favoriteenemy = level.player;
|
|
self.baseaccuracy = 50;
|
|
common_scripts\utility::flag_waitopen( "player_too_close_to_door" );
|
|
maps\loki_util::jkuprint( "n-ap" );
|
|
self.favoriteenemy = undefined;
|
|
self.baseaccuracy = level.accuracy_enemy;
|
|
}
|
|
}
|
|
|
|
cool_spawn( var_0, var_1, var_2, var_3, var_4 )
|
|
{
|
|
if ( !isdefined( var_2 ) )
|
|
var_2 = 0;
|
|
|
|
if ( !isdefined( var_3 ) )
|
|
var_3 = undefined;
|
|
|
|
if ( !isdefined( var_4 ) )
|
|
var_4 = 1;
|
|
|
|
var_5 = [];
|
|
var_6 = getent( "combat_one_door_col", "targetname" );
|
|
var_6 notsolid();
|
|
var_6 connectpaths();
|
|
|
|
for ( var_7 = 0; var_7 < var_1; var_7++ )
|
|
{
|
|
var_8 = maps\loki_util::spawn_space_ai_from_targetname( var_0 + var_7, var_2 );
|
|
var_8 thread ignore_and_move_fast( var_3 );
|
|
var_5 = common_scripts\utility::add_to_array( var_5, var_8 );
|
|
|
|
if ( !var_2 )
|
|
wait 0.5;
|
|
}
|
|
|
|
if ( !var_2 && var_4 )
|
|
var_6 common_scripts\utility::delaycall( 8, ::rotateto, ( 0, 0, 0 ), 1, 0.5, 0.5 );
|
|
|
|
var_6 common_scripts\utility::delaycall( 8, ::solid );
|
|
var_6 common_scripts\utility::delaycall( 8.1, ::disconnectpaths );
|
|
common_scripts\utility::flag_set( "cool_spawn_finished" );
|
|
return var_5;
|
|
}
|
|
|
|
door_traversal()
|
|
{
|
|
var_0 = getnode( "combat_one_door_node1", "targetname" );
|
|
var_1 = getnode( "combat_one_door_node2", "targetname" );
|
|
var_2 = getnode( "combat_one_door_node3", "targetname" );
|
|
var_3 = getnode( "combat_one_door_node4", "targetname" );
|
|
var_4 = maps\loki_util::spawn_space_ai_from_targetname( "combat_one_wave3_0" );
|
|
var_4.animname = "opfor1";
|
|
var_4 thread door_traversal_move( var_0 );
|
|
var_5 = maps\loki_util::spawn_space_ai_from_targetname( "combat_one_wave3_1" );
|
|
var_5.animname = "opfor2";
|
|
var_5 thread door_traversal_move( var_1 );
|
|
var_6 = maps\loki_util::spawn_space_ai_from_targetname( "combat_one_wave3_2" );
|
|
var_6.animname = "opfor3";
|
|
var_6 thread door_traversal_move( var_2 );
|
|
var_7 = maps\loki_util::spawn_space_ai_from_targetname( "combat_one_wave3_3" );
|
|
var_7.animname = "opfor4";
|
|
var_7 thread door_traversal_move( var_3 );
|
|
common_scripts\utility::flag_set( "door_traversal_done" );
|
|
level.combat_one_door_node maps\_anim::anim_single_solo( level.combat_one_door, "combat_one_door" );
|
|
level.combat_one_door_col connectpaths();
|
|
}
|
|
|
|
door_traversal_move( var_0 )
|
|
{
|
|
self.health = 300;
|
|
self.fixednode = 1;
|
|
self.allowdeath = 1;
|
|
self.ignoreme = 1;
|
|
thread force_traversal_check_hit();
|
|
level.combat_one_door_node maps\_anim::anim_single_solo( self, "combat_one_door" );
|
|
var_0 connectnode();
|
|
|
|
if ( isalive( self ) )
|
|
{
|
|
self notify( "door_traversal_finished" );
|
|
self notify( "stop_traversal_hit_detection" );
|
|
thread combat_one_enemy();
|
|
maps\_utility::delaythread( 15, maps\_utility::set_fixednode_false );
|
|
maps\_utility::delaythread( 15, maps\loki_util::jkuprint, self.animname + " free!" );
|
|
self.health = 150;
|
|
self.ignoreme = 0;
|
|
}
|
|
|
|
self setgoalnode( var_0 );
|
|
}
|
|
|
|
check_for_death_during_traversal()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "door_traversal_finished" );
|
|
|
|
while ( self.health > 1 )
|
|
self waittill( "damage", var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
|
|
|
|
self stopanimscripted();
|
|
}
|
|
|
|
ignore_and_move_fast( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
var_1 = self.health;
|
|
self.health = 9999;
|
|
self.ignoreme = 1;
|
|
self.ignoreall = 1;
|
|
var_2 = self.moveplaybackrate;
|
|
self.moveplaybackrate = 1.5;
|
|
|
|
if ( isdefined( var_0 ) )
|
|
self setgoalvolumeauto( getent( var_0, "targetname" ) );
|
|
|
|
wait 1.5;
|
|
self.health = var_1;
|
|
self.ignoreme = 0;
|
|
self.ignoreall = 0;
|
|
self.moveplaybackrate = var_2;
|
|
}
|
|
|
|
die_from_explosion()
|
|
{
|
|
self endon( "death" );
|
|
|
|
if ( isalive( self ) )
|
|
{
|
|
maps\_anim::anim_generic( self, "explosion_part1" );
|
|
self kill();
|
|
}
|
|
}
|
|
|
|
get_all_wave_guys( var_0 )
|
|
{
|
|
var_1 = maps\_utility::get_ai_group_ai( "combat_one_wave1" );
|
|
var_2 = maps\_utility::get_ai_group_ai( "combat_one_wave2" );
|
|
var_1 = maps\_utility::array_merge( var_1, var_2 );
|
|
|
|
if ( isdefined( var_0 ) && var_0 )
|
|
{
|
|
var_3 = maps\_utility::get_ai_group_ai( "combat_one_wave3" );
|
|
var_1 = maps\_utility::array_merge( var_1, var_3 );
|
|
}
|
|
|
|
var_1 = maps\_utility::array_removedead_or_dying( var_1 );
|
|
return var_1;
|
|
}
|
|
|
|
get_all_allies()
|
|
{
|
|
var_0 = level.allies;
|
|
var_1 = level.redshirts;
|
|
var_0 = maps\_utility::array_merge( var_0, var_1 );
|
|
var_0 = maps\_utility::array_removedead_or_dying( var_0 );
|
|
return var_0;
|
|
}
|
|
|
|
unlink_final_exposed_nodes()
|
|
{
|
|
var_0 = getnodearray( "combat_one_final_exposed_node", "targetname" );
|
|
|
|
foreach ( var_2 in var_0 )
|
|
var_2 disconnectnode();
|
|
}
|
|
|
|
link_final_exposed_nodes()
|
|
{
|
|
var_0 = getnodearray( "combat_one_final_exposed_node", "targetname" );
|
|
|
|
foreach ( var_2 in var_0 )
|
|
var_2 connectnode();
|
|
}
|
|
|
|
unlink_door_traversal_nodes()
|
|
{
|
|
var_0 = getnode( "combat_one_door_node1", "targetname" );
|
|
var_1 = getnode( "combat_one_door_node2", "targetname" );
|
|
var_2 = getnode( "combat_one_door_node3", "targetname" );
|
|
var_3 = getnode( "combat_one_door_node4", "targetname" );
|
|
var_0 disconnectnode();
|
|
var_1 disconnectnode();
|
|
var_2 disconnectnode();
|
|
var_3 disconnectnode();
|
|
}
|
|
|
|
force_traversal( var_0, var_1, var_2, var_3 )
|
|
{
|
|
level endon( "explosion" );
|
|
var_4 = getnode( var_1, "targetname" );
|
|
var_5 = getent( var_0, "targetname" );
|
|
|
|
if ( !isdefined( var_2 ) )
|
|
var_6 = undefined;
|
|
else
|
|
var_6 = getnode( var_2, "targetname" );
|
|
|
|
var_7 = get_all_allies();
|
|
|
|
foreach ( var_9 in var_7 )
|
|
{
|
|
maps\loki_util::jkuprint( var_9.animname + ": " + distance( var_9.origin, var_4.origin ) );
|
|
|
|
if ( distance( var_9.origin, var_4.origin ) < 40 )
|
|
{
|
|
maps\loki_util::jkuprint( var_9.animname + ": near node" );
|
|
var_9 endon( "death" );
|
|
var_9.ignoreme = 1;
|
|
var_9 thread force_traversal_check_hit();
|
|
var_5 maps\_anim::anim_generic_reach( var_9, var_3 );
|
|
var_5 maps\_anim::anim_generic( var_9, var_3 );
|
|
var_9.ignoreme = 0;
|
|
var_9 notify( "stop_traversal_hit_detection" );
|
|
|
|
if ( isdefined( var_6 ) )
|
|
var_9 setgoalnode( var_6 );
|
|
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#using_animtree("generic_human");
|
|
|
|
force_traversal_check_hit()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "stop_traversal_hit_detection" );
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "damage", var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
|
|
maps\loki_util::jkuprint( self.animname + " hit while in traversal" );
|
|
self setanimrestart( %loki_traversal_pain_1, 1, 0.2 );
|
|
wait 0.5;
|
|
}
|
|
}
|
|
|
|
player_in_combat_area()
|
|
{
|
|
for (;;)
|
|
{
|
|
if ( common_scripts\utility::flag( "in_combat_area" ) )
|
|
iprintln( "player safe" );
|
|
|
|
common_scripts\utility::waitframe();
|
|
}
|
|
}
|
|
|
|
solarpanels_damage_think()
|
|
{
|
|
level endon( "explosion" );
|
|
level.player endon( "death" );
|
|
self setcandamage( 1 );
|
|
self waittill( "damage", var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10 );
|
|
|
|
if ( var_0 < 200 )
|
|
{
|
|
wait 0.1;
|
|
|
|
if ( randomint( 3 ) == 0 )
|
|
self waittill( "damage", var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10 );
|
|
}
|
|
|
|
var_11 = getglass( self.target );
|
|
destroyglass( var_11, var_2 );
|
|
solarpanel_disconnect_nodes();
|
|
}
|
|
|
|
solarpanels_damage_think_instant()
|
|
{
|
|
level endon( "explosion" );
|
|
level.player endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
var_0 = getglass( self.target );
|
|
|
|
if ( isglassdestroyed( var_0 ) )
|
|
break;
|
|
|
|
common_scripts\utility::waitframe();
|
|
}
|
|
|
|
solarpanel_disconnect_nodes();
|
|
}
|
|
|
|
solarpanel_disconnect_nodes()
|
|
{
|
|
var_0 = getnodesinradius( self.origin, 48, 0, 48, "cover" );
|
|
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
var_2 disconnectnode();
|
|
badplace_cylinder( "foo", 0, var_2.origin, 48, 48, "axis", "allies" );
|
|
var_3 = get_all_wave_guys();
|
|
|
|
foreach ( var_5 in var_3 )
|
|
{
|
|
if ( var_5 nearnode( var_2 ) )
|
|
maps\loki_util::jkuprint( "crap my node sucks now" );
|
|
}
|
|
}
|
|
|
|
self hide();
|
|
self notsolid();
|
|
}
|
|
|
|
random_explosions( var_0, var_1, var_2 )
|
|
{
|
|
level.player endon( "death" );
|
|
level endon( "stop_explosions" );
|
|
playfx( common_scripts\utility::getfx( "fuel_explosion_zerog" ), var_0 );
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
earthquake( 0.6, 1, level.player.origin, 1600 );
|
|
|
|
for (;;)
|
|
{
|
|
wait( randomfloatrange( 1, 3 ) );
|
|
thread maps\loki_audio::sfx_gas_line_dist_explo( var_0 );
|
|
|
|
if ( isdefined( var_2 ) )
|
|
playfx( common_scripts\utility::getfx( "fuel_explosion_zerog" ), var_0 );
|
|
else
|
|
playfx( common_scripts\utility::getfx( "explosion_small" ), var_0 );
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
earthquake( 0.3, 1, level.player.origin, 1600 );
|
|
}
|
|
}
|
|
|
|
track_player_hiding()
|
|
{
|
|
var_0 = getentarray( "combat_one_hide", "targetname" );
|
|
level.hiding_icon = maps\_hud_util::createicon( "green_block", 16, 16 );
|
|
level.hiding_icon.alignx = "right";
|
|
level.hiding_icon.aligny = "middle";
|
|
level.hiding_icon.vertalign = "top";
|
|
level.hiding_icon.alpha = 0;
|
|
level.hiding_icon.hidewhendead = 0;
|
|
level.hiding_icon.hidewheninmenu = 0;
|
|
level.hiding_icon.sort = -205;
|
|
level.hiding_icon.foreground = 1;
|
|
level thread set_player_hidden();
|
|
}
|
|
|
|
track_hiding_think()
|
|
{
|
|
self endon( "death" );
|
|
level.last_used_cover_vol = 0;
|
|
|
|
for (;;)
|
|
{
|
|
if ( level.player istouching( self ) && self != level.last_used_cover_vol )
|
|
{
|
|
common_scripts\utility::flag_set( "combat_one_player_hiding" );
|
|
level.hiding_icon.alpha = 0.8;
|
|
}
|
|
else if ( level.player istouching( self ) )
|
|
{
|
|
|
|
}
|
|
else if ( level.player_in_cover )
|
|
{
|
|
common_scripts\utility::flag_clear( "combat_one_player_hiding" );
|
|
level.player_in_cover = 0;
|
|
level.hiding_icon.alpha = 0.0;
|
|
}
|
|
|
|
common_scripts\utility::waitframe();
|
|
}
|
|
}
|
|
|
|
set_player_hidden()
|
|
{
|
|
level.player endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
common_scripts\utility::flag_wait( "combat_one_player_hiding" );
|
|
level.hiding_icon.alpha = 0.8;
|
|
level.player.ignoreme = 1;
|
|
common_scripts\utility::flag_waitopen( "combat_one_player_hiding" );
|
|
level.hiding_icon.alpha = 0;
|
|
level.player.ignoreme = 0;
|
|
}
|
|
}
|
|
|
|
do_tile_single( var_0, var_1 )
|
|
{
|
|
get_touching_tiles( var_0 );
|
|
get_edge_tiles( var_1 );
|
|
self.tilealive = 1;
|
|
self setcandamage( 1 );
|
|
self endon( "tileDeath" );
|
|
var_2 = undefined;
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "damage", var_3, var_4, var_5, var_2, var_6, var_7, var_8, var_9, var_10, var_11 );
|
|
|
|
if ( var_6 == "MOD_GRENADE_SPLASH" || var_6 == "MOD_EXPLOSIVE" )
|
|
{
|
|
if ( var_6 == "MOD_EXPLOSIVE" && var_4.classname == "script_model" )
|
|
var_2 = var_4 getcentroid();
|
|
|
|
thread dogrenadesplash( var_2 );
|
|
continue;
|
|
}
|
|
|
|
if ( level.activebreaks < 10 )
|
|
break;
|
|
}
|
|
|
|
thread tile_death( var_2 );
|
|
}
|
|
|
|
dogrenadesplash( var_0 )
|
|
{
|
|
if ( level.grenadesplashing )
|
|
return;
|
|
|
|
level.grenadesplashing = 1;
|
|
var_1 = common_scripts\utility::get_array_of_closest( var_0, getentarray( "breakTile", "targetname" ), undefined, 75 );
|
|
var_1 = featherents( var_1 );
|
|
common_scripts\utility::array_thread( var_1, ::tile_death, var_0 );
|
|
thread removegrenadesplash();
|
|
}
|
|
|
|
featherents( var_0 )
|
|
{
|
|
var_1 = 1;
|
|
var_2 = [];
|
|
|
|
foreach ( var_4 in var_0 )
|
|
{
|
|
if ( var_1 )
|
|
var_2[var_2.size] = var_4;
|
|
|
|
var_1 = !var_1;
|
|
}
|
|
|
|
return var_2;
|
|
}
|
|
|
|
removegrenadesplash()
|
|
{
|
|
wait 0.05;
|
|
level.grenadesplashing = 0;
|
|
}
|
|
|
|
get_touching_tiles( var_0 )
|
|
{
|
|
self.touchingtiles = [];
|
|
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
if ( var_2 istouchinglinktos( self ) && var_2 != self )
|
|
self.touchingtiles[self.touchingtiles.size] = var_2;
|
|
}
|
|
}
|
|
|
|
get_edge_tiles( var_0 )
|
|
{
|
|
self.edgetiles = [];
|
|
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
if ( var_2 istouchinglinktos( self ) && var_2 != self )
|
|
self.edgetiles[self.edgetiles.size] = var_2;
|
|
}
|
|
}
|
|
|
|
istouchinglinktos( var_0 )
|
|
{
|
|
return var_0 islinkedto( self ) || islinkedto( var_0 );
|
|
}
|
|
|
|
islinkedto( var_0 )
|
|
{
|
|
var_1 = common_scripts\utility::get_linked_ents();
|
|
|
|
foreach ( var_3 in var_1 )
|
|
{
|
|
if ( var_3 == var_0 )
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
tile_spider( var_0 )
|
|
{
|
|
if ( !self.tilealive )
|
|
return;
|
|
|
|
var_1 = spawnstruct();
|
|
var_1.basetile = self;
|
|
var_1.testedarray = [];
|
|
var_1.totestarray = self.touchingtiles;
|
|
var_1.foundwall = 0;
|
|
var_1.livingedgeconnections = 0;
|
|
|
|
foreach ( var_3 in self.touchingtiles )
|
|
{
|
|
if ( var_3.tilealive && var_3.edgetiles.size )
|
|
var_1.livingedgeconnections++;
|
|
}
|
|
|
|
while ( !var_1.foundwall && var_1.totestarray.size > 0 )
|
|
{
|
|
var_5 = var_1.totestarray[0];
|
|
var_1.totestarray = common_scripts\utility::array_remove( var_1.totestarray, var_5 );
|
|
|
|
if ( !var_5.tilealive )
|
|
continue;
|
|
|
|
var_5 tile_attached_to_edge( var_1 );
|
|
}
|
|
|
|
if ( var_1.foundwall && nonedgemaintains( var_1 ) )
|
|
return;
|
|
|
|
thread tile_death( var_0 );
|
|
}
|
|
|
|
nonedgemaintains( var_0 )
|
|
{
|
|
if ( self.edgetiles.size > 0 )
|
|
return 1;
|
|
|
|
if ( var_0.livingedgeconnections > 1 )
|
|
return 1;
|
|
|
|
return 1;
|
|
}
|
|
|
|
tile_attached_to_edge( var_0 )
|
|
{
|
|
if ( common_scripts\utility::array_contains( var_0.testedarray, self ) )
|
|
return;
|
|
else
|
|
var_0.testedarray[var_0.testedarray.size] = self;
|
|
|
|
if ( self.edgetiles.size > 0 )
|
|
var_0.foundwall = 1;
|
|
|
|
foreach ( var_2 in self.touchingtiles )
|
|
{
|
|
if ( !var_2.tilealive )
|
|
continue;
|
|
|
|
if ( !common_scripts\utility::array_contains( var_0.testedarray, var_2 ) )
|
|
var_0.totestarray[var_0.totestarray.size] = var_2;
|
|
}
|
|
}
|
|
|
|
tile_death( var_0 )
|
|
{
|
|
if ( !self.tilealive )
|
|
return;
|
|
|
|
level.activebreaks = level.activebreaks + 1;
|
|
self notify( "tileDeath" );
|
|
self.tilealive = 0;
|
|
var_1 = var_0;
|
|
self rotatevelocity( var_1, 0.5 );
|
|
self movegravity( ( 0, 0, -3 ), 1 );
|
|
|
|
foreach ( var_3 in self.touchingtiles )
|
|
var_3 maps\_utility::delaythread( randomfloatrange( 0.05, 0.1 ), ::tile_spider, var_0 );
|
|
|
|
thread decrementlevelbreaks();
|
|
thread fallingtileeffect();
|
|
}
|
|
|
|
fallingtileeffect()
|
|
{
|
|
while ( self.origin[2] > -64 )
|
|
wait 0.05;
|
|
|
|
var_0 = maps\_utility::set_z( self.origin, -64 );
|
|
}
|
|
|
|
decrementlevelbreaks()
|
|
{
|
|
wait 0.05;
|
|
level.activebreaks--;
|
|
}
|
|
|
|
combat_one_cleanup()
|
|
{
|
|
var_0 = getentarray( "combat_one_cleanup", "script_noteworthy" );
|
|
maps\loki_util::jkuprint( var_0.size + ": combat one ents cleaned up" );
|
|
}
|
|
|
|
firstframe_combat_one_door()
|
|
{
|
|
level.combat_one_door_node = getent( "combat_one_door_traversal", "targetname" );
|
|
level.combat_one_door = maps\_utility::spawn_anim_model( "combat_one_door" );
|
|
level.combat_one_door_node thread maps\_anim::anim_first_frame_solo( level.combat_one_door, "combat_one_door" );
|
|
level.combat_one_door_col = getent( "combat_one_door_col", "targetname" );
|
|
level.combat_one_door_col linkto( level.combat_one_door );
|
|
level.combat_one_door_col disconnectpaths();
|
|
}
|
|
|
|
track_fuel_leak_hit()
|
|
{
|
|
level endon( "explosion" );
|
|
var_0 = getent( "fuel_leak_col", "targetname" );
|
|
var_0 setcandamage( 1 );
|
|
var_0 setcanradiusdamage( 0 );
|
|
level.bullet_caused_fuel_leaks = [];
|
|
|
|
for (;;)
|
|
{
|
|
var_0 waittill( "damage", var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_11 );
|
|
var_12 = vectortoangles( var_3 * -1 );
|
|
level thread line_debug( var_4, var_4 + anglestoforward( var_12 ) * 12, ( 1, 1, 1 ) );
|
|
var_13 = bullettrace( var_4 + anglestoforward( var_12 ) * 1, var_4, 0 );
|
|
var_12 = vectortoangles( var_13["normal"] );
|
|
|
|
if ( distance( var_12, vectortoangles( var_3 ) ) < 1 )
|
|
{
|
|
maps\loki_util::jkuprint( "bad leak angles" );
|
|
level thread line_debug( var_4, var_4 + anglestoforward( var_12 ) * 12, ( 1, 0, 0 ) );
|
|
var_12 = vectortoangles( var_3 * -1 );
|
|
}
|
|
else
|
|
level thread line_debug( var_4, var_4 + anglestoforward( var_12 ) * 12, ( 0, 0, 1 ) );
|
|
|
|
var_14 = start_fuel_leak_fx( undefined, 1, var_4, var_12 );
|
|
level.bullet_caused_fuel_leaks[level.bullet_caused_fuel_leaks.size] = var_14;
|
|
|
|
if ( level.bullet_caused_fuel_leaks.size > 5 )
|
|
{
|
|
maps\loki_util::jkuprint( "deleting leak" );
|
|
level.bullet_caused_fuel_leaks[0] notify( "death" );
|
|
level.bullet_caused_fuel_leaks = maps\_utility::array_remove_index( level.bullet_caused_fuel_leaks, 0 );
|
|
}
|
|
|
|
maps\loki_util::jkuprint( "hits: " + level.bullet_caused_fuel_leaks.size );
|
|
wait 0.3;
|
|
}
|
|
}
|
|
|
|
line_debug( var_0, var_1, var_2 )
|
|
{
|
|
for ( var_3 = 0; var_3 < 1000; var_3++ )
|
|
{
|
|
maps\loki_util::jkuline( var_0, var_1, var_2 );
|
|
common_scripts\utility::waitframe();
|
|
}
|
|
}
|