diff --git a/source/common/audio/sound/s_sound.cpp b/source/common/audio/sound/s_sound.cpp index 9c2ad6ab1..e60c49b6a 100644 --- a/source/common/audio/sound/s_sound.cpp +++ b/source/common/audio/sound/s_sound.cpp @@ -1079,13 +1079,14 @@ void SoundEngine::SetPitch(FSoundChan *chan, float pitch) // Is a sound being played by a specific emitter? //========================================================================== -int SoundEngine::GetSoundPlayingInfo (int sourcetype, const void *source, int sound_id) +int SoundEngine::GetSoundPlayingInfo (int sourcetype, const void *source, int sound_id, int chann) { int count = 0; if (sound_id > 0) { for (FSoundChan *chan = Channels; chan != NULL; chan = chan->NextChan) { + if (chann != -1 && chann != chan->EntChannel) continue; if (chan->OrgID == sound_id && (sourcetype == SOURCE_Any || (chan->SourceType == sourcetype && chan->Source == source))) @@ -1098,6 +1099,7 @@ int SoundEngine::GetSoundPlayingInfo (int sourcetype, const void *source, int so { for (FSoundChan* chan = Channels; chan != NULL; chan = chan->NextChan) { + if (chann != -1 && chann != chan->EntChannel) continue; if ((sourcetype == SOURCE_Any || (chan->SourceType == sourcetype && chan->Source == source))) { count++; diff --git a/source/common/audio/sound/s_soundinternal.h b/source/common/audio/sound/s_soundinternal.h index 11dac776a..00a53f014 100644 --- a/source/common/audio/sound/s_soundinternal.h +++ b/source/common/audio/sound/s_soundinternal.h @@ -298,7 +298,7 @@ public: bool IsSourcePlayingSomething(int sourcetype, const void* actor, int channel, int sound_id = -1); // Stop and resume music, during game PAUSE. - int GetSoundPlayingInfo(int sourcetype, const void* source, int sound_id); + int GetSoundPlayingInfo(int sourcetype, const void* source, int sound_id, int chan = -1); void UnloadAllSounds(); void Reset(); void MarkUsed(int num); diff --git a/source/games/whaven/src/2d.cpp b/source/games/whaven/src/2d.cpp index d05f05ede..8cb9f3ea3 100644 --- a/source/games/whaven/src/2d.cpp +++ b/source/games/whaven/src/2d.cpp @@ -38,9 +38,9 @@ void showStatisticsScreen() @Override public void run() { mapon++; - playsound_loc(S_CHAINDOOR1, plr.x, plr.y); + spritesound(S_CHAINDOOR1, &sprite[plr.spritenum]); playertorch = 0; - playsound_loc(S_WARP, plr.x, plr.y); + spritesound(S_WARP, &sprite[plr.spritenum]); loadnewlevel(mapon); } }); diff --git a/source/games/whaven/src/ai.cpp b/source/games/whaven/src/ai.cpp index 84b414100..99a858517 100644 --- a/source/games/whaven/src/ai.cpp +++ b/source/games/whaven/src/ai.cpp @@ -665,14 +665,14 @@ void attack(PLAYER& plr, int i) { short a = getangle(sprite[i].x - plr.x, sprite[i].y - plr.y); if ((a < plr.ang && plr.ang - a < 128) || (a > plr.ang && (((short)plr.ang + a) & 2047) < 128)) { if (krand() % 100 > 80) { - playsound_loc(S_SWORD1 + krand() % 3, plr.x, plr.y); + spritesound(S_SWORD1 + krand() % 3, &sprite[plr.spritenum]); return; } else { s = krand() % 50; plr.shieldpoints -= s; if (krand() % 100 > 50) { - playsound_loc(S_SWORD1 + krand() % 3, plr.x, plr.y); + spritesound(S_SWORD1 + krand() % 3, &sprite[plr.spritenum]); return; } } @@ -700,11 +700,11 @@ void attack(PLAYER& plr, int i) { k = 3; break; case SKELETONTYPE: - playsound_loc(S_RIP1 + (krand() % 3), sprite[i].x, sprite[i].y); + spritesound(S_RIP1 + (krand() % 3), &sprite[i]); if ((krand() % 2) != 0) - playsound_loc(S_GORE1 + (krand() % 4), sprite[i].x, sprite[i].y); + spritesound(S_GORE1 + (krand() % 4), &sprite[i]); if ((krand() % 2) != 0) - playsound_loc(S_BREATH1 + (krand() % 6), sprite[i].x, sprite[i].y); + spritesound(S_BREATH1 + (krand() % 6), &sprite[i]); if (isWh2()) k = (krand() % 5) + 5; @@ -712,21 +712,21 @@ void attack(PLAYER& plr, int i) { k >>= 2; break; case KATIETYPE: // damage 5 - 50 - playsound_loc(S_DEMONTHROW, sprite[i].x, sprite[i].y); + spritesound(S_DEMONTHROW, &sprite[i]); k = (krand() % 45) + 5; break; case DEVILTYPE: - playsound_loc(S_DEMONTHROW, sprite[i].x, sprite[i].y); + spritesound(S_DEMONTHROW, &sprite[i]); if (!isWh2()) k >>= 2; break; case KOBOLDTYPE: - playsound_loc(S_GENSWING, sprite[i].x, sprite[i].y); + spritesound(S_GENSWING, &sprite[i]); if ((krand() % 10) > 4) { - playsound_loc(S_KOBOLDHIT, plr.x, plr.y); - playsound_loc(S_BREATH1 + (krand() % 6), plr.x, plr.y); + spritesound(S_KOBOLDHIT, &sprite[plr.spritenum]); + spritesound(S_BREATH1 + (krand() % 6), &sprite[plr.spritenum]); } if (isWh2()) k = (krand() % 5) + 5; @@ -736,21 +736,21 @@ void attack(PLAYER& plr, int i) { case FREDTYPE: /* Sounds for Fred (currently copied from Goblin) */ - playsound_loc(S_GENSWING, sprite[i].x, sprite[i].y); + spritesound(S_GENSWING, &sprite[i]); if (rand() % 10 > 4) - playsound_loc(S_SWORD1 + (rand() % 6), sprite[i].x, sprite[i].y); + spritesound(S_SWORD1 + (rand() % 6), &sprite[i]); k >>= 3; break; case IMPTYPE: if (!isWh2()) break; - playsound_loc(S_RIP1 + (krand() % 3), sprite[i].x, sprite[i].y); + spritesound(S_RIP1 + (krand() % 3), &sprite[i]); if ((krand() % 2) != 0) { - playsound_loc(S_GORE1 + (krand() % 4), sprite[i].x, sprite[i].y); + spritesound(S_GORE1 + (krand() % 4), &sprite[i]); } if ((krand() % 2) != 0) { - playsound_loc(S_BREATH1 + (krand() % 6), sprite[i].x, sprite[i].y); + spritesound(S_BREATH1 + (krand() % 6), &sprite[i]); } k = (krand() % 5) + 5; @@ -762,51 +762,51 @@ void attack(PLAYER& plr, int i) { if (isWh2()) break; - playsound_loc(S_GENSWING, sprite[i].x, sprite[i].y); + spritesound(S_GENSWING, &sprite[i]); if ((krand() % 10) > 4) - playsound_loc(S_SWORD1 + (krand() % 6), sprite[i].x, sprite[i].y); + spritesound(S_SWORD1 + (krand() % 6), &sprite[i]); k >>= 2; break; case NEWGUYTYPE: if (sprite[i].picnum == NEWGUYMACE) { // damage 5 - 20 - playsound_loc(S_PLRWEAPON2, sprite[i].x, sprite[i].y); + spritesound(S_PLRWEAPON2, &sprite[i]); if (krand() % 10 > 4) { - playsound_loc(S_KOBOLDHIT, plr.x, plr.y); - playsound_loc(S_BREATH1 + (krand() % 6), plr.x, plr.y); + spritesound(S_KOBOLDHIT, &sprite[plr.spritenum]); + spritesound(S_BREATH1 + (krand() % 6), &sprite[plr.spritenum]); } k = (krand() % 15) + 5; break; } case KURTTYPE: case GONZOTYPE: - playsound_loc(S_GENSWING, sprite[i].x, sprite[i].y); + spritesound(S_GENSWING, &sprite[i]); if (sprite[i].picnum == GONZOCSWAT || sprite[i].picnum == GONZOGSWAT) { // damage 5 - 15 if (krand() % 10 > 6) - playsound_loc(S_SWORD1 + (krand() % 6), sprite[i].x, sprite[i].y); + spritesound(S_SWORD1 + (krand() % 6), &sprite[i]); k = (krand() % 15) + 5; } else if (sprite[i].picnum == GONZOGHMAT) { // damage 5 - 15 if (krand() % 10 > 6) - playsound_loc(S_SWORD1 + (krand() % 6), sprite[i].x, sprite[i].y); + spritesound(S_SWORD1 + (krand() % 6), &sprite[i]); k = (krand() % 10) + 5; } else if (sprite[i].picnum == GONZOGSHAT) { // damage 5 - 20 if (krand() % 10 > 3) - playsound_loc(S_SWORD1 + (krand() % 6), sprite[i].x, sprite[i].y); + spritesound(S_SWORD1 + (krand() % 6), &sprite[i]); k = (krand() % 15) + 5; } else if (sprite[i].picnum == KURTAT) { // damage 5 - 15 - playsound_loc(S_GENSWING, sprite[i].x, sprite[i].y); + spritesound(S_GENSWING, &sprite[i]); if (krand() % 10 > 3) { - playsound_loc(S_SWORD1 + (krand() % 6), sprite[i].x, sprite[i].y); + spritesound(S_SWORD1 + (krand() % 6), &sprite[i]); } k = (krand() % 10) + 5; } else { - playsound_loc(S_GENSWING, sprite[i].x, sprite[i].y); + spritesound(S_GENSWING, &sprite[i]); if (krand() % 10 > 4) { - playsound_loc(S_SOCK1 + (krand() % 4), plr.x, plr.y); - playsound_loc(S_BREATH1 + (krand() % 6), plr.x, plr.y); + spritesound(S_SOCK1 + (krand() % 4), &sprite[plr.spritenum]); + spritesound(S_BREATH1 + (krand() % 6), &sprite[plr.spritenum]); } k = (krand() % 4) + 1; } @@ -826,15 +826,15 @@ void attack(PLAYER& plr, int i) { if (sprite[i].shade > 30) k >>= 1; } - playsound_loc(S_GENSWING, sprite[i].x, sprite[i].y); + spritesound(S_GENSWING, &sprite[i]); if ((krand() % 10) > 3) - playsound_loc(S_SWORD1 + (krand() % 6), sprite[i].x, sprite[i].y); + spritesound(S_SWORD1 + (krand() % 6), &sprite[i]); break; case MINOTAURTYPE: - playsound_loc(S_GENSWING, sprite[i].x, sprite[i].y); + spritesound(S_GENSWING, &sprite[i]); if (krand() % 10 > 4) - playsound_loc(S_SWORD1 + (krand() % 6), sprite[i].x, sprite[i].y); + spritesound(S_SWORD1 + (krand() % 6), &sprite[i]); if (isWh2()) k = (krand() % 25) + 5; break; diff --git a/source/games/whaven/src/aidevil.cpp b/source/games/whaven/src/aidevil.cpp index b57ff7f35..210ca6e33 100644 --- a/source/games/whaven/src/aidevil.cpp +++ b/source/games/whaven/src/aidevil.cpp @@ -244,7 +244,7 @@ static void cast(PLAYER& plr, short i) { if (spr.picnum == DEVILATTACK + 2) { spr.picnum = DEVIL; - playsound_loc(S_FIREBALL, sprite[i].x, sprite[i].y); + spritesound(S_FIREBALL, &sprite[i]); castspell(plr, i); newstatus(i, CHASE); } diff --git a/source/games/whaven/src/aidragon.cpp b/source/games/whaven/src/aidragon.cpp index c429f9587..7a87caeba 100644 --- a/source/games/whaven/src/aidragon.cpp +++ b/source/games/whaven/src/aidragon.cpp @@ -132,27 +132,27 @@ static void cast(PLAYER& plr, short i) { case DRAGONATTACK + 17: case DRAGONATTACK + 4: if ((krand() % 2) != 0) - playsound_loc(S_FLAME1, spr.x, spr.y); + spritesound(S_FLAME1, &spr); else - playsound_loc(S_FIREBALL, spr.x, spr.y); + spritesound(S_FIREBALL, &spr); firebreath(plr, i, 1, 2, LOW); break; case DRAGONATTACK + 18: case DRAGONATTACK + 5: if ((krand() % 2) != 0) - playsound_loc(S_FLAME1, spr.x, spr.y); + spritesound(S_FLAME1, &spr); else - playsound_loc(S_FIREBALL, spr.x, spr.y); + spritesound(S_FIREBALL, &spr); firebreath(plr, i, 2, 1, LOW); break; case DRAGONATTACK + 19: case DRAGONATTACK + 6: if ((krand() % 2) != 0) - playsound_loc(S_FLAME1, spr.x, spr.y); + spritesound(S_FLAME1, &spr); else - playsound_loc(S_FIREBALL, spr.x, spr.y); + spritesound(S_FIREBALL, &spr); firebreath(plr, i, 4, 0, LOW); break; @@ -167,9 +167,9 @@ static void cast(PLAYER& plr, short i) { case DRAGONATTACK2 + 2: if ((krand() % 2) != 0) - playsound_loc(S_FLAME1, spr.x, spr.y); + spritesound(S_FLAME1, &spr); else - playsound_loc(S_FIREBALL, spr.x, spr.y); + spritesound(S_FIREBALL, &spr); firebreath(plr, i, 1, -1, HIGH); break; diff --git a/source/games/whaven/src/aifatwitch.cpp b/source/games/whaven/src/aifatwitch.cpp index ed5f460e3..9b6788427 100644 --- a/source/games/whaven/src/aifatwitch.cpp +++ b/source/games/whaven/src/aifatwitch.cpp @@ -233,7 +233,7 @@ static void throwspank(PLAYER& plr, int i) { int j = insertsprite(sprite[i].sectnum, MISSILE); if (j == -1) return; - playsound_loc(S_WITCHTHROW, sprite[i].x, sprite[i].y); + spritesound(S_WITCHTHROW, &sprite[i]); sprite[j].x = sprite[i].x; sprite[j].y = sprite[i].y; diff --git a/source/games/whaven/src/aigoblin.cpp b/source/games/whaven/src/aigoblin.cpp index d3d3194be..a1068f334 100644 --- a/source/games/whaven/src/aigoblin.cpp +++ b/source/games/whaven/src/aigoblin.cpp @@ -198,7 +198,7 @@ static void stand(PLAYER& plr, short i) { switch (spr.picnum) { case GOBLINCHILL: spr.picnum = GOBLINSURPRISE; - playsound_loc(S_GOBPAIN1 + (krand() % 2), spr.x, spr.y); + spritesound(S_GOBPAIN1 + (krand() % 2), &spr); newstatus(i, CHILL); break; default: @@ -425,9 +425,9 @@ static void goblinWar(PLAYER& plr, short i) { // goblins are fighting // JSA_DEMO if (krand() % 10 > 6) - playsound_loc(S_GENSWING, spr.x, spr.y); + spritesound(S_GENSWING, &spr); if (krand() % 10 > 6) - playsound_loc(S_SWORD1 + (krand() % 6), spr.x, spr.y); + spritesound(S_SWORD1 + (krand() % 6), &spr); if (checkdist(plr, i)) addhealth(plr, -(krand() & 5)); diff --git a/source/games/whaven/src/aigonzo.cpp b/source/games/whaven/src/aigonzo.cpp index 6476cf708..d72e2a7ed 100644 --- a/source/games/whaven/src/aigonzo.cpp +++ b/source/games/whaven/src/aigonzo.cpp @@ -474,7 +474,7 @@ static void cast(PLAYER& plr, short i) { if (spr.picnum == GONZOCSWAT) { spr.extra--; - playsound_loc(S_GENTHROW, spr.x, spr.y); + spritesound(S_GENTHROW, &spr); gonzopike(i, plr); newstatus(i, CHASE); } diff --git a/source/games/whaven/src/aigron.cpp b/source/games/whaven/src/aigron.cpp index 3f6e35c1d..63bfab7ac 100644 --- a/source/games/whaven/src/aigron.cpp +++ b/source/games/whaven/src/aigron.cpp @@ -363,13 +363,13 @@ static void cast(PLAYER& plr, short i) { if (spr.lotag < 0) { if (spr.picnum == GRONHALATTACK) { spr.extra--; - playsound_loc(S_THROWPIKE, sprite[i].x, sprite[i].y); + spritesound(S_THROWPIKE, &sprite[i]); throwhalberd(i); newstatus(i, CHASE); } else if (spr.picnum == GRONMUATTACK) { spr.extra--; - playsound_loc(S_SPELL2, sprite[i].x, sprite[i].y); + spritesound(S_SPELL2, &sprite[i]); castspell(plr, i); newstatus(i, CHASE); } diff --git a/source/games/whaven/src/aiguardian.cpp b/source/games/whaven/src/aiguardian.cpp index 562191975..f8b731dd2 100644 --- a/source/games/whaven/src/aiguardian.cpp +++ b/source/games/whaven/src/aiguardian.cpp @@ -217,7 +217,7 @@ static void cast(PLAYER& plr, short i) { if (spr.picnum == GUARDIANATTACK + 6) { spr.picnum = GUARDIAN; - playsound_loc(S_FIREBALL, sprite[i].x, sprite[i].y); + spritesound(S_FIREBALL, &sprite[i]); castspell(plr, i); newstatus(i, CHASE); } diff --git a/source/games/whaven/src/aijudy.cpp b/source/games/whaven/src/aijudy.cpp index 667bf42b4..272972f9d 100644 --- a/source/games/whaven/src/aijudy.cpp +++ b/source/games/whaven/src/aijudy.cpp @@ -216,7 +216,7 @@ static void cast(PLAYER& plr, short i) { if (spr.picnum == JUDYATTACK1 + 3) { sprite[i].picnum = JUDYATTACK1; - playsound_loc(S_JUDY1 + krand() % 4, sprite[i].x, sprite[i].y); + spritesound(S_JUDY1 + krand() % 4, &sprite[i]); if (krand() % 100 > 70) { castspell(plr, i); } @@ -271,7 +271,7 @@ static void cast(PLAYER& plr, short i) { } else if (spr.picnum == JUDYATTACK2 + 8) { sprite[i].picnum = JUDYATTACK2; - playsound_loc(S_JUDY1 + krand() % 4, sprite[i].x, sprite[i].y); + spritesound(S_JUDY1 + krand() % 4, &sprite[i]); if (krand() % 100 > 50) skullycastspell(plr, i); else { diff --git a/source/games/whaven/src/aikatie.cpp b/source/games/whaven/src/aikatie.cpp index 8e419d3fc..7dd2d026b 100644 --- a/source/games/whaven/src/aikatie.cpp +++ b/source/games/whaven/src/aikatie.cpp @@ -208,7 +208,7 @@ static void cast(PLAYER& plr, short i) { } spr.picnum = KATIE; spr.extra--; - playsound_loc(S_FIREBALL, spr.x, spr.y); + spritesound(S_FIREBALL, &spr); newstatus(i, CHASE); } } @@ -224,7 +224,7 @@ static void cast(PLAYER& plr, short i) { } } spr.picnum = KATIE; - playsound_loc(S_FIREBALL, spr.x, spr.y); + spritesound(S_FIREBALL, &spr); newstatus(i, CHASE); spr.extra--; } @@ -232,7 +232,7 @@ static void cast(PLAYER& plr, short i) { if (spr.picnum == KATIEAT + 16) { spr.picnum = KATIE; - playsound_loc(S_FIREBALL, spr.x, spr.y); + spritesound(S_FIREBALL, &spr); castspell(plr, i); newstatus(i, CHASE); spr.extra++; diff --git a/source/games/whaven/src/aikobold.cpp b/source/games/whaven/src/aikobold.cpp index 48b984683..a7e262160 100644 --- a/source/games/whaven/src/aikobold.cpp +++ b/source/games/whaven/src/aikobold.cpp @@ -12,7 +12,7 @@ static void chase(PLAYER& plr, short i) { spr.lotag = 250; if ((krand() % 100) > 98) - playsound_loc(S_KSNARL1 + (krand() % 4), sprite[i].x, sprite[i].y); + spritesound(S_KSNARL1 + (krand() % 4), &sprite[i]); short osectnum = spr.sectnum; if (cansee(plr.x, plr.y, plr.z, plr.sector, spr.x, spr.y, spr.z - (tileHeight(spr.picnum) << 7), @@ -243,7 +243,7 @@ static void resurect(PLAYER& plr, short i) { static void search(PLAYER& plr, short i) { if ((krand() % 100) > 98) - playsound_loc(S_KSNARL1 + (krand() % 4), sprite[i].x, sprite[i].y); + spritesound(S_KSNARL1 + (krand() % 4), &sprite[i]); aisearch(plr, i, false); if (!checksector6(i)) checkexpl(plr, i); diff --git a/source/games/whaven/src/ainewguy.cpp b/source/games/whaven/src/ainewguy.cpp index a5e073343..c391ee8fe 100644 --- a/source/games/whaven/src/ainewguy.cpp +++ b/source/games/whaven/src/ainewguy.cpp @@ -327,14 +327,14 @@ static void cast(PLAYER& plr, short i) { if (spr.picnum == NEWGUYCAST + 2) { spr.extra--; spr.picnum = NEWGUY; - playsound_loc(S_WISP, sprite[i].x, sprite[i].y); + spritesound(S_WISP, &sprite[i]); skullycastspell(plr, i); newstatus(i, CHASE); } if (spr.picnum == NEWGUYBOW + 2) { spr.extra--; spr.picnum = NEWGUY; - playsound_loc(S_PLRWEAPON3, sprite[i].x, sprite[i].y); + spritesound(S_PLRWEAPON3, &sprite[i]); newguyarrow(i, plr); newstatus(i, CHASE); } diff --git a/source/games/whaven/src/aiskeleton.cpp b/source/games/whaven/src/aiskeleton.cpp index f3791693e..10384c071 100644 --- a/source/games/whaven/src/aiskeleton.cpp +++ b/source/games/whaven/src/aiskeleton.cpp @@ -187,7 +187,7 @@ static void stand(PLAYER& plr, short i) { if (spr.picnum == HANGMAN) { newstatus(i, CHILL); - playsound_loc(S_SKELSEE, spr.x, spr.y); + spritesound(S_SKELSEE, &spr); } else { if (plr.shadowtime > 0) { diff --git a/source/games/whaven/src/aiskully.cpp b/source/games/whaven/src/aiskully.cpp index 262cad170..fdd1520f5 100644 --- a/source/games/whaven/src/aiskully.cpp +++ b/source/games/whaven/src/aiskully.cpp @@ -203,7 +203,7 @@ static void cast(PLAYER& plr, short i) { if (spr.picnum == SKULLYATTACK + 2) { sprite[i].picnum = SKULLY; - playsound_loc(S_SKULLWITCH1 + krand() % 3, sprite[i].x, sprite[i].y); + spritesound(S_SKULLWITCH1 + krand() % 3, &sprite[i]); skullycastspell(plr, i); newstatus(i, CHASE); } diff --git a/source/games/whaven/src/aispider.cpp b/source/games/whaven/src/aispider.cpp index f0dddf75b..960e0427b 100644 --- a/source/games/whaven/src/aispider.cpp +++ b/source/games/whaven/src/aispider.cpp @@ -198,7 +198,7 @@ static void attack(PLAYER& plr, short i) { spr.ang = (short)checksight_ang; attack(plr, i); if (krand() % 100 > ((plr.lvl * 7) + 20)) { - playsound_loc(S_SPIDERBITE, sprite[i].x, sprite[i].y); + spritesound(S_SPIDERBITE, &sprite[i]); plr.poisoned = 1; plr.poisontime = 7200; showmessage("Poisoned", 360); diff --git a/source/games/whaven/src/aiwillow.cpp b/source/games/whaven/src/aiwillow.cpp index 96f584109..0fc93fb4f 100644 --- a/source/games/whaven/src/aiwillow.cpp +++ b/source/games/whaven/src/aiwillow.cpp @@ -256,7 +256,7 @@ static void willowDrain(PLAYER& plr, short i) { spr.lotag -= TICSPERFRAME; if (spr.lotag < 0) { - playsound_loc(S_FIREBALL, spr.x, spr.y); + spritesound(S_FIREBALL, &spr); int oldz = spr.z; spr.z += 6144; castspell(plr, i); diff --git a/source/games/whaven/src/items.cpp b/source/games/whaven/src/items.cpp index 9d0990d7c..f3596fb2b 100644 --- a/source/games/whaven/src/items.cpp +++ b/source/games/whaven/src/items.cpp @@ -85,7 +85,7 @@ void InitItems() { sprite[i].detail = 0; treasuresfound++; - playsound_loc(S_TREASURE1, sprite[i].x, sprite[i].y); + spritesound(S_TREASURE1, &sprite[i]); int j = krand() % 8; switch (j) { case 0: @@ -353,7 +353,7 @@ void InitItems() case 6: for (j = 0; j < 8; j++) explosion(i, sprite[i].x, sprite[i].y, sprite[i].z, sprite[i].owner); - playsound_loc(S_EXPLODE, sprite[i].x, sprite[i].y); + spritesound(S_EXPLODE, &sprite[i]); deletesprite(i); break; default: @@ -890,7 +890,7 @@ void InitItems() addhealth(plr, -((krand() % 20) + 5)); // Inflict pain // make it look and sound painful, too if ((krand() % 9) == 0) { - playsound_loc(S_PLRPAIN1 + (rand() % 2), sprite[i].x, sprite[i].y); + spritesound(S_PLRPAIN1 + (rand() % 2), &sprite[i]); } startredflash(10); deletesprite(i); @@ -1051,7 +1051,7 @@ void InitItems() { if (plr.manatime < 1 && plr.invincibletime <= 0 && !plr.godMode) { - playsound_loc(S_FIREBALL, sprite[i].x, sprite[i].y); + spritesound(S_FIREBALL, &sprite[i]); addhealth(plr, -1); startredflash(30); } diff --git a/source/games/whaven/src/potions.cpp b/source/games/whaven/src/potions.cpp index 78fcbece1..a24f1c894 100644 --- a/source/games/whaven/src/potions.cpp +++ b/source/games/whaven/src/potions.cpp @@ -90,10 +90,6 @@ void usapotion(PLAYER& plr) { SND_Sound(S_DRINK); plr.manatime=3200; startwhiteflash(10); - if( lavasnd != -1 ) { - stopsound(lavasnd); - lavasnd = -1; - } break; case 4: // invisi SND_Sound(S_DRINK); diff --git a/source/games/whaven/src/sndnames.h b/source/games/whaven/src/sndnames.h index bdcacc3d3..aea26301e 100644 --- a/source/games/whaven/src/sndnames.h +++ b/source/games/whaven/src/sndnames.h @@ -1,3 +1,4 @@ +#pragma once #include "ns.h" BEGIN_WH_NS diff --git a/source/games/whaven/src/sound.cpp b/source/games/whaven/src/sound.cpp index 41d59dd2c..4aef704f8 100644 --- a/source/games/whaven/src/sound.cpp +++ b/source/games/whaven/src/sound.cpp @@ -1,44 +1,77 @@ #include "ns.h" #include "wh.h" #include "raze_sound.h" +#include "g_input.h" BEGIN_WH_NS class WHSoundEngine : public SoundEngine { - // client specific parts of the sound engine go in this class. - void CalcPosVel(int type, const void* source, const float pt[3], int channum, int chanflags, FSoundID chanSound, FVector3* pos, FVector3* vel, FSoundChan *channel) override; - TArray ReadSound(int lumpnum) override; + // client specific parts of the sound engine go in this class. + void CalcPosVel(int type, const void* source, const float pt[3], int channum, int chanflags, FSoundID chanSound, FVector3* pos, FVector3* vel, FSoundChan* channel) override; + TArray ReadSound(int lumpnum) override; public: - WHSoundEngine() - { - S_Rolloff.RolloffType = ROLLOFF_Doom; - S_Rolloff.MinDistance = 170; // these are the numbers I got when uncrunching the original sound code. - S_Rolloff.MaxDistance = 850; - } - - void StopChannel(FSoundChan* chan) override - { - if (chan && chan->SysChannel != NULL && !(chan->ChanFlags & CHANF_EVICTED) && chan->SourceType == SOURCE_Actor) - { - chan->Source = NULL; - chan->SourceType = SOURCE_Unattached; - } - SoundEngine::StopChannel(chan); - } - - + WHSoundEngine() + { + S_Rolloff.RolloffType = ROLLOFF_Doom; + S_Rolloff.MinDistance = 93; + S_Rolloff.MaxDistance = 1064; // was originally 532, this is a bit low. + } + void StopChannel(FSoundChan* chan) override + { + if (chan && chan->SysChannel != NULL && !(chan->ChanFlags & CHANF_EVICTED) && chan->SourceType == SOURCE_Actor) + { + chan->Source = NULL; + chan->SourceType = SOURCE_Unattached; + } + SoundEngine::StopChannel(chan); + } }; + +int ambsoundarray[8]; + + void sfxInit(void) { - soundEngine = new WHSoundEngine; -} + soundEngine = new WHSoundEngine; -void sfxTerm() -{ + // These are not constants! + ambsoundarray[0] = 0; + ambsoundarray[1] = S_WINDLOOP1; + ambsoundarray[2] = S_WINDLOOP2; + ambsoundarray[3] = S_WAVELOOP1; + ambsoundarray[4] = S_LAVALOOP1; + ambsoundarray[5] = S_WATERY; + ambsoundarray[6] = S_STONELOOP1; + ambsoundarray[7] = S_BATSLOOP; + + soundEngine->AddSoundLump("", sfx_empty, 0, -1, 6); // Index 0 is unused + auto& sfx = soundEngine->GetSounds(); + + int count = 0; + for (int i = 0; i < 1024; i++) + { + FStringf check("JOESND/%04d", i); + int lump = fileSystem.FindFile(check); + if (lump > 0) + { + int index = soundEngine->AddSoundLump(check, lump, 0, -1, 6); + if (index == S_STONELOOP1) sfx[index].bSingular = true; + sfx[index].bLoadRAW = true; + sfx[index].b16bit = false; + sfx[index].RawRate = 11025; + soundEngine->CacheSound(&sfx[index]); + if (((++count) & 31) == 0) + I_GetEvent(); + } + else + soundEngine->AddSoundLump("", sfx_empty, 0, -1, 6); + + + } } //========================================================================== @@ -49,48 +82,79 @@ void sfxTerm() TArray WHSoundEngine::ReadSound(int lumpnum) { - auto wlump = fileSystem.OpenFileReader(lumpnum); - return wlump.Read(); + auto wlump = fileSystem.OpenFileReader(lumpnum); + return wlump.Read(); } -void WHSoundEngine::CalcPosVel(int type, const void* source, const float pt[3], int channum, int chanflags, FSoundID chanSound, FVector3* pos, FVector3* vel, FSoundChan *) +void WHSoundEngine::CalcPosVel(int type, const void* source, const float pt[3], int channum, int chanflags, FSoundID chanSound, FVector3* pos, FVector3* vel, FSoundChan*) { -#if 0 - if (pos != nullptr && type != SOURCE_None) - { - FVector3 camera; - - if (gMe && gMe->pSprite) camera = GetSoundPos(&gMe->pSprite->pos); - else camera = { 0, 0, 0 }; // don't crash if there is no player. + if (pos != nullptr && type != SOURCE_None) + { + vec3_t ppos = { player[pyrn].x, player[pyrn].y, player[pyrn].z }; + FVector3 camera = GetSoundPos(&ppos); - if (vel) vel->Zero(); + if (vel) vel->Zero(); - if (type == SOURCE_Unattached) - { - pos->X = pt[0]; - pos->Y = pt[1]; - pos->Z = pt[2]; - } - else if (type == SOURCE_Actor) - { - auto actor = (spritetype*)source; - assert(actor != nullptr); - size_t index = actor - sprite; - // Engine expects velocity in units per second, not units per tic. - if (vel) *vel = { xvel[index] * (30 / 65536.f), zvel[index] * (-30 / 65536.f), yvel[index] * (-30 / 65536.f) }; - *pos = GetSoundPos(&actor->pos); - } - else if (type == SOURCE_Ambient) - { - *pos = camera; // just to be safe. Ambient sounds are in the world but unpositioned - } - if ((chanflags & CHANF_LISTENERZ)) - { - pos->Y = camera.Y; - } - } -#endif + if (type == SOURCE_Unattached) + { + pos->X = pt[0]; + pos->Y = pt[1]; + pos->Z = pt[2]; + } + else if (type == SOURCE_Actor) + { + auto actor = (spritetype*)source; + assert(actor != nullptr); + size_t index = actor - sprite; + if (vel) *vel = { 0, 0, 0 }; // this game has no velocity management usable here. + *pos = GetSoundPos(&actor->pos); + } + else if (type == SOURCE_Ambient) + { + *pos = camera; // just to be safe. Ambient sounds are in the world but unpositioned + } + if ((chanflags & CHANF_LISTENERZ)) + { + pos->Y = camera.Y; + } + } } +void updatesounds() +{ + // Handle timed loops. + soundEngine->EnumerateChannels([](FSoundChan* channel) + { + if (channel->UserData > 0) + { + channel->UserData -= (IntToFixed(TICSPERFRAME) / 360); + if (channel->UserData < 0) + { + soundEngine->StopChannel(channel); + } + } + return false; + }); + soundEngine->UpdateSounds(I_GetTime()); +} + + +int playsound_internal(int sn, spritetype *spr, int x, int y, int loop, int chan) +{ + sn++; + if (!soundEngine->isValidSoundId(sn)) return -1; + int sourcetype = spr ? SOURCE_Actor : x != 0 || y != 0 ? SOURCE_Unattached : SOURCE_None; + vec3_t pos = { x, y, 0 }; + auto spos = GetSoundPos(&pos); + float attn = sourcetype == SOURCE_None ? 0 : 1; + int flags = sourcetype == SOURCE_Unattached ? CHANF_LISTENERZ : CHANF_NONE; + if (loop != 0) flags |= CHANF_LOOP; + auto sfx = soundEngine->StartSound(sourcetype, spr, &spos, chan, EChanFlags::FromInt(flags), sn, 1.f, attn); + if (loop > 0 && sfx) sfx->UserData = IntToFixed(loop); + else sfx->UserData = 0; + return sfx ? 0 : -1; +} + + END_WH_NS \ No newline at end of file diff --git a/source/games/whaven/src/spellbooks.cpp b/source/games/whaven/src/spellbooks.cpp index 8e5783caa..2a871a724 100644 --- a/source/games/whaven/src/spellbooks.cpp +++ b/source/games/whaven/src/spellbooks.cpp @@ -51,7 +51,7 @@ void castaorb(PLAYER& plr) { switch (plr.currentorb) { case 0: // SCARE if (isWh2()) - playsound_loc(S_GENERALMAGIC4, plr.x, plr.y); + spritesound(S_GENERALMAGIC4, &sprite[plr.spritenum]); plr.shadowtime = ((plr.lvl + 1) * 120) << 2; break; case 1: // NIGHTVISION @@ -59,16 +59,16 @@ void castaorb(PLAYER& plr) { break; case 2: // FREEZE if (isWh2()) - playsound_loc(S_GENERALMAGIC3, plr.x, plr.y); + spritesound(S_GENERALMAGIC3, &sprite[plr.spritenum]); else - playsound_loc(S_SPELL1, plr.x, plr.y); + spritesound(S_SPELL1, &sprite[plr.spritenum]); daang = plr.ang; shootgun(plr, daang, 6); break; case 3: // MAGIC ARROW if (isWh2()) { lockon(plr,10,2); - playsound_loc(S_GENERALMAGIC2, plr.x, plr.y); + spritesound(S_GENERALMAGIC2, &sprite[plr.spritenum]); } else { daang = BClampAngle(plr.ang - 36); @@ -76,42 +76,42 @@ void castaorb(PLAYER& plr) { daang = BClampAngle(daang + (k << 1)); shootgun(plr, daang, 2); } - playsound_loc(S_SPELL1, plr.x, plr.y); + spritesound(S_SPELL1, &sprite[plr.spritenum]); } break; case 4: // OPEN DOORS daang = plr.ang; shootgun(plr, daang, 7); if (isWh2()) - playsound_loc(S_DOORSPELL, plr.x, plr.y); + spritesound(S_DOORSPELL, &sprite[plr.spritenum]); else - playsound_loc(S_SPELL1, plr.x, plr.y); + spritesound(S_SPELL1, &sprite[plr.spritenum]); break; case 5: // FLY plr.orbactive[plr.currentorb] = 3600 + (plr.lvl * 120); if (isWh2()) - playsound_loc(S_GENERALMAGIC1, plr.x, plr.y); + spritesound(S_GENERALMAGIC1, &sprite[plr.spritenum]); else - playsound_loc(S_SPELL1, plr.x, plr.y); + spritesound(S_SPELL1, &sprite[plr.spritenum]); break; case 6: // FIREBALL if (isWh2()) { lockon(plr,3,3); - playsound_loc(S_FIRESPELL, plr.x, plr.y); + spritesound(S_FIRESPELL, &sprite[plr.spritenum]); } else { daang = plr.ang; shootgun(plr, daang, 3); - playsound_loc(S_SPELL1, plr.x, plr.y); + spritesound(S_SPELL1, &sprite[plr.spritenum]); } break; case 7: // NUKE daang = plr.ang; shootgun(plr, daang, 4); if (isWh2()) - playsound_loc(S_NUKESPELL, plr.x, plr.y); + spritesound(S_NUKESPELL, &sprite[plr.spritenum]); else - playsound_loc(S_SPELL1, plr.x, plr.y); + spritesound(S_SPELL1, &sprite[plr.spritenum]); break; } } diff --git a/source/games/whaven/src/weapons.cpp b/source/games/whaven/src/weapons.cpp index e2c608bd9..05b71d2c0 100644 --- a/source/games/whaven/src/weapons.cpp +++ b/source/games/whaven/src/weapons.cpp @@ -15,7 +15,6 @@ boolean droptheshield = false; int dahand = 0; int weapondrop; int snakex, snakey; -int enchantedsoundhandle = -1; boolean checkmedusadist(int i, int x, int y, int z, int lvl) { int attackdist = (isWh2() ? 8192 : 1024) + (lvl << 9); @@ -27,6 +26,12 @@ boolean checkmedusadist(int i, int x, int y, int z, int lvl) { return false; } +static void playEnchantedSound(int sndnum) +{ + if (soundEngine->GetSoundPlayingInfo(SOURCE_Any, nullptr, 0, CHAN_ENCHANTED) == 0) + playsound(sndnum, 0, 0, -1, CHAN_ENCHANTED); +} + void autoweaponchange(PLAYER& plr, int dagun) { if (plr.currweaponanim > 0 || dagun == plr.selectedgun || plr.currweaponflip > 0) return; @@ -35,10 +40,7 @@ void autoweaponchange(PLAYER& plr, int dagun) { plr.hasshot = 0; plr.currweaponfired = 2; // drop weapon - if (enchantedsoundhandle != -1) { - SND_StopLoop(enchantedsoundhandle); - enchantedsoundhandle=-1; - } + soundEngine->StopSound(CHAN_ENCHANTED); switch (plr.selectedgun) { case 0: weapondropgoal = 40; @@ -48,15 +50,15 @@ void autoweaponchange(PLAYER& plr, int dagun) { weapondrop = 0; break; case 2: - if (enchantedsoundhandle == -1 && plr.weapon[plr.selectedgun] == 3) { - enchantedsoundhandle = playsound(S_FIREWEAPONLOOP, 0, 0, -1); + if (plr.weapon[plr.selectedgun] == 3) { + playEnchantedSound(S_FIREWEAPONLOOP); } weapondropgoal = (isWh2() ? 40 : 100); weapondrop = 0; break; case 3: - if (enchantedsoundhandle == -1 && plr.weapon[plr.selectedgun] == 3) { - enchantedsoundhandle = playsound(S_ENERGYWEAPONLOOP, 0, 0, -1); + if (plr.weapon[plr.selectedgun] == 3) { + playEnchantedSound(S_ENERGYWEAPONLOOP); } weapondropgoal = 100; weapondrop = 0; @@ -66,15 +68,15 @@ void autoweaponchange(PLAYER& plr, int dagun) { weapondrop = 0; break; case 5: - if (enchantedsoundhandle == -1 && plr.weapon[plr.selectedgun] == 3) { - enchantedsoundhandle = playsound(S_ENERGYWEAPONLOOP, 0, 0, -1); + if (plr.weapon[plr.selectedgun] == 3) { + playEnchantedSound(S_ENERGYWEAPONLOOP); } weapondropgoal = 40; weapondrop = 0; break; case 6: - if (enchantedsoundhandle == -1 && plr.weapon[plr.selectedgun] == 3) { - enchantedsoundhandle = playsound(S_FIREWEAPONLOOP, 0, 0, -1); + if (plr.weapon[plr.selectedgun] == 3) { + playEnchantedSound(S_FIREWEAPONLOOP); } weapondropgoal = 40; weapondrop = 0; @@ -82,8 +84,8 @@ void autoweaponchange(PLAYER& plr, int dagun) { plr.ammo[6] = 0; break; case 7: - if (enchantedsoundhandle == -1 && plr.weapon[plr.selectedgun] == 3) { - enchantedsoundhandle = playsound(S_ENERGYWEAPONLOOP, 0, 0, -1); + if (plr.weapon[plr.selectedgun] == 3) { + playEnchantedSound(S_ENERGYWEAPONLOOP); } weapondropgoal = 40; weapondrop = 0; @@ -93,8 +95,8 @@ void autoweaponchange(PLAYER& plr, int dagun) { } break; case 8: -// if (enchantedsoundhandle == -1 && plr.weapon[plr.selectedgun] == 3) { -// enchantedsoundhandle = playsound(S_FIREWEAPONLOOP, 0, 0, -1); +// if (plr.weapon[plr.selectedgun] == 3) { +// playEnchantedSound(S_FIREWEAPONLOOP); // } weapondropgoal = 40; weapondrop = 0; @@ -131,10 +133,7 @@ void weaponchange(int snum) { int gun = key; if (plr.weapon[gun] > 0) { if (plr.currweaponanim <= 0 && gun != plr.selectedgun && plr.currweaponflip <= 0) { - if (enchantedsoundhandle != -1) { - SND_StopLoop(enchantedsoundhandle); - enchantedsoundhandle = -1; - } + soundEngine->StopSound(CHAN_ENCHANTED); } autoweaponchange(plr, gun); @@ -173,10 +172,7 @@ void plrfireweapon(PLAYER& plr) { if (plr.ammo[plr.selectedgun] == 0) { plr.weapon[plr.selectedgun] = plr.preenchantedweapon[plr.selectedgun]; plr.ammo[plr.selectedgun] = plr.preenchantedammo[plr.selectedgun]; - if (enchantedsoundhandle != -1) { - SND_StopLoop(enchantedsoundhandle); - enchantedsoundhandle = -1; - } + soundEngine->StopSound(CHAN_ENCHANTED); } } @@ -331,23 +327,14 @@ void weaponsprocess(int snum) { if (plr.shadowtime <= 0) { if (plr.weapon[plr.currweapon] == 3) { - if (enchantedsoundhandle == -1 && plr.weapon[plr.selectedgun] == 3) { + if (plr.weapon[plr.selectedgun] == 3) { switch (plr.selectedgun) { case 2: - enchantedsoundhandle = playsound(S_FIREWEAPONLOOP, 0, 0, -1); - break; - case 3: - case 5: - enchantedsoundhandle = playsound(S_ENERGYWEAPONLOOP, 0, 0, -1); - break; case 6: - enchantedsoundhandle = playsound(S_FIREWEAPONLOOP, 0, 0, -1); + playEnchantedSound(S_FIREWEAPONLOOP); break; - case 7: - enchantedsoundhandle = playsound(S_ENERGYWEAPONLOOP, 0, 0, -1); - break; - case 8: - enchantedsoundhandle = playsound(S_ENERGYWEAPONLOOP, 0, 0, -1); + default: + playEnchantedSound(S_ENERGYWEAPONLOOP); break; } } @@ -1292,8 +1279,7 @@ void shootgun(PLAYER& plr, float ang, int guntype) { if (sprite[pHitInfo.hitsprite].picnum == SKELETON || sprite[pHitInfo.hitsprite].picnum == SKELETONATTACK || sprite[pHitInfo.hitsprite].picnum == SKELETONDIE) - playsound_loc(S_SKELHIT1 + (krand() % 2), sprite[pHitInfo.hitsprite].x, - sprite[pHitInfo.hitsprite].y); + spritesound(S_SKELHIT1 + (krand() % 2), &sprite[pHitInfo.hitsprite]); } // HERE @@ -1499,8 +1485,7 @@ void shootgun(PLAYER& plr, float ang, int guntype) { if (sprite[pHitInfo.hitsprite].picnum == SKELETON || sprite[pHitInfo.hitsprite].picnum == SKELETONATTACK || sprite[pHitInfo.hitsprite].picnum == SKELETONDIE) - playsound_loc(S_SKELHIT1 + (krand() % 2), sprite[pHitInfo.hitsprite].x, - sprite[pHitInfo.hitsprite].y); + spritesound(S_SKELHIT1 + (krand() % 2), &sprite[pHitInfo.hitsprite]); } // HERE switch (plr.currweapon) { @@ -1620,8 +1605,7 @@ void shootgun(PLAYER& plr, float ang, int guntype) { if (sprite[pHitInfo.hitsprite].picnum == SKELETON || sprite[pHitInfo.hitsprite].picnum == SKELETONATTACK || sprite[pHitInfo.hitsprite].picnum == SKELETONDIE) - playsound_loc(S_SKELHIT1 + (krand() % 2), sprite[pHitInfo.hitsprite].x, - sprite[pHitInfo.hitsprite].y); + spritesound(S_SKELHIT1 + (krand() % 2), &sprite[pHitInfo.hitsprite]); } newstatus(pHitInfo.hitsprite, DIE); } @@ -1651,7 +1635,7 @@ void shootgun(PLAYER& plr, float ang, int guntype) { if (sprite[pHitInfo.hitsprite].pal == 6) { // JSA_NEW SND_Sound(S_SOCK1 + (krand() % 4)); - playsound_loc(S_FREEZEDIE, pHitInfo.hitx, pHitInfo.hity); + playsound(S_FREEZEDIE, pHitInfo.hitx, pHitInfo.hity); for (k = 0; k < 32; k++) icecubes(pHitInfo.hitsprite, pHitInfo.hitx, pHitInfo.hity, pHitInfo.hitz, pHitInfo.hitsprite); @@ -1728,7 +1712,7 @@ void shootgun(PLAYER& plr, float ang, int guntype) { sprite[j].owner = sprite[plr.spritenum].owner; sprite[j].lotag = 32; sprite[j].hitag = 0; - playsound_loc(S_ARROWHIT, sprite[j].x, sprite[j].y); + spritesound(S_ARROWHIT, &sprite[j]); if (isWh2() && plr.weapon[6] == 3 && plr.currweapon == 6) { j = insertsprite(pHitInfo.hitsect, FIRECHUNK); @@ -1843,7 +1827,7 @@ void shootgun(PLAYER& plr, float ang, int guntype) { if (sprite[pHitInfo.hitsprite].pal == 6) { // JSA_NEW SND_Sound(S_SOCK1 + (krand() % 4)); - playsound_loc(S_FREEZEDIE, pHitInfo.hitx, pHitInfo.hity); + playsound(S_FREEZEDIE, pHitInfo.hitx, pHitInfo.hity); for (k = 0; k < 32; k++) icecubes(pHitInfo.hitsprite, pHitInfo.hitx, pHitInfo.hity, pHitInfo.hitz, pHitInfo.hitsprite); @@ -2308,7 +2292,7 @@ void swingdaweapon(PLAYER& plr) { // || plr.currweaponframe == PIKEATTACK2+4 && plr.weapon[7] == 2 && plr.ammo[7] > 0) { shootgun(plr, daang, 10); - playsound_loc(S_THROWPIKE, plr.x, plr.y); + spritesound(S_THROWPIKE, &sprite[plr.spritenum]); plr.hasshot = 1; return; } @@ -2333,12 +2317,12 @@ void swingdaweapon(PLAYER& plr) { if (plr.currweaponframe == PIKEATTACK1 + 4 && plr.weapon[7] == 2 && plr.ammo[7] > 0) { shootgun(plr, daang, 10); - playsound_loc(S_GENTHROW, plr.x, plr.y); + spritesound(S_GENTHROW, &sprite[plr.spritenum]); plr.hasshot = 1; return; } else if (plr.currweaponframe == ZPIKEATTACK + 4 && plr.weapon[7] == 3 && plr.ammo[7] > 0) { lockon(plr, 3, 10); - playsound_loc(S_GENTHROW, plr.x, plr.y); + spritesound(S_GENTHROW, &sprite[plr.spritenum]); plr.hasshot = 1; return; } @@ -2370,15 +2354,15 @@ void swingdaweapon(PLAYER& plr) { plr.hasshot = 1; break; case 5: // battleaxe - if (isWh2() && enchantedsoundhandle != -1) { - SND_Sound(S_ENERGYSWING); - } + if (isWh2() && soundEngine->GetSoundPlayingInfo(SOURCE_Any, nullptr, 0, CHAN_ENCHANTED) != 0) + SND_Sound(S_ENERGYSWING); shootgun(plr, daang, 0); plr.hasshot = 1; break; case 6: // bow - if (isWh2() && enchantedsoundhandle != -1) { + if (isWh2() && soundEngine->GetSoundPlayingInfo(SOURCE_Any, nullptr, 0, CHAN_ENCHANTED) != 0) + { SND_Sound(S_FIREBALL); SND_Sound(S_PLRWEAPON3); } @@ -2404,44 +2388,44 @@ void swingdacrunch(PLAYER& plr, int daweapon) { switch (daweapon) { case 0: // fist - playsound_loc(S_SOCK1 + (krand() % 4), plr.x, plr.y); + spritesound(S_SOCK1 + (krand() % 4), &sprite[plr.spritenum]); break; case 1: // dagger if ((krand() % 2) != 0) - playsound_loc(S_GORE1 + (krand() % 4), plr.x, plr.y); + spritesound(S_GORE1 + (krand() % 4), &sprite[plr.spritenum]); break; case 2: // short sword - playsound_loc(S_SWORD2 + (krand() % 3), plr.x, plr.y); + spritesound(S_SWORD2 + (krand() % 3), &sprite[plr.spritenum]); break; case 3: // morningstar - playsound_loc(S_SOCK1 + (krand() % 4), plr.x, plr.y); + spritesound(S_SOCK1 + (krand() % 4), &sprite[plr.spritenum]); break; case 4: // broad sword - playsound_loc(S_SWORD1 + (krand() % 3), plr.x, plr.y); + spritesound(S_SWORD1 + (krand() % 3), &sprite[plr.spritenum]); break; case 5: // battle axe if ((krand() % 2) != 0) - playsound_loc(S_SOCK1 + (krand() % 4), plr.x, plr.y); + spritesound(S_SOCK1 + (krand() % 4), &sprite[plr.spritenum]); else - playsound_loc(S_SWORD1 + (krand() % 3), plr.x, plr.y); + spritesound(S_SWORD1 + (krand() % 3), &sprite[plr.spritenum]); break; case 6: // bow break; case 7: // pike if ((krand() % 2) != 0) - playsound_loc(S_SOCK1 + (krand() % 4), plr.x, plr.y); + spritesound(S_SOCK1 + (krand() % 4), &sprite[plr.spritenum]); else - playsound_loc(S_SWORD1 + (krand() % 3), plr.x, plr.y); + spritesound(S_SWORD1 + (krand() % 3), &sprite[plr.spritenum]); break; case 8: // two handed sword - playsound_loc(S_SWORD1 + (krand() % 2), plr.x, plr.y); + spritesound(S_SWORD1 + (krand() % 2), &sprite[plr.spritenum]); break; case 9: // halberd if ((krand() % 2) != 0) - playsound_loc(S_SOCK1 + (krand() % 4), plr.x, plr.y); + spritesound(S_SOCK1 + (krand() % 4), &sprite[plr.spritenum]); else - playsound_loc(S_SWORD1 + (krand() % 3), plr.x, plr.y); + spritesound(S_SWORD1 + (krand() % 3), &sprite[plr.spritenum]); break; } } diff --git a/source/games/whaven/src/wh.cpp b/source/games/whaven/src/wh.cpp index 6f3c589ae..ca1cc77b3 100644 --- a/source/games/whaven/src/wh.cpp +++ b/source/games/whaven/src/wh.cpp @@ -4,7 +4,7 @@ BEGIN_WH_NS // Placeholders that will go away. -int attacktheme, lavasnd, cartsnd, batsnd; +int attacktheme; int killcnt, kills; int expgained; diff --git a/source/games/whaven/src/wh.h b/source/games/whaven/src/wh.h index ba542aa6f..c1565dfab 100644 --- a/source/games/whaven/src/wh.h +++ b/source/games/whaven/src/wh.h @@ -24,6 +24,7 @@ END_WH_NS #include "gamecontrol.h" #include "d_net.h" #include "screenjob.h" +#include "raze_sound.h" BEGIN_WH_NS @@ -294,7 +295,6 @@ extern boolean droptheshield; extern int dahand; extern int weapondrop; extern int snakex, snakey; -extern int enchantedsoundhandle; boolean checkmedusadist(int i, int x, int y, int z, int lvl); void autoweaponchange(PLAYER& plr, int dagun); @@ -420,7 +420,29 @@ inline int BClampAngle(int a) // placeholders -extern int lavasnd, cartsnd, batsnd; +// This is for the 3 sounds that get explicitly checked outside the sound code. +enum +{ + CHAN_ENCHANTED = 100, + CHAN_CART, + CHAN_BAT, + CHAN_AMBIENT1, + CHAN_AMBIENT2, + CHAN_AMBIENT3, + CHAN_AMBIENT4, + CHAN_AMBIENT5, + CHAN_AMBIENT6, + CHAN_AMBIENT7, + CHAN_AMBIENT8, +}; + +enum +{ + MAX_AMB_SOUNDS = 8, +}; + +extern int ambsoundarray[8]; + inline void startredflash(int) {} inline void startwhiteflash(int) @@ -430,24 +452,21 @@ inline void startgreenflash(int) inline void startblueflash(int) {} + +int playsound_internal(int sn, spritetype* spr, int x, int y, int loop, int chan); + +inline int playsound(int sn, int x, int y, int loop = 0, int channel = CHAN_AUTO) { + return playsound_internal(sn, nullptr, x, y, loop, channel); +} + inline int SND_Sound(int sn) { - return 0; + return playsound(sn, 0, 0); } -inline int playsound_loc(int sn, int x, int y) { - return 0; +inline int spritesound(int sn, spritetype *s, int loop = 0, int channel = CHAN_AUTO) { + return playsound_internal(sn, s, 0, 0, loop, channel); } -inline int playsound(int sn, int x, int y, int loop) { - return 0; -} -inline void stopsound(int snd) -{} -inline void SND_StopLoop(int) -{} -inline void SND_CheckLoops() -{} - void startmusic(int); void startsong(int); void setupmidi(); diff --git a/source/games/whaven/src/whani.cpp b/source/games/whaven/src/whani.cpp index b0cfce8d4..0ac75b5dd 100644 --- a/source/games/whaven/src/whani.cpp +++ b/source/games/whaven/src/whani.cpp @@ -439,9 +439,8 @@ void animateobjs(PLAYER& plr) { break; case 2: // fly to roof and get deleted if (sprite[i].lotag < 0) { - if (i == lastbat && batsnd != -1) { - stopsound(batsnd); - batsnd = -1; + if (i == lastbat) { + soundEngine->StopSound(CHAN_BAT); } deletesprite((short) i); continue; @@ -451,9 +450,8 @@ void animateobjs(PLAYER& plr) { (((int) sintable[sprite[i].ang & 2047]) * TICSPERFRAME) << 3, 0, 4 << 8, 4 << 8, 0); setsprite(i, sprite[i].x, sprite[i].y, sprite[i].z); if ((movestat & 0xc000) == 16384) {// Hits a ceiling / floor - if (i == lastbat && batsnd != -1) { - stopsound(batsnd); - batsnd = -1; + if (i == lastbat) { + soundEngine->StopSound(CHAN_BAT); } deletesprite((short) i); continue; @@ -508,9 +506,8 @@ void animateobjs(PLAYER& plr) { sprite[i].z -= (TICSPERFRAME << 6); setsprite(i, sprite[i].x, sprite[i].y, sprite[i].z); if (sprite[i].z <= sector[sprite[i].sectnum].ceilingz + 32768) { - stopsound(cartsnd); - cartsnd = -1; - playsound_loc(S_CLUNK, sprite[i].x, sprite[i].y); + soundEngine->StopSound(CHAN_CART); + spritesound(S_CLUNK, &sprite[i]); changespritestat(i, (short) 0); sprite[i].lotag = 1820; sprite[i].z = sector[sprite[i].sectnum].ceilingz + 32768; @@ -551,9 +548,8 @@ void animateobjs(PLAYER& plr) { sprite[i].z += ironbarmove; setsprite(i, sprite[i].x, sprite[i].y, sprite[i].z); if (sprite[i].z >= (sector[sprite[i].sectnum].floorz - 32768)) { - stopsound(cartsnd); - cartsnd = -1; - playsound_loc(S_CLUNK, sprite[i].x, sprite[i].y); + soundEngine->StopSound(CHAN_CART); + spritesound(S_CLUNK, &sprite[i]); changespritestat(i, (short) 0); sprite[i].lotag = 1821; sprite[i].z = sector[sprite[i].sectnum].floorz - 32768; @@ -1168,7 +1164,7 @@ void animateobjs(PLAYER& plr) { if (cansee(plr.x, plr.y, plr.z, plr.sector, sprite[i].x, sprite[i].y, sprite[i].z - (tileHeight(sprite[i].picnum) << 7), sprite[i].sectnum)) { // JSA_NEW - playsound_loc(S_FIREBALL, sprite[i].x, sprite[i].y); + spritesound(S_FIREBALL, &sprite[i]); castspell(plr, i); } } diff --git a/source/games/whaven/src/whfx.cpp b/source/games/whaven/src/whfx.cpp index 2720aae61..25cceacf2 100644 --- a/source/games/whaven/src/whfx.cpp +++ b/source/games/whaven/src/whfx.cpp @@ -438,7 +438,7 @@ void teleporter() { warpfxsprite(plr.spritenum); plr.ang = (int) daang; justwarpedfx = 48; - playsound_loc(S_WARP, plr.x, plr.y); + spritesound(S_WARP, &sprite[plr.spritenum]); setsprite(plr.spritenum, plr.x, plr.y, plr.z + (32 << 8)); } } @@ -464,13 +464,13 @@ void teleporter() { } mapon++; - playsound_loc(S_CHAINDOOR1, plr.x, plr.y); + spritesound(S_CHAINDOOR1, &sprite[plr.spritenum]); playertorch = 0; - playsound_loc(S_WARP, plr.x, plr.y); + spritesound(S_WARP, &sprite[plr.spritenum]); loadnewlevel(mapon); break; case 2: // ENDOFDEMO - playsound_loc(S_THUNDER1, plr.x, plr.y); + spritesound(S_THUNDER1, &sprite[plr.spritenum]); justteleported = true; showVictoryScreen(); break; @@ -596,30 +596,29 @@ void sectorsounds() { if (!SoundEnabled()) return; -#pragma message("sectorspunds") -#if 0 PLAYER& plr = player[pyrn]; int sec = sector[plr.sector].extra & 0xFFFF; - if (sec != 0) { - if ((sec & 32768) != 0) { // loop on/off sector - if ((sec & 1) != 0) { // turn loop on if lsb is 1 + if (sec != 0) + { + if ((sec & 32768) != 0) + { // loop on/off sector + if ((sec & 1) != 0) + { // turn loop on if lsb is 1 int index = (sec & ~0x8001) >> 1; - if (index < ambsoundarray.length && ambsoundarray[index].hsound == -1) - ambsoundarray[index].hsound = playsound(ambsoundarray[index].soundnum, 0, 0, -1); + if (index < MAX_AMB_SOUNDS && soundEngine->GetSoundPlayingInfo(SOURCE_Any, nullptr, 0, CHAN_AMBIENT1 + index) == 0) + { + playsound(ambsoundarray[index], 0, 0, 0, CHAN_AMBIENT1 + index); + } } else { // turn loop off if lsb is 0 and its playing int index = (sec & ~0x8000) >> 1; - if (index < ambsoundarray.length && ambsoundarray[index].hsound != -1) { - stopsound(ambsoundarray[index].hsound); - ambsoundarray[index].hsound = -1; - } + soundEngine->StopSound(CHAN_AMBIENT1 + index); } } else { if (plr.z <= sector[plr.sector].floorz - (8 << 8)) - playsound_loc(sec, plr.x, plr.y); + spritesound(sec, &sprite[plr.spritenum]); } } -#endif } @@ -829,7 +828,7 @@ void makeasplash(int picnum, PLAYER& plr) { if(!isWh2() && picnum == SLIMESPLASH) break; - playsound_loc(S_SPLASH1 + (krand() % 3), sprite[j].x, sprite[j].y); + spritesound(S_SPLASH1 + (krand() % 3), &sprite[j]); break; case LAVASPLASH: break; @@ -876,14 +875,14 @@ void makemonstersplash(int picnum, int i) { if ((gotpic[WATER >> 3] & (1 << (WATER & 7))) > 0) { gotpic[WATER >> 3] &= ~(1 << (WATER & 7)); if ((krand() % 2) != 0) - playsound_loc(S_SPLASH1 + (krand() % 3), sprite[j].x, sprite[j].y); + spritesound(S_SPLASH1 + (krand() % 3), &sprite[j]); } } if ((krand() % 2) != 0) { if ((gotpic[SLIME >> 3] & (1 << (SLIME & 7))) > 0) { gotpic[SLIME >> 3] &= ~(1 << (SLIME & 7)); if ((krand() % 2) != 0) - playsound_loc(S_SPLASH1 + (krand() % 3), sprite[j].x, sprite[j].y); + spritesound(S_SPLASH1 + (krand() % 3), &sprite[j]); } } break; diff --git a/source/games/whaven/src/whmap.cpp b/source/games/whaven/src/whmap.cpp index 0d2442a63..a00a52800 100644 --- a/source/games/whaven/src/whmap.cpp +++ b/source/games/whaven/src/whmap.cpp @@ -824,7 +824,7 @@ boolean prepareboard(const char* fname) { // anit-missile for level only // dont forget to cleanup values plr.treasure[TONYXRING] = 0; - SND_CheckLoops(); + soundEngine->StopAllChannels(); justteleported = false; } else { diff --git a/source/games/whaven/src/whobj.cpp b/source/games/whaven/src/whobj.cpp index 6dfbfbfb8..19655c04d 100644 --- a/source/games/whaven/src/whobj.cpp +++ b/source/games/whaven/src/whobj.cpp @@ -185,15 +185,15 @@ void newstatus(short sn, int seq) { changespritestat(sn, BROKENVASE); switch (sprite[sn].picnum) { case VASEA: - playsound_loc(S_GLASSBREAK1 + (krand() % 3), sprite[sn].x, sprite[sn].y); + spritesound(S_GLASSBREAK1 + (krand() % 3), &sprite[sn]); sprite[sn].picnum = SHATTERVASE; break; case VASEB: - playsound_loc(S_GLASSBREAK1 + (krand() % 3), sprite[sn].x, sprite[sn].y); + spritesound(S_GLASSBREAK1 + (krand() % 3), &sprite[sn]); sprite[sn].picnum = SHATTERVASE2; break; case VASEC: - playsound_loc(S_GLASSBREAK1 + (krand() % 3), sprite[sn].x, sprite[sn].y); + spritesound(S_GLASSBREAK1 + (krand() % 3), &sprite[sn]); sprite[sn].picnum = SHATTERVASE3; break; case STAINGLASS1: @@ -210,7 +210,7 @@ void newstatus(short sn, int seq) { break; case FBARRELFALL: case BARREL: - playsound_loc(S_BARRELBREAK, sprite[sn].x, sprite[sn].y); + spritesound(S_BARRELBREAK, &sprite[sn]); sprite[sn].picnum = FSHATTERBARREL; break; } @@ -223,27 +223,27 @@ void newstatus(short sn, int seq) { sprite[sn].pal = 7; break; case ANIMLEVERDN: - playsound_loc(S_PULLCHAIN1, sprite[sn].x, sprite[sn].y); + spritesound(S_PULLCHAIN1, &sprite[sn]); sprite[sn].picnum = LEVERUP; changespritestat(sn, ANIMLEVERDN); sprite[sn].lotag = 24; break; case ANIMLEVERUP: - playsound_loc(S_PULLCHAIN1, sprite[sn].x, sprite[sn].y); + spritesound(S_PULLCHAIN1, &sprite[sn]); sprite[sn].picnum = LEVERDOWN; changespritestat(sn, ANIMLEVERUP); sprite[sn].lotag = 24; break; case SKULLPULLCHAIN1: case PULLTHECHAIN: - playsound_loc(S_PULLCHAIN1, sprite[sn].x, sprite[sn].y); + spritesound(S_PULLCHAIN1, &sprite[sn]); changespritestat(sn, PULLTHECHAIN); SND_Sound(S_CHAIN1); sprite[sn].lotag = 24; break; case FROZEN: // JSA_NEW - playsound_loc(S_FREEZE, sprite[sn].x, sprite[sn].y); + spritesound(S_FREEZE, &sprite[sn]); changespritestat(sn, FROZEN); sprite[sn].lotag = 3600; break; @@ -265,7 +265,7 @@ void newstatus(short sn, int seq) { switch (sprite[sn].detail) { case DEMONTYPE: sprite[sn].lotag = 24; - playsound_loc(S_GUARDIANPAIN1 + (krand() % 2), sprite[sn].x, sprite[sn].y); + spritesound(S_GUARDIANPAIN1 + (krand() % 2), &sprite[sn]); sprite[sn].picnum = DEMON - 1; changespritestat(sn, PAIN); break; @@ -273,14 +273,14 @@ void newstatus(short sn, int seq) { sprite[sn].lotag = 24; sprite[sn].picnum = NEWGUYPAIN; changespritestat(sn, PAIN); - playsound_loc(S_AGM_PAIN1, sprite[sn].x, sprite[sn].y); + spritesound(S_AGM_PAIN1, &sprite[sn]); break; case KURTTYPE: sprite[sn].lotag = 24; sprite[sn].picnum = GONZOCSWPAIN; changespritestat(sn, PAIN); - playsound_loc(S_GRONPAINA + (krand() % 3), sprite[sn].x, sprite[sn].y); + spritesound(S_GRONPAINA + (krand() % 3), &sprite[sn]); break; case GONZOTYPE: @@ -295,19 +295,19 @@ void newstatus(short sn, int seq) { case KURTREADY + 1: case GONZOCSW: sprite[sn].picnum = GONZOCSWPAIN; - playsound_loc(S_GRONPAINA + (krand() % 3), sprite[sn].x, sprite[sn].y); + spritesound(S_GRONPAINA + (krand() % 3), &sprite[sn]); break; case GONZOGSW: sprite[sn].picnum = GONZOGSWPAIN; - playsound_loc(S_GRONPAINA + (krand() % 3), sprite[sn].x, sprite[sn].y); + spritesound(S_GRONPAINA + (krand() % 3), &sprite[sn]); break; case GONZOGHM: sprite[sn].picnum = GONZOGHMPAIN; - playsound_loc(S_GRONPAINA + (krand() % 3), sprite[sn].x, sprite[sn].y); + spritesound(S_GRONPAINA + (krand() % 3), &sprite[sn]); break; case GONZOGSH: sprite[sn].picnum = GONZOGSHPAIN; - playsound_loc(S_GRONPAINA, sprite[sn].x, sprite[sn].y); + spritesound(S_GRONPAINA, &sprite[sn]); break; default: changespritestat(sn, FLEE); @@ -337,7 +337,7 @@ void newstatus(short sn, int seq) { case GUARDIANTYPE: sprite[sn].lotag = 24; // sprite[sn].picnum=GUARDIANATTACK; - playsound_loc(S_GUARDIANPAIN1 + (krand() % 2), sprite[sn].x, sprite[sn].y); + spritesound(S_GUARDIANPAIN1 + (krand() % 2), &sprite[sn]); if(isWh2()) sprite[sn].picnum = GUARDIAN; else sprite[sn].picnum = GUARDIANCHAR; @@ -346,7 +346,7 @@ void newstatus(short sn, int seq) { case GRONTYPE: sprite[sn].lotag = 24; changespritestat(sn, PAIN); - playsound_loc(S_GRONPAINA + krand() % 3, sprite[sn].x, sprite[sn].y); + spritesound(S_GRONPAINA + krand() % 3, &sprite[sn]); if(sprite[sn].picnum == GRONHAL || sprite[sn].picnum == GRONHALATTACK) sprite[sn].picnum = GRONHALPAIN; @@ -358,10 +358,10 @@ void newstatus(short sn, int seq) { case KOBOLDTYPE: sprite[sn].picnum = KOBOLDDIE; changespritestat(sn, PAIN); - playsound_loc(S_KPAIN1 + (krand() % 2), sprite[sn].x, sprite[sn].y); + spritesound(S_KPAIN1 + (krand() % 2), &sprite[sn]); break; case DEVILTYPE: - playsound_loc(S_MPAIN1, sprite[sn].x, sprite[sn].y); + spritesound(S_MPAIN1, &sprite[sn]); sprite[sn].picnum = DEVILPAIN; changespritestat(sn, PAIN); break; @@ -369,7 +369,7 @@ void newstatus(short sn, int seq) { sprite[sn].picnum = FREDPAIN; changespritestat(sn, PAIN); // EG: Sounds for Fred (currently copied from ogre) - playsound_loc(S_KPAIN1 + (rand() % 2), sprite[sn].x, sprite[sn].y); + spritesound(S_KPAIN1 + (rand() % 2), &sprite[sn]); break; case GOBLINTYPE: case IMPTYPE: @@ -380,13 +380,13 @@ void newstatus(short sn, int seq) { } else { sprite[sn].picnum = GOBLINPAIN; changespritestat(sn, PAIN); - playsound_loc(S_GOBPAIN1 + (krand() % 2), sprite[sn].x, sprite[sn].y); + spritesound(S_GOBPAIN1 + (krand() % 2), &sprite[sn]); } break; case MINOTAURTYPE: sprite[sn].picnum = MINOTAURPAIN; changespritestat(sn, PAIN); - playsound_loc(S_MPAIN1, sprite[sn].x, sprite[sn].y); + spritesound(S_MPAIN1, &sprite[sn]); break; default: changespritestat(sn, FLEE); @@ -501,19 +501,17 @@ void newstatus(short sn, int seq) { changespritestat(sn, BOB); break; case LIFTUP: - if (cartsnd == -1) { - playsound_loc(S_CLUNK, sprite[sn].x, sprite[sn].y); - cartsnd = playsound(S_CHAIN1, sprite[sn].x, sprite[sn].y, 5); + if (soundEngine->GetSoundPlayingInfo(SOURCE_Any, nullptr, -1, CHAN_CART) == 0) { + spritesound(S_CLUNK, &sprite[sn]); + spritesound(S_CHAIN1, &sprite[sn], 5, CHAN_CART); } - changespritestat(sn, LIFTUP); break; case LIFTDN: - if (cartsnd == -1) { - playsound_loc(S_CLUNK, sprite[sn].x, sprite[sn].y); - cartsnd = playsound(S_CHAIN1, sprite[sn].x, sprite[sn].y, 5); + if (soundEngine->GetSoundPlayingInfo(SOURCE_Any, nullptr, -1, CHAN_CART) == 0) { + spritesound(S_CLUNK, &sprite[sn]); + spritesound(S_CHAIN1, &sprite[sn], 5, CHAN_CART); } - changespritestat(sn, LIFTDN); break; case SHOVE: @@ -538,7 +536,7 @@ void newstatus(short sn, int seq) { sprite[sn].cstat |= 1; changespritestat(sn, ATTACK2); sprite[sn].picnum = DRAGONATTACK2; - playsound_loc(S_DRAGON1 + (krand() % 3), sprite[sn].x, sprite[sn].y); + spritesound(S_DRAGON1 + (krand() % 3), &sprite[sn]); case ATTACK: sprite[sn].lotag = 64; sprite[sn].cstat |= 1; @@ -581,12 +579,12 @@ void newstatus(short sn, int seq) { break; case KATIETYPE: if ((krand() % 10) > 4) { - playsound_loc(S_JUDY1, sprite[sn].x, sprite[sn].y); + spritesound(S_JUDY1, &sprite[sn]); } sprite[sn].picnum = KATIEAT; break; case DEMONTYPE: - playsound_loc(S_GUARDIAN1 + (krand() % 2), sprite[sn].x, sprite[sn].y); + spritesound(S_GUARDIAN1 + (krand() % 2), &sprite[sn]); sprite[sn].picnum = DEMON; break; case GRONTYPE: @@ -600,17 +598,17 @@ void newstatus(short sn, int seq) { case KOBOLDTYPE: sprite[sn].picnum = KOBOLDATTACK; if (krand() % 10 > 4) - playsound_loc(S_KSNARL1 + (krand() % 4), sprite[sn].x, sprite[sn].y); + spritesound(S_KSNARL1 + (krand() % 4), &sprite[sn]); break; case DRAGONTYPE: if ((krand() % 10) > 3) - playsound_loc(S_DRAGON1 + (krand() % 2), sprite[sn].x, sprite[sn].y); + spritesound(S_DRAGON1 + (krand() % 2), &sprite[sn]); sprite[sn].picnum = DRAGONATTACK; break; case DEVILTYPE: if ((krand() % 10) > 4) - playsound_loc(S_DEMON1 + (krand() % 5), sprite[sn].x, sprite[sn].y); + spritesound(S_DEMON1 + (krand() % 5), &sprite[sn]); sprite[sn].picnum = DEVILATTACK; break; @@ -618,7 +616,7 @@ void newstatus(short sn, int seq) { sprite[sn].picnum = FREDATTACK; /* EG: Sounds for Fred (currently copied from Ogre) */ if (rand() % 10 > 4) - playsound_loc(S_KSNARL1 + (rand() % 4), sprite[sn].x, sprite[sn].y); + spritesound(S_KSNARL1 + (rand() % 4), &sprite[sn]); break; case SKELETONTYPE: sprite[sn].picnum = SKELETONATTACK; @@ -626,17 +624,17 @@ void newstatus(short sn, int seq) { case IMPTYPE: sprite[sn].lotag = 92; if ((krand() % 10) > 5) - playsound_loc(S_IMPGROWL1 + (krand() % 3), sprite[sn].x, sprite[sn].y); + spritesound(S_IMPGROWL1 + (krand() % 3), &sprite[sn]); sprite[sn].picnum = IMPATTACK; break; case GOBLINTYPE: if ((krand() % 10) > 5) - playsound_loc(S_GOBLIN1 + (krand() % 3), sprite[sn].x, sprite[sn].y); + spritesound(S_GOBLIN1 + (krand() % 3), &sprite[sn]); sprite[sn].picnum = GOBLINATTACK; break; case MINOTAURTYPE: if ((krand() % 10) > 4) - playsound_loc(S_MSNARL1 + (krand() % 3), sprite[sn].x, sprite[sn].y); + spritesound(S_MSNARL1 + (krand() % 3), &sprite[sn]); sprite[sn].picnum = MINOTAURATTACK; break; @@ -645,7 +643,7 @@ void newstatus(short sn, int seq) { break; case FATWITCHTYPE: if ((krand() % 10) > 4) - playsound_loc(S_FATLAUGH, sprite[sn].x, sprite[sn].y); + spritesound(S_FATLAUGH, &sprite[sn]); sprite[sn].picnum = FATWITCHATTACK; break; case JUDYTYPE: @@ -656,11 +654,11 @@ void newstatus(short sn, int seq) { sprite[sn].picnum = JUDYATTACK2; break; case WILLOWTYPE: - playsound_loc(S_WISP + (krand() % 2), sprite[sn].x, sprite[sn].y); + spritesound(S_WISP + (krand() % 2), &sprite[sn]); sprite[sn].pal = 7; break; case GUARDIANTYPE: - playsound_loc(S_GUARDIAN1 + (krand() % 2), sprite[sn].x, sprite[sn].y); + spritesound(S_GUARDIAN1 + (krand() % 2), &sprite[sn]); sprite[sn].picnum = GUARDIANATTACK; break; } @@ -749,14 +747,14 @@ void newstatus(short sn, int seq) { sprite[sn].picnum = IMP; } else { if (krand() % 10 > 2) - playsound_loc(S_GOBLIN1 + (krand() % 3), sprite[sn].x, sprite[sn].y); + spritesound(S_GOBLIN1 + (krand() % 3), &sprite[sn]); sprite[sn].picnum = GOBLIN; } break; case MINOTAURTYPE: // JSA_DEMO3 - playsound_loc(S_MSNARL1 + (krand() % 4), sprite[sn].x, sprite[sn].y); + spritesound(S_MSNARL1 + (krand() % 4), &sprite[sn]); sprite[sn].picnum = MINOTAUR; break; case SKULLYTYPE: @@ -804,12 +802,12 @@ void newstatus(short sn, int seq) { case NEWGUYTYPE: sprite[sn].lotag = 20; sprite[sn].picnum = NEWGUYDIE; - playsound_loc(S_AGM_DIE1 + (krand() % 3), sprite[sn].x, sprite[sn].y); + spritesound(S_AGM_DIE1 + (krand() % 3), &sprite[sn]); break; case KURTTYPE: case GONZOTYPE: sprite[sn].lotag = 20; - playsound_loc(S_GRONDEATHA + krand() % 3, sprite[sn].x, sprite[sn].y); + spritesound(S_GRONDEATHA + krand() % 3, &sprite[sn]); switch (sprite[sn].picnum) { case KURTSTAND: case KURTKNEE: @@ -853,12 +851,12 @@ void newstatus(short sn, int seq) { } break; case KATIETYPE: - playsound_loc(S_JUDYDIE, sprite[sn].x, sprite[sn].y); + spritesound(S_JUDYDIE, &sprite[sn]); sprite[sn].lotag = 20; sprite[sn].picnum = KATIEPAIN; break; case DEMONTYPE: - playsound_loc(S_GUARDIANDIE, sprite[sn].x, sprite[sn].y); + spritesound(S_GUARDIANDIE, &sprite[sn]); explosion(sn, sprite[sn].x, sprite[sn].y, sprite[sn].z, sprite[sn].owner); deletesprite((short) sn); addscore(aiGetPlayerTarget(sn), 1500); @@ -866,7 +864,7 @@ void newstatus(short sn, int seq) { return; case GRONTYPE: sprite[sn].lotag = 20; - playsound_loc(S_GRONDEATHA + krand() % 3, sprite[sn].x, sprite[sn].y); + spritesound(S_GRONDEATHA + krand() % 3, &sprite[sn]); if(sprite[sn].picnum == GRONHAL || sprite[sn].picnum == GRONHALATTACK || sprite[sn].picnum == GRONHALPAIN) sprite[sn].picnum = GRONHALDIE; else if(sprite[sn].picnum == GRONSW || sprite[sn].picnum == GRONSWATTACK || sprite[sn].picnum == GRONSWPAIN) @@ -883,18 +881,18 @@ void newstatus(short sn, int seq) { sprite[sn].lotag = 20; break; case KOBOLDTYPE: - playsound_loc(S_KDIE1 + (krand() % 2), sprite[sn].x, sprite[sn].y); + spritesound(S_KDIE1 + (krand() % 2), &sprite[sn]); sprite[sn].lotag = 20; sprite[sn].picnum = KOBOLDDIE; break; case DRAGONTYPE: - playsound_loc(S_DEMONDIE1 + (krand() % 2), sprite[sn].x, sprite[sn].y); + spritesound(S_DEMONDIE1 + (krand() % 2), &sprite[sn]); sprite[sn].lotag = 20; sprite[sn].picnum = DRAGONDIE; break; case DEVILTYPE: - playsound_loc(S_DEMONDIE1 + (krand() % 2), sprite[sn].x, sprite[sn].y); + spritesound(S_DEMONDIE1 + (krand() % 2), &sprite[sn]); sprite[sn].lotag = 20; sprite[sn].picnum = DEVILDIE; break; @@ -902,25 +900,25 @@ void newstatus(short sn, int seq) { sprite[sn].lotag = 20; sprite[sn].picnum = FREDDIE; /* EG: Sounds for Fred (currently copied from Ogre) */ - playsound_loc(S_KDIE1 + (rand() % 2), sprite[sn].x, sprite[sn].y); + spritesound(S_KDIE1 + (rand() % 2), &sprite[sn]); break; case SKELETONTYPE: - playsound_loc(S_SKELETONDIE, sprite[sn].x, sprite[sn].y); + spritesound(S_SKELETONDIE, &sprite[sn]); sprite[sn].lotag = 20; sprite[sn].picnum = SKELETONDIE; break; case IMPTYPE: - playsound_loc(S_IMPDIE1 + (krand() % 2), sprite[sn].x, sprite[sn].y); + spritesound(S_IMPDIE1 + (krand() % 2), &sprite[sn]); sprite[sn].lotag = 20; sprite[sn].picnum = IMPDIE; break; case GOBLINTYPE: - playsound_loc(S_GOBDIE1 + (krand() % 3), sprite[sn].x, sprite[sn].y); + spritesound(S_GOBDIE1 + (krand() % 3), &sprite[sn]); sprite[sn].lotag = 20; sprite[sn].picnum = GOBLINDIE; break; case MINOTAURTYPE: - playsound_loc(S_MDEATH1, sprite[sn].x, sprite[sn].y); + spritesound(S_MDEATH1, &sprite[sn]); sprite[sn].lotag = 10; sprite[sn].picnum = MINOTAURDIE; break; @@ -931,12 +929,12 @@ void newstatus(short sn, int seq) { case SKULLYTYPE: sprite[sn].lotag = 20; sprite[sn].picnum = SKULLYDIE; - playsound_loc(S_SKULLWITCHDIE, sprite[sn].x, sprite[sn].y); + spritesound(S_SKULLWITCHDIE, &sprite[sn]); break; case FATWITCHTYPE: sprite[sn].lotag = 20; sprite[sn].picnum = FATWITCHDIE; - playsound_loc(S_FATWITCHDIE, sprite[sn].x, sprite[sn].y); + spritesound(S_FATWITCHDIE, &sprite[sn]); break; case JUDYTYPE: sprite[sn].lotag = 20; @@ -947,11 +945,11 @@ void newstatus(short sn, int seq) { return; } else { sprite[sn].picnum = JUDYDIE; - playsound_loc(S_JUDYDIE, sprite[sn].x, sprite[sn].y); + spritesound(S_JUDYDIE, &sprite[sn]); } break; case GUARDIANTYPE: - playsound_loc(S_GUARDIANDIE, sprite[sn].x, sprite[sn].y); + spritesound(S_GUARDIANDIE, &sprite[sn]); for (int j = 0; j < 4; j++) explosion(sn, sprite[sn].x, sprite[sn].y, sprite[sn].z, sprite[sn].owner); deletesprite((short) sn); @@ -959,7 +957,7 @@ void newstatus(short sn, int seq) { kills++; return; case WILLOWTYPE: - playsound_loc(S_WILLOWDIE, sprite[sn].x, sprite[sn].y); + spritesound(S_WILLOWDIE, &sprite[sn]); sprite[sn].pal = 0; sprite[sn].lotag = 20; sprite[sn].picnum = WILLOWEXPLO; @@ -1583,7 +1581,7 @@ boolean damageactor(PLAYER& plr, int hitobject, short i) { // EG 21 Aug 2017: Move this here so as not to make ouch sounds unless pain is // happening if ((krand() & 9) == 0) - playsound_loc(S_PLRPAIN1 + (rand() % 2), sprite[i].x, sprite[i].y); + spritesound(S_PLRPAIN1 + (rand() % 2), &sprite[i]); if (isWh2() && sprite[i].picnum == DART) { plr.poisoned = 1; @@ -1597,7 +1595,7 @@ boolean damageactor(PLAYER& plr, int hitobject, short i) { if (sprite[i].picnum == PLASMA) addhealth(plr, -((krand() & 15) + 15)); else if (sprite[i].picnum == FATSPANK) { - playsound_loc(S_GORE1A + (krand() % 3), plr.x, plr.y); + spritesound(S_GORE1A + (krand() % 3), &sprite[plr.spritenum]); addhealth(plr, -((krand() & 10) + 10)); if ((krand() % 100) > 90) { plr.poisoned = 1; @@ -1647,7 +1645,7 @@ boolean damageactor(PLAYER& plr, int hitobject, short i) { sprite[j].hitag -= 30; if(sprite[i].picnum == THROWPIKE) { if ((krand() % 2) != 0) - playsound_loc(S_GORE1A + krand() % 2, sprite[i].x, sprite[i].y); + spritesound(S_GORE1A + krand() % 2, &sprite[i]); } } else { switch (sprite[i].picnum) { diff --git a/source/games/whaven/src/whplr.cpp b/source/games/whaven/src/whplr.cpp index 7a15f3722..11149367a 100644 --- a/source/games/whaven/src/whplr.cpp +++ b/source/games/whaven/src/whplr.cpp @@ -47,7 +47,7 @@ void playerdead(PLAYER& plr) { if (plr.spiked == 1) { plr.spiketics = spikeanimtics[0].daweapontics; - playsound_loc(S_GORE1, plr.x, plr.y); + spritesound(S_GORE1, &sprite[plr.spritenum]); SND_Sound(S_HEARTBEAT); } @@ -261,7 +261,7 @@ void plruse(PLAYER& plr) { showmessage("find door trigger", 360); } } - playsound_loc(S_PUSH1 + (krand() % 2), plr.x, plr.y); + spritesound(S_PUSH1 + (krand() % 2), &sprite[plr.spritenum]); } } if (nt.tagsprite >= 0) { @@ -335,10 +335,10 @@ void chunksofmeat(PLAYER& plr, int hitsprite, int hitx, int hity, int hitz, shor if (sprite[hitsprite].picnum == SKELETON || sprite[hitsprite].picnum == SKELETONATTACK || sprite[hitsprite].picnum == SKELETONDIE) { - playsound_loc(S_SKELHIT1 + (krand() % 2), sprite[hitsprite].x, sprite[hitsprite].y); + spritesound(S_SKELHIT1 + (krand() % 2), &sprite[hitsprite]); } else { if (krand() % 100 > 60) - playsound_loc(S_GORE1 + (krand() % 4), sprite[hitsprite].x, sprite[hitsprite].y); + spritesound(S_GORE1 + (krand() % 4), &sprite[hitsprite]); } if ((hitsprite >= 0) && (sprite[hitsprite].statnum < MAXSTATUS)) { diff --git a/source/games/whaven/src/whtag.cpp b/source/games/whaven/src/whtag.cpp index 7ed046a8b..8c9978a34 100644 --- a/source/games/whaven/src/whtag.cpp +++ b/source/games/whaven/src/whtag.cpp @@ -53,7 +53,7 @@ void operatesprite(PLAYER& plr, short s) { case STAINSCENE: switch (sprite[s].lotag) { case 2: - playsound_loc(S_GLASSBREAK1 + (rand() % 3), sprite[s].x, sprite[s].y); + spritesound(S_GLASSBREAK1 + (rand() % 3), &sprite[s]); for (int j = 0; j < 20; j++) { shards(s, 2); } @@ -832,9 +832,10 @@ void operatesector(PLAYER& plr, int s) { for (k = 0; k < MAXSPRITES; k++) { if (sector[s].hitag == sprite[k].hitag && sprite[k].extra < 1) { newstatus(k, FLOCKSPAWN); - if (batsnd == -1) - batsnd = playsound(S_BATSLOOP, sprite[k].x, sprite[k].y, -1); -// sector[s].lotag = sector[s].hitag = 0; + if (soundEngine->GetSoundPlayingInfo(SOURCE_Any, nullptr, -1, CHAN_BAT) == 0) { + spritesound(S_BATSLOOP, &sprite[k], -1, CHAN_BAT); + // sector[s].lotag = sector[s].hitag = 0; + } } } }