📄 cl_newfx.pas
字号:
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(const 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(const 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: cl_sustain_p);
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: cl_sustain_p);
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(const 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(const 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(const 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(const 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(var 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(const 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(const 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 + -