diff --git a/engine/client/cl_tent.c b/engine/client/cl_tent.c index 7023a7f9..86235c3d 100644 --- a/engine/client/cl_tent.c +++ b/engine/client/cl_tent.c @@ -57,36 +57,6 @@ const char *cl_default_sprites[] = "sprites/shellchrome.spr", }; -const char *cl_player_shell_sounds[] = -{ - "player/pl_shell1.wav", - "player/pl_shell2.wav", - "player/pl_shell3.wav", -}; - -const char *cl_weapon_shell_sounds[] = -{ - "weapons/sshell1.wav", - "weapons/sshell2.wav", - "weapons/sshell3.wav", -}; - -const char *cl_ricochet_sounds[] = -{ - "weapons/ric1.wav", - "weapons/ric2.wav", - "weapons/ric3.wav", - "weapons/ric4.wav", - "weapons/ric5.wav", -}; - -const char *cl_explode_sounds[] = -{ - "weapons/explode3.wav", - "weapons/explode4.wav", - "weapons/explode5.wav", -}; - static void CL_PlayerDecal( int playerIndex, int textureIndex, int entityIndex, float *pos ); /* @@ -148,6 +118,7 @@ client resources not precached by server */ void CL_AddClientResources( void ) { + const char *snd; char filepath[MAX_QPATH]; int i; @@ -163,37 +134,37 @@ void CL_AddClientResources( void ) } // then check sounds - for( i = 0; i < ARRAYSIZE( cl_player_shell_sounds ); i++ ) + for( i = 0; ( snd = SoundList_Get( BouncePlayerShell, i )); i++ ) { - Q_snprintf( filepath, sizeof( filepath ), DEFAULT_SOUNDPATH "%s", cl_player_shell_sounds[i] ); + Q_snprintf( filepath, sizeof( filepath ), DEFAULT_SOUNDPATH "%s", snd ); if( !FS_FileExists( filepath, false )) - CL_AddClientResource( cl_player_shell_sounds[i], t_sound ); + CL_AddClientResource( snd, t_sound ); } - for( i = 0; i < ARRAYSIZE( cl_weapon_shell_sounds ); i++ ) + for( i = 0; ( snd = SoundList_Get( BounceWeaponShell, i )); i++ ) { - Q_snprintf( filepath, sizeof( filepath ), DEFAULT_SOUNDPATH "%s", cl_weapon_shell_sounds[i] ); + Q_snprintf( filepath, sizeof( filepath ), DEFAULT_SOUNDPATH "%s", snd ); if( !FS_FileExists( filepath, false )) - CL_AddClientResource( cl_weapon_shell_sounds[i], t_sound ); + CL_AddClientResource( snd, t_sound ); } - for( i = 0; i < ARRAYSIZE( cl_explode_sounds ); i++ ) + for( i = 0; ( snd = SoundList_Get( Explode, i )); i++ ) { - Q_snprintf( filepath, sizeof( filepath ), DEFAULT_SOUNDPATH "%s", cl_explode_sounds[i] ); + Q_snprintf( filepath, sizeof( filepath ), DEFAULT_SOUNDPATH "%s", snd ); if( !FS_FileExists( filepath, false )) - CL_AddClientResource( cl_explode_sounds[i], t_sound ); + CL_AddClientResource( snd, t_sound ); } #if 0 // ric sounds was precached by server-side - for( i = 0; i < ARRAYSIZE( cl_ricochet_sounds ); i++ ) + for( i = 0; ( snd = SoundList_Get( Ricochet, i )); i++ ) { - Q_snprintf( filepath, sizeof( filepath ), DEFAULT_SOUNDPATH "%s", cl_ricochet_sounds[i] ); + Q_snprintf( filepath, sizeof( filepath ), DEFAULT_SOUNDPATH "%s", snd ); if( !FS_FileExists( filepath, false )) - CL_AddClientResource( cl_ricochet_sounds[i], t_sound ); + CL_AddClientResource( snd, t_sound ); } #endif } @@ -301,7 +272,7 @@ play collide sound static void CL_TempEntPlaySound( TEMPENTITY *pTemp, float damp ) { float fvol; - char soundname[32]; + const char *soundname = NULL; qboolean isshellcasing = false; int zvel; @@ -312,36 +283,39 @@ static void CL_TempEntPlaySound( TEMPENTITY *pTemp, float damp ) switch( pTemp->hitSound ) { case BOUNCE_GLASS: - Q_snprintf( soundname, sizeof( soundname ), "debris/glass%i.wav", COM_RandomLong( 1, 4 )); + soundname = SoundList_GetRandom( BounceGlass ); break; case BOUNCE_METAL: - Q_snprintf( soundname, sizeof( soundname ), "debris/metal%i.wav", COM_RandomLong( 1, 6 )); + soundname = SoundList_GetRandom( BounceMetal ); break; case BOUNCE_FLESH: - Q_snprintf( soundname, sizeof( soundname ), "debris/flesh%i.wav", COM_RandomLong( 1, 7 )); + soundname = SoundList_GetRandom( BounceFlesh ); break; case BOUNCE_WOOD: - Q_snprintf( soundname, sizeof( soundname ), "debris/wood%i.wav", COM_RandomLong( 1, 4 )); + soundname = SoundList_GetRandom( BounceWood ); break; case BOUNCE_SHRAP: - Q_strncpy( soundname, cl_ricochet_sounds[COM_RandomLong( 0, 4 )], sizeof( soundname ) ); + soundname = SoundList_GetRandom( Ricochet ); break; case BOUNCE_SHOTSHELL: - Q_strncpy( soundname, cl_weapon_shell_sounds[COM_RandomLong( 0, 2 )], sizeof( soundname ) ); + soundname = SoundList_GetRandom( BounceWeaponShell ); isshellcasing = true; // shell casings have different playback parameters fvol = 0.5f; break; case BOUNCE_SHELL: - Q_strncpy( soundname, cl_player_shell_sounds[COM_RandomLong( 0, 2 )], sizeof( soundname ) ); + soundname = SoundList_GetRandom( BouncePlayerShell ); isshellcasing = true; // shell casings have different playback parameters break; case BOUNCE_CONCRETE: - Q_snprintf( soundname, sizeof( soundname ), "debris/concrete%i.wav", COM_RandomLong( 1, 3 )); + soundname = SoundList_GetRandom( BounceConcrete ); break; default: // null sound return; } + if( !soundname ) + return; + zvel = abs( pTemp->entity.baseline.origin[2] ); // only play one out of every n @@ -1491,7 +1465,7 @@ void GAME_EXPORT R_FunnelSprite( const vec3_t org, int modelIndex, int reverse ) =============== R_SparkEffect -Create a streaks + richochet sprite +Create a streaks + ricochet sprite =============== */ void GAME_EXPORT R_SparkEffect( const vec3_t pos, int count, int velocityMin, int velocityMax ) @@ -1507,18 +1481,25 @@ R_RicochetSound Make a random ricochet sound ============== */ -static void R_RicochetSound_( const vec3_t pos, int sound ) +static void R_RicochetSoundByName( const vec3_t pos, const char *name ) { - sound_t handle; - - handle = S_RegisterSound( cl_ricochet_sounds[sound] ); - + sound_t handle; + handle = S_RegisterSound( name ); S_StartSound( pos, 0, CHAN_AUTO, handle, VOL_NORM, 1.0, 100, 0 ); } +static void R_RicochetSoundByIndex( const vec3_t pos, int idx ) +{ + const char *name = SoundList_Get( Ricochet, idx ); + if( name ) + R_RicochetSoundByName( pos, name ); +} + void GAME_EXPORT R_RicochetSound( const vec3_t pos ) { - R_RicochetSound_( pos, COM_RandomLong( 0, 4 )); + const char *name = SoundList_GetRandom( Ricochet ); + if( name ) + R_RicochetSoundByName( pos, name ); } /* @@ -1665,8 +1646,12 @@ void GAME_EXPORT R_Explosion( vec3_t pos, int model, float scale, float framerat if( !FBitSet( flags, TE_EXPLFLAG_NOSOUND )) { - hSound = S_RegisterSound( cl_explode_sounds[COM_RandomLong( 0, 2 )] ); - S_StartSound( pos, 0, CHAN_STATIC, hSound, VOL_NORM, 0.3f, PITCH_NORM, 0 ); + const char *name = SoundList_GetRandom( Explode ); + if( name ) + { + hSound = S_RegisterSound( name ); + S_StartSound( pos, 0, CHAN_STATIC, hSound, VOL_NORM, 0.3f, PITCH_NORM, 0 ); + } } } @@ -1909,6 +1894,7 @@ void CL_ParseTempEntity( sizebuf_t *msg ) cl_entity_t *pEnt; dlight_t *dl; sound_t hSound; + const char *name; if( cls.legacymode ) iSize = MSG_ReadByte( msg ); @@ -1968,8 +1954,11 @@ void CL_ParseTempEntity( sizebuf_t *msg ) pos[2] = MSG_ReadCoord( &buf ); R_BlobExplosion( pos ); - hSound = S_RegisterSound( cl_explode_sounds[0] ); - S_StartSound( pos, -1, CHAN_AUTO, hSound, VOL_NORM, 1.0f, PITCH_NORM, 0 ); + if(( name = SoundList_Get( Explode, 0 ))) + { + hSound = S_RegisterSound( name ); + S_StartSound( pos, -1, CHAN_AUTO, hSound, VOL_NORM, 1.0f, PITCH_NORM, 0 ); + } break; case TE_SMOKE: pos[0] = MSG_ReadCoord( &buf ); @@ -2022,8 +2011,11 @@ void CL_ParseTempEntity( sizebuf_t *msg ) dl->die = cl.time + 0.5; dl->decay = 300; - hSound = S_RegisterSound( cl_explode_sounds[0] ); - S_StartSound( pos, -1, CHAN_AUTO, hSound, VOL_NORM, 0.6f, PITCH_NORM, 0 ); + if(( name = SoundList_Get( Explode, 0 ))) + { + hSound = S_RegisterSound( name ); + S_StartSound( pos, -1, CHAN_AUTO, hSound, VOL_NORM, 1.0f, PITCH_NORM, 0 ); + } break; case TE_BSPDECAL: case TE_DECAL: @@ -2251,8 +2243,8 @@ void CL_ParseTempEntity( sizebuf_t *msg ) CL_DecalShoot( CL_DecalIndex( decalIndex ), entityIndex, 0, pos, 0 ); R_BulletImpactParticles( pos ); flags = COM_RandomLong( 0, 0x7fff ); - if( flags < 0x3fff ) - R_RicochetSound_( pos, flags % 5 ); + if( flags < 0x3fff && ( count = SoundList_Count( Ricochet ))) + R_RicochetSoundByIndex( pos, flags % count ); break; case TE_SPRAY: case TE_SPRITE_SPRAY: