From 6c0f81f12abe7e4fca2ca3f386743148e2fff492 Mon Sep 17 00:00:00 2001 From: Filip Gawin Date: Thu, 13 Jun 2019 21:16:55 +0200 Subject: fixes for AudioManager::GetPhrase --- src/audio/AudioManager.cpp | 91 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 83 insertions(+), 8 deletions(-) (limited to 'src/audio/AudioManager.cpp') diff --git a/src/audio/AudioManager.cpp b/src/audio/AudioManager.cpp index 5a290d28..1bcd98ae 100644 --- a/src/audio/AudioManager.cpp +++ b/src/audio/AudioManager.cpp @@ -11,20 +11,95 @@ cAudioManager::PlayerJustLeftCar(void) } void -cAudioManager::GetPhrase(uint32 *phrase, uint32 *prevPhrase, +cAudioManager::GetPhrase(eAudioSamples *phrase, eAudioSamples *prevPhrase, eAudioSamples sample, uint32 maxOffset) { - *phrase = (uint32)sample + - (uint32)m_anRandomTable[m_sQueueSample.m_nEntityIndex & 3] % - maxOffset; - if(*phrase == *prevPhrase && ++*phrase >= (uint32)sample + maxOffset) - *phrase = (uint32)sample; + *phrase = eAudioSamples( + sample + + (uint32)m_anRandomTable[m_sQueueSample.m_nEntityIndex & 3] % + maxOffset); + if(*phrase == *prevPhrase && + ++*(uint32 *)phrase >= (uint32)sample + maxOffset) + *phrase = sample; *prevPhrase = *phrase; } +static bool &bUsedPlayerTalkSfx = *(bool *)0x6508f4; +static eAudioSamples &lastPlayerTalkSfx = *(eAudioSamples *)0x6508f0; + +uint32 +cAudioManager::GetPlayerTalkSfx(eSound sound) +{ + eAudioSamples sfx; + + if(!bUsedPlayerTalkSfx) { + bUsedPlayerTalkSfx = true; + lastPlayerTalkSfx = NO_SAMPLE; + } + switch(sound) { + case SOUND_PED_DAMAGE: + cAudioManager::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); + break; + + case SOUND_PED_LAND: + cAudioManager::GetPhrase(&sfx, &lastPlayerTalkSfx, + AUDIO_SAMPLE_PED_FALL_REACTION_1, 6u); + break; + + default: sfx = NO_SAMPLE; break; + } + return sfx; +} + +static bool &bUsedGenericMaleTalkSfx = *(bool *)0x650B0C; +static eAudioSamples &lastGenericMaleTalkSfx = *(eAudioSamples *)0x650B08; + +uint32 +cAudioManager::GetGenericMaleTalkSfx(eSound sample) +{ + eAudioSamples sfx; + + if(!bUsedGenericMaleTalkSfx) { + bUsedGenericMaleTalkSfx = 1; + lastGenericMaleTalkSfx = NO_SAMPLE; + } + switch(sample) { + case SOUND_PED_DEATH: + cAudioManager::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); + break; + case SOUND_PED_BURNING: + cAudioManager::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); + break; + default: return NO_SAMPLE; + } + return sfx; +} + WRAPPER void cAudioManager::Service() { EAXJMP(0x57A2A0); } STARTPATCHES - InjectHook(0x56AD20, &cAudioManager::PlayerJustLeftCar, PATCH_JUMP); - InjectHook(0x570DB0, &cAudioManager::GetPhrase, PATCH_JUMP); +InjectHook(0x56AD20, &cAudioManager::PlayerJustLeftCar, PATCH_JUMP); +InjectHook(0x570DB0, &cAudioManager::GetPhrase, PATCH_JUMP); +InjectHook(0x570E00, &cAudioManager::GetPlayerTalkSfx, PATCH_JUMP); +InjectHook(0x575460, &cAudioManager::GetGenericMaleTalkSfx, PATCH_JUMP); ENDPATCHES -- cgit v1.2.3