diff options
-rw-r--r-- | src/audio/AudioManager.cpp | 569 | ||||
-rw-r--r-- | src/audio/AudioManager.h | 24 | ||||
-rw-r--r-- | src/vehicles/Automobile.cpp | 2 |
3 files changed, 549 insertions, 46 deletions
diff --git a/src/audio/AudioManager.cpp b/src/audio/AudioManager.cpp index 4dbdf433..0fbc325a 100644 --- a/src/audio/AudioManager.cpp +++ b/src/audio/AudioManager.cpp @@ -802,14 +802,146 @@ cAudioManager::Get3DProviderName(uint8 id) return asName3DProviders[id]; } -WRAPPER -bool cAudioManager::SetupJumboFlySound(uint8) { EAXJMP(0x56F230); } +bool +cAudioManager::SetupJumboFlySound(uint8 emittingVol) +{ + int32 vol; -WRAPPER -bool cAudioManager::SetupJumboTaxiSound(uint8) { EAXJMP(0x56EF20); } + if(m_sQueueSample.m_fDistance >= 440.0) return 0; -WRAPPER -bool cAudioManager::SetupJumboWhineSound(uint8, int32) { EAXJMP(0x56F070); } + vol = ComputeVolume(emittingVol, 440.0f, m_sQueueSample.m_fDistance); + m_sQueueSample.m_bVolume = vol; + if(m_sQueueSample.m_bVolume) { + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_JUMBO_FLY_SOUND; + m_sQueueSample.field_4 = 0; + m_sQueueSample.m_bBankIndex = 0; + m_sQueueSample.m_bIsDistant = 0; + m_sQueueSample.field_16 = 1; + m_sQueueSample.m_bEmittingVolume = emittingVol; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nFrequency = + cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_JUMBO_FLY_SOUND); + m_sQueueSample.m_nLoopStart = + cSampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_fSoundIntensity = 440.0f; + m_sQueueSample.field_56 = 0; + m_sQueueSample.field_48 = 4.0; + m_sQueueSample.m_bReverbFlag = 1; + m_sQueueSample.field_76 = 5; + m_sQueueSample.m_nLoopEnd = + cSampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + AddSampleToRequestedQueue(); + } + return 1; +} + +bool +cAudioManager::SetupJumboRumbleSound(uint8 emittingVol) +{ + if(m_sQueueSample.m_fDistance >= 240.f) return 0; + + m_sQueueSample.m_bVolume = ComputeVolume(emittingVol, 240.f, m_sQueueSample.m_fDistance); + + if(m_sQueueSample.m_bVolume) { + m_sQueueSample.field_4 = 5; + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_JUMBO_RUMBLE_SOUND; + m_sQueueSample.m_bBankIndex = 0; + m_sQueueSample.m_bIsDistant = 1; + m_sQueueSample.field_16 = 1; + m_sQueueSample.m_nFrequency = + cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_JUMBO_RUMBLE_SOUND); + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_bEmittingVolume = emittingVol; + m_sQueueSample.m_nLoopStart = + cSampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_nLoopEnd = + cSampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.field_48 = 4.0; + m_sQueueSample.m_fSoundIntensity = 240.0; + m_sQueueSample.field_56 = 0; + m_sQueueSample.field_76 = 12; + m_sQueueSample.m_bOffset = 0; + m_sQueueSample.m_bReverbFlag = 1; + m_sQueueSample.m_bRequireReflection = 0; + AddSampleToRequestedQueue(); + m_sQueueSample.field_4 = 6; + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_JUMBO_RUMBLE_SOUND; + m_sQueueSample.m_nFrequency += 200; + m_sQueueSample.m_bOffset = 127; + AddSampleToRequestedQueue(); + } + return 1; +} + +uint8 &gJumboVolOffsetPercentage = *(uint8 *)0x6508ED; + +bool +cAudioManager::SetupJumboTaxiSound(uint8 vol) +{ + uint8 emittingVol; + + if(m_sQueueSample.m_fDistance >= 180.f) return 0; + + emittingVol = (vol >> 1) + ((vol >> 1) * m_sQueueSample.m_fDistance * 0.0055556f); + + if(m_sQueueSample.m_fDistance * 0.0055556f < 0.7f) + emittingVol -= emittingVol * gJumboVolOffsetPercentage / 100; + m_sQueueSample.m_bVolume = ComputeVolume(emittingVol, 180.f, m_sQueueSample.m_fDistance); + + if(m_sQueueSample.m_bVolume) { + m_sQueueSample.field_4 = 1; + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_JUMBO_TAXI_SOUND; + m_sQueueSample.m_bBankIndex = 0; + m_sQueueSample.m_bIsDistant = 0; + m_sQueueSample.field_16 = 1; + m_sQueueSample.m_nFrequency = GetJumboTaxiFreq(); + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_bEmittingVolume = emittingVol; + m_sQueueSample.m_nLoopStart = + cSampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_nLoopEnd = + cSampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.field_48 = 4.0f; + m_sQueueSample.m_fSoundIntensity = 180.0f; + m_sQueueSample.field_56 = 0; + m_sQueueSample.field_76 = 4; + m_sQueueSample.m_bReverbFlag = 1; + m_sQueueSample.m_bRequireReflection = 0; + AddSampleToRequestedQueue(); + } + return 1; +} + +bool +cAudioManager::SetupJumboWhineSound(uint8 emittingVol, int32 freq) +{ + if(m_sQueueSample.m_fDistance >= 170.f) return 0; + + m_sQueueSample.m_bVolume = ComputeVolume(emittingVol, 170.f, m_sQueueSample.m_fDistance); + + if(m_sQueueSample.m_bVolume) { + m_sQueueSample.field_4 = 2; + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_JUMBO_WHINE_SOUND; + m_sQueueSample.m_bBankIndex = 0; + m_sQueueSample.m_bIsDistant = 0; + m_sQueueSample.field_16 = 1; + m_sQueueSample.m_nFrequency = freq; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_bEmittingVolume = emittingVol; + m_sQueueSample.m_nLoopStart = + cSampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_nLoopEnd = + cSampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.field_48 = 4.0f; + m_sQueueSample.m_fSoundIntensity = 170.0f; + m_sQueueSample.field_56 = 0; + m_sQueueSample.field_76 = 4; + m_sQueueSample.m_bReverbFlag = 1; + m_sQueueSample.m_bRequireReflection = 0; + AddSampleToRequestedQueue(); + } + return 1; +} void cAudioManager::PlayLoadedMissionAudio() @@ -1009,6 +1141,98 @@ cAudioManager::DoJumboVolOffset() jumboVolOffset = m_anRandomTable[1] % 60u; } +int32 +cAudioManager::GetPedCommentSfx(CPed *ped, int32 sound) +{ + if(ped->IsPlayer()) return GetPlayerTalkSfx(sound); + + switch(ped->m_modelIndex) { + case MI_COP: return GetCopTalkSfx(sound); + case MI_SWAT: return GetSwatTalkSfx(sound); + case MI_FBI: return GetFBITalkSfx(sound); + case MI_ARMY: return GetArmyTalkSfx(sound); + case MI_MEDIC: return GetMedicTalkSfx(sound); + case MI_FIREMAN: return GetFiremanTalkSfx(sound); + case MI_MALE01: return GetNormalMaleTalkSfx(sound); + case MI_TAXI_D: return GetTaxiDriverTalkSfx(sound); + case MI_PIMP: return GetPimpTalkSfx(sound); + case MI_GANG01: + case MI_GANG02: return GetMafiaTalkSfx(sound); + case MI_GANG03: + case MI_GANG04: return GetTriadTalkSfx(sound); + case MI_GANG05: + case MI_GANG06: return GetDiabloTalkSfx(sound); + case MI_GANG07: + case MI_GANG08: return GetYakuzaTalkSfx(sound); + case MI_GANG09: + case MI_GANG10: return GetYardieTalkSfx(sound); + case MI_GANG11: + case MI_GANG12: return GetColumbianTalkSfx(sound); + case MI_GANG13: + case MI_GANG14: return GetHoodTalkSfx(sound); + case MI_CRIMINAL01: return GetBlackCriminalTalkSfx(sound); + case MI_CRIMINAL02: return GetWhiteCriminalTalkSfx(sound); + case MI_SPECIAL01: + case MI_SPECIAL02: + case MI_SPECIAL03: + case MI_SPECIAL04: return GetSpecialCharacterTalkSfx(ped->m_modelIndex, sound); + case MI_MALE02: return GetMaleNo2TalkSfx(sound); + case MI_MALE03: + case MI_P_MAN1: + case MI_P_MAN2: return GetBlackProjectMaleTalkSfx(sound, ped->m_modelIndex); + case MI_FATMALE01: return GetWhiteFatMaleTalkSfx(sound); + case MI_FATMALE02: return GetBlackFatMaleTalkSfx(sound); + case MI_FEMALE01: return GetBlackCasualFemaleTalkSfx(sound); + case MI_FEMALE02: + case MI_CAS_WOM: return GetWhiteCasualFemaleTalkSfx(sound); + case MI_FEMALE03: return GetFemaleNo3TalkSfx(sound); + case MI_FATFEMALE01: return GetBlackFatFemaleTalkSfx(sound); + case MI_FATFEMALE02: return GetWhiteFatFemaleTalkSfx(sound); + case MI_PROSTITUTE: return GetBlackFemaleProstituteTalkSfx(sound); + case MI_PROSTITUTE2: return GetWhiteFemaleProstituteTalkSfx(sound); + case MI_P_WOM1: return GetBlackProjectFemaleOldTalkSfx(sound); + case MI_P_WOM2: return GetBlackProjectFemaleYoungTalkSfx(sound); + case MI_CT_MAN1: return GetChinatownMaleOldTalkSfx(sound); + case MI_CT_MAN2: return GetChinatownMaleYoungTalkSfx(sound); + case MI_CT_WOM1: return GetChinatownFemaleOldTalkSfx(sound); + case MI_CT_WOM2: return GetChinatownFemaleYoungTalkSfx(sound); + case MI_LI_MAN1: + case MI_LI_MAN2: return GetLittleItalyMaleTalkSfx(sound); + case MI_LI_WOM1: return GetLittleItalyFemaleOldTalkSfx(sound); + case MI_LI_WOM2: return GetLittleItalyFemaleYoungTalkSfx(sound); + case MI_DOCKER1: return GetWhiteDockerMaleTalkSfx(sound); + case MI_DOCKER2: return GetBlackDockerMaleTalkSfx(sound); + case MI_SCUM_MAN: return GetScumMaleTalkSfx(sound); + case MI_SCUM_WOM: return GetScumFemaleTalkSfx(sound); + case MI_WORKER1: return GetWhiteWorkerMaleTalkSfx(sound); + case MI_WORKER2: return GetBlackWorkerMaleTalkSfx(sound); + case MI_B_MAN1: + case MI_B_MAN3: return GetBusinessMaleYoungTalkSfx(sound, ped->m_modelIndex); + case MI_B_MAN2: return GetBusinessMaleOldTalkSfx(sound); + case MI_B_WOM1: + case MI_B_WOM2: return GetWhiteBusinessFemaleTalkSfx(sound, ped->m_modelIndex); + case MI_B_WOM3: return GetBlackBusinessFemaleTalkSfx(sound); + case MI_MOD_MAN: return GetSupermodelMaleTalkSfx(sound); + case MI_MOD_WOM: return GetSupermodelFemaleTalkSfx(sound); + case MI_ST_MAN: return GetStewardMaleTalkSfx(sound); + case MI_ST_WOM: return GetStewardFemaleTalkSfx(sound); + case MI_FAN_MAN1: + case MI_FAN_MAN2: return GetFanMaleTalkSfx(sound, ped->m_modelIndex); + case MI_FAN_WOM: return GetFanFemaleTalkSfx(sound); + case MI_HOS_MAN: return GetHospitalMaleTalkSfx(sound); + case MI_HOS_WOM: return GetHospitalFemaleTalkSfx(sound); + case MI_CONST1: return GetWhiteConstructionWorkerTalkSfx(sound); + case MI_CONST2: return GetBlackConstructionWorkerTalkSfx(sound); + case MI_SHOPPER1: + case MI_SHOPPER2: + case MI_SHOPPER3: return GetShopperFemaleTalkSfx(sound, ped->m_modelIndex); + case MI_STUD_MAN: return GetStudentMaleTalkSfx(sound); + case MI_STUD_WOM: return GetStudentFemaleTalkSfx(sound); + case MI_CAS_MAN: return GetCasualMaleOldTalkSfx(sound); + default: return GetGenericMaleTalkSfx(sound); + } +} + uint32 cAudioManager::GetPlayerTalkSfx(int16 sound) { @@ -3550,6 +3774,7 @@ cAudioManager::ProcessAirportScriptObject(uint8 sound) } } +WRAPPER bool cAudioManager::ProcessBoatEngine(cVehicleParams *params) { @@ -4149,18 +4374,45 @@ cAudioManager::ProcessJumbo(cVehicleParams *params) } } -WRAPPER void -cAudioManager::ProcessJumboAccel(CPlane *) +cAudioManager::ProcessJumboAccel(CPlane *plane) { - EAXJMP(0x56EA40); + int32 engineFreq; + int32 vol; + float whineSoundFreq; + float modificator; + + if(SetupJumboFlySound(20u)) { + modificator = (plane->field_656 - 0.10334f) * 1.676f; + if(modificator > 1.0f) modificator = 1.0f; + if(cAudioManager::SetupJumboRumbleSound(maxVolume * modificator) && + SetupJumboTaxiSound((1.0f - modificator) * 75.f)) { + if(modificator < 0.2f) { + whineSoundFreq = modificator * 5.f * 14600.0f + 29500; + vol = modificator * 5.f * maxVolume; + engineFreq = modificator * 5.f * 6050.f + 16000; + } else { + whineSoundFreq = 44100; + engineFreq = 22050; + vol = maxVolume; + } + SetupJumboEngineSound(vol, engineFreq); + SetupJumboWhineSound(18u, whineSoundFreq); + } + } } -WRAPPER void -cAudioManager::ProcessJumboDecel(CPlane *) +cAudioManager::ProcessJumboDecel(CPlane *plane) { - EAXJMP(0x56EE40); + float modificator; + + if(SetupJumboFlySound(20u) && SetupJumboTaxiSound(75u)) { + modificator = (plane->field_656 - 0.10334f) * 1.676f; + if(modificator > 1.0f) modificator = 1.0f; + SetupJumboEngineSound(maxVolume * modificator, 6050.f * modificator + 16000); + SetupJumboWhineSound(18u, 29500); + } } void @@ -4169,18 +4421,29 @@ cAudioManager::ProcessJumboFlying() if(SetupJumboFlySound(127u)) SetupJumboEngineSound(63u, 22050); } -WRAPPER void -cAudioManager::ProcessJumboLanding(CPlane *) -{ - EAXJMP(0x56ED10); +cAudioManager::ProcessJumboLanding(CPlane *plane) +{ + float modificator = (LandingPoint - PlanePathPosition[plane->m_wIndex]) * 0.0028571f; + if(SetupJumboFlySound(107.f * modificator + 20)) { + if(SetupJumboTaxiSound(75.f * (1.f - modificator))) { + SetupJumboEngineSound(maxVolume, 22050); + SetupJumboWhineSound(18.f * (1.f - modificator), + 14600.f * modificator + 29500); + } + } } -WRAPPER void -cAudioManager::ProcessJumboTakeOff(CPlane *) +cAudioManager::ProcessJumboTakeOff(CPlane *plane) { - EAXJMP(0x56EC00); + double modificator = (PlanePathPosition[plane->m_wIndex] - TakeOffPoint) * 0.0033333f; + + if(cAudioManager::SetupJumboFlySound((107.f * modificator) + 20) && + cAudioManager::SetupJumboRumbleSound(maxVolume * (1.f - modificator))) { + if(cAudioManager::SetupJumboEngineSound(127u, 22050)) + cAudioManager::SetupJumboWhineSound(18.f * (1.f - modificator), 44100); + } } void @@ -4994,11 +5257,117 @@ cAudioManager::ProcessPoliceCellBeatingScriptObject(uint8 sound) EAXJMP(0x578190); } -WRAPPER void cAudioManager::ProcessPornCinema(uint8 sound) { - EAXJMP(0x577280); + + eAudioSamples sample; + uint32 time; + int32 rand; + float distSquared; + float maxDist; + + switch(sound) { + case SCRIPT_SOUND_PORN_CINEMA_1_S: + case SCRIPT_SOUND_MISTY_SEX_S: + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_PORN_CINEMA_1_BACKGROUND_1; + m_sQueueSample.m_bBankIndex = 0; + maxDist = 400.f; + sample = AUDIO_SAMPLE_PORN_CINEMA_1_SEX_1; + m_sQueueSample.m_fSoundIntensity = 20.0f; + break; + case SCRIPT_SOUND_PORN_CINEMA_1_L: + case SCRIPT_SOUND_MISTY_SEX_L: + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_PORN_CINEMA_1_BACKGROUND_1; + m_sQueueSample.m_bBankIndex = 0; + maxDist = 6400.f; + sample = AUDIO_SAMPLE_PORN_CINEMA_1_SEX_1; + m_sQueueSample.m_fSoundIntensity = 80.0f; + break; + case SCRIPT_SOUND_PORN_CINEMA_2_S: + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_PORN_CINEMA_2_BACKGROUND_2; + m_sQueueSample.m_bBankIndex = 0; + maxDist = 400.f; + sample = AUDIO_SAMPLE_PORN_CINEMA_2_SEX_1; + m_sQueueSample.m_fSoundIntensity = 20.0f; + break; + case SCRIPT_SOUND_PORN_CINEMA_2_L: + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_PORN_CINEMA_2_BACKGROUND_2; + m_sQueueSample.m_bBankIndex = 0; + maxDist = 6400.f; + sample = AUDIO_SAMPLE_PORN_CINEMA_2_SEX_1; + m_sQueueSample.m_fSoundIntensity = 80.0f; + break; + case SCRIPT_SOUND_PORN_CINEMA_3_S: + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_PORN_CINEMA_3_BACKGROUND_3; + m_sQueueSample.m_bBankIndex = 0; + maxDist = 400.f; + m_sQueueSample.m_fSoundIntensity = 20.0f; + sample = AUDIO_SAMPLE_PORN_CINEMA_3_SEX_1; + break; + case SCRIPT_SOUND_PORN_CINEMA_3_L: + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_PORN_CINEMA_3_BACKGROUND_3; + m_sQueueSample.m_bBankIndex = 0; + maxDist = 6400.f; + m_sQueueSample.m_fSoundIntensity = 80.0f; + sample = AUDIO_SAMPLE_PORN_CINEMA_3_SEX_1; + break; + default: break; + } + distSquared = GetDistanceSquared(&m_sQueueSample.m_vecPos); + if(distSquared < maxDist) { + m_sQueueSample.m_fDistance = sqrt(distSquared); + if(sound != SCRIPT_SOUND_MISTY_SEX_S && sound != SCRIPT_SOUND_MISTY_SEX_L) { + m_sQueueSample.m_bVolume = + ComputeVolume(maxVolume, m_sQueueSample.m_fSoundIntensity, + m_sQueueSample.m_fDistance); + if(m_sQueueSample.m_bVolume) { + m_sQueueSample.m_nFrequency = cSampleManager.GetSampleBaseFrequency( + m_sQueueSample.m_nSampleIndex); + m_sQueueSample.field_4 = 0; + m_sQueueSample.m_bIsDistant = 0; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.field_56 = 0; + m_sQueueSample.field_16 = 3; + m_sQueueSample.field_48 = 2.0f; + m_sQueueSample.m_bEmittingVolume = maxVolume; + m_sQueueSample.m_nLoopStart = + cSampleManager.GetSampleLoopStartOffset( + m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_nLoopEnd = cSampleManager.GetSampleLoopEndOffset( + m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_bReverbFlag = 1; + m_sQueueSample.m_bRequireReflection = 0; + AddSampleToRequestedQueue(); + } + } + + time = CTimer::GetTimeInMilliseconds(); + if(time > audioLogicTimers[0]) { + m_sQueueSample.m_bVolume = ComputeVolume( + 90u, m_sQueueSample.m_fSoundIntensity, m_sQueueSample.m_fDistance); + if(m_sQueueSample.m_bVolume) { + rand = m_anRandomTable[1] & 1; + m_sQueueSample.m_nSampleIndex = rand + sample; + m_sQueueSample.m_nFrequency = cSampleManager.GetSampleBaseFrequency( + m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_nFrequency += + RandomDisplacement(m_sQueueSample.m_nFrequency >> 4); + m_sQueueSample.field_4 = rand + 1; + m_sQueueSample.m_bIsDistant = 0; + m_sQueueSample.m_nLoopCount = 1; + m_sQueueSample.field_56 = 1; + m_sQueueSample.field_16 = 6; + m_sQueueSample.field_48 = 0.0f; + m_sQueueSample.m_nLoopStart = 0; + m_sQueueSample.m_nLoopEnd = -1; + m_sQueueSample.m_bReverbFlag = 1; + m_sQueueSample.m_bRequireReflection = 0; + AddSampleToRequestedQueue(); + audioLogicTimers[0] = time + 2000 + m_anRandomTable[3] % 6000u; + } + } + } } WRAPPER @@ -5008,11 +5377,70 @@ cAudioManager::ProcessProjectiles() EAXJMP(0x578A80); } -WRAPPER void cAudioManager::ProcessSawMillScriptObject(uint8 sound) { - EAXJMP(0x577630); + uint32 time; + float distSquared; + float maxDist; + + switch(sound) { + case SCRIPT_SOUND_SAWMILL_LOOP_S: + case SCRIPT_SOUND_SAWMILL_LOOP_L: + maxDist = 900.f; + m_sQueueSample.m_fSoundIntensity = 30.0f; + break; + default: break; + } + distSquared = GetDistanceSquared(&m_sQueueSample.m_vecPos); + if(distSquared < maxDist) { + m_sQueueSample.m_fDistance = sqrt(distSquared); + m_sQueueSample.m_bVolume = cAudioManager::ComputeVolume( + 30u, m_sQueueSample.m_fSoundIntensity, m_sQueueSample.m_fDistance); + if(m_sQueueSample.m_bVolume) { + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_SAWMILL_1; + m_sQueueSample.m_bBankIndex = 0; + m_sQueueSample.m_nFrequency = + cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_SAWMILL_1); + m_sQueueSample.field_4 = 0; + m_sQueueSample.m_bIsDistant = 0; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.field_56 = 0; + m_sQueueSample.field_16 = 5; + m_sQueueSample.field_48 = 2.0f; + m_sQueueSample.m_bEmittingVolume = 30; + m_sQueueSample.m_nLoopStart = + cSampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_nLoopEnd = + cSampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_bReverbFlag = 1; + m_sQueueSample.m_bRequireReflection = 0; + AddSampleToRequestedQueue(); + } + time = CTimer::GetTimeInMilliseconds(); + if(time > audioLogicTimers[1]) { + m_sQueueSample.m_bVolume = cAudioManager::ComputeVolume( + 70u, m_sQueueSample.m_fSoundIntensity, m_sQueueSample.m_fDistance); + if(m_sQueueSample.m_bVolume) { + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_SAWMILL_2; + m_sQueueSample.m_bBankIndex = 0; + m_sQueueSample.m_nFrequency = cSampleManager.GetSampleBaseFrequency( + m_sQueueSample.m_nSampleIndex); + m_sQueueSample.field_4 = 1; + m_sQueueSample.m_bIsDistant = 0; + m_sQueueSample.m_nLoopCount = 1; + m_sQueueSample.field_56 = 1; + m_sQueueSample.field_16 = 3; + m_sQueueSample.field_48 = 2.0f; + m_sQueueSample.m_nLoopStart = 0; + m_sQueueSample.m_nLoopEnd = -1; + m_sQueueSample.m_bReverbFlag = 1; + m_sQueueSample.m_bRequireReflection = 0; + AddSampleToRequestedQueue(); + audioLogicTimers[1] = time + 2000 + m_anRandomTable[3] % 4000u; + } + } + } } WRAPPER @@ -5022,19 +5450,78 @@ cAudioManager::ProcessScriptObject(int32 id) EAXJMP(0x576070); } -WRAPPER void cAudioManager::ProcessShopScriptObject(uint8 sound) { - EAXJMP(0x577970); + uint32 time; + int32 rand; + float distSquared; + float maxDist; + + switch(sound) { + case SCRIPT_SOUND_SHOP_LOOP_S: + case SCRIPT_SOUND_SHOP_LOOP_L: + maxDist = 900.f; + m_sQueueSample.m_fSoundIntensity = 30.0f; + break; + default: break; + } + distSquared = GetDistanceSquared(&m_sQueueSample.m_vecPos); + if(distSquared < maxDist) { + m_sQueueSample.m_fDistance = sqrt(distSquared); + m_sQueueSample.m_bVolume = ComputeVolume(30u, m_sQueueSample.m_fSoundIntensity, + m_sQueueSample.m_fDistance); + if(m_sQueueSample.m_bVolume) { + m_sQueueSample.m_nSampleIndex = AUDIO_SAMPLE_SHOP_1; + m_sQueueSample.m_bBankIndex = 0; + m_sQueueSample.m_nFrequency = + cSampleManager.GetSampleBaseFrequency(AUDIO_SAMPLE_SHOP_1); + m_sQueueSample.field_4 = 0; + m_sQueueSample.m_bIsDistant = 0; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.field_56 = 0; + m_sQueueSample.field_16 = 5; + m_sQueueSample.field_48 = 2.0f; + m_sQueueSample.m_bEmittingVolume = 30; + m_sQueueSample.m_nLoopStart = + cSampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_nLoopEnd = + cSampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_bReverbFlag = 1; + m_sQueueSample.m_bRequireReflection = 0; + cAudioManager::AddSampleToRequestedQueue(); + } + time = CTimer::GetTimeInMilliseconds(); + if(time > audioLogicTimers[2]) { + m_sQueueSample.m_bVolume = ComputeVolume( + 70u, m_sQueueSample.m_fSoundIntensity, m_sQueueSample.m_fDistance); + if(m_sQueueSample.m_bVolume) { + rand = m_anRandomTable[1] & 1; + m_sQueueSample.m_nSampleIndex = rand + AUDIO_SAMPLE_SHOP_2; + m_sQueueSample.m_bBankIndex = 0; + m_sQueueSample.m_nFrequency = cSampleManager.GetSampleBaseFrequency( + m_sQueueSample.m_nSampleIndex); + m_sQueueSample.field_4 = rand + 1; + m_sQueueSample.m_bIsDistant = 0; + m_sQueueSample.m_nLoopCount = 1; + m_sQueueSample.field_56 = 1; + m_sQueueSample.field_16 = 3; + m_sQueueSample.field_48 = 2.0f; + m_sQueueSample.m_bEmittingVolume = 70; + m_sQueueSample.m_nLoopStart = 0; + m_sQueueSample.m_nLoopEnd = -1; + m_sQueueSample.m_bReverbFlag = 1; + m_sQueueSample.m_bRequireReflection = 0; + AddSampleToRequestedQueue(); + audioLogicTimers[2] = time + 3000 + m_anRandomTable[3] % 7000u; + } + } + } } void cAudioManager::ProcessSpecial() { - CPlayerPed *playerPed; - ePedState state; - if(m_bUserPause) { if(!m_bPreviousUserPause) { MusicManager.ChangeMusicMode(0); @@ -5046,9 +5533,9 @@ cAudioManager::ProcessSpecial() MusicManager.StopFrontEndTrack(); MusicManager.ChangeMusicMode(1u); } - playerPed = FindPlayerPed(); + CPlayerPed *playerPed = FindPlayerPed(); if(playerPed) { - state = playerPed->m_nPedState; + const PedState &state = playerPed->m_nPedState; if(state != PED_ENTER_CAR && state != PED_STEAL_CAR && !playerPed->bInVehicle) cSampleManager.StopChannel(m_bActiveSamples); @@ -5091,11 +5578,11 @@ cAudioManager::ProcessWorkShopScriptObject(uint8 sound) case SCRIPT_SOUND_WORK_SHOP_LOOP_S: case SCRIPT_SOUND_WORK_SHOP_LOOP_L: maxDist = 400.f; - this->m_sQueueSample.m_fSoundIntensity = 20.0; + m_sQueueSample.m_fSoundIntensity = 20.0; break; default: break; } - distSquared = GetDistanceSquared(m_sQueueSample.m_vecPos); + distSquared = GetDistanceSquared(&m_sQueueSample.m_vecPos); if(distSquared < maxDist) { m_sQueueSample.m_fDistance = sqrt(distSquared); m_sQueueSample.m_bVolume = ComputeVolume(30u, m_sQueueSample.m_fSoundIntensity, @@ -5184,6 +5671,10 @@ InjectHook(0x56C3F0, &cAudioManager::UsesSirenSwitching, PATCH_JUMP); InjectHook(0x579520, &cAudioManager::MissionScriptAudioUsesPoliceChannel, PATCH_JUMP); InjectHook(0x57A8C0, &cAudioManager::Get3DProviderName, PATCH_JUMP); +InjectHook(0x56F230, &cAudioManager::SetupJumboFlySound, PATCH_JUMP); +InjectHook(0x56F310, &cAudioManager::SetupJumboRumbleSound, PATCH_JUMP); +InjectHook(0x56EF20, &cAudioManager::SetupJumboTaxiSound, PATCH_JUMP); +InjectHook(0x56F070, &cAudioManager::SetupJumboWhineSound, PATCH_JUMP); InjectHook(0x579620, &cAudioManager::PlayLoadedMissionAudio, PATCH_JUMP); @@ -5216,6 +5707,9 @@ InjectHook(0x56AD10, &cAudioManager::PlayerJustGotInCar, PATCH_JUMP); InjectHook(0x56AD20, &cAudioManager::PlayerJustLeftCar, PATCH_JUMP); InjectHook(0x570DB0, &cAudioManager::GetPhrase, PATCH_JUMP); +// Get ped sfx stuff +InjectHook(0x570960, &cAudioManager::GetPedCommentSfx, PATCH_JUMP); + InjectHook(0x570E00, &cAudioManager::GetPlayerTalkSfx, PATCH_JUMP); InjectHook(0x570EA0, &cAudioManager::GetCopTalkSfx, PATCH_JUMP); InjectHook(0x570F80, &cAudioManager::GetSwatTalkSfx, PATCH_JUMP); @@ -5306,13 +5800,18 @@ InjectHook(0x578FD0, &cAudioManager::ProcessFireHydrant, PATCH_JUMP); InjectHook(0x5785E0, &cAudioManager::ProcessFrontEnd, PATCH_JUMP); InjectHook(0x577FE0, &cAudioManager::ProcessHomeScriptObject, PATCH_JUMP); InjectHook(0x56E8F0, &cAudioManager::ProcessJumbo, PATCH_JUMP); - +InjectHook(0x56EA40, &cAudioManager::ProcessJumboAccel, PATCH_JUMP); +InjectHook(0x56EE40, &cAudioManager::ProcessJumboDecel, PATCH_JUMP); InjectHook(0x56ECF0, &cAudioManager::ProcessJumboFlying, PATCH_JUMP); +InjectHook(0x56ED10, &cAudioManager::ProcessJumboLanding, PATCH_JUMP); +InjectHook(0x56EC00, &cAudioManager::ProcessJumboTakeOff, PATCH_JUMP); InjectHook(0x56EA10, &cAudioManager::ProcessJumboTaxi, PATCH_JUMP); InjectHook(0x5777E0, &cAudioManager::ProcessLaunderetteScriptObject, PATCH_JUMP); InjectHook(0x576770, &cAudioManager::ProcessLoopingScriptObject, PATCH_JUMP); - InjectHook(0x5699C0, &cAudioManager::ProcessPhysical, PATCH_JUMP); -InjectHook(0x5697D0, &cAudioManager::ProcessPhysical, PATCH_JUMP); +InjectHook(0x577280, &cAudioManager::ProcessPornCinema, PATCH_JUMP); +InjectHook(0x577630, &cAudioManager::ProcessSawMillScriptObject, PATCH_JUMP); +InjectHook(0x577970, &cAudioManager::ProcessShopScriptObject, PATCH_JUMP); +InjectHook(0x5697D0, &cAudioManager::ProcessSpecial, PATCH_JUMP); InjectHook(0x577530, &cAudioManager::ProcessWorkShopScriptObject, PATCH_JUMP); ENDPATCHES diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index 0c26fa0e..799526a3 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -171,6 +171,7 @@ static_assert(sizeof(cMissionAudio) == 0x20, "cMissionAudio: error"); class cVehicleParams; class CPlane; class CVehicle; +class CPed; struct cAudioScriptObject { int16 m_wSound; @@ -293,9 +294,10 @@ public: uint8 Get3DProviderName(uint8 id); - bool SetupJumboFlySound(uint8); // todo - bool SetupJumboTaxiSound(uint8); // todo - bool SetupJumboWhineSound(uint8, int32); // todo + bool SetupJumboFlySound(uint8 emittingVol); /// ok + bool SetupJumboRumbleSound(uint8 emittingVol); /// ok + bool SetupJumboTaxiSound(uint8 vol); /// ok + bool SetupJumboWhineSound(uint8 emittingVol, int32 freq); /// ok void PlayLoadedMissionAudio(); @@ -335,6 +337,8 @@ public: void DoJumboVolOffset(); + int32 GetPedCommentSfx(CPed *ped, int32 sound); + uint32 GetPlayerTalkSfx(int16 sound); uint32 GetCopTalkSfx(int16 sound); uint32 GetSwatTalkSfx(int16 sound); @@ -436,11 +440,11 @@ public: // bool ProcessHelicopter(void *); // todo requires CVehicle void ProcessHomeScriptObject(uint8 sound); /// ok void ProcessJumbo(cVehicleParams *); /// ok - void ProcessJumboAccel(CPlane *); // todo - void ProcessJumboDecel(CPlane *); // todo + void ProcessJumboAccel(CPlane *plane); /// ok + void ProcessJumboDecel(CPlane *plane); /// ok void ProcessJumboFlying(); /// ok - void ProcessJumboLanding(CPlane *); // todo - void ProcessJumboTakeOff(CPlane *); // todo + void ProcessJumboLanding(CPlane *plane); /// ok + void ProcessJumboTakeOff(CPlane *plane); /// ok void ProcessJumboTaxi(); /// ok void ProcessLaunderetteScriptObject(uint8 sound); /// ok void ProcessLoopingScriptObject(uint8 sound); /// ok @@ -454,14 +458,14 @@ public: void ProcessPlane(void *); // todo // void ProcessPlayersVehicleEngine(void *, void *); void ProcessPoliceCellBeatingScriptObject(uint8 sound); // todo - void ProcessPornCinema(uint8 sound); // todo + void ProcessPornCinema(uint8 sound); /// ok void ProcessProjectiles(); // todo // void ProcessRainOnVehicle(void *); // void ProcessReverb(); // bool ProcessReverseGear(void *); - void ProcessSawMillScriptObject(uint8 sound); // todo + void ProcessSawMillScriptObject(uint8 sound); /// ok void ProcessScriptObject(int32 id); // todo - void ProcessShopScriptObject(uint8 sound); // todo + void ProcessShopScriptObject(uint8 sound); /// ok void ProcessSpecial(); /// ok // bool ProcessTrainNoise(void *); void ProcessVehicle(CVehicle *); // todo diff --git a/src/vehicles/Automobile.cpp b/src/vehicles/Automobile.cpp index eaa16435..93590b2e 100644 --- a/src/vehicles/Automobile.cpp +++ b/src/vehicles/Automobile.cpp @@ -115,7 +115,7 @@ CAutomobile::CAutomobile(int32 id, uint8 CreatedBy) field_594 = 0; bNotDamagedUpsideDown = false; bMoreResistantToDamage = false; - field_514 = 0; + m_fVelocityChangeForAudio = 0.f; field_4E2 = 0; for(i = 0; i < 4; i++){ |