2266 lines · 47.4 KB · C
RawDownload
// cl_fx.c -- entity effects parsing and management #include <u.h>#include <libc.h>#include <stdio.h>#include "dat.h"#include "fns.h" void CL_LogoutEffect (vec3_t org, int type);void CL_ItemRespawnParticles (vec3_t org); static vec3_t avelocities [NUMVERTEXNORMALS]; extern model_t *cl_mod_smoke;extern model_t *cl_mod_flash; /*============================================================== LIGHT STYLE MANAGEMENT ==============================================================*/ typedef struct{	int		length;	float	value[3];	float	map[MAX_QPATH];} clightstyle_t; clightstyle_t	cl_lightstyle[MAX_LIGHTSTYLES];int			lastofs; /*================CL_ClearLightStyles================*/void CL_ClearLightStyles (void){	memset (cl_lightstyle, 0, sizeof(cl_lightstyle));	lastofs = -1;} /*================CL_RunLightStyles================*/void CL_RunLightStyles (void){	int		ofs;	int		i;	clightstyle_t	*ls; 	ofs = cl.time / 100;	if (ofs == lastofs)		return;	lastofs = ofs; 	for (i=0,ls=cl_lightstyle ; i<MAX_LIGHTSTYLES ; i++, ls++)	{		if (!ls->length)		{			ls->value[0] = ls->value[1] = ls->value[2] = 1.0;			continue;		}		if (ls->length == 1)			ls->value[0] = ls->value[1] = ls->value[2] = ls->map[0];		else			ls->value[0] = ls->value[1] = ls->value[2] = ls->map[ofs%ls->length];	}}  void CL_SetLightstyle (int i){	char	*s;	int		j, k; 	s = cl.configstrings[i+CS_LIGHTS]; 	j = strlen (s);	if (j >= MAX_QPATH)		Com_Error (ERR_DROP, "svc_lightstyle length=%i", j); 	cl_lightstyle[i].length = j; 	for (k=0 ; k<j ; k++)		cl_lightstyle[i].map[k] = (float)(s[k]-'a')/(float)('m'-'a');} /*================CL_AddLightStyles================*/void CL_AddLightStyles (void){	int		i;	clightstyle_t	*ls; 	for (i=0,ls=cl_lightstyle ; i<MAX_LIGHTSTYLES ; i++, ls++)		V_AddLightStyle (i, ls->value[0], ls->value[1], ls->value[2]);} /*============================================================== DLIGHT MANAGEMENT ==============================================================*/ cdlight_t		cl_dlights[MAX_DLIGHTS]; /*================CL_ClearDlights================*/void CL_ClearDlights (void){	memset (cl_dlights, 0, sizeof(cl_dlights));} /*===============CL_AllocDlight ===============*/cdlight_t *CL_AllocDlight (int key){	int		i;	cdlight_t	*dl; // first look for an exact key match	if (key)	{		dl = cl_dlights;		for (i=0 ; i<MAX_DLIGHTS ; i++, dl++)		{			if (dl->key == key)			{				memset (dl, 0, sizeof(*dl));				dl->key = key;				return dl;			}		}	} // then look for anything else	dl = cl_dlights;	for (i=0 ; i<MAX_DLIGHTS ; i++, dl++)	{		if (dl->die < cl.time)		{			memset (dl, 0, sizeof(*dl));			dl->key = key;			return dl;		}	} 	dl = &cl_dlights[0];	memset (dl, 0, sizeof(*dl));	dl->key = key;	return dl;} /*===============CL_NewDlight===============*/void CL_NewDlight (int key, float x, float y, float z, float radius, float time){	cdlight_t	*dl; 	dl = CL_AllocDlight (key);	dl->origin[0] = x;	dl->origin[1] = y;	dl->origin[2] = z;	dl->radius = radius;	dl->die = cl.time + time;}  /*===============CL_RunDLights ===============*/void CL_RunDLights (void){	int			i;	cdlight_t	*dl; 	dl = cl_dlights;	for (i=0 ; i<MAX_DLIGHTS ; i++, dl++)	{		if (!dl->radius)			continue;				if (dl->die < cl.time)		{			dl->radius = 0;			return;		}		dl->radius -= cls.frametime*dl->decay;		if (dl->radius < 0)			dl->radius = 0;	}} /*==============CL_ParseMuzzleFlash==============*/void CL_ParseMuzzleFlash (void){	vec3_t		fv, rv;	cdlight_t	*dl;	int			i, weapon;	centity_t	*pl;	int			silenced;	float		volume;	char		soundname[64]; 	i = MSG_ReadShort (&net_message);	if (i < 1 || i >= MAX_EDICTS)		Com_Error (ERR_DROP, "CL_ParseMuzzleFlash: bad entity"); 	weapon = MSG_ReadByte (&net_message);	silenced = weapon & MZ_SILENCED;	weapon &= ~MZ_SILENCED; 	pl = &cl_entities[i]; 	dl = CL_AllocDlight (i);	VectorCopy (pl->current.origin,  dl->origin);	AngleVectors (pl->current.angles, fv, rv, NULL);	VectorMA (dl->origin, 18, fv, dl->origin);	VectorMA (dl->origin, 16, rv, dl->origin);	if (silenced)		dl->radius = 100 + (rand()&31);	else		dl->radius = 200 + (rand()&31);	dl->minlight = 32;	dl->die = cl.time; // + 0.1; 	if (silenced)		volume = 0.2;	else		volume = 1; 	switch (weapon)	{	case MZ_BLASTER:		dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;		S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/blastf1a.wav"), volume, ATTN_NORM, 0);		break;	case MZ_BLUEHYPERBLASTER:		dl->color[0] = 0;dl->color[1] = 0;dl->color[2] = 1;		S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/hyprbf1a.wav"), volume, ATTN_NORM, 0);		break;	case MZ_HYPERBLASTER:		dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;		S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/hyprbf1a.wav"), volume, ATTN_NORM, 0);		break;	case MZ_MACHINEGUN:		dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;		Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1);		S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0);		break;	case MZ_SHOTGUN:		dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;		S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/shotgf1b.wav"), volume, ATTN_NORM, 0);		S_StartSound (NULL, i, CHAN_AUTO,   S_RegisterSound("weapons/shotgr1b.wav"), volume, ATTN_NORM, 0.1);		break;	case MZ_SSHOTGUN:		dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;		S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/sshotf1b.wav"), volume, ATTN_NORM, 0);		break;	case MZ_CHAINGUN1:		dl->radius = 200 + (rand()&31);		dl->color[0] = 1;dl->color[1] = 0.25;dl->color[2] = 0;		Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1);		S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0);		break;	case MZ_CHAINGUN2:		dl->radius = 225 + (rand()&31);		dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0;		dl->die = cl.time  + 0.1;	// long delay		Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1);		S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0);		Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1);		S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0.05);		break;	case MZ_CHAINGUN3:		dl->radius = 250 + (rand()&31);		dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;		dl->die = cl.time  + 0.1;	// long delay		Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1);		S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0);		Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1);		S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0.033);		Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1);		S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0.066);		break;	case MZ_RAILGUN:		dl->color[0] = 0.5;dl->color[1] = 0.5;dl->color[2] = 1.0;		S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/railgf1a.wav"), volume, ATTN_NORM, 0);		break;	case MZ_ROCKET:		dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0.2;		S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/rocklf1a.wav"), volume, ATTN_NORM, 0);		S_StartSound (NULL, i, CHAN_AUTO,   S_RegisterSound("weapons/rocklr1b.wav"), volume, ATTN_NORM, 0.1);		break;	case MZ_GRENADE:		dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0;		S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/grenlf1a.wav"), volume, ATTN_NORM, 0);		S_StartSound (NULL, i, CHAN_AUTO,   S_RegisterSound("weapons/grenlr1b.wav"), volume, ATTN_NORM, 0.1);		break;	case MZ_BFG:		dl->color[0] = 0;dl->color[1] = 1;dl->color[2] = 0;		S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/bfg__f1y.wav"), volume, ATTN_NORM, 0);		break; 	case MZ_LOGIN:		dl->color[0] = 0;dl->color[1] = 1; dl->color[2] = 0;		dl->die = cl.time + 1.0;		S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/grenlf1a.wav"), 1, ATTN_NORM, 0);		CL_LogoutEffect (pl->current.origin, weapon);		break;	case MZ_LOGOUT:		dl->color[0] = 1;dl->color[1] = 0; dl->color[2] = 0;		dl->die = cl.time + 1.0;		S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/grenlf1a.wav"), 1, ATTN_NORM, 0);		CL_LogoutEffect (pl->current.origin, weapon);		break;	case MZ_RESPAWN:		dl->color[0] = 1;dl->color[1] = 1; dl->color[2] = 0;		dl->die = cl.time + 1.0;		S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/grenlf1a.wav"), 1, ATTN_NORM, 0);		CL_LogoutEffect (pl->current.origin, weapon);		break;	// RAFAEL	case MZ_PHALANX:		dl->color[0] = 1;dl->color[1] = 0.5; dl->color[2] = 0.5;		S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/plasshot.wav"), volume, ATTN_NORM, 0);		break;	// RAFAEL	case MZ_IONRIPPER:			dl->color[0] = 1;dl->color[1] = 0.5; dl->color[2] = 0.5;		S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/rippfire.wav"), volume, ATTN_NORM, 0);		break; // ======================// PGM	case MZ_ETF_RIFLE:		dl->color[0] = 0.9;dl->color[1] = 0.7;dl->color[2] = 0;		S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/nail1.wav"), volume, ATTN_NORM, 0);		break;	case MZ_SHOTGUN2:		dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;		S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/shotg2.wav"), volume, ATTN_NORM, 0);		break;	case MZ_HEATBEAM:		dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;		dl->die = cl.time + 100;//		S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/bfg__l1a.wav"), volume, ATTN_NORM, 0);		break;	case MZ_BLASTER2:		dl->color[0] = 0;dl->color[1] = 1;dl->color[2] = 0;		// FIXME - different sound for blaster2 ??		S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/blastf1a.wav"), volume, ATTN_NORM, 0);		break;	case MZ_TRACKER:		// negative flashes handled the same in gl/soft until CL_AddDLights		dl->color[0] = -1;dl->color[1] = -1;dl->color[2] = -1;		S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/disint2.wav"), volume, ATTN_NORM, 0);		break;			case MZ_NUKE1:		dl->color[0] = 1;dl->color[1] = 0;dl->color[2] = 0;		dl->die = cl.time + 100;		break;	case MZ_NUKE2:		dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;		dl->die = cl.time + 100;		break;	case MZ_NUKE4:		dl->color[0] = 0;dl->color[1] = 0;dl->color[2] = 1;		dl->die = cl.time + 100;		break;	case MZ_NUKE8:		dl->color[0] = 0;dl->color[1] = 1;dl->color[2] = 1;		dl->die = cl.time + 100;		break;// PGM// ======================	}}  /*==============CL_ParseMuzzleFlash2==============*/void CL_ParseMuzzleFlash2 (void) {	int			ent;	vec3_t		origin;	int			flash_number;	cdlight_t	*dl;	vec3_t		forward, right;	char		soundname[64]; 	ent = MSG_ReadShort (&net_message);	if (ent < 1 || ent >= MAX_EDICTS)		Com_Error (ERR_DROP, "CL_ParseMuzzleFlash2: bad entity"); 	flash_number = MSG_ReadByte (&net_message); 	// locate the origin	AngleVectors (cl_entities[ent].current.angles, forward, right, NULL);	origin[0] = cl_entities[ent].current.origin[0] + forward[0] * monster_flash_offset[flash_number][0] + right[0] * monster_flash_offset[flash_number][1];	origin[1] = cl_entities[ent].current.origin[1] + forward[1] * monster_flash_offset[flash_number][0] + right[1] * monster_flash_offset[flash_number][1];	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]; 	dl = CL_AllocDlight (ent);	VectorCopy (origin,  dl->origin);	dl->radius = 200 + (rand()&31);	dl->minlight = 32;	dl->die = cl.time;	// + 0.1; 	switch (flash_number)	{	case MZ2_INFANTRY_MACHINEGUN_1:	case MZ2_INFANTRY_MACHINEGUN_2:	case MZ2_INFANTRY_MACHINEGUN_3:	case MZ2_INFANTRY_MACHINEGUN_4:	case MZ2_INFANTRY_MACHINEGUN_5:	case MZ2_INFANTRY_MACHINEGUN_6:	case MZ2_INFANTRY_MACHINEGUN_7:	case MZ2_INFANTRY_MACHINEGUN_8:	case MZ2_INFANTRY_MACHINEGUN_9:	case MZ2_INFANTRY_MACHINEGUN_10:	case MZ2_INFANTRY_MACHINEGUN_11:	case MZ2_INFANTRY_MACHINEGUN_12:	case MZ2_INFANTRY_MACHINEGUN_13:		dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;		CL_ParticleEffect (origin, vec3_origin, 0, 40);		CL_SmokeAndFlash(origin);		S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("infantry/infatck1.wav"), 1, ATTN_NORM, 0);		break; 	case MZ2_SOLDIER_MACHINEGUN_1:	case MZ2_SOLDIER_MACHINEGUN_2:	case MZ2_SOLDIER_MACHINEGUN_3:	case MZ2_SOLDIER_MACHINEGUN_4:	case MZ2_SOLDIER_MACHINEGUN_5:	case MZ2_SOLDIER_MACHINEGUN_6:	case MZ2_SOLDIER_MACHINEGUN_7:	case MZ2_SOLDIER_MACHINEGUN_8:		dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;		CL_ParticleEffect (origin, vec3_origin, 0, 40);		CL_SmokeAndFlash(origin);		S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("soldier/solatck3.wav"), 1, ATTN_NORM, 0);		break; 	case MZ2_GUNNER_MACHINEGUN_1:	case MZ2_GUNNER_MACHINEGUN_2:	case MZ2_GUNNER_MACHINEGUN_3:	case MZ2_GUNNER_MACHINEGUN_4:	case MZ2_GUNNER_MACHINEGUN_5:	case MZ2_GUNNER_MACHINEGUN_6:	case MZ2_GUNNER_MACHINEGUN_7:	case MZ2_GUNNER_MACHINEGUN_8:		dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;		CL_ParticleEffect (origin, vec3_origin, 0, 40);		CL_SmokeAndFlash(origin);		S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("gunner/gunatck2.wav"), 1, ATTN_NORM, 0);		break; 	case MZ2_ACTOR_MACHINEGUN_1:	case MZ2_SUPERTANK_MACHINEGUN_1:	case MZ2_SUPERTANK_MACHINEGUN_2:	case MZ2_SUPERTANK_MACHINEGUN_3:	case MZ2_SUPERTANK_MACHINEGUN_4:	case MZ2_SUPERTANK_MACHINEGUN_5:	case MZ2_SUPERTANK_MACHINEGUN_6:	case MZ2_TURRET_MACHINEGUN:			// PGM		dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; 		CL_ParticleEffect (origin, vec3_origin, 0, 40);

Lines 1–500 of 2266.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t