diff --git a/src/k_kart.c b/src/k_kart.c index d6b7befc1..aaade44e4 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2693,13 +2693,33 @@ static void K_RegularVoiceTimers(player_t *player) player->karthud[khud_tauntvoices] = 4*TICRATE; } -void K_PlayAttackTaunt(mobj_t *source) +static UINT8 K_ObjectToSkinIDForSounds(mobj_t *source) { - sfxenum_t pick = P_RandomKey(PR_VOICES, 2); // Gotta roll the RNG every time this is called for sync reasons - boolean tasteful = (!source->player || !source->player->karthud[khud_tauntvoices]); + if (source->player) + return source->player->skin; - if (cv_kartvoices.value && (tasteful || cv_kartvoices.value == 2)) - S_StartSound(source, sfx_kattk1+pick); + if (!source->skin) + return MAXSKINS; + + return ((skin_t *)source->skin)-skins; +} + +static void K_PlayGenericTastefulTaunt(mobj_t *source, sfxenum_t sfx_id) +{ + UINT8 skinid = K_ObjectToSkinIDForSounds(source); + if (skinid >= numskins) + return; + + boolean tasteful = (!source->player || source->player->karthud[khud_tauntvoices]); + + if ( + cv_kartvoices.value + && (tasteful || cv_kartvoices.value == 2) + && R_CanShowSkinInDemo(skinid) + ) + { + S_StartSound(source, sfx_id); + } if (!tasteful) return; @@ -2707,23 +2727,27 @@ void K_PlayAttackTaunt(mobj_t *source) K_TauntVoiceTimers(source->player); } +void K_PlayAttackTaunt(mobj_t *source) +{ + // Gotta roll the RNG every time this is called for sync reasons + sfxenum_t pick = P_RandomKey(PR_VOICES, 2); + K_PlayGenericTastefulTaunt(source, sfx_kattk1+pick); +} + void K_PlayBoostTaunt(mobj_t *source) { - sfxenum_t pick = P_RandomKey(PR_VOICES, 2); // Gotta roll the RNG every time this is called for sync reasons - boolean tasteful = (!source->player || !source->player->karthud[khud_tauntvoices]); - - if (cv_kartvoices.value && (tasteful || cv_kartvoices.value == 2)) - S_StartSound(source, sfx_kbost1+pick); - - if (!tasteful) - return; - - K_TauntVoiceTimers(source->player); + // Gotta roll the RNG every time this is called for sync reasons + sfxenum_t pick = P_RandomKey(PR_VOICES, 2); + K_PlayGenericTastefulTaunt(source, sfx_kbost1+pick); } void K_PlayOvertakeSound(mobj_t *source) { - boolean tasteful = (!source->player || !source->player->karthud[khud_voices]); + UINT8 skinid = K_ObjectToSkinIDForSounds(source); + if (skinid >= numskins) + return; + + boolean tasteful = (!source->player || source->player->karthud[khud_voices]); if (!(gametyperules & GTR_CIRCUIT)) // Only in race return; @@ -2732,8 +2756,14 @@ void K_PlayOvertakeSound(mobj_t *source) if (leveltime < starttime+(10*TICRATE)) return; - if (cv_kartvoices.value && (tasteful || cv_kartvoices.value == 2)) + if ( + cv_kartvoices.value + && (tasteful || cv_kartvoices.value == 2) + && R_CanShowSkinInDemo(skinid) + ) + { S_StartSound(source, sfx_kslow); + } if (!tasteful) return; @@ -2741,11 +2771,12 @@ void K_PlayOvertakeSound(mobj_t *source) K_RegularVoiceTimers(source->player); } -void K_PlayPainSound(mobj_t *source, mobj_t *other) +static void K_PlayGenericCombatSound(mobj_t *source, mobj_t *other, sfxenum_t sfx_id) { - sfxenum_t pick = P_RandomKey(PR_VOICES, 2); // Gotta roll the RNG every time this is called for sync reasons - skin_t *skin = (source->player ? &skins[source->player->skin] : ((skin_t *)source->skin)); - sfxenum_t sfx_id = skin->soundsid[S_sfx[sfx_khurt1 + pick].skinsound]; + UINT8 skinid = K_ObjectToSkinIDForSounds(source); + if (skinid >= numskins) + return; + boolean alwaysHear = false; if (other != NULL && P_MobjWasRemoved(other) == false && other->player != NULL) @@ -2753,31 +2784,29 @@ void K_PlayPainSound(mobj_t *source, mobj_t *other) alwaysHear = P_IsDisplayPlayer(other->player); } - if (cv_kartvoices.value) + if ( + cv_kartvoices.value + && R_CanShowSkinInDemo(skinid) + ) { - S_StartSound(alwaysHear ? NULL : source, sfx_id); + S_StartSound( + alwaysHear ? NULL : source, + skins[skinid].soundsid[S_sfx[sfx_id].skinsound] + ); } K_RegularVoiceTimers(source->player); } +void K_PlayPainSound(mobj_t *source, mobj_t *other) +{ + sfxenum_t pick = P_RandomKey(PR_VOICES, 2); // Gotta roll the RNG every time this is called for sync reasons + K_PlayGenericCombatSound(source, other, sfx_khurt1 + pick); +} + void K_PlayHitEmSound(mobj_t *source, mobj_t *other) { - skin_t *skin = (source->player ? &skins[source->player->skin] : ((skin_t *)source->skin)); - sfxenum_t sfx_id = skin->soundsid[S_sfx[sfx_khitem].skinsound]; - boolean alwaysHear = false; - - if (other != NULL && P_MobjWasRemoved(other) == false && other->player != NULL) - { - alwaysHear = P_IsDisplayPlayer(other->player); - } - - if (cv_kartvoices.value) - { - S_StartSound(alwaysHear ? NULL : source, sfx_id); - } - - K_RegularVoiceTimers(source->player); + K_PlayGenericCombatSound(source, other, sfx_khitem); } void K_TryHurtSoundExchange(mobj_t *victim, mobj_t *attacker) @@ -2813,7 +2842,14 @@ void K_TryHurtSoundExchange(mobj_t *victim, mobj_t *attacker) void K_PlayPowerGloatSound(mobj_t *source) { - if (cv_kartvoices.value) + UINT8 skinid = K_ObjectToSkinIDForSounds(source); + if (skinid >= numskins) + return; + + if ( + cv_kartvoices.value + && R_CanShowSkinInDemo(skinid) + ) { S_StartSound(source, sfx_kgloat); } @@ -2821,6 +2857,22 @@ void K_PlayPowerGloatSound(mobj_t *source) K_RegularVoiceTimers(source->player); } +// MOVED so we don't have to extern K_ObjectToSkinID +void P_PlayVictorySound(mobj_t *source) +{ + UINT8 skinid = K_ObjectToSkinIDForSounds(source); + if (skinid >= numskins) + return; + + if ( + cv_kartvoices.value + && R_CanShowSkinInDemo(skinid) + ) + { + S_StartSound(source, sfx_kwin); + } +} + static void K_HandleDelayedHitByEm(player_t *player) { if (player->confirmVictimDelay == 0) diff --git a/src/k_tally.cpp b/src/k_tally.cpp index 9228081cc..57ee2612b 100644 --- a/src/k_tally.cpp +++ b/src/k_tally.cpp @@ -517,13 +517,17 @@ void level_tally_t::Init(player_t *player) { // It'd be neat to add all of the grade sounds, // but not this close to release - if (rank < GRADE_C) + + UINT8 skinid = player->skin; + if (skinid >= numskins || R_CanShowSkinInDemo(skinid) == false) + ; + else if (rank < GRADE_C) { - gradeVoice = ((skin_t *)player->mo->skin)->soundsid[S_sfx[sfx_klose].skinsound]; + gradeVoice = skins[skinid].soundsid[S_sfx[sfx_klose].skinsound]; } else { - gradeVoice = ((skin_t *)player->mo->skin)->soundsid[S_sfx[sfx_kwin].skinsound]; + gradeVoice = skins[skinid].soundsid[S_sfx[sfx_kwin].skinsound]; } } diff --git a/src/p_user.c b/src/p_user.c index 7fe77b316..f93f15c54 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -547,12 +547,6 @@ void P_PlayDeathSound(mobj_t *source) S_StartSound(source, sfx_s3k35); } -void P_PlayVictorySound(mobj_t *source) -{ - if (cv_kartvoices.value) - S_StartSound(source, sfx_kwin); -} - // // P_StartPositionMusic // diff --git a/src/s_sound.c b/src/s_sound.c index b60e1ddf1..7de1bc7b7 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -502,6 +502,8 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume) { // redirect player sound to the sound in the skin table skin_t *skin = (origin->player ? &skins[origin->player->skin] : ((skin_t *)origin->skin)); + if (R_CanShowSkinInDemo(skin-skins) == false) + return; sfx_id = skin->soundsid[sfx->skinsound]; sfx = &S_sfx[sfx_id]; }