mirror of
https://github.com/id-Software/quake-rerelease-qc.git
synced 2026-03-19 16:39:51 +01:00
Initial commit of Update 3 QuakeC
This commit is contained in:
171
quakec_rogue/new_ai.qc
Normal file
171
quakec_rogue/new_ai.qc
Normal file
@@ -0,0 +1,171 @@
|
||||
/* 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;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user