📄 cl_newfx.pas
字号:
VectorCopy (cl.v_right, right);
VectorCopy (cl.v_up, up);
VectorMA (move, -0.5, right, move);
VectorMA (move, -0.5, up, move);
for i := 0 to 7 do
begin
if (free_particles = nil) then
Exit;
p := free_particles;
free_particles := p^.next;
p^.next := active_particles;
active_particles := p;
p^.time := cl.time;
VectorClear (p^.accel);
d := crand()*M_PI;
c := cos(d)*30;
s := sin(d)*30;
p^.alpha := 1.0;
p^.alphavel := -5.0 / (1+frand());
p^.color := 223 - (rand() and 7);
for j := 0 to 2 do
begin
p^.org[j] := move[j];
end;
VectorScale (vec, 450, p^.vel);
VectorMA (p^.vel, c, right, p^.vel);
VectorMA (p^.vel, s, up, p^.vel);
end;
// Sly 30-Jun-2002 This section was commented in the original source
(*
ltime = (float) cl.time/1000.0;
start_pt = fmod(ltime*16.0,step);
VectorMA (move, start_pt, vec, move);
VectorScale (vec, step, vec);
// Com_Printf ("%f"#10, ltime);
rstep = M_PI/12.0;
for (i=start_pt ; i<len ; i+=step)
begin
if (i>step*5) // don't bother after the 5th ring
break;
for (rot = 0; rot < M_PI*2; rot += rstep)
begin
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);
// rot+= fmod(ltime, 12.0)*M_PI;
// c = cos(rot)/2.0;
// s = sin(rot)/2.0;
c = cos(rot)/1.5;
s = sin(rot)/1.5;
// trim it so it looks like it's starting at the origin
if (i < 10)
begin
VectorScale (right, c*(i/10.0), dir);
VectorMA (dir, s*(i/10.0), up, dir);
end;
else
begin
VectorScale (right, c, dir);
VectorMA (dir, s, up, dir);
end;
p^.alpha = 0.5;
// p^.alphavel = -1.0 / (1+frand()*0.2);
p^.alphavel = -1000.0;
// p^.color = 0x74 + (rand()&7);
p^.color = 223 - (rand()&7);
for (j=0 ; j<3 ; j++)
begin
p^.org[j] = move[j] + dir[j]*3;
// p^.vel[j] = dir[j]*6;
p^.vel[j] = 0;
end;
end;
VectorAdd (move, vec, move);
end;
*)
end;
{$ENDIF}
(*
===============
CL_ParticleSteamEffect
Puffs with velocity along direction, with some randomness thrown in
===============
*)
procedure CL_ParticleSteamEffect (org, dir: vec3_t; color, count, magnitude: Integer);
var
i, j: Integer;
p: cparticle_p;
d: Single;
r, u: vec3_t;
begin
// vectoangles2 (dir, angle_dir);
// AngleVectors (angle_dir, f, r, u);
MakeNormalVectors (dir, r, u);
for i := 0 to count - 1 do
begin
if (free_particles = nil) then
Exit;
p := free_particles;
free_particles := p^.next;
p^.next := active_particles;
active_particles := p;
p^.time := cl.time;
p^.color := color + (rand() and 7);
for j := 0 to 2 do
begin
p^.org[j] := org[j] + magnitude*0.1*crand();
// p^.vel[j] := dir[j]*magnitude;
end;
VectorScale (dir, magnitude, p^.vel);
d := crand()*magnitude/3;
VectorMA (p^.vel, d, r, p^.vel);
d := crand()*magnitude/3;
VectorMA (p^.vel, d, u, p^.vel);
p^.accel[0] := 0;
p^.accel[1] := 0;
p^.accel[2] := -PARTICLE_GRAVITY/2;
p^.alpha := 1.0;
p^.alphavel := -1.0 / (0.5 + frand()*0.3);
end;
end;
procedure CL_ParticleSteamEffect2 (self: pcl_sustain_t);
//vec3_t org, vec3_t dir, int color, int count, int magnitude)
var
i, j: Integer;
p: cparticle_p;
d: Single;
r, u: vec3_t;
dir: vec3_t;
begin
// vectoangles2 (dir, angle_dir);
// AngleVectors (angle_dir, f, r, u);
VectorCopy (self^.dir, dir);
MakeNormalVectors (dir, r, u);
for i := 0 to self^.count - 1 do
begin
if (free_particles = nil) then
Exit;
p := free_particles;
free_particles := p^.next;
p^.next := active_particles;
active_particles := p;
p^.time := cl.time;
p^.color := self^.color + (rand() and 7);
for j := 0 to 2 do
begin
p^.org[j] := self^.org[j] + self^.magnitude*0.1*crand();
// p^.vel[j] := dir[j]*magnitude;
end;
VectorScale (dir, self^.magnitude, p^.vel);
d := crand()*self^.magnitude/3;
VectorMA (p^.vel, d, r, p^.vel);
d := crand()*self^.magnitude/3;
VectorMA (p^.vel, d, u, p^.vel);
p^.accel[0] := 0;
p^.accel[1] := 0;
p^.accel[2] := -PARTICLE_GRAVITY/2;
p^.alpha := 1.0;
p^.alphavel := -1.0 / (0.5 + frand()*0.3);
end;
self^.nextthink := self^.nextthink + self^.thinkinterval;
end;
(*
===============
CL_TrackerTrail
===============
*)
procedure CL_TrackerTrail (start, end_: vec3_t; particleColor: Integer);
var
move: vec3_t;
vec: vec3_t;
forward_,right,up,angle_dir: vec3_t;
len: Single;
j: Integer;
p: cparticle_p;
dec: Integer;
dist: Single;
begin
VectorCopy (start, move);
VectorSubtract (end_, start, vec);
len := VectorNormalize (vec);
VectorCopy(vec, forward_);
vectoangles2 (forward_, angle_dir);
AngleVectors (angle_dir, @forward_, @right, @up);
dec := 3;
VectorScale (vec, 3, vec);
// FIXME: this is a really silly way to have a loop
while (len > 0) do
begin
len := len - dec;
if (free_particles = nil) then
Exit;
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 := -2.0;
p^.color := particleColor;
dist := DotProduct(move, forward_);
VectorMA(move, 8 * cos(dist), up, p^.org);
for j := 0 to 2 do
begin
// p^.org[j] := move[j] + crand();
p^.vel[j] := 0;
p^.accel[j] := 0;
end;
p^.vel[2] := 5;
VectorAdd (move, vec, move);
end;
end;
procedure CL_Tracker_Shell(origin: vec3_t);
var
dir: vec3_t;
i: Integer;
p: cparticle_p;
begin
for i := 0 to 299 do
begin
if (free_particles = nil) then
Exit;
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 := INSTANT_PARTICLE;
p^.color := 0;
dir[0] := crand();
dir[1] := crand();
dir[2] := crand();
VectorNormalize(dir);
VectorMA(origin, 40, dir, p^.org);
end;
end;
procedure CL_MonsterPlasma_Shell(origin: vec3_t);
var
dir: vec3_t;
i: Integer;
p: cparticle_p;
begin
for i := 0 to 39 do
begin
if (free_particles = nil) then
Exit;
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 := INSTANT_PARTICLE;
p^.color := $e0;
dir[0] := crand();
dir[1] := crand();
dir[2] := crand();
VectorNormalize(dir);
VectorMA(origin, 10, dir, p^.org);
// VectorMA(origin, 10*(((rand () & 0x7fff) / ((float)0x7fff))), dir, p^.org);
end;
end;
procedure CL_Widowbeamout (self: pcl_sustain_t);
const
colortable: array [0..3] of Integer = (2*8,13*8,21*8,18*8);
var
dir: vec3_t;
i: Integer;
p: cparticle_p;
ratio: Single;
begin
ratio := 1.0 - ((self^.endtime - cl.time)/2100.0);
for i := 0 to 299 do
begin
if (free_particles = nil) then
Exit;
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 := INSTANT_PARTICLE;
p^.color := colortable[rand() and 3];
dir[0] := crand();
dir[1] := crand();
dir[2] := crand();
VectorNormalize(dir);
VectorMA(self^.org, (45.0 * ratio), dir, p^.org);
// VectorMA(origin, 10*(((rand () & 0x7fff) / ((float)0x7fff))), dir, p^.org);
end;
end;
procedure CL_Nukeblast (self: pcl_sustain_t);
const
colortable: array [0..3] of Integer = (110, 112, 114, 116);
var
dir: vec3_t;
i: Integer;
p: cparticle_p;
ratio: Single;
begin
ratio := 1.0 - ((self^.endtime - cl.time)/1000.0);
for i := 0 to 699 do
begin
if (free_particles = nil) then
Exit;
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 := INSTANT_PARTICLE;
p^.color := colortable[rand() and 3];
dir[0] := crand();
dir[1] := crand();
dir[2] := crand();
VectorNormalize(dir);
VectorMA(self^.org, (200.0 * ratio), dir, p^.org);
// VectorMA(origin, 10*(((rand () & 0x7fff) / ((float)0x7fff))), dir, p^.org);
end;
end;
procedure CL_WidowSplash (org: vec3_t);
const
colortable: array [0..3] of Integer = (2*8,13*8,21*8,18*8);
var
i: Integer;
p: cparticle_p;
dir: vec3_t;
begin
for i := 0 to 255 do
begin
if (free_particles = nil) then
Exit;
p := free_particles;
free_particles := p^.next;
p^.next := active_particles;
active_particles := p;
p^.time := cl.time;
p^.color := colortable[rand() and 3];
dir[0] := crand();
dir[1] := crand();
dir[2] := crand();
VectorNormalize(dir);
VectorMA(org, 45.0, dir, p^.org);
VectorMA(vec3_origin, 40.0, dir, p^.vel);
p^.accel[0] := 0;
p^.accel[1] := 0;
p^.alpha := 1.0;
p^.alphavel := -0.8 / (0.5 + frand()*0.3);
end;
end;
procedure CL_Tracker_Explode(origin: vec3_t);
var
dir, backdir: vec3_t;
i: Integer;
p: cparticle_p;
begin
for i := 0 to 299 do
begin
if (free_particles = nil) then
Exit;
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;
p^.color := 0;
dir[0] := crand();
dir[1] := crand();
dir[2] := crand();
VectorNormalize(dir);
VectorScale(dir, -1, backdir);
VectorMA(origin, 64, dir, p^.org);
VectorScale(backdir, 64, p^.vel);
end;
end;
(*
===============
CL_TagTrail
===============
*)
procedure CL_TagTrail (start, end_: vec3_t; color: Single);
var
move: vec3_t;
vec: vec3_t;
len: Single;
j: Integer;
p: cparticle_p;
dec: Integer;
begin
VectorCopy (start, move);
VectorSubtract (end_, start, vec);
len := VectorNormalize (vec);
dec := 5;
VectorScale (vec, 5, vec);
while (len >= 0) do
begin
len := len - dec;
if (free_particles = nil) then
Exit;
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 to 2 do
begin
p^.org[j] := move[j] + crand()*16;
p^.vel[j] := crand()*5;
p^.accel[j] := 0;
end;
VectorAdd (move, vec, move);
end;
end;
(*
===============
CL_ColorExplosionParticles
===============
*)
procedure CL_ColorExplosionParticles (org: vec3_t; color, run: Integer);
var
i, j: Integer;
p: cparticle_p;
begin
for i := 0 to 127 do
begin
if (free_particles = nil) then
Exit;
p := free_particles;
free_particles := p^.next;
p^.next := active_particles;
active_particles := p;
p^.time := cl.time;
p^.color := color + (rand() mod run);
for j := 0 to 2 do
begin
p^.org[j] := org[j] + ((rand() mod 32)-16);
p^.vel[j] := (rand() mod 256)-128;
end;
p^.accel[0] := 0;
p^.accel[1] := 0;
p^.accel[2] := -PARTICLE_GRAVITY;
p^.alpha := 1.0;
p^.alphavel := -0.4 / (0.6 + frand()*0.2);
end;
end;
(*
===============
CL_ParticleSmokeEffect - like the steam effect, but unaffected by gravity
===============
*)
procedure CL_ParticleSmokeEffect (org, dir: vec3_t; color, count, magnitude: Integer);
var
i, j: Integer;
p: cparticle_p;
d: Single;
r, u: vec3_t;
begin
MakeNormalVectors (dir, r, u);
for i := 0 to count - 1 do
begin
if (free_particles = nil) then
Exit;
p := free_particles;
free_particles := p^.next;
p^.next := active_particles;
active_particles := p;
p^.time := cl.time;
p^.color := color + (rand() and 7);
for j := 0 to 2 do
begin
p^.org[j] := org[j] + magnitude*0.1*crand();
// p^.vel[j] := dir[j]*magnitude;
end;
VectorScale (dir, magnitude, p^.vel);
d := crand()*magnitude/3;
VectorMA (p^.vel, d, r, p^.vel);
d := crand()*magnitude/3;
VectorMA (p^.vel, d, u, p^.vel);
p^.accel[0] := 0;
p^.accel[1] := 0;
p^.accel[2] := 0;
p^.alpha := 1.0;
p^.alphavel := -1.0 / (0.5 + frand()*0.3);
end;
end;
(*
===============
CL_BlasterParticles2
Wall impact puffs (Green)
===============
*)
procedure CL_BlasterParticles2 (org, dir: vec3_t; color: Cardinal);
var
i, j: Integer;
p: cparticle_p;
d: Single;
count: Integer;
begin
count := 40;
for i := 0 to count - 1 do
begin
if (free_particles = nil) then
Exit;
p := free_particles;
free_particles := p^.next;
p^.next := active_particles;
active_particles := p;
p^.time := cl.time;
p^.color := color + Cardinal(rand() and 7);
d := rand() and 15;
for j := 0 to 2 do
begin
p^.org[j] := org[j] + ((rand() and 7)-4) + d*dir[j];
p^.vel[j] := dir[j] * 30 + crand()*40;
end;
p^.accel[0] := 0;
p^.accel[1] := 0;
p^.accel[2] := -PARTICLE_GRAVITY;
p^.alpha := 1.0;
p^.alphavel := -1.0 / (0.5 + frand()*0.3);
end;
end;
(*
===============
CL_BlasterTrail2
Green!
===============
*)
procedure CL_BlasterTrail2 (start, end_: vec3_t);
var
move: vec3_t;
vec: vec3_t;
len: Single;
j: Integer;
p: cparticle_p;
dec: Integer;
begin
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) do
begin
len := len - dec;
if (free_particles = nil) then
Exit;
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 := $d0;
for j := 0 to 2 do
begin
p^.org[j] := move[j] + crand();
p^.vel[j] := crand()*5;
p^.accel[j] := 0;
end;
VectorAdd (move, vec, move);
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -