quake-rogue/TIMEMACH.QC

223 lines
5.0 KiB
Plaintext
Raw Normal View History

1997-05-01 00:00:00 +00:00
// timemach.qc
// pmack
// jan97
// ------------------------------------------------
// time machine and related parts
// ------------------------------------------------
void() time_chunk =
{
local entity timeChunk;
timeChunk = spawn();
setmodel(timeChunk, "progs/timegib.mdl");
timeChunk.solid = SOLID_NOT;
timeChunk.movetype = MOVETYPE_TOSS;
makevectors (self.owner.angles);
setorigin ( timeChunk, self.owner.origin + v_forward*84 - v_up * 136);
timeChunk.velocity = v_up * -50;
timeChunk.avelocity = '300 300 300';
timeChunk.angles = self.owner.angles;
sound (self, CHAN_WEAPON, "weapons/r_exp3.wav", 1, ATTN_NONE);
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
WriteByte (MSG_BROADCAST, TE_EXPLOSION);
WriteCoord (MSG_BROADCAST, timeChunk.origin_x);
WriteCoord (MSG_BROADCAST, timeChunk.origin_y);
WriteCoord (MSG_BROADCAST, timeChunk.origin_z);
self.owner.frame = 1;
timeChunk.think = SUB_Remove;
timeChunk.nextthink = time + 5;
};
void() time_stop_shake =
{
SUB_UseTargets();
remove (self);
};
void() time_boom =
{
local entity stopShakeEnt;
SUB_UseTargets();
if(self.owner.health < 1250 && self.owner.frame > 0)
{
if ( self.owner.skin < 2)
{
self.owner.frame = 2;
self.owner.skin = 2;
}
}
else if(self.owner.health < 1500)
{
if ( self.owner.frame == 0 )
{
time_chunk();
self.owner.frame = 1;
self.owner.skin = 1;
}
}
sound (self, CHAN_WEAPON, "weapons/r_exp3.wav", 1, ATTN_NONE);
if (random() < 0.5)
{
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
WriteByte (MSG_BROADCAST, TE_EXPLOSION);
WriteCoord (MSG_BROADCAST, self.origin_x);
WriteCoord (MSG_BROADCAST, self.origin_y);
WriteCoord (MSG_BROADCAST, self.origin_z);
}
else
{
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
WriteByte (MSG_BROADCAST, TE_EXPLOSION2);
WriteCoord (MSG_BROADCAST, self.origin_x);
WriteCoord (MSG_BROADCAST, self.origin_y);
WriteCoord (MSG_BROADCAST, self.origin_z);
WriteByte (MSG_BROADCAST, 244);
WriteByte (MSG_BROADCAST, 3);
}
BecomeExplosion();
stopShakeEnt = spawn();
stopShakeEnt.target = self.target;
stopShakeEnt.think = time_stop_shake;
stopShakeEnt.nextthink = time + 0.7;
};
void() time_fall =
{
if (!self.pain_finished)
{
if ( self.origin_z < -20 )
{
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
WriteByte (MSG_BROADCAST, TE_LAVASPLASH);
WriteCoord (MSG_BROADCAST, self.origin_x);
WriteCoord (MSG_BROADCAST, self.origin_y);
WriteCoord (MSG_BROADCAST, self.origin_z - 80);
self.pain_finished = 1;
}
else if (random() < 0.3)
{
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
WriteByte (MSG_BROADCAST, TE_EXPLOSION);
WriteCoord (MSG_BROADCAST, self.origin_x);
WriteCoord (MSG_BROADCAST, self.origin_y);
WriteCoord (MSG_BROADCAST, self.origin_z);
}
}
self.velocity_z = self.velocity_z - 5;
self.nextthink = time + 0.1;
self.think = time_fall;
};
void() time_crash =
{
self.takedamage = DAMAGE_NO;
self.movetype = MOVETYPE_FLY;
self.solid = SOLID_NOT;
self.velocity = '0 0 -50';
self.avelocity = '15 0 5';
setsize (self, '0 0 0', '0 0 0');
self.think = time_fall;
self.nextthink = time + 0.1;
self.target = "timeramp";
SUB_UseTargets();
};
void(entity attacker, float take) time_pain =
{
local entity painEnt;
local vector painOrg;
local float painRnd;
if ( self.health > 1100 )
if ( self.pain_finished > time )
return;
painRnd = random();
if(painRnd < 0.4)
{
self.pain_finished = time + 2;
painRnd = random();
makevectors ( self.angles );
painEnt = spawn();
if ( painRnd < 0.33 )
painEnt.origin = self.origin + v_forward*80 - v_up*64;
else if (painRnd < 0.66)
painEnt.origin = self.origin + v_right*80 - v_up*24;
else
painEnt.origin = self.origin + v_forward*64 - v_up*48 - v_right*48;
painEnt.target = self.target;
painEnt.owner = self;
painEnt.think = time_boom;
painEnt.nextthink = time + 0.2 + random() * 0.3;
}
if ( self.health < 1000 )
{
self.pain_finished = 0;
self.th_pain = SUB_Null;
self.th_die = SUB_Null;
cutscene_running = 1;
return;
}
};
//(-16 -16 -32) (16 16 0)
/*QUAKED item_time_machine (1 1 0) (-64 -64 -144) (64 64 0)
*/
void() item_time_machine =
{
if (deathmatch)
{
remove (self);
return;
}
precache_model("progs/timemach.mdl");
precache_model("progs/timegib.mdl");
setmodel(self, "progs/timemach.mdl");
self.solid = SOLID_SLIDEBOX;
self.movetype = MOVETYPE_STEP;
self.health = 1600;
self.takedamage = DAMAGE_YES;
self.view_ofs = '0 0 25';
self.movetype = MOVETYPE_FLY;
setsize(self, '-64 -64 -144', '64 64 0');
self.avelocity = '0 60 0';
self.flags = self.flags | FL_MONSTER;
self.th_stand = SUB_Null;
self.th_walk = SUB_Null;
self.th_run = SUB_Null;
self.th_die = time_pain;
self.th_missile = SUB_Null;
self.th_pain = time_pain;
theMachine = self;
};
/*QUAKED item_time_core (1 0 0) (-8 -8 -8) (8 8 8)
*/
void() item_time_core =
{
if (deathmatch)
{
remove (self);
return;
}
precache_model ("progs/timecore.mdl");
setmodel(self, "progs/timecore.mdl");
self.solid = SOLID_NOT;
self.movetype = MOVETYPE_FLY;
self.avelocity = '60 60 60';
};