diff --git a/src/s_sound.c b/src/s_sound.c index 5b6b053d..6b96f6cd 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -451,6 +451,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]; @@ -473,10 +474,8 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume) if (i == 0 && democam.soundmobj) { listenmobj[i] = democam.soundmobj; - continue; } - - if (player->awayviewtics) + else if (player->awayviewtics) { listenmobj[i] = player->awayviewmobj; } @@ -484,6 +483,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 @@ -538,40 +542,55 @@ 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 = 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); - - if (!rc) + boolean audible = false; + if (splitscreen > 0) { - continue; // Maybe the other player can hear it... + fixed_t recdist = INT32_MAX; + UINT8 j = 0; + + for (; j <= 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. @@ -829,46 +848,58 @@ void S_UpdateSounds(void) { boolean itsUs = false; - for (i = 0; i <= splitscreen; i++) + for (i = 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 <= splitscreen; i++) + i = 0; + + if (splitscreen > 0) { - fixed_t thisdist = INT32_MAX; + fixed_t recdist = INT32_MAX; + UINT8 j = 0; - if (!listenmobj[i]) + for (; j <= 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; + } + + thisdist = P_AproxDistance(listener[j].x - origin->x, listener[j].y - origin->y); + + if (thisdist >= recdist) + { + continue; + } - if (thisdist < recdist) - { 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)