diff --git a/src/r_plane.c b/src/r_plane.c index ccd4994ce..0a4e8ef0d 100644 --- a/src/r_plane.c +++ b/src/r_plane.c @@ -921,8 +921,8 @@ void R_DrawSinglePlane(visplane_t *pl) if (top < 0) top = 0; - if (bottom > vid.height) - bottom = vid.height; + if (bottom > viewheight) + bottom = viewheight; // Only copy the part of the screen we need for (i = 0; i <= r_splitscreen; i++) @@ -956,9 +956,10 @@ void R_DrawSinglePlane(visplane_t *pl) offset = (scry*vid.width) + scrx; // No idea if this works - VID_BlitLinearScreen(screens[0] + offset, screens[1] + offset, - viewwidth, bottom-top, - vid.width, vid.width); + VID_BlitLinearScreen(screens[0] + offset, + screens[1] + (top*vid.width), // intentionally not +offset + viewwidth, bottom-top, + vid.width, vid.width); } } } diff --git a/src/s_sound.c b/src/s_sound.c index abc3707c5..a012650bd 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; + } + + 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)