mirror of
https://github.com/id-Software/quake-rerelease-qc.git
synced 2024-11-24 05:01:43 +00:00
172 lines
4.4 KiB
C++
172 lines
4.4 KiB
C++
|
/* Copyright (C) 1996-2022 id Software LLC
|
||
|
|
||
|
This program is free software; you can redistribute it and/or modify
|
||
|
it under the terms of the GNU General Public License as published by
|
||
|
the Free Software Foundation; either version 2 of the License, or
|
||
|
(at your option) any later version.
|
||
|
|
||
|
This program is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
GNU General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU General Public License
|
||
|
along with this program; if not, write to the Free Software
|
||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||
|
|
||
|
See file, 'COPYING', for details.
|
||
|
*/
|
||
|
|
||
|
// new ai functions
|
||
|
//
|
||
|
// pmack
|
||
|
|
||
|
// ================================================================
|
||
|
// ai_orbit - used to have an object orbit an entity.
|
||
|
//
|
||
|
// destEnt: the entity to orbit
|
||
|
// radius: how large a radius to orbit at (0 will just track)
|
||
|
// offset: center of the orbit. this is added to dest.origin.
|
||
|
//
|
||
|
// Uses self.orbitPosition to determine current destination.
|
||
|
// ================================================================
|
||
|
void(entity destEnt, float radius, vector offset) ai_orbit =
|
||
|
{
|
||
|
local vector dir;
|
||
|
local float dist;
|
||
|
|
||
|
if (self.orbitPosition > 3)
|
||
|
self.orbitPosition = 0;
|
||
|
else if (self.orbitPosition < 0)
|
||
|
self.orbitPosition = 0;
|
||
|
|
||
|
traceline ( self.origin, destEnt.origin + offset, TRUE, world);
|
||
|
if ( trace_fraction < 1 )
|
||
|
{
|
||
|
setorigin (self, destEnt.origin + offset);
|
||
|
self.orbitPosition = self.orbitPosition + 1;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if ( self.orbitPosition == 0)
|
||
|
{
|
||
|
dir = (destEnt.origin + offset) - self.origin;
|
||
|
dir_x = dir_x + radius;
|
||
|
}
|
||
|
else if ( self.orbitPosition == 1)
|
||
|
{
|
||
|
dir = (destEnt.origin + offset) - self.origin;
|
||
|
dir_y = dir_y + radius;
|
||
|
}
|
||
|
else if ( self.orbitPosition == 2)
|
||
|
{
|
||
|
dir = (destEnt.origin + offset) - self.origin;
|
||
|
dir_x = dir_x - radius;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
dir = (destEnt.origin + offset) - self.origin;
|
||
|
dir_y = dir_y - radius;
|
||
|
}
|
||
|
|
||
|
dist = vlen(dir);
|
||
|
|
||
|
if( dist < 8 )
|
||
|
{
|
||
|
self.orbitPosition = self.orbitPosition + 1;
|
||
|
}
|
||
|
else if( dist < 50 )
|
||
|
{
|
||
|
self.velocity = normalize(dir);
|
||
|
self.velocity = self.velocity * 150;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
self.velocity = normalize(dir);
|
||
|
self.velocity = self.velocity * 500;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// ================================================================
|
||
|
// ai_track - used to have an object chase/track an enemy. the object
|
||
|
// flies directly at the destEnt's view_ofs point.
|
||
|
//
|
||
|
// destEnt: the entity to orbit
|
||
|
// trackSpeed: the velocity multiplier (speed) of the object
|
||
|
// ================================================================
|
||
|
void(entity destEnt, float trackSpeed) ai_track =
|
||
|
{
|
||
|
local vector dir;
|
||
|
|
||
|
dir = destEnt.origin + destEnt.view_ofs;
|
||
|
dir = normalize(dir - self.origin);
|
||
|
self.velocity = dir * trackSpeed;
|
||
|
};
|
||
|
|
||
|
// ================================================================
|
||
|
// ViolentDeath
|
||
|
// ================================================================
|
||
|
|
||
|
void(string gibname, float dm) AccelerateGib =
|
||
|
{
|
||
|
local entity new;
|
||
|
|
||
|
local float offset1;
|
||
|
|
||
|
new = spawn();
|
||
|
new.origin = self.origin;
|
||
|
setmodel (new, gibname);
|
||
|
setsize (new, '-8 -8 -8', '8 8 8');
|
||
|
|
||
|
new.velocity = -1.25 * self.velocity;
|
||
|
makevectors ( new.velocity );
|
||
|
offset1 = random() * 300 - 150;
|
||
|
new.velocity = new.velocity + v_right * offset1;
|
||
|
offset1 = random() * 300 - 150;
|
||
|
new.velocity = new.velocity + v_up * offset1;
|
||
|
|
||
|
|
||
|
new.movetype = MOVETYPE_BOUNCE;
|
||
|
new.solid = SOLID_NOT;
|
||
|
new.avelocity_x = random()*600;
|
||
|
new.avelocity_y = random()*600;
|
||
|
new.avelocity_z = random()*600;
|
||
|
new.think = SUB_Remove;
|
||
|
new.ltime = time;
|
||
|
new.nextthink = time + 10 + random()*10;
|
||
|
new.frame = 0;
|
||
|
new.flags = 0;
|
||
|
};
|
||
|
|
||
|
void(float gibCount) ViolentDeath =
|
||
|
{
|
||
|
while(gibCount > 0)
|
||
|
{
|
||
|
AccelerateGib ("progs/gib1.mdl", (-4 * gibCount));
|
||
|
AccelerateGib ("progs/gib2.mdl", (-6 * gibCount));
|
||
|
AccelerateGib ("progs/gib3.mdl", (-8 * gibCount));
|
||
|
gibCount = gibCount - 3;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
entity(string gibname) StartGib =
|
||
|
{
|
||
|
local entity new;
|
||
|
|
||
|
new = spawn();
|
||
|
new.origin = self.origin;
|
||
|
setmodel (new, gibname);
|
||
|
setsize (new, '0 0 0', '0 0 0');
|
||
|
|
||
|
new.movetype = MOVETYPE_BOUNCE;
|
||
|
new.solid = SOLID_NOT;
|
||
|
new.think = SUB_Remove;
|
||
|
new.ltime = time;
|
||
|
new.nextthink = time + 10 + random()*10;
|
||
|
new.frame = 0;
|
||
|
new.flags = 0;
|
||
|
|
||
|
return new;
|
||
|
};
|
||
|
|