summaryrefslogtreecommitdiffstats
path: root/src/audio
diff options
context:
space:
mode:
Diffstat (limited to 'src/audio')
-rw-r--r--src/audio/AudioManager.cpp618
-rw-r--r--src/audio/AudioManager.h34
-rw-r--r--src/audio/AudioSamples.h173
-rw-r--r--src/audio/DMAudio.h4
4 files changed, 609 insertions, 220 deletions
diff --git a/src/audio/AudioManager.cpp b/src/audio/AudioManager.cpp
index 1bcd98ae..205a3f90 100644
--- a/src/audio/AudioManager.cpp
+++ b/src/audio/AudioManager.cpp
@@ -1,8 +1,12 @@
+#include "AudioManager.h"
+#include "DMAudio.h"
+#include "Ped.h"
+#include "PlayerPed.h"
+#include "World.h"
#include "common.h"
#include "patcher.h"
-#include "AudioManager.h"
-cAudioManager &AudioManager = *(cAudioManager*)0x880FC0;
+cAudioManager &AudioManager = *(cAudioManager *)0x880FC0;
void
cAudioManager::PlayerJustLeftCar(void)
@@ -11,26 +15,25 @@ cAudioManager::PlayerJustLeftCar(void)
}
void
-cAudioManager::GetPhrase(eAudioSamples *phrase, eAudioSamples *prevPhrase,
- eAudioSamples sample, uint32 maxOffset)
-{
- *phrase = eAudioSamples(
- sample +
- (uint32)m_anRandomTable[m_sQueueSample.m_nEntityIndex & 3] %
- maxOffset);
- if(*phrase == *prevPhrase &&
- ++*(uint32 *)phrase >= (uint32)sample + maxOffset)
+cAudioManager::GetPhrase(uint32 *phrase, uint32 *prevPhrase, uint32 sample,
+ uint32 maxOffset)
+{
+ *phrase = sample + m_anRandomTable[m_sQueueSample.m_nEntityIndex & 3] %
+ maxOffset;
+
+ // check if the same sfx like last time, if yes, then try use next one,
+ // if exceeded range, then choose first available sample
+ if(*phrase == *prevPhrase && ++*phrase >= sample + maxOffset)
*phrase = sample;
*prevPhrase = *phrase;
}
-static bool &bUsedPlayerTalkSfx = *(bool *)0x6508f4;
-static eAudioSamples &lastPlayerTalkSfx = *(eAudioSamples *)0x6508f0;
-
uint32
-cAudioManager::GetPlayerTalkSfx(eSound sound)
+cAudioManager::GetPlayerTalkSfx(int16 sound)
{
- eAudioSamples sfx;
+ uint32 sfx;
+ static bool &bUsedPlayerTalkSfx = *(bool *)0x6508f4;
+ static uint32 &lastPlayerTalkSfx = *(uint32 *)0x6508f0;
if(!bUsedPlayerTalkSfx) {
bUsedPlayerTalkSfx = true;
@@ -38,19 +41,18 @@ cAudioManager::GetPlayerTalkSfx(eSound sound)
}
switch(sound) {
case SOUND_PED_DAMAGE:
- cAudioManager::GetPhrase(&sfx, &lastPlayerTalkSfx,
- AUDIO_SAMPLE_PED_DAMAGE_REACTION_1,
- 11u);
+ GetPhrase(&sfx, &lastPlayerTalkSfx,
+ AUDIO_SAMPLE_PED_DAMAGE_REACTION_1, 11u);
break;
case SOUND_PED_HIT:
- cAudioManager::GetPhrase(&sfx, &lastPlayerTalkSfx,
- AUDIO_SAMPLE_PED_HIT_REACTION_1, 10u);
+ GetPhrase(&sfx, &lastPlayerTalkSfx,
+ AUDIO_SAMPLE_PED_HIT_REACTION_1, 10u);
break;
case SOUND_PED_LAND:
- cAudioManager::GetPhrase(&sfx, &lastPlayerTalkSfx,
- AUDIO_SAMPLE_PED_FALL_REACTION_1, 6u);
+ GetPhrase(&sfx, &lastPlayerTalkSfx,
+ AUDIO_SAMPLE_PED_FALL_REACTION_1, 6u);
break;
default: sfx = NO_SAMPLE; break;
@@ -58,13 +60,537 @@ cAudioManager::GetPlayerTalkSfx(eSound sound)
return sfx;
}
-static bool &bUsedGenericMaleTalkSfx = *(bool *)0x650B0C;
-static eAudioSamples &lastGenericMaleTalkSfx = *(eAudioSamples *)0x650B08;
+uint32
+cAudioManager::GetCopTalkSfx(int16 sample)
+{
+ uint32 sfx;
+ PedState pedState;
+ static bool &bUsedCopTalkSfx = *(bool *)0x6508FC;
+ static uint32 &lastCopTalkSfx = *(uint32 *)0x6508F8;
+
+ if(!bUsedCopTalkSfx) {
+ bUsedCopTalkSfx = 1;
+ lastCopTalkSfx = NO_SAMPLE;
+ }
+
+ if(sample == SOUND_PED_ARREST_COP) {
+ GetPhrase(&sfx, &lastCopTalkSfx,
+ AUDIO_SAMPLE_POLICE_COP_1_ARREST_1, 6u);
+ } else {
+ if(sample != SOUND_PED_PURSUIT_COP) {
+ return cAudioManager::GetGenericMaleTalkSfx(sample);
+ }
+
+ pedState = FindPlayerPed()->m_nPedState;
+ if(pedState == PED_ARRESTED || pedState == PED_DEAD ||
+ pedState == PED_DIE)
+ return NO_SAMPLE;
+ GetPhrase(&sfx, &lastCopTalkSfx,
+ AUDIO_SAMPLE_POLICE_COP_1_PURSUIT_1, 7u);
+ }
+
+ return 13 * (m_sQueueSample.m_nEntityIndex % 5) + sfx;
+}
+
+uint32
+cAudioManager::GetSwatTalkSfx(int16 sample)
+{
+ uint32 sfx;
+ PedState pedState;
+ static bool &bUsedSwatTalkSfx = *(bool *)0x650904;
+ static uint32 &lastSwatTalkSfx = *(uint32 *)0x650900;
+
+ if(!bUsedSwatTalkSfx) {
+ bUsedSwatTalkSfx = 1;
+ lastSwatTalkSfx = NO_SAMPLE;
+ }
+
+ if(sample == SOUND_PED_ARREST_SWAT) {
+ GetPhrase(&sfx, &lastSwatTalkSfx,
+ AUDIO_SAMPLE_POLICE_SWAT_1_PURSUIT_ARREST_1, 6u);
+ } else {
+ if(sample != SOUND_PED_PURSUIT_SWAT) {
+ return cAudioManager::GetGenericMaleTalkSfx(sample);
+ }
+
+ pedState = FindPlayerPed()->m_nPedState;
+ if(pedState == PED_ARRESTED || pedState == PED_DEAD ||
+ pedState == PED_DIE)
+ return NO_SAMPLE;
+ GetPhrase(&sfx, &lastSwatTalkSfx,
+ AUDIO_SAMPLE_POLICE_SWAT_1_PURSUIT_ARREST_1, 6u);
+ }
+
+ return 6 * (m_sQueueSample.m_nEntityIndex % 3) + sfx;
+}
+
+uint32
+cAudioManager::GetFBITalkSfx(int16 sample)
+{
+ uint32 sfx;
+ PedState pedState;
+ static bool &bUsedFBITalkSfx = *(bool *)0x65090C;
+ static uint32 &lastFBITalkSfx = *(uint32 *)0x650908;
+
+ if(!bUsedFBITalkSfx) {
+ bUsedFBITalkSfx = 1;
+ lastFBITalkSfx = NO_SAMPLE;
+ }
+
+ if(sample == SOUND_PED_ARREST_FBI) {
+ GetPhrase(&sfx, &lastFBITalkSfx,
+ AUDIO_SAMPLE_POLICE_FBI_1_PURSUIT_ARREST_1, 6u);
+ } else {
+ if(sample != SOUND_PED_PURSUIT_FBI) {
+ return cAudioManager::GetGenericMaleTalkSfx(sample);
+ }
+
+ pedState = FindPlayerPed()->m_nPedState;
+ if(pedState == PED_ARRESTED || pedState == PED_DEAD ||
+ pedState == PED_DIE)
+ return NO_SAMPLE;
+ GetPhrase(&sfx, &lastFBITalkSfx,
+ AUDIO_SAMPLE_POLICE_FBI_1_PURSUIT_ARREST_1, 6u);
+ }
+
+ return 6 * (m_sQueueSample.m_nEntityIndex % 3) + sfx;
+}
+
+uint32
+cAudioManager::GetArmyTalkSfx(int16 sample)
+{
+ uint32 sfx;
+ PedState pedState;
+ static bool &bUsedArmyTalkSfx = *(bool *)0x650914;
+ static uint32 &lastArmyTalkSfx = *(uint32 *)0x650910;
+
+ if(!bUsedArmyTalkSfx) {
+ bUsedArmyTalkSfx = 1;
+ lastArmyTalkSfx = NO_SAMPLE;
+ }
+
+ if(sample != SOUND_PED_PURSUIT_ARMY) {
+ return cAudioManager::GetGenericMaleTalkSfx(sample);
+ }
+
+ pedState = FindPlayerPed()->m_nPedState;
+ if(pedState == PED_ARRESTED || pedState == PED_DEAD ||
+ pedState == PED_DIE)
+ return NO_SAMPLE;
+ GetPhrase(&sfx, &lastArmyTalkSfx, AUDIO_SAMPLE_POLICE_ARMY_1_PURSUIT_1,
+ 15u);
+
+ return 15 * (m_sQueueSample.m_nEntityIndex % 1) + sfx;
+}
+
+uint32
+cAudioManager::GetMedicTalkSfx(int16 sample)
+{
+ uint32 sfx;
+ static bool &bUsedMedicTalkSfx = *(bool *)0x65091C;
+ static uint32 &lastMedicTalkSfx = *(uint32 *)0x650918;
+
+ if(!bUsedMedicTalkSfx) {
+ bUsedMedicTalkSfx = true;
+ lastMedicTalkSfx = NO_SAMPLE;
+ }
+ switch(sample) {
+ case SOUND_PED_HANDS_COWER:
+ GetPhrase(&sfx, &lastMedicTalkSfx,
+ AUDIO_SAMPLE_PED_MEDIC_1_HANDS_COWER_1, 5u);
+ break;
+ case SOUND_PED_CAR_JACKED:
+ GetPhrase(&sfx, &lastMedicTalkSfx,
+ AUDIO_SAMPLE_PED_MEDIC_1_CAR_JACKED_1, 5u);
+ break;
+ case SOUND_PED_HEALING:
+ GetPhrase(&sfx, &lastMedicTalkSfx,
+ AUDIO_SAMPLE_PED_MEDIC_1_HEALING_1, 12u);
+ break;
+ case SOUND_PED_LEAVE_VEHICLE:
+ GetPhrase(&sfx, &lastMedicTalkSfx,
+ AUDIO_SAMPLE_PED_MEDIC_1_LEAVE_VEHICLE_1, 9u);
+ break;
+ case SOUND_PED_FLEE_RUN:
+ GetPhrase(&sfx, &lastMedicTalkSfx,
+ AUDIO_SAMPLE_PED_MEDIC_1_FLEE_RUN_1, 6u);
+ break;
+ default: return cAudioManager::GetGenericMaleTalkSfx(sample);
+ }
+ return 37 * (m_sQueueSample.m_nEntityIndex & 1) + sfx;
+}
+
+uint32
+cAudioManager::GetFiremanTalkSfx(int16 sample)
+{
+ return cAudioManager::GetGenericMaleTalkSfx(sample);
+}
+
+uint32
+cAudioManager::GetNormalMaleTalkSfx(int16 sample)
+{
+ uint32 sfx;
+ static bool &bUsedNormalMaleTalkSfx = *(bool *)0x650B04;
+ static uint32 &lastNormalMaleTalkSfx = *(uint32 *)0x650B00;
+
+ if(!bUsedNormalMaleTalkSfx) {
+ bUsedNormalMaleTalkSfx = 1;
+ lastNormalMaleTalkSfx = NO_SAMPLE;
+ }
+ switch(sample) {
+ case SOUND_PED_HANDS_COWER:
+ GetPhrase(&sfx, &lastNormalMaleTalkSfx,
+ AUDIO_SAMPLE_PED_NORMAL_MALE_HANDS_COWER_1, 7u);
+ break;
+ case SOUND_PED_CAR_JACKED:
+ GetPhrase(&sfx, &lastNormalMaleTalkSfx,
+ AUDIO_SAMPLE_PED_NORMAL_MALE_CAR_JACKED_1, 7u);
+ break;
+ case SOUND_PED_EVADE:
+ GetPhrase(&sfx, &lastNormalMaleTalkSfx,
+ AUDIO_SAMPLE_PED_NORMAL_MALE_EVADE_1, 9u);
+ break;
+ case SOUND_PED_FLEE_RUN:
+ GetPhrase(&sfx, &lastNormalMaleTalkSfx,
+ AUDIO_SAMPLE_PED_NORMAL_MALE_FLEE_RUN_1, 5u);
+ break;
+ case SOUND_PED_CAR_COLLISION:
+ GetPhrase(&sfx, &lastNormalMaleTalkSfx,
+ AUDIO_SAMPLE_PED_NORMAL_MALE_CAR_COLLISION_1, 12u);
+ break;
+ case SOUND_PED_CHAT_SEXY:
+ GetPhrase(&sfx, &lastNormalMaleTalkSfx,
+ AUDIO_SAMPLE_PED_NORMAL_MALE_CHAT_SEXY_1, 8u);
+ break;
+ case SOUND_PED_CHAT_EVENT:
+ GetPhrase(&sfx, &lastNormalMaleTalkSfx,
+ AUDIO_SAMPLE_PED_NORMAL_MALE_CHAT_EVENT_1, 0xAu);
+ break;
+ case SOUND_PED_CHAT:
+ GetPhrase(&sfx, &lastNormalMaleTalkSfx,
+ AUDIO_SAMPLE_PED_NORMAL_MALE_CHAT_1, 25u);
+ break;
+ default: return cAudioManager::GetGenericMaleTalkSfx(sample);
+ }
+ return sfx;
+}
+
+uint32
+cAudioManager::GetTaxiDriverTalkSfx(int16 sample)
+{
+ uint32 sfx;
+ static bool &bUsedTaxiDriverTalkSfx = *(bool *)0x650AF4;
+ static uint32 &lastTaxiDriverTalkSfx = *(uint32 *)0x650AF0;
+
+ if(!bUsedTaxiDriverTalkSfx) {
+ bUsedTaxiDriverTalkSfx = 1;
+ lastTaxiDriverTalkSfx = NO_SAMPLE;
+ }
+
+ if(sample == SOUND_PED_CAR_JACKED) {
+ GetPhrase(&sfx, &lastTaxiDriverTalkSfx,
+ AUDIO_SAMPLE_PED_TAXI_DRIVER_1_CAR_JACKED_1, 7u);
+ } else {
+ if(sample != SOUND_PED_CAR_COLLISION)
+ return cAudioManager::GetGenericMaleTalkSfx(sample);
+ GetPhrase(&sfx, &lastTaxiDriverTalkSfx,
+ AUDIO_SAMPLE_PED_TAXI_DRIVER_1_CAR_COLLISION_1, 6u);
+ }
+ return 13 * (m_sQueueSample.m_nEntityIndex & 1) + sfx;
+}
+
+uint32
+cAudioManager::GetPimpTalkSfx(int16 sample)
+{
+ uint32 sfx;
+ static bool &bUsedPimpTalkSfx = *(bool *)0x650AFC;
+ static uint32 &lastPimpTalkSfx = *(uint32 *)0x650AF8;
+
+ if(!bUsedPimpTalkSfx) {
+ bUsedPimpTalkSfx = 1;
+ lastPimpTalkSfx = NO_SAMPLE;
+ }
+
+ switch(sample) {
+ case SOUND_PED_HANDS_UP:
+ GetPhrase(&sfx, &lastPimpTalkSfx,
+ AUDIO_SAMPLE_PED_PIMP_HANDS_UP_1, 7u);
+ break;
+ case SOUND_PED_CAR_JACKED:
+ GetPhrase(&sfx, &lastPimpTalkSfx,
+ AUDIO_SAMPLE_PED_PIMP_CAR_JACKED_1, 4u);
+ break;
+ case SOUND_PED_DEFEND:
+ GetPhrase(&sfx, &lastPimpTalkSfx,
+ AUDIO_SAMPLE_PED_PIMP_DEFEND_1, 9u);
+ break;
+ case SOUND_PED_EVADE:
+ GetPhrase(&sfx, &lastPimpTalkSfx, AUDIO_SAMPLE_PED_PIMP_EVADE_1,
+ 6u);
+ break;
+ case SOUND_PED_CAR_COLLISION:
+ GetPhrase(&sfx, &lastPimpTalkSfx,
+ AUDIO_SAMPLE_PED_PIMP_CAR_COLLISION_1, 5u);
+ break;
+ case SOUND_PED_CHAT_EVENT:
+ GetPhrase(&sfx, &lastPimpTalkSfx,
+ AUDIO_SAMPLE_PED_PIMP_CHAT_EVENT_1, 2u);
+ break;
+ case SOUND_PED_CHAT:
+ GetPhrase(&sfx, &lastPimpTalkSfx, AUDIO_SAMPLE_PED_PIMP_CHAT_1,
+ 17u);
+ break;
+ default: return cAudioManager::GetGenericMaleTalkSfx(sample);
+ }
+ return sfx;
+}
+
+uint32
+cAudioManager::GetMafiaTalkSfx(int16 sample)
+{
+ uint32 sfx;
+ static bool &bUsedMafiaTalkSfx = *(bool *)0x650934;
+ static uint32 &lastMafiaTalkSfx = *(uint32 *)0x650930;
+
+ if(!bUsedMafiaTalkSfx) {
+ bUsedMafiaTalkSfx = 1;
+ lastMafiaTalkSfx = NO_SAMPLE;
+ }
+
+ switch(sample) {
+ case SOUND_PED_CAR_JACKING:
+ GetPhrase(&sfx, &lastMafiaTalkSfx,
+ AUDIO_SAMPLE_PED_MAFIA_1_CAR_JACKING_1, 2u);
+ break;
+ case SOUND_PED_CAR_JACKED:
+ GetPhrase(&sfx, &lastMafiaTalkSfx,
+ AUDIO_SAMPLE_PED_MAFIA_1_CAR_JACKED_1, 2u);
+ break;
+ case SOUND_PED_ATTACK:
+ GetPhrase(&sfx, &lastMafiaTalkSfx,
+ AUDIO_SAMPLE_PED_MAFIA_1_ATTACK_1, 5u);
+ break;
+ case SOUND_PED_EVADE:
+ GetPhrase(&sfx, &lastMafiaTalkSfx,
+ AUDIO_SAMPLE_PED_MAFIA_1_EVADE_1, 5u);
+ break;
+ case SOUND_PED_CAR_COLLISION:
+ GetPhrase(&sfx, &lastMafiaTalkSfx,
+ AUDIO_SAMPLE_PED_MAFIA_1_CAR_COLLISION_1, 6u);
+ break;
+ case SOUND_PED_CHAT_SEXY:
+ GetPhrase(&sfx, &lastMafiaTalkSfx,
+ AUDIO_SAMPLE_PED_MAFIA_1_CHAT_SEXY_1, 3u);
+ break;
+ case SOUND_PED_CHAT:
+ GetPhrase(&sfx, &lastMafiaTalkSfx,
+ AUDIO_SAMPLE_PED_MAFIA_1_CHAT_1, 7u);
+ break;
+ default: return cAudioManager::GetGenericMaleTalkSfx(sample);
+ }
+ return 30 * (m_sQueueSample.m_nEntityIndex % 3) + sfx;
+}
+
+uint32
+cAudioManager::GetTriadTalkSfx(int16 sample)
+{
+ uint32 sfx;
+ static bool &bUsedTriadTalkSfx = *(bool *)0x65093C;
+ static uint32 &lastTriadTalkSfx = *(uint32 *)0x650938;
+
+ if(!bUsedTriadTalkSfx) {
+ bUsedTriadTalkSfx = 1;
+ lastTriadTalkSfx = NO_SAMPLE;
+ }
+
+ switch(sample) {
+ case SOUND_PED_HANDS_UP:
+ GetPhrase(&sfx, &lastTriadTalkSfx,
+ AUDIO_SAMPLE_PED_TRIAD_1_HANDS_UP_1, 3u);
+ break;
+ case SOUND_PED_CAR_JACKING:
+ GetPhrase(&sfx, &lastTriadTalkSfx,
+ AUDIO_SAMPLE_PED_TRIAD_1_CAR_JACKING_1, 2u);
+ break;
+ case SOUND_PED_CAR_JACKED:
+ GetPhrase(&sfx, &lastTriadTalkSfx,
+ AUDIO_SAMPLE_PED_TRIAD_1_CAR_JACKED_1, 2u);
+ break;
+ case SOUND_PED_ATTACK:
+ GetPhrase(&sfx, &lastTriadTalkSfx,
+ AUDIO_SAMPLE_PED_TRIAD_1_ATTACK_1, 5u);
+ break;
+ case SOUND_PED_EVADE:
+ GetPhrase(&sfx, &lastTriadTalkSfx,
+ AUDIO_SAMPLE_PED_TRIAD_1_EVADE_1, 4u);
+ break;
+ case SOUND_PED_CAR_COLLISION:
+ GetPhrase(&sfx, &lastTriadTalkSfx,
+ AUDIO_SAMPLE_PED_TRIAD_1_CAR_COLLISION_1, 7u);
+ break;
+ case SOUND_PED_CHAT_SEXY:
+ GetPhrase(&sfx, &lastTriadTalkSfx,
+ AUDIO_SAMPLE_PED_TRIAD_1_CHAT_SEXY_1, 3u);
+ break;
+ case SOUND_PED_CHAT:
+ GetPhrase(&sfx, &lastTriadTalkSfx,
+ AUDIO_SAMPLE_PED_TRIAD_1_CHAT_1, 8u);
+ break;
+ default: return cAudioManager::GetGenericMaleTalkSfx(sample);
+ }
+ return sfx;
+}
uint32
-cAudioManager::GetGenericMaleTalkSfx(eSound sample)
+cAudioManager::GetDiabloTalkSfx(int16 sample)
{
- eAudioSamples sfx;
+ uint32 sfx;
+ static bool &bUsedDiabloTalkSfx = *(bool *)0x650944;
+ static uint32 &lastDiabloTalkSfx = *(uint32 *)0x650940;
+
+ if(!bUsedDiabloTalkSfx) {
+ bUsedDiabloTalkSfx = 1;
+ lastDiabloTalkSfx = NO_SAMPLE;
+ }
+
+ switch(sample) {
+ case SOUND_PED_HANDS_UP:
+ GetPhrase(&sfx, &lastDiabloTalkSfx,
+ AUDIO_SAMPLE_PED_DIABLO_1_HANDS_UP_1, 4u);
+ break;
+ case SOUND_PED_HANDS_COWER:
+ sample = SOUND_PED_FLEE_SPRINT;
+ return cAudioManager::GetGenericMaleTalkSfx(sample);
+ break;
+ case SOUND_PED_CAR_JACKING:
+ GetPhrase(&sfx, &lastDiabloTalkSfx,
+ AUDIO_SAMPLE_PED_DIABLO_1_CAR_JACKING_1, 2u);
+ break;
+ case SOUND_PED_CAR_JACKED:
+ GetPhrase(&sfx, &lastDiabloTalkSfx,
+ AUDIO_SAMPLE_PED_DIABLO_1_CAR_JACKED_1, 2u);
+ break;
+ case SOUND_PED_ATTACK:
+ GetPhrase(&sfx, &lastDiabloTalkSfx,
+ AUDIO_SAMPLE_PED_DIABLO_1_ATTACK_1, 4u);
+ break;
+ case SOUND_PED_EVADE:
+ GetPhrase(&sfx, &lastDiabloTalkSfx,
+ AUDIO_SAMPLE_PED_DIABLO_1_EVADE_1, 4u);
+ break;
+ case SOUND_PED_CAR_COLLISION:
+ GetPhrase(&sfx, &lastDiabloTalkSfx,
+ AUDIO_SAMPLE_PED_DIABLO_1_CAR_COLLISION_1, 5u);
+ break;
+ case SOUND_PED_CHAT_SEXY:
+ GetPhrase(&sfx, &lastDiabloTalkSfx,
+ AUDIO_SAMPLE_PED_DIABLO_1_CHAT_SEXY_1, 4u);
+ break;
+ case SOUND_PED_CHAT:
+ GetPhrase(&sfx, &lastDiabloTalkSfx,
+ AUDIO_SAMPLE_PED_DIABLO_1_CHAT_1, 5u);
+ break;
+ default: return cAudioManager::GetGenericMaleTalkSfx(sample);
+ }
+ return 30 * (m_sQueueSample.m_nEntityIndex & 1) + sfx;
+}
+
+uint32
+cAudioManager::GetYakuzaTalkSfx(int16 sample)
+{
+ uint32 sfx;
+ static bool &bUsedYakuzaTalkSfx = *(bool *)0x65094C;
+ static uint32 &lastYakuzaTalkSfx = *(uint32 *)0x650948;
+
+ if(!bUsedYakuzaTalkSfx) {
+ bUsedYakuzaTalkSfx = 1;
+ lastYakuzaTalkSfx = NO_SAMPLE;
+ }
+
+ switch(sample) {
+ case SOUND_PED_CAR_JACKING:
+ GetPhrase(&sfx, &lastYakuzaTalkSfx,
+ AUDIO_SAMPLE_PED_YAKUZA_1_CAR_JACKING_1, 2u);
+ break;
+ case SOUND_PED_CAR_JACKED:
+ GetPhrase(&sfx, &lastYakuzaTalkSfx,
+ AUDIO_SAMPLE_PED_YAKUZA_1_CAR_JACKED_1, 2u);
+ break;
+ case SOUND_PED_ATTACK:
+ GetPhrase(&sfx, &lastYakuzaTalkSfx,
+ AUDIO_SAMPLE_PED_YAKUZA_1_ATTACK_1, 5u);
+ break;
+ case SOUND_PED_EVADE:
+ GetPhrase(&sfx, &lastYakuzaTalkSfx,
+ AUDIO_SAMPLE_PED_YAKUZA_1_EVADE_1, 4u);
+ break;
+ case SOUND_PED_CAR_COLLISION:
+ GetPhrase(&sfx, &lastYakuzaTalkSfx,
+ AUDIO_SAMPLE_PED_YAKUZA_1_CAR_COLLISION_1, 6u);
+ break;
+ case SOUND_PED_CHAT:
+ GetPhrase(&sfx, &lastYakuzaTalkSfx,
+ AUDIO_SAMPLE_PED_YAKUZA_1_CHAT_1, 5u);
+ break;
+ default: return cAudioManager::GetGenericMaleTalkSfx(sample);
+ }
+ return 24 * (m_sQueueSample.m_nEntityIndex & 1) + sfx;
+}
+
+uint32
+cAudioManager::GetYardieTalkSfx(int16 sample)
+{
+ uint32 sfx;
+ static bool &bUsedYardieTalkSfx = *(bool *)0x650954;
+ static uint32 &lastYardieTalkSfx = *(uint32 *)0x650950;
+
+ if(!bUsedYardieTalkSfx) {
+ bUsedYardieTalkSfx = 1;
+ lastYardieTalkSfx = NO_SAMPLE;
+ }
+
+ switch(sample) {
+ case SOUND_PED_HANDS_UP:
+ sfx = AUDIO_SAMPLE_PED_YARDIE_1_HANDS_UP_1;
+ break;
+ case SOUND_PED_CAR_JACKING:
+ GetPhrase(&sfx, &lastYardieTalkSfx,
+ AUDIO_SAMPLE_PED_YARDIE_1_CAR_JACKING_1, 2u);
+ break;
+ case SOUND_PED_CAR_JACKED:
+ sfx = AUDIO_SAMPLE_PED_YARDIE_1_CAR_JACKED_1;
+ break;
+ case SOUND_PED_ATTACK:
+ GetPhrase(&sfx, &lastYardieTalkSfx,
+ AUDIO_SAMPLE_PED_YARDIE_1_ATTACK_1, 6u);
+ break;
+ case SOUND_PED_EVADE:
+ GetPhrase(&sfx, &lastYardieTalkSfx,
+ AUDIO_SAMPLE_PED_YARDIE_1_EVADE_1, 5u);
+ break;
+ case SOUND_PED_CAR_COLLISION:
+ GetPhrase(&sfx, &lastYardieTalkSfx,
+ AUDIO_SAMPLE_PED_YARDIE_1_CAR_COLLISION_1, 6u);
+ break;
+ case SOUND_PED_CHAT_SEXY:
+ GetPhrase(&sfx, &lastYardieTalkSfx,
+ AUDIO_SAMPLE_PED_YARDIE_1_CHAT_SEXY_1, 2u);
+ break;
+ case SOUND_PED_CHAT:
+ GetPhrase(&sfx, &lastYardieTalkSfx,
+ AUDIO_SAMPLE_PED_YARDIE_1_CHAT_1, 8u);
+ break;
+ default: return cAudioManager::GetGenericMaleTalkSfx(sample);
+ }
+ return 31 * (m_sQueueSample.m_nEntityIndex & 1) + sfx;
+}
+
+uint32
+cAudioManager::GetGenericMaleTalkSfx(int16 sample)
+{
+ uint32 sfx;
+ static bool &bUsedGenericMaleTalkSfx = *(bool *)0x650B0C;
+ static uint32 &lastGenericMaleTalkSfx = *(uint32 *)0x650B08;
if(!bUsedGenericMaleTalkSfx) {
bUsedGenericMaleTalkSfx = 1;
@@ -72,34 +598,50 @@ cAudioManager::GetGenericMaleTalkSfx(eSound sample)
}
switch(sample) {
case SOUND_PED_DEATH:
- cAudioManager::GetPhrase(&sfx, &lastGenericMaleTalkSfx,
- AUDIO_SAMPLE_PED_MALE_DEATH_1, 8u);
+ GetPhrase(&sfx, &lastGenericMaleTalkSfx,
+ AUDIO_SAMPLE_PED_MALE_DEATH_1, 8u);
break;
case SOUND_PED_BULLET_HIT:
case SOUND_PED_DEFEND:
- cAudioManager::GetPhrase(&sfx, &lastGenericMaleTalkSfx,
- AUDIO_SAMPLE_INJURED_PED_MALE_OUCH_1,
- 15u);
+ GetPhrase(&sfx, &lastGenericMaleTalkSfx,
+ AUDIO_SAMPLE_INJURED_PED_MALE_OUCH_1, 15u);
break;
case SOUND_PED_BURNING:
- cAudioManager::GetPhrase(&sfx, &lastGenericMaleTalkSfx,
- AUDIO_SAMPLE_PED_MALE_BURNING_1, 8u);
+ GetPhrase(&sfx, &lastGenericMaleTalkSfx,
+ AUDIO_SAMPLE_PED_MALE_BURNING_1, 8u);
break;
case SOUND_PED_FLEE_SPRINT:
- cAudioManager::GetPhrase(&sfx, &lastGenericMaleTalkSfx,
- AUDIO_SAMPLE_PED_MALE_FLEE_SPRINT_1,
- 6u);
+ GetPhrase(&sfx, &lastGenericMaleTalkSfx,
+ AUDIO_SAMPLE_PED_MALE_FLEE_SPRINT_1, 6u);
break;
default: return NO_SAMPLE;
}
return sfx;
}
-WRAPPER void cAudioManager::Service() { EAXJMP(0x57A2A0); }
+WRAPPER void
+cAudioManager::Service()
+{
+ EAXJMP(0x57A2A0);
+}
STARTPATCHES
InjectHook(0x56AD20, &cAudioManager::PlayerJustLeftCar, PATCH_JUMP);
InjectHook(0x570DB0, &cAudioManager::GetPhrase, PATCH_JUMP);
InjectHook(0x570E00, &cAudioManager::GetPlayerTalkSfx, PATCH_JUMP);
+InjectHook(0x570EA0, &cAudioManager::GetCopTalkSfx, PATCH_JUMP);
+InjectHook(0x570F80, &cAudioManager::GetSwatTalkSfx, PATCH_JUMP);
+InjectHook(0x571040, &cAudioManager::GetFBITalkSfx, PATCH_JUMP);
+InjectHook(0x571110, &cAudioManager::GetArmyTalkSfx, PATCH_JUMP);
+InjectHook(0x5711C0, &cAudioManager::GetMedicTalkSfx, PATCH_JUMP);
+InjectHook(0x5712B0, &cAudioManager::GetFiremanTalkSfx, PATCH_JUMP);
+InjectHook(0x575340, &cAudioManager::GetNormalMaleTalkSfx, PATCH_JUMP);
+InjectHook(0x575190, &cAudioManager::GetTaxiDriverTalkSfx, PATCH_JUMP);
+InjectHook(0x575240, &cAudioManager::GetPimpTalkSfx, PATCH_JUMP);
+InjectHook(0x571510, &cAudioManager::GetMafiaTalkSfx, PATCH_JUMP);
+InjectHook(0x571650, &cAudioManager::GetTriadTalkSfx, PATCH_JUMP);
+InjectHook(0x571770, &cAudioManager::GetDiabloTalkSfx, PATCH_JUMP);
+InjectHook(0x5718D0, &cAudioManager::GetYakuzaTalkSfx, PATCH_JUMP);
+InjectHook(0x5719E0, &cAudioManager::GetYardieTalkSfx, PATCH_JUMP);
InjectHook(0x575460, &cAudioManager::GetGenericMaleTalkSfx, PATCH_JUMP);
ENDPATCHES
diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h
index 94b430db..4a09e260 100644
--- a/src/audio/AudioManager.h
+++ b/src/audio/AudioManager.h
@@ -1,6 +1,7 @@
#pragma once
#include "AudioSamples.h"
+#include "DMAudio.h"
#include "common.h"
class tActiveSample
@@ -72,12 +73,12 @@ enum eAudioType : int32 {
class tAudioEntity
{
- public:
+public:
eAudioType m_nType;
void *m_pEntity;
char m_bIsUsed;
char m_bStatus;
- __int16 m_awAudioEvent[4];
+ int16 m_awAudioEvent[4];
char gap_18[2];
float m_afVolume[4];
char field_24;
@@ -146,7 +147,9 @@ public:
static_assert(sizeof(cAudioCollisionManager) == 0x354,
"cAudioCollisionManager: error");
-struct cMissionAudio {
+class cMissionAudio
+{
+public:
CVector m_vecPos;
char field_12;
char gap_13[3];
@@ -215,13 +218,28 @@ public:
void PlayerJustLeftCar(void);
void Service();
- void GetPhrase(eAudioSamples *phrase, eAudioSamples *prevPhrase,
- eAudioSamples sample, uint32 maxOffset);
-
- uint32 GetPlayerTalkSfx(eSound sound);
- uint32 GetGenericMaleTalkSfx(eSound sound);
+ void GetPhrase(uint32 *phrase, uint32 *prevPhrase, uint32 sample,
+ uint32 maxOffset);
+
+ uint32 GetPlayerTalkSfx(int16 sound);
+ uint32 GetCopTalkSfx(int16 sound);
+ uint32 GetSwatTalkSfx(int16 sound);
+ uint32 GetFBITalkSfx(int16 sound);
+ uint32 GetArmyTalkSfx(int16 sound);
+ uint32 GetMedicTalkSfx(int16 sound);
+ uint32 GetFiremanTalkSfx(int16 sound);
+ uint32 GetNormalMaleTalkSfx(int16 sound);
+ uint32 GetTaxiDriverTalkSfx(int16 sound);
+ uint32 GetPimpTalkSfx(int16 sound);
+ uint32 GetMafiaTalkSfx(int16 sound);
+ uint32 GetTriadTalkSfx(int16 sound);
+ uint32 GetDiabloTalkSfx(int16 sound);
+ uint32 GetYakuzaTalkSfx(int16 sound);
+ uint32 GetYardieTalkSfx(int16 sound);
+ uint32 GetGenericMaleTalkSfx(int16 sound);
};
static_assert(sizeof(cAudioManager) == 0x4B14, "cAudioManager: error");
extern cAudioManager &AudioManager;
+extern cAudioManager &Players;
diff --git a/src/audio/AudioSamples.h b/src/audio/AudioSamples.h
index 24544e56..26fffe63 100644
--- a/src/audio/AudioSamples.h
+++ b/src/audio/AudioSamples.h
@@ -3037,175 +3037,4 @@ enum eAudioSamples : uint32 {
AUDIO_SAMPLE_AMMUNATION_WELCOME_3 = 3031,
TOTAL_AUDIO_SAMPLES = 3032,
NO_SAMPLE = 3033,
-};
-
-enum eSound {
- SOUND_CAR_DOOR_CLOSE_BONNET = 0,
- SOUND_CAR_DOOR_CLOSE_BUMPER = 1,
- SOUND_CAR_DOOR_CLOSE_FRONT_LEFT = 0x2,
- SOUND_CAR_DOOR_CLOSE_FRONT_RIGHT = 0x3,
- SOUND_CAR_DOOR_CLOSE_BACK_LEFT = 0x4,
- SOUND_CAR_DOOR_CLOSE_BACK_RIGHT = 0x5,
- SOUND_CAR_DOOR_OPEN_BONNET = 0x6,
- SOUND_CAR_DOOR_OPEN_BUMPER = 0x7,
- SOUND_CAR_DOOR_OPEN_FRONT_LEFT = 0x8,
- SOUND_CAR_DOOR_OPEN_FRONT_RIGHT = 0x9,
- SOUND_CAR_DOOR_OPEN_BACK_LEFT = 0xA,
- SOUND_CAR_DOOR_OPEN_BACK_RIGHT = 0xB,
- SOUND_CAR_WINDSHIELD_CRACK = 0xC,
- SOUND_CAR_JUMP = 0xD,
- SOUND_E = 0xE,
- SOUND_F = 0xF,
- SOUND_CAR_ENGINE_START = 0x10,
- SOUND_CAR_LIGHT_BREAK = 0x11,
- SOUND_CAR_HYDRALIC_1 = 0x12,
- SOUND_CAR_HYDRALIC_2 = 0x13,
- SOUND_CAR_HYDRALIC_3 = 0x14,
- SOUND_CAR_JERK = 0x15,
- SOUND_CAR_SPLASH = 0x16,
- SOUND_17 = 0x17,
- SOUND_18 = 0x18,
- SOUND_19 = 0x19,
- SOUND_CAR_TANK_TURRET_ROTATE = 0x1A,
- SOUND_CAR_BOMB_TICK = 0x1B,
- SOUND_PLANE_ON_GROUND = 0x1C,
- SOUND_STEP_START = 0x1D,
- SOUND_STEP_END = 0x1E,
- SOUND_FALL_LAND = 0x1F,
- SOUND_FALL_COLLAPSE = 0x20,
- SOUND_21 = 0x21,
- SOUND_22 = 0x22,
- SOUND_23 = 0x23,
- SOUND_24 = 0x24,
- SOUND_25 = 0x25,
- SOUND_26 = 0x26,
- SOUND_WEAPON_PUNCH_ATTACK = 0x27,
- SOUND_28 = 0x28,
- SOUND_29 = 0x29,
- SOUND_2A = 0x2A,
- SOUND_2B = 0x2B,
- SOUND_2C = 0x2C,
- SOUND_2D = 0x2D,
- SOUND_WEAPON_BAT_ATTACK = 0x2E,
- SOUND_WEAPON_SHOT_FIRED = 0x2F,
- SOUND_WEAPON_RELOAD = 0x30,
- SOUND_31 = 0x31,
- SOUND_32 = 0x32,
- SOUND_33 = 0x33,
- SOUND_WEAPON_FLAMETHROWER_FIRE = 0x34,
- SOUND_WEAPON_SNIPER_SHOT_NO_ZOOM = 0x35,
- SOUND_WEAPON_ROCKET_SHOT_NO_ZOOM = 0x36,
- SOUND_WEAPON_HIT_PED = 0x37,
- SOUND_WEAPON_HIT_VEHICLE = 0x38,
- SOUND_GARAGE_NO_MONEY = 0x39,
- SOUND_GARAGE_BAD_VEHICLE = 0x3A,
- SOUND_GARAGE_OPENING = 0x3B,
- SOUND_3C = 0x3C,
- SOUND_GARAGE_BOMB1_SET = 0x3D,
- SOUND_GARAGE_BOMB2_SET = 0x3E,
- SOUND_GARAGE_BOMB3_SET = 0x3F,
- SOUND_40 = 0x40,
- SOUND_41 = 0x41,
- SOUND_GARAGE_VEHICLE_DECLINED = 0x42,
- SOUND_GARAGE_VEHICLE_ACCEPTED = 0x43,
- SOUND_GARAGE_DOOR_CLOSED = 0x44,
- SOUND_GARAGE_DOOR_OPENED = 0x45,
- SOUND_CRANE_PICKUP = 0x46,
- SOUND_PICKUP_WEAPON_BOUGHT = 0x47,
- SOUND_PICKUP_WEAPON = 0x48,
- SOUND_PICKUP_HEALTH = 0x49,
- SOUND_4A = 0x4A,
- SOUND_4B = 0x4B,
- SOUND_PICKUP_ADRENALINE = 0x4C,
- SOUND_PICKUP_ARMOUR = 0x4D,
- SOUND_PICKUP_BONUS = 0x4E,
- SOUND_PICKUP_MONEY = 0x4F,
- SOUND_PICKUP_HIDDEN_PACKAGE = 0x50,
- SOUND_PICKUP_PACMAN_PILL = 0x51,
- SOUND_PICKUP_PACMAN_PACKAGE = 0x52,
- SOUND_PICKUP_FLOAT_PACKAGE = 0x53,
- SOUND_BOMB_TIMED_ACTIVATED = 0x54,
- SOUND_55 = 0x55,
- SOUND_BOMB_ONIGNITION_ACTIVATED = 0x56,
- SOUND_BOMB_TICK = 0x57,
- SOUND_RAMPAGE_START = 0x58,
- SOUND_RAMPAGE_ONGOING = 0x59,
- SOUND_RAMPAGE_PASSED = 0x5A,
- SOUND_RAMPAGE_FAILED = 0x5B,
- SOUND_RAMPAGE_KILL = 0x5C,
- SOUND_RAMPAGE_CAR_BLOWN = 0x5D,
- SOUND_EVIDENCE_PICKUP = 0x5E,
- SOUND_UNLOAD_GOLD = 0x5F,
- SOUND_PAGER = 0x60,
- SOUND_PED_DEATH = 0x61,
- SOUND_PED_DAMAGE = 0x62,
- SOUND_PED_HIT = 0x63,
- SOUND_PED_LAND = 0x64,
- SOUND_PED_BULLET_HIT = 0x65,
- SOUND_PED_BOMBER = 0x66,
- SOUND_PED_BURNING = 0x67,
- SOUND_PED_ARREST_FBI = 0x68,
- SOUND_PED_ARREST_SWAT = 0x69,
- SOUND_PED_ARREST_COP = 0x6A,
- SOUND_PED_HELI_PLAYER_FOUND = 0x6B,
- SOUND_PED_HANDS_UP = 0x6C,
- SOUND_PED_HANDS_COWER = 0x6D,
- SOUND_PED_FLEE_SPRINT = 0x6E,
- SOUND_PED_CAR_JACKING = 0x6F,
- SOUND_PED_MUGGING = 0x70,
- SOUND_PED_CAR_JACKED = 0x71,
- SOUND_PED_ROBBED = 0x72,
- SOUND_PED_TAXI_WAIT = 0x73,
- SOUND_PED_ATTACK = 0x74,
- SOUND_PED_DEFEND = 0x75,
- SOUND_PED_PURSUIT_ARMY = 0x76,
- SOUND_PED_PURSUIT_FBI = 0x77,
- SOUND_PED_PURSUIT_SWAT = 0x78,
- SOUND_PED_PURSUIT_COP = 0x79,
- SOUND_PED_HEALING = 0x7A,
- SOUND_PED_7B = 0x7B,
- SOUND_PED_LEAVE_VEHICLE = 0x7C,
- SOUND_PED_EVADE = 0x7D,
- SOUND_PED_FLEE_RUN = 0x7E,
- SOUND_PED_CAR_COLLISION = 0x7F,
- SOUND_PED_SOLICIT = 0x80,
- SOUND_PED_EXTINGUISHING_FIRE = 0x81,
- SOUND_PED_WAIT_DOUBLEBACK = 0x82,
- SOUND_PED_CHAT_SEXY = 0x83,
- SOUND_PED_CHAT_EVENT = 0x84,
- SOUND_PED_CHAT = 0x85,
- SOUND_PED_BODYCAST_HIT = 0x86,
- SOUND_PED_TAXI_CALL = 0x87,
- SOUND_INJURED_PED_MALE_OUCH = 0x88,
- SOUND_INJURED_PED_FEMALE = 0x89,
- SOUND_8A = 0x8A,
- SOUND_RACE_START_3 = 0x8B,
- SOUND_RACE_START_2 = 0x8C,
- SOUND_RACE_START_1 = 0x8D,
- SOUND_RACE_START_GO = 0x8E,
- SOUND_SPLASH = 0x8F,
- SOUND_WATER_FALL = 0x90,
- SOUND_SPLATTER = 0x91,
- SOUND_CAR_PED_COLLISION = 0x92,
- SOUND_CLOCK_TICK = 0x93,
- SOUND_PART_MISSION_COMPLETE = 0x94,
- SOUND_FRONTEND_MENU_STARTING = 0x95,
- SOUND_FRONTEND_MENU_COMPLETED = 0x96,
- SOUND_FRONTEND_MENU_DENIED = 0x97,
- SOUND_FRONTEND_MENU_SUCCESS = 0x98,
- SOUND_FRONTEND_EXIT = 0x99,
- SOUND_9A = 0x9A,
- SOUND_9B = 0x9B,
- SOUND_FRONTEND_AUDIO_TEST = 0x9C,
- SOUND_FRONTEND_FAIL = 0x9D,
- SOUND_FRONTEND_NO_RADIO = 0x9E,
- SOUND_FRONTEND_RADIO_CHANGE = 0x9F,
- SOUND_A0 = 0xA0,
- SOUND_AMMUNATION_WELCOME_1 = 0xA1,
- SOUND_AMMUNATION_WELCOME_2 = 0xA2,
- SOUND_AMMUNATION_WELCOME_3 = 0xA3,
- SOUND_LIGHTNING = 0xA4,
- SOUND_A5 = 0xA5,
- SOUND_TOTAL_SOUNDS = 166,
- SOUND_TOTAL_PED_SOUNDS = 167,
-};
+}; \ No newline at end of file
diff --git a/src/audio/DMAudio.h b/src/audio/DMAudio.h
index 646fa2ff..ea5aeeb2 100644
--- a/src/audio/DMAudio.h
+++ b/src/audio/DMAudio.h
@@ -1,6 +1,6 @@
#pragma once
-enum eSound
+enum eSound : int16
{
SOUND_CAR_DOOR_CLOSE_BONNET = 0,
SOUND_CAR_DOOR_CLOSE_BUMPER = 1,
@@ -101,7 +101,7 @@ enum eSound
SOUND_PAGER = 96,
SOUND_PED_DEATH = 97,
SOUND_PED_DAMAGE = 98,
- SOUND_PED_63 = 99,
+ SOUND_PED_HIT = 99,
SOUND_PED_LAND = 100,
SOUND_PED_BULLET_HIT = 101,
SOUND_PED_BOMBER = 102,