557 lines
13 KiB
Plaintext
557 lines
13 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
init_container_spawn()
|
|
{
|
|
if ( maps\mp\alien\_utility::is_chaos_mode() )
|
|
return;
|
|
|
|
if ( !isdefined( level.container_spawn_table ) )
|
|
return;
|
|
|
|
if ( !isdefined( level.max_damage_based_container ) )
|
|
level.max_damage_based_container = 3;
|
|
|
|
level.num_damage_based_container = 0;
|
|
init_warning_sounds();
|
|
}
|
|
|
|
activate_container_spawners_in_area( var_0 )
|
|
{
|
|
if ( maps\mp\alien\_utility::is_chaos_mode() )
|
|
return;
|
|
|
|
var_1 = select_container_structs_in_area( var_0 );
|
|
|
|
foreach ( var_3 in var_1 )
|
|
{
|
|
var_4 = var_3.script_noteworthy;
|
|
|
|
if ( should_activate_container_in_area( var_3, var_4 ) )
|
|
var_3 thread activate_container( var_3, var_4 );
|
|
}
|
|
}
|
|
|
|
activate_container_spawner_by_id( var_0 )
|
|
{
|
|
if ( maps\mp\alien\_utility::is_chaos_mode() )
|
|
return;
|
|
|
|
var_1 = common_scripts\utility::getstructarray( "container_spawn", "targetname" );
|
|
|
|
foreach ( var_3 in var_1 )
|
|
{
|
|
if ( already_activated( var_3 ) )
|
|
continue;
|
|
|
|
var_4 = var_3.script_noteworthy;
|
|
|
|
if ( var_4 == var_0 )
|
|
var_3 thread activate_container( var_3, var_4 );
|
|
}
|
|
}
|
|
|
|
activate_container( var_0, var_1 )
|
|
{
|
|
if ( maps\mp\alien\_utility::is_chaos_mode() )
|
|
return;
|
|
|
|
var_0 endon( "death" );
|
|
level endon( "game_ended" );
|
|
var_0.activated = 1;
|
|
var_2 = get_activation_method( var_1 );
|
|
|
|
switch ( var_2 )
|
|
{
|
|
case "proximity":
|
|
wait_trigger_activate( var_0, var_1 );
|
|
break;
|
|
case "damage":
|
|
wait_damage_activate( var_0, var_1 );
|
|
break;
|
|
case "notify":
|
|
wait_notify_activate( var_1 );
|
|
break;
|
|
}
|
|
|
|
spawn_alien_from_container( var_0, var_1 );
|
|
deactivate_container( var_0 );
|
|
}
|
|
|
|
spawn_alien_from_container( var_0, var_1 )
|
|
{
|
|
var_2 = 0.2;
|
|
var_3 = 10;
|
|
var_4 = common_scripts\utility::getstructarray( var_0.target, "targetname" );
|
|
var_4 = sort_based_on_priority( var_4, var_1 );
|
|
var_5 = get_spawn_info( var_1, var_4.size );
|
|
var_6 = get_should_force_spawn( var_1 );
|
|
var_7 = var_5.size;
|
|
|
|
if ( var_6 )
|
|
{
|
|
for ( var_7 = maps\mp\alien\_spawn_director::reserve_custom_spawn_space( var_7, 0 ); var_7 <= 0; var_7 = maps\mp\alien\_spawn_director::reserve_custom_spawn_space( var_7, 0 ) )
|
|
common_scripts\utility::waitframe();
|
|
}
|
|
else
|
|
var_7 = maps\mp\alien\_spawn_director::reserve_custom_spawn_space( var_7, 1 );
|
|
|
|
if ( var_7 > 0 )
|
|
{
|
|
maps\mp\alien\_spawn_director::pause_cycle( var_3 );
|
|
play_warning_sfx( var_4, var_5, var_1 );
|
|
}
|
|
|
|
for ( var_8 = 0; var_8 < var_7; var_8++ )
|
|
{
|
|
var_9 = var_4[var_8];
|
|
var_10 = var_5[var_8];
|
|
var_11 = maps\mp\alien\_spawn_director::process_intro_vignette_ai_type( var_10 );
|
|
var_12 = level.cycle_data.spawn_node_info[var_9.script_noteworthy].vignetteinfo[var_11];
|
|
var_13 = maps\mp\alien\_spawn_director::process_custom_spawn( var_10, var_9, var_12 );
|
|
|
|
if ( isdefined( var_13 ) )
|
|
mark_spawn_clips_on( var_13, var_0 );
|
|
|
|
wait( var_2 );
|
|
}
|
|
}
|
|
|
|
play_warning_sfx( var_0, var_1, var_2 )
|
|
{
|
|
var_3 = var_0[0].origin;
|
|
var_4 = spawn( "script_origin", var_3 );
|
|
var_5 = level.container_warning_sounds[var_1[0]];
|
|
var_6 = "emt_aln_arm_crate_alarm_lp";
|
|
|
|
if ( isdefined( var_5 ) && get_should_play_warning_spawn( var_2 ) )
|
|
{
|
|
var_7 = lookupsoundlength( var_5 ) / 1000;
|
|
var_4 playsound( var_5 );
|
|
wait( var_7 );
|
|
var_4 stopsounds();
|
|
}
|
|
|
|
var_7 = 5;
|
|
var_4 common_scripts\utility::delaycall( var_7 + 1, ::delete );
|
|
|
|
if ( isdefined( var_6 ) && get_should_play_alarm_spawn( var_2 ) )
|
|
{
|
|
var_4 common_scripts\utility::delaycall( var_7, ::stoploopsound );
|
|
var_4 playloopsound( var_6 );
|
|
}
|
|
}
|
|
|
|
init_warning_sounds()
|
|
{
|
|
if ( !isdefined( level.container_warning_sounds ) )
|
|
{
|
|
level.container_warning_sounds["elite"] = "scn_arm_crate_queen";
|
|
level.container_warning_sounds["spitter"] = "scn_arm_crate_spitter";
|
|
level.container_warning_sounds["brute"] = "scn_arm_crate_brute";
|
|
level.container_warning_sounds["locust"] = "scn_arm_crate_brute";
|
|
}
|
|
}
|
|
|
|
wait_trigger_activate( var_0, var_1 )
|
|
{
|
|
var_2 = 1.0;
|
|
var_3 = get_activation_trigger( var_0 );
|
|
var_3 endon( "death" );
|
|
var_3 endon( "timed_out" );
|
|
var_4 = get_trigger_chance( var_1 );
|
|
var_5 = get_time_before_auto_trigger_array( var_1 );
|
|
var_3 thread notify_on_timeout( "timed_out", var_5 );
|
|
|
|
for (;;)
|
|
{
|
|
var_3 waittill( "trigger", var_6 );
|
|
|
|
if ( !isplayer( var_6 ) )
|
|
{
|
|
common_scripts\utility::waitframe();
|
|
continue;
|
|
}
|
|
|
|
if ( randomintrange( 0, 100 ) <= var_4 )
|
|
return;
|
|
else
|
|
wait( var_2 );
|
|
}
|
|
}
|
|
|
|
notify_on_timeout( var_0, var_1 )
|
|
{
|
|
if ( var_1[0] >= 0 )
|
|
{
|
|
var_2 = randomintrange( var_1[0], var_1[1] );
|
|
wait( var_2 );
|
|
self notify( var_0 );
|
|
}
|
|
}
|
|
|
|
wait_damage_activate( var_0, var_1 )
|
|
{
|
|
var_2 = get_attackable_ent( var_0, var_1 );
|
|
var_2 endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
var_2 waittill( "damage", var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_11, var_12 );
|
|
|
|
if ( isagent( var_4 ) )
|
|
{
|
|
var_2.fake_health = var_2.fake_health - var_3;
|
|
|
|
if ( var_2.fake_health <= 0 )
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
wait_notify_activate( var_0 )
|
|
{
|
|
var_1 = get_notify_message( var_0 );
|
|
level waittill( var_1 );
|
|
}
|
|
|
|
get_attackable_ent( var_0, var_1 )
|
|
{
|
|
level.num_damage_based_container++;
|
|
var_2 = spawn( "script_model", var_0.origin );
|
|
var_2.health = 999999;
|
|
var_2.fake_health = get_container_health( var_1 );
|
|
var_2 setcandamage( 1 );
|
|
var_2 setcanradiusdamage( 1 );
|
|
var_2 makeentitysentient( "allies", 1 );
|
|
var_2.threatbias = get_threat_bias( var_1 );
|
|
var_0.attackable_ent = var_2;
|
|
return var_2;
|
|
}
|
|
|
|
deactivate_container_spawners_in_area( var_0 )
|
|
{
|
|
if ( maps\mp\alien\_utility::is_chaos_mode() )
|
|
return;
|
|
|
|
var_1 = select_container_structs_in_area( var_0 );
|
|
|
|
foreach ( var_3 in var_1 )
|
|
deactivate_container( var_3 );
|
|
}
|
|
|
|
deactivate_container( var_0 )
|
|
{
|
|
if ( maps\mp\alien\_utility::is_chaos_mode() )
|
|
return;
|
|
|
|
var_1 = getentarray( var_0.target, "targetname" );
|
|
|
|
foreach ( var_3 in var_1 )
|
|
{
|
|
if ( is_clip( var_3 ) )
|
|
continue;
|
|
|
|
var_3 delete();
|
|
}
|
|
|
|
if ( isdefined( var_0.attackable_ent ) )
|
|
{
|
|
var_0.attackable_ent freeentitysentient();
|
|
var_0.attackable_ent delete();
|
|
level.num_damage_based_container--;
|
|
}
|
|
|
|
var_0 notify( "death" );
|
|
}
|
|
|
|
get_activation_method( var_0 )
|
|
{
|
|
var_1 = [ "damage", "proximity", "notify" ];
|
|
var_2 = get_proximity_weight( var_0 );
|
|
var_3 = get_notify_weight( var_0 );
|
|
|
|
if ( at_max_damage_based_container() )
|
|
var_4 = 0;
|
|
else
|
|
var_4 = get_damage_weight( var_0 );
|
|
|
|
var_5 = [ var_4, var_2, var_3 ];
|
|
var_6 = maps\mp\alien\_utility::getrandomindex( var_5 );
|
|
return var_1[var_6];
|
|
}
|
|
|
|
select_container_structs_in_area( var_0 )
|
|
{
|
|
var_1 = getent( var_0, "targetname" );
|
|
var_2 = [];
|
|
var_3 = common_scripts\utility::getstructarray( "container_spawn", "targetname" );
|
|
|
|
foreach ( var_5 in var_3 )
|
|
{
|
|
if ( ispointinvolume( var_5.origin, var_1 ) )
|
|
var_2[var_2.size] = var_5;
|
|
}
|
|
|
|
return var_2;
|
|
}
|
|
|
|
get_activation_trigger( var_0 )
|
|
{
|
|
var_1 = getentarray( var_0.target, "targetname" );
|
|
|
|
foreach ( var_3 in var_1 )
|
|
{
|
|
if ( var_3.classname == "trigger_multiple" )
|
|
return var_3;
|
|
}
|
|
}
|
|
|
|
should_activate_container_in_area( var_0, var_1 )
|
|
{
|
|
if ( should_skip_area_activation( var_1 ) || already_activated( var_0 ) )
|
|
return 0;
|
|
|
|
return should_activated_by_chance( var_1 );
|
|
}
|
|
|
|
should_skip_area_activation( var_0 )
|
|
{
|
|
if ( !isdefined( level.should_skip_area_activation_func ) )
|
|
return 0;
|
|
|
|
return [[ level.should_skip_area_activation_func ]]( var_0 );
|
|
}
|
|
|
|
already_activated( var_0 )
|
|
{
|
|
return maps\mp\alien\_utility::is_true( var_0.activated );
|
|
}
|
|
|
|
should_activated_by_chance( var_0 )
|
|
{
|
|
var_1 = get_activate_chance( var_0 );
|
|
var_2 = randomintrange( 0, 100 );
|
|
return var_2 < var_1;
|
|
}
|
|
|
|
get_spawn_info( var_0, var_1 )
|
|
{
|
|
var_2 = get_spawn_types( var_0 );
|
|
var_3 = get_spawn_type_weights( var_0 );
|
|
var_4 = get_spawn_quantity( var_0 );
|
|
var_5 = maps\mp\alien\_utility::getrandomindex( var_3 );
|
|
var_2 = strtok( var_2[var_5], "-" );
|
|
var_4 = strtok( var_4[var_5], "-" );
|
|
var_6 = [];
|
|
|
|
for ( var_7 = 0; var_7 < var_2.size; var_7++ )
|
|
{
|
|
var_8 = int( var_4[var_7] );
|
|
|
|
if ( var_8 > 1 )
|
|
var_8 = 1 + randomintrange( 0, var_8 );
|
|
|
|
for ( var_9 = 0; var_9 < var_8; var_9++ )
|
|
var_6[var_6.size] = var_2[var_7];
|
|
}
|
|
|
|
return var_6;
|
|
}
|
|
|
|
sort_based_on_priority( var_0, var_1 )
|
|
{
|
|
var_2 = get_spawner_id_array( var_1 );
|
|
var_3 = get_spawner_priority_array( var_1 );
|
|
var_0 = assign_spawn_priority( var_0, var_2, var_3 );
|
|
var_0 = common_scripts\utility::array_sort_with_func( var_0, ::is_higher_priority );
|
|
return var_0;
|
|
}
|
|
|
|
is_higher_priority( var_0, var_1 )
|
|
{
|
|
return var_0.priority > var_1.priority;
|
|
}
|
|
|
|
assign_spawn_priority( var_0, var_1, var_2 )
|
|
{
|
|
foreach ( var_4 in var_0 )
|
|
var_4.priority = get_spawn_priority( var_4, var_1, var_2 );
|
|
|
|
return var_0;
|
|
}
|
|
|
|
get_spawn_priority( var_0, var_1, var_2 )
|
|
{
|
|
foreach ( var_5, var_4 in var_1 )
|
|
{
|
|
if ( var_0.script_noteworthy == var_4 )
|
|
return var_2[var_5];
|
|
}
|
|
}
|
|
|
|
at_max_damage_based_container()
|
|
{
|
|
return level.num_damage_based_container >= level.max_damage_based_container;
|
|
}
|
|
|
|
get_activate_chance( var_0 )
|
|
{
|
|
return get_container_info( var_0, 1, 1 );
|
|
}
|
|
|
|
get_proximity_weight( var_0 )
|
|
{
|
|
return get_container_info( var_0, 2, 1 );
|
|
}
|
|
|
|
get_damage_weight( var_0 )
|
|
{
|
|
return get_container_info( var_0, 3, 1 );
|
|
}
|
|
|
|
get_notify_weight( var_0 )
|
|
{
|
|
return get_container_info( var_0, 4, 1 );
|
|
}
|
|
|
|
get_trigger_chance( var_0 )
|
|
{
|
|
return get_container_info( var_0, 5, 1 );
|
|
}
|
|
|
|
get_container_health( var_0 )
|
|
{
|
|
return get_container_info( var_0, 6, 1 );
|
|
}
|
|
|
|
get_threat_bias( var_0 )
|
|
{
|
|
return get_container_info( var_0, 7, 1 );
|
|
}
|
|
|
|
get_notify_message( var_0 )
|
|
{
|
|
return get_container_info( var_0, 8, 0 );
|
|
}
|
|
|
|
get_spawn_types( var_0 )
|
|
{
|
|
return get_container_info_array( var_0, 9, 0 );
|
|
}
|
|
|
|
get_spawn_type_weights( var_0 )
|
|
{
|
|
return get_container_info_array( var_0, 10, 1 );
|
|
}
|
|
|
|
get_spawn_quantity( var_0 )
|
|
{
|
|
return get_container_info_array( var_0, 11, 0 );
|
|
}
|
|
|
|
get_should_force_spawn( var_0 )
|
|
{
|
|
return get_container_info( var_0, 12, 0 ) == "true";
|
|
}
|
|
|
|
get_spawner_id_array( var_0 )
|
|
{
|
|
return get_container_info_array( var_0, 13, 0 );
|
|
}
|
|
|
|
get_spawner_priority_array( var_0 )
|
|
{
|
|
return get_container_info_array( var_0, 14, 1 );
|
|
}
|
|
|
|
get_should_play_alarm_spawn( var_0 )
|
|
{
|
|
return get_container_info( var_0, 15, 0 ) == "true";
|
|
}
|
|
|
|
get_should_play_warning_spawn( var_0 )
|
|
{
|
|
return get_container_info( var_0, 16, 0 ) == "true";
|
|
}
|
|
|
|
get_time_before_auto_trigger_array( var_0 )
|
|
{
|
|
return get_container_info_array( var_0, 17, 1 );
|
|
}
|
|
|
|
get_container_info( var_0, var_1, var_2 )
|
|
{
|
|
var_3 = tablelookup( level.container_spawn_table, 0, var_0, var_1 );
|
|
|
|
if ( var_2 )
|
|
var_3 = int( var_3 );
|
|
|
|
return var_3;
|
|
}
|
|
|
|
get_container_info_array( var_0, var_1, var_2 )
|
|
{
|
|
var_3 = tablelookup( level.container_spawn_table, 0, var_0, var_1 );
|
|
var_3 = strtok( var_3, " " );
|
|
|
|
if ( var_2 )
|
|
{
|
|
foreach ( var_6, var_5 in var_3 )
|
|
var_3[var_6] = int( var_5 );
|
|
}
|
|
|
|
return var_3;
|
|
}
|
|
|
|
mark_spawn_clips_on( var_0, var_1 )
|
|
{
|
|
var_2 = getentarray( var_1.target, "targetname" );
|
|
var_3 = [];
|
|
|
|
foreach ( var_5 in var_2 )
|
|
{
|
|
if ( is_clip( var_5 ) )
|
|
var_3[var_3.size] = var_5;
|
|
}
|
|
|
|
var_0.intro_clips = var_3;
|
|
}
|
|
|
|
is_clip( var_0 )
|
|
{
|
|
return var_0.classname == "script_brushmodel";
|
|
}
|
|
|
|
container_spawn_hive_monitor( var_0 )
|
|
{
|
|
level endon( "game_ended" );
|
|
|
|
for (;;)
|
|
{
|
|
level waittill( "drill_planted" );
|
|
activate_container_spawn_for_hive( level.current_hive_name, var_0 );
|
|
}
|
|
}
|
|
|
|
activate_container_spawn_for_hive( var_0, var_1 )
|
|
{
|
|
var_2 = get_container_id_list_for_hive( var_0, var_1 );
|
|
|
|
foreach ( var_4 in var_2 )
|
|
activate_container_spawner_by_id( var_4 );
|
|
}
|
|
|
|
get_container_id_list_for_hive( var_0, var_1 )
|
|
{
|
|
var_2 = [];
|
|
|
|
foreach ( var_5, var_4 in var_1 )
|
|
{
|
|
if ( common_scripts\utility::array_contains( var_4, var_0 ) )
|
|
var_2[var_2.size] = var_5;
|
|
}
|
|
|
|
return var_2;
|
|
}
|