|
|
1.1 root 1: // cl_fx.c -- entity effects parsing and management
1.1.1.2 root 2:
1.1 root 3: #include "client.h"
1.1.1.2 root 4:
1.1 root 5: void CL_LogoutEffect (vec3_t org, int type);
6: void CL_ItemRespawnParticles (vec3_t org);
1.1.1.2 root 7:
1.1 root 8: static vec3_t avelocities [NUMVERTEXNORMALS];
9:
10: extern struct model_s *cl_mod_smoke;
11: extern struct model_s *cl_mod_flash;
1.1.1.2 root 12:
1.1 root 13: /*
14: ==============================================================
1.1.1.2 root 15:
1.1 root 16: LIGHT STYLE MANAGEMENT
1.1.1.2 root 17:
1.1 root 18: ==============================================================
19: */
1.1.1.2 root 20:
1.1 root 21: typedef struct
22: {
23: int length;
24: float value[3];
25: float map[MAX_QPATH];
26: } clightstyle_t;
1.1.1.2 root 27:
1.1 root 28: clightstyle_t cl_lightstyle[MAX_LIGHTSTYLES];
29: int lastofs;
1.1.1.2 root 30:
1.1 root 31: /*
32: ================
33: CL_ClearLightStyles
34: ================
35: */
36: void CL_ClearLightStyles (void)
37: {
38: memset (cl_lightstyle, 0, sizeof(cl_lightstyle));
39: lastofs = -1;
40: }
1.1.1.2 root 41:
1.1 root 42: /*
43: ================
44: CL_RunLightStyles
45: ================
46: */
47: void CL_RunLightStyles (void)
48: {
49: int ofs;
50: int i;
51: clightstyle_t *ls;
1.1.1.2 root 52:
1.1 root 53: ofs = cl.time / 100;
54: if (ofs == lastofs)
55: return;
56: lastofs = ofs;
1.1.1.2 root 57:
1.1 root 58: for (i=0,ls=cl_lightstyle ; i<MAX_LIGHTSTYLES ; i++, ls++)
59: {
60: if (!ls->length)
61: {
62: ls->value[0] = ls->value[1] = ls->value[2] = 1.0;
63: continue;
64: }
65: if (ls->length == 1)
66: ls->value[0] = ls->value[1] = ls->value[2] = ls->map[0];
67: else
68: ls->value[0] = ls->value[1] = ls->value[2] = ls->map[ofs%ls->length];
69: }
70: }
1.1.1.2 root 71:
72:
1.1 root 73: void CL_SetLightstyle (int i)
74: {
75: char *s;
76: int j, k;
1.1.1.2 root 77:
1.1 root 78: s = cl.configstrings[i+CS_LIGHTS];
1.1.1.2 root 79:
1.1 root 80: j = strlen (s);
81: if (j >= MAX_QPATH)
82: Com_Error (ERR_DROP, "svc_lightstyle length=%i", j);
1.1.1.2 root 83:
1.1 root 84: cl_lightstyle[i].length = j;
1.1.1.2 root 85:
1.1 root 86: for (k=0 ; k<j ; k++)
87: cl_lightstyle[i].map[k] = (float)(s[k]-'a')/(float)('m'-'a');
88: }
1.1.1.2 root 89:
1.1 root 90: /*
91: ================
92: CL_AddLightStyles
93: ================
94: */
95: void CL_AddLightStyles (void)
96: {
97: int i;
98: clightstyle_t *ls;
1.1.1.2 root 99:
1.1 root 100: for (i=0,ls=cl_lightstyle ; i<MAX_LIGHTSTYLES ; i++, ls++)
101: V_AddLightStyle (i, ls->value[0], ls->value[1], ls->value[2]);
102: }
1.1.1.2 root 103:
1.1 root 104: /*
105: ==============================================================
1.1.1.2 root 106:
1.1 root 107: DLIGHT MANAGEMENT
1.1.1.2 root 108:
1.1 root 109: ==============================================================
110: */
1.1.1.2 root 111:
1.1 root 112: cdlight_t cl_dlights[MAX_DLIGHTS];
1.1.1.2 root 113:
1.1 root 114: /*
115: ================
116: CL_ClearDlights
117: ================
118: */
119: void CL_ClearDlights (void)
120: {
121: memset (cl_dlights, 0, sizeof(cl_dlights));
122: }
1.1.1.2 root 123:
1.1 root 124: /*
125: ===============
126: CL_AllocDlight
1.1.1.2 root 127:
1.1 root 128: ===============
129: */
130: cdlight_t *CL_AllocDlight (int key)
131: {
132: int i;
133: cdlight_t *dl;
1.1.1.2 root 134:
1.1 root 135: // first look for an exact key match
136: if (key)
137: {
138: dl = cl_dlights;
139: for (i=0 ; i<MAX_DLIGHTS ; i++, dl++)
140: {
141: if (dl->key == key)
142: {
143: memset (dl, 0, sizeof(*dl));
144: dl->key = key;
145: return dl;
146: }
147: }
148: }
1.1.1.2 root 149:
1.1 root 150: // then look for anything else
151: dl = cl_dlights;
152: for (i=0 ; i<MAX_DLIGHTS ; i++, dl++)
153: {
154: if (dl->die < cl.time)
155: {
156: memset (dl, 0, sizeof(*dl));
157: dl->key = key;
158: return dl;
159: }
160: }
1.1.1.2 root 161:
1.1 root 162: dl = &cl_dlights[0];
163: memset (dl, 0, sizeof(*dl));
164: dl->key = key;
165: return dl;
166: }
1.1.1.2 root 167:
1.1 root 168: /*
169: ===============
170: CL_NewDlight
171: ===============
172: */
173: void CL_NewDlight (int key, float x, float y, float z, float radius, float time)
174: {
175: cdlight_t *dl;
1.1.1.2 root 176:
1.1 root 177: dl = CL_AllocDlight (key);
178: dl->origin[0] = x;
179: dl->origin[1] = y;
180: dl->origin[2] = z;
181: dl->radius = radius;
182: dl->die = cl.time + time;
183: }
1.1.1.2 root 184:
185:
1.1 root 186: /*
187: ===============
188: CL_RunDLights
1.1.1.2 root 189:
1.1 root 190: ===============
191: */
192: void CL_RunDLights (void)
193: {
194: int i;
195: cdlight_t *dl;
1.1.1.2 root 196:
1.1 root 197: dl = cl_dlights;
198: for (i=0 ; i<MAX_DLIGHTS ; i++, dl++)
199: {
200: if (!dl->radius)
201: continue;
202:
203: if (dl->die < cl.time)
204: {
205: dl->radius = 0;
206: return;
207: }
208: dl->radius -= cls.frametime*dl->decay;
209: if (dl->radius < 0)
210: dl->radius = 0;
211: }
212: }
1.1.1.2 root 213:
1.1 root 214: /*
215: ==============
216: CL_ParseMuzzleFlash
217: ==============
218: */
219: void CL_ParseMuzzleFlash (void)
220: {
221: vec3_t fv, rv;
222: cdlight_t *dl;
223: int i, weapon;
224: centity_t *pl;
225: int silenced;
226: float volume;
227: char soundname[64];
1.1.1.2 root 228:
1.1 root 229: i = MSG_ReadShort (&net_message);
230: if (i < 1 || i >= MAX_EDICTS)
231: Com_Error (ERR_DROP, "CL_ParseMuzzleFlash: bad entity");
232:
233: weapon = MSG_ReadByte (&net_message);
234: silenced = weapon & MZ_SILENCED;
235: weapon &= ~MZ_SILENCED;
1.1.1.2 root 236:
1.1 root 237: pl = &cl_entities[i];
1.1.1.2 root 238:
1.1 root 239: dl = CL_AllocDlight (i);
240: VectorCopy (pl->current.origin, dl->origin);
241: AngleVectors (pl->current.angles, fv, rv, NULL);
242: VectorMA (dl->origin, 18, fv, dl->origin);
243: VectorMA (dl->origin, 16, rv, dl->origin);
244: if (silenced)
245: dl->radius = 100 + (rand()&31);
246: else
247: dl->radius = 200 + (rand()&31);
248: dl->minlight = 32;
249: dl->die = cl.time; // + 0.1;
1.1.1.2 root 250:
1.1 root 251: if (silenced)
252: volume = 0.2;
253: else
254: volume = 1;
1.1.1.2 root 255:
1.1 root 256: switch (weapon)
257: {
258: case MZ_BLASTER:
259: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
260: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/blastf1a.wav"), volume, ATTN_NORM, 0);
261: break;
1.1.1.2 root 262: case MZ_BLUEHYPERBLASTER:
263: dl->color[0] = 0;dl->color[1] = 0;dl->color[2] = 1;
264: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/hyprbf1a.wav"), volume, ATTN_NORM, 0);
265: break;
1.1 root 266: case MZ_HYPERBLASTER:
267: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
268: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/hyprbf1a.wav"), volume, ATTN_NORM, 0);
269: break;
270: case MZ_MACHINEGUN:
271: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
272: Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1);
273: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0);
274: break;
275: case MZ_SHOTGUN:
276: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
277: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/shotgf1b.wav"), volume, ATTN_NORM, 0);
278: S_StartSound (NULL, i, CHAN_AUTO, S_RegisterSound("weapons/shotgr1b.wav"), volume, ATTN_NORM, 0.1);
279: break;
280: case MZ_SSHOTGUN:
281: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
282: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/sshotf1b.wav"), volume, ATTN_NORM, 0);
283: break;
284: case MZ_CHAINGUN1:
285: dl->radius = 200 + (rand()&31);
286: dl->color[0] = 1;dl->color[1] = 0.25;dl->color[2] = 0;
287: Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1);
288: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0);
289: break;
290: case MZ_CHAINGUN2:
291: dl->radius = 225 + (rand()&31);
292: dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0;
293: dl->die = cl.time + 0.1; // long delay
294: Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1);
295: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0);
296: Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1);
297: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0.05);
298: break;
299: case MZ_CHAINGUN3:
300: dl->radius = 250 + (rand()&31);
301: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
302: dl->die = cl.time + 0.1; // long delay
303: Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1);
304: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0);
305: Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1);
306: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0.033);
307: Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1);
308: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0.066);
309: break;
310: case MZ_RAILGUN:
311: dl->color[0] = 0.5;dl->color[1] = 0.5;dl->color[2] = 1.0;
312: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/railgf1a.wav"), volume, ATTN_NORM, 0);
313: break;
314: case MZ_ROCKET:
315: dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0.2;
316: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/rocklf1a.wav"), volume, ATTN_NORM, 0);
317: S_StartSound (NULL, i, CHAN_AUTO, S_RegisterSound("weapons/rocklr1b.wav"), volume, ATTN_NORM, 0.1);
318: break;
319: case MZ_GRENADE:
320: dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0;
321: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/grenlf1a.wav"), volume, ATTN_NORM, 0);
322: S_StartSound (NULL, i, CHAN_AUTO, S_RegisterSound("weapons/grenlr1b.wav"), volume, ATTN_NORM, 0.1);
323: break;
324: case MZ_BFG:
325: dl->color[0] = 0;dl->color[1] = 1;dl->color[2] = 0;
326: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/bfg__f1y.wav"), volume, ATTN_NORM, 0);
327: break;
1.1.1.2 root 328:
1.1 root 329: case MZ_LOGIN:
330: dl->color[0] = 0;dl->color[1] = 1; dl->color[2] = 0;
331: dl->die = cl.time + 1.0;
332: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/grenlf1a.wav"), 1, ATTN_NORM, 0);
333: CL_LogoutEffect (pl->current.origin, weapon);
334: break;
335: case MZ_LOGOUT:
336: dl->color[0] = 1;dl->color[1] = 0; dl->color[2] = 0;
337: dl->die = cl.time + 1.0;
338: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/grenlf1a.wav"), 1, ATTN_NORM, 0);
339: CL_LogoutEffect (pl->current.origin, weapon);
340: break;
341: case MZ_RESPAWN:
342: dl->color[0] = 1;dl->color[1] = 1; dl->color[2] = 0;
343: dl->die = cl.time + 1.0;
344: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/grenlf1a.wav"), 1, ATTN_NORM, 0);
345: CL_LogoutEffect (pl->current.origin, weapon);
346: break;
1.1.1.2 root 347: // RAFAEL
348: case MZ_PHALANX:
349: dl->color[0] = 1;dl->color[1] = 0.5; dl->color[2] = 0.5;
350: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/plasshot.wav"), volume, ATTN_NORM, 0);
351: break;
352: // RAFAEL
353: case MZ_IONRIPPER:
354: dl->color[0] = 1;dl->color[1] = 0.5; dl->color[2] = 0.5;
355: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/rippfire.wav"), volume, ATTN_NORM, 0);
356: break;
1.1.1.3 ! root 357:
! 358: // ======================
! 359: // PGM
! 360: case MZ_ETF_RIFLE:
! 361: dl->color[0] = 0.9;dl->color[1] = 0.7;dl->color[2] = 0;
! 362: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/nail1.wav"), volume, ATTN_NORM, 0);
! 363: break;
! 364: case MZ_SHOTGUN2:
! 365: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
! 366: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/shotg2.wav"), volume, ATTN_NORM, 0);
! 367: break;
! 368: case MZ_HEATBEAM:
! 369: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
! 370: dl->die = cl.time + 100;
! 371: // S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/bfg__l1a.wav"), volume, ATTN_NORM, 0);
! 372: break;
! 373: case MZ_BLASTER2:
! 374: dl->color[0] = 0;dl->color[1] = 1;dl->color[2] = 0;
! 375: // FIXME - different sound for blaster2 ??
! 376: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/blastf1a.wav"), volume, ATTN_NORM, 0);
! 377: break;
! 378: case MZ_TRACKER:
! 379: // negative flashes handled the same in gl/soft until CL_AddDLights
! 380: dl->color[0] = -1;dl->color[1] = -1;dl->color[2] = -1;
! 381: S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/disint2.wav"), volume, ATTN_NORM, 0);
! 382: break;
! 383: case MZ_NUKE1:
! 384: dl->color[0] = 1;dl->color[1] = 0;dl->color[2] = 0;
! 385: dl->die = cl.time + 100;
! 386: break;
! 387: case MZ_NUKE2:
! 388: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
! 389: dl->die = cl.time + 100;
! 390: break;
! 391: case MZ_NUKE4:
! 392: dl->color[0] = 0;dl->color[1] = 0;dl->color[2] = 1;
! 393: dl->die = cl.time + 100;
! 394: break;
! 395: case MZ_NUKE8:
! 396: dl->color[0] = 0;dl->color[1] = 1;dl->color[2] = 1;
! 397: dl->die = cl.time + 100;
! 398: break;
! 399: // PGM
! 400: // ======================
1.1 root 401: }
402: }
1.1.1.2 root 403:
404:
1.1 root 405: /*
406: ==============
407: CL_ParseMuzzleFlash2
408: ==============
409: */
1.1.1.3 ! root 410: void CL_ParseMuzzleFlash2 (void)
1.1 root 411: {
412: int ent;
413: vec3_t origin;
414: int flash_number;
415: cdlight_t *dl;
416: vec3_t forward, right;
417: char soundname[64];
1.1.1.2 root 418:
1.1 root 419: ent = MSG_ReadShort (&net_message);
420: if (ent < 1 || ent >= MAX_EDICTS)
421: Com_Error (ERR_DROP, "CL_ParseMuzzleFlash2: bad entity");
1.1.1.2 root 422:
1.1 root 423: flash_number = MSG_ReadByte (&net_message);
1.1.1.2 root 424:
1.1 root 425: // locate the origin
426: AngleVectors (cl_entities[ent].current.angles, forward, right, NULL);
427: origin[0] = cl_entities[ent].current.origin[0] + forward[0] * monster_flash_offset[flash_number][0] + right[0] * monster_flash_offset[flash_number][1];
428: origin[1] = cl_entities[ent].current.origin[1] + forward[1] * monster_flash_offset[flash_number][0] + right[1] * monster_flash_offset[flash_number][1];
429: origin[2] = cl_entities[ent].current.origin[2] + forward[2] * monster_flash_offset[flash_number][0] + right[2] * monster_flash_offset[flash_number][1] + monster_flash_offset[flash_number][2];
1.1.1.2 root 430:
1.1 root 431: dl = CL_AllocDlight (ent);
432: VectorCopy (origin, dl->origin);
433: dl->radius = 200 + (rand()&31);
434: dl->minlight = 32;
435: dl->die = cl.time; // + 0.1;
1.1.1.2 root 436:
1.1 root 437: switch (flash_number)
438: {
439: case MZ2_INFANTRY_MACHINEGUN_1:
440: case MZ2_INFANTRY_MACHINEGUN_2:
441: case MZ2_INFANTRY_MACHINEGUN_3:
442: case MZ2_INFANTRY_MACHINEGUN_4:
443: case MZ2_INFANTRY_MACHINEGUN_5:
444: case MZ2_INFANTRY_MACHINEGUN_6:
445: case MZ2_INFANTRY_MACHINEGUN_7:
446: case MZ2_INFANTRY_MACHINEGUN_8:
447: case MZ2_INFANTRY_MACHINEGUN_9:
448: case MZ2_INFANTRY_MACHINEGUN_10:
449: case MZ2_INFANTRY_MACHINEGUN_11:
450: case MZ2_INFANTRY_MACHINEGUN_12:
451: case MZ2_INFANTRY_MACHINEGUN_13:
452: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
453: CL_ParticleEffect (origin, vec3_origin, 0, 40);
454: CL_SmokeAndFlash(origin);
455: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("infantry/infatck1.wav"), 1, ATTN_NORM, 0);
456: break;
1.1.1.2 root 457:
1.1 root 458: case MZ2_SOLDIER_MACHINEGUN_1:
459: case MZ2_SOLDIER_MACHINEGUN_2:
460: case MZ2_SOLDIER_MACHINEGUN_3:
461: case MZ2_SOLDIER_MACHINEGUN_4:
462: case MZ2_SOLDIER_MACHINEGUN_5:
463: case MZ2_SOLDIER_MACHINEGUN_6:
464: case MZ2_SOLDIER_MACHINEGUN_7:
465: case MZ2_SOLDIER_MACHINEGUN_8:
466: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
467: CL_ParticleEffect (origin, vec3_origin, 0, 40);
468: CL_SmokeAndFlash(origin);
469: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("soldier/solatck3.wav"), 1, ATTN_NORM, 0);
470: break;
1.1.1.2 root 471:
1.1 root 472: case MZ2_GUNNER_MACHINEGUN_1:
473: case MZ2_GUNNER_MACHINEGUN_2:
474: case MZ2_GUNNER_MACHINEGUN_3:
475: case MZ2_GUNNER_MACHINEGUN_4:
476: case MZ2_GUNNER_MACHINEGUN_5:
477: case MZ2_GUNNER_MACHINEGUN_6:
478: case MZ2_GUNNER_MACHINEGUN_7:
479: case MZ2_GUNNER_MACHINEGUN_8:
480: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
481: CL_ParticleEffect (origin, vec3_origin, 0, 40);
482: CL_SmokeAndFlash(origin);
483: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("gunner/gunatck2.wav"), 1, ATTN_NORM, 0);
484: break;
1.1.1.2 root 485:
1.1 root 486: case MZ2_ACTOR_MACHINEGUN_1:
487: case MZ2_SUPERTANK_MACHINEGUN_1:
488: case MZ2_SUPERTANK_MACHINEGUN_2:
489: case MZ2_SUPERTANK_MACHINEGUN_3:
490: case MZ2_SUPERTANK_MACHINEGUN_4:
491: case MZ2_SUPERTANK_MACHINEGUN_5:
492: case MZ2_SUPERTANK_MACHINEGUN_6:
1.1.1.3 ! root 493: case MZ2_TURRET_MACHINEGUN: // PGM
1.1 root 494: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
495:
496: CL_ParticleEffect (origin, vec3_origin, 0, 40);
497: CL_SmokeAndFlash(origin);
498: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("infantry/infatck1.wav"), 1, ATTN_NORM, 0);
499: break;
500:
501: case MZ2_BOSS2_MACHINEGUN_L1:
502: case MZ2_BOSS2_MACHINEGUN_L2:
503: case MZ2_BOSS2_MACHINEGUN_L3:
504: case MZ2_BOSS2_MACHINEGUN_L4:
505: case MZ2_BOSS2_MACHINEGUN_L5:
1.1.1.3 ! root 506: case MZ2_CARRIER_MACHINEGUN_L1: // PMM
! 507: case MZ2_CARRIER_MACHINEGUN_L2: // PMM
1.1 root 508: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
1.1.1.2 root 509:
1.1 root 510: CL_ParticleEffect (origin, vec3_origin, 0, 40);
511: CL_SmokeAndFlash(origin);
512: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("infantry/infatck1.wav"), 1, ATTN_NONE, 0);
513: break;
1.1.1.2 root 514:
1.1 root 515: case MZ2_SOLDIER_BLASTER_1:
516: case MZ2_SOLDIER_BLASTER_2:
517: case MZ2_SOLDIER_BLASTER_3:
518: case MZ2_SOLDIER_BLASTER_4:
519: case MZ2_SOLDIER_BLASTER_5:
520: case MZ2_SOLDIER_BLASTER_6:
521: case MZ2_SOLDIER_BLASTER_7:
522: case MZ2_SOLDIER_BLASTER_8:
1.1.1.3 ! root 523: case MZ2_TURRET_BLASTER: // PGM
1.1 root 524: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
525: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("soldier/solatck2.wav"), 1, ATTN_NORM, 0);
526: break;
1.1.1.2 root 527:
1.1 root 528: case MZ2_FLYER_BLASTER_1:
529: case MZ2_FLYER_BLASTER_2:
530: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
531: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("flyer/flyatck3.wav"), 1, ATTN_NORM, 0);
532: break;
1.1.1.2 root 533:
1.1 root 534: case MZ2_MEDIC_BLASTER_1:
535: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
536: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("medic/medatck1.wav"), 1, ATTN_NORM, 0);
537: break;
538:
539: case MZ2_HOVER_BLASTER_1:
540: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
541: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("hover/hovatck1.wav"), 1, ATTN_NORM, 0);
542: break;
543:
544: case MZ2_FLOAT_BLASTER_1:
545: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
546: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("floater/fltatck1.wav"), 1, ATTN_NORM, 0);
547: break;
1.1.1.2 root 548:
1.1 root 549: case MZ2_SOLDIER_SHOTGUN_1:
550: case MZ2_SOLDIER_SHOTGUN_2:
551: case MZ2_SOLDIER_SHOTGUN_3:
552: case MZ2_SOLDIER_SHOTGUN_4:
553: case MZ2_SOLDIER_SHOTGUN_5:
554: case MZ2_SOLDIER_SHOTGUN_6:
555: case MZ2_SOLDIER_SHOTGUN_7:
556: case MZ2_SOLDIER_SHOTGUN_8:
557: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
558: CL_SmokeAndFlash(origin);
559: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("soldier/solatck1.wav"), 1, ATTN_NORM, 0);
560: break;
1.1.1.2 root 561:
1.1 root 562: case MZ2_TANK_BLASTER_1:
563: case MZ2_TANK_BLASTER_2:
564: case MZ2_TANK_BLASTER_3:
565: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
566: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("tank/tnkatck3.wav"), 1, ATTN_NORM, 0);
567: break;
1.1.1.2 root 568:
1.1 root 569: case MZ2_TANK_MACHINEGUN_1:
570: case MZ2_TANK_MACHINEGUN_2:
571: case MZ2_TANK_MACHINEGUN_3:
572: case MZ2_TANK_MACHINEGUN_4:
573: case MZ2_TANK_MACHINEGUN_5:
574: case MZ2_TANK_MACHINEGUN_6:
575: case MZ2_TANK_MACHINEGUN_7:
576: case MZ2_TANK_MACHINEGUN_8:
577: case MZ2_TANK_MACHINEGUN_9:
578: case MZ2_TANK_MACHINEGUN_10:
579: case MZ2_TANK_MACHINEGUN_11:
580: case MZ2_TANK_MACHINEGUN_12:
581: case MZ2_TANK_MACHINEGUN_13:
582: case MZ2_TANK_MACHINEGUN_14:
583: case MZ2_TANK_MACHINEGUN_15:
584: case MZ2_TANK_MACHINEGUN_16:
585: case MZ2_TANK_MACHINEGUN_17:
586: case MZ2_TANK_MACHINEGUN_18:
587: case MZ2_TANK_MACHINEGUN_19:
588: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
589: CL_ParticleEffect (origin, vec3_origin, 0, 40);
590: CL_SmokeAndFlash(origin);
591: Com_sprintf(soundname, sizeof(soundname), "tank/tnkatk2%c.wav", 'a' + rand() % 5);
592: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound(soundname), 1, ATTN_NORM, 0);
593: break;
1.1.1.2 root 594:
1.1 root 595: case MZ2_CHICK_ROCKET_1:
1.1.1.3 ! root 596: case MZ2_TURRET_ROCKET: // PGM
1.1 root 597: dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0.2;
598: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("chick/chkatck2.wav"), 1, ATTN_NORM, 0);
599: break;
1.1.1.2 root 600:
1.1 root 601: case MZ2_TANK_ROCKET_1:
602: case MZ2_TANK_ROCKET_2:
603: case MZ2_TANK_ROCKET_3:
604: dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0.2;
605: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("tank/tnkatck1.wav"), 1, ATTN_NORM, 0);
606: break;
1.1.1.2 root 607:
1.1 root 608: case MZ2_SUPERTANK_ROCKET_1:
609: case MZ2_SUPERTANK_ROCKET_2:
610: case MZ2_SUPERTANK_ROCKET_3:
611: case MZ2_BOSS2_ROCKET_1:
612: case MZ2_BOSS2_ROCKET_2:
613: case MZ2_BOSS2_ROCKET_3:
614: case MZ2_BOSS2_ROCKET_4:
1.1.1.3 ! root 615: case MZ2_CARRIER_ROCKET_1:
! 616: // case MZ2_CARRIER_ROCKET_2:
! 617: // case MZ2_CARRIER_ROCKET_3:
! 618: // case MZ2_CARRIER_ROCKET_4:
1.1 root 619: dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0.2;
620: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("tank/rocket.wav"), 1, ATTN_NORM, 0);
621: break;
1.1.1.2 root 622:
1.1 root 623: case MZ2_GUNNER_GRENADE_1:
624: case MZ2_GUNNER_GRENADE_2:
625: case MZ2_GUNNER_GRENADE_3:
626: case MZ2_GUNNER_GRENADE_4:
627: dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0;
628: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("gunner/gunatck3.wav"), 1, ATTN_NORM, 0);
629: break;
1.1.1.2 root 630:
1.1 root 631: case MZ2_GLADIATOR_RAILGUN_1:
1.1.1.3 ! root 632: // PMM
! 633: case MZ2_CARRIER_RAILGUN:
! 634: case MZ2_WIDOW_RAIL:
! 635: // pmm
1.1 root 636: dl->color[0] = 0.5;dl->color[1] = 0.5;dl->color[2] = 1.0;
637: break;
638:
639: // --- Xian's shit starts ---
640: case MZ2_MAKRON_BFG:
641: dl->color[0] = 0.5;dl->color[1] = 1 ;dl->color[2] = 0.5;
642: //S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("makron/bfg_fire.wav"), 1, ATTN_NORM, 0);
643: break;
644:
645: case MZ2_MAKRON_BLASTER_1:
646: case MZ2_MAKRON_BLASTER_2:
647: case MZ2_MAKRON_BLASTER_3:
648: case MZ2_MAKRON_BLASTER_4:
649: case MZ2_MAKRON_BLASTER_5:
650: case MZ2_MAKRON_BLASTER_6:
651: case MZ2_MAKRON_BLASTER_7:
652: case MZ2_MAKRON_BLASTER_8:
653: case MZ2_MAKRON_BLASTER_9:
654: case MZ2_MAKRON_BLASTER_10:
655: case MZ2_MAKRON_BLASTER_11:
656: case MZ2_MAKRON_BLASTER_12:
657: case MZ2_MAKRON_BLASTER_13:
658: case MZ2_MAKRON_BLASTER_14:
659: case MZ2_MAKRON_BLASTER_15:
660: case MZ2_MAKRON_BLASTER_16:
661: case MZ2_MAKRON_BLASTER_17:
662: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
663: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("makron/blaster.wav"), 1, ATTN_NORM, 0);
664: break;
665:
666: case MZ2_JORG_MACHINEGUN_L1:
667: case MZ2_JORG_MACHINEGUN_L2:
668: case MZ2_JORG_MACHINEGUN_L3:
669: case MZ2_JORG_MACHINEGUN_L4:
670: case MZ2_JORG_MACHINEGUN_L5:
671: case MZ2_JORG_MACHINEGUN_L6:
672: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
673: CL_ParticleEffect (origin, vec3_origin, 0, 40);
674: CL_SmokeAndFlash(origin);
675: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("boss3/xfire.wav"), 1, ATTN_NORM, 0);
676: break;
677:
678: case MZ2_JORG_MACHINEGUN_R1:
679: case MZ2_JORG_MACHINEGUN_R2:
680: case MZ2_JORG_MACHINEGUN_R3:
681: case MZ2_JORG_MACHINEGUN_R4:
682: case MZ2_JORG_MACHINEGUN_R5:
683: case MZ2_JORG_MACHINEGUN_R6:
684: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
685: CL_ParticleEffect (origin, vec3_origin, 0, 40);
686: CL_SmokeAndFlash(origin);
687: break;
688:
689: case MZ2_JORG_BFG_1:
690: dl->color[0] = 0.5;dl->color[1] = 1 ;dl->color[2] = 0.5;
691: break;
692:
693: case MZ2_BOSS2_MACHINEGUN_R1:
694: case MZ2_BOSS2_MACHINEGUN_R2:
695: case MZ2_BOSS2_MACHINEGUN_R3:
696: case MZ2_BOSS2_MACHINEGUN_R4:
697: case MZ2_BOSS2_MACHINEGUN_R5:
1.1.1.3 ! root 698: case MZ2_CARRIER_MACHINEGUN_R1: // PMM
! 699: case MZ2_CARRIER_MACHINEGUN_R2: // PMM
! 700:
1.1 root 701: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
702:
703: CL_ParticleEffect (origin, vec3_origin, 0, 40);
704: CL_SmokeAndFlash(origin);
705: break;
706:
1.1.1.3 ! root 707: // ======
! 708: // ROGUE
! 709: case MZ2_STALKER_BLASTER:
! 710: case MZ2_DAEDALUS_BLASTER:
! 711: case MZ2_MEDIC_BLASTER_2:
! 712: case MZ2_WIDOW_BLASTER:
! 713: case MZ2_WIDOW_BLASTER_SWEEP1:
! 714: case MZ2_WIDOW_BLASTER_SWEEP2:
! 715: case MZ2_WIDOW_BLASTER_SWEEP3:
! 716: case MZ2_WIDOW_BLASTER_SWEEP4:
! 717: case MZ2_WIDOW_BLASTER_SWEEP5:
! 718: case MZ2_WIDOW_BLASTER_SWEEP6:
! 719: case MZ2_WIDOW_BLASTER_SWEEP7:
! 720: case MZ2_WIDOW_BLASTER_SWEEP8:
! 721: case MZ2_WIDOW_BLASTER_SWEEP9:
! 722: case MZ2_WIDOW_BLASTER_100:
! 723: case MZ2_WIDOW_BLASTER_90:
! 724: case MZ2_WIDOW_BLASTER_80:
! 725: case MZ2_WIDOW_BLASTER_70:
! 726: case MZ2_WIDOW_BLASTER_60:
! 727: case MZ2_WIDOW_BLASTER_50:
! 728: case MZ2_WIDOW_BLASTER_40:
! 729: case MZ2_WIDOW_BLASTER_30:
! 730: case MZ2_WIDOW_BLASTER_20:
! 731: case MZ2_WIDOW_BLASTER_10:
! 732: case MZ2_WIDOW_BLASTER_0:
! 733: case MZ2_WIDOW_BLASTER_10L:
! 734: case MZ2_WIDOW_BLASTER_20L:
! 735: case MZ2_WIDOW_BLASTER_30L:
! 736: case MZ2_WIDOW_BLASTER_40L:
! 737: case MZ2_WIDOW_BLASTER_50L:
! 738: case MZ2_WIDOW_BLASTER_60L:
! 739: case MZ2_WIDOW_BLASTER_70L:
! 740: case MZ2_WIDOW_RUN_1:
! 741: case MZ2_WIDOW_RUN_2:
! 742: case MZ2_WIDOW_RUN_3:
! 743: case MZ2_WIDOW_RUN_4:
! 744: case MZ2_WIDOW_RUN_5:
! 745: case MZ2_WIDOW_RUN_6:
! 746: case MZ2_WIDOW_RUN_7:
! 747: case MZ2_WIDOW_RUN_8:
! 748: dl->color[0] = 0;dl->color[1] = 1;dl->color[2] = 0;
! 749: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("tank/tnkatck3.wav"), 1, ATTN_NORM, 0);
! 750: break;
1.1 root 751:
1.1.1.3 ! root 752: case MZ2_WIDOW_DISRUPTOR:
! 753: dl->color[0] = -1;dl->color[1] = -1;dl->color[2] = -1;
! 754: S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("weapons/disint2.wav"), 1, ATTN_NORM, 0);
! 755: break;
! 756:
! 757: case MZ2_WIDOW_PLASMABEAM:
! 758: case MZ2_WIDOW2_BEAMER_1:
! 759: case MZ2_WIDOW2_BEAMER_2:
! 760: case MZ2_WIDOW2_BEAMER_3:
! 761: case MZ2_WIDOW2_BEAMER_4:
! 762: case MZ2_WIDOW2_BEAMER_5:
! 763: case MZ2_WIDOW2_BEAM_SWEEP_1:
! 764: case MZ2_WIDOW2_BEAM_SWEEP_2:
! 765: case MZ2_WIDOW2_BEAM_SWEEP_3:
! 766: case MZ2_WIDOW2_BEAM_SWEEP_4:
! 767: case MZ2_WIDOW2_BEAM_SWEEP_5:
! 768: case MZ2_WIDOW2_BEAM_SWEEP_6:
! 769: case MZ2_WIDOW2_BEAM_SWEEP_7:
! 770: case MZ2_WIDOW2_BEAM_SWEEP_8:
! 771: case MZ2_WIDOW2_BEAM_SWEEP_9:
! 772: case MZ2_WIDOW2_BEAM_SWEEP_10:
! 773: case MZ2_WIDOW2_BEAM_SWEEP_11:
! 774: dl->radius = 300 + (rand()&100);
! 775: dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
! 776: dl->die = cl.time + 200;
! 777: break;
! 778: // ROGUE
! 779: // ======
1.1 root 780:
781: // --- Xian's shit ends ---
1.1.1.2 root 782:
1.1 root 783: }
784: }
1.1.1.2 root 785:
786:
1.1 root 787: /*
788: ===============
789: CL_AddDLights
1.1.1.2 root 790:
1.1 root 791: ===============
792: */
793: void CL_AddDLights (void)
794: {
795: int i;
796: cdlight_t *dl;
1.1.1.2 root 797:
1.1 root 798: dl = cl_dlights;
1.1.1.3 ! root 799:
! 800: //=====
! 801: //PGM
! 802: if(vidref_val == VIDREF_GL)
! 803: {
! 804: for (i=0 ; i<MAX_DLIGHTS ; i++, dl++)
! 805: {
! 806: if (!dl->radius)
! 807: continue;
! 808: V_AddLight (dl->origin, dl->radius,
! 809: dl->color[0], dl->color[1], dl->color[2]);
! 810: }
! 811: }
! 812: else
1.1 root 813: {
1.1.1.3 ! root 814: for (i=0 ; i<MAX_DLIGHTS ; i++, dl++)
! 815: {
! 816: if (!dl->radius)
! 817: continue;
! 818:
! 819: // negative light in software. only black allowed
! 820: if ((dl->color[0] < 0) || (dl->color[1] < 0) || (dl->color[2] < 0))
! 821: {
! 822: dl->radius = -(dl->radius);
! 823: dl->color[0] = 1;
! 824: dl->color[1] = 1;
! 825: dl->color[2] = 1;
! 826: }
! 827: V_AddLight (dl->origin, dl->radius,
! 828: dl->color[0], dl->color[1], dl->color[2]);
! 829: }
1.1 root 830: }
1.1.1.3 ! root 831: //PGM
! 832: //=====
1.1 root 833: }
1.1.1.2 root 834:
835:
836:
1.1 root 837: /*
838: ==============================================================
1.1.1.2 root 839:
1.1 root 840: PARTICLE MANAGEMENT
1.1.1.2 root 841:
1.1 root 842: ==============================================================
843: */
1.1.1.2 root 844:
1.1.1.3 ! root 845: /*
! 846: // THIS HAS BEEN RELOCATED TO CLIENT.H
1.1 root 847: typedef struct particle_s
848: {
849: struct particle_s *next;
1.1.1.2 root 850:
1.1 root 851: float time;
1.1.1.2 root 852:
1.1 root 853: vec3_t org;
854: vec3_t vel;
855: vec3_t accel;
856: float color;
857: float colorvel;
858: float alpha;
859: float alphavel;
860: } cparticle_t;
1.1.1.2 root 861:
862:
1.1 root 863: #define PARTICLE_GRAVITY 40
1.1.1.3 ! root 864: */
1.1.1.2 root 865:
1.1 root 866: cparticle_t *active_particles, *free_particles;
1.1.1.2 root 867:
1.1 root 868: cparticle_t particles[MAX_PARTICLES];
869: int cl_numparticles = MAX_PARTICLES;
1.1.1.2 root 870:
871:
1.1 root 872: /*
873: ===============
874: CL_ClearParticles
875: ===============
876: */
877: void CL_ClearParticles (void)
878: {
879: int i;
880:
881: free_particles = &particles[0];
882: active_particles = NULL;
1.1.1.2 root 883:
1.1 root 884: for (i=0 ;i<cl_numparticles ; i++)
885: particles[i].next = &particles[i+1];
886: particles[cl_numparticles-1].next = NULL;
887: }
1.1.1.2 root 888:
889:
1.1 root 890: /*
891: ===============
892: CL_ParticleEffect
1.1.1.2 root 893:
1.1 root 894: Wall impact puffs
895: ===============
896: */
897: void CL_ParticleEffect (vec3_t org, vec3_t dir, int color, int count)
898: {
899: int i, j;
900: cparticle_t *p;
901: float d;
1.1.1.2 root 902:
1.1 root 903: for (i=0 ; i<count ; i++)
904: {
905: if (!free_particles)
906: return;
907: p = free_particles;
908: free_particles = p->next;
909: p->next = active_particles;
910: active_particles = p;
1.1.1.2 root 911:
1.1 root 912: p->time = cl.time;
913: p->color = color + (rand()&7);
1.1.1.2 root 914:
1.1 root 915: d = rand()&31;
916: for (j=0 ; j<3 ; j++)
917: {
918: p->org[j] = org[j] + ((rand()&7)-4) + d*dir[j];
919: p->vel[j] = crand()*20;
920: }
1.1.1.2 root 921:
1.1 root 922: p->accel[0] = p->accel[1] = 0;
923: p->accel[2] = -PARTICLE_GRAVITY;
924: p->alpha = 1.0;
1.1.1.2 root 925:
1.1 root 926: p->alphavel = -1.0 / (0.5 + frand()*0.3);
927: }
928: }
1.1.1.2 root 929:
930:
1.1 root 931: /*
932: ===============
933: CL_ParticleEffect2
934: ===============
935: */
936: void CL_ParticleEffect2 (vec3_t org, vec3_t dir, int color, int count)
937: {
938: int i, j;
939: cparticle_t *p;
940: float d;
941:
942: for (i=0 ; i<count ; i++)
943: {
944: if (!free_particles)
945: return;
946: p = free_particles;
947: free_particles = p->next;
948: p->next = active_particles;
949: active_particles = p;
950:
951: p->time = cl.time;
952: p->color = color;
953:
954: d = rand()&7;
955: for (j=0 ; j<3 ; j++)
956: {
957: p->org[j] = org[j] + ((rand()&7)-4) + d*dir[j];
958: p->vel[j] = crand()*20;
959: }
960:
961: p->accel[0] = p->accel[1] = 0;
962: p->accel[2] = -PARTICLE_GRAVITY;
963: p->alpha = 1.0;
964:
965: p->alphavel = -1.0 / (0.5 + frand()*0.3);
966: }
967: }
968:
1.1.1.2 root 969:
970: // RAFAEL
971: /*
972: ===============
973: CL_ParticleEffect3
974: ===============
975: */
976: void CL_ParticleEffect3 (vec3_t org, vec3_t dir, int color, int count)
977: {
978: int i, j;
979: cparticle_t *p;
980: float d;
981:
982: for (i=0 ; i<count ; i++)
983: {
984: if (!free_particles)
985: return;
986: p = free_particles;
987: free_particles = p->next;
988: p->next = active_particles;
989: active_particles = p;
990:
991: p->time = cl.time;
992: p->color = color;
993:
994: d = rand()&7;
995: for (j=0 ; j<3 ; j++)
996: {
997: p->org[j] = org[j] + ((rand()&7)-4) + d*dir[j];
998: p->vel[j] = crand()*20;
999: }
1000:
1001: p->accel[0] = p->accel[1] = 0;
1002: p->accel[2] = PARTICLE_GRAVITY;
1003: p->alpha = 1.0;
1004:
1005: p->alphavel = -1.0 / (0.5 + frand()*0.3);
1006: }
1007: }
1008:
1.1 root 1009: /*
1010: ===============
1011: CL_TeleporterParticles
1012: ===============
1013: */
1014: void CL_TeleporterParticles (entity_state_t *ent)
1015: {
1016: int i, j;
1017: cparticle_t *p;
1018:
1019: for (i=0 ; i<8 ; i++)
1020: {
1021: if (!free_particles)
1022: return;
1023: p = free_particles;
1024: free_particles = p->next;
1025: p->next = active_particles;
1026: active_particles = p;
1027:
1028: p->time = cl.time;
1029: p->color = 0xdb;
1030:
1031: for (j=0 ; j<2 ; j++)
1032: {
1033: p->org[j] = ent->origin[j] - 16 + (rand()&31);
1034: p->vel[j] = crand()*14;
1035: }
1036:
1037: p->org[2] = ent->origin[2] - 8 + (rand()&7);
1038: p->vel[2] = 80 + (rand()&7);
1039:
1040: p->accel[0] = p->accel[1] = 0;
1041: p->accel[2] = -PARTICLE_GRAVITY;
1042: p->alpha = 1.0;
1043:
1044: p->alphavel = -0.5;
1045: }
1046: }
1047:
1.1.1.2 root 1048:
1.1 root 1049: /*
1050: ===============
1051: CL_LogoutEffect
1.1.1.2 root 1052:
1.1 root 1053: ===============
1054: */
1055: void CL_LogoutEffect (vec3_t org, int type)
1056: {
1057: int i, j;
1058: cparticle_t *p;
1.1.1.2 root 1059:
1.1 root 1060: for (i=0 ; i<500 ; i++)
1061: {
1062: if (!free_particles)
1063: return;
1064: p = free_particles;
1065: free_particles = p->next;
1066: p->next = active_particles;
1067: active_particles = p;
1.1.1.2 root 1068:
1.1 root 1069: p->time = cl.time;
1.1.1.2 root 1070:
1.1 root 1071: if (type == MZ_LOGIN)
1072: p->color = 0xd0 + (rand()&7); // green
1073: else if (type == MZ_LOGOUT)
1074: p->color = 0x40 + (rand()&7); // red
1075: else
1076: p->color = 0xe0 + (rand()&7); // yellow
1.1.1.2 root 1077:
1.1 root 1078: p->org[0] = org[0] - 16 + frand()*32;
1079: p->org[1] = org[1] - 16 + frand()*32;
1080: p->org[2] = org[2] - 24 + frand()*56;
1.1.1.2 root 1081:
1.1 root 1082: for (j=0 ; j<3 ; j++)
1083: p->vel[j] = crand()*20;
1.1.1.2 root 1084:
1.1 root 1085: p->accel[0] = p->accel[1] = 0;
1086: p->accel[2] = -PARTICLE_GRAVITY;
1087: p->alpha = 1.0;
1.1.1.2 root 1088:
1.1 root 1089: p->alphavel = -1.0 / (1.0 + frand()*0.3);
1090: }
1091: }
1.1.1.2 root 1092:
1093:
1.1 root 1094: /*
1095: ===============
1096: CL_ItemRespawnParticles
1.1.1.2 root 1097:
1.1 root 1098: ===============
1099: */
1100: void CL_ItemRespawnParticles (vec3_t org)
1101: {
1102: int i, j;
1103: cparticle_t *p;
1.1.1.2 root 1104:
1.1 root 1105: for (i=0 ; i<64 ; i++)
1106: {
1107: if (!free_particles)
1108: return;
1109: p = free_particles;
1110: free_particles = p->next;
1111: p->next = active_particles;
1112: active_particles = p;
1.1.1.2 root 1113:
1.1 root 1114: p->time = cl.time;
1.1.1.2 root 1115:
1.1 root 1116: p->color = 0xd4 + (rand()&3); // green
1.1.1.2 root 1117:
1.1 root 1118: p->org[0] = org[0] + crand()*8;
1119: p->org[1] = org[1] + crand()*8;
1120: p->org[2] = org[2] + crand()*8;
1.1.1.2 root 1121:
1.1 root 1122: for (j=0 ; j<3 ; j++)
1123: p->vel[j] = crand()*8;
1.1.1.2 root 1124:
1.1 root 1125: p->accel[0] = p->accel[1] = 0;
1126: p->accel[2] = -PARTICLE_GRAVITY*0.2;
1127: p->alpha = 1.0;
1.1.1.2 root 1128:
1.1 root 1129: p->alphavel = -1.0 / (1.0 + frand()*0.3);
1130: }
1131: }
1.1.1.2 root 1132:
1133:
1.1 root 1134: /*
1135: ===============
1136: CL_ExplosionParticles
1137: ===============
1138: */
1139: void CL_ExplosionParticles (vec3_t org)
1140: {
1141: int i, j;
1142: cparticle_t *p;
1143:
1144: for (i=0 ; i<256 ; i++)
1145: {
1146: if (!free_particles)
1147: return;
1148: p = free_particles;
1149: free_particles = p->next;
1150: p->next = active_particles;
1151: active_particles = p;
1152:
1153: p->time = cl.time;
1154: p->color = 0xe0 + (rand()&7);
1155:
1156: for (j=0 ; j<3 ; j++)
1157: {
1158: p->org[j] = org[j] + ((rand()%32)-16);
1159: p->vel[j] = (rand()%384)-192;
1160: }
1161:
1162: p->accel[0] = p->accel[1] = 0;
1163: p->accel[2] = -PARTICLE_GRAVITY;
1164: p->alpha = 1.0;
1165:
1166: p->alphavel = -0.8 / (0.5 + frand()*0.3);
1167: }
1168: }
1169:
1170:
1171: /*
1172: ===============
1173: CL_BigTeleportParticles
1174: ===============
1175: */
1176: void CL_BigTeleportParticles (vec3_t org)
1177: {
1178: int i;
1179: cparticle_t *p;
1180: float angle, dist;
1181: static int colortable[4] = {2*8,13*8,21*8,18*8};
1182:
1183: for (i=0 ; i<4096 ; i++)
1184: {
1185: if (!free_particles)
1186: return;
1187: p = free_particles;
1188: free_particles = p->next;
1189: p->next = active_particles;
1190: active_particles = p;
1191:
1192: p->time = cl.time;
1193:
1194: p->color = colortable[rand()&3];
1195:
1196: angle = M_PI*2*(rand()&1023)/1023.0;
1197: dist = rand()&31;
1198: p->org[0] = org[0] + cos(angle)*dist;
1199: p->vel[0] = cos(angle)*(70+(rand()&63));
1200: p->accel[0] = -cos(angle)*100;
1201:
1202: p->org[1] = org[1] + sin(angle)*dist;
1203: p->vel[1] = sin(angle)*(70+(rand()&63));
1204: p->accel[1] = -sin(angle)*100;
1205:
1206: p->org[2] = org[2] + 8 + (rand()%90);
1207: p->vel[2] = -100 + (rand()&31);
1208: p->accel[2] = PARTICLE_GRAVITY*4;
1209: p->alpha = 1.0;
1210:
1211: p->alphavel = -0.3 / (0.5 + frand()*0.3);
1212: }
1213: }
1214:
1215:
1216: /*
1217: ===============
1218: CL_BlasterParticles
1.1.1.2 root 1219:
1.1 root 1220: Wall impact puffs
1221: ===============
1222: */
1223: void CL_BlasterParticles (vec3_t org, vec3_t dir)
1224: {
1225: int i, j;
1226: cparticle_t *p;
1227: float d;
1228: int count;
1.1.1.2 root 1229:
1.1 root 1230: count = 40;
1231: for (i=0 ; i<count ; i++)
1232: {
1233: if (!free_particles)
1234: return;
1235: p = free_particles;
1236: free_particles = p->next;
1237: p->next = active_particles;
1238: active_particles = p;
1.1.1.2 root 1239:
1.1 root 1240: p->time = cl.time;
1241: p->color = 0xe0 + (rand()&7);
1.1.1.2 root 1242:
1.1 root 1243: d = rand()&15;
1244: for (j=0 ; j<3 ; j++)
1245: {
1246: p->org[j] = org[j] + ((rand()&7)-4) + d*dir[j];
1247: p->vel[j] = dir[j] * 30 + crand()*40;
1248: }
1.1.1.2 root 1249:
1.1 root 1250: p->accel[0] = p->accel[1] = 0;
1251: p->accel[2] = -PARTICLE_GRAVITY;
1252: p->alpha = 1.0;
1.1.1.2 root 1253:
1.1 root 1254: p->alphavel = -1.0 / (0.5 + frand()*0.3);
1255: }
1256: }
1.1.1.2 root 1257:
1258:
1.1 root 1259: /*
1260: ===============
1261: CL_BlasterTrail
1.1.1.2 root 1262:
1.1 root 1263: ===============
1264: */
1265: void CL_BlasterTrail (vec3_t start, vec3_t end)
1266: {
1267: vec3_t move;
1268: vec3_t vec;
1269: float len;
1270: int j;
1271: cparticle_t *p;
1272: int dec;
1.1.1.2 root 1273:
1.1 root 1274: VectorCopy (start, move);
1275: VectorSubtract (end, start, vec);
1276: len = VectorNormalize (vec);
1.1.1.2 root 1277:
1.1 root 1278: dec = 5;
1279: VectorScale (vec, 5, vec);
1.1.1.2 root 1280:
1.1 root 1281: // FIXME: this is a really silly way to have a loop
1282: while (len > 0)
1283: {
1284: len -= dec;
1.1.1.2 root 1285:
1.1 root 1286: if (!free_particles)
1287: return;
1288: p = free_particles;
1289: free_particles = p->next;
1290: p->next = active_particles;
1291: active_particles = p;
1292: VectorClear (p->accel);
1293:
1294: p->time = cl.time;
1.1.1.2 root 1295:
1.1 root 1296: p->alpha = 1.0;
1297: p->alphavel = -1.0 / (0.3+frand()*0.2);
1298: p->color = 0xe0;
1299: for (j=0 ; j<3 ; j++)
1300: {
1301: p->org[j] = move[j] + crand();
1302: p->vel[j] = crand()*5;
1303: p->accel[j] = 0;
1304: }
1.1.1.2 root 1305:
1.1 root 1306: VectorAdd (move, vec, move);
1307: }
1308: }
1.1.1.2 root 1309:
1.1 root 1310: /*
1311: ===============
1312: CL_QuadTrail
1313:
1314: ===============
1315: */
1316: void CL_QuadTrail (vec3_t start, vec3_t end)
1317: {
1318: vec3_t move;
1319: vec3_t vec;
1320: float len;
1321: int j;
1322: cparticle_t *p;
1323: int dec;
1324:
1325: VectorCopy (start, move);
1326: VectorSubtract (end, start, vec);
1327: len = VectorNormalize (vec);
1328:
1329: dec = 5;
1330: VectorScale (vec, 5, vec);
1331:
1332: while (len > 0)
1333: {
1334: len -= dec;
1335:
1336: if (!free_particles)
1337: return;
1338: p = free_particles;
1339: free_particles = p->next;
1340: p->next = active_particles;
1341: active_particles = p;
1342: VectorClear (p->accel);
1343:
1344: p->time = cl.time;
1345:
1346: p->alpha = 1.0;
1347: p->alphavel = -1.0 / (0.8+frand()*0.2);
1348: p->color = 115;
1349: for (j=0 ; j<3 ; j++)
1350: {
1351: p->org[j] = move[j] + crand()*16;
1352: p->vel[j] = crand()*5;
1353: p->accel[j] = 0;
1354: }
1355:
1356: VectorAdd (move, vec, move);
1357: }
1358: }
1359:
1360: /*
1361: ===============
1362: CL_FlagTrail
1363:
1364: ===============
1365: */
1366: void CL_FlagTrail (vec3_t start, vec3_t end, float color)
1367: {
1368: vec3_t move;
1369: vec3_t vec;
1370: float len;
1371: int j;
1372: cparticle_t *p;
1373: int dec;
1374:
1375: VectorCopy (start, move);
1376: VectorSubtract (end, start, vec);
1377: len = VectorNormalize (vec);
1378:
1379: dec = 5;
1380: VectorScale (vec, 5, vec);
1381:
1382: while (len > 0)
1383: {
1384: len -= dec;
1385:
1386: if (!free_particles)
1387: return;
1388: p = free_particles;
1389: free_particles = p->next;
1390: p->next = active_particles;
1391: active_particles = p;
1392: VectorClear (p->accel);
1393:
1394: p->time = cl.time;
1395:
1396: p->alpha = 1.0;
1397: p->alphavel = -1.0 / (0.8+frand()*0.2);
1398: p->color = color;
1399: for (j=0 ; j<3 ; j++)
1400: {
1401: p->org[j] = move[j] + crand()*16;
1402: p->vel[j] = crand()*5;
1403: p->accel[j] = 0;
1404: }
1405:
1406: VectorAdd (move, vec, move);
1407: }
1408: }
1409:
1410: /*
1411: ===============
1412: CL_DiminishingTrail
1.1.1.2 root 1413:
1.1 root 1414: ===============
1415: */
1416: void CL_DiminishingTrail (vec3_t start, vec3_t end, centity_t *old, int flags)
1417: {
1418: vec3_t move;
1419: vec3_t vec;
1420: float len;
1421: int j;
1422: cparticle_t *p;
1423: float dec;
1424: float orgscale;
1425: float velscale;
1.1.1.2 root 1426:
1.1 root 1427: VectorCopy (start, move);
1428: VectorSubtract (end, start, vec);
1429: len = VectorNormalize (vec);
1.1.1.2 root 1430:
1.1 root 1431: dec = 0.5;
1432: VectorScale (vec, dec, vec);
1.1.1.2 root 1433:
1.1 root 1434: if (old->trailcount > 900)
1435: {
1436: orgscale = 4;
1437: velscale = 15;
1438: }
1439: else if (old->trailcount > 800)
1440: {
1441: orgscale = 2;
1442: velscale = 10;
1443: }
1444: else
1445: {
1446: orgscale = 1;
1447: velscale = 5;
1448: }
1.1.1.2 root 1449:
1.1 root 1450: while (len > 0)
1451: {
1452: len -= dec;
1.1.1.2 root 1453:
1.1 root 1454: if (!free_particles)
1455: return;
1.1.1.2 root 1456:
1.1 root 1457: // drop less particles as it flies
1458: if ((rand()&1023) < old->trailcount)
1459: {
1460: p = free_particles;
1461: free_particles = p->next;
1462: p->next = active_particles;
1463: active_particles = p;
1464: VectorClear (p->accel);
1465:
1466: p->time = cl.time;
1.1.1.2 root 1467:
1.1 root 1468: if (flags & EF_GIB)
1469: {
1470: p->alpha = 1.0;
1471: p->alphavel = -1.0 / (1+frand()*0.4);
1472: p->color = 0xe8 + (rand()&7);
1473: for (j=0 ; j<3 ; j++)
1474: {
1475: p->org[j] = move[j] + crand()*orgscale;
1476: p->vel[j] = crand()*velscale;
1477: p->accel[j] = 0;
1478: }
1479: p->vel[2] -= PARTICLE_GRAVITY;
1480: }
1481: else if (flags & EF_GREENGIB)
1482: {
1483: p->alpha = 1.0;
1484: p->alphavel = -1.0 / (1+frand()*0.4);
1.1.1.2 root 1485: p->color = 0xdb + (rand()&7);
1.1 root 1486: for (j=0; j< 3; j++)
1487: {
1488: p->org[j] = move[j] + crand()*orgscale;
1489: p->vel[j] = crand()*velscale;
1490: p->accel[j] = 0;
1491: }
1492: p->vel[2] -= PARTICLE_GRAVITY;
1493: }
1494: else
1495: {
1496: p->alpha = 1.0;
1497: p->alphavel = -1.0 / (1+frand()*0.2);
1498: p->color = 4 + (rand()&7);
1499: for (j=0 ; j<3 ; j++)
1500: {
1501: p->org[j] = move[j] + crand()*orgscale;
1502: p->vel[j] = crand()*velscale;
1503: }
1504: p->accel[2] = 20;
1505: }
1506: }
1.1.1.2 root 1507:
1.1 root 1508: old->trailcount -= 5;
1509: if (old->trailcount < 100)
1510: old->trailcount = 100;
1511: VectorAdd (move, vec, move);
1512: }
1513: }
1.1.1.2 root 1514:
1.1 root 1515: void MakeNormalVectors (vec3_t forward, vec3_t right, vec3_t up)
1516: {
1517: float d;
1.1.1.2 root 1518:
1.1 root 1519: // this rotate and negat guarantees a vector
1520: // not colinear with the original
1521: right[1] = -forward[0];
1522: right[2] = forward[1];
1523: right[0] = forward[2];
1.1.1.2 root 1524:
1.1 root 1525: d = DotProduct (right, forward);
1526: VectorMA (right, -d, forward, right);
1527: VectorNormalize (right);
1528: CrossProduct (right, forward, up);
1529: }
1.1.1.2 root 1530:
1.1 root 1531: /*
1532: ===============
1533: CL_RocketTrail
1.1.1.2 root 1534:
1.1 root 1535: ===============
1536: */
1537: void CL_RocketTrail (vec3_t start, vec3_t end, centity_t *old)
1538: {
1539: vec3_t move;
1540: vec3_t vec;
1541: float len;
1542: int j;
1543: cparticle_t *p;
1544: float dec;
1.1.1.2 root 1545:
1.1 root 1546: // smoke
1547: CL_DiminishingTrail (start, end, old, EF_ROCKET);
1.1.1.2 root 1548:
1.1 root 1549: // fire
1550: VectorCopy (start, move);
1551: VectorSubtract (end, start, vec);
1552: len = VectorNormalize (vec);
1.1.1.2 root 1553:
1.1 root 1554: dec = 1;
1555: VectorScale (vec, dec, vec);
1.1.1.2 root 1556:
1.1 root 1557: while (len > 0)
1558: {
1559: len -= dec;
1.1.1.2 root 1560:
1.1 root 1561: if (!free_particles)
1562: return;
1.1.1.2 root 1563:
1.1 root 1564: if ( (rand()&7) == 0)
1565: {
1566: p = free_particles;
1567: free_particles = p->next;
1568: p->next = active_particles;
1569: active_particles = p;
1570:
1571: VectorClear (p->accel);
1572: p->time = cl.time;
1.1.1.2 root 1573:
1.1 root 1574: p->alpha = 1.0;
1575: p->alphavel = -1.0 / (1+frand()*0.2);
1576: p->color = 0xdc + (rand()&3);
1577: for (j=0 ; j<3 ; j++)
1578: {
1579: p->org[j] = move[j] + crand()*5;
1580: p->vel[j] = crand()*20;
1581: }
1582: p->accel[2] = -PARTICLE_GRAVITY;
1583: }
1584: VectorAdd (move, vec, move);
1585: }
1586: }
1.1.1.2 root 1587:
1.1 root 1588: /*
1589: ===============
1590: CL_RailTrail
1.1.1.2 root 1591:
1.1 root 1592: ===============
1593: */
1594: void CL_RailTrail (vec3_t start, vec3_t end)
1595: {
1596: vec3_t move;
1597: vec3_t vec;
1598: float len;
1599: int j;
1600: cparticle_t *p;
1601: float dec;
1602: vec3_t right, up;
1603: int i;
1604: float d, c, s;
1605: vec3_t dir;
1.1.1.2 root 1606: byte clr = 0x74;
1607:
1.1 root 1608: VectorCopy (start, move);
1609: VectorSubtract (end, start, vec);
1610: len = VectorNormalize (vec);
1.1.1.2 root 1611:
1.1 root 1612: MakeNormalVectors (vec, right, up);
1.1.1.2 root 1613:
1.1 root 1614: for (i=0 ; i<len ; i++)
1615: {
1616: if (!free_particles)
1617: return;
1.1.1.2 root 1618:
1.1 root 1619: p = free_particles;
1620: free_particles = p->next;
1621: p->next = active_particles;
1622: active_particles = p;
1623:
1624: p->time = cl.time;
1625: VectorClear (p->accel);
1.1.1.2 root 1626:
1.1 root 1627: d = i * 0.1;
1628: c = cos(d);
1629: s = sin(d);
1.1.1.2 root 1630:
1.1 root 1631: VectorScale (right, c, dir);
1632: VectorMA (dir, s, up, dir);
1.1.1.2 root 1633:
1.1 root 1634: p->alpha = 1.0;
1635: p->alphavel = -1.0 / (1+frand()*0.2);
1.1.1.2 root 1636: p->color = clr + (rand()&7);
1.1 root 1637: for (j=0 ; j<3 ; j++)
1638: {
1639: p->org[j] = move[j] + dir[j]*3;
1640: p->vel[j] = dir[j]*6;
1641: }
1.1.1.2 root 1642:
1.1 root 1643: VectorAdd (move, vec, move);
1644: }
1.1.1.2 root 1645:
1.1 root 1646: dec = 0.75;
1647: VectorScale (vec, dec, vec);
1648: VectorCopy (start, move);
1.1.1.2 root 1649:
1.1 root 1650: while (len > 0)
1651: {
1652: len -= dec;
1.1.1.2 root 1653:
1.1 root 1654: if (!free_particles)
1655: return;
1656: p = free_particles;
1657: free_particles = p->next;
1658: p->next = active_particles;
1659: active_particles = p;
1.1.1.2 root 1660:
1.1 root 1661: p->time = cl.time;
1662: VectorClear (p->accel);
1.1.1.2 root 1663:
1.1 root 1664: p->alpha = 1.0;
1665: p->alphavel = -1.0 / (0.6+frand()*0.2);
1666: p->color = 0x0 + rand()&15;
1.1.1.2 root 1667:
1.1 root 1668: for (j=0 ; j<3 ; j++)
1669: {
1670: p->org[j] = move[j] + crand()*3;
1671: p->vel[j] = crand()*3;
1672: p->accel[j] = 0;
1673: }
1674:
1675: VectorAdd (move, vec, move);
1676: }
1677: }
1678:
1.1.1.2 root 1679: // RAFAEL
1.1 root 1680: /*
1681: ===============
1.1.1.2 root 1682: CL_IonripperTrail
1.1 root 1683: ===============
1684: */
1.1.1.2 root 1685: void CL_IonripperTrail (vec3_t start, vec3_t ent)
1.1 root 1686: {
1687: vec3_t move;
1688: vec3_t vec;
1689: float len;
1690: int j;
1691: cparticle_t *p;
1692: int dec;
1693: int left = 0;
1694:
1695: VectorCopy (start, move);
1.1.1.2 root 1696: VectorSubtract (ent, start, vec);
1.1 root 1697: len = VectorNormalize (vec);
1698:
1699: dec = 5;
1700: VectorScale (vec, 5, vec);
1701:
1702: while (len > 0)
1703: {
1704: len -= dec;
1705:
1706: if (!free_particles)
1707: return;
1708: p = free_particles;
1709: free_particles = p->next;
1710: p->next = active_particles;
1711: active_particles = p;
1712: VectorClear (p->accel);
1713:
1714: p->time = cl.time;
1715: p->alpha = 0.5;
1.1.1.2 root 1716: p->alphavel = -1.0 / (0.3 + frand() * 0.2);
1.1 root 1717: p->color = 0xe4 + (rand()&3);
1.1.1.2 root 1718:
1.1 root 1719: for (j=0; j<3; j++)
1720: {
1721: p->org[j] = move[j];
1722: p->accel[j] = 0;
1723: }
1724: if (left)
1725: {
1726: left = 0;
1727: p->vel[0] = 10;
1728: }
1729: else
1730: {
1731: left = 1;
1732: p->vel[0] = -10;
1733: }
1734:
1.1.1.2 root 1735: p->vel[1] = 0;
1736: p->vel[2] = 0;
1.1 root 1737:
1738: VectorAdd (move, vec, move);
1739: }
1740: }
1741:
1.1.1.2 root 1742:
1.1 root 1743: /*
1744: ===============
1745: CL_BubbleTrail
1.1.1.2 root 1746:
1.1 root 1747: ===============
1748: */
1749: void CL_BubbleTrail (vec3_t start, vec3_t end)
1750: {
1751: vec3_t move;
1752: vec3_t vec;
1753: float len;
1754: int i, j;
1755: cparticle_t *p;
1756: float dec;
1.1.1.2 root 1757:
1.1 root 1758: VectorCopy (start, move);
1759: VectorSubtract (end, start, vec);
1760: len = VectorNormalize (vec);
1.1.1.2 root 1761:
1.1 root 1762: dec = 32;
1763: VectorScale (vec, dec, vec);
1.1.1.2 root 1764:
1.1 root 1765: for (i=0 ; i<len ; i+=dec)
1766: {
1767: if (!free_particles)
1768: return;
1.1.1.2 root 1769:
1.1 root 1770: p = free_particles;
1771: free_particles = p->next;
1772: p->next = active_particles;
1773: active_particles = p;
1.1.1.2 root 1774:
1.1 root 1775: VectorClear (p->accel);
1776: p->time = cl.time;
1.1.1.2 root 1777:
1.1 root 1778: p->alpha = 1.0;
1779: p->alphavel = -1.0 / (1+frand()*0.2);
1780: p->color = 4 + (rand()&7);
1781: for (j=0 ; j<3 ; j++)
1782: {
1783: p->org[j] = move[j] + crand()*2;
1784: p->vel[j] = crand()*5;
1785: }
1786: p->vel[2] += 6;
1.1.1.2 root 1787:
1.1 root 1788: VectorAdd (move, vec, move);
1789: }
1790: }
1.1.1.2 root 1791:
1792:
1.1 root 1793: /*
1794: ===============
1795: CL_FlyParticles
1796: ===============
1797: */
1.1.1.2 root 1798:
1.1 root 1799: #define BEAMLENGTH 16
1800: void CL_FlyParticles (vec3_t origin, int count)
1801: {
1802: int i;
1803: cparticle_t *p;
1804: float angle;
1805: float sr, sp, sy, cr, cp, cy;
1806: vec3_t forward;
1807: float dist = 64;
1808: float ltime;
1809:
1.1.1.2 root 1810:
1.1 root 1811: if (count > NUMVERTEXNORMALS)
1812: count = NUMVERTEXNORMALS;
1.1.1.2 root 1813:
1.1 root 1814: if (!avelocities[0][0])
1815: {
1816: for (i=0 ; i<NUMVERTEXNORMALS*3 ; i++)
1817: avelocities[0][i] = (rand()&255) * 0.01;
1818: }
1.1.1.2 root 1819:
1820:
1.1 root 1821: ltime = (float)cl.time / 1000.0;
1822: for (i=0 ; i<count ; i+=2)
1823: {
1824: angle = ltime * avelocities[i][0];
1825: sy = sin(angle);
1826: cy = cos(angle);
1827: angle = ltime * avelocities[i][1];
1828: sp = sin(angle);
1829: cp = cos(angle);
1830: angle = ltime * avelocities[i][2];
1831: sr = sin(angle);
1832: cr = cos(angle);
1833:
1834: forward[0] = cp*cy;
1835: forward[1] = cp*sy;
1836: forward[2] = -sp;
1.1.1.2 root 1837:
1.1 root 1838: if (!free_particles)
1839: return;
1840: p = free_particles;
1841: free_particles = p->next;
1842: p->next = active_particles;
1843: active_particles = p;
1.1.1.2 root 1844:
1.1 root 1845: p->time = cl.time;
1.1.1.2 root 1846:
1.1 root 1847: dist = sin(ltime + i)*64;
1848: p->org[0] = origin[0] + bytedirs[i][0]*dist + forward[0]*BEAMLENGTH;
1849: p->org[1] = origin[1] + bytedirs[i][1]*dist + forward[1]*BEAMLENGTH;
1850: p->org[2] = origin[2] + bytedirs[i][2]*dist + forward[2]*BEAMLENGTH;
1.1.1.2 root 1851:
1.1 root 1852: VectorClear (p->vel);
1853: VectorClear (p->accel);
1.1.1.2 root 1854:
1.1 root 1855: p->color = 0;
1856: p->colorvel = 0;
1.1.1.2 root 1857:
1.1 root 1858: p->alpha = 1;
1859: p->alphavel = -100;
1860: }
1861: }
1.1.1.2 root 1862:
1.1 root 1863: void CL_FlyEffect (centity_t *ent, vec3_t origin)
1864: {
1865: int n;
1866: int count;
1867: int starttime;
1868:
1869: if (ent->fly_stoptime < cl.time)
1870: {
1871: starttime = cl.time;
1872: ent->fly_stoptime = cl.time + 60000;
1873: }
1874: else
1875: {
1876: starttime = ent->fly_stoptime - 60000;
1877: }
1878:
1879: n = cl.time - starttime;
1880: if (n < 20000)
1881: count = n * 162 / 20000.0;
1882: else
1883: {
1884: n = ent->fly_stoptime - cl.time;
1885: if (n < 20000)
1886: count = n * 162 / 20000.0;
1887: else
1888: count = 162;
1889: }
1890:
1891: CL_FlyParticles (origin, count);
1892: }
1.1.1.2 root 1893:
1894:
1.1 root 1895: /*
1896: ===============
1897: CL_BfgParticles
1898: ===============
1899: */
1.1.1.2 root 1900:
1.1 root 1901: #define BEAMLENGTH 16
1902: void CL_BfgParticles (entity_t *ent)
1903: {
1904: int i;
1905: cparticle_t *p;
1906: float angle;
1907: float sr, sp, sy, cr, cp, cy;
1908: vec3_t forward;
1909: float dist = 64;
1910: vec3_t v;
1911: float ltime;
1912:
1913: if (!avelocities[0][0])
1914: {
1915: for (i=0 ; i<NUMVERTEXNORMALS*3 ; i++)
1916: avelocities[0][i] = (rand()&255) * 0.01;
1917: }
1.1.1.2 root 1918:
1919:
1.1 root 1920: ltime = (float)cl.time / 1000.0;
1921: for (i=0 ; i<NUMVERTEXNORMALS ; i++)
1922: {
1923: angle = ltime * avelocities[i][0];
1924: sy = sin(angle);
1925: cy = cos(angle);
1926: angle = ltime * avelocities[i][1];
1927: sp = sin(angle);
1928: cp = cos(angle);
1929: angle = ltime * avelocities[i][2];
1930: sr = sin(angle);
1931: cr = cos(angle);
1932:
1933: forward[0] = cp*cy;
1934: forward[1] = cp*sy;
1935: forward[2] = -sp;
1.1.1.2 root 1936:
1.1 root 1937: if (!free_particles)
1938: return;
1939: p = free_particles;
1940: free_particles = p->next;
1941: p->next = active_particles;
1942: active_particles = p;
1.1.1.2 root 1943:
1.1 root 1944: p->time = cl.time;
1.1.1.2 root 1945:
1.1 root 1946: dist = sin(ltime + i)*64;
1947: p->org[0] = ent->origin[0] + bytedirs[i][0]*dist + forward[0]*BEAMLENGTH;
1948: p->org[1] = ent->origin[1] + bytedirs[i][1]*dist + forward[1]*BEAMLENGTH;
1949: p->org[2] = ent->origin[2] + bytedirs[i][2]*dist + forward[2]*BEAMLENGTH;
1.1.1.2 root 1950:
1.1 root 1951: VectorClear (p->vel);
1952: VectorClear (p->accel);
1.1.1.2 root 1953:
1.1 root 1954: VectorSubtract (p->org, ent->origin, v);
1955: dist = VectorLength(v) / 90.0;
1956: p->color = floor (0xd0 + dist * 7);
1957: p->colorvel = 0;
1.1.1.2 root 1958:
1.1 root 1959: p->alpha = 1.0 - dist;
1960: p->alphavel = -100;
1961: }
1962: }
1.1.1.2 root 1963:
1964:
1965: /*
1966: ===============
1967: CL_TrapParticles
1968: ===============
1969: */
1970: // RAFAEL
1971: void CL_TrapParticles (entity_t *ent)
1972: {
1973: vec3_t move;
1974: vec3_t vec;
1975: vec3_t start, end;
1976: float len;
1977: int j;
1978: cparticle_t *p;
1979: int dec;
1980:
1981: ent->origin[2]-=14;
1982: VectorCopy (ent->origin, start);
1983: VectorCopy (ent->origin, end);
1984: end[2]+=64;
1985:
1986: VectorCopy (start, move);
1987: VectorSubtract (end, start, vec);
1988: len = VectorNormalize (vec);
1989:
1990: dec = 5;
1991: VectorScale (vec, 5, vec);
1992:
1993: // FIXME: this is a really silly way to have a loop
1994: while (len > 0)
1995: {
1996: len -= dec;
1997:
1998: if (!free_particles)
1999: return;
2000: p = free_particles;
2001: free_particles = p->next;
2002: p->next = active_particles;
2003: active_particles = p;
2004: VectorClear (p->accel);
2005:
2006: p->time = cl.time;
2007:
2008: p->alpha = 1.0;
2009: p->alphavel = -1.0 / (0.3+frand()*0.2);
2010: p->color = 0xe0;
2011: for (j=0 ; j<3 ; j++)
2012: {
2013: p->org[j] = move[j] + crand();
2014: p->vel[j] = crand()*15;
2015: p->accel[j] = 0;
2016: }
2017: p->accel[2] = PARTICLE_GRAVITY;
2018:
2019: VectorAdd (move, vec, move);
2020: }
2021:
2022: {
2023:
2024:
2025: int i, j, k;
2026: cparticle_t *p;
2027: float vel;
2028: vec3_t dir;
2029: vec3_t org;
2030:
2031:
2032: ent->origin[2]+=14;
2033: VectorCopy (ent->origin, org);
2034:
2035:
2036: for (i=-2 ; i<=2 ; i+=4)
2037: for (j=-2 ; j<=2 ; j+=4)
2038: for (k=-2 ; k<=4 ; k+=4)
2039: {
2040: if (!free_particles)
2041: return;
2042: p = free_particles;
2043: free_particles = p->next;
2044: p->next = active_particles;
2045: active_particles = p;
2046:
2047: p->time = cl.time;
2048: p->color = 0xe0 + (rand()&3);
2049:
2050: p->alpha = 1.0;
2051: p->alphavel = -1.0 / (0.3 + (rand()&7) * 0.02);
2052:
2053: p->org[0] = org[0] + i + ((rand()&23) * crand());
2054: p->org[1] = org[1] + j + ((rand()&23) * crand());
2055: p->org[2] = org[2] + k + ((rand()&23) * crand());
2056:
2057: dir[0] = j * 8;
2058: dir[1] = i * 8;
2059: dir[2] = k * 8;
2060:
2061: VectorNormalize (dir);
2062: vel = 50 + rand()&63;
2063: VectorScale (dir, vel, p->vel);
2064:
2065: p->accel[0] = p->accel[1] = 0;
2066: p->accel[2] = -PARTICLE_GRAVITY;
2067: }
2068: }
2069: }
2070:
2071:
1.1 root 2072: /*
2073: ===============
2074: CL_BFGExplosionParticles
2075: ===============
2076: */
2077: //FIXME combined with CL_ExplosionParticles
2078: void CL_BFGExplosionParticles (vec3_t org)
2079: {
2080: int i, j;
2081: cparticle_t *p;
2082:
2083: for (i=0 ; i<256 ; i++)
2084: {
2085: if (!free_particles)
2086: return;
2087: p = free_particles;
2088: free_particles = p->next;
2089: p->next = active_particles;
2090: active_particles = p;
2091:
2092: p->time = cl.time;
2093: p->color = 0xd0 + (rand()&7);
2094:
2095: for (j=0 ; j<3 ; j++)
2096: {
2097: p->org[j] = org[j] + ((rand()%32)-16);
2098: p->vel[j] = (rand()%384)-192;
2099: }
2100:
2101: p->accel[0] = p->accel[1] = 0;
2102: p->accel[2] = -PARTICLE_GRAVITY;
2103: p->alpha = 1.0;
2104:
2105: p->alphavel = -0.8 / (0.5 + frand()*0.3);
2106: }
2107: }
2108:
1.1.1.2 root 2109:
1.1 root 2110: /*
2111: ===============
2112: CL_TeleportParticles
2113:
2114: ===============
2115: */
2116: void CL_TeleportParticles (vec3_t org)
2117: {
2118: int i, j, k;
2119: cparticle_t *p;
2120: float vel;
2121: vec3_t dir;
2122:
2123: for (i=-16 ; i<=16 ; i+=4)
2124: for (j=-16 ; j<=16 ; j+=4)
2125: for (k=-16 ; k<=32 ; k+=4)
2126: {
2127: if (!free_particles)
2128: return;
2129: p = free_particles;
2130: free_particles = p->next;
2131: p->next = active_particles;
2132: active_particles = p;
2133:
2134: p->time = cl.time;
2135: p->color = 7 + (rand()&7);
2136:
2137: p->alpha = 1.0;
2138: p->alphavel = -1.0 / (0.3 + (rand()&7) * 0.02);
2139:
2140: p->org[0] = org[0] + i + (rand()&3);
2141: p->org[1] = org[1] + j + (rand()&3);
2142: p->org[2] = org[2] + k + (rand()&3);
2143:
2144: dir[0] = j*8;
2145: dir[1] = i*8;
2146: dir[2] = k*8;
2147:
2148: VectorNormalize (dir);
2149: vel = 50 + (rand()&63);
2150: VectorScale (dir, vel, p->vel);
2151:
2152: p->accel[0] = p->accel[1] = 0;
2153: p->accel[2] = -PARTICLE_GRAVITY;
2154: }
2155: }
2156:
1.1.1.2 root 2157:
1.1 root 2158: /*
2159: ===============
2160: CL_AddParticles
2161: ===============
2162: */
2163: void CL_AddParticles (void)
2164: {
2165: cparticle_t *p, *next;
2166: float alpha;
2167: float time, time2;
2168: vec3_t org;
2169: int color;
2170: cparticle_t *active, *tail;
1.1.1.2 root 2171:
1.1 root 2172: active = NULL;
2173: tail = NULL;
1.1.1.2 root 2174:
1.1 root 2175: for (p=active_particles ; p ; p=next)
2176: {
2177: next = p->next;
1.1.1.2 root 2178:
1.1.1.3 ! root 2179: // PMM - added INSTANT_PARTICLE handling for heat beam
! 2180: if (p->alphavel != INSTANT_PARTICLE)
! 2181: {
! 2182: time = (cl.time - p->time)*0.001;
! 2183: alpha = p->alpha + time*p->alphavel;
! 2184: if (alpha <= 0)
! 2185: { // faded out
! 2186: p->next = free_particles;
! 2187: free_particles = p;
! 2188: continue;
! 2189: }
! 2190: }
! 2191: else
! 2192: {
! 2193: alpha = p->alpha;
1.1 root 2194: }
1.1.1.2 root 2195:
1.1 root 2196: p->next = NULL;
2197: if (!tail)
2198: active = tail = p;
2199: else
2200: {
2201: tail->next = p;
2202: tail = p;
2203: }
1.1.1.2 root 2204:
1.1 root 2205: if (alpha > 1.0)
2206: alpha = 1;
2207: color = p->color;
1.1.1.2 root 2208:
1.1 root 2209: time2 = time*time;
1.1.1.2 root 2210:
1.1 root 2211: org[0] = p->org[0] + p->vel[0]*time + p->accel[0]*time2;
2212: org[1] = p->org[1] + p->vel[1]*time + p->accel[1]*time2;
2213: org[2] = p->org[2] + p->vel[2]*time + p->accel[2]*time2;
1.1.1.2 root 2214:
1.1 root 2215: V_AddParticle (org, color, alpha);
1.1.1.3 ! root 2216: // PMM
! 2217: if (p->alphavel == INSTANT_PARTICLE)
! 2218: {
! 2219: p->alphavel = 0.0;
! 2220: p->alpha = 0.0;
! 2221: }
1.1 root 2222: }
1.1.1.2 root 2223:
1.1 root 2224: active_particles = active;
2225: }
2226:
2227:
2228: /*
2229: ==============
2230: CL_EntityEvent
2231:
2232: An entity has just been parsed that has an event value
2233:
2234: the female events are there for backwards compatability
2235: ==============
2236: */
2237: extern struct sfx_s *cl_sfx_footsteps[4];
2238:
2239: void CL_EntityEvent (entity_state_t *ent)
2240: {
2241: switch (ent->event)
2242: {
2243: case EV_ITEM_RESPAWN:
2244: S_StartSound (NULL, ent->number, CHAN_WEAPON, S_RegisterSound("items/respawn1.wav"), 1, ATTN_IDLE, 0);
2245: CL_ItemRespawnParticles (ent->origin);
2246: break;
2247: case EV_PLAYER_TELEPORT:
2248: S_StartSound (NULL, ent->number, CHAN_WEAPON, S_RegisterSound("misc/tele1.wav"), 1, ATTN_IDLE, 0);
2249: CL_TeleportParticles (ent->origin);
2250: break;
2251: case EV_FOOTSTEP:
2252: if (cl_footsteps->value)
2253: S_StartSound (NULL, ent->number, CHAN_BODY, cl_sfx_footsteps[rand()&3], 1, ATTN_NORM, 0);
2254: break;
2255: case EV_FALLSHORT:
2256: S_StartSound (NULL, ent->number, CHAN_AUTO, S_RegisterSound ("player/land1.wav"), 1, ATTN_NORM, 0);
2257: break;
2258: case EV_FALL:
2259: S_StartSound (NULL, ent->number, CHAN_AUTO, S_RegisterSound ("*fall2.wav"), 1, ATTN_NORM, 0);
2260: break;
2261: case EV_FALLFAR:
2262: S_StartSound (NULL, ent->number, CHAN_AUTO, S_RegisterSound ("*fall1.wav"), 1, ATTN_NORM, 0);
2263: break;
2264: }
2265: }
2266:
2267:
2268: /*
2269: ==============
2270: CL_ClearEffects
2271:
2272: ==============
2273: */
2274: void CL_ClearEffects (void)
2275: {
2276: CL_ClearParticles ();
2277: CL_ClearDlights ();
2278: CL_ClearLightStyles ();
2279: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.