diff --git a/src/s_sound.c b/src/s_sound.c index abc3707c5..a8847c22b 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -520,6 +520,7 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume) sfxinfo_t *sfx; INT32 sep, pitch, priority, cnum; boolean anyListeners = false; + boolean itsUs = false; INT32 i; listener_t listener[MAXSPLITSCREENPLAYERS]; @@ -557,6 +558,11 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume) { listenmobj[i] = player->mo; } + + if (origin && origin == listenmobj[i]) + { + itsUs = true; + } } #ifdef HW3SOUND @@ -616,40 +622,56 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume) // Initialize sound parameters pitch = NORM_PITCH; priority = NORM_PRIORITY; + sep = NORM_SEP; + + i = 0; // sensible default - for (i = r_splitscreen; i >= 0; i--) { - // Copy the sound for the splitscreen players! - if (listenmobj[i] == NULL && i != 0) - { - continue; - } - // Check to see if it is audible, and if not, modify the params - if (origin && origin != listenmobj[i]) + if (origin && !itsUs) { - boolean rc = S_AdjustSoundParams(listenmobj[i], origin, &volume, &sep, &pitch, sfx); + boolean audible = false; - if (!rc) + if (r_splitscreen > 0) { - continue; // Maybe the other player can hear it... + fixed_t recdist = INT32_MAX; + UINT8 j = 0; + + for (; j <= r_splitscreen; j++) + { + fixed_t thisdist = INT32_MAX; + + if (!listenmobj[j]) + { + continue; + } + + thisdist = P_AproxDistance(listener[j].x - origin->x, listener[j].y - origin->y); + + if (thisdist >= recdist) + { + continue; + } + + recdist = thisdist; + i = j; + } } - if (origin->x == listener[i].x && origin->y == listener[i].y) + if (listenmobj[i]) { - sep = NORM_SEP; + audible = S_AdjustSoundParams(listenmobj[i], origin, &volume, &sep, &pitch, sfx); + + if (origin->x == listener[i].x && origin->y == listener[i].y) + { + sep = NORM_SEP; + } + } + + if (!audible) + { + return; } - } - else if (i > 0 && !origin) - { - // Do not play origin-less sounds for the splitscreen players. - // The first player will be able to hear it just fine, - // we really don't want it playing twice. - continue; - } - else - { - sep = NORM_SEP; } // This is supposed to handle the loading/caching. @@ -857,46 +879,58 @@ void S_UpdateSounds(void) { boolean itsUs = false; - for (i = 0; i <= r_splitscreen; i++) + for (i = r_splitscreen; i >= 0; i--) { - if (c->origin == players[displayplayers[i]].mo) - { - itsUs = true; - break; - } + if (c->origin != listenmobj[i]) + continue; + + itsUs = true; } if (itsUs == false) { - const mobj_t *soundmobj = c->origin; - fixed_t recdist = INT32_MAX; - UINT8 p = 0; + const mobj_t *origin = c->origin; - for (i = 0; i <= r_splitscreen; i++) + i = 0; + + if (r_splitscreen > 0) { - fixed_t thisdist = INT32_MAX; + fixed_t recdist = INT32_MAX; + UINT8 j = 0; - if (!listenmobj[i]) + for (; j <= r_splitscreen; j++) { - continue; - } + fixed_t thisdist = INT32_MAX; - thisdist = P_AproxDistance(listener[i].x - soundmobj->x, listener[i].y - soundmobj->y); + if (!listenmobj[j]) + { + continue; + } - if (thisdist < recdist) - { + thisdist = P_AproxDistance(listener[j].x - origin->x, listener[j].y - origin->y); + + if (thisdist >= recdist) + { + continue; + } + recdist = thisdist; - p = i; + i = j; } } - if (listenmobj[p]) + if (listenmobj[i]) { audible = S_AdjustSoundParams( - listenmobj[p], c->origin, + listenmobj[i], c->origin, &volume, &sep, &pitch, c->sfxinfo ); + + if (origin->x == listener[i].x && origin->y == listener[i].y) + { + sep = NORM_SEP; + } } if (audible)