iw6-scripts/maps/black_ice_util_ai.gsc
2024-02-13 13:20:49 +01:00

752 lines
19 KiB
Plaintext

// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
ally_advance_watcher( var_0, var_1, var_2, var_3 )
{
var_4 = [];
if ( isarray( self ) )
var_4 = self;
else
var_4[0] = self;
level notify( var_0 + "kill" );
level endon( var_0 + "kill" );
if ( !common_scripts\utility::flag_exist( "flag_allies_moving" ) )
common_scripts\utility::flag_init( "flag_allies_moving" );
if ( !common_scripts\utility::flag_exist( "flag_allies_player_near" ) )
common_scripts\utility::flag_init( "flag_allies_player_near" );
var_5 = getent( var_0, "script_noteworthy" );
if ( !isdefined( var_5 ) )
var_5 = getent( var_0, "targetname" );
var_6 = 1;
if ( isdefined( var_3 ) && var_3 )
var_6 = 0;
if ( isdefined( var_2 ) )
{
}
var_7 = [];
for (;;)
{
if ( isdefined( var_5.script_parameters ) )
var_5._delay = float( var_5.script_parameters );
else
var_5._delay = 0;
if ( isdefined( var_5.script_namenumber ) )
var_5._enemy_num = int( var_5.script_namenumber );
var_5._linked_triggers = [];
var_7 = common_scripts\utility::array_add( var_7, var_5 );
if ( isdefined( var_2 ) )
var_5.flag_end = var_2;
if ( isdefined( var_5.target ) )
{
var_8 = getentarray( var_5.target, "targetname" );
var_9 = undefined;
foreach ( var_11 in var_8 )
{
if ( var_11.classname == "trigger_multiple_friendly" && isdefined( var_9 ) )
continue;
if ( var_11.classname == "trigger_multiple_friendly" )
{
var_9 = var_11;
continue;
}
if ( issubstr( var_11.classname, "trigger" ) )
{
var_5._linked_triggers = common_scripts\utility::array_add( var_5._linked_triggers, var_11 );
continue;
}
}
if ( !isdefined( var_9 ) )
break;
var_5 = var_9;
continue;
}
break;
}
if ( !isdefined( level._ally_trigs ) )
level._ally_trigs = [];
level._ally_trigs[var_0] = var_7;
common_scripts\utility::flag_set( "flag_allies_player_near" );
common_scripts\utility::flag_init( var_0 );
for ( var_13 = 0; var_13 < var_7.size; var_13++ )
{
var_5 = var_7[var_13];
var_5._index = var_13;
if ( !isdefined( var_5.flag_end ) || isdefined( var_5.flag_end ) && !common_scripts\utility::flag( var_5.flag_end ) )
var_4 ally_advance( var_5, var_1 );
if ( var_13 == 0 )
common_scripts\utility::flag_set( var_0 );
if ( var_6 || isdefined( var_5.flag_end ) && common_scripts\utility::flag( var_5.flag_end ) )
{
if ( isdefined( var_5._linked_triggers ) )
{
foreach ( var_15 in var_5._linked_triggers )
{
if ( isdefined( var_15 ) && !issubstr( var_15.classname, "friendly" ) )
var_15 delete();
}
}
var_5 delete();
}
}
}
ally_advance( var_0, var_1 )
{
if ( isdefined( var_0.flag_end ) )
level endon( var_0.flag_end );
var_0 thread waittill_trig_or_time_out();
if ( isdefined( var_1 ) && isdefined( var_0._enemy_num ) )
var_0 thread waittill_enemy_num_remaining( var_1 );
var_0 waittill( "trigger" );
if ( var_0._linked_triggers.size > 0 )
{
foreach ( var_3 in var_0._linked_triggers )
var_3 notify( "trigger" );
}
var_0 thread waittill_allies_at_goal( self );
wait 0.05;
}
waittill_trig_or_time_out()
{
if ( isdefined( self.flag_end ) )
level endon( self.flag_end );
waittill_time_out();
common_scripts\utility::flag_wait( "flag_allies_player_near" );
self notify( "trigger" );
}
waittill_time_out()
{
self endon( "trigger" );
if ( isdefined( self.flag_end ) )
level endon( self.flag_end );
common_scripts\utility::flag_wait( "flag_allies_player_near" );
if ( self._delay == 0 )
self waittill( "trigger" );
else
wait( self._delay );
}
waittill_enemy_num_remaining( var_0 )
{
self endon( "trigger" );
if ( isdefined( self.flag_end ) )
level endon( self.flag_end );
common_scripts\utility::flag_wait( "flag_allies_player_near" );
var_1 = [];
if ( isstring( var_0 ) )
{
if ( isdefined( level._enemies[var_0] ) )
var_1 = level._enemies[var_0];
}
else
var_1 = var_0;
var_2 = abs( self._enemy_num );
var_3 = undefined;
var_4 = 0;
if ( var_2 != self._enemy_num )
var_3 = level.player.stats["kills"];
for (;;)
{
if ( isdefined( var_3 ) )
{
if ( level.player.stats["kills"] - var_3 >= var_2 )
break;
}
else
{
var_1 = maps\_utility::remove_dead_from_array( var_1 );
if ( var_1.size <= var_2 )
break;
}
wait 0.05;
}
self notify( "trigger" );
}
waittill_allies_at_goal( var_0 )
{
level notify( "notify_kill_allies_at_goal" );
level endon( "notify_kill_allies_at_goal" );
if ( isdefined( self.flag_end ) )
level endon( self.flag_end );
common_scripts\utility::flag_set( "flag_allies_moving" );
common_scripts\utility::flag_clear( "flag_allies_player_near" );
var_1 = self._index;
var_2 = spawnstruct();
var_2.threads = 0;
var_3 = [];
if ( isarray( var_0 ) )
var_3 = var_0;
else
var_3[0] = var_0;
foreach ( var_5 in var_3 )
{
var_5._old_goalradius = var_5.goalradius;
var_5.goalradius = 16;
var_5 thread common_scripts\utility::waittill_string( "goal", var_2 );
var_2.threads++;
}
while ( var_2.threads )
{
var_2 waittill( "returned" );
var_2.threads--;
}
var_2 notify( "die" );
foreach ( var_5 in var_3 )
var_5.goalradius = var_5._old_goalradius;
common_scripts\utility::flag_clear( "flag_allies_moving" );
var_3 waittill_proximity();
common_scripts\utility::flag_set( "flag_allies_player_near" );
}
waittill_proximity()
{
var_0 = 300;
if ( isdefined( level._ally_dist ) )
var_0 = level._ally_dist;
var_1 = var_0 * var_0;
for (;;)
{
foreach ( var_3 in self )
{
var_4 = distancesquared( var_3.origin, level.player.origin );
if ( var_4 <= var_1 )
return;
}
wait 0.5;
}
}
add_to_group( var_0, var_1 )
{
if ( !isdefined( level._enemies ) )
level._enemies = [];
if ( !isdefined( level._enemies[var_0] ) )
level._enemies[var_0] = [];
level._enemies[var_0] = common_scripts\utility::array_add( level._enemies[var_0], self );
self._current_index = var_0;
if ( !isdefined( self._current_goal_volume ) )
{
self notify( "stop_going_to_node" );
if ( isdefined( var_1 ) && !isstring( var_1 ) && !var_1 )
return;
else if ( isstring( var_1 ) )
thread go_to_goal_vol( var_1 );
else
{
var_2 = self getgoalvolume();
if ( isdefined( var_2 ) )
thread go_to_goal_vol( var_2 );
else if ( !isdefined( self.target ) && isdefined( level._retreat_current_volumes ) && isdefined( level._retreat_current_volumes[var_0] ) && level._retreat_current_volumes[var_0].size > 0 )
thread go_to_goal_vol();
}
}
}
check_enemy_index( var_0 )
{
}
retreat_watcher( var_0, var_1, var_2, var_3 )
{
check_vol_index( var_2 );
level notify( var_0 + "kill" );
level endon( var_0 + "kill" );
if ( !isdefined( level._retreat_volumes_list ) )
level._retreat_volumes_list = [];
if ( !isdefined( level._retreat_volumes_list[var_1] ) )
{
level._retreat_volumes_list[var_1] = [];
level._retreat_volumes_list[var_1] = build_vol_list( var_2 );
}
if ( !isdefined( level._retreat_current_volumes ) )
level._retreat_current_volumes = [];
if ( !isdefined( level._retreat_current_volumes[var_1] ) )
level._retreat_current_volumes[var_1] = var_2;
var_4 = getentarray( var_0, "script_noteworthy" );
if ( var_4.size == 0 )
var_4 = getentarray( var_0, "targetname" );
level._retreat_trigs[var_0] = var_4;
common_scripts\utility::array_thread( var_4, ::trigger_wait_retreat, var_1, var_3 );
}
trigger_wait_retreat( var_0, var_1 )
{
level endon( "notify_stop_retreat_all" );
self waittill( "trigger" );
var_2 = [];
if ( isarray( var_0 ) )
var_2 = var_0;
else if ( isstring( var_0 ) )
var_2[0] = var_0;
else
{
}
foreach ( var_4 in var_2 )
enemy_retreat( var_0, undefined, var_1 );
self delete();
}
enemy_retreat( var_0, var_1, var_2 )
{
check_enemy_index( var_0 );
level notify( "notify_kill_retreat" + var_0 );
level endon( "notify_kill_retreat" + var_0 );
var_3 = maps\_utility::remove_dead_from_array( level._enemies[var_0] );
var_3 = sortbydistance( var_3, level.player.origin );
var_4 = 0.05;
if ( isdefined( var_2 ) && var_2 > var_4 )
var_4 = var_2;
if ( level._retreat_volumes_list[var_0].size > 0 )
{
level._retreat_current_volumes[var_0] = level._retreat_volumes_list[var_0][0];
level._retreat_volumes_list[var_0] = maps\_utility::array_remove_index( level._retreat_volumes_list[var_0], 0 );
}
for ( var_5 = var_3.size - 1; var_5 >= 0; var_5-- )
{
var_3[var_5] thread go_to_goal_vol( var_1, var_4 );
var_4 = int( var_4 - var_4 / var_3.size );
}
}
go_to_goal_vol( var_0, var_1 )
{
if ( self._current_index == "seek" )
return 0;
self notify( "stop_go_to_goal_vol" );
wait 0.05;
self endon( "death" );
self endon( "stop_go_to_goal_vol" );
var_2 = choose_goal_vol( var_0 );
if ( !isdefined( var_2 ) )
return 0;
if ( isstring( var_2 ) && var_2 == "seek" )
{
self notify( "notify_stop_retreat" );
self._current_goal_volume = undefined;
self cleargoalvolume();
if ( isdefined( self._current_index ) )
{
level._enemies[self._current_index] = common_scripts\utility::array_remove( level._enemies[self._current_index], self );
add_to_group( "seek", 0 );
self._current_index = "seek";
}
thread maps\_utility::player_seek_enable();
}
else
{
var_3 = 0.05;
if ( isdefined( var_1 ) )
{
if ( var_1 >= var_3 )
wait( randomfloatrange( 0, var_1 ) );
}
else
wait( randomfloatrange( 0, var_3 ) );
if ( isdefined( self._current_index ) && isdefined( level._retreat_current_volumes ) && isdefined( level._retreat_current_volumes[self._current_index] ) && !current_vol_acceptable() )
add_to_standby();
else
self._retreat_standby = undefined;
maps\_utility::set_fixednode_false();
self._current_goal_volume = var_2;
self setgoalvolumeauto( var_2 );
}
return 1;
}
choose_goal_vol( var_0 )
{
var_1 = undefined;
if ( isdefined( var_0 ) )
var_1 = choose_goal_vol_chain( var_0 );
else if ( isdefined( level._retreat_final ) )
var_1 = choose_goal_vol_chain( level._retreat_final );
else if ( isdefined( self._current_goal_volume ) )
{
if ( current_vol_acceptable() )
return;
if ( isdefined( self._current_goal_volume._target_vols ) && self._current_goal_volume._target_vols.size > 0 )
{
var_2 = sortbydistance( self._current_goal_volume._target_vols, self.origin );
foreach ( var_4 in var_2 )
{
var_1 = choose_goal_vol_chain( var_4 );
if ( isdefined( var_1 ) )
break;
}
}
}
else if ( !isdefined( self._current_index ) )
{
foreach ( var_7 in level._vols )
{
foreach ( var_9 in var_7 )
{
if ( self istouching( var_9 ) )
var_1 = choose_goal_vol_chain( var_9 );
}
}
}
if ( !isdefined( var_1 ) )
{
if ( isdefined( self._current_index ) && isdefined( level._retreat_current_volumes ) && isdefined( level._retreat_current_volumes[self._current_index] ) )
var_1 = choose_goal_vol_chain( level._retreat_current_volumes[self._current_index] );
}
if ( isdefined( var_1 ) )
{
if ( isdefined( level._retreat_final ) )
{
thread ignore_to_goal();
var_12 = [ self ];
thread maps\_utility::ai_delete_when_out_of_sight( var_12, 256 );
level notify( "notify_stop_retreat_all" );
}
if ( isdefined( self._current_goal_volume ) && var_1 == self._current_goal_volume )
return;
update_vol_node_count( var_1 );
return var_1;
}
if ( isdefined( self._retreat_standby ) && self._retreat_standby )
add_to_standby();
else
{
}
}
current_vol_acceptable()
{
if ( isdefined( self._current_index ) )
{
if ( isdefined( level._retreat_current_volumes ) && isdefined( level._retreat_current_volumes[self._current_index] ) && level._retreat_current_volumes[self._current_index].size > 0 )
{
if ( self._current_goal_volume.script_noteworthy == level._retreat_current_volumes[self._current_index] )
return 1;
}
if ( isdefined( level._retreat_volumes_list[self._current_index] ) )
{
foreach ( var_1 in level._retreat_volumes_list[self._current_index] )
{
if ( self._current_goal_volume.script_noteworthy == var_1 )
return 1;
}
}
}
return 0;
}
choose_goal_vol_chain( var_0 )
{
var_1 = [];
if ( !isstring( var_0 ) )
{
var_2 = var_0;
if ( isdefined( var_2._num_ai ) && isdefined( var_2._max_ai ) )
{
if ( var_2._num_ai < var_2._max_ai )
return var_2;
}
var_1[0] = var_2;
}
else
{
check_vol_index( var_0 );
var_1 = level._vols[var_0];
var_1 = sortbydistance( var_1, self.origin );
foreach ( var_4 in var_1 )
{
if ( var_4._num_ai < var_4._max_ai )
return var_4;
}
}
foreach ( var_4 in var_1 )
{
if ( isdefined( var_4._target_vols ) && var_4._target_vols.size > 0 )
{
var_1 = sortbydistance( var_4._target_vols, self.origin );
foreach ( var_8 in var_1 )
{
var_2 = choose_goal_vol_chain( var_8 );
if ( isdefined( var_2 ) )
return var_2;
}
}
}
}
update_vol_node_count( var_0 )
{
if ( isdefined( self._current_goal_volume ) )
self._current_goal_volume._num_ai--;
self._current_goal_volume = var_0;
var_0._num_ai++;
thread deathfunc_vol_num_decrement( var_0 );
}
deathfunc_vol_num_decrement( var_0 )
{
self notify( "notify_new_vol" );
self endon( "notify_new_vol" );
common_scripts\utility::waittill_either( "death", "notify_stop_retreat" );
var_0._num_ai--;
}
add_to_standby()
{
self._retreat_standby = 1;
if ( !isdefined( level._retreat_standby ) )
level._retreat_standby = [];
if ( !isdefined( level._retreat_standby[self._current_index] ) )
level._retreat_standby[self._current_index] = [];
level._retreat_standby[self._current_index] = common_scripts\utility::array_add( level._retreat_standby[self._current_index], self );
thread standby_watcher( self._current_index );
}
standby_watcher( var_0 )
{
level notify( "notify_stop_standby_watcher_" + var_0 );
level endon( "notify_stop_standby_watcher_" + var_0 );
level endon( "notify_stop_retreat_all" );
for (;;)
{
wait 3;
var_1 = maps\_utility::remove_dead_from_array( level._retreat_standby[var_0] );
level._retreat_standby[var_0] = [];
if ( var_1.size == 0 )
break;
if ( isdefined( level._retreat_current_volumes[var_0] ) )
{
foreach ( var_3 in var_1 )
var_3 thread go_to_goal_vol( level._retreat_current_volumes[var_0] );
continue;
}
break;
}
}
setup_retreat_vols()
{
var_0 = getallnodes();
var_1 = getentarray( "info_volume", "classname" );
var_2 = [];
var_3 = common_scripts\utility::spawn_tag_origin();
foreach ( var_5 in var_1 )
{
if ( isdefined( var_5.script_noteworthy ) )
{
if ( isdefined( var_5.script_parameters ) )
var_5._max_ai = int( var_5.script_parameters );
else
{
if ( !isdefined( var_5.nodes ) )
var_5.nodes = [];
foreach ( var_7 in var_0 )
{
var_3.origin = var_7.origin;
if ( var_3 istouching( var_5 ) )
{
if ( issubstr( var_7.type, "Cover" ) || issubstr( var_7.type, "Conceal" ) || issubstr( var_7.type, "Exposed" ) )
{
if ( isdefined( var_7.script_parameters ) && var_7.script_parameters == "no_axis" )
continue;
var_5.nodes = common_scripts\utility::array_add( var_5.nodes, var_7 );
}
}
}
if ( !isdefined( var_5.nodes ) )
iprintln( "Warning - Volume '" + var_5.script_noteworthy + "' has no cover nodes!" );
var_5._max_ai = var_5.nodes.size;
}
if ( !isdefined( var_2[var_5.script_noteworthy] ) )
var_2[var_5.script_noteworthy] = [];
var_5._target_vols = [];
if ( isdefined( var_5.target ) )
{
var_9 = getentarray( var_5.target, "targetname" );
foreach ( var_11 in var_9 )
var_5._target_vols = common_scripts\utility::array_add( var_5._target_vols, var_11 );
}
var_2[var_5.script_noteworthy] = common_scripts\utility::array_add( var_2[var_5.script_noteworthy], var_5 );
var_5._num_ai = 0;
}
}
var_3 delete();
level._vols = var_2;
}
check_vol_index( var_0 )
{
}
build_vol_list( var_0 )
{
check_vol_index( var_0 );
var_1 = [];
for (;;)
{
var_2 = undefined;
foreach ( var_4 in level._vols[var_0] )
{
if ( isdefined( var_4._target_vols ) && var_4._target_vols.size > 0 )
var_2 = var_4._target_vols[0].script_noteworthy;
}
if ( isdefined( var_2 ) )
var_1 = common_scripts\utility::array_add( var_1, var_2 );
else
break;
var_0 = var_2;
var_2 = undefined;
}
return var_1;
}
ignore_to_goal( var_0 )
{
self endon( "death" );
self.old_goalradius = self.goalradius;
self.goalradius = 16;
self.ignoreall = 1;
self waittill( "goal" );
self.ignoreall = 0;
self.goalradius = self.old_goalradius;
if ( isdefined( var_0 ) )
self [[ var_0 ]]();
}