diff --git a/Source/controls/plrctrls.cpp b/Source/controls/plrctrls.cpp index f27b0177e..916e08a6e 100644 --- a/Source/controls/plrctrls.cpp +++ b/Source/controls/plrctrls.cpp @@ -1198,13 +1198,7 @@ void PerformSpellAction() int spl = plr[myplr]._pRSpell; if ((pcursplr == -1 && (spl == SPL_RESURRECT || spl == SPL_HEALOTHER)) || (pcursobj == -1 && spl == SPL_DISARM)) { - if (plr[myplr]._pClass == HeroClass::Warrior) { - PlaySFX(PS_WARR27); - } else if (plr[myplr]._pClass == HeroClass::Rogue) { - PlaySFX(PS_ROGUE27); - } else if (plr[myplr]._pClass == HeroClass::Sorcerer) { - PlaySFX(PS_MAGE27); - } + plr[myplr].PlaySpeach(27); return; } diff --git a/Source/effects.cpp b/Source/effects.cpp index 1a69ce799..ab3278b14 100644 --- a/Source/effects.cpp +++ b/Source/effects.cpp @@ -946,7 +946,7 @@ TSFX sgSFX[] = { { sfx_MONK, "Sfx\\Monk\\Monk69b.wav", nullptr }, { sfx_MONK, "Sfx\\Monk\\Monk70.wav", nullptr }, { sfx_MONK, "Sfx\\Monk\\Monk71.wav", nullptr }, - { sfx_MONK, "Sfx\\Misc\\blank.wav", nullptr }, + { sfx_MONK, "Sfx\\Sorceror\\Mage72.wav", nullptr }, { sfx_MONK, "Sfx\\Misc\\blank.wav", nullptr }, { sfx_MONK, "Sfx\\Misc\\blank.wav", nullptr }, { sfx_MONK, "Sfx\\Misc\\blank.wav", nullptr }, @@ -1279,20 +1279,20 @@ static _sfx_id RndSFX(_sfx_id psfx) return static_cast<_sfx_id>(psfx + random_(165, nRand)); } -void PlaySFX(_sfx_id psfx, bool randomizeByCategory) +void PlaySFX(_sfx_id psfx) { - if (randomizeByCategory) { - psfx = RndSFX(psfx); - } + psfx = RndSFX(psfx); PlaySFX_priv(&sgSFX[psfx], false, 0, 0); } -void PlaySfxLoc(_sfx_id psfx, int x, int y) +void PlaySfxLoc(_sfx_id psfx, int x, int y, bool randomizeByCategory) { TSnd *pSnd; - psfx = RndSFX(psfx); + if (randomizeByCategory) { + psfx = RndSFX(psfx); + } if (psfx >= 0 && psfx <= 3) { pSnd = sgSFX[psfx].pSnd; diff --git a/Source/effects.h b/Source/effects.h index 53fa93a89..d28e31864 100644 --- a/Source/effects.h +++ b/Source/effects.h @@ -1071,8 +1071,8 @@ void InitMonsterSND(int monst); void FreeMonsterSnd(); bool calc_snd_position(int x, int y, int *plVolume, int *plPan); void PlayEffect(int i, int mode); -void PlaySFX(_sfx_id psfx, bool randomizeByCategory = true); -void PlaySfxLoc(_sfx_id psfx, int x, int y); +void PlaySFX(_sfx_id psfx); +void PlaySfxLoc(_sfx_id psfx, int x, int y, bool randomizeByCategory = true); void sound_stop(); void sound_update(); void effects_cleanup_sfx(); diff --git a/Source/inv.cpp b/Source/inv.cpp index 149f960df..675d5e41c 100644 --- a/Source/inv.cpp +++ b/Source/inv.cpp @@ -989,18 +989,7 @@ void CheckInvPaste(int pnum, int mx, int my) if (il != ILOC_UNEQUIPABLE && il != ILOC_BELT && !plr[pnum].HoldItem._iStatFlag) { done = false; - if (plr[pnum]._pClass == HeroClass::Warrior) - PlaySFX(PS_WARR13); - else if (plr[pnum]._pClass == HeroClass::Rogue) - PlaySFX(PS_ROGUE13); - else if (plr[pnum]._pClass == HeroClass::Sorcerer) - PlaySFX(PS_MAGE13); - else if (plr[pnum]._pClass == HeroClass::Monk) - PlaySFX(PS_MONK13); - else if (plr[pnum]._pClass == HeroClass::Bard) - PlaySFX(PS_ROGUE13); - else if (plr[pnum]._pClass == HeroClass::Barbarian) - PlaySFX(PS_MAGE13); + plr[pnum].PlaySpeach(13); } if (!done) @@ -1485,39 +1474,9 @@ void CheckInvCut(int pnum, int mx, int my, bool automaticMove) if (automaticMove) { if (!automaticallyMoved) { if (CanBePlacedOnBelt(holdItem) || automaticallyUnequip) { - switch (player._pClass) { - case HeroClass::Warrior: - case HeroClass::Barbarian: - PlaySFX(PS_WARR15, false); - break; - case HeroClass::Rogue: - case HeroClass::Bard: - PlaySFX(PS_ROGUE15, false); - break; - case HeroClass::Sorcerer: - PlaySFX(PS_MAGE15, false); - break; - case HeroClass::Monk: - PlaySFX(PS_MONK15, false); - break; - } + player.PlaySpecificSpeach(15); } else { - switch (player._pClass) { - case HeroClass::Warrior: - case HeroClass::Barbarian: - PlaySFX(PS_WARR37, false); - break; - case HeroClass::Rogue: - case HeroClass::Bard: - PlaySFX(PS_ROGUE37, false); - break; - case HeroClass::Sorcerer: - PlaySFX(PS_MAGE37, false); - break; - case HeroClass::Monk: - PlaySFX(PS_MONK37, false); - break; - } + player.PlaySpecificSpeach(37); } } @@ -1641,20 +1600,7 @@ void CheckQuestItem(int pnum) if (plr[pnum].HoldItem.IDidx == IDI_OPTAMULET && quests[Q_BLIND]._qactive == QUEST_ACTIVE) quests[Q_BLIND]._qactive = QUEST_DONE; if (plr[pnum].HoldItem.IDidx == IDI_MUSHROOM && quests[Q_MUSHROOM]._qactive == QUEST_ACTIVE && quests[Q_MUSHROOM]._qvar1 == QS_MUSHSPAWNED) { - sfxdelay = 10; - if (plr[pnum]._pClass == HeroClass::Warrior) { // BUGFIX: Voice for this quest might be wrong in MP - sfxdnum = PS_WARR95; - } else if (plr[pnum]._pClass == HeroClass::Rogue) { - sfxdnum = PS_ROGUE95; - } else if (plr[pnum]._pClass == HeroClass::Sorcerer) { - sfxdnum = PS_MAGE95; - } else if (plr[pnum]._pClass == HeroClass::Monk) { - sfxdnum = PS_MONK95; - } else if (plr[pnum]._pClass == HeroClass::Bard) { - sfxdnum = PS_ROGUE95; - } else if (plr[pnum]._pClass == HeroClass::Barbarian) { - sfxdnum = PS_WARR95; - } + plr[pnum].PlaySpeach(95, 10); // BUGFIX: Voice for this quest might be wrong in MP quests[Q_MUSHROOM]._qvar1 = QS_MUSHPICKED; } if (plr[pnum].HoldItem.IDidx == IDI_ANVIL && quests[Q_ANVIL]._qactive != QUEST_NOTAVAIL) { @@ -1663,37 +1609,11 @@ void CheckQuestItem(int pnum) quests[Q_ANVIL]._qvar1 = 1; } if (quests[Q_ANVIL]._qlog) { - sfxdelay = 10; - if (plr[myplr]._pClass == HeroClass::Warrior) { - sfxdnum = PS_WARR89; - } else if (plr[myplr]._pClass == HeroClass::Rogue) { - sfxdnum = PS_ROGUE89; - } else if (plr[myplr]._pClass == HeroClass::Sorcerer) { - sfxdnum = PS_MAGE89; - } else if (plr[myplr]._pClass == HeroClass::Monk) { - sfxdnum = PS_MONK89; - } else if (plr[myplr]._pClass == HeroClass::Bard) { - sfxdnum = PS_ROGUE89; - } else if (plr[myplr]._pClass == HeroClass::Barbarian) { - sfxdnum = PS_WARR89; - } + plr[myplr].PlaySpeach(89, 10); } } if (plr[pnum].HoldItem.IDidx == IDI_GLDNELIX && quests[Q_VEIL]._qactive != QUEST_NOTAVAIL) { - sfxdelay = 30; - if (plr[myplr]._pClass == HeroClass::Warrior) { - sfxdnum = PS_WARR88; - } else if (plr[myplr]._pClass == HeroClass::Rogue) { - sfxdnum = PS_ROGUE88; - } else if (plr[myplr]._pClass == HeroClass::Sorcerer) { - sfxdnum = PS_MAGE88; - } else if (plr[myplr]._pClass == HeroClass::Monk) { - sfxdnum = PS_MONK88; - } else if (plr[myplr]._pClass == HeroClass::Bard) { - sfxdnum = PS_ROGUE88; - } else if (plr[myplr]._pClass == HeroClass::Barbarian) { - sfxdnum = PS_WARR88; - } + plr[myplr].PlaySpeach(88, 30); } if (plr[pnum].HoldItem.IDidx == IDI_ROCK && quests[Q_ROCK]._qactive != QUEST_NOTAVAIL) { if (quests[Q_ROCK]._qactive == QUEST_INIT) { @@ -1701,57 +1621,18 @@ void CheckQuestItem(int pnum) quests[Q_ROCK]._qvar1 = 1; } if (quests[Q_ROCK]._qlog) { - sfxdelay = 10; - if (plr[myplr]._pClass == HeroClass::Warrior) { - sfxdnum = PS_WARR87; - } else if (plr[myplr]._pClass == HeroClass::Rogue) { - sfxdnum = PS_ROGUE87; - } else if (plr[myplr]._pClass == HeroClass::Sorcerer) { - sfxdnum = PS_MAGE87; - } else if (plr[myplr]._pClass == HeroClass::Monk) { - sfxdnum = PS_MONK87; - } else if (plr[myplr]._pClass == HeroClass::Bard) { - sfxdnum = PS_ROGUE87; - } else if (plr[myplr]._pClass == HeroClass::Barbarian) { - sfxdnum = PS_WARR87; - } + plr[myplr].PlaySpeach(87, 10); } } if (plr[pnum].HoldItem.IDidx == IDI_ARMOFVAL && quests[Q_BLOOD]._qactive == QUEST_ACTIVE) { quests[Q_BLOOD]._qactive = QUEST_DONE; - sfxdelay = 20; - if (plr[myplr]._pClass == HeroClass::Warrior) { - sfxdnum = PS_WARR91; - } else if (plr[myplr]._pClass == HeroClass::Rogue) { - sfxdnum = PS_ROGUE91; - } else if (plr[myplr]._pClass == HeroClass::Sorcerer) { - sfxdnum = PS_MAGE91; - } else if (plr[myplr]._pClass == HeroClass::Monk) { - sfxdnum = PS_MONK91; - } else if (plr[myplr]._pClass == HeroClass::Bard) { - sfxdnum = PS_ROGUE91; - } else if (plr[myplr]._pClass == HeroClass::Barbarian) { - sfxdnum = PS_WARR91; - } + plr[myplr].PlaySpeach(91, 20); } if (plr[pnum].HoldItem.IDidx == IDI_MAPOFDOOM) { quests[Q_GRAVE]._qlog = false; quests[Q_GRAVE]._qactive = QUEST_ACTIVE; quests[Q_GRAVE]._qvar1 = 1; - sfxdelay = 10; - if (plr[myplr]._pClass == HeroClass::Warrior) { - sfxdnum = PS_WARR79; - } else if (plr[myplr]._pClass == HeroClass::Rogue) { - sfxdnum = PS_ROGUE79; - } else if (plr[myplr]._pClass == HeroClass::Sorcerer) { - sfxdnum = PS_MAGE79; - } else if (plr[myplr]._pClass == HeroClass::Monk) { - sfxdnum = PS_MONK79; - } else if (plr[myplr]._pClass == HeroClass::Bard) { - sfxdnum = PS_ROGUE79; - } else if (plr[myplr]._pClass == HeroClass::Barbarian) { - sfxdnum = PS_WARR79; - } + plr[myplr].PlaySpeach(79, 10); } if (plr[pnum].HoldItem.IDidx == IDI_NOTE1 || plr[pnum].HoldItem.IDidx == IDI_NOTE2 || plr[pnum].HoldItem.IDidx == IDI_NOTE3) { int mask, idx, item_num; @@ -1766,20 +1647,7 @@ void CheckQuestItem(int pnum) if (PlrHasItem(pnum, IDI_NOTE3, &n3) || idx == IDI_NOTE3) mask |= 4; if (mask == 7) { - sfxdelay = 10; - if (plr[myplr]._pClass == HeroClass::Warrior) { - sfxdnum = PS_WARR46; - } else if (plr[myplr]._pClass == HeroClass::Rogue) { - sfxdnum = PS_ROGUE46; - } else if (plr[myplr]._pClass == HeroClass::Sorcerer) { - sfxdnum = PS_MAGE46; - } else if (plr[myplr]._pClass == HeroClass::Monk) { - sfxdnum = PS_MONK46; - } else if (plr[myplr]._pClass == HeroClass::Bard) { - sfxdnum = PS_ROGUE46; - } else if (plr[myplr]._pClass == HeroClass::Barbarian) { - sfxdnum = PS_WARR46; - } + plr[myplr].PlaySpeach(46, 10); switch (idx) { case IDI_NOTE1: PlrHasItem(pnum, IDI_NOTE2, &n2); @@ -1908,19 +1776,7 @@ void AutoGetItem(int pnum, ItemStruct *item, int ii) } if (pnum == myplr) { - if (plr[pnum]._pClass == HeroClass::Warrior) { - PlaySFX(PS_WARR14); - } else if (plr[pnum]._pClass == HeroClass::Rogue) { - PlaySFX(PS_ROGUE14); - } else if (plr[pnum]._pClass == HeroClass::Sorcerer) { - PlaySFX(PS_MAGE14); - } else if (plr[pnum]._pClass == HeroClass::Monk) { - PlaySFX(PS_MONK14); - } else if (plr[pnum]._pClass == HeroClass::Bard) { - PlaySFX(PS_ROGUE14); - } else if (plr[pnum]._pClass == HeroClass::Barbarian) { - PlaySFX(PS_WARR14); - } + plr[pnum].PlaySpeach(14); } plr[pnum].HoldItem = *item; RespawnItem(item, true); @@ -2438,37 +2294,11 @@ bool UseInvItem(int pnum, int cii) switch (Item->IDidx) { case IDI_MUSHROOM: - sfxdelay = 10; - if (plr[pnum]._pClass == HeroClass::Warrior) { - sfxdnum = PS_WARR95; - } else if (plr[pnum]._pClass == HeroClass::Rogue) { - sfxdnum = PS_ROGUE95; - } else if (plr[pnum]._pClass == HeroClass::Sorcerer) { - sfxdnum = PS_MAGE95; - } else if (plr[pnum]._pClass == HeroClass::Monk) { - sfxdnum = PS_MONK95; - } else if (plr[pnum]._pClass == HeroClass::Bard) { - sfxdnum = PS_ROGUE95; - } else if (plr[pnum]._pClass == HeroClass::Barbarian) { - sfxdnum = PS_WARR95; - } + plr[pnum].PlaySpeach(95, 10); return true; case IDI_FUNGALTM: PlaySFX(IS_IBOOK); - sfxdelay = 10; - if (plr[pnum]._pClass == HeroClass::Warrior) { - sfxdnum = PS_WARR29; - } else if (plr[pnum]._pClass == HeroClass::Rogue) { - sfxdnum = PS_ROGUE29; - } else if (plr[pnum]._pClass == HeroClass::Sorcerer) { - sfxdnum = PS_MAGE29; - } else if (plr[pnum]._pClass == HeroClass::Monk) { - sfxdnum = PS_MONK29; - } else if (plr[pnum]._pClass == HeroClass::Bard) { - sfxdnum = PS_ROGUE29; - } else if (plr[pnum]._pClass == HeroClass::Barbarian) { - sfxdnum = PS_WARR29; - } + plr[pnum].PlaySpeach(29, 10); return true; } @@ -2476,19 +2306,7 @@ bool UseInvItem(int pnum, int cii) return false; if (!Item->_iStatFlag) { - if (plr[pnum]._pClass == HeroClass::Warrior) { - PlaySFX(PS_WARR13); - } else if (plr[pnum]._pClass == HeroClass::Rogue) { - PlaySFX(PS_ROGUE13); - } else if (plr[pnum]._pClass == HeroClass::Sorcerer) { - PlaySFX(PS_MAGE13); - } else if (plr[pnum]._pClass == HeroClass::Monk) { - PlaySFX(PS_MONK13); - } else if (plr[pnum]._pClass == HeroClass::Bard) { - PlaySFX(PS_ROGUE13); - } else if (plr[pnum]._pClass == HeroClass::Barbarian) { - PlaySFX(PS_WARR13); - } + plr[pnum].PlaySpeach(13); return true; } diff --git a/Source/miniwin/misc_msg.cpp b/Source/miniwin/misc_msg.cpp index baeebbe58..a16d89da6 100644 --- a/Source/miniwin/misc_msg.cpp +++ b/Source/miniwin/misc_msg.cpp @@ -279,13 +279,7 @@ bool BlurInventory() { if (pcurs >= CURSOR_FIRSTITEM) { if (!TryDropItem()) { - if (plr[myplr]._pClass == HeroClass::Warrior) { - PlaySFX(PS_WARR16); // "Where would I put this?" - } else if (plr[myplr]._pClass == HeroClass::Rogue) { - PlaySFX(PS_ROGUE16); - } else if (plr[myplr]._pClass == HeroClass::Sorcerer) { - PlaySFX(PS_MAGE16); - } + plr[myplr].PlaySpeach(16); // "Where would I put this?" return false; } } diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 75983d85b..d270fdcdd 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -871,19 +871,7 @@ bool PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, bool s } if (plr[pnum]._pHitPoints >> 6 > 0) { - if (plr[pnum]._pClass == HeroClass::Warrior) { - PlaySfxLoc(PS_WARR69, plr[pnum]._px, plr[pnum]._py); - } else if (plr[pnum]._pClass == HeroClass::Rogue) { - PlaySfxLoc(PS_ROGUE69, plr[pnum]._px, plr[pnum]._py); - } else if (plr[pnum]._pClass == HeroClass::Sorcerer) { - PlaySfxLoc(PS_MAGE69, plr[pnum]._px, plr[pnum]._py); - } else if (plr[pnum]._pClass == HeroClass::Monk) { - PlaySfxLoc(PS_MONK69, plr[pnum]._px, plr[pnum]._py); - } else if (plr[pnum]._pClass == HeroClass::Bard) { - PlaySfxLoc(PS_ROGUE69, plr[pnum]._px, plr[pnum]._py); - } else if (plr[pnum]._pClass == HeroClass::Barbarian) { - PlaySfxLoc(PS_WARR69, plr[pnum]._px, plr[pnum]._py); - } + plr[pnum].PlaySpeach(69); } return true; } @@ -993,19 +981,7 @@ bool Plr2PlrMHit(int pnum, int p, int mindam, int maxdam, int dist, int mtype, b dam -= (dam * resper) / 100; if (pnum == myplr) NetSendCmdDamage(true, p, dam); - if (plr[pnum]._pClass == HeroClass::Warrior) { - PlaySfxLoc(PS_WARR69, plr[pnum]._px, plr[pnum]._py); - } else if (plr[pnum]._pClass == HeroClass::Rogue) { - PlaySfxLoc(PS_ROGUE69, plr[pnum]._px, plr[pnum]._py); - } else if (plr[pnum]._pClass == HeroClass::Sorcerer) { - PlaySfxLoc(PS_MAGE69, plr[pnum]._px, plr[pnum]._py); - } else if (plr[pnum]._pClass == HeroClass::Monk) { - PlaySfxLoc(PS_MONK69, plr[pnum]._px, plr[pnum]._py); - } else if (plr[pnum]._pClass == HeroClass::Bard) { - PlaySfxLoc(PS_ROGUE69, plr[pnum]._px, plr[pnum]._py); - } else if (plr[pnum]._pClass == HeroClass::Barbarian) { - PlaySfxLoc(PS_WARR69, plr[pnum]._px, plr[pnum]._py); - } + plr[pnum].PlaySpeach(69); return true; } else { if (blkper < blk) { @@ -3069,14 +3045,6 @@ void AddBlodboil(Sint32 mi, Sint32 sx, Sint32 sy, Sint32 dx, Sint32 dy, Sint32 m if (id == -1 || plr[id]._pSpellFlags & 6 || plr[id]._pHitPoints <= plr[id]._pLevel << 6) { missile[mi]._miDelFlag = true; } else { - _sfx_id blodboilSFX[enum_size::value] = { - PS_WARR70, - PS_ROGUE70, - PS_MAGE70, - PS_MONK70, // BUGFIX: PS_MONK70? (fixed) - PS_ROGUE70, - PS_WARR70 - }; UseMana(id, SPL_BLODBOIL); missile[mi]._miVar1 = id; int tmp = 3 * plr[id]._pLevel; @@ -3089,7 +3057,7 @@ void AddBlodboil(Sint32 mi, Sint32 sx, Sint32 sy, Sint32 dx, Sint32 dy, Sint32 m missile[mi]._mirange = lvl + 10 * missile[mi]._mispllvl + 245; CalcPlrItemVals(id, true); force_redraw = 255; - PlaySfxLoc(blodboilSFX[static_cast(plr[id]._pClass)], plr[id]._px, plr[id]._py); + plr[id].PlaySpeach(70); } } @@ -5170,14 +5138,6 @@ void MI_Blodboil(Sint32 i) if (missile[i]._mirange == 0) { id = missile[i]._miVar1; if ((plr[id]._pSpellFlags & 2) == 2) { - _sfx_id blodboilSFX[enum_size::value] = { - PS_WARR72, - PS_ROGUE72, - PS_MAGE72, - PS_MAGE72, - PS_ROGUE72, - PS_WARR72 - }; plr[id]._pSpellFlags &= ~0x2; plr[id]._pSpellFlags |= 4; int lvl = 2; @@ -5188,23 +5148,15 @@ void MI_Blodboil(Sint32 i) CalcPlrItemVals(id, true); ApplyPlrDamage(id, 0, 1, hpdif); force_redraw = 255; - PlaySfxLoc(blodboilSFX[static_cast(plr[id]._pClass)], plr[id]._px, plr[id]._py); + plr[id].PlaySpeach(72); } else { - _sfx_id blodboilSFX[enum_size::value] = { - PS_WARR72, - PS_ROGUE72, - PS_MAGE72, - PS_MAGE72, - PS_ROGUE72, - PS_WARR72 - }; missile[i]._miDelFlag = true; plr[id]._pSpellFlags &= ~0x4; hpdif = plr[id]._pMaxHP - plr[id]._pHitPoints; CalcPlrItemVals(id, true); ApplyPlrDamage(id, 0, 1, hpdif + missile[i]._miVar2); force_redraw = 255; - PlaySfxLoc(blodboilSFX[static_cast(plr[id]._pClass)], plr[id]._px, plr[id]._py); + plr[id].PlaySpeach(72); } } } diff --git a/Source/objects.cpp b/Source/objects.cpp index 6ec57859f..0720e578d 100644 --- a/Source/objects.cpp +++ b/Source/objects.cpp @@ -2161,19 +2161,7 @@ void Obj_BCrossDamage(int i) ApplyPlrDamage(myplr, 0, 0, damage[leveltype - 1]); if (plr[myplr]._pHitPoints >> 6 > 0) { - if (plr[myplr]._pClass == HeroClass::Warrior) { - PlaySfxLoc(PS_WARR68, plr[myplr]._px, plr[myplr]._py); - } else if (plr[myplr]._pClass == HeroClass::Rogue) { - PlaySfxLoc(PS_ROGUE68, plr[myplr]._px, plr[myplr]._py); - } else if (plr[myplr]._pClass == HeroClass::Sorcerer) { - PlaySfxLoc(PS_MAGE68, plr[myplr]._px, plr[myplr]._py); - } else if (plr[myplr]._pClass == HeroClass::Monk) { - PlaySfxLoc(PS_MONK68, plr[myplr]._px, plr[myplr]._py); - } else if (plr[myplr]._pClass == HeroClass::Bard) { - PlaySfxLoc(PS_ROGUE68, plr[myplr]._px, plr[myplr]._py); - } else if (plr[myplr]._pClass == HeroClass::Barbarian) { - PlaySfxLoc(PS_WARR68, plr[myplr]._px, plr[myplr]._py); - } + plr[myplr].PlaySpeach(68); } } @@ -3187,19 +3175,7 @@ void OperateMushPatch(int pnum, int i) if (quests[Q_MUSHROOM]._qactive != QUEST_ACTIVE || quests[Q_MUSHROOM]._qvar1 < QS_TOMEGIVEN) { if (!deltaload && pnum == myplr) { - if (plr[myplr]._pClass == HeroClass::Warrior) { - PlaySFX(PS_WARR13); - } else if (plr[myplr]._pClass == HeroClass::Rogue) { - PlaySFX(PS_ROGUE13); - } else if (plr[myplr]._pClass == HeroClass::Sorcerer) { - PlaySFX(PS_MAGE13); - } else if (plr[myplr]._pClass == HeroClass::Monk) { - PlaySFX(PS_MONK13); - } else if (plr[myplr]._pClass == HeroClass::Bard) { - PlaySFX(PS_ROGUE13); - } else if (plr[myplr]._pClass == HeroClass::Barbarian) { - PlaySFX(PS_WARR13); - } + plr[myplr].PlaySpeach(13); } } else { if (object[i]._oSelFlag != 0) { @@ -3226,19 +3202,7 @@ void OperateInnSignChest(int pnum, int i) if (quests[Q_LTBANNER]._qvar1 != 2) { if (!deltaload && pnum == myplr) { - if (plr[myplr]._pClass == HeroClass::Warrior) { - PlaySFX(PS_WARR24); - } else if (plr[myplr]._pClass == HeroClass::Rogue) { - PlaySFX(PS_ROGUE24); - } else if (plr[myplr]._pClass == HeroClass::Sorcerer) { - PlaySFX(PS_MAGE24); - } else if (plr[myplr]._pClass == HeroClass::Monk) { - PlaySFX(PS_MONK24); - } else if (plr[myplr]._pClass == HeroClass::Bard) { - PlaySFX(PS_ROGUE24); - } else if (plr[myplr]._pClass == HeroClass::Barbarian) { - PlaySFX(PS_WARR24); - } + plr[myplr].PlaySpeach(24); } } else { if (object[i]._oSelFlag != 0) { @@ -3261,23 +3225,18 @@ void OperateSlainHero(int pnum, int i, bool sendmsg) if (!deltaload) { if (plr[pnum]._pClass == HeroClass::Warrior) { CreateMagicArmor(object[i]._ox, object[i]._oy, ITYPE_HARMOR, ICURS_BREAST_PLATE, false, true); - PlaySfxLoc(PS_WARR9, plr[myplr]._px, plr[myplr]._py); } else if (plr[pnum]._pClass == HeroClass::Rogue) { CreateMagicWeapon(object[i]._ox, object[i]._oy, ITYPE_BOW, ICURS_LONG_WAR_BOW, false, true); - PlaySfxLoc(PS_ROGUE9, plr[myplr]._px, plr[myplr]._py); } else if (plr[pnum]._pClass == HeroClass::Sorcerer) { CreateSpellBook(object[i]._ox, object[i]._oy, SPL_LIGHTNING, false, true); - PlaySfxLoc(PS_MAGE9, plr[myplr]._px, plr[myplr]._py); } else if (plr[pnum]._pClass == HeroClass::Monk) { CreateMagicWeapon(object[i]._ox, object[i]._oy, ITYPE_STAFF, ICURS_WAR_STAFF, false, true); - PlaySfxLoc(PS_MONK9, plr[myplr]._px, plr[myplr]._py); } else if (plr[pnum]._pClass == HeroClass::Bard) { CreateMagicWeapon(object[i]._ox, object[i]._oy, ITYPE_SWORD, ICURS_BASTARD_SWORD, false, true); - PlaySfxLoc(PS_ROGUE9, plr[myplr]._px, plr[myplr]._py); } else if (plr[pnum]._pClass == HeroClass::Barbarian) { CreateMagicWeapon(object[i]._ox, object[i]._oy, ITYPE_AXE, ICURS_BATTLE_AXE, false, true); - PlaySfxLoc(PS_WARR9, plr[myplr]._px, plr[myplr]._py); } + plr[myplr].PlaySpeach(9); if (pnum == myplr) NetSendCmdParam1(false, CMD_OPERATEOBJ, i); } diff --git a/Source/player.cpp b/Source/player.cpp index 5db877d09..eece2231f 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -242,6 +242,40 @@ void PlayerStruct::UpdateTargetPosition() } } +_sfx_id herosounds[enum_size::value][102] = { + // clang-format off + { PS_WARR1, PS_WARR2, PS_WARR3, PS_WARR4, PS_WARR5, PS_WARR6, PS_WARR7, PS_WARR8, PS_WARR9, PS_WARR10, PS_WARR11, PS_WARR12, PS_WARR13, PS_WARR14, PS_WARR15, PS_WARR16, PS_WARR17, PS_WARR18, PS_WARR19, PS_WARR20, PS_WARR21, PS_WARR22, PS_WARR23, PS_WARR24, PS_WARR25, PS_WARR26, PS_WARR27, PS_WARR28, PS_WARR29, PS_WARR30, PS_WARR31, PS_WARR32, PS_WARR33, PS_WARR34, PS_WARR35, PS_WARR36, PS_WARR37, PS_WARR38, PS_WARR39, PS_WARR40, PS_WARR41, PS_WARR42, PS_WARR43, PS_WARR44, PS_WARR45, PS_WARR46, PS_WARR47, PS_WARR48, PS_WARR49, PS_WARR50, PS_WARR51, PS_WARR52, PS_WARR53, PS_WARR54, PS_WARR55, PS_WARR56, PS_WARR57, PS_WARR58, PS_WARR59, PS_WARR60, PS_WARR61, PS_WARR62, PS_WARR63, PS_WARR64, PS_WARR65, PS_WARR66, PS_WARR67, PS_WARR68, PS_WARR69, PS_WARR70, PS_WARR71, PS_WARR72, PS_WARR73, PS_WARR74, PS_WARR75, PS_WARR76, PS_WARR77, PS_WARR78, PS_WARR79, PS_WARR80, PS_WARR81, PS_WARR82, PS_WARR83, PS_WARR84, PS_WARR85, PS_WARR86, PS_WARR87, PS_WARR88, PS_WARR89, PS_WARR90, PS_WARR91, PS_WARR92, PS_WARR93, PS_WARR94, PS_WARR95, PS_WARR96B, PS_WARR97, PS_WARR98, PS_WARR99, PS_WARR100, PS_WARR101, PS_WARR102 }, + { PS_ROGUE1, PS_ROGUE2, PS_ROGUE3, PS_ROGUE4, PS_ROGUE5, PS_ROGUE6, PS_ROGUE7, PS_ROGUE8, PS_ROGUE9, PS_ROGUE10, PS_ROGUE11, PS_ROGUE12, PS_ROGUE13, PS_ROGUE14, PS_ROGUE15, PS_ROGUE16, PS_ROGUE17, PS_ROGUE18, PS_ROGUE19, PS_ROGUE20, PS_ROGUE21, PS_ROGUE22, PS_ROGUE23, PS_ROGUE24, PS_ROGUE25, PS_ROGUE26, PS_ROGUE27, PS_ROGUE28, PS_ROGUE29, PS_ROGUE30, PS_ROGUE31, PS_ROGUE32, PS_ROGUE33, PS_ROGUE34, PS_ROGUE35, PS_ROGUE36, PS_ROGUE37, PS_ROGUE38, PS_ROGUE39, PS_ROGUE40, PS_ROGUE41, PS_ROGUE42, PS_ROGUE43, PS_ROGUE44, PS_ROGUE45, PS_ROGUE46, PS_ROGUE47, PS_ROGUE48, PS_ROGUE49, PS_ROGUE50, PS_ROGUE51, PS_ROGUE52, PS_ROGUE53, PS_ROGUE54, PS_ROGUE55, PS_ROGUE56, PS_ROGUE57, PS_ROGUE58, PS_ROGUE59, PS_ROGUE60, PS_ROGUE61, PS_ROGUE62, PS_ROGUE63, PS_ROGUE64, PS_ROGUE65, PS_ROGUE66, PS_ROGUE67, PS_ROGUE68, PS_ROGUE69, PS_ROGUE70, PS_ROGUE71, PS_ROGUE72, PS_ROGUE73, PS_ROGUE74, PS_ROGUE75, PS_ROGUE76, PS_ROGUE77, PS_ROGUE78, PS_ROGUE79, PS_ROGUE80, PS_ROGUE81, PS_ROGUE82, PS_ROGUE83, PS_ROGUE84, PS_ROGUE85, PS_ROGUE86, PS_ROGUE87, PS_ROGUE88, PS_ROGUE89, PS_ROGUE90, PS_ROGUE91, PS_ROGUE92, PS_ROGUE93, PS_ROGUE94, PS_ROGUE95, PS_ROGUE96, PS_ROGUE97, PS_ROGUE98, PS_ROGUE99, PS_ROGUE100, PS_ROGUE101, PS_ROGUE102 }, + { PS_MAGE1, PS_MAGE2, PS_MAGE3, PS_MAGE4, PS_MAGE5, PS_MAGE6, PS_MAGE7, PS_MAGE8, PS_MAGE9, PS_MAGE10, PS_MAGE11, PS_MAGE12, PS_MAGE13, PS_MAGE14, PS_MAGE15, PS_MAGE16, PS_MAGE17, PS_MAGE18, PS_MAGE19, PS_MAGE20, PS_MAGE21, PS_MAGE22, PS_MAGE23, PS_MAGE24, PS_MAGE25, PS_MAGE26, PS_MAGE27, PS_MAGE28, PS_MAGE29, PS_MAGE30, PS_MAGE31, PS_MAGE32, PS_MAGE33, PS_MAGE34, PS_MAGE35, PS_MAGE36, PS_MAGE37, PS_MAGE38, PS_MAGE39, PS_MAGE40, PS_MAGE41, PS_MAGE42, PS_MAGE43, PS_MAGE44, PS_MAGE45, PS_MAGE46, PS_MAGE47, PS_MAGE48, PS_MAGE49, PS_MAGE50, PS_MAGE51, PS_MAGE52, PS_MAGE53, PS_MAGE54, PS_MAGE55, PS_MAGE56, PS_MAGE57, PS_MAGE58, PS_MAGE59, PS_MAGE60, PS_MAGE61, PS_MAGE62, PS_MAGE63, PS_MAGE64, PS_MAGE65, PS_MAGE66, PS_MAGE67, PS_MAGE68, PS_MAGE69, PS_MAGE70, PS_MAGE71, PS_MAGE72, PS_MAGE73, PS_MAGE74, PS_MAGE75, PS_MAGE76, PS_MAGE77, PS_MAGE78, PS_MAGE79, PS_MAGE80, PS_MAGE81, PS_MAGE82, PS_MAGE83, PS_MAGE84, PS_MAGE85, PS_MAGE86, PS_MAGE87, PS_MAGE88, PS_MAGE89, PS_MAGE90, PS_MAGE91, PS_MAGE92, PS_MAGE93, PS_MAGE94, PS_MAGE95, PS_MAGE96, PS_MAGE97, PS_MAGE98, PS_MAGE99, PS_MAGE100, PS_MAGE101, PS_MAGE102 }, + { PS_MONK1, PS_MONK2, PS_MONK3, PS_MONK4, PS_MONK5, PS_MONK6, PS_MONK7, PS_MONK8, PS_MONK9, PS_MONK10, PS_MONK11, PS_MONK12, PS_MONK13, PS_MONK14, PS_MONK15, PS_MONK16, PS_MONK17, PS_MONK18, PS_MONK19, PS_MONK20, PS_MONK21, PS_MONK22, PS_MONK23, PS_MONK24, PS_MONK25, PS_MONK26, PS_MONK27, PS_MONK28, PS_MONK29, PS_MONK30, PS_MONK31, PS_MONK32, PS_MONK33, PS_MONK34, PS_MONK35, PS_MONK36, PS_MONK37, PS_MONK38, PS_MONK39, PS_MONK40, PS_MONK41, PS_MONK42, PS_MONK43, PS_MONK44, PS_MONK45, PS_MONK46, PS_MONK47, PS_MONK48, PS_MONK49, PS_MONK50, PS_MONK51, PS_MONK52, PS_MONK53, PS_MONK54, PS_MONK55, PS_MONK56, PS_MONK57, PS_MONK58, PS_MONK59, PS_MONK60, PS_MONK61, PS_MONK62, PS_MONK63, PS_MONK64, PS_MONK65, PS_MONK66, PS_MONK67, PS_MONK68, PS_MONK69, PS_MONK70, PS_MONK71, PS_MONK72, PS_MONK73, PS_MONK74, PS_MONK75, PS_MONK76, PS_MONK77, PS_MONK78, PS_MONK79, PS_MONK80, PS_MONK81, PS_MONK82, PS_MONK83, PS_MONK84, PS_MONK85, PS_MONK86, PS_MONK87, PS_MONK88, PS_MONK89, PS_MONK90, PS_MONK91, PS_MONK92, PS_MONK93, PS_MONK94, PS_MONK95, PS_MONK96, PS_MONK97, PS_MONK98, PS_MONK99, PS_MONK100, PS_MONK101, PS_MONK102 }, + { PS_ROGUE1, PS_ROGUE2, PS_ROGUE3, PS_ROGUE4, PS_ROGUE5, PS_ROGUE6, PS_ROGUE7, PS_ROGUE8, PS_ROGUE9, PS_ROGUE10, PS_ROGUE11, PS_ROGUE12, PS_ROGUE13, PS_ROGUE14, PS_ROGUE15, PS_ROGUE16, PS_ROGUE17, PS_ROGUE18, PS_ROGUE19, PS_ROGUE20, PS_ROGUE21, PS_ROGUE22, PS_ROGUE23, PS_ROGUE24, PS_ROGUE25, PS_ROGUE26, PS_ROGUE27, PS_ROGUE28, PS_ROGUE29, PS_ROGUE30, PS_ROGUE31, PS_ROGUE32, PS_ROGUE33, PS_ROGUE34, PS_ROGUE35, PS_ROGUE36, PS_ROGUE37, PS_ROGUE38, PS_ROGUE39, PS_ROGUE40, PS_ROGUE41, PS_ROGUE42, PS_ROGUE43, PS_ROGUE44, PS_ROGUE45, PS_ROGUE46, PS_ROGUE47, PS_ROGUE48, PS_ROGUE49, PS_ROGUE50, PS_ROGUE51, PS_ROGUE52, PS_ROGUE53, PS_ROGUE54, PS_ROGUE55, PS_ROGUE56, PS_ROGUE57, PS_ROGUE58, PS_ROGUE59, PS_ROGUE60, PS_ROGUE61, PS_ROGUE62, PS_ROGUE63, PS_ROGUE64, PS_ROGUE65, PS_ROGUE66, PS_ROGUE67, PS_ROGUE68, PS_ROGUE69, PS_ROGUE70, PS_ROGUE71, PS_ROGUE72, PS_ROGUE73, PS_ROGUE74, PS_ROGUE75, PS_ROGUE76, PS_ROGUE77, PS_ROGUE78, PS_ROGUE79, PS_ROGUE80, PS_ROGUE81, PS_ROGUE82, PS_ROGUE83, PS_ROGUE84, PS_ROGUE85, PS_ROGUE86, PS_ROGUE87, PS_ROGUE88, PS_ROGUE89, PS_ROGUE90, PS_ROGUE91, PS_ROGUE92, PS_ROGUE93, PS_ROGUE94, PS_ROGUE95, PS_ROGUE96, PS_ROGUE97, PS_ROGUE98, PS_ROGUE99, PS_ROGUE100, PS_ROGUE101, PS_ROGUE102 }, + { PS_WARR1, PS_WARR2, PS_WARR3, PS_WARR4, PS_WARR5, PS_WARR6, PS_WARR7, PS_WARR8, PS_WARR9, PS_WARR10, PS_WARR11, PS_WARR12, PS_WARR13, PS_WARR14, PS_WARR15, PS_WARR16, PS_WARR17, PS_WARR18, PS_WARR19, PS_WARR20, PS_WARR21, PS_WARR22, PS_WARR23, PS_WARR24, PS_WARR25, PS_WARR26, PS_WARR27, PS_WARR28, PS_WARR29, PS_WARR30, PS_WARR31, PS_WARR32, PS_WARR33, PS_WARR34, PS_WARR35, PS_WARR36, PS_WARR37, PS_WARR38, PS_WARR39, PS_WARR40, PS_WARR41, PS_WARR42, PS_WARR43, PS_WARR44, PS_WARR45, PS_WARR46, PS_WARR47, PS_WARR48, PS_WARR49, PS_WARR50, PS_WARR51, PS_WARR52, PS_WARR53, PS_WARR54, PS_WARR55, PS_WARR56, PS_WARR57, PS_WARR58, PS_WARR59, PS_WARR60, PS_WARR61, PS_WARR62, PS_WARR63, PS_WARR64, PS_WARR65, PS_WARR66, PS_WARR67, PS_WARR68, PS_WARR69, PS_WARR70, PS_WARR71, PS_WARR72, PS_WARR73, PS_WARR74, PS_WARR75, PS_WARR76, PS_WARR77, PS_WARR78, PS_WARR79, PS_WARR80, PS_WARR81, PS_WARR82, PS_WARR83, PS_WARR84, PS_WARR85, PS_WARR86, PS_WARR87, PS_WARR88, PS_WARR89, PS_WARR90, PS_WARR91, PS_WARR92, PS_WARR93, PS_WARR94, PS_WARR95, PS_WARR96B, PS_WARR97, PS_WARR98, PS_WARR99, PS_WARR100, PS_WARR101, PS_WARR102 }, + // clang-format on +}; + +void PlayerStruct::PlaySpeach(int speachId) const +{ + _sfx_id soundEffect = herosounds[static_cast(_pClass)][speachId - 1]; + + PlaySfxLoc(soundEffect, _px, _py); +} + +void PlayerStruct::PlaySpecificSpeach(int speachId) const +{ + _sfx_id soundEffect = herosounds[static_cast(_pClass)][speachId - 1]; + + if (effect_is_playing(soundEffect)) + return; + + PlaySfxLoc(soundEffect, _px, _py, false); +} + +void PlayerStruct::PlaySpeach(int speachId, int delay) const +{ + sfxdelay = delay; + sfxdnum = herosounds[static_cast(_pClass)][speachId - 1]; +} + void SetPlayerGPtrs(BYTE *pData, BYTE **pAnim) { int i; @@ -1655,19 +1689,7 @@ void StartPlrHit(int pnum, int dam, bool forcehit) return; } - if (plr[pnum]._pClass == HeroClass::Warrior) { - PlaySfxLoc(PS_WARR69, plr[pnum]._px, plr[pnum]._py); - } else if (plr[pnum]._pClass == HeroClass::Rogue) { - PlaySfxLoc(PS_ROGUE69, plr[pnum]._px, plr[pnum]._py); - } else if (plr[pnum]._pClass == HeroClass::Sorcerer) { - PlaySfxLoc(PS_MAGE69, plr[pnum]._px, plr[pnum]._py); - } else if (plr[pnum]._pClass == HeroClass::Monk) { - PlaySfxLoc(PS_MONK69, plr[pnum]._px, plr[pnum]._py); - } else if (plr[pnum]._pClass == HeroClass::Bard) { - PlaySfxLoc(PS_ROGUE69, plr[pnum]._px, plr[pnum]._py); - } else if (plr[pnum]._pClass == HeroClass::Barbarian) { - PlaySfxLoc(PS_WARR69, plr[pnum]._px, plr[pnum]._py); - } + plr[pnum].PlaySpeach(69); drawhpflag = true; if (plr[pnum]._pClass == HeroClass::Barbarian) { @@ -1788,19 +1810,7 @@ StartPlayerKill(int pnum, int earflag) app_fatal("StartPlayerKill: illegal player %d", pnum); } - if (plr[pnum]._pClass == HeroClass::Warrior) { - PlaySfxLoc(PS_DEAD, p->_px, p->_py); // BUGFIX: should use `PS_WARR71` like other classes - } else if (plr[pnum]._pClass == HeroClass::Rogue) { - PlaySfxLoc(PS_ROGUE71, p->_px, p->_py); - } else if (plr[pnum]._pClass == HeroClass::Sorcerer) { - PlaySfxLoc(PS_MAGE71, p->_px, p->_py); - } else if (plr[pnum]._pClass == HeroClass::Monk) { - PlaySfxLoc(PS_MONK71, p->_px, p->_py); - } else if (plr[pnum]._pClass == HeroClass::Bard) { - PlaySfxLoc(PS_ROGUE71, p->_px, p->_py); - } else if (plr[pnum]._pClass == HeroClass::Barbarian) { - PlaySfxLoc(PS_WARR71, p->_px, p->_py); - } + plr[pnum].PlaySpeach(71); if (p->_pgfxnum) { p->_pgfxnum = 0; @@ -3879,36 +3889,12 @@ void CheckPlrSpell() spell_id rspell = plr[myplr]._pRSpell; if (rspell == SPL_INVALID) { - if (plr[myplr]._pClass == HeroClass::Warrior) { - PlaySFX(PS_WARR34); - } else if (plr[myplr]._pClass == HeroClass::Rogue) { - PlaySFX(PS_ROGUE34); - } else if (plr[myplr]._pClass == HeroClass::Sorcerer) { - PlaySFX(PS_MAGE34); - } else if (plr[myplr]._pClass == HeroClass::Monk) { - PlaySFX(PS_MONK34); - } else if (plr[myplr]._pClass == HeroClass::Bard) { - PlaySFX(PS_ROGUE34); - } else if (plr[myplr]._pClass == HeroClass::Barbarian) { - PlaySFX(PS_WARR34); - } + plr[myplr].PlaySpeach(34); return; } if (leveltype == DTYPE_TOWN && !spelldata[rspell].sTownSpell) { - if (plr[myplr]._pClass == HeroClass::Warrior) { - PlaySFX(PS_WARR27); - } else if (plr[myplr]._pClass == HeroClass::Rogue) { - PlaySFX(PS_ROGUE27); - } else if (plr[myplr]._pClass == HeroClass::Sorcerer) { - PlaySFX(PS_MAGE27); - } else if (plr[myplr]._pClass == HeroClass::Monk) { - PlaySFX(PS_MONK27); - } else if (plr[myplr]._pClass == HeroClass::Bard) { - PlaySFX(PS_ROGUE27); - } else if (plr[myplr]._pClass == HeroClass::Barbarian) { - PlaySFX(PS_WARR27); - } + plr[myplr].PlaySpeach(27); return; } @@ -3966,19 +3952,7 @@ void CheckPlrSpell() } if (plr[myplr]._pRSplType == RSPLTYPE_SPELL) { - if (plr[myplr]._pClass == HeroClass::Warrior) { - PlaySFX(PS_WARR35); - } else if (plr[myplr]._pClass == HeroClass::Rogue) { - PlaySFX(PS_ROGUE35); - } else if (plr[myplr]._pClass == HeroClass::Sorcerer) { - PlaySFX(PS_MAGE35); - } else if (plr[myplr]._pClass == HeroClass::Monk) { - PlaySFX(PS_MONK35); - } else if (plr[myplr]._pClass == HeroClass::Bard) { - PlaySFX(PS_ROGUE35); - } else if (plr[myplr]._pClass == HeroClass::Barbarian) { - PlaySFX(PS_WARR35); - } + plr[myplr].PlaySpeach(35); } } @@ -4383,74 +4357,20 @@ void PlayDungMsgs() } if (currlevel == 1 && !plr[myplr]._pLvlVisited[1] && !gbIsMultiplayer && !(plr[myplr].pDungMsgs & DMSG_CATHEDRAL)) { - sfxdelay = 40; - if (plr[myplr]._pClass == HeroClass::Warrior) { - sfxdnum = PS_WARR97; - } else if (plr[myplr]._pClass == HeroClass::Rogue) { - sfxdnum = PS_ROGUE97; - } else if (plr[myplr]._pClass == HeroClass::Sorcerer) { - sfxdnum = PS_MAGE97; - } else if (plr[myplr]._pClass == HeroClass::Monk) { - sfxdnum = PS_MONK97; - } else if (plr[myplr]._pClass == HeroClass::Bard) { - sfxdnum = PS_ROGUE97; - } else if (plr[myplr]._pClass == HeroClass::Barbarian) { - sfxdnum = PS_WARR97; - } + plr[myplr].PlaySpeach(97, 40); plr[myplr].pDungMsgs = plr[myplr].pDungMsgs | DMSG_CATHEDRAL; } else if (currlevel == 5 && !plr[myplr]._pLvlVisited[5] && !gbIsMultiplayer && !(plr[myplr].pDungMsgs & DMSG_CATACOMBS)) { - sfxdelay = 40; - if (plr[myplr]._pClass == HeroClass::Warrior) { - sfxdnum = PS_WARR96B; - } else if (plr[myplr]._pClass == HeroClass::Rogue) { - sfxdnum = PS_ROGUE96; - } else if (plr[myplr]._pClass == HeroClass::Sorcerer) { - sfxdnum = PS_MAGE96; - } else if (plr[myplr]._pClass == HeroClass::Monk) { - sfxdnum = PS_MONK96; - } else if (plr[myplr]._pClass == HeroClass::Bard) { - sfxdnum = PS_ROGUE96; - } else if (plr[myplr]._pClass == HeroClass::Barbarian) { - sfxdnum = PS_WARR96B; - } + plr[myplr].PlaySpeach(96, 40); plr[myplr].pDungMsgs |= DMSG_CATACOMBS; } else if (currlevel == 9 && !plr[myplr]._pLvlVisited[9] && !gbIsMultiplayer && !(plr[myplr].pDungMsgs & DMSG_CAVES)) { - sfxdelay = 40; - if (plr[myplr]._pClass == HeroClass::Warrior) { - sfxdnum = PS_WARR98; - } else if (plr[myplr]._pClass == HeroClass::Rogue) { - sfxdnum = PS_ROGUE98; - } else if (plr[myplr]._pClass == HeroClass::Sorcerer) { - sfxdnum = PS_MAGE98; - } else if (plr[myplr]._pClass == HeroClass::Monk) { - sfxdnum = PS_MONK98; - } else if (plr[myplr]._pClass == HeroClass::Bard) { - sfxdnum = PS_ROGUE98; - } else if (plr[myplr]._pClass == HeroClass::Barbarian) { - sfxdnum = PS_WARR98; - } + plr[myplr].PlaySpeach(98, 40); plr[myplr].pDungMsgs |= DMSG_CAVES; } else if (currlevel == 13 && !plr[myplr]._pLvlVisited[13] && !gbIsMultiplayer && !(plr[myplr].pDungMsgs & DMSG_HELL)) { - sfxdelay = 40; - if (plr[myplr]._pClass == HeroClass::Warrior) { - sfxdnum = PS_WARR99; - } else if (plr[myplr]._pClass == HeroClass::Rogue) { - sfxdnum = PS_ROGUE99; - } else if (plr[myplr]._pClass == HeroClass::Sorcerer) { - sfxdnum = PS_MAGE99; - } else if (plr[myplr]._pClass == HeroClass::Monk) { - sfxdnum = PS_MONK99; - } else if (plr[myplr]._pClass == HeroClass::Bard) { - sfxdnum = PS_ROGUE99; - } else if (plr[myplr]._pClass == HeroClass::Barbarian) { - sfxdnum = PS_WARR99; - } + plr[myplr].PlaySpeach(99, 40); plr[myplr].pDungMsgs |= DMSG_HELL; } else if (currlevel == 16 && !plr[myplr]._pLvlVisited[15] && !gbIsMultiplayer && !(plr[myplr].pDungMsgs & DMSG_DIABLO)) { // BUGFIX: _pLvlVisited should check 16 or this message will never play sfxdelay = 40; - if (plr[myplr]._pClass == HeroClass::Warrior || plr[myplr]._pClass == HeroClass::Rogue || plr[myplr]._pClass == HeroClass::Sorcerer || plr[myplr]._pClass == HeroClass::Monk || plr[myplr]._pClass == HeroClass::Bard || plr[myplr]._pClass == HeroClass::Barbarian) { - sfxdnum = PS_DIABLVLINT; - } + sfxdnum = PS_DIABLVLINT; plr[myplr].pDungMsgs |= DMSG_DIABLO; } else if (currlevel == 17 && !plr[myplr]._pLvlVisited[17] && !gbIsMultiplayer && !(plr[myplr].pDungMsgs2 & 1)) { sfxdelay = 10; @@ -4464,20 +4384,7 @@ void PlayDungMsgs() sfxdnum = USFX_DEFILER3; plr[myplr].pDungMsgs2 |= 4; } else if (currlevel == 21 && !plr[myplr]._pLvlVisited[21] && !gbIsMultiplayer && !(plr[myplr].pDungMsgs & 32)) { - sfxdelay = 30; - if (plr[myplr]._pClass == HeroClass::Warrior) { - sfxdnum = PS_WARR92; - } else if (plr[myplr]._pClass == HeroClass::Rogue) { - sfxdnum = PS_ROGUE92; - } else if (plr[myplr]._pClass == HeroClass::Sorcerer) { - sfxdnum = PS_MAGE92; - } else if (plr[myplr]._pClass == HeroClass::Monk) { - sfxdnum = PS_MONK92; - } else if (plr[myplr]._pClass == HeroClass::Bard) { - sfxdnum = PS_ROGUE92; - } else if (plr[myplr]._pClass == HeroClass::Barbarian) { - sfxdnum = PS_WARR92; - } + plr[myplr].PlaySpeach(92, 30); plr[myplr].pDungMsgs |= 32; } else { sfxdelay = 0; diff --git a/Source/player.h b/Source/player.h index b553d8d45..cbe33dc99 100644 --- a/Source/player.h +++ b/Source/player.h @@ -375,6 +375,22 @@ struct PlayerStruct { * @brief Update tile coordinates a player is moving to (if not moving, then it corresponds to current position). */ void UpdateTargetPosition(); + + /** + * @brief Play a speach file. + * @todo Create enum for speachId + * @todo BUGFIX Prevent more then one speach to be played at a time (reject new requests). + */ + void PlaySpeach(int speachId) const; + /** + * @brief Play a speach file after a given delay. + * @param delay Multiple of 20ms waith before starting the speach + */ + void PlaySpeach(int speachId, int delay) const; + /** + * @brief Play a player speach file, with out random variants. + */ + void PlaySpecificSpeach(int speachId) const; }; extern int myplr; diff --git a/Source/quests.cpp b/Source/quests.cpp index 32ea924c3..5eca86141 100644 --- a/Source/quests.cpp +++ b/Source/quests.cpp @@ -315,77 +315,24 @@ void CheckQuestKill(int m, bool sendmsg) if (monster[m].MType->mtype == MT_SKING) { quests[Q_SKELKING]._qactive = QUEST_DONE; - sfxdelay = 30; - if (plr[myplr]._pClass == HeroClass::Warrior) { - sfxdnum = PS_WARR82; - } else if (plr[myplr]._pClass == HeroClass::Rogue) { - sfxdnum = PS_ROGUE82; - } else if (plr[myplr]._pClass == HeroClass::Sorcerer) { - sfxdnum = PS_MAGE82; - } else if (plr[myplr]._pClass == HeroClass::Monk) { - sfxdnum = PS_MONK82; - } else if (plr[myplr]._pClass == HeroClass::Bard) { - sfxdnum = PS_ROGUE82; - } else if (plr[myplr]._pClass == HeroClass::Barbarian) { - sfxdnum = PS_WARR82; - } + plr[myplr].PlaySpeach(82, 30); if (sendmsg) NetSendCmdQuest(true, Q_SKELKING); } else if (monster[m].MType->mtype == MT_CLEAVER) { quests[Q_BUTCHER]._qactive = QUEST_DONE; - sfxdelay = 30; - if (plr[myplr]._pClass == HeroClass::Warrior) { - sfxdnum = PS_WARR80; - } else if (plr[myplr]._pClass == HeroClass::Rogue) { - sfxdnum = PS_ROGUE80; - } else if (plr[myplr]._pClass == HeroClass::Sorcerer) { - sfxdnum = PS_MAGE80; - } else if (plr[myplr]._pClass == HeroClass::Monk) { - sfxdnum = PS_MONK80; - } else if (plr[myplr]._pClass == HeroClass::Bard) { - sfxdnum = PS_ROGUE80; - } else if (plr[myplr]._pClass == HeroClass::Barbarian) { - sfxdnum = PS_WARR80; - } + plr[myplr].PlaySpeach(80, 30); if (sendmsg) NetSendCmdQuest(true, Q_BUTCHER); } else if (monster[m]._uniqtype - 1 == UMT_GARBUD) { //"Gharbad the Weak" quests[Q_GARBUD]._qactive = QUEST_DONE; - sfxdelay = 30; - if (plr[myplr]._pClass == HeroClass::Warrior) { - sfxdnum = PS_WARR61; - } else if (plr[myplr]._pClass == HeroClass::Rogue) { - sfxdnum = PS_ROGUE61; - } else if (plr[myplr]._pClass == HeroClass::Sorcerer) { - sfxdnum = PS_MAGE61; - } else if (plr[myplr]._pClass == HeroClass::Monk) { - sfxdnum = PS_MONK61; - } else if (plr[myplr]._pClass == HeroClass::Bard) { - sfxdnum = PS_ROGUE61; - } else if (plr[myplr]._pClass == HeroClass::Barbarian) { - sfxdnum = PS_WARR61; - } + plr[myplr].PlaySpeach(61, 30); } else if (monster[m]._uniqtype - 1 == UMT_ZHAR) { //"Zhar the Mad" quests[Q_ZHAR]._qactive = QUEST_DONE; - sfxdelay = 30; - if (plr[myplr]._pClass == HeroClass::Warrior) { - sfxdnum = PS_WARR62; - } else if (plr[myplr]._pClass == HeroClass::Rogue) { - sfxdnum = PS_ROGUE62; - } else if (plr[myplr]._pClass == HeroClass::Sorcerer) { - sfxdnum = PS_MAGE62; - } else if (plr[myplr]._pClass == HeroClass::Monk) { - sfxdnum = PS_MONK62; - } else if (plr[myplr]._pClass == HeroClass::Bard) { - sfxdnum = PS_ROGUE62; - } else if (plr[myplr]._pClass == HeroClass::Barbarian) { - sfxdnum = PS_WARR62; - } + plr[myplr].PlaySpeach(62, 30); } else if (monster[m]._uniqtype - 1 == UMT_LAZURUS && gbIsMultiplayer) { //"Arch-Bishop Lazarus" quests[Q_BETRAYER]._qactive = QUEST_DONE; quests[Q_BETRAYER]._qvar1 = 7; - sfxdelay = 30; quests[Q_DIABLO]._qactive = QUEST_ACTIVE; for (j = 0; j < MAXDUNY; j++) { @@ -398,60 +345,22 @@ void CheckQuestKill(int m, bool sendmsg) } } } - if (plr[myplr]._pClass == HeroClass::Warrior) { - sfxdnum = PS_WARR83; - } else if (plr[myplr]._pClass == HeroClass::Rogue) { - sfxdnum = PS_ROGUE83; - } else if (plr[myplr]._pClass == HeroClass::Sorcerer) { - sfxdnum = PS_MAGE83; - } else if (plr[myplr]._pClass == HeroClass::Monk) { - sfxdnum = PS_MONK83; - } else if (plr[myplr]._pClass == HeroClass::Bard) { - sfxdnum = PS_ROGUE83; - } else if (plr[myplr]._pClass == HeroClass::Barbarian) { - sfxdnum = PS_WARR83; - } + plr[myplr].PlaySpeach(83, 30); if (sendmsg) { NetSendCmdQuest(true, Q_BETRAYER); NetSendCmdQuest(true, Q_DIABLO); } } else if (monster[m]._uniqtype - 1 == UMT_LAZURUS && !gbIsMultiplayer) { //"Arch-Bishop Lazarus" quests[Q_BETRAYER]._qactive = QUEST_DONE; - sfxdelay = 30; InitVPTriggers(); quests[Q_BETRAYER]._qvar1 = 7; quests[Q_BETRAYER]._qvar2 = 4; quests[Q_DIABLO]._qactive = QUEST_ACTIVE; AddMissile(35, 32, 35, 32, 0, MIS_RPORTAL, TARGET_MONSTERS, myplr, 0, 0); - if (plr[myplr]._pClass == HeroClass::Warrior) { - sfxdnum = PS_WARR83; - } else if (plr[myplr]._pClass == HeroClass::Rogue) { - sfxdnum = PS_ROGUE83; - } else if (plr[myplr]._pClass == HeroClass::Sorcerer) { - sfxdnum = PS_MAGE83; - } else if (plr[myplr]._pClass == HeroClass::Monk) { - sfxdnum = PS_MONK83; - } else if (plr[myplr]._pClass == HeroClass::Bard) { - sfxdnum = PS_ROGUE83; - } else if (plr[myplr]._pClass == HeroClass::Barbarian) { - sfxdnum = PS_WARR83; - } + plr[myplr].PlaySpeach(83, 30); } else if (monster[m]._uniqtype - 1 == UMT_WARLORD) { //"Warlord of Blood" quests[Q_WARLORD]._qactive = QUEST_DONE; - sfxdelay = 30; - if (plr[myplr]._pClass == HeroClass::Warrior) { - sfxdnum = PS_WARR94; - } else if (plr[myplr]._pClass == HeroClass::Rogue) { - sfxdnum = PS_ROGUE94; - } else if (plr[myplr]._pClass == HeroClass::Sorcerer) { - sfxdnum = PS_MAGE94; - } else if (plr[myplr]._pClass == HeroClass::Monk) { - sfxdnum = PS_MONK94; - } else if (plr[myplr]._pClass == HeroClass::Bard) { - sfxdnum = PS_ROGUE94; - } else if (plr[myplr]._pClass == HeroClass::Barbarian) { - sfxdnum = PS_WARR94; - } + plr[myplr].PlaySpeach(94, 30); } } diff --git a/Source/towners.cpp b/Source/towners.cpp index a763ff302..f5e21a043 100644 --- a/Source/towners.cpp +++ b/Source/towners.cpp @@ -818,19 +818,7 @@ void TalkToTowner(int p, int t) towners[t]._tbtcnt = true; towners[t]._tTalkingToPlayer = p; quests[Q_BUTCHER]._qvar1 = 1; - if (plr[p]._pClass == HeroClass::Warrior && !effect_is_playing(PS_WARR8)) { - PlaySFX(PS_WARR8); - } else if (plr[p]._pClass == HeroClass::Rogue && !effect_is_playing(PS_ROGUE8)) { - PlaySFX(PS_ROGUE8); - } else if (plr[p]._pClass == HeroClass::Sorcerer && !effect_is_playing(PS_MAGE8)) { - PlaySFX(PS_MAGE8); - } else if (plr[p]._pClass == HeroClass::Monk && !effect_is_playing(PS_MONK8)) { - PlaySFX(PS_MONK8); - } else if (plr[p]._pClass == HeroClass::Bard && !effect_is_playing(PS_ROGUE8)) { - PlaySFX(PS_ROGUE8); - } else if (plr[p]._pClass == HeroClass::Barbarian && !effect_is_playing(PS_WARR8)) { - PlaySFX(PS_WARR8); - } + plr[p].PlaySpecificSpeach(8); towners[t]._tMsgSaid = true; } else if (quests[Q_BUTCHER]._qactive == QUEST_DONE && quests[Q_BUTCHER]._qvar1 == 1) { quests[Q_BUTCHER]._qvar1 = 1; diff --git a/Source/trigs.cpp b/Source/trigs.cpp index 7f41eb828..ea48dd469 100644 --- a/Source/trigs.cpp +++ b/Source/trigs.cpp @@ -893,19 +893,7 @@ void CheckTriggers() } if (abort) { - if (plr[myplr]._pClass == HeroClass::Warrior) { - PlaySFX(PS_WARR43); - } else if (plr[myplr]._pClass == HeroClass::Rogue) { - PlaySFX(PS_ROGUE43); - } else if (plr[myplr]._pClass == HeroClass::Sorcerer) { - PlaySFX(PS_MAGE43); - } else if (plr[myplr]._pClass == HeroClass::Monk) { - PlaySFX(PS_MONK43); - } else if (plr[myplr]._pClass == HeroClass::Bard) { - PlaySFX(PS_ROGUE43); - } else if (plr[myplr]._pClass == HeroClass::Barbarian) { - PlaySFX(PS_WARR43); - } + plr[myplr].PlaySpeach(43); InitDiabloMsg(abortflag); NetSendCmdLoc(myplr, true, CMD_WALKXY, x, y);