1048 lines
26 KiB
Text
1048 lines
26 KiB
Text
scriptPrintln(channel, msg)
|
|
{
|
|
setprintchannel(channel);
|
|
println(msg);
|
|
setprintchannel ("script");
|
|
}
|
|
|
|
debugPrintln(channel, msg)
|
|
{
|
|
setprintchannel("script_debug");
|
|
println(msg);
|
|
setprintchannel ("script");
|
|
}
|
|
|
|
draw_debug_line(start, end, timer)
|
|
{
|
|
for (i=0;i<timer*20;i++)
|
|
{
|
|
line (start, end, (1,1,0.5));
|
|
wait (0.05);
|
|
}
|
|
}
|
|
|
|
waittillend(msg)
|
|
{
|
|
self waittillmatch (msg, "end");
|
|
}
|
|
|
|
randomvector(num)
|
|
{
|
|
return (randomfloat(num) - num*0.5, randomfloat(num) - num*0.5,randomfloat(num) - num*0.5);
|
|
}
|
|
|
|
angle_dif (oldangle, newangle)
|
|
{
|
|
// returns the difference between two yaws
|
|
if (oldangle == newangle)
|
|
return 0;
|
|
|
|
while (newangle > 360)
|
|
newangle -=360;
|
|
|
|
while (newangle < 0)
|
|
newangle +=360;
|
|
|
|
while (oldangle > 360)
|
|
oldangle -=360;
|
|
|
|
while (oldangle < 0)
|
|
oldangle +=360;
|
|
|
|
olddif = undefined;
|
|
newdif = undefined;
|
|
|
|
if (newangle > 180)
|
|
newdif = 360 - newangle;
|
|
else
|
|
newdif = newangle;
|
|
|
|
if (oldangle > 180)
|
|
olddif = 360 - oldangle;
|
|
else
|
|
olddif = oldangle;
|
|
|
|
outerdif = newdif + olddif;
|
|
innerdif = 0;
|
|
|
|
if (newangle > oldangle)
|
|
innerdif = newangle - oldangle;
|
|
else
|
|
innerdif = oldangle - newangle;
|
|
|
|
if (innerdif < outerdif)
|
|
return innerdif;
|
|
else
|
|
return outerdif;
|
|
}
|
|
|
|
vectorScale( vector, scale )
|
|
{
|
|
vector = (vector[0] * scale, vector[1] * scale, vector[2] * scale);
|
|
return vector;
|
|
}
|
|
|
|
sign( x )
|
|
{
|
|
if ( x >= 0 )
|
|
return 1;
|
|
return -1;
|
|
}
|
|
|
|
|
|
track(spot_to_track)
|
|
{
|
|
if (isdefined(self.current_target))
|
|
{
|
|
if (spot_to_track == self.current_target)
|
|
return;
|
|
}
|
|
self.current_target = spot_to_track;
|
|
}
|
|
|
|
get_enemy_team( team )
|
|
{
|
|
assertEx( team != "neutral", "Team must be allies or axis" );
|
|
|
|
teams = [];
|
|
teams["axis"] = "allies";
|
|
teams["allies"] = "axis";
|
|
|
|
return teams[team];
|
|
}
|
|
|
|
|
|
clear_exception( type )
|
|
{
|
|
assert( isdefined( self.exception[ type ] ) );
|
|
self.exception[ type ] = anim.defaultException;
|
|
}
|
|
|
|
set_exception( type, func )
|
|
{
|
|
assert( isdefined( self.exception[ type ] ) );
|
|
self.exception[ type ] = func;
|
|
}
|
|
|
|
set_all_exceptions( exceptionFunc )
|
|
{
|
|
keys = getArrayKeys( self.exception );
|
|
for ( i=0; i < keys.size; i++ )
|
|
{
|
|
self.exception[ keys[ i ] ] = exceptionFunc;
|
|
}
|
|
}
|
|
|
|
set_flash_duration(time_in_seconds)
|
|
{
|
|
self.flashduration = time_in_seconds * 1000;
|
|
}
|
|
|
|
cointoss()
|
|
{
|
|
return randomint( 100 ) >= 50 ;
|
|
}
|
|
|
|
|
|
waittill_string( msg, ent )
|
|
{
|
|
if ( msg != "death" )
|
|
self endon ("death");
|
|
|
|
ent endon ( "die" );
|
|
self waittill ( msg );
|
|
ent notify ( "returned", msg );
|
|
}
|
|
|
|
waittill_multiple( string1, string2, string3, string4, string5 )
|
|
{
|
|
self endon ("death");
|
|
ent = spawnstruct();
|
|
ent.threads = 0;
|
|
|
|
if (isdefined (string1))
|
|
{
|
|
self thread waittill_string (string1, ent);
|
|
ent.threads++;
|
|
}
|
|
if (isdefined (string2))
|
|
{
|
|
self thread waittill_string (string2, ent);
|
|
ent.threads++;
|
|
}
|
|
if (isdefined (string3))
|
|
{
|
|
self thread waittill_string (string3, ent);
|
|
ent.threads++;
|
|
}
|
|
if (isdefined (string4))
|
|
{
|
|
self thread waittill_string (string4, ent);
|
|
ent.threads++;
|
|
}
|
|
if (isdefined (string5))
|
|
{
|
|
self thread waittill_string (string5, ent);
|
|
ent.threads++;
|
|
}
|
|
|
|
while (ent.threads)
|
|
{
|
|
ent waittill ("returned");
|
|
ent.threads--;
|
|
}
|
|
|
|
ent notify ("die");
|
|
}
|
|
|
|
waittill_multiple_ents( ent1, string1, ent2, string2, ent3, string3, ent4, string4 )
|
|
{
|
|
self endon ("death");
|
|
ent = spawnstruct();
|
|
ent.threads = 0;
|
|
|
|
if ( isdefined( ent1 ) )
|
|
{
|
|
assert( isdefined( string1 ) );
|
|
ent1 thread waittill_string( string1, ent );
|
|
ent.threads++;
|
|
}
|
|
if ( isdefined( ent2 ) )
|
|
{
|
|
assert( isdefined( string2 ) );
|
|
ent2 thread waittill_string ( string2, ent );
|
|
ent.threads++;
|
|
}
|
|
if ( isdefined( ent3 ) )
|
|
{
|
|
assert( isdefined( string3 ) );
|
|
ent3 thread waittill_string ( string3, ent );
|
|
ent.threads++;
|
|
}
|
|
if ( isdefined( ent4 ) )
|
|
{
|
|
assert( isdefined( string4 ) );
|
|
ent4 thread waittill_string ( string4, ent );
|
|
ent.threads++;
|
|
}
|
|
|
|
while (ent.threads)
|
|
{
|
|
ent waittill ("returned");
|
|
ent.threads--;
|
|
}
|
|
|
|
ent notify ("die");
|
|
}
|
|
|
|
waittill_any_return( string1, string2, string3, string4, string5 )
|
|
{
|
|
if ((!isdefined (string1) || string1 != "death") &&
|
|
(!isdefined (string2) || string2 != "death") &&
|
|
(!isdefined (string3) || string3 != "death") &&
|
|
(!isdefined (string4) || string4 != "death") &&
|
|
(!isdefined (string5) || string5 != "death"))
|
|
self endon ("death");
|
|
|
|
ent = spawnstruct();
|
|
|
|
if (isdefined (string1))
|
|
self thread waittill_string (string1, ent);
|
|
|
|
if (isdefined (string2))
|
|
self thread waittill_string (string2, ent);
|
|
|
|
if (isdefined (string3))
|
|
self thread waittill_string (string3, ent);
|
|
|
|
if (isdefined (string4))
|
|
self thread waittill_string (string4, ent);
|
|
|
|
if (isdefined (string5))
|
|
self thread waittill_string (string5, ent);
|
|
|
|
ent waittill ("returned", msg);
|
|
ent notify ("die");
|
|
return msg;
|
|
}
|
|
|
|
waittill_any( string1, string2, string3, string4, string5 )
|
|
{
|
|
assert( isdefined( string1 ) );
|
|
|
|
if ( isdefined( string2 ) )
|
|
self endon( string2 );
|
|
|
|
if ( isdefined( string3 ) )
|
|
self endon( string3 );
|
|
|
|
if ( isdefined( string4 ) )
|
|
self endon( string4 );
|
|
|
|
if ( isdefined( string5 ) )
|
|
self endon( string5 );
|
|
|
|
self waittill( string1 );
|
|
}
|
|
|
|
waittill_any_ents( ent1, string1, ent2, string2, ent3, string3, ent4, string4, ent5, string5, ent6, string6, ent7, string7 )
|
|
{
|
|
assert( isdefined( ent1 ) );
|
|
assert( isdefined( string1 ) );
|
|
|
|
if ( ( isdefined( ent2 ) ) && ( isdefined( string2 ) ) )
|
|
ent2 endon( string2 );
|
|
|
|
if ( ( isdefined( ent3 ) ) && ( isdefined( string3 ) ) )
|
|
ent3 endon( string3 );
|
|
|
|
if ( ( isdefined( ent4 ) ) && ( isdefined( string4 ) ) )
|
|
ent4 endon( string4 );
|
|
|
|
if ( ( isdefined( ent5 ) ) && ( isdefined( string5 ) ) )
|
|
ent5 endon( string5 );
|
|
|
|
if ( ( isdefined( ent6 ) ) && ( isdefined( string6 ) ) )
|
|
ent6 endon( string6 );
|
|
|
|
if ( ( isdefined( ent7 ) ) && ( isdefined( string7 ) ) )
|
|
ent7 endon( string7 );
|
|
|
|
ent1 waittill( string1 );
|
|
}
|
|
|
|
/*
|
|
=============
|
|
///ScriptDocBegin
|
|
"Name: isFlashed()"
|
|
"Summary: Returns true if the player or an AI is flashed"
|
|
"Module: Utility"
|
|
"CallOn: An AI"
|
|
"Example: flashed = level.price isflashed();"
|
|
"SPMP: singleplayer"
|
|
///ScriptDocEnd
|
|
=============
|
|
*/
|
|
isFlashed()
|
|
{
|
|
if ( !isdefined( self.flashEndTime ) )
|
|
return false;
|
|
|
|
return gettime() < self.flashEndTime;
|
|
}
|
|
|
|
|
|
/*
|
|
=============
|
|
///ScriptDocBegin
|
|
"Name: flag( <flagname> )"
|
|
"Summary: Checks if the flag is set. Returns true or false."
|
|
"Module: Flag"
|
|
"CallOn: "
|
|
"MandatoryArg: <flagname> : name of the flag to check"
|
|
"Example: flag( "hq_cleared" );"
|
|
"SPMP: both"
|
|
///ScriptDocEnd
|
|
=============
|
|
*/
|
|
flag( message )
|
|
{
|
|
assertEx( isdefined( message ), "Tried to check flag but the flag was not defined." );
|
|
assertEx( isdefined( level.flag[ message ] ), "Tried to check flag " + message + " but the flag was not initialized." );
|
|
if ( !level.flag[ message ] )
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
/*
|
|
=============
|
|
///ScriptDocBegin
|
|
"Name: flag_init( <flagname> )"
|
|
"Summary: Initialize a flag to be used. All flags must be initialized before using flag_set or flag_wait"
|
|
"Module: Flag"
|
|
"CallOn: "
|
|
"MandatoryArg: <flagname> : name of the flag to create"
|
|
"Example: flag_init( "hq_cleared" );"
|
|
"SPMP: singleplayer"
|
|
///ScriptDocEnd
|
|
=============
|
|
*/
|
|
flag_init( message )
|
|
{
|
|
if ( !isDefined( level.flag ) )
|
|
{
|
|
level.flag = [];
|
|
level.flags_lock = [];
|
|
if ( !isdefined( level.sp_stat_tracking_func ) )
|
|
level.sp_stat_tracking_func = ::empty_init_func;
|
|
}
|
|
|
|
if ( !isdefined( level.first_frame ) )
|
|
assertEx( !isDefined( level.flag[ message ] ), "Attempt to reinitialize existing message: " + message );
|
|
|
|
level.flag[ message ] = false;
|
|
/#
|
|
level.flags_lock[ message ] = false;
|
|
#/
|
|
if ( !isdefined( level.trigger_flags ) )
|
|
{
|
|
init_trigger_flags();
|
|
level.trigger_flags[ message ] = [];
|
|
}
|
|
else
|
|
if ( !isdefined( level.trigger_flags[ message ] ) )
|
|
{
|
|
level.trigger_flags[ message ] = [];
|
|
}
|
|
|
|
if ( issuffix( message, "aa_" ) )
|
|
{
|
|
thread [[ level.sp_stat_tracking_func ]]( message );
|
|
}
|
|
}
|
|
|
|
empty_init_func( empty )
|
|
{
|
|
}
|
|
|
|
issuffix( msg, suffix )
|
|
{
|
|
if ( suffix.size > msg.size )
|
|
return false;
|
|
|
|
for ( i = 0; i < suffix.size; i++ )
|
|
{
|
|
if ( msg[ i ] != suffix[ i ] )
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
/*
|
|
=============
|
|
///ScriptDocBegin
|
|
"Name: flag_set( <flagname> )"
|
|
"Summary: Sets the specified flag, all scripts using flag_wait will now continue."
|
|
"Module: Flag"
|
|
"CallOn: "
|
|
"MandatoryArg: <flagname> : name of the flag to set"
|
|
"Example: flag_set( "hq_cleared" );"
|
|
"SPMP: both"
|
|
///ScriptDocEnd
|
|
=============
|
|
*/
|
|
flag_set( message )
|
|
{
|
|
/#
|
|
assertEx( isDefined( level.flag[ message ] ), "Attempt to set a flag before calling flag_init: " + message );
|
|
assert( level.flag[ message ] == level.flags_lock[ message ] );
|
|
level.flags_lock[ message ] = true;
|
|
#/
|
|
level.flag[ message ] = true;
|
|
level notify( message );
|
|
|
|
set_trigger_flag_permissions( message );
|
|
}
|
|
|
|
/*
|
|
=============
|
|
///ScriptDocBegin
|
|
"Name: flag_wait( <flagname> )"
|
|
"Summary: Waits until the specified flag is set."
|
|
"Module: Flag"
|
|
"CallOn: "
|
|
"MandatoryArg: <flagname> : name of the flag to wait on"
|
|
"Example: flag_wait( "hq_cleared" );"
|
|
"SPMP: both"
|
|
///ScriptDocEnd
|
|
=============
|
|
*/
|
|
flag_wait( msg )
|
|
{
|
|
while( !level.flag[ msg ] )
|
|
level waittill( msg );
|
|
}
|
|
|
|
/*
|
|
=============
|
|
///ScriptDocBegin
|
|
"Name: flag_clear( <flagname> )"
|
|
"Summary: Clears the specified flag."
|
|
"Module: Flag"
|
|
"CallOn: "
|
|
"MandatoryArg: <flagname> : name of the flag to clear"
|
|
"Example: flag_clear( "hq_cleared" );"
|
|
"SPMP: both"
|
|
///ScriptDocEnd
|
|
=============
|
|
*/
|
|
flag_clear( message )
|
|
{
|
|
/#
|
|
assertEx( isDefined( level.flag[ message ] ), "Attempt to set a flag before calling flag_init: " + message );
|
|
assert( level.flag[ message ] == level.flags_lock[ message ] );
|
|
level.flags_lock[ message ] = false;
|
|
#/
|
|
//do this check so we don't unneccessarily send a notify
|
|
if ( level.flag[ message ] )
|
|
{
|
|
level.flag[ message ] = false;
|
|
level notify( message );
|
|
set_trigger_flag_permissions( message );
|
|
}
|
|
}
|
|
|
|
/*
|
|
=============
|
|
///ScriptDocBegin
|
|
"Name: flag_waitopen( <flagname> )"
|
|
"Summary: Waits for the flag to open"
|
|
"Module: Flag"
|
|
"MandatoryArg: <flagname>: The flag"
|
|
"Example: flag_waitopen( "get_me_bagels" );"
|
|
"SPMP: singleplayer"
|
|
///ScriptDocEnd
|
|
=============
|
|
*/
|
|
|
|
flag_waitopen( msg )
|
|
{
|
|
while( level.flag[ msg ] )
|
|
level waittill( msg );
|
|
}
|
|
|
|
script_gen_dump_addline( string, signature )
|
|
{
|
|
|
|
if ( !isdefined( string ) )
|
|
string = "nowrite";// some things like the standardized CSV sound entries don't really need anything in script. just the asset
|
|
|
|
if ( !isdefined( level._loadstarted ) )
|
|
{
|
|
// stashes commands away so they can be handled in the correct place within load
|
|
if ( !isdefined( level.script_gen_dump_preload ) )
|
|
level.script_gen_dump_preload = [];
|
|
struct = spawnstruct();
|
|
struct.string = string;
|
|
struct.signature = signature;
|
|
level.script_gen_dump_preload[ level.script_gen_dump_preload.size ] = struct;
|
|
return;
|
|
}
|
|
|
|
|
|
if ( !isdefined( level.script_gen_dump[ signature ] ) )
|
|
level.script_gen_dump_reasons[ level.script_gen_dump_reasons.size ] = "Added: " + string;// console print as well as triggering the dump
|
|
level.script_gen_dump[ signature ] = string;
|
|
level.script_gen_dump2[ signature ] = string;// second array gets compared later with saved array. When something is missing dump is generated
|
|
}
|
|
|
|
/*
|
|
=============
|
|
///ScriptDocBegin
|
|
"Name: array_thread( <entities> , <process> , <var1> , <var2> , <var3> )"
|
|
"Summary: Threads the < process > function on every entity in the < entities > array. The entity will become "self" in the specified function."
|
|
"Module: Array"
|
|
"CallOn: "
|
|
"MandatoryArg: <entities> : array of entities to thread the process"
|
|
"MandatoryArg: <process> : pointer to a script function"
|
|
"OptionalArg: <var1> : parameter 1 to pass to the process"
|
|
"OptionalArg: <var2> : parameter 2 to pass to the process"
|
|
"OptionalArg: <var3> : parameter 3 to pass to the process"
|
|
"Example: array_thread( getaiarray( "allies" ), ::set_ignoreme, false );"
|
|
"SPMP: both"
|
|
///ScriptDocEnd
|
|
=============
|
|
*/
|
|
array_thread( entities, process, var1, var2, var3 )
|
|
{
|
|
keys = getArrayKeys( entities );
|
|
|
|
if ( isdefined( var3 ) )
|
|
{
|
|
for( i = 0 ; i < keys.size ; i ++ )
|
|
entities[ keys[ i ] ] thread [[ process ]]( var1, var2, var3 );
|
|
|
|
return;
|
|
}
|
|
|
|
if ( isdefined( var2 ) )
|
|
{
|
|
for( i = 0 ; i < keys.size ; i ++ )
|
|
entities[ keys[ i ] ] thread [[ process ]]( var1, var2 );
|
|
|
|
return;
|
|
}
|
|
|
|
if ( isdefined( var1 ) )
|
|
{
|
|
for( i = 0 ; i < keys.size ; i ++ )
|
|
entities[ keys[ i ] ] thread [[ process ]]( var1 );
|
|
|
|
return;
|
|
}
|
|
|
|
for( i = 0 ; i < keys.size ; i ++ )
|
|
entities[ keys[ i ] ] thread [[ process ]]();
|
|
}
|
|
|
|
array_thread4( entities, process, var1, var2, var3, var4 )
|
|
{
|
|
keys = getArrayKeys( entities );
|
|
for( i = 0 ; i < keys.size ; i ++ )
|
|
entities[ keys[ i ] ] thread [[ process ]]( var1, var2, var3, var4 );
|
|
}
|
|
|
|
array_thread5( entities, process, var1, var2, var3, var4, var5 )
|
|
{
|
|
keys = getArrayKeys( entities );
|
|
for( i = 0 ; i < keys.size ; i ++ )
|
|
entities[ keys[ i ] ] thread [[ process ]]( var1, var2, var3, var4, var5 );
|
|
}
|
|
|
|
remove_undefined_from_array( array )
|
|
{
|
|
newarray = [];
|
|
for( i = 0; i < array.size; i ++ )
|
|
{
|
|
if ( !isdefined( array[ i ] ) )
|
|
continue;
|
|
newarray[ newarray.size ] = array[ i ];
|
|
}
|
|
return newarray;
|
|
}
|
|
|
|
/*
|
|
=============
|
|
///ScriptDocBegin
|
|
"Name: trigger_on( <name>, <type> )"
|
|
"Summary: Turns a trigger on. This only needs to be called if it was previously turned off"
|
|
"Module: Trigger"
|
|
"CallOn: A trigger"
|
|
"OptionalArg: <name> : the name corrisponding to a targetname or script_noteworthy to grab the trigger internally"
|
|
"OptionalArg: <type> : the type( targetname, or script_noteworthy ) corrisponding to a name to grab the trigger internally"
|
|
"Example: trigger trigger_on(); -or- trigger_on( "base_trigger", "targetname" )"
|
|
"SPMP: both"
|
|
///ScriptDocEnd
|
|
=============
|
|
*/
|
|
trigger_on( name, type )
|
|
{
|
|
if ( isdefined ( name ) && isdefined( type ) )
|
|
{
|
|
ents = getentarray( name, type );
|
|
array_thread( ents, ::trigger_on_proc );
|
|
}
|
|
else
|
|
self trigger_on_proc();
|
|
}
|
|
|
|
trigger_on_proc()
|
|
{
|
|
if ( isDefined( self.realOrigin ) )
|
|
self.origin = self.realOrigin;
|
|
self.trigger_off = undefined;
|
|
}
|
|
|
|
|
|
/*
|
|
=============
|
|
///ScriptDocBegin
|
|
"Name: trigger_off( <name>, <type> )"
|
|
"Summary: Turns a trigger off so it can no longer be triggered."
|
|
"Module: Trigger"
|
|
"CallOn: A trigger"
|
|
"OptionalArg: <name> : the name corrisponding to a targetname or script_noteworthy to grab the trigger internally"
|
|
"OptionalArg: <type> : the type( targetname, or script_noteworthy ) corrisponding to a name to grab the trigger internally"
|
|
"Example: trigger trigger_off();"
|
|
"SPMP: both"
|
|
///ScriptDocEnd
|
|
=============
|
|
*/
|
|
trigger_off( name, type )
|
|
{
|
|
if ( isdefined ( name ) && isdefined( type ) )
|
|
{
|
|
ents = getentarray( name, type );
|
|
array_thread( ents, ::trigger_off_proc );
|
|
}
|
|
else
|
|
self trigger_off_proc();
|
|
}
|
|
|
|
trigger_off_proc()
|
|
{
|
|
if ( !isDefined( self.realOrigin ) )
|
|
self.realOrigin = self.origin;
|
|
|
|
if ( self.origin == self.realorigin )
|
|
self.origin += ( 0, 0, -10000 );
|
|
self.trigger_off = true;
|
|
}
|
|
|
|
set_trigger_flag_permissions( msg )
|
|
{
|
|
// turns triggers on or off depending on if they have the proper flags set, based on their shift-g menu settings
|
|
|
|
// this can be init before _load has run, thanks to AI.
|
|
if ( !isdefined( level.trigger_flags ) )
|
|
return;
|
|
|
|
// cheaper to do the upkeep at this time rather than with endons and waittills on the individual triggers
|
|
level.trigger_flags[ msg ] = remove_undefined_from_array( level.trigger_flags[ msg ] );
|
|
array_thread( level.trigger_flags[ msg ], ::update_trigger_based_on_flags );
|
|
}
|
|
|
|
update_trigger_based_on_flags()
|
|
{
|
|
true_on = true;
|
|
if ( isdefined( self.script_flag_true ) )
|
|
{
|
|
true_on = false;
|
|
tokens = create_flags_and_return_tokens( self.script_flag_true );
|
|
|
|
// stay off unless all the flags are false
|
|
for( i=0; i < tokens.size; i++ )
|
|
{
|
|
if ( flag( tokens[ i ] ) )
|
|
{
|
|
true_on = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
false_on = true;
|
|
if ( isdefined( self.script_flag_false ) )
|
|
{
|
|
tokens = create_flags_and_return_tokens( self.script_flag_false );
|
|
|
|
// stay off unless all the flags are false
|
|
for( i=0; i < tokens.size; i++ )
|
|
{
|
|
if ( flag( tokens[ i ] ) )
|
|
{
|
|
false_on = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
[ [ level.trigger_func[ true_on && false_on ] ] ]();
|
|
}
|
|
|
|
create_flags_and_return_tokens( flags )
|
|
{
|
|
tokens = strtok( flags, " " );
|
|
|
|
// create the flag if level script does not
|
|
for( i=0; i < tokens.size; i++ )
|
|
{
|
|
if ( !isdefined( level.flag[ tokens[ i ] ] ) )
|
|
{
|
|
flag_init( tokens[ i ] );
|
|
}
|
|
}
|
|
|
|
return tokens;
|
|
}
|
|
|
|
init_trigger_flags()
|
|
{
|
|
level.trigger_flags = [];
|
|
level.trigger_func[ true ] = ::trigger_on;
|
|
level.trigger_func[ false ] = ::trigger_off;
|
|
}
|
|
|
|
/*
|
|
=============
|
|
///ScriptDocBegin
|
|
"Name: getstructarray( <name> , <type )"
|
|
"Summary: gets an array of script_structs"
|
|
"Module: Array"
|
|
"CallOn: An entity"
|
|
"MandatoryArg: <name> : "
|
|
"MandatoryArg: <type> : "
|
|
"Example: fxemitters = getstructarray( "streetlights", "targetname" )"
|
|
"SPMP: both"
|
|
///ScriptDocEnd
|
|
=============
|
|
*/
|
|
|
|
getstructarray( name, type )
|
|
{
|
|
assertEx( isdefined( level.struct_class_names ), "Tried to getstruct before the structs were init" );
|
|
|
|
array = level.struct_class_names[ type ][ name ];
|
|
if ( !isdefined( array ) )
|
|
return [];
|
|
return array;
|
|
}
|
|
|
|
struct_class_init()
|
|
{
|
|
assertEx( !isdefined( level.struct_class_names ), "level.struct_class_names is being initialized in the wrong place! It shouldn't be initialized yet." );
|
|
|
|
level.struct_class_names = [];
|
|
level.struct_class_names[ "target" ] = [];
|
|
level.struct_class_names[ "targetname" ] = [];
|
|
level.struct_class_names[ "script_noteworthy" ] = [];
|
|
level.struct_class_names[ "script_linkname" ] = [];
|
|
|
|
for ( i=0; i < level.struct.size; i++ )
|
|
{
|
|
if ( isdefined( level.struct[ i ].targetname ) )
|
|
{
|
|
if ( !isdefined( level.struct_class_names[ "targetname" ][ level.struct[ i ].targetname ] ) )
|
|
level.struct_class_names[ "targetname" ][ level.struct[ i ].targetname ] = [];
|
|
|
|
size = level.struct_class_names[ "targetname" ][ level.struct[ i ].targetname ].size;
|
|
level.struct_class_names[ "targetname" ][ level.struct[ i ].targetname ][ size ] = level.struct[ i ];
|
|
}
|
|
if ( isdefined( level.struct[ i ].target ) )
|
|
{
|
|
if ( !isdefined( level.struct_class_names[ "target" ][ level.struct[ i ].target ] ) )
|
|
level.struct_class_names[ "target" ][ level.struct[ i ].target ] = [];
|
|
|
|
size = level.struct_class_names[ "target" ][ level.struct[ i ].target ].size;
|
|
level.struct_class_names[ "target" ][ level.struct[ i ].target ][ size ] = level.struct[ i ];
|
|
}
|
|
if ( isdefined( level.struct[ i ].script_noteworthy ) )
|
|
{
|
|
if ( !isdefined( level.struct_class_names[ "script_noteworthy" ][ level.struct[ i ].script_noteworthy ] ) )
|
|
level.struct_class_names[ "script_noteworthy" ][ level.struct[ i ].script_noteworthy ] = [];
|
|
|
|
size = level.struct_class_names[ "script_noteworthy" ][ level.struct[ i ].script_noteworthy ].size;
|
|
level.struct_class_names[ "script_noteworthy" ][ level.struct[ i ].script_noteworthy ][ size ] = level.struct[ i ];
|
|
}
|
|
if ( isdefined( level.struct[ i ].script_linkname ) )
|
|
{
|
|
assertex( !isdefined( level.struct_class_names[ "script_linkname" ][ level.struct[ i ].script_linkname ] ), "Two structs have the same linkname" );
|
|
level.struct_class_names[ "script_linkname" ][ level.struct[ i ].script_linkname ][ 0 ] = level.struct[ i ];
|
|
}
|
|
}
|
|
}
|
|
|
|
fileprint_start( file )
|
|
{
|
|
/#
|
|
filename = file;
|
|
|
|
//hackery here, sometimes the file just doesn't open so keep trying
|
|
// file = -1;
|
|
// while( file == -1 )
|
|
// {
|
|
file = openfile( filename, "write" );
|
|
// if (file == -1)
|
|
// wait .05; // try every frame untill the file becomes writeable
|
|
// }
|
|
level.fileprint = file;
|
|
level.fileprintlinecount = 0;
|
|
level.fileprint_filename = filename;
|
|
#/
|
|
}
|
|
|
|
/*
|
|
=============
|
|
///ScriptDocBegin
|
|
"Name: fileprint_map_start( <filename> )"
|
|
"Summary: starts map export with the file trees\cod3\cod3\map_source\xenon_export\ < filename > .map adds header / worldspawn entity to the map. Use this if you want to start a .map export."
|
|
"Module: Fileprint"
|
|
"CallOn: Level"
|
|
"MandatoryArg: <param1> : "
|
|
"OptionalArg: <param2> : "
|
|
"Example: fileprint_map_start( filename );"
|
|
"SPMP: singleplayer"
|
|
///ScriptDocEnd
|
|
=============
|
|
*/
|
|
|
|
fileprint_map_start( file )
|
|
{
|
|
/#
|
|
file = "map_source/" + file + ".map";
|
|
fileprint_start( file );
|
|
|
|
// for the entity count
|
|
level.fileprint_mapentcount = 0;
|
|
|
|
fileprint_map_header( true );
|
|
#/
|
|
|
|
}
|
|
|
|
fileprint_chk( file , str )
|
|
{
|
|
/#
|
|
//dodging infinite loops for file dumping. kind of dangerous
|
|
level.fileprintlinecount++;
|
|
if (level.fileprintlinecount>400)
|
|
{
|
|
wait .05;
|
|
level.fileprintlinecount++;
|
|
level.fileprintlinecount = 0;
|
|
}
|
|
fprintln( file, str );
|
|
#/
|
|
}
|
|
|
|
fileprint_map_header( bInclude_blank_worldspawn )
|
|
{
|
|
if ( !isdefined( bInclude_blank_worldspawn ) )
|
|
bInclude_blank_worldspawn = false;
|
|
|
|
// this may need to be updated if map format changes
|
|
assert( isdefined( level.fileprint ) );
|
|
/#
|
|
fileprint_chk( level.fileprint, "iwmap 4" );
|
|
fileprint_chk( level.fileprint, "\"000_Global\" flags active" );
|
|
fileprint_chk( level.fileprint, "\"The Map\" flags" );
|
|
|
|
if ( !bInclude_blank_worldspawn )
|
|
return;
|
|
fileprint_map_entity_start();
|
|
fileprint_map_keypairprint( "classname", "worldspawn" );
|
|
fileprint_map_entity_end();
|
|
|
|
#/
|
|
}
|
|
|
|
/*
|
|
=============
|
|
///ScriptDocBegin
|
|
"Name: fileprint_map_keypairprint( <key1> , <key2> )"
|
|
"Summary: prints a pair of keys to the current open map( by fileprint_map_start() )"
|
|
"Module: Fileprint"
|
|
"CallOn: Level"
|
|
"MandatoryArg: <key1> : "
|
|
"MandatoryArg: <key2> : "
|
|
"Example: fileprint_map_keypairprint( "classname", "script_model" );"
|
|
"SPMP: singleplayer"
|
|
///ScriptDocEnd
|
|
=============
|
|
*/
|
|
|
|
fileprint_map_keypairprint( key1, key2 )
|
|
{
|
|
/#
|
|
assert( isdefined( level.fileprint ) );
|
|
fileprint_chk( level.fileprint, "\"" + key1 + "\" \"" + key2 + "\"" );
|
|
#/
|
|
}
|
|
|
|
/*
|
|
=============
|
|
///ScriptDocBegin
|
|
"Name: fileprint_map_entity_start()"
|
|
"Summary: prints entity number and opening bracket to currently opened file"
|
|
"Module: Fileprint"
|
|
"CallOn: Level"
|
|
"Example: fileprint_map_entity_start();"
|
|
"SPMP: singleplayer"
|
|
///ScriptDocEnd
|
|
=============
|
|
*/
|
|
|
|
fileprint_map_entity_start()
|
|
{
|
|
/#
|
|
assert( !isdefined( level.fileprint_entitystart ) );
|
|
level.fileprint_entitystart = true;
|
|
assert( isdefined( level.fileprint ) );
|
|
fileprint_chk( level.fileprint, "// entity " + level.fileprint_mapentcount );
|
|
fileprint_chk( level.fileprint, "{" );
|
|
level.fileprint_mapentcount ++ ;
|
|
#/
|
|
}
|
|
|
|
/*
|
|
=============
|
|
///ScriptDocBegin
|
|
"Name: fileprint_map_entity_end()"
|
|
"Summary: close brackets an entity, required for the next entity to begin"
|
|
"Module: Fileprint"
|
|
"CallOn: Level"
|
|
"Example: fileprint_map_entity_end();"
|
|
"SPMP: singleplayer"
|
|
///ScriptDocEnd
|
|
=============
|
|
*/
|
|
|
|
fileprint_map_entity_end()
|
|
{
|
|
/#
|
|
assert( isdefined( level.fileprint_entitystart ) );
|
|
assert( isdefined( level.fileprint ) );
|
|
level.fileprint_entitystart = undefined;
|
|
fileprint_chk( level.fileprint, "}" );
|
|
#/
|
|
}
|
|
|
|
/*
|
|
=============
|
|
///ScriptDocBegin
|
|
"Name: fileprint_end()"
|
|
"Summary: saves the currently opened file"
|
|
"Module: Fileprint"
|
|
"CallOn: Level"
|
|
"Example: fileprint_end();"
|
|
"SPMP: singleplayer"
|
|
///ScriptDocEnd
|
|
=============
|
|
*/
|
|
|
|
fileprint_end()
|
|
{
|
|
/#
|
|
assert( !isdefined( level.fileprint_entitystart ) );
|
|
saved = closefile( level.fileprint );
|
|
if (saved != 1)
|
|
{
|
|
println("-----------------------------------");
|
|
println(" ");
|
|
println("file write failure");
|
|
println("file with name: "+level.fileprint_filename);
|
|
println("make sure you checkout the file you are trying to save");
|
|
println("note: USE P4 Search to find the file and check that one out");
|
|
println(" Do not checkin files in from the xenonoutput folder, ");
|
|
println(" this is junctioned to the proper directory where you need to go");
|
|
println("junctions looks like this");
|
|
println(" ");
|
|
println("..\\xenonOutput\\scriptdata\\createfx ..\\share\\raw\\maps\\createfx");
|
|
println("..\\xenonOutput\\scriptdata\\createart ..\\share\\raw\\maps\\createart");
|
|
println("..\\xenonOutput\\scriptdata\\vision ..\\share\\raw\\vision");
|
|
println("..\\xenonOutput\\scriptdata\\scriptgen ..\\share\\raw\\maps\\scriptgen");
|
|
println("..\\xenonOutput\\scriptdata\\zone_source ..\\xenon\\zone_source");
|
|
println("..\\xenonOutput\\accuracy ..\\share\\raw\\accuracy");
|
|
println("..\\xenonOutput\\scriptdata\\map_source ..\\map_source\\xenon_export");
|
|
println(" ");
|
|
println("-----------------------------------");
|
|
|
|
println( "File not saved( see console.log for info ) " );
|
|
}
|
|
level.fileprint = undefined;
|
|
level.fileprint_filename = undefined;
|
|
#/
|
|
}
|
|
|
|
/*
|
|
=============
|
|
///ScriptDocBegin
|
|
"Name: fileprint_radiant_vec( <vector> )"
|
|
"Summary: this converts a vector to a .map file readable format"
|
|
"Module: Fileprint"
|
|
"CallOn: An entity"
|
|
"MandatoryArg: <vector> : "
|
|
"Example: origin_string = fileprint_radiant_vec( vehicle.angles )"
|
|
"SPMP: singleplayer"
|
|
///ScriptDocEnd
|
|
=============
|
|
*/
|
|
|
|
fileprint_radiant_vec( vector )
|
|
{
|
|
/#
|
|
string = "" + vector[ 0 ] + " " + vector[ 1 ] + " " + vector[ 2 ] + "";
|
|
return string;
|
|
#/
|
|
}
|