📄 cl_fx.c
字号:
/*
===============
CL_ExplosionParticles
===============
*/
void CL_ExplosionParticles (vec3_t org)
{
int i, j;
cparticle_t *p;
for (i=0 ; i<256 ; i++)
{
if (!free_particles)
return;
p = free_particles;
free_particles = p->next;
p->next = active_particles;
active_particles = p;
p->time = cl.time;
p->color = 0xe0 + (rand()&7);
for (j=0 ; j<3 ; j++)
{
p->org[j] = org[j] + ((rand()%32)-16);
p->vel[j] = (rand()%384)-192;
}
p->accel[0] = p->accel[1] = 0;
p->accel[2] = -PARTICLE_GRAVITY;
p->alpha = 1.0;
p->alphavel = -0.8 / (0.5 + frand()*0.3);
}
}
/*
===============
CL_BigTeleportParticles
===============
*/
void CL_BigTeleportParticles (vec3_t org)
{
int i;
cparticle_t *p;
float angle, dist;
static int colortable[4] = {2*8,13*8,21*8,18*8};
for (i=0 ; i<4096 ; i++)
{
if (!free_particles)
return;
p = free_particles;
free_particles = p->next;
p->next = active_particles;
active_particles = p;
p->time = cl.time;
p->color = colortable[rand()&3];
angle = M_PI*2*(rand()&1023)/1023.0;
dist = rand()&31;
p->org[0] = org[0] + cos(angle)*dist;
p->vel[0] = cos(angle)*(70+(rand()&63));
p->accel[0] = -cos(angle)*100;
p->org[1] = org[1] + sin(angle)*dist;
p->vel[1] = sin(angle)*(70+(rand()&63));
p->accel[1] = -sin(angle)*100;
p->org[2] = org[2] + 8 + (rand()%90);
p->vel[2] = -100 + (rand()&31);
p->accel[2] = PARTICLE_GRAVITY*4;
p->alpha = 1.0;
p->alphavel = -0.3 / (0.5 + frand()*0.3);
}
}
/*
===============
CL_BlasterParticles
Wall impact puffs
===============
*/
void CL_BlasterParticles (vec3_t org, vec3_t dir)
{
int i, j;
cparticle_t *p;
float d;
int count;
count = 40;
for (i=0 ; i<count ; i++)
{
if (!free_particles)
return;
p = free_particles;
free_particles = p->next;
p->next = active_particles;
active_particles = p;
p->time = cl.time;
p->color = 0xe0 + (rand()&7);
d = rand()&15;
for (j=0 ; j<3 ; j++)
{
p->org[j] = org[j] + ((rand()&7)-4) + d*dir[j];
p->vel[j] = dir[j] * 30 + crand()*40;
}
p->accel[0] = p->accel[1] = 0;
p->accel[2] = -PARTICLE_GRAVITY;
p->alpha = 1.0;
p->alphavel = -1.0 / (0.5 + frand()*0.3);
}
}
/*
===============
CL_BlasterTrail
===============
*/
void CL_BlasterTrail (vec3_t start, vec3_t end)
{
vec3_t move;
vec3_t vec;
float len;
int j;
cparticle_t *p;
int dec;
VectorCopy (start, move);
VectorSubtract (end, start, vec);
len = VectorNormalize (vec);
dec = 5;
VectorScale (vec, 5, vec);
// FIXME: this is a really silly way to have a loop
while (len > 0)
{
len -= dec;
if (!free_particles)
return;
p = free_particles;
free_particles = p->next;
p->next = active_particles;
active_particles = p;
VectorClear (p->accel);
p->time = cl.time;
p->alpha = 1.0;
p->alphavel = -1.0 / (0.3+frand()*0.2);
p->color = 0xe0;
for (j=0 ; j<3 ; j++)
{
p->org[j] = move[j] + crand();
p->vel[j] = crand()*5;
p->accel[j] = 0;
}
VectorAdd (move, vec, move);
}
}
/*
===============
CL_QuadTrail
===============
*/
void CL_QuadTrail (vec3_t start, vec3_t end)
{
vec3_t move;
vec3_t vec;
float len;
int j;
cparticle_t *p;
int dec;
VectorCopy (start, move);
VectorSubtract (end, start, vec);
len = VectorNormalize (vec);
dec = 5;
VectorScale (vec, 5, vec);
while (len > 0)
{
len -= dec;
if (!free_particles)
return;
p = free_particles;
free_particles = p->next;
p->next = active_particles;
active_particles = p;
VectorClear (p->accel);
p->time = cl.time;
p->alpha = 1.0;
p->alphavel = -1.0 / (0.8+frand()*0.2);
p->color = 115;
for (j=0 ; j<3 ; j++)
{
p->org[j] = move[j] + crand()*16;
p->vel[j] = crand()*5;
p->accel[j] = 0;
}
VectorAdd (move, vec, move);
}
}
/*
===============
CL_FlagTrail
===============
*/
void CL_FlagTrail (vec3_t start, vec3_t end, float color)
{
vec3_t move;
vec3_t vec;
float len;
int j;
cparticle_t *p;
int dec;
VectorCopy (start, move);
VectorSubtract (end, start, vec);
len = VectorNormalize (vec);
dec = 5;
VectorScale (vec, 5, vec);
while (len > 0)
{
len -= dec;
if (!free_particles)
return;
p = free_particles;
free_particles = p->next;
p->next = active_particles;
active_particles = p;
VectorClear (p->accel);
p->time = cl.time;
p->alpha = 1.0;
p->alphavel = -1.0 / (0.8+frand()*0.2);
p->color = color;
for (j=0 ; j<3 ; j++)
{
p->org[j] = move[j] + crand()*16;
p->vel[j] = crand()*5;
p->accel[j] = 0;
}
VectorAdd (move, vec, move);
}
}
/*
===============
CL_DiminishingTrail
===============
*/
void CL_DiminishingTrail (vec3_t start, vec3_t end, centity_t *old, int flags)
{
vec3_t move;
vec3_t vec;
float len;
int j;
cparticle_t *p;
float dec;
float orgscale;
float velscale;
VectorCopy (start, move);
VectorSubtract (end, start, vec);
len = VectorNormalize (vec);
dec = 0.5;
VectorScale (vec, dec, vec);
if (old->trailcount > 900)
{
orgscale = 4;
velscale = 15;
}
else if (old->trailcount > 800)
{
orgscale = 2;
velscale = 10;
}
else
{
orgscale = 1;
velscale = 5;
}
while (len > 0)
{
len -= dec;
if (!free_particles)
return;
// drop less particles as it flies
if ((rand()&1023) < old->trailcount)
{
p = free_particles;
free_particles = p->next;
p->next = active_particles;
active_particles = p;
VectorClear (p->accel);
p->time = cl.time;
if (flags & EF_GIB)
{
p->alpha = 1.0;
p->alphavel = -1.0 / (1+frand()*0.4);
p->color = 0xe8 + (rand()&7);
for (j=0 ; j<3 ; j++)
{
p->org[j] = move[j] + crand()*orgscale;
p->vel[j] = crand()*velscale;
p->accel[j] = 0;
}
p->vel[2] -= PARTICLE_GRAVITY;
}
else if (flags & EF_GREENGIB)
{
p->alpha = 1.0;
p->alphavel = -1.0 / (1+frand()*0.4);
p->color = 0xdb + (rand()&7);
for (j=0; j< 3; j++)
{
p->org[j] = move[j] + crand()*orgscale;
p->vel[j] = crand()*velscale;
p->accel[j] = 0;
}
p->vel[2] -= PARTICLE_GRAVITY;
}
else
{
p->alpha = 1.0;
p->alphavel = -1.0 / (1+frand()*0.2);
p->color = 4 + (rand()&7);
for (j=0 ; j<3 ; j++)
{
p->org[j] = move[j] + crand()*orgscale;
p->vel[j] = crand()*velscale;
}
p->accel[2] = 20;
}
}
old->trailcount -= 5;
if (old->trailcount < 100)
old->trailcount = 100;
VectorAdd (move, vec, move);
}
}
void MakeNormalVectors (vec3_t forward, vec3_t right, vec3_t up)
{
float d;
// this rotate and negat guarantees a vector
// not colinear with the original
right[1] = -forward[0];
right[2] = forward[1];
right[0] = forward[2];
d = DotProduct (right, forward);
VectorMA (right, -d, forward, right);
VectorNormalize (right);
CrossProduct (right, forward, up);
}
/*
===============
CL_RocketTrail
===============
*/
void CL_RocketTrail (vec3_t start, vec3_t end, centity_t *old)
{
vec3_t move;
vec3_t vec;
float len;
int j;
cparticle_t *p;
float dec;
// smoke
CL_DiminishingTrail (start, end, old, EF_ROCKET);
// fire
VectorCopy (start, move);
VectorSubtract (end, start, vec);
len = VectorNormalize (vec);
dec = 1;
VectorScale (vec, dec, vec);
while (len > 0)
{
len -= dec;
if (!free_particles)
return;
if ( (rand()&7) == 0)
{
p = free_particles;
free_particles = p->next;
p->next = active_particles;
active_particles = p;
VectorClear (p->accel);
p->time = cl.time;
p->alpha = 1.0;
p->alphavel = -1.0 / (1+frand()*0.2);
p->color = 0xdc + (rand()&3);
for (j=0 ; j<3 ; j++)
{
p->org[j] = move[j] + crand()*5;
p->vel[j] = crand()*20;
}
p->accel[2] = -PARTICLE_GRAVITY;
}
VectorAdd (move, vec, move);
}
}
/*
===============
CL_RailTrail
===============
*/
void CL_RailTrail (vec3_t start, vec3_t end)
{
vec3_t move;
vec3_t vec;
float len;
int j;
cparticle_t *p;
float dec;
vec3_t right, up;
int i;
float d, c, s;
vec3_t dir;
byte clr = 0x74;
VectorCopy (start, move);
VectorSubtract (end, start, vec);
len = VectorNormalize (vec);
MakeNormalVectors (vec, right, up);
for (i=0 ; i<len ; i++)
{
if (!free_particles)
return;
p = free_particles;
free_particles = p->next;
p->next = active_particles;
active_particles = p;
p->time = cl.time;
VectorClear (p->accel);
d = i * 0.1;
c = cos(d);
s = sin(d);
VectorScale (right, c, dir);
VectorMA (dir, s, up, dir);
p->alpha = 1.0;
p->alphavel = -1.0 / (1+frand()*0.2);
p->color = clr + (rand()&7);
for (j=0 ; j<3 ; j++)
{
p->org[j] = move[j] + dir[j]*3;
p->vel[j] = dir[j]*6;
}
VectorAdd (move, vec, move);
}
dec = 0.75;
VectorScale (vec, dec, vec);
VectorCopy (start, move);
while (len > 0)
{
len -= dec;
if (!free_particles)
return;
p = free_particles;
free_particles = p->next;
p->next = active_particles;
active_particles = p;
p->time = cl.time;
VectorClear (p->accel);
p->alpha = 1.0;
p->alphavel = -1.0 / (0.6+frand()*0.2);
p->color = 0x0 + rand()&15;
for (j=0 ; j<3 ; j++)
{
p->org[j] = move[j] + crand()*3;
p->vel[j] = crand()*3;
p->accel[j] = 0;
}
VectorAdd (move, vec, move);
}
}
// RAFAEL
/*
===============
CL_IonripperTrail
===============
*/
void CL_IonripperTrail (vec3_t start, vec3_t ent)
{
vec3_t move;
vec3_t vec;
float len;
int j;
cparticle_t *p;
int dec;
int left = 0;
VectorCopy (start, move);
VectorSubtract (ent, start, vec);
len = VectorNormalize (vec);
dec = 5;
VectorScale (vec, 5, vec);
while (len > 0)
{
len -= dec;
if (!free_particles)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -