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
This commit is contained in:
helixhorned 2012-08-13 18:25:53 +00:00
parent af05fe18be
commit 8039db5ff2
2 changed files with 61 additions and 11 deletions

View file

@ -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;
}

View file

@ -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;