206 lines
4.7 KiB
C++
206 lines
4.7 KiB
C++
|
/* train quickc program
|
||
|
by jim dose' 9/11/96
|
||
|
copyright (c)1996 hipnotic interactive, inc.
|
||
|
all rights reserved.
|
||
|
do not distribute.
|
||
|
*/
|
||
|
|
||
|
void() train_blocked;
|
||
|
void() func_train;
|
||
|
void() hip_train_next;
|
||
|
void() hip_func_train_find;
|
||
|
|
||
|
void() hip_train_use =
|
||
|
{
|
||
|
if (self.think != hip_func_train_find)
|
||
|
{
|
||
|
if ( self.velocity != '0 0 0' )
|
||
|
return; // already activated
|
||
|
}
|
||
|
hip_train_next();
|
||
|
};
|
||
|
|
||
|
void() hip_train_wait =
|
||
|
{
|
||
|
if (self.wait)
|
||
|
{
|
||
|
sound (self, chan_voice, self.noise, 1, attn_norm);
|
||
|
if ( self.wait != -1 )
|
||
|
{
|
||
|
self.nextthink = self.ltime + self.wait;
|
||
|
self.wait = 0;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
self.nextthink = self.ltime + 0.1;
|
||
|
|
||
|
self.think = hip_train_next;
|
||
|
};
|
||
|
|
||
|
|
||
|
void() hip_train_next =
|
||
|
{
|
||
|
local entity targ;
|
||
|
local float current;
|
||
|
local string temp;
|
||
|
|
||
|
// get the speed of the current path_corner.
|
||
|
// (we must save this off at each path change since
|
||
|
// we don't have a pointer to the current path_corner).
|
||
|
current = self.cnt;
|
||
|
|
||
|
targ = find (world, targetname, self.target);
|
||
|
|
||
|
// save the speed in cnt for later use
|
||
|
self.cnt = targ.speed;
|
||
|
self.target = targ.target;
|
||
|
if (!self.target)
|
||
|
objerror ("hip_train_next: no next target");
|
||
|
|
||
|
sound (self, chan_voice, self.noise1, 1, attn_norm);
|
||
|
|
||
|
self.wait = targ.wait;
|
||
|
if (targ.wait)
|
||
|
{
|
||
|
self.think = hip_train_wait;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
self.think = hip_train_next;
|
||
|
}
|
||
|
|
||
|
if ( self.goalentity.event )
|
||
|
{
|
||
|
// trigger any events that should happen at the corner.
|
||
|
temp = self.target;
|
||
|
self.target = self.goalentity.event;
|
||
|
self.message = self.goalentity.message;
|
||
|
sub_usetargets();
|
||
|
self.target = temp;
|
||
|
self.message = string_null;
|
||
|
}
|
||
|
|
||
|
// save the current entity
|
||
|
self.goalentity = targ;
|
||
|
|
||
|
if ( current == -1 )
|
||
|
{
|
||
|
// warp to the next path_corner
|
||
|
setorigin (self, targ.origin - self.mins );
|
||
|
self.nextthink = self.ltime + 0.01;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// check if there's a speed change
|
||
|
if (current>0)
|
||
|
self.speed = current;
|
||
|
|
||
|
// travel to the next path change
|
||
|
sub_calcmove (targ.origin - self.mins, self.speed, self.think );
|
||
|
}
|
||
|
};
|
||
|
|
||
|
void() hip_func_train_find =
|
||
|
|
||
|
{
|
||
|
local entity targ;
|
||
|
|
||
|
targ = find (world, targetname, self.target);
|
||
|
|
||
|
// save the current entity
|
||
|
self.goalentity = targ;
|
||
|
|
||
|
// save the speed in cnt for later use
|
||
|
self.cnt = targ.speed;
|
||
|
|
||
|
self.target = targ.target;
|
||
|
setorigin (self, targ.origin - self.mins);
|
||
|
if (!self.targetname)
|
||
|
{ // not triggered, so start immediately
|
||
|
self.nextthink = self.ltime + 0.1;
|
||
|
self.think = hip_train_next;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/*quaked func_train2 (0 .5 .8) ?
|
||
|
this is a modification of the standard func_train entity.
|
||
|
it is functionally equivalent, except that it removes a slight delay that
|
||
|
would occur after each path entry, and it adds a speed variable to the
|
||
|
path_corner entity.
|
||
|
|
||
|
"noise" contains the name of the sound to play when train stops.
|
||
|
"noise1" contains the name of the sound to play when train moves.
|
||
|
both "noise" and "noise1" defaults depend upon "sounds" variable.
|
||
|
|
||
|
in path_corner, set speed to be the new speed of the train after it reaches
|
||
|
the path change. if speed is -1, the train will warp directly to the next
|
||
|
path change after the specified wait time.
|
||
|
|
||
|
also in path_corner, if wait is set to -1, the train will wait until it is
|
||
|
retriggered before moving on to the next goal.
|
||
|
|
||
|
here is a reiteration of the func_train docs:
|
||
|
|
||
|
trains are moving platforms that players can ride.
|
||
|
the targets origin specifies the min point of the train at each corner.
|
||
|
the train spawns at the first target it is pointing at.
|
||
|
if the train is the target of a button or trigger, it will not begin moving until activated.
|
||
|
speed default 100
|
||
|
dmg default 2
|
||
|
sounds
|
||
|
1) ratchet metal
|
||
|
|
||
|
*/
|
||
|
void() func_train2 =
|
||
|
{
|
||
|
if (!self.speed)
|
||
|
self.speed = 100;
|
||
|
if (!self.target)
|
||
|
objerror ("func_train without a target");
|
||
|
if (!self.dmg)
|
||
|
self.dmg = 2;
|
||
|
|
||
|
if ( !self.noise )
|
||
|
{
|
||
|
if (self.sounds == 0)
|
||
|
{
|
||
|
self.noise = ("misc/null.wav");
|
||
|
}
|
||
|
|
||
|
if (self.sounds == 1)
|
||
|
{
|
||
|
self.noise = ("plats/train2.wav");
|
||
|
}
|
||
|
}
|
||
|
if ( !self.noise1 )
|
||
|
{
|
||
|
if (self.sounds == 0)
|
||
|
{
|
||
|
self.noise1 = ("misc/null.wav");
|
||
|
}
|
||
|
if (self.sounds == 1)
|
||
|
{
|
||
|
self.noise1 = ("plats/train1.wav");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
precache_sound( self.noise );
|
||
|
precache_sound( self.noise1 );
|
||
|
|
||
|
self.cnt = 1;
|
||
|
self.solid = solid_bsp;
|
||
|
self.movetype = movetype_push;
|
||
|
self.blocked = train_blocked;
|
||
|
self.use = hip_train_use;
|
||
|
self.classname = "train2";
|
||
|
|
||
|
setmodel (self, self.model);
|
||
|
setsize (self, self.mins , self.maxs);
|
||
|
setorigin (self, self.origin);
|
||
|
|
||
|
// start trains on the second frame, to make sure their targets have had
|
||
|
// a chance to spawn
|
||
|
self.nextthink = self.ltime + 0.1;
|
||
|
self.think = hip_func_train_find;
|
||
|
};
|