1 #using scripts\codescripts\struct;
3 #using scripts\shared\array_shared;
4 #using scripts\shared\flag_shared;
5 #using scripts\shared\flagsys_shared;
6 #using scripts\shared\util_shared;
8 #insert scripts\shared\shared.gsh;
15 function filter( &
array, b_keep_keys, func_filter, arg1, arg2, arg3, arg4, arg5 )
23 if ( IsString( key ) || IsWeapon( key ) )
26 if ( isdefined( b_keep_keys ) && !b_keep_keys )
58 if ( IsDefined( b_keep_keys ) )
60 ArrayRemoveValue(
array, undefined, b_keep_keys );
64 ArrayRemoveValue(
array, undefined );
70 function get_touching( &
array, b_keep_keys )
72 return filter(
array, b_keep_keys, &IsTouching );
90 foreach ( key, val
in array )
121 function delete_all( &
array, is_struct )
125 if ( isdefined( ent ) )
131 else if ( isdefined( ent.__vtable ) )
153 function notify_all( &
array, str_notify )
155 foreach ( elem
in array )
157 elem notify( str_notify );
178 function thread_all( &entities, func, arg1, arg2, arg3, arg4, arg5, arg6 )
180 Assert( isdefined( entities ),
"Undefined entity array passed to array::thread_all" );
181 Assert( isdefined( func ),
"Undefined function passed to array::thread_all" );
183 if ( IsArray( entities ) )
185 if ( isdefined( arg6 ) )
187 foreach ( ent
in entities )
189 ent thread [[ func ]]( arg1, arg2, arg3, arg4, arg5, arg6 );
192 else if ( isdefined( arg5 ) )
194 foreach ( ent
in entities )
196 ent thread [[ func ]]( arg1, arg2, arg3, arg4, arg5 );
199 else if ( isdefined( arg4 ) )
201 foreach ( ent
in entities )
203 ent thread [[ func ]]( arg1, arg2, arg3, arg4 );
206 else if ( isdefined( arg3 ) )
208 foreach ( ent
in entities )
210 ent thread [[ func ]]( arg1, arg2, arg3 );
213 else if ( isdefined( arg2 ) )
215 foreach ( ent
in entities )
217 ent thread [[ func ]]( arg1, arg2 );
220 else if ( isdefined( arg1 ) )
222 foreach ( ent
in entities )
224 ent thread [[ func ]]( arg1 );
229 foreach ( ent
in entities )
231 ent thread [[ func ]]();
257 function thread_all_ents( &entities, func, arg1, arg2, arg3, arg4, arg5 )
259 Assert( isdefined( entities ),
"Undefined entity array passed to util::array_ent_thread" );
260 Assert( isdefined( func ),
"Undefined function passed to util::array_ent_thread" );
262 if ( IsArray( entities ) )
266 keys = GetArrayKeys( entities );
267 for ( i = 0; i < keys.size; i++ )
296 function run_all( &entities, func, arg1, arg2, arg3, arg4, arg5, arg6 )
298 Assert( isdefined( entities ),
"Undefined entity array passed to array::run_all" );
299 Assert( isdefined( func ),
"Undefined function passed to array::run_all" );
301 if ( IsArray( entities ) )
303 if ( isdefined( arg6 ) )
305 foreach ( ent
in entities )
307 ent [[ func ]]( arg1, arg2, arg3, arg4, arg5, arg6 );
310 else if ( isdefined( arg5 ) )
312 foreach ( ent
in entities )
314 ent [[ func ]]( arg1, arg2, arg3, arg4, arg5 );
317 else if ( isdefined( arg4 ) )
319 foreach ( ent
in entities )
321 ent [[ func ]]( arg1, arg2, arg3, arg4 );
324 else if ( isdefined( arg3 ) )
326 foreach ( ent
in entities )
328 ent [[ func ]]( arg1, arg2, arg3 );
331 else if ( isdefined( arg2 ) )
333 foreach ( ent
in entities )
335 ent [[ func ]]( arg1, arg2 );
338 else if ( isdefined( arg1 ) )
340 foreach ( ent
in entities )
342 ent [[ func ]]( arg1 );
347 foreach ( ent
in entities )
370 function exclude(
array, array_exclude )
374 if ( IsArray( array_exclude ) )
376 for ( i = 0; i < array_exclude.size; i++ )
378 ArrayRemoveValue( newarray, array_exclude[ i ] );
383 ArrayRemoveValue( newarray, array_exclude );
400 function add( &
array, item, allow_dupes =
true )
402 if ( isdefined( item ) )
404 if ( allow_dupes || !IsInArray(
array, item ) )
425 function add_sorted( &
array, item, allow_dupes =
true )
427 if ( isdefined( item ) )
429 if ( allow_dupes || !IsInArray(
array, item ) )
431 for ( i = 0; i <=
array.size; i++ )
435 ArrayInsert(
array, item, i );
458 s_tracker = SpawnStruct();
459 s_tracker._wait_count = 0;
463 if ( isdefined( ent ) )
469 if ( s_tracker._wait_count > 0 )
471 s_tracker waittill(
"waitlogic_finished" );
478 function flag_wait( &
array, str_flag )
480 for ( i = 0; i <
array.size; i++ )
485 ent waittill( str_flag );
494 function flagsys_wait( &
array, str_flag )
496 for ( i = 0; i <
array.size; i++ )
501 ent waittill( str_flag );
510 function flagsys_wait_any_flag( &
array, ... )
512 for ( i = 0; i <
array.size; i++ )
516 if ( isdefined( ent ) )
519 foreach ( str_flag
in vararg )
540 function flag_wait_clear( &
array, str_flag )
542 for ( i = 0; i <
array.size; i++ )
547 ent waittill( str_flag );
556 function flagsys_wait_clear( &
array, str_flag )
558 for ( i = 0; i <
array.size; i++ )
563 ent waittill( str_flag );
580 function wait_any(
array, msg, n_timeout )
584 s_tracker = SpawnStruct();
589 if ( isdefined( ent ) )
592 s thread
util::timeout( n_timeout, &_waitlogic2, s_tracker, ent, msg );
597 s_tracker endon(
"array_wait" );
602 function _waitlogic2( s_tracker, ent, msg )
604 s_tracker endon(
"array_wait" );
605 ent endon(
"death" );
608 s_tracker notify(
"array_wait" );
611 function flag_wait_any(
array, str_flag )
613 self endon(
"death" );
623 wait_any(
array, str_flag );
637 keys = GetArrayKeys(
array );
638 return array[ keys[RandomInt( keys.size )] ];
644 function randomize(
array )
646 for ( i = 0; i <
array.size; i++ )
648 j = RandomInt(
array.size );
670 for ( i =
array.size - 1; i >= 0; i-- )
672 a_array2[ a_array2.size ] =
array[ i ];
681 function remove_keys(
array )
685 foreach ( _, val
in array )
687 if ( isdefined( val ) )
699 function swap( &
array, index1, index2 )
701 assert( index1 <
array.size,
"index1 to swap out of range" );
702 assert( index2 <
array.size,
"index2 to swap out of range" );
709 function pop( &
array, index, b_keep_keys =
true )
713 if ( !isdefined( index ) )
715 keys = GetArrayKeys(
array );
719 if ( isdefined(
array[index] ) )
723 ArrayRemoveIndex(
array, index, b_keep_keys );
730 function pop_front( &
array, b_keep_keys =
true )
732 keys = GetArrayKeys(
array );
733 index = keys[ keys.size - 1 ];
734 return pop(
array, index, b_keep_keys );
737 function push( &
array, val, index )
739 if ( !isdefined( index ) )
743 foreach ( key
in GetArrayKeys(
array ) )
745 if ( IsInt( key ) && ( key >= index ) )
752 ArrayInsert(
array, val, index );
755 function push_front( &
array, val )
772 function get_closest( org, &
array, dist = undefined)
774 assert( 0,
"Deprecated function. Use 'ArrayGetClosest' instead." );
789 function get_farthest( org, &
array, dist = undefined )
791 assert( 0,
"Deprecated function. Use 'ArrayGetFarthest' instead." );
794 function closerFunc( dist1, dist2 )
796 return dist1 >= dist2;
799 function fartherFunc( dist1, dist2 )
801 return dist1 <= dist2;
815 function get_all_farthest( org, &
array, excluders, max )
817 sorted_array = get_closest( org,
array, excluders );
822 for( i=0; i < sorted_array.size; i++)
824 temp_array[temp_array.size] = sorted_array[sorted_array.size - i];
826 sorted_array = temp_array;
831 return( sorted_array );
848 function get_all_closest( org, &
array, excluders, max, maxdist )
852 if( !isdefined( max ) )
854 if( !isdefined( excluders ) )
857 maxdists2rd = undefined;
858 if( isdefined( maxdist ) )
859 maxdists2rd = maxdist * maxdist;
864 for( i = 0;i <
array.size;i ++ )
870 for( p = 0;p < excluders.size;p ++ )
872 if(
array[ i ] != excluders[ p ] )
880 length = distancesquared( org,
array[ i ].origin );
882 if( isdefined( maxdists2rd ) && maxdists2rd < length )
885 dist[ dist.size ] = length;
888 index[ index.size ] = i;
894 for( i = 0;i < dist.size - 1;i ++ )
896 if( dist[ i ] <= dist[ i + 1 ] )
900 dist[ i ] = dist[ i + 1 ];
901 dist[ i + 1 ] = temp;
903 index[ i ] = index[ i + 1 ];
904 index[ i + 1 ] = temp;
911 if( max > dist.size )
913 for( i = 0;i < max;i ++ )
914 newArray[ i ] =
array[ index[ i ] ];
918 function alphabetize( &
array )
920 return sort_by_value(
array,
true );
935 function sort_by_value( &
array, b_lowest_first =
false )
937 return merge_sort(
array, &_sort_by_value_compare_func, b_lowest_first );
940 function _sort_by_value_compare_func( val1, val2, b_lowest_first )
942 if ( b_lowest_first )
964 function sort_by_script_int( &
a_ents, b_lowest_first =
false )
966 return merge_sort(
a_ents, &_sort_by_script_int_compare_func, b_lowest_first );
969 function _sort_by_script_int_compare_func( e1, e2, b_lowest_first )
971 if ( b_lowest_first )
973 return e1.script_int < e2.script_int;
977 return e1.script_int > e2.script_int;
981 function merge_sort( ¤t_list, func_sort, param )
983 if ( current_list.size <= 1 )
991 middle = current_list.size / 2;
993 for ( x = 0; x < middle; x++ )
998 for ( ; x < current_list.size; x++ )
1003 left = merge_sort( left, func_sort, param );
1004 right = merge_sort( right, func_sort, param );
1006 result = merge( left, right, func_sort, param );
1011 function merge( left, right, func_sort, param )
1017 while ( li < left.size && ri < right.size )
1019 b_result = undefined;
1021 if ( isdefined( param ) )
1023 b_result = [[ func_sort ]]( left[ li ], right[ ri ], param );
1027 b_result = [[ func_sort ]]( left[ li ], right[ ri ] );
1042 while ( li < left.size )
1048 while ( ri < right.size )
1072 function spread_all( &entities, func, arg1, arg2, arg3, arg4, arg5 )
1074 Assert( isdefined( entities ),
"Undefined entity array passed to array::spread_all_ents" );
1075 Assert( isdefined( func ),
"Undefined function passed to array::spread_all_ents" );
1077 if ( IsArray( entities ) )
1079 foreach ( ent
in entities )