From 16f892b667224c1b3fd30aa5a1942f36c98d6224 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Wed, 28 Jul 2021 00:41:34 +0300 Subject: AudioLogic type fixes and reordering (before peds) --- src/audio/AudioLogic.cpp | 3913 +++++++++++++++++++++++----------------------- 1 file changed, 1956 insertions(+), 1957 deletions(-) (limited to 'src/audio/AudioLogic.cpp') diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index f9de1793..4423b826 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -51,7 +51,7 @@ enum PLAY_STATUS { PLAY_STATUS_STOPPED = 0, PLAY_STATUS_PLAYING, PLAY_STATUS_FIN enum LOADING_STATUS { LOADING_STATUS_NOT_LOADED = 0, LOADING_STATUS_LOADED, LOADING_STATUS_FAILED }; void -cAudioManager::PreInitialiseGameSpecificSetup() const +cAudioManager::PreInitialiseGameSpecificSetup() { BankStartOffset[SFX_BANK_0] = SAMPLEBANK_START; #ifdef GTA_PS2 @@ -250,7 +250,7 @@ cAudioManager::ResetAudioLogicTimers(uint32 timer) } void -cAudioManager::ProcessReverb() const +cAudioManager::ProcessReverb() { #ifdef FIX_BUGS const uint32 numChannels = NUM_CHANNELS_GENERIC; @@ -269,7 +269,7 @@ cAudioManager::ProcessReverb() const } float -cAudioManager::GetDistanceSquared(const CVector &v) const +cAudioManager::GetDistanceSquared(const CVector &v) { const CVector &c = TheCamera.GetPosition(); return sq(v.x - c.x) + sq(v.y - c.y) + sq((v.z - c.z) * 0.2f); @@ -284,7 +284,8 @@ cAudioManager::CalculateDistance(bool8 &distCalculated, float dist) } } -CVehicle *cAudioManager::FindVehicleOfPlayer() +CVehicle * +cAudioManager::FindVehicleOfPlayer() { CVehicle* vehicle = FindPlayerVehicle(); CPlayerPed* ped = FindPlayerPed(); @@ -296,41 +297,6 @@ CVehicle *cAudioManager::FindVehicleOfPlayer() return vehicle; } -void -cAudioManager::ProcessPlayerMood() -{ - CPlayerPed *playerPed; - uint32& lastMissionPassedTime = CTheScripts::GetLastMissionPassedTime(); - uint32 curTime = CTimer::GetTimeInMilliseconds(); - - if (m_nPlayerMoodTimer <= curTime) { - playerPed = FindPlayerPed(); - if (playerPed != nil) { - - if (playerPed->m_pWanted->GetWantedLevel() > 3) { - m_nPlayerMood = PLAYER_MOOD_ANGRY; - return; - } - if (playerPed->m_pWanted->GetWantedLevel() > 1) { - m_nPlayerMood = PLAYER_MOOD_PISSED_OFF; - return; - } - - if (lastMissionPassedTime != -1) { - if (curTime < lastMissionPassedTime) { - lastMissionPassedTime = curTime; - return; - } - if (curTime < lastMissionPassedTime + 180000) { - m_nPlayerMood = PLAYER_MOOD_WISECRACKING; - return; - } - } - m_nPlayerMood = PLAYER_MOOD_CALM; - } - } -} - void cAudioManager::ProcessSpecial() { @@ -719,8 +685,6 @@ const tVehicleSampleData aVehicleSettings[MAX_CARS] = { {SFX_CAR_REV_1, CAR_SFX_BANKS_OFFSET, SFX_CAR_HORN_JEEP, 26513, SFX_CAR_HORN_JEEP, 9300, NEW_DOOR}, {SFX_CAR_REV_1, CAR_SFX_BANKS_OFFSET, SFX_CAR_HORN_JEEP, 26513, SFX_CAR_HORN_JEEP, 9400, NEW_DOOR} }; - - bool8 bPlayerJustEnteredCar; const bool8 hornPatternsArray[8][44] = { @@ -742,7 +706,8 @@ const bool8 hornPatternsArray[8][44] = { FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE}, }; -void cAudioManager::ProcessVehicle(CVehicle* veh) +void +cAudioManager::ProcessVehicle(CVehicle* veh) { CVehicle* playerVeh; cVehicleParams params; @@ -861,1450 +826,1855 @@ void cAudioManager::ProcessVehicle(CVehicle* veh) } void -cAudioManager::ProcessRainOnVehicle(cVehicleParams& params) +cAudioManager::ProcessCarHeli(cVehicleParams& params) { - const int SOUND_INTENSITY = 22.0f; + const float SOUND_INTENSITY = 250.0f; + + CVehicle* playerVeh; + CVehicle* veh; + CAutomobile* automobile; + CBoat* boat; - CVehicle *veh; uint8 emittingVol; + int16 brakeState; + int16 accelerateState; + uint32 freq; + float propellerSpeed; + float freqModifier; //may be relate to angle with horison + float cameraAngle; + bool8 distanceCalculatedOld; + float distanceOld; + CVector vecPosOld; - if (params.m_fDistance >= SQR(SOUND_INTENSITY) || CWeather::Rain <= 0.01f || CCullZones::CamNoRain() && CCullZones::PlayerNoRain()) + float volumeModifier;//TODO find better name + bool8 hunterBool; + + static uint32 freqFrontPrev = 14287; + static uint32 freqPropellerPrev = 7143; + static uint32 freqSkimmerPrev = 14287; + + boat = nil; + automobile = nil; + hunterBool = FALSE; + + if (params.m_fDistance >= SQR(SOUND_INTENSITY)) return; + playerVeh = FindPlayerVehicle(); veh = params.m_pVehicle; - veh->m_bRainAudioCounter++; - if (veh->m_bRainAudioCounter >= 2) { - veh->m_bRainAudioCounter = 0; - CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); - emittingVol = 30.0f * CWeather::Rain; + if (playerVeh == veh) { + accelerateState = Pads[0].GetAccelerate(); + brakeState = Pads[0].GetBrake(); + } else { + accelerateState = veh->m_fGasPedal * 255.0f; + brakeState = veh->m_fBrakePedal * 255.0f; + } + freqModifier = Abs(veh->GetUp().y); + cameraAngle = (DotProduct(veh->GetMatrix().GetForward(), TheCamera.GetForward()) + 1.0f) / 2.0f; + if (veh->m_modelIndex == MI_SKIMMER) { + boat = (CBoat*)veh; + propellerSpeed = boat->m_fMovingSpeed * 50.0f / 11.0f; + } else if (params.m_VehicleType == VEHICLE_TYPE_HELI) { + propellerSpeed = 1.0f; + } else { + automobile = (CAutomobile*)veh; + propellerSpeed = automobile->m_aWheelSpeed[1] * 50.0f / 11.0f; + } + + if (propellerSpeed == 0.0f) + return; + + propellerSpeed = Min(1.0f, propellerSpeed); + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); + + + //sound on long distances + if (m_sQueueSample.m_fDistance >= 40.0f) + emittingVol = propellerSpeed * 75.0f; + else if (m_sQueueSample.m_fDistance >= 25.0f) + emittingVol = (m_sQueueSample.m_fDistance - 25.0f) * (75.0f * propellerSpeed) / 15.0f; + else + emittingVol = 0; + if (emittingVol != 0) { m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, SOUND_INTENSITY, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_nCounter = veh->m_bRainSamplesCounter++; - if (veh->m_bRainSamplesCounter > 4) - veh->m_bRainSamplesCounter = 68; - m_sQueueSample.m_nSampleIndex = (m_anRandomTable[1] & 3) + SFX_CAR_RAIN_1; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_nCounter = 88; + if (boat != nil) { + m_sQueueSample.m_nSampleIndex = SFX_SEAPLANE_PRO3; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + if (accelerateState > 0 || brakeState > 0) + m_sQueueSample.m_nFrequency = 4600 + Min(1.0f, (Max(accelerateState, brakeState) / 255.0f) * freqModifier) * 563; + else + m_sQueueSample.m_nFrequency = 3651 + Min(1.0f, freqModifier) * 949; + } else { + m_sQueueSample.m_nSampleIndex = SFX_HELI_1; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex); + } m_sQueueSample.m_bIs2D = FALSE; - m_sQueueSample.m_nReleasingVolumeModificator = 9; - m_sQueueSample.m_nFrequency = m_anRandomTable[1] % 4000 + 28000; - m_sQueueSample.m_nLoopCount = 1; + m_sQueueSample.m_nReleasingVolumeModificator = 2; + m_sQueueSample.m_nLoopCount = 0; m_sQueueSample.m_nEmittingVolume = emittingVol; - RESET_LOOP_OFFSETS - m_sQueueSample.m_fSpeedMultiplier = 0.0f; + SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) + m_sQueueSample.m_fSpeedMultiplier = 6.0f; m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; - m_sQueueSample.m_bReleasingSoundFlag = TRUE; - m_sQueueSample.m_bReverbFlag = FALSE; + m_sQueueSample.m_bReleasingSoundFlag = FALSE; + m_sQueueSample.m_nReleasingVolumeDivider = 5; + m_sQueueSample.m_bReverbFlag = TRUE; m_sQueueSample.m_bRequireReflection = FALSE; AddSampleToRequestedQueue(); } } -} + + CVector backPropellerPos; + if (automobile != nil) + automobile->GetComponentWorldPosition(CAR_BOOT, backPropellerPos); + else if (params.m_VehicleType == VEHICLE_TYPE_HELI) +#ifdef FIX_BUGS + backPropellerPos = +#endif + params.m_pVehicle->GetMatrix() * CVector(0.0f, -10.0f, 0.0f); + else + backPropellerPos = m_sQueueSample.m_vecPos; -bool8 -cAudioManager::ProcessReverseGear(cVehicleParams& params) -{ - const int reverseGearIntensity = 30; + if (params.m_fDistance >= SQR(140.0f)) + return; - CAutomobile* automobile; - float modificator; - uint8 emittingVolume; + if (propellerSpeed >= 0.4f) + volumeModifier = (propellerSpeed - 0.4f) * 5.0f / 3.0f; + else + volumeModifier = 0.0f; + if (!boat) { + freq = Min(1300, 7000.0f * freqModifier); + if (playerVeh == veh && (accelerateState > 0 || brakeState > 0) && freq < 1300)//unnesesary freqModifier alredy <= 1300 + freq = 1300; + if (veh->m_modelIndex == MI_HUNTER) + hunterBool = TRUE; + } - if (params.m_fDistance >= SQR(reverseGearIntensity)) - return FALSE; - automobile = (CAutomobile*)params.m_pVehicle; - if (automobile->m_modelIndex == MI_CADDY) - return TRUE; - if (automobile->bEngineOn && (automobile->m_fGasPedal < 0.0f || automobile->m_nCurrentGear == 0)) { - CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); - if (automobile->m_nDriveWheelsOnGround != 0) { - modificator = params.m_fVelocityChange / params.m_pTransmission->fMaxReverseVelocity; - } else { - if (automobile->m_nDriveWheelsOnGroundPrev != 0) - automobile->m_fGasPedalAudio *= 0.4f; - modificator = automobile->m_fGasPedalAudio; - } - modificator = Abs(modificator); - emittingVolume = modificator * 24.0f; - m_sQueueSample.m_nVolume = ComputeVolume(emittingVolume, reverseGearIntensity, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume != 0) { - if (params.m_pVehicle->m_fGasPedal >= 0.0f) { - m_sQueueSample.m_nCounter = 62; - m_sQueueSample.m_nSampleIndex = SFX_REVERSE_GEAR_2; - } else { - m_sQueueSample.m_nCounter = 61; - m_sQueueSample.m_nSampleIndex = SFX_REVERSE_GEAR; - } + //sound from front of helicopter + emittingVol = (1.0f - cameraAngle) * volumeModifier * 127.0f; + m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, 140.0f, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume != 0) { + m_sQueueSample.m_nCounter = 3; + if (hunterBool) { + m_sQueueSample.m_nSampleIndex = SFX_HELI_APACHE_1; m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_nFrequency = (volumeModifier + 1.0f) * 16000 + freq; m_sQueueSample.m_bIs2D = FALSE; - m_sQueueSample.m_nReleasingVolumeModificator = 3; - m_sQueueSample.m_nFrequency = (6000.0f * modificator) + 7000; + m_sQueueSample.m_nReleasingVolumeModificator = 1; m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = emittingVolume; + m_sQueueSample.m_nEmittingVolume = emittingVol; SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) - m_sQueueSample.m_fSpeedMultiplier = 3.0f; - m_sQueueSample.m_fSoundIntensity = reverseGearIntensity; + m_sQueueSample.m_fSpeedMultiplier = 6.0f; + m_sQueueSample.m_fSoundIntensity = 140.0f; m_sQueueSample.m_bReleasingSoundFlag = FALSE; m_sQueueSample.m_nReleasingVolumeDivider = 5; m_sQueueSample.m_bReverbFlag = TRUE; m_sQueueSample.m_bRequireReflection = FALSE; AddSampleToRequestedQueue(); - } - } - return TRUE; -} - -void -cAudioManager::ProcessModelVehicle(cVehicleParams& params) -{ - const float SOUND_INTENSITY = 35.0f; - - static uint32 prevFreq = 14000; - static uint8 prevVolume = 0; - - uint32 freq; - int16 acceletateState; - int16 brakeState; - uint8 volume; - bool8 isPlayerVeh; - bool8 vehSlowdown; + } else if (boat != nil) { + m_sQueueSample.m_nSampleIndex = SFX_SEAPLANE_PRO1; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; - if (params.m_fDistance >= SQR(SOUND_INTENSITY)) - return; + if (accelerateState > 0 || brakeState > 0) + m_sQueueSample.m_nFrequency = 18000 + Min(1.0f, freqModifier * (Max(accelerateState, brakeState) / 255.0f)) * 2204; + else + m_sQueueSample.m_nFrequency = 14287 + Min(1.0f, freqModifier) * 3713; + if (propellerSpeed < 1.0f) + m_sQueueSample.m_nFrequency = (propellerSpeed + 1.0f) * (m_sQueueSample.m_nFrequency / 2.0f); + m_sQueueSample.m_nFrequency = Clamp2(m_sQueueSample.m_nFrequency, freqFrontPrev, 197); + freqFrontPrev = m_sQueueSample.m_nFrequency; - if (FindPlayerVehicle() == params.m_pVehicle) - isPlayerVeh = TRUE; - else -#ifdef FIX_BUGS - isPlayerVeh = CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle == params.m_pVehicle; -#else - isPlayerVeh = CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle != nil; -#endif - if (params.m_pVehicle->m_modelIndex == MI_RCBANDIT) { - if (((CAutomobile*)params.m_pVehicle)->m_nDriveWheelsOnGround != 0) { - volume = Min(127, 127.0f * Abs(params.m_fVelocityChange) * 3.0f); - freq = 8000.0f * Abs(params.m_fVelocityChange) + 14000; + m_sQueueSample.m_bIs2D = FALSE; + m_sQueueSample.m_nReleasingVolumeModificator = 1; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nEmittingVolume = emittingVol; + SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) + m_sQueueSample.m_fSpeedMultiplier = 6.0f; + m_sQueueSample.m_fSoundIntensity = 140.0f; + m_sQueueSample.m_bReleasingSoundFlag = FALSE; + m_sQueueSample.m_nReleasingVolumeDivider = 5; + m_sQueueSample.m_bReverbFlag = TRUE; + m_sQueueSample.m_bRequireReflection = FALSE; + AddSampleToRequestedQueue(); } else { - volume = 127; - freq = 25000; + m_sQueueSample.m_nSampleIndex = SFX_CAR_HELI_MAI; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_nFrequency = (volumeModifier + 1) * 16000 + freq; + m_sQueueSample.m_bIs2D = FALSE; + m_sQueueSample.m_nReleasingVolumeModificator = 1; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nEmittingVolume = emittingVol; + SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) + m_sQueueSample.m_fSpeedMultiplier = 6.0f; + m_sQueueSample.m_fSoundIntensity = 140.0f; + m_sQueueSample.m_bReleasingSoundFlag = FALSE; + m_sQueueSample.m_nReleasingVolumeDivider = 5; + m_sQueueSample.m_bReverbFlag = TRUE; + m_sQueueSample.m_bRequireReflection = FALSE; + AddSampleToRequestedQueue(); } - if (isPlayerVeh) { - volume = Clamp2(volume, prevVolume, 7); - freq = Clamp2(freq, prevFreq, 800); + } + + + //after accel rotor sound + emittingVol = ((cameraAngle + 1.0f) * volumeModifier * 127.0f) / 2.0f; + m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, 140.0f, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume != 0) { + m_sQueueSample.m_nCounter = 1; + if (hunterBool) { + m_sQueueSample.m_nSampleIndex = SFX_HELI_APACHE_2; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_nFrequency = (volumeModifier + 1) * 16000 + freq; + } else if (boat) { + m_sQueueSample.m_nSampleIndex = SFX_SEAPLANE_PRO2; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + + if (accelerateState > 0 || brakeState > 0) + m_sQueueSample.m_nFrequency = 9000 + Min(1.0f, (Max(accelerateState, brakeState) / 255) * freqModifier) * 1102; + else + m_sQueueSample.m_nFrequency = 7143 + Min(1.0f, freqModifier) * 1857; + + if (propellerSpeed < 1.0f) + m_sQueueSample.m_nFrequency = (propellerSpeed + 1) * (m_sQueueSample.m_nFrequency / 2); + + m_sQueueSample.m_nFrequency = Clamp2(m_sQueueSample.m_nFrequency, freqPropellerPrev, 98); + freqPropellerPrev = m_sQueueSample.m_nFrequency; + } else { + m_sQueueSample.m_nSampleIndex = SFX_CAR_HELI_MAI2; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_nFrequency = (volumeModifier + 1) * 16000 + freq; } - if (volume > 0) { - CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); - m_sQueueSample.m_nVolume = ComputeVolume(volume, SOUND_INTENSITY, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_nCounter = 2; - m_sQueueSample.m_nSampleIndex = SFX_RC_REV; + m_sQueueSample.m_bIs2D = FALSE; + m_sQueueSample.m_nReleasingVolumeModificator = 1; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nEmittingVolume = emittingVol; + SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) + m_sQueueSample.m_fSpeedMultiplier = 6.0f; + m_sQueueSample.m_fSoundIntensity = 140.0f; + m_sQueueSample.m_bReleasingSoundFlag = FALSE; + m_sQueueSample.m_nReleasingVolumeDivider = 5; + m_sQueueSample.m_bReverbFlag = TRUE; + m_sQueueSample.m_bRequireReflection = FALSE; + AddSampleToRequestedQueue(); + } + + + //engine starting sound + if (boat == nil && params.m_VehicleType != VEHICLE_TYPE_HELI && m_sQueueSample.m_fDistance < 30.0f) { //strange way to check if automobile != nil + if (automobile->bEngineOn) { + if (propellerSpeed < 1.0f) { + emittingVol = (1.0f - propellerSpeed / 2.0f) * 70.0f; + m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, 30.0f, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume) { + if (hunterBool) { + m_sQueueSample.m_nSampleIndex = SFX_HELI_APACHE_4; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + freq = 3000.0f * propellerSpeed + 30000; + } else { + m_sQueueSample.m_nSampleIndex = SFX_CAR_HELI_STA; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + freq = 3000.0f * propellerSpeed + 6000; + } + m_sQueueSample.m_nFrequency = freq; + m_sQueueSample.m_nCounter = 12; + m_sQueueSample.m_bIs2D = FALSE; + m_sQueueSample.m_nReleasingVolumeModificator = 1; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nEmittingVolume = emittingVol; + SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) + m_sQueueSample.m_fSpeedMultiplier = 6.0f; + m_sQueueSample.m_fSoundIntensity = 30.0f; + m_sQueueSample.m_bReleasingSoundFlag = FALSE; + m_sQueueSample.m_nReleasingVolumeDivider = 30; + m_sQueueSample.m_bReverbFlag = TRUE; + m_sQueueSample.m_bRequireReflection = FALSE; + AddSampleToRequestedQueue(); + } + } + } + } + + + if (boat) { + if (TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_FIXED && m_sQueueSample.m_fDistance < 20.0f && propellerSpeed > 0.0f) { + m_sQueueSample.m_nVolume = ComputeVolume(propellerSpeed * 100.0f, 20.0f, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume) { + + if (accelerateState > 0 || brakeState > 0) + m_sQueueSample.m_nFrequency = 18000 + Min(1.0f, (Max(accelerateState, brakeState) / 255.0f) * freqModifier) * 2204; + else + m_sQueueSample.m_nFrequency = 14287 + Min(1.0f, freqModifier) * 3713; + if (propellerSpeed < 1.0f) + m_sQueueSample.m_nFrequency = (propellerSpeed + 1) * (m_sQueueSample.m_nFrequency / 2.0f); + m_sQueueSample.m_nFrequency = Clamp2(m_sQueueSample.m_nFrequency, freqSkimmerPrev, 197); + freqSkimmerPrev = m_sQueueSample.m_nFrequency; + + m_sQueueSample.m_nSampleIndex = SFX_SEAPLANE_PRO4; m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_nCounter = 12; m_sQueueSample.m_bIs2D = FALSE; - m_sQueueSample.m_nReleasingVolumeModificator = 1; - m_sQueueSample.m_nFrequency = freq; + m_sQueueSample.m_nReleasingVolumeModificator = 3; m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = volume; - SET_LOOP_OFFSETS(SFX_RC_REV) - m_sQueueSample.m_fSpeedMultiplier = 3.0f; - m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + m_sQueueSample.m_nEmittingVolume = propellerSpeed * 100.0f; + SET_LOOP_OFFSETS(SFX_SEAPLANE_PRO4) + m_sQueueSample.m_fSpeedMultiplier = 5.0f; + m_sQueueSample.m_fSoundIntensity = 20.0f; m_sQueueSample.m_bReleasingSoundFlag = FALSE; - m_sQueueSample.m_nReleasingVolumeDivider = 4; + m_sQueueSample.m_nReleasingVolumeDivider = 7; m_sQueueSample.m_bReverbFlag = TRUE; m_sQueueSample.m_bRequireReflection = FALSE; AddSampleToRequestedQueue(); } } - if (isPlayerVeh) { - prevFreq = freq; - prevVolume = volume; - } - } else if (params.m_pVehicle != nil) { - if (isPlayerVeh) { - acceletateState = Pads[0].GetAccelerate(); - brakeState = Pads[0].GetBrake(); - } else { - acceletateState = 255.0f * params.m_pVehicle->m_fGasPedal; - brakeState = 255.0f * params.m_pVehicle->m_fBrakePedal; - } - if (acceletateState < brakeState) - acceletateState = brakeState; - if (acceletateState <= 0) { - vehSlowdown = TRUE; - volume = 127; - freq = 18000; - } else { - vehSlowdown = FALSE; - volume = Min(127, (127 * acceletateState / 255) * 3.0f * Abs(params.m_fVelocityChange)); - freq = Min(22000, (8000 * acceletateState / 255 + 14000) * 3.0f * Abs(params.m_fVelocityChange)); - } - if (isPlayerVeh && !vehSlowdown) { - volume = Clamp2(volume, prevVolume, 7); - freq = Clamp2(freq, prevFreq, 800); - } - if (!vehSlowdown) -#ifdef THIS_IS_STUPID - freq += 8000.0f * Abs(DotProduct(params.m_pVehicle->GetUp(), CVector(0.0f, 1.0f, 0.0f))); -#else - freq += 8000.0f * Abs(params.m_pVehicle->GetUp().y); -#endif - if (params.m_pVehicle->bIsDrowning) - volume /= 4; - if (volume > 0) { + } else { + //vacuum cleaner sound + vecPosOld = m_sQueueSample.m_vecPos; + distanceCalculatedOld = params.m_bDistanceCalculated; + distanceOld = params.m_fDistance; + + m_sQueueSample.m_vecPos = backPropellerPos; + params.m_bDistanceCalculated = FALSE; + params.m_fDistance = GetDistanceSquared(m_sQueueSample.m_vecPos); + if (params.m_fDistance < SQR(27.0f)) { CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); - m_sQueueSample.m_nVolume = ComputeVolume(volume, SOUND_INTENSITY, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume != 0) { - if (vehSlowdown) { - m_sQueueSample.m_nCounter = 0; - m_sQueueSample.m_nSampleIndex = SFX_RC_IDLE; - m_sQueueSample.m_nReleasingVolumeDivider = 6; - } else { - m_sQueueSample.m_nCounter = 2; - m_sQueueSample.m_nSampleIndex = SFX_RC_REV; - m_sQueueSample.m_nReleasingVolumeDivider = 4; - } + m_sQueueSample.m_nVolume = ComputeVolume(volumeModifier * 25.0f, 27.0f, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume) { + m_sQueueSample.m_nCounter = 2; + m_sQueueSample.m_nSampleIndex = hunterBool ? SFX_HELI_APACHE_3 : SFX_CAR_HELI_REA; m_sQueueSample.m_nBankIndex = SFX_BANK_0; m_sQueueSample.m_bIs2D = FALSE; - m_sQueueSample.m_nReleasingVolumeModificator = 3; - m_sQueueSample.m_nFrequency = freq; + m_sQueueSample.m_nReleasingVolumeModificator = 1; + m_sQueueSample.m_nFrequency = (volumeModifier + 1.0f) * 16000; m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = volume; + m_sQueueSample.m_nEmittingVolume = volumeModifier * 25.0f; SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) - m_sQueueSample.m_fSpeedMultiplier = 3.0f; - m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + m_sQueueSample.m_fSpeedMultiplier = 6.0f; + m_sQueueSample.m_fSoundIntensity = 27.0f; m_sQueueSample.m_bReleasingSoundFlag = FALSE; + m_sQueueSample.m_nReleasingVolumeDivider = 5; m_sQueueSample.m_bReverbFlag = TRUE; m_sQueueSample.m_bRequireReflection = FALSE; AddSampleToRequestedQueue(); } } - if (isPlayerVeh) { - if (vehSlowdown) { - prevFreq = freq; - prevVolume = volume; - } - } + + m_sQueueSample.m_vecPos = vecPosOld; + params.m_bDistanceCalculated = distanceCalculatedOld; + params.m_fDistance = distanceOld; } } void -cAudioManager::ProcessModelHeliVehicle(cVehicleParams& params) +cAudioManager::ProcessRainOnVehicle(cVehicleParams& params) { - const float SOUND_INTENSITY = 35.0f; - - static uint32 prevFreq = 22050; + const int SOUND_INTENSITY = 22.0f; - uint32 freq; - bool8 isPlayerVeh; - int16 acceletateState; - int16 brakeState; + CVehicle *veh; + uint8 emittingVol; - if (params.m_fDistance >= SQR(SOUND_INTENSITY)) + if (params.m_fDistance >= SQR(SOUND_INTENSITY) || CWeather::Rain <= 0.01f || CCullZones::CamNoRain() && CCullZones::PlayerNoRain()) return; - if (FindPlayerVehicle() == params.m_pVehicle) - isPlayerVeh = TRUE; - else -#ifdef FIX_BUGS - isPlayerVeh = CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle == params.m_pVehicle; -#else - isPlayerVeh = CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle != nil; -#endif - if (isPlayerVeh) { - brakeState = Pads[0].GetBrake(); - acceletateState = Max(Pads[0].GetAccelerate(), Abs(Pads[0].GetCarGunUpDown()) * 2); - } else { - acceletateState = 255.0f * params.m_pVehicle->m_fGasPedal; - brakeState = 255.0f * params.m_pVehicle->m_fBrakePedal; - } - if (acceletateState < brakeState) - acceletateState = brakeState; - freq = Clamp2(5 * acceletateState + 22050, prevFreq, 30); - CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); - m_sQueueSample.m_nVolume = ComputeVolume(70, SOUND_INTENSITY, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_nCounter = 2; - m_sQueueSample.m_nSampleIndex = SFX_CAR_RC_HELI; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_bIs2D = FALSE; - m_sQueueSample.m_nReleasingVolumeModificator = 3; - m_sQueueSample.m_nFrequency = freq; - m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = 70; - SET_LOOP_OFFSETS(SFX_CAR_RC_HELI) - m_sQueueSample.m_fSpeedMultiplier = 3.0f; - m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; - m_sQueueSample.m_bReleasingSoundFlag = FALSE; - m_sQueueSample.m_nReleasingVolumeDivider = 4; - m_sQueueSample.m_bReverbFlag = TRUE; - m_sQueueSample.m_bRequireReflection = FALSE; - AddSampleToRequestedQueue(); - } - if (isPlayerVeh) - prevFreq = freq; -} - -bool8 -cAudioManager::ProcessVehicleRoadNoise(cVehicleParams& params) -{ - const float SOUND_INTENSITY = 95.0f; - - int32 emittingVol; - uint32 freq; - float multiplier; - int sampleFreq; - float velocity; - uint8 wheelsOnGround; - - if (params.m_fDistance >= SQR(SOUND_INTENSITY)) - return FALSE; - - if (params.m_fDistance >= SQR(SOUND_INTENSITY)) - return FALSE; - switch (params.m_VehicleType) { - case VEHICLE_TYPE_CAR: - wheelsOnGround = ((CAutomobile*)params.m_pVehicle)->m_nWheelsOnGround; - break; - case VEHICLE_TYPE_BIKE: - wheelsOnGround = ((CBike*)params.m_pVehicle)->m_nWheelsOnGround; - break; - default: - wheelsOnGround = 4; - break; - } - if (params.m_pTransmission == nil || wheelsOnGround == 0) - return TRUE; - - velocity = Abs(params.m_fVelocityChange); - if (velocity > 0.0f) { + veh = params.m_pVehicle; + veh->m_bRainAudioCounter++; + if (veh->m_bRainAudioCounter >= 2) { + veh->m_bRainAudioCounter = 0; CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); - emittingVol = 30.f * Min(1.f, velocity / (0.5f * params.m_pTransmission->fMaxVelocity)); + emittingVol = 30.0f * CWeather::Rain; m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, SOUND_INTENSITY, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_nCounter = 0; + m_sQueueSample.m_nCounter = veh->m_bRainSamplesCounter++; + if (veh->m_bRainSamplesCounter > 4) + veh->m_bRainSamplesCounter = 68; + m_sQueueSample.m_nSampleIndex = (m_anRandomTable[1] & 3) + SFX_CAR_RAIN_1; m_sQueueSample.m_nBankIndex = SFX_BANK_0; m_sQueueSample.m_bIs2D = FALSE; - m_sQueueSample.m_nReleasingVolumeModificator = 3; - if (params.m_pVehicle->m_nSurfaceTouched == SURFACE_WATER) { - m_sQueueSample.m_nSampleIndex = SFX_BOAT_WATER_LOOP; - freq = 6050 * emittingVol / 30 + 16000; - } else { - m_sQueueSample.m_nSampleIndex = SFX_ROAD_NOISE; - multiplier = (m_sQueueSample.m_fDistance / SOUND_INTENSITY) * 0.5f; - sampleFreq = SampleManager.GetSampleBaseFrequency(SFX_ROAD_NOISE); - freq = (sampleFreq * multiplier) + ((3 * sampleFreq) / 4); - } - m_sQueueSample.m_nFrequency = freq; - m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nReleasingVolumeModificator = 9; + m_sQueueSample.m_nFrequency = m_anRandomTable[1] % 4000 + 28000; + m_sQueueSample.m_nLoopCount = 1; m_sQueueSample.m_nEmittingVolume = emittingVol; - SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) - m_sQueueSample.m_fSpeedMultiplier = 6.0f; + RESET_LOOP_OFFSETS + m_sQueueSample.m_fSpeedMultiplier = 0.0f; m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; - m_sQueueSample.m_bReleasingSoundFlag = FALSE; - m_sQueueSample.m_nReleasingVolumeDivider = 4; - m_sQueueSample.m_bReverbFlag = TRUE; + m_sQueueSample.m_bReleasingSoundFlag = TRUE; + m_sQueueSample.m_bReverbFlag = FALSE; m_sQueueSample.m_bRequireReflection = FALSE; AddSampleToRequestedQueue(); } } - - return TRUE; } bool8 -cAudioManager::ProcessWetRoadNoise(cVehicleParams& params) +cAudioManager::ProcessReverseGear(cVehicleParams& params) { - const float SOUND_INTENSITY = 30.0f; + const int reverseGearIntensity = 30; - float relativeVelocity; - int32 emittingVol; - float multiplier; - int freq; - float velocity; - uint8 wheelsOnGround; + CAutomobile* automobile; + float modificator; + uint8 emittingVolume; - if (params.m_fDistance >= SQR(SOUND_INTENSITY)) + if (params.m_fDistance >= SQR(reverseGearIntensity)) return FALSE; - switch (params.m_VehicleType) { - case VEHICLE_TYPE_CAR: - wheelsOnGround = ((CAutomobile*)params.m_pVehicle)->m_nWheelsOnGround; - break; - case VEHICLE_TYPE_BIKE: - wheelsOnGround = ((CBike*)params.m_pVehicle)->m_nWheelsOnGround; - break; - default: - wheelsOnGround = 4; - break; - } - if (params.m_pTransmission == nil || wheelsOnGround == 0) + automobile = (CAutomobile*)params.m_pVehicle; + if (automobile->m_modelIndex == MI_CADDY) return TRUE; - - velocity = Abs(params.m_fVelocityChange); - if (velocity > 0.0f) { + if (automobile->bEngineOn && (automobile->m_fGasPedal < 0.0f || automobile->m_nCurrentGear == 0)) { CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); - relativeVelocity = Min(1.0f, velocity / (0.5f * params.m_pTransmission->fMaxVelocity)); - emittingVol = 23.0f * relativeVelocity * CWeather::WetRoads; - m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, SOUND_INTENSITY, m_sQueueSample.m_fDistance); + if (automobile->m_nDriveWheelsOnGround != 0) { + modificator = params.m_fVelocityChange / params.m_pTransmission->fMaxReverseVelocity; + } else { + if (automobile->m_nDriveWheelsOnGroundPrev != 0) + automobile->m_fGasPedalAudio *= 0.4f; + modificator = automobile->m_fGasPedalAudio; + } + modificator = Abs(modificator); + emittingVolume = modificator * 24.0f; + m_sQueueSample.m_nVolume = ComputeVolume(emittingVolume, reverseGearIntensity, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_nCounter = 1; - m_sQueueSample.m_nSampleIndex = SFX_ROAD_NOISE; + if (params.m_pVehicle->m_fGasPedal >= 0.0f) { + m_sQueueSample.m_nCounter = 62; + m_sQueueSample.m_nSampleIndex = SFX_REVERSE_GEAR_2; + } else { + m_sQueueSample.m_nCounter = 61; + m_sQueueSample.m_nSampleIndex = SFX_REVERSE_GEAR; + } m_sQueueSample.m_nBankIndex = SFX_BANK_0; m_sQueueSample.m_bIs2D = FALSE; m_sQueueSample.m_nReleasingVolumeModificator = 3; - multiplier = (m_sQueueSample.m_fDistance / SOUND_INTENSITY) * 0.5f; - freq = SampleManager.GetSampleBaseFrequency(SFX_ROAD_NOISE); - m_sQueueSample.m_nFrequency = freq + freq * multiplier; + m_sQueueSample.m_nFrequency = (6000.0f * modificator) + 7000; m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = emittingVol; + m_sQueueSample.m_nEmittingVolume = emittingVolume; SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) - m_sQueueSample.m_fSpeedMultiplier = 6.0f; - m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + m_sQueueSample.m_fSpeedMultiplier = 3.0f; + m_sQueueSample.m_fSoundIntensity = reverseGearIntensity; m_sQueueSample.m_bReleasingSoundFlag = FALSE; - m_sQueueSample.m_nReleasingVolumeDivider = 4; + m_sQueueSample.m_nReleasingVolumeDivider = 5; m_sQueueSample.m_bReverbFlag = TRUE; m_sQueueSample.m_bRequireReflection = FALSE; AddSampleToRequestedQueue(); } } - return TRUE; } void -cAudioManager::ProcessVehicleEngine(cVehicleParams& params) +cAudioManager::ProcessModelHeliVehicle(cVehicleParams& params) { - const float SOUND_INTENSITY = 50.0f; + const float SOUND_INTENSITY = 35.0f; - CVehicle* playerVeh; - CVehicle* veh; - CAutomobile* automobile; - cTransmission* transmission; - CBike* bike; - tWheelState* wheelState; - float* gasPedalAudioPtr; + static uint32 prevFreq = 22050; - int32 freq = 0; - uint8 currentGear; - uint8 emittingVol; - int8 wheelsOnGround; - int8 wheelsOnGroundPrev; - float relativeGearChange; - float relativeChange; - float modificator; - float traction; - bool8 isMoped; - bool8 caddyBool; + uint32 freq; + bool8 isPlayerVeh; + int16 acceletateState; + int16 brakeState; - isMoped = FALSE; - caddyBool = FALSE; - traction = 0.0f; if (params.m_fDistance >= SQR(SOUND_INTENSITY)) return; - playerVeh = FindPlayerVehicle(); - veh = params.m_pVehicle; - if (playerVeh == veh && veh->GetStatus() == STATUS_WRECKED) { - SampleManager.StopChannel(CHANNEL_PLAYER_VEHICLE_ENGINE); - return; + + if (FindPlayerVehicle() == params.m_pVehicle) + isPlayerVeh = TRUE; + else +#ifdef FIX_BUGS + isPlayerVeh = CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle == params.m_pVehicle; +#else + isPlayerVeh = CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle != nil; +#endif + if (isPlayerVeh) { + brakeState = Pads[0].GetBrake(); + acceletateState = Max(Pads[0].GetAccelerate(), Abs(Pads[0].GetCarGunUpDown()) * 2); + } else { + acceletateState = 255.0f * params.m_pVehicle->m_fGasPedal; + brakeState = 255.0f * params.m_pVehicle->m_fBrakePedal; } - if (!veh->bEngineOn) - return; + if (acceletateState < brakeState) + acceletateState = brakeState; + freq = Clamp2(5 * acceletateState + 22050, prevFreq, 30); CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); - if (playerVeh == veh && veh->m_modelIndex != MI_CADDY) { - ProcessPlayersVehicleEngine(params, params.m_pVehicle); - return; - } - transmission = params.m_pTransmission; - if (transmission != nil) { - switch (veh->m_modelIndex) { - case MI_PIZZABOY: - case MI_FAGGIO: - isMoped = TRUE; - currentGear = transmission->nNumberOfGears; - break; - case MI_CADDY: - currentGear = transmission->nNumberOfGears; - caddyBool = TRUE; - break; - default: - currentGear = veh->m_nCurrentGear; - break; - } - switch (params.m_VehicleType) { - case VEHICLE_TYPE_CAR: - automobile = (CAutomobile*)veh; - wheelsOnGround = automobile->m_nDriveWheelsOnGround; - wheelsOnGroundPrev = automobile->m_nDriveWheelsOnGroundPrev; - wheelState = automobile->m_aWheelState; - gasPedalAudioPtr = &automobile->m_fGasPedalAudio; - break; - case VEHICLE_TYPE_BIKE: - bike = (CBike*)veh; - wheelsOnGround = bike->m_nDriveWheelsOnGround; - wheelsOnGroundPrev = bike->m_nDriveWheelsOnGroundPrev; - wheelState = bike->m_aWheelState; - gasPedalAudioPtr = &bike->m_fGasPedalAudio; - break; - default: - debug(" ** AUDIOLOG: Unrecognised vehicle type %d in ProcessVehicleEngine() * \n", params.m_VehicleType); - return; - } - - if (wheelsOnGround != 0) { - if (!veh->bIsHandbrakeOn || isMoped && caddyBool) { //mb bug, bcs it's can't be TRUE together - if (veh->GetStatus() == STATUS_SIMPLE || isMoped || caddyBool) { - traction = 0.0f; - } else { - switch (transmission->nDriveType) { - case '4': - if (params.m_VehicleType == VEHICLE_TYPE_BIKE) { - for (int i = 0; i < 2; i++) - if (wheelState[i] == WHEEL_STATE_SPINNING) - traction += 0.1f; - } else { - for (int i = 0; i < 4; i++) - if (wheelState[i] == WHEEL_STATE_SPINNING) - traction += 0.05f; - } - break; - case 'F': - if (params.m_VehicleType == VEHICLE_TYPE_BIKE) { - if (wheelState[BIKEWHEEL_FRONT] == WHEEL_STATE_SPINNING) - traction += 0.2f; - } else { - if (wheelState[CARWHEEL_FRONT_LEFT] == WHEEL_STATE_SPINNING) - traction += 0.1f; - if (wheelState[CARWHEEL_FRONT_RIGHT] == WHEEL_STATE_SPINNING) - traction += 0.1f; - } - break; - case 'R': - if (params.m_VehicleType == VEHICLE_TYPE_BIKE) { - if (wheelState[BIKEWHEEL_REAR] == WHEEL_STATE_SPINNING) - traction += 0.2f; - } else { - if (wheelState[CARWHEEL_REAR_LEFT] == WHEEL_STATE_SPINNING) - traction += 0.1f; - if (wheelState[CARWHEEL_REAR_RIGHT] == WHEEL_STATE_SPINNING) - traction += 0.1f; - } - break; - default: - break; - } - } - } else if (params.m_fVelocityChange == 0.0f) { - traction = 0.9f; - } - if (transmission->fMaxVelocity <= 0.0f) { - relativeChange = 0.0f; - modificator = 0.0f; - } else { - if (!isMoped && !caddyBool) { - if (currentGear != 0) { - relativeGearChange = Min(1.0f, - params.m_fVelocityChange - transmission->Gears[currentGear].fShiftDownVelocity) / transmission->fMaxVelocity * 2.5f; - if (traction == 0.0f && veh->GetStatus() != STATUS_SIMPLE && - params.m_fVelocityChange < transmission->Gears[1].fShiftUpVelocity) - traction = 0.7f; - relativeChange = traction * *gasPedalAudioPtr * 0.95f + (1.0f - traction) * relativeGearChange; - } else { - relativeChange = Min(1.0f, - 1.0f - Abs((params.m_fVelocityChange - transmission->Gears[0].fShiftDownVelocity) / transmission->fMaxReverseVelocity)); - } - modificator = relativeChange; - } else { - modificator = Min(1.0f, Abs(params.m_fVelocityChange / transmission->fMaxVelocity > 1.0f)); - } - } - } else { - if (wheelsOnGroundPrev != 0) - *gasPedalAudioPtr *= 0.4f; - relativeChange = *gasPedalAudioPtr; - modificator = relativeChange; - } - if (currentGear != 0 || wheelsOnGround == 0) - freq = 1200 * currentGear + 18000.0f * modificator + 14000; - else if (params.m_VehicleType == VEHICLE_TYPE_BIKE) - freq = 22050; - else - freq = 13000.0f * modificator + 14000; - if (modificator >= 0.75f) - emittingVol = 90; - else - emittingVol = modificator * (4.0f / 3.0f) * 15.0f + 75; - } else { - modificator = 0.0f; - emittingVol = 75; - } - if (veh->bIsDrowning) - emittingVol /= 4; - if (caddyBool) { - emittingVol = 100.0f * modificator; - freq = 2130.0f * modificator + 4270; - m_sQueueSample.m_nCounter = 2; - } - m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, SOUND_INTENSITY, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume != 0) { - if (!caddyBool) { - if (veh->GetStatus() == STATUS_SIMPLE) { - if (modificator < 0.02f) { - m_sQueueSample.m_nSampleIndex = aVehicleSettings[params.m_nIndex].m_nBank - CAR_SFX_BANKS_OFFSET + SFX_CAR_IDLE_1; - m_sQueueSample.m_nCounter = 52; - freq = 10000.0f * modificator + 22050; - } else { - m_sQueueSample.m_nSampleIndex = aVehicleSettings[params.m_nIndex].m_nAccelerationSampleIndex; - m_sQueueSample.m_nCounter = 2; - } - } else { - if (veh->m_fGasPedal < 0.02f) { - m_sQueueSample.m_nSampleIndex = aVehicleSettings[params.m_nIndex].m_nBank - CAR_SFX_BANKS_OFFSET + SFX_CAR_IDLE_1; - m_sQueueSample.m_nCounter = 52; - freq = 10000.0f * modificator + 22050; - } else { - m_sQueueSample.m_nSampleIndex = aVehicleSettings[params.m_nIndex].m_nAccelerationSampleIndex; - m_sQueueSample.m_nCounter = 2; - } - } - m_sQueueSample.m_nFrequency = freq + 100 * m_sQueueSample.m_nBankIndex % 1000; - } else { - if (FindVehicleOfPlayer() == params.m_pVehicle) - m_sQueueSample.m_nSampleIndex = SFX_CAR_AFTER_ACCEL_12; - else - m_sQueueSample.m_nSampleIndex = SFX_CAR_REV_12; - m_sQueueSample.m_nFrequency = freq + 20 * m_sQueueSample.m_nBankIndex % 100; - } - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_bIs2D = FALSE; - m_sQueueSample.m_nReleasingVolumeModificator = 3; - if (m_sQueueSample.m_nSampleIndex == SFX_CAR_IDLE_5 || m_sQueueSample.m_nSampleIndex == SFX_CAR_REV_5) - m_sQueueSample.m_nFrequency /= 2; - m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = emittingVol; - SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) - m_sQueueSample.m_fSpeedMultiplier = 6.0f; - m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; - m_sQueueSample.m_bReleasingSoundFlag = FALSE; - m_sQueueSample.m_nReleasingVolumeDivider = 8; - m_sQueueSample.m_bReverbFlag = TRUE; - m_sQueueSample.m_bRequireReflection = FALSE; - AddSampleToRequestedQueue(); + m_sQueueSample.m_nVolume = ComputeVolume(70, SOUND_INTENSITY, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume != 0) { + m_sQueueSample.m_nCounter = 2; + m_sQueueSample.m_nSampleIndex = SFX_CAR_RC_HELI; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_bIs2D = FALSE; + m_sQueueSample.m_nReleasingVolumeModificator = 3; + m_sQueueSample.m_nFrequency = freq; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nEmittingVolume = 70; + SET_LOOP_OFFSETS(SFX_CAR_RC_HELI) + m_sQueueSample.m_fSpeedMultiplier = 3.0f; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + m_sQueueSample.m_bReleasingSoundFlag = FALSE; + m_sQueueSample.m_nReleasingVolumeDivider = 4; + m_sQueueSample.m_bReverbFlag = TRUE; + m_sQueueSample.m_bRequireReflection = FALSE; + AddSampleToRequestedQueue(); } + if (isPlayerVeh) + prevFreq = freq; } void -cAudioManager::UpdateGasPedalAudio(CVehicle* veh, int vehType) +cAudioManager::ProcessModelVehicle(cVehicleParams& params) { - float gasPedal = Abs(veh->m_fGasPedal); - float* gasPealAudioPtr; + const float SOUND_INTENSITY = 35.0f; - switch(vehType) { - case VEHICLE_TYPE_CAR: gasPealAudioPtr = &((CAutomobile *)veh)->m_fGasPedalAudio; break; - case VEHICLE_TYPE_BIKE: gasPealAudioPtr = &((CBike *)veh)->m_fGasPedalAudio; break; - default: return; - } - if (*gasPealAudioPtr < gasPedal) - *gasPealAudioPtr = Min(*gasPealAudioPtr + 0.09f, gasPedal); - else - *gasPealAudioPtr = Max(*gasPealAudioPtr - 0.07f, gasPedal); -} + static uint32 prevFreq = 14000; + static uint8 prevVolume = 0; -void -cAudioManager::PlayerJustGotInCar() const -{ - if (m_bIsInitialised) - bPlayerJustEnteredCar = TRUE; -} + uint32 freq; + int16 acceletateState; + int16 brakeState; + uint8 volume; + bool8 isPlayerVeh; + bool8 vehSlowdown; -void -cAudioManager::PlayerJustLeftCar(void) const -{ - // UNUSED: This is a perfectly empty function. -} + if (params.m_fDistance >= SQR(SOUND_INTENSITY)) + return; -void -cAudioManager::AddPlayerCarSample(uint8 emittingVolume, int32 freq, uint32 sample, uint8 bank, uint8 counter, bool8 notLooping) -{ - m_sQueueSample.m_nVolume = ComputeVolume(emittingVolume, 50.f, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_nCounter = counter; - m_sQueueSample.m_nSampleIndex = sample; -#ifdef GTA_PS2 - m_sQueueSample.m_nBankIndex = bank; + if (FindPlayerVehicle() == params.m_pVehicle) + isPlayerVeh = TRUE; + else +#ifdef FIX_BUGS + isPlayerVeh = CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle == params.m_pVehicle; #else - m_sQueueSample.m_nBankIndex = SFX_BANK_0; -#endif // GTA_PS2 - m_sQueueSample.m_bIs2D = FALSE; - m_sQueueSample.m_nReleasingVolumeModificator = 0; - m_sQueueSample.m_nFrequency = freq; - if (notLooping) { - m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nReleasingVolumeDivider = 8; + isPlayerVeh = CWorld::Players[CWorld::PlayerInFocus].m_pRemoteVehicle != nil; +#endif + if (params.m_pVehicle->m_modelIndex == MI_RCBANDIT) { + if (((CAutomobile*)params.m_pVehicle)->m_nDriveWheelsOnGround != 0) { + volume = Min(127, 127.0f * Abs(params.m_fVelocityChange) * 3.0f); + freq = 8000.0f * Abs(params.m_fVelocityChange) + 14000; } else { - m_sQueueSample.m_nLoopCount = 1; + volume = 127; + freq = 25000; } - m_sQueueSample.m_nEmittingVolume = emittingVolume; - SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) - m_sQueueSample.m_fSpeedMultiplier = 6.0f; - m_sQueueSample.m_fSoundIntensity = 50.0f; - m_sQueueSample.m_bReleasingSoundFlag = FALSE; - m_sQueueSample.m_bReverbFlag = TRUE; - m_sQueueSample.m_bRequireReflection = FALSE; - AddSampleToRequestedQueue(); - } -} - -void -cAudioManager::ProcessCesna(cVehicleParams ¶ms) -{ - if(params.m_fDistance < SQR(200)) { - CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); - m_sQueueSample.m_nVolume = ComputeVolume(80, 200.f, m_sQueueSample.m_fDistance); - if(m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_nCounter = 52; - m_sQueueSample.m_nSampleIndex = SFX_CESNA_IDLE; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_bIs2D = FALSE; - m_sQueueSample.m_nReleasingVolumeModificator = 0; - m_sQueueSample.m_nFrequency = 12500; - m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nReleasingVolumeDivider = 8; - m_sQueueSample.m_nEmittingVolume = 80; - SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) - m_sQueueSample.m_fSpeedMultiplier = 4.0f; - m_sQueueSample.m_fSoundIntensity = 200.0f; - m_sQueueSample.m_bReleasingSoundFlag = FALSE; - m_sQueueSample.m_bReverbFlag = TRUE; - m_sQueueSample.m_bRequireReflection = FALSE; - AddSampleToRequestedQueue(); + if (isPlayerVeh) { + volume = Clamp2(volume, prevVolume, 7); + freq = Clamp2(freq, prevFreq, 800); } - if(params.m_fDistance < SQR(90)) { - m_sQueueSample.m_nVolume = ComputeVolume(80, 90.f, m_sQueueSample.m_fDistance); - if(m_sQueueSample.m_nVolume != 0) { + if (volume > 0) { + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); + m_sQueueSample.m_nVolume = ComputeVolume(volume, SOUND_INTENSITY, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume != 0) { m_sQueueSample.m_nCounter = 2; - m_sQueueSample.m_nSampleIndex = SFX_CESNA_REV; + m_sQueueSample.m_nSampleIndex = SFX_RC_REV; m_sQueueSample.m_nBankIndex = SFX_BANK_0; m_sQueueSample.m_bIs2D = FALSE; - m_sQueueSample.m_nReleasingVolumeModificator = 3; - m_sQueueSample.m_nFrequency = 25000; + m_sQueueSample.m_nReleasingVolumeModificator = 1; + m_sQueueSample.m_nFrequency = freq; m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nEmittingVolume = volume; + SET_LOOP_OFFSETS(SFX_RC_REV) + m_sQueueSample.m_fSpeedMultiplier = 3.0f; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + m_sQueueSample.m_bReleasingSoundFlag = FALSE; m_sQueueSample.m_nReleasingVolumeDivider = 4; - m_sQueueSample.m_nEmittingVolume = 80; + m_sQueueSample.m_bReverbFlag = TRUE; + m_sQueueSample.m_bRequireReflection = FALSE; + AddSampleToRequestedQueue(); + } + } + if (isPlayerVeh) { + prevFreq = freq; + prevVolume = volume; + } + } else if (params.m_pVehicle != nil) { + if (isPlayerVeh) { + acceletateState = Pads[0].GetAccelerate(); + brakeState = Pads[0].GetBrake(); + } else { + acceletateState = 255.0f * params.m_pVehicle->m_fGasPedal; + brakeState = 255.0f * params.m_pVehicle->m_fBrakePedal; + } + if (acceletateState < brakeState) + acceletateState = brakeState; + if (acceletateState <= 0) { + vehSlowdown = TRUE; + volume = 127; + freq = 18000; + } else { + vehSlowdown = FALSE; + volume = Min(127, (127 * acceletateState / 255) * 3.0f * Abs(params.m_fVelocityChange)); + freq = Min(22000, (8000 * acceletateState / 255 + 14000) * 3.0f * Abs(params.m_fVelocityChange)); + } + if (isPlayerVeh && !vehSlowdown) { + volume = Clamp2(volume, prevVolume, 7); + freq = Clamp2(freq, prevFreq, 800); + } + if (!vehSlowdown) +#ifdef THIS_IS_STUPID + freq += 8000.0f * Abs(DotProduct(params.m_pVehicle->GetUp(), CVector(0.0f, 1.0f, 0.0f))); +#else + freq += 8000.0f * Abs(params.m_pVehicle->GetUp().y); +#endif + if (params.m_pVehicle->bIsDrowning) + volume /= 4; + if (volume > 0) { + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); + m_sQueueSample.m_nVolume = ComputeVolume(volume, SOUND_INTENSITY, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume != 0) { + if (vehSlowdown) { + m_sQueueSample.m_nCounter = 0; + m_sQueueSample.m_nSampleIndex = SFX_RC_IDLE; + m_sQueueSample.m_nReleasingVolumeDivider = 6; + } else { + m_sQueueSample.m_nCounter = 2; + m_sQueueSample.m_nSampleIndex = SFX_RC_REV; + m_sQueueSample.m_nReleasingVolumeDivider = 4; + } + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_bIs2D = FALSE; + m_sQueueSample.m_nReleasingVolumeModificator = 3; + m_sQueueSample.m_nFrequency = freq; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nEmittingVolume = volume; SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) - m_sQueueSample.m_fSpeedMultiplier = 4.0f; - m_sQueueSample.m_fSoundIntensity = 90.0f; + m_sQueueSample.m_fSpeedMultiplier = 3.0f; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; m_sQueueSample.m_bReleasingSoundFlag = FALSE; m_sQueueSample.m_bReverbFlag = TRUE; m_sQueueSample.m_bRequireReflection = FALSE; AddSampleToRequestedQueue(); } } + if (isPlayerVeh) { + if (vehSlowdown) { + prevFreq = freq; + prevVolume = volume; + } + } } } void -cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams& params, CVehicle* veh) +cAudioManager::ProcessVehicleFlatTyre(cVehicleParams& params) { - static int32 GearFreqAdj[] = { 6000, 6000, 3400, 1200, 0, -1000 }; + const float SOUND_INTENSITY = 60.0f; - tWheelState* wheelState; CAutomobile* automobile; CBike* bike; - CVector pos; - float* gasPedalAudioPtr; - - int32 accelerateState; - int32 brakeState; - int32 freq; - int32 baseFreq; - int32 freqModifier; - uint32 gearSoundLength; - uint32 soundOffset; - uint8 engineSoundType; - uint8 wheelInUseCounter; - uint8 wheelsOnGround; - uint8 vol; - uint8 currentGear; - uint8 wheelsOnGroundPrev; - - float accelerationMultipler; - float gasPedalAudio; - float velocityChangeForAudio; - float relativeVelocityChange; - float time; - bool8 channelUsed; - bool8 lostTraction; - bool8 noGearBox; - bool8 stuckInSand; - bool8 processedAccelSampleStopped; - bool8 isMoped; + bool8 wheelBurst; + uint8 emittingVol; - static uint32 gearSoundStartTime = CTimer::GetTimeInMilliseconds(); - static int32 nCruising = 0; - static int16 LastAccel = 0; - static uint8 CurrentPretendGear = 1; - static bool8 bLostTractionLastFrame = FALSE; - static bool8 bHandbrakeOnLastFrame = FALSE; - static bool8 bAccelSampleStopped = TRUE; + float modifier; - lostTraction = FALSE; - isMoped = params.m_pVehicle->m_modelIndex == MI_PIZZABOY || params.m_pVehicle->m_modelIndex == MI_FAGGIO; - processedAccelSampleStopped = FALSE; - if (bPlayerJustEnteredCar) { - bAccelSampleStopped = TRUE; - bPlayerJustEnteredCar = FALSE; - nCruising = 0; - LastAccel = 0; - bLostTractionLastFrame = FALSE; - CurrentPretendGear = 1; - bHandbrakeOnLastFrame = FALSE; - } - if (CReplay::IsPlayingBack()) { - accelerateState = (255.0f * Clamp(params.m_pVehicle->m_fGasPedal, 0.0f, 1.0f)); - brakeState = (255.0f * Clamp(params.m_pVehicle->m_fBrakePedal, 0.0f, 1.0f)); - } else { - accelerateState = Pads[0].GetAccelerate(); - brakeState = Pads[0].GetBrake(); - } - channelUsed = SampleManager.GetChannelUsedFlag(CHANNEL_PLAYER_VEHICLE_ENGINE); - if (isMoped) { - CurrentPretendGear = params.m_pTransmission->nNumberOfGears; - currentGear = CurrentPretendGear; - if (params.m_pVehicle->bIsHandbrakeOn) { - brakeState = 0; - nCruising = 0; - LastAccel = 0; - accelerateState = 0; - } else { - nCruising = 1; - } - } else { - currentGear = params.m_pVehicle->m_nCurrentGear; - } + if (params.m_fDistance >= SQR(SOUND_INTENSITY)) + return; switch (params.m_VehicleType) { case VEHICLE_TYPE_CAR: automobile = (CAutomobile*)params.m_pVehicle; - wheelsOnGround = automobile->m_nDriveWheelsOnGround; - wheelsOnGroundPrev = automobile->m_nDriveWheelsOnGroundPrev; - gasPedalAudioPtr = &automobile->m_fGasPedalAudio; - wheelState = automobile->m_aWheelState; - velocityChangeForAudio = automobile->m_fVelocityChangeForAudio; + wheelBurst = FALSE; + for (int i = 0; i < 4; i++) + if (automobile->Damage.GetWheelStatus(i) == WHEEL_STATUS_BURST && automobile->m_aWheelTimer[i] > 0.0f) + wheelBurst = TRUE; + if (!wheelBurst) + return; break; case VEHICLE_TYPE_BIKE: bike = (CBike*)params.m_pVehicle; - wheelsOnGround = bike->m_nDriveWheelsOnGround; - wheelsOnGroundPrev = bike->m_nDriveWheelsOnGroundPrev; - gasPedalAudioPtr = &bike->m_fGasPedalAudio; - wheelState = bike->m_aWheelState; - velocityChangeForAudio = bike->m_fVelocityChangeForAudio; + wheelBurst = FALSE; + for(int i = 0; i < 2; i++) + if (bike->m_wheelStatus[i] == WHEEL_STATUS_BURST && bike->m_aWheelTimer[i] > 0.0f) + wheelBurst = TRUE; + if (!wheelBurst) + return; break; default: - debug(" ** AUDIOLOG: Unrecognised vehicle type %d in ProcessVehicleEngine() * \n", params.m_VehicleType); return; } - if (!isMoped) { - switch (params.m_pTransmission->nDriveType) { - case '4': - if (params.m_VehicleType != VEHICLE_TYPE_BIKE) { - wheelInUseCounter = 0; - for (uint8 i = 0; i < 4; i++) { - if (wheelState[i] != WHEEL_STATE_NORMAL) - ++wheelInUseCounter; - } - if (wheelInUseCounter > 2) - lostTraction = TRUE; - } - break; - case 'F': - if (params.m_VehicleType == VEHICLE_TYPE_BIKE) { - if (wheelState[BIKEWHEEL_FRONT] != WHEEL_STATE_NORMAL) - lostTraction = TRUE; - } else { - if ((wheelState[CARWHEEL_FRONT_LEFT] != WHEEL_STATE_NORMAL || wheelState[CARWHEEL_FRONT_RIGHT] != WHEEL_STATE_NORMAL) && - (wheelState[CARWHEEL_REAR_LEFT] != WHEEL_STATE_NORMAL || wheelState[CARWHEEL_REAR_RIGHT] != WHEEL_STATE_NORMAL)) - lostTraction = TRUE; - } - break; - case 'R': - if (params.m_VehicleType == VEHICLE_TYPE_BIKE) { - if (wheelState[BIKEWHEEL_REAR] != WHEEL_STATE_NORMAL) - lostTraction = TRUE; - } else { - if (wheelState[CARWHEEL_REAR_LEFT] != WHEEL_STATE_NORMAL || wheelState[CARWHEEL_REAR_RIGHT] != WHEEL_STATE_NORMAL) - lostTraction = TRUE; - } - break; - default: - break; - } - } - if (params.m_fVelocityChange != 0.0f) { - time = params.m_pVehicle->m_vecMoveSpeed.z / params.m_fVelocityChange; - if (time > 0.0f) - freqModifier = -(Min(0.2f, time) * 3000.0f * 5.0f); - else - freqModifier = -(Max(-0.2f, time) * 3000.0f * 5.0f); - if (params.m_fVelocityChange < -0.001f) - freqModifier = -freqModifier; - } else - freqModifier = 0; - if (params.m_VehicleType == VEHICLE_TYPE_BIKE && bike->bExtraSpeed) - freqModifier += 1400; - gearSoundLength = 0; - engineSoundType = aVehicleSettings[params.m_nIndex].m_nBank; - soundOffset = 3 * (engineSoundType - CAR_SFX_BANKS_OFFSET); - noGearBox = FALSE; - switch (engineSoundType) { - case SFX_BANK_PONTIAC: - gearSoundLength = 2526; - break; - case SFX_BANK_PORSCHE: - gearSoundLength = 3587; - break; - case SFX_BANK_SPIDER: - gearSoundLength = 4898; - break; - case SFX_BANK_MERC: - gearSoundLength = 4003; - break; - case SFX_BANK_TRUCK: - gearSoundLength = 6289; - break; - case SFX_BANK_HOTROD: - gearSoundLength = 2766; - break; - case SFX_BANK_COBRA: - gearSoundLength = 3523; - break; - case SFX_BANK_PONTIAC_SLOW: - gearSoundLength = 2773; - break; - case SFX_BANK_CADILLAC: - gearSoundLength = 2560; - break; - case SFX_BANK_PATHFINDER: - gearSoundLength = 4228; - break; - case SFX_BANK_PACARD: - gearSoundLength = 4648; - break; - case SFX_BANK_VTWIN: - gearSoundLength = 3480; - break; - case SFX_BANK_HONDA250: - gearSoundLength = 2380; + modifier = Min(1.0f, Abs(params.m_fVelocityChange) / (0.3f * params.m_pTransmission->fMaxVelocity)); + if (modifier > 0.01f) { //mb can be replaced by (emittingVol > 1) + emittingVol = (100.0f * modifier); + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); + m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, SOUND_INTENSITY, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume) { + m_sQueueSample.m_nCounter = 95; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_bIs2D = FALSE; + m_sQueueSample.m_nReleasingVolumeModificator = 5; + m_sQueueSample.m_nSampleIndex = SFX_TYRE_BURST_L; + m_sQueueSample.m_nFrequency = (5500.0f * modifier) + 8000; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nEmittingVolume = emittingVol; + SET_LOOP_OFFSETS(SFX_TYRE_BURST_L) + m_sQueueSample.m_fSpeedMultiplier = 2.0f; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + m_sQueueSample.m_bReleasingSoundFlag = FALSE; + m_sQueueSample.m_nReleasingVolumeDivider = 3; + m_sQueueSample.m_bReverbFlag = TRUE; + m_sQueueSample.m_bRequireReflection = FALSE; + AddSampleToRequestedQueue(); + } + } +} + +bool8 +cAudioManager::ProcessVehicleRoadNoise(cVehicleParams& params) +{ + const float SOUND_INTENSITY = 95.0f; + + int32 emittingVol; + uint32 freq; + float multiplier; + int sampleFreq; + float velocity; + uint8 wheelsOnGround; + + if (params.m_fDistance >= SQR(SOUND_INTENSITY)) + return FALSE; + + if (params.m_fDistance >= SQR(SOUND_INTENSITY)) + return FALSE; + switch (params.m_VehicleType) { + case VEHICLE_TYPE_CAR: + wheelsOnGround = ((CAutomobile*)params.m_pVehicle)->m_nWheelsOnGround; break; - case SFX_BANK_SPORTS_BIKE: - gearSoundLength = 2410; + case VEHICLE_TYPE_BIKE: + wheelsOnGround = ((CBike*)params.m_pVehicle)->m_nWheelsOnGround; break; default: - noGearBox = TRUE; + wheelsOnGround = 4; break; } - if (!channelUsed || nCruising || noGearBox) { - gearSoundStartTime = CTimer::GetTimeInMilliseconds(); - } else { - gearSoundLength -= 1000; - if (CTimer::GetTimeInMilliseconds() - gearSoundStartTime > gearSoundLength) { - channelUsed = FALSE; - gearSoundStartTime = CTimer::GetTimeInMilliseconds(); + if (params.m_pTransmission == nil || wheelsOnGround == 0) + return TRUE; + + velocity = Abs(params.m_fVelocityChange); + if (velocity > 0.0f) { + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); + emittingVol = 30.f * Min(1.f, velocity / (0.5f * params.m_pTransmission->fMaxVelocity)); + m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, SOUND_INTENSITY, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume != 0) { + m_sQueueSample.m_nCounter = 0; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_bIs2D = FALSE; + m_sQueueSample.m_nReleasingVolumeModificator = 3; + if (params.m_pVehicle->m_nSurfaceTouched == SURFACE_WATER) { + m_sQueueSample.m_nSampleIndex = SFX_BOAT_WATER_LOOP; + freq = 6050 * emittingVol / 30 + 16000; + } else { + m_sQueueSample.m_nSampleIndex = SFX_ROAD_NOISE; + multiplier = (m_sQueueSample.m_fDistance / SOUND_INTENSITY) * 0.5f; + sampleFreq = SampleManager.GetSampleBaseFrequency(SFX_ROAD_NOISE); + freq = (sampleFreq * multiplier) + ((3 * sampleFreq) / 4); + } + m_sQueueSample.m_nFrequency = freq; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nEmittingVolume = emittingVol; + SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) + m_sQueueSample.m_fSpeedMultiplier = 6.0f; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + m_sQueueSample.m_bReleasingSoundFlag = FALSE; + m_sQueueSample.m_nReleasingVolumeDivider = 4; + m_sQueueSample.m_bReverbFlag = TRUE; + m_sQueueSample.m_bRequireReflection = FALSE; + AddSampleToRequestedQueue(); } } - relativeVelocityChange = 2.0f * params.m_fVelocityChange / params.m_pTransmission->fMaxVelocity; - accelerationMultipler = Clamp(relativeVelocityChange, 0.0f, 1.0f); - gasPedalAudio = accelerationMultipler; - switch (engineSoundType) { - case SFX_BANK_MOPED: - ++soundOffset; - break; - case SFX_BANK_HONDA250: - soundOffset += 2; + + return TRUE; +} + +bool8 +cAudioManager::ProcessWetRoadNoise(cVehicleParams& params) +{ + const float SOUND_INTENSITY = 30.0f; + + float relativeVelocity; + int32 emittingVol; + float multiplier; + int freq; + float velocity; + uint8 wheelsOnGround; + + if (params.m_fDistance >= SQR(SOUND_INTENSITY)) + return FALSE; + switch (params.m_VehicleType) { + case VEHICLE_TYPE_CAR: + wheelsOnGround = ((CAutomobile*)params.m_pVehicle)->m_nWheelsOnGround; break; - case SFX_BANK_SPORTS_BIKE: - soundOffset += 3; + case VEHICLE_TYPE_BIKE: + wheelsOnGround = ((CBike*)params.m_pVehicle)->m_nWheelsOnGround; break; default: + wheelsOnGround = 4; break; } - if (accelerateState <= 0) { - if (params.m_fVelocityChange < -0.001f) { - if (channelUsed) { - SampleManager.StopChannel(CHANNEL_PLAYER_VEHICLE_ENGINE); - bAccelSampleStopped = TRUE; - } - if (wheelsOnGround == 0 || params.m_pVehicle->bIsHandbrakeOn || lostTraction) - gasPedalAudio = *gasPedalAudioPtr; - else if (params.m_VehicleType == VEHICLE_TYPE_BIKE) - gasPedalAudio = 0.0f; - else - gasPedalAudio = Min(1.0f, params.m_fVelocityChange / params.m_pTransmission->fMaxReverseVelocity); - *gasPedalAudioPtr = Max(0.0f, gasPedalAudio); - } else if (LastAccel > 0) { - if (channelUsed) { - SampleManager.StopChannel(CHANNEL_PLAYER_VEHICLE_ENGINE); - bAccelSampleStopped = TRUE; - } - nCruising = 0; - if (wheelsOnGround == 0 - || params.m_pVehicle->bIsHandbrakeOn - || lostTraction - || params.m_fVelocityChange < 0.01f && *gasPedalAudioPtr > 0.2f) { - if (isMoped) { - gasPedalAudio = 0.0f; - } else { - *gasPedalAudioPtr *= 0.6f; - gasPedalAudio = *gasPedalAudioPtr; - } - } - if (gasPedalAudio > 0.05f) { - freq = (5000.f * (gasPedalAudio - 0.05f) * 20.f / 19) + 19000; - vol = (25.0f * (gasPedalAudio - 0.05f) * 20.f / 19) + 40; - if (params.m_pVehicle->bIsDrowning) - vol /= 4; - if (engineSoundType == SFX_BANK_TRUCK) - freq /= 2; - AddPlayerCarSample(vol, freq, soundOffset + SFX_CAR_FINGER_OFF_ACCEL_1, engineSoundType, 63, FALSE); - } - } - freq = (10000.f * gasPedalAudio) + 22050; - vol = 110 - (40.0f * gasPedalAudio); - if (engineSoundType == SFX_BANK_TRUCK) - freq /= 2; - if (params.m_pVehicle->bIsDrowning) - vol /= 4; - AddPlayerCarSample(vol, freq, engineSoundType - CAR_SFX_BANKS_OFFSET + SFX_CAR_IDLE_1, SFX_BANK_0, 52, TRUE); + if (params.m_pTransmission == nil || wheelsOnGround == 0) + return TRUE; - CurrentPretendGear = Max(1, currentGear); + velocity = Abs(params.m_fVelocityChange); + if (velocity > 0.0f) { + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); + relativeVelocity = Min(1.0f, velocity / (0.5f * params.m_pTransmission->fMaxVelocity)); + emittingVol = 23.0f * relativeVelocity * CWeather::WetRoads; + m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, SOUND_INTENSITY, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume != 0) { + m_sQueueSample.m_nCounter = 1; + m_sQueueSample.m_nSampleIndex = SFX_ROAD_NOISE; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_bIs2D = FALSE; + m_sQueueSample.m_nReleasingVolumeModificator = 3; + multiplier = (m_sQueueSample.m_fDistance / SOUND_INTENSITY) * 0.5f; + freq = SampleManager.GetSampleBaseFrequency(SFX_ROAD_NOISE); + m_sQueueSample.m_nFrequency = freq + freq * multiplier; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nEmittingVolume = emittingVol; + SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) + m_sQueueSample.m_fSpeedMultiplier = 6.0f; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + m_sQueueSample.m_bReleasingSoundFlag = FALSE; + m_sQueueSample.m_nReleasingVolumeDivider = 4; + m_sQueueSample.m_bReverbFlag = TRUE; + m_sQueueSample.m_bRequireReflection = FALSE; + AddSampleToRequestedQueue(); + } } - else { - if (nCruising == 0){ - stuckInSand = params.m_VehicleType == VEHICLE_TYPE_CAR && ((CAutomobile*)params.m_pVehicle)->bStuckInSand; - if (accelerateState < 150 || wheelsOnGround == 0 || params.m_pVehicle->bIsHandbrakeOn || lostTraction - || (currentGear < 2 && params.m_fVelocityChange - velocityChangeForAudio < 0.01f) || brakeState > 0) { - if (((wheelsOnGround && !params.m_pVehicle->bIsHandbrakeOn && !lostTraction ) || stuckInSand) && brakeState <= 0) { - baseFreq = (8000.0f * accelerationMultipler) + 16000; - vol = (25.0f * accelerationMultipler) + 60; - *gasPedalAudioPtr = accelerationMultipler; - } else { - if (wheelsOnGround == 0 && wheelsOnGroundPrev != 0 || (params.m_pVehicle->bIsHandbrakeOn && !bHandbrakeOnLastFrame || lostTraction && !bLostTractionLastFrame) - && wheelsOnGround != 0) { - *gasPedalAudioPtr *= 0.6f; - } - freqModifier = 0; - if (engineSoundType != SFX_BANK_GOLF_CART && engineSoundType != SFX_BANK_CAR_CHAINSAW) - baseFreq = (25000.0f * *gasPedalAudioPtr) + 14000; - else - baseFreq = (15000.0f * *gasPedalAudioPtr) + 14000; - vol = (25.0f * *gasPedalAudioPtr) + 60; - } - freq = freqModifier + baseFreq; - if (engineSoundType == SFX_BANK_TRUCK) - freq /= 2; - if (channelUsed) { - SampleManager.StopChannel(CHANNEL_PLAYER_VEHICLE_ENGINE); - bAccelSampleStopped = TRUE; - } - if (params.m_pVehicle->bIsDrowning) - vol /= 4; - AddPlayerCarSample(vol, freq, engineSoundType - CAR_SFX_BANKS_OFFSET + SFX_CAR_REV_1, SFX_BANK_0, 2, TRUE); - } else { - TranslateEntity(&m_sQueueSample.m_vecPos, &pos); - if (bAccelSampleStopped) { - if (CurrentPretendGear != 1 || currentGear != 2) - CurrentPretendGear = Max(1, currentGear - 1); - processedAccelSampleStopped = TRUE; - bAccelSampleStopped = FALSE; - } - if (channelUsed) { - SampleManager.SetChannelEmittingVolume(CHANNEL_PLAYER_VEHICLE_ENGINE, 120); - SampleManager.SetChannel3DPosition(CHANNEL_PLAYER_VEHICLE_ENGINE, pos.x, pos.y, pos.z); - SampleManager.SetChannel3DDistances(CHANNEL_PLAYER_VEHICLE_ENGINE, 50.0f, 12.5f); - freq = (GearFreqAdj[CurrentPretendGear] + freqModifier + 22050) ; - if (engineSoundType == SFX_BANK_TRUCK) - freq /= 2; - SampleManager.SetChannelFrequency(CHANNEL_PLAYER_VEHICLE_ENGINE, freq); - if (!channelUsed) { - SampleManager.SetChannelReverbFlag(CHANNEL_PLAYER_VEHICLE_ENGINE, m_bDynamicAcousticModelingStatus != FALSE); - SampleManager.StartChannel(CHANNEL_PLAYER_VEHICLE_ENGINE); - } - } else if (processedAccelSampleStopped) { - gearSoundStartTime = CTimer::GetTimeInMilliseconds(); - params.m_pVehicle->bAudioChangingGear = TRUE; - if (!SampleManager.InitialiseChannel(CHANNEL_PLAYER_VEHICLE_ENGINE, soundOffset + SFX_CAR_ACCEL_1, SFX_BANK_0)) - return; - SampleManager.SetChannelLoopCount(CHANNEL_PLAYER_VEHICLE_ENGINE, 1); - SampleManager.SetChannelLoopPoints(CHANNEL_PLAYER_VEHICLE_ENGINE, 0, -1); - - SampleManager.SetChannelEmittingVolume(CHANNEL_PLAYER_VEHICLE_ENGINE, 120); - SampleManager.SetChannel3DPosition(CHANNEL_PLAYER_VEHICLE_ENGINE, pos.x, pos.y, pos.z); - SampleManager.SetChannel3DDistances(CHANNEL_PLAYER_VEHICLE_ENGINE, 50.0f, 12.5f); - freq = (GearFreqAdj[CurrentPretendGear] + freqModifier + 22050); - if (engineSoundType == SFX_BANK_TRUCK) - freq /= 2; - SampleManager.SetChannelFrequency(CHANNEL_PLAYER_VEHICLE_ENGINE, freq); - if (!channelUsed) { - SampleManager.SetChannelReverbFlag(CHANNEL_PLAYER_VEHICLE_ENGINE, m_bDynamicAcousticModelingStatus != FALSE); - SampleManager.StartChannel(CHANNEL_PLAYER_VEHICLE_ENGINE); - } - } else if (CurrentPretendGear < params.m_pTransmission->nNumberOfGears - 1) { - ++CurrentPretendGear; - gearSoundStartTime = CTimer::GetTimeInMilliseconds(); - params.m_pVehicle->bAudioChangingGear = TRUE; - if (!SampleManager.InitialiseChannel(CHANNEL_PLAYER_VEHICLE_ENGINE, soundOffset + SFX_CAR_ACCEL_1, SFX_BANK_0)) - return; - SampleManager.SetChannelLoopCount(CHANNEL_PLAYER_VEHICLE_ENGINE, 1); - SampleManager.SetChannelLoopPoints(CHANNEL_PLAYER_VEHICLE_ENGINE, 0, -1); - - SampleManager.SetChannelEmittingVolume(CHANNEL_PLAYER_VEHICLE_ENGINE, 120); - SampleManager.SetChannel3DPosition(CHANNEL_PLAYER_VEHICLE_ENGINE, pos.x, pos.y, pos.z); - SampleManager.SetChannel3DDistances(CHANNEL_PLAYER_VEHICLE_ENGINE, 50.0f, 12.5f); - freq = (GearFreqAdj[CurrentPretendGear] + freqModifier + 22050); - if (engineSoundType == SFX_BANK_TRUCK) - freq /= 2; - SampleManager.SetChannelFrequency(CHANNEL_PLAYER_VEHICLE_ENGINE, freq); - if (!channelUsed) { - SampleManager.SetChannelReverbFlag(CHANNEL_PLAYER_VEHICLE_ENGINE, m_bDynamicAcousticModelingStatus != FALSE); - SampleManager.StartChannel(CHANNEL_PLAYER_VEHICLE_ENGINE); - } - } else { - nCruising = 1; - goto PlayCruising; - } - } - } else { -PlayCruising: - bAccelSampleStopped = TRUE; - SampleManager.StopChannel(CHANNEL_PLAYER_VEHICLE_ENGINE); - if (isMoped || accelerateState >= 150 && wheelsOnGround && brakeState <= 0 && !params.m_pVehicle->bIsHandbrakeOn - && !lostTraction && currentGear >= params.m_pTransmission->nNumberOfGears - 1) { - if (accelerateState >= 220 && params.m_fVelocityChange + 0.001f >= velocityChangeForAudio) { - if (nCruising < 800) - ++nCruising; - } else if (nCruising > 3) { - --nCruising; - } - freq = 27 * nCruising + freqModifier + 22050; - if (engineSoundType == SFX_BANK_TRUCK) - freq /= 2; - AddPlayerCarSample(120, freq, soundOffset + SFX_CAR_AFTER_ACCEL_1, engineSoundType, 64, TRUE); - } else { - nCruising = 0; - } - } - } - LastAccel = accelerateState; - bHandbrakeOnLastFrame = params.m_pVehicle->bIsHandbrakeOn; - bLostTractionLastFrame = lostTraction; - return; + return TRUE; } -bool8 -cAudioManager::ProcessVehicleSkidding(cVehicleParams& params) +void +cAudioManager::ProcessVehicleEngine(cVehicleParams& params) { - const float SOUND_INTENSITY = 40.0f; - - CAutomobile *automobile; - CBike *bike; - uint8 numWheels; - uint8 wheelsOnGround; - float gasPedalAudio; - tWheelState* wheelStateArr; + const float SOUND_INTENSITY = 50.0f; + CVehicle* playerVeh; + CVehicle* veh; + CAutomobile* automobile; + cTransmission* transmission; + CBike* bike; + tWheelState* wheelState; + float* gasPedalAudioPtr; - cTransmission *transmission; - int32 emittingVol; - float newSkidVal = 0.0f; - float skidVal = 0.0f; + int32 freq = 0; + uint8 currentGear; + uint8 emittingVol; + int8 wheelsOnGround; + int8 wheelsOnGroundPrev; + float relativeGearChange; + float relativeChange; + float modificator; + float traction; + bool8 isMoped; + bool8 caddyBool; + isMoped = FALSE; + caddyBool = FALSE; + traction = 0.0f; if (params.m_fDistance >= SQR(SOUND_INTENSITY)) - return FALSE; - switch (params.m_VehicleType) { - case VEHICLE_TYPE_CAR: - automobile = (CAutomobile*)params.m_pVehicle; - numWheels = 4; - wheelStateArr = automobile->m_aWheelState; - wheelsOnGround = automobile->m_nWheelsOnGround; - gasPedalAudio = automobile->m_fGasPedalAudio; - break; - case VEHICLE_TYPE_BIKE: - bike = (CBike*)params.m_pVehicle; - numWheels = 2; - wheelStateArr = bike->m_aWheelState; - wheelsOnGround = bike->m_nWheelsOnGround; - gasPedalAudio = bike->m_fGasPedalAudio; - break; - default: - debug("\n * AUDIOLOG: ProcessVehicleSkidding() Unsupported vehicle type %d * \n", params.m_VehicleType); - return TRUE; + return; + playerVeh = FindPlayerVehicle(); + veh = params.m_pVehicle; + if (playerVeh == veh && veh->GetStatus() == STATUS_WRECKED) { + SampleManager.StopChannel(CHANNEL_PLAYER_VEHICLE_ENGINE); + return; } - if (wheelsOnGround == 0) - return TRUE; + if (!veh->bEngineOn) + return; CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); - - for (int32 i = 0; i < numWheels; i++) { - if (wheelStateArr[i] == WHEEL_STATE_NORMAL) - continue; - transmission = params.m_pTransmission; - switch (transmission->nDriveType) { - case '4': - newSkidVal = GetVehicleDriveWheelSkidValue(params.m_pVehicle, wheelStateArr[i], gasPedalAudio, transmission, params.m_fVelocityChange); - break; - case 'F': - if (i == CARWHEEL_FRONT_LEFT || i == CARWHEEL_FRONT_RIGHT) - newSkidVal = GetVehicleDriveWheelSkidValue(params.m_pVehicle, wheelStateArr[i], gasPedalAudio, transmission, params.m_fVelocityChange); - else - newSkidVal = GetVehicleNonDriveWheelSkidValue(params.m_pVehicle, wheelStateArr[i], transmission, params.m_fVelocityChange); + if (playerVeh == veh && veh->m_modelIndex != MI_CADDY) { + ProcessPlayersVehicleEngine(params, params.m_pVehicle); + return; + } + transmission = params.m_pTransmission; + if (transmission != nil) { + switch (veh->m_modelIndex) { + case MI_PIZZABOY: + case MI_FAGGIO: + isMoped = TRUE; + currentGear = transmission->nNumberOfGears; break; - case 'R': - if (i == CARWHEEL_REAR_LEFT || i == CARWHEEL_REAR_RIGHT) - newSkidVal = GetVehicleDriveWheelSkidValue(params.m_pVehicle, wheelStateArr[i], gasPedalAudio, transmission, params.m_fVelocityChange); - else - newSkidVal = GetVehicleNonDriveWheelSkidValue(params.m_pVehicle, wheelStateArr[i], transmission, params.m_fVelocityChange); + case MI_CADDY: + currentGear = transmission->nNumberOfGears; + caddyBool = TRUE; break; default: + currentGear = veh->m_nCurrentGear; break; } - skidVal = Max(skidVal, newSkidVal); - } - - if (skidVal > 0.0f) { - emittingVol = 50.f * skidVal; - m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, SOUND_INTENSITY, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_nCounter = 3; - switch (params.m_pVehicle->m_nSurfaceTouched) { - case SURFACE_GRASS: - case SURFACE_HEDGE: - m_sQueueSample.m_nSampleIndex = SFX_RAIN; - emittingVol /= 4; - m_sQueueSample.m_nFrequency = 13000.f * skidVal + 35000.f; - m_sQueueSample.m_nVolume /= 4; - if (m_sQueueSample.m_nVolume == 0) - return TRUE; - break; - case SURFACE_GRAVEL: - case SURFACE_MUD_DRY: - case SURFACE_SAND: - case SURFACE_WATER: - case SURFACE_SAND_BEACH: - m_sQueueSample.m_nSampleIndex = SFX_GRAVEL_SKID; - m_sQueueSample.m_nFrequency = 6000.f * skidVal + 10000.f; - break; + switch (params.m_VehicleType) { + case VEHICLE_TYPE_CAR: + automobile = (CAutomobile*)veh; + wheelsOnGround = automobile->m_nDriveWheelsOnGround; + wheelsOnGroundPrev = automobile->m_nDriveWheelsOnGroundPrev; + wheelState = automobile->m_aWheelState; + gasPedalAudioPtr = &automobile->m_fGasPedalAudio; + break; + case VEHICLE_TYPE_BIKE: + bike = (CBike*)veh; + wheelsOnGround = bike->m_nDriveWheelsOnGround; + wheelsOnGroundPrev = bike->m_nDriveWheelsOnGroundPrev; + wheelState = bike->m_aWheelState; + gasPedalAudioPtr = &bike->m_fGasPedalAudio; + break; + default: + debug(" ** AUDIOLOG: Unrecognised vehicle type %d in ProcessVehicleEngine() * \n", params.m_VehicleType); + return; + } - default: - m_sQueueSample.m_nSampleIndex = SFX_SKID; - m_sQueueSample.m_nFrequency = 5000.f * skidVal + 11000.f; - if (params.m_VehicleType == VEHICLE_TYPE_BIKE) - m_sQueueSample.m_nFrequency += 2000; - break; + if (wheelsOnGround != 0) { + if (!veh->bIsHandbrakeOn || isMoped && caddyBool) { //mb bug, bcs it's can't be TRUE together + if (veh->GetStatus() == STATUS_SIMPLE || isMoped || caddyBool) { + traction = 0.0f; + } else { + switch (transmission->nDriveType) { + case '4': + if (params.m_VehicleType == VEHICLE_TYPE_BIKE) { + for (int i = 0; i < 2; i++) + if (wheelState[i] == WHEEL_STATE_SPINNING) + traction += 0.1f; + } else { + for (int i = 0; i < 4; i++) + if (wheelState[i] == WHEEL_STATE_SPINNING) + traction += 0.05f; + } + break; + case 'F': + if (params.m_VehicleType == VEHICLE_TYPE_BIKE) { + if (wheelState[BIKEWHEEL_FRONT] == WHEEL_STATE_SPINNING) + traction += 0.2f; + } else { + if (wheelState[CARWHEEL_FRONT_LEFT] == WHEEL_STATE_SPINNING) + traction += 0.1f; + if (wheelState[CARWHEEL_FRONT_RIGHT] == WHEEL_STATE_SPINNING) + traction += 0.1f; + } + break; + case 'R': + if (params.m_VehicleType == VEHICLE_TYPE_BIKE) { + if (wheelState[BIKEWHEEL_REAR] == WHEEL_STATE_SPINNING) + traction += 0.2f; + } else { + if (wheelState[CARWHEEL_REAR_LEFT] == WHEEL_STATE_SPINNING) + traction += 0.1f; + if (wheelState[CARWHEEL_REAR_RIGHT] == WHEEL_STATE_SPINNING) + traction += 0.1f; + } + break; + default: + break; + } + } + } else if (params.m_fVelocityChange == 0.0f) { + traction = 0.9f; } - - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_bIs2D = FALSE; - m_sQueueSample.m_nReleasingVolumeModificator = 8; - m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = emittingVol; - SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) - m_sQueueSample.m_fSpeedMultiplier = 3.0f; - m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; - m_sQueueSample.m_bReleasingSoundFlag = FALSE; - m_sQueueSample.m_nReleasingVolumeDivider = 3; - m_sQueueSample.m_bReverbFlag = TRUE; - m_sQueueSample.m_bRequireReflection = FALSE; - AddSampleToRequestedQueue(); + if (transmission->fMaxVelocity <= 0.0f) { + relativeChange = 0.0f; + modificator = 0.0f; + } else { + if (!isMoped && !caddyBool) { + if (currentGear != 0) { + relativeGearChange = Min(1.0f, + params.m_fVelocityChange - transmission->Gears[currentGear].fShiftDownVelocity) / transmission->fMaxVelocity * 2.5f; + if (traction == 0.0f && veh->GetStatus() != STATUS_SIMPLE && + params.m_fVelocityChange < transmission->Gears[1].fShiftUpVelocity) + traction = 0.7f; + relativeChange = traction * *gasPedalAudioPtr * 0.95f + (1.0f - traction) * relativeGearChange; + } else { + relativeChange = Min(1.0f, + 1.0f - Abs((params.m_fVelocityChange - transmission->Gears[0].fShiftDownVelocity) / transmission->fMaxReverseVelocity)); + } + modificator = relativeChange; + } else { + modificator = Min(1.0f, Abs(params.m_fVelocityChange / transmission->fMaxVelocity > 1.0f)); + } + } + } else { + if (wheelsOnGroundPrev != 0) + *gasPedalAudioPtr *= 0.4f; + relativeChange = *gasPedalAudioPtr; + modificator = relativeChange; } + if (currentGear != 0 || wheelsOnGround == 0) + freq = 1200 * currentGear + 18000.0f * modificator + 14000; + else if (params.m_VehicleType == VEHICLE_TYPE_BIKE) + freq = 22050; + else + freq = 13000.0f * modificator + 14000; + if (modificator >= 0.75f) + emittingVol = 90; + else + emittingVol = modificator * (4.0f / 3.0f) * 15.0f + 75; + } else { + modificator = 0.0f; + emittingVol = 75; + } + if (veh->bIsDrowning) + emittingVol /= 4; + if (caddyBool) { + emittingVol = 100.0f * modificator; + freq = 2130.0f * modificator + 4270; + m_sQueueSample.m_nCounter = 2; + } + m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, SOUND_INTENSITY, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume != 0) { + if (!caddyBool) { + if (veh->GetStatus() == STATUS_SIMPLE) { + if (modificator < 0.02f) { + m_sQueueSample.m_nSampleIndex = aVehicleSettings[params.m_nIndex].m_nBank - CAR_SFX_BANKS_OFFSET + SFX_CAR_IDLE_1; + m_sQueueSample.m_nCounter = 52; + freq = 10000.0f * modificator + 22050; + } else { + m_sQueueSample.m_nSampleIndex = aVehicleSettings[params.m_nIndex].m_nAccelerationSampleIndex; + m_sQueueSample.m_nCounter = 2; + } + } else { + if (veh->m_fGasPedal < 0.02f) { + m_sQueueSample.m_nSampleIndex = aVehicleSettings[params.m_nIndex].m_nBank - CAR_SFX_BANKS_OFFSET + SFX_CAR_IDLE_1; + m_sQueueSample.m_nCounter = 52; + freq = 10000.0f * modificator + 22050; + } else { + m_sQueueSample.m_nSampleIndex = aVehicleSettings[params.m_nIndex].m_nAccelerationSampleIndex; + m_sQueueSample.m_nCounter = 2; + } + } + m_sQueueSample.m_nFrequency = freq + 100 * m_sQueueSample.m_nBankIndex % 1000; + } else { + if (FindVehicleOfPlayer() == params.m_pVehicle) + m_sQueueSample.m_nSampleIndex = SFX_CAR_AFTER_ACCEL_12; + else + m_sQueueSample.m_nSampleIndex = SFX_CAR_REV_12; + m_sQueueSample.m_nFrequency = freq + 20 * m_sQueueSample.m_nBankIndex % 100; + } + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_bIs2D = FALSE; + m_sQueueSample.m_nReleasingVolumeModificator = 3; + if (m_sQueueSample.m_nSampleIndex == SFX_CAR_IDLE_5 || m_sQueueSample.m_nSampleIndex == SFX_CAR_REV_5) + m_sQueueSample.m_nFrequency /= 2; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nEmittingVolume = emittingVol; + SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) + m_sQueueSample.m_fSpeedMultiplier = 6.0f; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + m_sQueueSample.m_bReleasingSoundFlag = FALSE; + m_sQueueSample.m_nReleasingVolumeDivider = 8; + m_sQueueSample.m_bReverbFlag = TRUE; + m_sQueueSample.m_bRequireReflection = FALSE; + AddSampleToRequestedQueue(); } - return TRUE; } -float -cAudioManager::GetVehicleDriveWheelSkidValue(CVehicle *veh, tWheelState wheelState, float gasPedalAudio, cTransmission *transmission, float velocityChange) +void +cAudioManager::UpdateGasPedalAudio(CVehicle* veh, int vehType) { - float relativeVelChange = 0.0f; - float velChange; - float relativeVel; - - switch (wheelState) - { - case WHEEL_STATE_SPINNING: - if (gasPedalAudio > 0.4f) - relativeVelChange = (gasPedalAudio - 0.4f) * (5.0f / 3.0f) * 0.75f; - break; - case WHEEL_STATE_SKIDDING: - relativeVelChange = Min(1.0f, Abs(velocityChange) / transmission->fMaxVelocity); - break; - case WHEEL_STATE_FIXED: - relativeVel = gasPedalAudio; - if (relativeVel > 0.4f) - relativeVel = (gasPedalAudio - 0.4f) * (5.0f / 3.0f); - - velChange = Abs(velocityChange); - if (velChange > 0.04f) - relativeVelChange = Min(1.0f, velChange / transmission->fMaxVelocity); - if (relativeVel > relativeVelChange) - relativeVelChange = relativeVel; + float gasPedal = Abs(veh->m_fGasPedal); + float* gasPealAudioPtr; - break; - default: - break; + switch(vehType) { + case VEHICLE_TYPE_CAR: gasPealAudioPtr = &((CAutomobile *)veh)->m_fGasPedalAudio; break; + case VEHICLE_TYPE_BIKE: gasPealAudioPtr = &((CBike *)veh)->m_fGasPedalAudio; break; + default: return; } - - return Max(relativeVelChange, Min(1.0f, Abs(veh->m_vecTurnSpeed.z) * 20.0f)); + if (*gasPealAudioPtr < gasPedal) + *gasPealAudioPtr = Min(*gasPealAudioPtr + 0.09f, gasPedal); + else + *gasPealAudioPtr = Max(*gasPealAudioPtr - 0.07f, gasPedal); } -float -cAudioManager::GetVehicleNonDriveWheelSkidValue(CVehicle *veh, tWheelState wheelState, cTransmission *transmission, float velocityChange) +void +cAudioManager::PlayerJustGotInCar() { - float relativeVelChange = 0.0f; - - if (wheelState == WHEEL_STATE_SKIDDING) - relativeVelChange = Min(1.0f, Abs(velocityChange) / transmission->fMaxVelocity); - - return Max(relativeVelChange, Min(1.0f, Abs(veh->m_vecTurnSpeed.z) * 20.0f)); + if (m_bIsInitialised) + bPlayerJustEnteredCar = TRUE; } -bool8 -cAudioManager::ProcessVehicleHorn(cVehicleParams& params) +void +cAudioManager::PlayerJustLeftCar(void) { - const float SOUND_INTENSITY = 40.0f; - - CVehicle *veh; - uint8 volume; - - if (params.m_fDistance >= SQR(SOUND_INTENSITY)) - return FALSE; + // UNUSED: This is a perfectly empty function. +} - veh = params.m_pVehicle; - if (veh->m_bSirenOrAlarm && UsesSirenSwitching(params)) - return TRUE; - - if (veh->m_modelIndex == MI_MRWHOOP) - return TRUE; - - if (veh->IsAlarmOn()) - return TRUE; - - if (veh->m_nCarHornTimer != 0) { - if (veh->GetStatus() != STATUS_PLAYER) { - veh->m_nCarHornTimer = Min(44, veh->m_nCarHornTimer); - if (veh->m_nCarHornTimer == 44) - veh->m_nCarHornPattern = (m_FrameCounter + m_sQueueSample.m_nEntityIndex) & 7; - - if (!hornPatternsArray[veh->m_nCarHornPattern][44 - veh->m_nCarHornTimer]) - return TRUE; - } +void +cAudioManager::AddPlayerCarSample(uint8 emittingVolume, uint32 freq, uint32 sample, uint8 bank, uint8 counter, bool8 notLooping) +{ + m_sQueueSample.m_nVolume = ComputeVolume(emittingVolume, 50.f, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume != 0) { + m_sQueueSample.m_nCounter = counter; + m_sQueueSample.m_nSampleIndex = sample; +#ifdef GTA_PS2 + m_sQueueSample.m_nBankIndex = bank; +#else + m_sQueueSample.m_nBankIndex = SFX_BANK_0; +#endif // GTA_PS2 + m_sQueueSample.m_bIs2D = FALSE; + m_sQueueSample.m_nReleasingVolumeModificator = 0; + m_sQueueSample.m_nFrequency = freq; + if (notLooping) { + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nReleasingVolumeDivider = 8; + } else { + m_sQueueSample.m_nLoopCount = 1; + } + m_sQueueSample.m_nEmittingVolume = emittingVolume; + SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) + m_sQueueSample.m_fSpeedMultiplier = 6.0f; + m_sQueueSample.m_fSoundIntensity = 50.0f; + m_sQueueSample.m_bReleasingSoundFlag = FALSE; + m_sQueueSample.m_bReverbFlag = TRUE; + m_sQueueSample.m_bRequireReflection = FALSE; + AddSampleToRequestedQueue(); + } +} +void +cAudioManager::ProcessCesna(cVehicleParams ¶ms) +{ + if(params.m_fDistance < SQR(200)) { CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); - volume = veh->bIsDrowning ? 20 : 80; - m_sQueueSample.m_nVolume = ComputeVolume(volume, SOUND_INTENSITY, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_nCounter = 4; - m_sQueueSample.m_nSampleIndex = aVehicleSettings[params.m_nIndex].m_nHornSample; + m_sQueueSample.m_nVolume = ComputeVolume(80, 200.f, m_sQueueSample.m_fDistance); + if(m_sQueueSample.m_nVolume != 0) { + m_sQueueSample.m_nCounter = 52; + m_sQueueSample.m_nSampleIndex = SFX_CESNA_IDLE; m_sQueueSample.m_nBankIndex = SFX_BANK_0; m_sQueueSample.m_bIs2D = FALSE; - m_sQueueSample.m_nReleasingVolumeModificator = 2; - m_sQueueSample.m_nFrequency = aVehicleSettings[params.m_nIndex].m_nHornFrequency; + m_sQueueSample.m_nReleasingVolumeModificator = 0; + m_sQueueSample.m_nFrequency = 12500; m_sQueueSample.m_nLoopCount = 0; -#ifdef FIX_BUGS - m_sQueueSample.m_nEmittingVolume = volume; -#else + m_sQueueSample.m_nReleasingVolumeDivider = 8; m_sQueueSample.m_nEmittingVolume = 80; -#endif SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) - m_sQueueSample.m_fSpeedMultiplier = 5.0f; - m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + m_sQueueSample.m_fSpeedMultiplier = 4.0f; + m_sQueueSample.m_fSoundIntensity = 200.0f; m_sQueueSample.m_bReleasingSoundFlag = FALSE; - m_sQueueSample.m_nReleasingVolumeDivider = 4; m_sQueueSample.m_bReverbFlag = TRUE; m_sQueueSample.m_bRequireReflection = FALSE; AddSampleToRequestedQueue(); } + if(params.m_fDistance < SQR(90)) { + m_sQueueSample.m_nVolume = ComputeVolume(80, 90.f, m_sQueueSample.m_fDistance); + if(m_sQueueSample.m_nVolume != 0) { + m_sQueueSample.m_nCounter = 2; + m_sQueueSample.m_nSampleIndex = SFX_CESNA_REV; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_bIs2D = FALSE; + m_sQueueSample.m_nReleasingVolumeModificator = 3; + m_sQueueSample.m_nFrequency = 25000; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nReleasingVolumeDivider = 4; + m_sQueueSample.m_nEmittingVolume = 80; + SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) + m_sQueueSample.m_fSpeedMultiplier = 4.0f; + m_sQueueSample.m_fSoundIntensity = 90.0f; + m_sQueueSample.m_bReleasingSoundFlag = FALSE; + m_sQueueSample.m_bReverbFlag = TRUE; + m_sQueueSample.m_bRequireReflection = FALSE; + AddSampleToRequestedQueue(); + } + } } - return TRUE; } -bool8 -cAudioManager::UsesSiren(cVehicleParams& params) const -{ - return params.m_pVehicle->UsesSiren(); -} - -bool8 -cAudioManager::UsesSirenSwitching(cVehicleParams& params) const -{ - if (params.m_nIndex == FIRETRUK || params.m_nIndex == MRWHOOP) - return FALSE; - return UsesSiren(params); -} - -bool8 -cAudioManager::ProcessVehicleSirenOrAlarm(cVehicleParams& params) +void +cAudioManager::ProcessPlayersVehicleEngine(cVehicleParams& params, CVehicle* veh) { - const float SOUND_INTENSITY = 110.0f; + static int32 GearFreqAdj[] = { 6000, 6000, 3400, 1200, 0, -1000 }; - CVehicle *veh; - uint8 volume; + tWheelState* wheelState; + CAutomobile* automobile; + CBike* bike; + CVector pos; + float* gasPedalAudioPtr; - if (params.m_fDistance >= SQR(SOUND_INTENSITY)) - return FALSE; + int32 accelerateState; + int32 brakeState; + int32 freq; + int32 baseFreq; + int32 freqModifier; + uint32 gearSoundLength; + uint32 soundOffset; + uint8 engineSoundType; + uint8 wheelInUseCounter; + uint8 wheelsOnGround; + uint8 vol; + uint8 currentGear; + uint8 wheelsOnGroundPrev; - veh = params.m_pVehicle; - if (!veh->m_bSirenOrAlarm && !veh->IsAlarmOn()) - return TRUE; + float accelerationMultipler; + float gasPedalAudio; + float velocityChangeForAudio; + float relativeVelocityChange; + float time; + bool8 channelUsed; + bool8 lostTraction; + bool8 noGearBox; + bool8 stuckInSand; + bool8 processedAccelSampleStopped; + bool8 isMoped; - if (veh->IsAlarmOn()) { - if (CTimer::GetTimeInMilliseconds() > veh->m_nCarHornTimer) - veh->m_nCarHornTimer = CTimer::GetTimeInMilliseconds() + 750; + static uint32 gearSoundStartTime = CTimer::GetTimeInMilliseconds(); + static int32 nCruising = 0; + static int16 LastAccel = 0; + static uint8 CurrentPretendGear = 1; + static bool8 bLostTractionLastFrame = FALSE; + static bool8 bHandbrakeOnLastFrame = FALSE; + static bool8 bAccelSampleStopped = TRUE; - if (veh->m_nCarHornTimer < CTimer::GetTimeInMilliseconds() + 375) - return TRUE; + lostTraction = FALSE; + isMoped = params.m_pVehicle->m_modelIndex == MI_PIZZABOY || params.m_pVehicle->m_modelIndex == MI_FAGGIO; + processedAccelSampleStopped = FALSE; + if (bPlayerJustEnteredCar) { + bAccelSampleStopped = TRUE; + bPlayerJustEnteredCar = FALSE; + nCruising = 0; + LastAccel = 0; + bLostTractionLastFrame = FALSE; + CurrentPretendGear = 1; + bHandbrakeOnLastFrame = FALSE; + } + if (CReplay::IsPlayingBack()) { + accelerateState = (255.0f * Clamp(params.m_pVehicle->m_fGasPedal, 0.0f, 1.0f)); + brakeState = (255.0f * Clamp(params.m_pVehicle->m_fBrakePedal, 0.0f, 1.0f)); + } else { + accelerateState = Pads[0].GetAccelerate(); + brakeState = Pads[0].GetBrake(); + } + channelUsed = SampleManager.GetChannelUsedFlag(CHANNEL_PLAYER_VEHICLE_ENGINE); + if (isMoped) { + CurrentPretendGear = params.m_pTransmission->nNumberOfGears; + currentGear = CurrentPretendGear; + if (params.m_pVehicle->bIsHandbrakeOn) { + brakeState = 0; + nCruising = 0; + LastAccel = 0; + accelerateState = 0; + } else { + nCruising = 1; + } + } else { + currentGear = params.m_pVehicle->m_nCurrentGear; } - CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); - volume = veh->bIsDrowning ? 20 : 80; - m_sQueueSample.m_nVolume = ComputeVolume(volume, SOUND_INTENSITY, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_nCounter = 5; - if (UsesSiren(params)) { - if (params.m_pVehicle->GetStatus() == STATUS_ABANDONED) - return TRUE; - if (veh->m_nCarHornTimer != 0 && params.m_nIndex != FIRETRUK && params.m_nIndex != MRWHOOP) { - m_sQueueSample.m_nSampleIndex = SFX_SIREN_FAST; - if (params.m_nIndex == FBIRANCH) - m_sQueueSample.m_nFrequency = 12668; - else - m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_SIREN_FAST); - m_sQueueSample.m_nCounter = 60; - } else if (params.m_nIndex == VICECHEE) { - m_sQueueSample.m_nSampleIndex = SFX_POLICE_SIREN_SLOW; - m_sQueueSample.m_nFrequency = 11440; + switch (params.m_VehicleType) { + case VEHICLE_TYPE_CAR: + automobile = (CAutomobile*)params.m_pVehicle; + wheelsOnGround = automobile->m_nDriveWheelsOnGround; + wheelsOnGroundPrev = automobile->m_nDriveWheelsOnGroundPrev; + gasPedalAudioPtr = &automobile->m_fGasPedalAudio; + wheelState = automobile->m_aWheelState; + velocityChangeForAudio = automobile->m_fVelocityChangeForAudio; + break; + case VEHICLE_TYPE_BIKE: + bike = (CBike*)params.m_pVehicle; + wheelsOnGround = bike->m_nDriveWheelsOnGround; + wheelsOnGroundPrev = bike->m_nDriveWheelsOnGroundPrev; + gasPedalAudioPtr = &bike->m_fGasPedalAudio; + wheelState = bike->m_aWheelState; + velocityChangeForAudio = bike->m_fVelocityChangeForAudio; + break; + default: + debug(" ** AUDIOLOG: Unrecognised vehicle type %d in ProcessVehicleEngine() * \n", params.m_VehicleType); + return; + } + if (!isMoped) { + switch (params.m_pTransmission->nDriveType) { + case '4': + if (params.m_VehicleType != VEHICLE_TYPE_BIKE) { + wheelInUseCounter = 0; + for (uint8 i = 0; i < 4; i++) { + if (wheelState[i] != WHEEL_STATE_NORMAL) + ++wheelInUseCounter; + } + if (wheelInUseCounter > 2) + lostTraction = TRUE; + } + break; + case 'F': + if (params.m_VehicleType == VEHICLE_TYPE_BIKE) { + if (wheelState[BIKEWHEEL_FRONT] != WHEEL_STATE_NORMAL) + lostTraction = TRUE; } else { - m_sQueueSample.m_nSampleIndex = aVehicleSettings[params.m_nIndex].m_nSirenOrAlarmSample; - m_sQueueSample.m_nFrequency = aVehicleSettings[params.m_nIndex].m_nSirenOrAlarmFrequency; + if ((wheelState[CARWHEEL_FRONT_LEFT] != WHEEL_STATE_NORMAL || wheelState[CARWHEEL_FRONT_RIGHT] != WHEEL_STATE_NORMAL) && + (wheelState[CARWHEEL_REAR_LEFT] != WHEEL_STATE_NORMAL || wheelState[CARWHEEL_REAR_RIGHT] != WHEEL_STATE_NORMAL)) + lostTraction = TRUE; } - } else { - m_sQueueSample.m_nSampleIndex = aVehicleSettings[params.m_nIndex].m_nHornSample; - m_sQueueSample.m_nFrequency = aVehicleSettings[params.m_nIndex].m_nHornFrequency; + break; + case 'R': + if (params.m_VehicleType == VEHICLE_TYPE_BIKE) { + if (wheelState[BIKEWHEEL_REAR] != WHEEL_STATE_NORMAL) + lostTraction = TRUE; + } else { + if (wheelState[CARWHEEL_REAR_LEFT] != WHEEL_STATE_NORMAL || wheelState[CARWHEEL_REAR_RIGHT] != WHEEL_STATE_NORMAL) + lostTraction = TRUE; + } + break; + default: + break; } - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_bIs2D = FALSE; - m_sQueueSample.m_nReleasingVolumeModificator = 1; - m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = volume; - SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) - m_sQueueSample.m_fSpeedMultiplier = 7.0f; - m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; - m_sQueueSample.m_bReleasingSoundFlag = FALSE; - m_sQueueSample.m_nReleasingVolumeDivider = 5; - m_sQueueSample.m_bReverbFlag = TRUE; - m_sQueueSample.m_bRequireReflection = FALSE; - AddSampleToRequestedQueue(); } - return TRUE; -} - -bool8 -cAudioManager::UsesReverseWarning(int32 model) const + if (params.m_fVelocityChange != 0.0f) { + time = params.m_pVehicle->m_vecMoveSpeed.z / params.m_fVelocityChange; + if (time > 0.0f) + freqModifier = -(Min(0.2f, time) * 3000.0f * 5.0f); + else + freqModifier = -(Max(-0.2f, time) * 3000.0f * 5.0f); + if (params.m_fVelocityChange < -0.001f) + freqModifier = -freqModifier; + } else + freqModifier = 0; + if (params.m_VehicleType == VEHICLE_TYPE_BIKE && bike->bExtraSpeed) + freqModifier += 1400; + gearSoundLength = 0; + engineSoundType = aVehicleSettings[params.m_nIndex].m_nBank; + soundOffset = 3 * (engineSoundType - CAR_SFX_BANKS_OFFSET); + noGearBox = FALSE; + switch (engineSoundType) { + case SFX_BANK_PONTIAC: + gearSoundLength = 2526; + break; + case SFX_BANK_PORSCHE: + gearSoundLength = 3587; + break; + case SFX_BANK_SPIDER: + gearSoundLength = 4898; + break; + case SFX_BANK_MERC: + gearSoundLength = 4003; + break; + case SFX_BANK_TRUCK: + gearSoundLength = 6289; + break; + case SFX_BANK_HOTROD: + gearSoundLength = 2766; + break; + case SFX_BANK_COBRA: + gearSoundLength = 3523; + break; + case SFX_BANK_PONTIAC_SLOW: + gearSoundLength = 2773; + break; + case SFX_BANK_CADILLAC: + gearSoundLength = 2560; + break; + case SFX_BANK_PATHFINDER: + gearSoundLength = 4228; + break; + case SFX_BANK_PACARD: + gearSoundLength = 4648; + break; + case SFX_BANK_VTWIN: + gearSoundLength = 3480; + break; + case SFX_BANK_HONDA250: + gearSoundLength = 2380; + break; + case SFX_BANK_SPORTS_BIKE: + gearSoundLength = 2410; + break; + default: + noGearBox = TRUE; + break; + } + if (!channelUsed || nCruising || noGearBox) { + gearSoundStartTime = CTimer::GetTimeInMilliseconds(); + } else { + gearSoundLength -= 1000; + if (CTimer::GetTimeInMilliseconds() - gearSoundStartTime > gearSoundLength) { + channelUsed = FALSE; + gearSoundStartTime = CTimer::GetTimeInMilliseconds(); + } + } + relativeVelocityChange = 2.0f * params.m_fVelocityChange / params.m_pTransmission->fMaxVelocity; + accelerationMultipler = Clamp(relativeVelocityChange, 0.0f, 1.0f); + gasPedalAudio = accelerationMultipler; + switch (engineSoundType) { + case SFX_BANK_MOPED: + ++soundOffset; + break; + case SFX_BANK_HONDA250: + soundOffset += 2; + break; + case SFX_BANK_SPORTS_BIKE: + soundOffset += 3; + break; + default: + break; + } + if (accelerateState <= 0) { + if (params.m_fVelocityChange < -0.001f) { + if (channelUsed) { + SampleManager.StopChannel(CHANNEL_PLAYER_VEHICLE_ENGINE); + bAccelSampleStopped = TRUE; + } + if (wheelsOnGround == 0 || params.m_pVehicle->bIsHandbrakeOn || lostTraction) + gasPedalAudio = *gasPedalAudioPtr; + else if (params.m_VehicleType == VEHICLE_TYPE_BIKE) + gasPedalAudio = 0.0f; + else + gasPedalAudio = Min(1.0f, params.m_fVelocityChange / params.m_pTransmission->fMaxReverseVelocity); + *gasPedalAudioPtr = Max(0.0f, gasPedalAudio); + } else if (LastAccel > 0) { + if (channelUsed) { + SampleManager.StopChannel(CHANNEL_PLAYER_VEHICLE_ENGINE); + bAccelSampleStopped = TRUE; + } + nCruising = 0; + if (wheelsOnGround == 0 + || params.m_pVehicle->bIsHandbrakeOn + || lostTraction + || params.m_fVelocityChange < 0.01f && *gasPedalAudioPtr > 0.2f) { + if (isMoped) { + gasPedalAudio = 0.0f; + } else { + *gasPedalAudioPtr *= 0.6f; + gasPedalAudio = *gasPedalAudioPtr; + } + } + if (gasPedalAudio > 0.05f) { + freq = (5000.f * (gasPedalAudio - 0.05f) * 20.f / 19) + 19000; + vol = (25.0f * (gasPedalAudio - 0.05f) * 20.f / 19) + 40; + if (params.m_pVehicle->bIsDrowning) + vol /= 4; + if (engineSoundType == SFX_BANK_TRUCK) + freq /= 2; + AddPlayerCarSample(vol, freq, soundOffset + SFX_CAR_FINGER_OFF_ACCEL_1, engineSoundType, 63, FALSE); + } + } + freq = (10000.f * gasPedalAudio) + 22050; + vol = 110 - (40.0f * gasPedalAudio); + if (engineSoundType == SFX_BANK_TRUCK) + freq /= 2; + if (params.m_pVehicle->bIsDrowning) + vol /= 4; + AddPlayerCarSample(vol, freq, engineSoundType - CAR_SFX_BANKS_OFFSET + SFX_CAR_IDLE_1, SFX_BANK_0, 52, TRUE); + + CurrentPretendGear = Max(1, currentGear); + } + else { + if (nCruising == 0){ + stuckInSand = params.m_VehicleType == VEHICLE_TYPE_CAR && ((CAutomobile*)params.m_pVehicle)->bStuckInSand; + if (accelerateState < 150 || wheelsOnGround == 0 || params.m_pVehicle->bIsHandbrakeOn || lostTraction + || (currentGear < 2 && params.m_fVelocityChange - velocityChangeForAudio < 0.01f) || brakeState > 0) { + + if (((wheelsOnGround && !params.m_pVehicle->bIsHandbrakeOn && !lostTraction ) || stuckInSand) && brakeState <= 0) { + baseFreq = (8000.0f * accelerationMultipler) + 16000; + vol = (25.0f * accelerationMultipler) + 60; + *gasPedalAudioPtr = accelerationMultipler; + } else { + if (wheelsOnGround == 0 && wheelsOnGroundPrev != 0 || (params.m_pVehicle->bIsHandbrakeOn && !bHandbrakeOnLastFrame || lostTraction && !bLostTractionLastFrame) + && wheelsOnGround != 0) { + *gasPedalAudioPtr *= 0.6f; + } + freqModifier = 0; + if (engineSoundType != SFX_BANK_GOLF_CART && engineSoundType != SFX_BANK_CAR_CHAINSAW) + baseFreq = (25000.0f * *gasPedalAudioPtr) + 14000; + else + baseFreq = (15000.0f * *gasPedalAudioPtr) + 14000; + vol = (25.0f * *gasPedalAudioPtr) + 60; + } + freq = freqModifier + baseFreq; + if (engineSoundType == SFX_BANK_TRUCK) + freq /= 2; + if (channelUsed) { + SampleManager.StopChannel(CHANNEL_PLAYER_VEHICLE_ENGINE); + bAccelSampleStopped = TRUE; + } + if (params.m_pVehicle->bIsDrowning) + vol /= 4; + AddPlayerCarSample(vol, freq, engineSoundType - CAR_SFX_BANKS_OFFSET + SFX_CAR_REV_1, SFX_BANK_0, 2, TRUE); + } else { + TranslateEntity(&m_sQueueSample.m_vecPos, &pos); + if (bAccelSampleStopped) { + if (CurrentPretendGear != 1 || currentGear != 2) + CurrentPretendGear = Max(1, currentGear - 1); + processedAccelSampleStopped = TRUE; + bAccelSampleStopped = FALSE; + } + if (channelUsed) { + SampleManager.SetChannelEmittingVolume(CHANNEL_PLAYER_VEHICLE_ENGINE, 120); + SampleManager.SetChannel3DPosition(CHANNEL_PLAYER_VEHICLE_ENGINE, pos.x, pos.y, pos.z); + SampleManager.SetChannel3DDistances(CHANNEL_PLAYER_VEHICLE_ENGINE, 50.0f, 12.5f); + freq = (GearFreqAdj[CurrentPretendGear] + freqModifier + 22050) ; + if (engineSoundType == SFX_BANK_TRUCK) + freq /= 2; + SampleManager.SetChannelFrequency(CHANNEL_PLAYER_VEHICLE_ENGINE, freq); + if (!channelUsed) { + SampleManager.SetChannelReverbFlag(CHANNEL_PLAYER_VEHICLE_ENGINE, m_bDynamicAcousticModelingStatus != FALSE); + SampleManager.StartChannel(CHANNEL_PLAYER_VEHICLE_ENGINE); + } + } else if (processedAccelSampleStopped) { + gearSoundStartTime = CTimer::GetTimeInMilliseconds(); + params.m_pVehicle->bAudioChangingGear = TRUE; + if (!SampleManager.InitialiseChannel(CHANNEL_PLAYER_VEHICLE_ENGINE, soundOffset + SFX_CAR_ACCEL_1, SFX_BANK_0)) + return; + SampleManager.SetChannelLoopCount(CHANNEL_PLAYER_VEHICLE_ENGINE, 1); + SampleManager.SetChannelLoopPoints(CHANNEL_PLAYER_VEHICLE_ENGINE, 0, -1); + + SampleManager.SetChannelEmittingVolume(CHANNEL_PLAYER_VEHICLE_ENGINE, 120); + SampleManager.SetChannel3DPosition(CHANNEL_PLAYER_VEHICLE_ENGINE, pos.x, pos.y, pos.z); + SampleManager.SetChannel3DDistances(CHANNEL_PLAYER_VEHICLE_ENGINE, 50.0f, 12.5f); + freq = (GearFreqAdj[CurrentPretendGear] + freqModifier + 22050); + if (engineSoundType == SFX_BANK_TRUCK) + freq /= 2; + SampleManager.SetChannelFrequency(CHANNEL_PLAYER_VEHICLE_ENGINE, freq); + if (!channelUsed) { + SampleManager.SetChannelReverbFlag(CHANNEL_PLAYER_VEHICLE_ENGINE, m_bDynamicAcousticModelingStatus != FALSE); + SampleManager.StartChannel(CHANNEL_PLAYER_VEHICLE_ENGINE); + } + } else if (CurrentPretendGear < params.m_pTransmission->nNumberOfGears - 1) { + ++CurrentPretendGear; + gearSoundStartTime = CTimer::GetTimeInMilliseconds(); + params.m_pVehicle->bAudioChangingGear = TRUE; + if (!SampleManager.InitialiseChannel(CHANNEL_PLAYER_VEHICLE_ENGINE, soundOffset + SFX_CAR_ACCEL_1, SFX_BANK_0)) + return; + SampleManager.SetChannelLoopCount(CHANNEL_PLAYER_VEHICLE_ENGINE, 1); + SampleManager.SetChannelLoopPoints(CHANNEL_PLAYER_VEHICLE_ENGINE, 0, -1); + + SampleManager.SetChannelEmittingVolume(CHANNEL_PLAYER_VEHICLE_ENGINE, 120); + SampleManager.SetChannel3DPosition(CHANNEL_PLAYER_VEHICLE_ENGINE, pos.x, pos.y, pos.z); + SampleManager.SetChannel3DDistances(CHANNEL_PLAYER_VEHICLE_ENGINE, 50.0f, 12.5f); + freq = (GearFreqAdj[CurrentPretendGear] + freqModifier + 22050); + if (engineSoundType == SFX_BANK_TRUCK) + freq /= 2; + SampleManager.SetChannelFrequency(CHANNEL_PLAYER_VEHICLE_ENGINE, freq); + if (!channelUsed) { + SampleManager.SetChannelReverbFlag(CHANNEL_PLAYER_VEHICLE_ENGINE, m_bDynamicAcousticModelingStatus != FALSE); + SampleManager.StartChannel(CHANNEL_PLAYER_VEHICLE_ENGINE); + } + } else { + nCruising = 1; + goto PlayCruising; + } + } + } else { +PlayCruising: + bAccelSampleStopped = TRUE; + SampleManager.StopChannel(CHANNEL_PLAYER_VEHICLE_ENGINE); + if (isMoped || accelerateState >= 150 && wheelsOnGround && brakeState <= 0 && !params.m_pVehicle->bIsHandbrakeOn + && !lostTraction && currentGear >= params.m_pTransmission->nNumberOfGears - 1) { + if (accelerateState >= 220 && params.m_fVelocityChange + 0.001f >= velocityChangeForAudio) { + if (nCruising < 800) + ++nCruising; + } else if (nCruising > 3) { + --nCruising; + } + freq = 27 * nCruising + freqModifier + 22050; + if (engineSoundType == SFX_BANK_TRUCK) + freq /= 2; + AddPlayerCarSample(120, freq, soundOffset + SFX_CAR_AFTER_ACCEL_1, engineSoundType, 64, TRUE); + } else { + nCruising = 0; + } + } + } + LastAccel = accelerateState; + bHandbrakeOnLastFrame = params.m_pVehicle->bIsHandbrakeOn; + bLostTractionLastFrame = lostTraction; + return; +} + +bool8 +cAudioManager::ProcessVehicleSkidding(cVehicleParams& params) +{ + const float SOUND_INTENSITY = 40.0f; + + CAutomobile *automobile; + CBike *bike; + uint8 numWheels; + uint8 wheelsOnGround; + float gasPedalAudio; + tWheelState* wheelStateArr; + + + cTransmission *transmission; + int32 emittingVol; + float newSkidVal = 0.0f; + float skidVal = 0.0f; + + if (params.m_fDistance >= SQR(SOUND_INTENSITY)) + return FALSE; + switch (params.m_VehicleType) { + case VEHICLE_TYPE_CAR: + automobile = (CAutomobile*)params.m_pVehicle; + numWheels = 4; + wheelStateArr = automobile->m_aWheelState; + wheelsOnGround = automobile->m_nWheelsOnGround; + gasPedalAudio = automobile->m_fGasPedalAudio; + break; + case VEHICLE_TYPE_BIKE: + bike = (CBike*)params.m_pVehicle; + numWheels = 2; + wheelStateArr = bike->m_aWheelState; + wheelsOnGround = bike->m_nWheelsOnGround; + gasPedalAudio = bike->m_fGasPedalAudio; + break; + default: + debug("\n * AUDIOLOG: ProcessVehicleSkidding() Unsupported vehicle type %d * \n", params.m_VehicleType); + return TRUE; + } + if (wheelsOnGround == 0) + return TRUE; + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); + + for (int32 i = 0; i < numWheels; i++) { + if (wheelStateArr[i] == WHEEL_STATE_NORMAL) + continue; + transmission = params.m_pTransmission; + switch (transmission->nDriveType) { + case '4': + newSkidVal = GetVehicleDriveWheelSkidValue(params.m_pVehicle, wheelStateArr[i], gasPedalAudio, transmission, params.m_fVelocityChange); + break; + case 'F': + if (i == CARWHEEL_FRONT_LEFT || i == CARWHEEL_FRONT_RIGHT) + newSkidVal = GetVehicleDriveWheelSkidValue(params.m_pVehicle, wheelStateArr[i], gasPedalAudio, transmission, params.m_fVelocityChange); + else + newSkidVal = GetVehicleNonDriveWheelSkidValue(params.m_pVehicle, wheelStateArr[i], transmission, params.m_fVelocityChange); + break; + case 'R': + if (i == CARWHEEL_REAR_LEFT || i == CARWHEEL_REAR_RIGHT) + newSkidVal = GetVehicleDriveWheelSkidValue(params.m_pVehicle, wheelStateArr[i], gasPedalAudio, transmission, params.m_fVelocityChange); + else + newSkidVal = GetVehicleNonDriveWheelSkidValue(params.m_pVehicle, wheelStateArr[i], transmission, params.m_fVelocityChange); + break; + default: + break; + } + skidVal = Max(skidVal, newSkidVal); + } + + if (skidVal > 0.0f) { + emittingVol = 50.f * skidVal; + m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, SOUND_INTENSITY, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume != 0) { + m_sQueueSample.m_nCounter = 3; + switch (params.m_pVehicle->m_nSurfaceTouched) { + case SURFACE_GRASS: + case SURFACE_HEDGE: + m_sQueueSample.m_nSampleIndex = SFX_RAIN; + emittingVol /= 4; + m_sQueueSample.m_nFrequency = 13000.f * skidVal + 35000.f; + m_sQueueSample.m_nVolume /= 4; + if (m_sQueueSample.m_nVolume == 0) + return TRUE; + break; + case SURFACE_GRAVEL: + case SURFACE_MUD_DRY: + case SURFACE_SAND: + case SURFACE_WATER: + case SURFACE_SAND_BEACH: + m_sQueueSample.m_nSampleIndex = SFX_GRAVEL_SKID; + m_sQueueSample.m_nFrequency = 6000.f * skidVal + 10000.f; + break; + + default: + m_sQueueSample.m_nSampleIndex = SFX_SKID; + m_sQueueSample.m_nFrequency = 5000.f * skidVal + 11000.f; + if (params.m_VehicleType == VEHICLE_TYPE_BIKE) + m_sQueueSample.m_nFrequency += 2000; + break; + } + + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_bIs2D = FALSE; + m_sQueueSample.m_nReleasingVolumeModificator = 8; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nEmittingVolume = emittingVol; + SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) + m_sQueueSample.m_fSpeedMultiplier = 3.0f; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + m_sQueueSample.m_bReleasingSoundFlag = FALSE; + m_sQueueSample.m_nReleasingVolumeDivider = 3; + m_sQueueSample.m_bReverbFlag = TRUE; + m_sQueueSample.m_bRequireReflection = FALSE; + AddSampleToRequestedQueue(); + } + } + return TRUE; +} + +float +cAudioManager::GetVehicleDriveWheelSkidValue(CVehicle *veh, tWheelState wheelState, float gasPedalAudio, cTransmission *transmission, float velocityChange) +{ + float relativeVelChange = 0.0f; + float velChange; + float relativeVel; + + switch (wheelState) + { + case WHEEL_STATE_SPINNING: + if (gasPedalAudio > 0.4f) + relativeVelChange = (gasPedalAudio - 0.4f) * (5.0f / 3.0f) * 0.75f; + break; + case WHEEL_STATE_SKIDDING: + relativeVelChange = Min(1.0f, Abs(velocityChange) / transmission->fMaxVelocity); + break; + case WHEEL_STATE_FIXED: + relativeVel = gasPedalAudio; + if (relativeVel > 0.4f) + relativeVel = (gasPedalAudio - 0.4f) * (5.0f / 3.0f); + + velChange = Abs(velocityChange); + if (velChange > 0.04f) + relativeVelChange = Min(1.0f, velChange / transmission->fMaxVelocity); + if (relativeVel > relativeVelChange) + relativeVelChange = relativeVel; + + break; + default: + break; + } + + return Max(relativeVelChange, Min(1.0f, Abs(veh->m_vecTurnSpeed.z) * 20.0f)); +} + +float +cAudioManager::GetVehicleNonDriveWheelSkidValue(CVehicle *veh, tWheelState wheelState, cTransmission *transmission, float velocityChange) +{ + float relativeVelChange = 0.0f; + + if (wheelState == WHEEL_STATE_SKIDDING) + relativeVelChange = Min(1.0f, Abs(velocityChange) / transmission->fMaxVelocity); + + return Max(relativeVelChange, Min(1.0f, Abs(veh->m_vecTurnSpeed.z) * 20.0f)); +} + +bool8 +cAudioManager::ProcessVehicleHorn(cVehicleParams& params) +{ + const float SOUND_INTENSITY = 40.0f; + + CVehicle *veh; + uint8 volume; + + if (params.m_fDistance >= SQR(SOUND_INTENSITY)) + return FALSE; + + veh = params.m_pVehicle; + if (veh->m_bSirenOrAlarm && UsesSirenSwitching(params)) + return TRUE; + + if (veh->m_modelIndex == MI_MRWHOOP) + return TRUE; + + if (veh->IsAlarmOn()) + return TRUE; + + if (veh->m_nCarHornTimer != 0) { + if (veh->GetStatus() != STATUS_PLAYER) { + veh->m_nCarHornTimer = Min(44, veh->m_nCarHornTimer); + if (veh->m_nCarHornTimer == 44) + veh->m_nCarHornPattern = (m_FrameCounter + m_sQueueSample.m_nEntityIndex) & 7; + + if (!hornPatternsArray[veh->m_nCarHornPattern][44 - veh->m_nCarHornTimer]) + return TRUE; + } + + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); + volume = veh->bIsDrowning ? 20 : 80; + m_sQueueSample.m_nVolume = ComputeVolume(volume, SOUND_INTENSITY, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume != 0) { + m_sQueueSample.m_nCounter = 4; + m_sQueueSample.m_nSampleIndex = aVehicleSettings[params.m_nIndex].m_nHornSample; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_bIs2D = FALSE; + m_sQueueSample.m_nReleasingVolumeModificator = 2; + m_sQueueSample.m_nFrequency = aVehicleSettings[params.m_nIndex].m_nHornFrequency; + m_sQueueSample.m_nLoopCount = 0; +#ifdef FIX_BUGS + m_sQueueSample.m_nEmittingVolume = volume; +#else + m_sQueueSample.m_nEmittingVolume = 80; +#endif + SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) + m_sQueueSample.m_fSpeedMultiplier = 5.0f; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + m_sQueueSample.m_bReleasingSoundFlag = FALSE; + m_sQueueSample.m_nReleasingVolumeDivider = 4; + m_sQueueSample.m_bReverbFlag = TRUE; + m_sQueueSample.m_bRequireReflection = FALSE; + AddSampleToRequestedQueue(); + } + } + return TRUE; +} + +bool8 +cAudioManager::UsesSiren(cVehicleParams& params) +{ + return params.m_pVehicle->UsesSiren(); +} + +bool8 +cAudioManager::UsesSirenSwitching(cVehicleParams& params) +{ + if (params.m_nIndex == FIRETRUK || params.m_nIndex == MRWHOOP) + return FALSE; + return UsesSiren(params); +} + +bool8 +cAudioManager::ProcessVehicleSirenOrAlarm(cVehicleParams& params) +{ + const float SOUND_INTENSITY = 110.0f; + + CVehicle *veh; + uint8 volume; + + if (params.m_fDistance >= SQR(SOUND_INTENSITY)) + return FALSE; + + veh = params.m_pVehicle; + if (!veh->m_bSirenOrAlarm && !veh->IsAlarmOn()) + return TRUE; + + if (veh->IsAlarmOn()) { + if (CTimer::GetTimeInMilliseconds() > veh->m_nCarHornTimer) + veh->m_nCarHornTimer = CTimer::GetTimeInMilliseconds() + 750; + + if (veh->m_nCarHornTimer < CTimer::GetTimeInMilliseconds() + 375) + return TRUE; + } + + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); + volume = veh->bIsDrowning ? 20 : 80; + m_sQueueSample.m_nVolume = ComputeVolume(volume, SOUND_INTENSITY, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume != 0) { + m_sQueueSample.m_nCounter = 5; + if (UsesSiren(params)) { + if (params.m_pVehicle->GetStatus() == STATUS_ABANDONED) + return TRUE; + if (veh->m_nCarHornTimer != 0 && params.m_nIndex != FIRETRUK && params.m_nIndex != MRWHOOP) { + m_sQueueSample.m_nSampleIndex = SFX_SIREN_FAST; + if (params.m_nIndex == FBIRANCH) + m_sQueueSample.m_nFrequency = 12668; + else + m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_SIREN_FAST); + m_sQueueSample.m_nCounter = 60; + } else if (params.m_nIndex == VICECHEE) { + m_sQueueSample.m_nSampleIndex = SFX_POLICE_SIREN_SLOW; + m_sQueueSample.m_nFrequency = 11440; + } else { + m_sQueueSample.m_nSampleIndex = aVehicleSettings[params.m_nIndex].m_nSirenOrAlarmSample; + m_sQueueSample.m_nFrequency = aVehicleSettings[params.m_nIndex].m_nSirenOrAlarmFrequency; + } + } else { + m_sQueueSample.m_nSampleIndex = aVehicleSettings[params.m_nIndex].m_nHornSample; + m_sQueueSample.m_nFrequency = aVehicleSettings[params.m_nIndex].m_nHornFrequency; + } + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_bIs2D = FALSE; + m_sQueueSample.m_nReleasingVolumeModificator = 1; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nEmittingVolume = volume; + SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) + m_sQueueSample.m_fSpeedMultiplier = 7.0f; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + m_sQueueSample.m_bReleasingSoundFlag = FALSE; + m_sQueueSample.m_nReleasingVolumeDivider = 5; + m_sQueueSample.m_bReverbFlag = TRUE; + m_sQueueSample.m_bRequireReflection = FALSE; + AddSampleToRequestedQueue(); + } + return TRUE; +} + +bool8 +cAudioManager::UsesReverseWarning(uint32 model) { return model == LINERUN || model == FIRETRUK || model == BUS || model == COACH || model == PACKER || model == FLATBED; } @@ -2440,7 +2810,7 @@ cAudioManager::ProcessAirBrakes(cVehicleParams& params) } bool8 -cAudioManager::HasAirBrakes(int32 model) const +cAudioManager::HasAirBrakes(uint32 model) { return model == LINERUN || model == FIRETRUK || model == TRASH || model == BUS || model == BARRACKS || model == COACH || model == PACKER || model == FLATBED; @@ -3079,650 +3449,272 @@ cAudioManager::ProcessVehicleOneShots(cVehicleParams& params) static uint8 CrunchOffset = 0; m_sQueueSample.m_nSampleIndex = CrunchOffset + SFX_PED_CRUNCH_1; m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_nCounter = 48; - m_sQueueSample.m_nFrequency = RandomDisplacement(6000) + 16000; - m_sQueueSample.m_nReleasingVolumeModificator = 1; - m_sQueueSample.m_fSpeedMultiplier = 0.0f; - m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; - ++CrunchOffset; - maxDist = SQR(SOUND_INTENSITY); - emittingVol = m_anRandomTable[4] % 20 + 55; - CrunchOffset %= 2; - m_sQueueSample.m_bRequireReflection = TRUE; - break; - } - case SOUND_CAR_PED_COLLISION: { - const float SOUND_INTENSITY = 40.0f; - vol = Min(20.0f, m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i]); - emittingVol = Min(127, (3 * (vol / 20.0f * 127.f)) / 2); - if (emittingVol == 0) - continue; - - m_sQueueSample.m_nSampleIndex = SFX_FIGHT_1; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_nCounter = 50; - m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex); - m_sQueueSample.m_nFrequency += RandomDisplacement(m_sQueueSample.m_nFrequency / 16); - m_sQueueSample.m_nReleasingVolumeModificator = 1; - m_sQueueSample.m_fSpeedMultiplier = 0.0f; - m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; - maxDist = SQR(SOUND_INTENSITY); - break; - } - default: - continue; - } - if (params.m_fDistance < maxDist) { - CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); - m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, m_sQueueSample.m_fSoundIntensity, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume != 0) { - if (noReflections) { - m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_bReleasingSoundFlag = FALSE; - } else { - m_sQueueSample.m_nLoopCount = 1; - m_sQueueSample.m_bReleasingSoundFlag = TRUE; - } - SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) - m_sQueueSample.m_nEmittingVolume = emittingVol; - m_sQueueSample.m_bReverbFlag = TRUE; - if (isHeli) { - if (0.2f * m_sQueueSample.m_fSoundIntensity > m_sQueueSample.m_fDistance) { - m_sQueueSample.m_bIs2D = TRUE; - m_sQueueSample.m_nOffset = 0; -#ifdef THIS_IS_STUPID - goto AddSample; -#else - AddSampleToRequestedQueue(); - m_sQueueSample.m_nOffset = 127; - m_sQueueSample.m_nSampleIndex++; - m_sQueueSample.m_nCounter = GunIndex++; - if (GunIndex > 58) - GunIndex = 53; - m_sQueueSample.m_bRequireReflection = FALSE; - AddSampleToRequestedQueue(); - continue; -#endif - } - isHeli = FALSE; - } - m_sQueueSample.m_bIs2D = FALSE; -#ifdef THIS_IS_STUPID -AddSample: - AddSampleToRequestedQueue(); - if (isHeli) { - m_sQueueSample.m_nOffset = 127; - m_sQueueSample.m_nSampleIndex++; - m_sQueueSample.m_nCounter = GunIndex++; - if (GunIndex > 58) - GunIndex = 53; - m_sQueueSample.m_bRequireReflection = 0; - AddSampleToRequestedQueue(); - } -#else - AddSampleToRequestedQueue(); -#endif - continue; - - } - } - } -} - -#ifdef GTA_TRAIN -bool8 -cAudioManager::ProcessTrainNoise(cVehicleParams& params) -{ - const float SOUND_INTENSITY = 300.0f; - - CTrain *train; - uint8 emittingVol; - float speedMultipler; - - if (params.m_fDistance >= SQR(SOUND_INTENSITY)) - return FALSE; - - if (params.m_fVelocityChange > 0.0f) { - CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); - train = (CTrain *)params.m_pVehicle; - speedMultipler = Min(1.0f, train->m_fSpeed * 250.f / 51.f); - emittingVol = (75.f * speedMultipler); - if (train->m_fWagonPosition == 0.0f) { - m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, SOUND_INTENSITY, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_nCounter = 32; - m_sQueueSample.m_nSampleIndex = SFX_TRAIN_FAR; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_bIs2D = FALSE; - m_sQueueSample.m_nReleasingVolumeModificator = 2; - m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_TRAIN_FAR); - m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = emittingVol; - SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) - m_sQueueSample.m_fSpeedMultiplier = 3.0f; - m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; - m_sQueueSample.m_bReleasingSoundFlag = FALSE; - m_sQueueSample.m_nReleasingVolumeDivider = 3; - m_sQueueSample.m_bReverbFlag = TRUE; - m_sQueueSample.m_bRequireReflection = FALSE; - AddSampleToRequestedQueue(); - } - } - const float SOUND_INTENSITY = 70.0f; - if (params.m_fDistance < SQR(SOUND_INTENSITY)) { - m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, SOUND_INTENSITY, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_nCounter = 33; - m_sQueueSample.m_nSampleIndex = SFX_TRAIN_NEAR; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_bIs2D = FALSE; - m_sQueueSample.m_nReleasingVolumeModificator = 5; - m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_TRAIN_NEAR) + 100 * m_sQueueSample.m_nEntityIndex % 987; - m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = emittingVol; - SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) - m_sQueueSample.m_fSpeedMultiplier = 6.0f; - m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; - m_sQueueSample.m_bReleasingSoundFlag = FALSE; - m_sQueueSample.m_nReleasingVolumeDivider = 3; - m_sQueueSample.m_bReverbFlag = TRUE; - m_sQueueSample.m_bRequireReflection = FALSE; - AddSampleToRequestedQueue(); - } - } - } - return TRUE; -} -#endif -bool8 -cAudioManager::ProcessBoatEngine(cVehicleParams& params) -{ - CBoat *boat; - float padRelativeAccerate; - - bool8 isV12 = FALSE; - static int32 LastFreq = 2000; - static int8 LastVol = 0; - - static const float intensity = 90.0f; - - if (params.m_fDistance < SQR(intensity)) { - boat = (CBoat *)params.m_pVehicle; - if(boat->GetStatus() == STATUS_WRECKED) - return TRUE; - - float freqModificator; - float volModificator; - int BaseVol; - int BaseFreq; - - switch(boat->GetModelIndex()) { - case MI_RIO: - freqModificator = 490.0f; - volModificator = 60.0f; - BaseVol = 20; - BaseFreq = 1888; - break; - case MI_PREDATOR: - case MI_SQUALO: - case MI_SPEEDER: - case MI_COASTG: - case MI_DINGHY: - case MI_JETMAX: - freqModificator = 6000.0f; - volModificator = 60.0f; - isV12 = TRUE; - BaseFreq = 9000; - BaseVol = 20; - break; - case MI_REEFER: - freqModificator = 715.0f; - volModificator = 80.0f; - BaseVol = 0; - BaseFreq = 3775; - break; - case MI_TROPIC: - case MI_MARQUIS: - freqModificator = 463.0f; - volModificator = 60.0f; - BaseVol = 20; - BaseFreq = 1782; - break; - default: - return TRUE; - } - - bool8 bIsPlayerVeh; - - if(FindPlayerVehicle() == params.m_pVehicle) { - float padAccelerate = Max(Pads[0].GetAccelerate(), Pads[0].GetBrake()); - padRelativeAccerate = padAccelerate / 255.0f; - bIsPlayerVeh = TRUE; - } else { - padRelativeAccerate = Max(params.m_pVehicle->m_fGasPedal, params.m_pVehicle->m_fBrakePedal); - bIsPlayerVeh = FALSE; - } - - int Freq = BaseFreq + (padRelativeAccerate * freqModificator); - int Vol = BaseVol + (padRelativeAccerate * volModificator); - - if(!boat->bPropellerInWater) - Freq = (9 * Freq) / 8; - - if(bIsPlayerVeh) { - if(Freq > LastFreq) { - if(isV12) - Freq = Min(Freq, LastFreq + 100); - else - Freq = Min(Freq, LastFreq + 15); - } else { - if(isV12) - Freq = Max(Freq, LastFreq - 100); - else - Freq = Max(Freq, LastFreq - 15); - } - if(Vol > LastVol) - Vol = Min(Vol, LastVol + 3); - else - Vol = Max(Vol, LastVol - 3); + m_sQueueSample.m_nCounter = 48; + m_sQueueSample.m_nFrequency = RandomDisplacement(6000) + 16000; + m_sQueueSample.m_nReleasingVolumeModificator = 1; + m_sQueueSample.m_fSpeedMultiplier = 0.0f; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + ++CrunchOffset; + maxDist = SQR(SOUND_INTENSITY); + emittingVol = m_anRandomTable[4] % 20 + 55; + CrunchOffset %= 2; + m_sQueueSample.m_bRequireReflection = TRUE; + break; } + case SOUND_CAR_PED_COLLISION: { + const float SOUND_INTENSITY = 40.0f; + vol = Min(20.0f, m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_afVolume[i]); + emittingVol = Min(127, (3 * (vol / 20.0f * 127.f)) / 2); + if (emittingVol == 0) + continue; - if (Vol > 0) { - CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); - m_sQueueSample.m_nVolume = ComputeVolume(Vol, intensity, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_nFrequency = Freq; - m_sQueueSample.m_nCounter = 40; - if (isV12) - m_sQueueSample.m_nSampleIndex = SFX_BOAT_V12_LOOP; - else - m_sQueueSample.m_nSampleIndex = SFX_BOAT_CRUISER_LOOP; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_bIs2D = FALSE; - m_sQueueSample.m_nReleasingVolumeModificator = 3; - m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = Vol; - SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) - m_sQueueSample.m_fSpeedMultiplier = 2.0f; - m_sQueueSample.m_fSoundIntensity = intensity; - m_sQueueSample.m_bReleasingSoundFlag = FALSE; - m_sQueueSample.m_nReleasingVolumeDivider = 7; - m_sQueueSample.m_bReverbFlag = TRUE; - m_sQueueSample.m_bRequireReflection = FALSE; - AddSampleToRequestedQueue(); - } + m_sQueueSample.m_nSampleIndex = SFX_FIGHT_1; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_nCounter = 50; + m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex); + m_sQueueSample.m_nFrequency += RandomDisplacement(m_sQueueSample.m_nFrequency / 16); + m_sQueueSample.m_nReleasingVolumeModificator = 1; + m_sQueueSample.m_fSpeedMultiplier = 0.0f; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + maxDist = SQR(SOUND_INTENSITY); + break; } - - if(boat->GetModelIndex() == MI_REEFER) { + default: + continue; + } + if (params.m_fDistance < maxDist) { CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); - m_sQueueSample.m_nVolume = ComputeVolume(80, intensity, m_sQueueSample.m_fDistance); + m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, m_sQueueSample.m_fSoundIntensity, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_nFrequency = 6000; - m_sQueueSample.m_nCounter = 39; - m_sQueueSample.m_nSampleIndex = SFX_FISHING_BOAT_IDLE; - m_sQueueSample.m_nFrequency += (m_sQueueSample.m_nEntityIndex * 65536) % 1000; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_bIs2D = FALSE; - m_sQueueSample.m_nReleasingVolumeModificator = 3; - m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = 80; + if (noReflections) { + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_bReleasingSoundFlag = FALSE; + } else { + m_sQueueSample.m_nLoopCount = 1; + m_sQueueSample.m_bReleasingSoundFlag = TRUE; + } SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) - m_sQueueSample.m_fSpeedMultiplier = 2.0f; - m_sQueueSample.m_fSoundIntensity = intensity; - m_sQueueSample.m_bReleasingSoundFlag = FALSE; - m_sQueueSample.m_nReleasingVolumeDivider = 7; + m_sQueueSample.m_nEmittingVolume = emittingVol; m_sQueueSample.m_bReverbFlag = TRUE; - m_sQueueSample.m_bRequireReflection = FALSE; - AddSampleToRequestedQueue(); - } - } - if(bIsPlayerVeh) { - LastFreq = Freq; - LastVol = Vol; - } - return TRUE; - } - return FALSE; -} - -bool8 -cAudioManager::ProcessBoatMovingOverWater(cVehicleParams& params) -{ - float velocityChange; - int32 vol; - float multiplier; - - if (params.m_fDistance > SQR(50)) - return FALSE; - - velocityChange = Abs(params.m_fVelocityChange); - if (velocityChange <= 0.0005f && ((CBoat*)params.m_pVehicle)->bBoatInWater) - return TRUE; - - velocityChange = Min(0.75f, velocityChange); - multiplier = (velocityChange - 0.0005f) / (1499.0f / 2000.0f); - CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); - vol = (30.f * multiplier); - m_sQueueSample.m_nVolume = ComputeVolume(vol, 50.f, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_nCounter = 38; - m_sQueueSample.m_nSampleIndex = SFX_BOAT_WATER_LOOP; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_bIs2D = FALSE; - m_sQueueSample.m_nReleasingVolumeModificator = 3; - m_sQueueSample.m_nFrequency = (6050.f * multiplier) + 16000; - m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = vol; - SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) - m_sQueueSample.m_fSpeedMultiplier = 2.0f; - m_sQueueSample.m_fSoundIntensity = 50.0f; - m_sQueueSample.m_bReleasingSoundFlag = FALSE; - m_sQueueSample.m_nReleasingVolumeDivider = 6; - m_sQueueSample.m_bReverbFlag = TRUE; - m_sQueueSample.m_bRequireReflection = FALSE; - AddSampleToRequestedQueue(); - } - - return TRUE; -} - -void -cAudioManager::ProcessCarHeli(cVehicleParams& params) -{ - const float SOUND_INTENSITY = 250.0f; - - CVehicle* playerVeh; - CVehicle* veh; - CAutomobile* automobile; - CBoat* boat; - - uint8 emittingVol; - int16 brakeState; - int16 accelerateState; - uint32 freq; - float propellerSpeed; - float freqModifier; //may be relate to angle with horison - float cameraAngle; - bool8 distanceCalculatedOld; - float distanceOld; - CVector vecPosOld; - - float volumeModifier;//TODO find better name - bool8 hunterBool; - - static uint32 freqFrontPrev = 14287; - static uint32 freqPropellerPrev = 7143; - static uint32 freqSkimmerPrev = 14287; - - boat = nil; - automobile = nil; - hunterBool = FALSE; - - if (params.m_fDistance >= SQR(SOUND_INTENSITY)) - return; - - playerVeh = FindPlayerVehicle(); - veh = params.m_pVehicle; - if (playerVeh == veh) { - accelerateState = Pads[0].GetAccelerate(); - brakeState = Pads[0].GetBrake(); - } else { - accelerateState = veh->m_fGasPedal * 255.0f; - brakeState = veh->m_fBrakePedal * 255.0f; - } - freqModifier = Abs(veh->GetUp().y); - cameraAngle = (DotProduct(veh->GetMatrix().GetForward(), TheCamera.GetForward()) + 1.0f) / 2.0f; - if (veh->m_modelIndex == MI_SKIMMER) { - boat = (CBoat*)veh; - propellerSpeed = boat->m_fMovingSpeed * 50.0f / 11.0f; - } else if (params.m_VehicleType == VEHICLE_TYPE_HELI) { - propellerSpeed = 1.0f; - } else { - automobile = (CAutomobile*)veh; - propellerSpeed = automobile->m_aWheelSpeed[1] * 50.0f / 11.0f; - } - - if (propellerSpeed == 0.0f) - return; - - propellerSpeed = Min(1.0f, propellerSpeed); - CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); - - - //sound on long distances - if (m_sQueueSample.m_fDistance >= 40.0f) - emittingVol = propellerSpeed * 75.0f; - else if (m_sQueueSample.m_fDistance >= 25.0f) - emittingVol = (m_sQueueSample.m_fDistance - 25.0f) * (75.0f * propellerSpeed) / 15.0f; - else - emittingVol = 0; - if (emittingVol != 0) { - m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, SOUND_INTENSITY, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_nCounter = 88; - if (boat != nil) { - m_sQueueSample.m_nSampleIndex = SFX_SEAPLANE_PRO3; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - if (accelerateState > 0 || brakeState > 0) - m_sQueueSample.m_nFrequency = 4600 + Min(1.0f, (Max(accelerateState, brakeState) / 255.0f) * freqModifier) * 563; - else - m_sQueueSample.m_nFrequency = 3651 + Min(1.0f, freqModifier) * 949; - } else { - m_sQueueSample.m_nSampleIndex = SFX_HELI_1; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(m_sQueueSample.m_nSampleIndex); - } - m_sQueueSample.m_bIs2D = FALSE; - m_sQueueSample.m_nReleasingVolumeModificator = 2; - m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = emittingVol; - SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) - m_sQueueSample.m_fSpeedMultiplier = 6.0f; - m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; - m_sQueueSample.m_bReleasingSoundFlag = FALSE; - m_sQueueSample.m_nReleasingVolumeDivider = 5; - m_sQueueSample.m_bReverbFlag = TRUE; - m_sQueueSample.m_bRequireReflection = FALSE; - AddSampleToRequestedQueue(); - } - } - - CVector backPropellerPos; - if (automobile != nil) - automobile->GetComponentWorldPosition(CAR_BOOT, backPropellerPos); - else if (params.m_VehicleType == VEHICLE_TYPE_HELI) -#ifdef FIX_BUGS - backPropellerPos = + if (isHeli) { + if (0.2f * m_sQueueSample.m_fSoundIntensity > m_sQueueSample.m_fDistance) { + m_sQueueSample.m_bIs2D = TRUE; + m_sQueueSample.m_nOffset = 0; +#ifdef THIS_IS_STUPID + goto AddSample; +#else + AddSampleToRequestedQueue(); + m_sQueueSample.m_nOffset = 127; + m_sQueueSample.m_nSampleIndex++; + m_sQueueSample.m_nCounter = GunIndex++; + if (GunIndex > 58) + GunIndex = 53; + m_sQueueSample.m_bRequireReflection = FALSE; + AddSampleToRequestedQueue(); + continue; #endif - params.m_pVehicle->GetMatrix() * CVector(0.0f, -10.0f, 0.0f); - else - backPropellerPos = m_sQueueSample.m_vecPos; - - if (params.m_fDistance >= SQR(140.0f)) - return; + } + isHeli = FALSE; + } + m_sQueueSample.m_bIs2D = FALSE; +#ifdef THIS_IS_STUPID +AddSample: + AddSampleToRequestedQueue(); + if (isHeli) { + m_sQueueSample.m_nOffset = 127; + m_sQueueSample.m_nSampleIndex++; + m_sQueueSample.m_nCounter = GunIndex++; + if (GunIndex > 58) + GunIndex = 53; + m_sQueueSample.m_bRequireReflection = 0; + AddSampleToRequestedQueue(); + } +#else + AddSampleToRequestedQueue(); +#endif + continue; - if (propellerSpeed >= 0.4f) - volumeModifier = (propellerSpeed - 0.4f) * 5.0f / 3.0f; - else - volumeModifier = 0.0f; - if (!boat) { - freq = Min(1300, 7000.0f * freqModifier); - if (playerVeh == veh && (accelerateState > 0 || brakeState > 0) && freq < 1300)//unnesesary freqModifier alredy <= 1300 - freq = 1300; - if (veh->m_modelIndex == MI_HUNTER) - hunterBool = TRUE; + } + } } +} +#ifdef GTA_TRAIN +bool8 +cAudioManager::ProcessTrainNoise(cVehicleParams& params) +{ + const float SOUND_INTENSITY = 300.0f; - //sound from front of helicopter - emittingVol = (1.0f - cameraAngle) * volumeModifier * 127.0f; - m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, 140.0f, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_nCounter = 3; - if (hunterBool) { - m_sQueueSample.m_nSampleIndex = SFX_HELI_APACHE_1; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_nFrequency = (volumeModifier + 1.0f) * 16000 + freq; - m_sQueueSample.m_bIs2D = FALSE; - m_sQueueSample.m_nReleasingVolumeModificator = 1; - m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = emittingVol; - SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) - m_sQueueSample.m_fSpeedMultiplier = 6.0f; - m_sQueueSample.m_fSoundIntensity = 140.0f; - m_sQueueSample.m_bReleasingSoundFlag = FALSE; - m_sQueueSample.m_nReleasingVolumeDivider = 5; - m_sQueueSample.m_bReverbFlag = TRUE; - m_sQueueSample.m_bRequireReflection = FALSE; - AddSampleToRequestedQueue(); - } else if (boat != nil) { - m_sQueueSample.m_nSampleIndex = SFX_SEAPLANE_PRO1; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; + CTrain *train; + uint8 emittingVol; + float speedMultipler; - if (accelerateState > 0 || brakeState > 0) - m_sQueueSample.m_nFrequency = 18000 + Min(1.0f, freqModifier * (Max(accelerateState, brakeState) / 255.0f)) * 2204; - else - m_sQueueSample.m_nFrequency = 14287 + Min(1.0f, freqModifier) * 3713; - if (propellerSpeed < 1.0f) - m_sQueueSample.m_nFrequency = (propellerSpeed + 1.0f) * (m_sQueueSample.m_nFrequency / 2.0f); - m_sQueueSample.m_nFrequency = Clamp2(m_sQueueSample.m_nFrequency, freqFrontPrev, 197); - freqFrontPrev = m_sQueueSample.m_nFrequency; + if (params.m_fDistance >= SQR(SOUND_INTENSITY)) + return FALSE; - m_sQueueSample.m_bIs2D = FALSE; - m_sQueueSample.m_nReleasingVolumeModificator = 1; - m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = emittingVol; - SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) - m_sQueueSample.m_fSpeedMultiplier = 6.0f; - m_sQueueSample.m_fSoundIntensity = 140.0f; - m_sQueueSample.m_bReleasingSoundFlag = FALSE; - m_sQueueSample.m_nReleasingVolumeDivider = 5; - m_sQueueSample.m_bReverbFlag = TRUE; - m_sQueueSample.m_bRequireReflection = FALSE; - AddSampleToRequestedQueue(); - } else { - m_sQueueSample.m_nSampleIndex = SFX_CAR_HELI_MAI; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_nFrequency = (volumeModifier + 1) * 16000 + freq; - m_sQueueSample.m_bIs2D = FALSE; - m_sQueueSample.m_nReleasingVolumeModificator = 1; - m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = emittingVol; - SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) - m_sQueueSample.m_fSpeedMultiplier = 6.0f; - m_sQueueSample.m_fSoundIntensity = 140.0f; - m_sQueueSample.m_bReleasingSoundFlag = FALSE; - m_sQueueSample.m_nReleasingVolumeDivider = 5; - m_sQueueSample.m_bReverbFlag = TRUE; - m_sQueueSample.m_bRequireReflection = FALSE; - AddSampleToRequestedQueue(); + if (params.m_fVelocityChange > 0.0f) { + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); + train = (CTrain *)params.m_pVehicle; + speedMultipler = Min(1.0f, train->m_fSpeed * 250.f / 51.f); + emittingVol = (75.f * speedMultipler); + if (train->m_fWagonPosition == 0.0f) { + m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, SOUND_INTENSITY, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume != 0) { + m_sQueueSample.m_nCounter = 32; + m_sQueueSample.m_nSampleIndex = SFX_TRAIN_FAR; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_bIs2D = FALSE; + m_sQueueSample.m_nReleasingVolumeModificator = 2; + m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_TRAIN_FAR); + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nEmittingVolume = emittingVol; + SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) + m_sQueueSample.m_fSpeedMultiplier = 3.0f; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + m_sQueueSample.m_bReleasingSoundFlag = FALSE; + m_sQueueSample.m_nReleasingVolumeDivider = 3; + m_sQueueSample.m_bReverbFlag = TRUE; + m_sQueueSample.m_bRequireReflection = FALSE; + AddSampleToRequestedQueue(); + } + } + const float SOUND_INTENSITY = 70.0f; + if (params.m_fDistance < SQR(SOUND_INTENSITY)) { + m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, SOUND_INTENSITY, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume != 0) { + m_sQueueSample.m_nCounter = 33; + m_sQueueSample.m_nSampleIndex = SFX_TRAIN_NEAR; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_bIs2D = FALSE; + m_sQueueSample.m_nReleasingVolumeModificator = 5; + m_sQueueSample.m_nFrequency = SampleManager.GetSampleBaseFrequency(SFX_TRAIN_NEAR) + 100 * m_sQueueSample.m_nEntityIndex % 987; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nEmittingVolume = emittingVol; + SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) + m_sQueueSample.m_fSpeedMultiplier = 6.0f; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; + m_sQueueSample.m_bReleasingSoundFlag = FALSE; + m_sQueueSample.m_nReleasingVolumeDivider = 3; + m_sQueueSample.m_bReverbFlag = TRUE; + m_sQueueSample.m_bRequireReflection = FALSE; + AddSampleToRequestedQueue(); + } } } + return TRUE; +} +#endif +bool8 +cAudioManager::ProcessBoatEngine(cVehicleParams& params) +{ + CBoat *boat; + float padRelativeAccerate; + bool8 isV12 = FALSE; + static int32 LastFreq = 2000; + static int8 LastVol = 0; - //after accel rotor sound - emittingVol = ((cameraAngle + 1.0f) * volumeModifier * 127.0f) / 2.0f; - m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, 140.0f, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume != 0) { - m_sQueueSample.m_nCounter = 1; - if (hunterBool) { - m_sQueueSample.m_nSampleIndex = SFX_HELI_APACHE_2; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_nFrequency = (volumeModifier + 1) * 16000 + freq; - } else if (boat) { - m_sQueueSample.m_nSampleIndex = SFX_SEAPLANE_PRO2; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - - if (accelerateState > 0 || brakeState > 0) - m_sQueueSample.m_nFrequency = 9000 + Min(1.0f, (Max(accelerateState, brakeState) / 255) * freqModifier) * 1102; - else - m_sQueueSample.m_nFrequency = 7143 + Min(1.0f, freqModifier) * 1857; - - if (propellerSpeed < 1.0f) - m_sQueueSample.m_nFrequency = (propellerSpeed + 1) * (m_sQueueSample.m_nFrequency / 2); + static const float intensity = 90.0f; - m_sQueueSample.m_nFrequency = Clamp2(m_sQueueSample.m_nFrequency, freqPropellerPrev, 98); - freqPropellerPrev = m_sQueueSample.m_nFrequency; - } else { - m_sQueueSample.m_nSampleIndex = SFX_CAR_HELI_MAI2; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_nFrequency = (volumeModifier + 1) * 16000 + freq; - } - m_sQueueSample.m_bIs2D = FALSE; - m_sQueueSample.m_nReleasingVolumeModificator = 1; - m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = emittingVol; - SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) - m_sQueueSample.m_fSpeedMultiplier = 6.0f; - m_sQueueSample.m_fSoundIntensity = 140.0f; - m_sQueueSample.m_bReleasingSoundFlag = FALSE; - m_sQueueSample.m_nReleasingVolumeDivider = 5; - m_sQueueSample.m_bReverbFlag = TRUE; - m_sQueueSample.m_bRequireReflection = FALSE; - AddSampleToRequestedQueue(); - } + if (params.m_fDistance < SQR(intensity)) { + boat = (CBoat *)params.m_pVehicle; + if(boat->GetStatus() == STATUS_WRECKED) + return TRUE; + float freqModificator; + float volModificator; + int BaseVol; + int BaseFreq; - //engine starting sound - if (boat == nil && params.m_VehicleType != VEHICLE_TYPE_HELI && m_sQueueSample.m_fDistance < 30.0f) { //strange way to check if automobile != nil - if (automobile->bEngineOn) { - if (propellerSpeed < 1.0f) { - emittingVol = (1.0f - propellerSpeed / 2.0f) * 70.0f; - m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, 30.0f, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume) { - if (hunterBool) { - m_sQueueSample.m_nSampleIndex = SFX_HELI_APACHE_4; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - freq = 3000.0f * propellerSpeed + 30000; - } else { - m_sQueueSample.m_nSampleIndex = SFX_CAR_HELI_STA; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - freq = 3000.0f * propellerSpeed + 6000; - } - m_sQueueSample.m_nFrequency = freq; - m_sQueueSample.m_nCounter = 12; - m_sQueueSample.m_bIs2D = FALSE; - m_sQueueSample.m_nReleasingVolumeModificator = 1; - m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = emittingVol; - SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) - m_sQueueSample.m_fSpeedMultiplier = 6.0f; - m_sQueueSample.m_fSoundIntensity = 30.0f; - m_sQueueSample.m_bReleasingSoundFlag = FALSE; - m_sQueueSample.m_nReleasingVolumeDivider = 30; - m_sQueueSample.m_bReverbFlag = TRUE; - m_sQueueSample.m_bRequireReflection = FALSE; - AddSampleToRequestedQueue(); - } - } + switch(boat->GetModelIndex()) { + case MI_RIO: + freqModificator = 490.0f; + volModificator = 60.0f; + BaseVol = 20; + BaseFreq = 1888; + break; + case MI_PREDATOR: + case MI_SQUALO: + case MI_SPEEDER: + case MI_COASTG: + case MI_DINGHY: + case MI_JETMAX: + freqModificator = 6000.0f; + volModificator = 60.0f; + isV12 = TRUE; + BaseFreq = 9000; + BaseVol = 20; + break; + case MI_REEFER: + freqModificator = 715.0f; + volModificator = 80.0f; + BaseVol = 0; + BaseFreq = 3775; + break; + case MI_TROPIC: + case MI_MARQUIS: + freqModificator = 463.0f; + volModificator = 60.0f; + BaseVol = 20; + BaseFreq = 1782; + break; + default: + return TRUE; } - } + bool8 bIsPlayerVeh; - if (boat) { - if (TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_FIXED && m_sQueueSample.m_fDistance < 20.0f && propellerSpeed > 0.0f) { - m_sQueueSample.m_nVolume = ComputeVolume(propellerSpeed * 100.0f, 20.0f, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume) { + if(FindPlayerVehicle() == params.m_pVehicle) { + float padAccelerate = Max(Pads[0].GetAccelerate(), Pads[0].GetBrake()); + padRelativeAccerate = padAccelerate / 255.0f; + bIsPlayerVeh = TRUE; + } else { + padRelativeAccerate = Max(params.m_pVehicle->m_fGasPedal, params.m_pVehicle->m_fBrakePedal); + bIsPlayerVeh = FALSE; + } - if (accelerateState > 0 || brakeState > 0) - m_sQueueSample.m_nFrequency = 18000 + Min(1.0f, (Max(accelerateState, brakeState) / 255.0f) * freqModifier) * 2204; + int Freq = BaseFreq + (padRelativeAccerate * freqModificator); + int Vol = BaseVol + (padRelativeAccerate * volModificator); + + if(!boat->bPropellerInWater) + Freq = (9 * Freq) / 8; + + if(bIsPlayerVeh) { + if(Freq > LastFreq) { + if(isV12) + Freq = Min(Freq, LastFreq + 100); else - m_sQueueSample.m_nFrequency = 14287 + Min(1.0f, freqModifier) * 3713; - if (propellerSpeed < 1.0f) - m_sQueueSample.m_nFrequency = (propellerSpeed + 1) * (m_sQueueSample.m_nFrequency / 2.0f); - m_sQueueSample.m_nFrequency = Clamp2(m_sQueueSample.m_nFrequency, freqSkimmerPrev, 197); - freqSkimmerPrev = m_sQueueSample.m_nFrequency; + Freq = Min(Freq, LastFreq + 15); + } else { + if(isV12) + Freq = Max(Freq, LastFreq - 100); + else + Freq = Max(Freq, LastFreq - 15); + } + if(Vol > LastVol) + Vol = Min(Vol, LastVol + 3); + else + Vol = Max(Vol, LastVol - 3); + } - m_sQueueSample.m_nSampleIndex = SFX_SEAPLANE_PRO4; + if (Vol > 0) { + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); + m_sQueueSample.m_nVolume = ComputeVolume(Vol, intensity, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume != 0) { + m_sQueueSample.m_nFrequency = Freq; + m_sQueueSample.m_nCounter = 40; + if (isV12) + m_sQueueSample.m_nSampleIndex = SFX_BOAT_V12_LOOP; + else + m_sQueueSample.m_nSampleIndex = SFX_BOAT_CRUISER_LOOP; m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_nCounter = 12; m_sQueueSample.m_bIs2D = FALSE; m_sQueueSample.m_nReleasingVolumeModificator = 3; m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = propellerSpeed * 100.0f; - SET_LOOP_OFFSETS(SFX_SEAPLANE_PRO4) - m_sQueueSample.m_fSpeedMultiplier = 5.0f; - m_sQueueSample.m_fSoundIntensity = 20.0f; + m_sQueueSample.m_nEmittingVolume = Vol; + SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) + m_sQueueSample.m_fSpeedMultiplier = 2.0f; + m_sQueueSample.m_fSoundIntensity = intensity; m_sQueueSample.m_bReleasingSoundFlag = FALSE; m_sQueueSample.m_nReleasingVolumeDivider = 7; m_sQueueSample.m_bReverbFlag = TRUE; @@ -3730,108 +3722,80 @@ cAudioManager::ProcessCarHeli(cVehicleParams& params) AddSampleToRequestedQueue(); } } - } else { - //vacuum cleaner sound - vecPosOld = m_sQueueSample.m_vecPos; - distanceCalculatedOld = params.m_bDistanceCalculated; - distanceOld = params.m_fDistance; - m_sQueueSample.m_vecPos = backPropellerPos; - params.m_bDistanceCalculated = FALSE; - params.m_fDistance = GetDistanceSquared(m_sQueueSample.m_vecPos); - if (params.m_fDistance < SQR(27.0f)) { + if(boat->GetModelIndex() == MI_REEFER) { CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); - m_sQueueSample.m_nVolume = ComputeVolume(volumeModifier * 25.0f, 27.0f, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume) { - m_sQueueSample.m_nCounter = 2; - m_sQueueSample.m_nSampleIndex = hunterBool ? SFX_HELI_APACHE_3 : SFX_CAR_HELI_REA; + m_sQueueSample.m_nVolume = ComputeVolume(80, intensity, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume != 0) { + m_sQueueSample.m_nFrequency = 6000; + m_sQueueSample.m_nCounter = 39; + m_sQueueSample.m_nSampleIndex = SFX_FISHING_BOAT_IDLE; + m_sQueueSample.m_nFrequency += (m_sQueueSample.m_nEntityIndex * 65536) % 1000; m_sQueueSample.m_nBankIndex = SFX_BANK_0; m_sQueueSample.m_bIs2D = FALSE; - m_sQueueSample.m_nReleasingVolumeModificator = 1; - m_sQueueSample.m_nFrequency = (volumeModifier + 1.0f) * 16000; + m_sQueueSample.m_nReleasingVolumeModificator = 3; m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = volumeModifier * 25.0f; + m_sQueueSample.m_nEmittingVolume = 80; SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) - m_sQueueSample.m_fSpeedMultiplier = 6.0f; - m_sQueueSample.m_fSoundIntensity = 27.0f; + m_sQueueSample.m_fSpeedMultiplier = 2.0f; + m_sQueueSample.m_fSoundIntensity = intensity; m_sQueueSample.m_bReleasingSoundFlag = FALSE; - m_sQueueSample.m_nReleasingVolumeDivider = 5; + m_sQueueSample.m_nReleasingVolumeDivider = 7; m_sQueueSample.m_bReverbFlag = TRUE; m_sQueueSample.m_bRequireReflection = FALSE; AddSampleToRequestedQueue(); } } - - m_sQueueSample.m_vecPos = vecPosOld; - params.m_bDistanceCalculated = distanceCalculatedOld; - params.m_fDistance = distanceOld; + if(bIsPlayerVeh) { + LastFreq = Freq; + LastVol = Vol; + } + return TRUE; } + return FALSE; } -void -cAudioManager::ProcessVehicleFlatTyre(cVehicleParams& params) +bool8 +cAudioManager::ProcessBoatMovingOverWater(cVehicleParams& params) { - const float SOUND_INTENSITY = 60.0f; - - CAutomobile* automobile; - CBike* bike; - bool8 wheelBurst; - uint8 emittingVol; + float velocityChange; + int32 vol; + float multiplier; - float modifier; + if (params.m_fDistance > SQR(50)) + return FALSE; - if (params.m_fDistance >= SQR(SOUND_INTENSITY)) - return; + velocityChange = Abs(params.m_fVelocityChange); + if (velocityChange <= 0.0005f && ((CBoat*)params.m_pVehicle)->bBoatInWater) + return TRUE; - switch (params.m_VehicleType) { - case VEHICLE_TYPE_CAR: - automobile = (CAutomobile*)params.m_pVehicle; - wheelBurst = FALSE; - for (int i = 0; i < 4; i++) - if (automobile->Damage.GetWheelStatus(i) == WHEEL_STATUS_BURST && automobile->m_aWheelTimer[i] > 0.0f) - wheelBurst = TRUE; - if (!wheelBurst) - return; - break; - case VEHICLE_TYPE_BIKE: - bike = (CBike*)params.m_pVehicle; - wheelBurst = FALSE; - for(int i = 0; i < 2; i++) - if (bike->m_wheelStatus[i] == WHEEL_STATUS_BURST && bike->m_aWheelTimer[i] > 0.0f) - wheelBurst = TRUE; - if (!wheelBurst) - return; - break; - default: - return; - } - modifier = Min(1.0f, Abs(params.m_fVelocityChange) / (0.3f * params.m_pTransmission->fMaxVelocity)); - if (modifier > 0.01f) { //mb can be replaced by (emittingVol > 1) - emittingVol = (100.0f * modifier); - CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); - m_sQueueSample.m_nVolume = ComputeVolume(emittingVol, SOUND_INTENSITY, m_sQueueSample.m_fDistance); - if (m_sQueueSample.m_nVolume) { - m_sQueueSample.m_nCounter = 95; - m_sQueueSample.m_nBankIndex = SFX_BANK_0; - m_sQueueSample.m_bIs2D = FALSE; - m_sQueueSample.m_nReleasingVolumeModificator = 5; - m_sQueueSample.m_nSampleIndex = SFX_TYRE_BURST_L; - m_sQueueSample.m_nFrequency = (5500.0f * modifier) + 8000; - m_sQueueSample.m_nLoopCount = 0; - m_sQueueSample.m_nEmittingVolume = emittingVol; - SET_LOOP_OFFSETS(SFX_TYRE_BURST_L) - m_sQueueSample.m_fSpeedMultiplier = 2.0f; - m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; - m_sQueueSample.m_bReleasingSoundFlag = FALSE; - m_sQueueSample.m_nReleasingVolumeDivider = 3; - m_sQueueSample.m_bReverbFlag = TRUE; - m_sQueueSample.m_bRequireReflection = FALSE; - AddSampleToRequestedQueue(); - } + velocityChange = Min(0.75f, velocityChange); + multiplier = (velocityChange - 0.0005f) / (1499.0f / 2000.0f); + CalculateDistance(params.m_bDistanceCalculated, params.m_fDistance); + vol = (30.f * multiplier); + m_sQueueSample.m_nVolume = ComputeVolume(vol, 50.f, m_sQueueSample.m_fDistance); + if (m_sQueueSample.m_nVolume != 0) { + m_sQueueSample.m_nCounter = 38; + m_sQueueSample.m_nSampleIndex = SFX_BOAT_WATER_LOOP; + m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_bIs2D = FALSE; + m_sQueueSample.m_nReleasingVolumeModificator = 3; + m_sQueueSample.m_nFrequency = (6050.f * multiplier) + 16000; + m_sQueueSample.m_nLoopCount = 0; + m_sQueueSample.m_nEmittingVolume = vol; + SET_LOOP_OFFSETS(m_sQueueSample.m_nSampleIndex) + m_sQueueSample.m_fSpeedMultiplier = 2.0f; + m_sQueueSample.m_fSoundIntensity = 50.0f; + m_sQueueSample.m_bReleasingSoundFlag = FALSE; + m_sQueueSample.m_nReleasingVolumeDivider = 6; + m_sQueueSample.m_bReverbFlag = TRUE; + m_sQueueSample.m_bRequireReflection = FALSE; + AddSampleToRequestedQueue(); } + + return TRUE; } -//TODO use it in ProcessVehicle void cAudioManager::ProcessPlane(cVehicleParams& params) { @@ -4125,7 +4089,7 @@ cAudioManager::SetupJumboRumbleSound(uint8 emittingVol) } int32 -cAudioManager::GetJumboTaxiFreq() const +cAudioManager::GetJumboTaxiFreq() { return (1.f / 180 * 10950 * m_sQueueSample.m_fDistance) + 22050; // todo port fix to re3 } @@ -5173,6 +5137,41 @@ cAudioManager::SetPlayersMood(uint8 mood, uint32 time) } +void +cAudioManager::ProcessPlayerMood() +{ + CPlayerPed *playerPed; + uint32& lastMissionPassedTime = CTheScripts::GetLastMissionPassedTime(); + uint32 curTime = CTimer::GetTimeInMilliseconds(); + + if (m_nPlayerMoodTimer <= curTime) { + playerPed = FindPlayerPed(); + if (playerPed != nil) { + + if (playerPed->m_pWanted->GetWantedLevel() > 3) { + m_nPlayerMood = PLAYER_MOOD_ANGRY; + return; + } + if (playerPed->m_pWanted->GetWantedLevel() > 1) { + m_nPlayerMood = PLAYER_MOOD_PISSED_OFF; + return; + } + + if (lastMissionPassedTime != -1) { + if (curTime < lastMissionPassedTime) { + lastMissionPassedTime = curTime; + return; + } + if (curTime < lastMissionPassedTime + 180000) { + m_nPlayerMood = PLAYER_MOOD_WISECRACKING; + return; + } + } + m_nPlayerMood = PLAYER_MOOD_CALM; + } + } +} + void cAudioManager::SetupPedComments(cPedParams ¶ms, uint16 sound) { @@ -5236,7 +5235,7 @@ cAudioManager::SetupPedComments(cPedParams ¶ms, uint16 sound) uint32 cAudioManager::GetPedCommentSfx(CPed *ped, int32 sound) { - if(ped->m_nPedState != PED_FALL || sound == MI_VICE8 || sound == MI_WFYG1 || sound == MI_WFYG2) { + if(ped->m_nPedState != PED_FALL || sound == SOUND_PED_DAMAGE || sound == SOUND_PED_HIT || sound == SOUND_PED_LAND) { if(ped->m_getUpTimer == UINT32_MAX || ped->m_getUpTimer > CTimer::GetTimeInMilliseconds()) { if(sound != SOUND_PED_DAMAGE && sound != SOUND_PED_HIT && sound != SOUND_PED_LAND) return NO_SAMPLE; } -- cgit v1.2.3