From 8039db5ff235266f76eb26fc3cbcec521156d28b Mon Sep 17 00:00:00 2001 From: helixhorned Date: Mon, 13 Aug 2012 18:25:53 +0000 Subject: [PATCH] Hacks for the splitscreen mod: play sounds from both players. The sound distance is the minimum of the two. Both point sources as well as MUSICANDSFX ambient sound is handled. git-svn-id: https://svn.eduke32.com/eduke32@2885 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/eduke32/source/actors.c | 26 +++++++++++++++---- polymer/eduke32/source/sounds.c | 46 ++++++++++++++++++++++++++++----- 2 files changed, 61 insertions(+), 11 deletions(-) diff --git a/polymer/eduke32/source/actors.c b/polymer/eduke32/source/actors.c index f36205beb..42aeb2738 100644 --- a/polymer/eduke32/source/actors.c +++ b/polymer/eduke32/source/actors.c @@ -1217,7 +1217,6 @@ BOLT: ACTOR_STATIC void G_MoveFX(void) { int32_t i = headspritestat[STAT_FX], j, nexti; - int32_t x, ht; spritetype *s; while (i >= 0) @@ -1240,8 +1239,8 @@ ACTOR_STATIC void G_MoveFX(void) break; case MUSICANDSFX__STATIC: - - ht = s->hitag; + { + const int32_t ht = s->hitag; if (T2 != ud.config.SoundToggle) { @@ -1251,7 +1250,15 @@ ACTOR_STATIC void G_MoveFX(void) if (s->lotag >= 1000 && s->lotag < 2000) { - x = ldist(&sprite[g_player[screenpeek].ps->i],s); + int32_t x = ldist(&sprite[g_player[screenpeek].ps->i],s); + + if (g_fakeMultiMode && ud.multimode==2) + { + // HACK for splitscreen mod + int32_t otherdist = ldist(&sprite[g_player[1].ps->i],s); + x = min(x, otherdist); + } + if (x < ht && T1 == 0) { FX_SetReverb(s->lotag - 1000); @@ -1268,7 +1275,15 @@ ACTOR_STATIC void G_MoveFX(void) { if ((g_sounds[s->lotag].m&2)) { - x = dist(&sprite[g_player[screenpeek].ps->i],s); + int32_t x = dist(&sprite[g_player[screenpeek].ps->i],s); + + if (g_fakeMultiMode && ud.multimode==2) + { + // HACK for splitscreen mod + int32_t otherdist = dist(&sprite[g_player[1].ps->i],s); + x = min(x, otherdist); + } + if (x < ht && T1 == 0 && FX_VoiceAvailable(g_sounds[s->lotag].pr-1)) { if (g_numEnvSoundsPlaying == ud.config.NumVoices) @@ -1312,6 +1327,7 @@ ACTOR_STATIC void G_MoveFX(void) } break; } + } BOLT: i = nexti; } diff --git a/polymer/eduke32/source/sounds.c b/polymer/eduke32/source/sounds.c index 144642794..3f4aa3fcc 100644 --- a/polymer/eduke32/source/sounds.c +++ b/polymer/eduke32/source/sounds.c @@ -400,6 +400,13 @@ static inline int32_t find_free_slot(int32_t num) return j; } +static inline int32_t get_sound_ang(int32_t camang, const vec3_t *cam, const vec3_t *pos) +{ + int32_t sndang = 2048 + camang - getangle(cam->x-pos->x, cam->y-pos->y); + sndang &= 2047; + return sndang; +} + static int32_t S_CalcDistAndAng(int32_t i, int32_t num, int32_t camsect, int32_t camang, const vec3_t *cam, const vec3_t *pos, int32_t *sndistptr, int32_t *sndangptr) @@ -410,17 +417,44 @@ static int32_t S_CalcDistAndAng(int32_t i, int32_t num, int32_t camsect, int32_t if (PN == APLAYER && sprite[i].yvel == screenpeek) { sndang = sndist = 0; + goto sound_further_processing; } - else + + sndang = get_sound_ang(camang, cam, pos); + + sndist = FindDistance3D(cam->x-pos->x, cam->y-pos->y, (cam->z-pos->z)>>4); + + if (g_fakeMultiMode && ud.multimode==2) { - sndang = 2048 + camang - getangle(cam->x-pos->x, cam->y-pos->y); - sndang &= 2047; + // HACK for splitscreen mod: take the min of sound distances + // to 1st and 2nd player. - sndist = FindDistance3D(cam->x-pos->x, cam->y-pos->y, (cam->z-pos->z)>>4); - if ((g_sounds[num].m&16) == 0 && PN == MUSICANDSFX && SLT < 999 && (sector[SECT].lotag&0xff) < 9) - sndist = divscale14(sndist, SHT+1); + if (PN == APLAYER && sprite[i].yvel==1) + { + sndist = sndang = 0; + goto sound_further_processing; + } + + { + const vec3_t *cam2 = &g_player[1].ps->pos; + int32_t sndist2 = FindDistance3D(cam2->x-pos->x, cam2->y-pos->y, (cam2->z-pos->z)>>4); + + if (sndist2 < sndist) + { + cam = cam2; + camsect = g_player[1].ps->cursectnum; + camang = g_player[1].ps->ang; + + sndist = sndist2; + sndang = get_sound_ang(camang, cam, pos); + } + } } + if ((g_sounds[num].m&16) == 0 && PN == MUSICANDSFX && SLT < 999 && (sector[SECT].lotag&0xff) < 9) + sndist = divscale14(sndist, SHT+1); + +sound_further_processing: sndist += g_sounds[num].vo; if (sndist < 0) sndist = 0;