doom3-bfg/base/script/doom_util.script
2022-08-27 13:19:00 +02:00

389 lines
6.5 KiB
Text

/***********************************************************************
doom_util.script
This defines utility functions for scripts
***********************************************************************/
/*
==================
setShaderTime
Frame command for setting the shader time to begin an effect.
==================
*/
void setShaderTime( entity self ) {
self.setShaderParm( 4, -sys.getTime() );
}
/*
==================
clearSmoke
Clears smoke particles on monsters
==================
*/
void clearSmoke( entity self ) {
self.setSmokeVisibility( ALL_PARTICLES, 0 );
}
/*
==================
headlook_on
Turns on Bone modification for looking.
==================
*/
void headlook_on( entity self ) {
self.setBoneMod( true );
}
/*
==================
headlook_off
Turns off Bone modification for looking.
==================
*/
void headlook_off( entity self ) {
self.setBoneMod( false );
}
/*
==================
overrideLegs
Used to make monster attack anims use the full body
==================
*/
void overrideLegs( entity self ) {
self.overrideAnim( ANIMCHANNEL_LEGS );
}
/*
==================
overrideTorso
Used to make monster attack anims use the full body
==================
*/
void overrideTorso( entity self ) {
self.overrideAnim( ANIMCHANNEL_TORSO );
}
/*
==================
waitForButtonPress
Waits for the user to press a button
==================
*/
void waitForButtonPress() {
float buttons;
do {
buttons = $player1.getButtons();
sys.wait( 0.01 );
} while( !buttons );
}
/*
==================
abs
Returns the absolute value of a number
==================
*/
float abs( float value ) {
if ( value < 0 ) {
return value * -1;
}
return value;
}
/*
==================
unpause
Utility function that works with onSignal to unpause a script
==================
*/
void unpause() {
}
/*
==================
anglemod360
Puts angles into the range of 0 to 360
==================
*/
vector anglemod360( vector ang ) {
while( ang_x < 0 ) {
ang_x += 360;
}
while( ang_x >= 360 ) {
ang_x -= 360;
}
while( ang_y < 0 ) {
ang_y += 360;
}
while( ang_y >= 360 ) {
ang_y -= 360;
}
while( ang_z < 0 ) {
ang_z += 360;
}
while( ang_z >= 360 ) {
ang_z -= 360;
}
return ang;
}
/*
==================
anglemod180
Puts angles into the range of -180 to 180
==================
*/
vector anglemod180( vector ang ) {
while( ang_x < -180 ) {
ang_x += 360;
}
while( ang_x >= 180 ) {
ang_x -= 360;
}
while( ang_y < -180 ) {
ang_y += 360;
}
while( ang_y >= 180 ) {
ang_y -= 360;
}
while( ang_z < -180 ) {
ang_z += 360;
}
while( ang_z >= 180 ) {
ang_z -= 360;
}
return ang;
}
/*
==================
delayRemoveThread
Service thread for delayRemove.
==================
*/
void delayRemoveThread( entity ent, float mytime ) {
sys.wait( mytime );
ent.remove();
}
/*
==================
delayRemove
Causes an entity to be removed after a specified amount of time.
==================
*/
void delayRemove( entity ent, float mytime ) {
thread delayRemoveThread( ent, mytime );
}
/*
==================
fadeOutEnt
Causes a entity to fade to black
==================
*/
void fadeOutEnt( entity ent, vector color, float totalTime ) {
float i;
vector c;
float frac;
float numTics;
// convert to the total number of game tics
numTics = totalTime * sys.getTicsPerSecond();
for( i = 0; i < numTics; i++ ) {
frac = ( numTics - i ) / numTics;
c = color * frac;
ent.setColor( c_x, c_y, c_z );
// wait one game frame
sys.waitFrame();
}
// make sure we are set to exactly black
ent.setColor( 0, 0, 0 );
}
/*
==================
fadeInEnt
Causes a entity to from black to color
==================
*/
void fadeInEnt( entity ent, vector color, float totalTime ) {
float i;
vector c;
float frac;
float numTics;
// convert to the total number of game tics
numTics = totalTime * sys.getTicsPerSecond();
for( i = 0; i < numTics; i++ ) {
frac = i / numTics;
c = color * frac;
ent.setColor( c_x, c_y, c_z );
// wait one game frame
sys.waitFrame();
}
// make sure we are set to exactly the color
ent.setColor( color_x, color_y, color_z );
}
/*
==================
crossFadeEnt
Causes a entity to from one color to another
==================
*/
void crossFadeEnt( entity ent, vector source, vector dest, float totalTime ) {
float i;
vector c;
float frac;
float numTics;
// convert to the total number of game tics
numTics = totalTime * sys.getTicsPerSecond();
for( i = 0; i < numTics; i++ ) {
frac = i / numTics;
c = dest * frac + source * ( 1 - frac );
ent.setColor( c_x, c_y, c_z );
// wait one game frame
sys.waitFrame();
}
// make sure we are set to exactly the destination color
ent.setColor( dest_x, dest_y, dest_z );
}
/*
==================
interpolateShaderParm
Interpolates a single shader parm on an entity over a specified amount of time
==================
*/
void interpolateShaderParm( entity ent, float parm, float fromValue, float toValue, float totalTime ) {
float i;
float value;
float frac;
float numTics;
// convert to the total number of game tics
numTics = totalTime * sys.getTicsPerSecond();
for( i = 0; i < numTics; i++ ) {
frac = i / numTics;
value = toValue * frac + fromValue * ( 1 - frac );
ent.setShaderParm( parm, value );
ent.setLightParm( parm, value );
// wait one game frame
sys.waitFrame();
}
// make sure we are set to exactly the destination value
ent.setShaderParm( parm, toValue );
ent.setLightParm( parm, toValue );
}
/*
==================
CalcTimeForRotationAroundEntity
Calculates the time to perform a rotation of an entity around an entity it is bound to given
the angles to rotate and the desired speed.
==================
*/
float CalcTimeForRotationAroundEntity( float distanceFromCenter, float angles, float desiredSpeed ) {
float distance;
if ( desiredSpeed <= 0 ) {
return 0;
}
distance = DEG2RAD( angles ) * distanceFromCenter;
return distance / desiredSpeed;
}
/*
==================
func_clipmodel spawn function
==================
*/
void func_clipmodel() {
// do nothing
}
/*
==================
RandomDelay
==================
*/
float RandomDelay( float min, float max ) {
float t;
t = sys.getTime();
t += min + sys.random( max - min );
return t;
}
/*
==================
RandomTime
==================
*/
float RandomTime( float delay ) {
float t;
t = sys.getTime();
t += sys.random( delay );
return t;
}
/*
==================
DelayTime
==================
*/
float DelayTime( float delay ) {
float t;
t = sys.getTime();
t += delay;
t += sys.random( 2 ) - 1;
return t;
}